From 2442285f2ae88114605532c22a26001a40fdd56a Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 15 Jan 2024 18:06:31 +0100 Subject: [PATCH 0001/1006] Inherit PulseSequence from list, remove redundant methods --- src/qibolab/pulses.py | 151 +----------------------------------------- 1 file changed, 1 insertion(+), 150 deletions(-) diff --git a/src/qibolab/pulses.py b/src/qibolab/pulses.py index 8da469bb9e..15e31d5159 100644 --- a/src/qibolab/pulses.py +++ b/src/qibolab/pulses.py @@ -1223,7 +1223,7 @@ class PulseConstructor(Enum): FLUX = FluxPulse -class PulseSequence: +class PulseSequence(list): """A collection of scheduled pulses. A quantum circuit can be translated into a set of scheduled pulses @@ -1233,30 +1233,6 @@ class PulseSequence: modify any of the properties of its pulses. """ - def __init__(self, *pulses): - self.pulses = [] #: list[Pulse] = [] - """Pulses (list): a list containing the pulses, ordered by their - channel and start times.""" - self.add(*pulses) - - def __len__(self): - return len(self.pulses) - - def __iter__(self): - return iter(self.pulses) - - def __getitem__(self, index): - return self.pulses[index] - - def __setitem__(self, index, value): - self.pulses[index] = value - - def __delitem__(self, index): - del self.pulses[index] - - def __contains__(self, pulse): - return pulse in self.pulses - def __repr__(self): return self.serial @@ -1266,128 +1242,9 @@ def serial(self): return "PulseSequence\n" + "\n".join(f"{pulse.serial}" for pulse in self.pulses) - def __eq__(self, other): - if not isinstance(other, PulseSequence): - raise TypeError(f"Expected PulseSequence; got {type(other).__name__}") - return self.serial == other.serial - - def __ne__(self, other): - if not isinstance(other, PulseSequence): - raise TypeError(f"Expected PulseSequence; got {type(other).__name__}") - return self.serial != other.serial - def __hash__(self): return hash(self.serial) - def __add__(self, other): - if isinstance(other, PulseSequence): - return PulseSequence(*self.pulses, *other.pulses) - if isinstance(other, Pulse): - return PulseSequence(*self.pulses, other) - raise TypeError(f"Expected PulseSequence or Pulse; got {type(other).__name__}") - - def __radd__(self, other): - if isinstance(other, PulseSequence): - return PulseSequence(*other.pulses, *self.pulses) - if isinstance(other, Pulse): - return PulseSequence(other, *self.pulses) - raise TypeError(f"Expected PulseSequence or Pulse; got {type(other).__name__}") - - def __iadd__(self, other): - if isinstance(other, PulseSequence): - self.add(*other.pulses) - elif isinstance(other, Pulse): - self.add(other) - else: - raise TypeError( - f"Expected PulseSequence or Pulse; got {type(other).__name__}" - ) - return self - - def __mul__(self, n): - if not isinstance(n, int): - raise TypeError(f"Expected int; got {type(n).__name__}") - if n < 0: - raise TypeError(f"argument n should be >=0, got {n}") - return PulseSequence(*(self.pulses * n)) - - def __rmul__(self, n): - if not isinstance(n, int): - raise TypeError(f"Expected int; got {type(n).__name__}") - if n < 0: - raise TypeError(f"argument n should be >=0, got {n}") - return PulseSequence(*(self.pulses * n)) - - def __imul__(self, n): - if not isinstance(n, int): - raise TypeError(f"Expected int; got {type(n).__name__}") - if n < 1: - raise TypeError(f"argument n should be >=1, got {n}") - original_set = self.shallow_copy() - for x in range(n - 1): - self.add(*original_set.pulses) - return self - - @property - def count(self): - """Returns the number of pulses in the sequence.""" - - return len(self.pulses) - - def add(self, *items): - """Adds pulses to the sequence and sorts them by channel and start - time.""" - - for item in items: - if isinstance(item, Pulse): - pulse = item - self.pulses.append(pulse) - elif isinstance(item, PulseSequence): - ps = item - for pulse in ps.pulses: - self.pulses.append(pulse) - self.pulses.sort(key=lambda item: (item.start, item.channel)) - - def index(self, pulse): - """Returns the index of a pulse in the sequence.""" - - return self.pulses.index(pulse) - - def pop(self, index=-1): - """Returns the pulse with the index provided and removes it from the - sequence.""" - - return self.pulses.pop(index) - - def remove(self, pulse): - """Removes a pulse from the sequence.""" - - while pulse in self.pulses: - self.pulses.remove(pulse) - - def clear(self): - """Removes all pulses from the sequence.""" - - self.pulses.clear() - - def shallow_copy(self): - """Returns a shallow copy of the sequence. - - It returns a new PulseSequence object with references to the - same Pulse objects. - """ - - return PulseSequence(*self.pulses) - - def copy(self): - """Returns a deep copy of the sequence. - - It returns a new PulseSequence with replicates of each of the - pulses contained in the original sequence. - """ - - return PulseSequence(*[pulse.copy() for pulse in self.pulses]) - @property def ro_pulses(self): """Returns a new PulseSequence containing only its readout pulses.""" @@ -1463,12 +1320,6 @@ def coupler_pulses(self, *couplers): new_pc.add(pulse) return new_pc - @property - def is_empty(self): - """Returns True if the sequence does not contain any pulses.""" - - return len(self.pulses) == 0 - @property def finish(self) -> int: """Returns the time when the last pulse of the sequence finishes.""" From fa75a9eab3a2a0802d4a5772813f12435c686a83 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 16 Jan 2024 12:07:10 +0100 Subject: [PATCH 0002/1006] Replace usage of removed methods in pulses module --- src/qibolab/pulses.py | 59 ++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 34 deletions(-) diff --git a/src/qibolab/pulses.py b/src/qibolab/pulses.py index 15e31d5159..5698ff475d 100644 --- a/src/qibolab/pulses.py +++ b/src/qibolab/pulses.py @@ -881,7 +881,7 @@ def __add__(self, other): if isinstance(other, Pulse): return PulseSequence(self, other) if isinstance(other, PulseSequence): - return PulseSequence(self, *other.pulses) + return PulseSequence(self, *other) raise TypeError(f"Expected Pulse or PulseSequence; got {type(other).__name__}") def __mul__(self, n): @@ -1234,16 +1234,7 @@ class PulseSequence(list): """ def __repr__(self): - return self.serial - - @property - def serial(self): - """Returns a string representation of the pulse sequence.""" - - return "PulseSequence\n" + "\n".join(f"{pulse.serial}" for pulse in self.pulses) - - def __hash__(self): - return hash(self.serial) + return f"{type(self).__name__}({super().__repr__()})" @property def ro_pulses(self): @@ -1252,7 +1243,7 @@ def ro_pulses(self): new_pc = PulseSequence() for pulse in self.pulses: if pulse.type == PulseType.READOUT: - new_pc.add(pulse) + new_pc.append(pulse) return new_pc @property @@ -1261,9 +1252,9 @@ def qd_pulses(self): pulses.""" new_pc = PulseSequence() - for pulse in self.pulses: + for pulse in self: if pulse.type == PulseType.DRIVE: - new_pc.add(pulse) + new_pc.append(pulse) return new_pc @property @@ -1272,9 +1263,9 @@ def qf_pulses(self): pulses.""" new_pc = PulseSequence() - for pulse in self.pulses: + for pulse in self: if pulse.type == PulseType.FLUX: - new_pc.add(pulse) + new_pc.append(pulse) return new_pc @property @@ -1283,9 +1274,9 @@ def cf_pulses(self): pulses.""" new_pc = PulseSequence() - for pulse in self.pulses: + for pulse in self: if pulse.type is PulseType.COUPLERFLUX: - new_pc.add(pulse) + new_pc.append(pulse) return new_pc def get_channel_pulses(self, *channels): @@ -1293,9 +1284,9 @@ def get_channel_pulses(self, *channels): set of channels.""" new_pc = PulseSequence() - for pulse in self.pulses: + for pulse in self: if pulse.channel in channels: - new_pc.add(pulse) + new_pc.append(pulse) return new_pc def get_qubit_pulses(self, *qubits): @@ -1303,10 +1294,10 @@ def get_qubit_pulses(self, *qubits): set of qubits.""" new_pc = PulseSequence() - for pulse in self.pulses: + for pulse in self: if not isinstance(pulse, CouplerFluxPulse): if pulse.qubit in qubits: - new_pc.add(pulse) + new_pc.append(pulse) return new_pc def coupler_pulses(self, *couplers): @@ -1314,10 +1305,10 @@ def coupler_pulses(self, *couplers): set of couplers.""" new_pc = PulseSequence() - for pulse in self.pulses: + for pulse in self: if isinstance(pulse, CouplerFluxPulse): if pulse.qubit in couplers: - new_pc.add(pulse) + new_pc.append(pulse) return new_pc @property @@ -1325,7 +1316,7 @@ def finish(self) -> int: """Returns the time when the last pulse of the sequence finishes.""" t: int = 0 - for pulse in self.pulses: + for pulse in self: if pulse.finish > t: t = pulse.finish return t @@ -1335,7 +1326,7 @@ def start(self) -> int: """Returns the start time of the first pulse of the sequence.""" t = self.finish - for pulse in self.pulses: + for pulse in self: if pulse.start < t: t = pulse.start return t @@ -1352,7 +1343,7 @@ def channels(self) -> list: sequence.""" channels = [] - for pulse in self.pulses: + for pulse in self: if not pulse.channel in channels: channels.append(pulse.channel) channels.sort() @@ -1364,7 +1355,7 @@ def qubits(self) -> list: sequence.""" qubits = [] - for pulse in self.pulses: + for pulse in self: if not pulse.qubit in qubits: qubits.append(pulse.qubit) qubits.sort() @@ -1375,7 +1366,7 @@ def get_pulse_overlaps(self): # -> dict((int,int): PulseSequence): times) where pulses overlap.""" times = [] - for pulse in self.pulses: + for pulse in self: if not pulse.start in times: times.append(pulse.start) if not pulse.finish in times: @@ -1385,7 +1376,7 @@ def get_pulse_overlaps(self): # -> dict((int,int): PulseSequence): overlaps = {} for n in range(len(times) - 1): overlaps[(times[n], times[n + 1])] = PulseSequence() - for pulse in self.pulses: + for pulse in self: if (pulse.start <= times[n]) & (pulse.finish >= times[n + 1]): overlaps[(times[n], times[n + 1])] += pulse return overlaps @@ -1398,7 +1389,7 @@ def separate_overlapping_pulses(self): # -> dict((int,int): PulseSequence): # but it does not check if the frequencies of the pulses within a set have the same frequency separated_pulses = [] - for new_pulse in self.pulses: + for new_pulse in self: stored = False for ps in separated_pulses: overlaps = False @@ -1410,7 +1401,7 @@ def separate_overlapping_pulses(self): # -> dict((int,int): PulseSequence): overlaps = True break if not overlaps: - ps.add(new_pulse) + ps.append(new_pulse) stored = True break if not stored: @@ -1436,14 +1427,14 @@ def plot(self, savefig_filename=None, sampling_rate=SAMPLING_RATE): savefig_filename (str): a file path. If provided the plot is save to a file. """ - if not self.is_empty: + if len(self) > 0: import matplotlib.pyplot as plt from matplotlib import gridspec fig = plt.figure(figsize=(14, 2 * self.count), dpi=200) gs = gridspec.GridSpec(ncols=1, nrows=self.count) vertical_lines = [] - for pulse in self.pulses: + for pulse in self: vertical_lines.append(pulse.start) vertical_lines.append(pulse.finish) From 254918404be3b207be8000d7a320bd85b3b80fd4 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 16 Jan 2024 12:10:26 +0100 Subject: [PATCH 0003/1006] Replace usage of removed methods everywhere --- src/qibolab/compilers/default.py | 8 ++++---- src/qibolab/native.py | 4 ++-- src/qibolab/platform/platform.py | 2 +- src/qibolab/pulses.py | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/qibolab/compilers/default.py b/src/qibolab/compilers/default.py index a9bc0a8d3c..e4fa38576d 100644 --- a/src/qibolab/compilers/default.py +++ b/src/qibolab/compilers/default.py @@ -31,7 +31,7 @@ def gpi2_rule(gate, platform): theta = gate.parameters[0] sequence = PulseSequence() pulse = platform.create_RX90_pulse(qubit, start=0, relative_phase=theta) - sequence.add(pulse) + sequence.append(pulse) return sequence, {} @@ -62,7 +62,7 @@ def u3_rule(gate, platform): qubit, start=0, relative_phase=virtual_z_phases[qubit] ) # apply RX(pi/2) - sequence.add(RX90_pulse_1) + sequence.append(RX90_pulse_1) # apply RZ(theta) virtual_z_phases[qubit] += theta # Fetch pi/2 pulse from calibration @@ -72,7 +72,7 @@ def u3_rule(gate, platform): relative_phase=virtual_z_phases[qubit] - math.pi, ) # apply RX(-pi/2) - sequence.add(RX90_pulse_2) + sequence.append(RX90_pulse_2) # apply RZ(phi) virtual_z_phases[qubit] += phi @@ -98,5 +98,5 @@ def measurement_rule(gate, platform): sequence = PulseSequence() for qubit in gate.target_qubits: MZ_pulse = platform.create_MZ_pulse(qubit, start=0) - sequence.add(MZ_pulse) + sequence.append(MZ_pulse) return sequence, {} diff --git a/src/qibolab/native.py b/src/qibolab/native.py index b411cc9de2..6f2bcf27d9 100644 --- a/src/qibolab/native.py +++ b/src/qibolab/native.py @@ -245,12 +245,12 @@ def sequence(self, start=0): for pulse in self.pulses: if isinstance(pulse, NativePulse): - sequence.add(pulse.pulse(start=start)) + sequence.append(pulse.pulse(start=start)) else: virtual_z_phases[pulse.qubit.name] += pulse.phase for coupler_pulse in self.coupler_pulses: - sequence.add(coupler_pulse.pulse(start=start)) + sequence.append(coupler_pulse.pulse(start=start)) # TODO: Maybe ``virtual_z_phases`` should be an attribute of ``PulseSequence`` return sequence, virtual_z_phases diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 7477405caf..91df9a4271 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -47,7 +47,7 @@ def unroll_sequences( for pulse in sequence: new_pulse = pulse.copy() new_pulse.start += start - total_sequence.add(new_pulse) + total_sequence.append(new_pulse) if isinstance(pulse, ReadoutPulse): readout_map[pulse.serial].append(new_pulse.serial) start = total_sequence.finish + relaxation_time diff --git a/src/qibolab/pulses.py b/src/qibolab/pulses.py index 5698ff475d..b411dded0d 100644 --- a/src/qibolab/pulses.py +++ b/src/qibolab/pulses.py @@ -1241,7 +1241,7 @@ def ro_pulses(self): """Returns a new PulseSequence containing only its readout pulses.""" new_pc = PulseSequence() - for pulse in self.pulses: + for pulse in self: if pulse.type == PulseType.READOUT: new_pc.append(pulse) return new_pc From 9110119118fef66785b6d20fdd3bd7b0468b6c94 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 16 Jan 2024 12:31:16 +0100 Subject: [PATCH 0004/1006] Replace add with the standard append function --- examples/minimum_working_example.py | 4 +- src/qibolab/compilers/compiler.py | 2 +- .../instruments/qblox/cluster_qcm_bb.py | 2 +- .../instruments/qblox/cluster_qcm_rf.py | 2 +- .../instruments/qblox/cluster_qrm_rf.py | 2 +- src/qibolab/platform/platform.py | 2 +- src/qibolab/sweeper.py | 2 +- tests/test_dummy.py | 32 +- tests/test_instruments_qblox.py | 314 ++++++++++++++++++ .../test_instruments_qblox_cluster_qcm_bb.py | 16 +- .../test_instruments_qblox_cluster_qcm_rf.py | 8 +- .../test_instruments_qblox_cluster_qrm_rf.py | 8 +- tests/test_instruments_qmsim.py | 66 ++-- tests/test_instruments_rfsoc.py | 66 ++-- tests/test_instruments_zhinst.py | 54 +-- tests/test_platform.py | 54 +-- tests/test_pulses.py | 28 +- tests/test_result_shapes.py | 4 +- 18 files changed, 490 insertions(+), 176 deletions(-) create mode 100644 tests/test_instruments_qblox.py diff --git a/examples/minimum_working_example.py b/examples/minimum_working_example.py index 3213c70aa5..40ced664c5 100644 --- a/examples/minimum_working_example.py +++ b/examples/minimum_working_example.py @@ -5,7 +5,7 @@ # Define PulseSequence sequence = PulseSequence() # Add some pulses to the pulse sequence -sequence.add( +sequence.append( Pulse( start=0, amplitude=0.3, @@ -18,7 +18,7 @@ ) ) -sequence.add( +sequence.append( ReadoutPulse( start=4004, amplitude=0.9, diff --git a/src/qibolab/compilers/compiler.py b/src/qibolab/compilers/compiler.py index 316fde2586..ded9b11bfa 100644 --- a/src/qibolab/compilers/compiler.py +++ b/src/qibolab/compilers/compiler.py @@ -121,7 +121,7 @@ def _compile_gate( pulse.start += start if not isinstance(pulse, ReadoutPulse): pulse.relative_phase += virtual_z_phases[pulse.qubit] - sequence.add(pulse) + sequence.append(pulse) return gate_sequence, gate_phases diff --git a/src/qibolab/instruments/qblox/cluster_qcm_bb.py b/src/qibolab/instruments/qblox/cluster_qcm_bb.py index e95cf69ef9..23eea1877f 100644 --- a/src/qibolab/instruments/qblox/cluster_qcm_bb.py +++ b/src/qibolab/instruments/qblox/cluster_qcm_bb.py @@ -362,7 +362,7 @@ def process_pulse_sequence( sequencer.waveforms_buffer.add_waveforms( pulse, self._ports[port].hardware_mod_en, sweepers ) - sequencer.pulses.add(pulse) + sequencer.pulses.append(pulse) pulses_to_be_processed.remove(pulse) # if there is not enough memory in the current sequencer, use another one diff --git a/src/qibolab/instruments/qblox/cluster_qcm_rf.py b/src/qibolab/instruments/qblox/cluster_qcm_rf.py index cd91832577..573624ab18 100644 --- a/src/qibolab/instruments/qblox/cluster_qcm_rf.py +++ b/src/qibolab/instruments/qblox/cluster_qcm_rf.py @@ -383,7 +383,7 @@ def process_pulse_sequence( sequencer.waveforms_buffer.add_waveforms( pulse, self._ports[port].hardware_mod_en, sweepers ) - sequencer.pulses.add(pulse) + sequencer.pulses.append(pulse) pulses_to_be_processed.remove(pulse) # if there is not enough memory in the current sequencer, use another one diff --git a/src/qibolab/instruments/qblox/cluster_qrm_rf.py b/src/qibolab/instruments/qblox/cluster_qrm_rf.py index a70d26c428..91c2ce1793 100644 --- a/src/qibolab/instruments/qblox/cluster_qrm_rf.py +++ b/src/qibolab/instruments/qblox/cluster_qrm_rf.py @@ -443,7 +443,7 @@ def process_pulse_sequence( sequencer.waveforms_buffer.add_waveforms( pulse, self._ports[port].hardware_mod_en, sweepers ) - sequencer.pulses.add(pulse) + sequencer.pulses.append(pulse) pulses_to_be_processed.remove(pulse) # if there is not enough memory in the current sequencer, use another one diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 91df9a4271..317bc9793f 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -274,7 +274,7 @@ def sweep( sequence = PulseSequence() parameter = Parameter.frequency pulse = platform.create_qubit_readout_pulse(qubit=0, start=0) - sequence.add(pulse) + sequence.append(pulse) parameter_range = np.random.randint(10, size=10) sweeper = Sweeper(parameter, parameter_range, [pulse]) platform.sweep(sequence, ExecutionParameters(), sweeper) diff --git a/src/qibolab/sweeper.py b/src/qibolab/sweeper.py index c8539faca1..84ff1880cd 100644 --- a/src/qibolab/sweeper.py +++ b/src/qibolab/sweeper.py @@ -65,7 +65,7 @@ class Sweeper: sequence = PulseSequence() parameter = Parameter.frequency pulse = platform.create_qubit_readout_pulse(qubit=0, start=0) - sequence.add(pulse) + sequence.append(pulse) parameter_range = np.random.randint(10, size=10) sweeper = Sweeper(parameter, parameter_range, [pulse]) platform.sweep(sequence, ExecutionParameters(), sweeper) diff --git a/tests/test_dummy.py b/tests/test_dummy.py index 42f454f252..7e41a141f1 100644 --- a/tests/test_dummy.py +++ b/tests/test_dummy.py @@ -26,8 +26,8 @@ def test_dummy_execute_pulse_sequence(name, acquisition): platform = create_platform(name) ro_pulse = platform.create_qubit_readout_pulse(0, 0) sequence = PulseSequence() - sequence.add(platform.create_qubit_readout_pulse(0, 0)) - sequence.add(platform.create_RX12_pulse(0, 0)) + sequence.append(platform.create_qubit_readout_pulse(0, 0)) + sequence.append(platform.create_RX12_pulse(0, 0)) options = ExecutionParameters(nshots=100, acquisition_type=acquisition) result = platform.execute_pulse_sequence(sequence, options) if acquisition is AcquisitionType.INTEGRATION: @@ -56,7 +56,7 @@ def test_dummy_execute_coupler_pulse(): sequence = PulseSequence() pulse = platform.create_coupler_pulse(coupler=0, start=0) - sequence.add(pulse) + sequence.append(pulse) options = ExecutionParameters(nshots=None) result = platform.execute_pulse_sequence(sequence, options) @@ -79,11 +79,11 @@ def test_dummy_execute_pulse_sequence_couplers(): qubits=(qubit_ordered_pair.qubit1.name, qubit_ordered_pair.qubit2.name), start=0, ) - sequence.add(cz.get_qubit_pulses(qubit_ordered_pair.qubit1.name)) - sequence.add(cz.get_qubit_pulses(qubit_ordered_pair.qubit2.name)) - sequence.add(cz.coupler_pulses(qubit_ordered_pair.coupler.name)) - sequence.add(platform.create_qubit_readout_pulse(0, 40)) - sequence.add(platform.create_qubit_readout_pulse(2, 40)) + sequence.append(cz.get_qubit_pulses(qubit_ordered_pair.qubit1.name)) + sequence.append(cz.get_qubit_pulses(qubit_ordered_pair.qubit2.name)) + sequence.append(cz.coupler_pulses(qubit_ordered_pair.coupler.name)) + sequence.append(platform.create_qubit_readout_pulse(0, 40)) + sequence.append(platform.create_qubit_readout_pulse(2, 40)) options = ExecutionParameters(nshots=None) result = platform.execute_pulse_sequence(sequence, options) @@ -98,7 +98,7 @@ def test_dummy_execute_pulse_sequence_couplers(): def test_dummy_execute_pulse_sequence_fast_reset(name): platform = create_platform(name) sequence = PulseSequence() - sequence.add(platform.create_qubit_readout_pulse(0, 0)) + sequence.append(platform.create_qubit_readout_pulse(0, 0)) options = ExecutionParameters(nshots=None, fast_reset=True) result = platform.execute_pulse_sequence(sequence, options) @@ -115,7 +115,7 @@ def test_dummy_execute_pulse_sequence_unrolling(name, acquisition, batch_size): platform.instruments["dummy"].UNROLLING_BATCH_SIZE = batch_size sequences = [] sequence = PulseSequence() - sequence.add(platform.create_qubit_readout_pulse(0, 0)) + sequence.append(platform.create_qubit_readout_pulse(0, 0)) for _ in range(nsequences): sequences.append(sequence) options = ExecutionParameters(nshots=nshots, acquisition_type=acquisition) @@ -135,7 +135,7 @@ def test_dummy_single_sweep_raw(name): pulse = platform.create_qubit_readout_pulse(qubit=0, start=0) parameter_range = np.random.randint(SWEPT_POINTS, size=SWEPT_POINTS) - sequence.add(pulse) + sequence.append(pulse) sweeper = Sweeper(Parameter.frequency, parameter_range, pulses=[pulse]) options = ExecutionParameters( nshots=10, @@ -175,7 +175,7 @@ def test_dummy_single_sweep_coupler( parameter_range = np.random.rand(SWEPT_POINTS) else: parameter_range = np.random.randint(SWEPT_POINTS, size=SWEPT_POINTS) - sequence.add(ro_pulse) + sequence.append(ro_pulse) if parameter in QubitParameter: sweeper = Sweeper(parameter, parameter_range, couplers=[platform.couplers[0]]) else: @@ -221,7 +221,7 @@ def test_dummy_single_sweep(name, fast_reset, parameter, average, acquisition, n parameter_range = np.random.rand(SWEPT_POINTS) else: parameter_range = np.random.randint(SWEPT_POINTS, size=SWEPT_POINTS) - sequence.add(pulse) + sequence.append(pulse) if parameter in QubitParameter: sweeper = Sweeper(parameter, parameter_range, qubits=[platform.qubits[0]]) else: @@ -264,8 +264,8 @@ def test_dummy_double_sweep(name, parameter1, parameter2, average, acquisition, sequence = PulseSequence() pulse = platform.create_qubit_drive_pulse(qubit=0, start=0, duration=1000) ro_pulse = platform.create_qubit_readout_pulse(qubit=0, start=pulse.finish) - sequence.add(pulse) - sequence.add(ro_pulse) + sequence.append(pulse) + sequence.append(ro_pulse) parameter_range_1 = ( np.random.rand(SWEPT_POINTS) if parameter1 is Parameter.amplitude @@ -329,7 +329,7 @@ def test_dummy_single_sweep_multiplex(name, parameter, average, acquisition, nsh ro_pulses = {} for qubit in platform.qubits: ro_pulses[qubit] = platform.create_qubit_readout_pulse(qubit=qubit, start=0) - sequence.add(ro_pulses[qubit]) + sequence.append(ro_pulses[qubit]) parameter_range = ( np.random.rand(SWEPT_POINTS) if parameter is Parameter.amplitude diff --git a/tests/test_instruments_qblox.py b/tests/test_instruments_qblox.py new file mode 100644 index 0000000000..23069414e2 --- /dev/null +++ b/tests/test_instruments_qblox.py @@ -0,0 +1,314 @@ +"""Qblox instruments driver. + +Supports the following Instruments: + Cluster + Cluster QRM-RF + Cluster QCM-RF + Cluster QCM +Compatible with qblox-instruments driver 0.9.0 (28/2/2023). +It supports: + - multiplexed readout of up to 6 qubits + - hardware modulation, demodulation, and classification + - software modulation, with support for arbitrary pulses + - software demodulation + - binned acquisition + - real-time sweepers of + - pulse frequency (requires hardware modulation) + - pulse relative phase (requires hardware modulation) + - pulse amplitude + - pulse start + - pulse duration + - port gain + - port offset + - multiple readouts for the same qubit (sequence unrolling) + - max iq pulse length 8_192ns + - waveforms cache, uses additional free sequencers if the memory of one sequencer (16384) is exhausted + - instrument parameters cache + - safe disconnection of offsets on termination +""" + + +# from .conftest import load_from_platform + +# INSTRUMENTS_LIST = ["Cluster", "ClusterQRM_RF", "ClusterQCM_RF"] + +# instruments = {} +# instruments_settings = {} + + +# @pytest.mark.qpu +# @pytest.mark.parametrize("name", INSTRUMENTS_LIST) +# def test_instruments_qublox_init(platform_name, name): +# platform = create_platform(platform_name) +# settings = platform.settings +# # Instantiate instrument +# instance, instr_settings = load_from_platform(create_platform(platform_name), name) +# instruments[name] = instance +# instruments_settings[name] = instr_settings +# assert instance.name == name +# assert instance.is_connected == False +# assert instance.device == None +# assert instance.data_folder == INSTRUMENTS_DATA_FOLDER / instance.tmp_folder.name.split("/")[-1] + + +# @pytest.mark.qpu +# @pytest.mark.parametrize("name", INSTRUMENTS_LIST) +# def test_instruments_qublox_connect(name): +# instruments[name].connect() + + +# @pytest.mark.qpu +# @pytest.mark.parametrize("name", INSTRUMENTS_LIST) +# def test_instruments_qublox_setup(platform_name, name): +# settings = create_platform(platform_name).settings +# instruments[name].setup(**settings["settings"], **instruments_settings[name]) +# for parameter in instruments_settings[name]: +# if parameter == "ports": +# for port in instruments_settings[name]["ports"]: +# for sub_parameter in instruments_settings[name]["ports"][port]: +# # assert getattr(instruments[name].ports[port], sub_parameter) == settings["instruments"][name]["settings"]["ports"][port][sub_parameter] +# np.testing.assert_allclose( +# getattr(instruments[name].ports[port], sub_parameter), +# instruments_settings[name]["ports"][port][sub_parameter], +# atol=1e-4, +# ) +# else: +# assert getattr(instruments[name], parameter) == instruments_settings[name][parameter] + + +# def instrument_test_property_wrapper( +# origin_object, origin_attribute, destination_object, *destination_parameters, values +# ): +# for value in values: +# setattr(origin_object, origin_attribute, value) +# for destination_parameter in destination_parameters: +# assert (destination_object.get(destination_parameter) == value) or ( +# np.testing.assert_allclose(destination_object.get(destination_parameter), value, rtol=1e-1) == None +# ) + + +# @pytest.mark.qpu +# @pytest.mark.parametrize("name", INSTRUMENTS_LIST) +# def test_instruments_qublox_set_property_wrappers(name): +# instrument = instruments[name] +# device = instruments[name].device +# if instrument.__class__.__name__ == "Cluster": +# instrument_test_property_wrapper( +# instrument, "reference_clock_source", device, "reference_source", values=["external", "internal"] +# ) +# if instrument.__class__.__name__ == "ClusterQRM_RF": +# port = instruments[name].ports["o1"] +# sequencer = device.sequencers[instrument.DEFAULT_SEQUENCERS["o1"]] +# instrument_test_property_wrapper(port, "attenuation", device, "out0_att", values=np.arange(0, 60 + 2, 2)) +# instrument_test_property_wrapper(port, "lo_enabled", device, "out0_in0_lo_en", values=[True, False]) +# instrument_test_property_wrapper( +# port, "lo_frequency", device, "out0_in0_lo_freq", values=np.linspace(2e9, 18e9, 20) +# ) +# instrument_test_property_wrapper( +# port, "gain", sequencer, "gain_awg_path0", "gain_awg_path1", values=np.linspace(-1, 1, 20) +# ) +# instrument_test_property_wrapper(port, "hardware_mod_en", sequencer, "mod_en_awg", values=[True, False]) +# instrument_test_property_wrapper(port, "nco_freq", sequencer, "nco_freq", values=np.linspace(-500e6, 500e6, 20)) +# instrument_test_property_wrapper( +# port, "nco_phase_offs", sequencer, "nco_phase_offs", values=np.linspace(0, 359, 20) +# ) +# port = instruments[name].ports["i1"] +# sequencer = device.sequencers[instrument.DEFAULT_SEQUENCERS["i1"]] +# instrument_test_property_wrapper(port, "hardware_demod_en", sequencer, "demod_en_acq", values=[True, False]) +# instrument_test_property_wrapper( +# instrument, +# "acquisition_duration", +# sequencer, +# "integration_length_acq", +# values=np.arange(4, 16777212 + 4, 729444), +# ) +# # FIXME: I don't know why this is failing +# instrument_test_property_wrapper( +# instrument, +# "thresholded_acq_threshold", +# sequencer, +# "thresholded_acq_threshold", +# # values=np.linspace(-16777212.0, 16777212.0, 20), +# values=np.zeros(1), +# ) +# instrument_test_property_wrapper( +# instrument, +# "thresholded_acq_rotation", +# sequencer, +# "thresholded_acq_rotation", +# values=np.zeros(1), +# # values=np.linspace(0, 359, 20) +# ) +# if instrument.__class__.__name__ == "ClusterQCM_RF": +# port = instruments[name].ports["o1"] +# sequencer = device.sequencers[instrument.DEFAULT_SEQUENCERS["o1"]] +# instrument_test_property_wrapper(port, "attenuation", device, "out0_att", values=np.arange(0, 60 + 2, 2)) +# instrument_test_property_wrapper(port, "lo_enabled", device, "out0_lo_en", values=[True, False]) +# instrument_test_property_wrapper( +# port, "lo_frequency", device, "out0_lo_freq", values=np.linspace(2e9, 18e9, 20) +# ) +# instrument_test_property_wrapper( +# port, "gain", sequencer, "gain_awg_path0", "gain_awg_path1", values=np.linspace(-1, 1, 20) +# ) +# instrument_test_property_wrapper(port, "hardware_mod_en", sequencer, "mod_en_awg", values=[True, False]) +# instrument_test_property_wrapper(port, "nco_freq", sequencer, "nco_freq", values=np.linspace(-500e6, 500e6, 20)) +# instrument_test_property_wrapper( +# port, "nco_phase_offs", sequencer, "nco_phase_offs", values=np.linspace(0, 359, 20) +# ) +# port = instruments[name].ports["o2"] +# sequencer = device.sequencers[instrument.DEFAULT_SEQUENCERS["o2"]] +# instrument_test_property_wrapper(port, "attenuation", device, "out1_att", values=np.arange(0, 60 + 2, 2)) +# instrument_test_property_wrapper(port, "lo_enabled", device, "out1_lo_en", values=[True, False]) +# instrument_test_property_wrapper( +# port, "lo_frequency", device, "out1_lo_freq", values=np.linspace(2e9, 18e9, 20) +# ) +# instrument_test_property_wrapper( +# port, "gain", sequencer, "gain_awg_path0", "gain_awg_path1", values=np.linspace(-1, 1, 20) +# ) +# instrument_test_property_wrapper(port, "hardware_mod_en", sequencer, "mod_en_awg", values=[True, False]) +# instrument_test_property_wrapper(port, "nco_freq", sequencer, "nco_freq", values=np.linspace(-500e6, 500e6, 20)) +# instrument_test_property_wrapper( +# port, "nco_phase_offs", sequencer, "nco_phase_offs", values=np.linspace(0, 359, 20) +# ) + + +# def instrument_set_and_test_parameter_values(instrument, target, parameter, values): +# for value in values: +# instrument._set_device_parameter(target, parameter, value) +# np.testing.assert_allclose(target.get(parameter), value) + + +# @pytest.mark.parametrize("name", INSTRUMENTS_LIST) +# def test_instruments_qublox_set_device_paramters(name): +# """ # TODO: add attitional paramter tests +# qrm +# platform.instruments['qrm_rf'].device.print_readable_snapshot(update=True) +# cluster_module16: +# parameter value +# -------------------------------------------------------------------------------- +# in0_att : 0 (dB) +# out0_att : 34 (dB) +# out0_in0_lo_en : True +# out0_in0_lo_freq : 7537724144 (Hz) +# out0_offset_path0 : 34 (mV) +# out0_offset_path1 : 0 (mV) +# present : True +# scope_acq_avg_mode_en_path0 : True +# scope_acq_avg_mode_en_path1 : True +# scope_acq_sequencer_select : 0 +# scope_acq_trigger_level_path0 : 0 +# scope_acq_trigger_level_path1 : 0 +# scope_acq_trigger_mode_path0 : sequencer +# scope_acq_trigger_mode_path1 : sequencer +# cluster_module16_sequencer0: +# parameter value +# -------------------------------------------------------------------------------- +# channel_map_path0_out0_en : True +# channel_map_path1_out1_en : True +# cont_mode_en_awg_path0 : False +# cont_mode_en_awg_path1 : False +# cont_mode_waveform_idx_awg_path0 : 0 +# cont_mode_waveform_idx_awg_path1 : 0 +# demod_en_acq : False +# thresholded_acq_threshold : 0 +# gain_awg_path0 : 1 +# gain_awg_path1 : 1 +# integration_length_acq : 2000 +# marker_ovr_en : True +# marker_ovr_value : 15 +# mixer_corr_gain_ratio : 1 +# mixer_corr_phase_offset_degree : -0 +# mod_en_awg : False +# nco_freq : 0 (Hz) +# nco_phase_offs : 0 (Degrees) +# offset_awg_path0 : 0 +# offset_awg_path1 : 0 +# thresholded_acq_rotation : 0 (Degrees) +# sequence : /nfs/users/alvaro.orgaz/qibolab/src/qibola... +# sync_en : True +# upsample_rate_awg_path0 : 0 +# upsample_rate_awg_path1 : 0 + +# qcm: +# platform.instruments['qcm_rf2'].device.print_readable_snapshot(update=True) +# cluster_module12: +# parameter value +# -------------------------------------------------------------------------------- +# out0_att : 24 (dB) +# out0_lo_en : True +# out0_lo_freq : 5325473000 (Hz) +# out0_offset_path0 : 24 (mV) +# out0_offset_path1 : 24 (mV) +# out1_att : 24 (dB) +# out1_lo_en : True +# out1_lo_freq : 6212286000 (Hz) +# out1_offset_path0 : 0 (mV) +# out1_offset_path1 : 0 (mV) +# present : True +# cluster_module12_sequencer0: +# parameter value +# -------------------------------------------------------------------------------- +# channel_map_path0_out0_en : True +# channel_map_path0_out2_en : False +# channel_map_path1_out1_en : True +# channel_map_path1_out3_en : False +# cont_mode_en_awg_path0 : False +# cont_mode_en_awg_path1 : False +# cont_mode_waveform_idx_awg_path0 : 0 +# cont_mode_waveform_idx_awg_path1 : 0 +# gain_awg_path0 : 0.33998 +# gain_awg_path1 : 0.33998 +# marker_ovr_en : True +# marker_ovr_value : 15 +# mixer_corr_gain_ratio : 1 +# mixer_corr_phase_offset_degree : -0 +# mod_en_awg : False +# nco_freq : -2e+08 (Hz) +# nco_phase_offs : 0 (Degrees) +# offset_awg_path0 : 0 +# offset_awg_path1 : 0 +# sequence : /nfs/users/alvaro.orgaz/qibolab/src/qibola... +# sync_en : True +# upsample_rate_awg_path0 : 0 +# upsample_rate_awg_path1 : 0 +# """ + + +# @pytest.mark.qpu +# @pytest.mark.parametrize("name", INSTRUMENTS_LIST) +# def test_instruments_process_pulse_sequence_upload_play(platform_name, name): +# instrument = instruments[name] +# settings = create_platform(platform_name).settings +# instrument.setup(**settings["settings"], **instruments_settings[name]) +# relaxation_time = settings["settings"]["relaxation_time"] +# instrument_pulses = {} +# instrument_pulses[name] = PulseSequence() +# if "QCM" in instrument.__class__.__name__: +# for channel in instrument.channel_port_map: +# instrument_pulses[name].append(Pulse(0, 200, 1, 10e6, np.pi / 2, "Gaussian(5)", str(channel))) +# instrument.process_pulse_sequence(instrument_pulses[name], nshots=5, relaxation_time=relaxation_time) +# instrument.upload() +# instrument.play_sequence() +# if "QRM" in instrument.__class__.__name__: +# channel = instrument._port_channel_map["o1"] +# instrument_pulses[name].append( +# Pulse(0, 200, 1, 10e6, np.pi / 2, "Gaussian(5)", channel), +# ReadoutPulse(200, 2000, 1, 10e6, np.pi / 2, "Rectangular()", channel), +# ) +# instrument.device.sequencers[0].sync_en( +# False +# ) # TODO: Check why this is necessary here and not when playing a PS of only one readout pulse +# instrument.process_pulse_sequence(instrument_pulses[name], nshots=5, relaxation_time=relaxation_time) +# instrument.upload() +# instrument.play_sequence() +# acquisition_results = instrument.acquire() + + +# @pytest.mark.qpu +# @pytest.mark.parametrize("name", INSTRUMENTS_LIST) +# def test_instruments_qublox_start_stop_disconnect(name): +# instrument = instruments[name] +# instrument.start() +# instrument.stop() +# instrument.disconnect() +# assert instrument.is_connected == False diff --git a/tests/test_instruments_qblox_cluster_qcm_bb.py b/tests/test_instruments_qblox_cluster_qcm_bb.py index 5af689fe09..d6f7309d1b 100644 --- a/tests/test_instruments_qblox_cluster_qcm_bb.py +++ b/tests/test_instruments_qblox_cluster_qcm_bb.py @@ -136,10 +136,10 @@ def test_connect(connected_qcm_bb: QcmBb): @pytest.mark.qpu def test_pulse_sequence(connected_platform, connected_qcm_bb: QcmBb): ps = PulseSequence() - ps.add(FluxPulse(40, 70, 0.5, "Rectangular", O1_OUTPUT_CHANNEL)) - ps.add(FluxPulse(0, 50, 0.3, "Rectangular", O2_OUTPUT_CHANNEL)) - ps.add(FluxPulse(20, 100, 0.02, "Rectangular", O3_OUTPUT_CHANNEL)) - ps.add(FluxPulse(32, 48, 0.4, "Rectangular", O4_OUTPUT_CHANNEL)) + ps.append(FluxPulse(40, 70, 0.5, "Rectangular", O1_OUTPUT_CHANNEL)) + ps.append(FluxPulse(0, 50, 0.3, "Rectangular", O2_OUTPUT_CHANNEL)) + ps.append(FluxPulse(20, 100, 0.02, "Rectangular", O3_OUTPUT_CHANNEL)) + ps.append(FluxPulse(32, 48, 0.4, "Rectangular", O4_OUTPUT_CHANNEL)) qubits = connected_platform.qubits connected_qcm_bb._ports["o2"].hardware_mod_en = True connected_qcm_bb.process_pulse_sequence(qubits, ps, 1000, 1, 10000) @@ -155,10 +155,10 @@ def test_pulse_sequence(connected_platform, connected_qcm_bb: QcmBb): @pytest.mark.qpu def test_sweepers(connected_platform, connected_qcm_bb: QcmBb): ps = PulseSequence() - ps.add(FluxPulse(40, 70, 0.5, "Rectangular", O1_OUTPUT_CHANNEL)) - ps.add(FluxPulse(0, 50, 0.3, "Rectangular", O2_OUTPUT_CHANNEL)) - ps.add(FluxPulse(20, 100, 0.02, "Rectangular", O3_OUTPUT_CHANNEL)) - ps.add(FluxPulse(32, 48, 0.4, "Rectangular", O4_OUTPUT_CHANNEL)) + ps.append(FluxPulse(40, 70, 0.5, "Rectangular", O1_OUTPUT_CHANNEL)) + ps.append(FluxPulse(0, 50, 0.3, "Rectangular", O2_OUTPUT_CHANNEL)) + ps.append(FluxPulse(20, 100, 0.02, "Rectangular", O3_OUTPUT_CHANNEL)) + ps.append(FluxPulse(32, 48, 0.4, "Rectangular", O4_OUTPUT_CHANNEL)) qubits = connected_platform.qubits amplitude_range = np.linspace(0, 0.25, 50) diff --git a/tests/test_instruments_qblox_cluster_qcm_rf.py b/tests/test_instruments_qblox_cluster_qcm_rf.py index 5d046de2d6..f7926d6d93 100644 --- a/tests/test_instruments_qblox_cluster_qcm_rf.py +++ b/tests/test_instruments_qblox_cluster_qcm_rf.py @@ -151,7 +151,7 @@ def test_connect(connected_qcm_rf: QcmRf): @pytest.mark.qpu def test_pulse_sequence(connected_platform, connected_qcm_rf: QcmRf): ps = PulseSequence() - ps.add( + ps.append( DrivePulse( 0, 200, @@ -162,7 +162,7 @@ def test_pulse_sequence(connected_platform, connected_qcm_rf: QcmRf): O1_OUTPUT_CHANNEL, ) ) - ps.add( + ps.append( DrivePulse( 0, 200, @@ -189,7 +189,7 @@ def test_pulse_sequence(connected_platform, connected_qcm_rf: QcmRf): @pytest.mark.qpu def test_sweepers(connected_platform, connected_qcm_rf: QcmRf): ps = PulseSequence() - ps.add( + ps.append( DrivePulse( 0, 200, @@ -200,7 +200,7 @@ def test_sweepers(connected_platform, connected_qcm_rf: QcmRf): O1_OUTPUT_CHANNEL, ) ) - ps.add( + ps.append( DrivePulse( 0, 200, diff --git a/tests/test_instruments_qblox_cluster_qrm_rf.py b/tests/test_instruments_qblox_cluster_qrm_rf.py index 21978461a5..eb7b6adcd5 100644 --- a/tests/test_instruments_qblox_cluster_qrm_rf.py +++ b/tests/test_instruments_qblox_cluster_qrm_rf.py @@ -145,13 +145,13 @@ def test_connect(connected_qrm_rf: QrmRf): def test_pulse_sequence(connected_platform, connected_qrm_rf: QrmRf): ps = PulseSequence() for channel in connected_qrm_rf.channel_map: - ps.add(DrivePulse(0, 200, 1, 6.8e9, np.pi / 2, "Gaussian(5)", channel)) - ps.add( + ps.append(DrivePulse(0, 200, 1, 6.8e9, np.pi / 2, "Gaussian(5)", channel)) + ps.append( ReadoutPulse( 200, 2000, 1, 7.1e9, np.pi / 2, "Rectangular()", channel, qubit=0 ) ) - ps.add( + ps.append( ReadoutPulse( 200, 2000, 1, 7.2e9, np.pi / 2, "Rectangular()", channel, qubit=1 ) @@ -184,7 +184,7 @@ def test_sweepers(connected_platform, connected_qrm_rf: QrmRf): ro_pulses[1] = ReadoutPulse( 200, 2000, 1, 7.2e9, np.pi / 2, "Rectangular()", channel, qubit=1 ) - ps.add(qd_pulses[0], ro_pulses[0], ro_pulses[1]) + ps.append(qd_pulses[0], ro_pulses[0], ro_pulses[1]) qubits = connected_platform.qubits diff --git a/tests/test_instruments_qmsim.py b/tests/test_instruments_qmsim.py index 3eaaa8d11e..8488621d59 100644 --- a/tests/test_instruments_qmsim.py +++ b/tests/test_instruments_qmsim.py @@ -120,7 +120,7 @@ def test_qmsim_resonator_spectroscopy(simulator, folder): ro_pulses = {} for qubit in qubits: ro_pulses[qubit] = simulator.create_qubit_readout_pulse(qubit, start=0) - sequence.add(ro_pulses[qubit]) + sequence.append(ro_pulses[qubit]) options = ExecutionParameters(nshots=1) result = simulator.execute_pulse_sequence(sequence, options) samples = result.get_simulated_samples() @@ -140,8 +140,8 @@ def test_qmsim_qubit_spectroscopy(simulator, folder): ro_pulses[qubit] = simulator.create_qubit_readout_pulse( qubit, start=qd_pulses[qubit].finish ) - sequence.add(qd_pulses[qubit]) - sequence.add(ro_pulses[qubit]) + sequence.append(qd_pulses[qubit]) + sequence.append(ro_pulses[qubit]) options = ExecutionParameters(nshots=1) result = simulator.execute_pulse_sequence(sequence, options) samples = result.get_simulated_samples() @@ -166,8 +166,8 @@ def test_qmsim_sweep(simulator, folder, parameter, values): ro_pulses[qubit] = simulator.create_MZ_pulse( qubit, start=qd_pulses[qubit].finish ) - sequence.add(qd_pulses[qubit]) - sequence.add(ro_pulses[qubit]) + sequence.append(qd_pulses[qubit]) + sequence.append(ro_pulses[qubit]) pulses = [qd_pulses[qubit] for qubit in qubits] sweeper = Sweeper(parameter, values, pulses) options = ExecutionParameters( @@ -187,7 +187,7 @@ def test_qmsim_sweep_bias(simulator, folder): ro_pulses = {} for qubit in qubits: ro_pulses[qubit] = simulator.create_MZ_pulse(qubit, start=0) - sequence.add(ro_pulses[qubit]) + sequence.append(ro_pulses[qubit]) values = [0, 0.005] sweeper = Sweeper( Parameter.bias, values, qubits=[simulator.qubits[q] for q in qubits] @@ -213,8 +213,8 @@ def test_qmsim_sweep_start(simulator, folder): ro_pulses[qubit] = simulator.create_MZ_pulse( qubit, start=qd_pulses[qubit].finish ) - sequence.add(qd_pulses[qubit]) - sequence.add(ro_pulses[qubit]) + sequence.append(qd_pulses[qubit]) + sequence.append(ro_pulses[qubit]) values = [20, 40] pulses = [ro_pulses[qubit] for qubit in qubits] sweeper = Sweeper(Parameter.start, values, pulses=pulses) @@ -243,9 +243,9 @@ def test_qmsim_sweep_start_two_pulses(simulator, folder): ro_pulses[qubit] = simulator.create_MZ_pulse( qubit, start=qd_pulses2[qubit].finish ) - sequence.add(qd_pulses1[qubit]) - sequence.add(qd_pulses2[qubit]) - sequence.add(ro_pulses[qubit]) + sequence.append(qd_pulses1[qubit]) + sequence.append(qd_pulses2[qubit]) + sequence.append(ro_pulses[qubit]) values = [20, 60] pulses = [qd_pulses2[qubit] for qubit in qubits] sweeper = Sweeper(Parameter.start, values, pulses=pulses) @@ -273,8 +273,8 @@ def test_qmsim_sweep_duration(simulator, folder): ro_pulses[qubit] = simulator.create_MZ_pulse( qubit, start=qd_pulses[qubit].finish ) - sequence.add(qd_pulses[qubit]) - sequence.add(ro_pulses[qubit]) + sequence.append(qd_pulses[qubit]) + sequence.append(ro_pulses[qubit]) values = [20, 60] pulses = [qd_pulses[qubit] for qubit in qubits] sweeper = Sweeper(Parameter.duration, values, pulses=pulses) @@ -307,9 +307,9 @@ def test_qmsim_sweep_duration_two_pulses(simulator, folder): ro_pulses[qubit] = simulator.create_MZ_pulse( qubit, start=qd_pulses2[qubit].finish ) - sequence.add(qd_pulses1[qubit]) - sequence.add(qd_pulses2[qubit]) - sequence.add(ro_pulses[qubit]) + sequence.append(qd_pulses1[qubit]) + sequence.append(qd_pulses2[qubit]) + sequence.append(ro_pulses[qubit]) values = [20, 60] pulses = [qd_pulses1[qubit] for qubit in qubits] sweeper = Sweeper(Parameter.duration, values, pulses=pulses) @@ -373,9 +373,9 @@ def test_qmsim_allxy(simulator, folder, count, gate_pair): for gate in gate_pair: pulse = allxy_pulses[gate](qubit, start) if pulse is not None: - sequence.add(pulse) + sequence.append(pulse) start += pulse.duration - sequence.add(simulator.create_MZ_pulse(qubit, start=start)) + sequence.append(simulator.create_MZ_pulse(qubit, start=start)) options = ExecutionParameters(nshots=1) result = simulator.execute_pulse_sequence(sequence, options) @@ -403,11 +403,11 @@ def test_qmsim_chevron(simulator, folder, sweep): highfreq, start=flux_pulse.finish ) sequence = PulseSequence() - sequence.add(initialize_1) - sequence.add(initialize_2) - sequence.add(flux_pulse) - sequence.add(measure_lowfreq) - sequence.add(measure_highfreq) + sequence.append(initialize_1) + sequence.append(initialize_2) + sequence.append(flux_pulse) + sequence.append(measure_lowfreq) + sequence.append(measure_highfreq) options = ExecutionParameters( nshots=1, @@ -494,9 +494,9 @@ def test_qmsim_snz_pulse(simulator, folder, qubit): qd_pulse = simulator.create_RX_pulse(qubit, start=0) flux_pulse = FluxPulse(qd_pulse.finish, duration, amplitude, shape, channel, qubit) ro_pulse = simulator.create_MZ_pulse(qubit, start=flux_pulse.finish) - sequence.add(qd_pulse) - sequence.add(flux_pulse) - sequence.add(ro_pulse) + sequence.append(qd_pulse) + sequence.append(flux_pulse) + sequence.append(ro_pulse) options = ExecutionParameters(nshots=1) result = simulator.execute_pulse_sequence(sequence, options) samples = result.get_simulated_samples() @@ -507,9 +507,9 @@ def test_qmsim_snz_pulse(simulator, folder, qubit): def test_qmsim_bell_circuit(simulator, folder, qubits): backend = QibolabBackend(simulator) circuit = Circuit(5) - circuit.add(gates.H(qubits[0])) - circuit.add(gates.CNOT(*qubits)) - circuit.add(gates.M(*qubits)) + circuit.append(gates.H(qubits[0])) + circuit.append(gates.CNOT(*qubits)) + circuit.append(gates.M(*qubits)) result = backend.execute_circuit(circuit, nshots=1) result = result.execution_result samples = result.get_simulated_samples() @@ -520,10 +520,10 @@ def test_qmsim_bell_circuit(simulator, folder, qubits): def test_qmsim_ghz_circuit(simulator, folder): backend = QibolabBackend(simulator) circuit = Circuit(5) - circuit.add(gates.H(2)) - circuit.add(gates.CNOT(2, 1)) - circuit.add(gates.CNOT(2, 3)) - circuit.add(gates.M(1, 2, 3)) + circuit.append(gates.H(2)) + circuit.append(gates.CNOT(2, 1)) + circuit.append(gates.CNOT(2, 3)) + circuit.append(gates.M(1, 2, 3)) result = backend.execute_circuit(circuit, nshots=1) result = result.execution_result samples = result.get_simulated_samples() diff --git a/tests/test_instruments_rfsoc.py b/tests/test_instruments_rfsoc.py index f20e65408f..f26921fb0d 100644 --- a/tests/test_instruments_rfsoc.py +++ b/tests/test_instruments_rfsoc.py @@ -32,7 +32,7 @@ def test_convert_default(dummy_qrc): integer = 12 qubits = platform.qubits sequence = PulseSequence() - sequence.add(Pulse(0, 40, 0.9, 50e6, 0, Drag(5, 2), 0, PulseType.DRIVE, 0)) + sequence.append(Pulse(0, 40, 0.9, 50e6, 0, Drag(5, 2), 0, PulseType.DRIVE, 0)) parameter = Parameter.frequency with pytest.raises(ValueError): @@ -199,8 +199,8 @@ def test_convert_units_sweeper(dummy_qrc): seq = PulseSequence() pulse0 = Pulse(0, 40, 0.9, 50e6, 0, Gaussian(2), 0, PulseType.DRIVE, 0) pulse1 = Pulse(40, 40, 0.9, 50e6, 0, Rectangular(), 0, PulseType.READOUT, 0) - seq.add(pulse0) - seq.add(pulse1) + seq.append(pulse0) + seq.append(pulse1) # frequency sweeper sweeper = rfsoc.Sweeper( @@ -267,8 +267,8 @@ def test_convert_sweep(dummy_qrc): seq = PulseSequence() pulse0 = Pulse(0, 40, 0.9, 50e6, 0, Gaussian(2), 0, PulseType.DRIVE, 0) pulse1 = Pulse(40, 40, 0.9, 50e6, 0, Rectangular(), 0, PulseType.READOUT, 0) - seq.add(pulse0) - seq.add(pulse1) + seq.append(pulse0) + seq.append(pulse1) sweeper = Sweeper( parameter=Parameter.bias, values=np.arange(-0.5, +0.5, 0.1), qubits=[qubit] @@ -377,8 +377,8 @@ def test_play(mocker, dummy_qrc): seq = PulseSequence() pulse0 = Pulse(0, 40, 0.9, 50e6, 0, Gaussian(2), 0, PulseType.DRIVE, 0) pulse1 = Pulse(40, 40, 0.9, 50e6, 0, Rectangular(), 0, PulseType.READOUT, 0) - seq.add(pulse0) - seq.add(pulse1) + seq.append(pulse0) + seq.append(pulse1) nshots = 100 server_results = ([[np.random.rand(nshots)]], [[np.random.rand(nshots)]]) @@ -418,8 +418,8 @@ def test_sweep(mocker, dummy_qrc): seq = PulseSequence() pulse0 = Pulse(0, 40, 0.9, 50e6, 0, Gaussian(2), 0, PulseType.DRIVE, 0) pulse1 = Pulse(40, 40, 0.9, 50e6, 0, Rectangular(), 0, PulseType.READOUT, 0) - seq.add(pulse0) - seq.add(pulse1) + seq.append(pulse0) + seq.append(pulse1) sweeper0 = Sweeper( parameter=Parameter.frequency, values=np.arange(0, 100, 1), pulses=[pulse0] ) @@ -471,8 +471,8 @@ def test_validate_input_command(dummy_qrc): seq = PulseSequence() pulse0 = Pulse(0, 40, 0.9, 50e6, 0, Gaussian(2), 0, PulseType.DRIVE, 0) pulse1 = Pulse(40, 40, 0.9, 50e6, 0, Rectangular(), 0, PulseType.READOUT, 0) - seq.add(pulse0) - seq.add(pulse1) + seq.append(pulse0) + seq.append(pulse1) parameters = ExecutionParameters(acquisition_type=AcquisitionType.RAW) with pytest.raises(NotImplementedError): @@ -490,8 +490,8 @@ def test_update_cfg(mocker, dummy_qrc): seq = PulseSequence() pulse0 = Pulse(0, 40, 0.9, 50e6, 0, Gaussian(2), 0, PulseType.DRIVE, 0) pulse1 = Pulse(40, 40, 0.9, 50e6, 0, Rectangular(), 0, PulseType.READOUT, 0) - seq.add(pulse0) - seq.add(pulse1) + seq.append(pulse0) + seq.append(pulse1) nshots = 333 relax_time = 1e6 @@ -583,8 +583,8 @@ def test_get_if_python_sweep(dummy_qrc): instrument = platform.instruments["tii_rfsoc4x2"] sequence_1 = PulseSequence() - sequence_1.add(platform.create_RX_pulse(qubit=0, start=0)) - sequence_1.add(platform.create_MZ_pulse(qubit=0, start=100)) + sequence_1.append(platform.create_RX_pulse(qubit=0, start=0)) + sequence_1.append(platform.create_MZ_pulse(qubit=0, start=100)) sweep1 = Sweeper( parameter=Parameter.frequency, @@ -610,7 +610,7 @@ def test_get_if_python_sweep(dummy_qrc): assert not instrument.get_if_python_sweep(sequence_1, sweep3) sequence_2 = PulseSequence() - sequence_2.add(platform.create_RX_pulse(qubit=0, start=0)) + sequence_2.append(platform.create_RX_pulse(qubit=0, start=0)) sweep1 = Sweeper( parameter=Parameter.frequency, @@ -633,7 +633,7 @@ def test_get_if_python_sweep(dummy_qrc): instrument = platform.instruments["tii_rfsoc4x2"] sequence_1 = PulseSequence() - sequence_1.add(platform.create_RX_pulse(qubit=0, start=0)) + sequence_1.append(platform.create_RX_pulse(qubit=0, start=0)) sweep1 = Sweeper( parameter=Parameter.frequency, values=np.arange(10, 100, 10), @@ -668,9 +668,9 @@ def test_convert_av_sweep_results(dummy_qrc): instrument = platform.instruments["tii_rfsoc4x2"] sequence = PulseSequence() - sequence.add(platform.create_RX_pulse(qubit=0, start=0)) - sequence.add(platform.create_MZ_pulse(qubit=0, start=100)) - sequence.add(platform.create_MZ_pulse(qubit=0, start=200)) + sequence.append(platform.create_RX_pulse(qubit=0, start=0)) + sequence.append(platform.create_MZ_pulse(qubit=0, start=100)) + sequence.append(platform.create_MZ_pulse(qubit=0, start=200)) sweep1 = Sweeper( parameter=Parameter.frequency, values=np.arange(10, 35, 10), @@ -721,9 +721,9 @@ def test_convert_nav_sweep_results(dummy_qrc): instrument = platform.instruments["tii_rfsoc4x2"] sequence = PulseSequence() - sequence.add(platform.create_RX_pulse(qubit=0, start=0)) - sequence.add(platform.create_MZ_pulse(qubit=0, start=100)) - sequence.add(platform.create_MZ_pulse(qubit=0, start=200)) + sequence.append(platform.create_RX_pulse(qubit=0, start=0)) + sequence.append(platform.create_MZ_pulse(qubit=0, start=100)) + sequence.append(platform.create_MZ_pulse(qubit=0, start=200)) sweep1 = Sweeper( parameter=Parameter.frequency, values=np.arange(10, 35, 10), @@ -781,8 +781,8 @@ def test_call_executepulsesequence(connected_platform, instrument): instrument = platform.instruments["tii_rfsoc4x2"] sequence = PulseSequence() - sequence.add(platform.create_RX_pulse(qubit=0, start=0)) - sequence.add(platform.create_MZ_pulse(qubit=0, start=100)) + sequence.append(platform.create_RX_pulse(qubit=0, start=0)) + sequence.append(platform.create_MZ_pulse(qubit=0, start=100)) instrument.cfg.average = False i_vals_nav, q_vals_nav = instrument._execute_pulse_sequence( @@ -809,8 +809,8 @@ def test_call_execute_sweeps(connected_platform, instrument): instrument = platform.instruments["tii_rfsoc4x2"] sequence = PulseSequence() - sequence.add(platform.create_RX_pulse(qubit=0, start=0)) - sequence.add(platform.create_MZ_pulse(qubit=0, start=100)) + sequence.append(platform.create_RX_pulse(qubit=0, start=0)) + sequence.append(platform.create_MZ_pulse(qubit=0, start=100)) sweep = Sweeper( parameter=Parameter.frequency, values=np.arange(10, 35, 10), @@ -840,8 +840,8 @@ def test_play_qpu(connected_platform, instrument): instrument = platform.instruments["tii_rfsoc4x2"] sequence = PulseSequence() - sequence.add(platform.create_RX_pulse(qubit=0, start=0)) - sequence.add(platform.create_MZ_pulse(qubit=0, start=100)) + sequence.append(platform.create_RX_pulse(qubit=0, start=0)) + sequence.append(platform.create_MZ_pulse(qubit=0, start=100)) out_dict = instrument.play( platform.qubits, @@ -862,8 +862,8 @@ def test_sweep_qpu(connected_platform, instrument): instrument = platform.instruments["tii_rfsoc4x2"] sequence = PulseSequence() - sequence.add(platform.create_RX_pulse(qubit=0, start=0)) - sequence.add(platform.create_MZ_pulse(qubit=0, start=100)) + sequence.append(platform.create_RX_pulse(qubit=0, start=0)) + sequence.append(platform.create_MZ_pulse(qubit=0, start=100)) sweep = Sweeper( parameter=Parameter.frequency, values=np.arange(10, 35, 10), @@ -912,8 +912,8 @@ def test_python_reqursive_sweep(connected_platform, instrument): instrument = platform.instruments["tii_rfsoc4x2"] sequence = PulseSequence() - sequence.add(platform.create_RX_pulse(qubit=0, start=0)) - sequence.add(platform.create_MZ_pulse(qubit=0, start=100)) + sequence.append(platform.create_RX_pulse(qubit=0, start=0)) + sequence.append(platform.create_MZ_pulse(qubit=0, start=100)) sweep1 = Sweeper( parameter=Parameter.amplitude, values=np.arange(0.01, 0.03, 10), diff --git a/tests/test_instruments_zhinst.py b/tests/test_instruments_zhinst.py index bbea85ecb6..36d740d38c 100644 --- a/tests/test_instruments_zhinst.py +++ b/tests/test_instruments_zhinst.py @@ -387,9 +387,9 @@ def test_experiment_flow(dummy_qrc): channel=platform.qubits[q].flux.name, qubit=q, ) - sequence.add(qf_pulses[q]) + sequence.append(qf_pulses[q]) ro_pulses[q] = platform.create_qubit_readout_pulse(q, start=qf_pulses[q].finish) - sequence.add(ro_pulses[q]) + sequence.append(ro_pulses[q]) options = ExecutionParameters( relaxation_time=300e-6, @@ -426,9 +426,9 @@ def test_experiment_flow_coupler(dummy_qrc): channel=platform.qubits[q].flux.name, qubit=q, ) - sequence.add(qf_pulses[q]) + sequence.append(qf_pulses[q]) ro_pulses[q] = platform.create_qubit_readout_pulse(q, start=qf_pulses[q].finish) - sequence.add(ro_pulses[q]) + sequence.append(ro_pulses[q]) cf_pulses = {} for coupler in couplers.values(): @@ -441,7 +441,7 @@ def test_experiment_flow_coupler(dummy_qrc): channel=platform.couplers[c].flux.name, qubit=c, ) - sequence.add(cf_pulses[c]) + sequence.append(cf_pulses[c]) options = ExecutionParameters( relaxation_time=300e-6, @@ -470,7 +470,7 @@ def test_sweep_and_play_sim(dummy_qrc): qf_pulses = {} for qubit in qubits.values(): q = qubit.name - qf_pulses[q] = FluxPulse( + qf_pulses[q] = Pulse.flux( start=0, duration=500, amplitude=1, @@ -523,11 +523,11 @@ def test_experiment_sweep_single(dummy_qrc, parameter1): qd_pulses = {} for qubit in qubits: qd_pulses[qubit] = platform.create_RX_pulse(qubit, start=0) - sequence.add(qd_pulses[qubit]) + sequence.append(qd_pulses[qubit]) ro_pulses[qubit] = platform.create_qubit_readout_pulse( qubit, start=qd_pulses[qubit].finish ) - sequence.add(ro_pulses[qubit]) + sequence.append(ro_pulses[qubit]) parameter_range_1 = ( np.random.rand(swept_points) @@ -565,11 +565,11 @@ def test_experiment_sweep_single_coupler(dummy_qrc, parameter1): qd_pulses = {} for qubit in qubits: qd_pulses[qubit] = platform.create_RX_pulse(qubit, start=0) - sequence.add(qd_pulses[qubit]) + sequence.append(qd_pulses[qubit]) ro_pulses[qubit] = platform.create_qubit_readout_pulse( qubit, start=qd_pulses[qubit].finish ) - sequence.add(ro_pulses[qubit]) + sequence.append(ro_pulses[qubit]) cf_pulses = {} for coupler in couplers.values(): @@ -582,7 +582,7 @@ def test_experiment_sweep_single_coupler(dummy_qrc, parameter1): channel=platform.couplers[c].flux.name, qubit=c, ) - sequence.add(cf_pulses[c]) + sequence.append(cf_pulses[c]) parameter_range_1 = ( np.random.rand(swept_points) @@ -631,11 +631,11 @@ def test_experiment_sweep_2d_general(dummy_qrc, parameter1, parameter2): qd_pulses = {} for qubit in qubits: qd_pulses[qubit] = platform.create_RX_pulse(qubit, start=0) - sequence.add(qd_pulses[qubit]) + sequence.append(qd_pulses[qubit]) ro_pulses[qubit] = platform.create_qubit_readout_pulse( qubit, start=qd_pulses[qubit].finish ) - sequence.add(ro_pulses[qubit]) + sequence.append(ro_pulses[qubit]) parameter_range_1 = ( np.random.rand(swept_points) @@ -688,11 +688,11 @@ def test_experiment_sweep_2d_specific(dummy_qrc): qd_pulses = {} for qubit in qubits: qd_pulses[qubit] = platform.create_RX_pulse(qubit, start=0) - sequence.add(qd_pulses[qubit]) + sequence.append(qd_pulses[qubit]) ro_pulses[qubit] = platform.create_qubit_readout_pulse( qubit, start=qd_pulses[qubit].finish ) - sequence.add(ro_pulses[qubit]) + sequence.append(ro_pulses[qubit]) parameter1 = Parameter.relative_phase parameter2 = Parameter.frequency @@ -751,7 +751,7 @@ def test_experiment_sweep_punchouts(dummy_qrc, parameter): ro_pulses = {} for qubit in qubits: ro_pulses[qubit] = platform.create_qubit_readout_pulse(qubit, start=0) - sequence.add(ro_pulses[qubit]) + sequence.append(ro_pulses[qubit]) parameter_range_1 = ( np.random.rand(swept_points) @@ -791,11 +791,11 @@ def test_batching(dummy_qrc): instrument = platform.instruments["EL_ZURO"] sequence = PulseSequence() - sequence.add(platform.create_RX_pulse(0, start=0)) - sequence.add(platform.create_RX_pulse(1, start=0)) + sequence.append(platform.create_RX_pulse(0, start=0)) + sequence.append(platform.create_RX_pulse(1, start=0)) measurement_start = sequence.finish - sequence.add(platform.create_MZ_pulse(0, start=measurement_start)) - sequence.add(platform.create_MZ_pulse(1, start=measurement_start)) + sequence.append(platform.create_MZ_pulse(0, start=measurement_start)) + sequence.append(platform.create_MZ_pulse(1, start=measurement_start)) batches = list(batch(600 * [sequence], instrument.bounds)) # These sequences get limited by the number of measuraments (600/250/2) @@ -836,11 +836,11 @@ def test_experiment_execute_pulse_sequence_qpu(connected_platform, instrument): channel=platform.qubits[q].flux.name, qubit=q, ) - sequence.add(qf_pulses[q]) + sequence.append(qf_pulses[q]) if qubit.flux_coupler: continue ro_pulses[q] = platform.create_qubit_readout_pulse(q, start=qf_pulses[q].finish) - sequence.add(ro_pulses[q]) + sequence.append(ro_pulses[q]) options = ExecutionParameters( relaxation_time=300e-6, @@ -867,11 +867,11 @@ def test_experiment_sweep_2d_specific_qpu(connected_platform, instrument): qd_pulses = {} for qubit in qubits: qd_pulses[qubit] = platform.create_RX_pulse(qubit, start=0) - sequence.add(qd_pulses[qubit]) + sequence.append(qd_pulses[qubit]) ro_pulses[qubit] = platform.create_qubit_readout_pulse( qubit, start=qd_pulses[qubit].finish ) - sequence.add(ro_pulses[qubit]) + sequence.append(ro_pulses[qubit]) parameter1 = Parameter.relative_phase parameter2 = Parameter.frequency @@ -947,9 +947,9 @@ def test_experiment_measurement_sequence(dummy_qrc): qubit_drive_pulse_2 = platform.create_qubit_drive_pulse( qubit, start=readout_pulse_start + 50, duration=40 ) - sequence.add(qubit_drive_pulse_1) - sequence.add(ro_pulse) - sequence.add(qubit_drive_pulse_2) + sequence.append(qubit_drive_pulse_1) + sequence.append(ro_pulse) + sequence.append(qubit_drive_pulse_2) options = ExecutionParameters( relaxation_time=4, diff --git a/tests/test_platform.py b/tests/test_platform.py index 4389681eeb..0f575693d7 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -43,8 +43,8 @@ def test_unroll_sequences(platform): sequence = PulseSequence() qd_pulse = platform.create_RX_pulse(qubit, start=0) ro_pulse = platform.create_MZ_pulse(qubit, start=qd_pulse.finish) - sequence.add(qd_pulse) - sequence.add(ro_pulse) + sequence.append(qd_pulse) + sequence.append(ro_pulse) total_sequence, readouts = unroll_sequences(10 * [sequence], relaxation_time=10000) assert len(total_sequence) == 20 assert len(total_sequence.ro_pulses) == 10 @@ -192,7 +192,7 @@ def test_platform_execute_one_drive_pulse(qpu_platform): platform = qpu_platform qubit = next(iter(platform.qubits)) sequence = PulseSequence() - sequence.add(platform.create_qubit_drive_pulse(qubit, start=0, duration=200)) + sequence.append(platform.create_qubit_drive_pulse(qubit, start=0, duration=200)) platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=nshots)) @@ -204,7 +204,7 @@ def test_platform_execute_one_coupler_pulse(qpu_platform): pytest.skip("The platform does not have couplers") coupler = next(iter(platform.couplers)) sequence = PulseSequence() - sequence.add( + sequence.append( platform.create_coupler_pulse(coupler, start=0, duration=200, amplitude=1) ) platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=nshots)) @@ -232,7 +232,7 @@ def test_platform_execute_one_long_drive_pulse(qpu_platform): qubit = next(iter(platform.qubits)) pulse = platform.create_qubit_drive_pulse(qubit, start=0, duration=8192 + 200) sequence = PulseSequence() - sequence.add(pulse) + sequence.append(pulse) options = ExecutionParameters(nshots=nshots) if find_instrument(platform, QbloxController) is not None: with pytest.raises(NotImplementedError): @@ -253,7 +253,7 @@ def test_platform_execute_one_extralong_drive_pulse(qpu_platform): qubit = next(iter(platform.qubits)) pulse = platform.create_qubit_drive_pulse(qubit, start=0, duration=2 * 8192 + 200) sequence = PulseSequence() - sequence.add(pulse) + sequence.append(pulse) options = ExecutionParameters(nshots=nshots) if find_instrument(platform, QbloxController) is not None: with pytest.raises(NotImplementedError): @@ -273,8 +273,8 @@ def test_platform_execute_one_drive_one_readout(qpu_platform): platform = qpu_platform qubit = next(iter(platform.qubits)) sequence = PulseSequence() - sequence.add(platform.create_qubit_drive_pulse(qubit, start=0, duration=200)) - sequence.add(platform.create_qubit_readout_pulse(qubit, start=200)) + sequence.append(platform.create_qubit_drive_pulse(qubit, start=0, duration=200)) + sequence.append(platform.create_qubit_readout_pulse(qubit, start=200)) platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=nshots)) @@ -284,10 +284,10 @@ def test_platform_execute_multiple_drive_pulses_one_readout(qpu_platform): platform = qpu_platform qubit = next(iter(platform.qubits)) sequence = PulseSequence() - sequence.add(platform.create_qubit_drive_pulse(qubit, start=0, duration=200)) - sequence.add(platform.create_qubit_drive_pulse(qubit, start=204, duration=200)) - sequence.add(platform.create_qubit_drive_pulse(qubit, start=408, duration=400)) - sequence.add(platform.create_qubit_readout_pulse(qubit, start=808)) + sequence.append(platform.create_qubit_drive_pulse(qubit, start=0, duration=200)) + sequence.append(platform.create_qubit_drive_pulse(qubit, start=204, duration=200)) + sequence.append(platform.create_qubit_drive_pulse(qubit, start=408, duration=400)) + sequence.append(platform.create_qubit_readout_pulse(qubit, start=808)) platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=nshots)) @@ -299,10 +299,10 @@ def test_platform_execute_multiple_drive_pulses_one_readout_no_spacing( platform = qpu_platform qubit = next(iter(platform.qubits)) sequence = PulseSequence() - sequence.add(platform.create_qubit_drive_pulse(qubit, start=0, duration=200)) - sequence.add(platform.create_qubit_drive_pulse(qubit, start=200, duration=200)) - sequence.add(platform.create_qubit_drive_pulse(qubit, start=400, duration=400)) - sequence.add(platform.create_qubit_readout_pulse(qubit, start=800)) + sequence.append(platform.create_qubit_drive_pulse(qubit, start=0, duration=200)) + sequence.append(platform.create_qubit_drive_pulse(qubit, start=200, duration=200)) + sequence.append(platform.create_qubit_drive_pulse(qubit, start=400, duration=400)) + sequence.append(platform.create_qubit_readout_pulse(qubit, start=800)) platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=nshots)) @@ -314,10 +314,10 @@ def test_platform_execute_multiple_overlaping_drive_pulses_one_readout( platform = qpu_platform qubit = next(iter(platform.qubits)) sequence = PulseSequence() - sequence.add(platform.create_qubit_drive_pulse(qubit, start=0, duration=200)) - sequence.add(platform.create_qubit_drive_pulse(qubit, start=200, duration=200)) - sequence.add(platform.create_qubit_drive_pulse(qubit, start=50, duration=400)) - sequence.add(platform.create_qubit_readout_pulse(qubit, start=800)) + sequence.append(platform.create_qubit_drive_pulse(qubit, start=0, duration=200)) + sequence.append(platform.create_qubit_drive_pulse(qubit, start=200, duration=200)) + sequence.append(platform.create_qubit_drive_pulse(qubit, start=50, duration=400)) + sequence.append(platform.create_qubit_readout_pulse(qubit, start=800)) platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=nshots)) @@ -335,10 +335,10 @@ def test_platform_execute_multiple_readout_pulses(qpu_platform): ro_pulse2 = platform.create_qubit_readout_pulse( qubit, start=(ro_pulse1.start + ro_pulse1.duration + 400) ) - sequence.add(qd_pulse1) - sequence.add(ro_pulse1) - sequence.add(qd_pulse2) - sequence.add(ro_pulse2) + sequence.append(qd_pulse1) + sequence.append(ro_pulse1) + sequence.append(qd_pulse2) + sequence.append(ro_pulse2) platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=nshots)) @@ -355,8 +355,8 @@ def test_excited_state_probabilities_pulses(qpu_platform): for qubit in qubits: qd_pulse = platform.create_RX_pulse(qubit) ro_pulse = platform.create_MZ_pulse(qubit, start=qd_pulse.duration) - sequence.add(qd_pulse) - sequence.add(ro_pulse) + sequence.append(qd_pulse) + sequence.append(ro_pulse) result = platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=5000)) nqubits = len(qubits) @@ -387,7 +387,7 @@ def test_ground_state_probabilities_pulses(qpu_platform, start_zero): else: qd_pulse = platform.create_RX_pulse(qubit) ro_pulse = platform.create_MZ_pulse(qubit, start=qd_pulse.duration) - sequence.add(ro_pulse) + sequence.append(ro_pulse) result = platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=5000)) nqubits = len(qubits) diff --git a/tests/test_pulses.py b/tests/test_pulses.py index 9939b8faec..d1c925e7c9 100644 --- a/tests/test_pulses.py +++ b/tests/test_pulses.py @@ -452,8 +452,8 @@ def test_pulses_pulsesequence_operators(): p6 = Pulse(300, 40, 0.9, 50e6, 0, Gaussian(5), 1, PulseType.DRIVE) another_ps = PulseSequence() - another_ps.add(p4) - another_ps.add(p5, p6) + another_ps.append(p4) + another_ps.append(p5, p6) assert another_ps[0] == p4 assert another_ps[1] == p5 @@ -488,10 +488,10 @@ def test_pulses_pulsesequence_add(): p3 = Pulse(400, 40, 0.9, 50e6, 0, Gaussian(5), 40, PulseType.DRIVE, 4) ps = PulseSequence() - ps.add(p0) - ps.add(p1) + ps.append(p0) + ps.append(p1) psx = PulseSequence(p2, p3) - ps.add(psx) + ps.append(psx) assert ps.count == 4 assert ps.qubits == [1, 2, 3, 4] @@ -933,7 +933,7 @@ def test_readout_pulse(): def test_pulse_sequence_add(): sequence = PulseSequence() - sequence.add( + sequence.append( Pulse( start=0, frequency=200_000_000, @@ -944,7 +944,7 @@ def test_pulse_sequence_add(): channel=1, ) ) - sequence.add( + sequence.append( Pulse( start=64, frequency=200_000_000, @@ -961,7 +961,7 @@ def test_pulse_sequence_add(): def test_pulse_sequence__add__(): sequence = PulseSequence() - sequence.add( + sequence.append( Pulse( start=0, frequency=200_000_000, @@ -972,7 +972,7 @@ def test_pulse_sequence__add__(): channel=1, ) ) - sequence.add( + sequence.append( Pulse( start=64, frequency=200_000_000, @@ -991,7 +991,7 @@ def test_pulse_sequence__add__(): def test_pulse_sequence__mul__(): sequence = PulseSequence() - sequence.add( + sequence.append( Pulse( start=0, frequency=200_000_000, @@ -1002,7 +1002,7 @@ def test_pulse_sequence__mul__(): channel=1, ) ) - sequence.add( + sequence.append( Pulse( start=64, frequency=200_000_000, @@ -1027,7 +1027,7 @@ def test_pulse_sequence__mul__(): def test_pulse_sequence_add_readout(): sequence = PulseSequence() - sequence.add( + sequence.append( Pulse( start=0, frequency=200_000_000, @@ -1039,7 +1039,7 @@ def test_pulse_sequence_add_readout(): ) ) - sequence.add( + sequence.append( Pulse( start=64, frequency=200_000_000, @@ -1052,7 +1052,7 @@ def test_pulse_sequence_add_readout(): ) ) - sequence.add( + sequence.append( ReadoutPulse( start=128, frequency=20_000_000, diff --git a/tests/test_result_shapes.py b/tests/test_result_shapes.py index 9bb149d3e1..d4317689ed 100644 --- a/tests/test_result_shapes.py +++ b/tests/test_result_shapes.py @@ -22,8 +22,8 @@ def execute(platform, acquisition_type, averaging_mode, sweep=False): qd_pulse = platform.create_RX_pulse(qubit, start=0) ro_pulse = platform.create_MZ_pulse(qubit, start=qd_pulse.finish) sequence = PulseSequence() - sequence.add(qd_pulse) - sequence.add(ro_pulse) + sequence.append(qd_pulse) + sequence.append(ro_pulse) options = ExecutionParameters( nshots=NSHOTS, acquisition_type=acquisition_type, averaging_mode=averaging_mode From 161c8cbef0f2a7c9e078e3579f12546982bc48d1 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 16 Jan 2024 15:55:55 +0100 Subject: [PATCH 0005/1006] Fix sequence iteration in backends --- src/qibolab/backends.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qibolab/backends.py b/src/qibolab/backends.py index f17ce97f82..7df62649fe 100644 --- a/src/qibolab/backends.py +++ b/src/qibolab/backends.py @@ -69,7 +69,7 @@ def assign_measurements(self, measurement_map, readout): containing the readout measurement shots. This is created in ``execute_circuit``. """ for gate, sequence in measurement_map.items(): - _samples = (readout[pulse.serial].samples for pulse in sequence.pulses) + _samples = (readout[pulse.serial].samples for pulse in sequence) samples = list(filter(lambda x: x is not None, _samples)) gate.result.backend = self gate.result.register_samples(np.array(samples).T) @@ -162,7 +162,7 @@ def execute_circuits(self, circuits, initial_states=None, nshots=1000): ) for gate, sequence in measurement_map.items(): samples = [ - readout[pulse.serial].popleft().samples for pulse in sequence.pulses + readout[pulse.serial].popleft().samples for pulse in sequence ] gate.result.backend = self gate.result.register_samples(np.array(samples).T) From 770248f6fda98451d833bfbb93ff0c6b9e88b0fc Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 16 Jan 2024 15:56:24 +0100 Subject: [PATCH 0006/1006] Fix compiler tests related to sequences --- tests/test_compilers_default.py | 70 ++++++++++++++++----------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/tests/test_compilers_default.py b/tests/test_compilers_default.py index a1a85c3667..eaa550b98c 100644 --- a/tests/test_compilers_default.py +++ b/tests/test_compilers_default.py @@ -112,14 +112,14 @@ def test_gpi2_to_sequence(platform): circuit = Circuit(1) circuit.add(gates.GPI2(0, phi=0.2)) sequence = compile_circuit(circuit, platform) - assert len(sequence.pulses) == 1 + assert len(sequence) == 1 assert len(sequence.qd_pulses) == 1 - RX90_pulse = platform.create_RX90_pulse(0, start=0, relative_phase=0.2) - s = PulseSequence(RX90_pulse) + rx90_pulse = platform.create_RX90_pulse(0, start=0, relative_phase=0.2) + s = PulseSequence([rx90_pulse]) - np.testing.assert_allclose(sequence.duration, RX90_pulse.duration) - assert sequence.serial == s.serial + np.testing.assert_allclose(sequence.duration, rx90_pulse.duration) + assert sequence == s def test_u3_to_sequence(platform): @@ -127,19 +127,19 @@ def test_u3_to_sequence(platform): circuit.add(gates.U3(0, 0.1, 0.2, 0.3)) sequence = compile_circuit(circuit, platform) - assert len(sequence.pulses) == 2 + assert len(sequence) == 2 assert len(sequence.qd_pulses) == 2 - RX90_pulse1 = platform.create_RX90_pulse(0, start=0, relative_phase=0.3) - RX90_pulse2 = platform.create_RX90_pulse( - 0, start=RX90_pulse1.finish, relative_phase=0.4 - np.pi + rx90_pulse1 = platform.create_RX90_pulse(0, start=0, relative_phase=0.3) + rx90_pulse2 = platform.create_RX90_pulse( + 0, start=rx90_pulse1.finish, relative_phase=0.4 - np.pi ) - s = PulseSequence(RX90_pulse1, RX90_pulse2) + s = PulseSequence([rx90_pulse1, rx90_pulse2]) np.testing.assert_allclose( - sequence.duration, RX90_pulse1.duration + RX90_pulse2.duration + sequence.duration, rx90_pulse1.duration + rx90_pulse2.duration ) - assert sequence.serial == s.serial + assert sequence == s def test_two_u3_to_sequence(platform): @@ -148,25 +148,25 @@ def test_two_u3_to_sequence(platform): circuit.add(gates.U3(0, 0.4, 0.6, 0.5)) sequence = compile_circuit(circuit, platform) - assert len(sequence.pulses) == 4 + assert len(sequence) == 4 assert len(sequence.qd_pulses) == 4 - RX90_pulse = platform.create_RX90_pulse(0) + rx90_pulse = platform.create_RX90_pulse(0) - np.testing.assert_allclose(sequence.duration, 2 * 2 * RX90_pulse.duration) + np.testing.assert_allclose(sequence.duration, 2 * 2 * rx90_pulse.duration) - RX90_pulse1 = platform.create_RX90_pulse(0, start=0, relative_phase=0.3) - RX90_pulse2 = platform.create_RX90_pulse( - 0, start=RX90_pulse1.finish, relative_phase=0.4 - np.pi + rx90_pulse1 = platform.create_RX90_pulse(0, start=0, relative_phase=0.3) + rx90_pulse2 = platform.create_RX90_pulse( + 0, start=rx90_pulse1.finish, relative_phase=0.4 - np.pi ) - RX90_pulse3 = platform.create_RX90_pulse( - 0, start=RX90_pulse2.finish, relative_phase=1.1 + rx90_pulse3 = platform.create_RX90_pulse( + 0, start=rx90_pulse2.finish, relative_phase=1.1 ) - RX90_pulse4 = platform.create_RX90_pulse( - 0, start=RX90_pulse3.finish, relative_phase=1.5 - np.pi + rx90_pulse4 = platform.create_RX90_pulse( + 0, start=rx90_pulse3.finish, relative_phase=1.5 - np.pi ) - s = PulseSequence(RX90_pulse1, RX90_pulse2, RX90_pulse3, RX90_pulse4) - assert sequence.serial == s.serial + s = PulseSequence([rx90_pulse1, rx90_pulse2, rx90_pulse3, rx90_pulse4]) + assert sequence == s def test_cz_to_sequence(platform): @@ -200,17 +200,17 @@ def test_add_measurement_to_sequence(platform): circuit.add(gates.M(0)) sequence = compile_circuit(circuit, platform) - assert len(sequence.pulses) == 3 + assert len(sequence) == 3 assert len(sequence.qd_pulses) == 2 assert len(sequence.ro_pulses) == 1 - RX90_pulse1 = platform.create_RX90_pulse(0, start=0, relative_phase=0.3) - RX90_pulse2 = platform.create_RX90_pulse( - 0, start=RX90_pulse1.finish, relative_phase=0.4 - np.pi + rx90_pulse1 = platform.create_RX90_pulse(0, start=0, relative_phase=0.3) + rx90_pulse2 = platform.create_RX90_pulse( + 0, start=rx90_pulse1.finish, relative_phase=0.4 - np.pi ) - MZ_pulse = platform.create_MZ_pulse(0, start=RX90_pulse2.finish) - s = PulseSequence(RX90_pulse1, RX90_pulse2, MZ_pulse) - assert sequence.serial == s.serial + mz_pulse = platform.create_MZ_pulse(0, start=rx90_pulse2.finish) + s = PulseSequence([rx90_pulse1, rx90_pulse2, mz_pulse]) + assert sequence == s @pytest.mark.parametrize("delay", [0, 100]) @@ -220,9 +220,9 @@ def test_align_delay_measurement(platform, delay): circuit.add(gates.M(0)) sequence = compile_circuit(circuit, platform) - assert len(sequence.pulses) == 1 + assert len(sequence) == 1 assert len(sequence.ro_pulses) == 1 - MZ_pulse = platform.create_MZ_pulse(0, start=delay) - s = PulseSequence(MZ_pulse) - assert sequence.serial == s.serial + mz_pulse = platform.create_MZ_pulse(0, start=delay) + s = PulseSequence([mz_pulse]) + assert sequence == s From 42286f018d6846c79e4733c45e53f77dfdfe1d6d Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 16 Jan 2024 16:42:16 +0100 Subject: [PATCH 0007/1006] Fix tests directly targeted to pulses --- src/qibolab/pulses.py | 17 ++- tests/test_pulses.py | 249 +++++++++++------------------------------- 2 files changed, 76 insertions(+), 190 deletions(-) diff --git a/src/qibolab/pulses.py b/src/qibolab/pulses.py index b411dded0d..f6e27a8dcf 100644 --- a/src/qibolab/pulses.py +++ b/src/qibolab/pulses.py @@ -1233,6 +1233,12 @@ class PulseSequence(list): modify any of the properties of its pulses. """ + def __add__(self, other): + return PulseSequence(super().__add__(other)) + + def __mul__(self, other): + return PulseSequence(super().__mul__(other)) + def __repr__(self): return f"{type(self).__name__}({super().__repr__()})" @@ -1378,7 +1384,7 @@ def get_pulse_overlaps(self): # -> dict((int,int): PulseSequence): overlaps[(times[n], times[n + 1])] = PulseSequence() for pulse in self: if (pulse.start <= times[n]) & (pulse.finish >= times[n + 1]): - overlaps[(times[n], times[n + 1])] += pulse + overlaps[(times[n], times[n + 1])] += [pulse] return overlaps def separate_overlapping_pulses(self): # -> dict((int,int): PulseSequence): @@ -1405,7 +1411,7 @@ def separate_overlapping_pulses(self): # -> dict((int,int): PulseSequence): stored = True break if not stored: - separated_pulses.append(PulseSequence(new_pulse)) + separated_pulses.append(PulseSequence([new_pulse])) return separated_pulses # TODO: Implement separate_different_frequency_pulses() @@ -1416,8 +1422,9 @@ def pulses_overlap(self) -> bool: overlap = False for pc in self.get_pulse_overlaps().values(): - if pc.count > 1: + if len(pc) > 1: overlap = True + break return overlap def plot(self, savefig_filename=None, sampling_rate=SAMPLING_RATE): @@ -1431,8 +1438,8 @@ def plot(self, savefig_filename=None, sampling_rate=SAMPLING_RATE): import matplotlib.pyplot as plt from matplotlib import gridspec - fig = plt.figure(figsize=(14, 2 * self.count), dpi=200) - gs = gridspec.GridSpec(ncols=1, nrows=self.count) + fig = plt.figure(figsize=(14, 2 * len(self)), dpi=200) + gs = gridspec.GridSpec(ncols=1, nrows=len(self)) vertical_lines = [] for pulse in self: vertical_lines.append(pulse.start) diff --git a/tests/test_pulses.py b/tests/test_pulses.py index d1c925e7c9..2a33b1f4e4 100644 --- a/tests/test_pulses.py +++ b/tests/test_pulses.py @@ -29,7 +29,7 @@ HERE = pathlib.Path(__file__).parent -def test_pulses_plot_functions(): +def test_plot_functions(): p0 = Pulse(0, 40, 0.9, 0, 0, Rectangular(), 0, PulseType.FLUX, 0) p1 = Pulse(0, 40, 0.9, 50e6, 0, Gaussian(5), 0, PulseType.DRIVE, 2) p2 = Pulse(0, 40, 0.9, 50e6, 0, Drag(5, 2), 0, PulseType.DRIVE, 200) @@ -37,7 +37,7 @@ def test_pulses_plot_functions(): p4 = FluxPulse(0, 40, 0.9, SNZ(t_idling=10), 0, 200) p5 = Pulse(0, 40, 0.9, 400e6, 0, eCap(alpha=2), 0, PulseType.DRIVE) p6 = Pulse(0, 40, 0.9, 50e6, 0, GaussianSquare(5, 0.9), 0, PulseType.DRIVE, 2) - ps = p0 + p1 + p2 + p3 + p4 + p5 + p6 + ps = PulseSequence([p0, p1, p2, p3, p4, p5, p6]) wf = p0.modulated_waveform_i() plot_file = HERE / "test_plot.png" @@ -55,7 +55,7 @@ def test_pulses_plot_functions(): os.remove(plot_file) -def test_pulses_pulse_init(): +def test_pulse_init(): # standard initialisation p0 = Pulse( start=0, @@ -191,7 +191,7 @@ def test_pulses_pulse_init(): assert p12.finish == 5.5 + 34.33 -def test_pulses_pulse_attributes(): +def test_pulse_attributes(): channel = 0 qubit = 0 @@ -234,7 +234,7 @@ def test_pulses_pulse_attributes(): assert p0.finish == 100 -def test_pulses_is_equal_ignoring_start(): +def test_is_equal_ignoring_start(): """Checks if two pulses are equal, not looking at start time.""" p1 = Pulse(0, 40, 0.9, 0, 0, Rectangular(), 0, PulseType.FLUX, 0) @@ -254,7 +254,7 @@ def test_pulses_is_equal_ignoring_start(): assert not p1.is_equal_ignoring_start(p4) -def test_pulses_pulse_serial(): +def test_pulse_serial(): p11 = Pulse(0, 40, 0.9, 50_000_000, 0, Gaussian(5), 0, PulseType.DRIVE) assert ( p11.serial @@ -266,13 +266,13 @@ def test_pulses_pulse_serial(): @pytest.mark.parametrize( "shape", [Rectangular(), Gaussian(5), GaussianSquare(5, 0.9), Drag(5, 1)] ) -def test_pulses_pulseshape_sampling_rate(shape): +def test_pulseshape_sampling_rate(shape): pulse = Pulse(0, 40, 0.9, 100e6, 0, shape, 0, PulseType.DRIVE) assert len(pulse.envelope_waveform_i(sampling_rate=1).data) == 40 assert len(pulse.envelope_waveform_i(sampling_rate=100).data) == 4000 -def test_pulseshape_eval(): +def testhape_eval(): shape = PulseShape.eval("Rectangular()") assert isinstance(shape, Rectangular) with pytest.raises(ValueError): @@ -331,7 +331,7 @@ def test_raise_shapeiniterror(): shape.envelope_waveform_q() -def test_pulses_pulseshape_drag_shape(): +def test_pulseshape_drag_shape(): pulse = Pulse(0, 2, 1, 4e9, 0, Drag(2, 1), 0, PulseType.DRIVE) # envelope i & envelope q should cross nearly at 0 and at 2 waveform = pulse.envelope_waveform_i(sampling_rate=10).data @@ -362,7 +362,7 @@ def test_pulses_pulseshape_drag_shape(): np.testing.assert_allclose(waveform, target_waveform) -def test_pulses_pulse_hash(): +def test_pulse_hash(): rp = Pulse(0, 40, 0.9, 100e6, 0, Rectangular(), 0, PulseType.DRIVE) dp = Pulse(0, 40, 0.9, 100e6, 0, Drag(5, 1), 0, PulseType.DRIVE) hash(rp) @@ -383,7 +383,7 @@ def test_pulses_pulse_hash(): assert p1 == p3 -def test_pulses_pulse_aliases(): +def test_pulse_aliases(): rop = ReadoutPulse( start=0, duration=50, @@ -414,7 +414,7 @@ def test_pulses_pulse_aliases(): assert repr(fp) == "FluxPulse(0, 300, 0.9, Rectangular(), 0, 0)" -def test_pulses_pulsesequence_init(): +def test_pulsesequence_init(): p1 = Pulse(400, 40, 0.9, 100e6, 0, Drag(5, 1), 3, PulseType.DRIVE) p2 = Pulse(500, 40, 0.9, 100e6, 0, Drag(5, 1), 2, PulseType.DRIVE) p3 = Pulse(600, 40, 0.9, 100e6, 0, Drag(5, 1), 1, PulseType.DRIVE) @@ -422,14 +422,14 @@ def test_pulses_pulsesequence_init(): ps = PulseSequence() assert type(ps) == PulseSequence - ps = PulseSequence(p1, p2, p3) - assert ps.count == 3 and len(ps) == 3 + ps = PulseSequence([p1, p2, p3]) + assert len(ps) == 3 assert ps[0] == p1 assert ps[1] == p2 assert ps[2] == p3 - other_ps = p1 + p2 + p3 - assert other_ps.count == 3 and len(other_ps) == 3 + other_ps = PulseSequence([p1, p2, p3]) + assert len(other_ps) == 3 assert other_ps[0] == p1 assert other_ps[1] == p2 assert other_ps[2] == p3 @@ -441,11 +441,11 @@ def test_pulses_pulsesequence_init(): n += 1 -def test_pulses_pulsesequence_operators(): +def test_pulsesequence_operators(): ps = PulseSequence() - ps += ReadoutPulse(800, 200, 0.9, 20e6, 0, Rectangular(), 1) - ps = ps + ReadoutPulse(800, 200, 0.9, 20e6, 0, Rectangular(), 2) - ps = ReadoutPulse(800, 200, 0.9, 20e6, 0, Rectangular(), 3) + ps + ps += [ReadoutPulse(800, 200, 0.9, 20e6, 0, Rectangular(), 1)] + ps = ps + [ReadoutPulse(800, 200, 0.9, 20e6, 0, Rectangular(), 2)] + ps = [ReadoutPulse(800, 200, 0.9, 20e6, 0, Rectangular(), 3)] + ps p4 = Pulse(100, 40, 0.9, 50e6, 0, Gaussian(5), 3, PulseType.DRIVE) p5 = Pulse(200, 40, 0.9, 50e6, 0, Gaussian(5), 2, PulseType.DRIVE) @@ -453,7 +453,7 @@ def test_pulses_pulsesequence_operators(): another_ps = PulseSequence() another_ps.append(p4) - another_ps.append(p5, p6) + another_ps.extend([p5, p6]) assert another_ps[0] == p4 assert another_ps[1] == p5 @@ -461,59 +461,29 @@ def test_pulses_pulsesequence_operators(): ps += another_ps - assert ps.count == 6 + assert len(ps) == 6 assert p5 in ps # ps.plot() p7 = Pulse(600, 40, 0.9, 100e6, 0, Drag(5, 1), 1, PulseType.DRIVE) - yet_another_ps = PulseSequence(p7) - assert yet_another_ps.count == 1 + yet_another_ps = PulseSequence([p7]) + assert len(yet_another_ps) == 1 yet_another_ps *= 3 - assert yet_another_ps.count == 3 + assert len(yet_another_ps) == 3 yet_another_ps *= 3 - assert yet_another_ps.count == 9 + assert len(yet_another_ps) == 9 p8 = Pulse(600, 40, 0.9, 100e6, 0, Drag(5, 1), 1, PulseType.DRIVE) p9 = Pulse(600, 40, 0.9, 100e6, 0, Drag(5, 1), 2, PulseType.DRIVE) - and_yet_another_ps = 2 * p9 + p8 * 3 - assert and_yet_another_ps.count == 5 + and_yet_another_ps = 2 * PulseSequence([p9]) + [p8] * 3 + assert len(and_yet_another_ps) == 5 -def test_pulses_pulsesequence_add(): - p0 = Pulse(0, 40, 0.9, 50e6, 0, Gaussian(5), 10, PulseType.DRIVE, 1) - p1 = Pulse(100, 40, 0.9, 50e6, 0, Gaussian(5), 20, PulseType.DRIVE, 2) - - p2 = Pulse(200, 40, 0.9, 50e6, 0, Gaussian(5), 30, PulseType.DRIVE, 3) - p3 = Pulse(400, 40, 0.9, 50e6, 0, Gaussian(5), 40, PulseType.DRIVE, 4) - - ps = PulseSequence() - ps.append(p0) - ps.append(p1) - psx = PulseSequence(p2, p3) - ps.append(psx) - - assert ps.count == 4 - assert ps.qubits == [1, 2, 3, 4] - assert ps.channels == [10, 20, 30, 40] - assert ps.start == 0 - assert ps.finish == 440 - - -def test_pulses_pulsesequence_clear(): - p1 = Pulse(600, 40, 0.9, 100e6, 0, Drag(5, 1), 1, PulseType.DRIVE) - p2 = Pulse(600, 40, 0.9, 100e6, 0, Drag(5, 1), 2, PulseType.DRIVE) - ps = 2 * p2 + p1 * 3 - assert ps.count == 5 - ps.clear() - assert ps.count == 0 - assert ps.is_empty - - -def test_pulses_pulsesequence_start_finish(): +def test_pulsesequence_start_finish(): p1 = Pulse(20, 40, 0.9, 200e6, 0, Drag(5, 1), 1, PulseType.DRIVE) p2 = Pulse(60, 1000, 0.9, 20e6, 0, Rectangular(), 2, PulseType.READOUT) - ps = p1 + p2 + ps = PulseSequence([p1]) + [p2] assert ps.start == p1.start assert ps.finish == p2.finish @@ -523,7 +493,7 @@ def test_pulses_pulsesequence_start_finish(): assert p2.finish is None -def test_pulses_pulsesequence_get_channel_pulses(): +def test_pulsesequence_get_channel_pulses(): p1 = DrivePulse(0, 400, 0.9, 20e6, 0, Gaussian(5), 10) p2 = ReadoutPulse(100, 400, 0.9, 20e6, 0, Rectangular(), 30) p3 = DrivePulse(300, 400, 0.9, 20e6, 0, Drag(5, 50), 20) @@ -531,15 +501,15 @@ def test_pulses_pulsesequence_get_channel_pulses(): p5 = ReadoutPulse(500, 400, 0.9, 20e6, 0, Rectangular(), 20) p6 = DrivePulse(600, 400, 0.9, 20e6, 0, Gaussian(5), 30) - ps = PulseSequence(p1, p2, p3, p4, p5, p6) + ps = PulseSequence([p1, p2, p3, p4, p5, p6]) assert ps.channels == [10, 20, 30] - assert ps.get_channel_pulses(10).count == 1 - assert ps.get_channel_pulses(20).count == 2 - assert ps.get_channel_pulses(30).count == 3 - assert ps.get_channel_pulses(20, 30).count == 5 + assert len(ps.get_channel_pulses(10)) == 1 + assert len(ps.get_channel_pulses(20)) == 2 + assert len(ps.get_channel_pulses(30)) == 3 + assert len(ps.get_channel_pulses(20, 30)) == 5 -def test_pulses_pulsesequence_get_qubit_pulses(): +def test_pulsesequence_get_qubit_pulses(): p1 = DrivePulse(0, 400, 0.9, 20e6, 0, Gaussian(5), 10, 0) p2 = ReadoutPulse(100, 400, 0.9, 20e6, 0, Rectangular(), 30, 0) p3 = DrivePulse(300, 400, 0.9, 20e6, 0, Drag(5, 50), 20, 1) @@ -548,15 +518,15 @@ def test_pulses_pulsesequence_get_qubit_pulses(): p6 = FluxPulse(600, 400, 0.9, Rectangular(), 40, 1) p7 = FluxPulse(900, 400, 0.9, Rectangular(), 40, 2) - ps = PulseSequence(p1, p2, p3, p4, p5, p6, p7) + ps = PulseSequence([p1, p2, p3, p4, p5, p6, p7]) assert ps.qubits == [0, 1, 2] - assert ps.get_qubit_pulses(0).count == 2 - assert ps.get_qubit_pulses(1).count == 4 - assert ps.get_qubit_pulses(2).count == 1 - assert ps.get_qubit_pulses(0, 1).count == 6 + assert len(ps.get_qubit_pulses(0)) == 2 + assert len(ps.get_qubit_pulses(1)) == 4 + assert len(ps.get_qubit_pulses(2)) == 1 + assert len(ps.get_qubit_pulses(0, 1)) == 6 -def test_pulses_pulsesequence_pulses_overlap(): +def test_pulsesequence_pulses_overlap(): p1 = DrivePulse(0, 400, 0.9, 20e6, 0, Gaussian(5), 10) p2 = ReadoutPulse(100, 400, 0.9, 20e6, 0, Rectangular(), 30) p3 = DrivePulse(300, 400, 0.9, 20e6, 0, Drag(5, 50), 20) @@ -564,14 +534,14 @@ def test_pulses_pulsesequence_pulses_overlap(): p5 = ReadoutPulse(500, 400, 0.9, 20e6, 0, Rectangular(), 20) p6 = DrivePulse(600, 400, 0.9, 20e6, 0, Gaussian(5), 30) - ps = PulseSequence(p1, p2, p3, p4, p5, p6) - assert ps.pulses_overlap == True - assert ps.get_channel_pulses(10).pulses_overlap == False - assert ps.get_channel_pulses(20).pulses_overlap == True - assert ps.get_channel_pulses(30).pulses_overlap == True + ps = PulseSequence([p1, p2, p3, p4, p5, p6]) + assert ps.pulses_overlap + assert not ps.get_channel_pulses(10).pulses_overlap + assert ps.get_channel_pulses(20).pulses_overlap + assert ps.get_channel_pulses(30).pulses_overlap -def test_pulses_pulsesequence_separate_overlapping_pulses(): +def test_pulsesequence_separate_overlapping_pulses(): p1 = DrivePulse(0, 400, 0.9, 20e6, 0, Gaussian(5), 10) p2 = ReadoutPulse(100, 400, 0.9, 20e6, 0, Rectangular(), 30) p3 = DrivePulse(300, 400, 0.9, 20e6, 0, Drag(5, 50), 20) @@ -579,7 +549,7 @@ def test_pulses_pulsesequence_separate_overlapping_pulses(): p5 = ReadoutPulse(500, 400, 0.9, 20e6, 0, Rectangular(), 20) p6 = DrivePulse(600, 400, 0.9, 20e6, 0, Gaussian(5), 30) - ps = PulseSequence(p1, p2, p3, p4, p5, p6) + ps = PulseSequence([p1, p2, p3, p4, p5, p6]) n = 70 for segregated_ps in ps.separate_overlapping_pulses(): n += 1 @@ -587,19 +557,22 @@ def test_pulses_pulsesequence_separate_overlapping_pulses(): pulse.channel = n -def test_pulses_pulse_pulse_order(): +def test_pulse_pulse_order(): t0 = 0 t = 0 p1 = DrivePulse(t0, 400, 0.9, 20e6, 0, Gaussian(5), 10) p2 = ReadoutPulse(p1.finish + t, 400, 0.9, 20e6, 0, Rectangular(), 30) p3 = DrivePulse(p2.finish, 400, 0.9, 20e6, 0, Drag(5, 50), 20) - ps1 = p1 + p2 + p3 - ps2 = p3 + p1 + p2 - assert ps1 == ps2 - assert hash(ps1) == hash(ps2) + ps1 = PulseSequence([p1, p2, p3]) + ps2 = PulseSequence([p3, p1, p2]) + + def sortseq(sequence): + return sorted(sequence, key=lambda item: (item.start, item.channel)) + assert sortseq(ps1) == sortseq(ps2) -def test_pulses_waveform(): + +def test_waveform(): wf1 = Waveform(np.ones(100)) wf2 = Waveform(np.zeros(100)) wf3 = Waveform(np.ones(100)) @@ -630,7 +603,7 @@ def modulate( return mod_signals[:, 0], mod_signals[:, 1] -def test_pulses_pulseshape_rectangular(): +def test_pulseshape_rectangular(): pulse = Pulse( start=0, duration=50, @@ -691,7 +664,7 @@ def test_pulses_pulseshape_rectangular(): ) -def test_pulses_pulseshape_gaussian(): +def test_pulseshape_gaussian(): pulse = Pulse( start=0, duration=50, @@ -758,7 +731,7 @@ def test_pulses_pulseshape_gaussian(): ) -def test_pulses_pulseshape_drag(): +def test_pulseshape_drag(): pulse = Pulse( start=0, duration=50, @@ -831,7 +804,7 @@ def test_pulses_pulseshape_drag(): ) -def test_pulses_pulseshape_eq(): +def test_pulseshape_eq(): """Checks == operator for pulse shapes.""" shape1 = Rectangular() @@ -931,100 +904,6 @@ def test_readout_pulse(): assert repr(pulse) == target -def test_pulse_sequence_add(): - sequence = PulseSequence() - sequence.append( - Pulse( - start=0, - frequency=200_000_000, - amplitude=0.3, - duration=60, - relative_phase=0, - shape="Gaussian(5)", - channel=1, - ) - ) - sequence.append( - Pulse( - start=64, - frequency=200_000_000, - amplitude=0.3, - duration=30, - relative_phase=0, - shape="Gaussian(5)", - channel=1, - ) - ) - assert len(sequence.pulses) == 2 - assert len(sequence.qd_pulses) == 2 - - -def test_pulse_sequence__add__(): - sequence = PulseSequence() - sequence.append( - Pulse( - start=0, - frequency=200_000_000, - amplitude=0.3, - duration=60, - relative_phase=0, - shape="Gaussian(5)", - channel=1, - ) - ) - sequence.append( - Pulse( - start=64, - frequency=200_000_000, - amplitude=0.3, - duration=30, - relative_phase=0, - shape="Gaussian(5)", - channel=1, - ) - ) - with pytest.raises(TypeError): - sequence + 2 - with pytest.raises(TypeError): - 2 + sequence - - -def test_pulse_sequence__mul__(): - sequence = PulseSequence() - sequence.append( - Pulse( - start=0, - frequency=200_000_000, - amplitude=0.3, - duration=60, - relative_phase=0, - shape="Gaussian(5)", - channel=1, - ) - ) - sequence.append( - Pulse( - start=64, - frequency=200_000_000, - amplitude=0.3, - duration=30, - relative_phase=0, - shape="Gaussian(5)", - channel=1, - ) - ) - with pytest.raises(TypeError): - sequence * 2.5 - with pytest.raises(TypeError): - sequence *= 2.5 - with pytest.raises(TypeError): - sequence *= -1 - with pytest.raises(TypeError): - sequence * -1 - with pytest.raises(TypeError): - 2.5 * sequence - - def test_pulse_sequence_add_readout(): sequence = PulseSequence() sequence.append( @@ -1063,7 +942,7 @@ def test_pulse_sequence_add_readout(): channel=11, ) ) - assert len(sequence.pulses) == 3 + assert len(sequence) == 3 assert len(sequence.ro_pulses) == 1 assert len(sequence.qd_pulses) == 1 assert len(sequence.qf_pulses) == 1 From 778450f45c52d524b14af3b2069c37601c99cce4 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 16 Jan 2024 16:47:46 +0100 Subject: [PATCH 0008/1006] Differentiate append from extend in dummies tests after add remotion --- tests/test_dummy.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/tests/test_dummy.py b/tests/test_dummy.py index 7e41a141f1..8900c2fefe 100644 --- a/tests/test_dummy.py +++ b/tests/test_dummy.py @@ -79,18 +79,16 @@ def test_dummy_execute_pulse_sequence_couplers(): qubits=(qubit_ordered_pair.qubit1.name, qubit_ordered_pair.qubit2.name), start=0, ) - sequence.append(cz.get_qubit_pulses(qubit_ordered_pair.qubit1.name)) - sequence.append(cz.get_qubit_pulses(qubit_ordered_pair.qubit2.name)) - sequence.append(cz.coupler_pulses(qubit_ordered_pair.coupler.name)) + sequence.extend(cz.get_qubit_pulses(qubit_ordered_pair.qubit1.name)) + sequence.extend(cz.get_qubit_pulses(qubit_ordered_pair.qubit2.name)) + sequence.extend(cz.coupler_pulses(qubit_ordered_pair.coupler.name)) sequence.append(platform.create_qubit_readout_pulse(0, 40)) sequence.append(platform.create_qubit_readout_pulse(2, 40)) options = ExecutionParameters(nshots=None) result = platform.execute_pulse_sequence(sequence, options) - test_pulses = "PulseSequence\nFluxPulse(0, 30, 0.05, GaussianSquare(5, 0.75), flux-2, 2)\nCouplerFluxPulse(0, 30, 0.05, GaussianSquare(5, 0.75), flux_coupler-1, 1)" test_phases = {1: 0.0, 2: 0.0} - assert test_pulses == cz.serial assert test_phases == cz_phases From 4fdcf66b576fc64822cce5770ba2ed2971c9fd05 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 16 Jan 2024 16:53:27 +0100 Subject: [PATCH 0009/1006] Wrap default copy, fix rfsoc tests --- src/qibolab/instruments/rfsoc/convert.py | 2 +- src/qibolab/pulses.py | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/qibolab/instruments/rfsoc/convert.py b/src/qibolab/instruments/rfsoc/convert.py index b151682060..34773489e2 100644 --- a/src/qibolab/instruments/rfsoc/convert.py +++ b/src/qibolab/instruments/rfsoc/convert.py @@ -97,7 +97,7 @@ def _( """Convert PulseSequence to list of rfosc pulses with relative time.""" last_pulse_start = 0 list_sequence = [] - for pulse in sorted(sequence.pulses, key=lambda item: item.start): + for pulse in sorted(sequence, key=lambda item: item.start): start_delay = (pulse.start - last_pulse_start) * NS_TO_US pulse_dict = asdict(convert(pulse, qubits, start_delay, sampling_rate)) list_sequence.append(pulse_dict) diff --git a/src/qibolab/pulses.py b/src/qibolab/pulses.py index f6e27a8dcf..edd7b83513 100644 --- a/src/qibolab/pulses.py +++ b/src/qibolab/pulses.py @@ -1234,14 +1234,17 @@ class PulseSequence(list): """ def __add__(self, other): - return PulseSequence(super().__add__(other)) + return type(self)(super().__add__(other)) def __mul__(self, other): - return PulseSequence(super().__mul__(other)) + return type(self)(super().__mul__(other)) def __repr__(self): return f"{type(self).__name__}({super().__repr__()})" + def copy(self): + return type(self)(super().copy()) + @property def ro_pulses(self): """Returns a new PulseSequence containing only its readout pulses.""" From 1aa0b57a085fe10e0ce8ed0ca56cac2ffd7495a4 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 16 Jan 2024 16:55:13 +0100 Subject: [PATCH 0010/1006] Add docstrings to wrapper methods --- src/qibolab/pulses.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/qibolab/pulses.py b/src/qibolab/pulses.py index edd7b83513..7db74b38a8 100644 --- a/src/qibolab/pulses.py +++ b/src/qibolab/pulses.py @@ -1234,15 +1234,19 @@ class PulseSequence(list): """ def __add__(self, other): + """Return self+value.""" return type(self)(super().__add__(other)) def __mul__(self, other): + """Return self*value.""" return type(self)(super().__mul__(other)) def __repr__(self): + """Return repr(self).""" return f"{type(self).__name__}({super().__repr__()})" def copy(self): + """Return a shallow copy of the sequence.""" return type(self)(super().copy()) @property From f213391ba8bf3ac558792bb2b1ceaf19665ce905 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 16 Jan 2024 16:57:47 +0100 Subject: [PATCH 0011/1006] Fix QM tests --- tests/test_instruments_qm.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test_instruments_qm.py b/tests/test_instruments_qm.py index fee8633709..33f61c23c6 100644 --- a/tests/test_instruments_qm.py +++ b/tests/test_instruments_qm.py @@ -456,8 +456,8 @@ def test_qm_qubit_spectroscopy(mocker, qmplatform): ro_pulses[qubit] = platform.create_qubit_readout_pulse( qubit, start=qd_pulses[qubit].finish ) - sequence.add(qd_pulses[qubit]) - sequence.add(ro_pulses[qubit]) + sequence.append(qd_pulses[qubit]) + sequence.append(ro_pulses[qubit]) options = ExecutionParameters(nshots=1024, relaxation_time=100000) result = controller.play(platform.qubits, platform.couplers, sequence, options) @@ -471,8 +471,8 @@ def test_qm_duration_sweeper(mocker, qmplatform): qubit = 1 sequence = PulseSequence() qd_pulse = platform.create_RX_pulse(qubit, start=0) - sequence.add(qd_pulse) - sequence.add(platform.create_MZ_pulse(qubit, start=qd_pulse.finish)) + sequence.append(qd_pulse) + sequence.append(platform.create_MZ_pulse(qubit, start=qd_pulse.finish)) sweeper = Sweeper(Parameter.duration, np.arange(2, 12, 2), pulses=[qd_pulse]) options = ExecutionParameters(nshots=1024, relaxation_time=100000) if platform.name == "qm": From d363e5d9fb82c02a57adc9a8424f2d15789232f1 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 16 Jan 2024 17:17:05 +0100 Subject: [PATCH 0012/1006] Fix doctests, first batch --- doc/source/getting-started/experiment.rst | 2 +- doc/source/tutorials/compiler.rst | 2 +- doc/source/tutorials/pulses.rst | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/source/getting-started/experiment.rst b/doc/source/getting-started/experiment.rst index 8317fbcc54..af50ab09a9 100644 --- a/doc/source/getting-started/experiment.rst +++ b/doc/source/getting-started/experiment.rst @@ -194,7 +194,7 @@ We leave to the dedicated tutorial a full explanation of the experiment, but her # define the pulse sequence sequence = PulseSequence() ro_pulse = platform.create_MZ_pulse(qubit=0, start=0) - sequence.add(ro_pulse) + sequence.append(ro_pulse) # define a sweeper for a frequency scan sweeper = Sweeper( diff --git a/doc/source/tutorials/compiler.rst b/doc/source/tutorials/compiler.rst index a445e8e7f1..33d8edb67b 100644 --- a/doc/source/tutorials/compiler.rst +++ b/doc/source/tutorials/compiler.rst @@ -84,7 +84,7 @@ The following example shows how to modify the compiler in order to execute a cir """X gate applied with a single pi-pulse.""" qubit = gate.target_qubits[0] sequence = PulseSequence() - sequence.add(platform.create_RX_pulse(qubit, start=0)) + sequence.append(platform.create_RX_pulse(qubit, start=0)) return sequence, {} diff --git a/doc/source/tutorials/pulses.rst b/doc/source/tutorials/pulses.rst index 51fa61d763..6fdab05e1b 100644 --- a/doc/source/tutorials/pulses.rst +++ b/doc/source/tutorials/pulses.rst @@ -4,7 +4,7 @@ Pulses execution First, we create the pulse sequence that will be executed. We can do this by defining a :class:`qibolab.pulses.PulseSequence` object and adding different pulses (:class:`qibolab.pulses.Pulse`) through the -:func:`qibolab.pulses.PulseSequence.add()` method: +:func:`qibolab.pulses.PulseSequence.append()` method: .. testcode:: python @@ -20,7 +20,7 @@ pulses (:class:`qibolab.pulses.Pulse`) through the sequence = PulseSequence() # Add some pulses to the pulse sequence - sequence.add( + sequence.append( DrivePulse( start=0, frequency=200000000, @@ -31,7 +31,7 @@ pulses (:class:`qibolab.pulses.Pulse`) through the qubit=0, ) ) - sequence.add( + sequence.append( ReadoutPulse( start=70, frequency=20000000.0, From 3418342761da594db7a4580c1405076fa9083d4c Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 16 Jan 2024 17:27:36 +0100 Subject: [PATCH 0013/1006] Fix remaining doctests --- doc/source/main-documentation/qibolab.rst | 42 +++++++++++++---------- doc/source/tutorials/calibration.rst | 12 +++---- 2 files changed, 30 insertions(+), 24 deletions(-) diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index 13715609f7..8635dfa68f 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -64,9 +64,9 @@ Now we can create a simple sequence (again, without explicitly giving any qubit from qibolab.pulses import PulseSequence ps = PulseSequence() - ps.add(platform.create_RX_pulse(qubit=0, start=0)) # start time is in ns - ps.add(platform.create_RX_pulse(qubit=0, start=100)) - ps.add(platform.create_MZ_pulse(qubit=0, start=200)) + ps.append(platform.create_RX_pulse(qubit=0, start=0)) # start time is in ns + ps.append(platform.create_RX_pulse(qubit=0, start=100)) + ps.append(platform.create_MZ_pulse(qubit=0, start=200)) Now we can execute the sequence on hardware: @@ -380,15 +380,15 @@ To organize pulses into sequences, Qibolab provides the :class:`qibolab.pulses.P channel="channel", qubit=0, ) - sequence.add(pulse1) - sequence.add(pulse2) - sequence.add(pulse3) - sequence.add(pulse4) + sequence.append(pulse1) + sequence.append(pulse2) + sequence.append(pulse3) + sequence.append(pulse4) print(f"Total duration: {sequence.duration}") sequence_ch1 = sequence.get_channel_pulses("channel1") # Selecting pulses on channel 1 - print(f"We have {sequence_ch1.count} pulses on channel 1.") + print(f"We have {len(sequence_ch1)} pulses on channel 1.") .. testoutput:: python :hide: @@ -416,8 +416,8 @@ Typical experiments may include both pre-defined pulses and new ones: from qibolab.pulses import Rectangular sequence = PulseSequence() - sequence.add(platform.create_RX_pulse(0)) - sequence.add( + sequence.append(platform.create_RX_pulse(0)) + sequence.append( DrivePulse( start=0, duration=10, @@ -428,7 +428,7 @@ Typical experiments may include both pre-defined pulses and new ones: channel="0", ) ) - sequence.add(platform.create_MZ_pulse(0, start=0)) + sequence.append(platform.create_MZ_pulse(0, start=0)) results = platform.execute_pulse_sequence(sequence, options=options) @@ -500,9 +500,15 @@ A tipical resonator spectroscopy experiment could be defined with: from qibolab.sweeper import Parameter, Sweeper, SweeperType sequence = PulseSequence() - sequence.add(platform.create_MZ_pulse(0, start=0)) # readout pulse for qubit 0 at 4 GHz - sequence.add(platform.create_MZ_pulse(1, start=0)) # readout pulse for qubit 1 at 5 GHz - sequence.add(platform.create_MZ_pulse(2, start=0)) # readout pulse for qubit 2 at 6 GHz + sequence.append( + platform.create_MZ_pulse(0, start=0) + ) # readout pulse for qubit 0 at 4 GHz + sequence.append( + platform.create_MZ_pulse(1, start=0) + ) # readout pulse for qubit 1 at 5 GHz + sequence.append( + platform.create_MZ_pulse(2, start=0) + ) # readout pulse for qubit 2 at 6 GHz sweeper = Sweeper( parameter=Parameter.frequency, @@ -537,8 +543,8 @@ For example: sequence = PulseSequence() - sequence.add(platform.create_RX_pulse(0)) - sequence.add(platform.create_MZ_pulse(0, start=sequence[0].finish)) + sequence.append(platform.create_RX_pulse(0)) + sequence.append(platform.create_MZ_pulse(0, start=sequence[0].finish)) sweeper_freq = Sweeper( parameter=Parameter.frequency, @@ -635,8 +641,8 @@ Let's now delve into a typical use case for result objects within the qibolab fr measurement_pulse = platform.create_qubit_readout_pulse(0, start=0) sequence = PulseSequence() - sequence.add(drive_pulse_1) - sequence.add(measurement_pulse) + sequence.append(drive_pulse_1) + sequence.append(measurement_pulse) options = ExecutionParameters( nshots=1000, diff --git a/doc/source/tutorials/calibration.rst b/doc/source/tutorials/calibration.rst index 2da46cd398..2065970743 100644 --- a/doc/source/tutorials/calibration.rst +++ b/doc/source/tutorials/calibration.rst @@ -44,7 +44,7 @@ around the pre-defined frequency. # create pulse sequence and add pulse sequence = PulseSequence() readout_pulse = platform.create_MZ_pulse(qubit=0, start=0) - sequence.add(readout_pulse) + sequence.append(readout_pulse) # allocate frequency sweeper sweeper = Sweeper( @@ -127,8 +127,8 @@ complex pulse sequence. Therefore with start with that: drive_pulse.duration = 2000 drive_pulse.amplitude = 0.01 readout_pulse = platform.create_MZ_pulse(qubit=0, start=drive_pulse.finish) - sequence.add(drive_pulse) - sequence.add(readout_pulse) + sequence.append(drive_pulse) + sequence.append(readout_pulse) # allocate frequency sweeper sweeper = Sweeper( @@ -220,13 +220,13 @@ and its impact on qubit states in the IQ plane. one_sequence = PulseSequence() drive_pulse = platform.create_RX_pulse(qubit=0, start=0) readout_pulse1 = platform.create_MZ_pulse(qubit=0, start=drive_pulse.finish) - one_sequence.add(drive_pulse) - one_sequence.add(readout_pulse1) + one_sequence.append(drive_pulse) + one_sequence.append(readout_pulse1) # create pulse sequence 2 and add pulses zero_sequence = PulseSequence() readout_pulse2 = platform.create_MZ_pulse(qubit=0, start=0) - zero_sequence.add(readout_pulse2) + zero_sequence.append(readout_pulse2) options = ExecutionParameters( nshots=1000, From d69a273eb71e9057a8c2ad1ebb7ef9f2ef736d0f Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 16 Jan 2024 15:56:24 +0100 Subject: [PATCH 0014/1006] Fix compiler tests related to sequences --- tests/test_compilers_default.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_compilers_default.py b/tests/test_compilers_default.py index eaa550b98c..2e856f6e67 100644 --- a/tests/test_compilers_default.py +++ b/tests/test_compilers_default.py @@ -191,7 +191,7 @@ def test_cnot_to_sequence(): sequence = compile_circuit(circuit, platform) test_sequence, virtual_z_phases = platform.create_CNOT_pulse_sequence((2, 3)) assert len(sequence) == len(test_sequence) - assert sequence.pulses[0] == test_sequence.pulses[0] + assert sequence[0] == test_sequence[0] def test_add_measurement_to_sequence(platform): From ac8477e378225d491b0d5e67bbc9bfc9358e05df Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 12 Jan 2024 16:25:00 +0100 Subject: [PATCH 0015/1006] Drop pulse.serial --- examples/pulses_tutorial.ipynb | 4 ++-- src/qibolab/backends.py | 6 ++---- src/qibolab/instruments/dummy.py | 4 ++-- .../instruments/qblox/cluster_qrm_rf.py | 12 ++++++------ src/qibolab/instruments/qblox/controller.py | 18 +++++++++--------- src/qibolab/instruments/qm/sequence.py | 2 +- src/qibolab/instruments/qm/sweepers.py | 12 ++++++------ src/qibolab/instruments/rfsoc/convert.py | 2 +- src/qibolab/instruments/rfsoc/driver.py | 6 +++--- src/qibolab/platform/platform.py | 4 ++-- src/qibolab/pulses.py | 8 +------- tests/test_dummy.py | 12 ++++++------ tests/test_instruments_zhinst.py | 2 -- tests/test_platform.py | 2 +- tests/test_pulses.py | 4 ++-- 15 files changed, 44 insertions(+), 54 deletions(-) diff --git a/examples/pulses_tutorial.ipynb b/examples/pulses_tutorial.ipynb index 6076a71668..33c9fa88bd 100644 --- a/examples/pulses_tutorial.ipynb +++ b/examples/pulses_tutorial.ipynb @@ -1129,7 +1129,7 @@ "outputs": [], "source": [ "for pulse in ps1.pulses:\n", - " print(pulse.serial)" + " print(pulse.id)" ] }, { @@ -1139,7 +1139,7 @@ "outputs": [], "source": [ "for pulse in ps2.pulses:\n", - " print(pulse.serial)" + " print(pulse.id)" ] }, { diff --git a/src/qibolab/backends.py b/src/qibolab/backends.py index 7df62649fe..fc288fb6a9 100644 --- a/src/qibolab/backends.py +++ b/src/qibolab/backends.py @@ -69,7 +69,7 @@ def assign_measurements(self, measurement_map, readout): containing the readout measurement shots. This is created in ``execute_circuit``. """ for gate, sequence in measurement_map.items(): - _samples = (readout[pulse.serial].samples for pulse in sequence) + _samples = (readout[pulse.id].samples for pulse in sequence) samples = list(filter(lambda x: x is not None, _samples)) gate.result.backend = self gate.result.register_samples(np.array(samples).T) @@ -161,9 +161,7 @@ def execute_circuits(self, circuits, initial_states=None, nshots=1000): MeasurementOutcomes(circuit.measurements, self, nshots=nshots) ) for gate, sequence in measurement_map.items(): - samples = [ - readout[pulse.serial].popleft().samples for pulse in sequence - ] + samples = [readout[pulse.id].popleft().samples for pulse in sequence] gate.result.backend = self gate.result.register_samples(np.array(samples).T) return results diff --git a/src/qibolab/instruments/dummy.py b/src/qibolab/instruments/dummy.py index ed78c2b761..bdbdda8e5c 100644 --- a/src/qibolab/instruments/dummy.py +++ b/src/qibolab/instruments/dummy.py @@ -129,7 +129,7 @@ def play( for ro_pulse in sequence.ro_pulses: values = np.squeeze(self.get_values(options, ro_pulse, shape)) - results[ro_pulse.qubit] = results[ro_pulse.serial] = options.results_type( + results[ro_pulse.qubit] = results[ro_pulse.id] = options.results_type( values ) @@ -154,7 +154,7 @@ def sweep( for ro_pulse in sequence.ro_pulses: values = self.get_values(options, ro_pulse, shape) - results[ro_pulse.qubit] = results[ro_pulse.serial] = options.results_type( + results[ro_pulse.qubit] = results[ro_pulse.id] = options.results_type( values ) diff --git a/src/qibolab/instruments/qblox/cluster_qrm_rf.py b/src/qibolab/instruments/qblox/cluster_qrm_rf.py index 91c2ce1793..63322f5d2a 100644 --- a/src/qibolab/instruments/qblox/cluster_qrm_rf.py +++ b/src/qibolab/instruments/qblox/cluster_qrm_rf.py @@ -616,7 +616,7 @@ def process_pulse_sequence( # Acquisitions pulse = None for acquisition_index, pulse in enumerate(sequencer.pulses.ro_pulses): - sequencer.acquisitions[pulse.serial] = { + sequencer.acquisitions[pulse.id] = { "num_bins": num_bins, "index": acquisition_index, } @@ -993,9 +993,9 @@ def acquire(self): if len(sequencer.pulses.ro_pulses) == 1: pulse = sequencer.pulses.ro_pulses[0] frequency = self.get_if(pulse) - acquisitions[pulse.qubit] = acquisitions[pulse.serial] = ( - AveragedAcquisition(scope, duration, frequency) - ) + acquisitions[pulse.qubit] = acquisitions[ + pulse.id + ] = AveragedAcquisition(scope, duration, frequency) else: raise RuntimeError( "Software Demodulation only supports one acquisition per channel. " @@ -1004,8 +1004,8 @@ def acquire(self): else: # Hardware Demodulation results = self.device.get_acquisitions(sequencer.number) for pulse in sequencer.pulses.ro_pulses: - bins = results[pulse.serial]["acquisition"]["bins"] - acquisitions[pulse.qubit] = acquisitions[pulse.serial] = ( + bins = results[pulse.id]["acquisition"]["bins"] + acquisitions[pulse.qubit] = acquisitions[pulse.id] = ( DemodulatedAcquisition(scope, bins, duration) ) diff --git a/src/qibolab/instruments/qblox/controller.py b/src/qibolab/instruments/qblox/controller.py index f125677583..80acc322a7 100644 --- a/src/qibolab/instruments/qblox/controller.py +++ b/src/qibolab/instruments/qblox/controller.py @@ -205,17 +205,17 @@ def _execute_pulse_sequence( shots_shape = (nshots,) + shape for ro_pulse in sequence.ro_pulses: if options.acquisition_type is AcquisitionType.DISCRIMINATION: - _res = acquisition_results[ro_pulse.serial].classified + _res = acquisition_results[ro_pulse.id].classified _res = np.reshape(_res, shots_shape) if options.averaging_mode is not AveragingMode.SINGLESHOT: _res = np.mean(_res, axis=0) elif options.acquisition_type is AcquisitionType.RAW: - i_raw = acquisition_results[ro_pulse.serial].raw_i - q_raw = acquisition_results[ro_pulse.serial].raw_q + i_raw = acquisition_results[ro_pulse.id].raw_i + q_raw = acquisition_results[ro_pulse.id].raw_q _res = i_raw + 1j * q_raw elif options.acquisition_type is AcquisitionType.INTEGRATION: - ires = acquisition_results[ro_pulse.serial].shots_i - qres = acquisition_results[ro_pulse.serial].shots_q + ires = acquisition_results[ro_pulse.id].shots_i + qres = acquisition_results[ro_pulse.id].shots_q _res = ires + 1j * qres if options.averaging_mode is AveragingMode.SINGLESHOT: _res = np.reshape(_res, shots_shape) @@ -223,7 +223,7 @@ def _execute_pulse_sequence( _res = np.reshape(_res, shape) acquisition = options.results_type(np.squeeze(_res)) - data[ro_pulse.serial] = data[ro_pulse.qubit] = acquisition + data[ro_pulse.id] = data[ro_pulse.qubit] = acquisition return data @@ -285,7 +285,7 @@ def sweep( # create a map between the pulse id, which never changes, and the original serial for pulse in sequence_copy.ro_pulses: - map_id_serial[pulse.id] = pulse.serial + map_id_serial[pulse.id] = pulse.id id_results[pulse.id] = None id_results[pulse.qubit] = None @@ -397,9 +397,9 @@ def _sweep_recursion( ) for pulse in sequence.ro_pulses: if results[pulse.id]: - results[pulse.id] += result[pulse.serial] + results[pulse.id] += result[pulse.id] else: - results[pulse.id] = result[pulse.serial] + results[pulse.id] = result[pulse.id] results[pulse.qubit] = results[pulse.id] else: # rt sweeps diff --git a/src/qibolab/instruments/qm/sequence.py b/src/qibolab/instruments/qm/sequence.py index 0e4fa58afd..fdce211cc8 100644 --- a/src/qibolab/instruments/qm/sequence.py +++ b/src/qibolab/instruments/qm/sequence.py @@ -221,7 +221,7 @@ def _find_previous(self, pulse): def add(self, qmpulse: QMPulse): pulse = qmpulse.pulse - self.pulse_to_qmpulse[pulse.serial] = qmpulse + self.pulse_to_qmpulse[pulse.id] = qmpulse previous = self._find_previous(pulse) if previous is not None: diff --git a/src/qibolab/instruments/qm/sweepers.py b/src/qibolab/instruments/qm/sweepers.py index 3110e1f3d8..1e35e71feb 100644 --- a/src/qibolab/instruments/qm/sweepers.py +++ b/src/qibolab/instruments/qm/sweepers.py @@ -32,7 +32,7 @@ def _update_baked_pulses(sweeper, qmsequence, config): qmpulse = qmsequence.pulse_to_qmpulse[sweeper.pulses[0].serial] is_baked = isinstance(qmpulse, BakedPulse) for pulse in sweeper.pulses: - qmpulse = qmsequence.pulse_to_qmpulse[pulse.serial] + qmpulse = qmsequence.pulse_to_qmpulse[pulse.id] if isinstance(qmpulse, BakedPulse): if not is_baked: raise_error( @@ -96,7 +96,7 @@ def _sweep_frequency(sweepers, qubits, qmsequence, relaxation_time): f = declare(int) with for_(*from_array(f, sweeper.values.astype(int))): for pulse, f0 in zip(sweeper.pulses, freqs0): - qmpulse = qmsequence.pulse_to_qmpulse[pulse.serial] + qmpulse = qmsequence.pulse_to_qmpulse[pulse.id] qua.update_frequency(qmpulse.element, f + f0) _sweep_recursion(sweepers[1:], qubits, qmsequence, relaxation_time) @@ -115,7 +115,7 @@ def _sweep_amplitude(sweepers, qubits, qmsequence, relaxation_time): a = declare(fixed) with for_(*from_array(a, sweeper.values)): for pulse in sweeper.pulses: - qmpulse = qmsequence.pulse_to_qmpulse[pulse.serial] + qmpulse = qmsequence.pulse_to_qmpulse[pulse.id] if isinstance(qmpulse, BakedPulse): qmpulse.amplitude = a else: @@ -129,7 +129,7 @@ def _sweep_relative_phase(sweepers, qubits, qmsequence, relaxation_time): relphase = declare(fixed) with for_(*from_array(relphase, sweeper.values / (2 * np.pi))): for pulse in sweeper.pulses: - qmpulse = qmsequence.pulse_to_qmpulse[pulse.serial] + qmpulse = qmsequence.pulse_to_qmpulse[pulse.id] qmpulse.relative_phase = relphase _sweep_recursion(sweepers[1:], qubits, qmsequence, relaxation_time) @@ -169,7 +169,7 @@ def _sweep_start(sweepers, qubits, qmsequence, relaxation_time): with loop: for pulse in sweeper.pulses: - qmpulse = qmsequence.pulse_to_qmpulse[pulse.serial] + qmpulse = qmsequence.pulse_to_qmpulse[pulse.id] # find all pulses that are connected to ``qmpulse`` and update their starts to_process = {qmpulse} while to_process: @@ -191,7 +191,7 @@ def _sweep_duration(sweepers, qubits, qmsequence, relaxation_time): dur = declare(int) with for_(*from_array(dur, values)): for pulse in sweeper.pulses: - qmpulse = qmsequence.pulse_to_qmpulse[pulse.serial] + qmpulse = qmsequence.pulse_to_qmpulse[pulse.id] qmpulse.swept_duration = dur # find all pulses that are connected to ``qmpulse`` and align them if not isinstance(qmpulse, BakedPulse): diff --git a/src/qibolab/instruments/rfsoc/convert.py b/src/qibolab/instruments/rfsoc/convert.py index 34773489e2..3162f34bbd 100644 --- a/src/qibolab/instruments/rfsoc/convert.py +++ b/src/qibolab/instruments/rfsoc/convert.py @@ -124,7 +124,7 @@ def _( duration=pulse.duration * NS_TO_US, dac=dac, adc=adc, - name=pulse.serial, + name=pulse.id, type=pulse_type, ) return replace_pulse_shape(rfsoc_pulse, pulse.shape, sampling_rate) diff --git a/src/qibolab/instruments/rfsoc/driver.py b/src/qibolab/instruments/rfsoc/driver.py index bb8ae34420..3cad39f7cc 100644 --- a/src/qibolab/instruments/rfsoc/driver.py +++ b/src/qibolab/instruments/rfsoc/driver.py @@ -279,7 +279,7 @@ def play( ) else: result = execution_parameters.results_type(i_pulse + 1j * q_pulse) - results[ro_pulse.qubit] = results[ro_pulse.serial] = result + results[ro_pulse.qubit] = results[ro_pulse.id] = result return results @@ -329,7 +329,7 @@ def play_sequence_in_sweep_recursion( """ res = self.play(qubits, couplers, sequence, execution_parameters) newres = {} - serials = [pulse.serial for pulse in or_sequence.ro_pulses] + serials = [pulse.id for pulse in or_sequence.ro_pulses] for idx, key in enumerate(res): if idx % 2 == 1: newres[serials[idx // 2]] = res[key] @@ -537,7 +537,7 @@ def convert_sweep_results( else: result = execution_parameters.results_type(i_vals + 1j * q_vals) - results[ro_pulse.qubit] = results[ro_pulse.serial] = result + results[ro_pulse.qubit] = results[ro_pulse.id] = result return results def sweep( diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 317bc9793f..ef2e51af34 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -49,7 +49,7 @@ def unroll_sequences( new_pulse.start += start total_sequence.append(new_pulse) if isinstance(pulse, ReadoutPulse): - readout_map[pulse.serial].append(new_pulse.serial) + readout_map[pulse.id].append(new_pulse.id) start = total_sequence.finish + relaxation_time return total_sequence, readout_map @@ -234,7 +234,7 @@ def execute_pulse_sequences( # find readout pulses ro_pulses = { - pulse.serial: pulse.qubit + pulse.id: pulse.qubit for sequence in sequences for pulse in sequence.ro_pulses } diff --git a/src/qibolab/pulses.py b/src/qibolab/pulses.py index 7db74b38a8..b92585eecc 100644 --- a/src/qibolab/pulses.py +++ b/src/qibolab/pulses.py @@ -168,7 +168,7 @@ def modulated_waveforms(self, sampling_rate=SAMPLING_RATE): pulse = self.pulse if abs(pulse._if) * 2 > sampling_rate: log.info( - f"WARNING: The frequency of pulse {pulse.serial} is higher than the nyqusit frequency ({int(sampling_rate // 2)}) for the device sampling rate: {int(sampling_rate)}" + f"WARNING: The frequency of pulse {pulse.id} is higher than the nyqusit frequency ({int(sampling_rate // 2)}) for the device sampling rate: {int(sampling_rate)}" ) num_samples = int(np.rint(pulse.duration * sampling_rate)) time = np.arange(num_samples) / sampling_rate @@ -818,12 +818,6 @@ def phase(self) -> float: """ return self.global_phase + self.relative_phase - @property - def serial(self) -> str: - """Returns a string representation of the pulse.""" - - return f"Pulse({self.start}, {self.duration}, {format(self.amplitude, '.6f').rstrip('0').rstrip('.')}, {format(self.frequency, '_')}, {format(self.relative_phase, '.6f').rstrip('0').rstrip('.')}, {self.shape}, {self.channel}, {self.type}, {self.qubit})" - @property def id(self) -> int: return id(self) diff --git a/tests/test_dummy.py b/tests/test_dummy.py index 8900c2fefe..f0abb0559f 100644 --- a/tests/test_dummy.py +++ b/tests/test_dummy.py @@ -65,7 +65,7 @@ def test_dummy_execute_coupler_pulse(): "CouplerFluxPulse(0, 30, 0.05, GaussianSquare(5, 0.75), flux_coupler-0, 0)" ) - assert test_pulse == pulse.serial + assert test_pulse == pulse.id def test_dummy_execute_pulse_sequence_couplers(): @@ -141,7 +141,7 @@ def test_dummy_single_sweep_raw(name): acquisition_type=AcquisitionType.RAW, ) results = platform.sweep(sequence, options, sweeper) - assert pulse.serial and pulse.qubit in results + assert pulse.id and pulse.qubit in results shape = results[pulse.qubit].magnitude.shape assert shape == (pulse.duration * SWEPT_POINTS,) @@ -187,7 +187,7 @@ def test_dummy_single_sweep_coupler( average = not options.averaging_mode is AveragingMode.SINGLESHOT results = platform.sweep(sequence, options, sweeper) - assert ro_pulse.serial and ro_pulse.qubit in results + assert ro_pulse.id and ro_pulse.qubit in results if average: results_shape = ( results[ro_pulse.qubit].magnitude.shape @@ -233,7 +233,7 @@ def test_dummy_single_sweep(name, fast_reset, parameter, average, acquisition, n average = not options.averaging_mode is AveragingMode.SINGLESHOT results = platform.sweep(sequence, options, sweeper) - assert pulse.serial and pulse.qubit in results + assert pulse.id and pulse.qubit in results if average: results_shape = ( results[pulse.qubit].magnitude.shape @@ -292,7 +292,7 @@ def test_dummy_double_sweep(name, parameter1, parameter2, average, acquisition, average = not options.averaging_mode is AveragingMode.SINGLESHOT results = platform.sweep(sequence, options, sweeper1, sweeper2) - assert ro_pulse.serial and ro_pulse.qubit in results + assert ro_pulse.id and ro_pulse.qubit in results if average: results_shape = ( @@ -356,7 +356,7 @@ def test_dummy_single_sweep_multiplex(name, parameter, average, acquisition, nsh results = platform.sweep(sequence, options, sweeper1) for ro_pulse in ro_pulses.values(): - assert ro_pulse.serial and ro_pulse.qubit in results + assert ro_pulse.id and ro_pulse.qubit in results if average: results_shape = ( results[ro_pulse.qubit].magnitude.shape diff --git a/tests/test_instruments_zhinst.py b/tests/test_instruments_zhinst.py index 36d740d38c..41da1a18e4 100644 --- a/tests/test_instruments_zhinst.py +++ b/tests/test_instruments_zhinst.py @@ -18,9 +18,7 @@ from qibolab.pulses import ( IIR, SNZ, - CouplerFluxPulse, Drag, - FluxPulse, Gaussian, Pulse, PulseSequence, diff --git a/tests/test_platform.py b/tests/test_platform.py index 0f575693d7..f0f69753aa 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -50,7 +50,7 @@ def test_unroll_sequences(platform): assert len(total_sequence.ro_pulses) == 10 assert total_sequence.finish == 10 * sequence.finish + 90000 assert len(readouts) == 1 - assert len(readouts[ro_pulse.serial]) == 10 + assert len(readouts[ro_pulse.id]) == 10 def test_create_platform(platform): diff --git a/tests/test_pulses.py b/tests/test_pulses.py index 2a33b1f4e4..e7dc8419b7 100644 --- a/tests/test_pulses.py +++ b/tests/test_pulses.py @@ -883,7 +883,7 @@ def test_pulse(): ) target = f"Pulse({pulse.start}, {pulse.duration}, {format(pulse.amplitude, '.6f').rstrip('0').rstrip('.')}, {format(pulse.frequency, '_')}, {format(pulse.relative_phase, '.6f').rstrip('0').rstrip('.')}, {pulse.shape}, {pulse.channel}, {pulse.type}, {pulse.qubit})" - assert pulse.serial == target + assert pulse.id == target assert repr(pulse) == target @@ -900,7 +900,7 @@ def test_readout_pulse(): ) target = f"ReadoutPulse({pulse.start}, {pulse.duration}, {format(pulse.amplitude, '.6f').rstrip('0').rstrip('.')}, {format(pulse.frequency, '_')}, {format(pulse.relative_phase, '.6f').rstrip('0').rstrip('.')}, {pulse.shape}, {pulse.channel}, {pulse.qubit})" - assert pulse.serial == target + assert pulse.id == target assert repr(pulse) == target From fc53b099da8162641087d2eb3d57167eda9219ea Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 12 Jan 2024 17:36:41 +0100 Subject: [PATCH 0016/1006] Replace even more instances of direct serial access --- doc/source/getting-started/experiment.rst | 2 +- doc/source/tutorials/calibration.rst | 12 ++-- examples/pulses_tutorial.ipynb | 4 +- tests/test_instruments_rfsoc.py | 84 +++++++++-------------- tests/test_instruments_zhinst.py | 4 +- tests/test_pulses.py | 9 --- 6 files changed, 43 insertions(+), 72 deletions(-) diff --git a/doc/source/getting-started/experiment.rst b/doc/source/getting-started/experiment.rst index af50ab09a9..283315ba35 100644 --- a/doc/source/getting-started/experiment.rst +++ b/doc/source/getting-started/experiment.rst @@ -215,7 +215,7 @@ We leave to the dedicated tutorial a full explanation of the experiment, but her results = platform.sweep(sequence, options, sweeper) # plot the results - amplitudes = results[ro_pulse.serial].magnitude + amplitudes = results[ro_pulse.id].magnitude frequencies = np.arange(-2e8, +2e8, 1e6) + ro_pulse.frequency plt.title("Resonator Spectroscopy") diff --git a/doc/source/tutorials/calibration.rst b/doc/source/tutorials/calibration.rst index 2065970743..6f492bbc61 100644 --- a/doc/source/tutorials/calibration.rst +++ b/doc/source/tutorials/calibration.rst @@ -73,7 +73,7 @@ In few seconds, the experiment will be finished and we can proceed to plot it. import matplotlib.pyplot as plt - amplitudes = results[readout_pulse.serial].magnitude + amplitudes = results[readout_pulse.id].magnitude frequencies = np.arange(-2e8, +2e8, 1e6) + readout_pulse.frequency plt.title("Resonator Spectroscopy") @@ -154,7 +154,7 @@ We can now proceed to launch on hardware: results = platform.sweep(sequence, options, sweeper) - amplitudes = results[readout_pulse.serial].magnitude + amplitudes = results[readout_pulse.id].magnitude frequencies = np.arange(-2e8, +2e8, 1e6) + drive_pulse.frequency plt.title("Resonator Spectroscopy") @@ -242,13 +242,13 @@ and its impact on qubit states in the IQ plane. plt.xlabel("I [a.u.]") plt.ylabel("Q [a.u.]") plt.scatter( - results_one[readout_pulse1.serial].voltage_i, - results_one[readout_pulse1.serial].voltage_q, + results_one[readout_pulse1.id].voltage_i, + results_one[readout_pulse1.id].voltage_q, label="One state", ) plt.scatter( - results_zero[readout_pulse2.serial].voltage_i, - results_zero[readout_pulse2.serial].voltage_q, + results_zero[readout_pulse2.id].voltage_i, + results_zero[readout_pulse2.id].voltage_q, label="Zero state", ) plt.show() diff --git a/examples/pulses_tutorial.ipynb b/examples/pulses_tutorial.ipynb index 33c9fa88bd..6076a71668 100644 --- a/examples/pulses_tutorial.ipynb +++ b/examples/pulses_tutorial.ipynb @@ -1129,7 +1129,7 @@ "outputs": [], "source": [ "for pulse in ps1.pulses:\n", - " print(pulse.id)" + " print(pulse.serial)" ] }, { @@ -1139,7 +1139,7 @@ "outputs": [], "source": [ "for pulse in ps2.pulses:\n", - " print(pulse.id)" + " print(pulse.serial)" ] }, { diff --git a/tests/test_instruments_rfsoc.py b/tests/test_instruments_rfsoc.py index f26921fb0d..c4f6b92efe 100644 --- a/tests/test_instruments_rfsoc.py +++ b/tests/test_instruments_rfsoc.py @@ -389,7 +389,7 @@ def test_play(mocker, dummy_qrc): averaging_mode=AveragingMode.SINGLESHOT, ) results = instrument.play(platform.qubits, platform.couplers, seq, parameters) - assert pulse1.serial in results.keys() + assert pulse.id in results.keys() parameters = ExecutionParameters( nshots=nshots, @@ -397,7 +397,7 @@ def test_play(mocker, dummy_qrc): averaging_mode=AveragingMode.SINGLESHOT, ) results = instrument.play(platform.qubits, platform.couplers, seq, parameters) - assert pulse1.serial in results.keys() + assert pulse.id in results.keys() parameters = ExecutionParameters( nshots=nshots, @@ -405,7 +405,7 @@ def test_play(mocker, dummy_qrc): averaging_mode=AveragingMode.CYCLIC, ) results = instrument.play(platform.qubits, platform.couplers, seq, parameters) - assert pulse1.serial in results.keys() + assert pulse.id in results.keys() def test_sweep(mocker, dummy_qrc): @@ -441,7 +441,7 @@ def test_sweep(mocker, dummy_qrc): results = instrument.sweep( platform.qubits, platform.couplers, seq, parameters, sweeper0, sweeper1 ) - assert pulse1.serial in results.keys() + assert pulse.id in results.keys() parameters = ExecutionParameters( nshots=nshots, @@ -451,7 +451,7 @@ def test_sweep(mocker, dummy_qrc): results = instrument.sweep( platform.qubits, platform.couplers, seq, parameters, sweeper0, sweeper1 ) - assert pulse1.serial in results.keys() + assert pulse.id in results.keys() parameters = ExecutionParameters( nshots=nshots, @@ -461,7 +461,7 @@ def test_sweep(mocker, dummy_qrc): results = instrument.sweep( platform.qubits, platform.couplers, seq, parameters, sweeper0, sweeper1 ) - assert pulse1.serial in results.keys() + assert pulse.id in results.keys() def test_validate_input_command(dummy_qrc): @@ -551,22 +551,18 @@ def test_merge_sweep_results(dummy_qrc): assert targ_dict.keys() == out_dict1.keys() assert ( - out_dict1["serial1"].serialize["MSR[V]"] - == targ_dict["serial1"].serialize["MSR[V]"] + out_dict1["serial1"].idize["MSR[V]"] == targ_dict["serial1"].idize["MSR[V]"] ).all() assert ( - out_dict1["serial1"].serialize["MSR[V]"] - == targ_dict["serial1"].serialize["MSR[V]"] + out_dict1["serial1"].idize["MSR[V]"] == targ_dict["serial1"].idize["MSR[V]"] ).all() assert dict_a.keys() == out_dict2.keys() assert ( - out_dict2["serial1"].serialize["MSR[V]"] - == dict_a["serial1"].serialize["MSR[V]"] + out_dict2["serial1"].idize["MSR[V]"] == dict_a["serial1"].idize["MSR[V]"] ).all() assert ( - out_dict2["serial1"].serialize["MSR[V]"] - == dict_a["serial1"].serialize["MSR[V]"] + out_dict2["serial1"].idize["MSR[V]"] == dict_a["serial1"].idize["MSR[V]"] ).all() @@ -677,8 +673,8 @@ def test_convert_av_sweep_results(dummy_qrc): pulses=[sequence[0]], ) sweep1 = convert(sweep1, sequence, platform.qubits) - serial1 = sequence[1].serial - serial2 = sequence[2].serial + serial1 = sequence[1].id + serial2 = sequence[2].id avgi = [[[1, 2, 3], [4, 1, 2]]] avgq = [[[7, 8, 9], [-1, -2, -3]]] @@ -699,18 +695,10 @@ def test_convert_av_sweep_results(dummy_qrc): ), } - assert ( - out_dict[serial1].serialize["i[V]"] == targ_dict[serial1].serialize["i[V]"] - ).all() - assert ( - out_dict[serial1].serialize["q[V]"] == targ_dict[serial1].serialize["q[V]"] - ).all() - assert ( - out_dict[serial2].serialize["i[V]"] == targ_dict[serial2].serialize["i[V]"] - ).all() - assert ( - out_dict[serial2].serialize["q[V]"] == targ_dict[serial2].serialize["q[V]"] - ).all() + assert (out_dict[serial1].idize["i[V]"] == targ_dict[serial1].idize["i[V]"]).all() + assert (out_dict[serial1].idize["q[V]"] == targ_dict[serial1].idize["q[V]"]).all() + assert (out_dict[serial2].idize["i[V]"] == targ_dict[serial2].idize["i[V]"]).all() + assert (out_dict[serial2].idize["q[V]"] == targ_dict[serial2].idize["q[V]"]).all() def test_convert_nav_sweep_results(dummy_qrc): @@ -730,8 +718,8 @@ def test_convert_nav_sweep_results(dummy_qrc): pulses=[sequence[0]], ) sweep1 = convert(sweep1, sequence, platform.qubits) - serial1 = sequence[1].serial - serial2 = sequence[2].serial + serial1 = sequence[1].id + serial2 = sequence[2].id avgi = [[[[1, 1], [2, 2], [3, 3]], [[4, 4], [1, 1], [2, 2]]]] avgq = [[[[7, 7], [8, 8], [9, 9]], [[-1, -1], [-2, -2], [-3, -3]]]] @@ -752,18 +740,10 @@ def test_convert_nav_sweep_results(dummy_qrc): ), } - assert ( - out_dict[serial1].serialize["i[V]"] == targ_dict[serial1].serialize["i[V]"] - ).all() - assert ( - out_dict[serial1].serialize["q[V]"] == targ_dict[serial1].serialize["q[V]"] - ).all() - assert ( - out_dict[serial2].serialize["i[V]"] == targ_dict[serial2].serialize["i[V]"] - ).all() - assert ( - out_dict[serial2].serialize["q[V]"] == targ_dict[serial2].serialize["q[V]"] - ).all() + assert (out_dict[serial1].idize["i[V]"] == targ_dict[serial1].idize["i[V]"]).all() + assert (out_dict[serial1].idize["q[V]"] == targ_dict[serial1].idize["q[V]"]).all() + assert (out_dict[serial2].idize["i[V]"] == targ_dict[serial2].idize["i[V]"]).all() + assert (out_dict[serial2].idize["q[V]"] == targ_dict[serial2].idize["q[V]"]).all() @pytest.fixture(scope="module") @@ -849,9 +829,9 @@ def test_play_qpu(connected_platform, instrument): ExecutionParameters(acquisition_type=AcquisitionType.INTEGRATION), ) - assert sequence[1].serial in out_dict - assert isinstance(out_dict[sequence[1].serial], IntegratedResults) - assert np.shape(out_dict[sequence[1].serial].voltage_i) == (1000,) + assert sequence[1].id in out_dict + assert isinstance(out_dict[sequence[1].id], IntegratedResults) + assert np.shape(out_dict[sequence[1].id].voltage_i) == (1000,) @pytest.mark.qpu @@ -891,15 +871,15 @@ def test_sweep_qpu(connected_platform, instrument): sweep, ) - assert sequence[1].serial in out_dict1 - assert sequence[1].serial in out_dict2 - assert isinstance(out_dict1[sequence[1].serial], AveragedSampleResults) - assert isinstance(out_dict2[sequence[1].serial], IntegratedResults) - assert np.shape(out_dict2[sequence[1].serial].voltage_i) == ( + assert sequence[1].id in out_dict1 + assert sequence[1].id in out_dict2 + assert isinstance(out_dict1[sequence[1].id], AveragedSampleResults) + assert isinstance(out_dict2[sequence[1].id], IntegratedResults) + assert np.shape(out_dict2[sequence[1].id].voltage_i) == ( 1000, len(sweep.values), ) - assert np.shape(out_dict1[sequence[1].serial].statistical_frequency) == ( + assert np.shape(out_dict1[sequence[1].id].statistical_frequency) == ( len(sweep.values), ) @@ -936,4 +916,4 @@ def test_python_reqursive_sweep(connected_platform, instrument): sweep2, ) - assert sequence[1].serial in out_dict + assert sequence[1].id in out_dict diff --git a/tests/test_instruments_zhinst.py b/tests/test_instruments_zhinst.py index 41da1a18e4..cabd82a1df 100644 --- a/tests/test_instruments_zhinst.py +++ b/tests/test_instruments_zhinst.py @@ -851,7 +851,7 @@ def test_experiment_execute_pulse_sequence_qpu(connected_platform, instrument): options, ) - assert len(results[ro_pulses[q].serial]) > 0 + assert len(results[ro_pulses[q].id]) > 0 @pytest.mark.qpu @@ -903,7 +903,7 @@ def test_experiment_sweep_2d_specific_qpu(connected_platform, instrument): sweepers[1], ) - assert len(results[ro_pulses[qubit].serial]) > 0 + assert len(results[ro_pulses[qubit].id]) > 0 def get_previous_subsequence_finish(instrument, name): diff --git a/tests/test_pulses.py b/tests/test_pulses.py index e7dc8419b7..62238e74e7 100644 --- a/tests/test_pulses.py +++ b/tests/test_pulses.py @@ -254,15 +254,6 @@ def test_is_equal_ignoring_start(): assert not p1.is_equal_ignoring_start(p4) -def test_pulse_serial(): - p11 = Pulse(0, 40, 0.9, 50_000_000, 0, Gaussian(5), 0, PulseType.DRIVE) - assert ( - p11.serial - == "Pulse(0, 40, 0.9, 50_000_000, 0, Gaussian(5), 0, PulseType.DRIVE, 0)" - ) - assert repr(p11) == p11.serial - - @pytest.mark.parametrize( "shape", [Rectangular(), Gaussian(5), GaussianSquare(5, 0.9), Drag(5, 1)] ) From 561c3d55cdc5d1e9b464450f70d0ddc28860443f Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 12 Jan 2024 17:37:17 +0100 Subject: [PATCH 0017/1006] Fix some Pulse special methods --- src/qibolab/pulses.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/qibolab/pulses.py b/src/qibolab/pulses.py index b92585eecc..401ababb82 100644 --- a/src/qibolab/pulses.py +++ b/src/qibolab/pulses.py @@ -3,7 +3,7 @@ import copy import re from abc import ABC, abstractmethod -from dataclasses import dataclass +from dataclasses import dataclass, fields from enum import Enum from typing import Optional @@ -860,16 +860,15 @@ def modulated_waveforms(self, sampling_rate): # -> tuple[Waveform, Waveform]: return self.shape.modulated_waveforms(sampling_rate) - def __repr__(self): - return self.serial - def __hash__(self): - return hash(self.serial) + return hash( + tuple(getattr(self, f.name) for f in fields(self) if f.name != "type") + ) def __eq__(self, other): if isinstance(other, Pulse): - return self.serial == other.serial - return False + return hash(self) == hash(other) + return NotImplemented def __add__(self, other): if isinstance(other, Pulse): From 705b4103bbd5c40d0847312f3ea9f9fa2da1d969 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 12 Jan 2024 18:10:33 +0100 Subject: [PATCH 0018/1006] Fix hash and part of notebook --- examples/pulses_tutorial.ipynb | 268 +++++++++++++++++++-------------- src/qibolab/pulses.py | 26 +++- 2 files changed, 171 insertions(+), 123 deletions(-) diff --git a/examples/pulses_tutorial.ipynb b/examples/pulses_tutorial.ipynb index 6076a71668..696c86b20c 100644 --- a/examples/pulses_tutorial.ipynb +++ b/examples/pulses_tutorial.ipynb @@ -146,7 +146,7 @@ "source": [ "from qibolab.pulses import Pulse, ReadoutPulse, DrivePulse, FluxPulse\n", "from qibolab.pulses import PulseShape, Rectangular, Gaussian, Drag\n", - "from qibolab.pulses import PulseType, PulseSequence\n", + "from qibolab.pulses import PulseType, PulseSequence, SplitPulse\n", "import numpy as np" ] }, @@ -165,8 +165,7 @@ " shape = Rectangular(), \n", " channel = 0, \n", " type = PulseType.READOUT, \n", - " qubit = 0)\n", - "assert repr(p0) == 'Pulse(0, 50, 0.9, 20_000_000, 0, Rectangular(), 0, PulseType.READOUT, 0)'" + " qubit = 0)" ] }, { @@ -175,7 +174,6 @@ "metadata": {}, "outputs": [], "source": [ - "\n", "# initialisation with str shape\n", "p4 = Pulse(start = 0, \n", " duration = 50, \n", @@ -185,8 +183,7 @@ " shape = 'Rectangular()', \n", " channel = 0, \n", " type = PulseType.READOUT, \n", - " qubit = 0)\n", - "assert repr(p4) == 'Pulse(0, 50, 0.9, 20_000_000, 0, Rectangular(), 0, PulseType.READOUT, 0)'" + " qubit = 0)" ] }, { @@ -195,7 +192,6 @@ "metadata": {}, "outputs": [], "source": [ - "\n", "# initialisation with str channel and str qubit\n", "p5 = Pulse(start = 0, \n", " duration = 50, \n", @@ -205,9 +201,8 @@ " shape = 'Rectangular()', \n", " channel = 'channel0', \n", " type = PulseType.READOUT, \n", - " qubit = 'qubit0')\n", - "assert repr(p5) == 'Pulse(0, 50, 0.9, 20_000_000, 0, Rectangular(), channel0, PulseType.READOUT, qubit0)'\n", - "assert p5.qubit == 'qubit0'" + " qubit = 0)\n", + "assert p5.qubit == 0" ] }, { @@ -216,7 +211,6 @@ "metadata": {}, "outputs": [], "source": [ - "\n", "# examples of initialisation with different frequencies, shapes and types\n", "p6 = Pulse(0, 40, 0.9, -50e6, 0, Rectangular(), 0, PulseType.READOUT)\n", "p7 = Pulse(0, 40, 0.9, 0, 0, Rectangular(), 0, PulseType.FLUX, 0)\n", @@ -231,7 +225,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAACTEAAAPkCAYAAAB7yuiYAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAB7CAAAewgFu0HU+AAEAAElEQVR4nOzdd3wU1f7/8fem9wRCSwi9NwEpIqh0RFAUBCtNEfu1fLEXxIJey9WLXvXakGL3XlEUK4qoCAJKkyJdSigJkEp6zu+P/DJ3N9lNdpPdbCKv5+Oxj8zunDlzdnLmzOzMZ86xGWOMAAAAAAAAAAAAAAAAAMBPAvxdAAAAAAAAAAAAAAAAAACnNoKYAAAAAAAAAAAAAAAAAPgVQUwAAAAAAAAAAAAAAAAA/IogJgAAAAAAAAAAAAAAAAB+RRATAAAAAAAAAAAAAAAAAL8iiAkAAAAAAAAAAAAAAACAXxHEBAAAAAAAAAAAAAAAAMCvCGICAAAAAAAAAAAAAAAA4FcEMQEAAAAAAAAAAAAAAADwK4KYAAAAAAAAAAAAAAAAAPgVQUwAAAAAAAAAAAAAAAAA/IogJgAAAAAAAAAAAAAAAAB+RRATAAAAAAAAAAAAAAAAAL8iiAkAAAAAAAAAAAAAAACAXxHEBAAAAAAAAAAAAAAAAMCvCGICAAAAAAAAAAAAAAAA4FcEMQEAAAAAAAAAAAAAAADwK4KYAAAAAAAAAAAAAAAAAPgVQUwAAAAAAAAAAAAAAAAA/IogJgAAgFrq+++/l81mk81m06BBg/xdnGopLi5Wr169ZLPZ1KNHDxUXF/u7SAAAAKgj5s2bZ50XT5061d/F8dhFF10km82mhIQEZWdnl5u/efNmBQYGymazafbs2X4oIXxh6tSpVr2dN2+ev4sDAHXamWeeKZvNps6dO6ugoMDfxQEAAD5EEBMAADhlDRo0yLqo7OwVHR2tli1b6sILL9QLL7yg9PR0fxe5znr11Vf122+/SZKefPJJBQRUfhqampqqZ555Rv3791dCQoLCwsLUokULjRo1SgsXLqzVF60WL15crj7t3bvXozy2bt2qO++8U6eddprq16+vyMhItW/fXlOmTNG3337rm4JXQX5+vhYuXKhRo0apRYsWCgsLU0JCgvr3769nnnlGqampPl3/8uXLNX36dHXs2FGxsbEKDw9X69atddFFF+ndd99VYWGhT9fvbS1btqywXXL2OnDggNv519b9KisrSy+//LIGDx6spKQkhYaGKikpSUOGDNG///1vZWVleZynMUaLFi3S+PHj1aZNG4WHh6thw4bq3bu3Hn74Ye3bt69KZV2zZo1uvPFGde7cWTExMYqJiVHnzp114403as2aNVXK0xt80Wb4or74u83w9/o9UZuPA+6cQzVv3lwjR47U448/roMHD/q1vIA/ffnll/rkk08kSbNmzVJkZGS5NF26dNHkyZMlSY8//rj2799fo2V0xVfHUm/Yu3dvhe1QUFCQ4uPjddppp+maa67RV199JWOM38pbF1TWtnv6atmypb+/Uq1V0XYLDAxUXFyc2rVrpwkTJuj111/36Fy4Ov9HT4NEH3jgAYflb7jhBg+3RMXlDQsLU+PGjdWuXTudddZZ+tvf/qZ58+Z5re1Zu3atHnroIZ111llq2bKlIiIiFBsbq3bt2mnkyJGaM2eOR7/jy7ZLnl4DsN8Ws2bNcvp5Xdw3vXX+/fe//11SyTnyCy+84MsiAwAAfzMAAACnqIEDBxpJbr9iYmLM/Pnza6x8y5Yts9Y9cODAGluvt2VmZpqGDRsaSaZfv35uLfPpp59ay7h6nX766eaPP/7wcek9l56ebpo2bVquvHv27HE7j8cee8wEBwdX+P0vv/xyk5GR4bsv4oatW7eaHj16VFjORo0amSVLlnh93ampqea8886rdL/t1auX2bp1q9fX7ystWrTwqF2SZPbv3+9W3rV1v/r5559Nq1atKixX69atzapVq9zO8+DBg2bIkCEV5hkVFWXefPNNt/PMy8szt9xyi7HZbC7ztNls5rbbbjP5+flV2BJV54s2wxf1xZ9tRm1Yvydq+3HA03Oo4OBgM2vWLFNcXOyX8lbXX+WcrC578803rf/BlClT/F0ctxUVFZkuXboYSaZZs2YVHh927NhhAgMDjSQzderUGiylc744lnrTnj17PD5n6tOnj9m+fXuNlXHKlCnWuv21nTzhadte2atFixb+/kq1lqfbskGDBuajjz5yK+/q/B89aV+Li4tN8+bNHZavV6+eyc3N9WhbVKW8AQEBZtSoUebLL7/0aF2lNm3aZEaOHOnWuoKCgsyNN95oUlJSKs23bLvkyTWAstvioYcecvp5Xds3vX3+fc455xhJJi4uzpw4ccK3hQcAAH4TJAAAAKhPnz7q27ev9d4Yo7S0NK1Zs0Y7duyQJGVkZGjKlCnKzc3Vtdde66+i1jlz5sxRSkqKJOmee+6pNP3XX3+tsWPHWj3oREREaOjQoWrYsKF27dqlH374QcYY/fbbbxo6dKh++eUXJSYm+vQ7eOKuu+6qVo8TM2fO1KOPPmq9T0hI0Nlnn62wsDD9+uuv2rx5syTp3Xff1bFjx7RkyRIFBdX8af2BAwc0dOhQJScnSyp5mvicc85RmzZtlJKSoqVLlyonJ0dHjx7VRRddpC+//FJDhgzxyrpPnDih/v37a/v27dZnrVu31plnnqmwsDDt2rVLK1asUEFBgX799VcNGjRIq1atqnNPg0+ePFnR0dGVpouKiqo0TW3drzZs2KARI0ZYT5cHBwdryJAhSkpK0v79+/Xdd9+psLBQu3fv1ogRI7RixQp17dq1wjwzMjJ07rnn6vfff7c+69u3r7p06aL09HR99913SktLU1ZWlq666ioFBARYvV9UZPr06VqwYIH1vnXr1urXr58kadWqVdq9e7eMMfrnP/+pjIwMvfHGG1XZJB7zRZvhi/rizzajNqzfE3XlOFCq7DmUJKWnp2vDhg3atGmTJKmgoECzZs1SWlqannvuOX8UE/CLd99919pnZ8yYoeDgYJdp27Ztq4svvlgffPCBFi5cqHvuuUcdOnSoqaI68NWx1JfKnjcVFhbqwIED+vHHH5WRkSGppDfFc845R6tWrVKLFi38VdRaa+zYsRWeZ2VmZjqcC1V2rhofH+/V8v1VXXTRRWratKn1vri4WKmpqVq5cqXV42pqaqrGjx+v//znPxo7dqzbeTs7Rlek9NzWHcuWLSvXI9KJEye0ePFiTZgwwe187JUtb3FxsdLT05WWlqbNmzfrzz//tD7//PPP9fnnn2vq1Kl6/vnn3frdJEn/+c9/NHHiROXl5VmfRUdHq3///kpMTFR+fr727dunlStXqrCwUIWFhXrppZf06aef6ssvv1Tnzp2r9N2qo67um744/77nnnv0ww8/KC0tTc8884wee+yxmvgqAACgpvk1hAoAAMCPXD3lVtZHH31kYmNjrbShoaFu93xSHX+Fp/5zcnKsnjyaN29uioqKKkyfmppq4uLirO89dOjQck88rl+/3uGJzyFDhvjyK3jkhx9+sHppueKKKzx+CnPp0qUOy9x5550mLy/PIc0777xjwsLCrDQPP/ywj75Nxc4++2yHJznXr1/vMD8lJcUMHTrUSlO/fn2vPSk5duxYK9+wsDCzYMGCcml27txp+vTpY6U7/fTT60QPIPY9MXn65K4rtXW/ys/PN23atLHW2b1793Lfec+ePaZ79+5Wmvbt25uCgoIK8500aZJDvfv2228d5mdlZZkrr7zSShMSEmJ27NhRYZ5vvPGGw5Pfzz33nEN7VlRUZJ577jkTEBBgpauJnvt80Wb4qr74s82oDet3V105Drh7DrVixYpyvTSsWbOm5grqJX+Fc7K6rq72xNStWzcjyURERJj09PRK09vXtWuuuaYGSuicL46l3uZujycZGRnmpptuckg7atSoGiljXeuJqTLV7WUG/2O/HZctW+Y0TVFRkZk7d64JDQ210jZu3NhkZ2dXmLe7x+jqmjx5srWe8PBwa3r06NEe5eNJeQ8dOmSeeuopk5SU5LAN+/TpY06ePFnput566y2H8/UGDRqYuXPnOu096tixY+aBBx5w6BmzXr16ZvPmzS7z91VPTJWprfumL86/i4uLrV584+LiTFZWlg+/AQAA8BeCmAAAwCnLkwtEn332mcNFoXvvvdfn5fsr3DB7/fXXPboId+edd1rp27Rp4/IC7YYNGxwuJn711VdeLrnncnJyTPv27Y0k07ZtW7N161aPLyTaB91cdtllLtO9/PLLVrro6Gi3urb3piVLljjctNq4caPTdFlZWaZ169Ze3W/Wrl3rsF3feecdl2lPnDjhcPP8rbfeqvb6fc0XQUy1db968cUXHW4IHDp0yGm65ORkU69ePSvtK6+84jLPTZs2OdyYcDXERFFRkenfv7+V7vLLL3eZZ25urmnWrJmV9p577nGZ9u6773a4UF82+MTbfNFm+KK++LPNqA3r90RdOQ54cg61bt06h2EYp0+fXjOF9KK/wjlZXVcXg5jsgxI9KXPbtm2NVBKoXdP7tjG+OZb6gqc37cePH++Qftu2bT4vI0FMcMWdIKZSc+bMcUj/9ttvV5i+JoKYMjMzTWRkpLUe+/OSoKAgc/jwYbfzqkp5MzMzzYQJExy2yyWXXFLhMtu2bXMoc7t27czBgwcrXdfy5ctNRESEtVy3bt1MTk6O07QEMf2PL8+/H330USv9v/71L28XHQAA1AIBAgAAQKVGjx6t7t27W++XLl3qx9LUHfbDKV166aUVpi0oKNBrr71mvX/kkUcUERHhNO1pp52mKVOmWO9ffPHFapa0+h555BFreLOXX35ZYWFhHi2/Zs0arVmzRpIUEBCgp556ymXa6667Tu3atZNU0nX8woULq1jqqrHf3lOmTFG3bt2cpouMjNQjjzxivX/llVes4amq6sMPP7SmTzvtNF1++eUu08bFxem+++6z3s+ZM6da666LavN+ZZ//HXfcoSZNmjhNl5CQoBkzZrhVrpdfflnFxcWSpOHDh+vcc891mq7sPvbBBx8oNTXVadrFixdr//79kqTY2Fg9+OCDLtc/c+ZMxcTESJL+/PNPLVmyxGXa6vJFm+Gr+uLPNqM2rN9ddek44IkePXpo0KBB1vsffvjBf4UBapAn58H2Sodhys3N1bvvvuv1clXGF8fS2uD+++93eP/tt9/6qSSAZ6677jqH35a14Tj63//+V9nZ2ZKkVq1a6brrrlOPHj0klQzl+Pbbb/t0/VFRUXr//fc1evRo67MPPvigwm0zffp0q8zR0dH65ptv3Bo++5xzznE4z9q0aZOeeOKJapT+1ODL8+9LLrnEmp47d241SwoAAGojgpgAAADc1L9/f2t69+7dDvOmTp0qm80mm82mefPmVZrXvHnzrPRTp06tdtm2bdumu+66S/369VODBg0UEhKisLAwNWrUSL169dJVV12l+fPn68SJE5XmVVBQoIULF+qSSy5R69atFR0drcjISLVq1UqXX365Fi1aJGNMpfns3r1bK1eulCS1b99enTp1qjD9999/r7S0NEklFxUvvvjiCtPbb7evv/7auiDpDxs2bNDTTz8tSZo4caKGDRvmcR4ff/yxNT1s2DA1a9bMZVqbzeYQPLBo0SKP11dVWVlZDjd9rrrqqgrTX3zxxYqKipIkHT9+vNoX3X/55RdretSoUZWmt7+wvWbNGu3bt69a669raut+tXPnTm3ZssXpeisr18aNG8u1wZJkjNHixYut95XVzQEDBqht27aSpKKiIodl7dnvm5deeqnLoB5JioiIcLio7st90xdthi/qi7/bDH+v3xN15ThQFaU3NiUpOTnZrWW2bt2q++67T3379lXjxo0VEhKihg0b6owzztDMmTPdzqdUUVGRPvjgA02ePFkdOnRQvXr1FBwcrPj4eJ1xxhm69dZb9e233zqc48yaNUs2m02DBw+2Plu+fLl1Dmf/atmyZbl1FhcX68cff9TMmTM1YsQINW/eXBEREQoNDVVCQoKGDBmi2bNnux34Yb++Un/88Yduu+02derUSVFRUYqJiVH37t117733ehxQ8uGHH+qCCy5Q06ZNFRoaqqSkJA0fPlzz58+3bii6c847aNAgK833339f6XpLt7PNZtOsWbM8KrMzv/76q5544gmdf/75at26taKiohQSEqLGjRurf//+uv/++90+H2jZsqVVtr1790qSdu3apfvvv189e/ZUw4YNFRAQ4FDHJSk7O9vap6OjozV06FC3yz927Fhr+q233nJ7OW/w1bG0NujevbsiIyOt92XPJZztXxXxtJ5XxBijjz/+WFdccYU6dOigmJgYBQYGKjIyUi1bttSQIUN09913a9myZVaAWUX279+vRx99VGeffbYSExMVGhqq+vXrq2fPnrrjjjusBy+8bdGiRdY26dixo9vL7d69WwEBAbLZbAoNDS3Xdjnb1vv379cDDzyg7t27q379+oqMjFTHjh11++23a+fOnR6X/dtvv9X111+vLl26qH79+goNDVViYqLOPfdc/etf/1JOTo7HeXpLaGiow29pT49/vjB//nxreuLEibLZbJo0aZLT+b5is9m0YMECRUdHW5/Nnj3badpffvlFP/74o/X+0UcfVYsWLdxe17hx4zRmzBjr/YsvvujXOlHb+fr8u3379urcubMk6bffftPWrVurWWIAAFDbEMQEAADgpnr16lnTGRkZfiyJo1mzZqlr1656+umn9csvv+jYsWMqKChQXl6eUlJS9Ntvv2nevHmaOnWq/va3v1WY1/fff69OnTpp8uTJ+vDDD7Vnzx5lZWXp5MmT2rt3r9577z2NGzdO/fv318GDByvM67PPPrOmhwwZUun3WLZsmTV95plnKjQ0tML0ffv2tYIJcnNzrYCpmlZUVKRrrrlGhYWFql+/vp599tkq5WP//e17rHDF/obqzz//rLy8vCqt11P264qMjFSfPn0qTB8WFqYzzzzTev/dd99Va/1Hjhyxpt258Ny0aVMFBgZ6bf11TW3dr+z/D+3bt6/0KeimTZtavc6UXb7Ujh07dODAAeu9p/uRq7pRnX3Tl/XNF22GL+qLv9sMf6/fE3XlOFAV4eHh1nRubm6FafPy8nT99derW7dueuKJJ7RmzRodPXpUBQUFSk1N1erVq/Xoo4+qbdu2+te//uXW+n/88Ud17txZl156qRYuXKjt27crLS1NhYWFOn78uFavXq3nn39ew4YN07333lut71qqoKBAzZs31znnnKNHH31U33zzjfbv36+cnBzl5+fr8OHDWrZsmR544AG1bNmySsEq//73v9W9e3fNmTNH27ZtU3Z2tjIzM7Vx40b9/e9/V8eOHbV27dpK80lPT9eIESN0ySWX6LPPPlNycrLy8/N18OBBLV26VFOnTtWgQYN0+PDhqmyKGtW3b1/17t1b9913n5YsWaI9e/YoOztbBQUFOnr0qFauXKnHH39cbdu2rbC3M1deffVVde3aVY8//rjWr1+v1NRUp8H93377rXWDe8CAAQoJCXF7Hb169VJsbKwkWfW/pvjqWFob2Gw2a7tKtef33JEjRzRgwACNHTtW7777rrZv367MzEwVFxfr5MmT+vPPP7Vs2TI99dRTGjJkSIXbuLi4WDNnzlT79u01c+ZM/fTTTzp06JDy8/N14sQJrV+/Xv/4xz/UpUsX3X///W49mOKJCy64wOpZ848//tCKFSvcWm7u3LlWWS688EI1aNCgwvSLFy9Wt27dNHv2bG3cuFEnTpzQyZMn9ccff+if//ynTjvtNL366qturXv//v0aPHiwhg0bpldeeUVbtmzRiRMnlJ+fr0OHDunrr7/W3/72N7Vt29YhCKameXIc9bU///zTIXBv4sSJkqQrrrjC+t21ceNGrV+/3udlqV+/vkNQ/TfffKPjx4+XS/fvf//bmo6OjtY111zj8br+7//+z5o+duyYPvjgA4/zOFXUxPm3/TUm+2tPAADgryHI3wUAAACoK+x7MbK/AO5Pc+bM0cMPP2y9b9Cggfr166eEhATZbDYdP35c27Zt09atW1VUVFRhXh9++KGuvPJKFRQUSCq5UNqvXz+1bNlSAQEB2r59u1auXKnCwkKtWrVKZ555ptasWaPGjRs7ze+bb76xps8+++xKv4v903Onn356pemDg4PVrVs3q2eerVu3VqkHpOp67rnnrBuETz/9tBo2bFilfDz9/j179rSmi4qKtH37dpddtHuTfTm7deumoKDKf1KcfvrpVn2o7lOSnt5sKftE/ebNm6u1/pr066+/6pNPPrECBuPj49W5c2edddZZDkGVFamt+5Wn5SpNt2PHjnLLO8uzSZMmSkhIcCtPZ8uXSk9P16FDhzwqq32agwcPKiMjwxpizpt80Wb4or74u83w9/o9UVeOA1Vh32uEq/MGqaT3mnPPPdfhxnebNm3Uq1cv1atXT8ePH9eKFSuUnJysnJwc/e1vf1NGRobD0KFlvffee5o8ebJ1fiOVBE/27NlTsbGxysjI0ObNm7V582YVFxc73Bzu27evbrrpJh08eNDqVScxMdGhp5xS8fHxDu+Lioqs9jsqKkpdunRR69atFRMTo4KCAh04cECrVq1SRkaGsrOzNWnSJAUHB7s97Ni8efN0ww03SJI6dOig3r17Kzw8XNu2bdOKFStkjNGxY8c0ZswYbd261eW5a15enkaOHKlVq1ZZnyUmJurss89WVFSUdu3apZ9++kkrVqzQuHHj1Lp1a7fK5y+lPSyFhoaqS5cuatu2rWJjY2WM0aFDh/TLL78oNTVVBQUFuvvuuyVJd911l1t5f/jhh1baxMREDRgwQLGxsUpOTi5309zT82B7AQEB6t+/v7744gsZY7R06VJdccUVHuVRVb44ltYWxhirt0GpdvyeKyoq0ujRo/Xrr79an3Xt2lVdu3ZVXFyccnNzdfjwYW3YsMHhfMRVXpdeeqn++9//Wp81bdpUffv2VcOGDZWVlaVffvlFu3btUmFhoR5//HGlpKS4HezjjqCgIF111VXWUFtvvPGGBgwYUGm57Xt1qyy4ZO3atbr//vuVn5+v+Ph4DRo0SPXq1dPevXu1fPlyFRQUKCcnR9ddd50CAwM1bdo0l3lt3bpVQ4cOtbatzWbT6aefrs6dOys8PFwHDx7UDz/8oMzMTCUnJ2v48OH64osvHAL3aoq7x9GasHDhQus32RlnnKH27dtLKmkzhg8fri+//FJSSW9MZXup84UJEybohRdekFSyn//0008OvSZJjoHiF154oUOvbO4aOHCgkpKSrEDP77//3qFXTPxPTZx/n3322VYw+zfffKM777yziqUFAAC1EUFMAAAAbrK/odaqVSs/lqREYWGhHnvsMev9E088oRkzZig4OLhc2uPHj+uTTz5RSkqK07w2b96sKVOmqKCgQDabTTNmzND999+vuLg4h3S7d+/WlClT9NNPP2n//v266qqr9PnnnzvNc/Xq1db0aaedVun3+eOPP6xpd7t2b968uXXzfNu2bW4t4027d+/WQw89JEk655xzKu0m3ZWjR4863FRx5/uHh4erYcOG1v9027ZtNXLzuqr/p1LV/T81bNjQysOdoWAOHjxoDYEj1e6ba2WNHz/e6efBwcG67LLLNGvWrEpvJtfW/coX9cjXeZZN706epXlU9vSxp3zVZviivvi7zfD3+t1Vl44DniosLHQYUqRfv34u0954443W+Vb79u31yiuvlOsJpqioSK+++qpuv/125eXlaebMmRo8eLDDE/yl1q1bp6uuusoKYOrZs6defvllnXHGGeXSHj58WG+99ZbDUE2jRo3SqFGj9P3331tBTO3atXOrB6iAgABdddVVmjx5sgYMGOD0/CwvL0/PP/+87rvvPhUWFur666/X6NGjrSFVKnL99derYcOGWrBggUaOHOkw74cfftAFF1ygjIwMHTp0SHPmzNHMmTOd5vPYY49ZAUwBAQF66qmndPvttysg4H+dt+/evVuXX365Vq5cqd9++63SsvnTuHHjdP7552vw4MEOPZeUKioq0sKFC3XzzTcrOztbDzzwgCZMmODWuf19992nkJAQ/etf/9I111zjECRdtic0++Fv3TkPLqtHjx764osvJJWcU9dUEFNdaTOrYv369Tp58qT1vjb8nvvss8+sAKaEhAQtWrTIafsklfxeW7hwocvA6IcfftgKYGrSpIlefPFFjR07ttzweB9++KGmT5+u9PR0vfbaaxo2bJjDULjVNX36dP3973+XMUYffPCB5syZ4zDcV1lfffWVFfDZokWLSoPnSwOY7rjjDj322GMOvUYeOHBAV1xxhdVj0i233KJBgwapTZs25fLJzs7WxRdfbAUwnXfeeXrhhRfKpc3IyNA999yjl19+WXl5ebryyisrDAz1he3bt1vDWUoVH0drwoIFC6xp+yHkSt+XBjG98847evrpp90KYKmOXr16KTAw0Hpoa9WqVQ5BTAcOHNCff/5pva/O9uvbt68VxPTTTz9VOZ+/upo4ltgHyK1Zs0bGGLeHAwUAALUfw8kBAAC4YcmSJdq4caP1fujQoX4sTYlt27YpNTVVUskwFffcc4/TG2RSSTfrV111lcsnzW+55RZryIt//OMfevrpp8sFMElS69at9eWXX6pz586SpC+++MLhJk2pw4cPW0Nf2Gw26+nMihw7dsyadvfp0tLhCiQ57Tbe16699lqdPHlSISEheuWVV6p80cz+u0u1+/v7+//Uq1cva7r0AnlFygbZ+aOeeFtBQYEWLlyonj176tNPP60wrb//X674olzVzfPkyZPlbkLb5xkTE+P0hnhZERERDjfrfLENfdVm1Mb/S3W3n7/X7666dBzw1N///nft37/fen/ttdc6Tffjjz9aN0bbtGmjFStWOB3KKjAwUDfccIM1NExRUZEeeeQRp3n+7W9/s3pW6t27t3744QeXAQJNmjTRHXfc4XavPJUJCQnR3LlzNWjQIJfnZ6GhobrzzjutoPS0tDQtXLjQ7XUsXbq0XACTVBJY/fjjj1vv3333XafLnzhxQs8884z1fvbs2ZoxY4ZDAJNUcv731VdfqUWLFrV62EJJeumllzRq1CiX7XVgYKCmTp2qN954Q1LJMdV+mKGKFBYWau7cuZo+fXq5cz77QApjjDZt2mS979ixo6dfQ506dbKmN2zY4PHyVeWLY2ltYb9PSLXj95z98GSPPPKIy/ZJkrp06aK///3v6tu3b7l5e/futb5f/fr19dNPP2ncuHFOf5tMmDBBixYtst7PmjXLq8PKtWrVygpEys7O1vvvv19h+tJ9UZKuvvrqcu1PWfn5+br++uv19NNPlxv2NikpSZ9//rm1z508edKh12J7zz77rPVww9ixY/XZZ585DXaKiYnRSy+9ZPW4c+jQIbfbDG8oLCzUrbfe6lCeyy67zO3lP//8c918881uvyo7l/j555+tnlGd9R540UUXWYG4R48etYIxfSkiIkLNmjWz3tsPPy7JIQBMKuntrKrsl7UPjIKjmjj/btu2rRUgl5aW5tYDTgAAoO4giAkAAKASH3/8sSZOnGi9Dw0N1Y033ujHEpXIyMiwpqs6hJlUcmPku+++k1TSQ8Ftt91WYfrIyEg9+OCD1vu33367XJo9e/ZY040aNVJISEil5cjKyrKm3QkUKJvOfvmaMHfuXKtniXvuuadKN6hKlS17bf7+/v4/XXjhhdb0unXr9J///Mdl2szMTP39738v91ltFhQUpNGjR+vf//63fvvtN6WlpamgoECpqan65ptvNG3aNOtmeEZGhiZMmODQS1xZ/v5/ueKLclU3T2f5ViXPsml9sQ191WbUxv9Ldbefv9fvrrp0HHBHRkaGfvzxR11xxRUO5wy33367hg8f7nSZZ5991pr+xz/+oQYNGlS4jqlTp1rH3q+++qpcINgvv/xitY82m03z5893q4cjf7DvyXHp0qVuLXPttddW2MPP5MmTrZt7f/zxh8N5Y6l33nnHCvJq0aKF7rjjDpf5xcXFuQwWq4vGjx9v1Qd3t3nfvn115ZVXVpru8OHDDsMSJiUleVy+pk2bWtNlb8D7ki+Opf6WlZWlm2++2eGc8bzzzlOHDh38WKoS3vo9N2fOHKsXmpkzZzoNxrE3ePBgnXvuuZJKeildt25dldftzPTp061p+yClslJSUqyA/ICAAF199dWV5h0dHV3u/N5eVFSUnnrqKev9hx9+qPT0dIc0BQUFVo96oaGh+ve//11p8NTjjz9uBYU5+/3rTcXFxTp69KgWLVqkAQMGWA9uBAUFae7cueWGL63ImjVr9OKLL7r9cnassDd//nxr+rzzzit3rI6IiNDFF1/sNL0v2feMdeLECYd5ZQNi3B2W2xn7ZQsKCmr9b0t/qYnz74CAAIchT2vyWAkAAHyP4eQAAABU8oRiaa9GpdLS0rR69WrrScNSzz77rMOTfv5iX4Zly5Zp+/btbvV4VJZ9TzWXX365W70JDRkyxJp21o26/dOP7l5ktb/Z407Qk+T41HtpT1I14ciRI9aNvvbt2+u+++6rVn72312q3d/f3/+nQYMGacCAAdaN6alTp6qwsLDcE8l79+7VlVdeqd27dzt8XpP1pCp++eUXp/tMfHy8hg0bpmHDhmn69OkaPXq0jh07pry8PE2bNk2bN29WYGBgueX8/f9yxRflqm6ezvKtSp5l8/XFNvRVm1Eb/y/V3X7+Xr+76tJxoKyHH37YZU8XpeLj43XnnXfq7rvvdjq/sLBQ33zzjaSSXibOP/98t9Y9ePBgbdu2TcYYrVixwmH4GPve+oYOHWr1IukPxcXF+vXXX7V+/XodOHBAGRkZ1hB3Za1fv96tPCdMmFDh/OjoaLVp00Z//PGHjDH6888/yw03+P3331vTl156aaVD/owfP17XXXddufpaW23cuFHr1q3T3r17lZGRUa6HoNJz3k2bNqm4uLjSIAZ3ez+xPw+OiIhQWFiYhyWXQ2DA4cOHPV6+qnxxLK0pDz30kENPiIWFhUpOTtYPP/zgEMTSqFEjvfjii/4oYjn2v+dee+01nX/++U7P5ypj/3vO3aEHhwwZoq+++kpSye+5008/3eP1unLRRRepUaNGOnr0qFatWqUtW7Y4bYMXLFhgtYXnnnuuWwF/Y8aMqXQot1GjRlnDrebm5mrlypUOvdatXbvW6jV46NChatSoUaXrTUxMVMeOHbV161b9/vvvSk9P99qQcoMHD640TYcOHfSPf/xDo0eP9so6qyI3N1cffPCB9b7sUHKlJk+ebAUvffrppzp+/Ljq16/v07LZBymXDSwq+z4yMtIr65FKAhErGi7xVFVT598NGjSwevusyWMlAADwPYKYAAAAVPKE4po1aypMEx0drTlz5jg8Le9PzZo1U79+/bRq1Sqlp6erV69emjRpksaOHasBAwYoIiLCrXxWrlxpTS9btsytbtHthxywHyKmVHZ2tjXtbjnCwsJ08uRJSSXDBLjD/maUJ72kVNfNN99sPeH5yiuvlLt546myN7fy8/PduuHlj+9vXy5//Z/eeust9enTR6mpqcrOztbll1+uBx98UP369VNYWJh27dqln376SQUFBYqIiNDZZ59t3aSp7ReZ3Qn6O+OMM/Tuu+9qxIgRkkp62Pj4448dnnouVVv3K1/Uo+rm6SzfquRZNl9fbENftRm+qC/+bjP8vX531aXjgKcCAwP15JNPatq0aS7TbNy40Tp3CA4Odhg6pyL2525lz0dWrVplTbtzg9gXCgsL9fzzz+u5557TgQMH3FqmbFC9K2UDkpyxP6Y4613DPmCqomGsSkVERKhr165au3atW2X0l/nz5+vxxx/X9u3b3UpfUFCg9PT0SnvnsB/StiJVOQ8uy3653Nxct4KsvMEXx9KaUjocZUV69eqlt99+W61ataqBElVu/PjxmjVrloqLi7VkyRJ17dpVV199tc477zx16dLFrYdLjh07ZtX1kJCQSoNKS23ZssWadvZ7rjqCg4M1depUq0ekN954Q//4xz/KpbPvpemaa65xK+8zzzyz0jSBgYHq06ePFdy1bt06hyAm+9+/Bw4c0M033+zWutPS0iSV/BY+cOCA14KYKtO4cWMtWLDA6VCClXnooYc0a9Ysr5Tjk08+sbZBXFycLrjgAqfpBg0apKSkJB04cED5+fl67733fN6TtX2gUkxMjMO8sr//7NtoT5XtIajsulCips6/7Y+V1fm/AgCA2ocgJgAAABeioqIUHx+v0047TcOGDdPkyZMVFxfn72I5eOONNzRkyBAdOXJEWVlZevnll/Xyyy8rKChI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cePGmWuvvdaMGTPGuimcmJhoZs+eXemNGHeCmOzX17x5c3P++eebq6++2lx99dVm1KhRpn79+g5prrzySpfl//TTTx1u0Ekybdq0MRMmTDDXXXedmTJlijnvvPMcbspJchnEZIzjzSR3Lyx9+eWXJigoyFouIiLCjBkzxkybNs0MGjTI4aJj06ZNy90ULKsuBTEZY8wDDzzgsFxiYqK59NJLzZQpU0zXrl0d5g0fPrzSgA5fXZDcv3+/SUhIcLg4O2jQIDNt2jQzZswYh7oUFBRkli5dWmF+nvyf3n33XYcbORdffLG59tprzeWXX25OP/10h3zCwsLM119/7dZ38ncQk/36GzRoYIYNG2YmTZpkrrvuOnP55Zc7XKgtfY0ZM8YUFhZWmre39ytvWb9+vUNQQ3BwsBk5cqSZNm2aOffcc01wcLA1LyYmxmzatKnSPNPT0x1uSkklgZlXXXWVufjii029evUc5s2bN8+tstrfrC1tH6+88kpz5ZVXOgRjSTJXXXVVdTeN27zdZhjjm/rizzbDF+s3xndtRl04DlT1HOruu++2louKijLHjh1zmJ+bm2tGjBjhUN6IiAgzePBgM2XKFHPttdeaSy65xPTq1cshgKBXr14u1/nWW2851GdJpkOHDuayyy4z1113nbnsssvMaaedZgUh3nrrrU7zueKKKxzKNG7cOHPbbbeZGTNmmBkzZpjZs2c7pJ87d67DOiMjI83w4cPNNddcY8aOHevQFr399tsOaV1xJ409d4KYcnNzTd++fR3ybtq0qbnsssvMNddcY4YMGWJtvzPPPNNceeWVVrqKgjWfeuophzwbNWpkLr30UjN9+nQzcuRIa5/r2rWrmTFjRqX1yZ0gpqVLlzoEkwYHB5tBgwaZq6++2lxyySUObcDs2bPdClCqahCTMcZcfvnl1rKff/6528vde++91nJz5sypMK2vgph8cSyt7UFMxhiHIHhJpmPHjmbq1KnmqquuMv3797fq19SpU93avyoLYiobnNOzZ09z6aWXWue1AwYMcKjTgYGBLgNXiouLHdZXmmf//v0dzifPPPNMh8DJ+Ph4t7dPVbd5bm5uud+lPXr0cHu99tvpqaeess4PGzRoYMaPH2+mT59uRowY4RBsIsm88sorFea7a9cu06pVK4dlGjRoYM4//3xzzTXXmGnTppmxY8eaDh06OPwf/BXEZIwxZ5xxhrVc//79naax3159+vQxN910k9uvO++80yGvsWPHVnu/nTx5spXHOeec41F5b7jhBnPllVea0aNHl/tflb6mT59usrKy3C7Pe++9V66uxMTEmJEjR5qrr77aTJo0yZxzzjkOv0MkmaSkJLcCmIwxJi8vzwwePNhh+fDwcIfzmXHjxpW7thIXF2fWrFnj9ncpVVuDmHxx/m2MMdu3b7eW69mzp1fKCgAAaheCmAAAwCnL20FMxhjz8MMPO72wVvrq0KGD+f333926EVNZENOHH37ocCO5oldAQIC58cYby/XmUNb69eutp4vdebVs2dKsW7fOZX6vv/56lbbx4sWLTYMGDSpct7Mn7J3ZvXu3w3ILFixwuxzVUdULicXFxebRRx8td9G07Ouyyy4z6enpleZX9iaqp0/PVmTr1q2mR48eFZazYcOG5rPPPqs0r6oGMVX06t27t/n111/d/j7Nmze3lr366qvdXs5b7G+UVvaKiIgws2fPdvm0uDPe3K+86eeff3Z5U6L01bp1a7Ny5Uq38zx48KAZMmRIhXlGRUWZuXPnup1nXl6eufnmmytsd202m7nlllsqbWu9ydttRilf1Bd/tRm+WL8xvmsz6sJxoKrnUEePHnW4ef7AAw+US1NYWGgefPDBcoHVrl7BwcHmpptuqnC93377baXtTOnr/vvvd5rH3r17TZMmTVwu16JFi3LL2Pdy5OwVFhZm/v3vfxtj3AtQcieNPXeCLIwx5sSJE5W2mf379zeHDh1yCOZatGiRyzyLiorMNddcU2Ge/fr1MwcOHHDoQaY6QUzGGPPyyy+XC1qzfwUEBJiZM2ea4uJinwcx2fes5kmgY7t27az64aonnVLfffedw/f74YcfPCpjRbx9LD3nnHOs5YYMGVLt8vkiiOnYsWOmd+/eFX7nadOmmdzcXK8EMZ1//vlutUtSSSDgxx9/XOl3eP7558sFmbl62Ww2M2bMGLe3T3W2+W233eaw7L/+9S+3ly27rT/++GMTExNTYdv60ksvuZX3sWPHzIQJE9z+XR0XF+cyaK8mgpiWLFnisKyzoA/77eXpKzY21sonNTXVIdjntddec7uc9r7++muHOrd79+5qlzcwMNCcf/75bge9lLVhwwaHHoAqegUFBZnrr7/eHD161KN15Ofnm//7v/8rFzDl6tWvXz+zffv2Kn2f6raHdeWaQanHHnvMWtZZr3kAAKDuI4gJAACcsnwRxGRMyQ35yy+/3CQlJZmQkBDToEED069fP/PPf/7TGhLFG0FMxhhz+PBhs2DBAnPdddeZfv36mUaNGpmQkBATEhJiGjZsaAYMGGDuvvtut58YLPXVV1+ZG264wZx22mmmQYMGJigoyERGRpqWLVuac88918ycOdOsWLHCFBcXV5hPTk6OadiwoZFkmjVr5lHAxdGjR82TTz7p8L2aNWtmRo4caebPn+92kIB9F/ixsbHlhvnzlepeSNyyZYv5v//7P9O1a1cTGxtrIiIiTJs2bczEiRPNN99843Y+9jcMnD35Wl15eXlm/vz5ZuTIkaZZs2YmJCTENGrUyPTr18889dRTld58K+VJQEJmZqZZtGiRufnmm02fPn1MUlKSCQ0NNXFxcaZTp05mypQp5rPPPvOovh0/ftzhCevvvvvO7WW9Zd++fea9994zt956qzn77LNN+/btTXx8vAkKCjIxMTGmdevWZty4ceb55593u5v9sry1X3lbZmamefHFF83AgQNNQkKCCQkJMQkJCWbgwIHmxRdfdDmcVEWKi4vNf//7XzNu3DjTsmVLExoaauLj403Pnj3NzJkzzZ9//lmlsv7yyy/muuuuMx06dDBRUVEmKirKdOjQwVx33XVuDVvoK95qM+z5or74o83wxfpros2ozceB6pxDlQ6tW3pcdtWeHT161DzzzDNm5MiRpnnz5iYiIsIEBweb+Ph4c/rpp5spU6aYefPmuX1TMT8/3yxYsMBccsklpnXr1iYqKsoEBwdb52m33357pQEgR44cMQ8++KA544wzTL169RyCZZwFMRlTMkTVpZdeapo2bWpCQkJMfHy86d69u7n77rsdblba12dX3Eljz90gplLvv/++GT16tGnSpIkJCQkxiYmJZujQoWbevHnW/j5y5EiP8lyyZIm58MILTZMmTUxwcLBp0qSJGTx4sHnjjTesPL0ZxGRMydCrV111lWnZsqUJCQkxsbGxpnPnzubmm282v/32m5XO10FMxhjTrVs3I5UEH7szPND3339vrW/atGmVpv/nP/9ppW/Tpo1bve15wlvH0uLiYoeeeDwJInbFF0FMxpS0FS+99JI5++yzTf369U1ISIhp0aKFGT9+vEPvnt4IYiouLja//vqreeqp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UA0fPlxPP/20HA5HjePfeecdxcXFyWaz6csvv2ww45133inDMOTv76+cnJwWex5NceLECf3mN79RcnKyIiIiFBAQoF69eunWW2/Vt99+W++xvXr1kmEYmjZtmiRpw4YNuummmxQfH6+AgADFx8dr+vTp2rlzZ6Oy7NmzR7NmzdKgQYMUHh6uwMBAnXPOOZo2bZpSUlLO9qkCHVZ7fQ/llSKmpnrooYc0adIkvfXWW1q2bJnZcQAAAAAAAAAAANAKmIkJQGOUlJTopptu0qWXXqpXX31V+/btU3FxsfLz85WWlqYnnnhCffv21fLly+sdJysrSyNHjtScOXOUmpqqgoICFRQUaMOGDbr//vs1adIkOZ1Oj2N+8pOfKCAgQJL05ptv1jt+eXm53n33XUnS+PHjFRkZ2SrPoz5ffPGFEhIS9Mc//lGbNm1Sbm6uSktLdeDAAb3++uu6+OKLdd9999V4nrV5+eWX9aMf/UjLli3T4cOHVVpaqsOHD2vp0qUaPHiw3nnnnXqPf+KJJ9S/f3899dRTSktLU15enkpKSrRv3z698sorGj58uB599NFmP1egI2MmJi+bMmWKXC6XFi9ebHYUAAAAAAAAAAAAtIL2OosAgJbjcrl03XXXuSe/uPLKK/Xaa69p7dq1WrdunRYtWqQePXqosLBQ1113Xb2z+0yaNEnbt2/XAw88oC+//FIbN27Um2++qX79+kmSli9frhdeeMHjmJCQEI0bN06S9N5776mkpKTO8T/99FNlZ2dLkm6++eZWex512bRpk6688krl5eXJbrdr1qxZWrlypdavX69//OMf6t27tyTpmWee0cMPP9zgWHfddZdiY2P197//Xf/5z3+0evVq/fKXv5S/v79KS0t1880315lz/vz5euihh1ReXq7zzjtPzz33nL766iulpKTojTfe0MiRI+VyufT73/9ef/vb35r8XIGOrr2+h2qzpVg9evSQJG3dutXkJAAAAAAAAAAAAGgNzMSE9sjpcup06WmzY3hVhH+ELEbrzJ/x4osvasWKFbLb7froo4/04x//2GP/hRdeqFtvvVUXX3yxtm3bppkzZ9a5ZNqGDRv0xRdfaMyYMe62Cy64QFdccYX69++vrKwsPfvss7rzzjs9jps0aZI++ugj5eXl6eOPP9Z1111X6/iVMzWFhYVp4sSJrfY86nLHHXeorKxMVqtVH3/8sbv4SpKGDRumyZMn66KLLtL27dv1xBNPaMqUKRowYECtY23evFk9e/bU999/ry5durjbL7nkEl1xxRUaN26cysvLdc8992j9+vUex27fvl2//vWvJUm//e1v9dvf/ta9nJ8kDRkyRDfeeKOmTp2q119/Xb/+9a9166231pi5CkDdqr9nslgsslja7DxGjdZmi5iysrIkSYWFhSYnAQAAAAAAAAAAQEurrWCJIia0B6dLT2v026PNjuFVq29YraiAqBYf1+Vy6S9/+Ysk6YEHHqhR+FMpMjJS8+fP1/jx47V27Vrt3r1biYmJNfrdf//9HgVMlaKiojR9+nT9+c9/1tatW5Wbm6vw8HD3/rFjxyo6OlqnTp3SG2+8UWsRU0FBgT766CNJ0v/93/+5l6BrjedRm/Xr12vDhg2SpNtvv92jgKnq+IsXL9ZFF10kp9OpZ599Vs8880ydYy5YsMCjgKnS2LFjdfvtt+u5557Thg0blJKSoqFDh3ocV15erqFDh9YoYKpksVj097//Xe+8844KCgr07rvv6vbbb2/UcwVQ+3um9rCkXJstw6q8WVbOyAQAAAAAAAAAAID2o7YP2trDh28AWs727duVkZEhSXXOflTpkksucW+vW7eu1j7Vl3irasiQIZLOFBzt27fPY5/dbnef/9NPP9Xp06drHP/++++ruLi41vO09POozVdffeXenjFjRp39Ro0a5V4+r+ox1UVGRurqq6+uc//PfvazWs8tnVmWTzpTzFVbAVOliIgIDRo0SFLTnisAyWq11vj6ag/F4G2qiCknJ0dffvmlxo8fr48//liGYWjSpElmxwIAAAAAAAAAAEALq16wZLPZ2sUyKABaTkpKint75MiRMgyjzn8hISHuvseOHat1vKSkpDrPFRX1v5mk8vPza+y/6aabJEmlpaV69913a+yvXEouLi5OY8eObdXnUZu0tDRJkp+fnwYPHlxv3xEjRkiSdu/erbKyslr7JCcn11tYOnjwYPn5+UmStm7d6m4/cOCATpw4IUl6+OGH632uhmG4X5umPFcAkmEYio+PV69evRQfH6/09HSVlJSYHeuseaWc3Wq1Nuu4xMRE/fKXv2zhNAAAAAAAAAAAADBb9dkC2sPsAQBa1vHjx5t1XFFRUa3tQUFBdR5TtYiyoqKixv5Ro0apZ8+eOnDggN544w3ddtttHjkrZyO68cYbaxRktvTzqE12drakM8VYDc1qV7lEnMvlUk5Ojjp37lyjT2xsbL1j2Gw2RUVF6dixY+5zS955rgDO6N27tyQpLy/P4+vQl3mliMnlcjWpv81m0+TJk/Xkk096rDUKAAAAAAAAAACA9qG2mZiA9iDCP0Krb1htdgyvivCPaJVxqxYTLV++XL169WrUcQ0V4DSHYRj66U9/qscff1zffPONMjMz1a1bN0nSP//5TzkcDkm1L1nnzedR3/Jt3hin6nN99NFHNXny5EYdFxwc3KzzAWhfvPJu8Le//W2DfSwWi0JDQ9W7d2/96Ec/UkxMjBeSAQAAAAAAAAAAwAzVi5aYiQnthcWwKCogquGOaFB0dLR7OyIiQgMHDjQxzZkCpccff1xOp1NvvfWWfvGLX0j631JySUlJuuCCC2oc543nUbkc3qlTp+RwOOotDK1cus0wDEVGRtbaJysrq97zORwOj9mfKlV9rna73fT/MwC+pc0UMQEAAAAAAAAAAKDjYDk5AA1JTk52b69du1YXXXSRiWmkAQMG6Pzzz9fmzZv15ptv6he/+IX27dundevWSap9FibJO8+jsliorKxMmzZt0tChQ+vsu379eklSYmKi/Pz8au2zadOmeouhNm/erLKyMo9zS9I555yj8PBw5ebmau3atc16LgA6LkvDXQAAAAAAAAAAAICWlZmZqa1bt6pPnz5KSkpSly5dzI4EoI254IIL1L17d0nS4sWLVVJSYnKi/xUqpaamaseOHe5ZmCTppz/9aa3HeON5XH755e7tl19+uc5+69at0/bt22scU112draWL19e5/6q56g6jtVq1fjx4yVJX3zxhXbs2NFweAD4L68UMf3ud7/T7373O508ebLRx+Tk5LiPAwAAAAAAAAAAQPvicDhUWFiosLAwde7cWREREWZHAtDGWCwWzZ07V5K0d+9eTZkyRaWlpXX2z8vL09NPP92qmW666SYZhiFJeuONN/TWW29JkkaOHKlzzjmn1mO88TyGDx/unn3phRde0Ndff12jT25uru688053prvvvrveMX/+85/Xuqzc6tWrtXjxYknSkCFDNGzYMI/9Dz/8sKxWq5xOp6677jodPny4znNUVFTojTfeqLcPgMaxWHx/HiOvLCc3b948GYah6667Tp06dWrUMdnZ2e7jHn300VZOCAAAAAAAAAAAAABoa+666y59+eWXev/99/XOO+/ohx9+0J133qnhw4crPDxceXl52rlzp1atWqWPPvpIAQEBuu+++1otT/fu3TV69GitWrVKzzzzjE6fPi2p7qXkvPk8XnjhBY0YMUJlZWUaP3687r//fl155ZUKDg5Wamqq/vznP2vv3r2SpF/84hcey8BVd/7552v79u0aMmSIHn74YQ0fPlylpaX65JNP9OSTT7qXmnvmmWdqHDto0CA98cQTmjVrlrZv366BAwfqjjvu0KWXXqrOnTurpKRE+/fv17p16/Tuu+/q6NGj2rp1q3u2KgCNk52drYyMDJWVlWnEiBEqLi42O9JZ80oREwAAAAAAAAAAAAAATWUYht5++209+OCDev7555WRkaE5c+bU2T82NrbVM918881atWqVu4DJZrPp+uuvr/cYbzyPwYMHa/ny5Zo8ebLy8vK0YMECLViwoEa/e++9V48//niDY9133326++67ay2m8vPz0yuvvKIRI0bUevzMmTMVHBysmTNnKjc3V/Pnz9f8+fNr7evn56eAgIBGPEMA1RUVFUk6c4+x2Xy/BKjNziVVXl4uSbLb7SYnAQAAAAAAAAAAAACYxW6369lnn9XmzZt1//33a9CgQQoPD5fValV4eLgGDx6sGTNm6N1339WOHTtaPc91110nf39/9+Nx48YpJiamweO88TzGjRunPXv2aO7cuRo8eLDCwsLk7++vHj166Oabb9aaNWv09NNPN2rZqdtuu01r1qzR9ddfr7i4OPn5+albt26aMmWKUlNTdeONN9Z7/O233669e/fqscce06hRo9SpUyfZbDYFBwerb9+++r//+z89//zzyszMVEJCQrOeL9CRVa+nsdvtcrlcJqVpGW22DGvTpk2S1KibPQAAAAAAAAAAAACgfRs0aJD+9re/NemYefPmad68eQ32GzNmTKM//I+IiFBJSUmTclTVnOchSdOmTdO0adMa7BcTE6M//vGP+uMf/9iMdJ4uvPBCvf32280+vnPnznr00Uf16KOPnnUWAJ6qFzEZhqGKigqT0rSMVilievXVV2tt//DDD5WSklLvsaWlpcrIyNDLL78swzA0bNiw1ogIAAAAAAAAAAAAkzidTgUFBcnhcMjpdJodBwAAwOfUtrIZRUy1mDZtmgzD8GhzuVz6zW9+0+gxXC6XLBaLHnzwwZaOBwAAAAAAAAAAABOVlJTovPPOkyRt3rxZVqtVo0aNqvH5EgAAAGpntVplsVg8CsIdDoeJic5ewwtdNpPL5XL/q62tvn92u12jRo3SRx99pNGjR7dWRK84cOCAZs+eraSkJAUHBysqKkrDhg3T/PnzVVRU1GLn+fTTT3Xttdeqe/fu8vf3V/fu3XXttdfq008/bfQYDodDzz//vC6++GLFxMQoMDBQffr00Z133qlt27a1WFYAAAAAAAAAAHyFL/2e35dU/4DNYrFQwAQAANBE1Wdj8vUiplaZiWnfvn3ubZfLpXPOOUeGYejzzz9XYmJinccZhqGAgABFR0fLarW2RjSvWr58uW655Rbl5eW524qKipSSkqKUlBS9+OKLWrFihRISEpp9DqfTqTvuuEMvvfSSR3tmZqYyMzP1wQcf6LbbbtM//vEPWSx116ydPHlS48eP14YNGzza9+7dq8WLF+uVV17R008/rdtuu63ZWQEAAAAAAAAA8CW+9Ht+X1P9A7balkMBAADedezrr7Vp4UKd2LVL5cXFsgcGKubcczX45z9Xl8suMzseamG321VaWup+TBFTLXr27Flre1xcXJ372pvU1FTdcMMNKi4uVkhIiB5++GGNHTtWxcXFWrZsmV544QWlp6drwoQJSklJUWhoaLPO8+tf/9r9g01ycrLmzJmjPn36KCMjQ3/961+VmpqqF198UTExMfrTn/5U6xgVFRW69tpr3QVMkyZN0u23366oqCj95z//0R/+8AcdP35cd955p7p166af/OQnzXtRAAAAAAAAAADwEb70e35fVFFR4fGYIiYAAMxzeMUKrZw5U1l79tTYl5WRobRPPlGXhASNeeopdZ8wwYSEqAszMTVD1fX3OooHH3xQxcXFstls+uKLLzRy5Ej3vksvvVSJiYmaM2eO0tPTtWDBAs2bN6/J50hPT9cTTzwhSRo6dKi++eYbBQYGSpKGDRumq666SqNHj1ZKSormz5+vn/3sZ7X+Ncgrr7yib7/9VpJ0zz336JlnnnHvGz58uH7yk59oyJAhysvL0wMPPKAdO3bIZvPKpQMAAAAAAAAAgCl86ff8voiZmACgbdq/f7/ZEeBl6YsXa8W996qigeKXY3v26J1rrtGEZ55R3zvu8FI6NKS9FTG1n3lH25D169drzZo1kqQZ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vn3Vr18/7dixQ//85z+1YMECBQUF1Rhn6dKl7u1rr722SVkBAAAAAAAAAPAlvvR7fgAAgLPR9447FNStm1bNnKlje/bU2a9LQoLGPPUUBUxoVS1axLRkyZKWHM5nDR8+XBdffLHWrFmjl156SVOnTtXIkSM9+ixYsEA7duyQJD344IOy2+0e+1etWuX+gWfq1KkeRUSVZs6cqcWLF6uiokL333+/vvnmGwUGBrr3FxcX6/7775ck2Ww2zZw5s9a8v/jFLzRjxgxlZ2drzpw5evrppz32Z2RkuH9YS0hIoIgJAAAAAAAAANCu+drv+QEAAM5G9wkTdMuECTr29dfa9OSTOrFrl8qLimQPClLMuedq8KxZ6nLZZWbHRAfQokVM+J9FixZp1KhRKi4u1rhx4zR37lyNHTtWxcXFWrZsmRYvXizpzExIs2fPbtY5+vbtq4ceekh//vOflZKSolGjRumXv/yl+vTpo4yMDP3lL39RamqqJOmhhx5SYmJireNMnTpVL7/8stauXatnnnlGx44d0+23367IyEitX79ev//975WXlyeLxaK//e1vda79DQAAAAAAAABAe+FLv+cHAABoCV0uu0w/plgJJqIapZUkJyfr7bff1i233KK8vDzNnTu3Rp++fftqxYoVCg0NbfZ5/vjHP+r48eN6+eWXlZqaqhtvvLFGnxkzZugPf/hDnWNYrVZ98MEHGj9+vDZs2KB//etf+te//uXRx9/fX08//bR+8pOfNDsrAAAAAAAAAAC+wpd+zw8AqKlXr146cOBAnbPhmWnevHl67LHHJEkul8vkNADQdljMOrHL5VJGRoY2bNigDRs2KCMjo93doK+88kpt2bJFs2bNUt++fRUUFKSIiAgNHTrU/dcTCQkJZ3UOi8Wil156SStWrNDVV1+tuLg4+fn5KS4uTldffbU++eQTvfjii7JY6v+v7tSpk7777js9++yzuuiiixQdHa2AgACdc845uv3227Vx40bddtttZ5UVAAAAAAAAAABf4ku/5/dVhmGovLxcBQUFcjqdZscBAACAibw+E9Nnn32mZ599VqtWrVJhYaHHvqCgII0ZM0b33HNPu5nxp2fPnlq4cKEWLlzYpOPGjBnTpKKu8ePHa/z48U2N58Fms+nuu+/W3XfffVbjAAAAAAAAAADQXvjS7/l9icvl0tChQ2Wz2ZSW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hPT0pQEAAAAAAAAAANDPhYSEyNfX12OlkYqKCkVHR5uYCug8w8dHQb30vE69666TKmKactddvZYNUmBgoBYsWKAFCxZIkvbv368PP/xQzzzzjPbu3at//etfevDBB/Xkk0+anBRAf2EYhlJTU92LCVVUVCg0NNTsWL3Gp6cnPPvss/WXv/xFhYWFSk9P1wUXXCAfHx85HA793//9n2644QbFxsbqmmuu0UcffcRSdwAAAAAAAAAAAHAzDENhYWEebeXl5eaEAbxMTFqa4s84o1vnDps1SzGTJvVwIrRn1KhRuv3227V582YNHz5ckvTmm2+anApAf2QYhkJDQzV8+HD31pIDUa/dWWBgoK655hr94x//0KFDh/T444+7q8Nqa2v15ptvat68eWwxBwAAAAAAAAAAAA/h4eEerysqKswJAnihc/74R/kFBnbpHD+rVXNY/cc0YWFhmj59uiSppKTE5DQA4L36pDwrNjZW9957r7Zt26atW7dq6dKliomJkcvlUklJiQzDkCT99Kc/1V133aXPPvusL2IBAAAAAAAAAADAC9lsNo/XNTU1stvtJqUBvEvc9Oma9/bbnS5k8rNaNe+ttxT3nyIa9Lx//etfys/Pb7O/oqJCX3/9taRjqzMBAFrX52tMTZo0SX/4wx90+PBh/f3vf9dVV12lgIAAuVwu5eXl6dlnn9WcOXMUFxenH//4x/r3v//d1xEBAAAAAAAAAABgotDQUPeH4JuxGhPwX6MvukhXf/qphs2a1e64YbNm6eoNGzT6oov6KNng9PrrryshIUEXXXSRnnrqKf373//W1q1b9emnn+r555/XzJkzdeTIEUnSrbfeanJaAPBefmZd2NfXV3PnztXcuXNVWVmpN954Q6+88oo2btwol8ulwsJCrVixQitXrqSyHgAAAAAAAAAAYBDx8fFRWFiYqqqqFBYWJpvNJqvVanYswKvETZ+uaz7/XEXbt+u7lStVtG2bGquqZAkNVUxamk695RbFTJpkdsxBo6mpSR999JE++uijNsfceuutuvPOO/swFQD0L6YVMR0vLCxMixcv1uLFi5Wbm6uXX35Zr776qnJycsyOBgAAAAAAAAAAABOMGzdO/v7+8vHp841FgH4lZtIknffcc2bHGNSefPJJff/739f//d//6bvvvlN+fr6Ki4vl6+urESNGaObMmbr5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dqmmpsakVAAA9H8RERGaPHmyAgMDlZycrMjISLMjoRv8Oh6CrqqqqtJFF12krKwsSdLixYs1f/58Wa1WrVu3To8++qgqKyt19dVXa+PGjUpLSzvpa/7617/WJZdc0mZ/REREu+ffeOON+uijjyRJ55xzju666y7Fx8drx44d+u1vf6ucnBw98sgjiouL0y233HLSeQEAAAAAAAAAAAajuLg41dbW6vDhw+42h8OhnTt3avLkybJYLCamAwCg/woKCtK0adNabN+K/oMipl6wfPly7d27V5L0+OOP67777nP3zZw5U3PmzNHs2bNVW1urpUuXav369Sd9zWHDhmnixIndOvf//u//9Le//U2SNG/ePL333nvuv9TTp0/XD37wA02dOlUHDx7U/fffryuvvLLDoigAAAAAAAAAAAC0LikpSfX19SopKXG31dfXa9euXZo0aZJ8fNhMBQCA7qCAqX/jJ6Ae1tTUpKefflrSsT0W77nnnhZjzjjjDN10002SpA0bNmjz5s19mvFETzzxhCTJz89Pzz//fIu/1FFRUfrd734nSSovL9eLL77Y5xkBAAAAAAAAAAAGCsMwNHbsWIWGhnq022w2GYZhUioAALyfy+VSdXW12THQSyhi6mHr1q1TRUWFJOn6669vs1J+0aJF7uP33nuvL6K1qqqqSv/+978lSeedd56GDx/e6rjLLrtMYWFhkszNCwAAAAAAAAAAMBD4+vpqwoQJCggIkGEYGjNmjJKSkihiAgCgHYcOHdI333yjI0eOmB0FvYAiph72+eefu49nz57d5rhp06YpKChIkrRx48Zez9WWzZs3q7GxUVL7eS0Wi04//XT3OU1NTX2SDwAAAAAAAAAAYKAKCAjQxIkTlZqaqri4OLPjAADg1YqKirR//35JUnZ2trKzs+VyuUxOhZ5EEVMPy8jIcB+PHTu2zXF+fn5KTk6WJGVmZp70dZ955hklJycrMDBQNptNEyZM0K233qpvv/22R/Ie32+325WVlXXSmQEAAAAAAAAAAAa7kJAQRUREmB0DAACvVllZqd27d3u0HTlyRJWVlSYlQm/wMzvAQHP48GFJUnBwsMLDw9sdO2LECH333XcqLi5WQ0ODAgICun3d44uVGhoalJGRoYyMDK1YsUJLlizRU0891er8zXkltbmV3PF5mx06dEjjx4/vdL7jr9Oa/Px893FNTQ1faGCq4/dQZT9VeAOeSXgTnkd4E55HeBueSXgTnkd4G55JeJOamhqzIwAAAADogrq6Ou3cubPFqktJSUmy2WwmpUJvoIiph1VVVUk6VjXfkeDgYPdxdXV1t4qYwsPDdemll2rOnDlKSUlRYGCg8vPztXbtWr300kuqrq7WihUrVFVVpfT09DbzdibziXm74vgCqI68++67fKGB13jllVfMjgB44JmEN+F5hDfheYS34ZmEN+F5hLfhmYTZKioqzI4AAJ1WXV2tnJwcjR8/Xv7+/mbHAQCgz9ntdu3cuVNNTU0e7XFxcR0u1IL+hyKmHlZfXy9JslgsHY49vmiprq6uy9eKj4/XkSNHFBQU5NE+efJkzZ07Vz/5yU903nnn6eDBg3rttdd09dVX6wc/+EGreTuT+WTzAgAAAAAAAAAAoHOOHj2qjIwMORwO7dq1S6eeeqp8fHzMjgUAQJ9xOp3KyMhQbW2tR3tERIRSUlJkGIZJydBbBm0RU088zH/961+1aNEij7bAwEBJUmNjY4fnNzQ0uI+tVmuXr2+xWNotPEpJSdGrr76qs88+W5L0zDPPtChias4rdZz5ZPIeOnSo3f78/HzNmDFDknTZZZdpzJgxXZof6EnV1dXuT4UuXLiwUyurAb2JZxLehOcR3oTnEd6GZxLehOcR3oZnEt5k7969evTRR82OAQDtKioqUmZmpvt1RUWF9u7dq1NOOYU3bAEAg4LL5VJ2drbKyso82oOCgjR+/Hi+Hw5Qg7aIqbeEhoZK6tx2a8fvvd5b/3Fz1llnafz48crIyNDnn38up9PpUaXfnFfqOPPJ5O3KMm7BwcEKCwvr0vzSsS9iNTU1qqysVH19vRwOR5fnAKRjSxKmpaVJOvYPw+OffQwsPj4+slgsCg4OVkhISKdW0TNbSEhIt75GAr2B5xHehOcR3oZnEt6E5xHehmcSZgsODjY7AgB0yGazyWKxeHwAvbCwUFarVQkJCSYmAwCgbxw+fFj5+fkebf7+/kpNTZWfH6UuA9Wg/ZM9vnq9u+Li4lq0DR8+XF999ZVqampUXl6u8PDwNs9vXp0oOjraY6u2ntZcxFRfX6/S0lJFR0d75G12+PBhTZs2rcO8kjRixIjeCdtNTqdTBw8eZJs79Ain0ymbzeY+ttvtJidCb2psbFR1dbUKCwsVHR2tyMhIKrcBAAAAAAAAmCogIEATJ07Utm3b5HQ63e25ubmyWq2KiYkxMR0AAL2rpKRE+/bt82jz8fHRxIkTPXabwsAzaIuYxo4d2yvzjh8/Xu+8844kaffu3Tr99NNbHWe325WTkyNJGjduXK9kadbem/Hjx493H+/evbvdeZr7/fz8lJKS0jPheoDL5WpRwGQYhnx9fU1Mhf7M5XK5Vxvz9/enoGUAczgccrlc7tfFxcVqbGxUfHy8iakAAAAAAAAA4NhuGuPGjdOuXbs82nfv3q2AgAD3h3EBABhIqqqqWl2UZuzYsazqOwgM2iKm3nLmmWe6jzds2NBmEdOWLVvcW1TNmjWrVzNlZGRIOla1HxkZ6dE3ffp093KkGzZs0P/+7/+2OkdjY6O+/PJL9zn+/v69mrkrampq3AVMvr6+io2NVUhIiMe2eUBXOBwOFRUVSZJiYmIoiBvAXC6XGhoaVFlZqdLSUknHthCMjIzs1RXyAAAAAAAAAKAzoqKiNHr0aPcH46Vj/6+5a9cuTZ48WVar1cR0AAD0rPr6eu3cudNjFUJJGjVqlMeOUxi4qPLoYXPmzHFXvr/88sseK3wcb9WqVe7jSy+9tNfybNy40V2hf+aZZ7Yo7AkNDdX3vvc9SdInn3yiw4cPtzrPu+++q8rKyl7P2x3NuSQpNjZWYWFhFDAB6BTDMBQYGKiYmBiP5ZfLyspMTAUAAAAAAAAA/zVs2LAWq8c3NTVp586dstvtJqUCAKDnlZeXq7Gx0aMtNjZWI0aMMCkR+hqVHj3MYrHozjvvlCRlZmbqiSeeaDFm06ZNeumllyRJs2fP1vTp01udyzAMGYahxMTEVvvff//9NoukJCk7O1vXXnut+/WPf/zjVsfde++9ko5tcfeTn/xEDofDo7+kpET333+/JCk8PFw333xzm9c0Q319vaRjv1/NW4ABQFeFh4e7j2tra80LAgAAAAAAAADHMQxDycnJioiI8Givra3Vrl27WqxWAQBAfxUbG6vx48e7Fy0JDw9XSkqKDMMwORn6CtvJ9YL77rtPb7zxhvbu3atly5YpOztb8+fPl9Vq1bp16/Tb3/5WdrtdVqtVf/zjH7t9nUsvvVTJycm67LLLNGPGDA0fPlwBAQHKz8/Xv/71L7300kuqrq6WJF111VW67LLLWp3n3HPP1fz58/W3v/1NH3zwgb7//e9r6dKlio+P144dO/Sb3/xGBw8elCT97ne/a/FDstmai658fX1ZgQlAt/n6+srX11cOh6NFMScAAAAAAAAAmMkwDI0fP17btm1TTU2Nu728vFxZWVkaM2YMb/ACAAaE6OhoBQQEaN++fR4FTRgcKGLqBaGhofrwww81d+5cZWVlaeXKlVq5cqXHmLCwMKWnpystLe2krpWdna3HH3+83TG33XabnnzyyXbH/OUvf1FlZaU++ugjrVu3TuvWrfPo9/Hx0f/3//1/uuWWW04qLwB4M/6RDwAAAAAAAMBb+fn5aeLEifr222/V1NTkbi8oKJDVatXIkSNNTAcAQM8JCwvTpEmTeO9uEKKIqZckJydr69ateu655/TWW28pOztbjY2NGjFihObOnau77rpLCQkJJ3WNDz74QJs2bdJXX32lAwcOqKSkRDU1NQoLC1NSUpLOOuss3XjjjZo4cWKHc1mtVn344Yd67bXXtGrVKm3fvl3l5eUaOnSozjrrLN1+++2aOXPmSeUFAAAAAAAAAABA9wUGBmrixInavn27xzZy+/fvV2hoqNftpgEAQHdRwDQ4UcTUi4KDg7Vs2TItW7asW+e7XK52++fNm6d58+Z1a+62XHvttbr22mt7dE4AAAAAAAAAAAD0jLCwMI0dO1YZGRnuttjYWNlsNhNTAQDQNdXV1XI4HHz/ggc2DwQAAAAAAAAAAAD6kejoaCUlJUmSRo0apTFjxsjHh7f9AAD9Q0NDg3bs2KHt27erqKjI7DjwIqzEBAAAAAAAAAAAAPQzw4cPl81mU1hYmNlRAADoNIfDoZ07d6qxsVGSlJmZqbq6Oo0cOZIt5MBKTABwMlatWiXDMGQYhnJzc82OY7r169e7fz/Wr19vdhwAAAAAAAAAGLAMw6CACQDQr7hcLmVmZqq6utqjvaysTC6Xy6RU8CYUMQEAAAAAAAAAAAADjMPh4A1hAIBXycnJUWlpqUeb1WrVhAkT2BYVkihiAgAAAAAAAAAAAAaU+vp6ffvttzpy5IjZUQAAkCTl5eW1+L7k5+eniRMnyt/f36RU8DZ+ZgcAAAwcc+bM4ZM9AAAAAAAAAGCiyspK7dy5U01NTcrJyZGfn59iY2PNjgUAGMQKCwuVlZXl0WYYhiZMmKCgoCCTUsEbUcQEAAAAAAAAAAAADAANDQ3avn27nE6nu23Pnj2qq6tTYmKiDMMwMR0AYLBxuVw6cOCADhw40KJvzJgxCg8P7/tQ8GpsJwcAAAAAAAAAAAAMAAEBARo5cmSL9oMHDyozM1MOh8OEVACAwcjpdGr37t2tFjCNHDmSVQLRKoqYAHTbunXrdP311yspKUlBQUEKCwtTamqq7rvvPuXl5bV53iOPPCLDMNyf+Kivr9fy5cs1ZcoUhYaGKjQ0VDNmzNCzzz4ru93e4vzVq1e7z//44487zLlkyRIZhqGAgACVlZV1eC+hoaEaM2aMzj33XC1btqzde+ms4uJi/fznP9fkyZMVHh6uwMBAJSYmauHChfr888/bPbf50zGLFi2SJG3evFnXXHONRowYocDAQI0YMUI33HCDdu/e3aks2dnZuvvuu5WamiqbzSar1aqkpCQtWrRIW7ZsOan7XL9+vfvPZv369Sc1FwAAAAAAAACg60aOHKkRI0a0aC8uLtb27dvV2NhoQioAwGDS1NSk7777TkVFRS36hg0bpsTExL4PhX6BIiYAXVZfX69rrrlG5557rlavXq39+/errq5OVVVV2rlzp5544gmNGTNGa9as6XCuwsJCzZw5U8uWLdPWrVtVXV2t6upqbd68WXfccYcuu+wyj2VvJenSSy+V1WqVJL322mvtzt/U1KS3335bkjR37lxFRER06l6qq6u1e/du/eEPf+j0vbRl7dq1Sk5O1m9+8xtt27ZNFRUVamho0IEDB/Tqq6/qrLPO0u23397iPlvzl7/8RWeccYb+9re/6fDhw2poaNDhw4e1atUqpaWl6a233mr3/CeeeELjx4/XH//4R+3cuVOVlZWqr6/X/v379fLLL2vGjBl66KGHun2vAAAAAAAAAABzGYahpKQkpaSktOirqqrS1q1bVVNTY0IyAMBgUFtbq61bt6qioqJFX3JyspKTk9neFG2iiAlAl7hcLl1xxRX629/+JkmaN2+eXnnlFW3cuFGbNm3SU089pZEjR6qmpkZXXHFFhyv7XHbZZcrIyNCdd96pjz/+WN98841ee+01jRs3TpK0Zs0avfDCCx7nhIaG6gc/+IEk6d1331V9fX2b8//jH//Q0aNHJUkLFizo1L18+umnWrNmjX75y1926V5as23bNs2bN0+VlZXy9/fX3XffrXXr1unrr7/WihUrNGrUKEnSc889pwceeKDDuW699VbFxMTomWee0VdffaUNGzbo/vvvV0BAgBoaGrRgwYI2cy5fvlz33XefmpqadOqpp+pPf/qTPvnkE23ZskXp6emaOXOmXC6XfvWrX+npp5/u8r0CAAAAAAAAALxHfHy8UlNT5evr69FeX1+vrVu3uv/vHACAntTQ0NDi/VtfX19NnDhRw4YNMykV+gs/swMAfa20uqHb5wYH+CnQ37fVvqM1jXK5XN2a12rxVZCl9b+O5bWNcjg7N29kSEC3rt8VL774oj788EP5+/vrgw8+0IUXXujRf/rpp2vhwoU666yztGvXLi1durTd7dI2b96stWvXas6cOe62KVOm6IILLtD48eNVWFio559/XkuWLPE4b8GCBXrjjTdUWVmpv//977riiitanb95paawsDBdfPHFnboXh8OhoqIiTZ06VbfddpvmzJnTqXtpzS233KLGxkb5+vrq73//u84//3x33/Tp03XllVfqzDPPVEZGhp544gldd911mjBhQqtzbd++XQkJCfryyy899og9++yzdcEFF+j8889XU1OTfvzjH+vrr7/2ODcjI0MPPvigJOnhhx/Www8/7FHhPHXqVM2fP1/XX3+9Xn31VT344INauHBhi5WrAAAAAAAAAAD9x5AhQzR58mTt2LFDDQ3/fX/E4XBox44dGjNmjOLi4kxMCAAYaCIiIjRmzBjt2bNHkhQQEKCJEycqJCTE5GToDyhiwqAz9defdPvcX14yQdfNTGy177w/bNDRmu7tI33X91J09/fHtNp35Z83KauoulPz5D52Ubeu31kul0u/+93vJEl33nlniwKmZhEREVq+fLnmzp2rjRs3Kisrq9VlayXpjjvu8ChgajZkyBDdcMMNeuyxx7Rjxw5VVFTIZrO5+y+88EJFRkaqtLRU6enprRYxVVdX64MPPpAkXX755QoMDOzVeznR119/rc2bN0uSFi9e7FHAdPz8K1eu1Jlnnimn06nnn39ezz33XJtz/v73v/coYGp2zjnnaPHixfrTn/6kzZs3a8uWLZo2bZrHeU1NTZo2bVqLAqZmPj4+euaZZ/TWW2+purpab7/9thYvXtypewUAAAAAAAAAeKfg4GBNmTJFO3fuVFVVlUff3r17VVtbq6SkJLb2AQD0mNjYWNXW1qqsrEwTJ05UQEDvL8aBgYHt5AB0WkZGhnJyciSpzZWPmp199tnu402bNrU57sQt3o43depUSccKjvbv3+/R5+/vryuvvFLSsS3jysvLW5z/3nvvqa6urtXr9Ma9nOiTT/5bMHfTTTe1OW7WrFnu7fOOP+dEERERuuSSS9rsv/HGG1u9tnRsWz7pWDFXe/8QDQ8PV2pqqqSu3SsAAAAAAAAAwHtZLBZNmjRJ0dHRLfoOHz6sjIyMbu82AQBAa0aNGqW0tDQKmNAlFDEB6LQtW7a4j2fOnCnDMNr8dfxygAUFBW3OOXbs2Db7hgwZ4j4+8dMh0n8LkxoaGvT222+36G/eSi4+Pl7nnHNOp+/Fz89P8fHxio+Pl5+fX6fv5UQ7d+6UdOwfh2lpae2OPe200yRJWVlZamxsfUWvyZMny8+v7QX00tLSZLFYJEk7duxwtx84cEDFxcWSpAceeKDdPzfDMNy/N125VwAAAAAAAACAd/P19dW4ceM0YsSIFn2BgYGsxAQA6JLGxkb3e5CtMQxDvr6+fZgIAwFFTAA6raioqFvn1dbWttkXFBTUZp+Pz3+/RDkcjhb9s2bNUkJCgiQpPT3do6+oqMi9GtH8+fM95mru74727uVER48elXSsGKu94iNJ7i3iXC6XysrKWh0TExPT7hx+fn7uwq/ma0t9c68AAAAAAAAAAO9nGIaSkpJ0yimnuIuWoqKilJSUZHIyAEB/UlNTo61btyojI0OlpaVmx8EA0v676sAA9M3Pz+v2ucEBbf+V+eSns7u91KrV0nYF6lu3zpTD6R1LuB5fSLRmzRolJiZ26ryOim+6yzAMXXvttXr00Uf16aef6siRIxo2bJgk6c0335TdbpfU+pZ17d2Lw+HwKEA6vkK4O/fSU59e6e48x9/rQw895N6GryPBwcHduh4AAAAAAAAAwLvFxsYqICBAhw4d0tixY1mFCQDQaWVlZdq1a5f7PcjMzEylpaV57G4DdBdFTBh0IkN6Z8/NIcGWXpk3PKh35u2OyMhI93F4eLgmTpxoYppjFixYoEcffVROp1Ovv/667r33Xkn/3Upu7NixmjJlSovz2rsXh8PhXr0oJiam28scNq+KVFpaKrvd3u5qTM1btxmGoYiIiFbHFBYWtns9u93uUXzV7Ph79ff394o/NwAAAAAAAACAuSIiItr8/2gAAFqTn5+vvXv3erQ5HA5lZWUpLS2NolicNLaTA9BpkydPdh9v3LjRxCT/NWHCBE2aNEnSfwuX9u/fr02bNklqfRUmqW/upblYqLGxUdu2bWt37Ndffy1JSklJkcXSeuHatm3b3KtLtWb79u1qbGz0uLYkJSUlyWazSfKePzcAAAAAAAAAgHerrq7Wvn37ur0LBQBg4HC5XMrJyWlRwCRJoaGhmjBhAgVM6BEUMQHotClTpmj48OGSpJUrV6q+vt7kRMc0Fypt3bpVmZmZ7mImSbr22mtbPacv7uW88/67deFf/vKXNsdt2rRJGRkZLc450dGjR7VmzZo2+4+/xvHz+Pr6au7cuZKktWvXKjMzs+PwAAAAAAAAAIBBq7GxUTt37tShQ4e0c+dO95ZBAIDBx+FwKCMjQ4cPH27RFxUVpUmTJrW5SAPQVRQxAeg0Hx8f/exnP5Mk7du3T9ddd50aGhraHF9ZWalnn32213Ndc8017sre9PR0vf7665KkmTNnKikpqdVz+uJeZsyYoWnTpkmSXnjhBf373/9uMaaiokJLlixxZ7rtttvanfOnP/1pq9vKbdiwQStXrpQkTZ06VdOnT/fof+CBB+Tr6yun06krrrii1R8ymjkcDqWnp7c7BgAAAAAAAAAwMDkcDu3cudP9f+ZHjx7Vtm3b2v0/dADAwNTQ0KDt27erpKSkRd+IESM0fvx4+fr6mpAMA5Wf2QEA9C+33nqrPv74Y7333nt666239O2332rJkiWaMWOGbDabKisrtXv3bq1fv14ffPCBAgMDdfvtt/dqpuHDh2v27Nlav369nnvuOZWXl0tqeyu5ju5l6tSpcjgcqq6uVmFhoT799NNu38sLL7yg0047TY2NjZo7d67uuOMOzZs3T8HBwdq6dasee+wx7du3T5J07733emwDd6JJkyYpIyNDU6dO1QMPPKAZM2aooaFBH330kZ588knZ7Xb5+fnpueeea3FuamqqnnjiCd19993KyMjQxIkTdcstt+jcc8/V0KFDVV9fr9zcXG3atElvv/228vPztWPHDvdqVQAAAAAAAACAwaGqqkrV1dUebdXV1fr22281ceJEhYaGmpQMANCXqqurPYpamxmGoZSUFMXFxZmUDAMZRUwAusQwDL3xxhu666679Oc//1k5OTlatmxZm+NjYmL6JNeCBQu0fv16dwGTn5+frrrqqnbP6Yt7SUtL05o1a3TllVeqsrJSv//97/X73/++xbif/OQnevTRRzuc6/bb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6tWrSk1NtZhUZY2Li4tcXFxUt25dHT161GKfOnDgQKFjvnr1qtV4i5JYdP36davtent7q1atWpJuPF+JiYmFPg4Kh3EKjuCsfuWIMYQkJgd45ZVX9MMPP+jgwYN69dVXFRMTo0GDBsnb21uRkZF67733lJ6eLm9vb3300Ud2Oea+ffu0fft2SdKDDz6oKlWq5Gu/7du3a9iwYercubMeeughtWjRQhUrVlR6eroOHDigWbNmadWqVZJuTCc4bdo0+fr62iVmlH4nTpxQaGioDh48aDx29epVrVixQqtWrdKcOXM0YMAA/fnnn+revbtOnTpl1EtOTtbixYv1yy+/aMWKFVb/6L506ZJ69+6tTZs25Xj8woULioqKUlRUlKZMmaIVK1YoKCjIYhv79+9XaGioTp8+bTx2/fp1rV27VmvXrtXQoUN13333FeWpsAtLiUjSjW9kxcTEKCYmRt9++61Gjx6t999/3y7HjI+PV//+/bVu3bocj6ekpGj79u3avn27pk6dqkWLFlldHnPDhg3q2bNnjgviM2fOaMmSJVqyZAkJRwAAAAAAAIAF2ZOLatasabNu1g1n6cbnsgWRfd+8fPfdd8aMKsXpu+++K/Zj4tZHvyqdqlWrJk9PT7m5ucnd3V1ubm7Gtqurq819//zzTy1btsxiWfPmzVWuXLkCxZKZmanMzExjViRLfapZs2aFXuIzJiZGy5cvt1hWv359Va5cWZKUkZGh9PR0paWl2fw3+/batWsLFROKF+MUHKE4+9WVK1fs3iZJTA7g5+enZcuWqXv37jp06JCmTZumadOm5ajj7++vWbNmqWXLlnY5ZtYsTJL05JNPFmjfjIwMrVmzRmvWrLFap2LFipoxY4Z69epV6Bhx6xkwYIBOnjyp119/XQ8++KB8fHy0ceNGjR07VgkJCXr66acVHBysnj176tq1a3r33XfVqVMnubu7a+XKlXr33XeVkpKisLAwHTp0KNdsShkZGerZs6e2bNki6cbMZS+++KLq1q2r06dP6+uvv9bChQu1f/9+denSRbt27cp1AZqQkKBu3boZCUwDBw7UkCFDVKVKFR08eFAffvihZs6cqT179hTPk2ZDenq6fH191aNHD91///1q3Lix/P39FRcXp7179+qTTz5RbGysPvjgAzVq1EhDhw419m3Tpo12796tRYsW6a233pIk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amqqYmJiFBMTo2+//VajR4/W+++/b5djxsfHq3///lq3bl2Ox1NSUrR9+3Zt375dU6dO1aJFi3TPPfdYbGPDhg3q2bOnEhISjMfOnDmjJUuWaMmSJXZLJkpPT9fgwYNzJZ7t3btXe/fu1ffff++QpCkAAAAAAAAAAAAAgOORxASg0AYMGKCTJ0/q9ddf14MPPigfHx9t3LhRY8eOVUJCgp5++mkFBwerZ8+eunbtmt5991116tRJ7u7uWrlypd59912lpKQoLCxMhw4dkoeHR472MzIy1LNnT23ZskWS1KlTJ7344ouqW7euTp8+ra+//loLFy7U/v371aVLF+3atUvlypXL0UZCQoK6detmJDANHDhQQ4YMUZUqVXTw4EF9+OGHmjlzpvbs2VM8T5oN6enp8vX1VY8ePXT//fercePG8vf3V1xcnPbu3atPPvlEsbGx+uCDD9SoUaMcsy61adNGu3fv1qJFi/TWW29Jkn755RfVqFEjxzHq1q1rbKekpCg0NFQ7duyQq6urBg8erO7du6tu3bpKS0vTr7/+qg8//FBxcXHq3r27du7cmStR7Pjx40YCk4uLi4YPH67+/furfPny+vPPP/XBBx8oPDxcwcHBRX5+/vWvfxkJTLfffrteffVV3XHHHbpy5YrmzZunr776SgMHDizycQAAAAAAAAAAAAAAxY8kJpQNmZnStUvOjqL4eAdKLo5fLXLXrl1av3697r77buOx4OBgNWzYUD179lRiYqLuvvtumc1mbd26VfXr1zfqtW3bVpUqVdKIESN0/PhxLVu2TH379s3R/hdffGEkMD355JOKiIgwlrFr3bq1evXqpTfffFPvvfeeDh8+rPHjx2vChAk52hg/frxOnDghSXrvvff0+uuvG2WtW7dW//791bNnT61atcq+T04htGzZUidPnlRAQECusm7duunFF19Uz549tXr1ao0bN05PPvmkXF1dJUm+vr5q3ry5oqOjjX0aNWqkOnXqWD3eO++8ox07diggIEBr1qxR69atc5R36NBBf/vb39SuXTudOXNGb7zxhmbNmpWjzqhRo4wZmL7//ns99thjRllwcLAGDBigjh075oirMHbv3q1PP/1UknTXXXdp/fr1ORLWunTpovbt22vIkCFFOg4AAAAAAAAAAAAAwDlIYkLZcO2SNKl+3vVuFa8clnwrOfww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lJmZqRdffFGXLl0yyhgfUdxs9cf8GjRokPz9/SUxPsK6AwcO6P3335d046Zx9mUP8osxErg18F4uW7Je74LcY5Ic93p37NhRTZs2lSRt3LhRmZmZDjkOCqa47kcy/pQdJe0eN58poSBK01jFcnIodl5eXqpYsaIuXryokydP2qwbHx9vvEmy1voEnKVp06Zavny5pBvLz9WoUcPJEaEsqlmzprGd1xh64sQJY5sxFM5UpUoVVaxYURcuXNCpU6ecHQ5KidOnTys0NFSnT5+WyWTS119/rT59+tjchzESjlKY/phfjJGwpz59+ujHH3/U1atXtXLlSg0ePFgS4yOcw1p/zC83Nzc1atRI0dHRjI+w6r///a9SU1NVr149JScna+7cubnq7Nmzx9het26dzp49K0nq1auXfH19GSOB/7d///4it1G9enU7RFI4vJdLJkf1q5o1a+r333/X1atXdfnyZZsrLWS93pUrV86xPI69NW3aVPv27dP169d18eJFVa5c2WHHQv4U1/1Ixp+yo6Td4+YzJRTEzWNV1tLwljh7rCKJCU7RtGlTbdiwQTExMUpPT5ebm+WueODAAWO7SZMmxRUeYJGtaRuB4pL1jR4p5xhpCWMoShLGUBTEhQsX9MADD+jIkSOSbnyr/sknn8xzP8ZIOEJh+2NBMEbCXrLfKImNjTW2GzVqJFdXV2VkZDA+othY648FwfiIvGQtc3DkyBE99thjedYfP368sX306FH5+vpyDQn8v8aNGzs7hCLheqdkclS/atq0qebPny/pxut5zz33WKyXnp6uw4cPS3L8a811S8lUHPcjuZYoW0raPW7GHuRXYcYqNzc3NWzY0KFxWcJycnCKDh06SLoxFdn27dut1ss+9d29997r8LgAW/bt22dsMwsTnKVu3bpG/8tretBff/1VknTbbbepTp06jg4NsOr8+fO6cOGCJMZP5O3KlSvq1q2b8Xv3gw8+0IgRI/K1L2Mk7K0o/TG/GCNhT9m/eZl9um8PDw+1bdtWkrRlyxalpqZabSNr/PT09LT5rTwgL9b6Y36lp6fr4MGDkhgf4VhcQwK3Bq53ypase0yS7bE7OjramAnF0feYsv5u9PT0VMWKFR16LORfcdyP5FqibClJ97j5TAkF0aZNG3l4eEiyPValpqbqt99+M/Zxd3cvlviyI4kJTvHwww8b2zNnzrRYJzMzU99++60kKSAgQJ07dy6O0ACLjh49qtWrV0uS6tevr9tuu83JEaGsMplMxvI1Bw4cMC4kbvbbb78ZmdJ9+vQhGx9ONW3aNJnNZklSp06dnBwNSrLk5GT16NFDO3bskCS9+eabeu211/K9P2Mk7Kmo/TG/GCNhT/PmzTO2W7RokaMs6+/whIQELViwwOL+J0+e1Jo1ayRJXbp0kZ+fn2MCRZlgqz/mxw8//KArV65IYnyEdRERETKbzTZ/xo4da9SPjIw0Hs+6ccg1JHDr4Hqn7AgJCVH58uUlSd98843xN9XNIiIijO2+ffs6LJ5NmzZp7969km4kOLi4cPu1pCiO+5FcS5QtJekeN58poSD8/PzUpUsXSdKaNWusLom4YMECJSQkSHLs706bzICTdOzY0SzJ7ObmZt68eXOu8okTJ5olmSWZx44dW/wBosxYvHixOS0tzWr52bNnza1atTL643/+859ijA63uqNHjxp9a8iQIfna56+//jK7urqaJZmDg4PNycnJOcqTk5PNwcHBxhh78OBBB0SOW1FB++PRo0fNO3bssFlnyZIlZg8PD7Mks7e3t/nkyZN2iha3mpSUFHPXrl2NPviPf/yjUO0wRsIe7NEfGSNhTzNnzjRfu3bNZp0PP/zQ6LN169Y1p6en5yi/ePGiuXz58mZJ5qCgIPOFCxdylKenp5t79epltBEZGWnv08Atoqj98dKlS3n2r99//90cEBBglmQ2mUzm6Ohoe4SOMmrs2LF5jm1cQwLFLygoyLguyY/sn1l06tTJYh2ud8qWMWPGGK/lxIkTc5Vv3rzZ7ObmZrPPmM1mow1rffHnn382Z2ZmWt3/0KFD5tq1axvtzJ8/v6CnAgcr6v3IyMjIPD8z5VqibHF0n+IzJRTm3uHMmTPzzK1Yu3atUad37965Pjs6f/688TstICDAfOnSpSKeSeFYXqQRKAYff/yx7r33Xl27dk1du3bVG2+8oc6dO+vatWuaO3eupk2bJunGWtajRo1ycrS4lf39739XWlqaHnnkEbVr10516tSRt7e3Lly4oKioKH355ZfGdIwdOnSw+xIiKFs2btyomJgY4/9ZfUuSYmJicnw7SJLCwsJytdGoUSO98sor+uCDDxQdHa17771Xr732murXr6/Dhw9rwoQJ2rlzpyTplVdeccp6tSgditofjx07ps6dO6tdu3bq1auX7rzzTlWpUkWSdOTIEf3000/66aefjG+DTJ48mZnsYNVjjz2mVatWSZLuv/9+Pf3009qzZ4/V+h4eHmrUqFGuxxkjYQ/26I+MkbCn8PBwjRo1So888og6dOig+vXrq1y5ckpMTNTu3bs1a9Ysbdq0SdKN/jht2jS5urrmaCMwMFATJkzQc889p9jYWN19991688031aJFC50+fVofffSRIiMjJd14D4SEhBT3aaKUKGp/vHLlijp37qw77rhDDz/8sFq3bq3q1avL1dVVx48f19KlS/Xdd98ZywD961//UuvWrZ1yrig7uIYEHCsmJkYbN27M8VhSUpLx782fPzz44IOqVq1agY/D9U7Z8sorr+iHH37QwYMH9eqrryomJkaDBg2St7e3IiMj9d577yk9PV3e3t766KOPCn2cvn37qkGDBurXr5/atm2rmjVrytPTU2fOnNEvv/yiGTNmGP350UcfVb9+/ex0hrCX4rgfybVE2eLoPsVnSmWPPe4d5sf999+vQYMGae7cuVq8eLEeeOABvfzyy6pRo4Z2796td999V8ePH5ckTZgwQRUqVCjUcYrMKalTwP9bvHix2d/f38j4u/mnUaNG5kOHDjk7TNzisr71k9fPI488Yo6Pj3d2uCjlhgwZkq/+lvVjTUZGhvmpp56yue/TTz9tzsjIKMazQ2lT1P6Y/Rsjtn58fHzMX375pRPOEKVJQfqi8vi2LmMkisoe/ZExEvaU379ZatasaV61apXNtt5++22zyWSy2kb37t3znGUHZVtR+2P2b5Ta+nF1dTWHh4fbnPkAyI/8zMRkNnMNCThS9pkB8vNj6b2an5mYsnC9U3YcOnTI3LBhQ6uvtb+/v3nJkiU228jrc4b89tvnn3/efP36dQecJeyhKPcj8zMTk9nMtURZ48g+xWdKZY897h3mZyYms/nGzHDdu3e32raLi4vTV8liJiY4Va9evfTnn3/q448/1rJly3Ty5El5eHioQYMGGjBggF588UX5+Pg4O0zc4r755hutX79eW7Zs0ZEjR3ThwgUlJCSoXLlyqlWrltq3b68hQ4aoXbt2zg4VMLi4uGjGjBl65JFHNG3aNG3btk0XLlxQpUqV1KZNGz377LN66KGHnB0mbnGtW7fW999/ry1btig6OlpnzpzRhQsXlJ6ergoVKqhZ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", + "image/png": "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9JGPfEQ33XST7r//fv3whz/UsWPH9L3vfU8PPvhgSL7vfe97On36tCTphz/8oe69997guRUrVui6667T+vXr9corr0Tk6zMay5YtU1VV1YCVXiTpk5/8pO68806tX79ef/7zn/Wd73xHt9xyS/A+7HA4tHjxYu3Zsyf4nJKSEs2dO3fQ6333u9/Ve++9p9TUVL366qtasWJFyPkLL7xQN954o9asWaPa2lrdd999evrpp0P6bNy4MbgC069//Wv9/d//ffDcypUrdf311+uiiy4KyQVMZRaLRcnJySGviyhimiB+v1/33HOPNm/eLL/fH6wUMwxjwL6hfRWUNptNx48f16xZsyYrJgAAAAAAAAAAAEx2dhETqzBhKvG1tan8YxeYHWNSFf/1LdnS0yN+nbvvvjukgKnPlVdeqcLCQp08eVKNjY36j//4j5ACpj633XabNm7cKLfbrTfeeCOkiOkXv/iFJCkrK0v//u//LsMwBjz/O9/5jp5//nkdPnxYjzzyiL773e8qNjZW0plt2B577DFJ0kc+8hF94xvfGPD8mJgYPfbYYzrnnHPk8XjG9kWYIJmZmUOet9vt+vGPf6xly5bp5MmT2rdv34DCo5Hq6uoKfn2/973vDTpOYWGhvvWtb+nLX/6yfvvb32rLli1yOBySFFwNS5LWr18fUsDUJykpSVu2bAk7R4CpKiUlRe3t7bLZbEpJSRmwAtx0E/ly2P/xpS99ST/96U/l8/mUn5+v6667btC+fcvG+Xw+Pffcc5MVEQAAAAAAAAAAACbz+/3BlTb6UMQEQJI+97nPDXruIx/5iKQzi2jccMMNYfvEx8eruLhYklRZWRlsr6mp0aFDhyRJn/3sZ5WUlBT2+TabLbitWmtrq957773guXfffVetra2SpFtvvTVsEZQkzZ49W5dffvmgn4dZenp6dOrUKR08eFBlZWUqKysL2cLq/fffH/PYO3fuDBanDlUnIEkf//jHJUkej0fvvvtusH3Hjh3y+XySFLK13dlWr16tRYsWjTkrEG3y8vK0cuVKfexjH9PixYuVnZ1tdqSImpQiptdeey1YdXrffffpxIkT+r//9/8O+Zzrr79egUBAf/nLXyYjIgAAAAAAAAAAAKJAV1eX/H5/SBtFTACkM1uWDaZvW7TMzEylpaUN26+zszPYVlZWFjwebhWf/uf7P++DDz4IHq9atWrIMVavXj3k+cnidDr1wAMPaOnSpXI4HCosLNSiRYu0ZMkSLVmyRMuXLw/2bWpqGvN1+m/vlpeXJ8MwBv1YvHhxsG9dXV3weCp+fYGJEBcXJ4fDMWhh5HQzKdvJbdmyRdKZFZa+//3vj+g5fTeWAwcORCwXAAAAAAAAAAAAosvZW8klJCQoJibGpDQAoklCQsKg5ywWy7B9+vfrW9VHklpaWoLHw61ykpubG/Z5oxkjJydnyPOT4cSJE7rkkkt0/PjxEfV3uVxjvlZDQ8OYntfd3R08nmpf3/+fvfuOj6rK/z/+vplk0jsJJLQACQKCFCki1bLiBhusBVQUCyK6Cq6Kq/tbV/frrgUVu4IgRbGxKiuCfSkaUUAB6ZAAUhI66XUm8/uDzSyTXmbmpryejwePx51z7z3nPeFymcx85hwA9eOVIqY1a9bIMAzddttttT6nXbt2klyrKwEAAAAAAAAAANC8ZWZmujwumzUFaCosERFK+iHF7BheZWlG/07dMdtJU5gxZcKECdq7d68Mw9Att9yicePGqXv37oqJiZHVapVhGCotLZXFYpEkl6Xl6urMgrFffvml1oWpZTUD5TWFny+A+vFKEVNZZWVCQkKtzym7cdlsNk9EAgAAAAAAAAAAQCPUqVMnRUZGKisrS1lZWSwlhybH8PGRb1SU2TFQB1Fn/H0dOXKk2mPPnITjzPPOXMLuyJEj1S59V9MYhmHI4XBUWFqzvLy8vGr3V2XHjh36/vvvJUmPPPJIlaspnTn7UUNER0c7t2NiYqosTqpO+Z9v+/btqzy2pp8vgMbLxxuDBAcHS5KOHTtW63MOHjwoyfXGDwAAAAAAAAAAgOYtJCRE7dq109lnn63BgwcrJibG7EgAmrmePXs6t3/66adqj127dm2l5/Xq1cu5vW7dumr7qGl/aGioJOnUqVNVHuNwOJSamlptP1XZunWrc/u6666r8rj169dX209tZ0Tq27evczslpX6zlLnz5ws0dbUpcmyqvFLE1LlzZ0nStm3ban3O559/Lkk6++yzPZIJAAAAAAAAAAAAjZthGCwbBMDj4uPj1b17d0nShx9+qNzc3EqPs9vtmj9/vqTTMwP169fPue/cc891zhb09ttvV7n82qFDh/TVV19Vm6dTp06Sqi8i+vzzzyssv1lbZ66GVN1sTm+88Ua1/QQEBDi3i4qKqjzu4osvVlBQkCTppZdeqtfSdBdccIFzabsFCxZUedy6deu0ZcuWOvcPNHa5ubnav3+/Nm/erB9++EGHDh0yO5JHeKWI6ZJLLpHD4dCrr75aq2qwbdu2af78+TIMQ8nJyV5ICAAAAAAAAAAAAABoqe6++25Jp1cXuvfeeys95vHHH3dO3DFp0iT5+/s79/n7++uWW26RJG3cuFEzZsyocL7NZtOkSZNUXFxcbZYRI0ZIOj0rVGUzFx0+fFj33HNPLZ5V5ZKSkpzbZUVZ5b3++uv697//XW0/cXFxzu20tLQqj4uIiNAf//hHSdIPP/yg++67r9q6gSNHjmjOnDkVxrryyislSZ9++qk+/PDDCufl5uZq8uTJ1WYGmqr09HTt3btXJ0+elM1mU1ZWltmRPMIrRUz33nuvgoODlZaWpjvvvNOlsrO8r7/+WpdccokKCwsVFRWlSZMmeSMiAAAAAAAAAAAAAKCFuvPOOzV48GBJ0rx583TRRRfp448/1q+//qpvvvlG11xzjf7v//5PktSlSxf99a9/rdDHo48+qnbt2kmSHnroIV1//fX64osv9Msvv+j999/X+eefr88//1z9+/evNssdd9whX19fORwOXX755XrhhRe0fv16/fDDD5oxY4b69u2rrKwsl2Kkuujbt69zKbxZs2bpuuuu02effaaff/5Z//73v3XNNdforrvu0pAhQ2rsp2w2pr/+9a/6+uuvtWvXLqWmpio1NVUFBQXOY//+979r0KBBkqQXX3xR/fr106uvvqqUlBRt3LhRK1as0CuvvKKrrrpKHTp0qHQWqOeee8651N7111+vu+++WytWrNDPP/+sefPm6dxzz9WGDRtq/PkCTVF4eLjL46ysrHrNatbY+XpjkNatW+uNN97QTTfdpLlz5+rLL7/U6NGjnftffPFFORwOpaSkaMeOHXI4HPLx8dH8+fMVEhLijYgAAAAAAAAAAAAAgBbKYrHos88+0xVXXKGUlBT95z//0X/+858Kx3Xv3l2ff/55pZ9jh4eH64svvtDFF1+sw4cP67333tN7773ncszEiRM1YsQI56xNlTn77LP1zDPP6E9/+pNOnTql++67z2V/VFSUlixZor/+9a/avXt3nZ+rYRh6++23deGFF+rUqVP68MMPK8xs1KtXLy1evFjx8fFV9hMaGqp7771X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ysrKUlFRkX777Te98847GjZsmP74xz9WeJ6Veeutt3T++efr/fff18GDB1VUVKSDBw9q/vz56tOnjxYvXlzt+c8++6x69OihF154QVu2bFF2drYKCwu1d+9eLViwQAMHDtSjjz5a7+cKtGTMxORlN910kxwOh2bPnm12FAAAAAAAAAAAAHhAc51FAID7OBwOXX311c7JLy6//HK9/fbbSklJ0Zo1a/Tiiy+qQ4cOysvL09VXX13t7D5jx47Vtm3bdO+99+rrr7/Wzz//rHfffVfdu3eXJC1dulRvvvmmyzkhISG65JJLJEkff/yxCgsLq+z/888/18mTJyVJN9xwg8eeR1U2btyoyy+/XNnZ2fLz89N9992nFStWaO3atZo1a5Y6deokSXr11Vf18MMP19jXnXfeqdjYWL388sv66aeftGrVKj300EPy9/dXUVGRbrjhhipzzpgxQw8++KBKSkp0zjnn6PXXX9c333yj9evXa9GiRRo8eLAcDof+7//+Ty+99FKdnyvQ0jXX11CNthSrQ4cOkqTNmzebnAQAAAAAAAAAAACewExMaI5KHaXKLMo0O4ZXRfhHyMfwzPwZc+bM0bJly+Tn56dPP/1Ul156qcv+8847TxMmTNCwYcO0detWTZs2rcol09atW6evvvpKI0eOdLb169dPo0aNUo8ePXTkyBG99tprmjx5sst5Y8eO1aeffqrs7Gx99tlnuvrqqyvtv2ymprCwMF122WUeex5VueOOO1RcXCyLxaLPPvvMWXwlSQMGDNA111yjoUOHatu2bXr22Wd100036eyzz660r02bNqljx4768ccf1aZNG2f78OHDNWrUKF1yySUqKSnRXXfdpbVr17qcu23bNv3lL3+RJP3tb3/T3/72N+dyfpJ07rnnaty4cbr55pv1zjvv6C9/+YsmTJhQYeYqAFUr/5rJx8dHPj6Ndh6jWmu0RUxHjhyRJOXl5ZmcBAAAAAAAAAAAAO5WWcESRUxoDjKLMjXigxFmx/CqVdetUlRAlNv7dTgcevrppyVJ9957b4XCnzKRkZGaMWOGkpOTlZKSot27dyspKanCcffcc49LAVOZqKgo3XLLLXrqqae0efNmZWVlKTw83Ln/ggsuUHR0tE6cOKFFixZVWsSUm5urTz/9VJL0hz/8wbkEnSeeR2XWrl2rdevWSZImTZrkUsB0Zv+zZ8/W0KFDVVpaqtdee02vvvpqlX0+99xzLgVMZS644AJNmjRJr7/+utatW6f169erf//+LueVlJSof//+FQqYyvj4+Ojll1/W4sWLlZubq3/961+aNGlSrZ4rgMpfMzWHJeUabRlW2c2ybEYmAAAAAAAAAAAANB+VfdDWHD58A+A+27ZtU1pamiRVOftRmeHDhzu316xZU+kx5Zd4O9O5554r6XTB0d69e132+fn5Ocf//PPPlZmZWeH8Tz75RAUFBZWO4+7nUZlvvvnGuX3bbbdVedyQIUOcy+edeU55kZGRuvLKK6vcf+utt1Y6tnR6WT7pdDFXZQVMZSIiItSrVy9JdXuuACSLxVLh31dzKAZvVEVMp06d0tdff63k5GR99tlnMgxDY8eONTsWAAAAAAAAAAAA3Kx8wZKvr2+zWAYFgPusX7/euT148GAZhlHln5CQEOexhw8frrS/bt26VTlWVNT/ZpLKycmpsH/8+PGSpKKiIv3rX/+qsL9sKbn4+HhdcMEFHn0eldmyZYskyWq1qk+fPtUeO2jQIEnS7t27VVxcXOkxffv2rbawtE+fPrJarZKkzZs3O9t/++03HTt2TJL08MMPV/tcDcNw/mzq8lwBSIZhqH379kpISFD79u21a9cuFRYWmh2rwbxSzm6xWOp1XlJSkh566CE3pwEAAAAAAAAAAIDZys8W0BxmDwDgXkePHq3Xefn5+ZW2BwUFVXnOmUWUdru9wv4hQ4aoY8eO+u2337Ro0SLdfvvtLjnLZiMaN25chYJMdz+Pypw8eVLS6WKsmma1K1sizuFw6NSpU2rdunWFY2JjY6vtw9fXV1FRUTp8+LBzbMk7zxXAaZ06dZIkZWdnu/w7bMq8UsTkcDjqdLyvr6+uueYazZw502WtUQAAAAAAAAAAADQPlc3EBDQHEf4RWnXdKrNjeFWEf4RH+j2zmGjp0qVKSEio1Xk1FeDUh2EYuv766/Xkk09q9erVOnTokNq2bStJ+vDDD2Wz2SRVvmSdN59Hdcu3eaOfM5/ro48+qmuuuaZW5wUHB9drPADNi1deDf7tb3+r8RgfHx+FhoaqU6dOOv/88xUTE+OFZAAAAAAAAAAAADBD+aIlZmJCc+Fj+CgqIKrmA1Gj6Oho53ZERIR69uxpYprTBUpPPvmkSktL9d577+mBBx6Q9L+l5Lp166Z+/fpVOM8bz6NsObwTJ07IZrNVWxhatnSbYRiKjIys9JgjR45UO57NZnOZ/anMmc/Vz8/P9L8zAE1LoyliAgAAAAAAAAAAQMvBcnIAatK3b1/ndkpKioYOHWpiGunss89W7969tWnTJr377rt64IEHtHfvXq1Zs0ZS5bMwSd55HmXFQsXFxdq4caP69+9f5bFr166VJCUlJclqtVZ6zMaNG6sthtq0aZOKi4tdxpakzp07Kzw8XFlZWUpJSanXcwHQcvnUfAgAAAAAAAAAAADgXocOHdLmzZvVpUsXdevWTW3atDE7EoBGpl+/fmrXrp0kafbs2SosLDQ50f8KlTZs2KDt27c7Z2GSpOuvv77Sc7zxPC6++GLn9ltvvVXlcWvWrNG2bdsqnFPeyZMntXTp0ir3nznGmf1YLBYlJydLkr766itt37695vAA8F9eKWL6+9//rr///e86fvx4rc85deqU8zwAAAAAAAAAAAA0LzabTXl5eQoLC1Pr1q0VERFhdiQAjYyPj48eeeQRSdKePXt00003qaioqMrjs7Oz9corr3g00/jx42UYhiRp0aJFeu+99yRJgwcPVufOnSs9xxvPY+DAgc7Zl9588019++23FY7JysrS5MmTnZmmTJlSbZ9/+tOfKl1WbtWqVZo9e7Yk6dxzz9WAAQNc9j/88MOyWCwqLS3V1VdfrYMHD1Y5ht1u16JFi6o9BkDt+Pg0/XmMvLKc3GOPPSbDMHT11VerVatWtTrn5MmTzvMeffRRDycEAAAAAAAAAAAAADQ2d955p77++mt98sknWrx4sX755RdNnjxZAwcOVHh4uLKzs7Vjxw6tXLlSn376qQICAvTHP/7RY3natWunESNGaOXKlXr11VeVmZkpqeql5Lz5PN58800NGjRIxcXFSk5O1j333KPLL79cwcHB2rBhg5566int2bNHkvTAAw+4LANXXu/evbVt2zade+65evjhhzVw4EAVFRVp+fLlmjlzpnOpuVdffbXCub169dKzzz6r++67T9u2bVPPnj11xx136MILL1Tr1q1VWFioffv2ac2aNfrXv/6ljIwMbd682TlbFYDaOXnypNLS0lRcXKxBgwapoKDA7EgN5pUiJgAAAAAAAAAAAAAA6sowDH3wwQeaOnWq3njjDaWlpWn69OlVHh8bG+vxTDfccINWrlzpLGDy9fXVtddeW+053ngeffr00dKlS3XNNdcoOztbzz33nJ577rkKx91999168skna+zrj3/8o6ZMmVJpMZXVatWCBQs0aNCgSs+fNm2agoODNW3aNGVlZWnGjBmaMWNGpcdarVYFBATU4hkCKC8/P1/S6XuMr2/TLwFqtHNJlZSUSJL8/PxMTgIAAAAAAAAAAAAAMIufn59ee+01bdq0Sffcc4969eql8PBwWSwWhYeHq0+fPrrtttv0r3/9S9u3b/d4nquvvlr+/v7Ox5dccoliYmJqPM8bz+OSSy5RamqqHnnkEfXp00dhYWHy9/dXhw4ddMMNN+i7777TK6+8Uqtlp26//XZ99913uvbaaxUfHy+r1aq2bdvqpptu0oYNGzRu3Lhqz580aZL27Nmjxx9/XEOGDFGrVq3k6+ur4OBgde3aVX/4wx/0xhtv6NChQ0pMTKzX8wVasvL1NH5+fnI4HCalcY9GW4a1ceNGSarVzR4AAAAAAAAAAAAA0Lz16tVLL730Up3Oeeyxx/TYY4/VeNzIkSNr/eF/RESECgsL65TjTPV5HpI0ceJETZw4scbjYmJi9I9//EP/+Mc/6pHO1XnnnacPPvig3ue3bt1ajz76qB599NEGZwHgqnwRk2EYstvtJqVxD48UMS1cuLDS9n//+99av359tecWFRUpLS1Nb731lgzD0IABAzwREQAAAAAAAAAAACYpLS1VUFCQbDabSktLzY4DAADQ5FS2shlFTJWYOHGiDMNwaXM4HPp//+//1boPh8MhHx8fTZ061d3xAAAAAAAAAAAAYKLCwkKdc845kqRNmzbJYrFoyJAhFT5fAgAAQOUsFot8fHxcCsJtNpuJiRqu5oUu68nhcDj/VNZW3R8/Pz8NGTJEn376qUaMGOGpiF7x22+/6f7771e3bt0UHBysqKgoDRgwQDNmzFB+fr7bxvn88881ZswYtWvXTv7+/mrXrp3GjBmjzz//vNZ92Gw2vfHGGxo2bJhiYmIUGBioLl26aPLkydq6davbsgIAAAAAAAAA0FQ0pff5m5LyH7D5+PhQwAQAAFBH5WdjaupFTB6ZiWnv3r3ObYfDoc6dO8swDH355ZdKSkqq8jzDMBQQEKDo6GhZLBZPRPOqpUuX6sYbb1R2drazLT8/X+vXr9f69es1Z84cLVu2TImJifUeo7S0VHfccYfmzp3r0n7o0CEdOnRIS5Ys0e23365Zs2bJx6fqmrXjx48rOTlZ69atc2nfs2ePZs+erQULFuiVV17R7bffXu+sAAAAAAAAAAA0JU3pff6mpvwHbJUthwIAALzr8LffauPzz+vYzp0qKSiQX2CgYs46S33+9Ce1uegis+OhEn5+fioqKnI+poipEh07dqy0PT4+vsp9zc2GDRt03XXXqaCgQCEhIXr44Yd1wQUXqKCgQO+//77efPNN7dq1S6NHj9b69esVGhpar3H+8pe/OH+x6du3r6ZPn64uXbooLS1NzzzzjDZs2KA5c+YoJiZG//znPyvtw263a8yYMc4CprFjx2rSpEmKiorSTz/9pCeeeEJHjx7V5MmT1bZtW/3+97+v3w8FAAAAAAAAAIAmoim9z98U2e12l8cUMQEAYJ6Dy5ZpxbRpOpKaWmHfkbQ0bVm+XG0SEzXyhRfUbvRoExKiKszEVA9nrr/XUkydOlUFBQXy9fXVV199pcGDBzv3XXjhhUpKStL06dO1a9cuPffcc3rsscfqPMauXbv07LPPSpL69++v1atXKzAwUJI0YMAAXXHFFRoxYoTWr1+vGTNm6NZbb6302yALFizQ999/L0m666679Oqrrzr3DRw4UL///e917rnnKjs7W/fee6+2b98uX1+vXDoAAAAAAAAAAJiiKb3P3xQxExMANE779u0zOwK8bNfs2Vp2992y11D8cjg1VYuvukqjX31VXe+4w0vpUJPmVsTUfOYdbUTWrl2r7777TpJ02223ufxiU+b+++9X9+7dJUkvvviiSkpK6jzOCy+84LwAX375ZecvNmWCgoL08ssvSzp9oc6cObPSfsp+QYqKitKMGTMq7E9MTNTDDz8sSUpNTdUnn3xS56wAAAAAAAAAADQVTe19/qaIIiYAAMx3cNmyWhUwlbHbbFp29906uGyZh5OhtihiQo2WLFni3L7lllsqPcbHx0c33XSTJCkzM1MrVqyo0xgOh0P//ve/JUndunXTeeedV+lx5513ns466yxJ0r///W85HA6X/bt27dL27dslSddee62CgoIq7WfixInObYqYAAAAAAAAAADNWVN6n7+poogJAADzrZg2rdYFTGXsNptWTpvmmUCos/Kvocov2dvUuHVNsFtvvVWSZBiGc/3mM9vro3xfTUHZ0mzBwcE699xzqzxuxIgRzu2UlBRdcskltR5j7969Sk9Pr9BPVePs3LlThw4d0r59+9SpU6cKWWvqp02bNuratat27dqllJSUWuesD59Te6Vj9aiv8wuS/AIr35d/UlI9f7HzDZSslRd3qeCU5Kjncom+/pI1pPJ9hVlSaT0rJC1+kn9Y5fuKsiV73b8NJEny8ZUCwivfV5wr2Yrq16/hIwVGVtFvvmQrqF+/MqSgqMp3lRRIJflVnumTm6uo0mOnt0/slorK/T0FRVd+oq3o9M+ivgIiJZ9Krn1bsVScU/9+/cMlSyW3e7tNKsqqf7/WUMnXWrG9tFQqPNWAfkNO//uoTP6J+vfbhO8RRn6OAh15/90+IZUc4x4hmXaPqFEzv0fUeI8swz3iNF5HnOahe4SRl+96f7QUn9Ev94jT/fI6wskL94ha3yPLcI84jdcR/+PGe8SZ16ORd8z1Hunsl3uEE68jTvPgPcIn61Td7pFluEf8T3N7HVH2fAKjKh8fMFlTep+/qaKICQAAc2V8842OpKbW69zDqak6/O23anPRRW5OhbpqbjMxubWIaf78+TIMQ5JcCo/ObK8Lh8PRJIuYymY2SkxMlK9v1T/ibt26VTintrZt21ZpP7UZ58xfburaz65du3TgwAHl5eUpODi41nkPHjxY7f6MjAzndvC/rpPCeOMC5gmRNKnswYI3TUwCnBYq6d6yB2+8aGISgHskGhfuj2hsuEeiMXG5HmdxPcJ83CNRlZw7N8pRVYGWh+Tl5Xl1PDRNTel9/prU5f35nJwcZWdn17rvhigudi2yttlsXhsbzVdubm6l2+5ks9lUWloqh8PR5Ge7QM3O/Dvm77vlcDgcKi0t9cj/Td64T9XWL88+2+Dzhw4Y4KY0qK/ySxoXFxd77TVVTk4DvvhSBbcWMXXo0KHSYqWq2pujwsJCHT9+XJLUrl27ao+NjIxUcHCw8vLydODAgTqNc+YvHTWN0759e+d2+XHq04/D4dDBgwed09fWxpkZAAAAAAAAAECS5s2fpwKj9l+WdIesrAbMFocWoam9z1+Turw///bbbys8vIoZ8NysX79+slr/N/vil19+qczMTK+MjZbh7bff9ki/ffr0UXh4uEJCQnT06FGPjIHG6cSJBszgiialuLhYubm5ysrK0qeffuqxcTx1n6qtVmcUVNdHxtatev31192UBvUVFhamHj16OB8XFBR47e/FE79bubWIad++fXVqb47OrDQLCal5WuyyX27qWmVZl3HOnDGp/Dju6gcAAAAAAAAAgOagqb3P31RZLBaXx0196RMAAJoae1E9l+cuO7+4kqXr4XWFhYXKyMhQSUmJbDZbhZmZmhq3FjHh9AVS5sxvEFTF399f0ulqOE+NUzZGZeO4q5+a1PTNkIyMDA0cOLBOfQIAAAAAAABo2m6ZeIvXl5PbtWuXnnzySa+Oiaalqb3PX5O6vD8/YcIEtW3btk7919fmzZtdCpeuuOIKr80CheYrNzfXObPJhAkTalWIWFeHDh1SaWmp/Pz8FBsb6/b+0bjY7XbnDEzR0dEVCjDRPOXk5Cg0NFTh4eEaPHiwW/v2xn2qtpbMnq3sBswoFxgSonFTprgxEerLrOvq0KFDbv/diiImNwsICHBul1/PuTJF/61uDAwM9Ng4RWdUUJYfp3w/Zz6uSz81qWkq3DPlXf2BlNSlTv1LkvyCJL8qcuWflOSoe5+S5BsoWYMq31dwSnKU1rNff8laxc2jMEsqree3Tix+kn9Y5fuKsiV7PSsvfXylgCp+gSzOlWz1rNQ1fKTAyCr6zZdsdfuF/IyOpaCoyneVFEgl+VWemZubq/fef0+SNH7c+Io3+areWLMVnf5Z1FdApOTjU0m/xVJxA9YT9Q+XLJXc7u02qagBU/xZQyXfSt5cKS2VCk81oN+Q0/8+KpPfgKlam/A9IicnR/Pmz5N0+s3dUL9S7hGSafeIGjXze0SN98gy3CNO43XEaR66R+Tk5Wve+59I+u/9MTT0jH65R5zul9cRTl64R9T6HlmGe8RpvI74HzfeI868HsdNnKLQsEp+xtwj/ofXEad58B6Rm3WqbvfIMtwj/qe5vY747/MJDYyqfHwPOnNGG6AyTe19/prU5f350NBQhYVVcT93Mz8/P5ciJj8/P6+NjZYhJCTEI9fUkSNHZLPZZBgGBS0tjMVi4e+8hTAMQz4+PvL19fXo/02euk/VVmy3bjq6Z0+9z4/p1o3/uxshb15X2dnZbu+TIiY3O/ODk9pM6ZqXlyepdlPS1necsjEqG6d8P9UVMVXXjzuVRnaSYs5yb6fBrdzbH/16qV/PdFuTUv9snfSJOb0dnSQ16/9823im21APffukyV3D7unXYbeqwDj9D8IRFO25a7KR/xwq9uuZbnGmivcIt9wjuUfQr5v6dfhnu94fg8+4HrlHeAGvI8r369bXkY3w31zz6tcz3TYmZ16PjuAY13ukV3CPoF/Xfkt9PfC7NveIJsxD9wjATZra+/xNla+v60dUTX3pEwAAmpre992nLcuX1/v8Pvfd58Y0wGne/YpLCxAQEKDo6NPfIjp48GC1x546dcr5i0f79u3rNM6Z35yoaZwzp4otP059+jEMo07f3AAAAAAAAAAAoKloau/zN1XlZzOhiAkAAO+Ku/hitU5MrNe5bRIT1eaii9ycCHDzTEydO3d2Z3eSThfMpKWlub1fT+rRo4e+++47paamymazVfg2QZkdO3Y4t7t3717nMSrrp67jlO+nT58+NfbTvn17plwGAAAAAAAAADRbTel9/qaqVatWWr9+vWw2m6644gpn4RgAAPCeC154QYuvukp2W+2XFrf4+WnkCy94LhRaNLcWMe3bt8+d3Uk6XcTU1AwdOlTfffed8vLy9PPPP2vQoEGVHrdq1Srn9pAhQ+o0RqdOnRQfH6/09HSXfiqzevVqSVLbtm2VkJBQIeuZecaNG1dpH4cPH9auXbvqlRUAAAAAAAAAgKakKb3P31SFhobq+PHjkqTg4GBZrVaTEwEA0PK0Gz1ao199VcvuvrtWhUwWPz+NfuUVtRs92gvp0BK5tYjp5ptvdmd3TdZVV12lJ598UpI0b968Sn+5KS0t1cKFCyVJERERuuCCC+o0hmEYuvLKK/X6669rx44d+vHHH3XeeedVOO7HH390fkPjyiuvrFAU1rVrV3Xv3l3bt2/Xhx9+qOeee05BQUEV+pk/f75ze8yYMXXKCgAAAAAAAABAU9KU3ucHAABoiK533KGgtm21cto0HU5NrfK4NomJGvnCCxQwwaPcWsQ0b948d3bXZA0cOFDDhg3Td999p7lz5+rmm2/W4MGDXY557rnntH37dknS1KlT5efn57J/5cqVzl94br75ZpciojLTpk3T7NmzZbfbdc8992j16tUKDAx07i8oKNA999wjSfL19dW0adMqzfvAAw/otttu08mTJzV9+nS98sorLvvT0tKcv6wlJiZSxAQAAAAAAAAAaNaa2vv8AAAADdFu9GjdOHq0Dn/7rTbOnKljO3eqJD9ffkFBijnrLPW57z61uegis2OiBXBrERP+58UXX9SQIUNUUFCgSy65RI888oguuOACFRQU6P3339fs2bMlnZ4J6f7776/XGF27dtWDDz6op556SuvXr9eQIUP00EMPqUuXLkpLS9PTTz+tDRs2SJIefPBBJSUlVdrPzTffrLfeekspKSl69dVXdfjwYU2aNEmRkZFau3at/u///k/Z2dny8fHRSy+9VOXa3wAAAAAAAAAANBdN6X1+AAAAd2hz0UW6lGIlmIhqFA/p27evPvjgA914443Kzs7WI488UuGYrl27atmyZQoNDa33OP/4xz909OhRvfXWW9qwYYPGjRtX4ZjbbrtNTzzxRJV9WCwWLVmyRMnJyVq3bp0++ugjffTRRy7H+Pv765VXXtHvf//7emcFAAAAAAAAAKCpaErv8wMAKkpISNBvv/1W5Wx4Znrsscf0+OOPS5IcDofJaQCg8fAxa2CHw6G0tDStW7dO69atU1paWrO7QV9++eX69ddfdd9996lr164KCgpSRESE+vfv7/z2RGJiYoPG8PHx0dy5c7Vs2TJdeeWVio+Pl9VqVXx8vK688kotX75cc+bMkY9P9X/VrVq10g8//KDXXntNQ4cOVXR0tAICAtS5c2dNmjRJP//8s26//fYGZQUAAAAAAAAAoClpSu/zN1WGYaikpES5ubkqLS01Ow4AAABM5PWZmL744gu99tprWrlypfLy8lz2BQUFaeTIkbrrrruazYw/HTt21PPPP6/nn3++TueNHDmyTkVdycnJSk5Orms8F76+vpoyZYqmTJnSoH4AAAAAAAAAAGgumtL7/E2Jw+FQ//795evrqy1btkiSBgwYoKCgIJOTAU2P/fBhFf/8s+yHD8tRXCzDapWlTRtZzz1XljZtzI4HAECtea2IKT8/XxMmTNCSJUskVT4tXl5enpYvX67ly5friiuu0DvvvKPg4GBvRQQAAAAAAAAAAIAXGIZRoa2kpMSEJEDTZTt0SIVffin7gQMV9tkPHlTx+vWytG+vgFGj5Nu2rQkJAQCoG6/MPVpaWqrk5GQtWbJEDodDvr6+Gj16tB5//HG98cYbeuONN/T444/rsssuk5+fnxwOhz799FMlJyc3uyXmAAAAAAAAAAAAINlsNpfHFDEBtVeya5fy5s+vtIDpTPYDB5Q3f75Kdu3yUjLPSE9P15///Gf169dP4eHh8vPzU+vWrdWrVy+NHz9e8+fPV3Z2tqTTM+EZhqHffvtNkrRgwQIZhuHyZ+TIkS79nzp1SvPmzdONN96oHj16KCQkRFarVW3bttX48eP1zjvvqLi4uMp8+/btc/Y9f/58SdLHH3+s5ORkxcfHy9fXVyNHjtT8+fNlGIYef/xx57nlsxmGoX379rn15wcATYVXZmKaNWuWVq9eLcMwNGrUKM2ZM0dtq6j2PXTokCZNmqQvvvhC33//vd544w2WNwMAAAAAAAAAAGhmKGIC6sd26JDyFy+Wyv0bqvoEm/IXL1bwxIlNckam7777TpdddpmzSKnM0aNHdfToUW3ZskXvv/++WrVqpcsuu6xeY/Tt29dZ9HSmI0eO6MiRI1q1apXee+89LV++XG1qWKLP4XDopptu0ttvv12vLADQknmliGnBggWSTq9lvGzZMvn4VD0BVNu2bbV06VINGTJEa9eu1YIFCyhiAgAAAAAAAAAAaGbKFy1RxATUTuGXX9a+gKmMzabCL79UyK23eiaUhxQVFWncuHHKzs5WaGiopkyZogsuuECxsbEqLi7W3r179cMPP+iTTz5xnjNv3jzl5eVp1KhRSk9P15VXXqknnnjCpd/g4GCXx3a7XYMGDdJll12mvn37qnXr1iouLlZaWprmzZunFStWaMOGDRo3bpxWrlxZbeYXXnhBv/76q4YNG6YpU6aoa9euyszM1L59+3TVVVepf//+eu211/T6669LkjZv3lyhj6omBAGA5s4rRUzbt2+XYRi67777qi1gKmOxWPSnP/1J48aN0/bt272QEAAAAAAAAAAAAN7ETExorhwOhxz5+R7p2370aI1LyFV57oEDKtm7V5bYWDenkoygIBmG4fZ+U1JSlJ6eLkl69913K8y0dN5552n8+PGaOXOm8v/7M+/UqZMkyc/PT5IUERGhnj17VjvOf/7zHyUlJVVoHzRokC6++GK9//77+tOf/qRVq1bp22+/1UUXXVRlX7/++qtuuukm59Jx5UVERCj2jL+DmrIBQEvilSKmsptz165da31O2X8SnvjPDgAAAAAAAAAAAOZiJiY0V478fOU8+6zZMSqVv3ChR/oNfeABGeVmN3KHw4cPO7eHDx9e5XG+vr4KCwur9ziVFTCdady4cVq4cKE2btyoJUuWVFvEFBERoVdeeYXPuQGgHmqeFskNunTpIun0uqS1VXZs2bkAAAAAAAAAAABoPpiJCUBN4uLinNvz5s3zypgOh0OHDx/Wrl27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Z2RkaNu2bSoqKnJCVACAxqS4uFh//PGH0tPTK5S1bNlSkZGR9R8ULggkMQGotoKCAt1+++26+uqr9fHHH2v//v06c+aMcnJytGPHDs2cOVMdOnTQ0qVLK23r+PHj6tOnj6ZOnaqtW7cqNzdXubm52rhxox544AHdcsst5aa9laSbb75ZXl5ekqQFCxY4bL+4uFiLFy+WJA0ZMkRBQUFVupbc3Fzt2rVLr732WpWvxZ4VK1aoXbt2euGFF5SYmKisrCwVFhbq4MGD+vTTT3XllVfq/vvvr3Cdtnz00Ue6/PLL9dlnnyk1NVWFhYVKTU3VvHnzFBMTo0WLFjk8fubMmercubNef/117dixQ9nZ2SooKND+/fv13//+V7169dIzzzxT42sFAAAAAAAAADiXwWBQmzZt1L59+wplOTk52rp1q/Ly8pwQGQCgMcjPz9fWrVuVlZVVoaxdu3Zq164dy5vCLpKYAFSLxWLR8OHD9dlnn0mShg0bpk8++URr167V+vXr9cYbb6h169bKy8vT8OHDK53Z55ZbblFSUpIefPBBrVy5Ups3b9aCBQvUqVMnSdLSpUv1/vvvlzvGz89PN9xwgyTpq6++UkFBgd32ly1bplOnTkmS7rjjjipdyy+//KKlS5fqueeeq9a12JKYmKhhw4YpOztbbm5umjJlilatWqUNGzZo9uzZioqKkiS98847evzxxytta9KkSQoNDdVbb72l33//XatXr9ajjz4qDw8PFRYW6o477rAb54wZM/TII4+ouLhYl156qd599139+OOP2rRpk+bPn68+ffrIYrHo+eef15tvvlntawUAAAAAAAAANBxhYWGKjo6Wq6truf0FBQXaunWr9bNzAABqU2FhYYX7t66ururatatatmzppKhwoTA6OwCgvp3MLazxsT4eRnm6udosO5VXJIvFUqN2vdxd5e1u++V4Or9I5pKqtdvE16NG56+ODz74QN9//73c3Ny0ZMkSXXfddeXKL7vsMt1555268sortXPnTj300EMOl0vbuHGjVqxYof79+1v39ejRQ4MHD1bnzp11/PhxzZo1SxMnTix33B133KHPP/9c2dnZ+u677zR8+HCb7ZfO1OTv76+hQ4dW6VrMZrPS09PVs2dP3Xvvverfv3+VrsWWCRMmqKioSK6urvruu+80aNAga1lcXJxGjBihvn37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TD3yyCPl6qxfv14ffvihpLN/eMTFxdlsq/QXRkREhA4cOFDpuUuXkjMajRo1alSV4t2+fbu8vLysa3rbMmfOHH3wwQeSpObNm9da0hUuTPHx8Zo2bZqks29Gs7Oz9dprr+nLL7/U/v375e3trdjYWD311FO6/PLLrcelp6frzTff1Ndff60DBw7I09NTffv2VXx8vLp37+7wnCUlJVqwYIEWLFigLVu26NSpUwoICFDXrl01YsQIjR8/3uEf+NLZzP3p06frm2++0cGDB+Xn56dLL71UEydO1IgRIyq97tLX47PPPqv4+Hi79fr376/Vq1erX79+SkhIqLTdc+3YsUPffPON1qxZo507dyojI0Nubm5q0aKFLr/8ct177702Z3hLSEio8MFFVFRUhXqrVq2yOd30N998o/nz5+v3339Xenq6PD091a5dOw0bNkwPPvhgpescp6am6qWXXtKyZcuUlpam4OBgxcbG6sEHH9TAgQOr9yDYUdXnAAAAAAAAALgQ7N692zpjSceOHR3WLVuenJxcrSSm1NRUh+VHjx61bufk5Cg7O7vKbZ+P3Nxcm9vA+aBfNQx+fn7y8/NTy5YtVVRUpNzcXOXm5qqwsFAmk8l6f8kWR0udVcZRu3l5eSoqKrKZVGWPi4uLXFxcFBUVpf3799vsU7t27apxzHl5eXbjPZ/EooKCArvtenl5KTw8XNLZxysnJ6fG50HNME6hLjirX9XFGEISUx145JFH9Pnnn2v37t2aOnWq9u7dq5EjR8rLy0urVq3Siy++KJPJJC8vL73++uu1cs6kpCRt3rxZknTdddcpNDS0Ssdt3rxZ48eP14ABA/S3v/1N0dHRatKkiUwmk3bt2qX58+drxYoVks5OJzhnzhz5+PjUSsy48B0+fFgDBw7U7t27rfvy8vK0bNkyrVixQgsXLtSIESP0xx9/aMiQITpy5Ii1Xn5+vpYsWaL//e9/WrZsmd0/uk+dOqUbbrhBa9euLbf/xIkTSkhIUEJCgt5++20tW7ZMERERNttITk7WwIEDlZaWZt1XUFCgn376ST/99JPGjRunq6666nweilphKxFJOvuNrL1792rv3r36+OOP9dhjj+mll16qlXNmZmZq+PDh+vnnn8vtLyws1ObNm7V582bNmjVL3377rd3lMdesWaOhQ4eWe0N89OhRLV26VEuXLiXhCAAAAAAAALChbHJRq1atHNYtveEsnf1ctjrKHluZTz75xDqjSn365JNP6v2cuPjRry5MzZs3l4eHh4xGo9zc3GQ0Gq3brq6uDo/9448/9P3339ss69q1q3x9fasVS0lJiUpKSqyzItnqU126dKnxEp979+7VDz/8YLOsbdu2atq0qSTJbDbLZDKpuLjY4b9lt3/66acaxYT6xTiFulCf/SorK6vW2ySJqQ74+fnp+++/15AhQ7Rnzx7NmTNHc+bMKVfH399f8+fPV0xMTK2cs3QWJkkaPXp0tY41m8368ccf9eOPP9qt06RJE3344YcaNmxYjWPExWfEiBFKTU3V448/ruuuu07e3t769ddf9eyzzyo7O1t33323YmNjNXToUJ05c0YvvPCC+vXrJzc3Ny1fvlwvvPCCCgsLNXbsWO3Zs6fCbEpms1lDhw7V+vXrJZ2duez+++9XVFSU0tLS9NFHH+mbb75RcnKyrrnmGiUmJlZ4A5qdna3BgwdbE5huu+02jRkzRqGhodq9e7dee+01zZ07Vzt27KifB80Bk8kkHx8fXX/99br66qvVsWNH+fv7Kz09XTt37tSbb76pgwcP6uWXX1aHDh00btw467FxcXHavn27vv32Wz311FOSpP/9738KCwsrd46yszMVFhZq4MCB2rJli1xdXTVq1CgNGTJEUVFRKi4u1i+//KLXXntN6enpGjJkiLZu3VohUezQoUPWBCYXFxdNmDBBw4cPV0BAgP744w+9/PLLio+PV2xsbB0+cgAAAAAAAMCFp+w31yu7sV72y8XM2gDgYnbs2DG7ZQaDoUJiU9l/Hc0Icj7Ls5lMJrtlVV3+rlRJSYk12cjRDE6HDh3S4cOH7S5FBwAXK5KY6ki7du20detWvfPOO1q0aJH27t2roqIihYeHa8iQIfrnP/9pd9aY6iopKdH8+fMlSYGBgbrhhhuqfOyQIUP04Ycfav369dq6dauOHz+ukydPymKxKDg4WN26ddN1112nsWPHyt/fv1bidYaSEosy86s+PeSFLsjbXS4udb9+bWJiolavXq3evXtb98XGxqp9+/YaOnSocnJy1Lt3b1ksFm3YsEFt27a11uvVq5dCQkI0efJkHTp0SN9//32FpQrfe+89awLT6NGjNW/ePOv0mT179tSwYcP05JNP6sUXX1RKSoqef/55TZ8+vVwbzz//vPWbSS+++KIef/xxa1nPnj01fPhwDR061DrjmDPFxMQoNTVVgYGBFcoGDx6s+++/X0OHDtXKlSs1bdo0jR492vqtAx8fH3Xt2lWbNm2yHtOhQwdFRkbaPd9zzz2nLVu2KDAwUD/++KN69uxZrrxv376644471KdPHx09elRPPPGEdawp9fDDD1tnYPr00091++23W8tiY2M1YsQIXXnlleXiAgAAAAAAAHB2tvhS537B81weHh7W7TNnzlTrPJXN3HT06FH16tVLknTnnXeqZcuW1Wq/pnJzc60zBdx5553VniEFsIV+BXvy8/NVXFxsndXI1k9p2blKE5Vs9anU1FRlZ2dbE6tKf1xdXSvsMxqNcnFxOa+l4nDhY5xCXXBWvzpy5EitrSBUiiSmOuTj46OpU6dq6tSpNTq+qlm1Li4u1Z4+tlRoaKjuuusu3XXXXTU6/kKRmV+knv+2P9PUxWbzUwPVxNej8orn6aGHHiqXwFTq+uuvV0REhA4ePKiMjAy9++675RKYSo0bN04PP/ywCgoKtGbNmgpJTO+8844kqWnTpnr77bdtvqmbNm2avvrqK+3atUvvv/++nnvuOesf9EVFRfrwww8lSZdeeqkee+yxCse7ubnpww8/VJs2baqdLV/bQkJCHJa7u7trxowZiomJ0cGDB5WYmFgh8aiqcnNzrY/v888/b7ediIgIPf3007rvvvu0aNGicktKHjt2TF9//bUkaejQoeUSmEr5+flpzpw5NvsJAAAAAAAAcD5q4ybw3LlzNXbs2PMPpgY8PT2t20VFjr+EW3a2Di8vr2qdp7Kl6sry8/NzyheafX19L+gvUqNhol+hrKr2BYvFYp0pqbi4WFlZWdq2bZsk232qc+fOtR4rGg/GKdSF+uxXpZNd1CaXWm8RQKMxcuRIu2WXXnqppLMfJNx2220263h5eal9+/aSpH379pUrS0tLU3JysiTp1ltvtbuesNFotC6rlpmZqS1btljLNm/erMzMTEnSmDFj7H6o0apVKw0aNMjutThLYWGhDh06pKSkJO3YsUM7duwol9xY+qa5JlavXm1do3T48OEO61511VWSzn7TYPPmzdb9q1atktlslqRyS9udq1evXurSpUuNYwUAAAAAAAAuRmU/86xsibi8vDzrNjM2AEDdKV2yztvbWwEBAQoMDKz2DHgAgJpj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AAAAAAAAAMCpSGICAAAAAAAAAAAAAAAA4FQkMQGolvj4eBkMBhkMBklSdna24uPjFR0dLV9fX4WGhmrIkCFat25duePS09P11FNPqUuXLvLx8VGTJk104403auvWrZWes6SkRJ9++qmGDBmi5s2by93dXU2bNtWAAQM0a9YsFRUVVdpGZmamHnvsMXXs2FFeXl4KDQ3VwIEDtWjRoipdd+k1x8fHO6zXv39/GQwG9e/fv0rtnmvHjh3697//rcGDB6tVq1by8PCQr6+v2rdvrzFjxui3336zeVxCQoIMBoPGjRtn3RcVFWWNu/QnISHB5vHffPONRowYodatW8vT01OBgYGKjY3VtGnTlJmZWWncqampmjx5stq0aSNPT0+FhYXphhtu0I8//lijx8GRBQsWqH///goKCpKvr6+6du2qZ599VqdPn5ZU9ecKAAAAAAAAAAAAANBwGJ0dAIAL1+HDhzVw4EDt3r3bui8vL0/Lli3TihUrtHDhQo0YMUJ//PGHhgwZoiNHjljr5efna8mSJfrf//6nZcuWacCAATbPcerUKd1www1au3Ztuf0nTpxQQkKCEhIS9Pbbb2vZsmWKiIiw2UZycrIGDhyotLQ0676CggL99NNP+umnnzRu3DhdddVV5/NQ1IqEhASbj0NRUZH27t2rvXv36uOPP9Zjjz2ml156qVbOmZmZqeHDh+vnn38ut7+wsFCbN2/W5s2bNWvWLH377be67LLLbLaxZs0aDR06VNnZ2dZ9R48e1dKlS7V06dJaSyYymUwaNWpUhcSznTt3aufOnfr000/rJGkKAAAAAAAAAAAAAFD3SGICUGMjRoxQamqqHn/8cV133XXy9vbWr7/+qmeffVbZ2dm6++67FRsbq6FDh+rMmTN64YUX1K9fP7m5uWn58uV64YUXVFhYqLFjx2rPnj1yd3cv177ZbNbQoUO1fv16SVK/fv10//33KyoqSmlpafroo4/0zTffKDk5Wddcc40SExPl6+tbro3s7GwNHjzYmsB02223acyYMQoNDdXu3bv12muvae7cudqxY0f9PGgOmEwm+fj46Prrr9fVV1+tjh07yt/fX+np6dq5c6fefPNNHTx4UC+//LI6dOhQbtaluLg4bd++Xd9++62eeuopSdL//vc/hYWFlTtHVFSUdbuwsFADBw7Uli1b5OrqqlGjRmnIkCGKiopScXGxfvnlF7322mtKT0/XkCFDtHXr1gqJYocOHbImMLm4uGjChAkaPny4AgIC9Mcff+jll19WfHy8YmNjz/vx+de//mVNYLrkkks0depUXXrppcrKytKiRYv0/vvv67bbbjvv8wAAAAAAAAAAAAAA6h9JTGgcSkqkM6ecHUX98QqWXOp+tcjExEStXr1avXv3tu6LjY1V+/btNXToUOXk5Kh3796yWCzasGGD2rZta63Xq1cvhYSEaPLkyTp06JC+//573XzzzeXaf++996wJTKNHj9a8efOsy9j17NlTw4YN05NPPqkXX3xRKSkpev755zV9+vRybTz//PM6fPiwJOnFF1/U448/bi3r2bOnhg8frqFDh2rFihW1++DUQExMjFJTUxUYGFihbPDgwbr//vs1dOhQrVy5UtOmTdPo0aPl6uoqSfLx8VHXrl21adMm6zEdOnRQZGSk3fM999xz2rJliwIDA/Xjjz+qZ8+e5cr79u2rO+64Q3369NHRo0f1xBNPaP78+eXqPPzww9YZmD799FPdfvvt1rLY2FiNGDFCV155Zbm4amL79u166623JEk9evTQ6tWryyWsXXPNNbr88ss1ZsyY8zoPAAAAAAAAAAAAAMA5SGJC43DmlDSjbeX1LhaPpEg+IXV+moceeqhcAlOp66+/XhERETp48KAyMjL07rvvlktgKjVu3Dg9/PDDKigo0Jo1ayokMb3zzjuSpKZNm+rtt9+2JjCVNW3aNH311VfatWuX3n//fT333HPy8PCQdHYZtg8//FCSdOmll+qxxx6rcLybm5s+/PBDtWnTRsXFxdV/EGpRSIjj58zd3V0zZsxQTEyMDh48qMTExAqJR1WVm5trfXyff/55u+1ERETo6aef1n333adFixZpzpw58vHxkSQdO3ZMX3/9tSRp6NCh5RKYSvn5+WnOnDk2+0l1vPfeeyopKZEkzZkzp8KMW9LZRLfPPvtMy5YtO69zAQAAAAAAAAAAAADqH0lMaHBMJpOKioqqXL+kpEQWi6XSOnU/L1HDZ7FYKn2s7DEYDBWSiEaOHGm33ejoaB08eFAGg0EjRoywJqCU5eHhofbt22v79u3at29fubK0tDQlJydLOrtsnY+Pj802XFxcNHbsWD322GPKzMzUpk2b1KdPH0nS5s2blZmZKUkaM2aMNf5z4w0LC9O1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jBF/4X3EWXU5RjRv3rxaY2RV2mWMOKuxvY8AAAAAAFy8SGJCg2M0GiskxDji4uJS6Qdsjj7wOh911a7BYKiTZbPqs92y/6/J4xQWFqZOnTopOTlZixYt0vTp0+Xr61uhntls1n//+19JZ2cGio2NtZ6vZ8+eCgoKUmZmpj755BNNmTLFGmvZ+I4cOaKVK1eWi730w2CDwSAXFxdFRUVp27Zt2rx5s92Yly9frtOnT9u97rL/d3FxKff/sn343ESpsvHOmTOn3P5zz1E2Uaq4uNjuYz9w4EB5e3srPz9fb7/9tkaOHFntvnH11VfL1dXV+hzccsstFeKVziY47dixw/r/mvSHgQMHas+ePdq+fbu2bdtWLgmrrNIPxEvjqOq5ytYrPa4645A9VV2mr7oc3XxpTO26uro6vLHT0NqtrX5VX+0aDAab7bq5uclkMlm3q3tue+3Whrpqt65ey4wR59+uo2MZI+q23bp6LV/oY8T5jpH22q1NDfG17Ix2G8MYUbY/2nuvzxjxF95HnFWXr+XaHCPLtlsXGsMY4cx26/K1DAAAAAC4sF34a04BuGhNnjxZkpSRkaEHH3zQZp1p06YpKSlJknTPPfeUm4nIw8ND48aNk3R2JqAZM2ZUON5kMumee+5RUVGRw1j69esnSfr999+1du3aCuXHjh3TAw88UIWrsq3st9bLJuKU9e677+rbb7912E6LFi2s2ykpKXbrBQYG6v7775ckrVu3TlOmTHGYDHj8+HF98MEHFc514403SpKWLFmiL774osJxubm5mjhxosOYq2LixInWGy8TJkywOSPW/Pnz9cMPP5z3uQAAAAAAAAAAAAAA9Y8kJgAN1qRJk6zTi8+dO1fXXHONvvzyS23ZskXff/+9/v73v+v555+XJLVt21ZPP/10hTaeeeYZtWrVSpL06KOPatSoUVq+fLm2bNmizz77TJdffrmWLVum2NhYh7FMmDBBRqNRFotFw4YN0+uvv65NmzZp3bp1mjFjhrp3766srKwaL6HRvXt36xJ6s2fP1m233abvvvtOmzdv1rfffqsRI0bovvvu0xVXXFFpO56enpKkp59+WitXrtTu3bu1d+9e7d27V2fOnLHWfe6559S7d29J0htvvKEePXronXfe0dq1a5WYmKhVq1bp7bff1k033aTWrVvrvffeq3C+V1991boEwKhRozR58mStWrVKmzdv1ty5c9WzZ09t3bq10se3Mt26dbMmtW3atEmxsbGaN2+eNm/erJ9//ln33nuvRo8efd7nAQAAAAAAAAAAAAA4B8vJAWiwXF1d9d133+mGG27Q2rVr9fPPP+vnn3+uUK9Tp05atmyZzeXmAgICtHz5cg0cOFDHjh3TwoULtXDhwnJ1xo4dq379+llnbbKlS5cueuWVV/R///d/yszM1JQpU8qVBwcH65tvvtHTTz+tPXv2VPtaDQaDPvnkE1199dXKzMzUF198UWFmo+joaC1atEhhYWF22/Hz89ODDz6oV155RVu2bNGgQYPKla9atUr9+/eXdHamqpUrV2rs2LH66quvtG3bNuvsTLb4+/tX2BcZGaklS5bohhtuUE5OjmbNmqVZs2aVq/PMM8/IYDBo06ZNlT0MDr322mtKS0vTV199pV27dlV4vqKiovT555+rbdu253UeAAAAAAAAAAAAAED9YyYmAA1acHCwfvnlF3388ce67rrr1KxZM7m5ualJkybq37+/3n77bSUmJioiIsJuG126dNHOnTs1depUtW/fXh4eHgoJCdGAAQO0YMECzZ07t0qxTJkyRcuXL9fgwYMVFBQkDw8PRUVFafLkydq6dauuvPLK87rWmJgYJSYmatKkSYqIiJCbm5uCg4PVq1cvzZw5Uxs2bCi3XJw9L7/8st5//31deeWVCg4Olqurq926fn5++vLLL7VmzRqNHz9el1xyifz8/GQ0GhUcHKy4uDhNnjxZP/zwg1auXGmzjf79+2vnzp269957FRERIXd3dzVr1kzXX3+9li9frmnTptX4MSnLzc1NX375pT755BNdeeWVCggIkLe3tzp16qQnnnhCmzdvVps2bWrlXAAAAAAAAAAAAACA+sVMTACqJT4+XvHx8ZXWmzdvnubNm1dpvYSEhErruLi46M4779Sdd95ZeYB2BAcHa/r06Zo+fbrN8rFjx2rs2LGSJLPZrPT0dJv1Bg8erMGDB9s9j6PriYyMlMVicRhn69at9e677zqsU1kbBoNB48eP1/jx4x3WK6tv377q27dvleufKzw8vMIMTGVVtd9UxT/+8Q/94x//qJW2AAAAAAAAAAAAAAANAzMxAQAAAAAAAAAAAAAAAHAqkpgAAAAAAAAAAAAAAAAAOBVJTAAAAAAAAAAAAAAAAACciiQm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", "text/plain": [ "
" ] @@ -241,7 +235,7 @@ }, { "data": { - "image/png": "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rVu31vPPP1/lPp555hlz+Y477tDrr78uHx8fhzbDhw/XP//5T/P2G2+8oZMnT1Y/8Gr47rvv9Ntvv0mSfHx89M0336hz584ObSIiIrRo0SK1bNlSknT69Gm9/vrrNd73hg0btGDBAvP29OnTdc8995Rp16pVK/3444/mL+c3btyozz77rMb7rypeU2sEBgbq7bffdqgw8e2335pVpoAL3dtvv20u33fffS5tU1qVo6ioSO+9915thFWp559/XgUFBZKk3r17a/bs2QoMDHRoM3DgQIfzstmzZ2vXrl11Gqer+vTpo2+//Vaenp7mffbjPYDa5+vrq2nTppn/D/nyyy+1cOFCp23fe+89rVy5UpLk5+enadOmyWaz1VWokqSPPvpIBw4ckCQ1aNBA//3vf8tUE23evLm+//57NWjQQJK0d+9eTZ8+vcJ+g4KCdPvtt5vtv/vuO/cHDwAAgIsCSUwAAABAPXDdddc5XNBfsmSJhdGcPz7++GNzufRL8/IUFBToo48+Mm+/9NJLCggIcNr2sssu04gRI8zb77//fg0jrbmXXnrJnN5sypQp8vPzq9L269atM6fI8fDwqDA55C9/+YvatGkjScrMzNQnn3xSzairx/75HjFihDp16uS0XWBgoF566SXz9ocffmhOE1hdX375pbl82WWXafjw4eW2DQsL09/+9jfz9jvvvFOjfVcVr6n1Hn30UYfby5cvtyYQoA7t3btXK1askFQyBVSLFi1c2u6mm26Sr6+vJJlTy9WlEydO6D//+Y95+/XXXy83+fmaa67R4MGDJZUkXf373/+ukxiro3Pnzrr++uvN25xDAnWvV69eGjdunHn7gQceMH84USoxMdEh+XzixIlq27ZtXYVosj8ne+KJJxQVFeW0XXR0tB5//HGn25XnT3/6k7lcWdITAAAAUB6SmAAAAIB6olevXuZyQkKCw7qRI0fKZrPJZrNp5syZlfY1c+ZMs/3IkSNrHNvu3bv11FNPqUePHoqIiJCPj4/8/PzUuHFjXXHFFRo1apRmzZqltLS0SvsqKCjQJ598oj/96U9q2bKlgoODFRgYqBYtWmj48OFasGCBDMOotJ+EhAStXr1aktS2bVt16NChwvbLli0zLyYEBwfrj3/8Y4Xt7Z+3H3/8UdnZ2ZXGVFu2bNmif/zjH5Kku+++27ywWhX2vwgfPHiw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e66IiAhz+fjx49Xqo6rOpzHzXL///rvGjRvncF9ppaMtW7Y43P/kk09WmrRSFyIiIuTn56fc3Fxt375dK1euVO/evavcz5IlS5Sfny9JuuWWW8yKQRW58sorFRgYqOzsbJeT+KpizJgxZqLYxx9/rKuvvrpMm/z8fDP5Sqp8KrlS9957r0ttSqfeW7p0aZn19p85d955p0v7HThwoDk13YoVK3TLLbe4tB3Kt2/fPnPK11LVTeZzp7o4J/Py8lJoaKhZCfD48eMuT10HAAAASCQxAQAAAHVi3bp15pQS5QkODtY777yjUaNG1VFUFYuLi1OPHj20Zs0apaen64orrtA999yjYcOGqXfv3uVOC3Iu+y/wly5dqkOHDlW6jf0F8CNHjpRZn52dbS67Goefn585RUbpBbHK2E8v5Oqvld1h3Lhx5hf/H374ocPFg+o496Jffn6+SxcCrXj89nFZ9Tp9+umnio+P18mTJ5Wdna3hw4fr+eefV48ePeTn56cDBw5oxYoVKigoUEBAgPr06aMffvhBUsn7uC7wmtYPvXr10uzZsxUTE1NuG3ePgZs3bzYvQgYEBFiWsLBz5049/fTT+v77712aJk5SmWReZypLcpIck2fsK76Usq/q0aFDB4WEhFTaZ31I/KhMUlKSxo8fr6+++srl6e9cec67dOkiT09Pl/qrzufvuey3s++vNjkbM11RH8ai3bt3OySmOePj46OJEydq/PjxdRRVxXx8fHTzzTdr3rx5Kiws1MCBA3X77bfr1ltvVd++fZ1Op+mM/fi5devWMslclSlNrHSlCpKr7r33Xo0fP165ublatGiRTp06VSahb+HChea0XZ06dVL37t0r7TciIsKlinA9e/Y0lzdv3izDMBySY+yfs6lTp2rWrFmV9llaVVByft5dXf369bvgpopzhWEYGj16dJnkyX/9618aPny44uPjLYqs7s7JAgICzP/L1NU4DwAAgAsHSUwAAACARYKCgtSwYUNddtllGjx4sO69916XL+rUlY8//lgDBw7UiRMnlJWVpSlTpmjKlCny8vJSly5d1LdvX1199dUaNGhQuRdAk5OTzeXvv/++yjGUfgFeHvuL/RUJCgoyk5hcraZg3y4oKMilbWpq0aJF5hRmI0eOVP/+/Wvc57mx5+TkuJTwYsXjt9+PVa9T8+bNtWrVKv3xj3/U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008/qWnTpho8eLAaNWqkAwcO6NdffzUv4sfGxjq9QH++GjRokJ577jm9/PLLkkouynzyySfq06eP/Pz8tGHDBoeLOkOGDNHf/vY3S2L97LPP1L17dx07dkyJiYnq0qWL+vXrp1atWik1NVVLliwxEza8vLz0xRdfuG1aotOnT+ull17SSy+9pLZt26pTp05q2LChMjMztWfPHoeLi35+flq0aJFZEamu8ZrWD48//rjeffddZWdnKzs7W2+99ZZeffVVc31tjIHTpk3ToUOHtHbtWhUVFemFF17Q66+/rt69eysuLk6GYejo0aNav369mazpLEHplltu0d/+9jcZhqHFixfrsssuU69evczqUpJ0xx13qFu3bpKkESNG6M0339TevXuVl5ene+65R6+++qo6d+4sPz8/bd++XevXr5ckde7cWVdffbVef/31Gj2/1REZGakPP/xQt99+u4qLi7V+/Xq1b99effr0UevWrZWdna0VK1aYVWDefvttc2pA++nbzvXQQw9pypQpSk5O1pkzZ9S3b1/17t1b7du3V25urtavX6/du3dLKkkIdMfF/qFDh6pv375avny5DMPQE088offff1+XX365QkNDtW/fPq1atUpFRUWKjY3VI488oqeeeqrG+y3PXXfdpZdeeklSyQX4Z555xqXtMjMz9fPPP0sqqbhjxcXt9u3ba8qUKRo9erSkkqm5vv32Ww0cOFAhISHauXOnQ4LhZZddpnfeeafO43S3V155RUuXLlVxcbG2bNmitm3bauDAgYqNjdXp06e1fPlypaSkKCgoSK+99prDNJnVdezYMb344ot68cUXFRUVpS5duigqKkpeXl46ceKENmzY4DCVVp8+fXTHHXeU6ScmJkaLFi3Stddeq5MnT2rPnj26+uqrFRsbq+7du6tRo0YqKCjQyZMntX379gorGdWGMWPGlHm/lR5fVdGzZ0+Fh4drwYIF6tatm3r06KEOHTooLy9Pq1evdkis7tChQ5mqf/ZGjhyphIQETZo0SZI0e/ZszZkzR126dFH79u0VFBSkrKwsJSUlafPmzU4TXOuj0ipwroiJiTETkeLj4/Xee+/p/vvvV3FxsX777Td16tRJl1xyiTp16qTQ0FBlZWVp9+7d2rRpk0Ml2meffbbC6SQfe+wxc9rUFi1aOEwzXJ5evXrp/vvv1/vvvy+p5HNl0KBBatCggcuPrya8vb31n//8R1dddZWysrK0adMmtWnTRoMGDVJsbKySkpL0yy+/mEnxISEh+s9//uNSZcxffvnFPJ6uu+668+Y8DgAAAPWMAQAAAKBW9OvXz5BkSDJeeOEFt/T54osvmn06+2vXrp2xfft2Y8aMGeZ9I0aMcNrX0qVLzTb9+vUrs/7LL780bDZbhfsr/fPw8DAeeOABIz8/v8L4N2/ebFxxxRUu9SnJaN68ubFp06Zy+5s2bVq1nuOvv/7aiIiIqHDfXbt2NXbv3l1pXwkJCQ7bzZ492+U4auLgwYMO+z148KBL2xUXFxuTJk0yvL29K3z8d9xxh5Genl5pf9OnT3fY7vDhwzV8ZP+za9cuo0uXLhXG2ahRI+Pbb7+ttK9zn68ZM2aU23bu3LkuHZ/dunUzNmzY4PLjadq0qbntn//8Z5e3q8zF+poahvufU/txsapfmTz55JPmdsHBwcbp06fLtHH3GHj27FljzJgxhqenZ6V9+fn5GRkZGU77eeaZZyrc9tz3y549e4yWLVtWuE3v3r2NpKQk44UXXqh0nHaljb3KPr/szZkzxwgKCio3Tl9fX2Pq1KnG3r17zfs6d+5cYZ8bNmyo8DPEx8fHeP/99w3DMFw6npo1a1bpWH78+HHj8ssvr/A579ixo7Fjxw6XzgFcaVORq666ypBk2Gw2IyEhwaVtPv30U3Ofjz/+eKXt+/bta7YfOHBglWOsyEcffWQEBgZW+HwOGjTISE5OrrSvX375xWG75cuX1zi+ESNG1Oj1cebjjz+ucKyIjo42li9f7tL7y/4ztVmzZmXWr1mzxvDy8nJ5rLv11lvLHZ9KJSYmGoMGDXK5z8jISOO///2vy89PdZ/zlJQUw8fHx+F5LCgocGnbc5/r9PR04/rrr6/wcV155ZXGsWPHXOr/888/N2JiYlx+zrp3727k5uY67ct+nKro+bEfzysbnytz7mdyVf6cHZeLFy92OG+o6C8iIsKYPn16hfH98MMPDtv89NNPLj+2jIwMIy4uzty2vHOYCRMmmG08PDxc7t8Vq1atMlq0aFHh89CyZUtj9erVLvc5evRoc9tvvvnGrfECAADg4sF0cgAAAMB5ZMKECVq1apWGDx+uJk2ayMfHRxEREerRo4fefvttrV+/Xpdccolb9nXrrbfq2LFjmj17tv7yl7+oR48eaty4sXx8fOTj46NGjRqpd+/eevrpp7Vt2za9//77lU6n1blzZ61fv14//PCD7r//fl122WWKiIiQl5eXAgMD1bx5c1199dWaMGGCVq5cqYSEhAp/dX3XXXepUaNGkqTp06c7/HK6IjfccIN27typyZMnOzyuuLg4/eEPf9CsWbP0+++/q127dpX2ZT8lVmhoaKXT41jNZrPpueee05YtW/TYY4/p0ksvVWhoqAICAtSqVSvdfffd+umnnzR37lyFhIRU2p/94+/bt6/i4uLcFmv79u31+++/a9asWfrDH/6guLg4+fj4qHHjxurRo4def/117dy5U9ddd53b9imVTHG0YMECjRs3TvHx8WrSpIl8fX0VFhamDh06aMSIEfr222/1+++/6/LLL3epz7S0NIfpe+6++263xXuxvqa1+ZxWxxNPPKGAgABJJRVn3n777TJt3D0G+vv7a+rUqdq+fbueeeYZde/eXY0bN5aXl5f5+g8bNkwffPCBjh496lBdyd6rr76qxYsX69Zbb1WLFi3Mx1Getm3batOmTXr11VfVrVs3BQcHy9fXV82aNdP111+vzz77TL/++qtiY2Ndfv5qy5133qmdO3fqySefVMeOHRUUFKTg4GB16NBBjzzyiDZv3qwxY8Y4VBWsrHLE5Zdfrt27d+tvf/ubOnXqpKCgIAUEBKht27Z68MEHtWnTJj3wwANufRyRkZFatWqV3nvvPV111VUKCwuTj4+PmjRpokGDBmnq1Klat25dhdOeuVPpFJWGYWjatGkubVPaztPTU+PGjauwrWEYDlXk3P3+Hj16tHbu3KkJEyaoa9euatiwoXx9fdW8eXPdcsstmj9/vn766SdzGrOK2I+ZrVq1Us+ePd0aq7v8+c9/1tatW3XfffepRYsW8vPzU1hYmLp27aqXX35ZW7duNaf9rKkrr7xSKSkp+uKLL/Twww+rT58+iomJka+vr7y8vBQeHq74+Hg99NBD+v333/Xll1+WOz6VatasmZYsWaJVq1bpr3/9q6644go1btxY3t7e8vf3V5MmTTRgwAA9+eST+umnn8xpJGtbo0aNdNVVV5m3R4wY4VLFGmdCQkL09ddf64svvtB1113n8Bk5ePBgzZgxQ6tWrVJUVJRL/f3pT39SQkKCZs6cqeHDh6t169YKDQ2Vp6enQkJC1KFDB91yyy365z//qT179uj33393y3SC9dW1116r/fv3a86cObr33nvVvn17hYeHy8vLS6GhoWrVqpVuu+02ffjhh0pMTNSoUaPK7SsrK0tjx441b48aNUqDBw92OZbg4GD9+9//Nm9Pnz7d6fSc9uOLu8fBnj17auvWrXr//ffVr18/RUdHy8fHR9HR0erXr5/ef/99bdmypcLp8exlZWVp3rx5kqQ2bdq4/fwcAAAAFw+bYTipJQ4AAAAA54lXX33VnDpvwYIFuvnmm+t0/4888oj+9a9/SZImTZqk5557rk73b7XOnTubF1h+++03hwt5+J8FCxbolltukVQyBdySJUssjqh858trej49p6j/PvroI/OC9P/93/9pypQpFkdUvxUXF+uSSy7R7t27FRkZqcTERPn5+ZXbfufOnbr00ktlGIbuvPNOzZkzp8L+N23aZCaJtmvXTjt27JCnp6dbH4O73HTTTfr6668llUxPZ3VCJepWdna2oqKilJWVJZvNpr1796p169Yubbts2TINGDBAktSvXz8tW7asFiPF+aa4uFgRERFKS0uTt7e39uzZoxYtWlgdVrmmTJliJvBOnTpVY8aMsTgiAAAAnK+oxAQAAADgvPbwww+b1ZgmT55c5/sv/dV048aNzcoUF4uTJ09q27ZtkqRrrrmm3ia71Af2v65/9dVXLYykYufTa3q+PKc4P3z++efmcnx8vIWRnB88PDz04osvSpJOnDihmTNnVtj+9ddfl2EY8vLyMreriP37+6WXXqq3CUxFRUVavny5JOnSSy/VnXfeaXFEqGuff/65srKyJEn9+/d3OYEJqMymTZuUlpYmqaR6XH1OYCoqKtIbb7whqaQiXUVVrAAAAIDKkMQEAAAA4LwWFBSkl156SZK0Zs0a/fDDD3W275SUFO3YsUOS9MwzzygoKKjO9l0fLF26VIZhyGaz6ZVXXrE6nHqt9IL8TTfdpO7du1scTfnOp9f0fHlOUf/Nnz9fP//8syTJz89Pw4YNszii88Ntt91mTjP097//XXl5eU7bHThwQJ999pmkkipXriR5lL6/u3btqttuu81NEbvfxo0bdebMGUkl1Rg9PPiq9WJiGIbeffdd8/b//d//WRgNLjSl46C/v7+ef/55i6Op2Jw5c5SQkCCp5Ecl1Z1SEQAAAJBIYgIAAABwARg7dqw57czTTz+t4uLi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oIqKimSz2fTVV19p6NCh7n2XX365UlJSNGvWLKWnp2vevHmaM2fOOY3XvXt3denS5dxCo1nY7Xbt3bvX/djhcOjw4cNq3769bDY+agMAoKXo1KmTjh8/ruLiYnfbvn37FBcXp4CAABOTtR4sJwcAAAAAAAAAAFDB+vXrtWbNGknStGnTPAqYys2cOVM9e/aUJC1YsEBlZWVezQjvycjIUGlpqUdbcnIyBUwAALQwVqtVycnJHm1lZWXav3+/SYlaH4qYAAAAAAAAAAAAKvj444/d21OnTq32GIvFokmTJkmSzpw5oxUrVngjGrwsLy9PmZmZHm2xsbFq06aNSYkAAEBziouLq/J9/ujRo8rNzTUpUetCERMAAAAAAAAAAEAF3333nSQpLCxMAwYMqPG44cOHu7fXrl3b7LngXS6XS7t37/Zos1gsSk5OlmEYJqUCAADNrVu3brJYPMtp0tPT5XK5TErUejDPJQAAAAAAAAAAQAU7duyQVPeSYT169KhyTmNNnTpVu3bt0smTJxUZGank5GRdeeWVuvvuu9WhQ4dG93v48OFa9x89etS9nZeX57VZBvLz86vd9iUnT55UXl6eR1vbtm1VVlbG8oE+yh+uK/gXrik0Na4p/9GuXTsdOXLE/bigoEB79+5VQkKCiamqZ9Z1Vfl9UlOgiAkAAAAAAAAAAOC/iouLdfLkSUlSx44daz02JiZGYWFhKigo0KFDh85p3JUrV7q3T506pVOnTuk///mP5s2bp2effVZ33nlno/pNSkqq97FvvvmmoqKiGjXOuXjzzTe9PmZdAgICdOGFF3oUsRUVFenjjz9mFgY/4YvXFfwb1xSaGteUbzMMQ3379lVoaKi77eDBg/r00099upjZm9dVTk5Ok/dJERMAAAAAAAAAAMB/VfyL8vDw8DqPLy9iauxfvZ933nkaN26chg4d6i442rdvn/71r3/pgw8+UHFxse666y4ZhqE77rijUWOg4Tp16lRlFq79+/dTwAQAQCvhcrm0b98+9enTx91mtVrVqVMn7d2718RkLRtFTAAAAAAAAAAAAP9VXFzs3g4MDKzz+KCgIElnZ+lpqOuvv16TJ0+WYRge7YMGDdKECRP02Wefady4cSorK9OMGTN0zTXXqF27dg0ao64Zoo4eParBgwdLkm699dZzWrquIfLz890zBdx66631Khjz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4sWSzs4MdNFFF7n3DRgwwD1b0Jtvvlnj8muZmZn66quvas3TtWtXSbUXEX3xxRdVlt+sr4qrIdU2m9NLL71Uaz/BwcHu7ZKSkhqPu/LKKxUaGipJ+tvf/taopelGjhzpXtru9ddfr/G4DRs2KC0trcH9A74uPz9fBw8e1NatW/X9998rMzPT7EjNwitFTKNGjZLL5dLzzz9fr2qw7du3a/HixTIMQ6NHj/ZCQgAAAAAAAAAAAABAa3XvvfdKOru60AMPPFDtMY899ph74o7bb79dQUFB7n1BQUGaOnWqJGnz5s2aO3dulfPtdrtuv/12lZaW1ppl+PDhks7OClXdzEXHjh3T/fffX49nVb2UlBT3dnlRVmUvvviiPvnkk1r7ad++vXt77969NR4XHR2t++67T5L0/fffa8aMGbXWDWRlZemVV16pMta1114rSfr000/1z3/+s8p5+fn5uvPOO2vNDPirI0eOaP/+/crOzpbdbldOTo7ZkZqFV4qYHnjgAYWFhWnv3r266667PCo7K/v66681atQoFRcXKzY2Vrfffrs3IgIAAAAAAAAAAAAAWqm77rpLQ4cOlSQtWrRIV1xxhT788ENt2bJF33zzjcaPH68//elPkqRu3brpkUceqdLHo48+qo4dO0qSfvvb3+qXv/ylvvzyS/34449asmSJfvazn+mLL77QwIEDa81yxx13yGazyeVy6eqrr9azzz6r1NRUff/995o7d6769++vnJwcj2Kkhujfv797Kbx//OMfmjBhgj777DNt3LhRn3zyicaPH6977rlHw4YNq7Of8tmYHnnkEX399ddKT0/Xnj17tGfPHhUVFbmP/eMf/6ghQ4ZIkhYsWKCLLrpIzz//vNauXavNmzdrxYoVeu6553TdddepU6dO1c4CNW/ePPdSe7/85S917733asWKFdq4caMWLVqkAQMGaNOmTXW+voA/ioqK8nick5PTqFnNfJ3NG4O0bdtWL730kiZNmqRXX31Vy5cv15gxY9z7FyxYIJfLpbVr12rnzp1yuVyyWCxavHixwsPDvRERAAAAAAAAAAAAANBKWa1WffbZZ7rmmmu0du1a/fvf/9a///3vKsf17NlTX3zxRbWfY0dFRenLL7/UlVdeqWPHjundd9/Vu+++63HMlClTNHz4cPesTdXp3bu3/vrXv+rXv/61Tp8+rRkz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hg26//77NW7cODmdTo9zfvGLXyg4OFiS9M4779Taf1lZmT744ANJ0ujRoxUTE9Msz6M2X331lZKTk/XEE09o8+bNysnJUUlJiQ4cOKC33npLl156qe67774qz7M6r732mn72s59pyZIlOnz4sEpKSnT48GEtXrxY/fr10/vvv1/r+U8//bR69eqlZ599VmlpacrNzVVxcbH279+v119/XYMHD9ajjz7a6OcKtGbMxORlkyZNksvl0sKFC82OAgAAAAAAAAAAgGbQUmcRANB0XC6XbrjhBvfkF1dffbXefPNNrV27VuvWrdOCBQvUqVMnFRQU6IYbbqh1dp9x48Zp+/bteuCBB/T1119r48aNeuedd9SzZ09J0tKlS/Xyyy97nBMeHq5Ro0ZJkj788EMVFxfX2P8XX3yh7OxsSdLNN9/cbM+jJps3b9bVV1+t3NxcBQQEaMaMGVqxYoXWr1+vf/zjH+ratask6fnnn9fDDz9cZ1933XWXEhIS9Pe//13/+c9/tGrVKv32t79VUFCQSkpKdPPNN9eYc+7cuXrooYdUVlamCy64QC+++KK++eYbpaam6u2339bQoUPlcrn0pz/9SX/7298a/FyB1q6lvofy2VKsTp06SZK2bt1qchIAAAAAAAAAAAA0B2ZiQkvkdDl1puSM2TG8KjooWhajeebPeOWVV7Rs2TIFBATo008/1c9//nOP/RdffLFuvfVWXXrppdq2bZumT59e45JpGzZs0FdffaURI0a42y666CJdddVV6tWrl7KysvTCCy/ozjvv9Dhv3Lhx+vTTT5Wbm6vPPvtMN9xwQ7X9l8/UFBkZqbFjxzbb86jJHXfcodLSUlmtVn322Wfu4itJGjRokMaPH69LLrlE27dv19NPP61Jkyapd+/e1fb1008/qXPnzvrhhx/Url07d/tll12mq666SqNGjVJZWZnuuecerV+/3uPc7du36/e//70k6Q9/+IP+8Ic/uJfzk6QBAwZo4sSJmjx5st566y39/ve/16233lpl5ioANav8nslischi8dl5jOrNZ4uYsrKyJEkFBQUmJwEAAAAAAAAAAEBTq65giSImtARnSs5o+HvDzY7hVasmrFJscGyT9+tyufSXv/xFkvTAAw9UKfwpFxMTo7lz52r06NFau3atdu/erZSUlCrH3X///R4FTOViY2M1depUPfXUU9q6datycnIUFRXl3j9y5EjFxcXp1KlTevvtt6stYsrPz9enn34qSfp//+//uZega47nUZ3169drw4YNkqTbb7/do4CpYv8LFy7UJZdcIqfTqRdeeEHPP/98jX3OmzfPo4Cp3MiRI3X77bfrxRdf1IYNG5SamqqBAwd6nFdWVqaBAwdWKWAqZ7FY9Pe//13vv/++8vPz9cEHH+j222+v13MFUP17ppawpJzPlmGV3yzLZ2QCAAAAAAAAAABAy1HdB20t4cM3AE1n+/bt2rt3ryTVOPtRucsuu8y9vW7dumqPqbzEW0UDBgyQdLbgaP/+/R77AgIC3ON/8cUXOnPmTJXzP/roIxUVFVU7TlM/j+p888037u1p06bVeNywYcPcy+dVPKeymJgYXXvttTXu/9WvflXt2NLZZfmks8Vc1RUwlYuOjlbfvn0lNey5ApCsVmuVr6+WUAzuU0VMp0+f1tdff63Ro0frs88+k2EYGjdunNmxAAAAAAAAAAAA0MQqFyzZbLYWsQwKgKaTmprq3h46dKgMw6jxX3h4uPvYY8eOVdtfjx49ahwrNvZ/M0nl5eVV2X/TTTdJkkpKSvTBBx9U2V++lFxiYqJGjhzZrM+jOmlpaZKkwMBA9evXr9ZjhwwZIknavXu3SktLqz2mf//+tRaW9uvXT4GBgZKkrVu3utsPHDigEydOSJIefvjhWp+rYRju16YhzxWAZBiGkpKS1KVLFyUlJSk9PV3FxcVmxzpnXilnt1qtjTovJSVFv/3tb5s4DQAAAAAAAAAAAMxWebaAljB7AICmdfz48UadV1hYWG17aGhojedULKJ0OBxV9g8bNkydO3fWgQMH9Pbbb+u2227zyFk+G9HEiROrFGQ29fOoTnZ2tqSzxVh1zWpXvkScy+XS6dOn1bZt2yrHJCQk1NqHzWZTbGysjh075h5b8s5zBXBW165dJUm5ubkeX4f+zCtFTC6Xq0HH22w2jR8/Xs8884zHWqMAAAAAAAAAAABoGaqbiQloCaKDorVqwiqzY3hVdFB0s/RbsZho6dKl6tKlS73Oq6sApzEMw9Avf/lLPfnkk1q9erUyMzPVoUMHSdI///lP2e12SdUvWefN51Hb8m3e6Kfic3300Uc1fvz4ep0XFhbWqPEAtCxeeTf4hz/8oc5jLBaLIiIi1LVrV/3sZz9TfHy8F5IBAAAAAAAAAADADJWLlpiJCS2FxbAoNji27gNRp7i4OPd2dHS0+vTpY2KaswVKTz75pJxOp95991395je/kfS/peR69Oihiy66qMp53nge5cvhnTp1Sna7vdbC0PKl2wzDUExMTLXHZGVl1Tqe3W73mP2pXMXnGhAQYPr/GQD/4jNFTAAAAAAAAAAAAGg9WE4OQF369+/v3l67dq0uueQSE9NIvXv31oUXXqiffvpJ77zzjn7zm99o//79WrdunaTqZ2GSvPM8youFSktLtXnzZg0cOLDGY9evXy9JSklJUWBgYLXHbN68udZiqJ9++kmlpaUeY0vSeeedp6ioKOXk5Gjt2rWNei4AWi9L3YcAAAAAAAAAAAAATSszM1Nbt25Vt27d1KNHD7Vr187sSAB8zEUXXaSOHTtKkhYuXKji4mKTE/2vUGnTpk3asWOHexYmSfrlL39Z7TneeB5XXnmle/u1116r8bh169Zp+/btVc6pLDs7W0uXLq1xf8UxKvZjtVo1evRoSdJXX32lHTt21B0eAP7LK0VMf/zjH/XHP/5RJ0+erPc5p0+fdp8HAAAAAAAAAACAlsVut6ugoECRkZFq27atoqOjzY4EwMdYLBbNnj1bkrRv3z5NmjRJJSUlNR6fm5ur5557rlkz3XTTTTIMQ5L09ttv691335UkDR06VOedd16153jjeQwePNg9+9LLL7+sb7/9tsoxOTk5uvPOO92Z7r777lr7/PWvf13tsnKrVq3SwoULJUkDBgzQoEGDPPY//PDDslqtcjqduuGGG3T48OEax3A4HHr77bdrPQZA/Vgs/j+PkVeWk5szZ44Mw9ANN9ygNm3a1Ouc7Oxs93mPPvpoMycEAAAAAAAAAAAAAPiau+66S19//bU++ugjvf/++/rxxx915513avDgwYqKilJubq527typlStX6tNPP1VwcLDuu+++ZsvTsWNHDR8+XCtXrtTzzz+vM2fOSKp5KTlvPo+XX35ZQ4YMUWlpqUaPHq37779fV199tcLCwrRp0yY99dRT2rdvnyTpN7/5jccycJVdeOGF2r59uwYMGKCHH35YgwcPVklJiT7//HM988wz7qXmnn/++Srn9u3bV08//bRmzJih7du3q0+fPrrjjjt0+eWXq23btiouLlZGRobWrVunDz74QEePHtXWrVvds1UBqJ/s7Gzt3btXpaWl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uQD6p/r6ek9BZ5P+WMRk6EpM69at0+rVq/X222+rurpakjyFS3Fxcbrssst0xRVXGBkRAAAAAAAAAAAAPSAgIEBms/f778vLyxUSEmJQIqB3yt+8WWuuvFKO+vp2jXfU12vNlVfqx5991udXZOoKy5cv1z333COHw+Fpy8vL08svv6y3335bH374oc4+++wOz/vGG2/oJz/5SbMig/z8fOXn52v79u36xz/+oR07dmjChAktzvPQQw/pj3/8o1fbgQMH9Le//U1vvfWWNmzYoLFjx3Y4H4C+rby83OvjgIAAWa1WY8J0ox4vYtq9e7dWr16t9PR0T6VoU+HSsGHDdMUVV+jKK6/UGWecwfKgAAAAAAAAAAAAA0hERIQKCws9H1dUVGjo0KEGJgJ6n3WLFrW7gKmJo75e6++9V9d+8UU3pep6//M//6OpU6dKklJTUyVJd9xxh3760596xkRGRnZozo8++kjffPONUlNTdc899yg1NVV1dXV655139OSTT6q2tlbXX3+9srKyZLFY2j1vYWGhbrrpJtntdsXExOjOO+/U6aefrsGDB6uurk7Z2dnasGGD3n333Vbnee655/Tll19q1qxZWrhwoUaPHq3y8nKtXr1aq1evVnFxsW6++WZt2rSpQ/cNoO87cSu5iIiIfllT0yNFTKWlpXr11Ve1evVqffvtt5L+W7gUERGh8vJymUwmPf7447r66qt7IhIAAAAAAAAAAAB6GZvN1qyIye1298sX6dB/uV0u1ZWWdsvcJTt2tLmFXEuObNyoQ+vWaXArqwB1ljUqSqYTVlI7WREREYqIiPBqi4mJaXUVo7Z89dVXmjNnjt555x2vIqWzzjpLUVFR+tWvfqVDhw7p/fff12WXXdbued9//33V1NRIkj799NNmGc844wzdcMMNeuaZZ1qd58svv9SCBQu0YsUKr+97P/jBD2SxWPT888/rq6++0tatWzVp0qR25wPQ951YxNQft5KTurGIqbGxUWvWrNHq1av173//W42NjZ7CJYvFojlz5ugnP/mJLrroon65xBUAAAAAAAAAAAA65sQX5Ox2u+rr63ktCX1KXWmplsfEGB3Dp9fPPbdb5v1pUZGCo6O7Ze6uFBQUpH/84x8+V1m6++679Zvf/EZ2u12ff/55h4qYCgoKJB1bGaq1Iqu2vpfFxcXp6aef9lm4ef/9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a5WQkKCgoCAlJCTopptu0u7du9uVJTs7W/fee69SU1Nls9lktVqVnJys+fPna8uWLSd1n+vXr/f83axfv/6k5gIAAAAAAAAAdNzw4cOVkJDQrL24uFjbt2+X3W43IBUAYCBpbGzU999/r6KiomZ9Q4cOVVJSUs+HQp9AEROADquvr9e1116rc889V6tXr9b+/ftVV1enqqoq7dy5U48//rhGjx6tNWvWtDlXYWGhZsyYocWLF2vr1q2qrq5WdXW1Nm/erLvuukuXX36517K3knTZZZfJarVKkl555ZVW529sbNSbb74pSZozZ44iIyPbdS/V1dXavXu3/vznP7f7Xlqydu1apaSk6Pe//722bdumiooKNTQ06ODBg3r55Zd11lln6c4772x2n778/e9/1xlnnKF//vOfys3NVUNDg3Jzc7Vq1SqlpaXpjTfeaPX8xx9/XOPGjdNf/vIX7dy5U5WVlaqvr9f+/fv14osvavr06Xr44Yc7fa8AAAAAAAAAAGOZTCYlJydr1KhRzfqqqqq0detW1dTUGJAMADAQ1NbWauvWraqoqGjWl5KSopSUFLY3RYsoYgLQIW63W1deeaX++c9/SpLmzp2rl156SRs3btSmTZv05JNPavjw4aqpqdGVV17Z5so+l19+uTIyMnT33Xfr448/1rfffqtXXnlFY8eOlSStWbNGzz33nNc5YWFhuuSSSyRJb7/9turr61uc/8MPP9TRo0clSfPmzWvXvXz22Wdas2aNfvOb33ToXnzZtm2b5s6dq8rKSgUEBOjee+/VunXr9M0332jFihUaMWKEJOnZZ5/VQw891OZct99+u2JiYvT000/r66+/1oYNG/Tggw8qMDBQDQ0NmjdvXos5ly1bpgceeECNjY069dRT9de//lWffPKJtmzZovT0dM2YMUNut1u//e1v9dRTT3X4XgEAAAAAAAAAvUd8fLxSU1Pl5+fn1V5fX6+tW7d6/u8cAICu1NDQ0Oz1Wz8/P02YMEFDhw41KBX6Cn+jAwA9rbS6odPnhgT6KyjAz2ff0Rq73G53p+a1WvwUbPH95Vhea5fT1b55o0IDO3X9jnj++ef1/vvvKyAgQO+9954uvPBCr/7TTz9d119/vc466yzt2rVLixYtanW7tM2bN2vt2rWaPXu2p23y5Mm64IILNG7cOBUWFmr58uVauHCh13nz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N3jwYE2cOLHFRRqAjqKICUC7mc1m/eIXv5Ak7du3TzfccIMaGhpaHF9ZWalnnnmm23Nde+21nsre9PR0vfrqq5KkGTNmKDk52ec5PXEv06dP19SpUyVJzz33nD799NNmYyoqKrRw4UJPpjvuuKPVOX/+85/73FZuw4YNWrlypSRpypQpmjZtmlf/Qw89JD8/P7lcLl155ZU+f8lo4nQ6lZ6e3uoYAAAAAAAAAED/5HQ6tXPnTs//mR89elTbtm1r9f/QAQD9U0NDg7Zv366SkpJmfQkJCRo3bpz8/PwMSIb+yt/oAAD6lttvv10ff/yx3nnnHb3xxhv67rvvtHDhQk2fPl02m02VlZXavXu31q9fr/fee09BQUG68847uzXTsGHDNGvWLK1fv17PPvusysvLJbW8lVxb9zJlyhQ5nU5VV1ersLBQn332Wafv5bnnntNpp50mu92uOXPm6K677tLcuXMVEhKirVu36o9//KP27dsnSbr//vu9toE70cSJE5WRkaEpU6booYce0vTp09XQ0KAPPvhATzzxhBwOh/z9/fXss882Ozc1NVWPP/647r33XmVkZGjChAm67bbbdO6552rIkCGqr6/XgQMHtGnTJr355pvKz8/Xjh07PKtVAQAAAAAAAAAGhqqqKlVXV3u1VVdX67vvvtOECRMUFhZmUDIAQE+qrq72KmptYjKZNGrUKMXFxRmUDP0ZRUwAOsRkMum1117TPffco7/97W/KycnR4sWLWxwfExPTI7nmzZun9evXewqY/P39dfXVV7d6Tk/cS1pamtasWaOrrrpKlZWV+tOf/qQ//elPzcb97Gc/09KlS9uc684779Qdd9zhs5jKYrHoxRdf1Gmnnebz/EWLFikkJESLFi1SRUWFli1bpmXLlvkca7FYFBQU1I47BAAAAAAAAAD0JxERETr11FO1a9cuORwOT7vdbte2bds0duxYDR482MCEAIDudvToUWVkZDTbTtTf31/jxo1TZGSkQcnQ37GdHIAOCwgI0PLly7V9+3bdddddSk1Nlc1mk5+fn2w2m9LS0nTLLbfozTffVGZmZo9kuvLKKxUYGOj5+Pzzz1d0dHSb57V2L+Hh4V1yL+eff76ys7P1i1/8QmlpaQoPD1dgYKCGDx+uefPm6fPPP9czzzwjs7ntb8m33nqrPv/8c1199dWKj4+XxWLR0KFDdcMNN2jr1q265pprWj1/wYIF2rdvn379619r5syZGjx4sPz9/RUSEqLRo0friiuu0N/+9jcdOXJEKSkpnbpfAAAAAAAAAEDfFhERocmTJ8tqtXq1u1wu7dq1S7m5uXK73QalAwB0pyNHjmjHjh3NCpiCgoI0adIkCpjQrViJCUCnpaam6qmnnurweUuWLNGSJUvaHDd79ux2/yMoIiJC9fX1Hc7S5Ph7cTqdKioqknRs9aXW9nGdP3++5s+f3+b80dHR+v3vf6/f//73nc7Y5PTTT9drr73W6fOHDBmihx9+WA8//PBJZzlRR/7OAAAAAAAAAAC9l9Vq1aRJk7Rr1y5VVFR49eXk5Ki2tlajRo2SyWQyKCEAoKtVV1crOzu7WXt4eLjGjx8vi8ViQCoMJKzEBAAAAAAAAAAAAKCZgIAAnXrqqRoyZEizvvz8fO3YscNryzkAQN8WGhqqESNGeLVFR0dr4sSJFDChR1DEBAAAAAAAAAAAAMAns9msU045RUlJSc36ysrKtG3btpPaKQEA0LskJCQoNjZWkpSYmKixY8fKbKa0BD2DJw0AAAAAAAAAAABAi0wmk+eF7BO3j6upqdF3332nyspKg9IBALqSyWTSqFGjlJqaqqSkJLYNRY+iiAkAAAAAAAAAAABAm2JiYjRx4kQFBAR4tTc2NqqgoMCgVACAzrDb7S32mc1mDRo0qAfTAMdQxAQAAAAAAAAAAACgXWw2myZNmqTg4GCvtpSUFANTAQDay+12Kzc3V19//bUqKiqMjgN48Tc6AACgdQcOHDA6AgAAAAAAAAAAHlarVZMmTdKuXbvU0NCg8ePHy2xm7QQA6O3cbreys7OVl5cnSdq1a5cmTZokq9VqcDLgGIqYAAAAAAAAAAAAAHSIv7+/UlNT1djY2Gx7OQBA7+NwOJSZmamjR4962hobG7Vz505NnjxZfn5+BqYDjqGICQAAAAAAAAAAAECHmc1mBQYGtthfX18vt9vNCh8AYLD6+nrt3LlTNTU1zfpiYmJYTQ+9BkVMAAAAAAAAAAAAALqUw+HQjh071NjYqPHjx8tmsxkdCQAGpMrKSu3cuVONjY1e7SaTSWPGjFFMTIxByYDmKKcDAAAAAAAAAAAA0GVcLpcyMjJUW1urxsZGbd++XUVFRUbHAoABp7i4WNu3b29WwBQQEKCJEydSwIReh5WYAAAAAAAAAAAAAHSZw4cPq6yszPOx2+1WZmamampqlJiYyLZFANDNXC6XDh8+rAMHDjTrCw4O1oQJE9jqE70SRUwAAAAAAAAAAAAAuszQoUNVUVHhVcgkSYcOHVJJSYlGjRqliIgIY8IBQD9XUVGhrKws1dTUNOuLiIjQuHHjFBAQYEAyoG2UOQMAAAAAAAAAAADoMv7+/kpNTVV8fHyzvtraWm3fvl27d++W3W43IB0A9E+NjY3as2ePtm3b5rOAKTY2VqmpqRQwoVdjJSYAAAAAAAAAAAAAXcpkMiklJUVWq1U5OTnN+gsLC1VaWqoRI0YoLi5OJpPJgJQA0H+43W4VFxf77BsxYoQSEhL4Xotej5WYAAAAAAAAAAAAAHQ5k8mkYcOGafLkyQoNDW3W73A4lJWVpa1bt6qqqsqAhADQf1gsFo0YMcKrLSQkRGlpaRo+fDgFTOgTKGICAAAAAAAAAAAA0G3CwsI0efJkpaSkyM/Pr1l/VVWVvvvuO2VnZ8vhcBiQEAD6h/j4eIWGhsrPz08jR47UlClTZLPZjI4FtBvbyQEAAAAAAAAAAADoViaTSUOHDlV0dLRycnJUVFTUbEx+fr6GDRsmf39ewgQAX9xut0pLS2Wz2RQQENCs32QyacyYMfL391dgYKABCYGTw0pMAAAAAAAAAAAAAHqExWLR2LFjdeqpp8pqtXr1JSYmKigoyKBkANC71dXVaefOndq1a5f279/f4riQkBAKmNBnUcQEAAAAAAAAAAAAoEdFRkZq6tSpSkpKktlsVnBwsIYNG2Z0LADodVwulw4ePKgtW7bo6NGjko6tXFdRUWFwMqDrUcQEACdh1apVMplMMplMOnDggNFxAAAAAAAAAADoM8xmsxITEzV16lSNGTNGZrPvly4dDofnhXsAGEjKysq0ZcsWHThwQC6Xy6svKytLbrfboGRA92BDWQAAAAAAAAAAAACGOXFbuRMdPHhQubm5Gjx4sFJSUtgmCUC/Z7fblZOTo6KiIp/9FotFw4cP7+FUQPejiAkAAAAAAAAAAABAr1RdXa3c3FxJUklJicrKypSUlKShQ4fKZDIZnA4Aupbb7VZeXp72798vp9Ppc8zQoUOVlJQkf3/KPdD/8FQDAAAAAAAAAAAA6HXcbreysrK82pxOp3JyclRQUKBRo0bJZrMZlA4AulZVVZX27t2r6upqn/1hYWEaNWqUwsLCejgZ0HMoYgIAAAAAAAAAAADQK8XGxqq2tlYOh8OrvaamRtu2bVNsbKySk5MVEBBgUEIAODkOh0P79+9XXl6ez35/f3+NGDFCcXFxrECHfo8iJgAAAAAAAAAAAAC9jslkUlxcnAYPHqx9+/apoKCg2ZiCggKVlpYqOTlZVqvVgJQA0HkOh0ObN2+W3W732T9kyBAlJyfLYrH0cDLAGGajAwDou9atW6cbb7xRycnJCg4OVnh4uFJTU/XAAw+0WCksSUuWLJHJZPJUCtfX12vZsmWaPHmywsLCFBYWpunTp+uZZ55p9s4KSVq9erXn/I8//rjNnAsXLpTJZFJgYKDKysravJewsDCNHj1a5557rhYvXtzqvbRXcXGxfvWrX2nSpEmKiIhQUFCQkpKSdP311+uLL75o9dykpCSZTCbNnz9fkrR582Zde+21SkhIUFBQkBISEnTTTTdp9+7d7cqSnZ2te++9V6mpqbLZbLJarUpOTtb8+fO1ZcuWk71VSVJdXZ3+8Ic/aOLEiQoJCVFUVJRmzpyp5557Ti6XS+vXr/f8Ha5fv75LrgkAAAAAAAAA6J8CAgJ0yimnKC0tTSEhIc36GxsbtWfPHmVlZVHIBKBP8ff31+DBg5u1BwcHa+LEiRozZgwFTBhQWIkJQIfV19frpptu0j//+c9mfTt37tTOnTv117/+Va+++qrmzp3b6lyFhYW68MILtW3bNq/2zZs3a/PmzVq7dq3effddmc3/rbm87LLLdPvtt6uurk6vvPKKfvjDH7Y4f2Njo958801J0pw5cxQZGdnue9m9e7d2796tFStWtOteWrJ27VpdddVVqqys9Go/ePCgDh48qJdfflk/+9nP9NRTT3ndpy9///vftXDhQq/irtzcXK1atUqvvvqqXnrpJV111VUtnv/444/rF7/4hRobG73a9+/fr/3792v16tX61a9+pd/85jeduNNjCgoKdO655yozM9PTVltbqy+//FJffvml3nrrLf385z/v9PwAAAAAAAAAgIHJZrNp8uTJOnLkiA4cOCCXy+XVX1NTo9TUVBUUFMjpdBqUEgA6ZsSIESouLlZjY6PMZrMSExM1bNiwNl83BPojnnoAHeJ2u3XllVd6in7mzp2rl156SRs3btSmTZv05JNPavjw4aqpqdGVV17Z5so+l19+uTIyMnT33Xfr448/1rfffqtXXnlFY8eOlSStWbNGzz33nNc5YWFhuuSSSyRJb7/9turr61uc/8MPP9TRo0clSfPmzWvXvXz22Wdas2aNfvOb33ToXnzZtm2b5s6dq8rKSgUEBOjee+/VunXr9M0332jFihUaMWKEJOnZZ5/VQw891OZct99+u2JiYvT000/r66+/1oYNG/Tggw8qMDBQDQ0NmjdvXos5ly1bpgceeECNjY069dRT9de//lWffPKJtmzZovT0dM2YMUNut1u//e1v9dRTT3X4XqVjS15efPHFngKm888/X++88462bNmit99+W+edd54++ugj/epXv+rU/AAAAAAAAACAgc1sNishIUHTpk3zuXqJ2WxWfHy8MjMzfe72AABGcbvdPtv9/f01cuRIRUVFadq0aRo+fDgFTBiwWIkJA09NSefPtYRIAS0sQ1pTKsn3D542BViPze1L7VHJ7fLdd6KQ5r+sd7Xnn39e77//vgICAvTee+/pwgsv9Oo//fTTdf311+uss87Srl27tGjRola3S2tabWn27NmetsmTJ+uCCy7QuHHjVFhYqOXLl2vhwoVe582bN0+vvfaaKisr9a9//UtXXnmlz/lfeeUVSVJ4eLguvvjidt2L0+lUUVGRpkyZojvuuEOzZ89u1734ctttt8lut8vPz0//+te/dP7553v6pk2bpquuukpnnnmmMjIy9Pjjj+uGG27Q+PHjfc61fft2JSYm6quvvlJsbKyn/eyzz9YFF1yg888/X42NjfrpT3+qb775xuvcjIwM/fKXv5QkPfLII3rkkUc82/lJ0pQpU3TNNdfoxhtv1Msvv6xf/vKXuv7665utXNWWFStW6Ntvv/Xc+4oVK7yucdlll+mWW27R3//+9w7NCwAAAAAAAADA8YKCgjR+/HiVlpYqOzu72RueQ0ND5e/PS6EAjFdfX6+cnByFh4fLZrP5HBMTE6MhQ4b0cDKg9+EnNwaeZSM7f+6cx6XpC3z3PTtNqi3t3Lyz/lc6p4VVeP7xI6l4d/vmWVLRueu3k9vt1qOPPipJuvvuu5sVMDWJjIzUsmXLNGfOHG3cuFFZWVkaNWqUz7F33XWXVwFTk0GDBummm27SH//4R+3YsUMVFRVeP9QvvPBCRUVFqbS0VOnp6T6LmKqrq/Xee+9Jkq644goFBQV1672c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O/8yfmufw0GDBsnlcnn+3kJDQ/v9qlYA+haKmLqYxWLR3Xffrd/+9rfKzMzU448/rgceeMBrzKZNm/TCCy9IOvYPj2nTpvmcq+kHRmJiog4cONDmtZu2kvP399d1113Xrrw7duyQ1Wr17Onty8qVK/X8889LkmJjY7us6Ap905IlS/TrX/9a0rFfRisrK/XnP/9Zb731lvbv36/g4GBNnTpVv/rVr3TGGWd4zisqKtJTTz2ld955RwcOHFBQUJDOPPNMLVmyRJMmTWr1mi6XS6+88opeeeUVfffddzp69KhsNpsmTJigq666Srfeemur/8CXjlXuP/roo3r33Xd18OBBhYWF6dRTT9XChQt11VVXtXnfTV+PjzzyiJYsWdLiuNmzZ2vDhg2aNWuW1q9f3+a8J9q5c6feffddff7559q1a5eKi4sVEBCguLg4nXHGGbrjjjt8rvC2fv36Zv9xMWLEiGbj1q1b53O56XfffVfp6en6+uuvVVRUpKCgIKWkpGju3Lm6++6729znODc3V0uXLtWHH36ovLw8DRo0SFOnTtXdd9+t8847r2OfhBa09+8AAAAAAAAA6Av27t3rWbFkzJgxrY49vj8zM7NDRUy5ubmt9ufn53uOq6qqVFlZ2e65T0Z1dbXPY+Bk8Fz1DmFhYQoLC9PQoUNlt9tVXV2t6upqNTQ0yOFweF5f8qW1rc7a0tq8NTU1stvtPouqWmI2m2U2mzVixAjt37/f5zO1e/fuTmeuqalpMe/JFBbV19e3OK/ValVCQoKkY5+vqqqqTl8HncP3KXQHo56r7vgeQhFTN3jggQf02muvae/evVq8eLGys7N1zTXXyGq1at26dfrDH/4gh8Mhq9Wqv/zlL11yzYyMDH377beSpAsvvFAxMTHtOu/bb7/VrbfeqnPOOUc/+tGPlJqaqqioKDkcDu3evVvp6elau3atpGPLCa5cuVIhISFdkhl93+HDh3Xeeedp7969nraamhp9+OGHWrt2rV599VVdddVV+v777zVnzhwdOXLEM662tlbvvfeePvroI3344Yct/qP76NGjuuSSS7Rx40av9pKSEq1fv17r16/XM888ow8//FCJiYk+58jMzNR5552nvLw8T1t9fb0+/fRTffrpp7rpppt09tlnn8ynokv4KkSSjr0jKzs7W9nZ2Vq9erX+93//V0uXLu2S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d+5UxYoVc7WRlJSk7t27GwlMgwYN0tChQ1W9enUdOHBA7777rmbOnKndu3c750mzISMjQ35+furZs6e6dOmipk2bKiAgQAkJCdqzZ48++OADxcfH6+2331aTJk1yzboUFhamXbt2adGiRfrXv/4lSfrpp58UHByc6xj169c3tlNTUxUREaHt27fL3d1dQ4YMUY8ePVS/fn2lp6frl19+0bvvvquEhAT16NFDO3bsyJModuzYMSOByc3NTSNGjNCAAQNUqVIl/fHHH3r77bcVFRWl0NDQYj8///znP40EpptvvlkvvfSSbrnlFl26dEnz5s3T559/rkGDBhX7OAAAAAAAAAAAAAAA5yOJCeVDVpZ09YKro3CeCkGSm+NXi9y5c6fWrVun22+/3XgsNDRUjRs3Vq9evXT58mXdfvvtMpvN2rJlixo2bGjUa9eunapWraqRI0fq2LFjWrZsmfr165er/U8//dRIYHr00UcVHR1tLGPXtm1b9e7dW6+99preeustHTp0SBMmTNDEiRNztTFhwgT99ddfkqS33npLr7zyilHWtm1bDRgwQL169dLKlSvt++QUQevWrXX8+HEFBgbmKevevbueffZZ9erVS6tWrdL48eP16KOPyt3dXZLk5+enli1bKjY21tinSZMmqlevntXjvfHGG9q+fbsCAwO1evVqtW3bNld5hw4d9Le//U3t27fXqVOn9Oqrr2rWrFm56owePdqYgembb77RQw89ZJSFhoZq4MCB6tixY664imLXrl368MMPJUm33Xab1q1blythrWvXrrrzzjs1dOjQYh0HAAAAAAAAAAAAAOAaJDGhfLh6QZrcMP96ZcWLhyS/qg4/zAsvvJArgSlbz549FRISovj4eJ09e1affPJJrgSmbMOGDdPo0aN17do1rV+/Pk8S00cffSRJqlatmqZOnWokMOU0fvx4LViwQPv379fnn3+uN954Q97e3pKuL8M2Y8YMSdItt9yiMWPG5Nnf09NTM2bMUIMGDZSenl74J8GOqla1/Zp5eXlp8uTJat26teLj47Vz5848iUcFlZycbDy/EyZMsNpOSEiIxo4dq2eeeUbz5s3TtGnT5OfnJ0k6ffq0fvjhB0lSr169ciUwZfP399e0adMs9pPC+PTTT5WVlSVJmjZtWp4Zt6TriW5z5szR8uXLi3UsAAAAAAAAAAAA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X+uAgADzkiVLinWMI0eOFPi6pTCf78K5nHE/kmuJ8sXRfYrPlMoXZ/7fkpKSYu7Ro4fV47m5uZmjoqLseszC8hDgIjt27NCgQYN09epVVaxYUa+88oo6d+6sq1evas6cOfr888914MAB9ezZU7GxsfL393d1yCgHnn76aT3zzDNWy/38/JwYDcq6unXrqmnTplq5cmWh933ttdc0Y8YMSVKbNm300ksvqWHDhjp06JAmTZqkHTt2aPr06apWrZreeuste4eOMqg4/THbTz/9pODgYKvltWvXLnLbKPtOnjwpSQoODtbAgQPVsWNH1a1bV5mZmdq8ebPeeecdnThxQl999ZXS09P17bffWm2LMRLFZc/+mI0xEsVVp04dde7cWW3btlWdOnVUq1YtZWVl6fjx4/r++++1YMECnTt3Tn369NGWLVt066235mnjs88+0/jx4yVJDRs21KuvvqpWrVrp5MmTev/99xUTE6Nly5bpscceK1C/Rvllj/6Y7YsvvlBYWJjV8urVqzviFFDGZWVlacSIEcrIyFD16tWVkJCQ7z5cQwKOYzabje2goCCFhoZq06ZNSk5OtvuxuN4pPy5fvqyePXvq4MGDkqQnnnhCgwcPVoUKFRQTE6P//Oc/SkpK0qBBg7Rx40a1bt262Mf897//rb59+1otr1y5crGPAftz1v1IriXKD2ff4+YzpfLFHvdqbHnsscf0448/SpI6d+6sv//97woODtauXbv01ltv6dChQ4qKilKtWrU0YsQIh8SQL5emUKFcy/52s4eHh3nTpk15yidNmsS37uA09DU4y+uvv25esmSJ+fTp02azOfc3eQqaTf3nn38a3yYNDQ01p6Sk5Cq/cuWKOTQ01BhjmdEO1tijP+b8RsiRI0ccFyzKvJ49e5q/++47c0ZGhsXys2fPmps0aWL0t3Xr1lmsxxgJe7BXf2SMhL1Y64s5/fDDD0Z/69evX57y8+fPmytVqmSWZK5bt6757NmzeY7Ru3fvAs1WgvLNHv0x50xM9DU4wn//+1+zJHPTpk3Nr7zySr79jWtIwLE+++wz87fffpvrvRMSEmL3mZi43ilfxo4da7yWkyZNylO+ceNGY2wvzgoLOT8vY7aT0skZ9yO5lihfnNGn+EypfLHHvZqC+Pnnn412e/funefv+7Nnz5rr1q1rlmQODAw0X7hwwW7H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Z9yP5FqifClJ97j5TAmF4e/vr65du0qSVq9ebXVJxAULFigpKUmSY//vtMkMuEjHjh3NksweHh7mTZs25SmfNGmSWZJZknncuHHODxDlxuLFi83p6elWy0+fPm1u06aN0R/feecdJ0aHsu7IkSNG3xo6dGiB9vnzzz/N7u7uZknm0NBQc0pKSq7ylJQUc2hoqDHGHjhwwAGRoywqbH88cuSIefv27TbrLFmyxOzl5WWWZK5QoYL5+PHjdooWZU1qaqq5W7duRh/8+9//XqR2GCNhD/boj4yRsKeZM2ear169arPOu+++a/TZ+vXrmzMyMnKVnz9/3lypUiWzJHNISIj53LlzucozMjLMvXv3NtqIiYmx92mgjChuf7xw4UK+/eu3334zBwYGmiWZTSaTOTY21h6ho5waN25cvmMb15CA84WEhBjXJQWR8zOLTp06WazD9U75MnbsWOO1nDRpUp7yTZs2mT08PGz2GbPZbLRhrS/+8MMP5qysLKv7Hzx40Fy3bl2jnfnz5xf2VOBgxb0fGRMTk+9nplxLlC+O7lN8poSi3DucOXNmvrkVP//8s1GnT58+eT47Onv2rPF/WmBgoPnChQvFPJOisbxII+AE77//vu666y5dvXpV3bp106uvvqrOnTvr6tWrmjNnjqZNmybp+lrWo0ePdnG0KMuee+45paen64EHHlD79u1Vr149VahQQefOndPatWv12WefGdMxdujQwe5LiKB82bBhg+Li4ozfs/uWJMXFxeX6dpAkRUZG5mmjSZMmevHFF/X2228rNjZWd911l15++WU1bNhQhw4d0sSJE7Vjxw5J0osvvuiS9WpROhS3Px49elSdO3dW+/bt1bt3b916662qXr26JOnw4cP6/vvv9f333xvfBpkyZQoz2cGqhx56SCtXrpQkdenSRY8//rh2795ttb6Xl5eaNGmS53HGSNiDPfojYyTsKSoqSqNHj9YDDzygDh06qGHDhqpYsaIuX76sXbt2adasWdq4caOk6/1x2rRpcnd3z9VGUFCQJk6cqKeeekrx8fG6/fbb9dprr6lVq1Y6efKk3nvvPcXExEi6/h4IDw939mmilChuf7x06ZI6d+6sW265Rffff7/atm2rWrVqyd3dXceOHdPSpUv19ddfG8sA/fOf/1Tbtm1dcq4oP7iGBBwrLi5OGzZsyPVYcnKy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", + "image/png": "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9JGPfEQ33XST7r//fv3whz/UsWPH9L3vfU8PPvhgSL7vfe97On36tCTphz/8oe69997guRUrVui6667T+vXr9corr0Tk6zMay5YtU1VV1YCVXiTpk5/8pO68806tX79ef/7zn/Wd73xHt9xyS/A+7HA4tHjxYu3Zsyf4nJKSEs2dO3fQ6333u9/Ve++9p9TUVL366qtasWJFyPkLL7xQN954o9asWaPa2lrdd999evrpp0P6bNy4MbgC069//Wv9/d//ffDcypUrdf311+uiiy4KyQVMZRaLRcnJySGviyhimiB+v1/33HOPNm/eLL/fH6wUMwxjwL6hfRWUNptNx48f16xZsyYrJgAAAAAAAAAAAEx2dhETqzBhKvG1tan8YxeYHWNSFf/1LdnS0yN+nbvvvjukgKnPlVdeqcLCQp08eVKNjY36j//4j5ACpj633XabNm7cKLfbrTfeeCOkiOkXv/iFJCkrK0v//u//LsMwBjz/O9/5jp5//nkdPnxYjzzyiL773e8qNjZW0plt2B577DFJ0kc+8hF94xvfGPD8mJgYPfbYYzrnnHPk8XjG9kWYIJmZmUOet9vt+vGPf6xly5bp5MmT2rdv34DCo5Hq6uoKfn2/973vDTpOYWGhvvWtb+nLX/6yfvvb32rLli1yOBySFFwNS5LWr18fUsDUJykpSVu2bAk7R4CpKiUlRe3t7bLZbEpJSRmwAtx0E/ly2P/xpS99ST/96U/l8/mUn5+v6667btC+fcvG+Xw+Pffcc5MVEQAAAAAAAAAAACbz+/3BlTb6UMQEQJI+97nPDXruIx/5iKQzi2jccMMNYfvEx8eruLhYklRZWRlsr6mp0aFDhyRJn/3sZ5WUlBT2+TabLbitWmtrq957773guXfffVetra2SpFtvvTVsEZQkzZ49W5dffvmgn4dZenp6dOrUKR08eFBlZWUqKysL2cLq/fffH/PYO3fuDBanDlUnIEkf//jHJUkej0fvvvtusH3Hjh3y+XySFLK13dlWr16tRYsWjTkrEG3y8vK0cuVKfexjH9PixYuVnZ1tdqSImpQiptdeey1YdXrffffpxIkT+r//9/8O+Zzrr79egUBAf/nLXyYjIgAAAAAAAAAAAKJAV1eX/H5/SBtFTACkM1uWDaZvW7TMzEylpaUN26+zszPYVlZWFjwebhWf/uf7P++DDz4IHq9atWrIMVavXj3k+cnidDr1wAMPaOnSpXI4HCosLNSiRYu0ZMkSLVmyRMuXLw/2bWpqGvN1+m/vlpeXJ8MwBv1YvHhxsG9dXV3weCp+fYGJEBcXJ4fDMWhh5HQzKdvJbdmyRdKZFZa+//3vj+g5fTeWAwcORCwXAAAAAAAAAAAAosvZW8klJCQoJibGpDQAoklCQsKg5ywWy7B9+vfrW9VHklpaWoLHw61ykpubG/Z5oxkjJydnyPOT4cSJE7rkkkt0/PjxEfV3uVxjvlZDQ8OYntfd3R08nmpf3/+fvfuOj6rK/z/+vplk0jsJJLQACQKCFCki1bLiBhusBVQUCyK6Cq6Kq/tbV/frrgUVu4IgRbGxKiuCfSkaUUAB6ZAAUhI66XUm8/uDzSyTXmbmpryejwePx51z7z3nPeFymcx85hwA9eOVIqY1a9bIMAzddttttT6nXbt2klyrKwEAAAAAAAAAANC8ZWZmujwumzUFaCosERFK+iHF7BheZWlG/07dMdtJU5gxZcKECdq7d68Mw9Att9yicePGqXv37oqJiZHVapVhGCotLZXFYpEkl6Xl6urMgrFffvml1oWpZTUD5TWFny+A+vFKEVNZZWVCQkKtzym7cdlsNk9EAgAAAAAAAAAAQCPUqVMnRUZGKisrS1lZWSwlhybH8PGRb1SU2TFQB1Fn/H0dOXKk2mPPnITjzPPOXMLuyJEj1S59V9MYhmHI4XBUWFqzvLy8vGr3V2XHjh36/vvvJUmPPPJIlaspnTn7UUNER0c7t2NiYqosTqpO+Z9v+/btqzy2pp8vgMbLxxuDBAcHS5KOHTtW63MOHjwoyfXGDwAAAAAAAAAAgOYtJCRE7dq109lnn63BgwcrJibG7EgAmrmePXs6t3/66adqj127dm2l5/Xq1cu5vW7dumr7qGl/aGioJOnUqVNVHuNwOJSamlptP1XZunWrc/u6666r8rj169dX209tZ0Tq27evczslpX6zlLnz5ws0dbUpcmyqvFLE1LlzZ0nStm3ban3O559/Lkk6++yzPZIJAAAAAAAAAAAAjZthGCwbBMDj4uPj1b17d0nShx9+qNzc3EqPs9vtmj9/vqTTMwP169fPue/cc891zhb09ttvV7n82qFDh/TVV19Vm6dTp06Sqi8i+vzzzyssv1lbZ66GVN1sTm+88Ua1/QQEBDi3i4qKqjzu4osvVlBQkCTppZdeqtfSdBdccIFzabsFCxZUedy6deu0ZcuWOvcPNHa5ubnav3+/Nm/erB9++EGHDh0yO5JHeKWI6ZJLLpHD4dCrr75aq2qwbdu2af78+TIMQ8nJyV5ICAAAAAAAAAAAAABoqe6++25Jp1cXuvfeeys95vHHH3dO3DFp0iT5+/s79/n7++uWW26RJG3cuFEzZsyocL7NZtOkSZNUXFxcbZYRI0ZIOj0rVGUzFx0+fFj33HNPLZ5V5ZKSkpzbZUVZ5b3++uv697//XW0/cXFxzu20tLQqj4uIiNAf//hHSdIPP/yg++67r9q6gSNHjmjOnDkVxrryyislSZ9++qk+/PDDCufl5uZq8uTJ1WYGmqr09HTt3btXJ0+elM1mU1ZWltmRPMIrRUz33nuvgoODlZaWpjvvvNOlsrO8r7/+WpdccokKCwsVFRWlSZMmeSMiAAAAAAAAAAAAAKCFuvPOOzV48GBJ0rx583TRRRfp448/1q+//qpvvvlG11xzjf7v//5PktSlSxf99a9/rdDHo48+qnbt2kmSHnroIV1//fX64osv9Msvv+j999/X+eefr88//1z9+/evNssdd9whX19fORwOXX755XrhhRe0fv16/fDDD5oxY4b69u2rrKwsl2Kkuujbt69zKbxZs2bpuuuu02effaaff/5Z//73v3XNNdforrvu0pAhQ2rsp2w2pr/+9a/6+uuvtWvXLqWmpio1NVUFBQXOY//+979r0KBBkqQXX3xR/fr106uvvqqUlBRt3LhRK1as0CuvvKKrrrpKHTp0qHQWqOeee8651N7111+vu+++WytWrNDPP/+sefPm6dxzz9WGDRtq/PkCTVF4eLjL46ysrHrNatbY+XpjkNatW+uNN97QTTfdpLlz5+rLL7/U6NGjnftffPFFORwOpaSkaMeOHXI4HPLx8dH8+fMVEhLijYgAAAAAAAAAAAAAgBbKYrHos88+0xVXXKGUlBT95z//0X/+858Kx3Xv3l2ff/55pZ9jh4eH64svvtDFF1+sw4cP67333tN7773ncszEiRM1YsQI56xNlTn77LP1zDPP6E9/+pNOnTql++67z2V/VFSUlixZor/+9a/avXt3nZ+rYRh6++23deGFF+rUqVP68MMPK8xs1KtXLy1evFjx8fFV9hMaGqp7771X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ysrKUlFRkX777Te98847GjZsmP74xz9WeJ6Veeutt3T++efr/fff18GDB1VUVKSDBw9q/vz56tOnjxYvXlzt+c8++6x69OihF154QVu2bFF2drYKCwu1d+9eLViwQAMHDtSjjz5a7+cKtGTMxORlN910kxwOh2bPnm12FAAAAAAAAAAAAHhAc51FAID7OBwOXX311c7JLy6//HK9/fbbSklJ0Zo1a/Tiiy+qQ4cOysvL09VXX13t7D5jx47Vtm3bdO+99+rrr7/Wzz//rHfffVfdu3eXJC1dulRvvvmmyzkhISG65JJLJEkff/yxCgsLq+z/888/18mTJyVJN9xwg8eeR1U2btyoyy+/XNnZ2fLz89N9992nFStWaO3atZo1a5Y6deokSXr11Vf18MMP19jXnXfeqdjYWL388sv66aeftGrVKj300EPy9/dXUVGRbrjhhipzzpgxQw8++KBKSkp0zjnn6PXXX9c333yj9evXa9GiRRo8eLAcDof+7//+Ty+99FKdnyvQ0jXX11CNthSrQ4cOkqTNmzebnAQAAAAAAAAAAACewExMaI5KHaXKLMo0O4ZXRfhHyMfwzPwZc+bM0bJly+Tn56dPP/1Ul156qcv+8847TxMmTNCwYcO0detWTZs2rcol09atW6evvvpKI0eOdLb169dPo0aNUo8ePXTkyBG99tprmjx5sst5Y8eO1aeffqrs7Gx99tlnuvrqqyvtv2ymprCwMF122WUeex5VueOOO1RcXCyLxaLPPvvMWXwlSQMGDNA111yjoUOHatu2bXr22Wd100036eyzz660r02bNqljx4768ccf1aZNG2f78OHDNWrUKF1yySUqKSnRXXfdpbVr17qcu23bNv3lL3+RJP3tb3/T3/72N+dyfpJ07rnnaty4cbr55pv1zjvv6C9/+YsmTJhQYeYqAFUr/5rJx8dHPj6Ndh6jWmu0RUxHjhyRJOXl5ZmcBAAAAAAAAAAAAO5WWcESRUxoDjKLMjXigxFmx/CqVdetUlRAlNv7dTgcevrppyVJ9957b4XCnzKRkZGaMWOGkpOTlZKSot27dyspKanCcffcc49LAVOZqKgo3XLLLXrqqae0efNmZWVlKTw83Ln/ggsuUHR0tE6cOKFFixZVWsSUm5urTz/9VJL0hz/8wbkEnSeeR2XWrl2rdevWSZImTZrkUsB0Zv+zZ8/W0KFDVVpaqtdee02vvvpqlX0+99xzLgVMZS644AJNmjRJr7/+utatW6f169erf//+LueVlJSof//+FQqYyvj4+Ojll1/W4sWLlZubq3/961+aNGlSrZ4rgMpfMzWHJeUabRlW2c2ybEYmAAAAAAAAAAAANB+VfdDWHD58A+A+27ZtU1pamiRVOftRmeHDhzu316xZU+kx5Zd4O9O5554r6XTB0d69e132+fn5Ocf//PPPlZmZWeH8Tz75RAUFBZWO4+7nUZlvvvnGuX3bbbdVedyQIUOcy+edeU55kZGRuvLKK6vcf+utt1Y6tnR6WT7pdDFXZQVMZSIiItSrVy9JdXuuACSLxVLh31dzKAZvVEVMp06d0tdff63k5GR99tlnMgxDY8eONTsWAAAAAAAAAAAA3Kx8wZKvr2+zWAYFgPusX7/euT148GAZhlHln5CQEOexhw8frrS/bt26VTlWVNT/ZpLKycmpsH/8+PGSpKKiIv3rX/+qsL9sKbn4+HhdcMEFHn0eldmyZYskyWq1qk+fPtUeO2jQIEnS7t27VVxcXOkxffv2rbawtE+fPrJarZKkzZs3O9t/++03HTt2TJL08MMPV/tcDcNw/mzq8lwBSIZhqH379kpISFD79u21a9cuFRYWmh2rwbxSzm6xWOp1XlJSkh566CE3pwEAAAAAAAAAAIDZys8W0BxmDwDgXkePHq3Xefn5+ZW2BwUFVXnOmUWUdru9wv4hQ4aoY8eO+u2337Ro0SLdfvvtLjnLZiMaN25chYJMdz+Pypw8eVLS6WKsmma1K1sizuFw6NSpU2rdunWFY2JjY6vtw9fXV1FRUTp8+LBzbMk7zxXAaZ06dZIkZWdnu/w7bMq8UsTkcDjqdLyvr6+uueYazZw502WtUQAAAAAAAAAAADQPlc3EBDQHEf4RWnXdKrNjeFWEf4RH+j2zmGjp0qVKSEio1Xk1FeDUh2EYuv766/Xkk09q9erVOnTokNq2bStJ+vDDD2Wz2SRVvmSdN59Hdcu3eaOfM5/ro48+qmuuuaZW5wUHB9drPADNi1deDf7tb3+r8RgfHx+FhoaqU6dOOv/88xUTE+OFZAAAAAAAAAAAADBD+aIlZmJCc+Fj+CgqIKrmA1Gj6Oho53ZERIR69uxpYprTBUpPPvmkSktL9d577+mBBx6Q9L+l5Lp166Z+/fpVOM8bz6NsObwTJ07IZrNVWxhatnSbYRiKjIys9JgjR45UO57NZnOZ/anMmc/Vz8/P9L8zAE1LoyliAgAAAAAAAAAAQMvBcnIAatK3b1/ndkpKioYOHWpiGunss89W7969tWnTJr377rt64IEHtHfvXq1Zs0ZS5bMwSd55HmXFQsXFxdq4caP69+9f5bFr166VJCUlJclqtVZ6zMaNG6sthtq0aZOKi4tdxpakzp07Kzw8XFlZWUpJSanXcwHQcvnUfAgAAAAAAAAAAADgXocOHdLmzZvVpUsXdevWTW3atDE7EoBGpl+/fmrXrp0kafbs2SosLDQ50f8KlTZs2KDt27c7Z2GSpOuvv77Sc7zxPC6++GLn9ltvvVXlcWvWrNG2bdsqnFPeyZMntXTp0ir3nznGmf1YLBYlJydLkr766itt37695vAA8F9eKWL6+9//rr///e86fvx4rc85deqU8zwAAAAAAAAAAAA0LzabTXl5eQoLC1Pr1q0VERFhdiQAjYyPj48eeeQRSdKePXt00003qaioqMrjs7Oz9corr3g00/jx42UYhiRp0aJFeu+99yRJgwcPVufOnSs9xxvPY+DAgc7Zl9588019++23FY7JysrS5MmTnZmmTJlSbZ9/+tOfKl1WbtWqVZo9e7Yk6dxzz9WAAQNc9j/88MOyWCwqLS3V1VdfrYMHD1Y5ht1u16JFi6o9BkDt+Pg0/XmMvLKc3GOPPSbDMHT11VerVatWtTrn5MmTzvMeffRRDycEAAAAAAAAAAAAADQ2d955p77++mt98sknWrx4sX755RdNnjxZAwcOVHh4uLKzs7Vjxw6tXLlSn376qQICAvTHP/7RY3natWunESNGaOXKlXr11VeVmZkpqeql5Lz5PN58800NGjRIxcXFSk5O1j333KPLL79cwcHB2rBhg5566int2bNHkvTAAw+4LANXXu/evbVt2zade+65evjhhzVw4EAVFRVp+fLlmjlzpnOpuVdffbXCub169dKzzz6r++67T9u2bVPPnj11xx136MILL1Tr1q1VWFioffv2ac2aNfrXv/6ljIwMbd682TlbFYDaOXnypNLS0lRcXKxBgwapoKDA7EgN5pUiJgAAAAAAAAAAAAAA6sowDH3wwQeaOnWq3njjDaWlpWn69OlVHh8bG+vxTDfccINWrlzpLGDy9fXVtddeW+053ngeffr00dKlS3XNNdcoOztbzz33nJ577rkKx91999168skna+zrj3/8o6ZMmVJpMZXVatWCBQs0aNCgSs+fNm2agoODNW3aNGVlZWnGjBmaMWNGpcdarVYFBATU4hkCKC8/P1/S6XuMr2/TLwFqtHNJlZSUSJL8/PxMTgIAAAAAAAAAAAAAMIufn59ee+01bdq0Sffcc4969eql8PBwWSwWhYeHq0+fPrrtttv0r3/9S9u3b/d4nquvvlr+/v7Ox5dccoliYmJqPM8bz+OSSy5RamqqHnnkEfXp00dhYWHy9/dXhw4ddMMNN+i7777TK6+8Uqtlp26//XZ99913uvbaaxUfHy+r1aq2bdvqpptu0oYNGzRu3Lhqz580aZL27Nmjxx9/XEOGDFGrVq3k6+ur4OBgde3aVX/4wx/0xhtv6NChQ0pMTKzX8wVasvL1NH5+fnI4HCalcY9GW4a1ceNGSarVzR4AAAAAAAAAAAAA0Lz16tVLL730Up3Oeeyxx/TYY4/VeNzIkSNr/eF/RESECgsL65TjTPV5HpI0ceJETZw4scbjYmJi9I9//EP/+Mc/6pHO1XnnnacPPvig3ue3bt1ajz76qB599NEGZwHgqnwRk2EYstvtJqVxD48UMS1cuLDS9n//+99av359tecWFRUpLS1Nb731lgzD0IABAzwREQAAAAAAAAAAACYpLS1VUFCQbDabSktLzY4DAADQ5FS2shlFTJWYOHGiDMNwaXM4HPp//+//1boPh8MhHx8fTZ061d3xAAAAAAAAAAAAYKLCwkKdc845kqRNmzbJYrFoyJAhFT5fAgAAQOUsFot8fHxcCsJtNpuJiRqu5oUu68nhcDj/VNZW3R8/Pz8NGTJEn376qUaMGOGpiF7x22+/6f7771e3bt0UHBysqKgoDRgwQDNmzFB+fr7bxvn88881ZswYtWvXTv7+/mrXrp3GjBmjzz//vNZ92Gw2vfHGGxo2bJhiYmIUGBioLl26aPLkydq6davbsgIAAAAAAAAA0FQ0pff5m5LyH7D5+PhQwAQAAFBH5WdjaupFTB6ZiWnv3r3ObYfDoc6dO8swDH355ZdKSkqq8jzDMBQQEKDo6GhZLBZPRPOqpUuX6sYbb1R2drazLT8/X+vXr9f69es1Z84cLVu2TImJifUeo7S0VHfccYfmzp3r0n7o0CEdOnRIS5Ys0e23365Zs2bJx6fqmrXjx48rOTlZ69atc2nfs2ePZs+erQULFuiVV17R7bffXu+sAAAAAAAAAAA0JU3pff6mpvwHbJUthwIAALzr8LffauPzz+vYzp0qKSiQX2CgYs46S33+9Ce1uegis+OhEn5+fioqKnI+poipEh07dqy0PT4+vsp9zc2GDRt03XXXqaCgQCEhIXr44Yd1wQUXqKCgQO+//77efPNN7dq1S6NHj9b69esVGhpar3H+8pe/OH+x6du3r6ZPn64uXbooLS1NzzzzjDZs2KA5c+YoJiZG//znPyvtw263a8yYMc4CprFjx2rSpEmKiorSTz/9pCeeeEJHjx7V5MmT1bZtW/3+97+v3w8FAAAAAAAAAIAmoim9z98U2e12l8cUMQEAYJ6Dy5ZpxbRpOpKaWmHfkbQ0bVm+XG0SEzXyhRfUbvRoExKiKszEVA9nrr/XUkydOlUFBQXy9fXVV199pcGDBzv3XXjhhUpKStL06dO1a9cuPffcc3rsscfqPMauXbv07LPPSpL69++v1atXKzAwUJI0YMAAXXHFFRoxYoTWr1+vGTNm6NZbb6302yALFizQ999/L0m666679Oqrrzr3DRw4UL///e917rnnKjs7W/fee6+2b98uX1+vXDoAAAAAAAAAAJiiKb3P3xQxExMANE779u0zOwK8bNfs2Vp2992y11D8cjg1VYuvukqjX31VXe+4w0vpUJPmVsTUfOYdbUTWrl2r7777TpJ02223ufxiU+b+++9X9+7dJUkvvviiSkpK6jzOCy+84LwAX375ZecvNmWCgoL08ssvSzp9oc6cObPSfsp+QYqKitKMGTMq7E9MTNTDDz8sSUpNTdUnn3xS56wAAAAAAAAAADQVTe19/qaIIiYAAMx3cNmyWhUwlbHbbFp29906uGyZh5OhtihiQo2WLFni3L7lllsqPcbHx0c33XSTJCkzM1MrVqyo0xgOh0P//ve/JUndunXTeeedV+lx5513ns466yxJ0r///W85HA6X/bt27dL27dslSddee62CgoIq7WfixInObYqYAAAAAAAAAADNWVN6n7+poogJAADzrZg2rdYFTGXsNptWTpvmmUCos/Kvocov2dvUuHVNsFtvvVWSZBiGc/3mM9vro3xfTUHZ0mzBwcE699xzqzxuxIgRzu2UlBRdcskltR5j7969Sk9Pr9BPVePs3LlThw4d0r59+9SpU6cKWWvqp02bNuratat27dqllJSUWuesD59Te6Vj9aiv8wuS/AIr35d/UlI9f7HzDZSslRd3qeCU5Kjncom+/pI1pPJ9hVlSaT0rJC1+kn9Y5fuKsiV73b8NJEny8ZUCwivfV5wr2Yrq16/hIwVGVtFvvmQrqF+/MqSgqMp3lRRIJflVnumTm6uo0mOnt0/slorK/T0FRVd+oq3o9M+ivgIiJZ9Krn1bsVScU/9+/cMlSyW3e7tNKsqqf7/WUMnXWrG9tFQqPNWAfkNO//uoTP6J+vfbhO8RRn6OAh15/90+IZUc4x4hmXaPqFEzv0fUeI8swz3iNF5HnOahe4SRl+96f7QUn9Ev94jT/fI6wskL94ha3yPLcI84jdcR/+PGe8SZ16ORd8z1Hunsl3uEE68jTvPgPcIn61Td7pFluEf8T3N7HVH2fAKjKh8fMFlTep+/qaKICQAAc2V8842OpKbW69zDqak6/O23anPRRW5OhbpqbjMxubWIaf78+TIMQ5JcCo/ObK8Lh8PRJIuYymY2SkxMlK9v1T/ibt26VTintrZt21ZpP7UZ58xfburaz65du3TgwAHl5eUpODi41nkPHjxY7f6MjAzndvC/rpPCeOMC5gmRNKnswYI3TUwCnBYq6d6yB2+8aGISgHskGhfuj2hsuEeiMXG5HmdxPcJ83CNRlZw7N8pRVYGWh+Tl5Xl1PDRNTel9/prU5f35nJwcZWdn17rvhigudi2yttlsXhsbzVdubm6l2+5ks9lUWloqh8PR5Ge7QM3O/Dvm77vlcDgcKi0t9cj/Td64T9XWL88+2+Dzhw4Y4KY0qK/ySxoXFxd77TVVTk4DvvhSBbcWMXXo0KHSYqWq2pujwsJCHT9+XJLUrl27ao+NjIxUcHCw8vLydODAgTqNc+YvHTWN0759e+d2+XHq04/D4dDBgwed09fWxpkZAAAAAAAAAECS5s2fpwKj9l+WdIesrAbMFocWoam9z1+Turw///bbbys8vIoZ8NysX79+slr/N/vil19+qczMTK+MjZbh7bff9ki/ffr0UXh4uEJCQnT06FGPjIHG6cSJBszgiialuLhYubm5ysrK0qeffuqxcTx1n6qtVmcUVNdHxtatev31192UBvUVFhamHj16OB8XFBR47e/FE79bubWIad++fXVqb47OrDQLCal5WuyyX27qWmVZl3HOnDGp/Dju6gcAAAAAAAAAgOagqb3P31RZLBaXx0196RMAAJoae1E9l+cuO7+4kqXr4XWFhYXKyMhQSUmJbDZbhZmZmhq3FjHh9AVS5sxvEFTF399f0ulqOE+NUzZGZeO4q5+a1PTNkIyMDA0cOLBOfQIAAAAAAABo2m6ZeIvXl5PbtWuXnnzySa+Oiaalqb3PX5O6vD8/YcIEtW3btk7919fmzZtdCpeuuOIKr80CheYrNzfXObPJhAkTalWIWFeHDh1SaWmp/Pz8FBsb6/b+0bjY7XbnDEzR0dEVCjDRPOXk5Cg0NFTh4eEaPHiwW/v2xn2qtpbMnq3sBswoFxgSonFTprgxEerLrOvq0KFDbv/diiImNwsICHBul1/PuTJF/61uDAwM9Ng4RWdUUJYfp3w/Zz6uSz81qWkq3DPlXf2BlNSlTv1LkvyCJL8qcuWflOSoe5+S5BsoWYMq31dwSnKU1rNff8laxc2jMEsqree3Tix+kn9Y5fuKsiV7PSsvfXylgCp+gSzOlWz1rNQ1fKTAyCr6zZdsdfuF/IyOpaCoyneVFEgl+VWemZubq/fef0+SNH7c+Io3+areWLMVnf5Z1FdApOTjU0m/xVJxA9YT9Q+XLJXc7u02qagBU/xZQyXfSt5cKS2VCk81oN+Q0/8+KpPfgKlam/A9IicnR/Pmz5N0+s3dUL9S7hGSafeIGjXze0SN98gy3CNO43XEaR66R+Tk5Wve+59I+u/9MTT0jH65R5zul9cRTl64R9T6HlmGe8RpvI74HzfeI868HsdNnKLQsEp+xtwj/ofXEad58B6Rm3WqbvfIMtwj/qe5vY747/MJDYyqfHwPOnNGG6AyTe19/prU5f350NBQhYVVcT93Mz8/P5ciJj8/P6+NjZYhJCTEI9fUkSNHZLPZZBgGBS0tjMVi4e+8hTAMQz4+PvL19fXo/02euk/VVmy3bjq6Z0+9z4/p1o3/uxshb15X2dnZbu+TIiY3O/ODk9pM6ZqXlyepdlPS1necsjEqG6d8P9UVMVXXjzuVRnaSYs5yb6fBrdzbH/16qV/PdFuTUv9snfSJOb0dnSQ16/9823im21APffukyV3D7unXYbeqwDj9D8IRFO25a7KR/xwq9uuZbnGmivcIt9wjuUfQr5v6dfhnu94fg8+4HrlHeAGvI8r369bXkY3w31zz6tcz3TYmZ16PjuAY13ukV3CPoF/Xfkt9PfC7NveIJsxD9wjATZra+/xNla+v60dUTX3pEwAAmpre992nLcuX1/v8Pvfd58Y0wGne/YpLCxAQEKDo6NPfIjp48GC1x546dcr5i0f79u3rNM6Z35yoaZwzp4otP059+jEMo07f3AAAAAAAAAAAoKloau/zN1XlZzOhiAkAAO+Ku/hitU5MrNe5bRIT1eaii9ycCHDzTEydO3d2Z3eSThfMpKWlub1fT+rRo4e+++47paamymazVfg2QZkdO3Y4t7t3717nMSrrp67jlO+nT58+NfbTvn17plwGAAAAAAAAADRbTel9/qaqVatWWr9+vWw2m6644gpn4RgAAPCeC154QYuvukp2W+2XFrf4+WnkCy94LhRaNLcWMe3bt8+d3Uk6XcTU1AwdOlTfffed8vLy9PPPP2vQoEGVHrdq1Srn9pAhQ+o0RqdOnRQfH6/09HSXfiqzevVqSVLbtm2VkJBQIeuZecaNG1dpH4cPH9auXbvqlRUAAAAAAAAAgKakKb3P31SFhobq+PHjkqTg4GBZrVaTEwEA0PK0Gz1ao199VcvuvrtWhUwWPz+NfuUVtRs92gvp0BK5tYjp5ptvdmd3TdZVV12lJ598UpI0b968Sn+5KS0t1cKFCyVJERERuuCCC+o0hmEYuvLKK/X6669rx44d+vHHH3XeeedVOO7HH390fkPjyiuvrFAU1rVrV3Xv3l3bt2/Xhx9+qOeee05BQUEV+pk/f75ze8yYMXXKCgAAAAAAAABAU9KU3ucHAABoiK533KGgtm21cto0HU5NrfK4NomJGvnCCxQwwaPcWsQ0b948d3bXZA0cOFDDhg3Td999p7lz5+rmm2/W4MGDXY557rnntH37dknS1KlT5efn57J/5cqVzl94br75ZpciojLTpk3T7NmzZbfbdc8992j16tUKDAx07i8oKNA999wjSfL19dW0adMqzfvAAw/otttu08mTJzV9+nS98sorLvvT0tKcv6wlJiZSxAQAAAAAAAAAaNaa2vv8AAAADdFu9GjdOHq0Dn/7rTbOnKljO3eqJD9ffkFBijnrLPW57z61uegis2OiBXBrERP+58UXX9SQIUNUUFCgSy65RI888oguuOACFRQU6P3339fs2bMlnZ4J6f7776/XGF27dtWDDz6op556SuvXr9eQIUP00EMPqUuXLkpLS9PTTz+tDRs2SJIefPBBJSUlVdrPzTffrLfeekspKSl69dVXdfjwYU2aNEmRkZFau3at/u///k/Z2dny8fHRSy+9VOXa3wAAAAAAAAAANBdN6X1+AAAAd2hz0UW6lGIlmIhqFA/p27evPvjgA914443Kzs7WI488UuGYrl27atmyZQoNDa33OP/4xz909OhRvfXWW9qwYYPGjRtX4ZjbbrtNTzzxRJV9WCwWLVmyRMnJyVq3bp0++ugjffTRRy7H+Pv765VXXtHvf//7emcFAAAAAAAAAKCpaErv8wMAKkpISNBvv/1W5Wx4Znrsscf0+OOPS5IcDofJaQCg8fAxa2CHw6G0tDStW7dO69atU1paWrO7QV9++eX69ddfdd9996lr164KCgpSRESE+vfv7/z2RGJiYoPG8PHx0dy5c7Vs2TJdeeWVio+Pl9VqVXx8vK688kotX75cc+bMkY9P9X/VrVq10g8//KDXXntNQ4cOVXR0tAICAtS5c2dNmjRJP//8s26//fYGZQUAAAAAAAAAoClpSu/zN1WGYaikpES5ubkqLS01Ow4AAABM5PWZmL744gu99tprWrlypfLy8lz2BQUFaeTIkbrrrruazYw/HTt21PPPP6/nn3++TueNHDmyTkVdycnJSk5Orms8F76+vpoyZYqmTJnSoH4AAAAAAAAAAGgumtL7/E2Jw+FQ//795evrqy1btkiSBgwYoKCgIJOTAU2P/fBhFf/8s+yHD8tRXCzDapWlTRtZzz1XljZtzI4HAECtea2IKT8/XxMmTNCSJUskVT4tXl5enpYvX67ly5friiuu0DvvvKPg4GBvRQQAAAAAAAAAAIAXGIZRoa2kpMSEJEDTZTt0SIVffin7gQMV9tkPHlTx+vWytG+vgFGj5Nu2rQkJAQCoG6/MPVpaWqrk5GQtWbJEDodDvr6+Gj16tB5//HG98cYbeuONN/T444/rsssuk5+fnxwOhz799FMlJyc3uyXmAAAAAAAAAAAAINlsNpfHFDEBtVeya5fy5s+vtIDpTPYDB5Q3f75Kdu3yUjLPSE9P15///Gf169dP4eHh8vPzU+vWrdWrVy+NHz9e8+fPV3Z2tqTTM+EZhqHffvtNkrRgwQIZhuHyZ+TIkS79nzp1SvPmzdONN96oHj16KCQkRFarVW3bttX48eP1zjvvqLi4uMp8+/btc/Y9f/58SdLHH3+s5ORkxcfHy9fXVyNHjtT8+fNlGIYef/xx57nlsxmGoX379rn15wcATYVXZmKaNWuWVq9eLcMwNGrUKM2ZM0dtq6j2PXTokCZNmqQvvvhC33//vd544w2WNwMAAAAAAAAAAGhmKGIC6sd26JDyFy+Wyv0bqvoEm/IXL1bwxIlNckam7777TpdddpmzSKnM0aNHdfToUW3ZskXvv/++WrVqpcsuu6xeY/Tt29dZ9HSmI0eO6MiRI1q1apXee+89LV++XG1qWKLP4XDopptu0ttvv12vLADQknmliGnBggWSTq9lvGzZMvn4VD0BVNu2bbV06VINGTJEa9eu1YIFCyhiAgAAAAAAAAAAaGbKFy1RxATUTuGXX9a+gKmMzabCL79UyK23eiaUhxQVFWncuHHKzs5WaGiopkyZogsuuECxsbEqLi7W3r179cMPP+iTTz5xnjNv3jzl5eVp1KhRSk9P15VXXqknnnjCpd/g4GCXx3a7XYMGDdJll12mvn37qnXr1iouLlZaWprmzZunFStWaMOGDRo3bpxWrlxZbeYXXnhBv/76q4YNG6YpU6aoa9euyszM1L59+3TVVVepf//+eu211/T6669LkjZv3lyhj6omBAGA5s4rRUzbt2+XYRi67777qi1gKmOxWPSnP/1J48aN0/bt272QEAAAAAAAAAAAAN7ETExorhwOhxz5+R7p2370aI1LyFV57oEDKtm7V5bYWDenkoygIBmG4fZ+U1JSlJ6eLkl69913K8y0dN5552n8+PGaOXOm8v/7M+/UqZMkyc/PT5IUERGhnj17VjvOf/7zHyUlJVVoHzRokC6++GK9//77+tOf/qRVq1bp22+/1UUXXVRlX7/++qtuuukm59Jx5UVERCj2jL+DmrIBQEvilSKmsptz165da31O2X8SnvjPDgAAAAAAAAAAAOZiJiY0V478fOU8+6zZMSqVv3ChR/oNfeABGeVmN3KHw4cPO7eHDx9e5XG+vr4KCwur9ziVFTCdady4cVq4cKE2btyoJUuWVFvEFBERoVdeeYXPuQGgHmqeFskNunTpIun0uqS1VXZs2bkAAAAAAAAAAABoPpiJCUBN4uLinNvz5s3zypgOh0OHDx/Wrl27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Z2RkaNu2bSoqKnJCVACAxqS4uFh//PGH0tPTK5S1bNlSkZGR9R8ULggkMQGotoKCAt1+++26+uqr9fHHH2v//v06c+aMcnJytGPHDs2cOVMdOnTQ0qVLK23r+PHj6tOnj6ZOnaqtW7cqNzdXubm52rhxox544AHdcsst5aa9laSbb75ZXl5ekqQFCxY4bL+4uFiLFy+WJA0ZMkRBQUFVupbc3Fzt2rVLr732WpWvxZ4VK1aoXbt2euGFF5SYmKisrCwVFhbq4MGD+vTTT3XllVfq/vvvr3Cdtnz00Ue6/PLL9dlnnyk1NVWFhYVKTU3VvHnzFBMTo0WLFjk8fubMmercubNef/117dixQ9nZ2SooKND+/fv13//+V7169dIzzzxT42sFAAAAAAAAADiXwWBQmzZt1L59+wplOTk52rp1q/Ly8pwQGQCgMcjPz9fWrVuVlZVVoaxdu3Zq164dy5vCLpKYAFSLxWLR8OHD9dlnn0mShg0bpk8++URr167V+vXr9cYbb6h169bKy8vT8OHDK53Z55ZbblFSUpIefPBBrVy5Ups3b9aCBQvUqVMnSdLSpUv1/vvvlzvGz89PN9xwgyTpq6++UkFBgd32ly1bplOnTkmS7rjjjipdyy+//KKlS5fqueeeq9a12JKYmKhhw4YpOztbbm5umjJlilatWqUNGzZo9uzZioqKkiS98847evzxxytta9KkSQoNDdVbb72l33//XatXr9ajjz4qDw8PFRYW6o477rAb54wZM/TII4+ouLhYl156qd599139+OOP2rRpk+bPn68+ffrIYrHo+eef15tvvlntawUAAAAAAAAANBxhYWGKjo6Wq6truf0FBQXaunWr9bNzAABqU2FhYYX7t66ururatatatmzppKhwoTA6OwCgvp3MLazxsT4eRnm6udosO5VXJIvFUqN2vdxd5e1u++V4Or9I5pKqtdvE16NG56+ODz74QN9//73c3Ny0ZMkSXXfddeXKL7vsMt1555268sortXPnTj300EMOl0vbuHGjVqxYof79+1v39ejRQ4MHD1bnzp11/PhxzZo1SxMnTix33B133KHPP/9c2dnZ+u677zR8+HCb7ZfO1OTv76+hQ4dW6VrMZrPS09PVs2dP3Xvvverfv3+VrsWWCRMmqKioSK6urvruu+80aNAga1lcXJxGjBihvn37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TD3yyCPl6qxfv14ffvihpLN/eMTFxdlsq/QXRkREhA4cOFDpuUuXkjMajRo1alSV4t2+fbu8vLysa3rbMmfOHH3wwQeSpObNm9da0hUuTPHx8Zo2bZqks29Gs7Oz9dprr+nLL7/U/v375e3trdjYWD311FO6/PLLrcelp6frzTff1Ndff60DBw7I09NTffv2VXx8vLp37+7wnCUlJVqwYIEWLFigLVu26NSpUwoICFDXrl01YsQIjR8/3uEf+NLZzP3p06frm2++0cGDB+Xn56dLL71UEydO1IgRIyq97tLX47PPPqv4+Hi79fr376/Vq1erX79+SkhIqLTdc+3YsUPffPON1qxZo507dyojI0Nubm5q0aKFLr/8ct177702Z3hLSEio8MFFVFRUhXqrVq2yOd30N998o/nz5+v3339Xenq6PD091a5dOw0bNkwPPvhgpescp6am6qWXXtKyZcuUlpam4OBgxcbG6sEHH9TAgQOr9yDYUdXnAAAAAAAAALgQ7N692zpjSceOHR3WLVuenJxcrSSm1NRUh+VHjx61bufk5Cg7O7vKbZ+P3Nxcm9vA+aBfNQx+fn7y8/NTy5YtVVRUpNzcXOXm5qqwsFAmk8l6f8kWR0udVcZRu3l5eSoqKrKZVGWPi4uLXFxcFBUVpf3799vsU7t27apxzHl5eXbjPZ/EooKCArvtenl5KTw8XNLZxysnJ6fG50HNME6hLjirX9XFGEISUx145JFH9Pnnn2v37t2aOnWq9u7dq5EjR8rLy0urVq3Siy++KJPJJC8vL73++uu1cs6kpCRt3rxZknTdddcpNDS0Ssdt3rxZ48eP14ABA/S3v/1N0dHRatKkiUwmk3bt2qX58+drxYoVks5OJzhnzhz5+PjUSsy48B0+fFgDBw7U7t27rfvy8vK0bNkyrVixQgsXLtSIESP0xx9/aMiQITpy5Ii1Xn5+vpYsWaL//e9/WrZsmd0/uk+dOqUbbrhBa9euLbf/xIkTSkhIUEJCgt5++20tW7ZMERERNttITk7WwIEDlZaWZt1XUFCgn376ST/99JPGjRunq6666nweilphKxFJOvuNrL1792rv3r36+OOP9dhjj+mll16qlXNmZmZq+PDh+vnnn8vtLyws1ObNm7V582bNmjVL3377rd3lMdesWaOhQ4eWe0N89OhRLV26VEuXLiXhCAAAAAAAALChbHJRq1atHNYtveEsnf1ctjrKHluZTz75xDqjSn365JNP6v2cuPjRry5MzZs3l4eHh4xGo9zc3GQ0Gq3brq6uDo/9448/9P3339ss69q1q3x9fasVS0lJiUpKSqyzItnqU126dKnxEp979+7VDz/8YLOsbdu2atq0qSTJbDbLZDKpuLjY4b9lt3/66acaxYT6xTiFulCf/SorK6vW2ySJqQ74+fnp+++/15AhQ7Rnzx7NmTNHc+bMKVfH399f8+fPV0xMTK2cs3QWJkkaPXp0tY41m8368ccf9eOPP9qt06RJE3344YcaNmxYjWPExWfEiBFKTU3V448/ruuuu07e3t769ddf9eyzzyo7O1t33323YmNjNXToUJ05c0YvvPCC+vXrJzc3Ny1fvlwvvPCCCgsLNXbsWO3Zs6fCbEpms1lDhw7V+vXrJZ2duez+++9XVFSU0tLS9NFHH+mbb75RcnKyrrnmGiUmJlZ4A5qdna3BgwdbE5huu+02jRkzRqGhodq9e7dee+01zZ07Vzt27KifB80Bk8kkHx8fXX/99br66qvVsWNH+fv7Kz09XTt37tSbb76pgwcP6uWXX1aHDh00btw467FxcXHavn27vv32Wz311FOSpP/9738KCwsrd46yszMVFhZq4MCB2rJli1xdXTVq1CgNGTJEUVFRKi4u1i+//KLXXntN6enpGjJkiLZu3VohUezQoUPWBCYXFxdNmDBBw4cPV0BAgP744w+9/PLLio+PV2xsbB0+cgAAAAAAAMCFp+w31yu7sV72y8XM2gDgYnbs2DG7ZQaDoUJiU9l/Hc0Icj7Ls5lMJrtlVV3+rlRJSYk12cjRDE6HDh3S4cOH7S5FBwAXK5KY6ki7du20detWvfPOO1q0aJH27t2roqIihYeHa8iQIfrnP/9pd9aY6iopKdH8+fMlSYGBgbrhhhuqfOyQIUP04Ycfav369dq6dauOHz+ukydPymKxKDg4WN26ddN1112nsWPHyt/fv1bidYaSEosy86s+PeSFLsjbXS4udb9+bWJiolavXq3evXtb98XGxqp9+/YaOnSocnJy1Lt3b1ksFm3YsEFt27a11uvVq5dCQkI0efJkHTp0SN9//32FpQrfe+89awLT6NGjNW/ePOv0mT179tSwYcP05JNP6sUXX1RKSoqef/55TZ8+vVwbzz//vPWbSS+++KIef/xxa1nPnj01fPhwDR061DrjmDPFxMQoNTVVgYGBFcoGDx6s+++/X0OHDtXKlSs1bdo0jR492vqtAx8fH3Xt2lWbNm2yHtOhQwdFRkbaPd9zzz2nLVu2KDAwUD/++KN69uxZrrxv376644471KdPHx09elRPPPGEdawp9fDDD1tnYPr00091++23W8tiY2M1YsQIXXnlleXiAgAAAAAAAHB2tvhS537B81weHh7W7TNnzlTrPJXN3HT06FH16tVLknTnnXeqZcuW1Wq/pnJzc60zBdx5553VniEFsIV+BXvy8/NVXFxsndXI1k9p2blKE5Vs9anU1FRlZ2dbE6tKf1xdXSvsMxqNcnFxOa+l4nDhY5xCXXBWvzpy5EitrSBUiiSmOuTj46OpU6dq6tSpNTq+qlm1Li4u1Z4+tlRoaKjuuusu3XXXXTU6/kKRmV+knv+2P9PUxWbzUwPVxNej8orn6aGHHiqXwFTq+uuvV0REhA4ePKiMjAy9++675RKYSo0bN04PP/ywCgoKtGbNmgpJTO+8844kqWnTpnr77bdtvqmbNm2avvrqK+3atUvvv/++nnvuOesf9EVFRfrwww8lSZdeeqkee+yxCse7ubnpww8/VJs2baqdLV/bQkJCHJa7u7trxowZiomJ0cGDB5WYmFgh8aiqcnNzrY/v888/b7ediIgIPf3007rvvvu0aNGicktKHjt2TF9//bUkaejQoeUSmEr5+flpzpw5NvsJAAAAAAAAcD5q4ybw3LlzNXbs2PMPpgY8PT2t20VFjr+EW3a2Di8vr2qdp7Kl6sry8/NzyheafX19L+gvUqNhol+hrKr2BYvFYp0pqbi4WFlZWdq2bZsk232qc+fOtR4rGg/GKdSF+uxXpZNd1CaXWm8RQKMxcuRIu2WXXnqppLMfJNx2220263h5eal9+/aSpH379pUrS0tLU3JysiTp1ltvtbuesNFotC6rlpmZqS1btljLNm/erMzMTEnSmDFj7H6o0apVKw0aNMjutThLYWGhDh06pKSkJO3YsUM7duwol9xY+qa5JlavXm1do3T48OEO61511VWSzn7TYPPmzdb9q1atktlslqRyS9udq1evXurSpUuNYwUAAAAAAAAuRmU/86xsibi8vDzrNjM2AEDdKV2yztvbWwEBAQoMDKz2DHgAgJpj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AAAAAAAAAMCpSGICAAAAAAAAAAAAAAAA4FQkMQGolvj4eBkMBhkMBklSdna24uPjFR0dLV9fX4WGhmrIkCFat25duePS09P11FNPqUuXLvLx8VGTJk104403auvWrZWes6SkRJ9++qmGDBmi5s2by93dXU2bNtWAAQM0a9YsFRUVVdpGZmamHnvsMXXs2FFeXl4KDQ3VwIEDtWjRoipdd+k1x8fHO6zXv39/GQwG9e/fv0rtnmvHjh3697//rcGDB6tVq1by8PCQr6+v2rdvrzFjxui3336zeVxCQoIMBoPGjRtn3RcVFWWNu/QnISHB5vHffPONRowYodatW8vT01OBgYGKjY3VtGnTlJmZWWncqampmjx5stq0aSNPT0+FhYXphhtu0I8//lijx8GRBQsWqH///goKCpKvr6+6du2qZ599VqdPn5ZU9ecKAAAAAAAAAAAAANBwGJ0dAIAL1+HDhzVw4EDt3r3bui8vL0/Lli3TihUrtHDhQo0YMUJ//PGHhgwZoiNHjljr5efna8mSJfrf//6nZcuWacCAATbPcerUKd1www1au3Ztuf0nTpxQQkKCEhIS9Pbbb2vZsmWKiIiw2UZycrIGDhyotLQ0676CggL99NNP+umnnzRu3DhdddVV5/NQ1IqEhASbj0NRUZH27t2rvXv36uOPP9Zjjz2ml156qVbOmZmZqeHDh+vnn38ut7+wsFCbN2/W5s2bNWvWLH377be67LLLbLaxZs0aDR06VNnZ2dZ9R48e1dKlS7V06dJaSyYymUwaNWpUhcSznTt3aufOnfr000/rJGkKAAAAAAAAAAAAAFD3SGICUGMjRoxQamqqHn/8cV133XXy9vbWr7/+qmeffVbZ2dm6++67FRsbq6FDh+rMmTN64YUX1K9fP7m5uWn58uV64YUXVFhYqLFjx2rPnj1yd3cv177ZbNbQoUO1fv16SVK/fv10//33KyoqSmlpafroo4/0zTffKDk5Wddcc40SExPl6+tbro3s7GwNHjzYmsB02223acyYMQoNDdXu3bv12muvae7cudqxY0f9PGgOmEwm+fj46Prrr9fVV1+tjh07yt/fX+np6dq5c6fefPNNHTx4UC+//LI6dOhQbtaluLg4bd++Xd9++62eeuopSdL//vc/hYWFlTtHVFSUdbuwsFADBw7Uli1b5OrqqlGjRmnIkCGKiopScXGxfvnlF7322mtKT0/XkCFDtHXr1gqJYocOHbImMLm4uGjChAkaPny4AgIC9Mcff+jll19WfHy8YmNjz/vx+de//mVNYLrkkks0depUXXrppcrKytKiRYv0/vvv67bbbjvv8wAAAAAAAAAAAAAA6h9JTGgcSkqkM6ecHUX98QqWXOp+tcjExEStXr1avXv3tu6LjY1V+/btNXToUOXk5Kh3796yWCzasGGD2rZta63Xq1cvhYSEaPLkyTp06JC+//573XzzzeXaf++996wJTKNHj9a8efOsy9j17NlTw4YN05NPPqkXX3xRKSkpev755zV9+vRybTz//PM6fPiwJOnFF1/U448/bi3r2bOnhg8frqFDh2rFihW1++DUQExMjFJTUxUYGFihbPDgwbr//vs1dOhQrVy5UtOmTdPo0aPl6uoqSfLx8VHXrl21adMm6zEdOnRQZGSk3fM999xz2rJliwIDA/Xjjz+qZ8+e5cr79u2rO+64Q3369NHRo0f1xBNPaP78+eXqPPzww9YZmD799FPdfvvt1rLY2FiNGDFCV155Zbm4amL79u166623JEk9evTQ6tWryyWsXXPNNbr88ss1ZsyY8zoPAAAAAAAAAAAAAMA5SGJC43DmlDSjbeX1LhaPpEg+IXV+moceeqhcAlOp66+/XhERETp48KAyMjL07rvvlktgKjVu3Dg9/PDDKigo0Jo1ayokMb3zzjuSpKZNm+rtt9+2JjCVNW3aNH311VfatWuX3n//fT333HPy8PCQdHYZtg8//FCSdOmll+qxxx6rcLybm5s+/PBDtWnTRsXFxdV/EGpRSIjj58zd3V0zZsxQTEyMDh48qMTExAqJR1WVm5trfXyff/55u+1ERETo6aef1n333adFixZpzpw58vHxkSQdO3ZMX3/9tSRp6NCh5RKYSvn5+WnOnDk2+0l1vPfeeyopKZEkzZkzp8KMW9LZRLfPPvtMy5YtO69zAQAAAAAAAAAAAADqH0lMaHBMJpOKioqqXL+kpEQWi6XSOnU/L1HDZ7FYKn2s7DEYDBWSiEaOHGm33ejoaB08eFAGg0EjRoywJqCU5eHhofbt22v79u3at29fubK0tDQlJydLOrtsnY+Pj802XFxcNHbsWD322GPKzMzUpk2b1KdPH0nS5s2blZmZKUkaM2aMNf5z4w0LC9O1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jBF/4X3EWXU5RjRv3rxaY2RV2mWMOKuxvY8AAAAAAFy8SGJCg2M0GiskxDji4uJS6Qdsjj7wOh911a7BYKiTZbPqs92y/6/J4xQWFqZOnTopOTlZixYt0vTp0+Xr61uhntls1n//+19JZ2cGio2NtZ6vZ8+eCgoKUmZmpj755BNNmTLFGmvZ+I4cOaKVK1eWi730w2CDwSAXFxdFRUVp27Zt2rx5s92Yly9frtOnT9u97rL/d3FxKff/sn343ESpsvHOmTOn3P5zz1E2Uaq4uNjuYz9w4EB5e3srPz9fb7/9tkaOHFntvnH11VfL1dXV+hzccsstFeKVziY47dixw/r/mvSHgQMHas+ePdq+fbu2bdtWLgmrrNIPxEvjqOq5ytYrPa4645A9VV2mr7oc3XxpTO26uro6vLHT0NqtrX5VX+0aDAab7bq5uclkMlm3q3tue+3Whrpqt65ey4wR59+uo2MZI+q23bp6LV/oY8T5jpH22q1NDfG17Ix2G8MYUbY/2nuvzxjxF95HnFWXr+XaHCPLtlsXGsMY4cx26/K1DAAAAAC4sF34a04BuGhNnjxZkpSRkaEHH3zQZp1p06YpKSlJknTPPfeUm4nIw8ND48aNk3R2JqAZM2ZUON5kMumee+5RUVGRw1j69esnSfr999+1du3aCuXHjh3TAw88UIWrsq3st9bLJuKU9e677+rbb7912E6LFi2s2ykpKXbrBQYG6v7775ckrVu3TlOmTHGYDHj8+HF98MEHFc514403SpKWLFmiL774osJxubm5mjhxosOYq2LixInWGy8TJkywOSPW/Pnz9cMPP5z3uQAAAAAAAAAAAAAA9Y8kJgAN1qRJk6zTi8+dO1fXXHONvvzyS23ZskXff/+9/v73v+v555+XJLVt21ZPP/10hTaeeeYZtWrVSpL06KOPatSoUVq+fLm2bNmizz77TJdffrmWLVum2NhYh7FMmDBBRqNRFotFw4YN0+uvv65NmzZp3bp1mjFjhrp3766srKwaL6HRvXt36xJ6s2fP1m233abvvvtOmzdv1rfffqsRI0bovvvu0xVXXFFpO56enpKkp59+WitXrtTu3bu1d+9e7d27V2fOnLHWfe6559S7d29J0htvvKEePXronXfe0dq1a5WYmKhVq1bp7bff1k033aTWrVvrvffeq3C+V1991boEwKhRozR58mStWrVKmzdv1ty5c9WzZ09t3bq10se3Mt26dbMmtW3atEmxsbGaN2+eNm/erJ9//ln33nuvRo8efd7nAQAAAAAAAAAAAAA4B8vJAWiwXF1d9d133+mGG27Q2rVr9fPPP+vnn3+uUK9Tp05atmyZzeXmAgICtHz5cg0cOFDHjh3TwoULtXDhwnJ1xo4dq379+llnbbKlS5cueuWVV/R///d/yszM1JQpU8qVBwcH65tvvtHTTz+tPXv2VPtaDQaDPvnkE1199dXKzMzUF198UWFmo+joaC1atEhhYWF22/Hz89ODDz6oV155RVu2bNGgQYPKla9atUr9+/eXdHamqpUrV2rs2LH66quvtG3bNuvsTLb4+/tX2BcZGaklS5bohhtuUE5OjmbNmqVZs2aVq/PMM8/IYDBo06ZNlT0MDr322mtKS0vTV199pV27dlV4vqKiovT555+rbdu253UeAAAAAAAAAAAAAED9YyYmAA1acHCwfvnlF3388ce67rrr1KxZM7m5ualJkybq37+/3n77bSUmJioiIsJuG126dNHOnTs1depUtW/fXh4eHgoJCdGAAQO0YMECzZ07t0qxTJkyRcuXL9fgwYMVFBQkDw8PRUVFafLkydq6dauuvPLK87rWmJgYJSYmatKkSYqIiJCbm5uCg4PVq1cvzZw5Uxs2bCi3XJw9L7/8st5//31deeWVCg4Olqurq926fn5++vLLL7VmzRqNHz9el1xyifz8/GQ0GhUcHKy4uDhNnjxZP/zwg1auXGmzjf79+2vnzp269957FRERIXd3dzVr1kzXX3+9li9frmnTptX4MSnLzc1NX375pT755BNdeeWVCggIkLe3tzp16qQnnnhCmzdvVps2bWrlXAAAAAAAAAAAAACA+sVMTACqJT4+XvHx8ZXWmzdvnubNm1dpvYSEhErruLi46M4779Sdd95ZeYB2BAcHa/r06Zo+fbrN8rFjx2rs2LGSJLPZrPT0dJv1Bg8erMGDB9s9j6PriYyMlMVicRhn69at9e677zqsU1kbBoNB48eP1/jx4x3WK6tv377q27dvleufKzw8vMIMTGVVtd9UxT/+8Q/94x//qJW2AAAAAAAAAAAAAAANAzMxAQAAAAAAAAAAAAAAAHAqkpgAAAAAAAAAAAAAAAAAOBVJTAAAAAAAAAAAAAAAAACciiQm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", "text/plain": [ "
" ] @@ -251,7 +245,7 @@ }, { "data": { - "image/png": "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Bx/MchlHgpjSfPTRRzbl58+fn6d1WLJkiTnfzc3NbvBOVtq2bWsu//DDD2eYf7sEMW3cuNH4+uuvjaSkpGzLLl682GadHBk6cO7cuWb58ePH50eXAQAAnMJNAAAAuGPcc889atiwofl67dq1LuzN7cN6yIt//OMfWZZNTEzUl19+ab5+66235Ovra7dsgwYNbFLdf/rpp3nsad699dZb5vBm06dPl4+PT46W37Vrl3bt2iVJcnNz03/+859Myz722GOqUaOGJCk6Olpz587NZa9zx/rzHj58uOrXr2+3nJ+fn9566y3z9RdffGEOO5RbixYtMqcbNGigwYMHZ1q2WLFievXVV83XH330UZ7aLgwK835iXf/48eNVpkwZu+XKli2rcePGOdSv6dOnKyUlRZLUvXt39ezZ02659PvM999/r7CwMLtlly1bpvPnz0uSihYtqjfeeCPT9idMmGAO0XL27FmtXLky07J55YxjgLO2F1ceAwpD+466nY7r//nPf7Rv3z7z9fz583XfffflqI4WLVpo9+7deRoaB39vObkudLYHH3zQnJ41a1aBt19Yz0V59dhjj6lUqVLma74z4Xbj7++v7777Tvfcc4/53vfff6/ffvstX+p/7LHHbL4n5rXee+65x9znUlJScjTU2alTp7RlyxbzdXZDyRVmHTt21IgRI+Tu7p5t2X79+tkMLejIMfW+++6Tt7e3JJlDywEAABRGBDEBAADcYdq0aWNOnzp1ymbeiBEjZLFYZLFYNHv27Gzrmj17tll+xIgRee7b0aNH9eKLL6pVq1YqVaqUvLy85OPjo6CgIDVt2lQjR47UN998oxs3bmRbV2JioubOnasHH3xQISEhCggIkJ+fn6pWrarBgwdryZIlMgwj23pOnTqlbdu2SZJq1qyp2rVrZ1l+48aNioiIkCQFBASof//+WZa3/tzWrFmj2NjYbPvkLPv379eUKVMkSQ8//LC6deuW4zqWLl1qTnfr1k0VK1bMtKzFYrH5kXnJkiU5bi+3YmJitG7dOvP1yJEjsyzfv39/+fv7S5KuX7+e5x/qd+zYYU737t072/LWNyB27dqlc+fO5al9Vyus+8mJEyd0+PBhu+1m168///wzwzFVkgzD0LJly8zX2W1rbdu2VfXq1SVJycnJNstas97X/vGPf2Qa1CNJvr6+Nje6nbmvOeMY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ORRUTtSqVUtDhw7VnDlzJEnvv/++FixYoObNmysoKEhnzpzRb7/9poSEBAUEBGjKlCkuG1rVz89P999/vxYuXKjo6GitW7dOd999d6blDcPQ2rVrtXbtWnl7e6tu3bqqXr26ihUrpoSEBJ05c0Y7duywyS5XqlQprVq1SkWKFMm2P+vXr1dkZKQk6Z577nHJ8aGwnoucydfXV2+88YaZPXHevHlas2aNOnfurMDAQJ0/f16//fabbt68qXr16qlnz556//3389xufu2T3bp10/Tp0/XEE08oOTlZP//8s1avXq06deqoQYMGCgwM1M2bN3X58mXt379f165dy3PfHVWxYkX16tXLZog3Ly+vXG0zTzzxhH766SetXr1aVapUUadOnVSxYkWFh4drw4YNNtddDz30UJZDk33xxRe6fPmy1qxZo4SEBL366qt655131LJlS1WqVEne3t6KiIjQyZMndfDgQTP7U9OmTXPc76ysWrXKJtteSkqKoqKiFBERocOHD9sdbnT06NH68MMP5e3tna99kaSePXuqZcuW2rFjh6TUjGu9evXKt/r9/f31wAMPaO7cuTbvFy9ePNMhlx0xceJEBQQEOFy+c+fO6t+/f67bc9T06dNtMjJWq1ZNmzdvdnhIyk8++STL+WnnLSk1SxuZmAAAQKHl0hAqAAAA5Fl+ZmJK8+abb9p92jHt31133WUcPHgw2yeGDSP7J+EXLVpk8/R9Vv/c3NyMJ598MkP2h/T27dtnNG3a1KE6pdRMCnv37s20vpkzZ+bqM162bJlRqlSpLNtu3LixcfTo0WzrOnXqlM1yc+bMcbgfeZHbp1ZTUlKMt99+2/D09Mxy/QcNGmRERkZmW9+sWbNslrP3VHluHTlyxGjUqFGW/SxdurSxYsWKbOvKyVPVCxcudGj7bNasmfHHH384vD6VKlUylx01apTDy2XG+in67P75+voa7777rk0Ghuzk536Sn7Zu3WpUrVo1y36FhIQY27Ztc7jOixcvGl26dMmyTn9/f2PWrFkO1xkfH288/fTTWR5HLRaL8cwzz2R77MxP+X0MSOOM7cVVxwBntG8Y+X8MSHM7HdcNIzVTynvvvZft9pJ+X2nfvr2xdOnSLOteunSp4evrm2VdY8aMMeLi4rLNQpTm1q1bNtkR7P3r06ePcePGDZssDfa2sXr16jm8zlWr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DMPQQw89pPnz57u6SwAAAJly7OofAAAAuMM988wz5pO0kydPLvD2169fL0kKCgpyyY0yVwoLC9OBAwckSXfffXeh/nHY1dK2Eyk18A7AneV2OQZwXMftbtCgQapbt64k6YMPPlBiYmKBtp+cnKypU6dKkqpVq6aRI0dmu0za8cHb21sTJ050av/yYu/evbpx44ak1Aw8BDDdeb766itzetSoUQ4HMAEF6Xa7lvnPf/4jwzDk4eFhBvoBAAAUVnwDAAAAABzg7++vt956S5K0fft2/fLLLwXWdmhoqA4dOiRJeuWVV3I0fNXfwYYNG2QYhiwWi959911Xd6dQS7tBed9996lFixYu7g2Agna7HAM4ruN25+bmZgYRnT9/XrNmzSrQ9ufPn69Tp05JSg2u9/DwyLJ8cnKyfvvtN0nS448/XqiHPEo7jhUpUkRvvPGGi3uDgnblyhUtWrRIUuqwh3kZSg5wptvpWubkyZNasGCBpNRzQPXq1V3cIwAAgKwRxAQAAAA4aMyYMWrSpIkk6aWXXlJKSkqBtJv2A2nFihX1xBNPFEibhUnazawBAwaocePGLu5N4XX16lUdPnxYbm5ueuedd1zdHQAF7HY6BnBcx99Br169dN9990lKHcIqNja2QNqNj4/XhAkTJEndunVT//79s11m9+7dioqKkp+fn1599VVndzFP0o4PTz/9tMqWLevi3qAgJScn69lnn1VcXJwk6cEHH1S5cuVc3CvAvtvpWub1119XYmKiSpcurbffftvV3QEAAMiWxTAMw9WdAAAAAAAAAAAAd44FCxZo586diomJ0e+//65jx45JSh328MCBA6pRo0aO6ps0aZI5VNbEiRM1adKk/O4yAAAAACfLOtcwAAAAAACF1PHjx/XRRx/luZ633npLJUqUyIce3X7mzZun7du356mOGjVq6Nlnn82nHgEAgDvFmjVr9M0332R4/4MPPshxABMAAACAvweCmAAAAAAAt6WLFy/q008/zXM948ePv2ODmNauXWv35mFOdOzYkSAmAACQJwEBAWratKnGjRunPn36uLo7AAAAAFyEICYAAAAAAAAAAFCgZs+erdmzZ+dbfZMmTWIIOQAAAOA2ZzEMw3B1JwAAAAAAAAAAAAAAAADcudxc3QEAAAAAAAAAAAAAAAAAdzaCmAAAAAAAAAAAAAAAAAC4FEFMAAAAAAAAAAAAAAAAAFyKICYAAAAAAAAAAAAAAAAALkUQEwAAAAAAAAAAAAAAAACXIogJAAAAAAAAAAAAAAAAgEsRxAQAAAAAAAAAAAAAAADApQhiAgAAAAAAAAAAAAAAAOBSBDEBAAAAAAAAAAAAAAAAcCmCmAAAAAAAAAAAAAAAAAC4FEFMAAAAAAAAAAAAAAAAAFyKICYAAAAAAAAAAAAAAAAALkUQEwAAAAAAAAAAAAAAAACXIogJAAAAAAAAAAAAAAAAgEsRxAQAAAAAAAAAAAAAAADApQhiAgAAAAAAAAAAAAAAAOBSBDEBAAAAAAAAAAAAAAAAcCmCmAAAAAAAAAAAAAAAAAC4FEFMAAAAAAAAAAAAAAAAAFyKICYAAAAAAAAAAAAAAAAALkUQEwAAAAAAAAAAAAAAAACXIogJAAAAAAAAAAAAAAAAgEsRxAQAAAAAAAAAAAAAAADApQhiAgAAAAAAAAAAAAAAAOBSBDEBAAAAAAAAAAAAAAAAcCmCmAAAAAAAAAAAAAAAAAC4FEFMAAAAAAAAAAAAAAAAAFyKICYAAAAAAAAAAAAAAAAALkUQEwAAAAAAAAAAAAAAAACXIogJAAAAAAAAAAAAAAAAgEsRxAQAAAAAAAAAAAAAAADApQhiAgAAAAAAAAAAAAAAAOBSBDEBAAAAAAAAAAAAAAAAcCmCmAAAAAAAAAAAAAAAAAC4FEFMAAAAAAAAAAAAAAAAAFyKICYAAAAAAAAAAAAAAAAALkUQEwAAAAAAAAAAAAAAAACXIogJAAAAAAAAAAAAAAAAgEsRxAQAAAAAAAAAAAAAAADApQhiAgAAAAAAAAAAAAAAAOBSBDEBAAAAAAAAAAAAAAAAcCmCmAAAAAAAAAAAAAAAAAC4FEFMAAAAAAAAAAAAAAAAAFyKICYAAAAAAAAAAAAAAAAALkUQEwAAAAAAAAAAAAAAAACXIogJAAAAAAAAAAAAAAAAgEsRxAQAAAAAAAAAAAAAAADApQhiAgAAAAAAAAAAAAAAAOBSBDEBAAAAAAAAAAAAAAAAcCmCmAAAAAAAAAAAAAAAAAC4FEFMAAAAAAAAAAAAAAAAAFyKICYAAAAAAAAAAAAAAAAALkUQEwAAAAAAAAAAAAAAAACXIogJAAAAAAAAAAAAAAAAgEsRxAQAAAAAAAAAAAAAAADApQhicoLQ0FCt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xo04cuQImpqaoFQqkZqaigkTJuCXv/wlLrvssh7PbENERCPbyXkauVwOUeznnShhNmRDTHv27AGAHr3JoZFBKZP4dFJKi4lqfxzXHlzSKIfsy5mIiIiIiIiIiCjiyKUSZMS1X38LpLnN2R5q6hRs6pim7nijFU539xfPM2IDj01ERN2bMGECnnvuuV7t89BDD+Ghhx7qdrv58+f3+EtQg8EAm83Wqzo668vzAIAlS5ZgyZIl3W6XkJCAP/3pT/jTn/7Uh+p8nXbaaXj//ff7vH9iYiL+8Ic/4A9/+EO/ayEiIjo5xCQIAtxud5iqGRiDkvpYs2ZNwOX//Oc/sXPnzi73tdvtKCoqwhtvvAFBEDB9+vTBKJGGsPHJWowbneo37VuCVgkJuykRERERERERERENCfooOfSpeoxP1futc3tEVJttAaepKze1ob7FDqVMggSdMgyVE9FQIIoiJBKJ9zERERER9U6gmc0YYgpgyZIlEATfsIkoivjf//3fHo/R8eZ1xYoVA10eDXFPXz4OY8eODXcZRERERERERERE1EdSiYBUQxRSDVE4LSfOb32r3YUas83vOjIRjRyiKEKtbu/G1tbWBgDQarU8LxARERH1kFQqhUQigcfj8S5zuVxhrKj/JIM1sCiK3n+BlnX1Ty6XY/bs2fjss88wb968wSoxJI4dO4a7774bY8aMgUajQWxsLKZPn47HH38cVqt1wI7z+eef45JLLkFaWhqUSiXS0tJwySWX4PPPP+/xGC6XC6+88grOOOMMJCQkICoqCrm5uVi2bBkOHDgwYLUSERERERERERHRyKZRypCToA13GUQ9EknX+SPJyd2XBEFggImIiIiol07uxhTpIaZB6cRUUlLifSyKInJyciAIAr788kvk5eUF3U8QBKhUKsTFxUEqlQ5GaSG1bt06XHvttTCbzd5lVqsVO3fuxM6dO/Haa69h/fr1GDVqVJ+P4fF48Otf/xqvv/66z/KKigpUVFTg008/xS233IJXX33V25Y1kPr6eixcuBA7duzwWV5cXIxVq1bhrbfewgsvvIBbbrmlz7USEREREREREREREUWSSLrOH2kChZiIiCJR9ddfY89TT6HuyBE429ogj4pCwujRmPzb3yLprLPCXR4RDXNyuRx2u937M0NMAWRmZgZcnpKSEnTdcLN7925cddVVaGtrg1arxQMPPIAzzzwTbW1teO+99/C3v/0NBQUFWLRoEXbu3AmdTten4/z+97/3frCZMmUK7rvvPuTm5qKoqAh//etfsXv3brz22mtISEjAn//854BjuN1uXHLJJd4A06WXXoqlS5ciNjYW//3vf/HII4+gtrYWy5YtQ2pqKs4777y+/VKIiIiIiIiIiIiIiCJEJF3nj0QMMRFRpDu+fj02rVyJmsJCv3U1RUX4acMGJI0ahfnPPIO0RYvCUCERjQTsxNQHneffGylWrFiBtrY2yGQybNy4EbNmzfKu+8UvfoG8vDzcd999KCgowJNPPomHHnqo18coKCjAE088AQCYNm0atm7diqioKADA9OnTceGFF2LevHnYuXMnHn/8cdx0000B7wZ566238O233wIAbrvtNrz44ovedTNmzMB5552HqVOnwmw2484778ShQ4cgk4XkpUNEREREREREREREFBaRdJ1/OGCIiYai0tLScJdAQ1TBqlVY/5vfwN1NWKC6sBAfXnwxFr34IvJ//esQVUdEI8lwCzENn76jQ8j27dvxzTffAABuvvlmnw82He6++26MHTsWAPDss8/C6XT2+jjPPPOM9wX4/PPPez/YdFCr1Xj++ecBtL9Qn3766YDjdHxAio2NxeOPP+63ftSoUXjggQcAAIWFhfjkk096XSsRERERERERERERUaSItOv8kYidmIgoUh1fv75HAaYObpcL63/zGxxfv36QKyOikYghJurWp59+6n184403BtxGIpHg+uuvBwA0NTVh06ZNvTqGKIr45z//CQAYM2YMTjvttIDbnXbaaRg9ejQA4J///Kffh4KCggIcOnQIAHDllVdCrVYHHGfJkiXexwwxEREREREREREREdFwFknX+SMVQ0xEFKk2rVzZ4wBTB7fLhc0rVw5OQUQ0op0cYnK73WGqZGAM6JxgN910E4D2N5od8zd3Xt4XJ48VCTqmZtNoNJg6dWrQ7ebNm+d9vG3bNpxzzjk9PkZJSQkqKyv9xgl2nCNHjqCiogKlpaXIzs72q7W7cZKSkpCfn4+CggJs27atx3X2haSxBKjrQ75OrgbkUYHXWU0A+vjBThYFKAKHu9DWCIh9nC5RpgQU2sDrbM2Ap48JSakcUEYHXmc3A+7e3w0EAJDIAJU+8DpHC+Cy921cQQJExQQZ1wq42vo2LgRAHRt4lbMN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TAy2b9+OP/7xjzCbzZBIJHjuuec4LzURERERERERERERDXuRdJ2fiIjCJ+mss3Auw0pERAOCaZRBMmXKFLz//vu49tprYTab8bvf/c5vm/z8fKxfvx46na7Px/nTn/6E2tpavPHGG9i9ezcWL17st83NN9+MRx55JOgYUqkUn376KRYuXIgdO3bgo48+wkcffeSzjVKpxAsvvIDzzjuvz7USEREREREREREREUWKSLrOT9SdrKwsHDt2LGhXsHB66KGH8PDDDwMARFEMczVEREQUTpJwHVgURRQVFWHHjh3YsWMHioqKht0bkwsuuAD79u3DXXfdhfz8fKjVahgMBkybNs1798SoUaP6dQyJRILXX38d69evx0UXXYSUlBQoFAqkpKTgoosuwoYNG/Daa69BIun6/+r4+Hh89913eOmllzBnzhzExcVBpVIhJycHS5cuxa5du3DLLbf0q1YiIiIiIiIiIiIiokgSSdf5I5UgCBBFEW63e9h9T0REREREvRPyTkxffPEFXnrpJWzevBmtra0+69RqNebPn4/bbrtt2HT8yczMxFNPPYWnnnqqV/vNnz+/V2/WFy5ciIULF/a2PB8ymQzLly/H8uXL+zUOEREREREREREREdFwEUnX+SOJKIrQaDQQBAFtbW0A2r8nkkql/RrXXV0Nx65dcFdXQ3Q4ICgUkCYlQTF1KqRJSQNROhERERENkpCFmKxWK6677jp8+umnAAK3g2xtbcWGDRuwYcMGXHjhhXjnnXeg0WhCVSIRERERERERERERERGFgCAIfsv604nJVVEB25dfwl1e7rfOffw4HDt3QpqeDtWCBZClpvb5OEREREQ0eELSe9Tj8WDhwoX49NNPIYoiZDIZFi1ahIcffhivvPIKXnnlFTz88MM4//zzIZfLIYoiPvvsMyxcuJCtQ4mIiIiIiIiIiIiIiIahk78D6ut3Qs6CArSuXh0wwNSZu7wcratXw1lQ0KfjDBWVlZX4n//5H5x66qnQ6/WQy+VITEzEhAkTcPXVV2P16tUwm80A2juCCYKAY8eOAQDeeustCILg82/+/Pk+4zc2NuLNN9/Etddei3HjxkGr1UKhUCApKQkLFizAqlWr4HA4gtZXWlrqHXv16tUAgI8//hgLFy5ESkoKZDIZ5s+fj9WrV0MQBDz88MPefU+uTRAElJaWDujvj4iIiIaukHRievXVV7F161YIgoAFCxbgtddeQ2qQlHtFRQWWLl2KL774At9++y1eeeUVTm9GREREREREREREREQ0zAxEiMlVUQHrhx8CLlcPd3DB+uGH0CxZEpEdmb755hucf/753pBSh9raWtTW1uKnn37Ce++9h/j4eJx//vl9OsaUKVO8oafOampqsHHjRmzcuBGvvPIKNmzYgKRupugTRRHXX3893n777T7VQkRERCNLSEJMb731FgBg+vTpWL9+PSSS4A2gUlNTsW7dOsyePRvbt2/HW2+9xRDTCFNRUQG9Xg+NRgOtVtvv+a+JiIiIiIiIiIgofFwuF1paWrz/BEHA6NGjw10WEQ0BAxFisn35Zc8DTB1cLti+/BLam27q9fHCyW63Y/HixTCbzdDpdFi+fDnOPPNMGI1GOBwOlJSU4LvvvsMnn3zi3efNN99Ea2srFixYgMrKSlx00UV45JFHfMbVaDQ+P7vdbsycORPnn38+pkyZgsTERO/477zzDr744gvs3r0bixcvxubNm7us+ZlnnsG+fftwxhlnYPny5cjPz0dTUxNKS0tx8cUXY9q0aXjppZfw8ssvAwD279/vN0awxghEREQ0/IQkxHTo0CEIgoC77rqrywBTB6lUit/+9rdYvHgxDh06FIIKaShpbGzE0aNHvT9HRUVBq9V6Q00dbUsDzZdNREREREREREREQ8Px48dRUVEBm83ms1wqlSI/P5/X94hGCFEUIVqt/svdbohWK0TZz19VeZxOeHoRSHLX1nY7hVzQfcvL4SwpgdRo7NP+XRHU6kE5x23btg2VlZUAgL///e9+nZZOO+00XH311Xj66adhPfE7z87OBgDI5XIAgMFgwPjx47s8zn/+8x/k5eX5LT/99NNxzTXX4M0338RNN92ELVu24Ouvv8ZZZ50VdKx9+/bh+uuv904ddzKDwQBjp/8PuquNiIiIhreQhJg63pTk5+f3eJ+ON0f8IEttbW1oa2tDXV2dd5lcLvcLNqkH6UMBERERERERERER+fJ4PGhtbYXD4UBcXFzAbURR9AswAe0dPmw2G6Kioga7TCIaAkSrFZYnngi4Tgqgc+8lx4l/oWJds2ZQxtXdcw+Ek7obDYTq6mrv47lz5wbdTiaTITo6us/HCRRg6uzGG2/Ec889hz179uDTTz/tMsRkMBjwwgsv8PsbIiIi6pGQhJhyc3OxZ88e1NbW9nifjm1zc3MHqyyKYE6nE42NjWhsbPQumzRpEgwGQ/iKIiIiIiIiIiIiGoacTqd3KrjW1la0tLTAarVCFEVIpVLMnj074JfTWq026Jitra0MMRER9VJycrL38ZtvvokVK1YM+jFFUURNTQ3MZjMcjp8jZqmpqdizZw/27t3b5f4XXHABdDrdYJdJREREw0RIQkxXX301du/ejTVr1mDBggU92mfNmjUQBAFXXXXVIFdHQ43BYIBarfa2Ou2pYBdF2traUFxc7NO5SalUMvVPRERERERERETUSUfnpI7AUkdoyW63B92nq65Kmk5dSARBgEaj8V6f0wxChxIiouFuzpw5yMnJQXFxMVauXIm1a9fikksuwdy5czF9+nQoFIoBO9b69evx8ssvY+vWrbBYLEG3q6+v73KciRMnDlhNRERENPyFJMR055134r333sN7772HSZMm4b777uty+8cffxzvvvsuTj31VKxcuTIUJdIQkpaWhrFjx8LtdsNqtfpdNHG73X77qFQqyGSBX84WiwX19fU+b6RlMlnA6egkEsmgPS8iIiIiIiIiIqKhyGKxoLCwMOi1t+60tLQEDDEpFAqMHTsWarWa196IiAaAXC7HunXrcPnll+PQoUPYsWMHduzYAQCIiorC3Llzcf311+Oqq66CVCrt0zFEUcTSpUvx+uuv92j7tra2LtfHxMT0qQ4iIiIamUISYqqursZrr72GZcuW4YEHHsC7776LG264AdOnT4fRaIQgCKipqcGOHTvw9ttvY8+ePZg+fTpWrVrlM7/vyTIyMkJRPoWJVCqFTqfzaTN68t1gHe2ru7pzq6WlxW+Zy+VCU1MTmpqavMs67gbT6XSIjo6GXq+HSqVixyYiIiIiIiIiIopooijCarVCrVYHvNYlkUhgNpv7NLZKpYLH4wm63mg09mlcIho+BLUaunvu8VvucbthamyESqXyWd7VVJQns/3733B2M51ZV+STJ0N19tl93j8YQa0e8DE7jBs3Dvv378e6deuwbt06bN26FYWFhWhra8OXX36JL7/8Ek899RQ2bNjQp3PwG2+84Q0wTZ48GStXrsTMmTORmpoKtVrtDUddf/31ePvttyGKYpfj9TVMRURERCNTSEJMWVlZPh+O9+3bh7vvvrvLfXbu3IlTTz016HpBEOByuQas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WVkJURRRU1ODmpoaREdHIzU1FfHx8QHbEhMRERERERGNdG6329sFuePLx2BUKhVSUlKQlJTELshERBRUW0MDXjIaw11GQB/84heDMu5ttbVQJyQMytgDSaVS4c033wzYZenOO+/E//3f/8HhcOCbb77pVYipuroaQHtnqK5CVt19P5icnIznn38+YIDtnnvuwWuvvQYA+OabbxhiIiKiYc1ut8N2UudJhph66IcffsCaNWvwwQcfoLGxEUD7nVuCIGD27Nm49tprceWVV/a6pSURUW/U19f7zbVtNpthNpuhUCiQkpKC5OTkXrXAJSIiIiIiIhru9u/f73d358kMBgNSU1MRFxc3LFvXExERjRS//OUvYQwSMNPpdMjLy8OBAwdQXFzcq3E7ZlBobGzEP//5T1x00UV9qu/yyy+HUqkMuG706NHQarVoaWnpdX1ERESR5uTP6VKpFBqNJkzVDK4BDzGdfvrpEATB23Vp9OjRuPbaa3HNNdcgKytroA9HRBSQzWbzORd15nA4UFpaimPHjiEhIQGpqamIjo4OQ5VEREREREREQ0tiYmLAEFPHFO8pKSnD9kIpERHRSDNmzJgu18fGxgIALBZLr8a98MILYTAY0NTUhEsuuQTz58/HBRdcgLlz52Ly5MneqQP7W19MTAxaWlp6XR8REVGkCTSV3HC9qWjQppPT6XR47rnncMMNNwzWIYiIgsrIyEBSUhKqqqpQWVnp15UJaO8SV1tbi9raWuh0OqSmpiIhAlr8EhEREREREfWH2+0O+uWh0WhEcXExXC4XgPZpZlJTU5GUlASZbNAuJRIREVEYqNXqLtdLJBIA7e8deiMuLg6fffYZrr76alRUVGDTpk3YtGkTACA6OhpnnXUWbrrpJpx//vlhqY+IiCjSBAoxDVeDcuVBFEW0tLTgpptuwrPPPotrr70WV199tbd9JBFRKCgUCmRmZiI9PR319fWoqKiA2WwOuK3FYsHhw4dRVFSEuLi4EFdKRERERERENPja2tpQUVGB6upqTJw4MWBXYqlUiqSkJLS2tiI1NRWxsbHD9u5OIiIKjai4ONxWW+u33O12o76+HgAQHx/vE7B1u91oa2vz2V6tVntDKx223HcfDqxe3efaxt94I+b+5S993j+YKF5jxhlnnIHCwkJ89NFH2LBhA7Zu3Yrjx4/DbDbjk08+wSeffIIFCxbg448/7jasRERENJKJogilUgmbzeYN7jLE1AubN2/G6tWr8dFHH8FisWDPnj3Yu3cv7r//fsyfPx/XXXcdLr30Umi12oE+NBFRQBKJBEajEUajERaLBZWVlaipqQk41ZzT6URra2sYqiQiIiIiIiIaeKIooqmpCcePH4fJZPIur6ioCDq1ek5ODoNLREQ0YASJBOoAHfDdbjdUJ67RqhMSfEJMoigCLS0+2ytVKsjlcp9lU1es6FeI6dQVKwLWRgNDpVLhmmuuwTXXXAMAKCkpwfr16/H888+joKAAX375JX7/+9/j6aefDnOlREREQ5cgCJgwYYK3mVBzczN0Ol24yxo0ku436Z25c+fijTfeQE1NDdauXYsFCxZAIpHA7XbjP//5D2688UYkJSXh6quvxoYNG9jikYhCSqfTYfTo0Zg1axays7OhVCr9tuGUckRERERERBTpRFFEY2Mj9u7di3379vkEmACgrq4u4NTrABhgIiKisBMEwW/q00DfJxknT0bK6af36Rips2fDOGlSn/alvsnOzsbtt9+OHTt2IC0tDQDwwQcfhLkqIiKiyCAIAnQ6HdLS0vy6Uw4ng/bMVCoVrr76anz++ecoLy/HX//6V286zGq14oMPPsAFF1zAKeaIKCzkcjkyMjIwc+ZMjBs3zttyT6VSBb0TFQC7NBEREREREdGQdnJ4qbm5ucvtiIiIhqqehJgA4MxnnoFMperV2LKoKMxn95+wiY6OxvTp0wHAO6UgERERETCIIabOkpKScM8992DPnj3YvXs3Vq5cCaPRCFEUUV9f772767e//S1WrFiBb775JhRlERFBEAQkJCRg8uTJmDp1KvLz84PecdrU1ISdO3di//79MJvNIa6UiIiIiIiIKLiOUNKePXu6DC9JpVKkpaVhxowZSExMDHGVREREPXdyiMnj8bRPM3eS5OnTccE//tHjIJMsKgoXfPghkk+EaGjgffnll6iqqgq6vrm5Gdu3bwfQ3p2JiIiIqEPIe0xNmjQJTz31FI4fP45//etfuPLKK6FUKiGKIiorK/HCCy9g/vz5SE5Oxm233Yavv/461CUS0Qil1WoRExMTdH1paSkAwGQyYffu3QwzERERERERUdidHF4K9jlVqVRi1KhRmDVrFnJzcxEVFRXiSomIiHrn5BATELwbU+6iRbhq61akzp7d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sPa0tDQ1NDTIYrGYlAwbQRETAADbnMViUWVlpfbu3RvxAVogEND58+fV09PDBREAAIArVFZWppycHNntdh04cEDFxcVcAAMAAMAlJSQkaN++fUpOTg5rn5iY0IULF0xKBQDAztLb26uxsbGwtqSkJO3bt48b0LYRipgAANghXC6XDh8+rNTU1Ii+3t5enT9/Xj6fz4RkAAAAO4PFYlF9fb2OHDmijIwMs+MAAABgG7Hb7VE/RO3v79fw8LBJqQAA2BkWFxfV19cX1rZSRJyUlGRSKlwOipg20cLCgu6//34dO3ZM2dnZSk1NVX19ve644w719vZe8fF7enpksVjW9efWW29d1zGffPJJvetd71JBQYGSk5NVXl6uj370o3rxxRevOC8AYPOlpKTo0KFDys3NjeibmprSqVOnND8/b0IyAACA7WF6elojIyOr9ttsNtnt9i1MBAAAgJ0iNTVVe/fujVjNs6OjQ9PT0yalAgBg+3M4HNq/f79sNluoraGhQWlpaSamwuWgiGmTdHZ26uDBg7r77rv16quvanp6WgsLC2pra9P//t//W1dddZX+9V//1eyYIYuLi3rve9+rW265Rb/61a80Ojqq5eVl9fX16fHHH9db3/pWfeUrXzE7JgBgHRISEtTQ0KDq6uqIvqWlJZ0+fVqzs7MmJAMAAIhfhmGov79fr732mtrb2zU3N2d2JAAAAOxAWVlZqq2tDWszDENNTU3yeDwmpQIAYPvLysrSoUOHlJycrJqaGuXk5JgdCZfBdukh2Ci32633vve96ujokCT98R//sW6++WY5HA6dOHFC9957r+bm5vThD39Yzz//vA4ePHjF5/zrv/5rfeADH1i1Pysra83n33bbbfrFL34hSbruuuv0+c9/XkVFRTp37py+9rWvqaurS/fcc48KCwt1++23X3FeAMDmslgsKikpUVpampqbm8O2kUtNTZXT6TQxHQAAQHzx+/1qb2/X+Pi4pP/3IdKRI0dYdQkAAAAxV1hYqIWFBQ0MDITaAoGAzp8/r0OHDvEeFACAy5SSkqKjR49GbN+K7YMipk3wwAMPqL29XZJ0//3368477wz1XX311br22mt1zTXXaGFhQV/4whf0zDPPXPE5i4uLtW/fvst67n/8x3/o+9//viTphhtu0E9+8pPQP+pjx47p/e9/v44cOaK+vj7dfffd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", + "image/png": "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WlqqwsJCJSYm6qWXXlLHjh21ePHietfKzMzUwIED9dhjj2nbtm0qKipSUVGRNm3apPvuu0/XXHONTCZTjWP+8pe/yM3NTZK0cOHCOtevrKzUF198IUkaPXq0/P39m+1abFm+fLk6dOig559/Xtu3b1d+fr7Ky8t18OBBffzxxxo8eLDuvffeWtdpzXvvvacLL7xQCxcuVFpamsrLy5WWlqZ58+apR48e+vzzz+s8/qWXXlKXLl3073//W4mJiSooKFBZWZn279+vDz74QP369dP06dMbfa0AAAAAALQWJDEBAAAAAAAA5zCz2axx48ZZkofGjh2rjz76SGvXrtX69ev12muvqW3btiouLta4cePqrexzzTXXKCkpSffff79++OEHbdmyRZ988oni4+MlSYsXL9Y777xT4xhvb2+NHDlSkvTVV1+prKzM5vpLly5VTk6OJOnGG29s1muxZvv27Ro7dqwKCgrk7Oyshx56SCtXrtTGjRv19ttvKyYmRpL0xhtvaNq0afWudddddykkJET/+c9/9Ouvv2r16tV6/PHH5erqqvLyct14440245w1a5YeffRRVVZW6oILLtCbb76pFStWaPPmzZo/f74GDhwos9ms5557TrNnzz7tawUAAAAAoDVxsncAAAAAAAAAQF2OF5U3+lhPVye5OTtaHcsprpDZbG7Uuu4ujvJwsf7WWl5JhapMDV830Mu1UTE01LvvvqslS5bI2dlZixYt0mWXXVZjfMCAAZo0aZIGDx6sXbt26cEHH6yzXdqmTZu0fPlyDR061LKvV69eGjVqlLp06aLMzEzNmTNHd955Z43jrrnmGi1atEgFBQX69ttvNW7cOKvrf/LJJ5IkHx8fjRkzplmvxZo77rhDFRUVcnR01LfffmtJvpKkvn37avz48Ro0aJCSkpL00ksv6aabblLXrl2trrVjxw5FR0drw4YNCgsLs+y/+OKLNWrUKI0cOVKVlZW65557tHHjxhrHJiUl6cknn5QkPfPMM3rmmWcs7fwkqXfv3powYYJuvvlmffzxx3ryySc1adKkWpWrAAAAAAA4W5DEBAAAAAAAgFat9z9XNPrYf1zVVTcNbGd1bMQrq5VTXNGodR+4JE4PXdrR6tj4t9Zrb1ZRg9c68OIVjYqhIcxms2bOnClJuv/++2sl/VTz9/fXrFmzNHr0aK1du1Z7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lZXZXH/p0qXKycmRJN14443Nei3WbN++XWPHjlVBQYGcnZ310EMPaeXKldq4caPefvttxcTESJLeeOMNTZs2rd617rrrLoWEhOg///mPfv31V61evVqPP/64XF1dVV5erhtvvNFmnLNmzdKjjz6qyspKXXDBBXrzzTe1YsUKbd68WfPnz9fAgQNlNpv13HPPafbs2ad9rZJkNBo1ZswYSwLTyJEj9dVXX2nz5s368ssvNWLECH3//fd66qmnGrU+AAAAAAANxSdBAAAAsJv4MB91DvPWjrSabaU6h3lr+tguurB9kJ0iA9CU4sO99dZfe+mfS5KVlltaY6ywzKh/LknWgo2H9PSYLhraKcROUQJo1YqPNf5YF0/J2d3GusclmRu3rrP7ibWtKcmRzKeRnOnZvL/zvPvuu1qyZImcnZ21aNGiWlWQBgwYoEmTJmnw4MHatWuXHnzwwTrbpVVXWxo6dKhlX69evTRq1Ch16dJFmZmZmjNnju68884ax11zzTVatGiRCgoK9O2332rcuHFW1//kk08kST4+PhozZkyzXos1d9xxhyoqKuTo6Khvv/3WknwlSX379tX48eM1aNAgJSUl6aWXXtJNN92krl27Wl1rx44dio6O1oYNGxQWFmbZf/HFF2vUqFEaOXKkKisrdc8992jjxo01jk1KStKTTz4pSXrmmWf0zDPPWNr5SVLv3r01YcIE3Xzzzfr444/15JNPatKkSbUqV9Xn7bff1pYtWyzX/vbbb9c4x9VXX61bb71V77333mmtC5wLsrKytHHjRm3cuNFSbe748eOSpJtvvlnz5s1r8nMuWLBA77//vn777Tfl5eUpNDRUgwcP1tSpUzVw4MAmPx8AAADQmpDEBAAAALtxcDDomSu76po56yRJfh7OenhkJ93QN0pOjhQNBc4VBoNBl3UL19BOIXr3l1S9sXKfSiuraszZl12sye9v0iWdQ/TUmC6KCbKRGADg/DSrfeOPHf2S1O9262Nv9JVKjjdu3SF/l4bZqMLz/uVS9u6GrzUjv/45jWQ2mzVz5kxJ0v3332+zjZu/v79mzZql0aNHa+3atdq7d6/i4uKszr3vvvtqJDBVCwgI0JQpU/Tiiy9q586dys/Pl6+vr2V82LBh8vf3V25urubPn281iamoqEiLFi2SJF177bVyc3Nr1ms5VXWigiTdfvvt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6cYbb9SOHTu0bds2JScn68svv7SMTZw40eoxLXEtI0aM0JNPPilJeu+999SnTx+r89avX29JPBgxYoTN9XJycrR48WJdffXVVsffe++9Gueu5ujoqNGjR2vBggVavny5kpOTFR8ff9rXU5+IiAjFx8crOTlZn3/+uWbOnCl399qtEouLi/XZZ581+fkBSGlpaZZtW63kqkVFRVm2Dx8+rC5dGtZ6+eRzWHP06FHLdmFhoQoKChq07pkqKiqyug2cCe4rVDObzTIajTIajXJ1dZWDQ+3aHqWlpTp48KCqqqpkNBplMllvCV398/nIkSM19kdFRSkoyHrV2PT0dDk4OMjJyUmOjo5ycnKq8YdWvucvfk6hOdjrviosLGzyNUliAgAAwGkrMjnp79/s1ne7sq2Ouzg66JZBMZo6rL283ShvD6BpvbV6n9LzyyRJa1OOa/TsX/TX/m310KUd5edhvRIGAJyvHBwc9MQTT+iee+5RamqqbrrpJn300UdydXW1Or+goEAffvih7r333maN64YbbtDjjz8us9ms+fPn6+uvv5YkDRw4ULGxsVaPaYlr6devn/r06aPNmzfrnXfe0bXXXqtLLrmkxpz8/HzdeeedlpjuvvvuOtf829/+pgsvvFChoaE19q9evVpz586VJPXu3Vt9+/atMT5t2jR99tlnqqqq0rhx4/T999/bTHCoqqrSwoULNWTIkHqTIE5199136/7771dGRoYefvhhzZkzp9achx56SFlZWae1LoCGOfmDHy8vrzrnenr+2Wr5dD6cOjn5qT4fffSRpRJcS/roo49a/Jw493FfnVscHR3l7OxsSQKq3q5rX7Xt27errKys1ppubm7q0aNHo2NasWKFcnNzrY7179+/zkQlo9GoysrKGv+t3s7Pz1dJSUmj48LZg59TaA4teV/l51t/wP1MkMTUzA4ePKjZs2dryZIlOnz4sFxdXdW+fXtdd911mjp1qjw8PBq17oEDBxQTE3Nax0RHR+vAgQO19g8dOlSrV69u0Bq0agAAAEcqPfVdUbSM+dYTmEbEh+qpK+LVLsjT6jgAnInMgjK9tXpfjX1VJrM+WH9Q3+xI18OXdtTE/tFypPobAFjcdddd+uGHH/TVV1/p888/19atW3XnnXeqX79+8vX1VUFBgXbv3q1Vq1Zp0aJFcnNza/YkpsjISA0ZMkSr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5eXlSE5OxuHDh/HTTz8hIyMD586dY4iJiIjqlJ+fj4SEBOj1egwePBha7c0tYGkNuJ0ctTrL9l+FzN166erGkksFBKosJ0rMq8I8XKB0kTfp/YiIiIiIiIiIiFoLFwcZegep0DtIZXFcFEUUlFVULiSsqnx+/b9X88uQXqiFSby5e2srjLiUVYxLWcVWz392Tz9M6RNwczchIupABEHA999/j2effRbLli1DQkICXnzxRZvt1Wp1s4/pvvvuw549e8wBJplMhlmzZtV6jT2eR9++fbF582bMnDkTGo0GH374IT788MMa7Z588km88847dfb11FNP4fHHH7capnJwcMDq1asxePBgq9cvXLgQrq6uWLhwIYqKivD+++/j/ffft9rWwcGhxbcJJCKitqOsrDJbIQgCZLK2HwFqtc+goqICACCXM1xC9ePt5mAOJVUPKXXycoGfuxOkEpaoJiIiIiIiIiIiqiIIAjxdHeDp6oC+waoa5yuMJmQUlptDTVUhp2sFlY8Lyypuegz+Sn5IS0TUUHK5HEuWLMHjjz+Or776Cnv27MHVq1dRUlICNzc3hIWFYcCAAbj99tsxefLkZh/PjBkz8NRTT0Gn0wEAbrvtNvj4+NR5nT2ex2233YYrV67g448/xtatW5GYmAidTgdfX1+MGDECjz32GIYPH16vvh5++GH07NkTH330EQ4cOIDc3Fz4+Phg7NixeOmll9C9e/dar1+wYAGmTp2KL7/8Ejt27MClS5dQWFgIR0dHBAYGolevXvjb3/6Gu+66q9472xARUcd2Y55GLpdDFG9yJUoLa7UhppiYGACo1y851DE4yiQWlZSCPJwrH3tVBpdcHVvtjzMREREREREREVGbI5dK0Mmrcv7NmiJtRWWoqVqwqWqbutSCMlQY65487+RpvW8iIqpbr1698OmnnzbomkWLFmHRokV1ths1alS9PwRVqVQoLy9v0Diqa8zzAIB58+Zh3rx5dbbz8fHBf/7zH/znP/9pxOgsDRkyBN9//32jr/f19cW//vUv/Otf/7rpsRAREd0YYhIEAUajsYVG0zSaJfWxZs0aq8d//fVXnDhxotZrdTodEhISsGLFCgiCgIEDBzbHEKkV6+nvhu7dAmts++bj5ggJqykRERERERERERG1CkpnOZSBSvQMVNY4ZzSJyNSUW92m7lq+FrklOjjK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Lq9xvmquxmQy1TgnkUgsAkvu7u6QSqX2GDYRUasliqL5D18TiYiIiDomu4SYDhw4AEEQ8Nprr+Hxxx+3xy2J2qTevXujqKgIeXl5yM/Ph1arrbV9eXk50tLSkJaWBmdnZwwcOJCVmYiIiIiIiIiImolWq0V+fj7y8vJQWFgIURQRGRkJX1/fGm2lUilUKhXy8/MBAK6urubq2gqFgovRiIiuk0qlKCsrM38tCALc3NxacERERERE1FLsEmIqLy8HAEyYMMEetyNqsyQSCTw8PODh4QEAKCsrM0+MFRUVQRRFm9cqlUoGmIiIiIiIiIiImpDJZEJRURHy8/ORn59v8SF7lfz8fKshJgAIDAw0V9FmZXoiovqpqsbE+W4iIiKijscuIabQ0FDExsaioqLCHrcjajdcXFzg4uKCoKAgGAwGFBYWmqs06fV6i7aenp42+7l48SIEQTBPmslkdvmrT0RERERERETU5uj1evOisoKCAhiNxlrb5+fn2/ywvbb5GiIiqlTb4l0iIiIi6ljskmS44447EBsbi3379mHo0KH2uCVRuyOTyeDt7Q1vb2+IooiSkhLzhFpJSYm5etONDAYDcnNzIYoisrOzAVRWbaoqX+7i4sIVLURERERERETUoZWUlCA3Nxf5+fkoLi5u0LWurq7Q6/VwdHRsptEREbVv1kJMrMRERERE1DHZJcT07LPPYtWqVfjggw9w9913IzQ01B63JWq3BEGAQqGAQqFASEgIDAaDzepKBQUFNd4EFhUVoaioCElJSXB0dDRXaFKpVJBKpfZ4CkRERERERERErUZWVhZSU1Pr1VYul8PT09P8hxWviYhujq0QExERERF1PHZ5h+3j44OtW7di8uTJGDx4MN5++23MmjULSqXSHrcnavdqmyzLz8+v9VqdTof09HSkp6dDIpFApVLBy8sLXl5eXEFIRERERERERO2GTqezOdfh6elZa4jJzc3NXNVaoVCwOggRURMTBMEiuMQQExEREVHHZLdlQr1798a+ffswePBgPPbYY3j88cfh7e0NFxeXWq8TBAEJCQl2GiVR+xMSEgI3Nzfk5+dbrcpUnclkQn5+PvLz83H58mWoVCpERkYyzEREREREREREbZJer0dOTg6ysrJQXFyMIUOGWJ3nUCqVkEqlMBqNAACpVAoPDw9ztSXOjRAR2RdDTEREREQd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4gnDbDbb3cbVV19t1NXVuejI0B85oj2mpaV1u3984oknXHuAGDC++eYbw9PTs117SktLs1ufc0jAeaZNm2b39yohIcHh++N8Z/A4duyYMWrUKLufdXBwsPHhhx+e1T4yMzO7fd7Sk+u7cC1X3I/kXGJwcXab4prS4OLKvy21tbXGrFmz7O7PbDYbS5cudeg+e8pTgJt88803uvnmm1VXV6fAwED913/9l6ZPn666ujq98cYb+n//7//p6NGjuvrqq7Vv3z4FBQW5O2QMAj//+c9177332i0PCAhwYTQY6IYPH67U1FRt3ry5x+s++uijWrNmjSTp/PPP10MPPaSRI0cqIyNDzzzzjL755hutXr1akZGReuqppxwdOgags2mPrT799FPFxsbaLY+Li+v1tjHw5eXlSZJiY2N144036tJLL9Xw4cPV3NysXbt26Y9//KNyc3P16quvqqmpSa+//rrdbdFH4mw5sj22oo/E2YqPj9f06dM1YcIExcfHKyYmRi0tLcrJydE777yjDRs2qLi4WNdee6327Nmj8ePHd9jGypUrtWzZMknSyJEj9dvf/lbjxo1TXl6enn/+eaWlpWnTpk1auHBht9o1Bi9HtMdWL7/8siZNmmS3PCoqyhmHgAGupaVFixcvlsViUVRUlE6dOtXlOpxDAs5jGIZ1OSwsTBMnTtTOnTtVXV3t8H1xvjN4VFVV6eqrr9axY8ckST/72c90yy23yM/PT2lpaXr66adVWVmpm2++WTt27NB555131vv87//+b1133XV2y4cMGXLW+4Djuep+JOcSg4er73FzTWlwccS9ms4sXLhQH3/8sSRp+vTpuu+++xQbG6sDBw7oqaeeUkZGhpYuXaqYmBgtXrzYKTF0ya0pVBjUWp9u9vT0NHbu3Nmh/JlnnuGpO7gMbQ2u8vjjjxsffvihUVBQYBhG+yd5uptNfeTIEevTpBMnTjRqa2vbldfU1BgTJ0609rGMaAd7HNEe2z4RkpmZ6bxgMeBdffXVxptvvmlYLBab5UVFRUZKSoq1vW3bts1mPfpIOIKj2iN9JBzFXlts67333rO2tzlz5nQoLykpMUJCQgxJxvDhw42ioqIO+5g9e3a3RivB4OaI9th2JCbaGpzhz3/+syHJSE1NNf7rv/6ry/bGOSTgXCtXrjRef/31dr87CQkJDh+JifOdweWx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pW7VekJZV1fntJiA3Nxcm09sXH755frVr36lq666St988422bdum//mf/9Gvf/1r1wcJqGd9aNsv5PShcJY5c+Zo/vz5HW4STJo0STfffLM++ugjzZ07V01NTXrggQd07bXXKjo62k3Ror/atm2bHnnkEUlSVFSU/ud//sdmPfpIuEJ326NEHwnnuP766zVx4kRJp/uvjIwMvfXWW3rvvfd066236rnnntM111zTbh36RzhLb9qjdLofzMrK6vCA0H/8x3/o+uuv1+LFizVz5kxVVFToD3/4g26++WaNHz/eJceE/qexsVGLFy+WYRh64IEHNHbs2B6tTx8JDAz8Lg8urZ93T+4xSb37vGNjY5Wbmyt/f/92759//vmaNWuWfvGLX2jGjBk6efKkXn/9dd1888269tpre7wfOJ6r7kfS/wwerrzHzTUlOFp/6quYTg4u5+vra11ubGzssn7r8Jt+fn5OiwnobMjZoUOH6p133rFeXH3xxRddFBXQUU/60LbDF9OHwllCQkI6fcr5mmuu0eOPPy5Jqq2t1Zo1a1wVGgaIH374QXPmzJHFYpGvr6/efvttRUVF2axLHwln60l7lOgj4RyhoaEaO3asxo4dq0mTJumWW27Rhg0b9Oqrr+r48eO67rrrtHbt2nbr0D/CWXrTHqXTT3V2NsLx5MmT9Ze//EWSZBiGdRmw5amnntLhw4c1fPhwPfHEEz1enz4SOK11etCzednq812F3+W+yVntqvXz7sk9Jql3n7e3t3eHBKa2Ro0apX/84x/Wn7l/0He46n4k/c/g4cp73FxTgqP1p76KJCa4XFBQkHW5O8OP1dTUSOresHyAsyQlJenyyy+XJKWnpysvL8/NEWGw6kkf2tp/SvShcK/Fixdbv3Bt27bNzdGgP8nMzNTMmTNVVlYmDw8PvfHGG/rxj39stz59JJypp+2xu+gj4Si33367brzxRrW0tOiXv/ylSktLrWX0j3C1ztpjd91yyy0KDg6WRP8I+w4fPqynn35a0umbxm2nPegu+khgYOB3eXBp/bx7co9Jct7nfemll2rMmDGSpO3bt6ulpcUp+0HPuOp+JP3P4NHX7nFzTQk90Z/6KqaTg8v5+voqPDxcJSUlysnJ6bRuWVmZ9Zekda5PwF3GjBmjjz/+WNLp6ediY2PdHBEGo7i4OOtyV31odna2dZk+FO4UFRWl8PBwFRcXKzc3193hoJ/Iy8vTjBkzlJeXJ5PJpJdfflnXXXddp+vQR8JZetMeu4s+Eo503XXX6a233lJNTY0++eQTzZs3TxL9I9zDXnvsLk9PT6WkpGjfvn30j7Drz3/+sxobG5WUlKTa2lq98cYbHep8//331uUvvvhCBQUFkqTZs2crICCAPhL4X4cOHTrrbcTExDggkt7hd7lvcla7iouL01dffaWamhqVl5d3OtNC6+cdGRnZbnocRxszZowOHjyo+vp6lZSUKDIy0mn7Qve46n4k/c/g0dfucXNNCT1xZl/VOjW8Le7uq0higluMGTNGX375pdLT02WxWOTpabspHj582Lo8evRoV4UH2NTZsI2Aq7Q+0SO17yNtoQ9FX0Ifip4oLi7W5ZdfruPHj0s6/VT9HXfc0eV69JFwht62x56gj4SjtL1RkpWVZV1OSUmRh4eHmpub6R/hMvbaY0/QP6IrrdMcHD9+XLfeemuX9Z988knrcmZmpgICAjiHBP5Xamqqu0M4K5zv9E3OaldjxozRu+++K+n053nhhRfarGexWJSRkSHJ+Z815y19kyvuR3IuMbj0tXvc9D3ort70VZ6enho1apRT47KF6eTgFpdccomk00ORff3113brtR367uKLL3Z6XEBnDh48aF1mFCa4y4gRI6ztr6vhQf/1r39JkoYNG6bExERnhwbYVVRUpOLiYkn0n+haRUWFrrjiCuvf3T/84Q/6xS9+0a116SPhaGfTHruLPhKO1PbJy7bDfXt7e2vy5MmSpF27dqmxsdHuNlr7Tx8fn06fygO6Yq89dpfFYtHRo0cl0T/CuTiHBAYGzncGl9Z7TFLnffe+ffusI6E4+x5T6/dGHx8fhYeHO3Vf6D5X3I/kXGJw6Uv3uLmmhJ6YNGmSvL29JXXeVzU2Nmr37t3Wdby8vFwSX1skMcEtrr/+euvyK6+8YrNOS0uLXn31VUlSaGiopk+f7orQAJsyMzP12WefSZJGjhypYcOGuTkiDFYmk8k6fc3hw4etJxJn2r17tzVT+rrrriMbH261atUqGYYhSZo6daqbo0FfVltbq6uvvlr79++XJD366KN6+OGHu70+fSQc6WzbY3fRR8KR3n77bevyuHHj2pW1fg+vrKzUhg0bbK6fk5OjLVu2SJIuu+wyBQUFOSdQDAqdtcfuePPNN1VRUSGJ/hH2rV27VoZhdPp64oknrPXT0tKs77feOOQcEhg4ON8ZPKZNm6aQkBBJ0t///nfrd6ozrV271ro8Z84cp8WzY8cO/fDDD5JOJziYzdx+7StccT+Sc4nBpS/d4+aaEnoiKChIl112mSRpy5YtdqdE3LBhgyorKyU5929npwzATS699FJDkuHp6Wns3LmzQ/kzzzxjSDIkGU888YTrA8SgsXHjRqOpqclueUFBgXH++edb2+Mf//hHF0aHgS4zM9PatubPn9+tdY4cOWJ4eHgYkoyJEycatbW17cpra2uNiRMnWvvYo0ePOiFyDEQ9bY+ZmZnG/v37O63z4YcfGt7e3oYkw8/Pz8jJyXFQtBhoGhoajJkzZ1rb4H333der7dBHwhEc0R7pI+FIr7zyilFXV9dpnT/96U/WNjtixAjDYrG0Ky8pKTFCQkIMSUZCQoJRXFzcrtxisRizZ8+2biMtLc3Rh4EB4mzbY2lpaZft66uvvjJCQ0MNSYbJZDL27dvniNAxSD3xxBNd9m2cQwKul5CQYD0v6Y621yymTp1qsw7nO4PLY489Zv0sn3nmmQ7lO3fuNDw9PTttM4ZhWLdhry2+9957RktLi931jx07ZgwfPty6nXfffbenhwInO9v7kWlpaV1eM+VcYnBxdpvimhJ6c+/wlVde6TK34vPPP7fWufbaaztcOyoqKrL+TQsNDTVKS0vP8kh6x/YkjYALPP/887r44otVV1enmTNn6re//a2mT5+uuro6vfHGG1q1apWk03NZL1myxM3RYiD71a9+paamJt1www2aMmWKEhMT5efnp+LiYm3dulUrV660Dsd4ySWXOHwKEQwu27dvV3p6uvXn1rYlSenp6e2eDpKkBQsWdNhGSkqKHnzwQf3hD3/Qvn37dPHFF+vhhx/WyJEjlZGRoeXLl+ubb76RJD344INuma8W/cPZtscTJ05o+vTpmjJlimbPnq3x48crKipKknT8+HG98847euedd6xPg6xYsYKR7GDXrbfeqs2bN0uSfvKTn+iuu+7S999/b7e+t7e3UlJSOrxPHwlHcER7pI+EIy1dulRLlizRDTfcoEsuuUQjR45UYGCgqqqqdODAAa1bt047duyQdLo9rlq1Sh4eHu22ERYWpuXLl+uee+5RVlaWLrjgAj366KMaN26c8vLy9NxzzyktLU3S6d+BadOmufow0U+cbXusqKjQ9OnT9aMf/UjXX3+9JkyYoJiYGHl4eOjkyZP66KOP9Nprr1mnAfrNb36jCRMmuOVYMXhwDgk4V3p6urZv397uverqauu/Z15/uPLKKxUdHd3j/XC+M7g8+OCDevPNN3X06FE99NBDSk9P1y233CI/Pz+lpaXpqaeeksVikZ+fn5577rle72fOnDlKTk7W3LlzNXnyZMXFxcnHx0f5+fn69NNPtWbNGmt7vummmzR37lwHHSEcxRX3IzmXGFyc3aa4pjT4OOLeYXf85Cc/0S233KI33nhDGzdu1OWXX677779fsbGxOnDggH7/+9/r5MmTkqTly5dryJAhvdrPWXNL6hTwvzZu3GgEBwdbM/7OfKWkpBjHjh1zd5gY4Fqf+unqdcMNNxhlZWXuDhf93Pz587vV3lpf9jQ3NxsLFy7sdN277rrLaG5uduHRob852/bY9omRzl7+/v7GypUr3XCE6E960hbVxdO69JE4W45oj/SRcKTufmeJi4szNm/e3Om2Hn/8ccNkMtndxqxZs7ocZQeD29m2x7ZPlHb28vDwMJYuXdrpyAdAd3RnJCbD4BwScKa2IwN052Xrd7U7IzG14nxn8Dh27JgxatQou591cHCw8eGHH3a6ja6uM3S33f785z836uvrnXCUcISzuR/ZnZGYDINzicHGmW2Ka0qDjyPuHXZnJCbDOD0y3KxZs+xu22w2u32WLEZiglvNnj1b//73v/X8889r06ZNysnJkbe3t5KTk3XjjTfql7/8pfz9/d0dJga4v//979q2bZt27dql48ePq7i4WJWVlQoMDFR8fLwuuugizZ8/X1OmTHF3qICV2WzWmjVrdMMNN2jVqlXau3eviouLFRERoUmTJunuu+/WVVdd5e4wMcBNmDBB//jHP7Rr1y7t27dP+fn5Ki4ulsVi0ZAhQ3Tuuefqsssu06JFi6xPigCuQB+JvoA+Eo706aefatOmTdqxY4fS09NVWFiokpIS+fn5KSoqSuedd56uueYa3XTTTV1+h162bJmuuOIK/fWvf9WXX36pwsJChYaGavz48brzzjt16623uuio0F+dbXuMjY3V22+/rV27dmnPnj3Kzc1VcXGx6uvrFRISonPOOUfTpk3TokWLlJiY6PoDxKDFOSQwcHC+M3gkJyfrm2++0V//+le9/fbb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", "text/plain": [ "
" ] @@ -261,7 +255,7 @@ }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAACTEAAAPkCAYAAAB7yuiYAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAB7CAAAewgFu0HU+AAEAAElEQVR4nOzdd3gU1f7H8c+mE5IAIYTeQm/SqyAdFEFFQUEUsKCo2EHkqhTRe0WwoIIdqYLiBQVF6V0QUEBKkI7UkBCSECB9fn/kl7m7yW6yKZtN8P16njyZ3Tlz5juzs2dndr57jsUwDEMAAAAAAAAAAAAAAAAA4CYe7g4AAAAAAAAAAAAAAAAAwD8bSUwAAAAAAAAAAAAAAAAA3IokJgAAAAAAAAAAAAAAAABuRRITAAAAAAAAAAAAAAAAALciiQkAAAAAAAAAAAAAAACAW5HEBAAAAAAAAAAAAAAAAMCtSGICAAAAAAAAAAAAAAAA4FYkMQEAAAAAAAAAAAAAAABwK5KYAAAAAAAAAAAAAAAAALgVSUwAAAAAAAAAAAAAAAAA3IokJgAAAAAAAAAAAAAAAABuRRITAAAAAAAAAAAAAAAAALciiQkAAAAAAAAAAAAAAACAW5HEBAAAAAAAAAAAAAAAAMCtSGICAAAAAAAAAAAAAAAA4FYkMQEAAAAAAAAAAAAAAABwK5KYAAAAAAAAAAAAAAAAALgVSUwAAAAAAAAAAAAAAAAA3IokJgAAAAAAAAAAAAAAAABuRRITAAAA8m3Dhg2yWCyyWCzq0qWLu8PJl7S0NLVs2VIWi0XNmjVTWlqau0MCAABwmffff18Wi0UeHh7atWuXu8MpciIjIxUUFCSLxaIRI0a4OxwUkIkTJ5rXLxMnTnR3OABQ6H755RezHVywYIG7wwEAADCRxAQAAFAMdOnSxfxyyd5fYGCgatSooTvvvFMffvihYmNj3R1ysfXZZ5/pjz/+kCRNmTJFHh45nzJHRUVp2rRp6tChgypWrCg/Pz9Vr15dffr00bx585ScnOzqsPNs2bJlWY6nkydP5qqO8PBwjRkzRjfddJOCg4NVsmRJ1a1bV8OGDdPatWtdE3geJCUlad68eerTp4+qV68uPz8/VaxYUR06dNC0adMUFRXl0vVv3LhRI0aMUP369VWqVCmVKFFCYWFhuuuuu7Rw4UKlpKS4dP05qVGjRrbtjL2/M2fOOF1/UX2fxMfH6+OPP1bXrl1VpUoV+fr6qkqVKurWrZs++eQTxcfH57pOwzC0dOlSDRgwQLVq1VKJEiVUrlw5tWrVSpMmTdLff/+dp1h37typJ598Ug0bNlRQUJCCgoLUsGFDPfnkk9q5c2ee6iwIrmgDXHG8uLsNcPf6c6Mot+vZnRP5+fmpfPnyqlOnjjp27Kinn35as2fPzvN77p8gIiJCEyZMkCTdd999atWqld1y1gnrzv716NGjMDfFlJaWpq1bt2rSpEnq06ePatSooZIlS8rX11cVKlRQt27dNHnyZJ07d86p+sqVK6cXX3xRkjRr1qwilei1du1aDR06VHXr1lXJkiUVHBysm266SWPGjNGhQ4fcGlt2x4anp6fKlCmjBg0a6MEHH9R3333n9vOgom748OG5fg/m9Af7sjsn9vf3V8WKFVWvXj117dpVo0eP1sKFC3Xx4sVcrePkyZPZvjZeXl4KDg5Ww4YNNWTIEC1atEhJSUl52obZs2ebz6ekpKhChQrmvPHjx+cqbmszZsww6wkICLA5Z87LZ0Z+rkfzKzw8XB988IHuvfdeNWzYUKVKlZK3t7dCQkLUqlUrPfvss9q9e3ee63dFW10Q52q33nqr+SO0l156KU/XPQAAAC5hAAAAoMjr3LmzIcnpv6CgIGPOnDmFFt/69evNdXfu3LnQ1lvQrly5YpQrV86QZLRr186pZZYvX24u4+ivRYsWxl9//eXi6HMvNjbWqFy5cpZ4T5w44XQdb7zxhuHt7Z3t9g8ePNiIi4tz3YY4ITw83GjWrFm2cYaGhho//fRTga87KirKuO2223J837Zs2dIIDw8v8PU7q3r16rlqZyQZp0+fdqruovo++fXXX42aNWtmG1dYWJixfft2p+s8e/as0a1bt2zrDAgIML766iun60xMTDSeeeYZw2KxOKzTYrEYzz33nJGUlJSHPZF3rmgDXHG8uLMNKArrz42i3q7n9pxIkuHh4WH06dPH+OWXX9wSc1H2xBNPmG3IwYMHHZazPtdz9q979+6FuCXp3nnnHaNChQpOxeft7W1MnDjRSElJybHemJgYIygoyJBkdOnSpRC2JHuxsbHGfffdl+P2/fvf/3ZbjLk9XurUqWPs2LGj0OKbMGGCue4JEyYU2nrzatiwYbnepzn9wb68nBP7+PgY9913n9PnjCdOnMj1OmrUqGFs2rQp19uQ+ZzzhRdeMOfVrFnTSEtLy+0uMgzDMFq3bm3WM2zYMJt5efnMsP7LzfVofqxatcpo1KiR03ENHDjQuHTpktP1u6qtLshztXXr1pnLTJw4MVdxAAAAuIqXAAAAUKy0bt1abdq0MR8bhqGYmBjt3LlTR44ckSTFxcVp2LBhSkhI0GOPPeauUIud6dOnKzIyUpL08ssv51h+1apV6t+/v/nLcX9/f3Xv3l3lypXTsWPHtGnTJhmGoT/++EPdu3fXb7/9pkqVKrl0G3LjpZde0tmzZ/O8/Pjx4zV58mTzccWKFdWpUyf5+fnp999/14EDByRJCxcu1KVLl/TTTz/Jy6vwL0HOnDmj7t27mz0uWCwW3XLLLapVq5YiIyO1Zs0aXb9+XRcvXtRdd92lX375Rd26dSuQdV++fFkdOnTQ4cOHzefCwsLUvn17+fn56dixY9q6dauSk5P1+++/q0uXLtq+fbtq1KhRIOvPq6FDhyowMDDHcgEBATmWKarvk71796pXr17mL469vb3VrVs3ValSRadPn9a6deuUkpKi48ePq1evXtq6dasaN26cbZ1xcXHq3bu39u/fbz7Xpk0bNWrUSLGxsVq3bp1iYmIUHx+vhx56SB4eHho6dGiOsY4YMUJz5841H4eFhaldu3aSpO3bt+v48eMyDEPvv/++4uLi9OWXX+Zll+SaK9oAVxwv7mwDisL6c6O4tOsZMp8TpaWlKTY2VjExMTpw4IBOnTplPr9ixQqtWLFCw4cP1wcffOBUG3ejO3nypL744gtJ0p133qkGDRo4tVylSpXUv3//HMvVr18/X/HlxapVq3ThwgXzsa+vr1q3bq3q1avL399fJ0+e1JYtW3T9+nUlJydr4sSJOnz4sObNm5dt75ulSpXSyJEj9fbbb2vDhg1as2aN23qaSk5OVv/+/bVu3TrzucaNG6tFixZKSEjQ5s2bdf78eSUnJ+tf//qXkpOT89XbSkG46667VLlyZfNxamqqIiIitGXLFvPc+8iRI+ratas2bdqkFi1auCvUIqtHjx45nnfNmDHDnM68z5E33bt3t2nLUlNTFRMTo8uXL+vPP//U+fPnJaX3tvjNN99o8eLFGjNmjF5//XX5+Pg4vZ7M594pKSmKiIjQ1q1bzffIyZMn1bt3b61bt848D8yLYcOG6d1335UknThxQps3b9Ytt9ySqzoOHTpk0wvosGHDsi3/1FNP5ar+oKCgXJXPK+tzGyn9HO2mm25S3bp1VaZMGUVGRtq0U4sXL9bBgwe1ceNGlS1bNtu6XdVWF/S5WteuXdWmTRvt2LFD7777rp5++mkFBwfnGAcAAIBLuTWFCgAAAE6x7nUgu18KL1myxChVqpRZ1tfX1+meUvLjRuiJ6fr162bPH9WqVTNSU1OzLR8VFWWULl3a3O7u3bsbkZGRNmX27NljVKtWzSzTrVs3V25CrmzatMns1eX+++/P9S9f16xZY7PMmDFjjMTERJsyX3/9teHn52eWmTRpkou2JnudOnUyY6hevbqxZ88em/mRkZFG9+7dzTLBwcHG5cuXC2Td/fv3N+v18/Mz5s6dm6XM0aNHbX7J3KJFizz/Ijo/rH+xXVC/fi6q75OkpCSjVq1a5jqbNm2aZZtPnDhhNG3a1CxTt25dIzk5Odt6H3zwQZvjaO3atTbz4+PjjSFDhtj8av/IkSPZ1vnll1+a5T08PIz33nvPpn1KTU013nvvPcPDw8MsVxg98bmiDXDV8eLONqAorN9ZxaVdd/acyDAM4/z588bbb79tVKlSxWbbWrdubVy7dq1wAi7CRo0aZe6T1atXZ1u2uJzr9e7d27BYLEafPn2MJUuWGNevX89SJjIy0hg8eLDNMTFz5swc6z527Jh57tSjRw9XhO+U1157zebcYuHChTbzExMTjTFjxphlLBaLsWHDhkKP03r/rl+/3m6ZxMREY/LkyTY9DTZp0qRQzoOKW09MznBmnyNn2fVilNnx48eNV155xShbtqzN/u/Xr1+215OZe2JydO6dmJhovPXWWzbvkZtuuinH90hO22DdO+Sjjz6abV32jBs3zubcJnM8mXtiKqr+85//GJKMZs2aGTNmzDCioqKylMl4DTw9Pc3tuffee3Os2xVttavO1b766iuz/BtvvJFjeQAAAFcrumeQAAAAMOXmht2PP/5o88XWuHHjXB5fcbmxlZ0vvvgiVzcyrL9wrFWrlnH16lW75fbu3WvT1fvKlSsLOPLcu379ulG3bl1DklG7dm0jPDzcqS/RrVkn3QwaNMhhuY8//tgsFxgYmCUhwdV++uknm4SRP//80265+Ph4IywsrEDfN7t27bLZr19//bXDspcvX7ZJzJg/f36+159brkhiKqrvkxkzZpjrKlOmjHH+/Hm75c6dO2eUKVPGLPvpp586rHPfvn02iUSOhq1KTU01OnToYJYbPHiwwzoTEhKMqlWrmmVffvllh2XHjh1rczMp8w2NguaKNsAVx4s724CisP7cKC7tem7OiTJcuXLFGDhwoE2b7MwNyBtZTEyMUbJkSUNybjih4nKuN23atCyJgvakpaUZd955p7lNFStWdCpxxjrhcN++fQURcq5ERESYr5sk45NPPnFY1noIo/bt2xdilOlyk1AzevRom/KFcb5MEhMcyU0SU4YLFy4YXbp0sXkNXnrpJYflnU1iyvD888/blN+6dWu+tuG9994z55cqVcpuwqcjaWlpNtctr776apYyxSWJ6b///a/x/fffO1X23Xfftdmm7IYBd1Vb7apztatXrxqBgYHm52FhD08NAACQWdE9gwQAAIAptzfsrHsPad26tcvjKy43trLTvn17cxsOHjyYbdmkpCSb3kIWLFiQbflHH33ULHvHHXcUZNh5Yv3L2dWrV+f6S/QdO3aYZT08PIy///7bYdm0tDSjTp06Zvl33323gLcme3369DHXPWLEiGzLzp8/3ywbHBycY687ObFOKrnppptyLP/JJ58U6vs2s4JOYirK75OGDRua63rzzTezLfvGG2849To++eSTZrmePXtmW+eWLVvMsp6eng5vLHz77bc2N5gcJfUYRvrNh6CgILP8kiVLso0hP1zRBrjqeHFnG1AU1u+s4tSu5yWJyTDS47799tttPu82btzoukCLuE8//dSpG+0ZboRzvcwOHjxoczz8/vvvOS5jvd9eeOGFQojS1ttvv22uv27dutkmXp06dcomufaPP/4oxEhzl1ATFRVlE+uYMWNcHh9JTHAkL0lMhpGefN6iRQubc7xjx47ZLZvb66+TJ0/alP/Pf/6Tr22IiIgwvLy8zDKLFi1ydjONtWvX2sRy+PDhLGWKSxJTbqSkpBiVKlUyt+mdd95xWNYVbbWrz9WseyhctmxZjuUBAABcyfFg7wAAACi2OnToYE4fP37cZt7w4cNlsVhksVg0e/bsHOuaPXu2WX748OH5ju3QoUN66aWX1K5dO4WEhMjHx0d+fn4KDQ1Vy5Yt9dBDD2nOnDm6fPlyjnUlJydr3rx5uvfeexUWFqbAwECVLFlSNWvW1ODBg7V06VIZhpFjPcePH9e2bdskSXXr1lWDBg2yLb9hwwbFxMRIkgIDA3XPPfdkW956v61atUpXr17NMSZX2bt3r6ZOnSpJeuCBB9SjR49c1/H999+b0z169FDVqlUdlrVYLBo2bJj5eOnSpbleX17Fx8dr7dq15uOHHnoo2/L33HOPAgICJEnR0dHatGlTvtb/22+/mdN9+vTJsfztt99uTu/cuVN///13vtbvbkX1fXL06FEdPHjQ7npziuvPP//M0qZKkmEYWrZsmfk4p2Pt5ptvVu3atSVJqampNstas36v3XffffL393dYp7+/v+69917zsSvfa65oA1xxvLi7DXD3+nOjuLTr+WGxWDR37lwFBgaaz7355pt2y27YsME89+nSpYv5/IoVKzR48GDVqVNHAQEBslgsev/9922WTU5O1sqVK/XSSy+pa9euqlSpkvz8/FSiRAlVqVJFt912m95//33Fx8fnKv7r16/rvffe080336yQkBCVKFFCtWrV0uDBg22Osxo1apixnzx50mF9CxYsMKfvuuuuXMVyo2jQoIHKlCljPs5uf2W46667ZLFYJElff/21U+eZBcn6vZpxTu9ItWrV1K1bN/NxUX6vli1bVvXq1TMfZ/6sdfa4zpDb652crFu3To888oiaNGmi0qVLy8vLS/7+/qpSpYo6deqk5557Tj/++KOSkpJyrOvSpUt655131LNnT1WtWlV+fn4qXbq0GjZsqKeeekq7du3Kd7z27N6929wnZcqUUUJCglPLXblyxWzvLBaL/vzzT5v59vb1pUuXNGXKFLVp00blypUz26vHHntMu3fvznXsO3fu1PPPP69mzZqpXLly8vHxUYUKFdS5c2dNmTLFqevGwuDr66uvv/5aHh7pt1xSU1M1ZcqUAqm7evXqNu3VuXPn8lVfaGiobrvtNvPxvHnznF527ty55nSHDh1Up06dfMVSXHh6eqpt27bm4+zaIle01a4+V+vfv785PX/+/BzLAwAAuBJJTAAAADcg6y844+Li3BiJrYkTJ6px48aaOnWqfvvtN126dEnJyclKTExUZGSk/vjjD82ePVvDhw/X008/nW1dGzZsUIMGDTR06FAtXrxYJ06cUHx8vK5du6aTJ09q0aJFuvvuu9WhQwedPXs227p+/PFHc9r6C0RH1q9fb063b99evr6+2ZZv06aNmXyQkJBgJkwVttTUVD366KNKSUlRcHCw3n333TzVY7391jd3Henatas5/euvvyoxMTFP680t63WVLFlSrVu3zra8n5+f2rdvbz5et25dvtYfERFhTlevXj3H8pUrV5anp2eBrd/diur7xHq/1q1bV5UqVcq2fOXKlW1uzth7XY4cOaIzZ86Yj3P7vnD0WufnvebK48cVbYArjhd3twHuXn9uFJd2Pb+Cg4NtEuBWr16t6OjoHJeLjY3V3Xffrdtvv12LFi3S0aNH7SbOnT59WhUrVtStt96qqVOnasOGDTp//rwSExOVkJCgs2fP6pdfftHzzz+vGjVqaPXq1U7FvW/fPjVp0kQvvPCCfv31V126dEkJCQk6fvy4Fi1apB49emjkyJFKTk52qr7Lly9r69atktKTBnM6Nm9k1jeWU1NTcywfGhqqRo0aSZIuXLjgsoQTexISErR9+3bzcVH6XCgIRfH65erVq7rzzjvVvXt3zZo1S/v371dsbKxSU1N1/fp1nT17Vlu2bNH06dPVr18/m+QOe2bMmKFatWpp9OjRWrNmjc6cOaPExETFxsYqPDxcM2fOVJs2bfTII484lRCVG82bN1fLli0lSTExMfrvf//r1HLffPON2d61bt1aN910U7blt23bpptuukkvv/yydu7cqaioKLO9+vzzz9W6dWtNnDjRqXVfvnxZAwYMUJs2bfT+++9r7969ioqKUnJysiIiIrRp0ya9/PLLCgsL03fffedUna5Wr149mx8mLF68WGlpaQVSd4kSJcxpZ5PQsmOd5LJy5UpdvHgxx2WuXbtmc+xY1/FP4Mxnhqvaalefq3Xt2tXcvpUrVyolJSXHdQAAALiKl7sDAAAAQMGz/jVqqVKl3BjJ/0yfPl2TJk0yH4eEhKhdu3aqWLGiLBaLoqOjdejQIYWHh+d4E2nx4sUaMmSIebOuRIkSateunWrUqCEPDw8dPnxY27ZtU0pKirZv36727dtr586dKl++vN36rG8idurUKcdtCQ8PN6dbtGiRY3lvb281adLE7JknPDw8Tz0g5dd7771n3mybOnWqypUrl6d6crv9zZs3N6dTU1N1+PBhNWnSJE/rzg3rOJs0aSIvr5wvf1q0aGEeD9bL50Vue2fI+BV7hgMHDuRr/fnx+++/64cffjATAMuWLauGDRuqY8eONjcZs1NU3ye5jSuj3JEjR7Isb6/O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7e1thISEGM2bNzdGjhxprFixIsdzrgxpaWlGcHCwGUNukjsdcWUS0/Hjx81k0u7du+cYS2Gc161evdp44IEHjFq1ahn+/v5GqVKljMaNGxsvvviicfDgQafrsU6yHD9+fIHEZr1vCyKJyTDSj5kFCxYYvXr1MkJCQgxvb2+jcuXKRp8+fYxvv/3WPPYKIonJMNLbwg8++MC4//77jaZNmxplypQxvLy8DD8/P6Ny5cpGr169jGnTpjkcZtGehIQEY/bs2cbgwYON2rVrG6VKlTI8PT2NoKAgo0GDBsbdd99tvPfee3YTU3KS133+999/2yybmyRhe/v64sWLxhtvvGG0bNnSKFu2rOHr62vUrFnTeOSRR3KVtJ/hxIkTxuTJk42uXbsalStXNvz8/MxryLZt2xqPPfaY8c0332SbsFFQSUy+vr5GaGioUadOHaNLly7GCy+8YHz99ddOf4Zbb1Ner78SEhKMypUrm8sOHTo0223IbRJTbGyszfCoHh4e5meXs1yVxHTXXXdlu9255eokpgwF1VZbK8jz79mzZ5vbNXny5DzFAwAAUJAshvH/fSADAAAA/3D//ve/zaHzli5dqrvuuqtQ158xTJQkTZ48Wa+++mqhrt/dmjZtqj///FOStHnzZodDTPzTLV26VHfffbek9CEF1qxZ4+aIABSm4tQG0K4XriNHjqhu3bqSpPr16ys8PDzb8idPnlTdunWVnJysO++8U99//30hRPk/u3fvVosWLSRJ9erV04EDB+Tp6VmoMeTG2LFj9fbbb0uSVq1apZ49e2Zbvric10VHRyskJESGYSg4OFgnTpxQUFCQu8NCIZozZ46GDx8uSXaHEsvO8OHDNWfOHEnSV199ZdYDFLS0tDSFhITo8uXL8vb21l9//aWaNWu6O6wbQtu2bbVjxw4FBgbqxIkTKlu2rLtDAgAA/3CFP3A7AAAAUEQ988wzKleunCRpypQphb7+devWSZJCQ0P13HPPFfr63SkqKkr79u2TJN12223c6M5GxnEipSfeAfhnKS5tAO164fvmm2/M6datW+dYvkaNGnr00UclScuWLcsx6amgWR/Lr7/+epFOYIqNjdUnn3wiSercuXOOCUxS8TmvW79+vTJ+4zp27FgSmP6BvvzyS3N6xIgRbowEcGz37t26fPmyJOnRRx8lgamAbNiwQTt27JAkvfDCCyQwAQCAIoEkJgAAAOD/BQQE6PXXX5ckbd++XStXriy0dV+8eFEHDhyQJI0bN04BAQGFtu6iIOMGmsVi0ZtvvunucIq0jJuid955p9q0aePmaAAUtuLSBtCuF64TJ05o2rRp5uP777/fqeUmTJigoKAgGYZhngMVloxjuXnz5ho4cGChrju3pk+frri4OHl4eGjq1Kk5li9O53UZr0PFihX19NNPuzkaFLbdu3ebPS8FBwfr3nvvdXNEgH0ZbVWJEiX02muvuTmaG0fGZ3/FihX14osvujkaAACAdCQxAQAAAFYee+wxc2iTsWPHKi0trVDWm3Gzt2rVqnriiScKZZ1FScaX0gMGDFDz5s3dHE3RFRERoYMHD8rDw0NvvPGGu8MBUMiKUxtAu15wevXqpV9++UUpKSl25//000/q2LGjYmNjJUnNmjVTr169nKq7fPnymjRpkqT0npx+//33ggk6BykpKWbixBtvvCGLxVIo682LyMhIM0Hs4YcfdqqXq+J0XpfxXn311VdVokQJN0eDwpSQkGCTuDZy5Ej5+fm5MSLAsYy2atSoUapYsaKbo7kxrFy5UuvXr5ckTZ06VYGBgW6OCAAAIJ3FyOgvGAAAAAAAAECRkpHgU6ZMGbVo0UJVq1aVj4+PoqKitGPHDp05c8YsGxgYqK1bt6pJkybuChdAEfbRRx/p6NGjiomJ0dq1a832IyQkRH/99ZeCg4NzVd/w4cM1Z84cSdJXX32l4cOHF3TIAAAAAP5hvNwdAAAAAAAAjhw5ckTTp0/Pdz2vv/56rm/M3Sjmz5+v7du356uOOnXq6Nlnny2giADkxeXLl7V27VqH8+vUqaPFixeTwATAoe+++04bN260ec7T01NffvnlP/Y8CQAAAEDRQhITAAAAAKDIOnv2rGbMmJHvekaPHv2PvTm3Zs0as5eEvOrcuTNJTICb7N+/X99//71+/fVXnTp1SlFRUYqOjpafn5/KlSunNm3aqG/fvho0aJA8PT3dHS6AYqJMmTLq0KGDxo0bp5tvvtnd4QAAAACAJJKYAAAAAAAAgCKrUaNGatSokbvDAHAD2LBhQ4HWN3v2bM2ePbtA6wQAAADwz2YxDMNwdxAAAAAAAAAAAAAAAAAA/rk83B0AAAAAAAAAAAAAAAAAgH82kpgAAAAAAAAAAAAAAAAAuBVJTAAAAAAAAAAAAAAAAADciiQmAAAAAAAAAAAAAAAAAG5FEhMAAAAAAAAAAAAAAAAAtyKJCQAAAAAAAAAAAAAAAIBbkcQEAAAAAAAAAAAAAAAAwK1IYgIAAAAAAAAAAAAAAADgViQxAQAAAAAAAAAAAAAAAHArkpgAAAAAAAAAAAAAAAAAuBVJTAAAAAAAAAAAAAAAAADciiQmAAAAAAAAAAAAAAAAAG5FEhMAAAAAAAAAAAAAAAAAtyKJCQAAAAAAAAAAAAAAAIBbkcQEAAAAAAAAAAAAAAAAwK1IYgIAAAAAAAAAAAAAAADgViQxAQAAAAAAAAAAAAAAAHArkpgAAAAAAAAAAAAAAAAAuBVJTAAAAAAAAAAAAAAAAADciiQmAAAAAAAAAAAAAAAAAG5FEhMAAAAAAAAAAAAAAAAAtyKJCQAAAAAAAAAAAAAAAIBbkcQEAAAAAAAAAAAAAAAAwK1IYgIAAAAAAAAAAAAAAADgViQxAQAAAAAAAAAAAAAAAHArkpgAAAAAAAAAAAAAAAAAuBVJTAAAAAAAAAAAAAAAAADciiQmAAAAAAAAAAAAAAAAAG5FEhMAAAAAAAAAAAAAAAAAtyKJCQAAAAAAAAAAAAAAAIBbkcQEAAAAAAAAAAAAAAAAwK1IYgIAAAAAAAAAAAAAAADgViQxAQAAAAAAAAAAAAAAAHArkpgAAAAAAAAAAAAAAAAAuBVJTAAAAAAAAAAAAAAAAADciiQmAAAAAAAAAAAAAAAAAG5FEhMAAAAAAAAAAAAAAAAAtyKJCQAAAAAAAAAAAAAAAIBbkcQEAAAAAAAAAAAAAAAAwK1IYgIAAAAAAAAAAAAAAADgViQxAQAAAAAAAAAAAAAAAHArkpgAAAAAAAAAAAAAAAAAuBVJTAAAAAAAAAAAAAAAAADciiQmAAAAAAAAAAAAAAAAAG5FEhMAAAAAAAAAAAAAAAAAtyKJCQAAAAAAAAAAAAAAAIBbkcQEAAAAAAAAAAAAAAAAwK1IYgIAAAAAAAAAAAAAAADgViQxAQAAAAAAAAAAAAAAAHArkpgAAAAAAAAAAAAAAAAAuBVJTAAAAAAAAAAAAAAAAADciiQmAAAAAAAAAAAAAAAAAG5FEhMAAAAAAAAAAAAAAAAAtyKJCQAAAAAAAAAAAAAAAIBbkcQEAAAAAAAAAAAAAAAAwK1IYnKBixcv6scff9T4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AgAAAAAAAAAAAAAAAOBeJDEBAAAAAAAAAAAAAAAAcCuSmAAAAAAAAIB/iPXr12vYsGEKCwuTv7+/goKC1KRJE40ZM0bnzp1zuNzEiRNlsVhksVgkSQkJCZo6dapatGihwMBABQYGqk2bNvroo4+UkpKSZfl58+apUqVKqlSpklavXp1jnI8//rgsFot8fX11+fLlAt0WZ0VGRurVV19V8+bNVbp0afn5+alGjRp68MEHtWXLlmyXrVGjhiwWi4YPHy5J2rlzpwYPHqyqVavKz89PVatW1UMPPaRDhw45FcvRo0f1/PPPq0mTJipVqpRKlCihsLAwDR8+XLt27crXdm7YsMF8bTds2JCvugAAAAAAyA+SmAAAAAAAAIAbXEJCggYPHqxu3bpp7ty5OnHihK5fv64rV65o//79mjZtmurWravly5fnWFdERITat2+vl156Sbt371Z8fLzi4+O1c+dOPf3007r77ruVlpZms8xdd90lPz8/SdKiRYuyrT85OVnfffedJKlPnz4qU6aMy7bFkVWrVql27dp68803tWfPHsXGxioxMVGnTp3S/Pnz1alTJ40aNSrLdtoza9YsdejQQYsWLdKZM2eUmJioM2fOaPbs2WrWrJkWL16c7fLTpk1Tw4YN9f7772v//v2Ki4tTQkKCTpw4oTlz5qhNmzYaP358nrcVAAAAAICigiQmAAAAAAAA4AZmGIYGDBhgJg/169dP8+bN09atW7Vt2zZNnz5d1apV09WrVzVgwIAce/a5++67dfDgQT3zzDNavXq1fv/9d3399ddq0KCBJGn58uX6/PPPbZYJDAxUr169JElLly5VQkKCw/p//vlnRUdHS5KGDBni0m2xZ8+ePerXr5/i4uLk7e2t559/XuvXr9eOHTv06aefqmbNmpKkGTNmaNy4cTnWNXLkSIWGhurDDz/Ub7/9po0bN2rs2LHy9fVVYmKihgwZ4jDOqVOnasyYMUpOTtZNN92kjz/+WGvWrNGuXbu0YMECtW/fXoZhaPLkyfrggw9yva0AAAAAABQlXu4OAAAAAAAAAMjOpfjEPC9b0tdLft6edudFX02SYRh5qreEj6f8fex/tRZzLUmpac7XWzbAN08xOOuLL77QTz/9JG9vby1btky33nqrzfx27drpwQcfVKdOnXTgwAE999xz2Q6XtnPnTq1atUpdunQx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WXquysmnn36q33//3dz2Tz/91GYd/fv31yOPPKJZs2blql7gRnDx4kXt2LFDO3bsMHubu3TpkiRp2LBhmj17doGvc+HChfrqq6/0559/KiYmRuXLl1enTp301FNPqX379gW+PgAAAKAoIYkJAAAAbuPhYdGEOxrp7pm/SpJK+3vrxV71NLh1VXl50mkocKOwWCy6tXFFdakXqi82H9eM9cd0PTnVpsyxyKsa/tVOda8fqlf7NlTNEAeJAQD+mabWyvuyfaZJbUbYnzejtXTtUt7q7fyy1NVBLzxf3SZFHnK+romxOZfJI8MwNGXKFEnSM88843AYtzJlymjq1Knq06ePtm7dqiNHjqhOnTp2yz799NM2CUwZgoOD9dBDD+mtt97Svn37FBsbq1KlSpnzu3btqjJlyujy5ctasGCB3SSm+Ph4LVu2TJJ0zz33yM/Pz6XbkllGooIkjRgxwiaBybr+zz77TB07dlRaWppmzpypGTNmOKzznXfesUlgytC1a1eNGDFCH3/8sXbu3Kldu3apVatWNsslJyerVatWWRKYMnh4eOjDDz/U4sWLFR8fr++++04jRjg43h2YOXOmJKl8+fJ677337JaZPn26li9frsjIyFzVDRR35cuXL7R1Xb9+XQMGDNCKFStsnv/777+1YMECLVy4UOPHj9eECRMKLSYAAACgsHFnCAAAAC53JSHZ4bwW1cpoYMsqGt6hhjaM7qIH21UngQm4Qfl5e2pUtzpaP7qL7mpWyW6ZtYcuqtd7G/WfFeHZth0AAOccPHhQx44dkySHPR9luOWWW8zpbdu2OSyXeYg3ay1btpSUnnB04sQJm3ne3t7q16+fpPQh42JiYrIsv3TpUl2/ft3uelyxLZmtWbPGnH7kkUcclrv55pvN4fOsl8msTJkyuvPOOx3Of/jhh+2uW0oflk9KT+ayl8CUoXTp0mrSpImk3G2rJJ0/f14HDx6UJN17773y9/e3Wy4gIED33ntvruoGbjTVqlWzm9hYUB5++GEzgalr1676/vvvtWPHDn355ZeqVauW0tLSNHHiRH322WcuiwEAAABwN+4OAQAAwGWSUtL0+abj6vCfddp+3HEvB28PuEkT72ik0v4+hRgdAHepUMpP7w9qrv8+0V43VSmVZX5yqqFPNx1X12kb9e2u0zKMPA71BADQrl27zOn27dvLYrE4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E+EDAAAAAAAAAAAAAAAAkkhiGrVKSkpkMplkMpm0aNEil3VuuukmRUdHS5LuvvtuNTQ0DCi32+363ve+J7vdLkm64447XO7nJz/5iSTJZrPp+9//vrN+n/r6et11112SpJiYGN10003HfV4AAAAAAAAAAAAAAADA0QL9HcB4VFhYqK1btw5Y197e7vzvunXrBpSdd955Sk5OHvFx4uLitHr1at1yyy0qLS3V1772Nd1zzz2aNWuWqqqq9Nhjj2nTpk2SpCuvvNJtMtQ3v/lNXXHFFXrhhRf0+uuv6+yzz9att96q1NRUff755/rFL36hsrIySdLq1asVGxs74lgBAAAAAAAAAAAAAAAAd0yGYRj+DmK8Wbduna6//vph19+0adOgBKOSkhJNmTJFkrRw4UJt3rzZ7fb33XefHnjgAbn7US5ZskSvvPKKQkND3e6jq6tL3/rWt/T222+7LDebzfrZz36mVatWDXkuAAAAAAAAAAAAAAAAwEgxndw4cP/992vr1q266qqrlJGRoeDgYCUlJenss8/Wc889p7feemvIBCZJslgseuutt7R+/XqdffbZSkpKUnBwsDIyMnTVVVdp69atJDABAAAAAAAAAAAAAADAKxiJCQAAAAAAAAAAAAAAAIBfMRITAAAAAAAAAAAAAAAAAL8iiQkAAAAAAAAAAAAAAACAX5HEBAAAAAAAAAAAAAAAAMCvSGICAAAAAAAAAAAAAAAA4FckMQEAAAAAAAAAAAAAAADwK5KYAAAAAAAAAAAAAAAAAPgVSUwAAAAAAAAAAAAAAAAA/IokJgAAAAAAAAAAAAAAAAB+RRIT/K60tFS333678vPzFR4erri4OM2bN0+PPPKIOjs7/R0eJgiTyTSsz6JFi/wdKsa4w4cP680339S9996r888/XwkJCc72tWLFihHv7+9//7uWLVum9PR0hYSEKD09XcuWLdPf//53zwePcccT7XHdunXD7kPXrVvn1fPB2Ld79279/Oc/1znnnOPs1yIiIpSXl6frr79eW7duHdH+6CNxIjzRHukj4Smtra164YUXdPvtt2vhwoXKzc1VdHS0goODlZSUpEWLFunhhx9WQ0PDsPa3bds2XX311crMzFRoaKiSk5N17rnn6vnnn/fymWA88ER73Lx587D7x1WrVvnu5DDu3HXXXQPa0+bNm4+5DdeQgOe1t7frX//6lx599FFddtllmjJlivP3MisryyvH5Hpn4ujs7NTDDz+sefPmKS4uTuHh4crPz9ftt9+u0tLSE95/SUnJsK9bjuf+LnzHV88juZaYOLzZprinNLF4+tnhcDz//PM655xzlJycrNDQUGVmZurqq6/W9u3bvXK8ETEAP3r99deNqKgoQ5LLT15enlFQUODvMDEBuGuDR38WLlzo71Axxg3Vvq677rph78dutxs33njjkPu76aabDLvd7r2TwZjnifb4zDPPDLsPfeaZZ7x6PhjbzjjjjGG1o2uvvdbo6ekZcl/0kThRnmqP9JHwlHfffXdY7SghIcH4xz/+MeS+7rvvPsNsNrvdxwUXXGB0dXX56MwwFnmiPW7atGnY/eN9993n2xPEuPHJJ58YgYGBA9rTpk2b3NbnGhLwnkWLFrn9vcrMzPT48bjemTgKCgqMqVOnuv1ZR0VFGW+88cYJHePQoUPDvm4Zyf1d+JYvnkdyLTGxeLtNcU9pYvHl35bOzk5jyZIlbo9nNpuNVatWefSYIxUowE8++eQTXX755erq6lJERIT+67/+S4sXL1ZXV5deeOEF/d//+3918OBBXXDBBdq9e7ciIyP9HTImgO9+97v63ve+57Y8PDzch9FgvJs8ebLy8/O1cePGEW97zz33aO3atZKkU045RXfeeadycnJUVFSkhx9+WJ988onWrFmjxMREPfjgg54OHePQibTHPu+8845SU1Pdlqenpx/3vjH+VVVVSZJSU1P17W9/W2eccYYmT54su92u7du361e/+pUqKyv17LPPymq16rnnnnO7L/pInChPtsc+9JE4URkZGVq8eLHmzJmjjIwMpaSkyOFwqKKiQi+//LI2bNig+vp6XXTRRdq5c6dmz549aB9PPvmk7r//fklSTk6OfvrTn2rWrFmqqqrS448/rk2bNumtt97SDTfcMKx2jYnLE+2xz9NPP6158+a5LU9KSvLGKWCcczgcWrlypWw2m5KSknT48OFjbsM1JOA9hmE4l+Pi4jR37lxt27ZN7e3tHj8W1zsTR1tbmy644AIVFBRIkr7zne/oiiuukMVi0aZNm/TQQw+ptbVVl19+uT788EOdfPLJJ3zM//N//o8uvvhit+WxsbEnfAx4nq+eR3ItMXH4+hk395QmFk88qxnKDTfcoLfffluStHjxYv34xz9WamqqPv/8cz344IMqKirSqlWrlJKSopUrV3olhmPyawoVJrS+t5sDAwONbdu2DSp/+OGHeesOPkNbg6/ce++9xhtvvGHU1NQYhjHwTZ7hZlMfOHDA+Tbp3Llzjc7OzgHlHR0dxty5c519LCPawR1PtMf+b4QcOnTIe8Fi3LvggguMv/71r4bNZnNZXldXZ+Tl5Tnb25YtW1zWo4+EJ3iqPdJHwlPctcX+Xn31VWd7W7Zs2aDyhoYGIzo62pBkTJ482airqxt0jKVLlw5rtBJMbJ5oj/1HYqKtwRt+85vfGJKM/Px847/+67+O2d64hgS868knnzSee+65Ab87mZmZHh+JieudieVnP/uZ82f58MMPDyr/8MMPnX37icyw0P9+GaOdjE2+eB7JtcTE4os2xT2licUTz2qG4/3333fud+nSpYO+39fV1RmTJ082JBkxMTFGY2Ojx449EmYP5UIBI7Jz50598MEHkqQbb7xRCxYsGFTn9ttv1/Tp0yVJjz/+uKxWq09jBABvuP/++3XhhRdq0qRJx72Pxx57TDabTZL0u9/9ThaLZUB5WFiYfve730mSbDabfvOb3xx/wBjXPNEeAU958803ddlllykgIMBleUJCgn71q185//3yyy+7rEcfCU/wVHsEPMVdW+zvkksu0bRp0yTJ+X27vzVr1qilpUWStHr1aiUkJAw6xhNPPOE81iOPPHKiYWOc8kR7BLyprKxMP/vZzyRJf/zjHxUcHHzMbbiGBLxr5cqVuvLKK5Wbm+vV43C9M3FYrVb99re/lSRNnz5dt99++6A6p512mm688UZJ0pYtW7Rr1y6fxojRwVfPI7mWmDh4xg1v8NWzmkcffVSSFBgYOOCaqE9CQoJWr14tSWpubtaaNWu8Go87JDHBL1577TXn8vXXX++yjtls1rXXXivpyC/Jpk2bfBEaAIxqhmHob3/7myQpPz9fp556qst6p556qvOhwd/+9rcBw3YDwFi1ePFi53JRUdGgcvpI+NKx2iPgD31D1Hd3dw8q6/seHhUVpeXLl7vcPj09XWeddZYk6f3331dbW5t3AsWEMFR7BLzp+9//vtrb23Xddddp4cKFx6zPNSQwfnC9M3Fs2rTJmbB23XXXyWx2/bhzxYoVzuVXX33VF6FhlPHF80iuJSYWnnFjrGpra9P7778vSTrrrLPcTkO4fPlyRUVFSfLf306SmOAXW7dulSSFh4drzpw5buv1v9Hw4Ycfej0uABjtDh06pKqqKkk65s3YvvLKykqVlJR4OzQA8Lqenh7nsqtRIOgj4UvHao+Arx04cECffvqppCM3zvvr7e3Vzp07JUkLFiwYclSSvv6xp6dHu3fv9k6wGPeGao+AN7344ot68803FRcX53zL+Fi4hgTGB653Jpa+Z0zS0H333LlzFRYWJolnTBOVL55Hci0xsfCMG2PVrl271NvbK2novio4ONiZjLlr1y6/jCRGEhP8Yt++fZKk3NxcBQYGuq3X/0ZX3zaAN7300kuaMWOGwsLCFBkZqalTp+q6664jSxqjxt69e53Lx3oYQB8KX7v++uuVmpqq4OBgJSQk6NRTT9V///d/q7Ky0t+hYZzYsmWLc7lvSOb+6CPhS8dqj0ejj4Q3dHZ2qqCgQL/+9a+1cOFC5/QFt95664B6Bw8elN1ul0T/CO8Zbns82j333KPMzEyFhIQoNjZWp5xyim677TYdPHjQB1FjPGlubtaPf/xjSa6nkXKHa0hgfOB6Z2IZbt8dGBjonMbQEz/r3/3ud8rNzVVoaKiio6N10kkn6ZZbbtGePXtOeN/wDl88j+RaYmLxxzNu7inBE46nr7LZbCooKPBqXK6QxASf6+7uVn19vSS5HaasT2xsrMLDwyVJ5eXlXo8N2Lt3r/bt26euri61t7ersLBQzz77rL75zW9q2bJlziFqAX+pqKhwLh+rD83IyHAu04fCFzZv3qzq6mpZrVY1NDToo48+0i9+8Qvl5ubqySef9Hd4GOMcDod++ctfOv992WWXDapDHwlfGU57PBp9JDxl3bp1MplMMplMCg8PV15enm6//XbV1tZKku6++25dddVVA7ahf4S3HE97PNq2bdtUVlam3t5eNTc369NPP9Vjjz2m6dOna9WqVUyzgWG78847VVNTo69//eu68cYbh70dfSQwPvC7PLH0/bzDw8MVExMzZN2+n3ddXd2AEXWPx549e1RUVKSenh61trZq7969evLJJzVnzhzdcsstJ7x/eJavnkfS/0wc/nrGzT0leMJY6qvcpwcCXtJ/jumIiIhj1g8PD1dHR4fa29u9GRYmuLCwMF100UU688wzlZ+fr4iICNXV1WnLli364x//qIaGBr322mu6+OKL9e677yooKMjfIWOCGkkf2neBLIk+FF6VnZ2t5cuXa8GCBc6L2+LiYr3yyit6+eWX1d3drVtuuUUmk0krV670c7QYq37zm984pwZYvny5y+Ga6SPhK8Npj33oI+ErJ598sp566inNmzdvUBn9I3xtqPbYJyUlRcuXL9fpp5+u7OxsBQYGqqysTG+++aaeffZZWa1W3X///ert7dWDDz7ow+gxFn3wwQdas2aNAgMD9cc//lEmk2nY29JHAuMDv8sTS9/Pe7jPmPq0t7crJCRkxMeLiYnRsmXLtGjRIk2dOlWhoaGqrq7Wxo0btXbtWrW3t+vJJ59UW1ub1q9fP+L9wzt89TyS/mfi8PUzbu4pwZPGUl9FEhN8rru727k81LzUffouKLu6urwWE1BZWenyjY2zzz5bP/zhD3X++efrk08+0ZYtW/Q///M/+tGPfuT7IAGNrA/t/4WcPhTesmzZMl133XWDHhLMmzdPl19+ud58800tX75cVqtVt912my666CIlJyf7KVqMVVu2bNHdd98tSUpKStL//M//uKxHHwlfGG57lOgj4R2XXHKJ5s6dK+lI/1VUVKQXX3xRr776qq688ko99thjuvDCCwdsQ/8Ibzme9igd6QdLS0sHvSD01a9+VZdccolWrlypc845Ry0tLfrlL3+pyy+/XLNnz/bJOWHs6e3t1cqVK2UYhm677TbNnDlzRNvTRwLjA7/LE0vfz3skz5ik4/t5p6amqrKyUmFhYQPWn3LKKVqyZIm+//3v66yzzlJZWZmee+45XX755broootGfBx4nq+eR9L/TBy+fMbNPSV42ljqq5hODj4XGhrqXO7t7T1m/b7hNy0Wi9diAoYacnbSpEl6+eWXnTdXf/e73/koKmCwkfSh/Ycvpg+Ft0RHRw/5lvOFF16oe++9V5LU2dmptWvX+io0jBNffvmlli1bJpvNptDQUL300ktKSkpyWZc+Et42kvYo0UfCO2JiYjRz5kzNnDlT8+bN0xVXXKENGzbo2WefVXFxsS6++GKtW7duwDb0j/CW42mP0pG3Ooca4Xj+/Pn6/e9/L0kyDMO5DLjy4IMPav/+/Zo8ebLuu+++EW9PHwkc0Tc96Il8XPX5vsLv8ujkrXbV9/MeyTMm6fh+3sHBwYMSmPqbOnWq/vKXvzj/zfOD0cNXzyPpfyYOXz7j5p4SPG0s9VUkMcHnIiMjncvDGX6so6ND0vCG5QO8JTs7W2effbYkqbCwUFVVVX6OCBPVSPrQvv5Tog+Ff61cudL5hWvLli1+jgZjyaFDh3TOOeeoqalJAQEBeuGFF/SNb3zDbX36SHjTSNvjcNFHwlOuueYaffvb35bD4dAPfvADNTY2OsvoH+FrQ7XH4briiisUFRUlif4R7u3fv18PPfSQpCMPjftPezBc9JHA+MDv8sTS9/MeyTMmyXs/7zPOOEMzZsyQJG3dulUOh8Mrx8HI+Op5JP3PxDHannFzTwkjMZb6KqaTg8+FhoYqPj5eDQ0NqqioGLJuU1OT85ekb65PwF9mzJiht99+W9KR6edSU1P9HBEmovT0dOfysfrQ8vJy5zJ9KPwpKSlJ8fHxqq+vV2Vlpb/DwRhRVVWls846S1VVVTKZTHr66ad18cUXD7kNfSS85Xja43DRR8KTLr74Yr344ovq6OjQP/7xD1111VWS6B/hH+7a43AFBgYqLy9Pu3fvpn+EW7/5zW/U29ur7OxsdXZ26oUXXhhU54svvnAu//Of/1RNTY0kaenSpQoPD6ePBP7Xvn37TngfKSkpHojk+PC7PDp5q12lp6fro48+UkdHh5qbm4ecaaHv552YmDhgehxPmzFjhvbu3avu7m41NDQoMTHRa8fC8PjqeST9z8Qx2p5xc08JI3F0X9U3Nbwr/u6rSGKCX8yYMUMffPCBCgsLZbPZFBjouinu37/fuTx9+nRfhQe4NNSwjYCv9L3RIw3sI12hD8VoQh+Kkaivr9fZZ5+t4uJiSUfeqr/22muPuR19JLzheNvjSNBHwlP6PygpLS11Lufl5SkgIEB2u53+ET7jrj2OBP0jjqVvmoPi4mJdeeWVx6z/wAMPOJcPHTqk8PBwriGB/5Wfn+/vEE4I1zujk7fa1YwZM/TKK69IOvLzPPXUU13Ws9lsKioqkuT9nzXXLaOTL55Hci0xsYy2Z9z0PRiu4+mrAgMDNXXqVK/G5QrTycEvTj/9dElHhiL7+OOP3dbrP/Td17/+da/HBQxl7969zmVGYYK/TJkyxdn+jjU86L/+9S9JUlpamrKysrwdGuBWXV2d6uvrJdF/4thaWlp07rnnOv/u/vKXv9T3v//9YW1LHwlPO5H2OFz0kfCk/m9e9h/uOzg4WPPnz5ckbd++Xb29vW730dd/hoSEDPlWHnAs7trjcNlsNh08eFAS/SO8i2tIYHzgemdi6XvGJA3dd+/evds5Eoq3nzH1fW8MCQlRfHy8V4+F4fPF80iuJSaW0fSMm3tKGIl58+YpODhY0tB9VW9vr3bs2OHcJigoyCfx9UcSE/zikksucS4/88wzLus4HA49++yzkqSYmBgtXrzYF6EBLh06dEjvvvuuJCknJ0dpaWl+jggTlclkck5fs3//fueFxNF27NjhzJS++OKLycaHXz311FMyDEOStHDhQj9Hg9Gss7NTF1xwgfbs2SNJuueee3TXXXcNe3v6SHjSibbH4aKPhCe99NJLzuVZs2YNKOv7Ht7a2qoNGza43L6iokLvvfeeJOnMM89UZGSkdwLFhDBUexyOv/71r2ppaZFE/wj31q1bJ8Mwhvzcd999zvqbNm1yru97cMg1JDB+cL0zcSxatEjR0dGSpD/96U/O71RHW7dunXN52bJlXovnww8/1JdffinpSIKD2czj19HCF88juZaYWEbTM27uKWEkIiMjdeaZZ0qS3nvvPbdTIm7YsEGtra2SvPu3c0gG4CdnnHGGIckIDAw0tm3bNqj84YcfNiQZkoz77rvP9wFiwnj99dcNq9XqtrympsY45ZRTnO3xV7/6lQ+jw3h36NAhZ9u67rrrhrXNgQMHjICAAEOSMXfuXKOzs3NAeWdnpzF37lxnH3vw4EEvRI7xaKTt8dChQ8aePXuGrPPGG28YwcHBhiTDYrEYFRUVHooW401PT49xzjnnONvgj3/84+PaD30kPMET7ZE+Ep70zDPPGF1dXUPW+fWvf+1ss1OmTDFsNtuA8oaGBiM6OtqQZGRmZhr19fUDym02m7F06VLnPjZt2uTp08A4caLtsbGx8Zjt66OPPjJiYmIMSYbJZDJ2797tidAxQd13333H7Nu4hgR8LzMz03ldMhz971ksXLjQZR2udyaWn/3sZ86f5cMPPzyofNu2bUZgYOCQbcYwDOc+3LXFV1991XA4HG63LygoMCZPnuzczyuvvDLSU4GXnejzyE2bNh3zninXEhOLt9sU95RwPM8On3nmmWPmVrz//vvOOhdddNGge0d1dXXOv2kxMTFGY2PjCZ7J8XE9SSPgA48//ri+/vWvq6urS+ecc45++tOfavHixerq6tILL7ygp556StKRuaxvv/12P0eL8eyHP/yhrFarLr30Ui1YsEBZWVmyWCyqr6/X5s2b9eSTTzqHYzz99NM9PoUIJpatW7eqsLDQ+e++tiVJhYWFA94OkqQVK1YM2kdeXp7uuOMO/fKXv9Tu3bv19a9/XXfddZdycnJUVFSk1atX65NPPpEk3XHHHX6ZrxZjw4m2x5KSEi1evFgLFizQ0qVLNXv2bCUlJUmSiouL9fLLL+vll192vg3y6KOPMpId3Lryyiu1ceNGSdI3v/lN3Xjjjfriiy/c1g8ODlZeXt6g9fSR8ARPtEf6SHjSqlWrdPvtt+vSSy/V6aefrpycHEVERKitrU2ff/651q9frw8//FDSkfb41FNPKSAgYMA+4uLitHr1at1yyy0qLS3V1772Nd1zzz2aNWuWqqqq9Nhjj2nTpk2SjvwOLFq0yNeniTHiRNtjS0uLFi9erK985Su65JJLNGfOHKWkpCggIEBlZWV688039ec//9k5DdBPfvITzZkzxy/niomDa0jAuwoLC7V169YB69rb253/Pfr+w3nnnafk5OQRH4frnYnljjvu0F//+lcdPHhQd955pwoLC3XFFVfIYrFo06ZNevDBB2Wz2WSxWPTYY48d93GWLVum3NxcLV++XPPnz1d6erpCQkJUXV2td955R2vXrnW258suu0zLly/30BnCU3zxPJJriYnF222Ke0oTjyeeHQ7HN7/5TV1xxRV64YUX9Prrr+vss8/WrbfeqtTUVH3++ef6xS9+obKyMknS6tWrFRsbe1zHOWF+SZ0C/tfrr79uREVFOTP+jv7k5eUZBQUF/g4T41zfWz/H+lx66aVGU1OTv8PFGHfdddcNq731fdyx2+3GDTfcMOS2N954o2G32314dhhrTrQ99n9jZKhPWFiY8eSTT/rhDDGWjKQt6hhv69JH4kR5oj3SR8KThvudJT093di4ceOQ+7r33nsNk8nkdh9Lliw55ig7mNhOtD32f6N0qE9AQICxatWqIUc+AIZjOCMxGQbXkIA39R8ZYDgfV7+rwxmJqQ/XOxNHQUGBMXXqVLc/66ioKOONN94Ych/Hus8w3Hb73e9+1+ju7vbCWcITTuR55HBGYjIMriUmGm+2Ke4pTTyeeHY4nJGYDOPIyHBLlixxu2+z2ez3WbIYiQl+tXTpUv373//W448/rrfeeksVFRUKDg5Wbm6uvv3tb+sHP/iBwsLC/B0mxrk//elP2rJli7Zv367i4mLV19ertbVVERERysjI0GmnnabrrrtOCxYs8HeogJPZbNbatWt16aWX6qmnntKuXbtUX1+vhIQEzZs3TzfffLPOP/98f4eJcW7OnDn6y1/+ou3bt2v37t2qrq5WfX29bDabYmNjddJJJ+nMM8/UTTfd5HxTBPAF+kiMBvSR8KR33nlHb731lj788EMVFhaqtrZWDQ0NslgsSkpK0sknn6wLL7xQl1122TG/Q99///0699xz9Yc//EEffPCBamtrFRMTo9mzZ+v666/XlVde6aOzwlh1ou0xNTVVL730krZv366dO3eqsrJS9fX16u7uVnR0tKZNm6ZFixbppptuUlZWlu9PEBMW15DA+MH1zsSRm5urTz75RH/4wx/00ksvqbCwUL29vcrIyNCSJUv04x//WJmZmSd0jNdff13bt2/XRx99pNLSUtXX16ujo0NRUVHKzs7WGWecoRtuuEEzZ8700FnBG3zxPJJriYnFm22Ke0rwJovForfeekvPPfec1q1bp88++0zNzc2aNGmSzjjjDP3gBz/w+zNxk2H87zhjAAAAAAAAAAAAAAAAAOAHZn8HAAAAAAAAAAAAAAAAAGBiI4kJAAAAAAAAAAAAAAAAgF+RxAQAAAAAAAAAAAAAAADAr0hiAgAAAAAAAAAAAAAAAOBXJDEBAAAAAAAAAAAAAAAA8CuSmAAAAAAAAAAAAAAAAAD4FUlMAAAAAAAAAAAAAAAAAPyKJCYAAAAAAAAAAAAAAAAAfkUSEwAAAAAAAAAAAAAAAAC/IokJAAAAAAAAAAAAAAAAgF+RxAQAAAAAAAAAAAAAAADAr0hiAgAAAAAAAAAAAAAAAOBXJDEBAAAAAAAAAAAAAAAA8CuSmAAAAAAAAAAAAAAAAAD4FUlMAAAAAAAAAAAAAAAAAPyKJCYAAAAAAAAAAAAAAAAAfkUSEwAAAAAAAAAAAAAAAAC/IokJAAAAgNatWyeTySSTyaSSkhJ/h+MTWVlZznPu+2RlZfk7LJdWrVo1KFaTyaTNmzf7OzQAAAAAAAAAADyCJCYAAABgDCspKXGZ3DLSDwAAAAAAAAAAgD+RxAQAAABgQrv44ov1+eef6/PPP9fGjRv9HY5L3/ve95wxPv300/4OBwAAAAAAAAAAjwv0dwAAAAAAjl9aWpo+//xzt+WzZs2SJM2dO1fPPPOM23ozZ87UihUrPB3emBATE6OZM2f6O4whJSUlKSkpSZJUX1/v52gAAAAAAAAAAPA8kpgAAACAMSwoKGhYCTjh4eGjPlEHAAAAAAAAAABMXEwnBwAAAAAAAAAAAAAAAMCvSGICAAAAoHXr1slkMslkMqmkpGRQ+aJFi2QymbRo0SJJUmFhoW655RZlZ2fLYrEoKytLN954o0pLSwds98UXX+j6669Xdna2QkNDlZGRoe9+97s6fPjwsOJ67bXX9O1vf1uTJ09WaGioYmJiNHfuXN1///1qamo60dMetqysLJlMJueUewcOHNB3vvMdZWVlKSQkRJMmTdKyZcu0Y8eOIffT3d2t3/72t1q0aJESExMVFBSkuLg4TZs2Teeff75+/etfu/z/DwAAAAAAAADAeMd0cgAAAABG5L333tPy5cvV1tbmXFdaWqqnn35ab775prZs2aL8/Hw9//zzWrFihXp7e531Kioq9Mc//lF///vftW3bNqWmpro8RlNTk771rW/pn//854D1PT09+vjjj/Xxxx/riSee0N/+9jedeuqp3jlRN1599VVdffXV6uzsdK47fPiwXnvtNb3xxhtav369Lr/88kHbVVdX66yzztLevXsHrG9qalJTU5MOHjyof/zjH6qqqtKjjz7q9fMAAAAAAAAAAGA0YSQmAAAAAMNWVVWlyy67TDExMfrd736njz76SB988IFuvfVWmUwmHT58WDfddJN27dqla6+9Vjk5OVqzZo127typTZs26ZprrpF0JOnpP//zP10eo6enR2eddZb++c9/KiAgQNdcc42ef/557dixQx988IF+8YtfKD4+XocPH9aSJUsGjf7kTZ9//rmuuuoqTZo0Sb///e+1Y8cObd++XatWrVJoaKjsdrtWrlypurq6Qdv+8Ic/dCYwXX311dqwYYN27NihXbt26fXXX9e9996r2bNn++xcAAAAAAAAAAAYTRiJCQAAAMCwFRQUaOrUqfrwww+VmJjoXH/66acrMDBQjz76qD788ENdcMEFmj9/vt59912FhYU56y1atEjd3d166aWX9Morr6iurm7AfiTp5z//ufbs2aOYmBi99957mjNnzoDy008/Xf/xH/+hBQsWqLq6Wj/96U+1fv167574/9qzZ4/mzJmjf/7zn4qKinKuP/XUU5Wbm6urr75ara2t+stf/qLbbrvNWd7d3a3XX39dknT7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", + "image/png": "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WlqqwsJCJSYm6qWXXlLHjh21ePHietfKzMzUwIED9dhjj2nbtm0qKipSUVGRNm3apPvuu0/XXHONTCZTjWP+8pe/yM3NTZK0cOHCOtevrKzUF198IUkaPXq0/P39m+1abFm+fLk6dOig559/Xtu3b1d+fr7Ky8t18OBBffzxxxo8eLDuvffeWtdpzXvvvacLL7xQCxcuVFpamsrLy5WWlqZ58+apR48e+vzzz+s8/qWXXlKXLl3073//W4mJiSooKFBZWZn279+vDz74QP369dP06dMbfa0AAAAAALQWJDEBAAAAAAAA5zCz2axx48ZZkofGjh2rjz76SGvXrtX69ev12muvqW3btiouLta4cePqrexzzTXXKCkpSffff79++OEHbdmyRZ988oni4+MlSYsXL9Y777xT4xhvb2+NHDlSkvTVV1+prKzM5vpLly5VTk6OJOnGG29s1muxZvv27Ro7dqwKCgrk7Oyshx56SCtXrtTGjRv19ttvKyYmRpL0xhtvaNq0afWudddddykkJET/+c9/9Ouvv2r16tV6/PHH5erqqvLyct14440245w1a5YeffRRVVZW6oILLtCbb76pFStWaPPmzZo/f74GDhwos9ms5557TrNnzz7tawUAAAAAoDVxsncAAAAAAAAAQF2OF5U3+lhPVye5OTtaHcsprpDZbG7Uuu4ujvJwsf7WWl5JhapMDV830Mu1UTE01LvvvqslS5bI2dlZixYt0mWXXVZjfMCAAZo0aZIGDx6sXbt26cEHH6yzXdqmTZu0fPlyDR061LKvV69eGjVqlLp06aLMzEzNmTNHd955Z43jrrnmGi1atEgFBQX69ttvNW7cOKvrf/LJJ5IkHx8fjRkzplmvxZo77rhDFRUVcnR01LfffmtJvpKkvn37avz48Ro0aJCSkpL00ksv6aabblLXrl2trrVjxw5FR0drw4YNCgsLs+y/+OKLNWrUKI0cOVKVlZW65557tHHjxhrHJiUl6cknn5QkPfPMM3rmmWcs7fwkqXfv3powYYJuvvlmffzxx3ryySc1adKkWpWrAAAAAAA4W5DEBAAAAAAAgFat9z9XNPrYf1zVVTcNbGd1bMQrq5VTXNGodR+4JE4PXdrR6tj4t9Zrb1ZRg9c68OIVjYqhIcxms2bOnClJuv/++2sl/VTz9/fXrFmzNHr0aK1du1Z7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lZXZXH/p0qXKycmRJN14443Nei3WbN++XWPHjlVBQYGcnZ310EMPaeXKldq4caPefvttxcTESJLeeOMNTZs2rd617rrrLoWEhOg///mPfv31V61evVqPP/64XF1dVV5erhtvvNFmnLNmzdKjjz6qyspKXXDBBXrzzTe1YsUKbd68WfPnz9fAgQNlNpv13HPPafbs2ad9rZJkNBo1ZswYSwLTyJEj9dVXX2nz5s368ssvNWLECH3//fd66qmnGrU+AAAAAAANxSdBAAAAsJv4MB91DvPWjrSabaU6h3lr+tguurB9kJ0iA9CU4sO99dZfe+mfS5KVlltaY6ywzKh/LknWgo2H9PSYLhraKcROUQJo1YqPNf5YF0/J2d3GusclmRu3rrP7ibWtKcmRzKeRnOnZvL/zvPvuu1qyZImcnZ21aNGiWlWQBgwYoEmTJmnw4MHatWuXHnzwwTrbpVVXWxo6dKhlX69evTRq1Ch16dJFmZmZmjNnju68884ax11zzTVatGiRCgoK9O2332rcuHFW1//kk08kST4+PhozZkyzXos1d9xxhyoqKuTo6Khvv/3WknwlSX379tX48eM1aNAgJSUl6aWXXtJNN92krl27Wl1rx44dio6O1oYNGxQWFmbZf/HFF2vUqFEaOXKkKisrdc8992jjxo01jk1KStKTTz4pSXrmmWf0zDPPWNr5SVLv3r01YcIE3Xzzzfr444/15JNPatKkSbUqV9Xn7bff1pYtWyzX/vbbb9c4x9VXX61bb71V77333mmtC5wLsrKytHHjRm3cuNFSbe748eOSpJtvvlnz5s1r8nMuWLBA77//vn777Tfl5eUpNDRUgwcP1tSpUzVw4MAmPx8AAADQmpDEBAAAALtxcDDomSu76po56yRJfh7OenhkJ93QN0pOjhQNBc4VBoNBl3UL19BOIXr3l1S9sXKfSiuraszZl12sye9v0iWdQ/TUmC6KCbKRGADg/DSrfeOPHf2S1O9262Nv9JVKjjdu3SF/l4bZqMLz/uVS9u6GrzUjv/45jWQ2mzVz5kxJ0v3332+zjZu/v79mzZql0aNHa+3atdq7d6/i4uKszr3vvvtqJDBVCwgI0JQpU/Tiiy9q586dys/Pl6+vr2V82LBh8vf3V25urubPn281iamoqEiLFi2SJF177bVyc3Nr1ms5VXWigiTdfvvt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6cYbb9SOHTu0bds2JScn68svv7SMTZw40eoxLXEtI0aM0JNPPilJeu+999SnTx+r89avX29JPBgxYoTN9XJycrR48WJdffXVVsffe++9Gueu5ujoqNGjR2vBggVavny5kpOTFR8ff9rXU5+IiAjFx8crOTlZn3/+uWbOnCl399qtEouLi/XZZ581+fkBSGlpaZZtW63kqkVFRVm2Dx8+rC5dGtZ6+eRzWHP06FHLdmFhoQoKChq07pkqKiqyug2cCe4rVDObzTIajTIajXJ1dZWDQ+3aHqWlpTp48KCqqqpkNBplMllvCV398/nIkSM19kdFRSkoyHrV2PT0dDk4OMjJyUmOjo5ycnKq8YdWvucvfk6hOdjrviosLGzyNUliAgAAwGkrMjnp79/s1ne7sq2Ouzg66JZBMZo6rL283ShvD6BpvbV6n9LzyyRJa1OOa/TsX/TX/m310KUd5edhvRIGAJyvHBwc9MQTT+iee+5RamqqbrrpJn300UdydXW1Or+goEAffvih7r333maN64YbbtDjjz8us9ms+fPn6+uvv5YkDRw4ULGxsVaPaYlr6devn/r06aPNmzfrnXfe0bXXXqtLLrmkxpz8/HzdeeedlpjuvvvuOtf829/+pgsvvFChoaE19q9evVpz586VJPXu3Vt9+/atMT5t2jR99tlnqqqq0rhx4/T999/bTHCoqqrSwoULNWTIkHqTIE5199136/7771dGRoYefvhhzZkzp9achx56SFlZWae1LoCGOfmDHy8vrzrnenr+2Wr5dD6cOjn5qT4fffSRpRJcS/roo49a/Jw493FfnVscHR3l7OxsSQKq3q5rX7Xt27errKys1ppubm7q0aNHo2NasWKFcnNzrY7179+/zkQlo9GoysrKGv+t3s7Pz1dJSUmj48LZg59TaA4teV/l51t/wP1MkMTUzA4ePKjZs2dryZIlOnz4sFxdXdW+fXtdd911mjp1qjw8PBq17oEDBxQTE3Nax0RHR+vAgQO19g8dOlSrV69u0Bq0agAAAEcqPfVdUbSM+dYTmEbEh+qpK+LVLsjT6jgAnInMgjK9tXpfjX1VJrM+WH9Q3+xI18OXdtTE/tFypPobAFjcdddd+uGHH/TVV1/p888/19atW3XnnXeqX79+8vX1VUFBgXbv3q1Vq1Zp0aJFcnNza/YkpsjISA0ZMkSr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PMpXe/PbVGUCNcz035+O8uamDK45O55rpsURaerf32OFEEIIUI9rHt9OTkJMbeXk5DBv3jwOHz7snFdbW8vq1atZs2YNH374IcuWLWPv3r0sWLCAvLw853p1dXV8+eWXfPfdd6xevZrZs2e32395eTmLFy9m06ZNbeaXlpaybt061q1bx3//+19Wr15NXFycyzGmpqYyb9488vPznfMaGhr44Ycf+OGHH7j++us599xzT/ZHcdLWrVvn8mdgsVg4evQoR48e5Z133uH+++/nscce65HnrKioYOnSpfz4449t5jc2NrJz50527tzJiy++yMqVKznrrLNc7mPDhg0sXLgQs7ml+mhBQQFfffUVX331VafBLyGEEP1bQEBAm8e1tbXYbDb0+tP3HO7p+8qEEOIEOBwKPx8uoabRxswEP5fr3D13GOsPl3JZcgy3zer/4aXKOgv/25XHB1uzOFbi+gB9M2+DjsXjorhy6iDGxpikJLMQQgghhBDitBPo68GNMxK5YXoCW9LLeH9rNmsOFGK1t69OW2ex8+G2HD7clsPYGBNXThnE4vFR+Hj0z0NpQ8P9ee7XE7hr7hCe+8F1mKnWYueldcdYvj6dC0ZFcO3Z8STHB8r3PyGEEP3W8VWYQEJMx1u2bBm5ubk88MADXHDBBfj4+LBx40YefvhhzGYzN9xwA5MnT2bhwoXU19fzz3/+k5kzZ2IwGPj222/55z//SWNjI9dddx1HjhzBw6OlBa3dbmfhwoVs2bIFgJkzZ3LnnXeSkJBAfn4+b7zxBitWrCA1NZW5c+eSkpKCn1/bY+tms5n58+c7A0yXX3451157LWFhYRw+fJinn36aN998k/379/feD80Nm82Gr68vF110EXPmzCEpKQmj0UhxcTEHDhzgueeeIysri8cff5xhw4a1qbqUnJzMvn37WLlyJX/5y18A+O6774iKimrzHAkJCc77jY2NzJs3j127dqHT6bjyyitZsGABCQkJWK1W1q9fz9NPP01xcTELFixg9+7d7YJi2dnZzgCTVqvl5ptvZunSpZhMJvbu3cvjjz/OI488wuTJk0/hT04IIcSp5O/vj0ajQWn1Jb+qqorg4OA+HNWp1etHXo4cOcI777zDli1bKCwspL6+nu+++44hQ4Y419m/fz/Z2dn4+voyc+bM3h6iEOIMYm6w8umOXN7dkklm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ICCAO++8E4DNmzfz+9//vsPzp0VFRbz22mvtnmvJkiUAfPnll3zyySfttqupqeGWW27pcMxCCCEGjvz8fDIyMigvL8dms1FV5f788kDWK+3k7rrrLp577jmOHTvGrbfeyosvvohe7/qpv//+e66//noaGhoIDg7mpptu6o0hCiH6sd3ZFby9OZNV+wqw2ttekfBLejlphWaSIozttvMy6NrN6ysNVjs/phWzMiWPn9JKsNg7D3TGBfuwZFwUyybHEhvk0wujFEIIIYQQQgjRE7wMOi6ZEMMlE2I4VFjNpzty+GpvPkVm11fkW+0Ka1OLWZtajI+HjvNHhrNkQjTTh4Rg0PV9aXhfTz2/OSuOq6YOYsuxMt7anMna1CIcxxUNuPbs+D4ZnxBCCCF63q233sr777/Pli1bePPNN8nKyuL2228nISGBgoIC3njjDT7//HMABg8ezF//+td2+3jooYf45JNPyM3N5b777iMlJYVrrrmGsLAwDh8+zNNPP8327duZPHlyh1WWbr75Zl588UVsNhuLFi3ioYceYvr06VgsFjZt2sTTTz+N1Wpl6NChHDly5IRf64QJExg9ejT79+/nlVdeoaKigquvvprIyEhyc3N57733+OyzzzjnnHNchqha78fLy4uGhgb++te/YjAYiIuLc7b6iY6OxttbvUD5b3/7Gz///DNbt27l2WefZd26ddx0002MHz8eX19fKioqOHDgAGvXrmX16tWMGTOGG2+8sc3zPfXUU3z//fdUV1dz5ZVX8vPPP7N06VKMRiN79+7l8ccf5/Dhw53+fIUQQgwMJpOJgoIC5+OqqioURTntKlb2SogpPDycl19+mWuuuYbXX3+d7777josuusi5/Nlnn0VRFDZt2kRaWpqzd99bb72Fn5/7K7yEEKevRpudVXsLeHtzJntyO06RfrYjl78sHNlLI+s6m93B5mNlrEzJ57sDhdQ0dn41bYifJwvHRrJkfBTjYwNOuzcdIYQQQgghhDjTDI/w5y8LR/LAghFszSjjy5R8vtlXgLnB9XfEOoudFSn5rEjJJ8jXg4vGqN8RJw4KRNvH7cQ1Gg1nDwnh7CEh5JTX8d7WLD7enkNlnZXJcYGMjja53K6m0cZPh8twKCAd0YUQQoiBQafT8fXXX7N48WI2bdrEjz/+yI8//thuvREjRrB69WqX5/NMJhPf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Tm/x8AefwKbgUXDbEJJPsOuQksFHrW4ghBBCCHEi9E0VlKInATep8xqq1DBTznbI2Qq526HR3IWdKVCSqk673lZn+QSDzqP9qg4bHPtBnb7+PcSd3RRoWggBsT316oQQQgghxBnI11NPYqhfXw9DiC4ZSMf5B5LjzxlpNBoJMAkhBoSG777rcoCpmaei467ycdwd+hOz9iosORbIyAt+TcC7SzGEh5+ikQrRscDLL0Pr50v+ffe3+Z2u/PgTAn99pVQE64RGo+HOCXfy2+9+65xXXFfMZ4c/46oRV/XaOAwGA42Njc7HEmJyISMjw3lfURQSExPRaDR89913DB061O12Go0GLy8vgoOD0el0p2Joveqrr77iN7/5DWZzy8mkuro6duzYwY4dO3jttddYtWoVQ4YM6fZzOBwObr75Zl5//fU28/Py8sjLy2PFihXceOONvPLKK86yrK6UlpayYMECtm/f3mZ+eno6y5cv5+233+a///0vN954Y7fH2m/pvcArALxM6tQmjHR8MKnVPL2LE31CCCGEEL3FywSD56gTgMMOJWlqoClnm3pbnt61fdWVdWElBbI2qdO390PUBDXQNGIxhLj/jC+EEEIIIYQQA9lAOs4/0LgKMQkhRH9nLyzEnpPTrW3HNobwzs5kBi35Nf5zZkvVJdEvmC66CK2vL3l334PSHIRRFEpfeIGY557t28ENAMkRyUyJmMK2wm3Oea/te41Lh16Kl96rV8YgIaYuiIuLczk/KirK7bLTze7du7n88supr6/Hz8+PBx54gNmzZ1NfX89HH33Eq6++yuHDh7nooovYsWMH/v7+3XqeP//5z84vNhMmTODee+9l8ODBHDt2jH//+9/s3r2b1157jdDQUP7v//7P5T7sdjuXXHKJM8D0q1/9iptuuomgoCC2bt3KP/7xD4qLi7nllluIjo7uh1d8aNSTeN4BTUGkADePA9s+bp4MvfPHQwghhBDilNLqIHyUOk1uuvKjpgRyt7UEm/J2tbSMO1n5u9Xph79B4iy4ZmXP7FcIIYQQQggh+omBdJx/IJIQkxBiILLs3HlS2w++aCne88/vodEI0TP8Z80i+OabKH3+v8551WvW0JCaiteIEX04soHh9vG3s+3blhBTaX0pnxz6hGtGXdMrz284LhApIaYuaN1/70xx9913U19fj16vZ82aNUyb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755590ApVyapovFtRENML7zwwkjubtxasmQJzj//fGzfvh3PP/88brvtNixfvjxinV//+tc4duwYAOD++++HUhn5Bt6yZUv4C89tt90WESIKeeCBB7B+/XoEAgF85zvfwbZt25CSkhJe3tnZie985zsApLasDzzwQMx6H3zwQdx1112w2Wx4+OGH8fTTT0csr6ioCH9ZmzZtGkNMRERERJR8qTnwLbgdf/msE1rRha+fl4uUqn8ClVuBoC/2NhmlgKsZ6Gwb3DFsFdJ0oPsOJLURKFjcE2zKWwioeeKJiIiIxoBgUAoDuW1Ap016dLf2PO/sfu1uk553tkmBJH/nQHsefZ6OZFdAFNN4O89PRESJkblgAayffTbs7buaTsP24oswXnUV5EbjCFZGNHztf/sbbN3B7BDjVVdCVViYpIrGj1hdmAoMBbi85PIkVTT+cYDhUfLkk09ixYoV6OzsxCWXXIL/+q//wgUXXIDOzk789a9/xfr16wFInZC+//3vD+sYpaWleOihh/DYY49hz549WLFiBX7wgx+gpKQEFRUV+PnPf459+/YBAB566CFMnz495n5uu+02/OlPf8KOHTvwu9/9Dg0NDbj77ruRlpaGXbt24X/+539gt9shk8nw1FNPcVxqIiIiIhpT3IIOvnlfQ8p590oX405+JA0TV/5J5IW5G/4CmEuA1nKg5t/SVP1voOXE4A7U1QGUfyxNACDIgKyzukNNS6VQU3qx1DGKiIiIaLgCvj7Bo77BpLbo5Z72kemKlAyd7cmugCiu8XSen4iIEmP+N76BA888M+ztX7hVgy3lv8AVX3scyxasRfqNNyFlzlkjWCHR0LS+sAFNP/955EyFAhn3sQvTYGyp2YKjrUcj5t07/14oZezCNFxMo4ySs88+G6+++ipuvvlm2O12/Nd//VfUOqWlpdi0aRMMZ9A28H//93/R1NSEP/3pT9i3bx9uuOGGqHXuuusu/OQnP4m7D7lcjrfffhtr167F7t278cYbb+CNN96IWEetVuPpp5/Gl7/85WHXSkREREQ06lJMwLzrpMnrkoJMx94D2quBjGnSOhnTpensm6XXpz8DXri0104EYDDD04lBoOGQNO1+rvv4aVKYKTTlngPoM0fwByQiIqJxJRjsDh21SB0hXc2AqyV+xyS3DfA6kl318MjkAATpZ0afQFVKOnDB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//xzSbceP9e+fXuTI4Ir6tChg3W5qhr6888/W5epoTCTv7+/WrVqpaysLJ05c8bscFBPpKena/jw4UpPT5fFYtHKlSs1ZsyYSvehRsJRapKPtqJGwp7GjBmjtWvX6vr16/riiy/04IMPSqI+whwV5aOt3NzcFBwcrKSkJOojKvTWW28pPz9fXbp0UU5OjtasWVNmm++++866/PXXX+vcuXOSpIiICPn4+FAjgX/54Ycfan2Mdu3a2SGSmuGzXDc5Kq86dOig/fv36/r167p8+XKlT1oofr/btGlT6vE49tajRw8dPXpUeXl5unDhgtq0aeOwc8E2zuqPpP64jrrWx809JVTHL2tV8aPhy2N2rWIQE0zRo0cP7d69WykpKSosLJSbW/mp+OOPP1qXu3fv7qzwgHJVNm0j4CzF3+iRStfI8lBDUZdQQ1EdWVlZuueee3TixAlJt75V//DDD1e5HzUSjlDTfKwOaiTspWRHSVpamnU5ODhYjRs3VlFREfURTlNRPlYH9RFVKX7MwYkTJzRp0qQqt//zn/9sXU5NTZWPjw9tSOBfQkJCzA6hVmjv1E2OyqsePXpow4YNkm69nwMHDix3u8LCQh0/flyS499r2i11kzP6I2lLuJa61sdN7YGtalKr3Nzc1K1bN4fGVR4eJwdTDB48WNKtqci++eabCrcrOfXdXXfd5fC4gMocPXrUuswsTDBL586drflX1fSg//jHPyRJt99+uwIDAx0dGlChzMxMZWVlSaJ+ompXrlzRvffea/29+9prr+nJJ5+0aV9qJOytNvloK2ok7KnkNy9LTvft7u6uAQMGSJISExOVn59f4TGK66eHh0el38oDqlJRPtqqsLBQx44dk0R9hGPRhgQaBto7rqW4j0mqvHYnJSVZZ0JxdB9T8d+NHh4eatWqlUPPBds5oz+StoRrqUt93NxTQnX0799f7u7ukiqvVfn5+dq3b591nyZNmjglvpIYxARTjB071rq8atWqcre5efOmVq9eLUny8/NTeHi4M0IDypWamqqdO3dKkrp27arbb7/d5IjgqiwWi/XxNT/++KO1IfFL+/bts46UHjNmDKPxYaply5bJMAxJ0tChQ02OBnVZTk6ORo0apUOHDkmSXnrpJb3wwgs270+NhD3VNh9tRY2EPa1bt8663KtXr1Lriv8Ov3r1qjZu3Fju/qdP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AAAAAAAaOh4nBwAAAKBadu3apaioKF27ds36s7S0NK1cuVLbt29XfHy8QkJC9Mknn2jKlCnKz8+3bnf69Gm9//77+vvf/669e/eqffv25Z7j0qVL+t3vfqevv/661M9v3Lihb775Rt98843ee+89bdmyRQMHDnTMhVZg06ZNmjx5snJycqw/y8jI0ObNm7Vt2zZ99NFHmjBhQpn9zp49q+HDh+vo0aOlfn7p0iVdunRJx44d0xdffKH09HQtXLjQ4dcBAAAAAAAAAEBdwkxMAAAAAGyWnp6u8ePHy8/PT0uWLNH+/fu1e/duPfvss7JYLMrIyNC0adN08OBBPfzww+ratauWL1+uAwcOKDY2Vg899JCkW4Oe/uu//qvcc9y4cUPDhw/X119/rcaNG+uhhx7SJ598on379mn37t169dVX1apVK2VkZGjkyJFlZn9ypCNHjujBBx9U27Zt9c4772jfvn1KTEzUnDlz5OnpqaKiIk2fPl2ZmZll9n366aetA5gmT56sjRs3at++fTp48KC2bt2qV155Rb1793batQAAAAAAAAAAUJcwExMAAAAAmyUnJ6tbt25KSEhQmzZtrD8fPHiw3NzctHDhQiUkJGjUqFEaMGCAdu7cKW9vb+t2YWFhysvL07p167RhwwZlZmaWOo4k/elPf9KhQ4fk5+enXbt2qV+/fqXWDx48WP/xH/+hQYMG6ezZs3rxxRf10UcfOfbC/+XQoUPq16+fvv76a/n6+lp/PnDgQAUFBWny5Mm6evWqPvzwQ82cOdO6Pi8vT1u3bpUkzZo1q9yZliIiIjR37lxdvHjR8RcCAAAAAAAAAEAdw0xMAAAAAKrl7bffLjPwSJKeeOIJ63JWVpaWL19eagBTsccff1ySVFhYqMTExFLrsrOz9e6770qS/vznP5cZwFQsICBAL7/8siRp3bp1un79es0upgZWrlxZagBTsQcffND6eLzdu3eXWnfx4kUVFBRIkn77299WevyWLVvaKVIAAAAAAAAAAOoPBjEBAAAAsJmfn5/uvffectd17txZzZo1kyTdeeed6t69e7nblXxk2okTJ0qti4+P15UrVyRJv/vd7yqNpXgwUEFBgb755hvbLqCWevXqpTvvvLPcdRaLRX379pVU9rpatWold3d3SdLf/vY3FRYWOjZQAAAAAAAAAADqGQYxAQAAALBZt27dZLFYKlzv5+cnSQoODq5yG0m6du1aqXVJSUnW5Xbt2slisVT46tmzp3Xbc+fOVfNKaiYkJKTS9cWzKP3yujw8PDRhwgRJ0vr16xUUFKTnn39en3/+uS5fvuyQWAEAAAAAAAAAqE8YxAQAAADAZuU9Hq6kRo0aVbld8TaSVFRUVGpdRkZGjeLKycmp0X7VZev1//K6JOmdd95RRESEJCktLU2vv/66Ro0apVatWql///56/fXXrbNQAQAAAAAAAADgatzMDgAAAAAAipUc/HPo0CE1adLEpv06dOjgqJDsxtfXV1u3btWBAwe0du1axcXF6dtvv1VRUZGSkpKUlJSkhQsXavPmzRo0aJDZ4QIAAAAAAAAA4FQMYgIAAABQZ7Rq1cq63KZNm3oxOKm6BgwYoAEDBki69di5uLg4xcTEaOPGjcrIyNC4ceN0/PhxeXl5mRwpAAAAAAAAAADOw+PkAAAAANQZffv2tS4nJCSYGIlzNGvWTBEREdqwYYN+//vfS5LOnj2rPXv2mBwZAAAAAAAAAADOxSAmAAAAAHXG8OHD5e3tLUl6++23ZRiGyRE5z7Bhw6zLWVlZJkYCAAAAAAAAAIDzMYgJAAAAQJ3h5+enp556SpK0d+9ezZw5Uzdv3qxw+/Pnz2v58uXOCq/GTpw4ofj4+Eq32bFjh3W5c+fOjg4JAAAAAAAAAIA6xc3sAAAAAACgpD/96U+Kj4/X/v37tXjxYsXFxemxxx5Tnz595OPjo0uXLun777/Xrl279Pe//129evXStGnTzA67UqdOnVJ4eLh69OihyMhIhYaG6vbbb5ck/fzzz/r000+1du1aSVKfPn3061//2sxwAQAAAAAAAABwOgYxAQAAAKhTPDw8tHPnTk2ZMkUbN27UP//5T+vsTOXx9fV1YnS1c/ToUR09erTC9SEhIdq4caMsFosTowIAAAAAAAAAwHwMYgIAAABQ5zRr1kwbNmzQnj179MEHH2j37t1KT09Xbm6ufH191bVrVw0YMECjRo3SiBEjzA63SkOGDFFcXJy+/PJL7du3Tz///LPOnz+vvLw8tWzZUr1791ZUVJSmTJkiDw8Ps8MFAAAAAAAAAMDpLIZhGGYHAQAAAADOFhgYqLS0NEVHRysmJsbscGwWFxen8PBwSVJsbKzCwsLMDQgAAAAAAAAAADtgJiYAAAAALu3y5cv67rvvJEnu7u4KDg42OaKyMjIylJGRIUlKTU01ORoAAAAAAAAAAOyPQUwAAAAAXNqWLVu0ZcsWSVJAQIBOnjxpbkDleO+99zR37lyzwwAAAAAAAAAAwGEamR0AAAAAAAAAAAAAAAAAANdmMQzDMDsIAAAAAAAAAAAAAAAAAK6LmZgAAAAAAAAAAAAAAAAAmIpBTAAAAAAAAAAAAAAAAABMxSAmAAAAAAAAAAAAAAAAAKZiEBMAAAAAAAAAAAAAAAAAUzGICQAAAAAAAAAAAAAAAICpGMQEAAAAAAAAAAAAAAAAwFQMYgIAAAAAAAAAAAAAAABgKgYxAQAAAAAAAAAAAAAAADAVg5gAAAAAAAAAAAAAAAAAmIpBTAAAAAAAAAAAAAAAAABMxSAmAAAAAAAAAAAAAAAAAKZiEBMAAAAAAAAAAAAAAAAAUzGICQAAAAAAAAAAAAAAAICpGMQEAAAAAAAAAAAAAAAAwFQMYgIAAAAAAAAAAAAAAABgKgYxAQAAAAAAAAAAAAAAADAVg5gAAAAAAAAAAAAAAAAAmIpBTAAAAAAAAAAAAAAAAABMxSAmAAAAAAAAAAAAAAAAAKZiEBMAAAAAAAAAAAAAAAAAU/1/RJfNPSGZCccAAAAASUVORK5CYII=", "text/plain": [ "
" ] @@ -438,7 +432,7 @@ "outputs": [ { "data": { - "image/png": "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rkhiKqrvkxkzZpjrKlOmjHH+/Hm75c6dO2eUKVPGLPvpp586rHPfvn02iUSOhq1KTU01OnToYJYbPHiwwzoTEhKMqlWrmmVffvllh2XHjh1rczMp8w2NguaKNsAVx4s724CisP7cKC7tem7OiTJcuXLFGDhwoE2b7MwNyBtZTEyMUbJkSUNybjih4nKuN23atCyJgvakpaUZd955p7lNFStWdCpxxjrhcN++fQURcq5ERESYr5sk45NPPnFY1noIo/bt2xdilOlyk1AzevRom/KFcb5MEhMcyU0SU4YLFy4YXbp0sXkNXnrpJYflnU1iyvD888/blN+6dWu+tuG9994z55cqVcpuwqcjaWlpNtctr776apYyxSWJ6b///a/x/fffO1X23Xfftdmm7IYBd1Vb7apztatXrxqBgYHm52FhD08NAACQWdE9gwQAAIAptzfsrHsPad26tcvjKy43trLTvn17cxsOHjyYbdmkpCSb3kIWLFiQbflHH33ULHvHHXcUZNh5Yv3L2dWrV+f6S/QdO3aYZT08PIy///7bYdm0tDSjTp06Zvl33323gLcme3369DHXPWLEiGzLzp8/3ywbHBycY687ObFOKrnppptyLP/JJ58U6vs2s4JOYirK75OGDRua63rzzTezLfvGG2849To++eSTZrmePXtmW+eWLVvMsp6eng5vLHz77bc2N5gcJfUYRvrNh6CgILP8kiVLso0hP1zRBrjqeHFnG1AU1u+s4tSu5yWJyTDS47799tttPu82btzoukCLuE8//dSpG+0ZboRzvcwOHjxoczz8/vvvOS5jvd9eeOGFQojS1ttvv22uv27dutkmXp06dcomufaPP/4oxEhzl1ATFRVlE+uYMWNcHh9JTHAkL0lMhpGefN6iRQubc7xjx47ZLZvb66+TJ0/alP/Pf/6Tr22IiIgwvLy8zDKLFi1ydjONtWvX2sRy+PDhLGWKSxJTbqSkpBiVKlUyt+mdd95xWNYVbbWrz9WseyhctmxZjuUBAABcyfFg7wAAACi2OnToYE4fP37cZt7w4cNlsVhksVg0e/bsHOuaPXu2WX748OH5ju3QoUN66aWX1K5dO4WEhMjHx0d+fn4KDQ1Vy5Yt9dBDD2nOnDm6fPlyjnUlJydr3rx5uvfeexUWFqbAwECVLFlSNWvW1ODBg7V06VIZhpFjPcePH9e2bdskSXXr1lWDBg2yLb9hwwbFxMRIkgIDA3XPPfdkW956v61atUpXr17NMSZX2bt3r6ZOnSpJeuCBB9SjR49c1/H999+b0z169FDVqlUdlrVYLBo2bJj5eOnSpbleX17Fx8dr7dq15uOHHnoo2/L33HOPAgICJEnR0dHatGlTvtb/22+/mdN9+vTJsfztt99uTu/cuVN///13vtbvbkX1fXL06FEdPHjQ7npziuvPP//M0qZKkmEYWrZsmfk4p2Pt5ptvVu3atSVJqampNstas36v3XffffL393dYp7+/v+69917zsSvfa65oA1xxvLi7DXD3+nOjuLTr+WGxWDR37lwFBgaaz7355pt2y27YsME89+nSpYv5/IoVKzR48GDVqVNHAQEBslgsev/9922WTU5O1sqVK/XSSy+pa9euqlSpkvz8/FSiRAlVqVJFt912m95//33Fx8fnKv7r16/rvffe080336yQkBCVKFFCtWrV0uDBg22Osxo1apixnzx50mF9CxYsMKfvuuuuXMVyo2jQoIHKlCljPs5uf2W46667ZLFYJElff/21U+eZBcn6vZpxTu9ItWrV1K1bN/NxUX6vli1bVvXq1TMfZ/6sdfa4zpDb652crFu3To888oiaNGmi0qVLy8vLS/7+/qpSpYo6deqk5557Tj/++KOSkpJyrOvSpUt655131LNnT1WtWlV+fn4qXbq0GjZsqKeeekq7du3Kd7z27N6929wnZcqUUUJCglPLXblyxWzvLBaL/vzzT5v59vb1pUuXNGXKFLVp00blypUz26vHHntMu3fvznXsO3fu1PPPP69mzZqpXLly8vHxUYUKFdS5c2dNmTLFqevGwuDr66uvv/5aHh7pt1xSU1M1ZcqUAqm7evXqNu3VuXPn8lVfaGiobrvtNvPxvHnznF527ty55nSHDh1Up06dfMVSXHh6eqpt27bm4+zaIle01a4+V+vfv785PX/+/BzLAwAAuBJJTAAAADcg6y844+Li3BiJrYkTJ6px48aaOnWqfvvtN126dEnJyclKTExUZGSk/vjjD82ePVvDhw/X008/nW1dGzZsUIMGDTR06FAtXrxYJ06cUHx8vK5du6aTJ09q0aJFuvvuu9WhQwedPXs227p+/PFHc9r6C0RH1q9fb063b99evr6+2ZZv06aNmXyQkJBgJkwVttTUVD366KNKSUlRcHCw3n333TzVY7391jd3Henatas5/euvvyoxMTFP680t63WVLFlSrVu3zra8n5+f2rdvbz5et25dvtYfERFhTlevXj3H8pUrV5anp2eBrd/diur7xHq/1q1bV5UqVcq2fOXKlW1uzth7XY4cOaIzZ86Yj3P7vnD0WufnvebK48cVbYArjhd3twHuXn9uFJd2Pb+Cg4NtEuBWr16t6OjoHJeLjY3V3Xffrdtvv12LFi3S0aNH7SbOnT59WhUrVtStt96qqVOnasOGDTp//rwSExOVkJCgs2fP6pdfftHzzz+vGjVqaPXq1U7FvW/fPjVp0kQvvPCCfv31V126dEkJCQk6fvy4Fi1apB49emjkyJFKTk52qr7Lly9r69atktKTBnM6Nm9k1jeWU1NTcywfGhqqRo0aSZIuXLjgsoQTexISErR9+3bzcVH6XCgIRfH65erVq7rzzjvVvXt3zZo1S/v371dsbKxSU1N1/fp1nT17Vlu2bNH06dPVr18/m+QOe2bMmKFatWpp9OjRWrNmjc6cOaPExETFxsYqPDxcM2fOVJs2bfTII484lRCVG82bN1fLli0lSTExMfrvf//r1HLffPON2d61bt1aN910U7blt23bpptuukkvv/yydu7cqaioKLO9+vzzz9W6dWtNnDjRqXVfvnxZAwYMUJs2bfT+++9r7969ioqKUnJysiIiIrRp0ya9/PLLCgsL03fffedUna5Wr149mx8mLF68WGlpaQVSd4kSJcxpZ5PQsmOd5LJy5UpdvHgxx2WuXbtmc+xY1/FP4Mxnhqvaalefq3Xt2tXcvpUrVyolJSXHdQAAALiKl7sDAAAAQMGz/jVqqVKl3BjJ/0yfPl2TJk0yH4eEhKhdu3aqWLGiLBaLoqOjdejQIYWHh+d4E2nx4sUaMmSIebOuRIkSateunWrUqCEPDw8dPnxY27ZtU0pKirZv36727dtr586dKl++vN36rG8idurUKcdtCQ8PN6dbtGiRY3lvb281adLE7JknPDw8Tz0g5dd7771n3mybOnWqypUrl6d6crv9zZs3N6dTU1N1+PBhNWnSJE/rzg3rOJs0aSIvr5wvf1q0aGEeD9bL50Vue2fI+BV7hgMHDuRr/fnx+++/64cffjATAMuWLauGDRuqY8eONjcZs1NU3ye5jSuj3JEjR7Isb6/O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7e1thISEGM2bNzdGjhxprFixIsdzrgxpaWlGcHCwGUNukjsdcWUS0/Hjx81k0u7du+cYS2Gc161evdp44IEHjFq1ahn+/v5GqVKljMaNGxsvvviicfDgQafrsU6yHD9+fIHEZr1vCyKJyTDSj5kFCxYYvXr1MkJCQgxvb2+jcuXKRp8+fYxvv/3WPPYKIonJMNLbwg8++MC4//77jaZNmxplypQxvLy8DD8/P6Ny5cpGr169jGnTpjkcZtGehIQEY/bs2cbgwYON2rVrG6VKlTI8PT2NoKAgo0GDBsbdd99tvPfee3YTU3KS133+999/2yybmyRhe/v64sWLxhtvvGG0bNnSKFu2rOHr62vUrFnTeOSRR3KVtJ/hxIkTxuTJk42uXbsalStXNvz8/MxryLZt2xqPPfaY8c0332SbsFFQSUy+vr5GaGioUadOHaNLly7GCy+8YHz99ddOf4Zbb1Ner78SEhKMypUrm8sOHTo0223IbRJTbGyszfCoHh4e5meXs1yVxHTXXXdlu9255eokpgwF1VZbK8jz79mzZ5vbNXny5DzFAwAAUJAshvH/fSADAAAA/3D//ve/zaHzli5dqrvuuqtQ158xTJQkTZ48Wa+++mqhrt/dmjZtqj///FOStHnzZodDTPzTLV26VHfffbek9CEF1qxZ4+aIABSm4tQG0K4XriNHjqhu3bqSpPr16ys8PDzb8idPnlTdunWVnJysO++8U99//30hRPk/u3fvVosWLSRJ9erV04EDB+Tp6VmoMeTG2LFj9fbbb0uSVq1apZ49e2Zbvric10VHRyskJESGYSg4OFgnTpxQUFCQu8NCIZozZ46GDx8uSXaHEsvO8OHDNWfOHEnSV199ZdYDFLS0tDSFhITo8uXL8vb21l9//aWaNWu6O6wbQtu2bbVjxw4FBgbqxIkTKlu2rLtDAgAA/3CFP3A7AAAAUEQ988wzKleunCRpypQphb7+devWSZJCQ0P13HPPFfr63SkqKkr79u2TJN12223c6M5GxnEipSfeAfhnKS5tAO164fvmm2/M6datW+dYvkaNGnr00UclScuWLcsx6amgWR/Lr7/+epFOYIqNjdUnn3wiSercuXOOCUxS8TmvW79+vTJ+4zp27FgSmP6BvvzyS3N6xIgRbowEcGz37t26fPmyJOnRRx8lgamAbNiwQTt27JAkvfDCCyQwAQCAIoEkJgAAAOD/BQQE6PXXX5ckbd++XStXriy0dV+8eFEHDhyQJI0bN04BAQGFtu6iIOMGmsVi0ZtvvunucIq0jJuid955p9q0aePmaAAUtuLSBtCuF64TJ05o2rRp5uP777/fqeUmTJigoKAgGYZhngMVloxjuXnz5ho4cGChrju3pk+frri4OHl4eGjq1Kk5li9O53UZr0PFihX19NNPuzkaFLbdu3ebPS8FBwfr3nvvdXNEgH0ZbVWJEiX02muvuTmaG0fGZ3/FihX14osvujkaAACAdCQxAQAAAFYee+wxc2iTsWPHKi0trVDWm3Gzt2rVqnriiScKZZ1FScaX0gMGDFDz5s3dHE3RFRERoYMHD8rDw0NvvPGGu8MBUMiKUxtAu15wevXqpV9++UUpKSl25//000/q2LGjYmNjJUnNmjVTr169nKq7fPnymjRpkqT0npx+//33ggk6BykpKWbixBtvvCGLxVIo682LyMhIM0Hs4YcfdqqXq+J0XpfxXn311VdVokQJN0eDwpSQkGCTuDZy5Ej5+fm5MSLAsYy2atSoUapYsaKbo7kxrFy5UuvXr5ckTZ06VYGBgW6OCAAAIJ3FyOgvGAAAAAAAAECRkpHgU6ZMGbVo0UJVq1aVj4+PoqKitGPHDp05c8YsGxgYqK1bt6pJkybuChdAEfbRRx/p6NGjiomJ0dq1a832IyQkRH/99ZeCg4NzVd/w4cM1Z84cSdJXX32l4cOHF3TIAAAAAP5hvNwdAAAAAAAAjhw5ckTTp0/Pdz2vv/56rm/M3Sjmz5+v7du356uOOnXq6Nlnny2giADkxeXLl7V27VqH8+vUqaPFixeTwATAoe+++04bN260ec7T01NffvnlP/Y8CQAAAEDRQhITAAAAAKDIOnv2rGbMmJHvekaPHv2PvTm3Zs0as5eEvOrcuTNJTICb7N+/X99//71+/fVXnTp1SlFRUYqOjpafn5/KlSunNm3aqG/fvho0aJA8PT3dHS6AYqJMmTLq0KGDxo0bp5tvvtnd4QAAAACAJJKYAAAAAAAAgCKrUaNGatSokbvDAHAD2LBhQ4HWN3v2bM2ePbtA6wQAAADwz2YxDMNwdxAAAAAAAAAAAAAAAAAA/rk83B0AAAAAAAAAAAAAAAAAgH82kpgAAAAAAAAAAAAAAAAAuBVJTAAAAAAAAAAAAAAAAADciiQmAAAAAAAAAAAAAAAAAG5FEhMAAAAAAAAAAAAAAAAAtyKJCQAAAAAAAAAAAAAAAIBbkcQEAAAAAAAAAAAAAAAAwK1IYgIAAAAAAAAAAAAAAADgViQxAQAAAAAAAAAAAAAAAHArkpgAAAAAAAAAAAAAAAAAuBVJTAAAAAAAAAAAAAAAAADciiQmAAAAAAAAAAAAAAAAAG5FEhMAAAAAAAAAAAAAAAAAtyKJCQAAAAAAAAAAAAAAAIBbkcQEAAAAAAAAAAAAAAAAwK1IYgIAAAAAAAAAAAAAAADgViQxAQAAAAAAAAAAAAAAAHArkpgAAAAAAAAAAAAAAAAAuBVJTAAAAAAAAAAAAAAAAADciiQmAAAAAAAAAAAAAAAAAG5FEhMAAAAAAAAAAAAAAAAAtyKJCQAAAAAAAAAAAAAAAIBbkcQEAAAAAAAAAAAAAAAAwK1IYgIAAAAAAAAAAAAAAADgViQxAQAAAAAAAAAAAAAAAHArkpgAAAAAAAAAAAAAAAAAuBVJTAAAAAAAAAAAAAAAAADciiQmAAAAAAAAAAAAAAAAAG5FEhMAAAAAAAAAAAAAAAAAtyKJCQAAAAAAAAAAAAAAAIBbkcQEAAAAAAAAAAAAAAAAwK1IYgIAAAAAAAAAAAAAAADgViQxAQAAAAAAAAAAAAAAAHArkpgAAAAAAAAAAAAAAAAAuBVJTAAAAAAAAAAAAAAAAADciiQmAAAAAAAAAAAAAAAAAG5FEhMAAAAAAAAAAAAAAAAAtyKJCQAAAAAAAAAAAAAAAIBbkcQEAAAAAAAAAAAAAAAAwK1IYgIAAAAAAAAAAAAAAADgViQxAQAAAAAAAAAAAAAAAHArkpgAAAAAAAAAAAAAAAAAuBVJTAAAAAAAAAAAAAAAAADciiQmAAAAAAAAAAAAAAAAAG5FEhMAAAAAAAAAAAAAAAAAtyKJCQAAAAAAAAAAAAAAAIBbkcQEAAAAAAAAAAAAAAAAwK1IYgIAAAAAAAAAAAAAAADgViQxAQAAAAAAAAAAAAAAAHArkpgAAAAAAAAAAAAAAAAAuBVJTAAAAAAAAAAAAAAAAADciiQmAAAAAAAAAAAAAAAAAG5FEhMAAAAAAAAAAAAAAAAAtyKJCQAAAAAAAAAAAAAAAIBbkcQEAAAAAAAAAAAAAAAAwK1IYnKBixcv6scff9T4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AgAAAAAAAAAAAAAAAOBeJDEBAAAAAAAAAAAAAAAAcCuSmAAAAAAAAIB/iPXr12vYsGEKCwuTv7+/goKC1KRJE40ZM0bnzp1zuNzEiRNlsVhksVgkSQkJCZo6dapatGihwMBABQYGqk2bNvroo4+UkpKSZfl58+apUqVKqlSpklavXp1jnI8//rgsFot8fX11+fLlAt0WZ0VGRurVV19V8+bNVbp0afn5+alGjRp68MEHtWXLlmyXrVGjhiwWi4YPHy5J2rlzpwYPHqyqVavKz89PVatW1UMPPaRDhw45FcvRo0f1/PPPq0mTJipVqpRKlCihsLAwDR8+XLt27crXdm7YsMF8bTds2JCvugAAAAAAyA+SmAAAAAAAAIAbXEJCggYPHqxu3bpp7ty5OnHihK5fv64rV65o//79mjZtmurWravly5fnWFdERITat2+vl156Sbt371Z8fLzi4+O1c+dOPf3007r77ruVlpZms8xdd90lPz8/SdKiRYuyrT85OVnfffedJKlPnz4qU6aMy7bFkVWrVql27dp68803tWfPHsXGxioxMVGnTp3S/Pnz1alTJ40aNSrLdtoza9YsdejQQYsWLdKZM2eUmJioM2fOaPbs2WrWrJkWL16c7fLTpk1Tw4YN9f7772v//v2Ki4tTQkKCTpw4oTlz5qhNmzYaP358nrcVAAAAAICigiQmAAAAAAAA4AZmGIYGDBhgJg/169dP8+bN09atW7Vt2zZNnz5d1apV09WrVzVgwIAce/a5++67dfDgQT3zzDNavXq1fv/9d3399ddq0KCBJGn58uX6/PPPbZYJDAxUr169JElLly5VQkKCw/p//vlnRUdHS5KGDBni0m2xZ8+ePerXr5/i4uLk7e2t559/XuvXr9eOHTv06aefqmbNmpKkGTNmaNy4cTnWNXLkSIWGhurDDz/Ub7/9po0bN2rs2LHy9fVVYmKihgwZ4jDOqVOnasyYMUpOTtZNN92kjz/+WGvWrNGuXbu0YMECtW/fXoZhaPLkyfrggw9yva0AAAAAABQlXu4OAAAAAAAAAMjOpfjEPC9b0tdLft6edudFX02SYRh5qreEj6f8fex/tRZzLUmpac7XWzbAN08xOOuLL77QTz/9JG9vby1btky33nqrzfx27drpwQcfVKdOnXTgwAE999xz2Q6XtnPnTq1atUpdunQx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WXquysmnn36q33//3dz2Tz/91GYd/fv31yOPPKJZs2blql7gRnDx4kXt2LFDO3bsMHubu3TpkiRp2LBhmj17doGvc+HChfrqq6/0559/KiYmRuXLl1enTp301FNPqX379gW+PgAAAKAoIYkJAAAAbuPhYdGEOxrp7pm/SpJK+3vrxV71NLh1VXl50mkocKOwWCy6tXFFdakXqi82H9eM9cd0PTnVpsyxyKsa/tVOda8fqlf7NlTNEAeJAQD+mabWyvuyfaZJbUbYnzejtXTtUt7q7fyy1NVBLzxf3SZFHnK+romxOZfJI8MwNGXKFEnSM88843AYtzJlymjq1Knq06ePtm7dqiNHjqhOnTp2yz799NM2CUwZgoOD9dBDD+mtt97Svn37FBsbq1KlSpnzu3btqjJlyujy5ctasGCB3SSm+Ph4LVu2TJJ0zz33yM/Pz6XbkllGooIkjRgxwiaBybr+zz77TB07dlRaWppmzpypGTNmOKzznXfesUlgytC1a1eNGDFCH3/8sXbu3Kldu3apVatWNsslJyerVatWWRKYMnh4eOjDDz/U4sWLFR8fr++++04jRjg43h2YOXOmJKl8+fJ677337JaZPn26li9frsjIyFzVDRR35cuXL7R1Xb9+XQMGDNCKFStsnv/777+1YMECLVy4UOPHj9eECRMKLSYAAACgsHFnCAAAAC53JSHZ4bwW1cpoYMsqGt6hhjaM7qIH21UngQm4Qfl5e2pUtzpaP7qL7mpWyW6ZtYcuqtd7G/WfFeHZth0AAOccPHhQx44dkySHPR9luOWWW8zpbdu2OSyXeYg3ay1btpSUnnB04sQJm3ne3t7q16+fpPQh42JiYrIsv3TpUl2/ft3uelyxLZmtWbPGnH7kkUcclrv55pvN4fOsl8msTJkyuvPOOx3Of/jhh+2uW0oflk9KT+ayl8CUoXTp0mrSpImk3G2rJJ0/f14HDx6UJN17773y9/e3Wy4gIED33ntvruoGbjTVqlWzm9hYUB5++GEzgalr1676/vvvtWPHDn355ZeqVauW0tLSNHHiRH322WcuiwEAAABwN+4OAQAAwGWSUtL0+abj6vCfddp+3HEvB28PuEkT72ik0v4+hRgdAHepUMpP7w9qrv8+0V43VSmVZX5yqqFPNx1X12kb9e2u0zKMPA71BADQrl27zOn27dvLYrE4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E+EDAAAAAAAAAAAAAAAAkkhiGrVKSkpkMplkMpm0aNEil3VuuukmRUdHS5LuvvtuNTQ0DCi32+363ve+J7vdLkm64447XO7nJz/5iSTJZrPp+9//vrN+n/r6et11112SpJiYGN10003HfV4AAAAAAAAAAAAAAADA0QL9HcB4VFhYqK1btw5Y197e7vzvunXrBpSdd955Sk5OHvFx4uLitHr1at1yyy0qLS3V1772Nd1zzz2aNWuWqqqq9Nhjj2nTpk2SpCuvvNJtMtQ3v/lNXXHFFXrhhRf0+uuv6+yzz9att96q1NRUff755/rFL36hsrIySdLq1asVGxs74lgBAAAAAAAAAAAAAAAAd0yGYRj+DmK8Wbduna6//vph19+0adOgBKOSkhJNmTJFkrRw4UJt3rzZ7fb33XefHnjgAbn7US5ZskSvvPKKQkND3e6jq6tL3/rWt/T222+7LDebzfrZz36mVatWDXkuAAAAAAAAAAAAAAAAwEgxndw4cP/992vr1q266qqrlJGRoeDgYCUlJenss8/Wc889p7feemvIBCZJslgseuutt7R+/XqdffbZSkpKUnBwsDIyMnTVVVdp69atJDABAAAAAAAAAAAAAADAKxiJCQAAAAAAAAAAAAAAAIBfMRITAAAAAAAAAAAAAAAAAL8iiQkAAAAAAAAAAAAAAACAX5HEBAAAAAAAAAAAAAAAAMCvSGICAAAAAAAAAAAAAAAA4FckMQEAAAAAAAAAAAAAAADwK5KYAAAAAAAAAAAAAAAAAPgVSUwAAAAAAAAAAAAAAAAA/IokJgAAAAAAAAAAAAAAAAB+RRIT/K60tFS333678vPzFR4erri4OM2bN0+PPPKIOjs7/R0eJgiTyTSsz6JFi/wdKsa4w4cP680339S9996r888/XwkJCc72tWLFihHv7+9//7uWLVum9PR0hYSEKD09XcuWLdPf//53zwePcccT7XHdunXD7kPXrVvn1fPB2Ld79279/Oc/1znnnOPs1yIiIpSXl6frr79eW7duHdH+6CNxIjzRHukj4Smtra164YUXdPvtt2vhwoXKzc1VdHS0goODlZSUpEWLFunhhx9WQ0PDsPa3bds2XX311crMzFRoaKiSk5N17rnn6vnnn/fymWA88ER73Lx587D7x1WrVvnu5DDu3HXXXQPa0+bNm4+5DdeQgOe1t7frX//6lx599FFddtllmjJlivP3MisryyvH5Hpn4ujs7NTDDz+sefPmKS4uTuHh4crPz9ftt9+u0tLSE95/SUnJsK9bjuf+LnzHV88juZaYOLzZprinNLF4+tnhcDz//PM655xzlJycrNDQUGVmZurqq6/W9u3bvXK8ETEAP3r99deNqKgoQ5LLT15enlFQUODvMDEBuGuDR38WLlzo71Axxg3Vvq677rph78dutxs33njjkPu76aabDLvd7r2TwZjnifb4zDPPDLsPfeaZZ7x6PhjbzjjjjGG1o2uvvdbo6ekZcl/0kThRnmqP9JHwlHfffXdY7SghIcH4xz/+MeS+7rvvPsNsNrvdxwUXXGB0dXX56MwwFnmiPW7atGnY/eN9993n2xPEuPHJJ58YgYGBA9rTpk2b3NbnGhLwnkWLFrn9vcrMzPT48bjemTgKCgqMqVOnuv1ZR0VFGW+88cYJHePQoUPDvm4Zyf1d+JYvnkdyLTGxeLtNcU9pYvHl35bOzk5jyZIlbo9nNpuNVatWefSYIxUowE8++eQTXX755erq6lJERIT+67/+S4sXL1ZXV5deeOEF/d//+3918OBBXXDBBdq9e7ciIyP9HTImgO9+97v63ve+57Y8PDzch9FgvJs8ebLy8/O1cePGEW97zz33aO3atZKkU045RXfeeadycnJUVFSkhx9+WJ988onWrFmjxMREPfjgg54OHePQibTHPu+8845SU1Pdlqenpx/3vjH+VVVVSZJSU1P17W9/W2eccYYmT54su92u7du361e/+pUqKyv17LPPymq16rnnnnO7L/pInChPtsc+9JE4URkZGVq8eLHmzJmjjIwMpaSkyOFwqKKiQi+//LI2bNig+vp6XXTRRdq5c6dmz549aB9PPvmk7r//fklSTk6OfvrTn2rWrFmqqqrS448/rk2bNumtt97SDTfcMKx2jYnLE+2xz9NPP6158+a5LU9KSvLGKWCcczgcWrlypWw2m5KSknT48OFjbsM1JOA9hmE4l+Pi4jR37lxt27ZN7e3tHj8W1zsTR1tbmy644AIVFBRIkr7zne/oiiuukMVi0aZNm/TQQw+ptbVVl19+uT788EOdfPLJJ3zM//N//o8uvvhit+WxsbEnfAx4nq+eR3ItMXH4+hk395QmFk88qxnKDTfcoLfffluStHjxYv34xz9WamqqPv/8cz344IMqKirSqlWrlJKSopUrV3olhmPyawoVJrS+t5sDAwONbdu2DSp/+OGHeesOPkNbg6/ce++9xhtvvGHU1NQYhjHwTZ7hZlMfOHDA+Tbp3Llzjc7OzgHlHR0dxty5c519LCPawR1PtMf+b4QcOnTIe8Fi3LvggguMv/71r4bNZnNZXldXZ+Tl5Tnb25YtW1zWo4+EJ3iqPdJHwlPctcX+Xn31VWd7W7Zs2aDyhoYGIzo62pBkTJ482airqxt0jKVLlw5rtBJMbJ5oj/1HYqKtwRt+85vfGJKM/Px847/+67+O2d64hgS868knnzSee+65Ab87mZmZHh+JieudieVnP/uZ82f58MMPDyr/8MMPnX37icyw0P9+GaOdjE2+eB7JtcTE4os2xT2licUTz2qG4/3333fud+nSpYO+39fV1RmTJ082JBkxMTFGY2Ojx449EmYP5UIBI7Jz50598MEHkqQbb7xRCxYsGFTn9ttv1/Tp0yVJjz/+uKxWq09jBABvuP/++3XhhRdq0qRJx72Pxx57TDabTZL0u9/9ThaLZUB5WFiYfve730mSbDabfvOb3xx/wBjXPNEeAU958803ddlllykgIMBleUJCgn71q185//3yyy+7rEcfCU/wVHsEPMVdW+zvkksu0bRp0yTJ+X27vzVr1qilpUWStHr1aiUkJAw6xhNPPOE81iOPPHKiYWOc8kR7BLyprKxMP/vZzyRJf/zjHxUcHHzMbbiGBLxr5cqVuvLKK5Wbm+vV43C9M3FYrVb99re/lSRNnz5dt99++6A6p512mm688UZJ0pYtW7Rr1y6fxojRwVfPI7mWmDh4xg1v8NWzmkcffVSSFBgYOOCaqE9CQoJWr14tSWpubtaaNWu8Go87JDHBL1577TXn8vXXX++yjtls1rXXXivpyC/Jpk2bfBEaAIxqhmHob3/7myQpPz9fp556qst6p556qvOhwd/+9rcBw3YDwFi1ePFi53JRUdGgcvpI+NKx2iPgD31D1Hd3dw8q6/seHhUVpeXLl7vcPj09XWeddZYk6f3331dbW5t3AsWEMFR7BLzp+9//vtrb23Xddddp4cKFx6zPNSQwfnC9M3Fs2rTJmbB23XXXyWx2/bhzxYoVzuVXX33VF6FhlPHF80iuJSYWnnFjrGpra9P7778vSTrrrLPcTkO4fPlyRUVFSfLf306SmOAXW7dulSSFh4drzpw5buv1v9Hw4Ycfej0uABjtDh06pKqqKkk65s3YvvLKykqVlJR4OzQA8Lqenh7nsqtRIOgj4UvHao+Arx04cECffvqppCM3zvvr7e3Vzp07JUkLFiwYclSSvv6xp6dHu3fv9k6wGPeGao+AN7344ot68803FRcX53zL+Fi4hgTGB653Jpa+Z0zS0H333LlzFRYWJolnTBOVL55Hci0xsfCMG2PVrl271NvbK2novio4ONiZjLlr1y6/jCRGEhP8Yt++fZKk3NxcBQYGuq3X/0ZX3zaAN7300kuaMWOGwsLCFBkZqalTp+q6664jSxqjxt69e53Lx3oYQB8KX7v++uuVmpqq4OBgJSQk6NRTT9V///d/q7Ky0t+hYZzYsmWLc7lvSOb+6CPhS8dqj0ejj4Q3dHZ2qqCgQL/+9a+1cOFC5/QFt95664B6Bw8elN1ul0T/CO8Zbns82j333KPMzEyFhIQoNjZWp5xyim677TYdPHjQB1FjPGlubtaPf/xjSa6nkXKHa0hgfOB6Z2IZbt8dGBjonMbQEz/r3/3ud8rNzVVoaKiio6N10kkn6ZZbbtGePXtOeN/wDl88j+RaYmLxxzNu7inBE46nr7LZbCooKPBqXK6QxASf6+7uVn19vSS5HaasT2xsrMLDwyVJ5eXlXo8N2Lt3r/bt26euri61t7ersLBQzz77rL75zW9q2bJlziFqAX+pqKhwLh+rD83IyHAu04fCFzZv3qzq6mpZrVY1NDToo48+0i9+8Qvl5ubqySef9Hd4GOMcDod++ctfOv992WWXDapDHwlfGU57PBp9JDxl3bp1MplMMplMCg8PV15enm6//XbV1tZKku6++25dddVVA7ahf4S3HE97PNq2bdtUVlam3t5eNTc369NPP9Vjjz2m6dOna9WqVUyzgWG78847VVNTo69//eu68cYbh70dfSQwPvC7PLH0/bzDw8MVExMzZN2+n3ddXd2AEXWPx549e1RUVKSenh61trZq7969evLJJzVnzhzdcsstJ7x/eJavnkfS/0wc/nrGzT0leMJY6qvcpwcCXtJ/jumIiIhj1g8PD1dHR4fa29u9GRYmuLCwMF100UU688wzlZ+fr4iICNXV1WnLli364x//qIaGBr322mu6+OKL9e677yooKMjfIWOCGkkf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mBATE6OZM2f6O4whJSUlKSkpSZJUX1/v52gAAAAAAAAAAPA8kpgAAACAMSwoKGhYCTjh4eGjPlEHAAAAAAAAAABMXEwnBwAAAAAAAAAAAAAAAMCvSGICAAAAoHXr1slkMslkMqmkpGRQ+aJFi2QymbRo0SJJUmFhoW655RZlZ2fLYrEoKytLN954o0pLSwds98UXX+j6669Xdna2QkNDlZGRoe9+97s6fPjwsOJ67bXX9O1vf1uTJ09WaGioYmJiNHfuXN1///1qamo60dMetqysLJlMJueUewcOHNB3vvMdZWVlKSQkRJMmTdKyZcu0Y8eOIffT3d2t3/72t1q0aJESExMVFBSkuLg4TZs2Teeff75+/etfu/z/DwAAAAAAAADAeMd0cgAAAABG5L333tPy5cvV1tbmXFdaWqqnn35ab775prZs2aL8/Hw9//zzWrFihXp7e531Kioq9Mc//lF///vftW3bNqWmpro8RlNTk771rW/pn//854D1PT09+vjjj/Xxxx/riSee0N/+9jedeuqp3jlRN1599VVdffXV6uzsdK47fPiwXnvtNb3xxhtav369Lr/88kHbVVdX66yzztLevXsHrG9qalJTU5MOHjyof/zjH6qqqtKjjz7q9fMAAAAAAAAAAGA0YSQmAAAAAMNWVVWlyy67TDExMfrd736njz76SB988IFuvfVWmUwmHT58WDfddJN27dqla6+9Vjk5OVqzZo127typTZs26ZprrpF0JOnpP//zP10eo6enR2eddZb++c9/KiAgQNdcc42ef/557dixQx988IF+8YtfKD4+XocPH9aSJUsGjf7kTZ9//rmuuuoqTZo0Sb///e+1Y8cObd++XatWrVJoaKjsdrtWrlypurq6Qdv+8Ic/dCYwXX311dqwYYN27NihXbt26fXXX9e9996r2bNn++xcAAAAAAAAAAAYTRiJCQAAAMCwFRQUaOrUqfrwww+VmJjoXH/66acrMDBQjz76qD788ENdcMEFmj9/vt59912FhYU56y1atEjd3d166aWX9Morr6iurm7AfiTp5z//ufbs2aOYmBi99957mjNnzoDy008/Xf/xH/+hBQsWqLq6Wj/96U+1fv167574/9qzZ4/mzJmjf/7zn4qKinKuP/XUU5Wbm6urr75ara2t+stf/qLbbrvNWd7d3a3XX39dknT7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", + "image/png": "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WlqqwsJCJSYm6qWXXlLHjh21ePHietfKzMzUwIED9dhjj2nbtm0qKipSUVGRNm3apPvuu0/XXHONTCZTjWP+8pe/yM3NTZK0cOHCOtevrKzUF198IUkaPXq0/P39m+1abFm+fLk6dOig559/Xtu3b1d+fr7Ky8t18OBBffzxxxo8eLDuvffeWtdpzXvvvacLL7xQCxcuVFpamsrLy5WWlqZ58+apR48e+vzzz+s8/qWXXlKXLl3073//W4mJiSooKFBZWZn279+vDz74QP369dP06dMbfa0AAAAAALQWJDEBAAAAAAAA5zCz2axx48ZZkofGjh2rjz76SGvXrtX69ev12muvqW3btiouLta4cePqrexzzTXXKCkpSffff79++OEHbdmyRZ988oni4+MlSYsXL9Y777xT4xhvb2+NHDlSkvTVV1+prKzM5vpLly5VTk6OJOnGG29s1muxZvv27Ro7dqwKCgrk7Oyshx56SCtXrtTGjRv19ttvKyYmRpL0xhtvaNq0afWudddddykkJET/+c9/9Ouvv2r16tV6/PHH5erqqvLyct14440245w1a5YeffRRVVZW6oILLtCbb76pFStWaPPmzZo/f74GDhwos9ms5557TrNnzz7tawUAAAAAoDVxsncAAAAAAAAAQF2OF5U3+lhPVye5OTtaHcsprpDZbG7Uuu4ujvJwsf7WWl5JhapMDV830Mu1UTE01LvvvqslS5bI2dlZixYt0mWXXVZjfMCAAZo0aZIGDx6sXbt26cEHH6yzXdqmTZu0fPlyDR061LKvV69eGjVqlLp06aLMzEzNmTNHd955Z43jrrnmGi1atEgFBQX69ttvNW7cOKvrf/LJJ5IkHx8fjRkzplmvxZo77rhDFRUVcnR01LfffmtJvpKkvn37avz48Ro0aJCSkpL00ksv6aabblLXrl2trrVjxw5FR0drw4YNCgsLs+y/+OKLNWrUKI0cOVKVlZW65557tHHjxhrHJiUl6cknn5QkPfPMM3rmmWcs7fwkqXfv3powYYJuvvlmffzxx3ryySc1adKkWpWrAAAAAAA4W5DEBAAAAAAAgFat9z9XNPrYf1zVVTcNbGd1bMQrq5VTXNGodR+4JE4PXdrR6tj4t9Zrb1ZRg9c68OIVjYqhIcxms2bOnClJuv/++2sl/VTz9/fXrFmzNHr0aK1du1Z7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lZXZXH/p0qXKycmRJN14443Nei3WbN++XWPHjlVBQYGcnZ310EMPaeXKldq4caPefvttxcTESJLeeOMNTZs2rd617rrrLoWEhOg///mPfv31V61evVqPP/64XF1dVV5erhtvvNFmnLNmzdKjjz6qyspKXXDBBXrzzTe1YsUKbd68WfPnz9fAgQNlNpv13HPPafbs2ad9rZJkNBo1ZswYSwLTyJEj9dVXX2nz5s368ssvNWLECH3//fd66qmnGrU+AAAAAAANxSdBAAAAsJv4MB91DvPWjrSabaU6h3lr+tguurB9kJ0iA9CU4sO99dZfe+mfS5KVlltaY6ywzKh/LknWgo2H9PSYLhraKcROUQJo1YqPNf5YF0/J2d3GusclmRu3rrP7ibWtKcmRzKeRnOnZvL/zvPvuu1qyZImcnZ21aNGiWlWQBgwYoEmTJmnw4MHatWuXHnzwwTrbpVVXWxo6dKhlX69evTRq1Ch16dJFmZmZmjNnju68884ax11zzTVatGiRCgoK9O2332rcuHFW1//kk08kST4+PhozZkyzXos1d9xxhyoqKuTo6Khvv/3WknwlSX379tX48eM1aNAgJSUl6aWXXtJNN92krl27Wl1rx44dio6O1oYNGxQWFmbZf/HFF2vUqFEaOXKkKisrdc8992jjxo01jk1KStKTTz4pSXrmmWf0zDPPWNr5SVLv3r01YcIE3Xzzzfr444/15JNPatKkSbUqV9Xn7bff1pYtWyzX/vbbb9c4x9VXX61bb71V77333mmtC5wLsrKytHHjRm3cuNFSbe748eOSpJtvvlnz5s1r8nMuWLBA77//vn777Tfl5eUpNDRUgwcP1tSpUzVw4MAmPx8AAADQmpDEBAAAALtxcDDomSu76po56yRJfh7OenhkJ93QN0pOjhQNBc4VBoNBl3UL19BOIXr3l1S9sXKfSiuraszZl12sye9v0iWdQ/TUmC6KCbKRGADg/DSrfeOPHf2S1O9262Nv9JVKjjdu3SF/l4bZqMLz/uVS9u6GrzUjv/45jWQ2mzVz5kxJ0v3332+zjZu/v79mzZql0aNHa+3atdq7d6/i4uKszr3vvvtqJDBVCwgI0JQpU/Tiiy9q586dys/Pl6+vr2V82LBh8vf3V25urubPn281iamoqEiLFi2SJF177bVyc3Nr1ms5VXWigiTdfvvt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6cYbb9SOHTu0bds2JScn68svv7SMTZw40eoxLXEtI0aM0JNPPilJeu+999SnTx+r89avX29JPBgxYoTN9XJycrR48WJdffXVVsffe++9Gueu5ujoqNGjR2vBggVavny5kpOTFR8ff9rXU5+IiAjFx8crOTlZn3/+uWbOnCl399qtEouLi/XZZ581+fkBSGlpaZZtW63kqkVFRVm2Dx8+rC5dGtZ6+eRzWHP06FHLdmFhoQoKChq07pkqKiqyug2cCe4rVDObzTIajTIajXJ1dZWDQ+3aHqWlpTp48KCqqqpkNBplMllvCV398/nIkSM19kdFRSkoyHrV2PT0dDk4OMjJyUmOjo5ycnKq8YdWvucvfk6hOdjrviosLGzyNUliAgAAwGkrMjnp79/s1ne7sq2Ouzg66JZBMZo6rL283ShvD6BpvbV6n9LzyyRJa1OOa/TsX/TX/m310KUd5edhvRIGAJyvHBwc9MQTT+iee+5RamqqbrrpJn300UdydXW1Or+goEAffvih7r333maN64YbbtDjjz8us9ms+fPn6+uvv5YkDRw4ULGxsVaPaYlr6devn/r06aPNmzfrnXfe0bXXXqtLLrmkxpz8/HzdeeedlpjuvvvuOtf829/+pgsvvFChoaE19q9evVpz586VJPXu3Vt9+/atMT5t2jR99tlnqqqq0rhx4/T999/bTHCoqqrSwoULNWTIkHqTIE5199136/7771dGRoYefvhhzZkzp9achx56SFlZWae1LoCGOfmDHy8vrzrnenr+2Wr5dD6cOjn5qT4fffSRpRJcS/roo49a/Jw493FfnVscHR3l7OxsSQKq3q5rX7Xt27errKys1ppubm7q0aNHo2NasWKFcnNzrY7179+/zkQlo9GoysrKGv+t3s7Pz1dJSUmj48LZg59TaA4teV/l51t/wP1MkMTUzA4ePKjZs2dryZIlOnz4sFxdXdW+fXtdd911mjp1qjw8PBq17oEDBxQTE3Nax0RHR+vAgQO19g8dOlSrV69u0Bq0agAAAEcqPfVdUbSM+dYTmEbEh+qpK+LVLsjT6jgAnInMgjK9tXpfjX1VJrM+WH9Q3+xI18OXdtTE/tFypPobAFjcdddd+uGHH/TVV1/p888/19atW3XnnXeqX79+8vX1VUFBgXbv3q1Vq1Zp0aJFcnNza/YkpsjISA0ZMkSr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PMpXe/PbVGUCNcz035+O8uamDK45O55rpsURaerf32OFEEIIUI9rHt9OTkJMbeXk5DBv3jwOHz7snFdbW8vq1atZs2YNH374IcuWLWPv3r0sWLCAvLw853p1dXV8+eWXfPfdd6xevZrZs2e32395eTmLFy9m06ZNbeaXlpaybt061q1bx3//+19Wr15NXFycyzGmpqYyb9488vPznfMaGhr44Ycf+OGHH7j++us599xzT/ZHcdLWrVvn8mdgsVg4evQoR48e5Z133uH+++/nscce65HnrKioYOnSpfz4449t5jc2NrJz50527tzJiy++yMqVKznrrLNc7mPDhg0sXLgQs7ml+mhBQQFfffUVX331VafBLyGEEP1bQEBAm8e1tbXYbDb0+tP3HO7p+8qEEOIEOBwKPx8uoabRxswEP5fr3D13GOsPl3JZcgy3zer/4aXKOgv/25XHB1uzOFbi+gB9M2+DjsXjorhy6iDGxpikJLMQQgghhBDitBPo68GNMxK5YXoCW9LLeH9rNmsOFGK1t69OW2ex8+G2HD7clsPYGBNXThnE4vFR+Hj0z0NpQ8P9ee7XE7hr7hCe+8F1mKnWYueldcdYvj6dC0ZFcO3Z8STHB8r3PyGEEP3W8VWYQEJMx1u2bBm5ubk88MADXHDBBfj4+LBx40YefvhhzGYzN9xwA5MnT2bhwoXU19fzz3/+k5kzZ2IwGPj222/55z//SWNjI9dddx1HjhzBw6OlBa3dbmfhwoVs2bIFgJkzZ3LnnXeSkJBAfn4+b7zxBitWrCA1NZW5c+eSkpKCn1/bY+tms5n58+c7A0yXX3451157LWFhYRw+fJinn36aN998k/379/feD80Nm82Gr68vF110EXPmzCEpKQmj0UhxcTEHDhzgueeeIysri8cff5xhw4a1qbqUnJzMvn37WLlyJX/5y18A+O6774iKimrzHAkJCc77jY2NzJs3j127dqHT6bjyyitZsGABCQkJWK1W1q9fz9NPP01xcTELFixg9+7d7YJi2dnZzgCTVqvl5ptvZunSpZhMJvbu3cvjjz/OI488wuTJk0/hT04IIcSp5O/vj0ajQWn1Jb+qqorg4OA+HNWp1etHXo4cOcI777zDli1bKCwspL6+nu+++44hQ4Y419m/fz/Z2dn4+voyc+bM3h6iEOIMYm6w8umOXN7dkklm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ICCAO++8E4DNmzfz+9//vsPzp0VFRbz22mvtnmvJkiUAfPnll3zyySfttqupqeGWW27pcMxCCCEGjvz8fDIyMigvL8dms1FV5f788kDWK+3k7rrrLp577jmOHTvGrbfeyosvvohe7/qpv//+e66//noaGhoIDg7mpptu6o0hCiH6sd3ZFby9OZNV+wqw2ttekfBLejlphWaSIozttvMy6NrN6ysNVjs/phWzMiWPn9JKsNg7D3TGBfuwZFwUyybHEhvk0wujFEIIIYQQQgjRE7wMOi6ZEMMlE2I4VFjNpzty+GpvPkVm11fkW+0Ka1OLWZtajI+HjvNHhrNkQjTTh4Rg0PV9aXhfTz2/OSuOq6YOYsuxMt7anMna1CIcxxUNuPbs+D4ZnxBCCCF63q233sr777/Pli1bePPNN8nKyuL2228nISGBgoIC3njjDT7//HMABg8ezF//+td2+3jooYf45JNPyM3N5b777iMlJYVrrrmGsLAwDh8+zNNPP8327duZPHlyh1WWbr75Zl588UVsNhuLFi3ioYceYvr06VgsFjZt2sTTTz+N1Wpl6NChHDly5IRf64QJExg9ejT79+/nlVdeoaKigquvvprIyEhyc3N57733+OyzzzjnnHNchqha78fLy4uGhgb++te/YjAYiIuLc7b6iY6OxttbvUD5b3/7Gz///DNbt27l2WefZd26ddx0002MHz8eX19fKioqOHDgAGvXrmX16tWMGTOGG2+8sc3zPfXUU3z//fdUV1dz5ZVX8vPPP7N06VKMRiN79+7l8ccf5/Dhw53+fIUQQgwMJpOJgoIC5+OqqioURTntKlb2SogpPDycl19+mWuuuYbXX3+d7777josuusi5/Nlnn0VRFDZt2kRaWpqzd99bb72Fn5/7K7yEEKevRpudVXsLeHtzJntyO06RfrYjl78sHNlLI+s6m93B5mNlrEzJ57sDhdQ0dn41bYifJwvHRrJkfBTjYwNOuzcdIYQQQgghhDjTDI/w5y8LR/LAghFszSjjy5R8vtlXgLnB9XfEOoudFSn5rEjJJ8jXg4vGqN8RJw4KRNvH7cQ1Gg1nDwnh7CEh5JTX8d7WLD7enkNlnZXJcYGMjja53K6m0cZPh8twKCAd0YUQQoiBQafT8fXXX7N48WI2bdrEjz/+yI8//thuvREjRrB69WqX5/NMJhPf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Tm/x8AefwKbgUXDbEJJPsOuQksFHrW4ghBBCCHEi9E0VlKInATep8xqq1DBTznbI2Qq526HR3IWdKVCSqk673lZn+QSDzqP9qg4bHPtBnb7+PcSd3RRoWggBsT316oQQQgghxBnI11NPYqhfXw9DiC4ZSMf5B5LjzxlpNBoJMAkhBoSG777rcoCpmaei467ycdwd+hOz9iosORbIyAt+TcC7SzGEh5+ikQrRscDLL0Pr50v+ffe3+Z2u/PgTAn99pVQE64RGo+HOCXfy2+9+65xXXFfMZ4c/46oRV/XaOAwGA42Njc7HEmJyISMjw3lfURQSExPRaDR89913DB061O12Go0GLy8vgoOD0el0p2Joveqrr77iN7/5DWZzy8mkuro6duzYwY4dO3jttddYtWoVQ4YM6fZzOBwObr75Zl5//fU28/Py8sjLy2PFihXceOONvPLKK86yrK6UlpayYMECtm/f3mZ+eno6y5cv5+233+a///0vN954Y7fH2m/pvcArALxM6tQmjHR8MKnVPL2LE31CCCGEEL3FywSD56gTgMMOJWlqoClnm3pbnt61fdWVdWElBbI2qdO390PUBDXQNGIxhLj/jC+EEEIIIYQQA9lAOs4/0LgKMQkhRH9nLyzEnpPTrW3HNobwzs5kBi35Nf5zZkvVJdEvmC66CK2vL3l334PSHIRRFEpfeIGY557t28ENAMkRyUyJmMK2wm3Oea/te41Lh16Kl96rV8YgIaYuiIuLczk/KirK7bLTze7du7n88supr6/Hz8+PBx54gNmzZ1NfX89HH33Eq6++yuHDh7nooovYsWMH/v7+3XqeP//5z84vNhMmTODee+9l8ODBHDt2jH//+9/s3r2b1157jdDQUP7v//7P5T7sdjuXXHKJM8D0q1/9iptuuomgoCC2bt3KP/7xD4qLi7nllluIjo7uh1d8aNSTeN4BTUGkADePA9s+bp4MvfPHQwghhBDilNLqIHyUOk1uuvKjpgRyt7UEm/J2tbSMO1n5u9Xph79B4iy4ZmXP7FcIIYQQQggh+omBdJx/IJIQkxBiILLs3HlS2w++aCne88/vodEI0TP8Z80i+OabKH3+v8551WvW0JCaiteIEX04soHh9vG3s+3blhBTaX0pnxz6hGtGXdMrz284LhApIaYuaN1/70xx9913U19fj16vZ82aNUyb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755590ApVyapovFtRENML7zwwkjubtxasmQJzj//fGzfvh3PP/88brvtNixfvjxinV//+tc4duwYAOD++++HUhn5Bt6yZUv4C89tt90WESIKeeCBB7B+/XoEAgF85zvfwbZt25CSkhJe3tnZie985zsApLasDzzwQMx6H3zwQdx1112w2Wx4+OGH8fTTT0csr6ioCH9ZmzZtGkNMRERERJR8qTnwLbgdf/msE1rRha+fl4uUqn8ClVuBoC/2NhmlgKsZ6Gwb3DFsFdJ0oPsOJLURKFjcE2zKWwioeeKJiIiIxoBgUAoDuW1Ap016dLf2PO/sfu1uk553tkmBJH/nQHsefZ6OZFdAFNN4O89PRESJkblgAayffTbs7buaTsP24oswXnUV5EbjCFZGNHztf/sbbN3B7BDjVVdCVViYpIrGj1hdmAoMBbi85PIkVTT+cYDhUfLkk09ixYoV6OzsxCWXXIL/+q//wgUXXIDOzk789a9/xfr16wFInZC+//3vD+sYpaWleOihh/DYY49hz549WLFiBX7wgx+gpKQEFRUV+PnPf459+/YBAB566CFMnz495n5uu+02/OlPf8KOHTvwu9/9Dg0NDbj77ruRlpaGXbt24X/+539gt9shk8nw1FNPcVxqIiIiIhpT3IIOvnlfQ8p590oX405+JA0TV/5J5IW5G/4CmEuA1nKg5t/SVP1voOXE4A7U1QGUfyxNACDIgKyzukNNS6VQU3qx1DGKiIiIaLgCvj7Bo77BpLbo5Z72kemKlAyd7cmugCiu8XSen4iIEmP+N76BA888M+ztX7hVgy3lv8AVX3scyxasRfqNNyFlzlkjWCHR0LS+sAFNP/955EyFAhn3sQvTYGyp2YKjrUcj5t07/14oZezCNFxMo4ySs88+G6+++ipuvvlm2O12/Nd//VfUOqWlpdi0aRMMZ9A28H//93/R1NSEP/3pT9i3bx9uuOGGqHXuuusu/OQnP4m7D7lcjrfffhtr167F7t278cYbb+CNN96IWEetVuPpp5/Gl7/85WHXSkREREQ06lJMwLzrpMnrkoJMx94D2quBjGnSOhnTpensm6XXpz8DXri0104EYDDD04lBoOGQNO1+rvv4aVKYKTTlngPoM0fwByQiIqJxJRjsDh21SB0hXc2AqyV+xyS3DfA6kl318MjkAATpZ0afQFVKOnDB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//xzSbceP9e+fXuTI4Ir6tChg3W5qhr6888/W5epoTCTv7+/WrVqpaysLJ05c8bscFBPpKena/jw4UpPT5fFYtHKlSs1ZsyYSvehRsJRapKPtqJGwp7GjBmjtWvX6vr16/riiy/04IMPSqI+whwV5aOt3NzcFBwcrKSkJOojKvTWW28pPz9fXbp0UU5OjtasWVNmm++++866/PXXX+vcuXOSpIiICPn4+FAjgX/54Ycfan2Mdu3a2SGSmuGzXDc5Kq86dOig/fv36/r167p8+XKlT1oofr/btGlT6vE49tajRw8dPXpUeXl5unDhgtq0aeOwc8E2zuqPpP64jrrWx809JVTHL2tV8aPhy2N2rWIQE0zRo0cP7d69WykpKSosLJSbW/mp+OOPP1qXu3fv7qzwgHJVNm0j4CzF3+iRStfI8lBDUZdQQ1EdWVlZuueee3TixAlJt75V//DDD1e5HzUSjlDTfKwOaiTspWRHSVpamnU5ODhYjRs3VlFREfURTlNRPlYH9RFVKX7MwYkTJzRp0qQqt//zn/9sXU5NTZWPjw9tSOBfQkJCzA6hVmjv1E2OyqsePXpow4YNkm69nwMHDix3u8LCQh0/flyS499r2i11kzP6I2lLuJa61sdN7YGtalKr3Nzc1K1bN4fGVR4eJwdTDB48WNKtqci++eabCrcrOfXdXXfd5fC4gMocPXrUuswsTDBL586drflX1fSg//jHPyRJt99+uwIDAx0dGlChzMxMZWVlSaJ+ompXrlzRvffea/29+9prr+nJJ5+0aV9qJOytNvloK2ok7KnkNy9LTvft7u6uAQMGSJISExOVn59f4TGK66eHh0el38oDqlJRPtqqsLBQx44dk0R9hGPRhgQaBto7rqW4j0mqvHYnJSVZZ0JxdB9T8d+NHh4eatWqlUPPBds5oz+StoRrqUt93NxTQnX0799f7u7ukiqvVfn5+dq3b591nyZNmjglvpIYxARTjB071rq8atWqcre5efOmVq9eLUny8/NTeHi4M0IDypWamqqdO3dKkrp27arbb7/d5IjgqiwWi/XxNT/++KO1IfFL+/bts46UHjNmDKPxYaply5bJMAxJ0tChQ02OBnVZTk6ORo0apUOHDkmSXnrpJb3wwgs270+NhD3VNh9tRY2EPa1bt8663KtXr1Lriv8Ov3r1qjZu3Fju/qdP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AAAAAAAaOh4nBwAAAKBadu3apaioKF27ds36s7S0NK1cuVLbt29XfHy8QkJC9Mknn2jKlCnKz8+3bnf69Gm9//77+vvf/669e/eqffv25Z7j0qVL+t3vfqevv/661M9v3Lihb775Rt98843ee+89bdmyRQMHDnTMhVZg06ZNmjx5snJycqw/y8jI0ObNm7Vt2zZ99NFHmjBhQpn9zp49q+HDh+vo0aOlfn7p0iVdunRJx44d0xdffKH09HQtXLjQ4dcBAAAAAAAAAEBdwkxMAAAAAGyWnp6u8ePHy8/PT0uWLNH+/fu1e/duPfvss7JYLMrIyNC0adN08OBBPfzww+ratauWL1+uAwcOKDY2Vg899JCkW4Oe/uu//qvcc9y4cUPDhw/X119/rcaNG+uhhx7SJ598on379mn37t169dVX1apVK2VkZGjkyJFlZn9ypCNHjujBBx9U27Zt9c4772jfvn1KTEzUnDlz5OnpqaKiIk2fPl2ZmZll9n366aetA5gmT56sjRs3at++fTp48KC2bt2qV155Rb1793batQAAAAAAAAAAUJcwExMAAAAAmyUnJ6tbt25KSEhQmzZtrD8fPHiw3NzctHDhQiUkJGjUqFEaMGCAdu7cKW9vb+t2YWFhysvL07p167RhwwZlZmaWOo4k/elPf9KhQ4fk5+enXbt2qV+/fqXWDx48WP/xH/+hQYMG6ezZs3rxxRf10UcfOfbC/+XQoUPq16+fvv76a/n6+lp/PnDgQAUFBWny5Mm6evWqPvzwQ82cOdO6Pi8vT1u3bpUkzZo1q9yZliIiIjR37lxdvHjR8RcCAAAAAAAAAEAdw0xMAAAAAKrl7bffLjPwSJKeeOIJ63JWVpaWL19eagBTsccff1ySVFhYqMTExFLrsrOz9e6770qS/vznP5cZwFQsICBAL7/8siRp3bp1un79es0upgZWrlxZagBTsQcffND6eLzdu3eXWnfx4kUVFBRIkn77299WevyWLVvaKVIAAAAAAAAAAOoPBjEBAAAAsJmfn5/uvffectd17txZzZo1kyTdeeed6t69e7nblXxk2okTJ0qti4+P15UrVyRJv/vd7yqNpXgwUEFBgb755hvbLqCWevXqpTvvvLPcdRaLRX379pVU9rpatWold3d3SdLf/vY3FRYWOjZQAAAAAAAAAADqGQYxAQAAALBZt27dZLFYKlzv5+cnSQoODq5yG0m6du1aqXVJSUnW5Xbt2slisVT46tmzp3Xbc+fOVfNKaiYkJKTS9cWzKP3yujw8PDRhwgRJ0vr16xUUFKTnn39en3/+uS5fvuyQWAEAAAAAAAAAqE8YxAQAAADAZuU9Hq6kRo0aVbld8TaSVFRUVGpdRkZGjeLKycmp0X7VZev1//K6JOmdd95RRESEJCktLU2vv/66Ro0apVatWql///56/fXXrbNQAQAAAAAAAADgatzMDgAAAAAAipUc/HPo0CE1adLEpv06dOjgqJDsxtfXV1u3btWBAwe0du1axcXF6dtvv1VRUZGSkpKUlJSkhQsXavPmzRo0aJDZ4QIAAAAAAAAA4FQMYgIAAABQZ7Rq1cq63KZNm3oxOKm6BgwYoAEDBki69di5uLg4xcTEaOPGjcrIyNC4ceN0/PhxeXl5mRwpAAAAAAAAAADOw+PkAAAAANQZffv2tS4nJCSYGIlzNGvWTBEREdqwYYN+//vfS5LOnj2rPXv2mBwZAAAAAAAAAADOxSAmAAAAAHXG8OHD5e3tLUl6++23ZRiGyRE5z7Bhw6zLWVlZJkYCAAAAAAAAAIDzMYgJAAAAQJ3h5+enp556SpK0d+9ezZw5Uzdv3qxw+/Pnz2v58uXOCq/GTpw4ofj4+Eq32bFjh3W5c+fOjg4JAAAAAAAAAIA6xc3sAAAAAACgpD/96U+Kj4/X/v37tXjxYsXFxemxxx5Tnz595OPjo0uXLun777/Xrl279Pe//129evXStGnTzA67UqdOnVJ4eLh69OihyMhIhYaG6vbbb5ck/fzzz/r000+1du1aSVKfPn3061//2sxwAQAAAAAAAABwOgYxAQAAAKhTPDw8tHPnTk2ZMkUbN27UP//5T+vsTOXx9fV1YnS1c/ToUR09erTC9SEhIdq4caMsFosTowIAAAAAAAAAwHwMYgIAAABQ5zRr1kwbNmzQnj179MEHH2j37t1KT09Xbm6ufH191bVrVw0YMECjRo3SiBEjzA63SkOGDFFcXJy+/PJL7du3Tz///LPOnz+vvLw8tWzZUr1791ZUVJSmTJkiDw8Ps8MFAAAAAAAAAMDpLIZhGGYHAQAAAADOFhgYqLS0NEVHRysmJsbscGwWFxen8PBwSVJsbKzCwsLMDQgAAAAAAAAAADtgJiYAAAAALu3y5cv67rvvJEnu7u4KDg42OaKyMjIylJGRIUlKTU01ORoAAAAAAAAAAOyPQUwAAAAAXNqWLVu0ZcsWSVJAQIBOnjxpbkDleO+99zR37lyzwwAAAAAAAAAAwGEamR0AAAAAAAAAAAAAAAAAANdmMQzDMDsIAAAAAAAAAAAAAAAAAK6LmZgAAAAAAAAAAAAAAAAAmIpBTAAAAAAAAAAAAAAAAABMxSAmAAAAAAAAAAAAAAAAAKZiEBMAAAAAAAAAAAAAAAAAUzGICQAAAAAAAAAAAAAAAICpGMQEAAAAAAAAAAAAAAAAwFQMYgIAAAAAAAAAAAAAAABgKgYxAQAAAAAAAAAAAAAAADAVg5gAAAAAAAAAAAAAAAAAmIpBTAAAAAAAAAAAAAAAAABMxSAmAAAAAAAAAAAAAAAAAKZiEBMAAAAAAAAAAAAAAAAAUzGICQAAAAAAAAAAAAAAAICpGMQEAAAAAAAAAAAAAAAAwFQMYgIAAAAAAAAAAAAAAABgKgYxAQAAAAAAAAAAAAAAADAVg5gAAAAAAAAAAAAAAAAAmIpBTAAAAAAAAAAAAAAAAABMxSAmAAAAAAAAAAAAAAAAAKZiEBMAAAAAAAAAAAAAAAAAU/1/RJfNPSGZCccAAAAASUVORK5CYII=", "text/plain": [ "
" ] @@ -452,25 +446,6 @@ "drag_pulse.plot()" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Pulse `serial` is a string representation of the pulse. It can be used as is to generate a copy of the pulse: " - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "p1 = Pulse(0, 40, 0.9, 50_000_000, 0, Gaussian(5), 0, PulseType.DRIVE)\n", - "assert p1.serial == 'Pulse(0, 40, 0.9, 50_000_000, 0, Gaussian(5), 0, PulseType.DRIVE, 0)'\n", - "p2 = eval(p1.serial)\n", - "assert p1 == p2" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -487,7 +462,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ @@ -499,7 +474,6 @@ " shape = Rectangular(), \n", " channel = 0, \n", " qubit = 0)\n", - "assert repr(rop) == 'ReadoutPulse(0, 50, 0.9, 20_000_000, 0, Rectangular(), 0, 0)'\n", "assert isinstance(rop, Pulse)\n", "\n", "dp = DrivePulse(start = 0,\n", @@ -510,7 +484,6 @@ " shape = Gaussian(5), \n", " channel = 0, \n", " qubit = 0)\n", - "assert repr(dp) == 'DrivePulse(0, 2000, 0.9, 200_000_000, 0, Gaussian(5), 0, 0)'\n", "assert isinstance(rop, Pulse)\n", "\n", "fp = FluxPulse(start = 0,\n", @@ -520,10 +493,67 @@ " channel = 0, \n", " qubit = 0)\n", "\n", - "assert repr(fp) == 'FluxPulse(0, 300, 0.9, Rectangular(), 0, 0)'\n", "assert isinstance(rop, Pulse)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### SplitPulse" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Sometimes the length of the pulse is so long that it doesn't fit in the memory of one sequencer. In that case it needs to be played by two (or more) sequencers.\n", + "The `SplitPulse` class was introduced to support splitting a long puse into smaller portions:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAACWwAAALKCAYAAACs8YqSAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAB7CAAAewgFu0HU+AAEAAElEQVR4nOz9eXQsd30n/L9r7epdu3Tvle6++Ron8RgbG5MYE/CZDDFbEsjwIzZ7SCAsB4YESAiZOSQhgTFLIMEL9jCZBycTHhzABBgmYGw/gJcAMfjuq3apJfXe1bX+/qilu6XWvVpaUkt6v87pU2t3lWS5b3fV+/v5CK7ruiAiIiIiIiIiIiIiIiIiIiIiIqI1J270CRAREREREREREREREREREREREW0XDGwRERERERERERERERERERERERGtEwa2iIiIiIiIiIiIiIiIiIiIiIiI1gkDW0REREREREREREREREREREREROuEgS0iIiIiIiIiIiIiIiIiIiIiIqJ1wsAWERERERERERERERERERERERHROmFgi4iIiIiIiIiIiIiIiIiIiIiIaJ0wsEVERERERERERERERERERERERLROGNgiIiIiIiIiIiIiIiIiIiIiIiJaJwxsERERERERERERERERERERERERrRMGtoiIiIiIiIiIiIiIiIiIiIiIiNYJA1tERERERERERERERERERERERETrhIEtIiIiIiIiIiIiIiIiIiIiIiKidcLAFhERERERERERERERERERERER0TphYIuIiIiIiIiIiIiIiIiIiIiIiGidMLBFRERERERERERERERERERERES0ThjYIiIiIiIiIiIiIiIiIiIiIiIiWicMbBEREREREREREREREREREREREa0TBraIiIiIiIiIiIiIiIiIiIiIiIjWCQNbRERERERERERERERERERERERE64SBrS1qamoKX//61/HhD38Yv/Zrv4aenh4IggBBEPD6179+TY75pS99CbfddhsGBgagaRr27NmD173udfjBD36wJscjIiIiIiIiIiIiIiIiIiIiItpsBNd13Y0+CWo9QRAW3XbnnXfigQceaNmxKpUKfvM3fxPf+MY3mm4XRREf/vCH8ad/+qctOyYRERERERERERERERERERER0WbEClvbwO7du3Hbbbet2eu/8Y1vDMNat956Kx566CE8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uo8oirjjjjvwgQ98ANlsFt/97ndx2223LfkYruvin//5nwEAR48exY033th0vxtvvBFHjhzByZMn8c///M/4m7/5GwZu1oAsCmE/2Iiflo7IXi9Yb73oBav8EFWwrWE/f70q1/WQrQtURfxAVVRt7DnLVn9ERERERERERERERERERLRagiCE96HXg2nXQmHVhoCYEwbBqpaDquXAsLwAWNVyUDXr5i3bX/bmDcsJnzN/W/1zmRXb3loa2JIk738YQRDCqkv161di/mutxJ49e1b1/M3oscceAwDE43Fcd911i+53yy23hPOPP/74sgJb58+fx9jY2ILXWew4J0+exOjoKC5cuIB9+/Yt+TjtTJW9EJQiCVBlEYokhuuCZW+bBLVuH0VaPCQVCQJUihRWrorM39YkdMXQFBERERERERERERERERER0dIF9+9TWmtbRy6FZV852GXYiwe+ghCZYXtT065fdmHYDkx/uXFb3bLlwLS9fWl9tTSwtVjbwe3WjrAdHD9+HABw8OBByPLi/5mPHj264DlL9eyzzzZ9naUcZ60CW8/bpUKKxCBLAlRJgCx6D0USvHWiCFmqXydCFQVIkgBF9N6MZdF7riSJUIL9RAGqJEKS4K0TRUgi1qBSmOM/mrD8BwDTfxRbfHQiolazbRuGYQAALly4sKoQNxERtR7fp4mI2hffo4mI2hvfp4mI2hvfp4los5L9RxwARP/RNEsWbGwN13VhOy4Mx4VluzD9h+W4MB0Xlu3ACJZtL+Rl2YDpOP722vpgf+81AMv1ttmOC6sqwD3bstPe1Foa2PrTP/3TZa2ntaHrOjKZDABgcHDwsvt2dnYiHo+jVCpheHh4WccZGRkJ5690nKGhoXB+OcepP0Yz4+PjDcuRk98GHBMAYPgPIiIiIiIiIiIiIiIiIiIiIto4AgBFVGCoXRt9Km2Bga0tqFAohPOJROKK+weBrWJxefWalnOceDwezi/nOPVBLyIiIiIiIiIiIiIiIiIiIiKiza519dE2gePHj+M973kPnvvc56KrqwuKokCSpMs+LtdOsF3puh7Oq6p6xf0jkQgAoFKprNlxgmOs5DhERERERERERERERERERERERFvF5ksjrdB//+//HR/4wAdgWRZc193o01lTmqaF80Fv5supVqsAgGg0umbHCY6x3ONcqX3i+Pg4brjhhiW/HhERERERERERERERERERERHRRtqwwNbU1BSeeeYZzM7OAgC6urrwnOc8B/39/S0/1je/+U28733vAwAIgoAbb7wR1113Hbq6uiCKW6/IWDKZDOeX0n6wVCoBWFr7xJUeJzjGco8zODi4rHN63/vei97uzmU9h4iI1o5pmnj22WcBAMeOHYOiKBt8RkREVI/v00RE7Yvv0URE7Y3v00RE7Y3v00RE7Wl6Zg5//un7N/o02sK6BrZc18XnP/95fO5zn8PPf/7zpvscO3YMv//7v4/f/d3fbVmY6pOf/CQAoLOzE1/96ldx8803t+R125Wmaeju7sbMzAxGRkYuu+/c3FwYphoaGlrWcerDVFc6Tn2lrOUeZzn+f//jJ3CVODRFhKZIiCgSNNmbD9Zpcm0+IovePsF2WWrcVxERWbDOe54ibb2wHxFRqxmGEVZWTCQSS2rVS0RE64fv00RE7Yvv0URE7Y3v00RE7Y3v00REy+O6LqqWA920w6luBlMbuuWg6k910/bmg+2WjarpQLfqn+Og2rDeW4dqCYc3+odtE+sW2JqamsLtt9+Op556CgAWbUv47LPP4h3veAe+8IUv4Gtf+xoGBgZWfeynnnoKgiDgwx/+8JYPawWOHTuGRx99FGfOnIFlWZDl5v+pT5w4Ec5fddVVyz5Gs9dp9XGWo1CxUazoa/b69SRRqAuDSYiEga/auqgiIap605jaOK8pEmKqjKgqIqrIiKr+Pv5zYqoXLhNFYV1+HiIiIiIiIiIiIiIiIiIiImovtuOiYtooGxZ0wwnnK36YqmI43jbT9rd5U92om6/fZtSWg4BV1XLW5WdJwFyX42wG6xLYqlareNGLXoTjx4/DdV309vbi1a9+NW644YawBeLk5CSefPJJ/OM//iOmpqbw9NNP48UvfjGefvppRCKRVR2/XC4DAF7wghes+mfZLF7wghfg0UcfRalUwtNPP43nPe95Tfd75JFHwvnlhtn27duHnTt3YmxsrOF1mvn+978PANi1axf27t27rOO0K9txUTJslAx7TY+jKaIf8pKhKaIf8qoLgc0LhWmqhFiwvz8fBMASERmxiIy46m1XZVYJIyIiIiIiIiIiIiIiIiIiWg3TdlCu2igZFsqGhVIwH66zUapaYYCq4genghBVfaBKN2vbKoYNw16fMBWtr3UJbN1111149tlnIQgC3vSmN+GTn/wk4vH4gv1+53d+B3/5l3+J97znPbjnnntw/Phx3HXXXfijP/qjVR1/165dOHfuHAzDWNXrbCaveMUr8Bd/8RcAgPvvv79pYMtxHHzxi18EAHR0dODWW29d1jEEQcDLX/5y/O3f/i1OnDiBH/7wh7jxxhsX7PfDH/4wrLD18pe/HILAilHL4SVaHcyVW580VSURsYiEuCojpkqIRWQkIl6YKx4ue9viqoxYxA991W2PqxLiETnczlaRRERERERERERERERERETUjlzXhW4688JUXsCqYWrYKFf9aZPtZb96VfA6DFXRcq1LYOvBBx+EIAh4yUtegnvuueey+8ZiMXz+85/HxYsX8e1vfxsPPvjgqgNbt99+Oz71qU/h8ccfx0033bSq19osbrjhBvzyL/8yHn30Udx333248847F/zsn/jEJ3D8+HEAwLve9S4oitKw/Xvf+14Y4rrzzjvxwAMPLDjOu9/9btx9992wbRt/8Ad/gO9///thP2gAqFQq+IM/+AMAgCzLePe7393Cn7JRd08X/ublNwCyEvZDbeyr2tgbter3Uq3tW9d/dd46y2newnOzM2wHRtlBtoVhMFUSEQ9CX3XTuOqFvxJabZoMlxUkIjKSmvcItkdkqWXnRUREREREREREREREREREm4/ruqhaDgq6hWLVQjGYVi0UqyaKVdtfZ6JUtf39/PmqhaJuolitVb1yt+bt/zURkUVEZBGaIvkPbz5YF5Fr6zRFrC3Ltf0jdfvDNvF/vzay0T/W/5+9+46TrKrz//+unDunmemenjxDUlGGJUgShAVBHPyJwKKAAVZ01V0WcNfvoruGXTEiqysoQV0kKSIsRhCRMDCDoiJhZnpiT+ocKsf7++NW3e6a7p7pUN1d3fN6Ph71uLfuvXXPqVFO36p6388pCzMS2Gpra5MkXXvtteN+zbXXXqtf//rX2rp165Tb/+d//mf98Ic/1Fe/+lVdfvnlampqmvI554JbbrlFJ598suLxuM4++2z967/+q8444wzF43Hdd999uv322yVJq1at0nXXXTepNlatWqXrr79e//Vf/6UXX3xRJ598sm688UYtX75cW7du1Ze+9CW99NJLkqTrr79eK1euLNn7O9A1l7xDy5YtmpZzZ7I5JTLFgS5zHtesklYQLFe0L57OKpkvWRg7YH7YodKGGSXSuWHzy8791G0hBFaKimBuh30o4DUi5DXsucepoHco9HXgsT6Xg8puAAAAAAAAAAAAADCDDMNQNJVVOJHWYDyjwUS6OGyVyCiczCg6IoQ18nl2nhZZmSyvyy6/2/wtvGjd7ZDf5ZDPbQam/G6HfKM89xa2DQtjDQWzzKXbYZfdXvrf2VcG36Ev/7+Pl/y8c82MBLY8Ho/i8bhaWlrG/ZrCsW63e8rtL1y4UD/72c/0rne9SyeddJL++7//W+edd96Uz1vujj32WN1///26/PLLNTg4qH/9138dccyqVav02GOPKRQKTbqdL3zhC+rs7NSdd96pl156SZdccsmIYz74wQ/q85///KTbmG1Oh11Bh11Bz/T+J5PLGUpk8sGuYfPVmusZxVO5fMhrtPBXcRAsns4png+CxZJDx88lqWxOvdGUeqNTm87UbpOCHqcqfC5VeF2q8DnzS5dC3qH1Cu8ox3hdCnqdckzDHyIAAAAAAAAAAAAAKFfprFnVanjgavj64Bj7wsn8MpHW4Zqz8jjtCnic8rvN2aj8+VmpfG4zNOXPB6h8rqFAlS8fphq+z+92yue258NWZijL45yeIBVm1owEttasWaPnn39e7e3tOvbYY8f1mvb2duu1U/W2t71NklRTU6PNmzfrggsuUFVVlVauXCm/33/Q19psNj3xxBNT7sNsueCCC/SXv/xFt9xyix577DHt3r1bbrdbK1as0Hve8x597GMfO+S/waHY7Xbdcccdeve7363bb79dGzduVHd3t+rq6rR27Vpdc801Ovfcc0v0juY3u90mv9spv3t6/tPM5gxrPt1o0lxGksVz8kaSQ3PxRpOZorl7C68pbIskM0pmyr8qWM6QBhMZDSYykuKTOkcoH/gKjRrqGj0MVnge8roIfAEAAAAAAAAAAACYUdmcoXAirf5YWgNx89GfX1rhqnzwarCwbVgIa64VBJkMm01moMrtGDVgVbR9jABW0fEes8KV02Gf7beGMjcjga0rr7xS69ev13e+8x29853vHNdrvvOd78hms+n973//lNv/3e9+VzQdmmEY6uvr04YNG8Z8jc1mk2EY82IatdbWVn3ta1/T1772tQm97vTTT5cxgclbzzvvvMOictlc5rDbFPK6FPK6SnbOTDanWL6K18jw11A4rDAf8NC8wuY8weFhpSzDifItZRlOmuU4Jyvk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csop+s53vqNMJjPu8wDAZJRinL777rvHfb199913H/J8sVhMN998s9auXauamhoFAgGtWbNG1113nXbu3Dnu91aq702ee+45XX755WptbZXX61VTU5POOecc3XvvveM+BwBM1osvvqj/+I//0Nlnn21dAweDQa1atUpXXXWVnnnmmQmdj+tpACitUozTXE8DQOkNDg7qvvvu03XXXafTTjtNK1asUGVlpdxutxoaGnT66afr5ptvHvd1Z6nGsnvvvVdnn322mpqa5PV61draqssvv1zr168f9znKbZyfEgOYgx555BGjoqLCkDTqY9WqVcaWLVtmu5sAUDbGGi8PfJx22mljniObzRof/OAHD/r6D33oQ0Y2mz1oX7q6uoy1a9eOeQ6Px2N897vfPeR7ev75542mpqYxz7NgwQLjhRdemOg/FQCU1MHGzCuuuGLc55mvY/Dtt99uuN3uMc9z/PHHG11dXeP+dwKAiSrFOH3XXXeN+3r7rrvuOui5tmzZYqxcuXLM11dUVBiPPvroIftUqu9NPvOZzxh2u33M87zjHe8w4vH4uP6dAGCiTjnllHGNre9///uNZDJ50HNxPQ0ApVeqcZrraa6nAZTeb37zm3GNq3V1dcYvf/nLg56rFGNZLBYzzjvvvDHPYbfbjc9+9rOHfF/lNs5PFYEtzDl//OMfDZ/PZ0gygsGg8YUvfMF47rnnjCeeeML48Ic/XPQf0eDg4Gx3FwDKQmFs/MhHPmK8/PLLYz62bds25jk+9alPWec59thjjXvvvdfYsGGDce+99xrHHnuste9f/uVfxjxHJpMx3vrWt1rHXnTRRcYvfvEL44UXXjC++c1vGg0NDdaF2c9//vMxz7Nr1y6jvr7ekGQ4nU7jhhtuMH7/+98bv//9740bbrjBcDqdhiSjoaHBaG9vn9K/HQBMxfAPeYsXLzbOPvts6/lEAlvzcQx+7LHHrA/6jY2Nxje/+U3jhRdeMH7xi18YF110kdXPt771rUYmkxn3vxUATEQpxunhPzD96le/Ouj1dl9f35jnGRwcNFatWmWd68Mf/rDxxBNPGM8995zxhS98wQgGg4Ykw+/3Gy+99NKY5ynV9ybf+c53rGOXL19u3HHHHcaGDRuMhx9+2DjjjDOsfZdeeum4/p0AYKKWL19uSDIWLlxofOITnzB+/OMfGxs2bDDWr19vfO1rXzMWLVo07rGI62mupwGUXqnGaa6nuZ4GUHq/+c1vjJaWFuP973+/ccsttxgPPfSQsX79euPZZ5817r//fuM973mP4XA4DEmG2+02/vSnP416nlKNZZdccol17BlnnGE8/PDDxoYNG4w77rjD+nsiybjtttvGPEe5jfOlQGALc04hse90Oo3nnntuxP6bb77Z+o/oM5/5zMx3EADK0FTHxU2bNllfGB533HFGLBYr2h+NRo3jjjvOGp/HSp3fcccdVl+uvfbaEfu3bNliJdpXrFhhpNPpUc/zvve9zzrPAw88MGL//fffP6lABACU2k033WQ8+uijxv79+w3DMIzt27dPeHyaj2NwKpUyli1bZt311NbWNuKYa6+91jrPoe6gBYDJKsU4PfwHpu3bt0+6L//2b/9mnefmm28esf/ZZ5+1/h4crDJuKb436enpMSorK60g24HVWTKZjHHBBRdY53nyyScn8lYBYFze8Y53GPfff/+YYaOurq6iH2yeeuqpUY/jeprraQDTo1TjNNfTXE8DKL3xBPZ/+tOfWuPQunXrRuwv1Vj2xBNPWMdccMEFI/rW1dVlLF682JBkVFVVGb29vaOep5zG+VIhsIU55YUXXrD+47jmmmtGPSabzRpHHHGE9R90KpWa4V4CQPmZ6oXFRz7yEesc69evH/WY9evXH/SLS8MwrPG5pqbGiEajox7zn//5nwf94nLfvn3WHaTnnHPOmH0+55xzDMm8s3Xfvn3jeJcAMP0mEwSYj2Pw8B+h/vM//3PUc0SjUaO6utqQZBx55JFjtgUApTRbga1UKmV9CXrEEUeMOSXXNddcY7W1YcOGEftL9b3Jl770Jes8995776jnaW9vt+7GPe+88ybwbgGgdB599FFrvPqHf/iHUY/heprraQCzZzzjNNfTXE8DmD2rV682JHNqxAOVaiw799xzrYDUWBVk77333oOGscptnC8Vu4A55OGHH7bWr7rqqlGPsdvtev/73y9J6u/v15NPPjkTXQOAecswDP3sZz+TJK1Zs0YnnHDCqMedcMIJWr16tSTpZz/7mQzDKNq/efNmvfbaa5Kkiy++WH6/f9TzXHnlldb6T3/60xH7H3nkEeVyOUlj/y0Yfp5cLqdHHnlkzOMAoJzN1zF4+HX98DaH8/v9uvjiiyVJr776qjZv3jxmewAw1z355JMaGBiQJF1xxRWy20f/yu5Q43SpvjcpnKeiokIXXXTRqOdpbm7WWWedJUl64oknFA6HRz0OAKbTGWecYa1v3bp1xH6up7meBjC7DjVOlwrX0wAwOaFQSJKUSCRG7CvFWBYOh/XEE09Iks466yw1NzePep6LLrpIFRUVkkYfn8ttnC8VAluYU5555hlJUiAQ0Fve8pYxjzvttNOs9WeffXba+wUA89n27du1d+9eScXj62gK+/fs2aMdO3YU7SuM4Yc6T1NTk1atWiVp9DF8vOfhbwGA+WC+jsGF86xevVpNTU2TPg8AzBfjHV+PO+44KyRwsPF1Kt+bpFIpbdiwQZJ04oknyu12H/I8yWRSL7744pjHAcB0SSaT1rrD4Rixn+tprqcBzK5DjdOlwvU0AEzcpk2b9Kc//UmSeXPDcKUayzZu3KhUKlV03Gjcbrd1c8XGjRuVTqeL9pfTOF9KBLYwpxTuYlqxYoWcTueYxw0fUAqvAQBIDz74oI488kj5/X6FQiGtXLlSV1xxxUHT4a+++qq1fuAF24EONv5O5jzt7e2KRqOjnqeysvKgX0ouWLDASuPztwDAXDUfx+BIJKL29vYJ9WW08wBAObrqqqu0cOFCud1u1dXV6YQTTtD/+3//T3v27Dno68Y7TjudTq1YsULS6ONiKb432bx5s7LZ7CH7cqjzAMBMeOqpp6z1I444YsR+rqcZpwHMrkON0wfiehoAplcsFtOWLVv0ta99TaeddpoymYwk6ZOf/GTRcaUayyZzHZ3JZLRly5ZJnWcmxvlSIrCFOSORSKi7u1uSxiyVV1BdXa1AICBJ1odXAIB5QfPaa68pHo8rEomora1NP/jBD/S2t71N69ats8qJDrd7925r/VDjb0tLi7V+4Pg7mfMYhlH0uuHnOdQ5hp+HvwUA5qr5OAaX6j0BQDn63e9+p3379imdTqunp0cvvPCCvvCFL2jFihW67bbbxnxdYWwMBAKqqqo6aBuFsbGrq6uoYkGpvjdhnAYwV+RyOf3Xf/2X9bww/d9wXE8zTgOYPeMZpw/E9TQAlN7dd98tm80mm82mQCCgVatW6brrrlNHR4ck6VOf+pQuu+yyotfM5nX0wc5TDuN8KY0dGQPKzPD5ToPB4CGPDwQCikajikQi09ktAJgT/H6/3vnOd+rMM8/UmjVrFAwG1dXVpaeeekrf+c531NPTo4cfflgXXnihfvOb38jlclmvncj4W7h4kTRi/C31ecb7t2C0cwDAXDEfx+BS9QUAysmyZct00UUX6cQTT7S+GNy2bZt+8pOf6Mc//rESiYT+/u//XjabTVdfffWI109mfJXMsdHj8RSdYyLnGe17E8ZpAHPF17/+dWualosuumjUKU24nmacBjB7xjNOF3A9zTgNYOa96U1v0u233661a9eO2DcfrqML5yn1OF9KBLYwZyQSCWv9YHOkFhT+w4vH49PWJwCYK/bs2TNq4vztb3+7/uEf/kHnnnuuXnrpJT311FP6n//5H3384x+3jpnI+FsYe6WR42+pz8PfAgCHg/k4BpeqLwBQLtatW6crrrhCNputaPvatWv13ve+V//3f/+niy66SOl0Wv/4j/+od77znSOmwZrM+CoVj42l+t6EcRrAXPDUU0/pU5/6lCSpoaFB//M//zPqcVxPM04DmB3jHaclrqdH6wsAlNK73vUuHXfccZLMsWbr1q164IEH9NOf/lSXXnqpvvGNb+j8888ves18uI4+8DzlmDdhSkTMGV6v11pPpVKHPL5Q3s7n801bnwBgrjhYedDGxkb9+Mc/tqpq3XrrrUX7JzL+Di8teuD4W+rz8LcAwOFgPo7BpeoLAJSLysrKET8uDXf++efrpptukiTFYjHdcccdI46ZzPgqFY+NpfrehHEaQLl75ZVXtG7dOmUyGXm9Xj344INqaGgY9ViupxmnAcy8iYzTEtfTo/UFAEqpqqpKRx99tI4++mitXbtWl1xyiR566CH94Ac/0LZt23ThhRfq7rvvLnrNfLiOPvA85Zg3IbCFOSMUClnr4yk7F41GJY2vnB0AHO6WLVumt7/97ZKktrY27d2719o3kfG3MPZKI8ffUp+HvwUADgfzcQwuVV8AYC65+uqrrR+hnnrqqRH7JzO+SsVjY6m+N2GcBlDOtm/frrPPPlt9fX1yOBy67777dOqpp455PNfTjNMAZtZEx+nx4noaAErvfe97n97znvcol8vpYx/7mHp7e6198+E6+sDzlGPehMAW5gyv16va2lpJ0u7duw96bF9fn/UfUGGuawDAwR155JHW+p49e6z15uZma/1Q4297e7u1fuD4O5nz2Gy2otcNP8+hzjH8PPwtADBXzccxeNGiRRPuy2jnAYC5pKGhwfpOY/i1dkFhfI1Go+rv7z/ouQpjY319fVGZ/1J9b1Kqvz0AUGp79+7VWWedpb1798pms+nOO+/UhRdeeNDXcD3NOA1g5kxmnB4vrqcBYHoUxuloNKpf/vKX1vbZvI4+2HnKYZwvJQJbmFMKYYK2tjZlMpkxj3v99det9SOOOGLa+wUA88FYZaeHB7mGj6+jOdj4O5nztLS0KBAIjHqegYEB7d+/f8xz7Nu3T4ODg6P2BQDmivk4BodCIetD7lTeEwDMNQeb5mW843Qmk9HWrVsljT4uluJ7k1WrVsnhcByyL4c6DwCUUnd3t97+9rdr27ZtkqRbb71V73//+w/5Oq6nGacBzIzJjtMTwfU0AJRefX29tb5z505rvVRj2WSuo51Op1auXDmp88zEOF9KBLYwp7z1rW+VZCYn//CHP4x53PByqCeffPK09wsA5oNXX33VWl+4cKG1vnTpUuv5aOWmh/v9738vybzbc8mSJUX7CmP4oc6zf/9+bd68WdLoY/h4z8PfAgDzwXwdgwvn2bRp00F/qGIsBzBfdHV1qbu7W1LxtXbBeMfXF1980brD82Dj61S+N3G73Tr++OMlSevXr1cqlTrkeTwej4477rgxjwOAqRgYGNA555xjfW/xX//1X/roRz86rtdyPc31NIDpN5Vxery4ngaA6TG8auHwqf9KNZatXbtWbre76LjRpFIpPf/889ZrXC5X0f5yGudLicAW5pR3vetd1vpdd9016jG5XE4/+MEPJElVVVU644wzZqJrADCnbd++Xb/5zW8kScuXLy8qr2+z2aySqK+//rp1wXSg559/3kqcX3jhhSPueFq1apWVQn/ggQcUi8VGPc/dd99tra9bt27E/ne+852y281LmLH+Fgw/j91u1zvf+c4xjwOAcjZfx+Dh1/XD2xwuFovpgQcekGTe+bRq1aox2wOAcnf77bfLMAxJ0mmnnTZi/+mnn67KykpJ0ve//33r2AMdapwu1fcmhfMMDg7qoYceGvU8u3fv1uOPPy5JOvPMMxUKhUY9DgCmIhaL6R3veIf++Mc/SpI+/elP68Ybbxz367me5noawPSa6jg9XlxPA8D0ePDBB631Y445pmhfKcayUCikM888U5L0+OOPjzkV4UMPPWRVmB1tfC63cb5kDGCOOeWUUwxJhtPpNJ577rkR+2+++WZDkiHJ+MxnPjPzHQSAMvPII48Y6XR6zP379+83jj32WGvs/OpXvzrimE2bNhkOh8OQZBx33HFGLBYr2h+LxYzjjjvOGp83b948alt33HGH1c5HP/rREfvb2tqMiooKQ5KxYsWKMfv9vve9zzrPgw8+OGL/Aw88YO2/4oorxnzvADDTtm/fPuHxaT6OwalUyli2bJkhyaioqDDa2tpGHHPttdda57nrrrtGPQ8AlNpEx+nt27cbf/zjHw96zKOPPmq43W5DkuHz+Yzdu3ePety//du/WW3ffPPNI/Y/99xzhtPpNCQZp5122pjtleJ7k56eHqOystKQZLS2thrd3d1F+zOZjHHBBRdY53nyySfH7A8ATFYymTTOPvtsa6z5xCc+ManzcD3N9TSA6VGKcZrraa6nAUyPu+66y4jH4wc95mtf+5o1Di1dutTIZDJF+0s1lj3xxBPWMe985ztHtNPV1WUsXrzYkGRUVVUZvb29o56nnMb5UiGwhTnnj3/8o+Hz+QxJRjAYNL74xS8a69evN377298aV199tfUfz6pVq4zBwcHZ7i4AzLrW1lZj4cKFxj/8wz8YP/rRj4znnnvOeOmll4zf/OY3xqc//Wmjrq7OGjvf+ta3GolEYtTzfOpTn7KOO/bYY4377rvP2Lhxo3HfffcVBb7+5V/+Zcy+ZDIZ4+STT7aOffe732388pe/NF544QXj1ltvNRoaGgxJht1uN37+85+PeZ5du3YZ9fX11gXVjTfeaDz99NPG008/bdx4443WBVl9fb3R3t4+5X9DAJisp59+2rjrrrusx5e//GVrDDz55JOL9h3sR5T5OAY/9thjht1uNyQZjY2Nxq233mq88MILxi9/+Uvj3e9+d9HfpgM/xANAqUx1nH7yyScNScaJJ55ofPGLXzQee+wxY+PGjcbGjRuN+++/33jPe95j2Gw265zf+ta3xuzL4OCgsWrVKuvYq6++2vjtb39rrF+/3vjiF79oBINB60eql156aczzlOp7k+985zvWscuXLzfuvPNOY+PGjcbPfvYz44wzzrD2XXrppRP5JweAcbvooousseZtb3ub8Ze//MV4+eWXx3xs2rRpzHNxPc31NIDSK8U4zfU019MApkdra6tRU1NjfPjDHza+//3vG88884zxpz/9yXj66aeNb3/720XXtW632/jNb34z6nlKNZZdcskl1rFnnHGG8bOf/czYuHGj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v39/RUVFKTMzU9ddd51Wr17tcxuhNs93igl0Q2+++aaZkJBgSmq2ZGVlmdu2bQv2MAEgZLQ0XzYu48ePb7GN2tpa84Ybbmj1/htvvNGsra1tdSwFBQXmqFGjWmwjMjLSfOaZZ9r8TGvWrDH79+/fYjsDBgww165d294/KgDwq9bmzBkzZvjcTk+dgxcuXGja7fYW2xk9erRZUFDg858TALSXP+bpxYsX+/y8vXjx4lbb2rZtmzl8+PAW709ISDDfeuutNsfkr++b3HfffabNZmuxnYsvvtisrKz06c8JANrr7LPP9mlunT59ulldXd1qWzxPA4D/+Wue5nma52kA/vfhhx/6NK/27dvXfO+991ptyx9zWUVFhTl58uQW27DZbOb999/f5ucKtXm+swhsodv58ssvzejoaFOSGRcXZ/7ud78zP//8c/Pjjz82Z8+e3eB/opKSkmAPFwBCQt3c+JOf/MT89ttvWyw7d+5ssY277rrL085pp51mPv/88+a6devM559/3jzttNM81+6+++4W23A6neZZZ53lqTtt2jTz3XffNdeuXWs+8cQTZlpamufB7J133mmxnb1795qpqammJDM8PNy84447zE8//dT89NNPzTvuuMMMDw83JZlpaWnmvn37OvVnBwCd4f2PvMGDB5uTJk3yvG9PYKsnzsHLli3z/EO/X79+5hNPPGGuXbvWfPfdd81p06Z5xnnWWWeZTqfT5z8rAGgPf8zT3j9gev/991t93j527FiL7ZSUlJhZWVmetmbPnm1+/PHH5ueff27+7ne/M+Pi4kxJZkxMjPnVV1+12I6/vm/y9NNPe+oOHTrUXLRokblu3Tpz6dKl5sSJEz3XrrnmGp/+nACgvYYOHWpKMgcOHGjedttt5iuvvGKuW7fOXL16tfnII4+YgwYN8nku4nma52kA/ueveZrnaZ6nAfjfhx9+aGZkZJjTp083H3/8cfO1114zV69eba5atcp88cUXzR/84AdmWFiYKcm02+3m119/3Ww7/prLrr76ak/diRMnmkuXLjXXrVtnLlq0yPP1RJK5YMGCFtsItXneHwhsodupS+yHh4ebn3/+eZPr8+fP9/xPdN999wV+gAAQgjo7L27ZssXzDcORI0eaFRUVDa6Xl5ebI0eO9MzPLaXOFy1a5BnLTTfd1OT6tm3bPIn2YcOGmTU1Nc22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4wGAjqqurjYnTZrkmWtuu+22DrXD8zTP0wC6hj/maZ6neZ4G0DUWL15sVlZWtlrnkUce8cxDQ4YMMZ1OZ4Pr/prLPv74Y0+dSy+9tEk/BQUF5uDBg01JZlJSknn06NFm2wmled5fCGyh2/nyyy/N6OhoU5IZFxdnPvDAA+bq1avNf//73+acOXM8//NkZWWZJSUlwR4uAARdZmamOXDgQPOnP/2p+a9//cv8/PPPza+++sr88MMPzXvuucfs27evZ+4866yzzKqqqmbbueuuuzz1TjvtNPOFF14w169fb77wwgsNAl933313i2NxOp3muHHjPHWvuOIK87333jPXrl1rPvnkk2ZaWpopybTZbOY777zTYjt79+41U1NTPQ9Ud955p7ly5Upz5cqV5p133ul5IEtNTTX37dvX6T9DAOiolStXmosXL/aUBx980DMHjhs3rsG11n6I0hPn4GXLlpk2m82UZPbr18988sknzbVr15rvvfeeecUVVzT42tT4H/EA4C+dnaeXL19uSjLHjh1rPvDAA+ayZcvM9evXm+vXrzdffPFF8wc/+IFpGIanzaeeeqrFsZSUlJhZWVmeunPmzDH//e9/m6tXrzYfeOABMy4uzvNDqq+++qrFdvz1fZOnn37aU3fo0KHmX//6V3P9+vXmG2+8YU6cONFz7ZprrmnPHzkA+GzatGmeuebcc881v/nmG/Pbb79tsWzZsqXFtnie5nkagP/5Y57meZrnaQBdIzMz00xJSTFnz55t/u1vfzM/++wz8+uvvzZXrlxp/vnPf27wXGu3280PP/yw2Xb8NZddffXVnroTJ04033jjDXP9+vXmX//6V3Po0KGeawsWLGixjVCb5/2BwBa6pTfffNPz20rNlaysLHPbtm3BHiYAhITMzMwW50vvcsUVV5jHjh1rsZ3a2lrz+uuvb7WNG264waytrW11PAUFBeaoUaNabCMyMtJ85pln2vxca9asMfv3799iO/379zfXrFnT3j8uAPCrGTNm+DQH15WW9NQ5eOHChZ7fkm2ujB492iwoKGizHQDoqM7O03U/YGqrxMTEtPpNxzrbtm0zhw8f3mI7CQkJ5ltvvdVmO/76vsm9997b4AdkjcvkyZPb/I1dAOio9szPkvVb/y3heRoA/M8f8zTP0zxPA+gavv5sMD093fzggw9abcsfc1lFRYU5efLkFtuw2Ww+rWYVavN8Zxmm2cLmjkCI27Nnjx5//HEtW7ZM+/fvl91u17Bhw/SDH/xAt9xyi2JiYoI9RAAICStWrNCKFSu0evVq7dy5U4WFhSopKVFcXJwyMjJ05plnasaMGRo7dqxP7b3zzjtauHCh1q9fr8LCQvXt21ejRo3S3LlzddFFF/nUhtPp1DPPPKN//etf2rRpk8rLyzVw4ECdd955uu222zRixAif2iksLNTjjz+upUuXavfu3ZKkIUOG6LLLLtPPfvYz9enTx6d2AKCrzJw5U3/72998rt/WP8964hz8n//8R0888YQ+/vhjHTx4ULGxscrJydEPf/hD3XjjjQoPD/epHQDoiM7O06WlpXrzzTe1evVq5eXl6dChQyosLJTT6VRycrJGjBih8847TzfeeKPS0tJ86qO8vFxPPfWUXn75ZW3fvl0Oh0MZGRmaPHmybrvtNmVmZvrUjr++b/L555/rqaee0sqVK3XkyBElJSXp1FNP1axZs3TNNdf41AYAdIRhGO2qn5mZ6XkubQnP0wDgP/6Yp3me5nkaQNfYsmWLli1bplWrVmn79u06cuSIioqKFB0drbS0NH33u9/VJZdcoiuvvNKn+cxfc9m//vUvLVmyRP/3f/+n48ePq1+/fjr77LN1yy23+PxzylCb5zuDwBYAAAAAAAAAAAAAAAAABIgt2AMAAAAAAAAAAAAAAAAAgN6CwBYAAAAAAAAAAAAAAAAABAiBLQAAAAAAAAAAAAAAAAAIEAJbAAAAAAAAAAAAAAAAABAgBLYAAAAAAAAAAAAAAAAAIEAIbAEAAAAAAAAAAAAAAABAgBDYAgAAAAAAAAAAAAAAAIAAIbAFAAAAAAAAAAAAAAAAAAFCYAsAAAAAAAAAAAAAAAAAAoTAFgAAAAAAAAAAAAAAAAAECIEtAAAAAAAAAAAAAAAAAAgQAlsAAAAAAAAAAAAAAAAAECAEtgAAAAAAAAAAAAAAAAAgQAhsAQAAAAAAAAAAAAAAAECAENgCAAAAAAAAAAAAAAAAgAAhsAUAAAAAAAAAAAAAAAAAAUJgCwAAAAAAAAAAAAAAAAAChMAWAAAAAAAAAAAAAAAAAAQIgS0AAAAAAAAAAAAAAAAACBACWwAAAAAAAAAAAAAAAAAQIAS2AAAAAAAAAAAAAAAAACBACGwBAAAAAAAAAAAAAAAAQIAQ2AIAAAAAAAAAAAAAAACAACGwBQAAAAAAAAAAAAAAAAABQmALAAAAAAAAAAAAAAAAAALk/wHBtzDV57fvVAAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "dp = Pulse(start = 0,\n", + " duration = 30000, \n", + " amplitude = 0.9, \n", + " frequency = 500_000, \n", + " relative_phase = 0.0, \n", + " shape = Gaussian(5), \n", + " channel = 0, \n", + " type = PulseType.READOUT,\n", + " qubit = 0)\n", + "\n", + "sp = SplitPulse(dp)\n", + "sp.channel = 1\n", + "a = 8000\n", + "b = 16000\n", + "sp.window_start = sp.start + a\n", + "sp.window_finish = sp.start + b\n", + "assert sp.window_start == sp.start + a\n", + "assert sp.window_finish == sp.start + b\n", + "ps = PulseSequence(dp, sp)\n", + "ps.plot()\n", + "assert len(sp.envelope_waveform_i()) == b - a\n", + "assert len(sp.envelope_waveform_q()) == b - a\n", + "assert len(sp.modulated_waveform_i()) == b - a\n", + "assert len(sp.modulated_waveform_q()) == b - a" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -556,7 +586,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ @@ -565,12 +595,12 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 17, "metadata": {}, "outputs": [ { "data": { - "image/png": "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zZo1OnnypG7cuKHExESFhYVp+/bteuutt1S9evUMW0e0FhkZqW7dumnAgAFavXq1Lly4oISEBJ0/f17r16/X8OHD1aFDB126dMmp+iRp1apV5nBBvgGd17y8vNSuXTtJUkJCgtP7T25xxbEmv8iP10RJSUkaO3asmjdvrpkzZ2rv3r2KiIhQcnKy4uLidOnSJe3cuVOfffaZHnroIZvW3uxZvny5qlevrscff1yrV6/WmTNnFBsbq5iYGB07dkxffPGFOnfurN69eysyMjJXl6VUqVK6//77JaW2vOPMAzKStGHDBp06dUqSVKZMGZtEfnv++usvNWvWTOPHj9fWrVt1+fJlxcfH68yZM1q6dKk6dOigMWPGKDk5OdN5x8fH67HHHlP9+vX19ttva/fu3QoLC1NiYqLCw8O1a9cuTZs2TdWrV9cnn3zi1PK4WrFixWwSfX/++Wddu3YtV+ouVKiQORwXF5fj+qwfXjl06JD++OMPp6azTngaMmSIw1ZCC4K8uF6xPsZa/5YBAACQnxXcMzwAAADkCuubYGlPdrvbhx9+qNdee838cblEiRLq1auXRo8erTFjxqhfv36qV6+eTRKHI8uXL1e3bt10/PhxSak/vnbs2FEjRozQqFGj1K5dO3l5eUmSduzYoVatWtkklNzK+mZR2k2kjFg/7di4ceNMy3t7e9s0Ie+upyU/+OAD7dmzR5I0ffp0lSxZMlv1ZHX5GzVqZA4nJyebXdm5mnWc9evXN/eJjFgvT063kzOtgFm7tXWOQ4cO5Wj+7uaKz4m7t6kj1vWWLl1aZcqUyXFckZGRunjxot3yztR5/vx5uzdss7pdypYta9OFUl6sw/y8v/z1119mS1YWi8Xm+y27dWaFu+efFQX1WJkdvXv3tumS59dff810munTp5vnRdWqVdOgQYM0atQode7cWd7e3jZl01pY8vX1VePGjTVgwACNHj1ajz76qE33PYmJiXrhhRcyTWSKj49Xjx49bM5/ypYtq4ceekijRo1Shw4d5OXlpW3btqlv375OdcUZHh6uffv2SUo9L2vSpEmm09zql19+0YwZMzRx4kS9+OKLmjFjhn7++ecC0ypXTliff+ZlEpOrjjX5RX68Jpo4caLmzJljvi5Xrpz69OmjMWPG6NFHH1WfPn101113OVXXBx98oIceeshMNgwMDFT37t01atQoDR8+XM2aNTPPLVevXq0OHTro5s2bubo81l2azp8/36nzX+tuvIcPH57h9V9kZKTuvfdehYaGytfXV927dzfXU3BwsFlu7ty5mbZ4c+PGDXXu3FmzZ882r0mrVaumAQMGaOzYserfv7/Kli0rSYqNjdWECRP01ltvZbo8eaF///7msGEYZtedOWXd+lJudJnZpEkT1a1b13xt3cKSI1u3brVpKa2gdyWXF9cr7jpmAAAA5ETmZ0UAAAC4rW3bts0crlKlihsjSZWUlKQ33njDfP3222/r2WefTXeTTkptweC///2vrly5YreuQ4cOadiwYUpMTJTFYtGzzz6rl19+2eZHbCm1y4hhw4Zp69atOnv2rEaMGKG1a9farXPXrl3mcIMGDTJdnr/++sscdqaFHSm1S5+07sWOHDni1DS56cSJE5oyZYok6Z577sn0R35HwsLCbLo5cWb5CxUqpJIlS5rb9MiRIzY3ql0lu9spTU63U8mSJc06nOni5/z58zY3igvSDXx7XPE5cfc2dcQVcVnXeWt5Z+pMq+PWp7+zG2taIuiRI0fUu3dvp6bLioKyv1jXWapUKZvEFWfqvHbtmq5cuZLtJFJ3zz8rCuKxMru8vb3VqFEjs/Uo69ayHHnppZcUFBSkBQsWpOt67dYWC/v27atevXqpY8eONq1mpElOTtbixYs1fvx43bhxQ6+88or69+/v8BzwjTfeMGP08PDQv/71Lz3zzDM2LV+cOHFCgwYN0vbt251qSWPXrl1m8kKdOnWcuml7q/bt29t939/fXyNHjtSrr76qUqVKZbnegqBhw4bmsPV5qau56liTHyQmJtqsy/xwTXT16lWzdR9PT099/vnnGjp0qN1uQS9evKhvv/3WYfd+GzZs0HPPPSfDMOTj46PXX39dEyZMSFd+3759Gjx4sA4fPqx9+/bpueee06effppry9S1a1dVqVJFJ0+e1IkTJ7R582ab1rpude3aNbMbQovFolGjRmVY/6effqqEhAR17dpVixYtUunSpc1xsbGxNsuzePFi3XvvvTZdmll7/PHHzevkmjVravbs2elaH0tOTtacOXP0zDPPKD4+XpMnT1bHjh1tWspxhyZNmsjT09NMvtqxY4fZClZ2/f3332aLWJLUsmXLHNWXZtiwYXr++eclScuWLdOMGTMyPCZYJzq1aNHC6SS+/Covrlesjxm7d++WYRgZdi8MAACQH9ASEwAAwB1szZo1+vPPP83XnTt3dmM0qY4cOaLw8HBJUps2bfTiiy/aTWCSUpvLHzFihPnD562efPJJxcbGSpLee+89TZ8+PV0CkyRVrVpVP/74o+rUqSNJ+uGHH8wbo9YuXbqksLAwSak/pNesWTPT5bl69ao57OwTq9Y/uOdW8/9ZMWbMGN28eVM+Pj6aPXt2tn/ktF52KX8vv7u3k3UrFD/++GOm5W9NsnPHfpKbXLH+3b1NHclpXDdv3kyXtGBdZ2BgoN3EhVv5+/urSJEi5utblzc2Ntb8/sxurPl1HebV/pLTOh3V6yx3zz8r8uvn1VWsb7pm1PpjmpSUFK1cuTJdApOkdF3vffrpp+rZs6fD7wFPT08NHz7cbN0kMTFRn332md2y169f14wZM8zXb775pp599tl0XfdUrVpVP/30kypVquRUN7DW5561atXKtHxW3Lx5U5988okaNmzoVIJYQVS7dm1z+NChQ061fpUbXHGsyS/mzJljs3z54Zpo+/bt5rYdOHCghg0b5vCcvEyZMpowYYLdJJ+UlBSNGzfObJnvq6++0gsvvGA34alhw4basGGD+T08b948my5wc8pisejRRx81X1u3smTPkiVLzO+UDh06qFq1ahmWT0hIUMOGDbVy5cp0x7NChQpp5syZeuSRR8z3XnrpJXO9WPv111/NZJlq1app27ZtdrtP9PT01Lhx48zv0OTkZL3++usZxpgX/P39VaFCBfO1M8eZjCQlJempp54yXwcGBmrgwIE5qjPNI488YrauFRYWpp9++slh2bi4OC1fvtx8nZVWmKZMmaLx48c79ffhhx9mf4GyKC/Of6pXr24mhkVERDj1wAwAAIC7kcQEAABwh/r+++9tfsT19fXV448/7saIUll3M5GT1h/279+vjRs3Skrtouzpp5/OsHzhwoX16quvmq+XLFmSrszJkyfN4VKlSsnHxyfTOGJiYsxhZ2723FrOevq8MH/+fG3YsEGS9OKLL+bo5uKtsefn5Xf3dvrHP/5hDu/du1fffvutw7LR0dF655130r1XkLli/bt7mzqS07hurSO7dd5aNqM6s1JvQViHebW/uGJbZ4W7558V+fXz6irWXVVZd2HlSL9+/XTPPffkagz9+vVTQECAJGn9+vV2yyxdulRxcXGSUluIeO655xzWFxwc7PTNe+vzqfLlyzsbsnx9fTVgwAAtWLBABw8eVFRUlBISEnTp0iWtXr1a/fr1M5M8Ll68qPvuuy/PuqXNS2XKlDETyZKSknT+/Pk8ma8rjjXulpKSorlz5+rZZ5813ytZsqQGDx7sxqhS5dY10apVq3T06FFJ0gMPPKA+ffpkWL506dLmdVNiYqK++eabbM/bnhEjRpgJFf/5z39sWm29lXWSk3XyU0bee++9DFsefP/9983kz1OnTtntXuv999+3qS+tG05Hhg8fbl4z/fTTT+ke5HCHrB5nbpWSkqKwsDCtWLFCbdq0MR+y8PLy0vz581W8ePFcibNMmTLq2rWr+TqjLuVWrlxp7i++vr5ZSqRatGiRZs6c6dRfWutfeSEvzn88PDxsuq+2blELAAAgv6I7OQAAgNvY2rVrzVaN0kRERGjXrl3mj9lp3n//fZsnNt3FOoZNmzbp77//dqrFo1tZt1QzaNAgp1oT6tSpkzm8devWdOOtn2J19ofbtJt/kpxKepJsW1WwbgnF1S5fvmzeoKxZs6ZeeumlHNVnvexS/l5+d2+nDh06qE2bNma3FcOHD1dSUlK6H+dPnTqlwYMH68SJEzbv5+V+4gquWP/u3qaO5DQuKX1s2anz1nozqjMr9RaEdZhX+4srtnVWuHv+WZFfP6+ukpY8JDmXhJrdFi/+/PNP7d27V6dOnVJUVFS6VpLSzo0OHDiglJSUdC0sbd682Rx+6KGHMu32rV+/fho7dmy6749bZed8SkrtStVe+ZCQEN1333267777tHr1avXv319xcXG6du2aHn/8cYdJWgWVl5eXgoKCzMSES5cuOd0NUU644liTV7788kvt2bPHfG0Yhq5evarffvtNZ8+eNd/38PDQ559/bvMZdRfra6LvvvtOkyZNylYXidbXRA8//LBT09x6TfTPf/4zy/N1pEyZMurVq5e+//57xcXFaenSpXYfpPn999+1f/9+SVLRokXVt2/fTOsuX758ht3TSakJYT179jQTVTZt2qTu3bub45OSkszEpsDAQPXq1cup5erYsaOOHDkiwzC0bdu2HHffllNZPc5ktt6k1FYE33vvPd133305iu1Ww4YNM5OkVq5cqcjISJskrDTWCU69e/dW0aJFczUOd8ir858SJUqY33WXLl3KQoQAAADuQRITAADA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5k3t3LlTLVu2VLVq1dS4cWMVK1ZMcXFxCgsL059//qnz589nGlvVqlXVqlUrs4un0NBQ1a5dO8Npihcvrq+++kq9evVSUlKSfv75Z1WsWFFdunRRyZIldfz4cW3ZssV8KrpcuXL68ssvs7LK8rXOnTvrlVdeMZ/Wfffdd7V48WK1a9dOfn5++v3333Xw4EGzfNeuXfXSSy+5JdalS5eqefPmunjxok6dOqWGDRuqffv2qlatmq5cuaL169eb3fR4eXnpm2++UXBwcK7M+9q1a3r99df1+uuvq2bNmqpfv76KFy+u6Oho/fXXX/rjjz/Msn5+fvrvf//rti4BVq5cafMksD2PPvqoAgICbN67//779frrr9st76rPiTu3aUY++eQT/fHHHzp06JCuXr2qjh07qkWLFqpTp46ioqK0ceNGmxbh5syZY7ak4MjIkSO1efNmLV68WCkpKXrqqaf00UcfqWXLlpKkHTt26Pjx42b5ESNGZNriWa1atTRr1iyzS5fFixdr9erV6tSpkwIDA3X48GHt3LnTLN+gQQN9+OGHWV4fWVWQ9pdXX31V27Zt08aNGxUbG6uHHnpIb7zxhho3bqy4uDj98ssvunjxoln+tddes+lOJafcPX9nFcRj5dGjRzV+/Hib92JiYhQREaFTp07p4MGDZotAadq0aaPFixerSpUquR7PtGnT1K1bN6WkpGjv3r2qX7++2rRpo6pVqyomJka//vqrua3ffPNNzZkzR6dPn86wzsmTJ2v9+vXatWuXUlJS9Mwzz2jGjBlq166dAgICdOLECf3yyy9KSkpSq1atVLVqVS1ZskSSbRd3txo8eLB5PPj+++9tWqmy5+rVq5o2bZqmTZumsmXLqkGDBgoJCZGfn5+uXbum33//PV3rU0888YTbWitMa2nK2pkzZ8zhlStX2i2TWVdlGzduVGRkpCTpvvvuy5Pj1a1ccazJ7/z9/fXqq6+arSN++eWXWrdunTp27KjAwECdPXtWv/zyi27evKl69eqpe/fueu+993I83/379+vxxx/XE088oWrVqqlevXoqUaKEEhMTdfHiRf322282rZS9+OKLZvds1rp06aJZs2Zp3LhxSk5O1g8//KAff/xRderUUYMGDRQYGKibN2/q4sWL2r9/v65cuZLj2J1VoUIF9ejRw6aLNx8fn2ztM+PGjdN///tf/fjjj6pcubI6dOigChUq6OrVq9q0aZPNedXDDz+cYddks2fP1sWLF7Vu3TolJCTopZde0htvvKEWLVqoYsWK8vX1VUREhI4fP66DBw+arT81adIky3FnZO3atTatHaekpCgqKkoRERE6fPhwuq6+JWn06NH64IMP5Ovrm6uxSFL37t3VokUL89xv2rRpudraXUBAgPr27avFixfbvF+0aFGHXSo7Y8qUKSpSpIjT5Tt27KgHH3ww2/PLKlddrxw9elSHDx+WJDVq1CjT3y0AAADyDffmUAEAACC35WZLTGlee+01u09Dpv3dddddxsGDBzN9otgwMm+Jafny5TYtLGX05+HhYTz++OPpWvW51b59+4wmTZo4Vaf+/+nHvXv3Oqxv3rx52VrHK1euNEqUKJHhvO21nGDPiRMnbKZbtGiR03HkRHafak1JSTGmTZtm06KLvb+BAwcakZGRmdY3f/58m+nsPXWeXaGhoUbDhg0zjLNkyZLG6tWrM60rK09dL1u2zKn9s2nTpsbvv//u9PJUrFjRnHbkyJFOT5eRW59CdvbPmZYncvNzkiY3t2luOn/+vNGpU6cM4woICDDmz5/vdJ3x8fHG+PHjM/wetVgsxpNPPpnpd6e1uXPnOnwyPu2vc+fOxoULF7KzKrKtoOwvERERxoABAzKs09vb23jzzTedqi+rLazl9vyHDh1qTle1alWnpnFWfj9W3tpijLN/jRs3NubOnZuuFSNHrKfNilmzZhleXl4O4/Dw8DAmT55spKSk2OxHGR3Pr1+/nul3VevWrY2LFy8aDz/8sPneihUrMoy1bdu25nfSiRMnnF4fmf0VLVrUmDt3rlPry7pFKA8PD6emcUZ29hFntvWjjz5qlnXUamialJQUm7pff/313Fq8XD/WuGI75GZLTIaR2sKU9fq399eyZUvj3LlzNt8T2W2JacaMGU7vNz4+Ppm2YmoYqS0n1qhRw+l669ata5w/f97pdZTddf7999/bzLdfv35OT3vrug4NDTXuuuuuDJdr5MiRRmJiYqZ1JyUlGa+++qrh7+/v1Pry9vY2nnjiCbt1ZbclJmf/PD09jV69ehnr1693et1ZT5+VFlTXrFljM629eebkN4lbW/GVZIwbNy5Lddy6vrP699RTT9mtt6Bcg6Z54403zGk//vjjXIsVAADA1WiJCQAAAJmaPHmy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AOA2hy5Eqsv7WxwmMPWsX1rr/9le/+x2FwlMQAF2+EKUVu63bRHDMKRlu86qw4zNmvfrCSUmp7gpOgC4/RmGoX79+plJP71799bixYu1bds2bd++XR9++KEqVqyoGzduqF+/fpm27NO3b18dPnxYTz75pH7++Wf9/vvvWrp0qWrXri1JWrVqlebOnWszTZEiRdStWzdJ0ooVKxQXF+ew/h9++EHXrl2TJA0ePNily2LPvn371Lt3b0VFRcnb21vPPPOMNm3apF27dmn27NmqUqWKJGnmzJmaNGlSpnU99thjKlWqlD7++GPt3LlTW7Zs0QsvvCBfX1/Fx8dr8ODBDuOcPn26Jk6cqMTERDVo0ECzZs3S+vXrtWfPHi1ZskStWrWSYRiaNm2aPvrooywvqyQlJSWpV69eZgJTt27dtGLFCu3Zs0ffffedunTpop9++kmvvPJKtuoHAAAAAMBZ3AkCAACA29QuHahapYto/znbbqVqlS6iyb3rqHW1Em6KDEBuql2miD57pLHeWBOqc9djbcZFxyXpjTWhWrbrjF7tVUcd7irlpigB5Gs3wrM/rU9hybuQg3qvSjKyV693odS67bl5TTKykJxZ2LXnPPPmzdOaNWvk7e2tlStXpmsFqWXLlhoyZIjatWunQ4cO6emnn86wu7S01pY6dOhgvte4cWN1795dderU0eXLl/Xpp59q7NixNtP17dtXK1euVFRUlFavXq1+/frZrX/p0qWSpMDAQPXq1culy2LPmDFjlJCQIE9PT61evdpMvpKkZs2aqX///mrbtq0OHz6sGTNmaOjQoapbt67duvbv369KlSppx44dKl26tPn+Pffco+7du6tbt25KTEzU448/rl27dtlMe/jwYb388suSpClTpmjKlClmd36S1KRJEw0cOFDDhg3Tl19+qZdffllDhgxJ13JVZmbPnq3ff//dXPbZs2fbzKNPnz4aNWqU5s+fn6V6gdtBWFiYdu3apV27dpmtzV29elWSNGzYMC1YsCDX57ls2TJ98cUX+vPPPxUREaGQkBC1a9dOTzzxhFq1apXr8wMAAADyE5KYAAAA4DYeHhZNub+u+n76myQp2N9bz3a7S4OaVZCXJ42GArcLi8WiHvXKqMNdpTTv1xOauem4YhOTbcocv3JDw7/Yrc61SumVXnVUpYSDxAAAd6bp1bI/bc8Z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9VVAQIACAwNtWvWDe/A9BVdw1351/vz5TK+Ls4okJhfZu3evHnroIcXGxiogIECTJk1Sx44dFRsbq6+++kpz587V33//rfvuu0979uxRkSJFslR/uXLldODAgUzLvf3221q6dKkkadiwYRmWbdq0qb744ossxQEAAO483paU/2PvvuObqtc/gH+yk+696KSbttCWvaeAiLhAFEXhihNcV0Xlp17U63WgqKioOEBBxYUCIqgoe9MBdFG6994jbdbvDyQSkrQF2qbj8369eL3S8/2ec56kh6Q55znPg1GKEvzZdL4cva1cjMenhWDhaD9IRMa95YmIOpNAIMD1Q7wwLdwdH+7LxMf7MtGiNryzMCGvBte+ewBPzwzDojH+ELIqExERJBIJ1q5diwcffBCffPIJ9u7di7y8PDQ0NMDGxgYBAQEYOnQorr32WsyePbtbYpo7dy6WLVumvyg/ffp0uLq2nxDfHc9l+vTpyMjIwDvvvINff/0VWVlZaGlpgbu7O8aPH48HHngA48aN69C2lixZgsjISLz99ts4ePAgKioq4OrqiqlTp+Lpp5/GoEGD2lz/3nvvxZw5c/Dxxx/j999/x9mzZ1FTUwOZTIYBAwYgKioK11xzDW655Ra4uLhc0fP18vJCQkICVq9ejc2bNyMzMxMymQxhYWG46667cP/992P//v1XtG0iatvF1wbaaxHX2Niof3w5F6Yup0Kbra0t7OzsOjy/s1y4uE7UmXhcdT+1Wo3a2lrU1taipqYGDQ0Nl9XlRSqVmvydXU7i5uVsFwDCwsL0reou/Lu4klJdXR327NkD4Hxy0YXtXHhepiouSSQSeHh4QKVSGfzraOUne3t7k/G2l+x6qQsVm1QqFRoaGiASieDp6XlZ26Cuxfcp6grdeVxdXNCnszCJqYs8+uijaG5uhlgsxu+//47Ro0frx6ZMmYLg4GAsX74c6enpeOutt7By5crL2r5EImm3bKJGo8HevXsBnP/icdNNN7U539ra+qpKMRIREVH/ESytRZVTBMIHOOCJa0LgbCNrfyUiok6kkIrw72tCcOswb7y6Mw07ThcbjLeotXjplxT8llyCVXOHwNf5ylp5ExH1NVFRUVizZs1lr7dy5coOnb+aNGlShy9UOTg4GLRRulxX+lwWLVqERYsWtTvP1dUVr7zyCl555ZUriM7QqFGj8O23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tUmf3r1747333sOzzz6LiooKPPPMM1r7HRwcsH37drz22mu3FWISCAT49ttvMW7cOFRUVODnn3/W6WwUHh6OX375Be7u7i0+j7W1NZ566im89957OH/+PCZOnKi1//Dhw4iMjATQ3Klq//79WLJkCbZt24aLFy9qujPpY2OjO5Hb19cXO3bswMyZM1FTU4P169dj/fr1WmP++c9/QiAQMMRERNQN2Npqf+dWKBSor6+HpaWlkSrqGAYJMQHAggULIJFI8OijjyInJweff/655ub8tRaI19Z8tbKywtdff60VdCKiniG1uBa/XcjFT2dzUFrbegvZwb72WDzCF5N6uxqouptTq9WIy6nE73H5+ONSAUprW173+horUzEm93HFrP7uGO7vCHEnmGVLRERERERE7UskFGBEgBNGBDjhjVm9EZ1Ugh1x+TiQUIRGhf5uveV1Tfj2VBa+PZUFDztzzOrvjln9PdDL1drA1evycrDAy1NC8fT4YOy4mNfqsufbzufin79fhbUwGGEm5Siokum9EUdERKRUKgEAQqGQEzw7AQcHBxw9ehTff/89tmzZggsXLqC8vBw2NjYIDw/HnDlz8PDDD8PExKTF5+jduzeuXLmCd999F7/99huys7NhbW2N8PBwPPzww3jggQdaXMLtes888wzCwsLw4Ycf4syZM6ivr4e7uzumTp2KF154Ad7e3nf0u/bv3x9xcXF4++23sWfPHuTn58Pa2hqBgYGYO3culi9fDjMzs5s+zzvvvIOgoCB88803uHLlCqqqqjSf6xtZW1vj119/xbFjx/D1118jJiYG+fn5aGhogI2NDQICAjBkyBBMmzZNJxB1TWRkJK5cuYK3334bu3fvRkFBAezt7TFo0CA8+eSTmDRpEl5//fU7eWuIiKiTMDMzg6mpKRob/77/XFVVxRDTnZg7dy7Gjx+P9evXY+fOnYiLi4NC8fess969e2PmzJlYuXIlpFKpIUsjIiNSqdT46ngGtsflIT6vutWxpmIhZvV3x6Lhvi3O8DSG1OJa7IjLw+8X85FVVn/T8SYiIaJCnDGrvwfGhUg71dJ3RERERERE1LFMxSJM6u2KSb1dUSOTY9+VImyPy8Px1FKdJdquyatswProNKyPTkOIqzVm9ffAjH5u8LQ37vLj5iYizBvc8k1DtVqNr09kAgBqVCY4LXPFpE/O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X5x11lmUl5djNpuZMmUKy5YtY//+/T0eK4QQQowXwWCwy3Dt4zHENKKVmN58801WrFjB3/72t1RJ6eTJjoqKCs455xzOO++8keyiEGKEKIqCy+XC5XIRDAapra2lrq6OaDTaZd/KysoR6KEQQgghhBBCCHFwicfjNDY2UlNTkzE8HIDf76etrQ2Xy9XlOJ1Oh9VqHaZeCiGEGMt0uq733sdisW4DsHVr1vDi+ecTDQZ79RzRYJAXzz+fi95+e8xXZBoMv/vd77jxxhszzr3X1tby5JNP8re//Y2XX36ZpUuX9rnd5557jq997WtdLrbW1dVRV1fHJ598wuOPP86GDRuYO3duznZuvfVW7rzzzox1u3fv5qGHHuKvf/0rb731FnPmzOlz/4QQQoixprW1NeOx0WgkLy9vZDozhIY9xLR582ZWrFjBU089lUpIJ4NLEyZM4LzzzuP888/nuOOO61V5UCHE+GexWJg6dSrV1dVdTpYWFhbm/HCORqOoqioldYUQQgghhBBCiAFI3lxUX19PJBLJuV9tbW3WEJMQQgjRF3q9PiNQE4vFut3/zZtu6nWAKSkaDLLqu9/lknfe6VcfR8JXv/pVFixYAMBhhx0GwLJly/jWt76V2qevw7W++uqrfPjhhxx22GHceOONHHbYYQQCAZ5//nl+85vf0N7ezmWXXca2bdswmUy9brehoYGrrrqKcDhMaWkp119/PccccwzFxcUEAgG2b9/OW2+9xQsvvNBtO4888gjvvfceJ5xwAtdddx0zZ86ktbWVFStWsGLFCg4cOMDVV1/N+++/36fXLYQQQoxFnYeSc7lc4zJTMywhpubmZp5++mlWrFjBRx99BHQEl1wuF62trSiKwt13382FF144HF0SQoxBOp2O8vJyysrK8Hg81NTUUFFRkXP/mpoa9uzZQ2lpKVVVVTgcjmHsrRBCCCGEEEIIMXYlh4yrqamhqamp2311Ol3qt7cQQgjRmRqPE2hu7rI+FosRTKxvV5RUtaVwOJxRvUcB4jZb1ot0TRs29DiEXC41777L3jffpLibKkD9lVdUhJKlqtRAJEcuSFdaWtptFaOefPDBB5xxxhk8//zzGSGlJUuWUFRUxI9//GP27t3LypUrOeecc3rd7sqVK/H7/QC88cYbXfp43HHHcfnll3P//fd32857773Htddey+9///uM//4nn3wyJpOJRx99lA8++IB169Zx5JFH9rp/QgghxFjUOcQ0HoeSgyEMMUUiEV588UVWrFjBK6+8QiQSSQWXTCYTZ5xxBl/72tf48pe/PC5LXAkhho6iKDidzm4/mOPxOLW1taiqSkNDAw0NDeTn51NVVUVxcXHWssRCCCGEEEIIIcTBLhaLpaogJy8+5mKxWKisrKS8vFyqIAshhMgp0NzM70pLR7obWf35C18Ykna/1diItaRkSNoeTBaLhccffzxrlaUbbriB//7v/yYcDrN69eo+hZjq6+sBrTJUdyGrnq4PVlRU8Nvf/jZrgO0HP/gBjz76KACrV6+WEJMQQohxLRQKEexUeVJCTL30wQcfsGLFCv785z/T0tICaHduKYrC4sWL+drXvsaFF17Y55KWQgjRF01NTV3G2vZ4PHg8HkwmE5WVlVRUVPSpBK4QQgghhBBCCDHebdiwocvdnZ25XC6qqqooKioal6XrhRBCiIPFF7/4RUpzBMwcDgczZszg888/Z+fOnX1qNzmCQktLC3//+985++yz+9W/888/H7PZnHXbrFmzsNvt+Hy+PvdPCCGEGGs6/07X6/XYbLYR6s3QGvQQ03HHHYeiKKmqS7NmzeJrX/sal156KdXV1YP9dEIIkVUwGMz4LEoXDofZvXs3e/bsoaSkhKqqKvLz80egl0IIIYQQQgghxOhSVlaWNcSUHOK9srJy3J4oFUIIIQ42s2fP7nZ7YWEhAF6vt0/tfuUrX8HlctHa2so555zDiSeeyFlnncXSpUuZN29eaujAgfavoKAAn8/X5/4JIYQQY022oeTG601FQzacnMPh4L777uOKK64YqqcQQoicJk2aRHl5OXV1ddTW1napygRalbjGxkYaGxtxOBxUVVVRMgZK/AohhBBCCCGEEAMRi8VyXjwsLS1l586dRKNRQBtmpqqqivLycgyGITuVKIQQQogRYLVau92u0+kA7btDXxQVFfGPf/yDSy65hJqaGt58803efPNNAPLz8zn55JO5+uqrOfPMM0ekf0IIIcRYky3ENF4NyZkHVVXx+XxcffXV/OY3v+FrX/sal1xySap8pBBCDAeTycTkyZOZOHEiTU1N1NTU4PF4su7r9XrZvHkzO3bsoKioaJh7KoQQQgghhBBCDL1AIEBNTQ319fUcfvjhWasS6/V6ysvL8fv9VFVVUVhYOG7v7hRCCDE88oqK+FZjY5f1sViMpqYmAIqLizMCtrFYjEAgkLG/1WpNhVaS3rr5Zj5fvrzffZt71VUs/d//7ffxueTJOWaWLFnC9u3b+etf/8pLL73E22+/zf79+/F4PDz//PM8//zznHbaafztb3/rMawkhBBCHMxUVcVsNhMMBlPBXQkx9cGqVatYvnw5f/3rX/F6vaxfv55PPvmEW265hRNPPJHLLruMc889F7vdPthPLYQQWel0OkpLSyktLcXr9VJbW0tDQ0PWoeYikQh+v38EeimEEEIIIYQQQgw+VVVpbW1l//79uN3u1PqampqcQ6tPnTpVgktCCCEGjaLTYc1SAT8Wi2FJnKO1lpRkhJhUVQWfL2N/s8WC0WjMWDf/xhsHFGI66sYbs/ZNDA6LxcKll17KpZdeCsCuXbtYuXIlv/3tb9m6dSuvvvoqt912G/fee+8I91QIIYQYvRRF4bDDDksVE2pra8PhcIx0t4aMrudd+mbp0qU89thjNDQ08NRTT3Haaaeh0+mIxWL8+9//5qqrrqK8vJxLLrmEl156SUo8CiGGlcPhYNasWRx77LFMmTIFs9ncZR8ZUk4IIYQQ/5+9Ow+O/K7v/P/6drf6kNRq3fd9jY65D4OxiU0CJLFjiJ1acMwSXFwmIQXeJZiqrdoNqc0PB0OFK6HWLryYEEOA5SgIbDCQsTcYYzyjOXXf93227j6+vz8m6kxPS5pL0rclPR9VU9X9+Xz1/b7G/o5a+n7f3/cHAIDdzjRNTU9P68KFC7p48WJUAZMkjY+Pr7v0uiQKmAAAljMMI2bp0/XuJ2UfPar8N7zhlo5RcNddyj5y5Ja+FremrKxMf/7nf67XXntNhYWFkqRvf/vbFqcCAGB3MAxDXq9XhYWFMd0p95Jt+5u53W798R//sf7v//2/6u/v11NPPRWpDltcXNS3v/1tPfDAAywxB8ASCQkJKi4u1ute9zrV1dVFWu653e4Nn0SVRJcmAAAAAEBcu7Z4aXZ2dtPtAACIVzdSxCRJb/r85+Vwu29q3w6PR/fS/ccyKSkpOnXqlCRFlhQEAACQtrGI6Wq5ubn6i7/4C50/f17nzp3T448/ruzsbJmmqYmJicjTXf/1v/5XffSjH9W//du/7UQsAJBhGMrKytLRo0d14sQJVVdXb/jE6czMjM6cOaNLly5pbm5uh5MCAAAAALCxtaKk8+fPb1q8ZLfbVVhYqDvuuEM5OTk7nBIAgBt3bRFTOBy+sszcNfJOndID/+f/3HAhk8Pj0QPf+Y7y/r2IBlvvpz/9qYaHhzecn52d1W9+8xtJV7ozAQAArNnxHlNHjhzR3/7t32pgYED//M//rHe84x1yuVwyTVNDQ0P6u7/7O917773Ky8vTn/3Zn+kXv/jFTkcEsE8lJycrLS1tw/menh5J0tTUlM6dO0cxEwAAAADActcWL230e6rL5VJlZaXuvPNOVVRUyOPx7HBSAABuzrVFTNLG3Zgq7r9f7/x//08Fd9216T4L7rpL73zpJVXcf/+WZMT6vvnNb6qkpET333+/vvCFL+gXv/iFzp07p//3//6fvvzlL+vOO+/U4OCgJOlDH/qQxWkBAEA8cVh1YLvdrvvuu0/33Xef5ubm9K1vfUtf//rX9fLLL8s0TY2Ojurpp5/WM888o2AwaFVMAJB0pQvTtU+xTk1NaWpqSunp6SopKdl0GToAAAAAALaaaZq6cOHChl2XpCvFS8XFxcrNzZXNtuPPMwIAcMsMw5DdblcoFJLdbpfdbt+wi750pSPTH//ylxq7cEEXn3lGY+fPa9Xvl9PrVfbRozr8wQ8q+8iRHfwb7G+BQEA/+clP9JOf/GTDbT70oQ/pIx/5yA6mAgAA8c6yIqarpaSk6AMf+IA+8IEPqKenR1/72tf0j//4j+rs7LQ6GgBIklZXV5WQkKBAIBAzRzETAAAAAMAKhmHI4/GsW8RE8RIAYC9wu90yDGPT4qVrZR85ojf//d9vYypcz+c+9zm95S1v0b/+67/q4sWLGh4e1vj4uOx2u4qKinTnnXfq/e9/v+6++26rowIAENeamppkmqZ8Pp98Pp+Sk5Nv6uei3SguipiuVlpaqr/8y7/UX/7lX+rll1/W17/+dasjAYCys7OVkZGhoaEh9ff3b1rMlJaWptLSUoqZAAAAAADbrri4WKOjozJNUxLFSwCAvYXPsvWtfe5v5LnnntNzzz13y1+/5sUXX9xw7t57791wP2lpaXrXu96ld73rXTd0nKuVlpbecL6enp6b3j8AALtFOBzW5OSkwuGwJiYmJEn19fXKzMy0ONn2irsipqvddddduus66xcDwE5Ze0okPz9/02Km6elpTU9PKy0tTSUlJfL5fBakBQAAAADsBaZpanp6Wj6fT3a7PWbe4/EoJydH09PTKikpUU5ODjd8AQAAAADY5fx+v8LhcNTYfrjvHNdFTAAQj262mCkrK0t1dXUWJAUAAAAA7FZrxUs9PT3y+/2qqKhQYWHhuttWVFTIZrNRvAQAAAAAwB5x7dLxSUlJSkhIsCjNzqGICQBu0Y0WMyUlJVmQDgAAAACwG11bvLSmr69PeXl563Zjcji4xAcAAAAAwF5ybRHTfujCJFHEBAC3bbNiJofDoYKCAosTAgAAAADinWmampqaUm9vb1Tx0ppAIKDh4eENuzEBALAfmKYp0zRlGIYMw7A6DgAAwLYwTZMiJgDA7bm6mGl4eFh9fX0qKCjY8InY1dVVLS0t7ZsPHAAAAABArOsVL61xu91yOp07mAwAgPhgmqYCgYBCoZBCoZBM01RiYuK63QkBAAD2goWFBYVCoaix/XJPmSImANhidrtdhYWFysvL23S7vr4+DQ4OKjU1VaWlpfvmgwcAAAAAcHPFSyUlJcrOzpbNZtvBhAAAxAfDMBQIBBQOhyNjoVCIIiYAALBnXduFye12y+VyWZRmZ1HEBADbZLNfoldWVjQ8PCxJmpmZ0fnz55WamqqSkhKlpqbuUEIAAAAAwE6jeAkAgJtnt9tjipgAAAD2qv26lJxEERMAWKK/vz/ql27pSjHTzMwMxUwAAAAAsIe1tbVpZGRkw/m14qWcnBwZhrGDyQAAiF92u12BQCDyfm1ZOT4rAQDAXmOapmZmZqLGKGICAGyrxMREOZ1Ora6uxsxRzAQAAAAAe1dmZua6RUwej0fFxcUULwEAsI5ru96bpqlwOMyScgAAYM9ZWlqKKt6WKGICAGyz/Px85ebmanh4WH19fZsWM6WlpamiokJJSUkWJAUAAAAAbKX09HQlJydrfn5eEsVLAADcCJvNJsMwZJpmZCwUClHEBAAA9pxrl5JzOp3yeDwWpdl5FDEBgEVsNpsKCgqUl5e3aTHT9PS0zpw5o4KCApWUlCghIcGCtAAAAACAG7WysiLTNOV2u2PmDMNQaWmpOjs7VVJSouzsbIqXAAC4AXa7XcFgMPI+FApZmAbYP64uHgQAbL9ri5h8Pt++um5AERMAWOxGi5kGBwc1Ojqq6upqZWVlWZAUAAAAALCZUCik/v5+9ff3Ky0tTQcPHlx3u/T0dKWnp++ri5AAgL1prbAoGAxue2ek9YqYTNPk8xTYRqFQKFIwSOczANgZ6xUx7ScUMQFAnLiRYqZgMEgnJgAAAACIM6ZpamxsTN3d3VpZWZEkTU5OampqSunp6THbc7MVALBXJCYmRj77ZmZmlJGRsW3HuraAwjRNipiAbTYzMxN5nZiYaF0QANgnVlZWtLy8HDVGERMAwFJrxUy5ubnq6+tTf39/pF1rZmamUlNTrQ0IAAAAAIiYm5tTR0eH/H5/zFxXV5fS0tK4uQoA2LNSU1M1PT0tSRobG1MoFFJKSopcLteWf/7ZbDYZhhG1tFUoFJLNZtvS4wD7nWmaWllZ0dzcnCYnJyPjaWlpFqYCgP0hISFBR48e1ezsrGZnZ7W4uKikpCSrY+0oipi20eLiov7u7/5O3/nOd9TZ2amVlRUVFRXp/vvv10c+8hGVlJTc1v7D4bB++ctf6l/+5V/0q1/9Si0tLZqampLb7VZxcbF+67d+Sx/60Id0+PDhTffzyU9+Un/1V391Q8c8ffq07r333tvKDeDG2O12lZWVKS8vT11dXZqYmFB5ebnVsQAAAAAAuvJ0ZFdXl8bGxjbcJiUlReFwmKU3AAB7ltvtls/niyx7Mjk5qcnJSRmGcd3PP9M0I53o/X7/DRU9hcNhhcPhyHubzUYRE6LcynmFaGtLNV7N5/PJ5XJZlAgA9g+bzSafzxfpvrQfu05SxLRNOjo6dN9996m9vT1qvLW1Va2trfrKV76i559/Xn/wB39wy8coLS1Vf39/zHggEFBjY6MaGxv19NNP6y/+4i/0N3/zN/vu5Ab2Crfbrbq6Oi0vL8vtdq+7jWmaunTpkjIyMpSXl8cv7gAAAACwTUKhkPr7+9Xf3x91E/VqqampqqioUHJy8g6nAwBg5+Xl5cnpdGp8fDwyZpqmgsHgpl8XDoc1Pz8vSfJ6vTd0TTMYDEbt1zAMCisQ5VbOK2wuKytrW5eKBABsbD/WeFDEtA38fr/uv//+SAHTBz7wAT388MPyeDw6ffq0nnzySc3Nzemd73ynXn75ZR09evSWjjM0NCRJqqys1B/90R/prrvuUn5+vpaWlnT69Gl97nOf0/T0tJ566inZ7XZ96lOfuu4+L126tOl8WVnZLWUFcPs2KmCSrrRqnp6e1vT0tIaGhlRRUaH09PQdTAcAAAAAe5tpmhobG1N3d7dWVlbW3cbtdquiokIZGRn78kIjAGB/MgxDmZmZSklJ0fz8vBYWFrS6urphse+aYDAY6eDk8/nkcNzYLavFxcWo9x6Ph0IVRNzqeYX/YLPZ5HQ6lZSUpOTkZDmdTqsjAQD2ET65t8FnPvMZtbW1SZKeeuopffzjH4/M3Xnnnbr33nt1zz33aHFxUY8//rhefPHFWzrOHXfcob/8y7/UW9/61pgLY3fffbceeeQR3XnnnRofH9dnPvMZvf/977/uUlQHDx68pSwArBMKhdTV1RV5v7i4qEuXLik9PV0VFRVKTEy0MB0AAAAA7H5zc3Pq6OiQ3+9fd95ut6ukpEQFBQXcRAUA7FtOp1Pp6ek3/HDl3NycfvjDH0q6cu8kJSXlul9jmqZefvllhUKhyFhaWpqys7NvLTT2nFs5rwAAQPzgqsoWCwQC+uIXvyhJqq2t1cc+9rGYbd7whjfofe97nyTppZde0muvvXZLx/rVr36l3/3d393wyb6Kigr9j//xPyRdqTz/wQ9+cEvHARDfJicnI2t8X21qakpnzpxRR0eHAoGABckAAAAAYPcLBoO6cOHChgVMeXl5uuOOO1RUVEQBEwAA28wwDPl8vqj3G3VIBAAAwO7DlZUtdvr06Uibyve85z0bXrx69NFHI6+///3vb1ueN73pTZHXnZ2d23YcANbJzs7WkSNHlJycHDNnmqYGBwf1m9/8RoODgzJN04KEAAAAALB7ORwOFRUVxYynpqbqxIkTqq6uZokNAAB2UE5OjkpLS3XkyBHddddd635OAwAA7CamaaqtrU2Tk5P7/n4uy8ltsV/+8peR1/fcc8+G2508eVKJiYlaXFzUyy+/vG15rn4CwW63b9txAFgrNTVVx48f1+joqLq7u2M6MwWDQXV0dGhoaEgVFRU33NIZAAAAACAVFRVpZGREKysrcrvdqqioUEZGxobdsQEAwPZh6TgAALDXzMzMaHh4WMPDw3K73crPz9+3S9bvv7/xNmtqaoq8rqmp2XA7h8OhyspKSVJzc/O25XnppZcir2tra6+7/Vvf+lZlZ2fL6XQqOztb9957r/7mb/5G09PT25YRwNYwDEO5ubk6deqUiouL172Yvri4qEuXLunSpUtaXFy0ICUAAAAAxKe5uTkFg8F15+x2uyoqKlReXq5Tp04pMzOTAiYAAAAAALAlhoaGIq+Xl5c1MjKyb6870Ilpiw0MDEiSkpKSlJqauum2RUVFunjxosbHx7WysiKXy7WlWRYXF/X5z39ekuRyufT2t7/9ul/zs5/9LPJ6fHxcL730kl566SV9+tOf1nPPPXdD+1jP2n+XjQwPD0deLywsaG5u7paOA2yF+fn5dV/vJhkZGUpOTtbQ0JBmZmZi5qempjQ1NaXc3Fzl5eXtfEDclL1wTmLv4HxEPOF8RLzhnEQ84Xy8caurqxoaGtL09LSys7NVUFCw7nYul0sul4v/nreIcxLxZGFhweoIAAAAACDpyupaExMTUWP5+fkUMWFr+P1+SVJycvJ1t01KSoq8np+f3/Iipk984hPq6+uTJH34wx9Wfn7+htseOnRIf/iHf6g77rhD+fn5CgQCam1t1fPPP68XXnhBMzMz+qM/+iP96Ec/0u///u/fdJabWZP6e9/7nnw+300fA9gOX//6162OcNu8Xq9KSkrW/b708ssva3x83IJUuFV74ZzE3sH5iHjC+Yh4wzmJeML5uD6bzaa8vDzl5+fLbrdLkkZGRvTCCy9oeXnZ4nR7G+ckrDY7O2t1BAAAAACQFN3wRbpyvSInJ8eiNNajiGmLrV3kcjqd19326qKlpaWlLc3x/PPP6+/+7u8kXVlG7q//+q833Pbxxx/XJz/5yZjx173udfqTP/kTPf300/rQhz6kUCik97///ers7JTb7d7SvAC2j9/v1+XLl5WVlaWioqLI96eFhQUKmAAAAADsSxkZGSouLo55oMxms6m4uFhtbW0WJQMAALdqfn5eiYmJstlsVkcBAAC4IeFwOKaIKScnRw7H/i3l2bd/861ovfXVr35Vjz76aNTYWnHP6urqdb9+ZWUl8trj8dx2njUvvvii3ve+90mS0tPT9d3vfnfT/V9v2bvHHntMr732mp599lkNDQ3pu9/9rt71rnfdVKb+/v5N54eHh3XHHXdIkh566CFVV1ff1P6BrTQ/Px95KvTd7373DXVW2y1CoZBGR0c1NjamI0eO6O677153O9M0922Lwni0l89J7D6cj4gnnI+IN5yTiCecj+tbWFjQ4ODghktJ2Ww2HTx4UL/927/N70RbjHMS8aStrU1PPvmk1TEAbIFwOKzx8XENDQ1pbm5ONTU1+7pzAQAA2F0mJydjaks2W2FrP9i3RUzbxev1SrpyYeZ6rr5gtlUXbs6cOaO3ve1tWllZUXJysn7yk5+otrb2tvf72GOP6dlnn5UkvfTSSzddxFRYWHjD2yYlJSklJeWm9g9sl+Tk5D13Pqalpam8vHzTjnEtLS1yOBwqKSlRQkLCDqbD9ezFcxK7F+cj4gnnI+IN5yTiCefjlQfJuru7NTo6uuE2eXl5Ki0tvaHu2rg9nJOwWlJSktURAGyR5uZmTUxMRN4PDQ1RxAQAAHaNoaGhqPcpKSn7/qGffVvE1NzcfNv7yMvLixkrLCzUq6++qoWFBc3MzGza5WitO1FWVlZM+/Jb0djYqN/7vd+T3++Xy+XSD37wA73uda+77f1KUl1dXeT14ODgluwTgHU2uyg/OzsbubA/Ojqq0tJS5efn8xQyAAAAgF0nFAppYGBAfX19CofD626TmpqqioqKfX+REACA3Sg7OzuqiGlubk5+vz/ywDkAAEC8Wqspudp+78Ik7eMippqamm3Zb11dnb773e9KutLJ5PWvf/262wWDQXV2dkrSlnRK6uzs1Fve8hZNTk7K4XDoW9/6ln7nd37ntve7huIFYH8wTTPyvUm68r2qo6NDIyMjqq6u5pd/AAAAALvG9PS02tratLy8vO682+1WRUWFMjIyuO4BAMAulZmZKafTGbUMy/DwMNcxAQBA3BseHo56n5CQoKysLIvSxA+b1QH2mrvvvjvy+qWXXtpwuzNnzkSWk7vrrrtu65gDAwN685vfrOHhYdlsNn3ta1/T29/+9tva57Wampoir6n+A/auhYWFdZfDnJ+fV0NDg7q6uhQKhSxIBgAAAAA3zu/36+LFi+sWMNntdpWXl+vUqVPKzMykgAkAgF3MMIyYVTNGR0cVDAYtSgQAAHB9oVBIIyMjUWO5ubmy2Sjh4b/AFrv33nvl8/kkSV/72tdkmua62z333HOR1w8++OAtH29sbExvfvOb1dPTI0n6X//rf+mRRx655f1t5Omnn468vueee7Z8/wDiQ3Jysk6dOrVhlW9/f7/OnDmj6enpHU4GAAAAADfO6/UqMzMzZjwvL0933HGHioqKuDAIAMAekZeXF1WUHA6HY24KAgAAxJPR0dGYxhE0k7mCqzVbzOl06iMf+Ygkqbm5WZ/97GdjtnnllVf07LPPSrpSEHTq1Kl192UYhgzDUGlp6brzMzMz+t3f/V21trZKkj73uc/pAx/4wE3lvXTpkjo6Ojbd5plnntFXvvIVSVeq/26n6ApA/PN4PKqrq9ORI0eUmJgYM7+8vKyLFy+qtbVVgUDAgoQAAAAAcH2VlZWy2+2SpJSUFJ04cULV1dVyOp0WJwMAAFvJ5XLFFC8PDQ1t+JA5AACAlUzT1NDQUNRYenq63G63RYnii8PqAHvRxz/+cX3rW99SW1ubnnjiCXV0dOjhhx+Wx+PR6dOn9alPfUrBYFAej0ef//znb+kYKysruv/++3X+/HlJ0rve9S69+c1v1uXLlzf8mqSkJJWVlUWNnT17Vu9///v1pje9Sb//+7+vQ4cOKSMjQ8FgUC0tLXr++ef1wgsvSLrSbv2ZZ55RUlLSLWUGsLukpqbqxIkT6uvrU19fX8wv/SMjI5qcnFRVVRVLMAAAAACwxNrvKev9PuJyuVRZWalQKKT8/Hx+ZwEAYA/Lz8/X+Ph45P3S0pJmZmaUlpZmYSoAAIBYc3NzWlhYiBqjC9N/oIhpG3i9Xv34xz/Wfffdp/b2dj3zzDN65plnorZJSUnR888/r6NHj97SMYaHh/WrX/0q8v7555/X888/v+nX3HPPPXrxxRdjxkOhkH7+85/r5z//+YZfm5GRoWeffVYPPPDALeUFsDvZbDaVlpYqKytLbW1tmpubi5oPBAJqampSRkaGqqqq5HK5LEoKAAAAYL9ZXFxUa2urCgsLN1wSOzc3d4dTAQAAK/h8PiUmJmpxcTEyNjQ0RBETAACIO6urq3I6nVpdXZUkud1upaenW5wqflDEtE0qKyt17tw5/f3f/72+853vqKOjQ6urqyoqKtJ9992nj370oyopKbE6pu677z49++yzeuWVV3Tu3DmNjo5qcnJSpmkqPT1dR44c0e/93u/p0UcfVUpKitVxAVgkKSlJR48e1dDQkLq7u2PWaJ2cnJTT6VR1dbVFCQEAAADsF+FwWP39/ert7ZVpmmpvb1dqaqoSEhKsjgYAACxiGIby8/PV0dERGZuYmNDKygoPXgIAgLiSlZWljIwMTU5OamhoSOnp6XSPvgpFTNsoKSlJTzzxhJ544olb+vrN1msuLS3dkvWcs7Oz9d73vlfvfe97b3tfAPY2wzBUUFCgjIwMtbe3a2pqKjKXkJAQs1wlAAAAAGy1ubk5tbW1RbVdDwQC6urq0oEDByxMBgAArJaTk6Ouri6Fw+HI2PDwsEpLS60LBQAAsA6bzaasrCxlZWVtSd3HXmKzOgAAYHdxu906ePCgamtrI086V1ZW8tQzAAAAgG0TCoXU0dGhc+fORRUwrZmZmVEwGLQgGQAAiBcOh0M5OTlRY8PDw1FFTQAAAPGGLkzR6MQEALhphmEoOztbaWlpGh0dVVZW1obbBoNBORx83AAAAAC4NVNTU2pra9PKysq684WFhSotLZXdbt/hZAAAIN7k5+dreHg48n51dVWTk5ObXr8EAABA/OCuMgDgliUkJKiwsHDD+dXVVb322mvKyclRWVkZNxUAAAAA3LBAIKDOzk6Njo6uO5+UlKQDBw7I6/XucDIAABCvkpOTlZKSorm5ucjY8PAwRUwAAAC7BEVMAIBt09HRoWAwqMHBQU1OTqqqqkrp6elWxwIAAAAQx0zT1NjYmDo7OxUIBGLmDcNQaWmpCgsLZbPZLEgIAADiWX5+vubm5uTxeJSfn6/c3FyrIwEAgH1udXVV4XBYbrfb6ihxjyImAMC2mJiY0Pj4eOT98vKyLl26pJycHFVUVCghIcHCdAAAAADi0fLystrb2zU1NbXuvM/nU3V1tRITE3c4GQAA2C2ysrLkdDqVmpoqwzCsjgMAAKD+/n4NDAwoPT1d+fn5Sk9P5+eUDVDEBADYFqurqzIMQ6ZpRo2Pjo5qampKFRUVys7O5gMaAAAAgKQrHZiamprk9/tj5ux2uyoqKpSbm8vvEAAAYFM2m01paWlWxwAAAJAkhUIhjYyMSJKmpqY0NTWlkpISlZaWWhssTtFzGwCwLfLz83Xy5En5fL6YuUAgoJaWFl2+fFnLy8sWpAMAAAAQbwzDUEVFRcx4ZmamTp06pby8PAqYAAAAAADArjI+Pq5gMBg1lp2dbVGa+EcREwBg2yQmJurIkSOqrq6W3W6PmZ+amtJrr72mwcHBmI5NAAAAAPYfn8+n/Px8SZLT6VRdXZ3q6+vlcrksTgYAAAAAAHDzhoaGot6npaUpMTHRojTxj+XkAADbyjAM5eXlKT09XR0dHZqYmIiaD4fD6ujo0OjoqA4cOKCkpCSLkgIAAADYKeFwWDbb+s/WlZWVyWazqaSkRA4Hl64AAAAAAMDu5Pf75ff7o8bWHt7C+ujEBADYES6XS/X19aqrq5PT6YyZ9/v9Onv2rHp6ehQOhy1ICAAAAGC7BYNBtbe368KFCxt2Y3U4HKqoqKCACQAAbJn5+Xm1tbWpra3N6igAAGAfubYLk8vlUkZGhkVpdgeuBgEAdlRWVpbS0tLU1dWl4eHhqDnTNNXX16fMzEwlJydblBAAAADAdpicnFR7e7tWVlYkSYODgyosLLQ4FQAA2MsWFhbU1tamubk5SVe6xpeWlq77kCUAAMBWCgQCGhsbixrLy8uTYRgWJdod6MQEANhxDodD1dXVOnLkiDweT9RcUVERBUwAAADAHrK6uqqmpiZdvnw5UsAkSd3d3VpeXrYwGQAA2OucTmfUEi6maWpkZMTCRAAAYL8YHR2NWn3GMAzl5eVZmGh3oIgJAGCZ1NRUnThxQkVFRZIkj8ejkpISi1MBAAAA2AprNwlfe+01jY+Pr7vN/Pz8DqcCAAD7SUJCgrKzs6PGhoaGNlzWFgAAYCuYphmzlFxmZibdIG8Ay8kBACxlt9tVXl6u7OxshcNh2Wzr19eapqlwOCy73b7DCQEAAADcrNXVVbW2tmpqamrd+bS0NFVVVcV0ZgUAANhq+fn5Gh0djbxfWVnR5OSkMjMzLUwFAAD2sunpaS0tLUWN5efnW5Rmd6GICQAQF663hNzQ0JAGBgZUU1Mjn8+3Q6kAAAAA3KyJiQm1tbUpEAjEzDkcDlVUVCgnJ0eGYViQDgAA7Dder1fJyclRHSCHhoYoYgIAANvm2i5MiYmJ3N+8QSwnBwCIewsLC+rq6tLy8rLOnz+v7u7uqDVkAQAAAFgvFAqpra1NjY2N6xYwZWVl6dSpU8rNzaWACQAA7BjDMGI6H6zXHQEAAGArLC8va3JyMmosPz+fayE3iCImAEBcC4fDamlpiSpa6uvr0/nz57W4uGhhMgAAAABr5ubmdPbsWQ0PD8fMOZ1OHTx4UHV1dXI6nRakAwAA+112drYcjujFSa7tkAAAALAVrr02YrfblZOTY1Ga3YciJgBAXAsGg7Lb7THjfr9fZ8+e1dDQkEzTtCAZAAAAAEmamZnRuXPn1u1mkJGRoZMnTyojI8OCZAAAAFesd/NwZGREoVDIokQAAGAvMk1TIyMjUWM5OTkxxdTYGEVMAIC45nQ6deTIEZWVlcW0WQyHw2pvb9fly5e1urpqUUIAAABgf/P5fPJ6vVFjNptN1dXVqq+vV0JCgkXJAAAA/sO1S8oFg0GNj49blAYAAOxFhmHo+PHjKikpiXSjvvZnEGyOIiYAQNwzDEPFxcU6duyYEhMTY+anpqZ05swZTUxMWJAOAAAA2N8Mw1Btba1stiuXmbxer06ePKm8vLyYBxEAAACskpiYqLS0tKgxlpQDAABbzeVyqbS0VK973et0+PBhJSUlWR1pV6GICQCwa3i9Xh0/fnzdiuVAIKDGxka1tbXRBhoAAADYYR6PR1VVVSopKdGxY8fk8XisjgQAABDj2uuKfr9ffr/fojQAAGAvs9lsMQXUuD6KmAAAu4rdbldVVZUOHjy47rIUw8PDOnv2rObm5ixIBwAAAOxdU1NTm97ky83NVWlpKd2XAABA3MrIyJDL5YoaoxsTAABA/KCICQCwK2VkZOjkyZPKyMiImVtaWtL58+c1MjJiQTIAAABgbwmFQuro6NClS5fU0tJC51MAALBrGYahvLy8qLGxsTEFAgGLEgEAAOBqFDEBAHYtp9Op+vp6VVdXy2aL/kgzDEMpKSkWJQMAAAD2hvn5eTU0NGhwcFCStLi4qK6uLotTAQAA3Lq8vLxI50ibzabs7GyFw2GLUwEAAECSHFYHAADgdqw9PeXz+dTS0hJZ3qKyslKJiYkWpwMAAAB2J9M0NTAwoO7ubpmmGTU3NDSknJwcHhoAAAC7ktPpVGFhoZxOp3Jzc+VwcKsMAADcOtM0dfHiRXm9XuXn58vtdlsdaVfjJzMAwJ6QmJioo0ePqq+vTwsLC8rNzbU6EgAAALArLS8vq6WlRbOzszFzNptN5eXl8nq9FiQDAADYGuXl5VZHAAAAe8Ts7KxmZmY0MzOj/v5+ZWRk6MCBA0pISLA62q5EERMAYM+w2WwqLS2VaZqRltDXCoVC8vv9Sk1N3dlwAAAAwC4wNjamtrY2hUKhmLnk5GTV1NQoKSnJgmQAAAAAAADxxTRN9fX1RY0tLi7S6fE28F8OALDnbFTAJEnd3d0aHBxUQUGBysvLZbPZdjAZAAAAEJ+CwaDa29s1Nja27nxRUZFKS0v5+RkAAAAAAODfTUxMaHp6OmosLy9v03uV2BxFTACAfWNqakqDg4OSpMHBQU1PT6u2tlbJyckWJwMAAACsMzMzo5aWFq2srMTMuVwu1dTU0MkUAADsG5t1eQcAAFgTDAbV0dERNeZ0OpWXl2dRor2BIiYAwL4QCATU2toaNba4uKiGhgaVlZWpsLCQixMAAADYV8LhsHp6etTf37/ufHZ2tqqqqmiBDgAA9oXl5WV1dHTI5XKpqqrK6jgAACDO9fT0aHV1NWqsoqKC6yi3if96AIB9weFwqLi4WF1dXQqHw5Fx0zTV1dWlqakpHThwQG6328KUAAAAwM6Zmppat4DJ4XCoqqpK2dnZFqQCAADYWeFwWIODg+rp6YlcN8zJyVFKSorFyQAAQLyan5+PrP6yJi0tTVlZWRYl2jtsVgcAAGAnGIahgoICHT9+fN3l42ZmZnT27FmNjY1ZkA4AAADYeZmZmTGFSqmpqTpx4gQFTAAA/LvFxUU99dRTOnXqlNLT05WUlKSamhp97GMfU29v723vv6enR4Zh3NCfRx999Pb/QoixuroaVcAkSe3t7TJN08JUAAAgXpmmqfb29qgxwzBUVVXFqi9bgCImAMC+kpSUpGPHjqmoqChmLhgMqrm5Wc3NzQoGgxakAwAAAHZWVVWVXC6XDMNQeXm5Dh8+THdSAAD+XUdHh44ePapPfOITOnPmjKanp7W4uKjW1lb97d/+rQ4fPqx//ud/tjombpPb7VZJSUnU2Pz8vIaGhixKBAAA4tnIyIjm5uaixoqLi+XxeCxKtLewnBwAYN+x2WwqLy9Xenq6WlpatLKyEjU/Njam2dlZ1dTUKDU11ZqQAAAAwA5wOByqra2V3W5ft2MpAAD7ld/v1/333x95yv4DH/iAHn74YXk8Hp0+fVpPPvmk5ubm9M53vlMvv/yyjh49etvH/Ou//mu9/e1v33A+LS3tto+B9RUWFmp0dFSLi4uRse7ubmVmZsrlclmYDAAAxJPV1VV1dXVFjXk8HhUXF1uUaO+hiAkAsG+lpqbq5MmTam9vj1lGbmVlRRcuXFBRUZFKS0tls9G8EAAAALuPzWZTX1+fcnJylJWVte42Pp9vh1MBABD/PvOZz6itrU2S9NRTT+njH/94ZO7OO+/Uvffeq3vuuUeLi4t6/PHH9eKLL972MQsKCnTw4MHb3g9uns1mU1VVlS5cuBAZC4VC6urqUm1trYXJAABAPOnu7o5ZzaWyspL7iFuI/5IAgH1t7cnzmpoa2e32mPn+/n719vZakAwAAAC4PcnJyTp8+LAmJyfV1tYW04EUAACsLxAI6Itf/KIkqba2Vh/72MditnnDG96g973vfZKkl156Sa+99tqOZsTWS01NVU5OTtTY2NiYpqenLUoEAADiyezsrEZGRqLGsrKylJ6eblGivYkiJgAAJOXk5OjkyZMxT6G7XC4VFhZalAoAAAC4eaZpamRkRPX19XK73ZKkYDCo1tZWmaZpcToAAOLf6dOnNTs7K0l6z3ves+GT9Y8++mjk9fe///2diIZtVl5eLocjehGT9vZ2hcNhixIBAIB4EA6HI8sMr7Hb7aqoqLAo0d5FERMAAP/O7XbryJEjKisrk2EYkqQDBw4oISHB4mQAAADAjVldXdWlS5c0PDwc+Zl2zdzcnBYXFy1KBgDA7vHLX/4y8vqee+7ZcLuTJ08qMTFRkvTyyy9vey5sP6fTqbKysqixpaUl9ff3W5QIAADEi+zs7Kji9tLSUrlcLgsT7U0UMQEAcBXDMFRcXKxjx46poqJCaWlpVkcCAAAAbsjMzIzOnj277pInKSkpOnHihJKSkixIBgDA7tLU1BR5XVNTs+F2DodDlZWVkqTm5ubbPu6XvvQlVVZWyu12y+fzqb6+Xh/60IfU0NBw2/vGjcvLy5PX640a6+3t1dLSkkWJAACA1Ww2m4qLi3Xq1CllZGQoOTlZBQUFVsfakxzX3wQAgP3H6/XGXKy4WiAQ0PT0tLKzs3cwFQAAABDLNE319/eru7t73bn8/HxVVVXFdGYCAADrGxgYkCQlJSUpNTV1022Liop08eJFjY+Pa2Vl5baexr+6WGllZUVNTU1qamrS008/rccee0xf+MIXbmn/a3+fjQwPD0de+/1+zc3N3fQxbsX8/Py6r+NBfn6+WltbI+9N01Rzc7MqKir4mSrOxfN5hd2JcwpbjXNq9ysuLlYoFJLf77c6SoRV59V2/DegiAkAgJtkmqZaW1s1OTmpqakpVVVVyW63Wx0LAAAA+1AgEFBLS4umpqZi5lZXV9Xe3q7jx49zsw0AgJuwdjMmOTn5utte3eVwfn7+loqMUlNT9eCDD+ree+9VVVWV3G63hoeH9cILL+jZZ5/V/Py8nn76afn9fj3//PM3vf+ioqIb3vbrX/+6fD7fTR/jdn3961/f8WNeT0lJifLy8iLv/X6/vv3tb6/7cxfiUzyeV9jdOKew1TinsB128ryanZ3d8n1SxAQAwE0aGBjQ5OSkJGl0dFR+v191dXUszQEAAIAdNTs7q+bmZq2srMTMeb1evfjiiwoEAhYkAwBgd1teXpYkOZ3O6257ddHSrSw3lp+fr8HBQSUmJkaNHzt2TPfdd58+/OEP681vfrP6+vr0jW98Q+985zv1tre97aaPg5s3MDCgjIyMqPOgpKREMzMzCofDFiYDAADYuyhiAgDgJiwtLcUs07G4uKiGhgZVV1crJyfHomQAAADYL0zT1MDAgLq6utadLykpUVpamn72s5/tcDIAAHbWVnQa/OpXv6pHH300asztdku60tXweq4uJvZ4PDd9fKfTuWmxVFVVlf7xH/9Rv/VbvyVJ+tKXvnTTRUz9/f2bzg8PD+uOO+6QJL373e9WQUHBTe3/Vs3Pz0c6Bbz73e++oc5XO216elo9PT2SrpxvJSUluuOOO2Sz2awNhg3thvMKuwvnFLYa59TuEQgElJCQYHWMG2LVeTU4OKgnn3xyS/dJERMAADfB4/GopqZGbW1tCoVCkfFwOKyWlhbNzMyosrKS5eUAAACwbebn59ctYEpISFBtba3S0tI0NzdnQTIAAPYGr9cr6cpn7vUsLCxEXm/XzaI3vvGNqqurU1NTk375y18qHA7fVBFNYWHhDW/r9XqVkpJyKzFvS3JysiXHvR6v1xtZJqWysjKmYxbiW7yeV9i9OKew1Tin4tfCwoIuXLigvLw8lZaWyuHYPaU1O3lebcf1p93zXxoAgDiRnZ2t5ORkNTU1RV2okqSRkZHI8nJc1AAAAMB28Hq9Ki4uVl9fX2QsNTVVtbW1N7TsDQAAe0Vzc/Nt7yMvLy9mrLCwUK+++qoWFhY0MzOj1NTUDb9+rctRVlZW1NJyW22tiGl5eVmTk5PKysratmPhPxiGobq6Otnt9i3p/AUAAOKfaZpqb29XOBzW4OCgxsfHVVlZyc9fO4QiJgAAbkFiYqKOHTumzs5ODQ8PR80tLCzo7NmzLC8HAACAbVNaWqrZ2VnNzs6qpKREJSUl3FgDAOw7NTU127Lfuro6ffe735UktbS06PWvf/262wWDQXV2dkqSamtrtyXLGj7nrbObOi8AAIDbNzY2FunEKF1ZYtjv91PEtENYtBcAgFtkt9tVXV2tmpqamBbea8vLXbvsHAAAALAVDMNQbW2tDh8+rNLSUm5sAgCwhe6+++7I65deemnD7c6cORPp0n3XXXdta6ampiZJksvlUkZGxrYeCwAAYL8KBAKRIvU1LpdLJSUlFiXafyhiAgDgNuXk5OjEiRNKSkqKmRseHta5c+e0uLhoQTIAAADsZnNzcxobG9tw3uVyKS0tbQcTAQCwP9x7773y+XySpK997WsyTXPd7Z577rnI6wcffHDb8rz88stqbGyUdKXA6tqH6WCd1dVVqyMAAIAt1NPTo0AgEDVWWVkpu91uUaL9h590AQDYAmvLy+Xm5sbMLSwsqKGhQXNzcxYkAwAAwG5jmqYGBgZ0/vx5tbS0yO/3Wx0JAIB9xel06iMf+Ygkqbm5WZ/97GdjtnnllVf07LPPSpLuuecenTp1at19GYYhwzBUWlq67vwPfvCDDYukJKmjo0OPPPJI5P2f/dmf3ehfA9soFAqpq6tLv/71r6OWmwEAALvX3NychoaGosYyMjKUmZlpUaL9iYV8AQDYIna7XQcOHFBqaqra2toUDocjcx6PR8nJyRamAwAAwG4QDAbV2tqqiYmJyFhzc7OOHz8uh4PLOAAA7JSPf/zj+ta3vqW2tjY98cQT6ujo0MMPPyyPx6PTp0/rU5/6lILBoDwejz7/+c/f8nEefPBBVVZW6qGHHtIdd9yhwsJCuVwuDQ8P66c//ameffZZzc/PS5Le8Y536KGHHtqivyFu1dTUlNrb27W8vCxJam9v1/Hjx+mQBQDALmaaptrb26PGbDabKisrLUq0f3H1CwCALZaTk6Pk5GQ1NTVpcXFRdrtddXV1XMgAAADApvx+v5qamiI3xNYsLS1pYGBgww4OAABg63m9Xv34xz/Wfffdp/b2dj3zzDN65plnorZJSUnR888/r6NHj97WsTo6OvTUU09tus2f/umf6nOf+9xtHQdbY3FxMerntYWFBQ0ODqqoqMjCVAAA4HYMDQ1FCsfXlJSUyO12W5Ro/6KICQCAbZCUlKTjx4+rvb1dGRkZ8ng8VkcCAABAnDJNU0NDQ+rs7Fx3OZmioiIVFxdbkAwAgP2tsrJS586d09///d/rO9/5jjo6OrS6uqqioiLdd999+uhHP6qSkpLbOsYPf/hDvfLKK3r11VfV29uriYkJLSwsKCUlReXl5XrjG9+o9773vTp48OAW/a1wuwoKCjQ6Ohp1o7Onp0dZWVnc6AQAYBdaWVlRd3d31FhiYqIKCwstSrS/UcQEAMA2sdvtqqmp2XSblZUVJSQk0KUJAABgnwoGg2pra9P4+HjMnMPhUE1NjTIyMixIBgAApCsPqj3xxBN64oknbunr1ytQvtoDDzygBx544Jb2DWsYhqGqqiqdO3cuMhYOh9XZ2an6+noLkwEAgFvR1dWlUCgUNVZVVcW9O4tQxAQAgEXC4bAuX74swzBUW1tLtyYAAIB9ZqPl46Qry9PU1tbyND8AAEAcSklJUV5enoaHhyNjExMTmpycpAAdAIBdZHp6WmNjY1FjOTk5Sk1NtSYQROkYAAAW6ejo0Pz8vPx+v86ePauJiQmrIwEAAGAHrC0fd+7cuXULmAoLC3XkyBEKmAAAAOJYWVmZEhISosY6OjpiOjkAAID4FA6H1d7eHjXmcDhUXl5uUSJIFDEBAGCJsbGxqCe1QqGQGhsb1dHRoXA4bGEyAAAAbKdgMKjm5ma1t7fHLC/jcDhUX1+viooKWpYDAADEuYSEhJibnMvLy+rr67MoEQAAuBkDAwNaWlqKGisrK5PT6bQoESSKmAAAsERiYuK6y8cNDg7q/Pnz6z6RDwAAgN3NNE1duHBB4+PjMXNer1cnTpxQZmamBckAAABwK3JycuTz+aLG+vv7tbCwYFEiAABwo3Jzc5WTkxN57/V6lZeXZ2EiSBQxAQBgieTkZB0/flzZ2dkxcywvBwAAsDcZhqGCgoKY8YKCAh09epTl4wAAAHYZwzBUVVUlwzAiY6ZpqqOjI6brJgAAiC9Op1M1NTU6cuSIkpKSYj7TYQ2KmAAAsIjD4VBNTc26PxQFg0E1Njaqs7OTCx4AAAB7SG5urnJzcyVJdrtd9fX1qqysZPk4AACAXSopKUmFhYVRYzMzMxobG7MoEQAAuBmpqak6ceKEvF6v1VEgyWF1AAAA9jPDMJSfn6+UlBQ1NTXFrL07MDCgqakpOZ1Ora6uWpQSAAAAW6myslKmaaqkpGTdJYYBAACwu5SUlGhsbEwrKyuRsc7OTmVkZMjh4FYcAADxjg5M8YPH/AAAiANry8tlZWXFzC0uLurQoUNKTU3d+WAAAAC4JX6/f8M5u92umpoaCpgAAAD2CLvdrsrKyqixQCCgnp4eawIBAADsUhQxAQAQJxwOh2pra9ddXi4hIUE1NTUaGhpieTkAAIA4Fg6H1draqoaGBk1MTFgdBwAAADskMzNTGRkZkfdZWVkqKiqyMBEAALja0tISq57sAvSwBAAgjqwtL+f1etXU1KTl5eWo+cXFRYuSAQAA4HqWl5fV1NQU6cLU2tqq5ORkud1ui5MBAABgJ1RWVmp5eVnl5eVKT0+3Og4AAPh3pmmqpaVFi4uLKisrU15eHkvIxSk6MQEAEIe8Xq9OnDihzMzMyNjy8rJKS0v5oQoAACAOTU9Pq6GhIWoZuWAwqKamJjppAgAA7BNut1snTpyggAkAgDgzMjKiubk5BYNBtbe369y5czGNBBAfKGICACBOORwO1dXVqaCgQMFgUG1tbXI4aKIIAAAQT0zTVF9fny5evKhAIBA1Z7PZVFhYSBE6AADAPsLPfgAAxJdAIKCurq6YMafTaVEibIY7oQAAxDHDMJSdna0f/OAHCoVCVscBAADAVYLBoFpbWzUxMREz5/F4VF9fr6SkJAuSAQAAAAAAQJK6uroUDAajxqqqqmSz0fMnHvF/BQCAXWCzAqZAIKCmpiatrKzsYCIAAID9bXFxUefOnVu3gCkjI0PHjx+ngAkAAAARs7OzGhkZsToGAAD7ysjISMznb1ZWFku/xjE6MQEAsIuZpqnm5mZNT09rZmZGdXV1Sk1NtToWAADAnjY+Pq7W1tZ1C81LS0tVXFzMMiIAAACIGB0dVWtrq0zTlNPp5MYpAAA7YGZmRm1tbVFjdrtdFRUVFiXCjaATEwAAu1hPT4+mp6clXenIdOHCBQ0MDMg0TYuTAQAA7D2maaqrq0tNTU0xBUwOh0OHDh1SSUkJBUwAAACI6OnpUUtLS+R6XVNTkxYWFixOBQDA3ra4uKjGxsaY+2UVFRVyuVwWpcKNoIgJAIBdKhQKaWxsLGa8s7NTLS0tmy5BBwAAgJsTCAR08eJF9ff3x8wlJyfr+PHjPFEPAACAGNfePA2FQrp06ZJWV1ctSgQAwN4WCAR06dIlBYPBqPHCwkLl5eVZlAo3iiImAAB2KbvdruPHjystLS1mbmxsTOfOndPS0pIFyQAAAPae+fl5zczMxIzn5OTo6NGj8ng8Ox8KAAAAca+0tFRZWVlRYysrK7p8+TIPIQIAsMXC4bAuX76s5eXlqPGMjAyVl5dblAo3gyImAAB2sYSEBB06dEjFxcUxcwsLCzp79qwmJyctSAYAALC3pKWlqbS0NPLeMAxVVlbqwIEDstvt1gUDAABAXDMMQwcOHJDX640a9/v9UcvMAQCA22OaplpbWzU3Nxc1npycrNraWhmGYVEy3AyKmAAA2OUMw1BZWZnq6+tjbqCFQiFdvnxZPT09XBABAAC4TcXFxcrIyJDT6dSRI0dUUFDABTAAAABcl91u18GDB+V2u6PGJyYm1N3dbVEqAAD2lt7eXo2NjUWNuVwuHTx4kAfQdhGKmAAA2CMyMzN1/PhxJSUlxcz19vbq8uXLCgQCFiQDAADYGwzDUE1NjU6cOCGfz2d1HAAAAOwiTqdz3Zuo/f39Gh4etigVAAB7w9LSkvr6+qLG1oqIXS6XRalwKyhi2kaLi4t66qmndOrUKaWnpyspKUk1NTX62Mc+pt7e3tvef09PjwzDuKE/jz766A3t85vf/Kbe+ta3Kjc3V263WyUlJfrP//k/65VXXrntvACA7ZeYmKhjx44pKysrZm5qakoNDQ2an5+3IBkAAMDuMD09rZGRkQ3nHQ6HnE7nDiYCAADAXpGUlKT6+vqYbp7t7e2anp62KBUAALufx+PRoUOH5HA4ImO1tbVKTk62MBVuBUVM26Sjo0NHjx7VJz7xCZ05c0bT09NaXFxUa2ur/vZv/1aHDx/WP//zP1sdM2JpaUn333+/HnnkEf3sZz/T6OioVlZW1NfXp+eff1533323/uqv/srqmACAG2C321VbW6uKioqYueXlZZ07d06zs7MWJAMAAIhfpmmqv79fFy9eVFtbm+bm5qyOBAAAgD0oLS1NVVVVUWOmaaqxsVELCwsWpQIAYPdLS0vTsWPH5Ha7VVlZqYyMDKsj4RY4rr8Jbpbf79f999+v9vZ2SdIHPvABPfzww/J4PDp9+rSefPJJzc3N6Z3vfKdefvllHT169LaP+dd//dd6+9vfvuF8Wlrapl//3ve+Vz/5yU8kSW9605v00Y9+VPn5+bp06ZI+9alPqbOzU5/85CeVl5enD37wg7edFwCwvQzDUGFhoZKTk9XU1BS1jFxSUpK8Xq+F6QAAAOJLMBhUW1ubxsfHJf3HTaQTJ07QdQkAAABbLi8vT4uLixoYGIiMhUIhXb58WceOHeNnUAAAblFiYqJOnjwZs3wrdg+KmLbBZz7zGbW1tUmSnnrqKX384x+PzN1555269957dc8992hxcVGPP/64Xnzxxds+ZkFBgQ4ePHhLX/uv//qv+qd/+idJ0gMPPKDvf//7kX/Up06d0tve9jadOHFCfX19+sQnPqH/9J/+03WLogAA8SE1NVUnTpxQY2Oj/H6/EhISVF9fL5uNZowAAADSlaXgGxsbtbi4GDW+urqqoaEhlZaWWhMMAAAAe1p5ebmWl5c1MTERGVteXlZjY6OOHDnC9TsAAG4RBUy7Gz8BbbFAIKAvfvGLkq6ssfixj30sZps3vOENet/73idJeumll/Taa6/taMZrffazn5UkORwOffnLX475R52ZmalPf/rTkqSZmRl95Stf2fGMAIBb53K5dPToUeXn56uurk4ul8vqSAAAAHFhYmJCDQ0NMQVMklRaWqqSkhILUgEAAGA/MAxDNTU1MR3TfT6fDMOwKBUAAPHPNE3Nz89bHQPbhCKmLXb69GnNzs5Kkt7znvdsWCn/6KOPRl5///vf34lo6/L7/frFL34hSXrzm9+swsLCdbd76KGHlJKSIsnavACAW2Oz2VRVVaXU1NQNtwkGgzJNc+dCAQAAWMQ0TXV1damxsVGhUChqzuFw6ODBgyopKeHmEQAAALaV3W5XfX29XC6XDMNQdXW1ysvL+TkUAIBN9Pf36+zZsxocHLQ6CrYBRUxb7Je//GXk9T333LPhdidPnlRiYqIk6eWXX972XBt57bXXtLq6KmnzvE6nU69//esjXxMIBHYkHwBgZ4RCIZ0/f14tLS0xN/IAAAD2kkAgoEuXLqm/vz9mLikpScePH1dGRoYFyQAAALAfuVwuHTx4UIcOHVJeXp7VcQAAiGtjY2Pq7u6WJHV0dKijo4MH9PcYipi2WFNTU+R1TU3Nhts5HA5VVlZKkpqbm2/7uF/60pdUWVkpt9stn8+n+vp6fehDH1JDQ8OW5L16PhgMqr29/bYzAwDig2maamtr08LCgsbGxnTu3DktLS1ZHQsAAGDL+f1+nT17VtPT0zFzOTk5OnbsmDwejwXJAAAAsJ8lJycrLS3N6hgAAMS1ubk5tbS0RI0NDg5qbm7OokTYDg6rA+w1AwMDkq48vbnZkj2SVFRUpIsXL2p8fFwrKytyuVy3fNyri5VWVlbU1NSkpqYmPf3003rsscf0hS98Yd39r+WVtOFSclfnXdPf36+6urobznf1cdYzPDwceb2wsMA3Gljq6jVUWU8V8WC7z8mxsTGNjY1F3i8sLOjs2bMqKSmRz+fb8uNhd+N7JOIJ5yPiDedkfJucnFR/f/+6T+cVFhYqMzNTCwsLFiTbHpyPiDeck4gne+n7PQAAALAfLC0t6fLlyzHXdcrLy7mXtcdQxLTF/H6/pCtV89eTlJQUeT0/P39LRUypqal68MEHde+996qqqkput1vDw8N64YUX9Oyzz2p+fl5PP/20/H6/nn/++Q3z3kjma/PejKsLoK7ne9/7Ht9oEDe+/vWvWx0BiLId52RaWpoqKirkcPzHjwWhUEhdXV3q7+9nTWFsiO+RiCecj4g3nJPxpaSkZN2lOVZXV9XW1qZf//rXFqTaOZyPiDeck7Da7Oys1REA4IbNz8+rs7NTdXV1SkhIsDoOAAA7LhgM6vLlywoEAlHjeXl5123Ugt2HIqYttry8LElyOp3X3fbqoqVbWbYnPz9fg4ODSkxMjBo/duyY7rvvPn34wx/Wm9/8ZvX19ekb3/iG3vnOd+ptb3vbunlvJPPt5gUAxKfp6WldvnxZ1dXVMZ8pRUVFSk5OVkdHh0KhkEUJAQAAbs96D+LMzc2pvb095gIYAAAAEC+mpqbU1NSkUCikxsZGHT58WDabzepYAADsmHA4rKamJi0uLkaNp6WlqaqqSoZhWJQM22XfFjFtxcn81a9+VY8++mjUmNvtlnTlac7rWVlZibz2eDw3fXyn07lp4VFVVZX+8R//Ub/1W78lSfrSl74UU8S0lle6fubbydvf37/p/PDwsO644w5J0kMPPaTq6uqb2j+wlebn5yNPhb773e++oc5qwHbaqXMyFAqpr69PMzMzUeNpaWm66667VF5efkufV9hb+B6JeML5iHjDORnfBgYGND4+LknKysrS0aNHdc8991icavtwPiLecE4inrS1tenJJ5+0OgYAbGpsbEzNzc2R97Ozs2pra9OBAwe4YQsA2BdM01RHR4emp6ejxhMTE1VXV8fn4R61b4uYtovX65V0Y8utXb32+nZduHnjG9+ouro6NTU16Ze//KXC4XBUlf5aXun6mW8n7820cUtKSlJKSspN7R/YLsnJyZyPiCvbfU6mpqZqcHBQnZ2dUeNrS61UV1crJydn246P3YXvkYgnnI+IN5yT8aempkbBYFA5OTn77ucZzkfEG85JWC0pKcnqCABwXT6fT06nM+oB9NHRUXk8HpWUlFiYDACAnTEwMKDh4eGosYSEBB06dEgOB6Uue9W+/T97dfX6rcrLy4sZKyws1KuvvqqFhQXNzMwoNTV1w69f606UlZUVtVTbVlsrYlpeXtbk5KSysrKi8q4ZGBjQyZMnr5tXurK8EABg7zEMQ4WFhUpOTlZTU1PU8irhcFgtLS3y+/0qLy+ndTUAAIg7pmlu+BSezWbToUOHeEoPAAAAu4LL5dLBgwd1/vx5hcPhyHhPT488Ho+ys7MtTAcAwPaamJhQV1dX1JjNZtPBgwejVpvC3rNvi5hqamq2Zb91dXX67ne/K0lqaWnR61//+nW3CwaDkS4XtbW125JlzWYXaOvq6iKvW1paNt3P2rzD4VBVVdXWhAMAxKXU1FSdOHFCjY2N8vv9UXODg4Oan59XXV3dpsuaAgAA7KSlpSU1NjaqtLRUmZmZ625DARMAAAB2E6/Xq9raWjU2NkaNt7S0yOVyyefzWZQMAIDt4/f7121KU1NTQ1fffYAWClvs7rvvjrx+6aWXNtzuzJkzkeXZ7rrrrm3N1NTUJOlK1X5GRkbU3KlTpyI3oDfLu7q6ql//+teRr0lISNimtACAeOFyuXT06NF1Ow/Ozs6qp6dn50MBAACsY2pqSg0NDVpYWFBLS0vUcugAAADAbpaZmamKioqoMdM01djYqKWlJYtSAQCwPZaXl3X58uWoLoSSVFZWFrXiFPYuipi22L333hupfP/a174m0zTX3e65556LvH7wwQe3Lc/LL78cqdC/++67Y5b+8Xq9+p3f+R1J0s9//nMNDAysu5/vfe97mpub2/a8AID4YrPZVF1drQMHDkR1LvB4PCovL7cwGQAAwJWbN319fbp06ZKCwaAkKRQKqbGxMfIeAAAA2O0KCgqUn58fNRYIBHT58mV+7gUA7CkzMzNaXV2NGsvNzVVRUZFFibDTKGLaYk6nUx/5yEckSc3NzfrsZz8bs80rr7yiZ599VpJ0zz336NSpU+vuyzAMGYah0tLSded/8IMfbFgkJUkdHR165JFHIu//7M/+bN3t/uIv/kLSlSXuPvzhDysUCkXNT0xM6BOf+ISkK8sLvf/979/wmACAvSk3N1dHjx6V0+mU3W7XwYMH5XDs21VpAQBAHAiFQmpublZ3d3fMnGEY3MwBAADAnmEYhiorK5WWlhY1vri4qMbGxphuFQAA7Fa5ubmqq6uLNGdJTU1VVVVV1IP22Nu4+7gNPv7xj+tb3/qW2tra9MQTT6ijo0MPP/ywPB6PTp8+rU996lMKBoPyeDz6/Oc/f8vHefDBB1VZWamHHnpId9xxhwoLC+VyuTQ8PKyf/vSnevbZZzU/Py9Jesc73qGHHnpo3f389m//th5++GH90z/9k374wx/qLW95ix5//HHl5+fr0qVL+v/+v/9PfX19kqRPf/rTMT8kAwD2h5SUFJ04cUKLi4tKTEy0Og4AANjHlpaW1NjYuO6ycZmZmTpw4AAF1wAAANhTDMNQXV2dzp8/H/Vz8MzMjNrb21VdXc0NXgDAnpCVlSWXy6Wurq6ogibsD1zR2wZer1c//vGPdd9996m9vV3PPPOMnnnmmahtUlJS9Pzzz+vo0aO3dayOjg499dRTm27zp3/6p/rc5z636Tb/+3//b83NzeknP/mJTp8+rdOnT0fN22w2/ff//t/1wQ9+8LbyAgB2N6fTKafTueH86uqqlpeXlZKSsoOpAADAfjI1NaXm5uZ1Oy2VlpaquLiYmzcAAADYkxwOhw4ePKiGhgYFAoHI+MjIiDwej4qLiy1MBwDA1klJSdGRI0e4xrMPUcS0TSorK3Xu3Dn9/d//vb7zne+oo6NDq6urKioq0n333aePfvSjKikpua1j/PCHP9Qrr7yiV199Vb29vZqYmNDCwoJSUlJUXl6uN77xjXrve9+rgwcPXndfHo9HP/7xj/WNb3xDzz33nC5cuKCZmRnl5OTojW98o/78z/9cd955523lBQDsbeFwWE1NTZqbm1N1dbVyc3OtjgQAAPYQ0zTV39+/7vJxDodDNTU1ysjIsCAZAAAAsHPcbrcOHjyoCxcuRC0j193dLa/Xy2oaAIA9gwKm/Ykipm2UlJSkJ554Qk888cQtfb1pmpvOP/DAA3rggQduad8beeSRR/TII49s6T4BAPtDV1eXZmdnJUmtra3y+/2qqKigzScAALhtwWBQra2tmpiYiJlLTEzUwYMH5fF4LEgGAAAA7LyUlBTV1NSoqakpMpabmyufz2dhKgAAbs78/LxCoRCfX4hCERMAALhtk5OTGhwcjBobGhrS/Py86uvrN12CDgAAYDOLi4tqbGzU4uJizFxmZqZqampkt9stSAYAAABYJysrS+Xl5erq6lJZWZmKioroWAEA2DVWVlZ06dIlBQIB1dTUKDs72+pIiBO0RgAAALctLS1NBQUFMeNzc3M6e/as5ubmLEgFAAB2u2AwqPPnz69bwFRWVqa6ujoKmAAAALBvFRYW6tixYyouLqaACQCwa4RCIV2+fFmrq6syTVPNzc3q7e297kpV2B8oYgIAALfNZrOpsrJSNTU1McvHra6u6vz58xoeHrYoHQAA2K0cDoeKi4tjxg4dOsSNGgAAAOx7hmEoJSXF6hgAANywtaKl+fn5qPHp6WmKmCCJIiYAALCFcnJydPToUblcrqhx0zTV1tamtrY2hcNhi9IBAIDdqKCgINJSPCkpScePH1d6errFqQAAAID4FwqFuCEMAIgrnZ2dmpycjBrzeDyqr6+PeUge+xNnAQAA2FJer1cnTpxQampqzNzw8LAuXLiglZWVnQ8GAAB2JcMwVF1dreLiYh07dkwej8fqSAAAAEDcW15eVkNDgwYHB62OAgCAJGloaCjmc8nhcOjgwYNKSEiwKBXiDUVMAABgyyUkJOjw4cMqLCyMmZubm1NDQ4NmZ2ctSAYAAOLV8vLyhnN2u11lZWWy2+07mAgAAADYndauvy0uLqqzs1MjIyNWRwIA7HOjo6Nqb2+PGjMMQ/X19UpMTLQoFeIRRUwAAGBbGIahiooK1dTUxLQAXV1d1YULFzQ0NGRROgAAEC9M01RPT49+85vfaGZmxuo4AAAAwK62srKiCxcuKBAIRMZaW1vV3d3N0nIAgB23dt2npaUlZq66unrdVT2wv1HEBAAAtlVOTo6OHTsmt9sdNW6apsbGxrh4AgDAPhYMBtXY2Kje3l6ZpqmmpqZNOzIBAAAA2JzL5VJxcXHMeF9fn5qbmxUKhSxIBQDYj8LhsFpaWtTb2xszV1xcrNzcXAtSId5RxAQAALZdcnKyjh8/HlVR73Q6VVdXJ8MwrAsGAAAss7i4qIaGBk1OTkbGAoGAmpqaFA6HLUwGAAAA7G7FxcUqKiqKGR8fH9eFCxe0urpqQSoAwH4SCAR08eJFjY2NxcwVFBSotLR050NhV6CICQAA7IiEhAQdPnxYhYWFkXWOnU6n1bEAAIAFJiYm1NDQoKWlpZi5rKwsipwBAACA22AYhsrLy1VVVRUz5/f7de7cOS0sLFiQDACwHywuLurcuXOanZ2NmausrFRlZSXXfrAhh9UBAADA/mEYhioqKlRQUBCzvBwAANj7TNNUb2/vum3EHQ6H6urqlJaWZkEyAAAAYO/Jz8+X2+1WU1NT1DJyy8vLOnfunOrq6pSenm5hQgDAXrSysqLl5eWoMbvdrtraWmVkZFiUCrsFnZgAAMCO26yAKRgMqru7m2VkAADYY4LBoC5fvrxuAVNycrJOnDhBARMAAACwxdLT03Xs2DG5XK6o8VAopEuXLml4eNiiZACAvSotLU3V1dWR9y6XS0ePHqWACTeETkwAACBumKaplpYWTU5Oanp6WvX19TEXWAAAwO6zsLCgxsbGdZePy87OVnV1tex2uwXJAAAAgL0vKSlJx48f1+XLl+X3+6Pm2tratLi4qPLycpb2AQBsmdzcXC0uLmp6eloHDx7kXg9uGJ2YAABA3Ojr69Pk5KQkye/36+zZs5qZmbE2FAAAuC0TExM6d+7cugVMFRUVqqmpoYAJAAAA2GZOp1NHjhxRVlZWzNzAwICamppkmqYFyQAAe1VZWZmOHj1KARNuCkVMAAAgLqyurqq/vz9qLBAI6OLFixocHOQiCgAAu4xpmuru7lZjY6NCoVDUXEJCgo4cOaLCwkKe9gYAAAB2iN1uV21trYqKimLm3G43P5sDAG7K6uqqxsfHN5w3DIMH13DTKGICAABxwel06tixY3K73VHjpmmqo6NDra2tCofDFqUDAAA3a3Z2Vn19fTHjycnJOn78uFJTU3c+FAAAALDPGYah8vJyHThwIFK0lJmZqfLycouTAQB2k4WFBZ07d05NTU2RFTaArUAREwAAiBtJSUk6fvy40tLSYuZGR0d1/vx5LS8vW5AMAADcrNTUVBUXF0eN5eTk6OjRozFFywAAAAB2Vm5urg4dOqS0tDTV1NTQhQkAcMOmp6d17ty5yP2a5uZmzc/PW5wKewVFTAAAIK4kJCTo0KFDMTc9Jcnv96uhoUHT09MWJAMAADertLRU6enpMgxDlZWVOnDgAG3EAQAAgDiRlpamw4cP8zM6AOCGDQ8P6+LFiwqFQpGxUCik9vZ2maZpYTLsFRQxAQCAuGMYhsrKylRXVyebLfrHlUAgoIsXL6q/v58fiAEAiHOGYaimpkZHjhxRQUEBT3cDAAAAu8j8/Ly6urq4BgcAkGma6uzsVFtbW8yc1+tVfX09132wJRxWBwAAANhIVlaWEhMT1djYqKWlpai5rq4u+f1+VVdXy+HgRxoAAKyyuroqv9+vjIyMdecTEhLk8/l2OBUAAACA27G6uqrLly9rZWVFCwsLqquro2MTAOxToVBILS0tmpiYiJnLzMxUTU0NnxHYMnRiAgAAcS0pKUnHjx9Xenp6zNz4+HjUussAAGBnzc3N6ezZs2pqapLf77c6DgAAAIAtEAqFIgVMkjQ1NaXz589H3gMA9o+VlRVduHBh3QKmoqIiilyx5ShiAgAAcc/hcOjgwYMqKSmJmbPZbEpISLAgFQAA+5dpmhoaGtL58+e1urqqcDispqYmBQIBq6MBAAAAuE1+v1/z8/NRY/Pz82poaODhBQDYR+bn53Xu3LmY7/2GYai6ulrl5eUsIYctRxETAADYFQzDUGlpqQ4ePBhZPs7hcFDlDwDADguFQmptbVV7e7tM04yMLy8vq7Oz08JkAAAAALZCamqqDh8+HLkGt2Z1dVXnz59ftxsHAGBv2agLn8Ph0KFDh5SXl2dRMux1FDEBAIBdJSMjQ8ePH1dycrJqamrk8XisjgQAwL6xtLSk8+fPa3R0NGYuNTVV5eXlFqQCAAAAsNVSU1N1/PjxmGtv4XBYjY2NGhgYiHqoAQCwdwwODurSpUsKhUJR4263W8eOHVNaWppFybAfOK6/CQAAQHzxeDw6fvz4pm1KTdOkjSkAAFtoampKzc3NCgaDMXNFRUUqKyvjsxcAAADYQzwej44dO6bGxkbNzs5GzXV2dmpxcVFVVVX8HgAAe8j8/Lw6OjpixlNSUlRfXy+n02lBKuwndGICAAC70mYXR8LhsM6fP6/h4eEdTAQAwN5kmqZ6e3t16dKlmAImu92uuro6lZeXc+MCAAAA2IMSEhJ0+PBh5eTkxMwNDw+v+3sCAGD3Sk5OVllZWdRYVlaWjhw5QgETdgRFTAAAYM9pb2/X3Nyc2tra1NraqnA4bHUkAAB2pWAwqMbGRvX09MTMJSYm6tixY8rKytr5YAAAAAB2jM1m04EDB1RaWhozNz09rfPnz2t5eXnngwEAtkVRUZFyc3MlSSUlJaqtrZXNRmkJdgbLyQEAgD1leHhYIyMjkfcjIyNaWFhQXV2d3G63hckAANhdFhYW1NjYqKWlpZi5zMxMHThwQA4HlxUAAACA/cAwDJWUlMjj8ailpUWmaUbmFhYW1NDQoIMHDyolJcXClACArWAYhqqqqpSVlaX09HSr42CfoVwOAADsKevdaPX7/WpoaND09LQFiQAA2H3GxsbU0NCw7udqWVmZ6urqKGACAAAA9qHs7GwdOXJECQkJUeOBQCDqwUIAQPxbXV3dcM5ms1HABEtQxAQAAPaU8vLydVubBgIBXbx4UX19fVFPigEAgFihUChmOdaEhAQdPnxYxcXFMgzDomQAAAAArObz+XTs2DElJiZGjVVWVlqYCgBwo0zT1MDAgF599VXNzs5aHQeIQhETAADYc7Kzs3X8+HF5PJ6Yue7ubjU1NSkYDFqQDACA3SEvL095eXmR916vV8ePH1daWpqFqQAAAADEC4/Ho2PHjik1NVUej0f19fUxDxUCAOKPaZrq6OhQZ2enwuGwGhsb1+3EDViFnyYAAMCelJSUpOPHjysjIyNmbmJiQg0NDVpYWLAgGQAAu0NlZaW8Xq/y8vJ09OhRud1uqyMBAAAAiCMOh0OHDh1ad3k5AED8CQaDunz5soaGhiJjgUBAly9fVigUsjAZ8B8oYgIAAHuWw+FQfX29SktLY+aWlpZ07tw5jY+P73wwAAB2AZvNpiNHjqi6uponqgEAAACsy2azyeVybTi/vLxMhw8AiAPLy8s6f/68pqamYuays7O59oO4wZkIAAD2NMMwVFJSokOHDsnhcETNhUIhNTU1qbOzU6ZpWpQQAABrhEIhtbS0aHJycsNt7Hb7DiYCAAAAsJcEg0FdunRJ586d0+zsrNVxAGDfmpubW3d1CsMwVFtbq5KSEhmGYVE6IBpFTAAAYF9IT0/XiRMnlJycHDM3MDCgnp6enQ8FAIBF1joSjo6OqqWlhSejAQAAAGypcDispqYmLS4uKhAI6MKFCxobG7M6FgDsO+Pj47pw4YICgUDUeEJCgo4cOaLs7GyLkgHro4gJAADsG263W0ePHlVOTk7MeGFhoUWpAADYWZOTk1FP3wWDQTU2NioUClmcDAAAAMBe0d/fr+np6ch70zTV3Nys7u5uhcNhC5MBwP4QDofV29urpqammO+7iYmJOnbsmHw+n0XpgI05rr8JAADA3mG323XgwAGlpKSoo6NDhmGovr5eCQkJVkcDAGBbmaap3t5e9fb2xswtLy9rYWFBKSkpFiQDAAAAsNcUFBRodnY2qpBJkvr6+jQxMaGqqiqlpqZaEw4A9rjZ2Vm1t7fHLB8nSampqaqrq+OeCOIWRUwAAGDfMQxD+fn5Sk5O1srKyrpLzAEAsJcEAgG1tLRoamoqZi4xMVH19fVKTEy0IBkAAACAvcjhcOjQoUPq6OjQ0NBQ1Nzi4qIuXLignJwclZeXy+l0WpQSAPaWQCCgrq4ujYyMrDufm5urqqoq2Wws2IX4RRETAADYt67XbSIQCCgUCsntdu9QIgAAtt78/LwaGxu1vLwcM5eVlaUDBw7IbrdbkAwAAADAXmYYhiorK+XxeNTZ2RkzPzo6qsnJSZWVlSkvL0+GYViQEgD2DtM0NT4+vu5cWVmZioqK+F6LuEcREwAAwDpM01RTU5Pm5+dVW1ur9PR0qyMBAHDTRkdH1dbWpnA4HDNXXl6uwsJCLl4BAAAA2DaGYaiwsFA+n09tbW2an5+Pmg8Gg2pvb9fIyIiqqqrk9XotSgoAu5/T6VRZWZk6OjoiY0lJSaqqqpLP57MwGXDj6BMGAACwju7ubs3MzCgYDOrSpUvq7e2VaZpWxwIA4IaEw2F1dHSopaUlpoApISFBhw8f5uk7AAAAADvG6/Xq+PHjqqysXLcTrN/vV0NDgzo6OhQMBi1ICAB7Q35+vpKTk2W321VRUaETJ05QwIRdhU5MAAAA15icnFR/f3/UWE9Pj/x+v2pqauRw8CMUACB+raysqKmpSXNzczFzXq9X9fX1crlcFiQDAAAAsJ8ZhqGCggJlZWWps7NTY2NjMdsMDw+rsLCQ628AsAHTNDU5OSmfz6eEhISYecMwIvcxuP6D3YhOTAAAANfw+XzKzMyMGZ+cnFRDQ4MWFhYsSAUAwPWFQiGdO3du3QKmvLw8HT16lAtYAAAAACzldDpVW1urw4cPy+PxRM2VlJTI7XZblAwA4tvS0pIuX76sxsZGdXd3b7hdUlIS13+wa1HEBAAAcA2Hw6G6ujqVlZXFzC0tLamhoUEjIyMsLwcAiDt2u135+flRY4Zh6MCBA6qurpbNxmUAAAAAAPEhLS1NJ0+eVGlpqWw2mxITE1VYWGh1LACIO+FwWL29vTpz5oympqYkXelcNzs7a3EyYOvRixEAAGAdhmGouLhYXq9XTU1NCgaDkblwOKzW1lbNzMyoqqpKdrvdwqQAAEQrKiqS3+/XxMSEXC6X6uvr5fV6rY4FAAAAADFsNptKSkqUnZ2tYDC44YMXwWBQc3NzSk9P3+GEAGCt6elptbe3a2lpKWauvb1dJ06ckGEYFiQDtgdFTAAAAJtIS0vTiRMn1NjYqPn5+ai50dFRzc3Nqa6uTsnJyRYlBAAg2lrnpYSEBJWVlSkhIcHqSAAAAACwqWuXlbtWb2+vBgYGlJmZqcrKSpZJArDnra6uqrOzU2NjY+vOO51OFRcX73AqYPtRxAQAAHAdbrdbx44dU2dnp4aGhqLm1paXq6ysVF5eHk88AAB2hGmampubk8/nW3fe4XCourp6h1MBAAAAwNabn5/XwMCAJGliYkLT09MqLS1VQUEB1+IA7DmmaWpoaEjd3d0KhULrblNQUKDS0lI5HJR7YO/hrAYAALgBNptNVVVV8vl8amtri/rlwTRNtbe3a2ZmRgcOHGB5OQDAtlpdXVVzc7NmZmZ05MgRpaamWh0JAAAAALbF2nW3q4VCIXV2dmpkZCRyvQ4A9gK/36+2traYVSHWeL1eVVVVyev17nAyYOdQxAQAAHATsrOz5fV61dTUFPOLRCAQkM1msygZAGA/mJ6eVnNzswKBgCSpublZJ06ckNPptDgZAAAAAGyP3NxcLS4uKhgMRo0vLCzo/Pnzys3NVXl5OUtpA9i1gsGguru7Y1aCWONwOFRWVsZqENgXKGICAAC4SR6PR8eOHVNXV5cGBwclSQkJCaqpqeEXCADAtjBNU729vert7Y0aX11dVWtrqw4dOmRRMgAAAADYPoZhKC8vT5mZmerq6tLIyEjMNiMjI5qcnFR5ebk8Ho8FKQHg1gWDQb322mtaXV1ddz4nJ0fl5eU8wIZ9gyImAACAW2Cz2VRZWanU1FS1traqpqZGLpfL6lgAgD1oZWVFzc3Nmp2djZlzOp0qKiqyIBUAAAAA7JyEhAQdOHBAubm5am9v18LCQtR8IBBQa2urkpKS5PF4tLS0ZFFSALg5DodDmZmZMV2YEhMTVVVVpdTUVGuCARahiAkAAOA2ZGZmKjU1VQ7Hxj9WhcNhlpkDANySqakptbS0RJaPu1p6erpqampYMgEAAADAvuHz+XT8+HENDg6qp6dH4XA4an5hYUGHDh3SyMiIQqGQRSkB4OaUlZVpfHxcgUBANptNJSUlKiws5L4C9iWKmAAAAG7TZgVMwWBQ586dU25urgoLC1luDgBwQ8LhsHp6etTf3x8zZxiGysrK+FwBAAAAsC/ZbDYVFRUpKytLnZ2dmpiYiJnPz89Xc3Oz7rjjjk2v3QHATjJNc91xh8OhiooKjY+Pq7KyUm63e4eTAfGDT20AAIBtYpqm2tratLi4qK6uLs3OzurAgQN0zAAAbGp5eVnNzc2am5uLmXO5XKqtrZXP57MgGQAAAADED7fbrfr6ek1OTqqjo0PLy8tR88nJyRQwAYgLy8vL6uzsVEpKyobXdLKzs5WTk7PDyYD4wyc3AADANhkeHtb4+Hjk/eTkpM6ePcvNZwDAhiYmJtTa2qpgMBgzl5GRQTEsAAAAAFwjIyNDqamp6uvrU39/v0zTVDAYVEFBgdXRAOxz4XA4avnL6elp1dTUrLst3baBK1hEEQAAYJusrq7GjK2srOj8+fPq6+vbsHUsAGB/6unpUWNjY0wBk2EYqqioUH19PQVMAAAAALAOu92usrIy1dTUaHZ2Vn19ffz+BMBSs7OzamhoUFdXl8LhsCQpFAppcHDQ4mRAfKMTEwAAwDYpLS1VSkqKWlpaFAgEoua6u7sjy8s5nU6LEgIA4klycnLMmNvtVl1dnbxerwWJAAAAAGB3cbvdam5u3nSb4eFhzczMqKKigutyALZcIBBQV1eXRkZG1p2fn59XQkJCzD0DAFfQiQkAAGAbpaen68SJE+suHzc1NaWzZ89qZmZm54MBAOJOZmamCgsLo96fOHGCAiYAAAAA2CKrq6vq6urS2NiYXnvtNQ0NDdEtHcCWME1Tw8PD+s1vfrNhAVNeXp5qa2spYAI2QScmAACAbeZyuXTkyBH19vaqt7c3am51dVUXLlxQaWmpiouLWfcaAPa5srIy+f1+ZWdnKy8vj88FAAAAANhCXV1dkSW8g8Gg2tvbNTIyoqqqKh4gAXDL5ufn1d7errm5uXXnk5OTVVVVpZSUlA23AXAFRUwAAAA7wDAMlZaWyufzqaWlRaurq1HzPT09mpmZUW1tLW2sAWCPW11d3fB7vc1m05EjRyheAgAAAIAttrq6qsnJyZhxv9+vhoYG5efnq6ysTA4Ht08B3JhgMKje3l4NDAysO2+321VaWqqCggKu9QA3iOXkAAAAdlBaWppOnDih1NTUmLmZmRmdOXNG09PTOx8MALAjxsbGNm0rLomLWgAAAACwDZxOp06dOqXs7Ox154eGhvTKK6+ora1N8/PzO5wOwG7T09OjX//61xsWMGVlZenUqVMqLCzkWg9wEyglBgAA2GFOp1OHDx9WX1+fenp6ouYCgYDGx8eVlpZmTTgAwLYIhULq7OzU8PCwJKm9vV1er1dJSUkWJwMAAACA/cPpdKq2tla5ublqb2/X0tJS1Hw4HNbw8LCGh4eVkpKigoICZWZmymajLwSAaKZpKhQKxYx7PB5VVlYqPT3dglTA7kcREwAAgAUMw1BJSYl8Pp+am5sjy8slJSWpoqLC4nQAgK20uLiopqYmLSwsRMbC4bCampp0/Phx2e12C9MBAAAAwP6TlpamkydPqr+/X319fQqHwzHbzM3NaW5uTgkJCcrLy1NhYaESEhIsSAsgHuXn56uvry/y3jAMFRcXq7i4mMJH4DbwrwcAAMBCqampOnnypNLT02Wz2VRbW8vNbADYQ0ZHR3X27NmoAqY1Xq/XgkQAAAAAAEmy2WwqKSnRyZMnlZWVteF2gUBA/f39O5gMgNVM09T09LQaGxu1vLy87jYul0uZmZmSpMzMTJ08eVKlpaUUMAG3iU5MAAAAFktISNDBgwe1uLjIskIAsEeEQiG1trZqZGQkZs5ms6mqqkq5ubkWJAMAAAAAXM3j8aiurk4rKyuRpeTWuqavyc7OpgsTsA8Eg0GNjIxoaGgostxkYmKiysrK1t2+rKxMFRUVcrvdOxkT2NMoYgIAAIgDhmFsWsC0tLSkjo4OVVVV8QsRAMQ5j8ejtra2dZ/US0pKUl1dnRITEy1IBgAAAADYiMvlUmlpqYqLizUxMaGhoSHNzs5KurJs1EZGR0eVmJhIt11gF/P7/RoaGtLY2FjM8pLDw8MqKSlZt8MS13eArUcREwAAQJwLh8Nqbm6W3+/X2bNndeDAgUibWgBA/DBNU1lZWSotLV23gCkvL08VFRUsGwoAAAAAccxmsyk7O1vZ2dlaWFjQ5OTkhgVKoVBI7e3tCoVC8nq9ys/PV1ZWFr/3AbtAOBzW+Pi4BgcH5ff7N9wuEAhofHxcOTk5O5gO2L8oYgIAAIhzXV1dkV+igsGgGhsbVVBQoLKyMi6IAECcCAQC6u3tVUVFRcyc3W5XdXW1srOzLUgGAAAAALhVSUlJm3ZPHx0dVSgUknSlk0tra6s6OzuVm5ur/Px8eTyenYoK4AYtLS1Flo4MBoObbpuYmKj8/HxlZGTsUDoAFDEBAADEsWAwqMnJyZjxwcFBTU1N6cCBA/L5fBYkAwCsmZ2dVVNTk1ZXV2PmkpOTVVtbS3txAAAAANhjTNPU0NBQzHgwGNTAwIAGBgaUlpYWKYAwDMOClACkK/9ep6amNDQ0pKmpqU23NQxDmZmZys/Pl8/n498usMMoYgIAAIhjDodDJ06cUGtrqyYmJqLmlpaWdP78eRUVFam0tHTdNbkBANvP5XJFnry9Wn5+vioqKvj+DAAAAAB70NqS4sFgUCsrK+tuMz09renpablcLuXl5SkvL09Op3OHkwJYWVnR5cuXN93G6XRG/p26XK4dSgbgWhQxAQAAxDmHw6G6ujoNDQ2pq6tL4XA4ar6/v1+Tk5OqqamR1+u1KCUA7F9ut1vl5eVqb2+XdOWp28rKSpWUlFicDAAAAACwXWw2m0pKSlRcXKzJyUkNDQ1penp63W1XVlbU09Oj3t5eZWVlKT8/XykpKXR4AXaI2+1WRkbGuqsepKamRjqm8SAaYD2KmAAAAHYBwzBUUFCgtLQ0tbS0yO/3R80vLi6qoaEhcuGEX7YAYGfl5eVpZGREfX196urq0qlTp6yOBAAAAADYAWtLT2VmZmpxcVHDw8MaGRlRMBiM2dY0TY2NjWlsbExFRUUqLy+3IDGwN4VCIS0uLm74oG9+fn6kiMlutys3N1f5+flKTEzcyZgAroMiJgAAgF0kMTFRx44dU39/v3p6emSaZtR8b2+vJicndeDAASUnJ1uUEgD2ptnZWSUnJ8tut8fMGYahsrIy/exnP7MgGQAAAAAgHiQmJqqiokKlpaUaHx/X4OCg5ufn1902MzNzh9MBe9Pi4qKGhoY0MjIim82m17/+9es+5JuWlqbMzEylp6crOzt73es7AKxHERMAAMAuYxiGiouLlZ6ertbW1pgLIfPz82poaFB5ebkKCwstSgkAe0coFFJ3d7cGBweVn5+vqqqqdbfj4hcAAAAAQPqPLi+5ubmam5vT0NCQxsfHFQ6HJUnJyckbdotZ24ZO68DGTNPUxMSEhoaGNDMzExkPhUKamJhQdnZ2zNcYhqH6+vodTAngVlDEBAAAsEslJyfr2LFj6uvrU19fX1RXJtM05XDwox4A3K65uTm1tLRoaWlJkjQ0NKTMzEylpaVZnAwAAAAAsBukpKQoJSVFFRUVGhkZ0dDQkPLz82UYxrrbj4yMqLe3N7LUlcvl2uHEQPxaWVnR8PCwhoeHtbq6uu42Q0ND6xYxAdgdKOHdRouLi3rqqad06tQppaenKykpSTU1NfrYxz6m3t7e295/aWmpDMO4qT89PT0x+/nkJz95w1//4osv3nZuAACwdWw2m0pLS3Xs2LGotbszMjKUk5NjYTIA2N3C4bC6urp07ty5SAHTmtbWVgWDQYuSAQAAAAB2o4SEBBUVFemOO+7Y8LqdaZoaGhrS6uqq+vr69Otf/1qNjY2anp6OeoAR2E9M09TMzIyampr06quvqre3d8MCJulKJ7S1jmYAdh8ez98mHR0duu+++9Te3h413traqtbWVn3lK1/R888/rz/4gz/YsUw+n0+5ubk7djwAALBzvF6vTpw4oZ6eHo2MjKi6unrDp7kAAJvz+/1qaWnR4uJizJzNZlNhYSFLxwEAAAAAbsla44D1zM3NaWFhIWpsYmJCExMT8ng8ys/PV25uLh3YsS8Eg0GNjo5qaGho3Ws0V3M4HMrLy1NeXp48Hs8OJQSwHfiE2wZ+v1/3339/pIDpAx/4gB5++GF5PB6dPn1aTz75pObm5vTOd75TL7/8so4ePXpLx3nhhRc2rTKVpJ///Of6L//lv0iS3vGOd8jtdm+6/aVLlzadLysru7mQAABgx9hsNpWXl6u4uHjTCxnT09NKTU2lyAkArhEOh9XX17dh51yv16uampqozncAAAAAAGyV6enpDeeWlpbU2dmp7u5uZWdnKzc3V16vVzYbC+9g7xkaGlJnZ+d1OyqlpKQoPz9fWVlZ/FsA9giKmLbBZz7zGbW1tUmSnnrqKX384x+PzN1555269957dc8992hxcVGPP/74LS/RVl1dfd1t/uf//J+R13/yJ39y3e0PHjx4S1kAAED82KyAaXJyUpcvX1ZqaqoOHDhw3QJnANgv5ufn1draqvn5+Zg5wzBUWlqqoqIiCkABAAAAANumtLRUmZmZGhoa0ujo6LoFHOFwWCMjIxoZGZHNZpPX65XP51NqaioPLmLPcLvdGxYw2Ww25eTkKC8vT16vd4eTAdhulCNusUAgoC9+8YuSpNraWn3sYx+L2eYNb3iD3ve+90mSXnrpJb322mvbkmV2dlY//OEPJUnl5eW6++67t+U4AABgdwgEApFC65mZGZ05c0bDw8MyTdPiZABgHdM01dfXp4aGhnULmJKTk3X8+HEVFxdzIRgAAAAAsO2Sk5NVXV2tO++8U5WVlZt2Aw6Hw5qdnVVfX5+am5t3MCVwawKBgCYnJ9XZ2amGhgZNTU2tu11aWlrMsnAej0cVFRW68847VV1dTQETsEfRiWmLnT59WrOzs5Kk97znPRu2rXv00Uf19NNPS5K+//3v69SpU1ue5dvf/raWl5cl3VgXJgAAsLd1dHRELUUbCoXU1tamiYkJVVdXy+VyWZgOAHbe4uKiWlpa5Pf7Y+YMw1BxcbGKi4tpRw4AAAAA2HEOh0MFBQXKz8/X7OyshoaGNDExseEDiT6fb8OHb6amphQMBuXz+bgGiB21srKi2dnZyJ+FhYWo+dnZWaWnp8d8nWEYysvLU1dXlzIzM5Wfn0+nMWCfoIhpi/3yl7+MvL7nnns23O7kyZNKTEzU4uKiXn755W3J8g//8A+SrnyTf/e7370txwAAALtHbm6uZmdntbKyEjU+NTWlM2fOqLKyUtnZ2fwiCGDfGBgYWLeAKTExUTU1NTzRBwAAAACwnGEYkaXiVlZWNDIyovHx8ZhiEJ/Pt+E+BgYGND09LenKMl0+ny/yx+PxcD0QW8I0TS0vL0cKlmZmZiINNzYyMzOz4VxeXp6ys7MpvAP2GYqYtlhTU1PkdU1NzYbbORwOVVZW6uLFi9vS3rG7uztSHHX33XervLz8hr7urW99q86fP6+ZmRmlpqaqrq5Ov/d7v6fHHntMaWlpt5xnYGBg0/nh4eHI64WFBc3Nzd3ysYDbdfUyIustKQLsNM5JbBW73a4DBw5oYGAgpk1vMBhUS0uLhoeHVVRUpISEhHX3wfmIeML5iNuVlZWliYkJBQKByFh2drby8vJkmuZN/17COYl4wvmIeMM5iXhy7U1fAAB2C5fLpZKSEpWUlCgQCGhubk4zMzOanZ1Vamrqul9z7e+3y8vLWl5e1ujoqCQpISFBPp9Pqamp8vl8SkpKoqgJN2VsbEwTExOanZ2NWgngRvj9foXD4XW7YDscDjkclDMA+w3/6rfYWrFOUlLShj8srCkqKtLFixc1Pj6ulZWVLa0i/Yd/+IdIO8mbWUruZz/7WeT1+Pi4XnrpJb300kv69Kc/reeee05vf/vbbylPUVHRDW/7ve99b9NqcWAnff3rX7c6AhCFcxJbJTU1VeXl5XI6nVHjs7OzmpiYUHd394brka/hfEQ84XzErfL5fKqtrdXS0pI6Ozu37MY65yTiCecj4g3nJKw2OztrdQQAAG5bQkKCMjIylJGRsel28/PzCoVCG84HAgFNTExoYmJC0pUHIa/u1OT1ellmHZuanp7W+Pj4DW9vs9nk9Xoj5xgAXI0ipi22thRBcnLydbdNSkqKvJ6fn9/SIqa1i0Eej0fveMc7rrv9oUOH9Id/+Ie64447lJ+fr0AgoNbWVj3//PN64YUXNDMzoz/6oz/Sj370I/3+7//+luUEAADWmJmZ0YULF1RaWqqsrKyouYSEBFVXV2tyclLd3d0KBoMWpQSArWEYRuQhj2vNzs6qra1NMzMzCofDO5wMAAAAAIDtl56errm5uRu6zhcKhTQ1NRV5wLGyslIFBQXbHRFxKBQKaW5uTrOzswoGg6qsrFx3O5/Pp5GRkQ33Q2EcgJtBEdMWW1vX89quBuu5umhpaWlpyzL86le/UmdnpyTp7W9/u1JSUjbd/vHHH9cnP/nJmPHXve51+pM/+RM9/fTT+tCHPqRQKKT3v//96uzslNvtvqlM/f39m84PDw/rjjvukCQ99NBDqq6uvqn9A1tpfn4+Ugj47ne/+4aKEoHtxDmJ7TYzM6P+/v6YixgZGRnKyclRUVFRpMMk5yPiCecjrsc0TU1OTmpkZETV1dU39Hva7eCcRDzhfES84ZxEPGlra9OTTz5pdQzEufn5eTU0NOg3v/mNfvOb3+i1115TT0+PJKmkpCTyeiv96le/0pe//GX927/9m0ZHR5WamqojR47o0Ucf1R//8R9v+fEA7A9er1eHDh2SaZpaWFjQ7Oxs5M+NLP21Uaectd+5fT6fEhIStjo2LHDtEoXz8/ORh8IMw1BZWZnsdnvM1117jqwtUbi2TCFLFAK4Gfu2iGkrvlF+9atf1aOPPho1tlbccyMf+isrK5HXHo/ntvOs+Yd/+IfI6/e85z3X3f56y9499thjeu211/Tss89qaGhI3/3ud/Wud73rpjIVFhbe8LZJSUnXLbwCdkpycjLnI+IK5yS2Q0pKinJzc9Xe3h5pG70mGAxqeHhYhYWFMU/HcD4innA+4lorKytqa2uLPDk6NDSkQ4cO7dhFM85JxBPOR8QbzklY7eoO+cBGHnjgAb344os7drxPfvKT+p//839GdQcdHR3VCy+8oBdeeEHPP/+8/s//+T83/YAxAKwxDEPJyclKTk5WQUGBTNPU8vJypKBpZmYm0qxhjcPh2PBz0+/3q7GxUdKVz9arO+1s5eoz2D4rKytRRW0LCwsbbmuapvx+/7r3ld1ut/Lz85WcnCyfzyePx0PREoBbtm+LmLaL1+uVdOUpjeu5+oNgq54+W1lZ0be//W1JUl5ent7ylrdsyX4fe+wxPfvss5Kkl1566aaLmAAAQHxzOp2qq6vT+Pi42tvbo7oyHThwgPa+AHYN0zQ1Njamjo6OqO9l09PTGhkZUV5enoXpAAAAsFtcvRxxenq6Tp48qV/96lc3dO3/Zj399NP6q7/6K0lSRUWF/tt/+286dOiQhoaG9IUvfEGnT5/Wj3/8Y733ve/VN77xjS0/PoD9yTAMeTweeTwe5ebmSootanG73RsWo8zOzkZeLywsaGFhQUNDQ5KuFLVcXdREUUt8CAaDmpiYiPz/vdmVgmZmZtYtYjIMQ1VVVVuUEsB+t2+LmJqbm297H+td/C4sLNSrr76qhYWFDb+Rr1lbYi0rK2vLKpJ/9KMfaXp6WpL0yCOPrNvS71bU1dVFXg8ODm7JPgEAQHwxDEPZ2dny+Xxqb2/X5OSkCgoKrtu1EQDixerqqtra2jQ5Obnu/GZPFAIAAABXe+SRR/TYY4/p1KlTqqyslCSVlpZueRHT1NSUPvGJT0iSiouL9etf/1qZmZmR+T/4gz/Qgw8+qB/96Ef65je/qQ9+8IO69957tzQDAKxxuVzKzs5Wdna2pOiCzmtdXcR0reXlZS0vL2t0dFTSleXFUlNTlZKSIpfLJbfbHWkMga0TDocVDAZlGMa6S/wFg0G1trbe9H69Xq98Pp/S0tK2IiYAbGrfFjHV1NRsy37r6ur03e9+V5LU0tKi17/+9etuFwwG1dnZKUmqra3dsuPf7FJyN4rqaAAA9g+Xy6X6+nqNj48rIyNjw+2u7nACAFbaqPvSGqfTqerq6k2/pwEAAABX++AHP7gjx/nKV74SKQT49Kc/HVXAJEl2u11f/vKX9ZOf/EShUEif+cxnKGICsGM2uz9oGIZsNlvUMpgbCQQCGh8f1/j4uCQpIyNDBw8eXHfbgYEBzc/PKyEhYcM/Dodjz9+7NE1TwWBQgUDgun+CwaBWV1cVCoUkSUVFRSovL4/Zp8vlksvl0srKyobHtdlskaKltcKzrWqaAQA3Yt8WMW2Xu+++O/L6pZde2rCI6cyZM5GngO+6664tOfb4+Lj+5V/+RZJ09OhRHTp0aEv2K0lNTU2R1/n5+Vu2XwAAEJ/WujJtpr29XYmJiaqoqFBiYuIOJQOAaHNzc+rs7NTc3Ny689nZ2aqsrFz3CUQAAADAaj/4wQ8kSSkpKXrooYfW3aawsFBvfvOb9dOf/lS/+MUv5Pf76WACwHL19fUKh8Py+/1RS9CtFdJsZrPf0aenpzU1NXVD+7j2j9frjctl5E3TVDgcjik+SkxM3PD7+WuvvXbTy72tCQQC644bhiGfz6exsbHImN1uj1r6z+v1ymaz3dJxAWArUMS0xe699175fD7Nzs7qa1/7mp544ol1K4Gfe+65yOsHH3xwS479zW9+M/KhtJVdmKQra3Kvueeee7Z03wAAYPfJycmJtIWenp5WQUGBSkpK5HDw4yWAnbG6uqqurq5Ia/prJSQkqKqqSllZWTucDAAAALgxq6ur+s1vfiNJuvPOO+V0Ojfc9p577tFPf/pTrays6MyZM3rTm960UzEBYEM2my1S/CJdKdZZWFiIKmpaXV2N+brNipg2KsBZb7trtw0E/v/27jw+iirf//+7s3T2hWyQkCYBQkQGBr0siqMjKKKCqODOVUFkGLcZ9TIuM35VGK8Lyozb6AgXlNHBXVQUF0QDI5uAooMiQgKELCzZIPvSSf3+YNK/xHRn7e5K0q/n49EPKn1OVX2KPjmprvrUOXUuk5h++uknFRcXtzrC089f7UnmOXbsmGpra9scLcnZ1Hw2m81lElNXrrO29n8YExOjhoYGx+cWHh7e60e1AtCzcJfJzaxWq37/+9/roYce0o8//qhFixbprrvualZn8+bNWrZsmaQTXzzGjBnjdFuNfzBSUlJ04MCBNvfdOJVcQECAZsyY0a54d+7cqZCQEMec3s4sWbJES5culST169fPbUlXAACgZwoICJDNZnP8bBiGcnNzdeTIEQ0cOFD9+vXjiy8Aj2loaFBeXp6ys7NdPt0ZFxenIUOGtHoTCAAAADDbnj17HOe0Q4cObbVu0/Iff/yxQ0lMubm5rZYfOnTIsVxWVuZylFN3Ky8vd7oMdAXtqnuIiIhQRESE+vfvr9raWpWXl6u8vFw1NTWy2+0yDMNlX9PaVGdtaW27FRUVqq2tdZpU5Yqfn5/8/Pw0cOBA7d+/32mb2r17d6djrqiocBlvV66vVldXu9xuSEiI49quYRgqKyvr9H7QOfRT8ASz2pUn+hCSmDzgrrvu0htvvKE9e/bo7rvvVmZmpq6++mqFhIQoIyNDjzzyiOx2u0JCQvTUU0+5ZZ+7du3S119/LUm64IIL2pz+pdHXX3+tOXPmaMKECbrwwgs1YsQIxcbGym63a/fu3VqxYoXWrFkj6cRwgkuWLFFYWJhbYgYAAD1TcHCw07nu6+rqtGfPHuXn5ystLc3xBBYAuJPdbtfBgwedJjCFhIRo0KBBio2NJZkSAAAA3V7T5KLk5ORW6zZ9mCgnJ6dD+2m6blteeeUVU77Pv/LKK17fJ3o/2lXP1K9fPwUFBSkgIECBgYEKCAhwLPv7+7e67r///W+tXr3aadnw4cMVHh7eoVgaGhrU0NDgGBXJWZv6xS9+0ekpPjMzM/XRRx85LRs8eLBjdOn6+nrZ7XbV1dW1+m/T5c8//7xTMcG76KfgCd5sV8ePH3f7Nkli8oCIiAitXr1akydP1t69e7VkyRItWbKkWZ3IyEitWLFCp5xyilv22TgKkyRdf/31HVq3vr5ea9eu1dq1a13WiY2N1bJlyzR16tROxwgAAHqH8vJyffvtt7roootUUFDQYijkxvKEhAQNGjRIQUFBJkUKoDeyWq1KSUlRVlaW4z1/f38NGDBAycnJ7RrqHQAAAOgOmj653taN9aYPFzNqA4De7PDhwy7LLBZLi8Smpv+2NiJIV6Zns9vtLsvaO/1do4aGBkeyUWsjOB08eFA5OTkup6IDgN6KJCYPSUtL044dO/Tcc8/prbfeUmZmpmpra2Wz2TR58mTdfvvtSklJccu+GhoatGLFCklSdHS0Lr744navO3nyZC1btkybN2/Wjh07dOTIERUVFckwDMXExGjkyJG64IILNGvWLEVGRrolXgAA0PM1NDSof//+Sk1NVVZWloqKilrUOXr0qAoLCx2JBW09KQUA7ZWUlKRDhw6psrJSffv21aBBg5g6DgAAAD1OdXW1Y7mt89mmDwhVVVV1aD9tjdx06NAhjR07VpJ03XXXqX///h3afmeVl5c7Rgq47rrrOjxCCuAM7QquVFZWqq6uzjGqkbNXY9nPNSYqOWtTubm5Ki0tdSRWNb78/f1bvBcQECA/Pz9Gj/Zx9FPwBLPaVV5enh599FG3bpMkJg8KCwvT3XffrbvvvrtT67c3q9bPz6/Dw8c2SkhI0OzZszV79uxOrQ8AAHxbSEiIhg8fruLiYmVlZamysrJZeUNDgw4cOKBDhw5p8ODBiouL40s6gDYZhqHDhw8rNjbW6c0cPz8/paeny2Kx8LAFAACAD3PH98uXXnpJs2bN6nownRAcHOxYrq2tbbVu09E6QkJCOrSftqaqayoiIsKUc+zw8HDO7eF2tCs01d62YBiGY6Skuro6HT9+XN99950k521q2LBhbo8VvoN+Cp7gzXZVWlrq9m2SxAQAAIAui4mJUXR0tPLz85Wdnd3iiaWamhrt2rVLffv21dChQ02KEkBPcOzYMWVlZam8vFyJiYlKT093Wi8qKsrLkQEAAADuFRER4Vhua4q4iooKxzIjNgCA5zROWRcYGOj4uaMj4AEAOo8kJgAAALiFn5+fkpOTlZCQ4Bh96ediYmJMiAxAT1BdXa19+/apoKDA8d6hQ4eUmJjY7OYOAAAA0OjHH3/s8jYSExPdEEnnNB0hKTc3t9W6TWdjsNlsHosJAAAAMBNJTAAAAHArq9Wq9PR0JSUlKTMzU8ePH5d0YtSU+Ph4k6MD0N3U19crJydHOTk5amhoaFGelZWlkSNHMhUlAAAAWujpI/2mp6fL399f9fX12r17d6t1m5affPLJng4NAAAAMIWf2QEAAACgdwoPD9fIkSM1bNgwBQcHKy0tzWUSgrPEBQC9m2EYKigo0LZt25Sdne20HwgNDVVKSgoJTAAAAOiVrFarxo4dK0navHmzamtrXdZdv369JCkoKEijR4/2SnwAAACAt5HEBAAAAI+xWCyKj4/X2LFjFR4e7rLerl279P333zO/POAjysvL9d1332nXrl2qqalpUR4QEKC0tDSNHj1affr0MSFCAAAAwDsuvfRSSVJpaalWrlzptE5ubq7Wrl0rSTr33HOZbhkAAAC9FklMAAAA8LjWRlEpLi5WUVGRioqKtG3bNu3bt092u92L0QHwlrq6Ou3Zs0dff/21Y6rJn0tKStLYsWPVv39/RmACAABAj3bgwAFZLBZZLBaNHz/eaZ05c+YoKipKknTvvfeqqKioWXl9fb1uueUW1dfXS5Luuusuj8YMAAAAmCnA7AAAAADguxoaGpSVleX42TAM5eTk6MiRIxo4cKD69u1LEgPQCzQ0NCg/P1/Z2dkukxSjoqKUlpbW6qhtAAAAgLdkZmZqw4YNzd4rLy93/Lt8+fJmZRdccIH69evX4f3ExMRo4cKFuummm5Sdna3TTjtN9913n0aMGKH8/Hw99dRTysjIkCRdc801LpOhAAAAgN6AJCYAAACYprKyUnV1dS3er62t1U8//aT8/HylpaUpMjLShOgAuEtVVVWzhMWmgoKCNHjwYMXFxZG0CAAAgG5jw4YNuuGGG5yWFRUVtSjLyMjoVBKTJP32t79Vfn6+HnroIWVlZWn27Nkt6kyePFkvvvhip7YPAAAA9BRMJwcAAADThIeHtzptVFlZmXbs2KHdu3erpqbGhAgBuENYWJiSkpKavefn56fU1FSNGTNG8fHxJDABAADApy1YsEAbNmzQjBkzZLPZZLValZCQoPPOO0+vvvqqVq9ereDgYLPDBAAAADyKkZgAAABgqoCAAKWlpSkxMVFZWVkqKSlpUefIkSMqLCzUgAEDlJycLD8/cvGBniY1NVVHjx6V3W5XQkKCBg0apKCgILPDAgAAAJyaNWuWZs2a1aVtpKamyjCMdtc/44wzdMYZZ3RpnwAAAEBPRhITAAAAuoWwsDCNGDFCxcXFysrKUlVVVbPy+vp67d+/X4cPH9agQYMUGxvLyC1AN2IYhgoKChQXF+c00TAwMFDp6emyWq2KiooyIUIAAAAAAAAAQHdGEhMAAAC6DYvFotjYWPXp00d5eXnKzs5WfX19szpVVVX64YcflJiYqPT0dJMiBdDIMAyVlJTowIEDKisr06BBg2Sz2ZzWjY+P93J0AAAAAAAAAICegiQmAAAAdDt+fn6y2Wzq27evY/Sln4uMjDQhMgCNGhoaVFBQoJycHFVUVDjez87OVt++fWW1Wk2MDgAAAAAAAADQ05DEBAAAgG7LarXqpJNOUmJiorKyslRaWup4PyEhweToAN9kt9t1+PBh5ebmqqampkV549SPJ510kgnRAQAAAAAAAAB6KpKYAAAA0O1FRkbqlFNO0dGjR7Vv3z71799ffn5+TuuWlZWppKRESUlJCgjgdBdwl9raWuXl5Sk/P192u91lvZCQEMXFxXkxMgAAAAAAAABAb8BdHQAAAPQIFotFffv2bTM5IicnRwUFBTp48KASExOVnJysoKAgL0UJ9D6VlZXKzc3V4cOHZRiGy3ohISGOaSBdJRkCAAAAAAAAAOAKSUwAAADoUfz9/V2WVVVVqaCgQNKJKa1yc3OVl5enhIQE2Ww2hYWFeStMoMc7fvy4cnJyVFRU1Gq9yMhI2Ww2xcbGymKxeCk6AAAAAAAAAEBvQxITAAAAeo3c3NwW7xmGoSNHjujIkSOKiYmRzWZTVFQUyRZAG/Ly8lpNYIqNjXX8PgEAAAAAAAAA0FUkMQEAAKDX6Nevn+rq6hyjMf1ccXGxiouLFRERIZvNpri4OJKZABdsNluL36XGaR1tNptCQ0NNigwAAAAAAAAA0BuRxAQAAIBeIyIiQsOGDVNVVZVyc3N1+PBhNTQ0tKhXVlamXbt2KTg4WDabTX379m11mjqgt7Lb7fLz85Ofn1+LsoiICEVHR+vYsWPy9/dXUlKS+vfvr6CgIBMiBQAAAAAAAAD0diQxAQAAoNcJCQnRkCFDlJKSovz8fOXl5clut7eoV11drb179+rAgQOy2Wyy2WwmRAt4X01NjXJzc3Xo0CENHjxYiYmJTuulpKQoJiZGiYmJCgjg6yMAAAAAAAAAwHO4Cg0AAIBey2q1KjU1VTabTYcPH1Zubq6qq6tb1Kurq1Ntba0JEQLeVVFRoZycHB09elSGYUiScnNz1a9fP6dTK0ZHRys6OtrLUQIAAAAAAAAAfBFJTAAAAOj1/P391b9/fyUlJamgoEA5OTkqLy93lFssFvXv39/ECAHPMQxDx48fV05OjoqLi1uUV1ZWqqioSHFxcSZEBwAAAAAAAADACSQxAQAAwGdYLBYlJCQoPj5ex44dU05OjkpKSpSQkKDg4GCn69TV1amsrEx9+vRxOlIN0F0ZhqHCwkLl5OSorKys1brl5eUkMQEAAAAAAAAATEUSEwAAAHyOxWJRnz591KdPH5WXl8vf399l3by8PGVnZyssLEw2m03x8fHy8/PzYrRAx9TX1+vIkSPKyclxOn1iIz8/P/Xr10/JyckKCQnxYoQAAAAAAAAAALREEhMAAAB8Wnh4uMuy+vp65efnS5IqKiq0e/du7d+/X8nJyUpMTGw1+Qnwtrq6OuXl5Sk/P191dXUu6wUEBDimV7RarV6MEAAAAAAAAAAA10hiAgAAAFw4fPhwi2SQmpoaZWVlKTs7W4mJiYqPj1d4eDhTzcF0O3fubHXauODgYCUnJ6tfv34k4AEAAAAAAAAAuh2SmAAAAAAXrFarQkJCVFVV1aLMbrcrJydHOTk5CgoKUlxcnOLi4hQVFUVCE0yRlJSkn376qcX74eHhjqkQaZsAAAAAAAAAgO6KJCYAAADAhfj4eMXFxamoqEg5OTkqLS11Wq+mpkZ5eXnKy8tTYGCgYmNjFRcXp5iYGJJG4Bb19fUqLi5WYWGh0tLSFBgY2KJOQkKC9u/fr9raWklSnz59ZLPZFB0dTTsEAAAAAAAAAHR7JDEBAAAArbBYLI5Rlo4fP66cnBwVFRW5rF9XV6fDhw+rqKhI48aN82Kk6G3q6upUVFSkwsJClZSUqKGhQZIUExOjvn37tqjv5+cnm82msrIy2Ww2hYeHeztkAAAAAAAAAAA6jSQmAAAAoJ2ioqIUFRWliooKHT58WIWFhaqurnZaNy4uzuXoN4ZhMDIOnKqpqVFhYaEKCwt17Ngxp3UKCwudJjFJUnJysgejAwAAAAAAAADAc0hiAgAAADooLCxMgwcP1qBBg1RRUeFIOqmoqHDUiYuLc7n+999/r4aGBscIT0FBQd4IG91UVVWVCgsLVVBQoLKysjbrFxcXq76+Xv7+/l6IDgAAAAAAAAAA7yCJCQAAAOgki8Wi8PBwhYeHKzU11ZGMUlJSoujoaKfr1NXVqaSkRIZh6NixY8rMzFRERIQjoSk0NNS7BwFTVFRUqKCgoEXyW1uio6NbTZADAAAAAAAAAKCnIokJAAAAcJOQkBDZbDbZbDaXdYqKimQYRrP3ysrKVFZWpv379yssLMyR0BQWFsa0c73U4cOHlZub22Y9Pz8/9enTR3FxcYqNjVVgYKAXogMAAAAAAAAAwPtIYgIAAAC8qKioqNXyiooKVVRUKDs7W8HBwY6EpsjISBKaehjDMFx+ZnFxcS6TmPz9/RUbG6u4uDjFxMQwbRwAAAAAAAAAwCeQxAQAAAB40dChQ1VcXKzCwkIVFRWpvr7eZd3q6mrl5uYqNzdXgYGBiouL0+DBg0lq6cbq6+tVUlLi+HxHjx6toKCgFvUiIyNltVpVW1srSY7PNy4uTtHR0fLz8/N26AAAAAAAAAAAmIokJgAAAMCL/P39FR8fr/j4eDU0NOjYsWMqLCxUYWGh6urqXK5XV1enkpISklu6odraWkfiUnFxsRoaGhxlhYWF6t+/f4t1LBaLEhMTZbfbFRcXp6ioKEbaAgAAAAAAAAD4NJKYAAAAAJP4+fkpJiZGMTExGjJkiEpLSx0JTdXV1S3qx8XFuUx0yczMlGEYCgsLU2hoqEJDQ2W1Wj19CD7DMAzV1taqoqJClZWVjldFRYXsdrvL9VwlMUlSamqqh6IFAAAAAAAAAKDnIYkJAAAA6AYsFouioqIUFRWlQYMGqaKiwpHQVFFRIelEEpMzhmHoyJEjLZJpAgICmiU1hYaGKiwsTFarlVF/OmDv3r06cuRIq1P/uXL8+HHZ7XYFBPDVCwAAAAAAAACA1nAlHQAAAOhmLBaLwsPDFR4ertTUVFVWVqq4uFiRkZFO69fV1TkdDchut+v48eM6fvx4s/f9/f0dCU2hoaGKiYlRWFiYR46luzIMQ1VVVY4Rlfz9/V2OmCSpwwlM0dHRiouLU1xcHAlMAAAAAAAAAAC0A1fTAQAAgG6ucRQlVxpHamqv+vp6lZWVqaysTJIUGBjoMompqqpKwcHBPXbkpoaGBkey0s+ngjMMw1EvNDTUZRJTa//3jfz8/NSnTx/FxcUpNjZWgYGBbjsGAAAAAAAAAAB8AUlMAAAAQA8XHBzsGLGpoqJCVVVVamhoaPf6rhKY7Ha7tm7dKovF0mxKusZRnEJCQuTn5+euw+iyqqoqlZaWOpKUGv8v2ruuYRhOk7WaJjH5+fk5naKvJyd6AQAAAAAAAADQHZDEBAAAAPRwISEhSklJcfxsGIaqq6tbjDxUUVHhNLnJ1UhDlZWVju1VVFQ4HfGptUSmU089Vf7+/i3eP3bsmDIzM9t1bM6MGDFCQUFBLd4vKCjQ/v37O7XNxunlnP1fREREaMSIEQoNDVVQUBDJSgAAAAAAAAAAeABJTAAAAEAvY7FYFBISopCQkGbvG4ahmpqaZlOr2e12p4lG0v+fxNSa9o501FR9fX2Hp8Brquk0cE21Z9q3nwsMDHSMpuQqOSkgIEAxMTEd3jYAAAAAAAAAAGg/kpgAAAAAH2GxWBQcHKzg4OB2JeVUV1d7ISr3cTUtniRZrVan08AFBgZ6MUIAAAAAAAAAAOAKSUwAAAAAnEpNTVX//v2bjdzU+KqpqTE7vBaCg4MdI1A1Jik1JiwFBPDVBwAAAAAAAACA7owr+QAAAABcCgwMVFRUlKKiopq9b7fbVVlZqerqapfTu/n5+Tl9Pzw8XEOHDu1STM5YLBaNHTu209sFAAAAAAAAAADmIYkJAAAAQIcFBAQoMjJSkZGRHV43KChIffv29UBUAAAAAAAAAACgp3L+aDQAAAAAAAAAAAAAAAAAeAlJTAAAAAAAAAAAAAAAAABMRRITAAAAAAAAAAAAAAAAAFORxAQAAAAAAAAAAAAAAADAVCQxAQAAAAAAAAAAAAAAADAVSUwAAAAAAAAAAAAAAAAATEUSEwAAAAAAAAAAAAAAAABTkcQEAAAAAAAAAAAAAAAAwFQkMQEAAAAAAAAAAAAAAAAwFUlMAAAAAAAAAAAAAAAAAExFEhMAAAAAAAAAAAAAAAAAU5HEBAAAAAAAAAAAAAAAAMBUJDEBAAAAAAAAAAAAAAAAMBVJTAAAAAAAAAAAAAAAAABMRRITAAAAAAAAAAAAAAAAAFORxAQAAAAAAAAAAAAAAADAVCQxAQAAAAAAAAAAAAAAADAVSUwAAAAAAAAAAAAAAAAATEUSEwAAAAAAAAAAAAAAAABTkcQEAAAAAAAAAAAAAAAAwFQkMQEAAAAAAAAAAAAAAAAwFUlMAAAAAAAAAAAAAAAAAExFEhMAAAAAAAAAAAAAAAAAU5HEBAAAAAAAAAAAAAAAAMBUJDEBAAAAAAAAAAAAAAAAMBVJTAAAAAAAAAAAAAAAAABMRRKTB5SXl+tf//qXFi1apCuvvFIDBw6UxWKRxWJRamqqR/a5adMmXXvttUpJSVFwcLD69eun888/X6+99lqHtvPaa69p0qRJ6tevn4KDg5WSkqJrr71Wmzdv9kjcAAAAAAAAAAAAAAAAQIDZAfRGU6dO1bp167y2v/nz5+uhhx5SQ0OD470jR45ozZo1WrNmjVasWKG3335bwcHBLrdRVVWlyy+/XB999FGz9w8ePKgVK1botdde0wMPPKAHH3zQY8cBAAAAAAAAAAAAAAAA38RITB5gGIZjOSYmRpMmTVJ4eLhH9rV48WItWLBADQ0NGjx4sJYtW6atW7fqvffe04QJEyRJq1ev1uzZs1vdzuzZsx0JTBMmTNB7772nrVu3atmyZRo8eLAaGho0f/58LVmyxCPHAQAAAAAAAAAAAAAAAN/FSEweMGPGDP32t7/VmDFjlJaWJklKTU1VeXm5W/dTXFyse+65R5I0YMAAbdmyRXFxcY7yiy66SNOmTdMHH3yg1157TXPnztX48eNbbOeLL77Q66+/LunEKFLvvvuu/P39JUljxozRxRdfrFGjRungwYO65557dMUVV6hPnz5uPRYAAAAAAAAAAAAAAAD4LkZi8oC5c+fqmmuucSQwecrSpUt1/PhxSdLChQubJTBJkr+/v55//nlHQtITTzzhdDuLFi2SJAUEBDSr3yguLk4LFy6UJB07dkxLly5163EAAAAAAAAAAAAAAADAt5HE1IO99957kqTIyEhNnz7daZ3k5GRNnDhRkvT555+rrKysWXlZWZk+//xzSdLEiROVnJzsdDvTp09XZGSkJOndd991R/gAAAAAAAAAAAAAAACAJJKYeqza2lpt3bpVkjRu3DhZrVaXdc8++2xJUk1NjbZv396sbNu2baqtrW1Wzxmr1arTTz/dsU5dXV2X4gcAAAAAAAAAAAAAAAAaBZgdADpnz549qq+vlyQNHTq01bpNy3/88UdNmDDB8fOuXbuc1nO1nTVr1shut2vv3r0aNmxYu+PNzc1ttTwnJ8exvG/fvnZvF/CEiooKx1SNe/bsUVhYmMkRwdfRJtGd0B7RndAe0d3QJtGd0B7R3dAm0Z00vf5ot9tNjAToHpr+Hhw6dMhr+y0rK3P8bcjLy1NpaanX9o3ei3YFd6NNwd1oU/AEs9pV03NHd323shiGYbhlS2hVamqqsrOzlZKSogMHDnR5e5988okuvPBCSdITTzyhP/zhDy7rbt++XWPGjJEk3XvvvXr00UcdZffee68WLlwo6cQIS6NHj3a5nUWLFumuu+5y7P/8889vd7wWi6XddQEAAAAAAADAG7Zu3eq4dgr4qm3btmns2LFmhwEAAIAezF3frZhOrocqKytzLIeHh7dat+mTbeXl5R7ZDgAAAAAAAAD0NEeOHDE7BAAAAADAfzCdXA9VXV3tWLZara3WDQoKcixXVVV5ZDttaTpdnDP79+/Xr3/9a0nSpk2bZLPZOrR9wJ0OHTrkePJo69atSkxMNDki+DraJLoT2iO6E9ojuhvaJLoT2iO6G9okupOcnBydccYZkqShQ4eaHA1gvhEjRmjr1q2SpPj4eAUEeOfWEX8b4Am0K7gbbQruRpuCJ5jVrux2uwoKCiSdOKd0B59NYnLH9GYvvfSSZs2a1fVgOiE4ONixXFtb22rdmpoax3JISIhHttOW5OTkdte12Wwdqg94UmJiIu0R3QptEt0J7RHdCe0R3Q1tEt0J7RHdDW0S3UnT66OArwoODjZ9WkX+NsATaFdwN9oU3I02BU/wdrtKTU116/aYTq6HioiIcCy3NbVbRUWFY/nnU8a5azsAAAAAAAAAAAAAAABAZ/nsSEw//vhjl7dh5tBuTTPncnNzW63bdCq3n0/T9vPtjB49ulPbAQAAAAAAAAAAAAAAADrLZ5OYevpc5+np6fL391d9fb12797dat2m5SeffHKzsmHDhjmt19p2AgICNGTIkI6GDAAAAAAAAAAAAAAAADjFdHI9lNVq1dixYyVJmzdvVm1trcu669evlyQFBQW1GGlpzJgxslqtzeo5U1tbqy1btjjWCQwM7FL8AAAAAAAAAAAAAAAAQCOSmHqwSy+9VJJUWlqqlStXOq2Tm5urtWvXSpLOPfdcRURENCuPiIjQueeeK0lau3aty6npVq5cqdLSUknStGnT3BE+AAAAAAAAAAAAAAAAIIkkpm7rwIEDslgsslgsGj9+vNM6c+bMUVRUlCTp3nvvVVFRUbPy+vp63XLLLaqvr5ck3XXXXU6384c//EGSZLfbdeuttzrqNyosLNQ999wjSYqOjtacOXM6fVwAAAAAAAAAAAAAAADAzwWYHUBvlJmZqQ0bNjR7r7y83PHv8uXLm5VdcMEF6tevX4f3ExMTo4ULF+qmm25Sdna2TjvtNN13330aMWKE8vPz9dRTTykjI0OSdM0117hMhjrnnHN09dVX6/XXX9eqVat03nnn6Y477lBSUpJ27typhx9+WAcPHpQkLVy4UH369OlwrAAAAAAAAAAAAAAAAIArFsMwDLOD6G2WL1+uG264od31MzIyWiQYHThwQAMHDpQknX322Vq3bp3L9R988EE99NBDcvVRTp48We+8846Cg4NdbqOqqkqXX365PvroI6flfn5+uv/++zV//vxWjwUAAAAAAAAAAAAAAADoKKaT6wUWLFigDRs2aMaMGbLZbLJarUpISNB5552nV199VatXr241gUmSQkJCtHr1aq1YsULnnXeeEhISZLVaZbPZNGPGDG3YsIEEJgAAAAAAAAAAAAAAAHgEIzEBAAAAAAAAAAAAAAAAMBUjMQEAAAAAAAAAAAAAAAAwFUlMAAAAAAAAAAAAAAAAAExFEhMAAAAAAAAAAAAAAAAAU5HEBAAAAAAAAAAAAAAAAMBUJDEBAAAAAAAAAAAAAAAAMBVJTAAAAAAAAAAAAAAAAABMRRITAAAAAAAAAAAAAAAAAFORxAQAAAAAAAAAAAAAAADAVCQxwXTZ2dmaN2+ehg4dqrCwMMXExGjMmDF64oknVFlZaXZ48BEWi6Vdr/Hjx5sdKnq4o0eP6sMPP9QDDzygCy+8UHFxcY72NWvWrA5v7+OPP9a0adOUnJysoKAgJScna9q0afr444/dHzx6HXe0x+XLl7e7D12+fLlHjwc93/bt2/XnP/9ZkyZNcvRr4eHhSk9P1w033KANGzZ0aHv0kegKd7RH+ki4S2lpqV5//XXNmzdPZ599ttLS0hQVFSWr1aqEhASNHz9ejz/+uIqKitq1vU2bNunaa69VSkqKgoOD1a9fP51//vl67bXXPHwk6A3c0R7XrVvX7v5x/vz53js49Dr33HNPs/a0bt26NtfhHBJwv/Lycv3rX//SokWLdOWVV2rgwIGO38vU1FSP7JPzHd9RWVmpxx9/XGPGjFFMTIzCwsI0dOhQzZs3T9nZ2V3e/oEDB9p93tKZ67vwHm/dj+Rcwnd4sk1xTcm3uPveYXu89tprmjRpkvr166fg4GClpKTo2muv1ebNmz2yvw4xABOtWrXKiIyMNCQ5faWnpxt79+41O0z4AFdt8Oevs88+2+xQ0cO11r5mzpzZ7u3U19cbN954Y6vbmzNnjlFfX++5g0GP5472+NJLL7W7D33ppZc8ejzo2c4666x2taPrr7/eqKmpaXVb9JHoKne1R/pIuMtnn33WrnYUFxdnfPLJJ61u68EHHzT8/PxcbmPKlClGVVWVl44MPZE72mNGRka7+8cHH3zQuweIXmPHjh1GQEBAs/aUkZHhsj7nkIDnjB8/3uXvVUpKitv3x/mO79i7d68xZMgQl591ZGSk8cEHH3RpH/v372/3eUtHru/Cu7xxP5JzCd/i6TbFNSXf4s2/LZWVlcbkyZNd7s/Pz8+YP3++W/fZUQECTLJjxw5dddVVqqqqUnh4uP74xz9qwoQJqqqq0uuvv67/+7//0549ezRlyhRt375dERERZocMH3DzzTfrlltucVkeFhbmxWjQ2w0YMEBDhw7VmjVrOrzufffdp2XLlkmSTj31VN19990aPHiwsrKy9Pjjj2vHjh1aunSp4uPj9cgjj7g7dPRCXWmPjT799FMlJSW5LE9OTu70ttH75efnS5KSkpJ0xRVX6KyzztKAAQNUX1+vzZs36y9/+Yvy8vL08ssvq66uTq+++qrLbdFHoqvc2R4b0Ueiq2w2myZMmKBRo0bJZrMpMTFRDQ0Nys3N1dtvv62VK1eqsLBQF198sbZu3aqRI0e22MbixYu1YMECSdLgwYP1pz/9SSNGjFB+fr6efvppZWRkaPXq1Zo9e3a72jV8lzvaY6MXX3xRY8aMcVmekJDgiUNAL9fQ0KC5c+fKbrcrISFBR48ebXMdziEBzzEMw7EcExOj0aNHa9OmTSovL3f7vjjf8R1lZWWaMmWK9u7dK0n6zW9+o6uvvlohISHKyMjQo48+qtLSUl111VXauHGjTjnllC7v83//9391ySWXuCzv06dPl/cB9/PW/UjOJXyHt+9xc03Jt7jjXk1rZs+erY8++kiSNGHCBN1+++1KSkrSzp079cgjjygrK0vz589XYmKi5s6d65EY2mRqChV8WuPTzQEBAcamTZtalD/++OM8dQevoa3BWx544AHjgw8+MA4fPmwYRvMnedqbTf3TTz85niYdPXq0UVlZ2ay8oqLCGD16tKOPZUQ7uOKO9tj0iZD9+/d7Llj0elOmTDHeeOMNw263Oy0vKCgw0tPTHe1t/fr1TuvRR8Id3NUe6SPhLq7aYlPvvvuuo71NmzatRXlRUZERFRVlSDIGDBhgFBQUtNjH1KlT2zVaCXybO9pj05GYaGvwhCeffNKQZAwdOtT44x//2GZ74xwS8KzFixcbr776arPfnZSUFLePxMT5jm+5//77HZ/l448/3qJ848aNjr69KzMsNL1exmgnPZM37kdyLuFbvNGmuKbkW9xxr6Y9Pv/8c8d2p06d2uL7fUFBgTFgwABDkhEdHW0UFxe7bd8d4eemXCigQ7Zu3aovv/xSknTjjTdq3LhxLerMmzdPJ598siTp6aefVl1dnVdjBABPWLBggS666CL17du309t46qmnZLfbJUnPPvusQkJCmpWHhobq2WeflSTZ7XY9+eSTnQ8YvZo72iPgLh9++KGuvPJK+fv7Oy2Pi4vTX/7yF8fPb7/9ttN69JFwB3e1R8BdXLXFpi699FKddNJJkuT4vt3U0qVLdfz4cUnSwoULFRcX12Ifzz//vGNfTzzxRFfDRi/ljvYIeNLBgwd1//33S5JeeOEFWa3WNtfhHBLwrLlz5+qaa65RWlqaR/fD+Y7vqKur0zPPPCNJOvnkkzVv3rwWdc444wzdeOONkqT169dr27ZtXo0R3YO37kdyLuE7uMcNT/DWvZpFixZJkgICApqdEzWKi4vTwoULJUnHjh3T0qVLPRqPKyQxwRTvvfeeY/mGG25wWsfPz0/XX3+9pBO/JBkZGd4IDQC6NcMw9P7770uShg4dqtNPP91pvdNPP91x0+D9999vNmw3APRUEyZMcCxnZWW1KKePhDe11R4BMzQOUV9dXd2irPF7eGRkpKZPn+50/eTkZE2cOFGS9Pnnn6usrMwzgcIntNYeAU+69dZbVV5erpkzZ+rss89usz7nkEDvwfmO78jIyHAkrM2cOVN+fs5vd86aNcux/O6773ojNHQz3rgfybmEb+EeN3qqsrIyff7555KkiRMnupyGcPr06YqMjJRk3t9Okphgig0bNkiSwsLCNGrUKJf1ml5o2Lhxo8fjAoDubv/+/crPz5ekNi/GNpbn5eXpwIEDng4NADyupqbGsexsFAj6SHhTW+0R8LaffvpJ3377raQTF86bqq2t1datWyVJ48aNa3VUksb+saamRtu3b/dMsOj1WmuPgCe9+eab+vDDDxUTE+N4yrgtnEMCvQPnO76l8R6T1HrfPXr0aIWGhkriHpOv8sb9SM4lfAv3uNFTbdu2TbW1tZJa76usVqsjGXPbtm2mjCRGEhNM8eOPP0qS0tLSFBAQ4LJe0wtdjesAnvTWW29p2LBhCg0NVUREhIYMGaKZM2eSJY1uY9euXY7ltm4G0IfC22644QYlJSXJarUqLi5Op59+uv7f//t/ysvLMzs09BLr1693LDcOydwUfSS8qa32+HP0kfCEyspK7d27V3/961919tlnO6YvuOOOO5rV27Nnj+rr6yXRP8Jz2tsef+6+++5TSkqKgoKC1KdPH5166qm68847tWfPHi9Ejd7k2LFjuv322yU5n0bKFc4hgd6B8x3f0t6+OyAgwDGNoTs+62effVZpaWkKDg5WVFSUfvGLX+imm27SN9980+VtwzO8cT+ScwnfYsY9bq4pwR0601fZ7Xbt3bvXo3E5QxITvK66ulqFhYWS5HKYskZ9+vRRWFiYJCknJ8fjsQG7du3Sjz/+qKqqKpWXlyszM1Mvv/yyzjnnHE2bNs0xRC1gltzcXMdyW32ozWZzLNOHwhvWrVunQ4cOqa6uTkVFRfrqq6/08MMPKy0tTYsXLzY7PPRwDQ0Neuyxxxw/X3nllS3q0EfCW9rTHn+OPhLusnz5clksFlksFoWFhSk9PV3z5s3TkSNHJEn33nuvZsyY0Wwd+kd4Smfa489t2rRJBw8eVG1trY4dO6Zvv/1WTz31lE4++WTNnz+faTbQbnfffbcOHz6sX/3qV7rxxhvbvR59JNA78LvsWxo/77CwMEVHR7dat/HzLigoaDaibmd88803ysrKUk1NjUpLS7Vr1y4tXrxYo0aN0k033dTl7cO9vHU/kv7Hd5h1j5trSnCHntRXuU4PBDyk6RzT4eHhbdYPCwtTRUWFysvLPRkWfFxoaKguvvhinXvuuRo6dKjCw8NVUFCg9evX64UXXlBRUZHee+89XXLJJfrss88UGBhodsjwUR3pQxtPkCXRh8KjBg0apOnTp2vcuHGOk9t9+/bpnXfe0dtvv63q6mrddNNNslgsmjt3rsnRoqd68sknHVMDTJ8+3elwzfSR8Jb2tMdG9JHwllNOOUVLlizRmDFjWpTRP8LbWmuPjRITEzV9+nSdeeaZGjRokAICAnTw4EF9+OGHevnll1VXV6cFCxaotrZWjzzyiBejR0/05ZdfaunSpQoICNALL7wgi8XS7nXpI4Hegd9l39L4ebf3HlOj8vJyBQUFdXh/0dHRmjZtmsaPH68hQ4YoODhYhw4d0po1a7Rs2TKVl5dr8eLFKisr04oVKzq8fXiGt+5H0v/4Dm/f4+aaEtypJ/VVJDHB66qrqx3Lrc1L3ajxhLKqqspjMQF5eXlOn9g477zz9Lvf/U4XXnihduzYofXr1+vvf/+7fv/733s/SEAd60ObfiGnD4WnTJs2TTNnzmxxk2DMmDG66qqr9OGHH2r69Omqq6vTnXfeqYsvvlj9+vUzKVr0VOvXr9e9994rSUpISNDf//53p/XoI+EN7W2PEn0kPOPSSy/V6NGjJZ3ov7KysvTmm2/q3Xff1TXXXKOnnnpKF110UbN16B/hKZ1pj9KJfjA7O7vFA0L/9V//pUsvvVRz587VpEmTdPz4cT322GO66qqrNHLkSK8cE3qe2tpazZ07V4Zh6M4779Tw4cM7tD59JNA78LvsWxo/747cY5I693knJSUpLy9PoaGhzd4/9dRTNXnyZN16662aOHGiDh48qFdffVVXXXWVLr744g7vB+7nrfuR9D++w5v3uLmmBHfrSX0V08nB64KDgx3LtbW1bdZvHH4zJCTEYzEBrQ0527dvX7399tuOi6vPPvusl6ICWupIH9p0+GL6UHhKVFRUq085X3TRRXrggQckSZWVlVq2bJm3QkMv8cMPP2jatGmy2+0KDg7WW2+9pYSEBKd16SPhaR1pjxJ9JDwjOjpaw4cP1/DhwzVmzBhdffXVWrlypV5++WXt27dPl1xyiZYvX95sHfpHeEpn2qN04qnO1kY4Hjt2rP72t79JkgzDcCwDzjzyyCPavXu3BgwYoAcffLDD69NHAic0Tg/alZezPt9b+F3unjzVrho/747cY5I693lbrdYWCUxNDRkyRP/85z8dP3P/oPvw1v1I+h/f4c173FxTgrv1pL6KJCZ4XUREhGO5PcOPVVRUSGrfsHyApwwaNEjnnXeeJCkzM1P5+fkmRwRf1ZE+tLH/lOhDYa65c+c6vnCtX7/e5GjQk+zfv1+TJk1SSUmJ/P399frrr+vXv/61y/r0kfCkjrbH9qKPhLtcd911uuKKK9TQ0KDbbrtNxcXFjjL6R3hba+2xva6++mpFRkZKon+Ea7t379ajjz4q6cRN46bTHrQXfSTQO/C77FsaP++O3GOSPPd5n3XWWRo2bJgkacOGDWpoaPDIftAx3rofSf/jO7rbPW6uKaEjelJfxXRy8Lrg4GDFxsaqqKhIubm5rdYtKSlx/JI0zvUJmGXYsGH66KOPJJ2Yfi4pKcnkiOCLkpOTHctt9aE5OTmOZfpQmCkhIUGxsbEqLCxUXl6e2eGgh8jPz9fEiROVn58vi8WiF198UZdcckmr69BHwlM60x7biz4S7nTJJZfozTffVEVFhT755BPNmDFDEv0jzOGqPbZXQECA0tPTtX37dvpHuPTkk0+qtrZWgwYNUmVlpV5//fUWdb7//nvH8hdffKHDhw9LkqZOnaqwsDD6SOA/fvzxxy5vIzEx0Q2RdA6/y92Tp9pVcnKyvvrqK1VUVOjYsWOtzrTQ+HnHx8c3mx7H3YYNG6Zdu3apurpaRUVFio+P99i+0D7euh9J/+M7uts9bq4poSN+3lc1Tg3vjNl9FUlMMMWwYcP05ZdfKjMzU3a7XQEBzpvi7t27Hcsnn3yyt8IDnGpt2EbAWxqf6JGa95HO0IeiO6EPRUcUFhbqvPPO0759+ySdeKr++uuvb3M9+kh4QmfbY0fQR8Jdmt4oyc7Odiynp6fL399f9fX19I/wGlftsSPoH9GWxmkO9u3bp2uuuabN+g899JBjef/+/QoLC+McEviPoUOHmh1Cl3C+0z15ql0NGzZM77zzjqQTn+fpp5/utJ7dbldWVpYkz3/WnLd0T964H8m5hG/pbve46XvQXp3pqwICAjRkyBCPxuUM08nBFGeeeaakE0ORff311y7rNR367le/+pXH4wJas2vXLscyozDBLAMHDnS0v7aGB/3Xv/4lSerfv79SU1M9HRrgUkFBgQoLCyXRf6Jtx48f1/nnn+/4u/vYY4/p1ltvbde69JFwt660x/aij4Q7NX3ysulw31arVWPHjpUkbd68WbW1tS630dh/BgUFtfpUHtAWV+2xvex2u/bs2SOJ/hGexTkk0DtwvuNbGu8xSa333du3b3eMhOLpe0yN3xuDgoIUGxvr0X2h/bxxP5JzCd/Sne5xc00JHTFmzBhZrVZJrfdVtbW12rJli2OdwMBAr8TXFElMMMWll17qWH7ppZec1mloaNDLL78sSYqOjtaECRO8ERrg1P79+/XZZ59JkgYPHqz+/fubHBF8lcVicUxfs3v3bseJxM9t2bLFkSl9ySWXkI0PUy1ZskSGYUiSzj77bJOjQXdWWVmpKVOm6JtvvpEk3XfffbrnnnvavT59JNypq+2xvegj4U5vvfWWY3nEiBHNyhq/h5eWlmrlypVO18/NzdXatWslSeeee64iIiI8Eyh8QmvtsT3eeOMNHT9+XBL9I1xbvny5DMNo9fXggw866mdkZDjeb7xxyDkk0HtwvuM7xo8fr6ioKEnSP/7xD8d3qp9bvny5Y3natGkei2fjxo364YcfJJ1IcPDz4/Zrd+GN+5GcS/iW7nSPm2tK6IiIiAide+65kqS1a9e6nBJx5cqVKi0tleTZv52tMgCTnHXWWYYkIyAgwNi0aVOL8scff9yQZEgyHnzwQe8HCJ+xatUqo66uzmX54cOHjVNPPdXRHv/yl794MTr0dvv373e0rZkzZ7ZrnZ9++snw9/c3JBmjR482Kisrm5VXVlYao0ePdvSxe/bs8UDk6I062h73799vfPPNN63W+eCDDwyr1WpIMkJCQozc3Fw3RYvepqamxpg0aZKjDd5+++2d2g59JNzBHe2RPhLu9NJLLxlVVVWt1vnrX//qaLMDBw407HZ7s/KioiIjKirKkGSkpKQYhYWFzcrtdrsxdepUxzYyMjLcfRjoJbraHouLi9tsX1999ZURHR1tSDIsFouxfft2d4QOH/Xggw+22bdxDgl4X0pKiuO8pD2aXrM4++yzndbhfMe33H///Y7P8vHHH29RvmnTJiMgIKDVNmMYhmMbrtriu+++azQ0NLhcf+/evcaAAQMc23nnnXc6eijwsK7ej8zIyGjzminnEr7F022Ka0rozL3Dl156qc3cis8//9xR5+KLL25x7aigoMDxNy06OtooLi7u4pF0jvNJGgEvePrpp/WrX/1KVVVVmjRpkv70pz9pwoQJqqqq0uuvv64lS5ZIOjGX9bx580yOFr3Z7373O9XV1emyyy7TuHHjlJqaqpCQEBUWFmrdunVavHixYzjGM8880+1TiMC3bNiwQZmZmY6fG9uWJGVmZjZ7OkiSZs2a1WIb6enpuuuuu/TYY49p+/bt+tWvfqV77rlHgwcPVlZWlhYuXKgdO3ZIku666y5T5qtFz9DV9njgwAFNmDBB48aN09SpUzVy5EglJCRIkvbt26e3335bb7/9tuNpkEWLFjGSHVy65pprtGbNGknSOeecoxtvvFHff/+9y/pWq1Xp6ekt3qePhDu4oz3SR8Kd5s+fr3nz5umyyy7TmWeeqcGDBys8PFxlZWXauXOnVqxYoY0bN0o60R6XLFkif3//ZtuIiYnRwoULddNNNyk7O1unnXaa7rvvPo0YMUL5+fl66qmnlJGRIenE78D48eO9fZjoIbraHo8fP64JEybol7/8pS699FKNGjVKiYmJ8vf318GDB/Xhhx/qlVdecUwD9Ic//EGjRo0y5VjhOziHBDwrMzNTGzZsaPZeeXm549+fX3+44IIL1K9fvw7vh/Md33LXXXfpjTfe0J49e3T33XcrMzNTV199tUJCQpSRkaFHHnlEdrtdISEheuqppzq9n2nTpiktLU3Tp0/X2LFjlZycrKCgIB06dEiffvqpli1b5mjPV155paZPn+6mI4S7eON+JOcSvsXTbYprSr7HHfcO2+Occ87R1Vdfrddff12rVq3SeeedpzvuuENJSUnauXOnHn74YR08eFCStHDhQvXp06dT++kyU1KngP9YtWqVERkZ6cj4+/krPT3d2Lt3r9lhopdrfOqnrddll11mlJSUmB0ueriZM2e2q701vlypr683Zs+e3eq6N954o1FfX+/Fo0NP09X22PSJkdZeoaGhxuLFi004QvQkHWmLauNpXfpIdJU72iN9JNypvd9ZkpOTjTVr1rS6rQceeMCwWCwutzF58uQ2R9mBb+tqe2z6RGlrL39/f2P+/PmtjnwAtEd7RmIyDM4hAU9qOjJAe17OflfbMxJTI853fMfevXuNIUOGuPysIyMjjQ8++KDVbbR1naG97fbmm282qqurPXCUcIeu3I9sz0hMhsG5hK/xZJvimpLvcce9w/aMxGQYJ0aGmzx5sstt+/n5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", + "image/png": "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WlqqwsJCJSYm6qWXXlLHjh21ePHietfKzMzUwIED9dhjj2nbtm0qKipSUVGRNm3apPvuu0/XXHONTCZTjWP+8pe/yM3NTZK0cOHCOtevrKzUF198IUkaPXq0/P39m+1abFm+fLk6dOig559/Xtu3b1d+fr7Ky8t18OBBffzxxxo8eLDuvffeWtdpzXvvvacLL7xQCxcuVFpamsrLy5WWlqZ58+apR48e+vzzz+s8/qWXXlKXLl3073//W4mJiSooKFBZWZn279+vDz74QP369dP06dMbfa0AAAAAALQWJDEBAAAAAAAA5zCz2axx48ZZkofGjh2rjz76SGvXrtX69ev12muvqW3btiouLta4cePqrexzzTXXKCkpSffff79++OEHbdmyRZ988oni4+MlSYsXL9Y777xT4xhvb2+NHDlSkvTVV1+prKzM5vpLly5VTk6OJOnGG29s1muxZvv27Ro7dqwKCgrk7Oyshx56SCtXrtTGjRv19ttvKyYmRpL0xhtvaNq0afWudddddykkJET/+c9/9Ouvv2r16tV6/PHH5erqqvLyct14440245w1a5YeffRRVVZW6oILLtCbb76pFStWaPPmzZo/f74GDhwos9ms5557TrNnzz7tawUAAAAAoDVxsncAAAAAAAAAQF2OF5U3+lhPVye5OTtaHcsprpDZbG7Uuu4ujvJwsf7WWl5JhapMDV830Mu1UTE01LvvvqslS5bI2dlZixYt0mWXXVZjfMCAAZo0aZIGDx6sXbt26cEHH6yzXdqmTZu0fPlyDR061LKvV69eGjVqlLp06aLMzEzNmTNHd955Z43jrrnmGi1atEgFBQX69ttvNW7cOKvrf/LJJ5IkHx8fjRkzplmvxZo77rhDFRUVcnR01LfffmtJvpKkvn37avz48Ro0aJCSkpL00ksv6aabblLXrl2trrVjxw5FR0drw4YNCgsLs+y/+OKLNWrUKI0cOVKVlZW65557tHHjxhrHJiUl6cknn5QkPfPMM3rmmWcs7fwkqXfv3powYYJuvvlmffzxx3ryySc1adKkWpWrAAAAAAA4W5DEBAAAAAAAgFat9z9XNPrYf1zVVTcNbGd1bMQrq5VTXNGodR+4JE4PXdrR6tj4t9Zrb1ZRg9c68OIVjYqhIcxms2bOnClJuv/++2sl/VTz9/fXrFmzNHr0aK1du1Z7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lZXZXH/p0qXKycmRJN14443Nei3WbN++XWPHjlVBQYGcnZ310EMPaeXKldq4caPefvttxcTESJLeeOMNTZs2rd617rrrLoWEhOg///mPfv31V61evVqPP/64XF1dVV5erhtvvNFmnLNmzdKjjz6qyspKXXDBBXrzzTe1YsUKbd68WfPnz9fAgQNlNpv13HPPafbs2ad9rZJkNBo1ZswYSwLTyJEj9dVXX2nz5s368ssvNWLECH3//fd66qmnGrU+AAAAAAANxSdBAAAAsJv4MB91DvPWjrSabaU6h3lr+tguurB9kJ0iA9CU4sO99dZfe+mfS5KVlltaY6ywzKh/LknWgo2H9PSYLhraKcROUQJo1YqPNf5YF0/J2d3GusclmRu3rrP7ibWtKcmRzKeRnOnZvL/zvPvuu1qyZImcnZ21aNGiWlWQBgwYoEmTJmnw4MHatWuXHnzwwTrbpVVXWxo6dKhlX69evTRq1Ch16dJFmZmZmjNnju68884ax11zzTVatGiRCgoK9O2332rcuHFW1//kk08kST4+PhozZkyzXos1d9xxhyoqKuTo6Khvv/3WknwlSX379tX48eM1aNAgJSUl6aWXXtJNN92krl27Wl1rx44dio6O1oYNGxQWFmbZf/HFF2vUqFEaOXKkKisrdc8992jjxo01jk1KStKTTz4pSXrmmWf0zDPPWNr5SVLv3r01YcIE3Xzzzfr444/15JNPatKkSbUqV9Xn7bff1pYtWyzX/vbbb9c4x9VXX61bb71V77333mmtC5wLsrKytHHjRm3cuNFSbe748eOSpJtvvlnz5s1r8nMuWLBA77//vn777Tfl5eUpNDRUgwcP1tSpUzVw4MAmPx8AAADQmpDEBAAAALtxcDDomSu76po56yRJfh7OenhkJ93QN0pOjhQNBc4VBoNBl3UL19BOIXr3l1S9sXKfSiuraszZl12sye9v0iWdQ/TUmC6KCbKRGADg/DSrfeOPHf2S1O9262Nv9JVKjjdu3SF/l4bZqMLz/uVS9u6GrzUjv/45jWQ2mzVz5kxJ0v3332+zjZu/v79mzZql0aNHa+3atdq7d6/i4uKszr3vvvtqJDBVCwgI0JQpU/Tiiy9q586dys/Pl6+vr2V82LBh8vf3V25urubPn281iamoqEiLFi2SJF177bVyc3Nr1ms5VXWigiTdfvvt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6cYbb9SOHTu0bds2JScn68svv7SMTZw40eoxLXEtI0aM0JNPPilJeu+999SnTx+r89avX29JPBgxYoTN9XJycrR48WJdffXVVsffe++9Gueu5ujoqNGjR2vBggVavny5kpOTFR8ff9rXU5+IiAjFx8crOTlZn3/+uWbOnCl399qtEouLi/XZZ581+fkBSGlpaZZtW63kqkVFRVm2Dx8+rC5dGtZ6+eRzWHP06FHLdmFhoQoKChq07pkqKiqyug2cCe4rVDObzTIajTIajXJ1dZWDQ+3aHqWlpTp48KCqqqpkNBplMllvCV398/nIkSM19kdFRSkoyHrV2PT0dDk4OMjJyUmOjo5ycnKq8YdWvucvfk6hOdjrviosLGzyNUliAgAAwGkrMjnp79/s1ne7sq2Ouzg66JZBMZo6rL283ShvD6BpvbV6n9LzyyRJa1OOa/TsX/TX/m310KUd5edhvRIGAJyvHBwc9MQTT+iee+5RamqqbrrpJn300UdydXW1Or+goEAffvih7r333maN64YbbtDjjz8us9ms+fPn6+uvv5YkDRw4ULGxsVaPaYlr6devn/r06aPNmzfrnXfe0bXXXqtLLrmkxpz8/HzdeeedlpjuvvvuOtf829/+pgsvvFChoaE19q9evVpz586VJPXu3Vt9+/atMT5t2jR99tlnqqqq0rhx4/T999/bTHCoqqrSwoULNWTIkHqTIE5199136/7771dGRoYefvhhzZkzp9achx56SFlZWae1LoCGOfmDHy8vrzrnenr+2Wr5dD6cOjn5qT4fffSRpRJcS/roo49a/Jw493FfnVscHR3l7OxsSQKq3q5rX7Xt27errKys1ppubm7q0aNHo2NasWKFcnNzrY7179+/zkQlo9GoysrKGv+t3s7Pz1dJSUmj48LZg59TaA4teV/l51t/wP1MkMTUzA4ePKjZs2dryZIlOnz4sFxdXdW+fXtdd911mjp1qjw8PBq17oEDBxQTE3Nax0RHR+vAgQO19g8dOlSrV69u0Bq0agAAAEcqPfVdUbSM+dYTmEbEh+qpK+LVLsjT6jgAnInMgjK9tXpfjX1VJrM+WH9Q3+xI18OXdtTE/tFypPobAFjcdddd+uGHH/TVV1/p888/19atW3XnnXeqX79+8vX1VUFBgXbv3q1Vq1Zp0aJFcnNza/YkpsjISA0ZMkSr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eZ6EhATv+sGDB/22Cw8P57bbbgPgxx9/5Pe//32b90+Liop44YUXWr3WhRdeCMDy5ct59913Wx1XU1PDjTfe2GafhRBCDBz5+flkZ2dTXl6Oy+Wiqsr//eWBrFemk7v99tt58sknOXjwIDfddBPPPvssBoPvl/7666+55pprsNlsREVFcf311/dGF4UQ/djWIxW88uNhPttZgNPdfETC+kPlZBVayYgPa3VcgFHfaltfsTndfJtVzMfb8vguqwSHu/1A5+CoIC4cn8iiySmkRAb1Qi+FEEIIIYQQQnSHAKOeiycmc/HEZPYWVvPe5qN8siOfIqvvEflOt8rKzGJWZhYTZNJz1qg4LpyYxMyh0Rj1fV8aPths4FfTB3PFtEGsO1jGsh8PszKzCE+LogFXn5raJ/0TQgghRPe76aabeOONN1i3bh0vv/wyOTk53HLLLaSlpVFQUMBLL73EBx98AMCQIUO49957W53jvvvu49133yU3N5c777yTbdu2cdVVVxEbG8u+fft47LHH2LRpE5MnT26zytINN9zAs88+i8vlYsGCBdx3333MnDkTh8PB2rVreeyxx3A6nQwbNoz9+/d3+r1OnDiRMWPGsGvXLv73v/9RUVHBlVdeSUJCArm5ubz++uu8//77nHbaaT5DVE3PExAQgM1m495778VoNDJ48GDvVD9JSUkEBmoDlP/2t7/x/fffs2HDBp544glWrVrF9ddfz4QJEwgODqaiooLdu3ezcuVKVqxYwdixY7nuuuuavd6jjz7K119/TXV1NZdffjnff/89CxcuJCwsjB07dvDQQw+xb9++dn++QgghBgaLxUJBQYH3eVVVFaqqnnAVK3slxBQXF8dzzz3HVVddxYsvvsiXX37Jeeed593/xBNPoKoqa9euJSsryzt337JlywgJ8T/CSwhx4rK73Hy2o4BXfjzM9ty2U6Tvb87lL+eP6qWedZzL7eHHg2V8vC2fL3cXUmNvfzRtdIiZ88clcOGERCakhJ9w/+gIIYQQQgghxMlmRHwofzl/FHfNH8mG7DKWb8vn850FWG2+vyPWOdx8tC2fj7blExls4ryx2nfEUwZFoOvj6cQVReHUodGcOjSao+V1vL4hh3c2HaWyzsnkwRGMSbL4PK7G7uK7fWV4VJAZ0YUQQoiBQa/X8+mnn3LBBRewdu1avv32W7799ttW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WYgpTSdeiWxgqj15LFik0MSCSQrtwLMG0Bak3hYAajYBpqqz2w1uM7gvmXp8HY+M82IPIprWRFFEOBxO2e1bEIQxdQHXaDQJ56XY2YKIpqNgMAi9Xg+pVApBECAZx+858oULod28Gf633hpxajnpvHlQXXnljAwwAcA777yD//zP/8Qll1yCq666CsuWLUNBQQF8Ph/q6+vxi1/8Ij7N21133QWZ7OxlwIsuugg7duzAnj178P3vfx+f/OQnodXGOoCq1ep4p77bbrsNDzzwAKxWKy688EI89NBDWLp0Kfx+P/7+97/jiSeeQCAQwKpVqyZtSrmLLroo/vrrX/86vvWtb8FiscSvpVRUVCR8LURERDR78Sc+UQqCIECjSX/n61judgsEArDZbLDZbABigakFCxYk3FlARERERESUQCIFVIbYYyK+8lHi+2g0FmaKBGPdlCKBxJDT4FgkCBhHmHJv3d1Avy15m/jrUGyavFSKzku/39K1sWnNxqN4Vfpl5euHBIsGwkXxZ3mK8SGv1bnp93vx14ELvpy4H4l84lOq5S2IPYhoTohEIvFO3319fXC5XMjNzcWSJUtSrm8wGOBwOJLGBUGATqdLCC2NJfBERJQtoVAIMpkMUql0QvuRlZRAd+ediHR2IrhvHyJdXRADAQhKJaSFhVCsXg1pUdEkVZ090WgUu3btindcSuWaa67BI488kjB277334uc//znsdju++c1v4pvf/GZ82aWXXoqdO3cCALZs2YK//vWvePvtt1FfX4+77rorYT9qtRovvvgitm/fPmkhpqqqKnz+85/H73//e7z99tt4++23E5afOnUKFRUVk3IsIiIimt4YYiIaB6PRiPXr18dPLvX19cHtdiMajZ5z23A4POIdA5FIZMJ/rBEREREREaUkkQASdWz6sYlYd/fk1DPcZf8xNftdeXPsMdnUxsnfJxHNeqFQKH4+qa+vD/39/UlTJ7lcrqTplQYZDLGAq1QqRU5OTjywNNjFhIhorpMWFUF91VXZLmNKfOMb38CyZcvwt7/9DQcOHIDVao3fQF1UVIR169bhtttuw1Upvv6SkhJ89NFHeOSRR7Br1y6cOXMGfr8/aT25XI7t27fj5z//OV588UUcP34coiiipKQEV1xxBbZs2YKamhps3759Ur+2l19+GWvWrMEf/vAHnDx5ctTXXIiI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skrOmK1bt0IQhIRA13e/+934mCAI2Lx5MwBg8+bNEAQBFRUVKfc1uP53vvMdAMCePXtw0003obS0FEqlEiUlJbj11ltx4sSJtPXs3Lkzvp+dO3emXKe+vh5f/epXsXTpUuj1eigUChQXF2PFihW488478bvf/W5U09/89a9/xdVXX42ioiIolUrMnz8f9957L86cOXPObYmIiGYLv9+fNF37bAwxZbUT044dO/Diiy/ij3/8Y7yl9ODJDovFguuuuw6f+cxnslkiEWWJIAgwGo0wGo3w+/2wWq3o6OhAOBxOWre4uDgLFRIRERERERHNLdFoFDabDe3t7QnTwwGAx+NBX18fjEZj0nYSiQQajSZDVRIR0UwmkSTfex+JREYMwHbs2YM3PvtZhP3+UR0j7Pfjjc9+Fje8++6M78g0GX72s59hy5YtCeferVYrXn75Zfzxj3/E//zP/2DDhg1j3u8rr7yCW265Jelia0dHBzo6OnDo0CE8//zzOHLkCJYuXZp2P9/85jfx/e9/P2GspaUFv/jFL/Dqq69i165dqK2tHXN9REREM43T6Ux4L5fLoVars1PMFMp4iKmurg4vvvgitm3bFk9IDwaXSktL8ZnPfAaf/exncdFFF42qPSgRzX4qlQoLFixARUVF0snSvLy8tN+cw+EwRFFkS10iIiIiIiKiCRi8uaizsxOhUCjtelarNWWIiYiIaCykUmlCoCYSiYy4/o777ht1gGlQ2O/Hzq9/HTe9//64asyGa6+9FmvWrAEAnHfeeQCAe++9F1/+8pfj64x1uta33noLH330Ec477zxs2bIF5513Hnw+H1577TX8+Mc/htfrxa233oqGhgYoFIpR77erqwt33HEHgsEgzGYzvvKVr+CCCy5Afn4+fD4fGhsbsWvXLrz++usj7ueXv/wlPvjgA1x66aW45557sHDhQjidTrz44ot48cUX0d3djTvvvBMffvjhmL5uIiKimWj4VHJGo3FWZmoyEmLq7e3Fb37zG7z44ovYt28fgLPBJaPRCKfTCUEQ8KMf/Qif//znM1ESEc1AEokERUVFKCwshMvlQnt7OywWS9r129vbcfr0aZjNZpSUlECv12ewWiIiIiIiIqKZa3DKuPb2dvT09Iy4rkQiif/tTURENJwYjcLX25s0HolE4B8Y9wpCvNtSMBhM6N4jAIhqtSkv0vUcOXLOKeTSad+9G607diB/hC5A46U2mSCk6Co1EYMzFwxlNptH7GJ0Lv/4xz+wadMmvPbaawkhpUsuuQQmkwn/+3//b7S2tmL79u247rrrRr3f7du3w+PxAADeeeedpBovuugi3HbbbXjqqadG3M8HH3yAu+++G08//XTCf//LL78cCoUCzz77LP7xj3/gwIEDWLly5ajrIyIimomGh5hm41RywBSGmEKhEN544w28+OKL+Mtf/oJQKBQPLikUCmzatAm33HILrrrqqlnZ4oqIpo4gCDAYDCN+Y45Go7BarRBFEV1dXejq6kJOTg5KSkqQn5+fsi0xERERERER0VwXiUTiXZAHLz6mo1KpUFxcjKKiInZBJiKitHy9vfiZ2ZztMlL6/b/8y5Ts98s2GzQFBVOy78mkUqnw/PPPp+yy9LWvfQ3/9//+XwSDQbz33ntjCjF1dnYCiHWGGilkda7rgxaLBT/5yU9SBti+8Y1v4NlnnwUAvPfeewwxERHRrBYIBOAf1nmSIaZR+sc//oEXX3wRv//97+FwOADE7twSBAHr16/HLbfcgs9//vNjbmlJRDQWPT09SXNtu1wuuFwuKBQKFBcXw2KxjKkFLhEREREREdFsd+TIkaS7O4czGo0oKSmByWSala3riYiI5oqPfexjMKcJmOn1elRXV+PYsWNobm4e034HZ1BwOBz47//+b1xzzTXjqu+zn/0slEplymWLFi2CTqdDf3//mOsjIiKaaYb/nS6VSqHVarNUzdSa9BDTRRddBEEQ4l2XFi1ahFtuuQU333wzKioqJvtwREQp+f3+hO9FQwWDQbS0tOD06dMoKChASUkJcnJyslAlERERERER0fRSWFiYMsQ0OMV7cXHxrD1RSkRENNfU1NSMuDwvLw8A4Ha7x7TfT3/60zAajXA6nbjuuuuwceNGXH311diwYQNWrFgRnzpwovXl5uaiv79/zPURERHNNKmmkputNxVN2XRyer0eTz75JG6//fapOgQRUVplZWUoKipCR0cHrFZrUlcmINYlzmazwWazQa/Xo6SkBAUzoMUvERERERER0UREIpG0Fw/NZjOam5sRDocBxKaZKSkpQVFREWSyKTuVSERERFmg0WhGXC6RSADEfncYC5PJhD/96U+46aab0N7ejh07dmDHjh0AgJycHFx++eW488478alPfSor9REREc00qUJMs9WUnHkQRRH9/f2488478eMf/xi33HILbrrppnj7SCKiTFAoFCgvL8e8efPQ09OD9vZ2uFyulOu63W7U1dWhqakJJpMpw5USERERERERTT2fz4f29nZ0dnZi2bJlKbsSS6VSFBUVwePxoKSkBHl5ebP27k4iIsoMtcmEL9tsSeORSAQ9PT0AgPz8/ISAbSQSgc/nS1hfo9HEQyuDdj34II5t3Tru2pbecQc2/OAH494+HTXPMeOSSy5BY2MjXn31Vbz55pt49913cebMGbhcLrz22mt47bXXcOWVV+KPf/zjOcNKREREc5koilAqlfD7/fHgLkNMY7Bz505s3boVr776KtxuNw4ePIhDhw7hoYcewsaNG3Hrrbfi+uuvh06nm+xDExGlJJFIYDabYTab4Xa7YbVa0dXVlXKquVAoBI/Hk4UqiYiIiIiIiCafKIpwOp04c+YM7HZ7fLy9vT3t1OoLFixgcImIiCaNIJFAk6IDfiQSgWrgHK2moCAhxCSKItDfn7C+UqWCXC5PGFu9ZcuEQkyrtmxJWRtNDpVKhZtvvhk333wzAODUqVPYvn07fvKTn6C+vh5vvfUWvvWtb+Hxxx/PcqVERETTlyAIOO+88+LNhPr6+qDX67Nd1pSRnHuVsdmwYQN+9atfoaurC9u2bcOVV14JiUSCSCSCv//977jjjjtQVFSEm266CW+++SZbPBJRRun1eixatAgXXngh5s+fD6VSmbQOp5QjIiIiIiKimU4URTgcDhw6dAiHDx9OCDABQHd3d8qp1wEwwERERFknCELS1KeprieZV6xA8UUXjesYJevXw7x8+bi2pfGZP38+vvKVr2DPnj0oLS0FAPz+97/PclVEREQzgyAI0Ov1KC0tTepOOZtM2VemUqlw00034X/+53/Q1taGRx99NJ4O83q9+P3vf4+rr76aU8wRUVbI5XKUlZXh/PPPx+LFi+Mt91QqVdo7UQGwSxMRERERERFNa8PDS319fSOuR0RENF2NJsQEAJc98QRkKtWY9i1Tq7GR3X+yJicnB2vXrgWA+JSCRERERMAUhpiGKioqwje+8Q0cPHgQBw4cwH333Qez2QxRFNHT0xO/u+vf//3fsWXLFrz33nuZKIuICIIgoKCgACtWrMDq1auxcOHCtHecOp1O7N27F0eOHIHL5cpwpURERERE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e3B6ueHTzhERERERTQZBEFBbW4tly5ahoqKCFzaJiIgm0cUXXxx/vWvXrrTr7d27N96le/369VNa0/HjxwEASqUSJpNpSo9FRERENFeFQqF4SH2QUqlEeXl5liqaexhiIiIimqDCwkKsXr0aWq02aVlHRwcOHDgAr9ebhcqIiIiIaCZzuVyw2WxplyuVSuTm5mawIiIiorlh48aNMBgMAIAXXngBoiimXG/r1q3x19ddd92U1bN7924cO3YMQCxgNfxmOsqeYDCY7RKIiIhoErW0tCAUCiWMVVVVQSqVZqmiuYe/6RIREU2CwenlioqKkpZ5PB7s378fLpcrC5URERER0UwjiiLOnDmDgwcPoq6uDm63O9slERERzSkKhQJf+9rXAAAnTpzAj370o6R1PvzwQzz33HMAgEsvvRRr165NuS9BECAIAioqKlIuf/3119OGpACgsbERX/jCF+Lvv/zlL4/2y6ApFIlE0NzcjH/84x8J080QERHRzOVyuWC1WhPGTCYT8vPzs1TR3MSJfImIiCaJVCrFokWLYDQaUV9fj2g0Gl+mVquh0+myWB0RERERzQThcBgnT55ET09PfOzEiRNYtWoVZDKexiEiIsqUBx54AL/73e9QX1+PBx98EI2NjbjxxhuhVquxY8cOfO9730M4HIZarcYTTzwx7uNcd911qKqqwvXXX49169ahtLQUSqUSHR0deOutt/Dcc8+hv78fAPD5z38e119//SR9hTRedrsdDQ0N8Pv9AICGhgasWrWKHbKIiIhmMFEU0dDQkDAmkUhQVVWVpYrmLp79IiIimmSFhYXQ6XQ4fvw4vF4vpFIpFi9ezBMZRERERDQit9uN48ePxy+IDfL5fDhz5kzaDg5EREQ0+fR6PbZv345NmzahoaEBzzzzDJ555pmEdXJycrBt2zasWLFiQsdqbGzEo48+OuI698O03vUAAJH8SURBVN57Lx5//PEJHYcmh9frTfh9zePxoL29HfPmzctiVURERDQRVqs1HhwfVF5eDpVKlaWK5i6GmIiIiKaAVqvFqlWr0NDQAJPJBLVane2SiIiIiGiaEkURVqsVTU1NKaeTmTdvHsrKyrJQGRER0dxWVVWFAwcO4Kc//SleeeUVNDY2IhgMYt68edi0aRO2bNmC8vLyCR3jT3/6Ez788EP885//xOnTp9HT0wOPx4Oc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y6Uf/ehHZx8wFrVgtEcgWH7/+9/r+uuvV0REhN/y9PR0/dM//ZP352effdZvPfpIBEOw2iMQLIHa4umuu+46LV++XJK837dP99hjj2lwcFCS9MADDyg9Pd3nGD/72c+8x/rhD394rmFjkQpGewRCqbm5Wd/61rckSf/2b/+mqKioM27DOSQQWrfffrtuvPFGlZWVhfQ4nO8sHU6nU//yL/8iSVqxYoXuvPNOnzof/OAH9fnPf16StHv3br399tthjRHzQ7juR3IusXRwjxuhEK57NQ899JAkyWazTTsnmpKenq4HHnhAkjQwMKDHHnsspPEEQhITTPG73/3Ou/y5z33Obx2r1arPfvazkk79kezatSscoQHAvGYYhv7jP/5DklRZWanzzz/fb73zzz/fe9PgP/7jP6YN2w0AC9Ull1ziXW5oaPApp49EOJ2pPQJmmBqifmJiwqds6nt4YmKitm3b5nf7vLw8XXbZZZKkV155RcPDw6EJFEvCTO0RCKUvfelLGhkZ0c0336yLL774jPU5hwQWD853lo5du3Z5E9ZuvvlmWa3+b3fecsst3uXnn38+HKFhngnH/UjOJZYW7nFjoRoeHtYrr7wiSbrssssCTkO4bds2JSYmSjLvs5MkJpjitddekyTFxcVpw4YNAeudfqHh9ddfD3lcADDfNTY2qr29XZLOeDF2qrytrU0nTpwIdWgAEHKTk5PeZX+jQNBHIpzO1B6BcDt27JgOHjwo6dSF89M5HA7t3btXknTBBRfMOCrJVP84OTmpffv2hSZYLHoztUcglH7961/r97//vVJTU71PGZ8J55DA4sD5ztIydY9Jmrnv3rhxo2JjYyVxj2mpCsf9SM4llhbucWOhevvtt+VwOCTN3FdFRUV5kzHffvttU0YSI4kJpjh69KgkqaysTDabLWC90y90TW0DhNJvfvMbVVVVKTY2VgkJCSovL9fNN99MljTmjerqau/ymW4G0Ici3D73uc8pJydHUVFRSk9P1/nnn6//7//7/9TW1mZ2aFgkdu/e7V2eGpL5dPSRCKcztcf3o49EKIyNjamurk7//M//rIsvvtg7fcFXv/rVafVqa2vldrsl0T8idGbbHt/vm9/8pgoLCxUdHa2UlBStW7dOX/va11RbWxuGqLGYDAwM6Ctf+Yok/9NIBcI5JLA4cL6ztMy277bZbN5p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x47MnDkz7733Xqqrq9OtW7fMmTMnY8aMya+//tqw7rvvvstrr72WJUuWZM2aNbn88stP+Rt1dXUZPnx4li9f3mj88OHD2bRpUzZt2pTp06dn0aJF6dev37nZ6B945513MmrUqBw6dKhhrLa2NgsXLsy7776b2bNnZ8SIESe9t3v37gwaNChbt25tNF5XV5e6urp88cUX+eCDD7Jr165MmTLlnO8DAAAAAADOJ05iAgAAztiuXbtyzz33pLS0NK+88krWrVuXlStX5oknnkihUEhtbW3Gjh2bDRs25L777kvnzp0zY8aMrF+/PitWrMjo0aOT/Lf09OSTT57yNw4fPpxBgwZl+fLlufjiizN69OjMmTMnNTU1WblyZV588cWUlZWltrY2d95550mnP51Ln376aUaOHJn27dtn2rRpqampydq1a/P888+nZcuWOXbsWB566KHs3bv3pHcfe+yxhgLTqFGjsmDBgtTU1GTDhg1ZvHhxnnvuufTs2bPJ9gIAAAAAAOcTJzEBAABn7Msvv0yXLl2yevXqtGvXrmF8wIABueSSSzJlypSsXr06gwcPTkVFRZYuXZrWrVs3rKusrEx9fX3mzZuX+fPnZ+/evY2+kySTJk3K5s2bU1pammXLlqVPnz6N5gcMGJB77703/fv3z+7du/PMM89k9uzZ53bj/2fz5s3p06dPli9fnpKSkobxfv365ZprrsmoUaPy448/5s0338yECRMa5uvr67N48eIkyVNPPXXKk5aGDBmSiRMnZv/+/ed+IwAAAAAAcJ5xEhMAAPCXTJ069aTiUZI88sgjDc/79u3LjBkzGhWYThg/fnyS5OjRo1m7dm2juZ9++imvvvpqkuSFF144qcB0QocOHfLss88mSebNm5eff/757DZzFmbOnNmowHTCyJEjG67HW7lyZaO5/fv358iRI0mSW2655bTfb9u27T+UFAAAAAAA/j2UmAAAgDNWWlqa22+//ZRzHTt2TJs2bZIkPXr0yHXXXXfKdb+/Mm3btm2N5qqrq/PDDz8kSYYPH37aLCfKQEeOHMmmTZvObAN/U/fu3dOjR49TzhUKhfTu3TvJyfsqKytL8+bNkyRvvPFGjh49em6DAgAAAADAv4wSEwAAcMa6dOmSQqHwh/OlpaVJkq5du/7pmiQ5ePBgo7mNGzc2PF922WUpFAp/+HfDDTc0rP3+++//4k7OTrdu3U47f+IUpf/dV4sWLTJixIgkydtvv51rrrkmTz/9dN5///0cOHDgnGQFAAAAAIB/EyUmAADgjJ3qerjfu+iii/503Yk1SXLs2LFGc7W1tWeV69ChQ2f13l91pvv/330lybRp0zJkyJAkyY4dOzJ58uQMHjw4ZWVlufHGGzN58uSGU6gAAAAAAOBCc0mxAwAAAJzw+/LP5s2b06xZszN678orrzxXkf4xJSUlWbx4cdavX5+5c+emqqoqH3/8cY4dO5aNGzdm48aNmTJlShYuXJj+/fsXOy4AAAAAADQpJSYAAOC8UVZW1vDcrl27f0U56a+qqKhIRUVFkv9eO1dVVZVZs2ZlwYIFqa2tzV133ZWvv/46rVq1KnJSAAAAAABoOq6TAwAAzhu9e/dueF69enURkzSNNm3aZMiQIZk/f34ef/zxJMnu3buzatWqIicDAAAAAICmpcQEAACcNwYNGpTWrVsnSaZOnZrjx48XOVHTufXWWxue9+3bV8QkAAAAAADQ9JSYAACA80ZpaWkeffTRJMmaNWsyYcKE/Pbbb3+4fs+ePZkxY0ZTxTtr27ZtS3V19WnXfPTRRw3PHTt2PNeRAAAAAADgvHJJsQMAAAD83qRJk1JdXZ1169bl5ZdfTlVVVcaNG5devXrl0ksvTV1dXT777LMsW7YsS5YsSffu3TN27Nhixz6tb7/9NgMHDsz111+foUOHpm/fvrniiiuSJDt37sxbb72VuXPnJkl69eqVm266qZhxAQAAAACgySkxAQAA55UWLVpk6dKlGTNmTBYsWJBPPvmk4XSmUykpKWnCdH/P1q1bs3Xr1j+c79atWxYsWJBCodCEqQAAAAAAoPiUmAAAgPNOmzZtMn/+/KxatSqvv/56Vq5cmV27duWXX35JSUlJOnfunIqKigwePDi33XZbseP+qZtvvjlVVVX58MMPU1NTk507d2bPnj2pr69P27Zt07NnzwwbNixjxoxJixYtih0XAAAAAACaXOH48ePHix0CAACgqZWXl2fHjh25//77M2vWrGLHOWNVVVUZOHBgkmTFihWprKwsbiAAAAAAAPgHOIkJAAC4oB04cCBbtmxJkjRv3jxdu3YtcqKT1dbWpra2NknyzTffFDkNAAAAAAD885SYAACAC9qiRYuyaNGiJEmHDh2yffv24gY6henTp2fixInFjgEAAAAAAOfMRcUOAAAAAAAAAAAAXNgKx48fP17sEAAAAAAAAAAAwIXLSUwAAAAAAAAAAEBRKTEBAAAAAAAAAABFpcQEAAAAAAAAAAAUlRITAAAAAAAAAABQVEpMAAAAAAAAAABAUSkxAQAAAAAAAAAARaXEBAAAAAAAAAAAFJUSEwAAAAAAAAAAUFRKTAAAAAAAAAAAQFEpMQEAAAAAAAAAAEWlxAQAAAAAAAAAABSVEhMAAAAAAAAAAFBUSkwAAAAAAAAAAEBRKTEBAAAAAAAAAABFpcQEAAAAAAAAAAAUlRITAAAAAAAAAABQVEpMAAAAAAAAAABAUSkxAQAAAAAAAAAARaXEBAAAAAAAAAAAFJUSEwAAAAAAAAAAUFT/AeW/jQdkXAKgAAAAAElFTkSuQmCC", "text/plain": [ "
" ] @@ -585,12 +615,12 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 18, "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAACTEAAAPkCAYAAAB7yuiYAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAB7CAAAewgFu0HU+AAEAAElEQVR4nOzdd3gU5fr/8c+mk06NlFBCERCQ3nsRQVBBQBDpAor9KCKogKIePaAeC6CAiCCiouKhqQhSBOlNurTQW4AkJKRnfn/kl/nukk2yKZtN8P26rlyZ3XnmmXvK7szs3PM8FsMwDAEAAAAAAAAAAAAAAACAi7i5OgAAAAAAAAAAAAAAAAAA/2wkMQEAAAAAAAAAAAAAAABwKZKYAAAAAAAAAAAAAAAAALgUSUwAAAAAAAAAAAAAAAAAXIokJgAAAAAAAAAAAAAAAAAuRRITAAAAAAAAAAAAAAAAAJciiQkAAAAAAAAAAAAAAACAS5HEBAAAAAAAAAAAAAAAAMClSGICAAAAAAAAAAAAAAAA4FIkMQEAAAAAAAAAAAAAAABwKZKYAAAAAAAAAAAAAAAAALgUSUwAAAAAAAAAAAAAAAAAXIokJgAAAAAAAAAAAAAAAAAuRRITAAAAAAAAAAAAAAAAAJciiQkAAAAAAAAAAAAAAACAS5HEBAAAAAAAAAAAAAAAAMClSGICAAAAAAAAAAAAAAAA4FIkMQEAAAAAAAAAAAAAAABwKZKYAAAAAAAAAAAAAAAAALgUSUwAAAAoUOvWrZPFYpHFYlH79u1dHU6epKamqlGjRrJYLKpfv75SU1NdHRIAAECRsnPnTrm7u8tisej99993dTiFTkJCgipXriyLxaIuXbq4Ohzkk3nz5pnXREOHDnV1OABuIy1atJDFYlHt2rWVlJTk6nAAAAByjCQmAACA20z79u3NH8Tt/QUEBKhy5cp64IEH9PHHHysqKsrVIRdZs2bN0q5duyRJ7777rtzcsj+9joiI0LRp09SyZUuVLVtWPj4+qlSpkrp3764FCxYU6h8Zly5dmmF/Cg8Pz1Edhw4d0tixY1WvXj2VKFFCfn5+qlGjhoYMGaI1a9Y4J/BcSExM1IIFC9S9e3dVqlRJPj4+Klu2rFq2bKlp06YpIiLCqfNfv369Ro4cqZo1ayooKEjFihVTWFiYHnzwQS1atEjJyclOnb8jIiIi9Msvv2jKlCm6//77Va5cOZt9Y926dXmqO78/J67eppkxDENLlixRnz59VLVqVRUrVkylS5dW48aN9frrr+v06dO5qnf79u0aM2aMateurcDAQAUGBqp27doaM2aMtm/fnqs6T58+rcmTJ6tRo0YqXbq0ihUrpqpVq6pPnz5asmSJDMPIVb15VZT2lzVr1mjw4MGqUaOG/Pz8VKJECdWrV09jx47V4cOHc1VnUZq/owrzsXLy5MmZnmN5eHioZMmSCgsLU6NGjTR06FB98skn2r17t8viLewMw9BTTz2l1NRUVapUSU8++WSmZbM6v81se7hKYmKitm/frpkzZ2r48OGqW7euPDw8cpW04u3trddff12StHr1av34449OijrnnHGsyS/piV/2/tzc3BQUFKRq1aqpX79++uKLLxQXF+fSeAu7rL77cvuX0+uIf4qsrud9fHwUEhKi6tWrq3Xr1nr66ac1b968XJ0vZrVt3N3dFRwcrOrVq6tv376aM2eOYmJicrUMkydPthnXuHFjc9zgwYNzHHe6FStW2HymT548aY4LDw/P076Zl+uYvMiv88933nlHUtq198cff+zMkAEAAJzDAAAAwG2lXbt2hiSH/wIDA40vv/yywOJbu3atOe927doV2Hzz240bN4zSpUsbkozmzZs7NM2yZcvMaTL7a9iwoXHkyBEnR59zUVFRRvny5TPEe/LkSYfrePPNNw1PT88sl3/AgAFGdHS08xbEAYcOHTLq16+fZZxlypQxVqxYke/zjoiIMLp165bt57ZRo0bGoUOH8n3+jmrRokW2Ma5duzZXdTvjc+LKbZqVc+fOGR07dswyLn9/f+OLL75wuM6EhATjmWeeMSwWS6Z1WiwW47nnnjMSExMdrnfOnDmGn59flrF27tzZuHDhQi7WRO4Vlf0lKirKePjhh7Os09PT03j77bdzsxoK/fxzorAfKydNmpSj86z0v/r16xuffvqpkZyc7JK4C6tvv/3WXEeffvpplmVzus7d3d0LaClsffzxx4aXl1eWsQ0ZMiRHdSYnJxthYWGGJKNatWpGUlKSc4J3kLOONfmpUqVKOdpf7rjjDuPnn38usPi++OKLXO8PrpDb776s/nJyHfFPktPreUmGm5ub0b17d+OXX35xeD45nUepUqWMH3/8McfLMGnSJJtxH330kTnOz8/PiImJ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nTx5UrGxsUpKStLly5e1efNmvf3226pWrVqWrSNai4qK0j333KN+/fpp+fLlOn/+vBITE3Xu3DmtXr1aQ4cOVfv27XXx4kWH6pOkZcuWmcNF+QZ0QfPw8FCbNm0kSYmJiQ7vP/nFGceawqIwXhMlJydr9OjRatq0qaZPn67du3crMjJSKSkpio+P18WLF7V161Z9+umnevjhh21ae7Nn8eLFqlatmsaMGaPly5fr9OnTiouLU0xMjI4dO6YvvvhCnTp1Us+ePRUVFZWvy1KmTBndf//9ktJa3nHkARlJWrNmjcLDwyVJZcuWtUnkt+fIkSNq0qSJnnrqKW3cuFGXLl1SQkKCTp8+ra+//lrt27fXqFGjlJKSku28ExIS9Pjjj6tu3br697//re3bt+vy5ctKSkpSRESEtm3bpilTpqhatWr65JNPHFoeZytRooRNou9vv/2ma9eu5UvdxYoVM4fj4+PzXJ/1wysHDhzQrl27HJrOOuFp0KBBmbYSWhQUxPWK9THW+rcMAACAwqzonuEBAAAgX1jfBEt/stvVPvzwQ73++uvmj8ulSpVSjx49NHLkSI0aNUp9+vRRnTp1bJI4MrN48WLdc889On78uKS0H187dOigYcOGacSIEWrTpo08PDwkSVu2bFGLFi1sEkpuZX2zKP0mUlasn3Zs2LBhtuU9PT1tmpB31dOSH3zwgXbs2CFJmjp1qkqXLp2renK6/A0aNDCHU1JSzK7snM06zrp165r7RFaslyev28mRVsCs3do6x4EDB/I0f1dzxufE1ds0M9b13nHHHSpbtmye44qKitKFCxfslnekznPnztm9YZvT7VKuXDmbLpQKYh0W5v3lyJEjZktWFovF5vstt3XmhKvnnxNF9ViZGz179rTpkuePP/7IdpqpU6ea50VVq1bVgAEDNGLECHXq1Emenp42ZdNbWPL29lbDhg3Vr18/jRw5Uo899phN9z1JSUkaN25ctolMCQkJuvfee23Of8qVK6eHH35YI0aMUPv27eXh4aFNmzapd+/eDnXFGRERoT179khKOy9r1KhRttPcasOGDZo2bZrGjh2rl19+WdOmTdNvv/1WZFrlygvr88+CTGJy1rGmsCiM10Rjx47VrFmzzNfly5dXr169NGrUKD322GPq1auX7rzzTofq+uCDD/Twww+byYaBgYHq2rWrRowY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qlOnjvn+smXLbMo1a9bMHN60aVO+zDskJERlypSRlHZD+O+//852mg4dOpjDmzdvzjbxafv27eZTxD4+PmrRokUeInY96+Vft25dtuXTb1pIaYk5t3ab5SzW84qNjdWOHTuyLJ+QkKAtW7aYr627rSkIP/74o5KSkiSldb/YqFGjAp1/fnPG56SwbtPq1aurQoUK5uucfi4yiysvnzVn1FmxYkXzifr8VlT2Fx8fH5vWD/JruzjK1fPPiX/KsdIwDH3wwQfm69KlS6tTp075Und6i4pSWssM1kkX9mzcuNFuq5PW6tevbw5v3bo12xji4uK0f//+bMtZdw115MiRbMvnhnWCTbly5ZwyD1exTmK+6667CrRbJWcca4qCwnhNVKxYMfXp00fr1q0zE28SExP166+/2pRzxjVRfhk1apQ5nN760ty5c83vpr59+2ZoKSkrjnxPSWnHmXQNGza0GVe/fn3zfODy5cs6duyYw/MvDK5evWqT9HPvvffadM+eW7169VKrVq3M16+++mqe67zVoEGDZLFYJElHjx7V5s2blZKSoq+//tosczu1wiQVzPXK0aNHzeSo4OBgm65kAQAACiuSmAAAAJAp66f0smvBIT4+PkMikTN5e3vrnnvuMV9bt/4hST169DCHf/zxxwzjc6tp06bm8N69e7Mt3759e/OH4+joaP34449Zlp83b5453KVLlwJpPaBy5coOd49w8uRJm2lPnjxpjrOOPd2DDz5oDq9evTrbFhes67Ce1tn8/f1tbiTbWxZrP/74o9kNT4kSJfKtJQ1HJCQk6K233jJfP/744wU2b2dxxueksG5Ti8Wi+++/3+G4Nm/ebCZMuru7q2fPnnbLWX9evv32W8XFxWVaZ1xcnL777ju701q7//77zZZ8jhw5YnPTxB7rZXnggQeyLJsXRWl/sV632dV55swZrVmzxu60ueXq+TuqKBwr88O0adP0559/mq+ff/55+fr65kvd6Z9VybEulWbOnJltmfbt25vD3333XbYtRPzwww9Zfveka9KkiXmj+uDBgw61PJEThw8ftlnP1stxO7A+/7Q+Ly0IzjjWFAU5uSY6f/68Nm7c6NyArJQoUcImuSSra6K5c+c61LVoQenWrZtCQ0MlSb///ruOHTtm8/2e027Lzpw5k21yXUREhFauXGm+tk7Mk9KSw6wTQ2bM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W7duVfPmzVW1alU1bNhQJUqUUHx8vC5fvqy//vpL586dyza2sLAwtWjRwuzi6dChQ6pVq1aW05QsWVLffPONevTooeTkZP3222+qWLGiOnfurNKlS+v48eNav369+VR0+fLl9dVXX+VklRVqnTp10quvvmo+rfvuu+9qwYIFatOmjXx8fLRz507t37/fLN+lSxdNmDDBJbF+/fXXatq0qS5cuKDw8HDVr19f7dq1U9WqVXXlyhWtXr3a7KbHw8ND3333nYKDg/Nl3teuXdMbb7yhN954QzVq1FDdunVVsmRJ3bhxQ0eOHNGuXbvMsj4+Pvrf//7nsi4Bli5davMksD2PPfaY/P39bd67//779cYbb9gt76zPiSu3aVY++eQT7dq1SwcOHNDVq1fVoUMHNWvWTLVr11Z0dLR+//13mxbhZs2aZbakkJnhw4dr3bp1WrBggVJTU/Xss8/qo48+UvPmzSVJW7Zs0fHjx83yw4YNy7bFs5o1a2rmzJlmly4LFizQ8uXL1bFjRwUGBurgwYPaunWrWb5evXr68MMPc7w+cqoo7S+vvfaaNm3apN9//11xcXF6+OGH9eabb6phw4aKj4/Xhg0bdOHCBbP866+/btOdSl65ev6OKorHyqNHj+qpp56yeS8mJkaRkZEKDw/X/v37zRaB0rVq1UoLFixQlSpV8j2eKVOm6J577lFqaqp2796tunXrqlWrVgoLC1NMTIz++OMPc1u/9dZbmjVrlk6dOpVlnRMnTtTq1au1bds2paam6vnnn9e0adPUpk0b+fv768SJE9qwYYOSk5PVokULhYWFaeHChZJsu7i71cCBA83jwU8//WTTSpU9V69e1ZQpUzRlyhSVK1dO9erVU0hIiHx8fHTt2jXt3LkzQ+tTTz75pMtaK0xvacra6dOnzeGlS5faLZNdV2W///67oqKiJEn33XdfgRyvbuWMY01h5+vrq9dee81sHfGrr77SqlWr1KFDBwUGBurMmTPasGGDbt68qTp16qhr165677338jzfvXv3asyYMXryySdVtWpV1alTR6VKlVJSUpIuXLigP//806aVspdfftnsns1a586dNXPmTD3xxBNKSUnRzz//rF9++UW1a9dWvXr1FBgYqJs3b+rChQvau3evrly5kufYHRUaGqp7773Xpos3Ly+vXO0zTzzxhP73v//pl19+UeXKldW+fXuFhobq6tWrWrt2rc151SOPPJJl12SfffaZLly4oFWrVikxMVETJkzQm2++qWbNmqlixYry9vZWZGSkjh8/rv3795utPzVq1CjHcWdl5cqVNq0dp6amKjo6WpGRkTp48GCGrr4laeTIkfrggw/k7e2dr7FIUteuXdWsWTPz3G/KlCn52tqdv7+/evfurQULFti8X7x48Uy7VHbEpEmTFBAQ4HD5Dh066KGHHsr1/HLKWdcrR48e1cGDByVJDRo0yPZ3CwAAgELDtTlUAAAAyG/52RJTutdff93u05Dpf3feeaexf//+bJ8oNozsW2JavHixTQtLWf25ubkZY8aMydCqz6327NljNGrUyKE69f+ffty9e3em9c2ZMydX63jp0qVGqVKlspy3vZYT7Dlx4oTNdPPnz3c4jrzI7VOtqampxpQpU2xadLH3179/fyMqKirb+ubOnWsznb2nznPr0KFDRv369bOMs3Tp0sby5cuzrSsnT10vWrTIof2zcePGxs6dOx1enooVK5rTDh8+3OHpsnLrU8iO/jnS8kR+fk7S5ec2zU/nzp0zOnbsmGVc/v7+xty5cx2uMyEhwXjqqaey/B61WCzGM888k+13p7XZs2dn+mR8+l+nTp2M8+fP52ZV5FpR2V8iIyONfv36ZVmnp6en8dZbbzlUX05bWMvv+Q8ePNicLiwszKFpHFXYj5W3thjj6F/Dhg2N2bNnZ2jFKDPW0+bEzJkzDQ8Pj0zjcHNzMyZOnGikpqba7EdZHc+vX7+e7XdVy5YtjQsXLhiPPPKI+d6SJUuyjLV169bmd9KJEyccXh/Z/RUvXtyYPXu2Q+vLukUoNzc3h6ZxRG72EUe29WOPPWaWzazV0HSpqak2db/xxhv5tXj5fqxxxnbIz5aYDCOthSnr9W/vr3nz5sbZs2dtvidy2xLTtGnTHN5vvLy8sm3F1DDSWk6sXr26w/Xeddddxrlz5xxeR7ld5z/99JPNfPv06ePwtLeu60OHDhl33nlnlss1fPhwIykpKdu6k5OTjddee83w9fV1aH15enoaTz75pN26ctsSk6N/7u7uRo8ePYzVq1c7vO6sp89JC6orVqywmdbePPPym8StrfhKMp544okc1XHr+s7p37PPPmu33qJyDZruzTffNKf9+OOP8y1WAAAAZ6MlJgAAAGRr4sSJ6tKliz7++GP98ccfunz5sgIDA1WtWjX1799fI0aMkL+/v7Zv357nefXp08d86nXTpk3au3evTpw4ocjISElSUFCQatSoodatW2vw4MGqXbt2tnXefffd2rFjh1atWqWffvpJmzZt0vnz5xUZGSlvb2+VLl1ad955p5o1a6auXbuqRYsWslgsmdY3cOBAjR8/XleuXNHcuXM1ceLELFsbSNezZ08dPHhQX3zxhZYsWWIuV0hIiO666y4NGDBAAwYMkKenZ7Z1/fXXX+ZwUFCQevToke00rmSxWPTqq6/qoYce0pw5c7Rq1SqdOXNGSUlJKlu2rFq0aKEhQ4aoc+fODtVnvfxt27a1+9R5btWsWVNbt27VN998o0WLFunAgQO6dOmSgoODFRYWpt69e2vYsGEqVapUvs1Tknr06KElS5ZozZo12rp1qy5cuKArV66oWLFiKlu2rJo2baq+ffuqW7duDu1vknT9+nWdPXvWfP3oo4/ma8zOkJ+fk3Su2qbZKVeunFavXq0lS5Zo4cKF2rVrly5cuCB/f39VrFhRPXv21IgRI1SxYkWH6/Ty8tLHH3+sQYMGae7cuVq3bp3Zylz58uXVvn17jRgxIseteD322GO655579Pnnn2vZsmU6ffq0YmJiVLZsWTVs2FCPPvqoHnzwwSy/O52hqOwvQUFB+vbbbzVy5Eh9+eWX2rx5sy5cuCBPT0+Fhoaqa9euGjFihNOekM/v+Vt/B+f390pRPla6u7srMDBQgYGBKlmypOrWratGjRqpbdu2uvvuu50673SPP/64WrVqpQ8++EBr167V+fPnVaxYMZUvX14dO3bU8OHD1aBBgxzVGRwcrDVr1ui7777T/PnztXPnTl27dk2lSpVSrVq1NGjQID3yyCPy9PS0aSkzu1YinnvuOW3cuFGGYWjOnDl66623Mi37999/a/Pmzdq8ebPZUkxERIRiYmLk7++vMmXKqFGjRurcubP69+8vX19fh5bNmftyfouJidE333wjSapevbruu+++LMtbL5uHh4f69++fb7Hk97GmKGwHNzc3zZ49W7169dKsWbO0detWXb16VSVLllStWrX06KOPatCgQTk63mTlhRde0EMPPaTffvtNf/75p/bt26fw8HBFR0fLzc1NwcHBqlWrljp27KjBgwerUqVK2dbZoUMHHTp0SD/99JNWrFihLVu2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D3cXRwfAEZVL+emjAQ00ul2Y3v3liCZ0r5lp2fCIWAX4eKikv3cBRggARU98fLyGDRumb775JsO4/fv3a//+/Zo5c6YWLVqknj17ZlnXpUuXdO+992rPnj0272/fvl3bt2/XqlWr9NNPP8nN7f+en3zwwQf1xBNPKD4+Xt98843uvffeTOtPSkrS999/L0nq3r27ihcv7rRlycyqVavUt29fRUdH27x/6tQpnTp1Sl999ZWefPJJffTRRzbLac/cuXM1evRom+Sus2fPat68eVq0aJEWLFigvn37Zjr9tGnTNGHCBCUlJdm8f/LkSZ08eVLz58/Xq6++qjfeeCMXS5rm4sWL6tixow4dOmS+d/PmTf3555/6888/9cMPP+hf//pXrusHAAAAAMARtMQEAACAIuns9ZuZjmtRtaS61blDY9pX1fqXOmhE6yokMAFF0F3lgjR/eFPVvCNj62qSZBiGxn6/V+2nrtOsDceVmJxawBECQNFgGIb69OljJv307NlTCxYs0KZNm7R582Z9+OGHqlixomJjY9WnT59sW/bp3bu3Dh48qGeeeUa//fabdu7cqa+//lq1atWSJC1btkyzZ8+2mSYgIED33HOPJGnJkiWKj4/PtP6ff/5Z165dkyQNHDjQqctiz549e9SzZ09FR0fL09NTzz//vNauXatt27bps88+U5UqaV2cTp8+XePHj8+2rscff1xlypTRxx9/rK1bt2r9+vUaN26cvL29lZCQoIEDB2Ya59SpUzV27FglJSWpXr16mjlzplavXq0dO3Zo4cKFatGihQzD0JQpU/TRRx/leFklKTk5WT169DATmO655x4tWbJEO3bs0I8//qjOnTvr119/1auvvpqr+gEAAAAAcBQtMQEAAKBIuXIjQe+tOqLvdpzR4sdbqFGlEnbLzRjY0OzuBMDt6dcDF7U9PK2LobdXHtY3285oYs/adD0H3I5iI3I/rZef5Fksk3qvSjJyV69nsbS67bl5TTJykFjpVyp3MThozpw5WrFihTw9PbV06dIMrSA1b95cgwYNUps2bXTgwAE999xzWXaXlt7aUvv27c33GjZsqK5du6p27dq6dOmSZsyYodGjR9tM17t3by1dulTR0dFavny5+vTpY7f+r7/+WpIUGBioHj16OHVZ7Bk1apQSExPl7u6u5cuXm8lXktSkSRP17dtX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/NZxLHv3JPYklkKl7rqtEA1cS8d54dt7psDTTr8cuVKtwePfJeGJ75LQplKbKDoiAoC1a9cCACorK/HAAw8YnfPss88iNTUVAHDnnXfCzOyvlpBmZmZYvXo1ACAhIQGbNm0yWF+lUuHOO++EUtl1e+EZM2YAOF8V6sSJEwbjZWVluP/++3vwXRkXFPRXO+uOpKyLvfPOO/jxxx+73I67u7vucU5OTqfz7OzssG7dOgDAyZMn8fDDD3fZKq+8vBwffvihwb6uu+46AMBPP/2Er776ymC9pqYm3H333V3G3BN33323rsrUXXfdZTTR6/PPP8cvv/xyxfsiIqKuubu76xJhO4wcORIeHh4mioiIiIYqDw8PJsjSFWE7OSIiIho0tFotPjyWhxf3phlU5LE2k2DzTaMxL9zNNMHRFdFotDiaWYmPjufheHZVl3OtZGLcONYLKyf7IthV3k8REtFAFepugxduiMQTC0LxfXwxPv8jH+lljUbnnjlXizPnauFha46Vk/3w9wnesLNkq7nBJtLLFj+tuwrrvojHqVz95OWdpwuQXtaAd28dB1cb8062QER96Z577sHnn3+OU6dOYdu2bcjPz8d9990HHx8fpKenY9euXbqklREjRuCpp54y2MbTTz+Nr776CkVFRXjssceQkJCA2267DS4uLsjMzMTmzZtx5swZREdHd1ll6a677sLWrVuhUqmwePFiPP3005g6dSqUSiVOnDiBzZs3o729Xdf27FKNGTMGERERSE5OxnvvvYfa2lqsXLkS7u7uKCoqwo4dO/DNN9/gqquuMppEdeF2zM3NoVAo8NRTT0EqlcLX1xci0fn7Tz09PWFhcT5589lnn8XRo0fx559/4o033sCRI0dw5513IioqClZWVqitrUVKSgoOHjyIvXv3IjIyEmvWrNHb32uvvYYDBw6gsbERK1aswNGjR7F06VLY2NggMTERL730EjIzM7t9frszevRorF27Fm+99RZiYmIQHR2Nxx57DJGRkaivr8fXX3+N999//4r3Q0RE3ZNKpRg1ahTOnj2L1tZWhIaGwsXFxdRhERHRMNTc3AwLCwvd5x2iizGJiYiIiAaFVqUaj32biJ/OlhiMBThb4f2V0Qh0YRWewaZVqca3cUXYdiIPOV1UXAKAQBdr3DbZFzeM8YTcXNpPERLRYGFtJsHKSb64daIP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fbRH+fbt2w2LxdJrmzEMw7kPd23xzTffNBwOh9vtDx06ZKSnpzv388Ybbwz0VOBlg30euWnTpj7vmXItMbp4u01xTwkn8+zwueee6zO34uOPP3bWueyyy3rcO6qoqHD+TouOjjaqq6sHeSYnx/UkjYAPPPnkk/rOd76jlpYWXXDBBfrlL3+pefPmqaWlRS+//LKeeeYZScfnsl62bJmfo8VI9tOf/lQdHR268sorNXv2bGVmZiokJESVlZXavHmzVq1a5RyO8eyzz/b4FCIYXbZu3arc3Fzn151tS5Jyc3O7vR0kSUuWLOmxj5ycHN1999367W9/qz179ug73/mO7r33XmVlZenw4cNauXKlvvjiC0nS3Xff7Zf5ajE8DLY95ufna968eZo9e7YWLFigqVOnKiEhQZJ05MgRvf7663r99dedb4M8/vjjjGQHt6677jpt2LBBkvS9731Pt956q7766iu39YOCgpSTk9NjPX0kPMET7ZE+Ep60fPlyLVu2TFdeeaXOPvtsZWVlKTw8XA0NDdq7d6/WrVunbdu2STreHp955hmZzeZu+4iNjdXKlSt1xx13qKCgQGeccYbuv/9+TZkyRSUlJXriiSe0adMmScd/BubOnevr08QwMdj2WFdXp3nz5um0007TFVdcoenTpyspKUlms1lHjx7Ve++9pxdeeME5DdAvfvELTZ8+3S/nitGDa0jAu3Jzc7V169Zu6xobG53/nnj/4aKLLtLYsWMHfByud0aXu+++W6+88ooOHjyoe+65R7m5ubr22msVEhKiTZs26eGHH5bNZlNISIieeOKJkz7OwoULlZ2drUWLFmnWrFlKTU1VcHCwSktL9eGHH2rNmjXO9nz11Vdr0aJFHjpDeIovnkdyLTG6eLtNcU9p9PHEs8P++N73vqdrr71WL7/8st555x2df/75uvPOO5WcnKy9e/fqN7/5jY4ePSpJWrlypWJiYk7qOIPml9Qp4H+98847RmRkpDPj78RPTk6OcejQIX+HiRGu862fvj5XXnmlUVNT4+9wMcwtXry4X+2t8+OO3W43brnlll63vfXWWw273e7Ds8NwM9j22PWNkd4+oaGhxqpVq/xwhhhOBtIW1cfbuvSRGCxPtEf6SHhSf/9mSU1NNTZs2NDrvh544AHDZDK53cf8+fP7HGUHo9tg22PXN0p7+5jNZmP58uW9jnwA9Ed/RmIyDK4hAW/qOjJAfz6uflb7MxJTJ653Ro9Dhw4ZEyZMcPu9joyMNN59991e99HXfYb+ttsf/vCHRmtrqxfOEp4wmOeR/RmJyTC4lhhtvNmmuKc0+nji2WF/RmIyjOMjw82fP9/tvgMCAvw+SxYjMcGvFixYoC+//FJPPvmk3n//fRUVFSkoKEjZ2dm66qqr9JOf/EShoaH+DhMj3F//+ldt2bJFO3bs0JEjR1RZWan6+nqFh4crLS1NZ511lhYvXqzZs2f7O1TAKSAgQGvWrNGVV16pZ555Rrt371ZlZaXi4uI0c+ZM3X777br44ov9HSZGuOnTp+tvf/ubduzYoT179qi0tFSVlZWy2WyKiYnRt771LZ177rm67bbbnG+KAL5AH4mhgD4SnvThhx/q/fff17Zt25Sbm6uysjJVVVUpJCRECQkJmjZtmi699FJdffXVff4NvWLFCl144YX685//rE8++URlZWWKjo7W1KlTdfPNN+u6667z0VlhuBpse0xOTtZrr72mHTt2aNeuXSouLlZlZaVaW1sVFRWlU045RXPnztVtt92mzMxM358gRi2uIYGRg+ud0SM7O1tffPGF/vznP+u1115Tbm6u2tvblZaWpvnz5+vnP/+5MjIyBnWMd955Rzt27NCnn36qgoICVVZWqqmpSZGRkRo/frzOOecc3XLLLTr11FM9dFbwBl88j+RaYnTxZpvinhK8KSQkRO+//75efPFFrV27Vv/5z39UW1urxMREnXPOOfrJT37i92fiJsP433HGAAAAAAAAAAAAAAAAAMAPAvwdAAAAAAAAAAAAAAAAAIDRjSQmAAAAAAAAAAAAAAAAAH5FEhMAAAAAAAAAAAAAAAAAvyKJCQAAAAAAAAAAAAAAAIBfkcQEAAAAAAAAAAAAAAAAwK9IYgIAAAAAAAAAAAAAAADgVyQxAQAAAAAAAAAAAAAAAPArkpgAAAAAAAAAAAAAAAAA+BVJTAAAAAAAAAAAAAAAAAD8iiQmAAAAAAAAAAAAAAAAAH5FEhMAAAAAAAAAAAAAAAAAvyKJCQAAAAAAAAAAAAAAAIBfkcQEAAAAAAAAAAAAAAAAwK9IYgIAAAAAAAAAAAAAAADgVyQxAQAAAAAAAAAAAAAAAPArkpgAAAAAAAAAAAAAAAAA+BVJTAAAAAAAAAAAAAAAAAD8iiQmAAAAAFq7dq1MJpNMJpPy8/P9HY5PZGZmOs+585OZmenvsFxavnx5j1hNJpM2b97s79AAAAAAAAAAAPAIkpgAAACAYSw/P99lcstAPwAAAAAAAAAAAP5EEhMAAACAUe3yyy/X3r17tXfvXm3YsMHf4bj0ox/9yBnjs88+6+9wAAAAAAAAAADwOIu/AwAAAABw8lJSUrR371635VOmTJEkzZgxQ88995zbeqeeeqqWLFni6fCGhejoaJ166qn+DqNXCQkJSkhIkCRVVlb6ORoAAAAAAAAAADyPJCYAAABgGAsMDOxXAk5YWNiQT9QBAAAAAAAAAACjF9PJAQAAAAAAAAAAAAAAAPArkpgAAAAAaO3atTKZTDKZTMrPz+9RPnfuXJlMJs2dO1eSlJubqzvuuEPjx49XSEiIMjMzdeutt6qgoKDbdl999ZVuvvlmjR8/XlarVWlpafrhD3+o8vLyfsX11ltv6aqrrlJ6erqsVquio6M1Y8YMrVixQjU1NYM97X7LzMyUyWRyTrn3zTff6Ac/+IEyMzMVHBysxMRELVy4UDt37ux1P62trXrqqac0d+5cxcfHKzAwULGxsTrllFN08cUX6/e//73L/38AAAAAAAAAAEY6ppMDAAAAMCAbN27UokWL1NDQ4FxXUFCgZ599Vu+99562bNmiiRMn6qWXXtKSJUvU3t7urFdUVKS//OUv+vvf/67t27crOTnZ5TFqamr0/e9/X//85z+7rW9ra9Nnn32mzz77TE8//bTefvttnXnmmd45UTfefPNN3XDDDWpubnauKy8v11tvvaV3331X69at0zXXXNNju9LSUp133nnat29ft/U1NTWqqanRwYMH9Y9//EMlJSV6/PHHvX4eAAAAAAAAAAAMJYzEBAAAAKDfSkpKdPXVVys6Olp//OMf9emnn+qTTz7RnXfeKZPJpPLyct12223avXu3brrpJmVlZWn16tXatWuXNm3apBtvvFHS8aSn//N//o/LY7S1tem8887TP//5T5nNZt1444166aWXtHPnTn3yySf6zW9+ozFjxqi8vFzz58/vMfqTN+3du1fXX3+9EhMT9ac//Uk7d+7Ujh07tHz5clmtVtntdi1dulQVFRU9tv3pT3/qTGC64YYbtH79eu3cuVO7d+/WO++8owceeEBTp0712bkAAAAAAAAAADCUMBITAAAAgH47dOiQJkyYoG3btik+Pt65/uyzz5bFYtHjjz+ubdu26ZJLLtGsWbP00UcfKTQ01Flv7ty5am1t1WuvvaY33nhDFRUV3fYjSb/+9a/1+eefKzo6Whs3btT06dO7lZ999tn6r//6L82ePVulpaX65S9/qXXr1nn3xP/X559/runTp+uf//ynIiMjnevPPPNMZWdn64YbblB9fb3+9re/6a677nKWt7a26p133pEkLVu2zOVISwsWLNCKFStUXV3t/RMBAAAAAAAAAGCIYSQmAAAAAAPy1FNP9Ug8kqQf/ehHzuXKykqtXr26WwJTpx/+8IeSJJvNph07dnQra2xs1J///GdJ0kMPPdQjgalTRkaGfvWrX0mSXnvtNTU1NZ3cyZyEZ599tlsCU6frr7/eOT3eJ5980q2surpaHR0dkqTvfve7ve4/NjbWQ5ECAAAAAAAAADB8kMQEAAAAoN+io6N14YUXuiwbN26cIiIiJEmnnXaaJk2a5LJe1ynTjhw50q1sy5YtqqurkyR9//vf7zWWzmSgjo4OffbZZ/07gUGaMmWKTjvtNJdlJpNJp59+uqSe5zVmzBgFBQVJkl544QXZbDbvBgoAAAAAAAAAwDBDEhMAAACAfpswYYJMJpPb8ujoaElSTk5On3UkqaGhoVvZnj17nMtJSUkymUxuP6eeeqqz7rFjxwZ4Jidn4sSJvZZ3jqJ04nkFBwfrmmuukSS9/vrrys7O1j333KMPPvhAtbW1XokVAAAAAAAAAIDhhCQmAAAAAP3manq4rgICAvqs11lHkux2e7ey8vLyk4qrubn5pLYbqP6e/4nnJUl/+tOftGDBAklSQUGBHnvsMV1yySUaM2aMZs6cqccee8w5ChUAAAAAAAAAAKONxd8BAAAAAECnrsk/n3/+uQIDA/u1XWpqqrdC8pjIyEi988472rVrl1599VVt3rxZ//73v2W327Vnzx7t2bNHjz/+uN566y3Nnj3b3+ECAAAAAAAAAOBTJDEBAAAAGDLGjBnjXI6Pjx8WyUkDNWvWLM2aNUvS8WnnNm/erLVr12r9+vUqLy/XlVdeqcOHDyskJMTPkQIAAAAAAAAA4DtMJwcAAABgyDj99NOdy9u2bfNjJL4RERGhBQsW6I033tDPfvYzSVJpaam2bt3q58gAAAAAAAAAAPAtkpgAAAAADBnnnXeeQkNDJUlPPfWUDMPwc0S+c+655zqXKysr/RgJAAAAAAAAAAC+RxITAAAAgCEjOjpaP/nJTyRJ27dv11133SWHw+G2fllZmVavXu2r8E7akSNHtGXLll7rbNiwwbk8btw4b4cEAAAAAAAAAMCQYvF3AAAAAADQ1a9//Wtt2bJFn376qZ588klt3rxZP/jBDzRt2jSFhYWppqZGX3/9tTZu3Ki///3vmjJlim677TZ/h92ro0ePat68eZo8ebIWLlyoGTNmKCUlRZJUWFioV155Ra+++qokadq0aTrjjDP8GS4AAAAAAAAAAD5HEhMAAACAISU4OFgfffSRlixZovXr1+s///mPc3QmVyIjI30Y3eDs27dP+/btc1s+ceJErV+/XiaTyYdRAQAAAAAAAADgfyQxAQAAABhyIiIi9MYbb2jr1q3661//qk8++UQlJSVqaWlRZGSksrKyNGvWLF1yySW64IIL/B1un8455xxt3rxZH374oXbu3KnCwkKVlZWptbVVsbGxmjp1qhYtWqQlS5YoODjY3+ECAAAAAAAAAOBzJsMwDH8HAQAAAAC+lpmZqYKCAi1evFhr1671dzj9tnnzZs2bN0+StGnTJs2dO9e/AQEAAAAAAAAA4AGMxAQAAABgVKutrdVXX30lSQoKClJOTo6fI+qpvLxc5eXlkqS8vDw/RwMAAAAAAAAAgOeRxAQAAABgVHv77bf19ttvS5IyMjKUn5/v34BcePrpp7VixQp/hwEAAAAAAAAAgNcE+DsAAAAAAAAAAAAAAAAAAKObyTAMw99BAAAAAAAAAAAAAAAAABi9GIkJAAAAAAAAAAAAAAAAgF+RxAQAAAAAAAAAAAAAAADAr0hiAgAAAAAAAAAAAAAAAOBXJDEBAAAAAAAAAAAAAAAA8CuSmAAAAAAAAAAAAAAAAAD4FUlMAAAAAAAAAAAAAAAAAPyKJCYAAAAAAAAAAAAAAAAAfkUSEwAAAAAAAAAAAAAAAAC/IokJAAAAAAAAAAAAAAAAgF+RxAQAAAAAAAAAAAAAAADAr0hiAgAAAAAAAAAAAAAAAOBXJDEBAAAAAAAAAAAAAAAA8CuSmAAAAAAAAAAAAAAAAAD4FUlMAAAAAAAAAAAAAAAAAPyKJCYAAAAAAAAAAAAAAAAAfkUSEwAAAAAAAAAAAAAAAAC/IokJAAAAAAAAAAAAAAAAgF+RxAQAAAAAAAAAAAAAAADAr0hiAgAAAAAAAAAAAAAAAOBXJDEBAAAAAAAAAAAAAAAA8Kv/H0uTPjFr7/y8AAAAAElFTkSuQmCC", + "image/png": "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O3bs0EsvvaQuXbpo6dKlJ50rKytLw4YN06OPPqrNmzerpKREJSUlWr9+ve69915deeWVstvt1cZcfvnl8vb2liQtXLiwzvmrqqq0aNEiSdKECRMUEhLSZOdSm+XLl6tTp0564YUXtGXLFhUWFqqyslIHDx7URx99pJEjR2r69Ok1ztOV9957T8OHD9fChQuVlpamyspKpaWlad68eerbt68+//zzOse/9NJL6tGjh1599VXt2LFDRUVFqqioUEpKij744AMNHjxYzzzzTIPPFQAAAACAloIkJgAAAAAAAOAM5nA4NHnyZGfy0KRJkzR//nytWbNGa9eu1Wuvvaa4uDiVlpZq8uTJJ13Z58orr1RiYqLuu+8+ff/999q4caM++eQTde/eXZK0dOlSvf3229XGBAQEaPz48ZKkxYsXq6Kiotb5v/nmG+Xl5UmSbrjhhiY9F1e2bNmiSZMmqaioSJ6ennrwwQe1YsUKrVu3Tm+99ZY6dOggSXrjjTf0+OOPn3Suu+66S5GRkXr99df1+++/a9WqVXrsscfk5eWlyspK3XDDDbXGOWvWLD3yyCOqqqrSOeecozfffFM//PCDNmzYoI8//ljDhg2Tw+HQ888/r9mzZ5/yuQIAAAAA0JJ4uDsAAAAAAAAAoC5HSiobPNbPy0PeniaXbXmlFjkcjgbN62M2ydfs+tZaQZlFNnv95w3z92pQDPX1zjvvaNmyZfL09NSSJUt00UUXVWsfOnSobrzxRo0cOVI7d+7UAw88UGe5tPXr12v58uUaPXq0c1///v114YUXqkePHsrKytKcOXN05513Vht35ZVXasmSJSoqKtJXX32lyZMnu5z/k08+kSQFBgZq4sSJTXourtxxxx2yWCwymUz66quvnMlXkjRo0CBNmTJFI0aMUGJiol566SXddNNN6tmzp8u5tm7dqvj4eP32229q06aNc/95552nCy+8UOPHj1dVVZXuuecerVu3rtrYxMREPfnkk5KkZ599Vs8++6yznJ8kDRgwQNdee61uvvlmffTRR3ryySd144031li5CgAAAACA1oIkJgAAAAAtmsPhkM3uUJXNIYcctb5gXFJpVbnFJqNBMhkN8vY0ycvDWO3FPgBA6zTgrz80eOxfLuupm4a1d9k27pVVyiu1NGje+8d21oMXdHHZNuVfa7U3u6Tecx148ZIGxVAf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//pXAMAVV1yBb37zm0nrt27dOuNDsW3atIkjrxAREWWZJEnw+Xzx++FweN597z2rf5r9+/dj27ZteOCBB3JdChHNQkqlEsXFxWnXx2IxdHd3x+/7fD6cOHECjY2NKCoqQmlpafzqFCIiIiIiIiLKnWg0iq6uLnR2dsLv9wOQL2Sqra2FRqNJ2t5kMmH16tWwWq3sukxENM9IkgRRFCGKIpRK5aSHBe3+4AN88PDD6DlwAGGPBxqzGYVr1mD17bfDsXr1DFWdXcPdCJcsWZLjSoiIiCib/H4/RFFMWGYymcYccn2umXUhps7OTjz11FN48skncejQIQBgiImIpqSnpwexWCxpuSiK8e5MFosFpaWlKCwsnPSHYSIiIiIiIiKaHq/Xi/b2dnR3dyediJUkCU6nExUVFSkfm5eXl4UKiYgomwKBAKLRaPy+Tqeb8Hnbzt278cbdd6PjnXeS1nW8+y4+eOghlG3ciE0PPICS9eszVnMuhMNhAODwqURERAvMyC5MgDycnFqtnlchplnxjX0gEMDTTz+Niy++GJWVlfi///f/4tChQ2xDSUTTYrPZUF1dPeYYoG63G0eOHMG7776LxsbGefUCT0RERERERDQbiaIIp9OJ/fv3Y+/evejq6koKMA1zOp1Zro6IiGaTVBepptKwfTueueCClAGmkdp37cIzF1yAhu3bM1FeVm3duhWCICR0IPze974XXyYIArZs2QIA2LJlCwRBQHV1dcp9DW//3e9+FwCwe/duXHvttSgvL4dWq0VZWRluuOEG1NfXp61nx44d8f3s2LEj5TbHjh3DV7/6VaxYsQJmsxkajQalpaVYs2YNbrnlFjzzzDMIhULj/ux/+ctfcNlll6G4uBharRY1NTW488470dbWNu5jiYiI5hOv15twfz6OOpTTTkxvvPEGtm3bhj/96U/xX/ZwcKmkpARXXnklPvvZz+ayRCKaw7RaLaqqqlBZWYn+/n50dnait7c35bbRaBStra1obW2FxWJBXl4eBgYGslswERERERER0Tym0WhQVFSEQ4cOJXTZSEWv16OkpARFRUVZqo6IiGaD0V2X0oVcR+rcvRsvfe5ziAaDEzpGNBjES5/7HK5+880535EpE37961/jrrvuSvjb3NHRgaeeegp/+tOf8L//+7+44IILJr3f5557Dtdff328a9Sw4VESPvjg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d2LRpZdmtF5K9Pvf/x5VVVW49NJL8fOf/xyvv/469u/fjzfffBO//vWvcc4556C9vR0AcMcdd+S4WiIiIppNctZjSqlUYvPmzdi8eTPcbjeeeeYZPPnkk9i1axckSYLT6cTDDz+MRx55JOXwTEREs5VCoUBRUREcDgf6+/vhdDpRWFiYdvuPPvoIOp0OFRUV0E3waiEiIiIiIiKi6Ug3JA8AFBYWoqmpCcFgEGq1GmVlZSgtLYVarc5ylUREtFAJggCdTgdBEBICTWMpWb8e1779Nro/+AAHH3kE3QcOIOzxQGM2w7FmDVb94z/CsXp1FqonAIhEInj55Zfx8ssvp93mjjvuwNe+9rUsVkVERESz3awYKM9iseC2227DbbfdhubmZjzxxBN46qmn0NDQkOvSiIimTBAE2O122O32tNsMDg6ir68PANDZ2YmioiJUVlZCr9dnq0wiIiIiIiJaQERRhNPpREtLC5YvXw6LxZK0jSAIqKmpQTQaRVFRUdKQPkRERNmgUk3tKyzH6tW46Fe/ynA1NBkPPPAAPvGJT+Bvf/sbDh48iM7OTvT09ECpVKKiogLnnHMOvvjFL+K8887LdalEREQ0y8yKENNI1dXV+M53voPvfOc72LVrF5588slcl0RENGNaWlri85IkoaurC11dXXA4HKisrEwYko6IiIiIiIhoqkRRRGdnJ1pbWxEKhQAAJ0+exMqVK1Nu73A4slkeERERTcJYQ+sBwNatW7F169YpP37Yjh070q7btGlT2v3YbDZcd911uO666yZ0nJGqq6snXF9zc/Ok909ERESz26wLMY20ceNGbBxn/GIiorkqFAqhv78/5bru7m50d3fD4XCgqqoKBoMhy9URERERERHRfBCLxeLhpXA4nLCur68PHo8HZrM5R9URERERERERUToulwtNTU2wWq3xSavV5rqsGTWrQ0xERPOZVqvFhg0b0NbWhs7OToiimLTNcJipqKgIVVVVHGaOiIiIiIiIJmS481JLS0tSeGmknp4ehpiIiIiIiIiIZqH+/n74fD74fD50dHTAarVizZo1uS5rRjHERESUQzqdDnV1daisrERrays6OjpShpmcTiecTieKi4tRWVnJMBMRERERERGlJIoiurq60NLSEh82LhWLxYKqqirYbLYsVkdERDQ9kiRBEIRcl0FERESUFaNH9VkI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EyRJwsmTJxOW6fV65Ofn56iiuYchJiIiWnBEUUR9fX38JEU0GkV9fT3q6+sRiURyXB0RERER0fwmSRKcTif27NmDrq4uNDQ05LokIiIimucEQUjqgODxeNDf35+jioiIiGg+ikQiCIVCCcsqKio4hO0kMMREREQLTjAYTBlW6u7uxp49e9DX15eDqoiIiIiI5r9IJIL6+nocOXIk3oGps7MTLpcrx5URERHRfOdwOKDT6RKWtbS05KgaIiIimo80Gg02bNiAJUuWQKfTQavVoqioKNdlzSkMMRER0YJjMBiwbt06FBYWJq0Lh8P48MMPcfz48bTDWhARERER0eT19fVhz5496OnpSVp38uRJDudCREREM0oQBFRWViYsGxwcxMDAQG4KIiIionlJoVCgpKQEGzZswKpVq6BQMJYzGfxtERHRgqRWq3Haaadh+fLlUKlUSes7Ojqwd+9euN3uHFRHRERERDR/xGIxnDhxAh9++CHC4XDS+qKiIqxatYqt1YmIiGjGFRUVQavVxu+bTKYcVkNERETzmSAIMBgMuS5jzkn+1paIiGgBcTgcsFqtOHr0KPr7+xPWBQIB7N+/H1VVVaisrGRSmoiIiIhokjweD44cOQK/35+0TqVSYcmSJSk7pBIRERHNBIVCgYqKCjidTlRVVcFutzNITURERDSLMMREREQLnlarxcqVK9HR0YHGxkaIopiw/uTJk+jr68Py5cuh1+tzVCURERER0dwhSRJaWlrSDhNns9mwdOnShE4IRERERNlQWlqK0tJShpeIiIiIZiGGmIiIiCC3dCwrK4PNZsORI0fg8XgS1ns8HuzduxfLly9Hfn5+jqokIiIiIpr9AoEAjhw5knJoZoVCgdraWn5xSERERDnD9yBERESUSX6/H6IocpjaDGGIiYiIaASDwYA1a9bErxofSZIkjl1LRERERJSGJJIDX/QAAKB3SURBVElwOp04ceIEYrFY0nqTyYTly5fzPTURERERERERzRsNDQ3o6+tDYWEhqqqqYDQac13SnMYQExER0SgKhQLV1dWw2+04cuQIAoEAAGDx4sUcTo6IiIiIaAz9/f0pA0yVlZWoqqqCQqHIQVVERERERERERJk3ODiIvr4+AEBPTw96enpw+umno6CgIMeVzV08c0RERJSGxWLBmWeeieLiYhQUFKCoqCjXJRERERERzVqCIGDx4sXQ6XTxZTqdDmvWrEFNTQ0DTERERDRrSZKE/v5+HD9+HJIk5bocIiIimiOam5sT7qvVathsttwUM0+wExMREdEYlEolli5dClEUIQhCym1isRjC4TC7NBERERHRgqdSqbBs2TIcOHAAxcXFqKurg1KpzHVZRERERGkNDg6iqakJg4ODAID8/HzY7fYcV0VERESz3cDAAAYGBhKWVVZW8jzINDHERERENAFjXTXe1NSErq4u1NXVoaioKG3YiYiIiIhovpAkKe37XqvVivXr18NgMGS5KiIiIqLJkSQJR44cQTAYjC9ramqCzWbjOT4iIiJKS5IkNDU1JSzTaDQoLS3NUUXzB/t4ExERTYPL5UJ7eztisRiOHj2K+vp6RCKRXJdFRERERDRjuru7sXv3boRCobTbMMBERETzhd/vx49+9COsX78edrsdRqMRy5Ytwz333IOTJ09Oe//Nzc0QBGFC05YtW6b/A1ECQRBQVVWVsMzr9aK3tzdHFREREdFc4HK54Ha7E5ZVVVWN2RSBJoa/QSIioikKh8M4evRowrKenh7s3bs3qX0kEREREdFcNzK4HwgEcOTIEUiSlOuyiIiIZsyJEyewZs0afOtb38KePXvQ398Pv9+Po0eP4qc//SlWrVqF//mf/8l1mTRNRUVF0Ov1CcsaGxshimKOKiIiIqLZLFUXJp1Oh+Li4hxVNL9wODkiIqIpUiqVyM/PR1dXV8LyUCiEDz74AJWVlaiurmbraSIiIiKa89xuN44cOYJAIBBfNjAwgLa2NlRUVOSwMiIiopnh8Xhw6aWX4vjx4wCA2267Dddccw30ej3eeOMN3H///XC73bj66quxa9curFmzZtrHvO+++3D55ZenXW+z2aZ9DEomCAJqampw+PDh+LJgMIiOjg6Ul5fnsDIiIiKajTo7O+H3+xOWVVdXswtThjDERERENEVKpRJLly6F3W7HsWPHEI1GE9a3tLRgYGAAy5cvh06ny1GVRERERERTJ0kSWltb0dzcnLLrkt/vhyRJDO4TEdG88+Mf/xjHjh0DAPzoRz/CvffeG193zjnnYNOmTbjwwgvh9/tx9913Y8eOHdM+ZllZGVasWDHt/dDkFRQUwGKxJAwLc/LkSRQXF0Ol4ldpREREJIvFYmhubk5YZjKZ4HA4clPQPMQoGBER0TQVFhZi3bp1yMvLS1rndruxd+9e9Pb2Zr8wIiIiIqJpCIVCOHjwIJqampICTEqlEsuWLcPSpUsZYCIionknEongF7/4BQBg+fLluOeee5K2Offcc3HrrbcCAHbu3Indu3dntUbKLEEQUFtbm7AsGo2ipaUlRxURERHRbNTa2opIJJKwrLa2ludGMoghJiIiogzQarVYtWoVampqkt6oRKNRHDp0CMePH4coijmqkIiIiIho4vr6+rB3714MDAwkrTObzTjzzDNRVFSU/cKIiIiy4I033sDg4CAA4Kabbko7NMiWLVvi8y+88EI2SqMZZLVaUVBQkLCsra0NwWAwRxURERHRbBIKhdDa2pqwzG63c8jfDGOIiYiIKEMEQUBlZSXWrFmTcvi4jo4O7N+/P2mcXCIiIiKi2UIURTQ2NuLDDz9MurIQQPz9rl6vz0F1RERE2fH222/H5y+88MK0261btw4GgwEAsGvXrhmvi2be6AsUJUlCU1NTDisiIiKi2eLkyZNJzQpGd3Kk6WOIiYiIKMMsFgvOPPNMFBYWJq3zer3Yu3cv+vv7c1AZEREREVF6wWAQH3zwQdJVhYDceXT16tWoqalJ242CiIhovjh8+HB8ftmyZWm3U6lUqKurAwDU19dP+7i//OUvUVdXB51OB6vVitNPPx133HEH9u3bN+1908QYDAaUlJQkLOvu7obb7c5RRURERDQbeL1edHZ2JiwrLi6G0WjMUUXzlyrXBRAREc1HKpUKy5cvR15eHhoaGhKS2SqVCiaTKYfVEREREREl6u3txdGjRxGNRpPW5efnY+nSpVCr1TmojIiIKPva2toAAEajEXl5eWNuW1FRgYMHD6KnpwehUAharXbKxx0ZVgqFQjh8+DAOHz6Mhx9+GLfffjt+/vOfT2n/wz9POiO/kPN4PFkL7Hi93pTzuWa329HV1ZVwPu/o0aNYsmRJQpcmmp1m6/OK5i4+pyjT+Jyam0RRRHFxMZxOJyRJgiAIKCgomDVB51w9rzweT8b3yRATERHRDBEEAaWlpbBarTh8+HB8GLnly5fzCyAiIiIimlXcbndSgEkQBNTW1qKsrIxf2BER0YIy/GXMRC5CG3n1vdfrnVLIKC8vD1deeSU2bdqExYsXQ6fTobOzE6+99hoee+wxeL1ePPzww/B4PHj66acnvf+KiooJb/vkk0/CarVO+hjT9eSTT2b9mGMpKSlBVVVV/L7f78cf//hH9Pb25rAqmqzZ9ryiuY/PKco0PqfmHo1Gg6qqKvj9frz77ru5LielbD6vBgcHM75PhpiIiIhmmNFoxNq1a9HQ0ACNRjPuFXxERERERNlWXV2NwcHB+BWEOp0Op512Gsxmc44rIyIiyr5gMAhA/pJqPCNDS4FAYNLHKi0tRXt7OwwGQ8LyM844A5s3b8aXv/xlXHTRRWhpacF//dd/4eqrr8ZnPvOZSR+HJqerqwsOhwN6vT6+rLCwkCEmIiKiBS4cDuP48eO5LmNeY4iJiIgoC5RKJZYsWQJJktJuE4lEAIBdmoiIiIgo6xQKBZYvX469e/fCZrNhyZIlUKl42oiIiGa3THQKfPzxx7Fly5aEZTqdDoD8JdV4QqFQfH5k4GWiNBrNmGGpxYsX46mnnsIFF1wAAPjlL3856RBTa2vrmOs7OzuxYcMGAMANN9yAsrKySe1/qrxeb7xTwA033DChzlfZNDg4iMbGRigUCpSUlGDNmjXYtGlTrsuiccz25xXNPXxOUabxOUUzIVfPq/b2dtx///0Z3SfPRhEREWVRupNrkiThyJEj8Pl8WL58eU7adhMRERHR/CdJUtr3pDqdDmeeeSa0Wi2HjyMiogVtuBOh1+sdd1ufzxefn6kvi84//3ycdtppOHz4MN5++22IogiFQjHhx5eXl094W7PZDIvFMpUyp8VkMuXkuGOxWCwQBAEOh2NCXblo9pmNzyua2/icokzjc4pmQjafV8MdvTOJISYiIqJZoL29HX19fQCAAwcOoLa2FuXl5fzyiIiIiIgyxuv14ujRo1i6dGnaL1mHO08QERHNBfX19dPeR0lJSdKy8vJy/P3vf4fP58PAwADy8vLSPn64y1FhYWHC0HKZNhxiCgaDcLlcKCwsnLFj0SmTCYARERHR/BIIBKbUaZOmhyEmIiKiHPN4PGhsbExY1tjYiIGBASxbtixHVRERERHRfCFJEjo6OtDQ0ABRFFFfX4+1a9dCqVTmujQiIqJpmanzJqeddhqef/55AMCRI0dw9tlnp9wuGo2ioaEBALB8+fIZqWUYL3QjIiIiyh6Xy4WPPvoIZWVlqK6uhkrFaE22TLzfKBEREc0IjUaTcvi4vr4+7N27N6EtORERERHRZCgUCpw8eRLHjx/H/8/enUdHdtZ3/v/c2rXv+66W1JJ634xNYGyH3WDAngSMh8UYYgjMCeQ4tkn4kZghgbFxAoQDZ+yxgwNjDAGMA5gEB9J24gXc+yaptbT2fZdKUlWpqu7vD49qulwltbpb0tXyfp2j49LzPHXrI/txqXTv9z5POByWJM3OzqqlpcXiZAAArF9veMMbIo+ff/75RccdPXo0ct7m937v91Y1U0NDgyTJ7XYrKytrVV8LAABgKwuFQpHzJr29vTpy5IhGR0ctTrV1UMQEAIDF3G63du/erbKyspg+v9+vlpYW5efnW5AMAAAAG1lCQoJ27dql8fHxmL6ZmRkFg0ELUgEAsP7dcMMNkRvO/vEf/1GmacYd9/jjj0ce33LLLauW58UXX9S5c+ckvVpgZbNxacdqU1NT6unpsToGAABYBR0dHfL7/ZHvA4GA5ufnLUy0tfBJFwCAdcAwDJWXl2v37t1yOp1RfaZpqry8XDU1NVxoAgAAwLKMjo5q586dSkhIiOkrKirSvn37WAodAIBFuFwu/cmf/IkkqbGxUQ899FDMmJdfflmPPfaYJOn666/XoUOH4h7LMIzIeZ94nn766UWLpCSptbVVt99+e+T7T33qU8v9MbAKgsGgWlpadOLECbW1tWl6etrqSAAAYAV5vd6YQuX09HTl5eVZlGjr4WwVAADrSEZGhg4cOKDGxkZNTk5G9WVmZur8+fPauXOnUlJSLEoIAACA9SwUCqm1tVUDAwOy2+1RfXa7XbW1tcrOzrYoHQAAG8c999yjH/7wh2pubta9996r1tZW3XbbbUpISNDhw4f15S9/WcFgUAkJCfr6179+xa9zyy23qKqqSrfeequuueYaFRcXy+12q7+/X7/61a/02GOPyev1SpLe97736dZbb12hnxCXKxwO69ixY/L5fJG25uZm7d+/X4ZhWJgMAACsBNM0I9vILTAMQ9XV1fyuX0MUMQEAsM643W7t2bNHHR0d6urqiuoLBAI6ceKEtm3bpsLCQj40AQAAIGJ2dlYNDQ2amZmJ6UtOTlZ9fX3clZkAAECslJQUPfPMM7rpppvU0tKiRx55RI888kjUmNTUVD3xxBPau3fvVb1Wa2urHnzwwSXH/PEf/7G+9rWvXdXr4OrYbDbl5+ero6Mj0ub1etXb26vi4mLrggEAgBXR39+vqampqLaSkhIlJiZalGhroogJAIB1yDAMVVRUKC0tTQ0NDQqFQpE+0zTV2tqqyclJ1dTUsA0IAAAANDQ0pObm5qjPjQuys7NVV1cnm81mQTIAADauqqoqnThxQt/61rf0ox/9SK2trQoEAiopKdFNN92kz3zmMyorK7uq1/jZz36ml19+Wb/73e/U2dmpkZERzczMKDU1VZWVlXrjG9+oO++8Uzt37lyhnwpXo6SkRENDQ5qdnY20dXR0KDs7Wx6Px8JkAADgavj9frW3t0e1JSQkXPVnPVw+rnoCALCOZWZmqra2Vi+//LJSU1Oj+ubm5rgQBQAAsMWFw2G1tbWpr68vpi8UCunChQvat28fnxsBALhCSUlJuvfee3Xvvfde0fNN01yy/+abb9bNN998RcfG2rPZbKqurtapU6cibaFQSC0tLdq5cyerpgMAsAEtbCMXDAaj2qurqzmfYgH+jQMAsM65XC41NjZGXZiy2+2qr6/nwxMAAMAWNzIyEreAyePx6MyZMxodHbUgFQAAwOaVnp6u/Pz8qLaxsTENDg5alAgAAFyN4eHhmPMnubm5ysjIsCjR1saVTwAANgDTNNXV1aXKyko5HA5t375dCQkJVscCAACAxXJycpSbmxvVlpeXp5qaGvl8PotSAQAAbG6VlZVyuVxRbW1tbfL7/RYlAgAAVyIQCKi1tTWqzel0qqqqyqJEoIgJAIANJC0tTa973euUk5Oz6JhLLVMOAACAzcMwDNXU1CgxMVE2m001NTWqra2V3W63OhoAAMCm5XQ6VV1dHdUWDAbV0tLCuTkAADaQ1tZWzc/PR7VVV1fL6XRalAgUMQEAsME4HI5F+8LhsE6fPq3h4eE1TAQAAAArLWw1vG/fPhUUFFgdBwAAYEvIzs6OWRFzdHRUQ0NDFiUCAACXY3h4OOZ6WnZ29pILCWD1UcQEAMAm0tbWpomJCTU0NKi1tVXhcNjqSAAAAFgB4+PjGh8fX7Q/KSlJycnJa5gIAAAAVVVVMSs1tLa2KhAIWJQIAAAsh2ma6urqimpzOBwxKy1i7VHEBADAJjE4OKi+vr7I9729vTp16pT8fr+FqQAAAHA1TNNUZ2enTp8+rcbGRj7bAQAArCOLbSvX3NzMtnIAAKxjhmFoz549ys/Pj7RVVVXJ5XJZmAoSRUwAAGwaU1NTcduOHTu25F37AAAAWJ+CwaDOnTunjo4OSdL8/LwaGhpYbRMAAGAdycnJidl2ZnR0VIODgxYlAgAAy+FwOLR9+3bt2rVLBQUFMdvEwhoUMQEAsElUV1erpqZGhmFEtc/Pz+v06dPq6uriDjAAAIANwuv16tixYxodHY1qn5qa4oIYAADAOvPabeXcbrc8Ho+FiQAAwHJlZmbGvb4Ga1DEBADAJlJQUKB9+/bFPUnS3t6uc+fOaX5+3oJkAAAAWK6BgQGdOHFCPp8vpq+ioiJqqXMAAABYz+VyqaamRpKUl5engwcPKj093dpQAAAAGxBFTAAAbDIpKSnav3+/MjMzY/pGR0d1/PhxTU9PW5AMAAAASwmHw2pubtb58+djtoxzOp3avXu3SktLuTMQAABgHcrOzta+fftUW1srh8NhdRwAAIANiSImAAA2IafTqZ07d6q8vDymz+fz6cSJE+rv71/7YAAAAIjL5/Pp5MmTcT+jpaSk6MCBA8rIyLAgGQAAAJYrNTXV6ggAACCOmZkZnT59Ou6q11hfKGICAGCTMgxDZWVl2r17t5xOZ1SfaZqRu/xDoZBFCQEAACBJY2NjOnbsWNzVMgsLC7V371653W4LkgEAAAAAAGxs4XBYjY2NGh8f19GjRzUwMCDTNK2OhUVQxAQAwCaXkZGhAwcOxL0TbGBgQO3t7RakAgAAgGma6uzs1JkzZxQMBqP6bDabamtrVV1dLZuN0zcAAAAbmWmaGhkZsToGAABbUltbm2ZmZiRJoVBI58+f1+DgoMWpsBjOggEAsAW43W7t2bNHRUVFMe1lZWUWpQIAANi6TNPUuXPn1NHREdOXkJCgffv2KS8vb+2DAQAAYEX5/X6dOnVK586d09DQkNVxAADYUoaHh9XX1xfVlpSUpNzcXIsS4VIoYgIAYIuw2WyqqqpSXV2dbDabDMPQjh07YraaAwAAwOozDENJSUkx7VlZWdq/f7+Sk5MtSAUAAICVtLBt8OTkpCSpublZs7OzFqcCAGBr8Pl8am5ujmqz2WyR62RYnxxWBwAAAGsrNzdXSUlJmp2dVUpKitVxAAAAtqzy8nJNTU1pYmJCklRRUaGSkhIZhmFtMAAAAKyI+fl5zc/PR74PhUJqbGzUvn37uHgKAMAqCofDamhoUDAYjGqvqqqKe1MZ1g8+IQEAsAUlJSUpJydn0f75+Xl5vd41TAQAALD1GIahuro6JScna/fu3SotLaWACQAAYBPJy8tTfn5+VJvX69WFCxcsSgQAwNbQ0dGh6enpqLacnJyY38tYfyhiAgAAUUzTVFNTk06cOKHBwUGr4wAAAGx44XB40T6Xy6X9+/crIyNjDRMBAABgrVRVVSkxMTGqrbe3VyMjIxYlAgBgcxsbG1N3d3dUm8fjUU1NDTePbQAUMQEAgCidnZ0aGxtTOBxWU1OTWlpalrzwBgAAgMWNjY3pd7/73ZKrXHICDQAAYPOy2+2qq6uL2T7u/PnzmpubsygVAACbk8/nU2NjY1SbYRiqr6+Xw+GwKBUuB0VMAAAgYmJiQp2dnVFtfX19OnXqlPx+v0WpAAAANh7TNNXV1aUzZ84oEAjo3Llzmp+ftzoWAAAALJCcnKxt27ZFtQWDQZ07d06hUMiiVAAAbC7hcFgNDQ0KBoNR7ZWVlUpJSbEoFS4XRUwAACAiNTVVhYWFMe1TU1M6fvy4JicnLUgFAACwsQSDQTU0NKi9vT3S5vP51NTUJNM0LUwGAAAAqxQUFCgnJyeqbWZmRi0tLXxGBABgBbS2tmp6ejqqLSsrS0VFRRYlwpWgiAkAAETYbDZVV1dr+/btMUtcBwIBnTp1Sr29vZxYAQAAWMTs7KxOnDihkZGRmD6bzcY2vQAAAFuUYRiqqalRYmJiVPvg4KD6+/stSgUAwOYwMDAQ8/s0ISFBtbW1MgzDolS4EhQxraLZ2Vk9+OCDOnTokDIzM5WUlKTa2lrdfffdMVv1XImOjg4ZhrGsrzvuuGNZx3zyySf11re+Vfn5+fJ4PCorK9MHP/hBvfzyy1edFwCwceTn52vv3r3yeDxR7aZpqrW1VU1NTSx1DQAA8Bqjo6M6fvy4ZmdnY/oqKipUX18vu91uQTIAAACsBw6HQzt27Ij5TNja2qqpqSmLUgEAsPFNTExEfW+z2VRfXy+Hw2FNIFwxiphWSWtrq/bu3av77rtPR48e1fj4uGZnZ3X+/Hn93d/9nXbv3q1f/OIXVseMmJub0zvf+U7dfvvt+rd/+zcNDg7K7/erq6tLTzzxhN7whjfoi1/8otUxAQBrKCUlRfv371dGRkZM39DQkE6cOKG5uTkLkgEAAKwvpmmqo6NDZ8+ejSn0djgc2rVrl0pLS7nzDwAAAEpMTNT27duj2kzTVENDgwKBgEWpAADY2LZv365t27ZFzr3U1NQoOTnZ4lS4EpSdrYLp6Wm9853vVEtLiyTpj/7oj3TbbbcpISFBhw8f1le+8hVNTU3p/e9/v1588UXt3bv3ql/zr//6r/We97xn0f54F6Avduedd+qXv/ylJOnGG2/UZz7zGRUWFurMmTP68pe/rLa2Nt1///0qKCjQXXfdddV5AQAbg9Pp1K5du9TR0aGurq6ovpmZGR0/fly1tbXKysqyKCEAAIC1gsGgmpqaNDo6GtOXlJSkHTt2KCEhwYJkAAAAWK9ycnJUXFysnp6eSJvf71d7e3tMgRMAALg0wzBUXFyslJQUjY+PKy8vz+pIuEIUMa2Cr371q2pubpYkPfjgg7rnnnsifdddd51uuOEGXX/99ZqdndVnP/tZPffcc1f9mkVFRdq5c+cVPfff//3f9YMf/ECSdPPNN+unP/1pZCnTQ4cO6d3vfrcOHDigrq4u3XffffrDP/zDSxZFAQA2D8MwVFFRoZSUlJht5ILBoM6ePavy8nJWFwAAAFvOzMyMzp07F3d1ypycHG3fvp3t4wAAABBXZWWlpqenNTk5KenVm9ErKystTgUAwMaWlpamtLQ0q2PgKrCd3Aqbn5/X3//930uS6urqdPfdd8eMef3rX6+PfexjkqTnn39eR44cWdOMr/XQQw9JenWJ+29/+9sxJ1izs7P1wAMPSHp1L8lHH310zTMCAKyXnZ2t/fv3KzExMaZvdHRUpmlakAoAAMAaw8PDi26vW1lZqbq6OgqYAAAAsCjDMFRfXy+Xy6WioiLt2rVLTqfT6lgAAACWoohphR0+fDhSNf+Rj3xENlv8f8V33HFH5PFPf/rTtYgW1/T0tH7zm99Ikt785jeruLg47rhbb71VqampkqzNCwCwVmJiovbt26fs7OxIm9PpVH19/aK/8wAAADabqakpNTQ0RK1QKb36uWj37t0qKSlhhUoAAABcksvl0sGDB1VVVcXnRwAAlmlqairuTWXYHLjauMJeeOGFyOPrr79+0XEHDx6MrGTx4osvrnquxRw5ckSBQEDS0nldLpeuvfbayHPm5+fXJB8AYP1xOByqr69XZWWlDMNQXV2dPB6P1bEAAADWTEpKivLz86PakpOTtX//frZfBwAAwGVh9SUAAJbP5/Pp7NmzOn78uCYmJqyOg1XgsDrAZtPQ0BB5XFtbu+g4h8OhqqoqnT59Wo2NjVf9ut/85jf113/91+rp6ZHb7VZxcbHe+MY36q677tL+/fuvOu9C/7PPPqtgMKiWlhbV19cvO19PT8+S/f39/ZHHMzMzmpqaWvaxgZXm9XrjPgassl7nZFpamurr62W323nf3kLW63zE1sR8xHrDnNxa8vLyNDU1pdnZWWVmZqqkpESBQCByo5DVmI9Yb5iTWE9mZmasjgAAy2KapsLhMNsUAwAgKRQK6dy5c5EFV06fPq2qqioVFhZanAwriSKmFbZQrJOUlKT09PQlx5aUlOj06dMaHh6W3++X2+2+4tc9fvx45LHf71dDQ4MaGhr08MMP6xOf+IS+8Y1vxD3+xcVFi20ld3HeBd3d3ZdVxHTxcy/lqaeeUlpa2rLHA6vpe9/7ntURgCgbaU4ahqHS0lL19vYqGAxaHQerYCPNR2x+zEesN8zJrcHlcik9PV2//e1vrY6yJOYj1hvmJKw2OTlpdQQAuKT5+Xk1NDTIZrNp586dbDcHANjSTNNUU1NT1E0xpmlqZGREBQUF/J7cRChiWmHT09OSXl1G/lKSkpIij71e7xUVMaWnp+uWW27RDTfcoOrqank8HvX39+vZZ5/VY489Jq/Xq4cffljT09N64oknFs27nMyvzQsAwFIqKyuVk5OjzMxMnT9/XrOzs1ZHAgAAuGwej0c+ny9uXyAQ0NDQ0BonAgAAwGY3Ozurs2fPam5uTpLU2tqqqqoqLtACALastrY2jYyMRLUlJCSovr6e34+bDEVMK2zhxKbL5brk2IuLlhY+iF6OwsJC9fb2KjExMap93759uummm/TpT39ab37zm9XV1aXvf//7ev/73693v/vdcfMuJ/PV5O3u7l6yv7+/X9dcc40k6dZbb1VNTc1lHR9YSV6vN3JX6Ic+9KFlFSUCq2kjzsnh4eHIan9ut1t79uxRaWmpMjMzLU6Gq7UR5yM2L+Yj1hvm5OYSDAbV3t6uubk5bd++/apWT7YC8xHrDXMS60lzc7O+8pWvWB0DAOIyTTOqgEmS+vr65PF4LmvXCwAANove3l719vZGtTkcDu3cuVMOByUvm82W/S+6EtV43/nOd3THHXdEtXk8Hkmv3o15KX6/P/I4ISHhsl/f5XItWXhUXV2t//N//o/+y3/5L5Kkb37zmzFFTAt5pUtnvpq8l9qq7mJJSUlKTU29rOMDqyU5OZn5iHVlI8zJUCikhoaGqDbTNNXZ2algMKht27ZRFb9JbIT5iK2D+Yj1hjm5sU1PT6u5uTnyd3BnZ6f27dsnu91ucbIrw3zEesOchNUuXnEeANYbwzC0fft2nTp1SqZpRtovXLggt9ut3NxcC9MBALC2RkZG1NraGtVmGIbq6+tjFnvB5mCzOsBmk5KSIml5263NzMxEHq/W3WdvfOMbVV9fL0l64YUXFA6Ho/oX8kqXzrwWeQEAG5/dbtf+/fvjXpTo7e3VqVOnllXsCwAAYIXBwUGdPHky6kaemZkZtbS0WJgKAAAAW0laWppqa2tj2puamjQ5OWlBIgAA1t7U1JQaGxtj2rdv366MjAwLEmEtbNmVmOJN9stVUFAQ01ZcXKzf/e53mpmZ0cTEhNLT0xd9/sIWazk5Oau6LH19fb0aGhrk8/k0OjqqnJycqLwLenp6dPDgwUvmlcSSpQCAJblcLu3Zs0dtbW3q6+uL6pucnNTx48e1Y8eOqGJaAAAAK4XDYV24cCFmeXLp1c828c4BAAAAAKslNzdXPp9P7e3tkbaFreb27dvH6hMAgE1tbm5OZ8+ejVmkpby8XHl5eRalwlrYskVM8SrYV0J9fb1+8pOfSHq1Iv7aa6+NOy4YDKqtrU2SVFdXtypZFiy1Zc/CKk3Sq3mXstDvcDhUXV29MuEAAJuWzWZTdXW1kpOT1dLSErX8td/v14kTJ1RTU6P8/HwLUwIAALy6vXpDQ0Pcu9pTU1O1Y8eOJbdzBwAAAFZDSUmJ/H5/1E2CwWBQZ86c0b59+/iMCgDYlAKBgM6cOaP5+fmo9vz8fJWWllqUCmuF7eRW2Bve8IbI4+eff37RcUePHo1sz/Z7v/d7q5qpoaFBkuR2u5WVlRXVd+jQociH3KXyBgIB/fa3v408x+l0rlJaAMBmU1BQoL1798acVDFNU+fPn1dra2tMJT0AAMBamZqa0rFjx+IWMBUWFmrPnj1cHAIAAIAlDMNQVVWVMjMzo9p9Pp9Onz6tYDBoUTIAAFZHMBjU2bNnNTc3F9Wenp6u6urqJRdwweZAEdMKu+GGG5SWliZJ+sd//MeoVScu9vjjj0ce33LLLauW58UXX9S5c+ckvVpgZbNF/ydPSUnRm970JknSr3/9a/X09MQ9zlNPPaWpqalVzwsA2JxSU1N14MCByO/Ii/X29ur06dMKBAIWJAMAAFtZf3+/Tp48GfM5xDAMbd++XdXV1TF/RwMAAABryTAM1dfXKzk5Oap9ZmZGZ8+eVSgUsigZAAArKxwO69y5c5qeno5qT0pK0o4dOzhHs0XwX3mFuVwu/cmf/IkkqbGxUQ899FDMmJdfflmPPfaYJOn666/XoUOH4h7LMAwZhqHy8vK4/U8//fSiRVKS1Nraqttvvz3y/ac+9am44/7sz/5M0qtVjZ/+9KdjPvCOjIzovvvuk/RqhePHP/7xRV8TAIDFuFwu7d69W0VFRTF9k5OTOnbsWGSVQgAAgNUUDofV3Nys5ubmmL+r3W639u3bx5a3AAAAWDfsdrt27dolj8cT1T45OanGxsYlrxUBALBRGIahhISEqDa3261du3bJ4XBYlAprjf/Sq+Cee+7RD3/4QzU3N+vee+9Va2urbrvtNiUkJOjw4cP68pe/rGAwqISEBH3961+/4te55ZZbVFVVpVtvvVXXXHONiouL5Xa71d/fr1/96ld67LHH5PV6JUnve9/7dOutt8Y9zu///u/rtttu0w9+8AP97Gc/01ve8hZ99rOfVWFhoc6cOaO/+Zu/UVdXlyTpgQceUEZGxhVnBgBsbTabTVVVVUpOTo65aGi32+V2uy1MBwAAtgK/36+GhobIasMXS0tLU319PdvHAQAAYN1ZuEHwxIkTmp+fj7SPjo7q/Pnz2r59O1vsAAA2NMMwVF1dLafTqa6uLjmdTu3evZtrR1sMRUyrICUlRc8884xuuukmtbS06JFHHtEjjzwSNSY1NVVPPPGE9u7de1Wv1draqgcffHDJMX/8x3+sr33ta0uO+Yd/+AdNTU3pl7/8pQ4fPqzDhw9H9dtsNn3hC1/QXXfddVV5AQCQpPz8fCUlJencuXPy+/2y2WzasWMHlfQAAGDVDQ0NxS1gKi4uVmVlJRd+AAAAsG4lJCRo9+7dOnnyZNSuGtPT0woGg3I6nRamAwDg6hmGoYqKCrlcLqWmpioxMdHqSFhjXClcJVVVVTpx4oS+9a1v6Uc/+pFaW1sVCARUUlKim266SZ/5zGdUVlZ2Va/xs5/9TC+//LJ+97vfqbOzUyMjI5qZmVFqaqoqKyv1xje+UXfeead27tx5yWMlJCTomWee0fe//309/vjjOnXqlCYmJpSXl6c3vvGN+u///b/ruuuuu6q8AABcLCUlRfv371djY6MKCwuVlJRkdSQAALAFFBcXa3JyUqOjo5JevWmnpqZGeXl5FicDAAAALi05OVk7d+7UmTNnFA6HlZKSol27dlHABADYVIqKiqyOAItQxLSKkpKSdO+99+ree++9oudfag/jm2++WTfffPMVHXsxt99+u26//fYVPSYAAItZWAZ7qRUPTNNkRQQAALBiDMNQbW2tjh8/LtM0tWPHDiUnJ1sdCwAAAFi29PR01dfXq6+vT/X19bLb7VZHAgDgsoVCIX6HIQZFTAAAwFKXKmA6e/assrOzVVBQsIapAADAZuZwOLRr1y45HA7uWAcAAMCGlJWVpczMTG7+AwBsSP39/ers7NTu3bvZMg5RbFYHAAAAWMyFCxc0Njam5uZmNTc3KxwOWx0JAABsEBMTE5qenl60PyEhgQImAAAAbGiXujkQAID1aHBwUM3NzfL7/Tp16pRmZmasjoR1hCImAACwLg0ODqqnpyfyfX9/v06ePCm/329hKgAAsN6Zpqmenh6dOnVK586dUyAQsDoSAAAAsKbC4bAaGho0MDBgdRQAAKIMDQ2pqakp8n0gENCpU6c4f4MIipgAAMC6NDs7G9M2PT2t48ePa3Jy0oJEAABgvQuFQmpqalJbW5skye/3q6GhgdUcAQAAsGWEw2GdO3dOIyMjOn/+vIaGhqyOBACAJGlkZESNjY0x7QUFBXK5XBYkwnpEERMAAFiXKioqVFdXJ5st+uPKQlV+X18fy2IDAIAIn8+nkydPxlykmZyc5A50AAAAbAnhcFhnzpzR2NhYpK2xsZFCJgCA5YaHh9XQ0BDTXlxcrPLy8rUPhHWLIiYAALBu5ebmat++ffJ4PFHtpmmqpaVFzc3NrKwAAAA0NjamY8eOyev1xvSVlZWpoKDAglQAAADA2jIMQykpKTHtjY2NFPYDACwzNDSkhoaGmBvTCwsLVVlZKcMwLEqG9YgiJgAAsK4lJydr//79ysjIiOkbGBjQyZMn5ff7LUgGAACsZpqmurq6dObMGQWDwag+u92uHTt2qLy8nJNhAAAA2BIMw1BFRYWKiopi+s6fP6/+/n4LUgEAtrLBwcFFt5CrqqrinA1iUMQEAADWPafTqV27dqmkpCSmb3p6WseOHdPExMTaBwMAAJYJhUJqbGxUe3t7TF9iYqL279+v7OxsC5IBAAAA1jEMQ9u2bYtbyNTc3Ky+vj4LUgEAtqKBgQE1NTXFtBcWFqq6upoCJsRFERMAANgQDMNQZWWl6urqZLNFf4SZn5/X6dOn1dvbG7McKQAA2Hzm5uZ04sQJDQ8Px/RlZWVp3759SkxMtCAZAAAAYL2FQqbi4uKYvpaWFvX09FiQCgCwlfT39+v8+fMx7UVFRazAhCU5rA4AAABwOXJzc5WYmKhz587J5/NF2k3TVGtrq0KhkEpLSy1MCAAAVtPo6Kiamppito+TpPLycpWWlnIiDAAAAFvewg2BNptNXV1dUX1tbW0yTTPuqucAAFyt3t5etba2xrQXFxersrKS8zZYEisxAQCADSc5OVn79+9XRkZGVLvL5VJeXp5FqQAAwGoyTVOdnZ06e/ZsTAGTw+HQzp07VVZWxokwAAAA4P8yDEPl5eUqKyuL6btw4YIuXLjAquYAgBU1MjISt4CppKSEAiYsC0VMAABgQ3I6ndq1a1dk1SXDMFRfXy+3221xMgAAsBoMw9D8/HxMe1JSkvbv36+srCwLUgEAAADr20IhU3l5eUxfd3e3WlpaKGQCAKyYrKysmHM0paWlqqiooIAJy8J2cgAAYMMyDEMVFRVKTk5WMBhUWlqa1ZEAAMAqqqyslNfr1eTkpCQpJydH27dvl91utzgZAAAAsL6VlZXJZrPpwoULUe39/f2y2+3atm2bRckAAJvJwg3nZ86c0cTExKIrAgKLoYgJAABseDk5OUv2h0IhSeICJwAAG5zNZlN9fb2OHz+uoqIiFRcXcxcfAAAAsEwlJSVyOBxqbm6OtLlcLhUVFVmYCgCw2dhsNu3YsUNjY2PKzc21Og42GIqYAADApmaappqamjQ3N6cdO3YoISHB6kgAAOAquFwuHTp0iOJkAAAA4AoUFBTI4XCosbFRdrtdu3fvlsfjsToWAGCTcTgcFDDhitisDgAAALCauru7NTIyopmZGR0/flxjY2NWRwIAAEuYn59XQ0ODZmdnFx1DARMAAABw5XJycrRr1y7t2rVLSUlJVscBAGxAPp9PZ86ckd/vtzoKNhmKmAAAwKY1Njam9vb2yPfBYFBnzpxRZ2enTNO0MBkAAIjH6/Xq+PHjGh4e1rlz5xQMBq2OBAAAAGxKGRkZSk1NtToGAGAD8nq9OnHihMbGxnT27FnO32BFUcQEAAA2LY/Ho8TExJj2jo4OLowCALDODA0N6cSJE/L5fJKk2dlZnT9/nsJjAAAAYI2Zpqnz589rdHTU6igAgHVmfHxcJ0+eVCAQkPRqQVNDQ4PC4bDFybBZUMQEAAA2rcTERO3bt0/Z2dkxfaOjozp+/LhmZmYsSAYAABaYpqm2tjY1NjbGnPCanJxkWXIAAABgjV24cEEDAwM6e/as+vr6rI4DAFgnBgYGdObMGYVCoah2n8/HTeNYMRQxAQCATc3hcKi+vl4VFRUxfXNzczpx4oRGRkYsSAYAAObn53X69Gn19PTE9KWkpOjAgQPyeDwWJAMAAAC2pt7e3qjP5y0tLWpvb2eFVADYwkzTVGdnZ9wVs1NTU7Vv3z65XC6L0mGzcVgdAAAAYLUZhqHS0lIlJyersbEx6o6AUCikc+fOqbS0VOXl5TIMw8KkAABsHdPT0zp37lzclZYKCgpUVVUlm417rwAAAIC1YpqmpqenY9q7urrk8/lUU1Mju91uQTIAgFXC4bCam5s1ODgY05eTk6Pa2lrO32BFMZsAAMCWkZmZqQMHDig5OTmmr6urS2fOnNH8/LwFyQAA2FoGBgZ08uTJmAImwzBUU1OjmpoaToABAAAAa8wwDG3fvl2lpaUxfUNDQzp16hTbPQPAFhIIBHTq1Km4BUzFxcWqq6vj/A1WHDMKAABsKR6PR3v37lVeXl5M3/j4uI4fPy6v12tBMgAANr9wOKyWlhadP39e4XA4qs/lcmnv3r0qKCiwKB0AAAAAwzBUUVGh6urqmL7p6WkdP3487mpNAIDNxev16vjx45qamorp27Ztm7Zt28bOFlgVFDEBAIAtx263a/v27aqqqor5kO3z+dTc3ByzrzMAALg6gUBAp0+fVl9fX0xfWlqaDhw4oNTUVAuSAQAAAHitwsJC7dy5M2b7uEAgoJMnT2p4eNiiZACA1TYyMqITJ07ErL5nt9u1Y8cOFRcXW5QMWwFFTAAAYEsyDENFRUXavXu3nE5npN3hcKiuro47CAAAWEF+v1/Hjh3T5ORkTN/C72OXy2VBMgAAAACLycrK0r59++TxeKLaw+GwGhoa1NHRwY2AALCJmKaprq4unTt3LmYFbbfbrb179yo7O9uidNgqKGICAABbWnp6ug4cOKCUlBRJUm1trRISEixOBQDA5uJyuZSWlhbVZrPZIisj2mycngAAAADWo6SkJO3fvz/m87wkdXZ2qqGhQcFg0IJkAIDV4PV6Y9pSU1O1f/9+JScnW5AIWw1nCQEAwJa3cAfBzp07lZWVZXUcAAA2HcMwtH37diUlJUn6f7978/PzLU4GAAAA4FKcTqd2796tgoKCmL6FLYfm5uYsSAYAWEmvPX8jSXl5edqzZw8raGPNUMQEAACgV1eDWKqAKRwOa2RkZA0TAQCwudjtdu3YsUPZ2dlRqyACAAAAWP9sNpuqq6u1bdu2mL5gMCi73W5BKgDASrPb7aqvr5fD4VBFRYW2b9/OCtpYUw6rAwAAAGwEra2t6u/vV0FBAdveAACwhGAwKIcj/umGhIQE7dixY40TAQAAAFgJhmGouLhYiYmJamxsVDAYlGEY2rFjByt0AMAmkpiYqGuuuUZOp9PqKNiCuPoGAABwCf39/erv7488PnnypPx+v8WpAABYX0zTVFdXl44cOSKfz2d1HAAAAACrJDMzU/v371dycrKqqqqUmppqdSQAwGUIBoNqampa8joHBUywCkVMAAAAS/D7/WppaYlqm56e1rFjxzQxMWFNKAAA1plgMKiGhga1t7crEAiooaFB4XDY6lgAAAAAVklCQoL27dungoKCRceYprmGiQAAyzE1NaVjx45pcHBQ586d4/wN1h2KmAAAAJbgdrvj7vk8Pz+vU6dOqaenhxMyAIAtbWZmRsePH9fIyEikbXp6Wm1tbRamAgAAALDabDabDMOI22eaps6ePavu7m7OnQHAOmCapnp6enTy5MnICtqcv8F6RBETAADAJeTl5Wnfvn3yeDwxfW1tbWpsbFQwGLQgGQAA1hoaGtLx48c1NzcX0+dyubhYAQAAAGxRXV1dGhsb04ULF3T27FnNz89bHQkAtqz5+XmdO3dObW1tMedqhoeHFQgELEoGxKKICQAAYBmSk5O1f/9+ZWRkxPQNDw/rxIkTmpmZsSAZAABrLxwOq7W1VY2NjTHLjjscDu3atUtlZWWL3pUNAAAAYPOamJhQR0dH5PuxsTEdPXpUExMTlmUCgK1qYfu40dHRmL7U1FTt379fLpfLgmRAfBQxAQAALJPT6dSuXbtUWloa0zc7O6vjx49raGjIgmQAAKwdv9+vU6dOqbe3N6YvJSVFBw4cUGZmpgXJAAAAAKwHXq83pi0QCOjUqVPq7OxkxVYAWAOmaaq7u1snT56U3++P6S8pKdGePXvi7kABWMlhdQAAAICNxDAMVVRUKDU1VU1NTVHbyIXDYTU2NmpqakqVlZWy2agXBwBsLhMTE2poaIi7FURBQYGqqqr4/QcAAABsccXFxUpKSlJjY2PM3w4dHR0aHx9XbW0tF84BYJX4/X41NTXFXQHP6XSqtraWG9CwbnFmEQAA4ApkZWVp//79Sk5Ojunr7e3VqVOn2EcaALBpmKapnp4enTp1KuYihGEYqqmpUU1NDQVMAAAAACRJGRkZOnjwoNLT02P6JicndfToUVY0B4BVMDw8vOgWnmlpaaygjXWPlZgAAACuUEJCgvbu3avW1lYNDAxE9QUCARmGYVEyAABWTigU0vnz5zU8PBzT53a7tWPHDqWkpFiQDAAAAMB65nK5tHv3bnV1damjoyOqLxQKqbGxUaOjo6qurpbDwSVLALgawWBQra2tGhwcjNtfWlqq8vJyrltg3eMTAQAAwFWw2+3avn27UlNT1dLSItM0ZRiG6uvr5XQ6rY4HAMBV6+/vj1vAlJGRobq6On7fAQAAAFiUYRgqKytTWlqampqa5Pf7o/qHhoY0OTmp2trauKs2AQCWZ2RkJG4Bk9vt1vbt25WRkWFBKuDysc47AADACigoKNC+ffvk8XhUXV3NihQAgE2jqKgo5kRXWVmZdu3aRQETAAAAgGVJT0/XwYMHlZubG9Pn9/t16tQptbW1yTRNC9IBwMaXl5enrKysqLacnBwdOHCAAiZsKBQxAQAArJCUlBQdPHhQBQUFi47hRAwAYKMxDEN1dXVyu91yOBzauXMny48DAAAAuGwOh0N1dXWqq6uLu33c3NycBakAYHMwDEM1NTVyOp2y2+2qra1lBW1sSGwnBwAAsILsdvuifaZp6ty5c8rJyVFeXt4apgIA4Oo4nU7t3LlTdrtdCQkJVscBAAAAsIHl5uYqNTVVTU1NmpyclPRqgVN1dTU3SwDAJZimueh7pcvl0o4dO+RyuTh/gw2LlZgAAADWSEdHh0ZHR9XU1KSWlhaFw2GrIwEAEDE+Pq6pqalF+5OTkzkBBgAAAGBFeDwe7dmzR5WVlTIMQ1VVVXK73VbHAoB1bXp6WseOHdPIyMiiY9LS0jh/gw2NlZgAAADWwOjoqLq6uiLf9/X1aXp6WvX19fJ4PBYmAwBsdaZpqrOzU52dnXK73Tpw4ABLjQMAAABYdYZhqKSkRNnZ2UueH/N6vUpISFhyBXQA2MzC4bA6Ozsj1xiam5uVlpbG+RtsSqzEBAAAsAYWlsa+2MJdE2NjYxYkAgBACgQCOnPmjDo7OyVJfr9fTU1NMk3T4mQAAAAAtoqEhIRFt0aan5/XmTNndPToUc6hAdiSxsfHdfTo0aibpOfn59Xa2mphKmD1UMQEAACwBiorK7V9+3bZbNEfv4LBoM6cOaP29nYuGAMA1tTk5KSOHTum8fHxqPaxsTENDw9blAoAAAAA/p+2tjYFAgH5fD6dOXNGjY2NCgQCVscCgFU3Pz+vpqYmnT59WnNzczH9s7OzCgaDFiQDVhfbyQEAAKyR/Px8JScn69y5c/L5fFF9XV1dmpycVF1dndxut0UJAQBbgWma6unpWbSAtqKiQjk5ORYkAwAAAID/Z3R0VIODg1FtQ0NDGhsbU2VlpfLz8xddwQkANirTNDU4OKi2tra4RUqGYai0tFSlpaUxN00DmwFFTAAAAGsoOTlZBw4cUFNTk0ZHR6P6FlbEqKurU0ZGhkUJAQCbWTAY1Pnz5zUyMhLT53K5VFdXp/T09LUPBgAAAACv4fF4lJqaqqmpqaj2YDCo5uZmDQ4Oqrq6WklJSRYlBICVNTs7q5aWFk1MTMTtT01NVXV1tZKTk9c2GLCGKGICAABYYw6HQzt27FBvb68uXLgQtQrG/Py8Tp8+rbKyMpWVlXE3GQBgxXi93rirAUpSenq66urq5HK5LEgGAAAAALGSkpK0d+9eDQwM6MKFCzErkizcEFhUVKSysjI5HFz2BLAxhUIhdXZ2qqenJ+6q2Xa7XZWVlSooKOCaATY9fpsDAABYwDAMFRcXKyUlRY2NjfL7/VH9nZ2dke3luKAMALgapmlqYGBALS0tcU+ElZaWqry8nJNgAAAAANYdwzBUUFCgrKwstbW1aWhoKKp/YbvsoaEhVVZWyuPxWJQUAC6faZoaGhpSW1ubAoFA3DHZ2dmqqqqS2+1e43SANdgkEQAAwEJpaWk6cOCAMjMzY/omJibU2tpqQSoAwGYRCoV0/vx5NTc3xxQwORwO7dy5UxUVFRQwAQAAAFjXFra/3rVrV9xCpUAgoKamJrW0tCgxMdGChABwZXp6euIWMLndbu3cuVM7duyggAlbCkVMAAAAFnM6nZGLyK9t37Ztm0WpAAAbXSgU0vHjxzU4OBjTl5KSogMHDigrK8uCZAAAAABwZTIzM3Xw4EGVlJTEvRljZmZGu3btUl5engXpAODyGIah6urqmLbi4mIdOnSI8zbYkthODgAAYB0wDEOlpaVKTU1VY2OjAoGA6urquMMCAHDF7Ha7MjIyNDs7G9VeVFSkyspK2Wzc1wQAAABg47Hb7aqsrFR+fr7a2to0NjYWM2ZqasqCZABw+VJSUlRQUKD+/n5lZGSoqqqKFeWwpVHEBAAAsI6kp6frwIEDGh8fV0ZGhtVxAAAbXGVlpaampjQ9PS273a7t27crJyfH6lgAAAAAcNUSExO1c+dOjY6Oqq2tTT6fT5I0MDCgubk5i9MBwKtM09To6GjkZrN4KioqlJmZqaysrLirzAFbCUVMAAAA64zL5VpyyetgMKihoSEVFBTwBw0AYEk2m011dXU6f/68ampquJMPAAAAwKZiGIays7OVmZmp7u5u9fX1qaenZ9HxwWBQDgeXRwGsjampKV24cEGTk5NKSEjQwYMH445zOp3Kzs5e43TA+sRvaQAAgA3ENE01NzdreHhYo6Oj2r59u1wul9WxAAAWMk1Tc3NzixYoJSQkaO/evWsbCgAAAADWkM1mU1lZmdLS0vQf//EfcceEQiEdPXpUKSkpqqysVEJCwhqnBLBV+Hw+tbe3a2hoKNI2Nzen/v5+paSkWJgMWP9sVgcAAADA8vX19Wl4eFiSNDY2pmPHjml8fNziVAAAqwSDQTU0NOjYsWOanZ21Og4AAAAAWMpmW/zSZ29vr/x+v0ZGRnTkyBE1NzfL7/evYToAm53f71dLS4teeeWVqAKmBR0dHQqFQhYkAzYOVmICAADYIAKBgC5cuBDTdvr0aZWWlqq8vJzt5QBgC5mamlJjY6N8Pp8kqaGhQfv27ZPdbrc4GQAAAACsL4FAQF1dXZHvTdNUf3+/BgYGVFRUpJKSElY7B3DF5ufn1d3drd7eXoXD4bhj3G63Kisrlyy2BEAREwAAwIbhcrm0Y8cONTU1aX5+Pqqvq6tLExMTqqurk8fjsSghAGAtmKap3t5eXbhwQaZpRtpnZmbU1tammpoaC9MBAAAAwPozMzMT9+Y/0zTV09Oj/v7+SDGTw8HlUwDLEwwG1dvbq+7u7kVXWLLb7SorK1NRUZFsNpumpqbWOCWwsfBbGAAAYAPJzMzUwYMH1dTUFLON3NTUlI4dO6bt27crOzvbooQAgNU0Pz+vpqYmjY2NxfQ5HA5lZmZakAoAAAAA1reMjAxdc8016urqUl9fX8xKKaFQKNJXXFysoqIiipkALCoUCqmvr0/d3d0xNxwvMAxDhYWFKisrk9PpXOOEwMbFb18AAIANxuVyadeuXeru7lZHR0fUKhzBYFDnzp1TUVERS9MCwCYzMTGhpqYm+f3+mL7U1FRW4wMAAACAJTidTm3btk3FxcXq6upSf39/1Hk16dVzax0dHerp6VFRUZGKioooPgAQZW5uTsePH1cwGFx0TEFBgUpLSzlPA1wBipgAAAA2IMMwVFpaqvT0dDU2Nsrn80X19/b2anJyUnV1dUpMTLQoJQBgJYTDYXV2dqqrqytuf2lpqcrLy+NujQAAAAAAiOZ2u1VdXa3i4mJ1dnZqcHAwZkwwGFRnZ2ekmIm/uQAs8Hg8crvdcYuYcnNzVVZWxjl54Cpwaz4AAMAGlpqaqgMHDsTdPs7r9erYsWMaGBiwIBkAYCXMzc3p5MmTcQuYnE6ndu3apYqKCk6mAwAAAMBlSkhIUG1trQ4ePBj33Jr06pZRU1NT/M0FIMIwDJWVlUW1ZWVl6cCBA9xUDKwAVmICAADY4BwOh+rr69Xf36+2tjaFw+FIXzgc1vnz5yVJ+fn5VkUEAFyBwcFBtbS0KBQKxfSlp6ertrZWbrfbgmQAAAAAsHkkJSVpx44dmp6eVldXl0ZGRqL6S0tLLUoGwCqzs7MaHh5WaWlp3CLG7OxsJSYmKiEhQaWlpUpNTbUgJbA5UcQEAACwCRiGocLCQqWlpamhoUGzs7ORvqSkJOXm5lqYDgBwuVpaWtTX1xfTbhiGysvLVVJSwp3AAAAAALCCUlJStGPHDnm9XnV1dWl4eFipqalKT0+PO940TU1NTSk1NZW/z4BNYnJyUj09PZFixrS0tLjvAYZhaP/+/bLb7WucENj8KGICAADYRJKSkrR//361tbWpv79fNptNdXV1stnYRRgANpLk5OSYNo/Ho7q6Ou7uAwAAAIBVlJycrPr6es3OzioUCi1aoDQ8PKzGxkalpKSopKRE2dnZFDMBG5BpmhodHVV3d7empqai+rq7uxctZKSACVgdFDEBAABsMna7XTU1NUpPT5dpmkpKSrI6EgDgMuXn52tsbCxy519eXp6qqqrkcPBnPAAAAACshcTExEX7TNNUd3e3JGl6eloNDQ3yeDwqKipSfn4+f7sBG0AwGNTAwID6+vo0NzcXd8zY2JhmZmY4xw6sIX6DAgAAbFKX2kJuZmZGXq9Xubm53CUGAOuMYRiqqanR7OysSktLlZeXZ3UkAAAAAMD/NTk5Ka/XG9Xm8/nU1tam9vZ25eXlqbCwMO4quwCsNTMzo76+Pg0MDCgcDi86zm63q7CwUE6ncw3TAaCICQAAYAsKh8NqamqS1+vV2NiYqquruUMMACzg9XoXPantdDp18OBBCk0BAAAAYJ0JBoPyeDzy+XwxfeFwWP39/erv71daWpqKiorYag6w2MKWcb29vZqYmFhyrNvtVlFRkQoKCjhnDliA/+sAAAC2oPb29sjdYkNDQ5qcnFRtbe2i+3sDAFZWMBhUW1ubBgYGtHPnTmVlZcUdx0luAAAAAFh/srOzlZWVpeHhYXV3d8esyrRgcnJSk5OTcrvdys/PV35+vjwezxqnBba2ubk5nTp1Sn6/f8lxSUlJKikpUU5Ojmw22xqlA/BaFDEBAABsMTMzM+rp6Ylq8/v9OnXqlEpLS1VWVsYfaQCwiiYnJ9XU1BS5Y/f8+fM6ePCgXC6XxckAAAAAAMtlGIZyc3OVk5OjyclJ9fX1aXh4OO5Yv9+vzs5OdXZ2KjMzU/X19bLb7WucGNiaPB6PTNNctD87O1tFRUVKS0vjZjJgHaCICQAAYItJSkpSXV2dWlpaFAwGo/q6uro0Pj6u2tpaJSYmWpQQADancDisjo4OdXd3R7XPz8+rublZO3bs4GQZAAAAAGwwhmEoPT1d6enp8vv96uvrU39/v+bn5+OODwQCFDABqyAcDse9OdcwDOXn56urqyvS5nQ6VVBQoIKCAlZHA9YZipgAAAC2oNzcXKWmpqqpqUmTk5NRfdPT0zp27Ji2bdumgoICLqgDwAqYmZlRU1NT3C0G7Ha7srOzLUgFAAAAAFhJbrdbFRUVKisr0/DwsPr6+jQ1NRU1pqCgYNHnm6bJuTjgMgSDQQ0PD2twcFA2m027d++OO66goEBdXV1KSUlRYWGhcnNz2Y0AWKcoYgIAANiiPB6P9uzZo+7ubnV0dEQtqRsOh9XS0qKRkRFt375dbrfbwqQAsHGZpqne3l5duHAh7tLlqampqq2tVUJCggXpAAAAAACrwWazKS8vT3l5eZqenlZ/f7+GhoZkmqZyc3PjPsc0TR09elSJiYnKy8tTZmYmRRZAHOFwWOPj4xocHNTo6KjC4XCkb25uLu45Fo/Ho0OHDikhIYFCQWCd4zffKpqdndWDDz6oQ4cOKTMzU0lJSaqtrdXdd9+tzs7Oqz5+eXm5DMO4rK+Ojo6Y49x///3Lfv5zzz131bkBAMD6YRiGSktLtW/fvrh/3I2Pj+vo0aMaHBxcct9wAEAsn8+n06dPq62tLeY91DAMVVRUaO/evRQwAQAAAMAmlpKSopqaGl133XXatWuXHI74a0xMTU1pdnZWIyMjOnfunF5++WU1NzdrcnKS83LY8kzT1NTUlFpbW/Xb3/5WZ8+e1fDwcFQBkyQNDAwseozExEQKmIANgJWYVklra6tuuukmtbS0RLWfP39e58+f16OPPqonnnhC73rXu9YsU1pamvLz89fs9QAAwMaRkpKiAwcOqK2tTf39/VF9wWBQTU1NGhkZ4bMEACzT2NiYenp6FAqFYvoSExNVV1en5ORkC5IBAAAAAKxgt9uVnp6+aP/g4GDU98FgUP39/erv75fb7VZOTo5ycnKUkpJCIQa2BNM0NT09reHhYY2MjMjn813yOaOjo5GFQABsTBQxrYLp6Wm9853vjBQw/dEf/ZFuu+02JSQk6PDhw/rKV76iqakpvf/979eLL76ovXv3XtHrPPvsswoEAkuO+fWvf60//dM/lSS9733vk8fjWXL8mTNnluyvqKi4vJAAAGDDsNvtqqmpUXZ2ts6fPx/zOWNkZERJSUkWpQOAjcHhcKiiomLR1XeLi4tVUVHBlgAAAAAAgAjTNDU6Orpov9/vV09Pj3p6euR2u5Wdna2cnBylpqZSrIFNZ2pqSsPDwxoeHpbf77/keMMwlJmZqby8PGVlZfH/BLDBUcS0Cr761a+qublZkvTggw/qnnvuifRdd911uuGGG3T99ddrdnZWn/3sZ694i7aamppLjvnSl74UefzhD3/4kuN37tx5RVkAAMDmkZmZqYMHD6q1tVVDQ0OR9uzsbGVkZFiYDADWv5qaGqWmpsa0u91ubd++nfdRAAAAAEAMwzB08OBBDQ8Pa3BwUFNTU4uO9fv96u3tVW9vb1RBU1pa2homBlZPa2urpqenLzkuNTVVeXl5ysnJkdPpXINkANYCt36usPn5ef393/+9JKmurk533313zJjXv/71+tjHPiZJev7553XkyJFVyTI5Oamf/exnkqTKykq94Q1vWJXXAQAAm4/T6VRdXZ3q6+vlcDjkdDpVXV3NXSwAcAldXV0yTTOqLTc3VwcPHqSACQAAAACwKKfTqcLCQu3bt0/XXHONysvLlZCQsORzFgqa+vv71yglsDLC4fCifTk5OYv2JSQkqKysTNdcc4327dunwsJCCpiATYaVmFbY4cOHNTk5KUn6yEc+sugWAXfccYcefvhhSdJPf/pTHTp0aMWz/NM//VNkb9DlrMIEAADwWgt3cc3Nzcnlci2673g4HGZrJACQ5PV61d/fr8LCQjkcDlVXVys3N9fqWAAAAACADWShUKO0tFQzMzORrbXm5ubijs/Kylr0WD6fT263m5sTYSnTNDU7O6vx8XGNjo5qbm5Or3vd6+LOy5ycHF24cCHyfUJCgnJycpSTk6OkpCTmMrDJUcS0wl544YXI4+uvv37RcQcPHlRiYqJmZ2f14osvrkqW7373u5JeXYLyQx/60Kq8BgAA2PxcLpdcLtei/cPDw7pw4YJqampYZQQAJHV3d2vPnj2qqqpa8v0TAAAAAIClGIah5ORkJScnq7y8XLOzs5GCptnZ2ciYxc7JBYNB/e53v5Pb7VZGRkbki5VrsBbm5+c1Pj4e+fL7/VH909PTSk1NjXmex+NRbm6uPB4PhUvAFkQR0wpraGiIPK6trV10nMPhUFVVlU6fPq3GxsYVz9He3h4pjnrDG96gysrKZT3vrW99q06ePKmJiQmlp6ervr5eb3/72/WJT3ziqi5K9vT0LNl/8TKXMzMzS+71C6w2r9cb9zFgFeYk1pPXzsdgMKjm5mYFg0GdPn1aWVlZKioqkt1utzAltgreH2GVyclJjY2Nqby8POok2sI8NE1T6enp8vl8i65gB6w23iOx3jAnsZ7MzMxYHQEAgMtmGIaSkpKUlJSk8vJyzczMaGRkRPPz83I44l/ynZiYkPTqtnMDAwMaGBiQJCUnJ0cKmtLS0lhhHSsiHA5ramoqUrQ0PT295PjR0dG4RUySVFdXtxoRAWwAFDGtsIVinaSkJKWnpy85tqSkRKdPn9bw8LD8fr/cbveK5fjud78r0zQlXd5Wcv/2b/8WeTw8PKznn39ezz//vB544AE9/vjjes973nNFeUpKSpY99qmnnlJaWtoVvQ6w0r73ve9ZHQGIwpzEevK9731PVVVVys7OjrSNjo6qr69P7e3tkZMkwFrg/RFrwW63q7y8XDk5OZKkp59+OnIC+LWYk1hPmI9Yb5iTsNrk5KTVEQAAuGoLBU1LGRsbi9vu9Xrl9XrV3d0twzCUmpqqtLS0yBc3KGI5TNPUxMSEJiYmNDk5qampqcj16eUYHx9XRUXFKiYEsBFRxLTCFipKk5OTLzn24g8WXq93RYuYFk4GJSQk6H3ve98lx+/atUvvfe97dc0116iwsFDz8/M6f/68nnjiCT377LOamJjQf/2v/1U///nP9Y53vGPFcgIAgI3LMIy42yS53W7V1tZqeHhYHR0dCoVCFqQDgJWVmZmp8vLyqPe90tJSTUxMsNoSAAAAAGBdWthybimmaWpycjJS5LuwhV16eroqKirYxgtLampqUiAQWPZ4l8ulzMxMZWVlXdUuQAA2L4qYVtjCyet4F/Re6+Kipbm5uRXL8NJLL6mtrU2S9J73vGfRZfgWfPazn9X9998f0/66171OH/7wh/Xwww/rk5/8pEKhkD7+8Y+rra1NHo/nsjJ1d3cv2d/f369rrrlGknTrrbeqpqbmso4PrCSv1xspBPzQhz60rKJEYDUxJ7GeXDwfP/jBDyopKUkjIyPq6+tTOByOGpuTk6OCggKVlJRccoVK4Erw/oi1MD8/r+7u7rgrNthsNr3tbW9TYWGhJOYk1hfmI9Yb5iTWk+bmZn3lK1+xOgbWOa/Xq+PHj+uVV17RK6+8oiNHjqijo0OSVFZWFnm8kl566SV9+9vf1n/+539qcHBQ6enp2rNnj+644w594AMfWPHXA7D57dmzR7Ozs5HtvSYmJmLO4b2WaZqanp6WaZqqrKxco6RYb8LhsGZmZjQ1NSWn06nc3NyYMYZhKC0tTcPDw4sex2azKT09PbJ9YWJiIoVxAJa0ZYuYVuLN8Tvf+Y7uuOOOqLaF4p7lVJz6/f7I44SEhKvOs+C73/1u5PFHPvKRS46/1EXFT3ziEzpy5Igee+wx9fX16Sc/+Yn+23/7b5eVqbi4eNljk5KSLll4BayV5ORk5iPWFeYk1pOF+ZiWlqaioiKdP38+Zgu5YDCo9vZ25ebmqqqqSk6n05qw2PR4f8RKM01TAwMDamtri7uinN1uV1VVlfLy8uL+fcmcxHrCfMR6w5yE1S619Q4gSTfffLOee+65NXu9+++/X1/60peiigsGBwf17LPP6tlnn9UTTzyhH//4x5d9gzGArc0wjMi2c8XFxQqHw5qamtLY2JgmJiYiO8zEk5aWtmhfc3OzvF6vUlJSlJycrOTkZCUlJclms63Gj4FVtlCw5PV6NTMzo+npaXm93sjvpLS0tLhFTNKr15lfW8SUnJwcKVpKS0tjXgC4LFu2iGm1pKSkSHr1Lo1LmZmZiTxeqbvP/H6//umf/kmSVFBQoLe85S0rctxPfOITeuyxxyRJzz///GUXMQEAgM3N4/Fo9+7di17wHxoa0tjYmKqqqpSbm8vdNgDWtbm5OTU3N8cUZi7IzMxUTU3Nim4JDgAAgPXFNM3I48zMTB08eFAvvfTSss79X66HH35YX/ziFyVJ27Zt01/8xV9o165d6uvr0ze+8Q0dPnxYzzzzjO688059//vfX/HXB7B1LKyKs7DAQTAYjGwlNzExIa/XG3n/W6qIaXJyUrOzs1FFUIZhKDExMaqoKSkpaVm712DtBAIBzc7Oyuv1Rr5mZ2ejfu+91sLKXPHO6aanpyslJUVpaWlKT09XWlqaHA5KEABcuS37DtLY2HjVxygoKIhpKy4u1u9+9zvNzMxoYmJiyVWOFrZYy8nJWbGT3z//+c81Pj4uSbr99ttlt9tX5Lj19fWRx729vStyTAAAsLkYhqGCggJlZGSopaVFY2NjUf3BYFBNTU0aGBhQTU3Niq5ECQArwTRNdXd3q7OzM+7y+k6nU1VVVcrJyaEYEwAAYJO7/fbb9YlPfEKHDh1SVVWVJKm8vHzFi5jGxsZ03333SZJKS0v129/+VtnZ2ZH+d73rXbrlllv085//XE8++aTuuusu3XDDDSuaAcDW5XA4lJWVpaysLElSKBTS1NTUktc4g8GgZmdnY9pN09TMzIxmZmY0ODgY9RpJSUlKTExUYmKiMjIyWBXRAgMDA7pw4YLm5+cv+7nhcDiy8tZrJSYmav/+/SsREQAkbeEiptra2lU5bn19vX7yk59IkpqamnTttdfGHRcMBtXW1iZJqqurW7HXv9yt5JaLE/QAAGC5PB6Pdu7cqcHBQbW1tSkYDEb1T0xMqKmpSXv37uUzBoB1w+v16vz584telMrLy9O2bdvYFhMAAGCLuOuuu9bkdR599FFNTk5Kkh544IGoAibp1W2Mv/3tb+uXv/ylQqGQvvrVr1LEBGDV2O32yDZgi1lqC7p4Ll7tSZKqqqoWLWIaHx+X2+2Wx+NhC7JLCIfD8vv9mpubk8/ni/yzvr4+7jlXu91+RQVMCQkJSk1N5b8HgDWzZYuYVssb3vCGyOPnn39+0SKmo0ePRraT+73f+70Vee3h4WH967/+qyRp79692rVr14ocV5IaGhoijwsLC1fsuAAAYHMyDEP5+fnKyMhQa2urRkZGovq3bdtGAROAdcPr9erYsWNx+9xut2pqapSZmbnGqQAAALAVPP3005Kk1NRU3XrrrXHHFBcX681vfrN+9atf6Te/+Y2mp6fjroYBAGshNTVVu3bt0vT0tLxer2ZmZjQ3N7fs5ycmJsZtD4fDOn36dOR7t9sd+XK5XHEfb9bCmnA4rEAgIL/fH/X12rZ4/H6/PB5PTPtyVr/yeDyR7QBTUlKUkpLCzVwA1hxFTCvshhtuUFpamiYnJ/WP//iPuvfee+NeoHv88ccjj2+55ZYVee0nn3wyUkG7kqswSa/uyb3g+uuvX9FjAwCAzcvtdmvHjh0aGRlRa2ur/H6/ioqKlJqaanU0AIhISkpSRkZGZGvuBUVFRaqoqFixbboBAACAiwUCAb3yyiuSpOuuu04ul2vRsddff71+9atfye/36+jRo7rxxhvXKiYARLHb7crMzIy62ScYDGpmZkZerzfyNTMzI9M0Y56/WBGTz+eL+n6pQp2Lszidzsj27/HOOYbDYU1PT8tut8vhcMhut8tut696AZRpmgoGgwqFQgqFQpHHC//MycmRwxF7qX5qakonTpy44tf1+Xxxi5g8Ho8Mw5BpmjIMQ4mJiZGCpYWveHkAYK3xTrTCXC6X/uRP/kRf+tKX1NjYqIceekj33HNP1JiXX35Zjz32mKRX//A4dOhQ3GMtFD+VlZWpo6Pjkq+9sJWcw+HQ7bffvqy8Z86cUUJCQmRP73geeeQRPfroo5Kk/Pz8FSu6AgAAW0d2drbS09PV3d2tkpKSRccFg0HZ7XZWaQKwpgzDUHV1tY4ePapwOKzExETV1NQoLS3N6mgAAADYxJqbmxUKhSRJtbW1S469uL+xsfGyiph6enqW7O/v7488np6e1tTU1LKPfTUu3sp5sW2dgcvFvLKOYRiR1XukV4t4FgqRfD6ffD6fAoGAfD5f3OKkhe3mLsdCgZDP54vsgPNafr8/aseZi/MahiGbzRZ5/No2SVHbfF48p/x+v9rb22WapsLhsEzTjHm8FJvNpoSEhLh5r8b4+PiiBVrbtm2T0+mU2+2OOf86Ozt7Va+L5eN9CqvBqnl1uVuMLgdFTKvgnnvu0Q9/+EM1Nzfr3nvvVWtrq2677TYlJCTo8OHD+vKXv6xgMKiEhAR9/etfX5HXbGhoiGx/8Pa3v125ubnLet6xY8f08Y9/XDfeeKPe8Y53aNeuXcrKylIwGFRTU5OeeOIJPfvss5JerWZ+5JFHlrXcIAAAwGs5HA5VVFQs2m+apk6dOiWXy6Wqqqq4f8QDwNVYuNswnoSEBJWXlysUCqm0tHTTLkkPAACA9ePi4qLi4uIlx158Q1B3d/dlvc5SNxO91ve+9z1Livm/973vrflrYvNjXq1Pv/71r+O2Z2Vlqby8/Iq3L/vhD38YtwAoMTFRu3fvjmm/uOhoKb/97W8jjy+eUx6PR3v37r2irJL01FNPxS0atdvtiy6AEU8wGIwUhvl8Pp05c2bRgi6sP7xPYTWs5by6kgLUS6GIaRWkpKTomWee0U033aSWlhY98sgjeuSRR6LGpKam6oknnriqX24XW1iFSZI+/OEPX9ZzQ6GQfv3rXy/6oUF69YPDY489pptvvvmKMwIAACylp6cncofAkSNHVFJSotLSUrZxArAiJiYm1NLSooqKiqi7KC92ORd3AAAAgKt18Z3rycnJS469+OZiVm0AsBmNjo5qdHRUdrtdbrdbbrdbLpcr7le884XBYDDucVfr3OKlVlq6lMW2bguFQgqHw7LZbAqHw/L7/QoEAnG/fD5fZEU/ANgsKGJaJVVVVTpx4oS+9a1v6Uc/+pFaW1sVCARUUlKim266SZ/5zGdUVla2Iq8VDof1xBNPSJLS09P17ne/e9nPvemmm/TYY4/p5Zdf1okTJzQ4OKjR0VGZpqnMzEzt2bNHb3/723XHHXfE3UcWAABgJfh8vqjtc03TVFdXl4aGhrRt27ZFCw4A4FICgYDa29s1MDAgSWptbVVGRgYFkgAAALCcz+eLPHa5XEuOdbvdkcdzc3OX9TqXWrmpv79f11xzjSTpQx/6kIqKii7r+FfK6/VGVgr40Ic+dMlCLmA5mFebn2maCoVCCgaDUV979+6Nu/ry1NSU2tvbL7ni0mJuuukm/ehHP5IUPafm5+d19uzZZR/HZrPJbrfLbrfLZrPp7W9/+6Ir3/l8PjkcDtnt9kVXlMbGxfsUVoNV86q3t1df+cpXVvSYFDGtoqSkJN1777269957r+j5y63gtdlsl7187ILc3FzdeeeduvPOO6/o+QAAACth4Q/zQCAQ037u3DllZmayxRyAy2Kapnp7e9XR0RF1V6Lf71dnZ6cqKystTAcAAICVsBIXdr/zne/ojjvuuPowV8Dj8UQev/bv4de6eIuky/3b+FJb1V0sJSXFkhuak5OTuZEaK455BenV3XGKi4sjxU8Xf4XDYYXD4ci2cgv/XHgsRReRXjynwuGwamtrZRiGbDabbDZb1GObzRYpRLrcYiTm7dbB+xRWw1rOq3jbYl4tipgAAABgufT0dB06dEidnZ3q6emJ6R8bG9ORI0dUWlqqkpISVlABsKTx8XG1trZqdnY2bv/ExIRM0+RuRgAAAFgqJSUl8vhSW8TNzMxEHrNiAwBcPsMw5HA4Ft3GbTGLXaC32WzKy8tbiWgAgItQxAQAAIB1weFwaNu2bcrPz1dLS4smJyej+k3TVGdnpwYHB7Vt2zZlZWVRgAAgis/nU1tbm0ZGRuL22+12lZeXq6ioiPcPAACATaCxsfGqj1FQULACSa7MxSskxbuh52IX78ZQUlKyapkAAAAAK1HEBAAAgHUlKSlJe/bs0dDQkNra2jQ/Px/Vv7DFXHp6urZt28YdqAAUCoXU3d2t7u5uhcPhuGNyc3NVWVkZtQw8AAAANrba2lqrI1yVmpoa2e12hUIhNTU1LTn24v66urrVjgYAAABYwmZ1AAAAAOC1DMNQXl6errnmGhUVFcUdMzExoWPHjqmzs3ON0wFYL0zT1MjIiI4eParOzs64BUzJycnau3ev6urqKGACAADAuuJyuXTNNddIkl5++WUFAoFFxz7//POSJLfbrYMHD65JPgAAAGCtUcQEAACAdcvhcKiqqkoHDhxQampq3DFJSUlrnArAejA/P69Tp07p3Llz8vl8Mf0Oh0PV1dXav3+/0tLSLEgIAAAAXNp73/teSdLU1JSeeuqpuGN6enr061//WpL0pje9SSkpKWsVDwAAAFhTFDEBAABg3VtsJZX09HRlZWVZmAyAVRwOh0KhUNy+wsJCXXPNNSosLJRhGGucDAAAAHhVR0eHDMOQYRi64YYb4o75+Mc/Him6/9znPqfR0dGo/lAopE996lORz7733HPPqmYGAAAArOSwOgAAAACwHIZhKDc3V1lZWeru7lZPT4+2bdu2aIFCOByWzUbNPrBZGYahyspKnT59OtKWlpamqqoqJScnW5gMAAAAm0Fra6teeOGFqDav1xv55+OPPx7V9/a3v135+fmX/TqZmZl64IEH9MlPflKdnZ163etep89//vPatWuX+vr69PWvf12HDx+WJH3gAx9YtBgKAAAA2AwoYgIAAMCGYrfbVV5eruLiYjkc8T/OmqapU6dOyePxqKKiQh6PZ41TAlgppmkuWqyYkZGhzMxMzczMqLKyUjk5Oay8BAAAgBXxwgsv6KMf/WjcvtHR0Zi+w4cPX1ERkyR94hOfUF9fn770pS+pra1Nd955Z8yYm266Sf/wD/9wRccHAAAANgqKmAAAALAhLVbAJL16QnlqakpTU1MaHh5WYWGhysrK5HQ61zAhgKthmqbGxsZ04cIF1dTURLbYeK3t27fL4XCw8hoAAAA2tC9+8Yt629vepm9961v6z//8Tw0ODio9PV179uzRRz/6UX3gAx+wOiIAAACw6ihiAgAAwKZimqba29ujvu/t7dXAwIBKS0tVVFQku91uYUIAlzI5OakLFy5oampKktTW1qZ9+/bFXWXJ5XKtdTwAAABsAXfccYfuuOOOqzpGeXm5TNNc9vjXv/71ev3rX39VrwkAAABsZBQxAQAAYFOZmZmR3++PaQ+FQmpvb1dvb6/Ky8uVn5/PtlPAOuP1etXe3q6xsbGo9unpaQ0PDys3N9eiZAAAAAAAAACA1cZ6+wAAANhUkpOT9brXvU5FRUVxi5QCgYCam5t19OhRDQ0NXdZdsQBWx9zcnBobG3Xs2LGYAqYFQ0NDa5wKAAAAAAAAALCWWIkJAAAAm47T6VRVVZWKiorU0dERt/hhdnZWjY2N6urqUnl5ubKysliZCVhjfr9fnZ2dGhgYWLSg0O12q7y8XHl5eWucDgAAAAAAAACwlihiAgAAwKaVkJCguro6FRcX68KFC5qYmIgZMzMzo3Pnzik5OVnl5eXKzMykmAlYZX6/X93d3erv71c4HI47xul0qqysTAUFBbLZWEQYAAAAAAAAADY7ipgAAACw6aWkpGjPnj0aGxtTe3u7vF5vzBiv16vm5ma97nWvo4gJWCULxUt9fX2Lrrxkt9tVUlKi4uJi2e32NU4IAAAAAAAAALAKRUwAAADYMjIzM5WRkaGRkRF1dnZqZmYmqr+0tJQVX4BVNDw8rN7e3rh9NptNhYWFKi0tldPpXONkAAAAAAAAAACrUcQEAACALcUwDOXk5Cg7O1vDw8Pq6OjQ3Nyc3G63CgoKFn2eaZqs0ARcpYKCAnV3dysQCETaDMNQfn6+ysrK5Ha7LUwHAAAAAAAAALASRUwAAADYkgzDUG5urnJycjQ4OCi73b7oKkwzMzNqbGxUSUmJcnNzKWYCLmGxor+FreLa2toixUulpaXyeDwWpAQAAAAAAAAArCcUMQEAAGBLWyikWEpXV5dmZmbU1NSkjo4OlZaWKi8vj63ngNeYmppSd3e3bDab6urq4o4pKCiQ3+9XUVERxUsAAAAAAAAAgAiKmAAAAIAlzM3NaWhoKPK9z+dTc3OzOjo6VFRUpIKCAjmdTgsTAtYyTVPj4+Pq7u7WxMREpL28vFwJCQkx4+12u7Zt27aGCQEAAAAAAAAAGwFFTAAAAMASBgYG4rYHAgG1t7ers7NT+fn5Ki4ujluwAWxW4XBYw8PD6unpkdfrjenv7u5WTU2NBckAAAAAAAAAABsRRUwAAADAEsrLy5WSkqKuri5NT0/H9IfDYfX19amvr0/Z2dkqLi5WWlqaBUmBtTE/Px+Z84FAYNFxIyMjqqqqYttFAAAAAAAAAMCyUMQEAAAALMEwDGVnZysrK0vj4+Pq6urS5ORk3LEjIyMaGRlRSkqKiouLlZ2dTQEHNo2ZmRn19PRoaGhI4XB40XEul0vFxcUqKChg/gMAAAAAAAAAlo0iJgAAAGAZDMNQZmamMjMzNT09HSnmiGd6elqNjY1KSkrSgQMHZBjGGqcFVoZpmhobG1NPT48mJiaWHJuQkKCSkhLl5eVRvAQAAAAAAAAAuGwUMQEAAACXKSUlRXV1daqoqFBvb6/6+/sVCoVixmVmZlLAhA2tr69Pra2tS45JS0tTUVGRsrOzme8AAAAAAAAAgCtGERMAAABwhTwej7Zt26aysjL19/ert7dXfr8/0l9YWLjoc0OhkOx2+1rEBK5Ybm6u2traZJpmVLthGMrNzVVRUZFSUlIsSgcAAAAAAAAA2EwoYgIAAACuksPhUElJiYqLizU8PKze3l45nU55PJ644+fm5nT06FFlZ2crPz9f6enprGADywQCAUmSy+WK6XM6ncrJyYlsneh0OlVYWKjCwsK44wEAAAAAAAAAuFIUMQEAAAArZGF1mtzcXIXD4UXHDQwMKBwOa2hoSENDQ/J4PMrPz1deXt6ihU/ASgqHwxodHdXg4KDGxsZUWFioqqqquGMLCgo0OzuroqIi5ebmymazrXFaAAAAAAAAAMBWQBETAAAAsAoWK/QwTVODg4NRbT6fTx0dHero6FBGRoby8/OVlZXFdnNYUaZpyuv1amBgQENDQwoGg5G+gYEBVVRUxJ1zaWlpOnDgwFpGBQAAAAAAAABsQRQxAQAAAGtoZmYmsn1XPOPj4xofH5fNZlN2drZyc3OVkZHB6je4Yj6fT0NDQxocHNTs7GzcMaFQSENDQyooKIjpY6tDAAAAAAAAAMBaoIgJAAAAWEPJycm69tprNTQ0pP7+/kWLSi7ebs7pdConJ0e5ublKTU2lqASX5Pf7NTw8rKGhIU1PT19yvM1mW7K4DgAAAAAAAACA1UYREwAAALDGXC6XiouLVVRUpOnp6cj2XqFQKO74+fl59fX1qa+vT3V1dcrNzV3jxNgIQqFQZC5NTU0t6zlpaWnKy8tTTk6OHA7+PAQAAAAAAAAAWIez1AAAAIBFDMNQamqqUlNTtW3bNo2MjGhwcFDj4+OLjs/IyFjjlNgoDMNQR0eHgsHgkuM8Ho/y8vKUl5enhISENUoHAAAAAAAAAMDSKGICAAAA1gG73R4pLAkEAhoeHtbg4GDUVmDp6elyOp1xnz8+Pq6BgQFlZmYqMzNz0XHY2EzT1Pz8vFwuV0yfzWZTTk6O+vv7Y/ocDkdkS8K0tDS2JAQAAAAAAAAArDsUMQEAAADrjMvlUlFRkYqKijQ3N6ehoSENDQ0pOzt70ecMDw9HxklSSkpKpKApJSWFopUNLBAIaHx8XGNjYxofH1diYqL27t0bd+zFRUx2u13Z2dnKzc1Venq6bDbbGqYGAAAAAAAAAODyUMQEAAAArGMJCQkqKytTaWnpomNM09TIyEhU2/T0tKanp9XZ2Smn06mMjAxlZGQoPT1dHo9ntWPjKoTDYU1OTkaKlmZmZqL6JycnNT8/H3e1rfT0dBUUFEQK2ChcAgAAAAAAAABsFBQxAQAAABvAUispLRS1LGZ+fj5qlSaPx6P09PTIl9vtXvG8WL5QKKSpqSlNTk5qYmJC09PTCofDSz5nbGxMeXl5Me2GYaimpma1ogIAAAAAAAAAsGooYgIAAAA2uMTERFVXV0dW7rlUAYzP59PAwIAGBgYkSdXV1SosLFyLqPi/AoGAenp6NDk5qenpaZmmeVnPn56ejlvEBAAAAAAAAADARkUREwAAALDBuVwuFRYWqrCwMLIV2ejoqMbHxzU7O3vJ5yclJcVtN01To6OjSk5OltvtXnI1KFwewzDU3d297PF2u13p6enKzMxURkaGEhISVjEdAAAAAAAAAABrjyImAAAAYBOx2WzKyMhQRkaGJGlubk5jY2OamJjQxMSEgsFg1HjDMJSSkhL3WLOzszp37pykV4tokpOTo74SExNls9lW9wfaIEzTlM/n08zMTNRXaWlp3BWTnE6nkpKSNDMzs+gxU1JSlJGRoczMTKWkpPDvGgAAAAAAAACwqVHEBAAAAGxiCQkJKioqUlFRkUzT1MzMTKSgaXJyUgkJCYsWx0xNTUUeh0IhTU5OanJyMmqMx+NRYmKiEhMTlZCQEHnsdDo35cpNwWBQPp9Pc3Nzka+ZmRnNzs4qFArFjJ+amlp027e0tLSoIqaUlBSlpaVFvpxO56r9HAAAAAAAAAAArDcUMQEAAABbhGEYkVWUiouLZZqmAoHAouMvLmJajM/nk8/n09jYWFS7w+HQ61//+riFTKFQSKZpym63b4hCp66uLo2Ojsrn8y357yue6enpRftycnLkcDiUlpam1NRUORz8eQYAAAAAAAAA2Lo4Sw4AAABsUYZhyO12LznG4XDEbEG3HA6HY9ECpd7eXrW3t8tms8npdMrlcsnpdMrpdMrhcMhut8f80zAM2Ww2ORwOJScnxz2u3++PFBmZpqlQKKRwOKxQKBT5CofDCgaDmp+f1/z8fORxUlKS6uvr4x53dnZ2WQVd8Xi9XoXD4birXaWnpys9Pf2KjgsAAAAAAAAAwGZDERMAAACAuLZv366amhr5/X55vV7NzMzI6/XK6/XK5/Mt+VyPx7No30KhUTgclt/vl9/vX3ampKQkHTx4MG5fd3e3ent7l32siy22pZ6kSxZ6XczhcCgpKSnqayOsNgUAAAAAAAAAgNUoYgIAAACwKMMw5PF45PF4lJ2dHWkPBoOanZ3V3NycZmdnox6bprlk4c/8/PxV5VkNS602Fe9ncbvdSkhIiHwtFCy5XC6KlgAAAAAAAAAAuAIUMQEAAAC4bA6HQ6mpqUpNTY1qN03zkisrLazEdCWWWjHpaoqHliqsSktL07Zt2+TxeCJFS0vlAAAAAAAAAAAAl48iJgAAAAArZmHlpqXs3LlTgUBAgUBA8/PzkX8Gg0EFg0GFQqGYf5qmqXA4LIdj8T9hDMOIfEmS3W6XzWaT3W6PfC1873Q6o74cDodM04xbCLWwyhIAAAAAAAAAAFg9FDEBAAAAWFN2uz2yotFKqqysVGVl5YoeEwAAAAAAAAAArA32QAAAAAAAAAAAAAAAAABgKYqYAAAAAAAAAAAAAAAAAFiKIiYAAAAAAAAAAAAAAAAAlqKICQAAAAAAAAAAAAAAAIClKGICAAAAAAAAAAAAAAAAYCmKmAAAAAAAAAAAAAAAAABYiiImAAAAAAAAAAAAAAAAAJaiiAkAAAAAAAAAAAAAAACApShiAgAAAAAAAAAAAAAAAGApipgAAAAAAAAAAAAAAAAAWIoiJgAAAAAAAAAAAAAAAACWoogJAAAAAAAAAAAAAAAAgKUoYgIAAAAAAAAAAAAAAABgKYqYAAAAAAAAAAAAAAAAAFiKIiYAAAAAAAAAAAAAAAAAlqKICQAAAAAAAAAAAAAAAIClKGICAAAAAAAAAAAAAAAAYCmKmAAAAAAAAAAAAAAAAABYiiImAAAAAAAAAAAAAAAAAJaiiAkAAAAAAAAAAAAAAACApShiAgAAAAAAAAAAAAAAAGApipgAAAAAAAAAAAAAAAAAWIoiJgAAAAAAAAAAAAAAAACWoogJAAAAAAAAAAAAAAAAgKUoYgIAAAAAAAAAAAAAAABgKYqYAAAAAAAAAAAAAAAAAFiKIqZV4PV69R//8R966KGH9L73vU8VFRUyDEOGYai8vHxVXvOll17SBz/4QZWVlcnj8Sg/P19ve9vb9OSTT17WcZ588km99a1vVX5+vjwej8rKyvTBD35QL7/88qrkBgAAAAAAAAAAAAAAABxWB9iMbr75Zj333HNr9nr333+/vvSlLykcDkfaBgcH9eyzz+rZZ5/VE088oR//+MfyeDyLHmNubk5/8Ad/oF/+8pdR7V1dXXriiSf05JNP6i//8i/1V3/1V6v2cwAAAAAAAAAAAAAAAGBrYiWmVWCaZuRxZmam3vrWtyo5OXlVXuvhhx/WF7/4RYXDYW3btk2PPfaYXnnlFT399NO68cYbJUnPPPOM7rzzziWPc+edd0YKmG688UY9/fTTeuWVV/TYY49p27ZtCofDuv/++/XII4+sys8BAAAAAAAAAAAAAACArYuVmFbB7bffrk984hM6dOiQqqqqJEnl5eXyer0r+jpjY2O67777JEmlpaX67W9/q+zs7Ej/u971Lt1yyy36+c9/rieffFJ33XWXbrjhhpjj/Pu//7t+8IMfSHp1Famf/vSnstvtkqRDhw7p3e9+tw4cOKCuri7dd999+sM//ENlZGSs6M8CAAAAAAAAAAAAAACArYuVmFbBXXfdpQ984AORAqbV8uijj2pyclKS9MADD0QVMEmS3W7Xt7/97UhB0le/+tW4x3nooYckSQ6HI2r8guzsbD3wwAOSpImJCT366KMr+nMAAAAAAAAAAAAAAABga6OIaQN7+umnJUmpqam69dZb444pLi7Wm9/8ZknSb37zG01PT0f1T09P6ze/+Y0k6c1vfrOKi4vjHufWW29VamqqJOmnP/3pSsQHAAAAAAAAAAAAAAAAJFHEtGEFAgG98sorkqTrrrtOLpdr0bHXX3+9JMnv9+vo0aNRfUeOHFEgEIgaF4/L5dK1114bec78/PxV5QcAAAAAAAAAAAAAAAAWOKwOgCvT3NysUCgkSaqtrV1y7MX9jY2NuvHGGyPfNzQ0xB232HGeffZZBYNBtbS0qL6+ftl5e3p6luzv7u6OPL5w4cKyjwushpmZmchWjc3NzUpKSrI4EbY65iTWE+Yj1hPmI9Yb5iTWE+Yj1hvmJNaTi88/BoNBC5MA68PF/x/09/ev2etOT09Hfjf09vZqampqzV4bmxfzCiuNOYWVxpzCarBqXl382XGl/rYyTNM0V+RIWFJ5ebk6OztVVlamjo6Oqz7ev/7rv+od73iHJOmrX/2q/uzP/mzRsUePHtWhQ4ckSZ/73Of0la98JdL3uc99Tg888ICkV1dYOnjw4KLHeeihh3TPPfdEXv9tb3vbsvMahrHssQAAAAAAAACwFl555ZXIuVNgqzpy5IiuueYaq2MAAABgA1upv63YTm6Dmp6ejjxOTk5ecuzFd7Z5vd5VOQ4AAAAAAAAAbDSDg4NWRwAAAAAA/F9sJ7dB+Xy+yGOXy7XkWLfbHXk8Nze3Kse5lIu3i4unvb1d/+W//BdJ0ksvvaSSkpLLOj6wkvr7+yN3Hr3yyisqKCiwOBG2OuYk1hPmI9YT5iPWG+Yk1hPmI9Yb5iTWk+7ubr3+9a+XJNXW1lqcBrDerl279Morr0iScnJy5HCszaUjfjdgNTCvsNKYU1hpzCmsBqvmVTAY1PDwsKRXP1OuhC1bxLQS25t95zvf0R133HH1Ya6Ax+OJPA4EAkuO9fv9kccJCQmrcpxLKS4uXvbYkpKSyxoPrKaCggLmI9YV5iTWE+Yj1hPmI9Yb5iTWE+Yj1hvmJNaTi8+PAluVx+OxfFtFfjdgNTCvsNKYU1hpzCmshrWeV+Xl5St6PLaT26BSUlIijy+1tdvMzEzk8Wu3jFup4wAAAAAAAAAAAAAAAABXasuuxNTY2HjVx7ByabeLK+d6enqWHHvxVm6v3abttcc5ePDgFR0HAAAAAAAAAAAAAAAAuFJbtohpo+91XlNTI7vdrlAopKampiXHXtxfV1cX1VdfXx933FLHcTgcqq6uvtzIAAAAAAAAAAAAAAAAQFxsJ7dBuVwuXXPNNZKkl19+WYFAYNGxzz//vCTJ7XbHrLR06NAhuVyuqHHxBAIB/fa3v408x+l0XlV+AAAAAAAAAAAAAAAAYAFFTBvYe9/7XknS1NSUnnrqqbhjenp69Otf/1qS9KY3vUkpKSlR/SkpKXrTm94kSfr1r3+96NZ0Tz31lKampiRJt9xyy0rEBwAAAAAAAAAAAAAAACRRxLRudXR0yDAMGYahG264Ie6Yj3/840pLS5Mkfe5zn9Po6GhUfygU0qc+9SmFQiFJ0j333BP3OH/2Z38mSQoGg/r0pz8dGb9gZGRE9913nyQpPT1dH//4x6/45wIAAAAAAAAAAAAAAABey2F1gM2otbVVL7zwQlSb1+uN/PPxxx+P6nv729+u/Pz8y36dzMxMPfDAA/rkJz+pzs5Ove51r9PnP/957dq1S319ffr617+uw4cPS5I+8IEPLFoM9fu///u67bbb9IMf/EA/+9nP9Ja3vEWf/exnVVhYqDNnzuhv/uZv1NXVJUl64IEHlJGRcdlZAQAAAAAAAAAAAAAAgMUYpmmaVofYbB5//HF99KMfXfb4w4cPxxQYdXR0qKKiQpJ0/fXX67nnnlv0+X/1V3+lL33pS1rsP+VNN92kn/zkJ/J4PIseY25uTn/wB3+gX/7yl3H7bTabvvCFL+j+++9f8mcBAAAAAAAAAAAAAAAALhfbyW0CX/ziF/XCCy/o9ttvV0lJiVwul3Jzc/WWt7xF3//+9/XMM88sWcAkSQkJCXrmmWf0xBNP6C1veYtyc3PlcrlUUlKi22+/XS+88AIFTAAAAAAAAAAAAAAAAFgVrMQEAAAAAAAAAAAAAAAAwFKsxAQAAAAAAAAAAAAAAADAUhQxAQAAAAAAAAAAAAAAALAURUwAAAAAAAAAAAAAAAAALEUREwAAAAAAAAAAAAAAAABLUcQEAAAAAAAAAAAAAAAAwFIUMQEAAAAAAAAAAAAAAACwFEVMAAAAAAAAAAAAAAAAACxFERMAAAAAAAAAAAAAAAAAS1HEBMt1dnbq7rvvVm1trZKSkpSZmalDhw7pq1/9qmZnZ62Ohy3CMIxlfd1www1WR8UGNzQ0pF/84hf6y7/8S73jHe9QdnZ2ZH7dcccdl328f/mXf9Ett9yi4uJiud1uFRcX65ZbbtG//Mu/rHx4bDorMR8ff/zxZb+HPv7446v682DjO3r0qP7H//gfeutb3xp5X0tOTlZNTY0++tGP6oUXXris4/EeiauxEvOR90islKmpKf3gBz/Q3Xffreuvv15VVVVKS0uTy+VSbm6ubrjhBj344IMaHR1d1vFeeuklffCDH1RZWZk8Ho/y8/P1tre9TU8++eQq/yTYDFZiPj733HPLfn+8//771+6Hw6Zz3333Rc2n55577pLP4TMksPK8Xq/+4z/+Qw899JDe9773qaKiIvL/ZXl5+aq8Jp93to7Z2Vk9+OCDOnTokDIzM5WUlKTa2lrdfffd6uzsvOrjd3R0LPtzy5Wc38XaWavrkXyW2DpWc05xTmlrWelrh8vx5JNP6q1vfavy8/Pl8XhUVlamD37wg3r55ZdX5fUuiwlY6Gc/+5mZmppqSor7VVNTY7a0tFgdE1vAYnPwtV/XX3+91VGxwS01vz7ykY8s+zihUMj82Mc+tuTxPv7xj5uhUGj1fhhseCsxH7/zne8s+z30O9/5zqr+PNjY3vjGNy5rHn34wx82/X7/ksfiPRJXa6XmI++RWCn/9m//tqx5lJ2dbf7rv/7rksf6q7/6K9Nmsy16jHe+853m3NzcGv1k2IhWYj4ePnx42e+Pf/VXf7W2PyA2jRMnTpgOhyNqPh0+fHjR8XyGBFbPDTfcsOj/V2VlZSv+enze2TpaWlrM6urqRf9bp6ammj//+c+v6jXa29uX/bnlcs7vYm2txfVIPktsLas9pzintLWs5e+W2dlZ86abblr09Ww2m3n//fev6GteLocAi5w4cULvf//7NTc3p+TkZP35n/+5brzxRs3NzekHP/iB/vf//t9qbm7WO9/5Th09elQpKSlWR8YW8Md//Mf61Kc+tWh/UlLSGqbBZldaWqra2lo9++yzl/3cz3/+83rsscckSfv27dO9996rbdu2qa2tTQ8++KBOnDihRx99VDk5Ofryl7+80tGxCV3NfFzwq1/9SoWFhYv2FxcXX/Gxsfn19fVJkgoLC/WHf/iHeuMb36jS0lKFQiG9/PLL+tu//Vv19vbqu9/9rubn5/X9739/0WPxHomrtZLzcQHvkbhaJSUluvHGG3XgwAGVlJSooKBA4XBYPT09+vGPf6ynnnpKIyMjeve7361XXnlFe/bsiTnGww8/rC9+8YuSpG3btukv/uIvtGvXLvX19ekb3/iGDh8+rGeeeUZ33nnnsuY1tq6VmI8L/uEf/kGHDh1atD83N3c1fgRscuFwWHfddZeCwaByc3M1NDR0yefwGRJYPaZpRh5nZmbq4MGDeumll+T1elf8tfi8s3VMT0/rne98p1paWiRJf/RHf6TbbrtNCQkJOnz4sL7yla9oampK73//+/Xiiy9q7969V/2af/3Xf633vOc9i/ZnZGRc9Wtg5a3V9Ug+S2wda32Nm3NKW8tKXKtZyp133qlf/vKXkqQbb7xRn/nMZ1RYWKgzZ87oy1/+stra2nT//feroKBAd91116pkuCRLS6iwpS3c3exwOMyXXnoppv/BBx/krjusGeYa1spf/uVfmj//+c/NgYEB0zSj7+RZbjX1+fPnI3eTHjx40JydnY3qn5mZMQ8ePBh5j2VFOyxmJebjxXeEtLe3r15YbHrvfOc7zR/+8IdmMBiM2z88PGzW1NRE5tvzzz8fdxzvkVgJKzUfeY/ESllsLl7spz/9aWS+3XLLLTH9o6OjZlpaminJLC0tNYeHh2Ne4+abb17WaiXY2lZiPl68EhNzDavha1/7minJrK2tNf/8z//8kvONz5DA6nr44YfN73//+1H/75SVla34Skx83tlavvCFL0T+Wz744IMx/S+++GLkvf1qdli4+HwZq51sTGtxPZLPElvLWswpziltLStxrWY5fvOb30SOe/PNN8f8fT88PGyWlpaaksz09HRzbGxsxV77cthWqBYKuCyvvPKK/vM//1OS9LGPfUzXXXddzJi7775bdXV1kqRvfOMbmp+fX9OMALAavvjFL+pd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", "text/plain": [ "
" ] @@ -619,12 +649,12 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 19, "metadata": {}, "outputs": [ { "data": { - "image/png": "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bB7T/fffb9bTqVMnw2azOcxvzL5Zn3PvptLU1wWTJ082JBm+vr7Gnj17PNt4AACAZuYrAAAAnJKGDBmioUOHmuOGYSgnJ0dr167V7t27JUl5eXmaMmWKSkpKdMstt3irqa3OK6+8ooyMDEnSQw89VGf5+fPn67LLLlNFRYUkKTg4WOPHj1dcXJz27t2rZcuWyTAMrVu3TuPHj9fq1avVtm1bj74HewUFBfrmm28cpiUkJGjw4MFq06aNysvLtWHDBm3atEmSlJKSovHjx2vu3Lm68MILm62d1TIzM1VWVtbs621KL730ktcze8yYMUMzZ840xxMTEzVy5EgFBgbq119/1datWyVJH3/8sbKysvTtt9/K17f2S0xP7OuHDx/W+PHjdfToUUkyn/ru0qWLMjIytGDBAhUXFys9PV2XXnqpvv/+e40bN64xm8YteXl5Ouecc7RlyxZz2tChQ9WnTx/l5uZq0aJFysnJUUFBgaZNmyar1arJkyfXWe/NN9+sDz74wBxPTk7WsGHDJEmrVq3Svn37ZBiG/va3vykvL0/vvvtunXW+9957uummm8zxyMhIjRs3ThEREdqyZYuZ2WnBggU655xztGLFCoWGhrq9LRqqtewv5eXluuyyy7Ro0SJzWt++fTVw4ECVlJTop59+UmpqqsrLy/XII4+ovLy8SZ+a9/b666OlH+9O1LZtW1122WUO0/Lz85WTk6OUlBRt2bLF7C52w4YNuvXWWzVr1izNmTNHXbt29UaTW5TKyko98cQTkqrOG2rLgvj555+rtLTUHI+KitLQoUPVtm1bGYah7du3a82aNTIMQ5mZmfrd736nN954Q7feequn30YNOTk5KioqavJ6H3roIS1btkw5OTl66aWX9MwzzzT5OtzliXMAT+K6pvF69epVa6Y0SZo7d655/DxxmzvTrl27Jmvfyapnz54aP368OW4YhvLy8pSTk6Ndu3Zp9+7dZibMn376ST/99JM++OADvffee0pISHB7PePHj1fPnj0d1pOdna21a9dqz549kqqy4d16660qLS3VnXfe2eD3dN555yk+Pl7p6ekyDENz5syp93mHzWbThx9+aI5PnjxZFovFZflLL720Xvtbr1696tWexvLEdcGDDz6oDz74QBUVFXriiSf0r3/9y9NvAwAAoPl4JXQKAAAAXmH/xPITTzzhstwX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Wuv83e9+p9DQUEnS8ePHG31zxhXDMPTVV1+53a4zzzxTXbt2lVQVHGS/rD37v8tVV13lMgBEkoKDgx1uhLv6u3z11VfmTZXu3bs7fOc7Y/93sW9PU2tN+4v9dqg+LrrSoUMHjRs3zhx39XepD2+v310n6/HuRPfdd5/DMfCVV15RQUGB07LV50T2f7ONGzfqrrvuUt++fRUdHS2LxaJLL720xrK//vqrnn/+eV144YVKTk5WaGio/P39lZCQoBEjRujRRx/VwYMH693+zz77TBdddJHatWungIAAtW/fXhMnTtTs2bPNG6Punv99+OGH5rCz99AY9ts4Ly9Px48fb9L6val79+7q3bu3JGndunXavn17s67fE+cALQXXNfW7rqmvsrIyxcXFmdul+prIHaNHjzaXe/XVVx3mOdvW5eXlmj17tiZOnKj27dub31eXXnqp/vvf/9a77YcOHdLMmTM1cuRItW3bVgEBAYqOjtaAAQN03333adeuXfWu01P++te/OgQbPf/88+a5XGP179/fHD569Gij67P/fvj3v/+tsrIyt5b7/PPPVVRUJEkKCgpyOKdtbTx1XVAtLCxM48ePlySlp6frxx9/bGSLAQAAWgaCmAAAAOBSVFSUOZyXl+fFljh68skn1bdvX/35z3/W6tWrlZWVpfLycpWWliojI0Pr1q3TrFmzNHXqVP3xj3+sta4lS5aoV69emjx5sj777DPt379fBQUFKioqUkpKij755BNdfvnlGjFihI4cOVJrXd988405bH+j2JXFixebw8OHDzefonRl6NChZuBCSUlJvW4ONCf7G7KVlZVebEnrcvvttys3N1f+/v765z//WWswgifZ75djxoyps/zYsWPN4Z9//lmlpaW11tlU+7r9ukJCQjRkyJBa6wwMDNTw4cPN8UWLFtVavqF2796tw4cPm+P13Yau2tWYv4sn6jx48KD27NlT5zIN0Vr2l5KSEq1atcocb6q/i7u8vf76OFmPdyeyWCz6v//7P3P8+PHjbt9QfPLJJzVo0CC9+uqr2rp1q8tghaFDh2rw4MF65JFH9O2332r//v0qLCxUeXm50tPTtXLlSj333HPq2rVrrVl07OXm5urss8/WlVdeqW+++UZHjx5VWVmZjhw5ogULFmjq1KkaM2aMjh075lZ9kvT111+bw+6cE9XHicfHk+1cw3572Z9bNgdPnAO0FFzX1O+6pr78/f0dglbczSS2e/duM1A4ICBA119/fa3lU1NTNWbMGE2dOlULFizQkSNHzO+r//73v7r00kt18cUXuxX8arPZNGPGDHXv3l0zZszQ8uXLlZqaqrKyMmVnZ2vDhg36y1/+oj59+ujRRx/1SPBXfQUEBOiOO+4wx3fs2KGNGzc2Sd1BQUHmcElJSaPru+666+Tr6yup6njo7veZfdamSy+91K1swC2Vp64L7HnzmAEAAOApBDEBAADAJfsbaBEREV5syf+88soreuqpp8wbVrGxsbrwwgt1880365ZbbtGkSZPUt29f+fj41FnXZ599prPPPlt79+6VVPXD7dixYzVt2jRNnz5dI0eONH94XbVqlYYPH660tDSX9dnfqBw5cmSd67d/un7gwIF1lvfz83Po/qi5n8531+bNm83h2p7gx/98/vnnZvaDBx98sM4sXp5U3/1ywIAB5nBlZaXTp9U9sa/bT+vXr5/5Wa2N/bo99fmxr7dNmzZKTExsdLtyc3OVmprqtLw7dR45csTpDdv6/l3atm3r0N1Tc2zDlry/7Ny508x+YLFYHD4LDa2zPry9/vo4WY93zlx00UUKDAw0x3/66ac6l/nzn/9sntt06dJF11xzjaZPn67x48fLz8/PoWx1hqWAgAANHDhQV155pW6++WbddNNNuuCCCxQbGyupKlPJgw8+WGcgU2lpqc4991yHc5i2bdvqqquu0vTp0zVmzBj5+vpqxYoVuvzyy93qqiYzM1MbNmyQVHVuNWjQoDqXqQ/784ygoCDzPZ8s7M8hmzurhifOAVoKrmvqd13TEPZdmn766aduBRLZBztdfvnlio6Odlm2vLxcl112mX7++Wf5+PhozJgxmj59uq688kqH85Ovv/5aF110Ua3fV5WVlbryyis1c+ZMM2CnXbt2uuyyy3TLLbfo2muvVZcuXSRJFRUVeu655/T73/++zvfTHK644gqHcXeOM+6wz77UFF1zJyQkOHSd5k6XcocOHdKSJUvM8dbelZwnrgtO5M1jBgAAgKfU/asdAAAATlkrVqwwh+3T1ntLRUWFnnnmGXP8+eef17333lvjBp9U9bTnf//7X2VkZDita+vWrZoyZYrKy8tlsVh077336tFHH1VkZKRDuX379mnKlClavny5Dh06pGnTpmnevHlO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qfG3KygocCjj7+9v7N69u9Y63333XbO81Wo1XnnlFaOystKcX1lZabzyyiuG1Wo1y82ePbvWOrdv3274+fmZ5W+44QajoKDAocyiRYuMmJgYs8y0adPqtzEaoDXtL48//rhZPigoyPj0008d5peVlRkPPvigw2dqyZIltdbZsWNHt7+vPLF+++/Ljh071lrWXa3leGd/XHJ2LmIvPz/f+Pjjj40hQ4Y4tCM2NtbYu3dvrcs25Ng3fPhwc5kBAwYYO3bscJhfWVlp/P3vfzf8/PwMHx8fIzAw0Czv6rzpkUcecfheefnllx2+VwyjajsPGzasxvlcbdt7xowZZrnnnnuuzvf23XffGf7+/uYyl1xyiVFeXl7ncnV5//33Hba1q+3QFOqz79Smd+/eZj3btm2rtWx9vivc5YlzAE/8Hbiu+R9PXNc405BtXlhYaERERDj8/SUZd9xxh1vL2+871d8RgwcPNvbs2eNQrqKiwnjuueccttUzzzzjsl77z6vFYjHuvfdeIyMjw2nZ8vJy44cffjCuv/56o02bNi7rdPdaoT7XJFlZWcY///lPo2fPng71d+vWzcjKyqp1WfvvB3ePj9u2bXM4j3zjjTca/R7s2Ww2h3bZv/785z+7XY9heOYayf5z25T1euK6oNr5559vLjdv3rwmaS8AAIC3ee7RUwAAAJzULBaLnn/+efPpzwULFqhz584aP368YmNjdezYMS1btkw5OTlq27atbr/9dj366KONXu/evXt1//336/7771eHDh102mmnmU8kHzt2TKtWrdLx48fN8tddd51GjBhRo56+ffvq448/1lVXXaWioiKtXr1aw4YNU5cuXTRw4EBFR0erpKRE6enp2rRpk/lEb22Sk5M1fPhwMw389u3b1atXr1qXiYmJ0SeffKILL7xQFRUV+vHHH9WhQwdNmDBBcXFx2rt3r5YuXWpmJWjXrp3+9a9/1WeTNdrmzZt18803m20ICQmRYRi644473Fr+rrvuUrdu3TzZxBqqM0DYO3jwoDn81VdfOS1TVxcip4rx48frscce0zPPPCNJeuGFFzRnzhyNHDlSgYGB+vXXX7Vlyxaz/MSJE/XII4/UWqen9vWPPvpIQ4cOVWpqqlJSUtS/f3+NHj1aXbp0UUZGhhYsWGB2veTr66t///vfzdLNwt///netW7dOW7duVVZW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KBAIJPx9B4PBDivO7F/m2CbtG5uNbbGfy8vLzfTtrxEKhbR582YZhmH2qaPRqLl1xWKxxF1WL9EMS91VX1+fcOxp9OjRys/Pl91u79S3j/2ekH60U0iHbNWrni4x2h0EMaXBTTfdpGeffVYbNmzQzTffrE2bNun8889XQUGBli5dql//+tcKh8MqKCjQ7373u5Rcc926dfroo48kSaeddpoqKyu7dd5HH32kK664QjNmzNDpp5+uCRMmqLy8XOFwWJ9//rkWLFigxYsXS9oXzfzII490a7pB4GCQn5+vQYMGadCgQQqHw+ZN4PZPrw4YMCDuuYZh6KOPPlJeXp4qKipUUVGRcA1oAAAAAAAO1O7du7V79241NTV1+5ySkhINGDBAFRUVBDABQBq0Dy4aOnRo0rTDhg0z97dv396j67Q/tyt/+ctfVFJS0qP8U+Evf/lLxq+J/o961Te98847cV8vLy/XqFGjer182fPPPx93WbuCggJNnDgx7jndCTiKzZgndaxTDodDRx99dK/KKu1bTjRe39xqtWrKlCndziccDisYDCoQCCgQCGjt2rVqbW3tdbmQWbRTSIdM1que3GPoLoKY0sDlcum1117TzJkztXHjRj3yyCN65JFHOqRxu91asGCBjjrqqJRcMzYLkyRdfPHFPTo3Eono7bff1ttvv50wTXl5uR577DHNmjWr12UE+rO8vDwNHDhQAwcOVCQSUX19vbxeb8JpUX0+nxnR3tzcrC1btqiwsNAMaCouLuYGMQAAAAAgZbxeb7duLno8HjNwKdmyRgCAA9f+yfXi4uKkads/XMysDQD6o7q6OtXV1SkvL092u73D5nA4Ovwcb6aheLM7SUrbihjdmdE0mUTBWrFl6Gw2myKRiLmsXvstNqNVKBRSOBw+oHIAQF9DEFOajBkzRp988okefPBBPf/889q0aZNCoZCGDRummTNn6oYbbtCIESNScq1oNKoFCxZI2nej6ayzzur2uTNnztRjjz2mlStX6pNPPtGePXvMKcLLyso0ceJEnXbaaZo7d27cdWQBdGaz2TRgwICEszBJUk1NTafXfD6fvvrqK3311VdyOp0qLy9XRUWFSkpKCGgCAAAAACRlGIYCgUDCh2kqKio6LBcUY7FYOgQu5efnp7uoAID/p/2MIV0FjjocDnO/p8v9dDVzU3V1tTnrx0UX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YMECLV68WI2Njfrud7+rV155Raeffnqn83vTRvIdGz21fPlyffnll5Kk2bNny+VyJU1PG3nw+u///m9zqag5c+YkXb4jGfqRQP/E+MDBJdNtsMfj0ezZszV9+nQdeuihcjqdqq6u1uLFi/XYY4+ppaVFDz/8sJqbm7VgwYIe54/0yLVxTvR9uTY2BLSXS20VQUxIKBAImPvJ1o+OiXX8/H5/2q7TvnO5/3VSlQ/6pkzVx65cf/315jrpl1xyiWbNmpUw7cKFC+M+BTJ16lRde+21uvLKK/Xkk09qz549uvHGG7Vw4cKUlhXpk8n6OHv2bF1yySWdluWaPHmyzjvvPL366quaM2eO2tra9OMf/1hnnXVWp6U+YuXtSVl7W15kR19oI//617+ay3Z0ZxYm2kgcqFT3IWkjkU6RSETf//73tW3bNknSf/3Xf+noo49OmH716tVx28jp06fr+uuv1znnnKPFixdr/fr1uuOOO/Tb3/42XUVHDrvxxht1++23d3r92GOP1cUXX6yHH35Y11xzjSKRiK644gpt3rxZTqezQ9retJG0j+ipv/zlL+Z+d/qRtJEHp2XLlumnP/2pJKmyslL/+7//2+u86EcC/RPjAweXTLbBgwcP1s6dO1VYWNjh9aOPPlozZ87Uddddp5NOOklfffWVnnrqKZ133nk666yzenwdpF6ujXOi78u1sSGgvVxqq1hODgm1v3kZCoW6TB+bJrOgoCBt12k/Fef+10lVPuibMlUfk7n77rv16KOPStrXSXjwwQeTpk82jW1+fr4effRRHXbYYZKkl156ianuc0gm62NJSUmnTmp7Z555pm699VZJks/n02OPPdYpTay8PSmrRPuYS/pCGxkbfHI4HDrvvPO6TE8biQOV6j4kbSTS6dprr9Wbb74pad9n9y9+8Yuk6ZO1kS6XS88995zKysokSY888ki36i8OPl0tq3H11Vfr8ssvlyTt2rVLL774Yqc0vWkjaR/RE4FAQM8//7ykfQOEJ510Upfn0EYefD777DPNnj1b4XBYTqdTzz//vCorK3udH/1IID6LxXLA2/z587NWfsYH+qZ01atMtsF2u71TAFN7hx56qLk0riT94Q9/6PE1kB65Ns6Jvi/XxoaA9nKprSKICQm1n767O9OEtba2Sure9Hm9vU7sGvGuk6p80Ddlqj4m8vDDD+tn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zGvde++9nY6vWLHCyMvLMyQZ06ZNS3pN9F2ZaCPbq6urM+vfhAkTul1O2siDz5YtW3pUtwzDMJ544omk9dUwDGPJkiVmmrPOOssIh8MdjtfU1BjDhw83JBkej8eor6+Pmw9t5MEnXXXyrbfeMtvFyspK4/PPP+9x2d54441O34faa25uNk455RSzLD/60Y96fA30Lemoj//85z+NjRs3Js3j4YcfNvMYNGiQ0dLSEjfdRRddZKZ7/vnnOx1/7rnnelx+9G3paiPb+9e//tWrvh5tZP8WDAY7/P5uuOGGXuVDPxLIDSNGjDAkGSNGjOhW+vafT4n+nurq6oySkhIz39ra2g7Hw+GwMWvWLDOfpUuXHtibQFalqg2O5ZGoLr700ktGNBpNeP7GjRvNzwxJxosvvtjTt4I0y6VxTuSGXBobQm7q6/fT0y11632g33rggQd0wgknyO/365RTTtHPfvYzzZgxQ36/X88884weeeQRSftmQvrJT37Sq2uMHTtWN910k+655x6tWbNGJ5xwgm655RaNHj1amzdv1rx58/TJJ59Ikm666aaEay9ecsklevzxx/X+++/rwQcf1O7du3XllVeqtLRUq1ev1p133imv1yur1arf//73KV3yBpmR7vq4efNmnXrqqWpsbJQk/epXv1JJSYn+9a9/JTynsrJSlZWVHV578sknddZZZ+mss87S9OnTddhhh8ntdqulpUUfffSRHnnkEXN62crKSj3wwAM9LiuyL931cevWrZoxY4aOP/54zZo1SxMnTjTr2pdffqkXXnhBL7zwghlpf//992vIkCFx87rpppv07LPPasOGDbr55pu1adMmnX/++SooKNDSpUv161//WuFwWAUFBfrd737Xu/8QZF0mPrPbe+aZZ8zp2XsyCxNtZP+3fPlybdq0yfw5Nq2xJG3atKnDk5CSNHfu3F5d59vf/rbOP/98PfPMM1q0aJFOPvlk3XjjjRo8eLDWrl2ru+66S1999ZUkad68eSotLY2bD21k/5eJOrlq1SrNnj1boVBI+fn5+u///m+1tbUl7UcOHTpUHo+nw2v33HOPvv/972vOnDn65je/qdGjR6u4uFhNTU1asWKF/vjHP5r1+rDDDtPtt9/e47IiuzJRHz/66CNdccUVmjFjhk4//XRNmDBB5eXlCofD+vzzz7VgwQItXrxYkmSz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", + "image/png": "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/zkhJgAAAJyXCDEBwAIYiST05L4+PfZuj148PKhk2jit/ZrKXLq4qVSGYchk4ktpAAAAALgQmEwmbaj3a0O9X1+5ZbUO94f1+N4+/fLdXu3pHp0y9tb11QWP87+fPKgSl003r6tWbXHRXE8bAHAa3njjDSUS2Wrs11xzTcFxdrtdl156qZ544gm98cYbSiaTstls8zVNAAAAYF4QYgKABfCZH7yhdzqCpzV2bY1Pt6yr1q3rq9Va5SG8BAAAAAAXuJZKr1oqvfr8dS3qGonqib19+uXeXu3tHtXVrRV594kmUvqn548olszomw/v06Z6v25ZX61b11VreYVnnn8CAMCkffv25ZZXr14949jVq1friSeeUCqV0qFDh7R27dq5nh4ALHmGYcgwDJnN5rzbh4aGFI/Hc+Pee4vFYmpoaJDJZFIgENDw8LBMJpNMJpMcDoeqqqryHjcWiymZTMpisUy5cY4HAGZGiAkAFsDNa6sLhphMJuniZSW6ZV21bllXrYZS1/xODgAAAACwZNSXuPSZK5v1mSubNRZPyWXP/3Xf8wcHFEtmco93dY1qV9eo/vKXbWqt8ujW9TW6fUO1VlV5ObECAPOoq6srt1yoldykhoaG3HJnZ+dph5hOfo58enp6csvhcFihUOi0jnuuxsbG8i4D54LX1fnNMAyl02klEgmlUimlUiml0+nc8sm3yfWGYaisrEyNjY15j9ne3q5wODzj89bV1UmS+vr6pqx3u90qKspf4TQQCEwbL2WrrFosFlmt1rw3i8Uim80mr9d7Ov9JsATxewpzYaFeV6f6/Xk2CDEBwCzrGonql+/2amdnUH/30S15v/y9bX21vv3LA7nHNotJV7SU65Z11bpxTZUqvI75nDIAAAAA4DzgcRT+qu+X7/YW3Hawb0wH+w7pb58+pOXlbt22oVq3ra/RulofgSYAmGMnn/jxeGaujOd2u3PLZ3Jy6uTw06n86Ec/kt/vP+3xs+VHP/rRvD8nzn+8rs4va9askcfjkcViOeN929ratH379rzbVq5cqbKysrOaU09Pj55++um825YtW6aamppp6w3DyAWtCkkkEnr77bfzbnO5XPJ6vUokEorH44rH40qn02c1fyw8fk9hLszn62p0dPTUg84QIaY51t7err/927/V9u3b1dnZKYfDoRUrVujXfu3X9PnPf14u19lV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x44drFy5knHjxlmStD755BNmzZpldWyjRo3Ys2cPH3zwgWXbqlWr2LNnj9XSqFEjy/74+HjatWvHn3/+ibOzM3369GHhwoX89ddfbNq0iQ8//JCSJUty8eJFOnXqxIkTJzLEfPLkSUsCk5OTE88++yxr164lLCyMmTNnUr16dUaPHs3y5csL6F0TAPc6dXD73/e/VFd//MFB0RR/1e+obrXuanDlStQVB0VT8Oxeienw4cPMnTuXrVu3cv78eWJjY1m1ahXVqlWztNm7dy8nT57Ey8uLVq1a2TtEERERkeKvVHW4/21oMwqObYCIBebqS0mZ3Ew6uwPO7sDH2Y1uVGWPc11ISbZvzNkxGKD2w3BXJ3PC1V9TzdeXmaiz4HOH+TgREREp1C5Hx+f5WC83I+4uzjb3XYlJwGQy5alfD1dnPF1t/7R29UYCySk577ekt1ueYsipb775huXLl+Pi4sKSJUsyVEFq2rQpffr0oWXLluzbt4/hw4dnOV1aarWltFNWNGjQgA4dOnD33Xdz4cIFpkyZwuDBg62Oe+SRR1iyZAlRUVEsW7aM7t272+x/wYIFAPj6+tKlS5cCvRZbnnnmGRISEnB2dmbZsmWW5Csw36zp0aMHLVq0YP/+/Xz++ef07duX2rVr2+xr165dVKpUib/++ouyZctatt9333106NCB9u3bk5iYyHPPPce2bdZVRffv38+bb74JwLvvvsu7775r9aRtw4YN6dWrF/369WP+/Pm8+eab9OnTJ0PlKhGRoih9FSY3Nzfc3d0dFI1I7plSUki+etXRYdiVs78/hmwqVOaHiIgINmzYQJMmTSzbQkJCqF69Ol26dOH69es0adIEk8nEtm3buPPOOy3tGjduTKlSpRg6dCgnT55k+fLlPPzww5b906ZNY+vWrQD07duX2bNnk5KSwsWLF7nnnnt48skneeedd/joo484evQo77//Pp9++qlVfO+//z6nTp0C4KOPPrJKem/YsCHdu3enS5curF69ukDen9yoV68ep0+fxt/fP8O+Dh06MGzYMLp06cKaNWsYM2YMffv2xdnZ/N3Ky8uLOnXqWCXj16hRg8qVK2d6vvfee48dO3bg7+/P2rVradiwodX+Fi1a8MQTT9CsWTPOnTvHqFGj+O6776zajBw50lKBaf78+fTu3duyLyQkhB49etCyZctbnnJZ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bPgEJjeGfb9CLqeUFhERkYLRoEEDypcvD8D06dOJi4tzcERmqTd3du7cyYEDByxProO5UpMt9riWdu3aWV5/++23mbbbunUr+/fvz3BMeleuXGHp0qWZ7k97jrT9ODs706lTJwBWr17NgQMHsg8+D4KCgqhVqxYAixYtIjY21ma7mJgYfvzxxwKJQURuXy4uLkRFRXH16lUCAgIoVaqAKi+KSJFWGMezGstmPIcjxrJSdBhLWFemS/5fBS/JH36uflbrRb0Sk12SmN577z3ee+89/vvvvxwfExkZaTlORERERETymU9ZaPUqvLgbei2AO+/PvO31c7D+Y/iiNvz9Nfzfe9Dpc/CwUWr62ilY1B/mdIUL+wosfBEREckZJycnRo0aBcC///5L3759iY+Pz7R9VFQUkyZNKvC4evfujcFgAOC7775j4cKFADRr1oyqVavaPMYe19K4cWPLE+szZszgjz/+yNDm2rVrDB482BLTkCFDsuzzpZdesjkVx4YNG5g+fToADRs2pFGjRlb733jjDZydnUlJSaF79+6cPn0603MkJyfz3XffZdkmM6nxnz9/npEjR9psM2LECC5evJjrvkVERERuVWEcz2osW3jGslI0pK/ElHRVlZjyk4+rj+W1E07EJtp+OKWosMt0cqNHj8ZgMNC9e/ccZ9JfuXLFctw777xTwBGKiIiIiNymnI1Qs7N5uXwUts+CnfMh1sYXSVMyHFhiXkpWg2bDIPIERMwHU4p12+ObYFoL6P0D1Ghvn2sRERERm5599lnWrFnDr7/+yqJFi9ixYweDBw+mcePG+Pn5ERUVxcGDB1m/fj1LlizB3d2dYcOGFWhM5cuXp1WrVqxfv57Jkydz9epVIPPpN+x5LTNmzKBJkyYkJCTQqVMnnn/+ebp27YqXlxc7d+7kk08+4d9//wXg5Zdftpo6I726deuyf/9+GjZsyBtvvEHjxo2Jj4/n999/54svvrBMzzF58uQMxwYHB/P5558zYsQI9u/fT506dXjmmWdo27YtZcqUIS4ujuPHj7N161Z++uknzp07x549eyxP+OfUkCFDmDVrFjt37mTq1KkcO3aMZ599lgoVKnDq1CmmTJnC6tWrCQkJITw8PFd9i4iIiOSHwjae1Vi28IxlpWhwDtB0cgWpuqk6n1T4BDcnN1wMLpxMPunokG6JXZKYRERE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mzY4OzuTnJzMnDlzeOSRR2y2CwsLY+/evbnqW0QktwwGA4mJibi53ay8qCQmkZxx79CBmNmzITez1hiNuHfoUGAxOYqLiwutWrVix44dJCUlcfXqVUsiUuo4K6sxFtwc12U1plu5ciXnzp3Lp6gzjgHT/i0UKU4STp22Wjd4eOCcpkKs3JorcdYV4txMbjgbivaUlnZJYurXr589TiMiIiIiIuJ49zwGCdGw7kOIu2a97+oJ+OFJqNoaOn4KgTWt95eoDO1GQ+s3YP8SCPsGTv1l+zyRx2HtaPjzQ6jVFUKegsotbiZHiYiIOMDQoUMZNmwYly5d4oUXXuDbb7/N0Oa9995j//79AAwaNMjqho2bmxsDBgxg/PjxREREMHbsWF599VWr45OSkhg0aBAJCQlZxtKqVSt27drF33//TWhoKM2bN7faf/78eZ5//vm8XirVq1e3vJ49ezZNmzbN0Gbq1Kn89ttvWfZzxx13WF4fPXqUu+66y2Y7f39/hg0bxmeffcaWLVsYMWIE48ePx8nJdrH9CxcusHTpUp5++mmrcz344IP88ssvLFmyhB9//JGePXtaHRcdHc3gwYOzjFlEJL9cuHABg8FAs2bN8PHxsZn8KiIZGcuVw7NHD24sWpSzRCajEc8ePTCWK3pT1G/atIk77riDatWq2dyfkJDAhg0bAPD29qZ0mgovd9xxBwcPHuTo0aNZnqN69ers2bOHpUuX8tFHH1lNdwxw/Phx3nzzzVu8Emvpx4B33313vvYvUlgknrZOYnItX16VyPLR1firVuvuKe62GxYhdptOTkRERERE5LbgbIQmg+H5ndBwADaniPt3PUy9F1a8DrFXM+43usE9PWDgKng21Jyg5OJl+3wpibDvF5jTBSY1gq1T4MYV221FREQK2LPPPkuzZs0Ac3X2+++/n59//pkdO3awdu1ann76aT788EMA7rzzTt5+++0MfbzzzjuUL18egNdee43HH3+clStXsmPHDr7//nvuvfdeVqxYQUhISJaxPPPMMxiNRkwmE127duXLL78kPDycLVu2MHbsWOrXr8+1a9eskpFyo379+pap8L7++msee+wxli1bxvbt2/ntt9/o0aMHzz33XIbkKVv9pD6J//bbb7NmzRoOHTrEkSNHOHLkiNWUKO+99x5NmjQBYMKECTRo0IDJkycTGhpKREQE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hx9+qLMwUXl5OePHj68SPIuLiyMuLo6PP/64XkJTItJ4+fj4cOjQocrtvDwtDS1SnZTVq/lh3DjKi0/uy+vy4mJ+GDeOa5YubfQzMtWFd955h8mTJ1NeXl7Zl5yczMcff8zXX3/NggULTuu95pdffsn1119fJbCfkpJCSkoKGzdu5IMPPmDz5s1069atxvP861//4oUXXrDr27NnD++++y7z5s1jyZIldO7c+ZTrE6kv1sJCClautOvzqeHfi3JmXMtc4ZgJ6TwsHs4rpp44PMS0fft2PvroI+bOnVuZFD0SXIqOjubKK69k3LhxDB482C5VKyIiIiIiIg1EeQn88WzV/j1/wowR0Gs8nPM4+EU6tq6Q9nDeU3DOY7DzV1g3x/jTVlF1rLUMtn1vNL9o6HUd9Lyu9uXzRESagKuuuoqkpCT+9a9/ccEFF+Dl5cWyZct48sknyc3N5dZbb6Vfv35cdNFFFBUV8eyzzzJixAjc3Nz4+eefefbZZykpKWHixIns3LkT9+PurK2oqOCiiy5i5eEPsEeMGMG9995Lq1at2LZtG5999hk///wz27Zt49xzz2XDhg34+PjYnSM3N5fRo0dXBpiuueYabrrpJsLCwoiPj+fVV1/lgw8+YMuWLY75odWivLwcb29vxo4dyznnnEOnTp3w8/MjLS2NuLg43njjDfbu3csLL7xAhw4d7GZd6t+/P5s3b+a7777jscceA+CXX34hKirK7hpt27atfFxSUsKoUaNYt24dLi4ujB8/njFjxtC2bVvKyspYunQpr776KmlpaYwZM4b169dXCYrt27evMsBkNpu54447GDduHP7+/mzatIkXXniBqVOn0q9fvzP++Tz00EOVAaaOHTsyZcoUevToQU5ODl9++SXvvfce11xzzRlfR0SaDl9fX7vtvLw8bDabvi8SOc6i++476QDTEeXFxSy+/36uW7asnqqqe5dddlnle5Lu3bsDcNddd3H33XdXjgkMDDylc/7yyy/8/fffdO/encmTJ9O9e3eKior45ptveP311yksLOSGG26o9r1ubVJTU7n55pspLS0lLCyMe++9l7POOouQkBCKiopISEhgyZIlfPvtt7We57333mPFihWMGDGCO++8kw4dOpCdnc1HH33ERx99RHp6Orfcckvl+22RhqBgxQpsx4b3XFzwGT7MeQU1UTklOYSaQ+36IoMd/PmrAzgkxHTo0CE+/fRTPvroI9auXQscDS4FBASQnZ2NyWTilVde4eqrr3ZESSIiIiIiInK6XD3gmo+NpeSS/j5up82YpSnuGxhyHwz+pzFbkiO5uEGnsUbLTYGNnxiBpqzd1Y/PTYKlLxut1WDoPQG6XAoevtWPFxHHsFqhKNPZVTiWJQjM5nq9xIYNG1iyZAkDBw6s7OvXrx+xsbFcdNFF5OXlMXDgQGw2G3///TcxMUfDnQMGDCAkJIR77rmHffv2MX/+fC6//HK787/77ruVX6jceOONlUuAVFRU0LJlS84//3zeeOMNXnjhBRITE/nvf//Liy++aHeO//73v+zfvx+A5557jn/961+V+/r27cu4ceO46KKL+PXXX+v853OqevXqRVJSEgEBAVX2jR49mnvvvZeLLrqI3377jaeeeoobb7wRFxdj9j9vb2+6devGmjVrKo/p0KFDjUugADz99NOsW7eOgIAAfv/9d/r27Wu3f+jQoUyYMIFBgwaRkpLCv//9b+bOnWs35sEHH6ycgenjjz/muuuuq9zXr18/rrrqKoYNG2ZX1+nYvHkzb775JgB9+vRhyZIldoG1c889l8GDB3PTTTed0XVEpGk5PsRktVopLCzE29vbSRWJnB6b1UrRMbOK1aWMzZtPuIRcTQ4sX86+RYsIqWUWoNNlCQ7GVMfvZQMCAqq8zwoLC6t1FqMT+euvvxgzZgzffPONXUhp2LBhBAcH89hjj9X4Xrc28+fPp6CgAICFCxdWqXHw4MHceOONvPXWW7WeZ8WKFdx+++3MmDHDLsB57rnn4u7uzvvvv89ff/3F+vXr6d2790nXJ1Kf8hbazxLr1a8fLv7+Tqqm6YpLicPbxf49UYfwDk6qpv7UW4iprKyMH374gY8++oiff/6ZsrKyyuCSu7s7Y8aM4frrr2fs2LFYLJb6KkNERERERETqQ8v+cOuvEPc1/DYVcvbZ7y8rhMXPwdrZMOpJ6H51vX8xXy2/SBj2IAx9APYuh3UfwdbvoLyGO1b3rTDaT1OMIFOv8dB6iHNqF2nuijLh5WY2O9rDieAdUq+XuO++++wCTEeMHTuW1q1bs3fvXtLT05k+fbpdgOmIm2++mQcffJDi4mL+/PPPKl/svP322wCEhoby1ltvVTtzxtSpU/n222/Zvn077733Hk8//TQeHsYU+KWlpcyaNQuAHj168Oijj1Y53s3NjVmzZtGuXTvKyspO/YdQh0JCav/v5e7uzssvv0yvXr3Yu3cvGzZsqBI8Oln5+fmVP9///ve/NZ6ndevWPP7449x99918+eWXzJw5s/LL/4MHD/LNN98AcNFFF9kFmI7w9fVl5syZ1b5OTsW7776L1WoFYObMmVVm3AIj6PbZZ5+xYMGCM7qWiDQd7u7ueHh4UFJSUtmXl5enEJM0OkWHDvFOWJizy6jWF+ecUy/nvTstDa/Q0BMPdDJPT08++OCDamdZmjRpEk8//TSlpaXVvtetzcGDBwFjZqjaQlYn+l48MjKSN998s9r30Q899BDvv/8+YCwPrBCTNATW0lLyjlsi2ufskU6ppanbl7GPSI7OvFRoLcTbq+m9R6rzT2H/+usv7r77biIjI7nqqqv44YcfKtf9HDJkCNOnTyclJYWvv/6aK664ovIDChEREREREWlkTCbodiXc+zec+wS4V/1ykrxk+OZOeP8c2OvEqc5NJmgzFK6YCQ/ugDGvQGTPmseXFRgzOH14EbzRCxa/CFl7HVauiEh9ufbaa2vc16NHDwBMJlONS3xZLBZiY2MB2LVrl92+5ORktm3bBsDVV19dZTaNI1xdXSuXVcvKymLdunWV+9auXUtWVhYAN910U43LB0VHR3P++efX+FycpaSkhH379rF161a2bNnCli1bKm/sBNi4ceNpn3vJkiXk5OQAMG7cuFrHDh8+HDBuND0yMz7AokWLqKgwllk9dmm74w0YMICuXbuedq0Avx/+IqN79+61BrduueWWM7qOiDQ91S0pJyJSV8477zzCagiY+fr61vhe90QiI41gQVZWFt99991p1zdu3Lgavz/v2LFjZTD8VOsTqS8Fy5ZjPe7var/Ro51UTdOWn5dvt13sWtwkl9yt85mYBg8ejMlkqvzHeceOHbn++uuZMGFCrVMhi4iIiIiISCPlZjFmO+p9A/zxDKyfAzar/Zjk9fDBBcbsRmP+Bz5OvDvTEgADbjdayibY8Als+rzmZauy9xqzSi1+DtoOh17XQ+eLHb9MnohIHejQoeap5o8s1RESEkJgYOAJxx3/pfKWLVsqH59oFp9j92/ZsoVBgwYBxhJkR/Tv37/WcwwYMID58+fXOsYRCgoKeOONN/jss8+Ii4urDAlVJyMj47Svc+zybke+JDsZR2YFgFP/+cbFxZ1ChUeVlJSwc+fOk76OiMixfH197X5fKsQkInWpU6dOte4PCgoCTv13zyWXXEJAQADZ2dlcfvnljBw5kosvvpjhw4fTq1evyiWFz7S+wMBA8vPz9btRGozcn36y27b06YPbKfx7RU6eR7kHHDOJnMW7aa54Vm/Lyfn6+vLGG29oTXMREREREZHmwicMLnkDBtwBv/4Hdi2uOmb/3w0r/BPZw2jnPQ3xPxuBpp2/gq2GL6B3LzXafF/odrkRaGo5wJjpSUSkEfDyqvl3sPnw0pm1jTl23PFhnczMo2HQmu5uPyIiIqLa407lHOHh4bXud4Q9e/ZwzjnnsHv37pMaX1RUdNrXSktLO63jCgsLKx876ueblZVVeZNrY/jvKCINy/EzMeXn52O1Wiv//hEROROn+173RIKDg/n++++57rrrOHDgAIsWLWLRokUA+Pn5ce6553LLLbdw0UUXOaU+kfpgLSoi748/7Pr8xoxxUjVN24G8A4S72v/bKTok2knV1K96CTHZbDby8/O55ZZbeP3117n++uu57rrrTukOIREREREREWmkIrrBDd9C/C/w62NwaOfRfec+Ce4NcK12V3foconR8lKNmZk2zIX07dWPL82DdR8ZLbg99BqPqV3tH0SKyCmyBMHDic6uwrEsQc6uoM7UxZT2jWFa/BtuuIHdu3djMpm4+eabufbaa+ncuTOhoaG4u7tjMpmwWq2Vd94fu7TcqTr2i6p169bh5uZ2UsdFR1f/wbajfr6N4b+jiDQsx4eYjnzn5Ofn56SKRE6dJTiYu08zgHwiS6ZMIW727NM+vtvNNzP8xRfrrqDDLMHBdX7OxmbYsGEkJCQwb948fvrpJ5YuXUpSUhK5ubl88803fPPNN4wePZqvv/76hGElkcYgf8kSbMfcNIHZjN/ohrfsd1Ow4cAGfMw+dn3tw9s7qZr6VechpsWLFzN79mzmzZtHXl4eGzZsYOPGjTzyyCOMHDmSG264gSuuuKJyvU4RERERERFpgkwm6HgBtD8X1vwfLH4eAlpBj2ucXdmJ+YbDkEkw+J+QvA7Wz4UtX0FxTvXjDyXAwqfx+eMZrjK1YbNLDygvBvQli8gZMZvBO8TZVcgpOLL0BkBqamqtY49d4uzY445dxi41NbXW5e9OdA2TyYTNZsNqtdY6rqCgoNb9Ndm+fTvLli0D4N///jfPPPNMteOOnf3oTAQf88VgaGhojeGk2hz/823ZsmWNY0/0863NkSUHT+Y8Z3IdEWmaXF1dsVgsdrPX5eXlKcQkjYrJbMYrtH6WUe87efIZhZj6TJ5cb7UJeHp6MmHCBCZMmADA7t27mT9/Pm+++Sbx8fH88ssv/Oc//2HatGlOrlTkzOV8+53dttfAAbjq90u9SMpIohNHl5sssBXg6eHpxIrqT53PvTl8+HD+7//+j9TUVObOncvo0aMxm81UVFTwxx9/cPPNNxMREcF1113HTz/9pKnuREREREREmjIXNxh4J0xaD1fOMkIJ1TmUCHMuh+QNDi2vViYTtOgLF70KD8bDuP+DmHOB6meUMNmstLPu4tKyb/Gd0Q9+fAAOrIUzmHVDRKQx6datW+XjVatW1Tr277//rva47t27Vz5evXp1rec40f4jM3lkZWXVOMZms5GQkFDreWoSFxdX+fiaa2oO6a5Zs6bW85zsTEW9e/eufLx8+fKTOuZ4dfnzrY2npyexsbH1fh0RabqODyzl5NRwQ4FIMxTWqxdRgwef1rEthgwhrGfPOq5IatO2bVvuvfdeVq9eXRlC/+KLL5xclciZK0tNI3/pUrs+/xMslyinb2fOTvaU7KHCdjhf0zTzS0A9hJiO8PT05LrrrmPBggXs37+fl156ie7du2Oz2SgsLOSLL77g4osv1hJzIiIiIiIizYElEEJia97/+5OQ+AfMHAFf3wk5SY6r7WS4eUK3K+GGr+H+ODj3CQiKqXG4qSQH1syC986BdwbB8jeMZepERJqwqKgoOnfuDBhfzOTn51c7rqKigtmHZw8IDAykT58+lfv69u1bOVvQnDlzalx+7cCBA/z666+11tO2bVug9hDRggULyM7OrvU8NSkvL698XNtsTu+++26t5/H0PPrpc0lJSY3jRo0aVbnsyBtvvHFaS9OdffbZlUvbffjhhzWOW716NVu2bDnl8x9r1KhRAGzevJn169fXOO7//u//zug6ItI0+fv7221nZ2ef0ZKcIk3N2a+9hqvnqX2D7WqxMFKz/ziNn58f/fv3ByAjI8PJ1YicuZzvvoNjZr01eXnhO/oCJ1bUdKUXpvNLxi+8kvIKD+97mDcPvkmLFi2cXVa9qbcQ07EiIiJ46KGH2LBhA+vXr+e+++4jLCwMm81GRkZG5d1GDzzwAJMnT+bPP/90RFkiIiIiIiLSEOz7C7b9cHR702fwZl/4/SkoznVeXTXxbwHDHoR/roVbfoU+N4K7b83j07fBb4/Dq51h7tWw5WsoK3ZcvSIiDnTPPfcAkJ6ezqRJk6od8/TTT7N161YAbr/9djw8PCr3eXh4cPPNNwOwYcMGXn755SrHl5eXc/vtt1NaWlprLSNGjACMWaGqm7no4MGD/POf/zyJZ1W9IzMNAZWhrONNnz6d7777rtp9Rxx7k2diYmKN4wICArj33nsBWLFiBffff3+tS+Wlpqby/vvvV7nWpZdeCsD3339f7SwA+fn53HnnnbXWfDLuvPPOys9977jjjmqDXnPnzuWnn34642uJSNNzfIiprKzMbnk5keYusn9/Lv7qq5MOMrlaLFz85ZdEHg7RSN375ZdfSElJqXF/Tk5O5WykR8L2Io2VzWYjZ948uz6/Cy/AxcfbSRU1bWvT1lY+LrWVcqDiAN1adKvliMbNISGmY/Xs2ZNXX32VpKQkfvzxR66++mo8PDyw2WwkJyfz1ltvMXLkSCIjI7n77rtZuHCho0sUERERERERR1r5VtW+8mJY9iq80Rv+fg8qyhxf14mYTNBqIFzyJjy0g6ILXmePuXXN420VsPMX+OpmeKUDfD8J9q7UcnMi0qT84x//YNCgQQB88MEHnHvuucybN49169bx+++/c9ttt/Hss88CEBMTw+OPP17lHE888UTlUhuPPPII48eP5+eff2bdunV89tlnDB48mAULFtCvX79aa7njjjtwdXXFZrNx8cUX89prr7FmzRpWrFjByy+/TO/evcnJybELI52K3r17Vy6FN2PGDK655hp+/PFH1q5dy3fffcdVV13F3XffzZAhQ054niOzMT3++OP89ttvxMfHk5CQQEJCgt2X9k8//TQDBw4E4PXXX6dPnz68/fbbLF++nA0bNrBo0SLeeustLrvsMlq1alXtLFD/+9//KpfaGz9+PPfccw+LFi1i7dq1fPDBB/Tt25f169ef8Od7Ij179qwMta1Zs4Z+/foxe/Zs1q5dyx9//MFdd93FjTfeeMbXEZGmyWKx4O7uDoCLiwtBQUG1BjdFmqOYsWO5ZulSWpzgvUaLIUO4ZskSYsaOdVBlzdOnn35K69atGTt2LK+//joLFy5k/fr1LF26lHfeeYdBgwZx4MABwHjPLNKYFa1dS+nevXZ9AVde6aRqmr61B9fabfcO642L2cVJ1dQ/V2dd2MXFhTFjxjBmzBhyc3P5/PPPmTNnDsuXL8dms5GamsqMGTOYOXOm3dTMIiIiIiIi0sRc8R78NR3+fBVK8+z3FWbATw/BqnfhvKeh4xgjPNTQuHtT1uUKPl+Sip81m5v7WPDc9hVk761+fEkOrPvQaIFtoMe10PMaCGrn0LJFROqai4sLP/74I5dccgnLly/njz/+4I8//qgyrnPnzixYsAAfH58q+/z9/fn5558ZNWoUBw8e5NNPP+XTTz+1GzNx4kRGjBhROWtTdbp27cpLL73EAw88QFZWFvfff7/d/qCgIL799lsef/xxdu7cecrP1WQyMWfOHM455xyysrL44osvqsxs1L17d7788kuioqJqPI+vry+TJk3ipZdeYt26dZx//vl2+xctWsTIkSMBY6aq3377jYkTJ/L111+zcePGytmZquPn51elr02bNnz//fdccskl5OXl8c477/DOO+/YjXniiScwmUy1LsV3Ml599VWSk5P5+uuv2b59e5X/Xm3btuXzzz8nJqbmJVpFpHkymUx06NABd3d3fHx8Kmd2ExF7kf37c92yZaRt3MimmTNJ27CB0rw83H19CevVix533EFYz57OLrPZKCsr46effqp1psl//OMfNc5YKtJYZH1u/+8e97ZtsfTu7aRqmr5jZ2IC6Bve10mVOIbDZ2Kqjp+fH7fffjtLly4lMTGRJ598kpiYGGw2m9Y4FhERERERaercLDDsAZi0HvrfDqZq7iQ6lACfjYfZY+HA2qr7G5BccwClg+6DSRvgph+h53hw86r5gKw9sOQFY9apWaNhzf9BUZaDqhURqXtBQUEsXbqUjz76iAsuuIDw8HDc3NwIDAxk8ODBvPHGG2zYsIHWrWueva5r167ExcUxZcoUYmNj8fDwICQkhLPPPptPPvmEDz744KRquf/++/n5558ZPXo0gYGBeHh40LZtW+655x7Wr1/PsGHDzui59urViw0bNvCPf/yD1q1b4+bmRlBQEAMGDOCVV17h77//tlsuriYvvPAC7733HsOGDSMoKAgXl5rvqvX19WXevHn8+eef3HbbbXTs2BFfX19cXV0JCgqif//+3HPPPfz000/89ttv1Z5j5MiRxMXFcdddd9G6dWvc3d0JDw9n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+u53v3tOoURgIXFMYjnheMRywvGI5YZjEsvJWjoeK7WK6ieekLda0O9vflPDPq6f/rX0hORUVVvqB7SlfkBmxVBt/dWqbnq9qr2/qnrsAokvPhfMWjomsfzt379fn/nMZ5a6DABoyDRNvfTSS1aASZJOnTolr9erDRs2LGFlAAAsjf7+fp08eXLaOqfTqYsvvlhOJ6MtrzZrNsQ0H2m8+++/X7fffvu0dR6PR5KseRhnUyqVrMder/esX9/lcs0aPNqyZYv+9//+3/qVX/kVSdLf/u3fzggxTdYrnbnm86n3TFPVTeXz+RQMBs9q/8BC8fv9HI9YVjgmsZxwPGI54XjEcsMxieVkTRyPkZtnbz/6gxmrDJlynNwlx8ld0o8/LYU2SBe8QdryRqn3esl59t/VYG7WxDGJZW3qiPMAsNwYhqELL7xQzz33nOr1urX+yJEj8nq9am1tXcLqAABYXKlUSocOHZq2zjAMXXTRReeUscDyxwS68ywQCEia23RrU+drXKi7z66//npt375dkvT4449PO+GVflmvdOaaF6NeAAAAAACAeVUtSS6/ZNhn7zd2XNr1Zelrvynd2ys9+HZp133SWN/i1AkAAPALgUBA27Ztm7F+3759ymQyS1ARAACLL5vNau/evTPWb926VaFQaAkqwmJYsyMxNTrYz1Z7e/uMdZ2dnfrZz36m8fFxjY6OKhwON91+coq11tbWaVO1zbft27drz549KhaLSqfT01L6U0dI6uvr09VXX33GeiWpq6trYYoFAAAAAACYTw63dPu/S/lh6cAj0r5/lw7+UKqMN9+mWpAOPDyx7H+j9Fv/vHj1AgAASIrH49q4caMOHz5sravX69q9e7euuOIKtbS0LGF1AAAsrEKhoN27d88YpKWnp0eJRGKJqsJiWLMhpq1bty7Ifrdv365//dd/lTSRiL/22msb9qtWq9awZ43S9PNptqnzJkdpkibqnc1ku8Ph0JYtW+anOAAAAAAAgMXQEpUue+fEUilKRx6TXv7+RLAp0998uwve2LytmJE8TIsGAAAWRmdnpwqFggYGBqx11WpVL7zwgq644ooFvUEeAIClUi6X9cILL6hSqUxb39bWpg0bNixRVVgsTCc3z1796ldbjx977LGm/Z5++mlrerZXvepVC1rTnj17JElut1uxWGxa244dO+RyuSTNXm+5XNZPf/pTaxun07lA1QIAAAAAACwwp2cinHTz56X//JL0ez+RXvtxqetayTjt67Itb2i8j1pF+u8XSf/zVdIjfyYd/tHE1HUAAADzxDAMbd68WZFIZNr6UqnU8OIuAAArXbVa1e7du1UsFqetD4VCuuCCC2YdwAWrAyGmeXbjjTda8y/+4z/+o0zTbNjvgQcesB7fcsstC1bPT37yE7300kuSJgJWNtv0f/JAIKDXvva1kqRHH31UfX19Dffz0EMPWfMsL2S9AAAAAAAAi8owpHUXS9d/WHrfw9JHDkm3/r108W9I3a+Wwl2Nt+vbJZUy0uCL0hN/I33l16R7e6QHf1P66f+SUgelJt8LAQAAzJXNZtNFF12kQCAwbX0+n9eLL76oWq22RJUBADC/6vW6XnzxReVyuWnrfT6fLr744hlZB6xO/CvPM5fLpT/6oz+SJO3du1ef+9znZvR58skndd9990mSbrjhBu3YsaPhvgzDkGEY6unpadj+b//2b01DUpJ08OBB3XbbbdbzP/iDP2jY74//+I8lTaQaP/CBD8w44U2lUvroRz8qSQqHw3r/+9/f9DUBAAAAAABWtJaodOnbpd+4T3rvd5v3O/iDmesq+Ynp6f7jo9L/uEr660ul73xI2vsdqTi2YCUDAIDVzW636+KLL5bX6522PpPJaM+eParX60tUGQAA88cwDPl8vmnrPB6PLr30UjkcjiWqCouNf+kF8JGPfET/9E//pP379+vuu+/WwYMH9c53vlNer1c7d+7Upz/9aVWrVXm9Xn3+858/59e55ZZbtHnzZt1666265ppr1NnZKbfbrYGBAT388MO67777rJTi29/+dt16660N9/Orv/qreuc736lvfOMb+va3v63Xv/71+tCHPqT169dr9+7d+ou/+AsdP35cknTvvffOGLYUAAAAAABgzTnxszP3GT0u/fz+icWwS+uvkDbeIPXeIPVcL3EXKQAAmCOXy6VLL71Uzz77rMrlsrV+eHhY+/fv14UXXsgUOwCAFW1yGlWXy6WjR4/K6XTq0ksvlcvlWurSsIgIMS2AQCCg7373u7rpppt04MABfelLX9KXvvSlaX2CwaAefPBBXX755ef1WgcPHtRf/uVfztrn93//9/Xf//t/n7XPP/zDPyiTyeh73/uedu7cqZ07d05rt9ls+rM/+zPdeeed51Uv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WIzPBsw7QkwAAAAAAAAAVrftb5tYJtVr0tgJKXVwItSUPjAxmtPIUWnkmFSfMqpTpLv5fsf6mreVMtLQnomlkdgW6f95unFb6qBUGJb8bVJgneRwN38dAADmiWEY2rZtm7xe74zRNtLptJ577jldfPHFcrv5XAKAtaBcLuvFF19UNpud0dbZ2ckofVgQhJgAAAAAAAAArC02+8QIS5EeacvrprfVa1J24JehpvBsIaYT515DsL15264vSz/7n7987o1K/oTka5V88V/8efrjXzx3B5tPfwcAwBkYhqHe3l55vV7t379fpmlabblcTs8++6wuvvhi+f3+JawSALDQxsfH9eKLL6pYLM5o27Jli9avX78EVWEtIMQEAAAAAAAAAJNs9l9O/9bz6tn7XvkeqesVE2Gmsb6JJTc4t9cJzBJiyg5Mf14YnliS+8683/VXSnfubNx29CcTwSxvZObicM2tbgDAmrBu3Tp5PB699NJLqlar1vpSqaTnnntOF154oVpbW5ewQgDAQkmn09q7d69qtdq09Xa7Xdu3b1c0Gl2iyrAWEGICAAAAAAAAgHNx5btnrquWpEz/L0NNY33TQ05j/VJlfGKauGbmGoRqxBtu3vb816Vnv9q4zembCDN5QpI7MHOJbZKuvqPxtsWxiRGsnC0TU98xEhQArArhcFhXXHGFdu/ePW0kjlqtpj179mjDhg3q6elhKiEAWCVM09Tx48d19OjRGW1ut1uXXHKJfD7f4heGNYUQEwAAAAAAAADMF4dbim6cWJopZSdCP83YHJLDI1VnTt1wRr5E87bCSPO2yvjEkulr3L7huuYhpkc/KT193y+eGBNhJleL5PROPHZ6J0JSTu/E4vJN/D3Z3VJ4g/TKP2y834HnpdSBX/R1SXanZNgkwz4xYpb12HbaevvEyFKz/RsAAOakpaVFV155pV588UVlMplpbcePH1cul9O2bdvkcHDJEQBWg3w+P2NdIBDQxRdfLJeL0Vux8DijAAAAAAAAAIDF5A7M3n77v0umKRVHpezgxPRy+bSUG5LGk79YUtMfV8YntvXFm++3MLowNVcKU56YvwxEzcX6K5uHmHZ/U3rib+dc4jSRXumDz53btgCAaZxOpy677DLt379fg4PTRwscHh7WM888o4svvlgtLS1LVCEAYD4YhqELLrhA+XxeuVxOktTa2qoL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arWq1tbWhgGhbDarZ5555pxfu1AoNAwxeTweaxRVu91uTfHn8/msx8wwAmA5IMQ0z1wul/7oj/5In/rUp7R371597nOf00c+8pFpfZ588kndd999kiZ+8dixY0fDfU1+cHZ3d+vo0aNnfO3JqeQcDoduu+22OdW7e/dueb1ea07vRr70pS/py1/+siRp3bp18xa6AlYil8ul9vZ2tbe3q1KpWIGmkZGRhoGmZl/yShN3udrt9oUsFwAAAACAaSZvzkmlUk1/lz1dOp2WaZqMMgwA82z//v3WBf6tW7fO2ndq+969e88qxNTX1zdr+8DAgPU4m81aUz4ttFwu1/AxcD44rpaOzWazRvCRJoI8lUrFmuasWCxaIwhNDsow1bm890yGgorFYtN/71KpNG3GmdNrnlykiWuzk8vk81gsZvWf+hrlclmHDh2SaZrWOXW9XreWMzEMo+G0es1GWJqr4eHhpteeNm3aJKfTKZfLNePcfvLfCQuP9ykshKU6rs52itG5IMS0AD7ykY/on/7pn7R//37dfffdOnjwoN75znfK6/Vq586d+vSnP61qtSqv16vPf/7z8/Kae/bs0c9//nNJ0pve9CYlEok5bffzn/9c73//+/Wa17xGb37zm3XJJZcoFoupWq1q3759evDBB/XII49Imkgzf+lLX5rTcIPAWuB0OrVu3TqtW7dO1WrV+hJ46t2rra2tDbc1TVM///nP5XA4FI/HFY/Hm84BDQAAAADA+Tp16pROnTqlsbGxOW8TCoXU2tqqeDxOgAkAFsDUcFFnZ+esfbu6uqzHJ06cOKvXmbrtmXz1q19VKBQ6q/3Ph69+9auL/ppY/Tiulqcf/vCHDdfHYjH19vae8/Rl3/zmNxtOa+f1enXZZZc13GYugaPJEfOk6ceU2+3WFVdccU61ShPTiTY6N7fZbLrmmmvmvJ9qtapSqaRisahisajdu3drfHz8nOvC4uJ9CgthMY+rs/mOYa4IMS2AQCCg7373u7rpppt04MABfelLX9KXvvSlaX2CwaAefPBBXX755fPympOjMEnS7/zO75zVtrVaTY8++qgeffTRpn1isZjuu+8+3XzzzedcI7CaORwOtbW1qa2tTbVaTcPDw8pkMk2HRc3n81aiPZvN6siRI2ppabECTX6/ny+IAQAAAADzJpPJzOnLxXA4bAWXZpvWCABw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w+DgoA4ePCjDMKaN4DT55+TicDhmPCccgZXENE3V63UrlFSpVJqOmJTL5fTss882ndbtTMrlcsMQ02z/xxtxuVzyeDzWaGstLS1N+07+fgYAAAAAAAAAWH4IMS2AxRqp6Mtf/rLGxsYkSffee++0AJMk2e12feELX9D3vvc91Wo1ffazn20YYvrc5z4naWLkhC984QszLlDE43Hde++9ete73qXR0VF9+ctf1kc+8pGF+aEAAMCadqaRnEzTnHW0pnq9LsMwpo32Mlezjf4yGY4yTdMKU82V1+vVNddc07BtfHxc+XxeDodjxkL4CfOlVqspm82qWq1awaTJx6f/WalUZvz/ueqqqxr+n3Q4HOccYJKahw7tdrvsdrtqtZocDse0gJLb7Z72fLbpJQEAAAAAAAAAKwshphXs3/7t3yRJwWBQt956a8M+nZ2det3rXqeHH35YP/jBD5TNZhUIBKz2bDarH/zgB5Kk173uders7Gy4n1tvvVXBYFCZTEbf+ta3CDEBAIAlYRiGHI7mp7Dbtm3T1q1bValUpo3eNLmUy2VryqtKpTJt27mEmM7FbIGqdDqtI0eONGxrFGyy2+3Wn06ns+m522SwhHDHylSv11Wr1VSr1VStVq3HU9dNLlOfX3jhhfJ4PDP2VygU9Pzzz59zPc2Of6fTec77dDqds/7f2LFjh3WsAwAAAAAAAADWBkJMK1S5XNZTTz0lSbruuutmveh2ww036OGHH1apVNLTTz+t17zmNVbbrl27rIsSN9xwQ9N9uFwuXXvttXrkkUe0a9cuVSqV87poAQAAsFCmTvk2Nbx9OtM0VS6XrWW2cNT5hJhmO2eqVquzts3W7nK5moaYBgYGrOnvJke1sdls1uPTn5/etn79+ob7nQyA2Ww2axubzSbDMNbUyFH1el3lcln1el31et2agq1Wq1nrJh+f/me9Xldvb2/D8/dsNqtnn332nEYSkyaO00YhptmO7bk4PfA3afLffzI0ZxiGNc3i5ChJpy9ut1tOp/OMAbuznVIOAAAAAAAAALDyEWJaofbv329NpbJ169ZZ+05t37t377QQ0549exr2a7afRx55RNVqVQcOHND27dvnXG9fX9+s7SdOnLAeHz58eM77BRbC+Pi4NVXj/v375fP5lrgirHUck1hOVvvxePLkyYbrbTabIpGIKpWKarWa9efp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", "text/plain": [ "
" ] @@ -648,23 +678,22 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 20, "metadata": {}, "outputs": [ { - "ename": "TypeError", - "evalue": "SNZ.__init__() got an unexpected keyword argument 't_half_flux_pulse'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[21], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m dp \u001b[38;5;241m=\u001b[39m FluxPulse(\u001b[38;5;241m0\u001b[39m, \u001b[38;5;241m40\u001b[39m, \u001b[38;5;241m0.9\u001b[39m, \u001b[43mSNZ\u001b[49m\u001b[43m(\u001b[49m\u001b[43mt_half_flux_pulse\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m17\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mb_amplitude\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m0.8\u001b[39;49m\u001b[43m)\u001b[49m, \u001b[38;5;241m0\u001b[39m, \u001b[38;5;241m200\u001b[39m)\n\u001b[1;32m 2\u001b[0m dp\u001b[38;5;241m.\u001b[39mplot()\n", - "\u001b[0;31mTypeError\u001b[0m: SNZ.__init__() got an unexpected keyword argument 't_half_flux_pulse'" - ] + "data": { + "image/png": "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ldq6dWuD12+NSGICAKCN6G4t0e/OCWwv4PL4dNObq7XjYOg/LAEAANB8CgsLQ75BNGTIEMXExIQhIgAAAAAAgPq79dZbJR1tRXb77beHnPPII49o8+bNkqTrr79eERER/rGIiAjNnDlTkrR27Vo98cQTQce73W5df/31cjqdtcYyYcIESUerQi1dujRo/MCBA/rNb35Tj2cVWv/+/f3blUlZ1c2ePVsffvhhret07drVv71jx44a5yUkJOi2226TJC1btkx33XVXra3ycnNzNWfOnKBzXXTRRZKkjz76SP/5z3+CjispKdEtt9xSa8xtCUlMAAC0IZed0FXXjesdsK+w3KVrMlbqcGntf/wBAACg6ZSXl2vTpk1Bd9H17dtXnTp1ClNUAAAAAAAA9XfTTTdp7NixkqS5c+fqjDPO0H//+1/9+OOPWrBggX75y1/qT3/6k6Sj73k89NBDQWs8/PDD6tatmyTp/vvv15VXXqnPP/9cP/74o+bNm6dTTjlFn332mUaPHl1rLDfccIMsFot8Pp8uuOACPf3001q1apWWLVumJ554QiNHjlRhYWFAMlJDjBw50t8K78UXX9TUqVP1ySefaPXq1frwww912WWX6ZZbbtGpp55a5zqV1Zgeeughffnll9q2bZsyMzOVmZmp8vJy/9w//vGPOumkkyRJzzzzjE444QQ9//zzWrp0qdauXatFixbpueee08UXX6wePXqErAL11FNPKTY2VpJ05ZVX6tZbb9WiRYu0evVqzZ07V6NGjdKaNWs0fPjwRn1dWhtLuAMAAAAN88B5g7XncJm+3Jzr37fnUJlufGOV3rzuJEVYzGGMDgAAoP1zuVzauHGjXC5XwP60tDT/m3YAAAAAAACtndls1ieffKILL7xQS5cu1TfffKNvvvkmaN7gwYP12Wefhaw8HR8fr88//1xnnnmmDhw4oHfeeUfvvPNOwJwZM2ZowoQJ/qpNoRx33HH629/+pv/3//6fjhw5orvuuitgPCkpSR988IEeeughbd++vcHP1TAMvfHGGzr99NN15MgR/ec//wmqbDRs2DC9++67SktLq3Gd2NhY3X777frb3/6mH3/8UWeffXbA+KJFizRx4kRJRytVffnll5oxY4bef/99rVu3zl+dKZS4uLigfb169dJHH32kCy+8UMXFxXrhhRf0wgsvBMz5/e9/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X1Tv3r0lSc8//7weeOCBOte66aablJycrH/+85/63//+pyVLluj+++9XRESEHA6HrrrqqhrjfOKJJ3TvvffK5XLp+OOP1+zZs/XVV19p1apVeuuttzR27Fj5fD796U9/0rPPPtvg59oRWMIdAAAAaJ36dInRi9NGador/5PL83P1gk/W52h0r6QwRgYAAFCzgwcPBjw2m83q1q1bmKIBAABtWV5enlasWKEVK1Zo5cqVWrlypQ4dOiRJuvrqq5WRkdHk53znnXc0d+5crV+/XgUFBUpJSdH48eN16623auzYsU1+PgAAmpLX51WBoyDcYbSYhIgEmYzmqRszZ84cLViwQFarVR999JHOPffcgPGTTz5Z06ZN0/jx47Vp0ybdeeedNbZMW7lypRYuXKiJEyf6951wwgk655xzNGTIEOXm5uqFF17QjTfeGHDcVVddpX//+98qKirSJ598oilTpoRcv7JSU1xcnCZPntxsz6MmN9xwg5xOp8xmsz755BOdffbZ/rExY8bosssu07hx47R582Y9+eSTmj59uo477riQa61bt049e/bUDz/8oNTUVP/+0047Teecc47OPvtsuVwu3XLLLVqxYkXAsZs3b9aDDz4oSfrDH/6gP/zhD/52fpI0atQoXX755br66qv15ptv6sEHH9S0adOCKld1dCQxAQCAGp3cp5OuHttLc77f5d+XU1gexogAAABq53A4Ah736tVL0dHRYYoGAAC0ZSkpKS12rvLyck2ZMkWffvppwP69e/fqrbfe0jvvvKOHH35Yf/jDH1osJgAAGqrAUaAJ/54Q7jBazJKpS5Rkb/qbvn0+nx5//HFJ0u233x6U+FMpMTFRTzzxhM477zwtXbpU27dvV//+/YPm/eY3vwlIYKqUlJSkmTNn6q9//as2bNigwsJCxcfH+8fPPfdcderUSYcOHdJbb70VMomppKREH330kSTpl7/8pex2e7M9j1Aqk80l6frrrw9IYKq6/ksvvaRx48bJ6/XqhRde0PPPP1/jmk899VRAAlOlSZMm6frrr9fs2bO1cuVKrVq1SqNHjw44zuVyafTo0UEJTJVMJpP++c9/6t1331VJSYnee+89XX/99fV6rh0F7eQAAECtenUO/NDvQJGjhpkAAADhVz2JKTIyMkyRAACA9qRHjx4hPxRrKtdcc40/gWnSpEn64IMP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CUyV3BUVWnzXXc0UUdvywgsv6JRTTtG8efOUnZ0tp9Op/fv3680339To0aP17bff1nutiooKORwO+Xw+vfvuuxo2bJiee+45bdq0SSUlJXK5XMrJydG6des0d+5cXX755dq+fXutaz7wwAM6++yz9cknnyg3N1dOp1O7d+/Wv/71L51wwgm1JlqhfQluYAsAANq1CItZT0w5XgNTYvWXz7aoahe5dVmFuvC57/XStNEa3j0hbDECAAAAAAAAaFler1e7du3yV+gIhfZxAGrj83pVfuhQk6+bv2FDnS3kapK9dKn2LlqkzkOHNnFUUmSnTjJMTVs35uKLL9bo0aMlScOGDZMk3Xzzzbrlllv8cxITgztu1OaLL77QihUrNGzYMN1xxx0aNmyYysvLNX/+fD3zzDMqKyvTtGnTtH37dtlstoBjfVU/RKrC6XQqJydHM2fOlNPpVHJysm677TadfPLJ6ty5s8rLy5WZmaklS5bogw8+qDW+l19+WcuWLdOECRN04403asCAASooKNDrr7+u119/XQcPHtQ111yj5cuXN+h5o20iiQkAgA7IMAxdf1of9UuO0W/eWaMSx889jHOLHPrVi8v1xGXDdeHwtHqt9/nGHC3ZdlAHCiuUU1ih84Z11e1n9G+u8AEAAAAAAAA0IZfLpc2bN6ugoEAFBQUaMWKEzGZzuMMC0MaUHzqkF5KTwx1GkP+cfnqzrHtLXp6imri9ZkJCghISEgL2JScna+gxJGH98MMPOu+88zR//vyAJKXx48erU6dO+v3vf6+9e/dqwYIFuuSSSwKOrS159dNPP1Vpaakk6euvvw6K8ZRTTtH06dP13HPP1RrfsmXLdP311+vFF18MON8ZZ5whm82mOXPm6IcfftCaNWs0cuTIej9vtE20kwMAoAObNChZ8285RT07RQXsd7i9uv2dNXpq4U/yekNn2Ve1es8RvbNinxb9dFBbDxQrM6+kuUIGAAAd2E8//aQNGzZo27Zt2rNnj/+NMgAAAACNV15erjVr1qigoECSVFJSoi1bttRYfQMA0LbY7XbNnTs3qMqSJN1+++3+/d99912t61it1oDHubm5ko5Whho8eHCNx0VGRioyMrLG8a5du+qf//xnyISpe+65x79dV3xoH0hiAgCgg+ufEqsPbjlVY/t0Chr75zeZuuWtH1XmdIc48mcpcfaAxweKGtaXGgAAoD4KCgp0+PBh5eTkaPfu3SorKwt3SAAAAECbVlhYqDVr1qi8vDxg/5EjR7hpAADaibPOOkvJNVTIio2NVf/+Rztr7Ny5s9Z1rFZrQDJSamqqpKO/M95991253bV/llSTKVOm1NjGdODAgYqJialXfGgfSGICAABKjLbp9WtP1FUn9Qga+3zTAf1y9nJlHan5Q8Ku8YEZ9LkkMQEAgCbm8/nkcDgC9tX0BhcAAACAuuXl5WndunVyuVwB+202m0aMGOH/0BgA0LYNGjSo1vGkpCRJUnFxcZ1rWSwWRUVFyTAM/eIXv/C3vrvyyit1xhln6Mknn9Tq1avl8XiaLL7ExMR6x4e2zxLuAAAAQOtgNZv06CXDNCg1VrM+3ixPlTZyW3KKdPHzS/XitFEa1TMp6NjU+MAPEHMKK+Tz+WrtlQwAANAQLpcrqJ0FSUwAAABAw/l8Pu3du1e7d+8OGouOjtbQoUNlt9uDDwSAOkR26qRb8vKafN0l992nTRkZjT5+6MyZOu3xx5suoP8T2Sm4w0VrFBUVVeu4yXS09k19E4/MZrOioqLUpUsXzZs3T9dcc43279+vb7/9Vt9++60kKS4uTmeccYauueYaTZ48uUXjQ9tGEhMAAAgwbWwv9e4co1veWq2iip9Lf+aXOHXFy//Th7eeqsFd4wKOqd5Ozun2qqDMpcTo4P7KAAAAjVG9CpN09A5xAAAAAPXn9Xq1bds25ebmBo0lJSVp8ODBslj4+BBA4xgmk6K6dGnydUfdcccxJTGdcMcdzRJXR2YymRQVFaXTTjtNa9eu1YcffqiFCxdq2bJlys7OVlFRkebPn6/58+frnHPO0fvvv19nshIg0U4OAACEMK5/Z3142zj16RIdsN/p9mr+muyg+cmxdlUvunSAlnIAAKAJOZ3OgMc2m42qjwAAAEADuFwurV+/PmQCU1pamoYOHUoCE4BWKXnECKWdckqjjk0/9VQlDx/exBFBkgzDkN1uV2xsrKZOnapXXnlFW7Zs0fr16/Xkk09qwIABkqQvvvhCDz74YJijRVtBEhMAAAipd+dozb/lVJ3UO7B93Pbc4J7DNotJnaID27kcKCSJCQAANJ3qlZhoJQcAAADUX1lZmdasWaPCwsKgsb59+6p///7cJACgVZv09NOyNLDVpSUyUhP/8Y9migjSz4lMVd+n6dWrl+68806tXLlS3bp1kyT95z//CVeIaGNIYgIAADWKj7Tq8hO7B+zblV8acm5qfLUkJioxAQCAJkQSEwAAANA4BQUFWrNmjcrLywP2m0wmDR061P8BMwC0Zl3HjNEF771X70QmS2SkLnj3XXUdM6aZI4N0tGJ2ZGSkDMNQZGSkzGaz4uLiNOb/vv75+flhjhBtBUlMAACgVn06xwQ83nekXE63N2healxkwGMqMQEAgKZUvZ0cSUwAAABA/ezbt09utztgn81m08iRI9WpU6cwRQUADdf3/PM19dtvlX7qqbXOSz/1VE1dskR9zz+/hSLrmL744gvl5OT4H1ssFkVHR/tbkxYWFmrFihWSpN69e4clRrQ9NLYFAAC16t0lOuCxx+vT3sNl6pccmNwUVImJJCYAANCEqldistlsYYoEAAAAaFsGDx6sNWvWqKysTJIUExOjoUOHcmMAgDap65gxuuL775W3bp3Wv/SS8taulbO4WLbYWCWPGKHjb7hBycOHhzvMDuGdd97RBRdcoLPOOktnn322hg4dqqSkJBUXF2vjxo167rnnlJ2dLUm66aab5PP55Ha7/UlOQChcHQAAoFZxdqs6x0Qov+TnDw53HiwJTmKKCyzhSjs5AADQlGgnBwAAADSOxWLR0KFDtWbNGsXFxWnw4MEym83hDgsAjkny8OE68/nnwx1Gh+dyufTpp5/q008/rXHOTTfdpNtvv10Oh0Mul0sWi0U+n68Fo0RbQhITAACoU58u0YFJTPmlQXNS4wPbyeWSxAQAAJoQSUwAAABA40VGRmrkyJGy2+0yDCPc4QAA2oF//OMfOuuss/TNN99o/fr1ysnJ0cGDB2U2m9W9e3eNHTtW1113ncaNGyen0ymXyyVJcrvdcjqdYY4erRVJTAAAoE59Okdrxa7D/se7DoZIYqpWiSmHdnIAAKCJeDweeTyegH20kwMAAAAaJjIysu5JAIBWo65qRRkZGcrIyGj08ZUWL15c49jEiRNrXCcxMVFXXXWVrrrqqlrX93q9QTenpaWlyeFw1Ov9nd27d9c5B+2HKdwBAACA1q9Pl+iAxzvzS4LmpMYHVkMoLHepwuUJmgcAANBQ1d/okqjEBAAAAFR36NAh7d69mxY9AIBWxWQyhUykrWwvB1RFJSYAAFCnPp1jAh7vDFWJKT5Sw9LjlRJnV9d4u1Lj7fJ4ecMEAAAcu+pJTBaLRWazOUzRAAAAAK1PSUmJNm/eLK/Xq/Lycg0cOFAmE7UMAACtg8Vikd1uV0VFYBePiooKmUwm3ueBH0lMAACgTr2rVWI6VOpUYZlL8VFW/76YCIs+/s24lg4NAAB0AFarVV27dpXD4ZDT6eSNLQAAAKAKh8OhjRs3yuv1SpLy8vJUUVGh448/nr+dAQCthtVqldfrldPpDNhfXl6uqKgokm8hiSQmAABQDz2SomQxGXJXqay0M79EI3skhjEqAADQUcTExGjAgAHhDgMAAABodTwejzZu3BhUvdRut/NhMACg1bHZbPL5fAFt5Hw+nz+RyTCMMEaH1oC/XgAAQJ2sZpN6JEUF7AvVUg4AAAAAAABAy/D5fNqyZYtKSkoC9sfFxWngwIF8EAwAaHUMw1BERERQpcDKdqg+n6+GI9FRkMQEAADqpXfnwJZyu/JJYgIAAAAAAADCZefOnTp06FDAPrvdrqFDh1KFCQDQahmGocjIyKDfVR6PRw6Hg0SmDo6/YAAAQL306RKYxLQzv6SGmQAAAAAAAACa0/79+5WVlRWwz2KxaNiwYbJarWGKCgCA+qlMZKpeNdDlcgW0mkPHQxITAACol96dYwIe004OAAAAAAAAaHmHDx/W9u3bA/YZhqHjjjtOUVFRYYoKAICGMZlMstvtQfsdDgeJTB0YSUzNbM+ePbr77rs1aNAgRUdHKykpSWPGjNETTzyhsrKyY1o7IyNDhmHU67+MjIw61ysrK9Pf/vY3jRkzRklJSYqOjtagQYN09913a8+ePccUKwCg7ateiWlXfqm83sCSnjsOluj+99br6ldX6Nynv9W5T3/bkiECAAAAAAAA7Vppaak2b94ctH/AgAFKSEho+YAAADgGFoslZCITLeU6Lku4A2jPPv74Y/36179WUVGRf19ZWZlWrVqlVatWac6cOVqwYIH69esXxiiPyszM1HnnnReUuf/TTz/pp59+0pw5c/TWW29p8uTJYYoQABBu1ZOYHG6v9heWq1viz3d3lTk8+veqff7HZpMhj9cnsymwHCgAAEB9ORwObdiwQREREf7/unfvLpOJ+7IAAADQsTidTm3YsEEejydgf48ePZSamhqmqAAAODZWq1Ver1dOp1OSFBkZKYuFVJaOin/5ZrJmzRpNnTpV5eXliomJ0QMPPKBJkyapvLxc8+bN08svv6xt27bp/PPP16pVqxQbG3tM5/viiy+UlpZW43i3bt1qHCsuLtb555/vT2C6/vrrdfnllysyMlKLFi3SY489pqKiIk2dOlVLly7ViBEjjilWAEDb1CUmQjERFpU43P59Ow+WBiQxpcRHBBzj8fqUX+JQSlxwFj0AAEB9OBwOlZaWqrT0aCtbwzDUo0ePMEcFAAAAtCyPx6ONGzfK4XAE7O/SpYt69eoVnqAAAGgiNptNPp9PVqtVZrM53OF0SK2l+hVJTM3kjjvuUHl5uSwWixYuXKixY8f6x04//XT1799f9913n7Zt26annnpKs2bNOqbzDRgwoNF/pD7xxBPatm2bJOlvf/ub7r33Xv/Y2LFjNXHiRE2YMEFlZWW68847tXjx4mOKFQDQNhmGoT5dorU+q9C/b1d+qU4b0MX/uHN0hCwmQ+4qbeYOFFaQxAQAABqt+oc0ERERMgyqPAIAAKBj+emnn1RcXBywLy4uToMGDeLvYwDNzmw2y+12y+12y+PxkGSCJmcYRsi2cmgZHo/HX+kx3N/f1F5vBitWrNB3330nSbr22msDEpgq3X333Ro8eLAk6ZlnnpHL5WrRGCu5XC49++yzkqTBgwfr7rvvDppzyimn6Nprr5UkLVmyRCtXrmzRGAEArUefzoEt5XYeLAl4bDIZQQlLOYUVzR4XAABov0IlMQEAAAAdTdeuXQM+VLTb7TruuONoswygRURF/dyRoaCgIHyBAGgWVb+vq36/hwN/2TSDDz74wL89c+bMkHNMJpOmT58u6egFsWjRopYILciiRYtUWHi0osbVV19d4x+7M2bM8G/Pnz+/JUIDALRCvTvHBDzemV8aNCclLvCDxdwikpgAAEDjVU9istlsYYoEAAAACJ/ExESNHDlSdrtdZrNZQ4cO5W9jAC0mISHBv52Xl6e8vDxVVFS0mvZTaP/cbrecTme4w2hXfD6fKioq/N/TlRITE8MYFe3kmsX3338vSYqOjtaoUaNqnDdhwgT/9tKlS3X22Wc3e2zVVcZaPZ7qRo8eraioKJWVlWnp0qUtERoAoBXq06V6JabgJKau8ZGSCvyPD5DEBAAAjkH1N6ioxAQAAICOKjo6WiNHjlR5ebmio6PrPgAAmojdbld8fLy/OMahQ4d06NAhGYYR9tZTbY3P5/O/11FcXExL0Hrw+XwBrc74mgVrzHXl8XiCEhHj4+PD/t4bSUzNYMuWLZKkfv36yWKp+Us8aNCgoGMaa+bMmfrpp5+Un5+vuLg49evXT2eeeaZuvvlmpaen13jc5s2bQ8ZTncViUb9+/bR+/fpjjhUA0HZVT2LaX1iuCpdHduvPL1Kqt5M7QDs5AABwDGgnBwAAAPzMZrNRgQlAWHTt2lU2m00HDx707/P5fHK73WGMqu3xer0qKSmRJMXGxtIWtA5utzvoGrPZbHzdqmmK66pLly7q1KlTU4fWYCQxNbGKigrl5+dLkrp161br3MTEREVHR6u0tFT79u07pvMuXrzYv12Z+fq///1PTz31lJ5++mndeOONIY/LysqSdDR7v2oZwFC6d++u9evX6+DBg3I4HA1647jyPDXJycnxb5eWlqqoqKjeawNNrfIHfPVtIFxa0zXZyeYNeOzzSRv35GlA8s/JTQnVfj1kHS7h53o70pquR4DrEa0N12TzKC8vD3js8Xj426IeuB7R2nBNojUpLQ2uKgwArYnP56PKBIBWxzAMde7cWXFxcSopKVFpaamcTqe8Xm/dB8PP7Xb7K1rFx8fXWhQFksvlCqrS7Xa7FRcXRyJTFY25rkwmk2w2m6KjoxUTE9NqkqT5jmhixcXF/u2YmJg651cmMTX2zZs+ffro0ksv1dixY9W9e3dJ0s6dO/Xf//5X7733nioqKnTTTTfJMAzdcMMNNcZb31grlZSUNCiJqTK2+nj//fcVHx9f7/lAc3rjjTfCHQIQoDVck9HGQJX6rP7HL73zgfrafv4gcbszXtLPP/e37cvT7NmzWzJEtJDWcD0Clbge0dpwTTadE088MeBNqU8++YQEiAbiekRrwzWJcKt8cx8AWiOv16v169erS5cutXbaAIBwsdlsSkpKUlJSUrhDaZOKior00UcfSZLGjh2ruLi4MEfUuvl8Pm3dulV5eXkB+81ms4YPH047w//Tnq4rkpiaWEXFzy1z6pOpVpkIVP3O0vq45JJLdPXVVwdl448ZM0ZTp07VJ598oksvvVQul0t33XWXLrzwQqWmpoaMtyGxNjZeAED7kGB2qNT9cxJTgScwqTXacAU8LvVa5fNJ3DwGAAAaymKxBN1VV/3uOwAAAKC9qPygtrCwUIWFhSovL1ffvn2pygQA6LAMw9DAgQNVUVERUJm7uLhYW7du1ZAhQ/g92c6QxNTE7Ha7f7s+b6w6HA5JUmRkZIPPVVe1osmTJ+vhhx/WQw89pLKyMr3yyit68MEHQ8bbkFgbE29d7fJycnJ04oknSpIuvfRSDRgwoEHrA02ppKTEf1fotGnT6lWpDGhOre2aPPR5pv7z489tQFP6D9PNFwz0P846Uq4PZ6/yP3bLpF9fc73i7PzZ0R60tusRHRvXI1obrsmmV15erq1btwbsu+aaa3hzqh64HtHacE2iNdm2bZsee+yxcIcBAEF2796tgwcP+h9nZ2fL6/XymQkAoEMzmUw67rjjtGbNmoCiMvn5+dq5c6f69u0bxujQ1Pg0sYnFxsb6t+tT3r6y/3pzvXFzww036OGHH5bP59OSJUuCkpgq421IrFLD4+3WrVu950ZHR7fp8mZoX2JiYrge0aq0hmtyUFqiVCWJaV+BMyCmPpHRQceU+azqFhcbtB9tW2u4HoFKXI9obbgmm4bLFVjh0Waz0X68Ebge0dpwTSLcoqODX7cCQLgdOHBAe/fuDdhnNpuVlpYWpogAAGg9bDabhg0bpjVr1sjtdvv3Z2VlKSoqSl27dg1jdGhKprqnoCHsdrs6deok6eg3TG2OHDniTwzq3r17s8STnJzsjyc7OztovDK5qLS0VAUFBbWuVVlNqUuXLgGt5QAAHUufLoFv9u48WCKfz+d/bLealRQd2KY0p7BCAAAADVW9anB9WqEDAAAAbU1BQYG2bdsWtH/IkCFULwQA4P9ERUWFbB+3bds2HTlyJExRoamRxNQMhgwZIknKzMwMyAKsrmpJ/MGDBzdbPLWV2a+MtXo81bndbu3YsUNS88YKAGj9+nQOfOOkqMKtw6WBHzCmxNkDHueSxAQAABqhaltzSdxQAwAAgHanrKxMmzZtCrhJUJL69eunpKSkMEUFAEDrlJiYGLLN6qZNmwI6S6HtIompGYwbN07S0epGq1evrnHekiVL/Nunnnpqs8Ry8OBB5efnS1LIkqOVsVaPp7pVq1b5v+mbK1YAQNuQnhgpmyXwT4id+YF/GJ7St5POGpKi6WN76t5zBmpYN9q+AACAhiOJCQAAAO2Zy+XSxo0bg26IT09PV3p6epiiAgCgdUtNTQ3qdOXxeLRx48agqt5oe0hiagYXX3yxf3vu3Lkh53i9Xr3++uuSpISEBE2aNKlZYnnppZf82fsTJkwIGp84caLi449+sPzaa68FZfpXysjI8G9fcsklTR8oAKDNMJsM9eoUFbBv58GSgMcPTR6il6eP1h8vGqpbJ/XT4K5xLRkiAABoJxITE9W1a1d16tRJMTExioqKqvsgAAAAoA3wer3atGmTysvLA/Z36tRJffv2DVNUAAC0Db1791bnzp0D9lVUVGjjxo3yer1higpNgSSmZnDiiSdq/PjxkqRXXnlFy5cvD5rz1FNPacuWLZKkO+64Q1arNWB88eLFMgxDhmFoxowZQcfv3r1b/5+9O4+Sq67z//+6tfZend7TWbuzmECQNUEISiIMSBAQlMUBWQREGEdgEByZn8rM1xFH9lFUIjsyggKDYnBwYwmbEExYE5J0JyTpdHe60+mturrW+/sjppJb3Z30UlW3lufjnBzrfuou74Rr9e1br/v+rF69er91/O53v9N//Md/SJIKCwt1ySWXDFnH4/Ho61//uiRp7dq1uvXWW4es89prr+m+++6TtDsItXDhwv0eFwCQ+xqqii3LiZ2YAAAAkqGmpkZz587VggULdOSRR/I0OgAAAHKCaZpav369enp6LOMlJSWaP3++DMOwqTIAALKDYRiaN2+eSktLLeOTJk3i52iWc9ldQK666667tHjxYgUCAZ100km68cYbtXTpUgUCAT322GNavny5JGnu3Lm67rrrxrz/zZs3a+nSpTrmmGN02mmn6dBDD1VNTY0kqbm5WU888YSeeOKJeGelW2+9dcSbvddff70ef/xxrV+/XjfccIM2btyo8847T4WFhXr++ef1/e9/X5FIRIWFhbrzzjvH9w8CAMgpjdUlktrjy80dhJgAAAAAAACA0diyZYva29stYx6PRwsWLJDT6bSpKgAAsovT6dSCBQv0t7/9TaFQSHPnzlVdXZ3dZWGCCDGlyOGHH67HH39cF1xwgXp7e3XjjTcOWWfu3LlasWLFkHTgWLz22mvDdnrao6ioSHfccYe+8pWvjLhOaWmpVqxYoWXLlmnDhg1avnx5PGS1R1lZmR599FEddthh464VAJA7hnRiSphODgAAAAAAAMBQO3bs0ObNmy1jDodDCxYskNfrtacoAACylMfj0SGHHKJwOKzy8nK7y0ESEGJKodNOO03vvPOO7rrrLq1YsULbtm2Tx+PR7NmzdfbZZ+trX/uaioqKxrXvI488Ur/4xS/02muvadWqVWpt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BwAAslA23ecHUmXWqafq3Jde0gvXXquWV14Zcb0pixdryR13EGACgCzlnjtXxRdfrMHnnlN0nylsEzmnTVPByScTYEJKJTXE9MADDyRzd1lr0aJF+uQnP6mVK1fqvvvu00UXXaRjjjnGss5tt92mtWvXSpKuvvrqIV0lXnjhhfgvPBdddJElRLTHNddco+XLlysajeqf//mf9dJLL6mwsDD+fiAQ0D//8z9Lklwul6655pph6/3GN76hSy+9VF1dXbrhhhv04x//2PJ+U1NT/Je12bNnE2ICAAAAAIyosdoaYtrUSScmAACQfbLtPj+QKpMXLtQXX35ZO95+W+8sX64da9Yo1NcnT2mpag47TB//yldUc+ihdpcJAJgg15QpKvnylxVta1PorbcUbW+XGQzK8HrlrK2V58gj5ayrs7tM5IGkhpiw11133aXFixcrEAjopJNO0o033qilS5cqEAjoscce0/LlyyXt7oR03XXXjesYc+fO1fXXX68f/OAHWrVqlRYvXqxvfvObmjVrlpqamvRf//VfWr16tSTp+uuv15w5c4bdz0UXXaT7779fr7zyiu6++261tbXp8ssv16RJk/TGG2/o//2//6fe3l45HA7993//94hzfwMAAAAA0FhVYlneuiugUCQmj8thU0UAAADjk033+YFUqzn0UJ149912lwEASDFnXZ0KTz3V7jKQx0ijpMjhhx+uxx9/XBdccIF6e3t14403Dlln7ty5WrFihUpLS8d9nP/8z//Ujh07dP/992v16tU677zzhqxz6aWX6nvf+96I+3A6nXr66ae1bNkyvfnmm3ryySf15JNPWtbxer368Y9/rFNOOWXctQIAAAAAcp/XbQ0rRWOmtnQNaHZNyQhbAAAAZKZsus8PAAAA5ALbHoM0TVNNTU1688039eabb6qpqUmmadpVTkqcdtppeuedd3Tttddq7ty5KioqUnl5uY466qj40xOzZ8+e0DEcDofuu+8+rVixQmeccYbq6+vl8XhUX1+vM844Q88++6zuvfdeORz7/09dVVWlV199VT/5yU903HHHqbKyUgUFBWpsbNTll1+ut956S5dddtmEagUAYDw2bdqkbdu2aceOHerp6VE0GrW7JAAAsB9vb+0eMtbc0Z/+QgAAAJIgm+7zZyvDMBQOh9Xf369YLGZ3OQAAALBR2jsx/d//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xAQAAIZE95sfVGICRp/29nZdfvnlOuuss/Tyyy+rpKREbW1tampq0q5du/TEE09o6tSpWr16dZ/7qqio0OLFi3XPPfdo27Ztam5uVnNzszZv3qzbbrtNF110kVwul9c2F154ocLDwyVJr776aq/7dzgcevvttyVJZ511luLi4gJ2Lj1Zs2aNcnNz9fDDD2v79u1qaGiQzWbTwYMH9ac//UlnnHGGbr31Vp/z9OcPf/iDvvKVr+jPf/6zjhw5IpvNpiNHjuill17SnDlz9Oabb/a6/RNPPKEZM2bo17/+tXbt2qXGxka1t7erpKREf/zjH7Vo0SLdf//9gz5XYCRI7pbE5L8Sk3c7uZKqFlpmAAAAYNwxGAzKycnRlClTfNY1NTVp27ZtammhaikAIDBaW1u1bds2NTQ0+KzLzc1Vbm6u50FYoDuSmAAAwJCgnRwwurndbl188cX685//LEk6//zz9corr2jDhg3auHGjfvOb32jSpElqaWnRxRdf3Gdln4suukj5+fm6/fbb9eGHH+qLL77Qq6++qunTp0uSVq9erd///vde20RHR+tb3/qWJOmdd95Re7tvgkKnDz74QLW1tZ5jBfJc/Nm+fbvOP/98NTY2KjQ0VHfeeafWrl2rTZs26dlnn1V2drYkaeXKlbr33nv73NdNN92kpKQk/fa3v9Xnn3+u9evX64c//KEsFotsNpuuvPLKHuN8/PHHdffdd8vhcOjkk0/WM888o48++khbtmzRqlWrtHjxYrndbj300EN68sknB3yuwEiRavVOYir3V4mpWzu5FnuHKhptPvMAAACA8SAtLU15eXkKCQnxGm9vb9e2bds8f1cDADCUbDabz73dkJAQzZo1S+np6UGKCqOFKdgBAACAsYF2cgi2mubBf0gdaTEpLDTE77raFvugq3iEm0MUYfb/lru+1a4OV//3Gx8V2MTA559/Xu+//75CQ0P13nvv6dxzz/Vaf+qpp+qqq67SGWecod27d+uOO+7otV3a5s2btWbNGi1dutQzNm/ePH3jG9/QjBkzVFFRoaefflorVqzw2u7KK6/U66+/rsbGRv3tb3/TxRdf7Hf/nZWaoqOjdfbZZwf0XPy58cYbZbfbFRISor/97W8655xzPOsWLlyoSy65RKeffrry8/P1xBNP6Oqrr9bMmTP97mvHjh3KzMzUZ5995tUH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WKFFixbJarWqsbFRe/fu1bp16/Tee+8pLCxMt956a0BjysjI0JIlS7Ru3TqtXLlS9fX1knpuJTec5/L73/9ep5xyiux2u5YtW6bbbrtN559/viIjI7Vt2zb9/Oc/V3FxsSTpBz/4gVcbuO5mz56t/Px8zZ8/X/fee68WLVokm82mv//97/rVr34lp9Mpk8mklStX+mybl5enJ554Qnfeeafy8/M1a9Ys3XjjjTrrrLOUnJys9vZ2HThwQBs3btRbb72lsrIy7dy501Otqr9uvvlmvfjii9q2bZueeeYZlZSU6KabbtLEiRN1+PBhPf3001qzZo0WLFigLVu2DGjfwImItJj04AU9//8FAAAAAD0xGo3KzMxUUlKSSkpKVFVV5Xeew+HQ4cOHB/y3NIDRy+12q76+XqWlpZo8ebLCwsJ85lgsFiUkJKi6uloJCQnKzs5WREREEKIFxhaSmAAAwIBYLBalpKQEOwwAQ8xgMOj111/X97//ff3ud79TUVGR7rnnnh7nJyUlDUtcV155pdatW+dJYDKZTLr00kt73WY4zmXOnDlavXq1LrnkEjU2NuoXv/iFfvGLX/jMu+WWW/TII4/0ua9bb71VN998s99kKrPZrD/+8Y865ZRT/G5/xx13KDIyUnfccYcaGhr0+OOP6/HHH/c712w2+73p0heTyaS//e1vOuuss7Rv3z794x//0D/+8Q+vOeecc47uuusufeMb3xjw/gEAAAAACJbw8HDNmDFDNptNZWVlKisr83l4MykpSaGhoUGKEMBwcTqdKi8vV2lpqdra2iQde7A7Ozvb7/zs7Owek5wADA7t5AAAAABIkkJDQ/X0009rx44duu2225SXlyer1aqQkBBZrVbNmTNH119/vd566y3t2bNnWGK6+OKLvXrHn3POOUpMTOxzu+E4l3POOUeFhYW67777NGfOHMXExMhisWjSpEm68sor9fHHH+upp57qsSx9V9/97nf18ccf69JLL1VaWprMZrPS09N19dVXa9u2bbrssst63f6GG25QcXGxHnzwQZ122mlKSEiQyWRSZGSkpk6dqm9/+9v63e9+p6NHjyo3N3dQ55uWlqZt27bppz/9qWbNmqXw8HDFxsbq1FNP1dNPP60PPvhAZrN5UPsGAAAAACDYLBaLsrKydMopp2j69OmyWq2edd3bRnVVUVGhpqam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ZtlsNjmdTs+9J396a3XWl97229LSIrvd7jepqidGo1FGo1HZ2dkqKSnxe03t3bt30DG3tLT0GO+JJBa1t7f3uN/w8HBNnDhR0rHvV1NT06CPg8Hh5xQCIVjXVSB+hpDEFAB33323Xn/9de3fv1/33HOPCgsLddlllyk8PFxr167Vz372MzmdToWHh+vXv/71kBwzPz9fX3zxhSTp3HPPVVJSUr+2++KLL/Td735XX/3qV/Vv//ZvysvLU3x8vJxOp/bu3atVq1ZpzZo1ko5V33juuecUGRk5JDEDAEaPzj/CnE6nnE6noqKighwRgEA6fPiwzj77bO3fv98z1tLSog8++EBr1qzRa6+9pksuuURffvmlli1bpqNHj3rmtba26r333tM///lPffDBBz3eWK+trdW3vvUtbdiwwWu8urpa69at07p16/TUU0/pgw8+UGZmpt997NmzR1//+tdVXl7uGWtvb9e//vUv/etf/9K1116rM88880S+FUPCXyKSdOyp68LCQhUWFurll1/Wf/7nf+qRRx4ZkmPW1dXp4osv1v/8z/94jdtsNn3xxRf64osv9PTTT+uvf/1rjy2wP/74Y5133nleN73Kysq0evVqrV69moQjjEjJMWE6UNPqWa5oJIkJAACMXF2TizIyMnqd2/mBs3Tsb7aB6LptX1555RVPRZXh9Morrwz7MTH2cV2NTikpKbJYLDKZTAoNDZXJZPK87qtTwJdffqn333/f77pZs2YN+L62y+WSy+XyVEXyd03NnDlz0C0+CwsL9fe//93vusmTJysxMVHSsU4JTqdTDoej1/92ff2vf/1rUDFhePFzCoEwnNdVQ0PDkO+TJKYAiI6O1vvvv69ly5apoKBAzz33nJ577jmvOTExMVq1apXmzJkzJMfsrMIkSVdfffWAtu3o6NBHH32kjz76qMc58fHxeuGFF3T++ecPOkYAwOjV/UkSi8USpEgADIdLLrlER44c0b333qtzzz1XERER+uSTT/STn/xEjY2Nuv7667VgwQKdd955amtr08MPP6wlS5YoNDRU//jHP/Twww/LZrNp+fLlKigo8Kmm1NHRofPOO08bN26UdKw66a233qrs7GyVlpbqD3/4g/7yl79oz549+trXvqbt27f73GRqbGzUsmXLPAlMl156qZYvX66kpCTt379fv/zlL/Xiiy9q165dw/NN64XT6VRkZKS++c1v6qyzztK0adMUExOjyspK7d69W08++aQOHjyon//855o6daquvfZaz7YLFy7Uzp079de//lU//vGPJUn//Oc/lZaW5nWMrtWZbDabzj77bG3dulUhISG64oortGzZMmVnZ8vhcOh///d/9ctf/lKVlZVatmyZtm3b5pModujQIU8Ck9Fo1I033qiLL75YVqtVX375pX7+85/rgQce0IIFCwL4nQMGLtUa5rVMJSYAADCSdX1yva8P1rs+XEzVBgBjWdeH1bozGAw+iU1d/9tbRZATac/mdDp7XNff9nedXC6XJ9motwpOhw4d0uHDh3tsRQcAYxVJTAGSm5urbdu2aeXKlXrzzTdVWFgou92uiRMnatmyZfr+97/f4xPlA+VyubRq1SpJUmxsrL71rW/1e9tly5bphRde0MaNG7Vt2zZVVFSopqZGbrdbEyZM0OzZs3Xuuedq+fLliomJGZJ4AQCjT/c/pvpq7wQMF5fLrbrW/peAHgviIswyGgPbp3779u1av369TjnlFM/YggULNGXKFJ133nlqamrSKaecIrfbrU2bNmny5MmeeYsWLVJCQoJuueUWHTp0SO+//75PO+Lf/e53ngSmq6++Wi+99JKnRPb8+fN1/vnn60c/+pF+9rOfqaioSA899JAeffRRr3089NBDnqeP7733Xj300EOep/Hmz5+viy++WOedd56nqmgwzZkzR0eOHFFsbKzPum984xu69dZbdd555+nDDz/Ugw8+qKuvvtpzLpGRkZo1a5a2bNni2Wbq1KnKysrq8Xj//d//ra1btyo2NlYfffSR5s+f77X+9NNP15VXXqnFixerrKxM9913n+fviU533XWXpwLTn/70J11++eWedQsWLNAll1yiM844wysuYCRI7pbEVEYlJgAAMIK1tx9/r9LXvZauD5S1tbUN6Dh9VW4qKyvTokWLJElXXXWV0tPTB7T/wWpubvZUCrjqqquo/I0hwXWFnrS2tsrhcHiqGvn76lzXXWeikr9r6siRI2psbPQkVnV+hYSE+IyZTCYZjcYTahWH0Y+fUwiEYF1XR48eHbLuAp1IYgqgyMhI3XPPPbrnnnsGtX1/s2qNRuOAy8d2SkpK0nXXXafrrrtuUNsDAMaH7n3CqcSEkaKu1a75P+25muRY9MWPz1Z8VGD/H7zjjju8Epg6ffOb31RmZqYOHjyoqqoqPfPMM14JTJ2uvfZa3XXXXWpvb9fHH3/sk8S0cuVKSVJiYqKeeuopvzduHnzwQb3zzjvau3evfv/73+u///u/PT977Ha7XnjhBUnSjBkzdOutt/psHxoaqhdeeEE5OTkDfiJuqCUkJPS63mw26/HHH9ecOXN08OBBbd++3SfxqL+am5s939+HHnqox/1kZmbqv/7rv/S9731Pb775plfb6PLycr377ruSpPPOO88rgalTdHS0nnvuOb/XCRBMKTHeSUwVVGICAGBMG4oPgV988UUtX778xIMZhLCw4+9dut976a7rA2bh4eEDOk5freq6io6ODsoDzVFRUTxIjSHHdYWu+nstuN1uT6Ukh8OhhoYG7dixQ5L/a2rGjBlDHivGD35OIRCG87rqfBB2KBmHfI8AAGBMcbvdtJMDxpnLLrusx3Unn3yypGMfFnznO9/xOyc8PFxTpkyRJBUXF3utKy0t1Z49eyQdawEXHR3tdx8mk8nTVq2urk5bt271rPviiy9UV1cn6Vjru54+uMjIyNA555zT47kEi81m06FDh5Sfn69du3Zp165dXg8wdN4YG4z169d7+pBffPHFvc4988wzJR17mvCLL77wjK9du1YdHR2S5NXarrtFixZp5syZg44VCASfdnJUYgIAACNY17+H+moR19LS4nlNxQYACJzOlnURERGyWq2KjY0dcAU8AMDgUYkJAAD0yt+TgCQxAWPb1KlTe1zX2RItISFBcXFxfc5ramryGt+1a5fndV9VfLqu37VrlxYvXixJ2rlzp2d8zpw5ve5j0aJFev/993udMxxaWlr05JNP6s9//rN2797tSRLyp7q6etDH6dreLTU1td/blZeXe153/f4uXLiw1+0WLVqk3bt3DyBCILCSu1diamyXy+UOeBtOAAAQHJ0PSJyIgbxvHmpdKyQdOXKk17lduzFMnDgxYDEBAAAAwUQSEwAA6FX3KkydT6IAGLsiIiJ6XGc0Gvuc03Ve92Sd2tpaz+ukpKRe95GSkuJ3u66v4+Pje91HcnJyr+uHw4EDB3TWWWeppKSkX/NP5Om+ysrKQW3X2trqeT2Qf6OR8P0FukrpVonJ0eFWbatdCQFuwwkAAIJj2rRpwQ7hhEydOlUhISHq6OjQ3r17e53bdf306dMDHRoAAAAQFCQx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M2fm2T8jI0NPP/200tPTC4ylc+fOkm6NCrV169Y828+fP6+//vWvRTgr63KO/pidlPVnn332mX744YcC66lXr55l+ejRo/mW8/Hx0fPPPy9J2rZtm8aPH1/gVHkXLlzQnDlz8hzr4YcfliStWLFC3333XZ79kpOT9cwzzxQYc1E888wzliSrMWPGWE30mj9/vlavXl3qYwEAAAAAAAAAyjeSmAAAAACUqbFjx6pDhw6SpHnz5qlr165aunSp9uzZo1WrVumRRx7RlClTJEmNGzfWxIkT89TxxhtvKCAgQJL09ttva9iwYVq7dq327NmjRYsW6d5779WaNWsUEhJSYCxjxoyRk5OTzGaz+vbtqw8++EDR0dHatm2bpk+frrZt2+ratWsFTkVbkLZt21qmwps1a5aGDBmilStXavfu3frhhx80aNAgPffcc7rvvvsKrSd7NKaJEydq/fr1Onz4sGJjYxUbG6vU1FRL2TfffNMyxd6HH36ou+66S59++qm2bt2qffv2KTIyUp988on69++vBg0aWB0F6r333pOX162pp4YOHapx48YpMjJSu3fv1rx589SuXTvt3bu30N9vYe68805LUlt0dLRCQkIUERGh3bt3a+PGjXr22Wf1xBNPlPo4AAAAAAAAAIDyj1F/AQAAAJQpR0dHrVy5Uv369dPWrVu1ceNGbdy4MU+55s2ba82aNVanm6tevbpWrVql7t276+LFi1q0aJEWLVqUq8zIkSPVuXNny6hN1rRs2VLTpk3T3/72NyUkJGj8+PG5tvv6+mr58uWaOHGijhw5UuxzNZlM+vrrr/XAAw8oISFB3333XZ6RjVq3bq3FixfL398/33q8vLz0wgsvaNq0adqzZ4969OiRa3tkZKTCwsIk3Rqpav369Ro5cqSWLVum3377zTI6kzXe3t551gUFBWnFihXq16+fkpKSNHPmzDwjXr3xxhsymUwFTsVXFP/5z3909uxZLVu2TL///nue16thw4b69ttv1bhx41IdBwAAAAAAAABQvjESEwAAAIAy5+vrq19++UVfffWVHnzwQdWpU0fOzs6qWbOmwsLC9Mknn2jfvn0KDAzMt46WLVsqMjJSzz33nIKDg+Xq6qpatWqpS5cuWrBggebNm1ekWMaPH6+1a9eqZ8+eqlGjhlxdXdWwYUONGzdOe/fuVadOnUp1rm3a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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ - "dp = FluxPulse(0, 40, 0.9, SNZ(t_half_flux_pulse=17, b_amplitude=0.8), 0, 200)\n", + "dp = FluxPulse(0, 40, 0.9, SNZ(17, b_amplitude=0.8), 0, 200)\n", "dp.plot()" ] }, @@ -677,9 +706,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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mqrJkyfrzjvvVFlZWbNx5+Xl6brrrtPgwYPlcrmUnZ2ts846Sx9++GGbvg6dlS3WAQAAAAAAAAAAAAAAAKCx3bt366STTtKmTZtCbdXV1Xr33Xe1YMECvfjiizrvvPO0evVqnX766crPzw/1q6mp0Ztvvqn3339f7777rmbMmNFo/NLSUp111llavHhxWHtJSYk++eQTffLJJ/rXv/6ld999VwMHDowY44YNG3TSSSdpz549oTa3262PPvpIH330kS6//HIdd9xxB/ulOGiffPJJxK+B1+vVli1btGXLFj3zzDP6zW9+o7vvvrtd9llWVqZZs2bp448/Dmv3eDxasWKFVqxYoYceekhvvPGGjjzyyIhjfPbZZ5o5c6YqKipCbXv37tVbb72lt956S7fffnu7xNoZkMQEAAAAAAAAAAAAAADQCZ133nnKy8vTbbfdptNOO03x8fH6/PPP9Yc//EEVFRW68sorNXnyZM2cOVO1tbW66667dPzxx8tut+u9997TXXfdJY/Hozlz5mjz5s1yOByhsQOBgGbOnKklS5ZIko4//nhdf/31ys3N1Z49e/Tkk0/q9ddf14YNG3TiiSdq5cqVSkxMDIuvoqJCp556aiiB6YILLtBll12mzMxMbdq0SQ888ICeeuoprV279tB90aLw+/1KSEjQGWecoRNOOEEjR45UcnKyioqKtG7dOj344IPauXOn7rnnHg0fPjys6tKUKVO0Zs0avfHGG/q///s/SdL777+v7OzssH3k5uaGlj0ej0466SR9/fXXslqtuvjii3X66acrNzdXPp9Pn376qR544AEVFRXp9NNP1zfffNMoUWzXrl2hBCaLxaJrrrlGs2bNUkpKilavXq177rlHf/zjH3XYYYd14Ffu0CGJCQAAAAAAAAAAAAAAHBQzGFSgvDzWYRwy1tRUGRZLh+9n5cqVWrRokY444ohQ2+TJkzVs2DDNnDlTlZWVOuKII2SappYuXaohQ4aE+k2dOlUZGRm67rrrtGvXLs2fP18//OEPQ+v/85//hBKYLr30Us2dOzc0hd2kSZN05pln6ne/+53+8pe/aOvWrfrTn/6ke++9Nyy+P/3pT9q9e7ck6S9/+Ytuu+220LpJkyZp1qxZmjlzphYsWND+X5xWmjBhgvLy8pSamtpo3amnnqrrr79eM2fO1AcffKA777xTl156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xVq0aJFmzZql5ORkrV69Wvfcc482bdqkww47rFtMKUcSEwA0odrj1xtLduj5r3ZpY0Flk30dNovOGNdXFx8xQJMHpnFis5UsFkNZyS5lJbs0eVDjqeJqvQHtLqvRzn012rmvWiOyIl8A2F1a06b9e/xBbS2uViBoRu3zo4e/ULzDqj7JLvVNjVN2St1z3xSX+qa4lOSyt2nfAAAAADon0zRVWFioPXv2qLKy6c+EkkLVhZqabg1Ns1gsoSn2WioQCMhms4VNDdAa0ZKjPB6Pvv3229BrwzDkdDpDCU2RHjabjfMBAAAAALoMq9Wqt99+W2eddZYWL16sjz/+WB9//HGjfqNGjdK7774bcbq5lJQUvffeezrppJNUUFCgF198US+++GJYnzlz5uj444/X5ZdfHjWWMWPG6K9//at++ctfqqysTDfddFPY+vT0dL3++uv6/e9/36YkJsMw9Oyzz+qEE05QWVmZXnrpJb300kthfcaNG6eXX345apVlqe4mpZ///Of661//qq+//lqnnHJK2PqFCxdq+vTpkuoqVX3wwQeaM2eOXn31Va1atUrXX3991LEj3ewzaNAgvfnmmzrrrLNUWVmphx56SA899FBYn//7v/9TTU0NSUwA0N0VVHj0+zfWNdlncEaCLj5igH50eH+lJTgOUWQ9T5zDquFZSRoeJXmpXrzTpp8cP1i79tUlPO0qrVGVp+UnsqNNh+f2BbRiZ1mT2yY5beqb6lKflAMJTikHEpxSXRqTnaJ0jg8AAACgy6iurta3337bbPKSYRjq1auXsrKylJ6e3q2niuusMjMzlZmZKZ/PF6re1HCKuuamqYs2ldz3KzyZphmqChWNxWIJJTQNGzaMhDYAAAAAnV56ero+/fRTPf/883rhhRf0zTffqLS0VMnJyRo3bpxmzZqlq6++Wg5H9OtcY8aM0bp163Tvvffqtdde065du5SUlKRx48bp6quv1kUXXaS5c+c2G8tNN92k0aNH6+9//7uWLl2qmpoaZWdn6/TTT9ctt9yiAQMGHNR7nTBhglauXKm7775b7777rvbs2aOkpCQNHTpU559/vq677rqoN7o0dM8992jYsGF65plntG7dOu3fv1+BQCBi36SkJP3vf//T559/rqefflqfffaZ9uzZo9raWiUnJ2vIkCGaOnWqzjjjjEYJUfWmT5+udevW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5557rtavX6+f//zn+uCDD7RixQq98MILGjVqlCTprbfe0mOPPRa2TVJSks466yxJ0quvviq32x11/HfffVelpaWSpEsuuaTD3kc0K1eu1JlnnqmKigrZ7XbddNNNWrhwoZYuXapHHnlEubm5kqR///vfuu2225od66c//akyMzP1//7f/9NXX32lRYsW6dZbb5XT6ZTH49Ell1wSNc777rtPv/71r+Xz+TR+/Hg9/PDD+vDDD7V8+XI9//zzOuqoo2Sapv70pz/pwQcfbPV77QlssQ4AACKxWy36xwUT5LBadOSQXjr38P6xDglAD/LLU4Zr0aZibSyoDLU9+tk2zRiZqSMH94phZAAAAN2b3+/Xhg0bZJpmWPvIkSPldDpjFBUAoKcqKirS0qVLtXTpUi1btkzLli3Tvn37JEmXXXaZ5s6d2+77fPHFF/XUU09p9erVKi8vV1ZWlqZNm6brrrtORx11VLvvDwCA9hQ0gyr3lMc6jEMm1Zkqi9ExdWMef/xxzZ8/X3a7XW+++aZOO+20sPVHHnmkZs+erWnTpmndunW68cYbo06ZtmzZMi1YsEDTp08PtR1++OE69dRTNXr0aBUWFuqhhx7ST37yk7DtLrnkEv33v/9VRUWF3n77bc2aNSvi+PWVmpKTkzVz5swOex/RXHPNNfJ6vbJarXr77bd1yimnhNZNmTJF5513no499litX79e999/vy699FKNGTMm4lirVq3SwIED9eWXX6pPnz6h9uOOO06nnnqqTjnlFPl8Pl177bVaunRp2Lbr16/X7373O0nSH/7wB/3hD38ITecnSZMmTdKFF16oyy67TM8995x+97vfafbs2Y0qV/V0JDEB6LRsVov+dv5hYb/cAeBQcNqs+vsFE3T2vxbLG6grLWqa0q9eWqV3b5ymZJc9xhECAAB0T/n5+aqtrQ1ry8nJ4YQeACAmsrKyDtm+amtrNWvWLL3zzjth7bt27dLzzz+vF198Ubfffrv+8Ic/HLKYAABorXJPuY7/7/GxDuOQWXTBIqW70tt9XNM0de+990qSfv7znzdK/KmXlpam++67T6effroWL16szZs3a9iwYY363XDDDWEJTPXS09N1+eWX65577tGaNWu0f/9+paSkhNafdtpp6tWrl/bt26fnn38+YhJTVVWV3nzzTUnSj370o7AKyu39PiKpTzaXpKuvvjosganh+I8++qiOPfZYBYNBPfTQQ/r3v/8ddcy//e1vYQlM9WbMmKGrr75aDz/8sJYtW6bly5dr8uTJYdv5fD5Nnjy5UQJTPYvFov/3//6fXn75ZVVVVemVV17R1Vdf3aL32lMwnRyATo0EJgCxMqpvsm4+dXhYW355re58c32MIgIAAOj+BgwYoIEDB4ZeJyUladCgQbELCACAAwYMGBDxolh7ueKKK0IJTDNmzNDrr7+upUuX6oknntCQIUMUDAZ1xx136NFHH+2wGAAAQOewfv16bd26VZKiVj+qd9xxx4WWlyxZErHP96d4a2jSpEmS6hKOvj+1u91u13nnnSepbsq48vLyRtu/9tproZuRvr+f9n4fkXz44Yeh5SuvvDJqv2OOOSY0fV7Dbb4vLS1NZ599dtT1V1xxRcR9S3XT8kl1yVxNXeNOTU3VuHHjJLXuvfYUJDEBiLndpTUKBM3mOwLAIXblsYN1RG74XRT/+zpP767ZG6OIAAAAujfDMDRo0CAddthhSkhI0KhRo2SxcPoKABAbt99+u9566y0VFBRo586deuSRRzpkPx9//LHmzZsnSTrzzDP1wQcf6Oyzz9aUKVN0xRVX6Msvv9SAAQMkSbfeeqvKyso6JA4AANA5LF++PLR81FFHyTCMqI/ExMRQ34KCgojjjRw5Muq+0tO/uwZSWVnZaH19YpLH49Err7zSaH39VHLZ2dmaMWNGh76PSNauXStJcjgcmjBhQpN9jzjiCEnS5s2b5fV6I/aZOHGibLboE5pNmDBBDodDkrRmzZpQ+86dO1VcXCxJuu2225p8r4ZhhL42rXmvPQVngQDE1P4an877zxJd/NiXyi+vbX4DADiErBZDfzv/MCU5w/9hve21Ndpf44tRVAAAAN1famqqJk2apLi4uFiHAgDowe68807NnDmzw6eVu//++yVJNptNDz30kKxWa9j6jIyM0FQs5eXlevzxxzs0HgAAEFtFRUVt2q6mpiZie3x8fNRtGt44FAgEGq0/5phjQhWTn3/++bB1RUVFoWpEF154YaObkNr7fURSWloqqS4Zq6nkI0mhKeJM04yaFJ6ZmdnkGDabLZT4Vb9v6dC8156i6e8iAHQg0zT129fXqKDCrYIKt077x6f68zljdfaEfrEODQBC+qfF686zx+iXL60KtZXX+PTyit26atrgGEYGAADQvTG9OACgJ6isrNRHH30kSTrppJPUv3//iP3OPfdcJScnq6KiQq+99pp+/etfH8owAQBokVRnqhZdsCjWYRwyqc7UDhm3YTLRW2+91eJp1ptLwGkLwzB08cUX6+6779ann36q/Px89etXdy33pZdekt/vlxR5yrpD+T7a6xxCW8dp+F5vv/320DR8zUlISGjT/rozkpgAxMxr3+Rr/urvpmSqdPv10vLdOuuwbE5WA+hUfjixn95Zs1cfbvguk/6Fpbt05bG5/L4CAAAAAABttmzZstB0Jscff3zUfg6HQ0ceeaQWLFigZcuWyefzyW63H6owAQBoEYthUborvfmOaFKvXr1Cy6mpqRo7dmwMo6lLULr77rsVDAb14osv6uabb5b03VRyI0eO1OGHH95ou0PxPuqrIu3bt09+v7/Jakz1U7cZhqG0tLSIfQoLC5vcn9/vD6v+VK/he7Xb7TH/nnVlTCcHICZ2l9bo9jfWhbWlxNl1/3mHkRAAoNMxDKNR1aVtxdVaur00yhYAAABojsfj0TfffKPKyspYhwIAQMysX78+tDxy5Mgm+9av9/v92rx5c4fGBQA9RU1NjSoqKlReXq59+/apuLhYhYWF2rNnj/Ly8lRQUKCcnBzl5OSooKBAeXl52rNnjwoLC1VeXh513GAwKNM0D90bQbcyceLE0PLixYtjGEmdMWPG6LDDDpP0XeLS9u3btWTJEkmRqzBJh+Z91CcLeb1erVy5ssm+S5culSQNGzZMDocjYp+VK1eGqktFsmrVqlACesNEpcGDByslJUVS5/iedWVUYgJwyAWCpn750kpVecL/ANx97jj1TYmLUVQA0LQjctM1uHeCthVXh9qW7SjVEYN7NbEVAAAAIjFNUxs3blRFRYW++eYbDR48WP369eOmFgBAj5OXlxdajjaVXL2cnJzQ8u7duzV69OhW7yOSvXsbVMuvrFRFRUWLxj1YVVVVEZeBg8Fx1TMEg0F5vV55vV75fL7QcyAQUDAYDCUQ1S/36tVLWVlZEcfauHGjamtrm9xf/dRZDX9fSlJycrKGDBkScZudO3eqtLRUhmHIYrE0eny/3eFwyG63y+FwyOFwyOVyteEr03H8fn/o69pw2iy0XsOvX7Sv5WGHHab+/fsrLy9Pjz76qK6//vpWHxPBYLDZ/USKJ1rfiy66SKtWrdI333yjtWvX6rXXXgutu+CCCyJu1x7vI9J7abivGTNmhJafeOKJsMSphpYsWRJKHj/xxBOjvs/S0lK98cYbOueccyKuf+KJJ8L23XCcH/zgB5o3b54WLFigtWvXatSoUc2/uXbSkuOqOfW/N/1+f4v/H+yIG9NIYgJwyP1n0VYt21EW1vajw/vr9HF9YxQRADTPMAxdPHWAHvpkq2ZN6q8Lp+RocO/EWIcFAADQJe3evTt017Jpmtq6dauCwaAGDBgQ28AAADjEGl74SUxs+jxDQkJCaLk1yRkNk5+a8+yzz4aqCBxKzz777CHfJ7o/jqvuZdiwYXI6nXI6na2eTnPFihXauXNnxHVjxoxRUlJSm2Lavn27FixYEHHdsGHD1KtXr1DST2uSCtxud9SKMk6nUzabLZS4dahMmDBBKSkpSkxMVFFR0SHbb3e3b9++qOuuu+463Xbbbdq2bZsuuugiPfjgg3I6nRH7VlZW6uWXX9YVV1wRaquu/u6G7Ka+Zw0ripWXl0fte9JJJ8kwDJmmqccff1zvvfeeJGnSpElNHhcH+z4khSXU7Nu3T/Hx8aHXgwYN0mGHHaZVq1bp8ccf14wZMzRt2rRG219zzTWSJIvFovPOO69RvA1/Rm+66SYNGzZMvXv3DuuzZMkSPfbYY5Kk8ePHa+DAgWHjXH311Xr55ZcVCAT0ox/9SC+88IKys7MjvtdAIKA33nhDRx55ZNQ+bdXUcdUUr9erqqoq7d+/X2+++WaLttm/f3+b9tUUkpg62M6dO/Xggw9q/vz52r17t5xOp4YMGaLzzz9f1113XdgPWGvs2LFDubm5rdpm4MCB2rFjR6P26dOna9GiRS0ag7KHOFir88r19w82hbXlpMfpjrNadtcQAMTSJUcM1OyjBspps8Y6FAAAgC6roqJC27dvD2tzOp3q25cbWwAAPY/b7Q4tR5vWpF7DC37NVQ0BgM7KMAw5HI5QQlL9ssPhUHFxcdSL74mJiVETH5pjsViirmtY4aW1mkpMamqfzfF4PFHXZWVlhRIegsGgPB6PvF6vPB5PxGWu7XZdl156qT799FO9++67euutt7RmzRr9+Mc/1sSJE5WUlKSqqipt2bJFX3zxhRYsWCCn09ko+ac9ZWdn66ijjtIXX3yhuXPnhpJXzj333Ji/j/vuu08zZ86U1+vV7Nmzdfnll+uUU05RfHy81q5dq3/961+hRMaf/vSnTU7hO3r0aG3evFmnnXaarr/+ek2cOFEej0cff/yxHnvsMfn9ftlsNv3lL39ptO2oUaN0++236w9/+IM2bdqkE044QZdccomOPfZYZWRkyOPxaPfu3VqxYoXmz5+vwsJCffzxx+2exNTVkcTUgd566y39+Mc/DssMrKmp0fLly7V8+XI9/vjjmj9/voYOHXpI4hkxYsQh2Q8QTY3XrxvnrZQ/+N0/TBZD+vv5E5Tkal3WPADEQpyD5CUAAICD4ff7tWHDhkbtI0eObPXd1AAAdAcNp1Txer1N9m14UTsuLq7F+9i9e3eT6/fu3aupU6dKkmbPnh2aNqmjVVVVhSrlzJ49u9lKVEBLcFx1HqZpyuPxqKamRjU1NaqtrZXb7Zbf74+6zYgRI6JezN+0aVNYZZnWGDlypE477bSI67Zu3arKysqIU75ZLBYFg8FQ8sPAgQNDbcFgUOPHj9epp54acdzNmze3eUrD3NxcTZ8+PeK67du3hyrnWCwWxcXFNfk3wWazyeVyKS4uTvHx8UpPT29TTPn5+QoGg7Lb7crMzGzTGKgTCARCyXq9evWS1Rr9usOrr76qm266SY888oh27NihP//5z1H7ZmVlhX1vGlZwbOp7lpqaGrbcVN/LLrtMX3zxRSiByWaz6YorrmhUsag934dUN3VjvV69ejVaf8IJJ+j111/XhRdeqIqKCj3yyCN65JFHGo197bXX6h//+EfEJMP678PkyZP1i1/8Qtddd51+97vfNerncDj01FNPRf2d8rvf/U5ZWVn65S9/qYqKCj388MN6+OGHI/Z1OBzKzs5ul5+p1hxX0VRWViopKUkpKSk66qijWrRNfn6+7r777lbvqykkMXWQb775RhdccIFqa2uVmJio2267TTNmzFBtba3mzZunxx57TJs2bdIZZ5yh5cuXt7pMYb9+/bRmzZpm+91999164YUXJNX9UmnK5MmT9dRTT7UqDqA1/vLOBm0rCf8H8/oZQzV5UNv+YQIAAAAAdB2maWrTpk1hFSekugsBDU+aAgDQkzS8NtDcxe6GF+9bk5jRv3//VsXT8ELhoZKYmBiT/aJ747g69EzT1LZt21RZWamqqqpWTaFWv32071lCQkKjJKb6BJ36qk42m00Wi0VWqzX0bLVa5XQ6o16LnTBhggzDiBpTRUWFPvroI0nSySef3OJjauzYsaFp5AKBQCjxqX654bPf7w9VT3K73U0eu639mvr9flVVVamqqkrx8fEaNGhQq7avV1hYKL/fL8Mw2pQcgcjqj9Gm1j/88MO69tpr9dhjj+mTTz7Rrl27VFVVpcTEROXm5mrSpEn6wQ9+oJkzZ4aN1TBRp7l9tDSe888/Xz//+c9DidWnnHKK+vTp06L32db3Eem9RIrxBz/4gbZs2aJ//OMfeuedd7Rt2zZ5PB5lZWVp2rRp+ulPf6pjjz222VgNw9A111yj8ePH6+9//7s+//xzlZSUqHfv3jrxxBN16623avTopmcY+slPfqJzzjlHjzzyiBYsWKBvv/1W5eXlcjqd6tevn8aNG6eTTz5ZP/rRj5SRkdFsTK3V3PcxGsMwZLFYZLPZWvy7rmFBn/ZCElMH+cUvfqHa2lrZbDYtWLAgLFPthBNO0LBhw3TLLbdo06ZN+tvf/qY77rijVePb7XaNHTu2yT6BQECffPKJpLoPHj/84Q+b7J+QkNDsmEBbfbShUM99uSus7bCcVN1w4rAYRQQAAAAAOJQKCgpUXFwc1paSkqKBAwfGKCIAAGKvYYJRXl6eJk+eHLVvw4pKOTk5HRoXAERjmqYCgYBstsaXmQ3DUGlpqWpqato0dnPTqKWkpDRKWjpYTSUwHYy2Tn0nqdkp4AzDaNM0cU0lwNZXeEpKSlJiYqKSkpIUHx/fYV8ftM64ceP04IMPtmqbO+64o0U5CNOnT2/x8ZSamtroxqTWaMv7kKQ5c+Zozpw5zfbr3bu37rrrLt11111tiC7ckUceqf/+979t3j4rK0u33367br/99oOOpachiakDLF26VJ999pkk6corr4xYautXv/qVnnrqKW3YsEH//Oc/9bvf/a7dy6Z/+OGH2rNnjyRp1qxZrSovC7Sn4kqPbnlldVhbnN2qf1wwQXZr2+cEBoDOIhg05QsG5bRxBwoAAEAk1dXV2rJlS1ibzWbTyJEjOSkOAOjRGt7Jv3Hjxib71q+32WwaNoybQwF0PNM0VVNTE6qsVP/ct29fDR06NOI2iYmJLUpislqtoYSk+uf4+Pio/ds6DVpX1NRnpMMPP1ymacrr9crtdoeqNzV89ng8EaftayqJqby8XBUVFWFVVSwWixITE5WYmCiPx8NnNwCHBElMHeD1118PLV9++eUR+1gsFl166aW67bbbVF5eroULF+qUU05p1zieeeaZ0HJzU8kBHcU0Tf3mf6u1rzp8Pvfbzxyt3IyEKFsBQNdQVOHWS8t368WluzXn6EG6+rjBsQ4JAACg0wkGg9qwYYOCwWBY+4gRI+RyuWIUFQAAncOUKVPkcDjk9Xq1aNEi/eY3v4nYz+v16ssvvwxt0943RQOAaZqqra1VRUVFKFmpqqqq0f/xklRZWRl1nKSkJBUVFYVeOxyOUGWfxMREuVwuuVyudqmi1FMZhhGqRhVN/RR1tbW1oe9lSkpKxL6maUac0jQYDIYSm1wulxwOhywWi6qrq8Om7LNYLCQ4AWg3/HXoAJ9//rmkuunZJk2aFLXf8ccfH1pevHhxuyYxVVZWhpKpBg0apOOOO67dxgZao8rjV6UnPNv75NFZunAK5Y4BdG1Pfr5df3lng/zBujKrLy7dpaum5fJhDQAA4Hu2bt2q6urqsLbs7GxlZGTEKCIAADqPpKQknXjiiXr33Xf14YcfKi8vL2yKuXqvvvpqqDrGD3/4w0MdJoBuyu/3q7y8XKWlpSorK2vxNFFVVVUyTTPiudC0tDQNHDgwlLR0MNOqoe1sNptsNpsSEhKa/exVU1MTMVktmmAwGNbfZrMxIxCAdsM8Th1gw4YNkqShQ4c2mUU8cuTIRtu0l1deeSVUqnH27NktuqC6ceNGHXHEEUpNTZXL5VL//v119tln65lnnpHP52vX+NBzJLnsevHqI3XLaSNksxjKSHTqnnPHcZEfQJc3Jjs5lMAkSdtKqvXlttIYRgQAAND5lJSUhKa6r5eQkKDBg6lgCQDoGebOnSvDMGQYhu64446IfW6++WZJdckE1113nQKBQNj6kpIS3XrrrZKk1NRUXXXVVR0aM4CeYfv27friiy+0bt067d27t8UJTFJdEkttbW3EdQkJCRo0aJB69epFAlMX4XK5NHbs2DZ/36xWawdFBqAnohJTO3O73SopKZGkiHdLNJSWlqaEhARVV1dr9+7d7RpHw6nkLr300hZtU1hYqMLCwtDr/Px85efn680339S9996rV155RaNGjWpTPHl5eU2u37t3b2i5uro6bL5VdA8/PjxTh2fHq8rtlz3oUUWFJ9YhRdWwZGak8pnAocYx2TmN7GVTbq84bd/33Yf1ZxZv1Zje3bucO8cjOhOOR3Q2HJPoTDrD8ej1erVx48awNsMwlJOT06gyE7q/znBMAvX4HYSW+vzzz7Vly5bQ6/pz/5K0ZcsWzZ07N6z/nDlz2rSfE044QRdeeKHmzZunN998UyeffLJuvPFGZWdna82aNbrrrru0a9cuSdK9996rtLS0Nu0HABpyOp0yTbP5jgf6NpwSLikpSQ6Ho4MjxKFitVrVq1cv9erVK9Tm9XpVVVUVmlqwvnhGJNGKepimqZqaGlksFtlsttDUcwDQFJKY2lnDOWATExOb7V+fxNSeJ2927dqlRYsWSZKOPvpoDR06tMn+FotFJ554ok4//XQddthh6tWrlyorK/X111/rkUce0YYNG7R+/XrNmDFDS5cu1YABA1odU05Oy6cOe/XVV6POyYruYUWsA2iFZ599NtYhAGE4JjuXvu5e2q6+odfvry9UVv6nirMEmtiq++B4RGfC8YjOhmMSnUmsjsfBgwcrMzMzrG3r1q1asmRJTOJB58HvSMTa/v37Yx0CuojHH39cTz/9dMR1ixcv1uLFi8Pa2prEJElPPvmkKioq9M4772jhwoVauHBh2HqLxaLf//73uuaaa9q8DwA9g2maqqqqUmlpqfbv369x4yLPjpGenh5xe4fDoeTk5LCkJRKWeh6Hw6H09PTQcbJ582b5fD5ZrVY5HA4Fg0EFAgEZhhE1MSkQCISmnvP7/ZIUSmiy2WyyWCzM3IJOY8eOHbEOAQeQxNTOGpZabMkf9PpyfNFKLrbFc889F8qcbkkVpldffVWpqamN2qdNm6Zrr71WV199tZ5++mkVFhbqxhtv1KuvvtpusQIA0JWNcJTrq9osBQ7M0BuURd96UzXBtS/GkQEAAMTe9u3bVVNTo379+slut2vfvn0qKiqKdVgAAHRKcXFxmj9/vl544QXNnTtXq1atUnl5ubKysjRt2jRdf/31Ouqoo2IdJoBOyuv1qqysTKWlpSorK5PP5wutq6ioiFg8wOVyKT4+XrW1tUpJSVF6enpoFhkSSxBJ/fSo9de3TdNssprX96dHleqmIvR6vfJ6vTIMQ1arlSpNAMKQxNTOXC5XaNnr9Tbb3+Opm1IrLi6u3WKov5vN6XTqggsuaLZ/pASmena7XY8//ri+/PJLffvtt3rttdeUn5+vfv36tSqm5qbL27t3r6ZOnSpJOvfcczV8+PBWjY/Oo9rjl2EYind03flvq6qqQj9Hs2fPblFVNaAjcUx2bkVvbNT8dcWh13viBus/Pzmv237Q53hEZ8LxiM6GYxKdSWc6Hv1+v4qLizVu3DiddNJJMYsDsdWZjklg06ZNuvvuu2MdBrqAuXPnNpoyrrXmzJnTqgpNF198sS6++OKD2ieA7s80TVVUVKi0tFSlpaVNzvhSWloadQaU0aNHy+l0Rp0ODGhKfVJTNPXVl6IxTVN+v79RlSar1Sqr1dptz7EDaBp/kdpZUlJSaLklU8TVz7/eXiduli5dqo0bN0qSzjrrrCYTlFrKZrPpyiuv1C233CJJWrRoUas/RPXv37/FfRMSEpScnNyq8dF53PHflVqxq0z/uGCCJg7o+nOzJyYmcjyiU+GY7HwuO3ZoWBLTztJarS/x66ghvZrYqnvgeERnwvGIzoZjEp1JZzgeo01VgZ6pMxyT6NkSEhJiHQIAAK1mmqbKy8tVWFiokpKSiFVuIiktLVVubm7EdfxNREeKi4sLJSm15Hitr9Ik1SVIURUM6JlIYmpnLpdLvXr10r59+5SXl9dk37KyslASU05OTrvs/5lnngktt2QquZYaPXp0aDk/P7/dxkX3snR7qV79pu74mPWfJfr5CcN03Ywhslkp/wig+5oyKE1DMxO1pei75OUXlu7qEUlMAAAAAAAAADqWaZrasWOHCgsLQzO8tERcXJzS09O5oQAxY7FY5HA45HA4ZJqmAoFAKKEpGAw2uy0JTEDPRGZBB6hP+NmyZUuTZfLqKyZJ0qhRow56vz6fT/PmzZMkZWZm6rTTTjvoMevxRwLNMU1T97y7IfQ6EDT1+OfbVFzV8n+oAaArMgxDF00dENb2/toC7eP3HwAAAAAAAICDZBiG9u/f32wCk8ViUa9evTRs2DBNnTpVU6dO1dChQ0liQqdgGIZsNptcLpcSEhKUkJDQ5FSGdrs96lh+v7/ZJCgAXRdJTB3g2GOPlVQ3VdyKFSui9lu0aFFo+Zhjjjno/c6fP1/79u2TVDdvdnvOX7t+/frQcnZ2druNi+7jg/WF+npXeVjbzaeMUN+UuNgEBACH0I8O7yeH7bt/q7yBoP73ddMVGQEAALobj8ejqqqq5jsCAAAAaMQ0zajr+vTpE7E9ISFBOTk5Gj9+vI455hiNHTtW2dnZiovj2gw6t/oqTXFxcUpMTFRcXJwcDocslrrz7NGuc5umKbfbrerqatXW1srn8zX5swOg6yGJqQOcc845oeWnnnoqYp9gMBia+i01NVUzZsw46P02nErusssuO+jx6vn9fj355JOh18cdd1y7jY3uwR8I6q/vfxvWNiA9vlFlEgDorlLjHTpjXN+wtheX7ubDEwAA6FF27NihFStW6Ntvv23VNBcAAABAT2WapiorK7VlyxZ98803Uc8nZmRkhJI7EhISNHjwYB155JGaPHmyBg8erLS0tNB6oKupr9LkdDqVkJCgxMTEqLMEBQKB0M+J3+8PJTS53e6wdQC6Lv6adYCpU6dq2rRpkqQnnnhCS5YsadTnb3/7mzZsqJt66xe/+EWjkniffPKJDMOQYRiaM2dOs/ssLS3V/PnzJUnjxo3ThAkTWhTrwoULVV5eHnW9z+fTVVddFYr1zDPPVE5OTovGRs/x6tf52lIUfrftr04ZHlaVBAC6u+8nbm4vqdaSbftiFA0AAMChVVVVpYKCAklSQUGBli5dqpKSkhhHBQAAAHROHo9Hu3fv1vLly/X1118rPz9flZWVUa/Z2Ww2DR8+XIcffrgmTZqknJwcOZ3OQxs0cIhES2CS6q5df59pmvL5fKqpqVFNTY08Hg/TzQFdWPvNN4Yw//znP3XMMceotrZWp5xyin77299qxowZqq2t1bx58/Too49KkoYPH65f/epXB72/efPmyev1SmpdFaann35aZ511ls466yxNnz5dI0aMUHJysqqqqrRixQo9+uijoankMjMz9c9//vOgY0X34vYF9MAHm8LaxmQn68zxTDsIoGeZMihNQzMTw5I6X1y6W0cPyYhhVAAAAIfGtm3bGrUlJyfHIBIAAACgcwoEAiopKVFhYaHKysoi9iksLFRaWlrEdVlZWR0ZHtAlNJXgJNXNhuT1euX1emW1WmW322Wz2ZrdDkDnQRJTB5k4caL++9//6sc//rEqKir029/+tlGf4cOHa/78+UpKSjro/dVPJWe1WnXJJZe0atuqqiq98MILeuGFF6L2GTdunObNm6fc3NyDihPdz9Nf7FBBhTus7dbTRspi4Z8BAD2LYRi6aOoA/entuuTfacMydOb4vs1sBQAA0PWVlpY2ugiTk5Mjh8MRo4gAAACAzsE0Te3fv1+FhYUqLi5WIBBosn9JSYkCgYCsVushihDoWlwul5xOp3w+n/x+f5M/U4FAILTeZrOFEpoA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q6vrcj/OmEwm63JX1ZxeffXVLvej0Wisy3q93um8+fPnw9XVFQDwwgsv9Ckh/IILLrC2tnvnnXeczjtw4ABOnDjR6/0TEXXl5vOiMCHEtn3cRwdOY+vREokiIiKi0SonJwebNm2y+dPx/aWpqcluXedKsr3h7e2NZ599FgBQUFCA6dOn4+2330Zqaiq2bNmCiy++GFu3bgUAXHfddU6ToYiIiIiIRgJehSOiIclsNuP48eOoq6tDfn4+CgsLpQ6JiEaR3NxctLW12YxFRkbC3d1dooiIRpY77rgDAFBZWYm7777b4ZwnnngC6entlTduueUWqNVn2gaq1WqsWrUKQHulow0bNthtbzKZcMstt8BgMHQZy9y5cwG0V4VyVLmorKwMd911Vw+elWOxsbHW5Y6krLO98sor+Pe//93lfoKCgqzLubm5Tud5enrizjvvBAD8/PPPuPfee7tslVdeXo433njD7lhXXnklAGDLli345JNP7LZramrCmjVruoyZiKgv1Ao5Xrh2MlxVcpvxh784jpPljRJFRUREo9Hu3buxatUqmz8dVZKqq6vt1mVmZvb5WGvWrMFjjz0GQRCQm5uLG2+8EdOmTcOVV16JHTt2AAAWLlyIt956q1+eGxERERHRUMUkJiIackRRxPHjx1FfX28dy8vLs2vrREQ0EKqqquzuntTpdAgLC5MoIqKR59Zbb8XMmTMBAG+//TYuuugifP755zh06BC++eYbXHPNNXjyyScBAGPGjMGf//xnu3089thjCA0NBQA89dRT+P3vf4/vv/8ehw4dwkcffYRZs2bhu+++w9SpU7uMZfXq1VAoFBBFEYsWLcI///lPpKam4ueff8a6deswefJk1NfX2yQj9cbkyZOtrfBee+01/O53v8PXX3+NgwcP4t///jeWLFmC22+/HbNnz+52Px3VmP785z/jxx9/xMmTJ5GTk4OcnBy0trZa5/7lL3/B9OnTAQD/+te/MGXKFLz88svYs2cPjhw5gh07duCll17Cb3/7W4SHhzusAvX8889bW+0tW7YMd9xxB3bs2IGDBw/i7bffRnJyMg4fPtztz5eIqC+i/dzx5JUTbMYa9SZct/EXZJQ2SBQVERHRwHriiSewe/duLFu2DGFhYVCpVPD398fFF1+MDz74AN98841NhVYiIiIiopFIIXUARERnEwQBfn5+NklMAHDq1CkIgmC9YElENBBqa2ttHsvlcsTHx0MQBIkiIhp55HI5vv76a1xxxRXYs2cP/vvf/+K///2v3bxx48bhu+++c1gFTafT4ZtvvsHFF1+MiooKfPTRR/joo49s5qxcuRJz5861Vm1yZPz48Xjuuefwxz/+EbW1tbj33ntt1nt7e+Orr77Cn//8Z2RnZ/f6uQqCgPfeew8XXnghamtr8cknn9hVNkpMTMSnn36K4OBgp/vRarW4++678dxzz+HQoUNYsGCBzfodO3ZY20qo1Wr8+OOPWLlyJb744gscPXrUWp3JEQ8PD7uxyMhIbNmyBVdccQUaGxuxYcMGu4pXHXeKd9WKj4ior65JDsXunCp8ebjYOlbdbMB1r/+C92+ajgkhOgmjIyKi0WDlypVYuXLlOe0jMjKyVy2eZ82ahVmzZp3TMYmIiIiIhjNWYiKiISkkJARjxoyxG8/NzUVxcbGDLYiI+kdsbCzGjRsHuby9hUlMTAzvdCQaAN7e3vjf//6Hd999F5deeikCAgKgVCrh4+ODefPm4aWXXsKRI0cQERHhdB/jx4/Hjh07cPvttyM2NhZqtRq+vr644IIL8MEHH+Dtt9/uUSz33nsvvv/+e1xyySXw8vKCWq1GVFQU7rjjDhw+fBjnnXfeOT3XpKQkHDlyBLfeeisiIiKgVCrh7e2NlJQUrF+/Hvv377dpF+fMM888g9dffx3nnXcevL29re9Tjmi1Wnz++ef46aefcPPNNyMuLg5arRYKhQLe3t6YNm0a7rjjDnz77bf48ccfHe5j3rx5SEtLw2233YaIiAioVCoEBATgsssuw/fff48nnniizz8TIqKe+OtvJyA5wstmrK7FiOte/wWHC2udbEVERERERERERMMVKzER0ZAVGhoKURRx6tQpm/GcnBwIgtBltQIionPh7+8PDw8PlJeXIyAgQOpwiAbF2rVrsXbt2m7nbdq0CZs2bep23s6dO7udI5PJsGLFCqxYsaL7AJ3w8vLCo48+ihdeeMFhUk9P756+5JJLcMkllzhd39Xz6cnd1eHh4XjllVe6nNPdPgRBwM0334ybb765y3mdzZkzB3PmzOnx/LOFhYXZVWDqrKevm6705s50Ihpd3NQKvHNjCm7cdAD782qs441tJqx4cz/eXjUN0yK9JYyQiIiIiIiIiIj6EysxEdGQFhYWhqioKLvx7OxslJaWShAREY0WGo0GERERbCNHREREJCF3tQKbVk3D7Bgfm/EmvQk3vLUfe3OrJYqMiIiIiIiIiIj6G5OYiGjICw8PR2RkpN34yZMnUVZWNvgBERERERER0aBxVSnw5g3TMHesn814i8GMlW/vx0/ZlRJFRkRERERERERE/YlJTEQ0LERERCAiIsJuPCsrC+Xl5RJEREQjhcVikToEIiIiIuqGRinHxuuTMX+cbatfmSBArbBvJ0pERERERERERMMPk5iIaNiIiIhAeHi43XhmZiYqKiokiIiIhruGhgbs27cPVVVVUodCRERERN1QK+TYsHwKfjMh8NfHMrx5w1SkRHlLHBkREREREREREfUHJjER0bAhCAIiIyMRGhpqty4jI4NJCETUK2azGZmZmTAYDEhLS0NWVhZMJpPUYRERERFRF1QKGV68bjIWJ4di4/VTMSvGV+qQiIiIiIiIiIionyikDoCIqDcEQUB0dDREUURxcbF1XKVSwdXVVcLIiGi4OXXqFFpbW62Py8rK4OrqirCwMAmjIiIiIqLuKOQyrF8ySeowiIiIiIiIiIion7ESExENO4IgYMyYMQgJCQEAqNVqJCUlMYmJiHqspqYGJSUlNmNardb6vkJEREREw1teVbPUIRARERERERERUS8xiYmIhqWORKaIiAgkJSXBxcVF6pCIaJgwGo3IysqyGZPJZIiPj4dMxo9GRERERMPdJwdO46Lnd+LD/YVSh0JERERERERERL3AdnJENGwJgoDIyEipwyCiYUQURZw8eRIGg8FmPDo6mtXciIiIiEaALw8X4cEvjkEUgYe+OA6j2YLrZ0ZKHRYREREREREREfUAyw0Q0YjV1taGiooKiKIodShENERUVFSgqqrKZszLywvBwcESRURERERE/SWjtAH3fXIUnb8CPvbvNLzx0ynpgiIiIiIiIiIioh5jEhMRjUiiKCIrKwsZGRlIT0+3q7pCRKNPW1sbsrOzbcYUCgXi4uIgCIJEURERERFRf4kP1OLOC2Ptxv/6TQZe3pEjQURERERERERERNQbbCdHRCNSSUkJ6urqAABVVVWor69HbGws/Pz8pA2MiAaVKIpoampCVVUVysvLYTabbdaPHTsWarVaouiIiIiIqD8JgoA/XjwWKrmA9dtO2qxb90MWimpb8dDCeHholBJFSERE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ggXFEnAKJCYm6vbbb9fq1auLrD979qyWL1+u5cuX65133tGCBQsUHR3ttI1du3apV69eOnnyfyNkZGZmasmSJVqyZIlGjBihm2++uTx/Co9wlogk5U81um/fPu3bt0+fffaZXnjhBb322mse2ef58+d1zz33aOnSpUXWZ2VladOmTdq0aZPee+89zZ0712nylCStXLlS/fr1U3JysrnuxIkT+vbbb/Xtt996LJEoNzdXgwcP1owZM4qs37Fjh3bs2KEvvvhCixcv9si+AOBS3NQ8Sjc1j9KF9Gx9+0uCvtl8XL8cveC0bo7D0LUNwyu1f1eSHEeeEi5k/Hc0pXQdTUw3l49fyNCGv/aUn634Z+y6YWX/HFjY0cR0p0lMdcPsmjryejWMCFSdMLt8rXy+BwAAAACgIpHEBAClZLfb1aRJE0VHR+vcuXM6ceKEzp8/77RuTk6OTpw4oaZNm1ZyLy8fOTk5+u2338ykpbw853c0u5KRkeF09AgfHx/5+/srKyuryPqCKd2cPfz9/blbFgAKGThwoI4dO6Y///nP+t3vfqfAwECtWrVKY8aMUXJysh566CHFxsaqX79+ysjI0CuvvKJu3brJ19dXP/zwg1555RVlZWVp+PDh2rt3b7GkU4fDoX79+mnt2rWSpG7duunJJ59UkyZNlJCQoE8++URz5szRrl271KNHD23dulXBwUUvLCYnJ6tv375mAtO9996r4cOHq1atWtqzZ4/efPNNTZkyRdu3b6+cP5obubm5CgoK0m233aZbbrlFrVq1UmhoqE6fPq0dO3borbfe0uHDh/X6668rJiZGI0aMMLft2LGjtm3bprlz5+pvf/ubJOnHH39UvXpFR/goPDpTVlaWevbsqc2bN8tqtWrw4MHq27evmjRpopycHP3000968803dfr0afXt21dbtmwplih25MgRM4HJx8dHo0aN0j333KOwsDD9+uuvev311zV27FjFxsaW++/zxz/+0UxgatmypZ577jldffXVSkpK0owZM/Sf//xH9913X7n3AwDlFR7opwc6N9YDnRtr3+kUfbPpuGZtPqbTKf/77HFjs0g1qOF8mvFVe88qx5GnmDohqhdmr7afQbLyfLTzRIrOHUrT4cQ0HU3MT1I6fC5dCRcy5GbWNyVcyFDjqKBi66Mjiq9zJizAV9GRgWoYEagGNQLUsEb+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/Ad55JFHnNZxOBxG69atzX8Sd1/QAmVxKSf+xx57zNxm7dq1TuusXbvWrPP44497sMeoTr799lszjp566imndYhHVKaWLVsaUv60chebMGGCGWfTpk1zuv3Ro0fNEZ369u1b0d3FFeTw4cPmXZPLly83xowZU+IXzZwf4Unl/bKJeIQnORwOc5qMa665ptjF99IgJlFZHA6HOcpscHCwkZaWVqwO8QhPGj16tBkr8+bNc1lvwIABZr1ff/21SBkxCVS+ikhi4nuK6iM7O9tMWGvdurXL6bkeeeQRMybWr19/SfsiienyVlnXI3kvUX1UVkyRxFS9VVQS06233mom4B09etRpnWnTprlNEq4MPgK8YM6cOebyiBEjnNbx8fHR0KFDJUkXLlzQsmXLKqNrQDGGYWju3LmSpFatWumGG25wWu+GG25Qy5YtJUlz586VYRiV1kdcObp3724u79+/v1g58YjKFhISIknKzMwsVlbweh4aGqq77rrL6fYNGjRQz549JUlLlixRSkpKxXQUV5wnnnhCqampGjZsmLp161Zifc6PqEqIR3jawoULtXfvXknS888/L5vNVqbtiUlUpiVLluj48eOSpHvuuUeBgYFFyolHeFp2dra53LRpU5f1mjVr5nQbYhK4cvA9RfWxbNkyJSUlSZKGDRsmHx/nlzuHDx9uLs+ePbsyuoYqpjKuR/JeonrhGjcuVykpKVqyZIkkqWfPnmrQoIHTenfddZdCQ0Mlee+1kyQmeMWqVaskSUFBQerQoYPLeoUvWK1evbrC+wU4c/DgQSUkJEhSiRdRC8qPHz+uQ4cOVXTXcAXKysoyl61Wa7Fy4hGV6bffftPWrVsl5X8ALyw7O1vr16+XJHXu3Fl+fn4u2ymIxaysLG3cuLFiOosrytdff63vvvtOERERmjRpUqm24fyIqoR4hKfNmDFDkmSxWNSvXz9zfWJiovbu3avExES32xOTqEyfffaZuVzwxX1hxCM8reBioCQdOHDAZb2CG4UsFotatGhhricmgSsD31NULwXXmCT35+7Y2FgzoZprTNVTZVyP5L1E9cI1blyuNmzYYN7M4e5c5efnZyZjbtiwQTk5OZXSv8JIYoJX7Nq1S5LUvHlzt3eQFr5gWrANUNl27txpLl98Ef9ixCzKa8WKFeZy69ati5UTj6ho6enp2rt3r9588011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unSprFarHnjgAU2bNk3r1q3TypUr9corrygyMlKnT59W3759i43+VJG2bdumwYMHq3bt2nrnnXe0bt06rV27VmPHjpXdbpfD4dCoUaN05syZYts+9dRTZgLTkCFDNGvWLK1bt04bNmzQvHnz9NJLL+maa66ptGMBAAAAAAAAAKAqYSQmAAAAAKW2d+9etWjRQqtXr1bNmjXN9V26dJHNZtOkSZO0evVq3XbbberUqZMWLVqkwMBAs15cXJwyMzM1Y8YMzZw5U2fOnCnSjiS9/PLL2rx5s8LDw7V48WJ16NChSHmXLl30+9//Xp07d9aJEyf0l7/8RV9++WXFHvh/bd68WR06dNDSpUsVGhpqrr/hhhvUvHlzDRkyRMnJyfriiy80evRoszwzM1Pz5s2TJD377LNOR1rq37+/xo0bp8TExIo/EAAAAAAAAAAAqhhGYgIAAABQJm+99VaxxCNJevzxx83ls2fP6uOPPy6SwFTgsccekyTl5uZq7dq1RcpSU1P17rvvSpLGjx9fLIGpQHR0tF588UVJ0owZM5SWlnZpB3MJPvnkkyIJTAUGDx5sTo+3cuXKImWJiYnKycmRJN18881u24+IiPBQTwEAAAAAAAAAuHyQxAQAAACg1MLDw9WnTx+nZU2aNFFISIgk6eqrr1br1q2d1is8ZdqBAweKlK1YsUJJSUmSpHvuucdtXwqSgXJycrRp06bSHUA5tWvXTldffbXTMovFovbt20sqflyRkZHy8/OTJH3++efKzc2t2I4CAAAAAAAAAHCZIYkJAAAAQKm1aNFCFovFZXl4eLgkKSYmpsQ6kpSSklKkbOPGjeZy3bp1ZbFYXD7atm1r1j158mQZj+TStGrVym15wShKFx+Xv7+/7rvvPknSN998o+bNm+u5557T999/rwsXLlRIXwEAAAAAAAAAuJyQxAQAAACg1JxND1eYj49PifUK6kiSw+EoUnb69OlL6ld6evolbVdWpT3+i49Lkt555x31799fknT48GFNnDhRt912myIjI9WxY0dNnDjRHIUKAAAAAAAAAIDqxubtDgAAAABAgcLJP5s3b5avr2+ptmvQoEFFdcljQkNDNW/ePK1fv15ff/21li9frq1bt8rhcGjjxo3auHGjJk2apDlz5qhz587e7i4AAAAAAAAAAJWKJCYAAAAAVUZkZKS5XLNmzcsiOamsOnXqpE6dOknKn3Zu+fLlio+P16xZs3T69Gndfffd2r9/vwICArzcUwAAAAAAAAAAKg/TyQEAAACoMtq3b28ur1692os9qRwhISHq37+/Zs6cqaefflqSdOLECa1atcrLPQMAAAAAAAAAoHKRxAQAAACgyujZs6cCAwMlSW+99ZYMw/ByjypPjx49zOWzZ896sScAAAAAAAAAAFQ+kpgAAAAAVBnh4eF68sknJUlr1qzR6NGjlZeX57L+qVOn9PHHH1dW9y7ZgQMHtGLFCrd1Fi5caC43adKkorsEAAAAAAAAAECVYvN2BwAAAACgsJdfflkrVqzQzz//rH//+99avny5Hn74YV177bUKCgrS+fPntWPHDi1evFgLFixQu3btNHLkSG93260jR46oe/fuatOmjQYMGKDY2FjVr19fknT06FF99dVX+vrrryVJ1157ra6//npvdhcAAAAAAAAAgEpHEhMAAACAKsXf31+LFi3S8OHDNWvWLP3yyy/m6EzOhIaGVmLvymfnzp3auXOny/JWrVpp1qxZslgsldgrAAAAAAAAAAC8jyQmAAAAAFVOSEiIZs6cqVWrVunTTz/VypUrlZCQoIyMDIWGhqpZs2bq1KmTbrvtNvXu3dvb3S1R165dtXz5cv34449at26djh49qlOnTikzM1MRERG65pprdNddd2n48OHy9/f3dncBAAAAAAAAAKh0FsMwDG93AgAAAAAqW+PGjXX48GENGzZM8fHx3u5OqS1fvlzdu3eXJC1btkxxcXHe7RAAAAAAAAAAAB7ASEwAAAAAqrULFy5o+/btkiQ/Pz/FxMR4uUfFnT59WqdPn5YkHTx40Mu9AQAAAAAAAADA80hiAgAAAFCtzZ07V3PnzpUkRUdH69ChQ97tkBPvvfeexo0b5+1uAAAAAAAAAABQYXy83QEAAAAAAAAAAAAAAAAA1ZvFMAzD250AAAAAAAAAAAAAAAAAUH0xEhMAAAAAAAAAAAAAAAAAryKJCQAAAAAAAAAAAAAAAIBXkcQEAAAAAAAAAAAAAAAAwKtIYgIAAAAAAAAAAAAAAADgVSQxAQAAAAAAAAAAAAAAAPAqkpgAAAAAAAAAAAAAAAAAeBVJTAAAAAAAAAAAAAAAAAC8iiQmAAAAAAAAAAAAAAAAAF5FEhMAAAAAAAAAAAAAAAAAryKJCQAAAAAAAAAAAAAAAIBXkcQEAAAAAAAAAAAAAAAAwKtIYgIAAAAAAAAAAAAAAADgVSQxAQAAAAAAAAAAAAAAAPAqkpgAAAAAAAAAAAAAAAAAeBVJTAAAAAAAAAAAAAAAAAC8iiQmAAAAAAAAAAAAAAAAAF5FEhMAAAAAAAAAAAAAAAAAryKJCQAAAAAAAAAAAAAAAIBXkcQEAAAAAAAAAAAAAAAAwKtIYgIAAAAAAAAAAAAAAADgVf8PpxRSvCqtZtgAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "b = [1, 2, 1]\n", "a = [1, -1.5432913909679857, 0.6297148520559599]\n", @@ -696,7 +736,7 @@ "dp = FluxPulse(0, 80, 0.9, IIR(\n", " b=b, \n", " a=a,\n", - " target=SNZ(t_half_flux_pulse=30, b_amplitude=1)), \n", + " target=SNZ(30, b_amplitude=1)), \n", " 0, 200)\n", "dp.plot()" ] @@ -710,9 +750,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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iy66SFu3bpUkLVq0SLfddpvCwsJUWFiof/7zn3r77beVlZWl8847Tzt27FBwcLBbfFarVRdccIErgenKK6/UihUrFBMTo+zsbD322GNat26d9uzZM3A/tE7YbDaZzWZdeOGFOvfcc5WamqrQ0FAVFxdr7969+v3vf69jx47pN7/5jSZOnOhWdWnevHnavXu33n77bf3kJz+RJH3wwQeKj49328fYsWNdy/X19Tr//PO1fft2mUwmfe9739OyZcs0duxYNTY26tNPP9Vjjz2m4uJiLVu2TBkZGe0SxY4fP+5KYDIajbrpppt0+eWXKywsTLt27dJvfvMbrV69WnPnzu3HnxwwsEJDQ91eOxwOVVVVtZtmbrgY8CSmAwcO6KWXXtLWrVtVWFio2tpaffDBB0pJSXH12bNnj44fPy6z2axFixYNdIgAAAAAAAAAAADwkrZVmAICAtwSDYDBzulwyN5mSsThzmSxyGA09vt+duzYoU8++URnnHGGq23u3LmaMGGCLrroIlVWVuqMM86Q0+nUV199pfHjx7v6zZ8/X1FRUbr99tt1/PhxbdiwQZdeeqlr/R//+EdXAtN1112n9evXy+FwqLi4WNOnT9c111yjhx56SL/+9a916NAh/eIXv9Bvf/tbt/h+8YtfKCcnR5L061//Wvfff79r3Zw5c3T55Zfroosu0ocfftgvP5/emDlzpnJzczusdHfBBRfojjvu0EUXXaSPPvpIP/vZz3TdddfJZDJJksxms6ZOnar09HTXNhMnTtSYMWM63d/Pf/5zbd++XRaLRR9//LHmzJnjtv6ss87S1VdfrQULFqigoEAPPPCAXnnlFbc+9957r+t3xF/+8hd997vfda2bO3euli9frrPPPtstLmCo8/PzU2BgoGpra11tFRUVJDGdLofDofvuu09PPvmkHA6HnE6npKb5PNvOG9qSQenj46MjR44oISFhoMIEAAAAAAAAAACAF7VNYmpbgQAY7Ozl5TrwjYXeDmNATfh8i3wiIvp9P3fffbdbAlOLCy+8UKNHj9axY8dUUlKiZ5991i2BqcWqVat07733qq6uTps3b3ZLYnr66aclSdHR0Xrqqac6nKrpZz/7md58803t27dPzz33nH7+85/L399fUtM0bC+88IIkafr06frRj37UbntfX1+98MILGjdunBobG/v2Q/CQqKioLtf7+fnpkUce0cyZM3Xs2DHt2LGjXeJRT1VVVbl+vr/4xS86HWf06NF68MEHddttt+n111/X2rVrZTabJclVDUuSLrroIrcEphYhISFau3Zth+cIMJSFhYWpvr5eISEhCg0NHdYVKvs/HbbZzTffrMcff1x2u13x8fG6/PLLO+3bUjbObrfrjTfeGKgQAQAAAAAAAAAA4GUkMQHozFVXXdXpuunTp0tqKqJx5ZVXdtgnMDBQEyZMkCQdPnzY1Z6fn6+srCxJ0hVXXNFphRMfHx/XtGplZWXavn27a922bdtUVlYmSVqxYkWHSVCSlJiYqKVLl3Z6HN5SX1+v48ePKzMzU3v27NGePXtchUkkaefOnX0e+5NPPlFFRYUkdZknIEnnnHOOJKmxsVHbtm1ztW/cuNE11Wjrqe3amj9/vqZMmdLnWIHBaNy4cVq4cKFmzpypcePGDdsqTNIAJTH95z//cWWdPvDAAzp69Kj+/ve/d7nN8uXL5XQ69d///ncgQgQAAAAAAAAAAICXNTY2uk2XIpHEBOCUiRMndrquZVq0qKgohYeHd9uvsrLS1bZnzx7XcndVfFqvb73d7t27Xcvz5s3rcoz58+d3uX6gVFdX6+GHH9aMGTNkNps1evRoTZkyRdOmTdO0adM0a9YsV9/S0tI+76f19G6jRo2SwWDo9M/UqVNdfQsLC13LQ/HnC3iKr6+vjAMwZedgMCDTya1du1ZSU4WlX/7ylz3apuXCsnfv3n6LCwAAAAAAAAAAAINH2ypMRqPRNZUQAAQFBXW6ruUL/q76tO7XUtVHkk6ePOlajomJ6XL7uLi4DrfrzRixsbFdrh8IR48e1bnnnqsjR470qH/bBNPeKC4u7tN2NTU1ruWh9vMF0DcDksS0detWGQwGXX/99T3eJjExUZJ7diUAAAAAAAAAAACGr9DQUE2ePFlWq1VWq1Umk2nEVB7A8GGyWDTh8y3eDmNAmZqrGw0HnU0DN9Bj9Ldrr71WR44ckcFg0KpVq3TVVVcpLS1N0dHR8vPzk8FgkMPhkMlkkiS3qeV6q3XC2Pbt2+Xr69uj7VpyBtoaCj9fAH0zIElMLZmVY8aM6fE2LRcum83WHyEBAAAAAAAAAABgkPH19VV0dLSio6Mlnd6X5oC3GIxG+UREeDsM9EJEq3+voqKiLvu2LsLRervWU9gVFRV1OfVdd/swGAxyOp1yOBxd9quuru5yfWf27dunzz77TJL0wAMPdDqbUuvqR6cjMjLStRwdHd1pclJX2v58k5KSOu3b3c8XwOA1IKnrLWU+S0pKerxNbm6uJPcLPwAAAAAAAAAAAEYOqm0AGAhTp051LX/55Zdd9v3qq6863G7atGmu5a+//rrLMbpbHxISIkkqKyvrtI/T6dTBgwe7HKcze/fudS1feeWVnfZLT0/vcpyeXqNnzZrlWt6ypW9Vyjz58wWGA5vNNiyTvQckiWncuHGSpMzMzB5v8/7770uSpkyZ0i8xAQAAAAAAAAAAAAAQHx+vtLQ0SdLf//53VVVVddjPbrdr/fr1kpoqA82ePdu1bs6cOa5qQS+//HKnyQV5eXn68MMPu4xn7NixkrpOInr//fdVXl7e5TidaT0bUlfVnP74xz92OU5AQIBrub6+vtN+559/voKCgiRJv//97/uUeLFkyRLX1HYvvvhip/2+/vpr7dmzp9fjA4Od0+lUTk6OsrKy9NVXX2nLli2qra31dlgeNyBJTEuXLpXT6dTTTz/dbck7qSnZaf369TIYDFq2bNkARAgAAAAAAAAAAAAAGKluv/12SU2zC915550d9vnZz37mKtxx4403yt/f37XO399fq1atkiTt2LFDjzzySLvtbTabbrzxRjU0NHQZy6JFiyQ1VYXqqHJRYWGhvv/97/fgqDo2YcIE13JLUlZbzz77rN5+++0uxxk1apRr+dChQ532s1gsuuOOOyRJn3/+ue65554u8waKior0/PPPt9vXt771LUnSO++8o7///e/ttquqqtLNN9/cZczAUJaTk6Pi4mJX8lJnCZdD2YAkMd15550ym806dOiQbrnlFrfMzrY++ugjLV26VHV1dYqIiNCNN944ECECAAAAAAAAAAAAAEaoW265RQsWLJAkrVu3Tuedd57efPNN7dq1Sx9//LGWL1+uX/ziF5Kk8ePH68EHH2w3xkMPPaTExERJ0g9/+EN973vf07///W9t375dr732mr7xjW/o/fff19y5c7uM5aabbpKPj4+cTqcuvvhiPfHEE0pPT9fnn3+uRx55RLNmzVJFRYVbMlJvzJo1yzUV3p/+9CddeeWVeu+997Rt2za9/fbbWr58uW677TYtXLiw23FaqjE9+OCD+uijj5Sdna2DBw/q4MGDblVifv7zn+uMM86QJD355JOaPXu2nn76aW3ZskU7duzQxo0b9dRTT+nb3/62kpOTO6wCtWbNGtdUe9/73vd0++23a+PGjdq2bZvWrVunOXPmKCMjo9ufLzAUGQwG1/nforKy0kvR9B+fgdhJbGys/vjHP+q6667TCy+8oA8++EAXXniha/2TTz4pp9OpLVu2aN++fXI6nTIajVq/fr2Cg4MHIkQAAAAAAAAAAAB4UXV1tfz9/eXjMyBfXwGAG5PJpPfee0+XXHKJtmzZov/+97/673//265fWlqa3n///Q6/xw4LC9O///1vnX/++SosLNSrr76qV1991a3PypUrtWjRIlfVpo5MmTJFv/vd7/T//t//U1lZme655x639REREXrrrbf04IMP6sCBA70+VoPBoJdfflnnnnuuysrK9Pe//71dZaNp06bp9ddfV3x8fKfjhISE6M4779Tvfvc7bd++XUuXLnVbv3HjRi1evFhSU6Wqjz76SCtXrtSbb76pnTt3uqozdSQ0NLRd25gxY/TOO+/okksuUWVlpZ555hk988wzbn0eeughGQyGLqfiA4aqkJAQnTx50vV6OCYxDUglJkm6+uqr9eqrryo0NFQ5OTn605/+JIPBIEl6/vnn9cILLygrK0tOp1PBwcF6/fXX3RKdAAAAAAAAAAAAMHzt3r1bW7Zs0VdffaXMzExVV1d7OyQAI0xERIQ+/fRTvfTSS/qf//kfxcbGytfXV+Hh4Vq0aJGeeuop7dixQ6NHj+50jClTpmjv3r267777NGHCBPn7+ysqKkpLlizRX//6V61bt65Hsdxzzz3697//rQsuuEDh4eHy9/fX2LFjdfvttysjI0Nnn332aR3rzJkztWPHDt1yyy0aPXq0fH19FRERofnz5+vRRx/VV1995TZdXGd+85vf6LnnntPZZ5+tiIgImUymTvuGhIToH//4hzZv3qwbbrhBkyZNUkhIiHx8fBQREaF58+bp9ttv17/+9S999NFHHY6xePFi7d27V7feeqtGjx4tPz8/xcbG6sILL9S///1v/exnP+vzzwQY7NomT1ZXV8vpdHopmv4xoKnsV1xxhc477zw988wzevfdd7Vjxw63qeWmTJmiSy65RHfddZdiYmIGMjQAAAAAAAAAAAB4SUNDg+rr6yVJtbW1qq2t7TJJAMDIsXr1aq1evbrbfuvXr9f69eu7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Vu6TTz7R2rVrJUlz5szRvHnz3Nbff//9MplMcjgcuvzyy5Wbm9vpPux2u1555ZUu+wDoOYfD4e0QTsuATCe3evVqGQwGXX755T3OpD958qRru4ceeqifIwQAAAAAAAAAAAAADDa33HKLPvroI/3zn//U66+/ru3bt+vmm2/W/PnzFRYWJqvVqn379mnTpk165513FBAQoDvuuKPf4klMTNSiRYu0adMmPf300yovL5fU+VRyA3kczz33nM444ww1NDRo2bJl+v73v6+LL75YZrNZGRkZ+s1vfqPDhw9Lkv7v//7PbRq4tmbMmKHMzEzNmTNH999/v+bPn6/6+nr961//0uOPP+6aau7pp59ut+20adP06KOP6p577lFmZqamTp2qm266Seeee65iY2NVV1eno0ePauvWrXrjjTdUUFCg3bt3u6pVAei5o0ePKjc3V/Pnz5fRaFROTo4sFou3w+qzAUliAgAAAAAAAAAAAACgtwwGg/72t7/prrvu0h//+EcdOnRI9913X6f9Y2Ji+j2mq6++Wps2bXIlMPn4+OiKK67ocpuBOI6ZM2fq3Xff1fLly2W1WrVmzRqtWbOmXb/bb79dDz/8cLdj3XHHHbr11ls7TKby8/PTiy++qDPOOKPD7e+++26ZzWbdfffdqqio0COPPKJHHnmkw75+fn4KCAjowRECaMvpdMput8tobJqIbahXYhqQ6eT6orGxUZLk6+vr5UgAAAAAAAAAAAAAAN7i6+urZ555Rjt37tT3v/99TZs2TWFhYTKZTAoLC9PMmTN1/fXX64033lBWVla/x3P55ZfL39/f9Xrp0qWKjo7udruBOI6lS5fq4MGDeuCBBzRz5kyFhobK399fycnJuvrqq7V582Y99dRTroSHrtxwww3avHmzrrjiCsXHx8vPz08JCQm67rrrlJGRoauuuqrL7W+88UYdPnxYP/vZz7Rw4UJFRUXJx8dHZrNZEydO1He+8x398Y9/VF5enlJSUvp0vMBI1/b/8lBPYhq0lZh27NghST262AMAAAAAAAAAAGDosNlsMplMcjqdcjqd3g4HwBAxbdo0/f73v+/VNqtXr9bq1au77bd48eIeX48sFovq6up6FUdrfTkOSVq5cqVWrlzZbb/o6Gj96le/0q9+9as+ROfuzDPP1N/+9rc+bx8bG6uHHnpIDz300GnHAqA9k8nk9pokpg689NJLHba//fbbSk9P73Lb+vp6HTp0SH/+859lMBg0b968/ggRAAAAAAAAAAAAXnLkyBHXd0A7duxQSkqKEhISvBwVAADA0NK2EtNQTw7vlySmlStXymAwuLU5nU795Cc/6fEYTqdTRqNRd911l6fDAwAAAAAAAAAAgBe1/YKtJ9MaAQAAwN1wq8TUb+8IW8p/tn4T2rqtqz++vr5auHCh3nnnHS1atKi/QhwQx44d07333qvU1FSZzWZFRERo3rx5euSRR1RTU+Ox/bz//vu69NJLlZiYKH9/fyUmJurSSy/V+++/3+MxbDab/vjHP+rss89WdHS0AgMDNX78eN18883au3evx2IFAAAAAAAAAGCoGEr3+YeStl+wkcQEAADQe8MtialfKjEdOXLEtex0OjVu3DgZDAZ98MEHmjBhQqfbGQwGBQQEKDIyst0Peih69913dc0118hqtbraampqlJ6ervT0dD3//PPasGGDUlJS+rwPh8Ohm266SS+88IJbe15envLy8vTWW2/phhtu0J/+9KcuPwCUlpZq2bJl+vrrr93aDx8+rLVr1+rFF1/UU089pRtuuKHPsQIAAAAAAAAAMJQMpfv8Qw2VmAAA3tRotaqmqEi2ujo5HQ4ZjEb5BAQoKDbW26EBvdL2PRRJTB0YPXp0h+3x8fGdrhtuMjIydOWVV6q2tlbBwcG6//77tWTJEtXW1uq1117Tc889p+zsbF144YVKT09XSEhIn/bz4x//2PXBZtasWbrvvvs0fvx4HTp0SL/73e+UkZGh559/XtHR0fr1r3/d4Rh2u12XXnqpK4Hpsssu04033qiIiAh9+eWX+uUvf6ni4mLdfPPNSkhI0De/+c2+/VAAAAAAAAAAABgihtJ9/qGo7RdsBoPBS5EAAEaShvJyVebkqLG+vt26xvp61VZUqNFolF2STx9/twMDqe17qLaJ4kNNvyQxtTXUM7364q677lJtba18fHz04YcfasGCBa515557riZMmKD77rtP2dnZWrNmjVavXt3rfWRnZ+vRRx+VJM2dO1effvqpAgMDJUnz5s3TJZdcokWLFik9PV2PPPKI/vd//7fDp0FefPFFffbZZ5Kk2267TU8//bRr3fz58/XNb35Tc+bMkdVq1Z133qmsrCz5+AzIqQMAAAAAAAAAgFcMpfv8QxHTyQHA4HT06FFvh9Bv6kpKVHH8eLdJHg6HQzWlpbKXl0tdzDQFDAbDLRGcd4T94KuvvtLmzZslSddff73bB5sW9957r9LS0iRJTz75pBobG3u9nyeeeEI2m02S9Ic//MH1waZFUFCQ/vCHP0iSbDabHn/88Q7HafmAFBERoUceeaTd+pSUFN1///2SpIMHD+qf//xnr2MFAAAAAAAAAGCoGGr3+YcippMDAAykhvLyHiUwtVayd69yN2zox6gAzxvqlZh4R9gP3nrrLdfyqlWrOuxjNBp13XXXSZLKy8u1cePGXu3D6XTq7bffliSlpqbqzDPP7LDfmWeeqUmTJkmS3n777XYnbHZ2trKysiRJV1xxhYKCgjocZ+XKla5lkpgAAAAAAAAAAMPZULrPDwAAuleZk9Pr36FOp1Ob7r67fwICPITp5Lrwv//7v5Kafkgt8ze3bu+LtmMNBS1Ts5nNZs2ZM6fTfosWLXItb9myRUuXLu3xPo4cOaL8/Px243S2n/379ysvL09Hjx7V2LFj28Xa3ThxcXGaOHGisrOztWXLlh7HCQAAAAAAAADAUDOU7vMDAICuNVitaqyv79O2hQcPqvA//1Hceed5OCrAM0hi6sL69etdP6DWiUet23vD6XQOySSmlspGKSkp8vHp/EecmprabpueyszM7HCcnuyn9Yeb3o6TnZ2tnJwcVVdXy2w29zje3NzcLtcXFBS4lgNfuUT2CP8ej93CEZUqp19w+xX2BpmKdvV6PNe4ESlyBljar3A6ZCrY3udxnZbRcgRFd7jOVLBdcjo6XNftuKEJcgSP6njc4t2SrW+/oJ3BsXKEJnU8bmmW1FDdt3EDI+QIH9fxuCcPSHUVfRpX/qGyR07scJWx/KgMNaWdbhrkcOjmuqqm5bUvyt66jLFvkOzRkzse15orQ1Vh3+I1+coeO6PjcasKZbB2/X+oUwaD7KM6vslirD0hQ9mRvo0ryT5qlmQwtd9lfYWMJw70eVxHzFQ5fQLaj9tYLWNJ766VbuMO4WuEj82mixoONy2/s1v2kl1cI+S9a0SXRsA1ostrZCtcI5rH5X1E07j9dI0I8A/TRQ1NH8h83tmthlbvvblGNI/L+4imcQfoGtHTa6RrXK4RTePyPqKJh68RLeejXaZ210jXuFwjmsblfYRLf14jghpqe3WNdI3LNaIJ7yNcPHGNCDzZt99ZGFmG0n3+7vTm/nxlZaWsVmuPxz4dbb9gq6mpYUo5nLaqqqoOlz3JZrPJ4XDI6XTKbrf3yz4weLT+N+bfe+iqKezj++VmX956qyYa278H7atLmv/OW7deeR4Y76ofmuQw9j4fA/3Hx+Cj5xY/p4mWjj8felJNTU27toF6P1dZWenxMT2axJScnNxhslJn7cNRXV2dSkubbkYkJiZ22Tc8PFxms1nV1dXKycnp1X5af+jobj9JSadu9LTdT1/GcTqdys3NdZWv7YnWMXTHp6ZQJp/ef1AxWXv3M/T2uBqK4+an98+4RTs9P64kU8nePm9raVmoan/T0nRif5/H7Yqp7HD/jFtxvH/GHWL/54bauK3/L/tJmtLy4mDfz+u243rUCLtGdDnuCLhGWFoWOrhGusYdYv/nhtq4vI9oYlKO566PbcfmGtE0Lu8jej2upWWhi2tkX8btlaE4Lu8jmsb18DXC0rJw8F2PjtuCa8TQHNeb1whLy0IPrpFu43KNaBqX9xFN43rgHPap6VuyHkaOoXafvzu9uT//8ssvKywsrFfj99XcuXPdEsT++c9/9lvSCUaml19+uV/GnTlzpsLCwhQcHKzi4uJ+2QcGpxMnTng7BPSRT13daW1fXlkphVk8E0w/IIFp8LE5bVq1cZWuLrxaBvXvv09QUJCmT5/ueu1wOPTss8/26z5bVFT08QGgLng0ieno0aO9ah+OWmeaBQd38BReGy0fbnr7xrw3+2ldMantfjw1DgAAAAAAAAAAw8FQu88PAAC64Ti9JHabzeahQDDSOOXs9ySmxsZGFRQUyOl0uv4MZR5NYkLTExot/Pz8uu3v7980bVptbW2/7adlHx3tx1PjdKe7J0MKCgo0f/78Xo0JAAAAAAAAAICnDbX7/N3pzf35a6+9VgkJCb0av6927twpR6svlS+77DK3ZC2gL6qqqlwVmK699toeJSL2Vl5enhwOh3x9fRUTE+Px8TG42O12VwWmyMhImUyem1IMA6estFQ6jUSkrqaWBbpy2y239fusZXa7XcXFxfr0009lMBh09tln6+KLL+7XfbbIy8vTww8/7NEx+d/mYQEBAa7lhoaGbvvX1zfNvx4YGNhv+2nZR0f7aTtO69e9Gac73ZXCbc0WPVWK7sMHlbjpUkBoBwPWS7lf9368FtFpkjmyfbvDIR3/vO/jRqZIIXEdrzu2VXL2cV5dy2jJ0kl54Nx0ydbHcomhCVJEJ/OsF+yU6vs436U5WoruZGrCokyp9mTfxg2wSHFTO15XekCqKup0U5vNrqKiprlxY2Pj5OPT6g2pX7AUP7PjDU8elaxdzy/fKZOflNRJIl9FnlR2pG/jyiCNWdjxqqpiqTS7j+NKSj5TMnbwa6SmTCo+jdL5CXMl3w6uRfVVUsGOvo87hK8R9fUN2p6xXZI0e9Zs+Rdu4xohee0a0aURcI3o8hrZGteIJryPaNJP14hG/3ClH2vadvas2fL3b3XTn2tEE95HNBmga0SPr5EtuEY04X1EEw9fI1rOR7t8FDv3YvdrZAuuEU14H3FKP14jbHXVvbtGtuAa0YT3Ead44BphK6mW9EXfY8CwN9Tu83enN/fnQ0JCFBrawe+1AWA2m722bwxPwcHB/XJOFRUVyWazyWAwkNAywphMJv7NhyjfgADZWv0u7S1LSIgHo/G80UVOHYtlSrnBZF7cPP327N8qLGhgpuk1mUw6ebLpc+yoUaMG7D2V1Wr1+JgkMXlYSKsLWE9KulZXV0vqWUnavu6nZR8d7aftOF0lMXU1jifVfvvPUlpav40PdKfGatVfmucJvfV7t/LBGV5Xb7Xq0z1N5+SUs2+VP+ckvIhrJAaTWqtVnz7L9RGDB9dIDCZu5yPXSAwCXCMxmNRmZUkPTPZ2GBjEhtp9/uFiqE99AgAYvAJjY1VbUdHn7c949lnFnXeeR2KxWq16tuWz0a2e+Wz03mmPAAweRm8HMNwEBAQoMrLpKbnc3K6fgCorK3N98EhK6uRJtU60fnKiu/20LhXbdj99GcdgMPTqyQ0AAAAAAAAAAIaKoXaff6hKTEzUoUOHdPDgQY0ZM0ZBQUHeDgkAMEz5hYbKt9XUrL0Rl5LisQQmAN3zaCWmcePGeXI4SU0JM4cOHfL4uP1p8uTJ2rx5sw4ePCibzdbpHJn79u1zLaf1svLQ5MmnnhRqPU5v99N2nJkzZ3Y7TlJSEvNSAwAAAAAAAACGraF0n3+oioyMVElJiSQpPDxcvr6+Xo4IADCchSQlqezQoV5V/jMYDFr8xBP9FxSAdjyaxHT06FFPDiep6cIw1Jx11lnavHmzqqurtW3bNp1xxhkd9vvkk09cywsXdjJHfCfGjh2r+Ph45efnu43TkU8//VSSlJCQoDFjxrSLtXU8V111VYdjFBYWKjs7u0+xAgAAAAAAAAAwlAyl+/wAAKB7fhaLwpKTVXH8eI8TmaKnTFHiuef2c2QAWvNoEtOKFSs8OdyQ9e1vf1sPP/ywJGndunUdfrhxOBx66aWXJEkWi0VLlizp1T4MBoO+9a1v6dlnn9W+ffv0xRdf6Mwzz2zX74svvnA9ofGtb32rXVLYxIkTlZaWpqysLP3973/XmjVrOizZun79etfypZde2qtYAQAAAAAAAAAYSobSfX4AANAzAdHRMvr6qjInR4319Z32MxqNCoqJUUBIyABGB/SN0+mUw+Hwdhge49EkpnXr1nlyuCFr/vz5Ovvss7V582a98MILWrFihRYsWODWZ82aNcrKypIk3XXXXe3KpG7atMn1gWfF/2fvzsOjqu/+/7/OzGSy7wsJIRAwQUBAUEARRWytWhStVi2KCy4UtVWxKt7W/qr2ttWqdV8Kboiita5fEVu3m0URBRQQSFgS2QIhIRvZM9v5/UEzZbKRhCQny/NxXV7XzOec8zmvgUMyznnP+3P11QFFRPXmzJmj+fPny+v16uabb9aKFSsUGhrq315TU6Obb75ZkuRwODRnzpwm895xxx267rrrVFJSorlz5+qZZ54J2J6bm+v/n7WMjAyKmAAAAAAAAAAAvVpP+5wfAAC0jjMmRvExMXKXl6u6oECe2lqZPp8Mm02OkBCF9eunioICGR6P1VGBVikuLtbmzZt18sknyzRNZWdnN9tFtCewWR2gt3ryyScVGhoqj8ejs846Sw8++KC++eYbLV26VLNnz9bcuXMlHeqEdPvtt7frHEOHDtWdd94pSVq7dq0mTZqkt956S2vXrtVbb72lSZMmae3atZKkO++8U5mZmU3Oc/XVV/vb3D777LO6+OKL9cknn2j16tV65plndMopp6i8vFw2m01PPfVUs2t/AwAAAAAAAADQW/Skz/kBAEDbBEVFKTozU/GjRinh+OMVP2qUojMzFRQVZXU0oE0OXx7RMIxWL5fYXVGN0knGjh2rt956S1dccYXKy8v1+9//vtE+Q4cO1ZIlSxR5FG3o/vznP6uwsFAvv/yy1q1bp+nTpzfa57rrrtMDDzzQ7Bx2u10ffPCBpk6dqjVr1ujdd9/Vu+++G7BPcHCwnnnmGf385z9vd1YAAAAAAAAAAHqKnvQ5f29gmiZL5QHoUOnp6dq1a1ez3fCsdN999+n++++XpB5fcADAWg1/hvT091OWdWIyTVO5ublas2aN1qxZo9zc3F73A3ratGn64YcfdNttt2no0KEKCwtTTEyMxo0bp7/+9a9at26dMjIyjuocNptNL730kpYsWaILLrhA/fv3l9PpVP/+/XXBBRfo448/1osvviibreW/6oSEBH399dd67rnndOqppyo+Pl4hISEaMmSIZs2ape+++07XX3/9UWUFAAAAAAAAAKAn6Umf8/c0ubm5GjdunCZMmKB169Zp3759VkcCAADocbxeb8Dznv6escs7Mf373//Wc889p2XLlqmqqipgW1hYmKZMmaKbbrqp13T8GTRokB577DE99thjbTpuypQpbSrqmjp1qqZOndrWeAEcDoduvPFG3XjjjUc1DwAAAAAAAAAAvUVP+py/p3E4/nubquENOACt592/X67vvpN3/36ZLpcMp1P25GQ5TzxR9uRkq+MBADoRRUztVF1drSuvvFIffPCBpKbb4lVVVenjjz/Wxx9/rPPPP1+vv/66wsPDuyoiAAAAAAAAAAAAukDDG2wUMQFt59m7V7WffCLvnj2Ntnnz8uRau1b2tDSFnH22HKmpFiQEAHS2hu+h7Ha7RUk6RpeUYPl8Pk2dOlUffPCBTNOUw+HQueeeq/vvv19///vf9fe//13333+/zjvvPAUFBck0TX344YeaOnVqr1tiDgAAAAAAAAAAoK+jiAk4Ou5t21S1YEGTBUyH8+7Zo6oFC+Tetq2LknWOffv26X/+5390wgknKDo6WkFBQerXr59GjRqlyy67TAsWLFB5ebmkQ53wDMPQrl27JEmvvvqqDMMI+G/KlCkB85eWluqVV17RFVdcoREjRigiIkJOp1Opqam67LLL9Prrr8vlcjWbb+fOnf65FyxYIEl67733NHXqVPXv318Oh0NTpkzRggULZBiG7r//fv+xDbMZhqGdO3d26J8fgN6LTkztMG/ePK1YsUKGYejss8/Wiy++qNRmqn337t2rWbNm6d///re++uor/f3vf2d5MwAAAAAAAAAAgF6kYZcAipiA1vPs3avqt9+WPJ5WHuBR9dtvK3zmzB7ZkenLL7/Ueeed5y9SqldYWKjCwkJt2rRJ//jHP5SQkKDzzjuvNsEDEQABAABJREFUXecYO3asv+jpcAUFBSooKNDy5cv15ptv6uOPP1byEZboM01TV111lV577bV2ZQGAtqCIqR1effVVSdL48eO1ZMmSFv/QUlNTtXjxYk2aNEmrV6/Wq6++ShETAAAAAAAAAABAL0InJqD9aj/5pPUFTPU8HtV+8okirr22c0J1krq6Ok2fPl3l5eWKjIzUjTfeqDPOOENJSUlyuVzasWOHvv76a73//vv+Y1555RVVVVXp7LPP1r59+3TBBRfogQceCJg3PDw84LnX69VJJ52k8847T2PHjlW/fv3kcrmUm5urV155RUuXLtW6des0ffp0LVu2rMXMTzzxhH744QeddtppuvHGGzV06FCVlZVp586d+sUvfqFx48bpueee0/PPPy9J2rhxY6M5mmsIAgAN9bbl5LqkiCk7O1uGYei2225rVdWX3W7X7373O02fPl3Z2dldkBAAAAAAAAAAAABdhU5M6M1M05RZXd0pc3sLC4+4hFyzx+7ZI/eOHbInJXVwKskIC5NhGB0+78qVK7Vv3z5J0htvvNGo09LJJ5+syy67TI8//riq//NnPnjwYElSUFCQJCkmJkYjR45s8Tz/93//p8zMzEbjJ510ks4880z94x//0O9+9zstX75cX3zxhX760582O9cPP/ygq666yr90XEMxMTFKOuzv4EjZAKAldGJqh/ofzkOHDm31MfW/JDrjlx0AAAAAAAAAAACsQycm9GZmdbUqHn3U6hhNql64sFPmjbzjDhkNuht1hP379/sfT548udn9HA6HoqKi2n2epgqYDjd9+nQtXLhQ69ev1wcffNBiEVNMTIyeeeYZ7nMD6BK9rYipS9Ifc8wxkg6tS9pa9fvWHwsAAAAAAAAAAIDeoWEnJk9bl8YC0CekpKT4H7/yyitdck7TNLV//35t27ZNmzZt0pYtW7Rlyxb1799fkrRhw4YWj582bZoiIyO7IioANHoP5XB0SS+jTtMl6S+77DKtW7dOCxcu1Nlnn92qYxYuXCjDMPSrX/2qk9MBAAAAAAAAAACgKzUsYnK73RYlAdCdnXrqqRoyZIh+/PFHzZkzR4sWLdKFF16oyZMna/z48XI6nR12riVLluj555/XihUrVFFR0ex+RUVFLc4zevToDssEAEfS8D1Uw/dYPU2XdGK65ZZbdMIJJ+gf//iHHn744SPu/8gjj+jNN9/U2LFjNWfOnM4PCAAAAAAAAAAAgC7T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T37yEy1cuFA7duxQTU2NKioqtGnTJj366KMaOnSoFi9efMS5CgoKNHHiRM2dO1fr1q1TZWWlKisrtWbNGt1888266KKL5PP5Ao658MILFRoaKkl64403Wpzf7XbrnXfekSRNnTpVsbGxrXotlZWV2rJlix577LFWv5bmfPrpp8rIyNCf//xnrV+/XgcPHlRdXZ127dql119/Xaeddpp++9vfNnqdTXn55Zd1yimn6B//+Ify8vJUV1envLw8LViwQGPGjNHbb7/d4vGPPvqoRowYoSeeeEKbNm1SeXm5amtrtWPHDr366quaMGGC/vjHP7b7tQIAAAAAAAAArFVfyDRgwIBG27Zv3668vDwLUgEA+pL8/Hxt3bq10XhqaiodmNAiipgAtIlpmrr44ov1j3/8Q5I0bdo0vfbaa1q5cqVWrVqlJ598UgMHDlRVVZUuvvjiI3b2ueiii5SVlaVbbrlFn332mb777ju98cYbGj58uCRp8eLFeuGFFwKOiYyM1Pnnny9Jeu+991RbW9vs/P/6179UUlIiSZoxY0arXsuKFSu0ePFi/elPf2rTa2nK+vXrNW3aNJWXlysoKEi33Xabli5dqtWrV2vevHkaPHiwJOnZZ5/V3XfffcS5brjhBiUlJenpp5/Wt99+q+XLl+uuu+5ScHCw6urqNGPGjGZzPvLII7rzzjvldrs1evRoPf/88/r888+1du1aLVq0SBMnTpRpmvrf//1fPfXUU21+rQAAAAAAAACA7sEwDA0ZMkQDBw5stC03N1d79uyxIBUAoC/Yu3evtm3b1mh8wIABOuaYYyhgQoscVgcAulpxZV27jw0PdigkyN7ktpIql0zTbNe8oU67wpxN/3Msq3bJ62vdvPERwe06f1u8+OKLWrJkiYKCgvThhx/qnHPOCdh+8skn68orr9Rpp52mzZs3a86cOS0ul7ZmzRp9+umnmjJlin/shBNO0Nlnn60RI0aooKBAzz33nGbPnh1w3IwZM/TWW2+pvLxcH330kS6++OIm56/v1BQVFaXzzjuvVa/F6/WqsLBQJ554om688UZNmTKlVa+lKb/+9a/lcrlkt9v10Ucf6ayzzvJvGz9+vC655BKdeuqpysrK0qOPPqqrrrpKxx13XJNzbdiwQYMGDdI333yj5ORk//jkyZN19tln66yzzpLb7dZNN92k1atXBxyb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qaeeqmuuuUaTJ0/W5s2bdffdd+uTTz5p9tuIa9as0UcffaSJEyf6x4YPH64zzjhDY8aMUUFBgZ577jnNnj074LgZM2borbfeUnl5uT766CNdfPHFTc7/xhtvSDr0AeN5553Xqtfi9XpVWFioE088UTfeeKOmTJmizZs3a86cOUdc+q2hX//613K5XLLb7froo4901lln+beNHz9el1xyiU499VRlZWXp0Ucf1VVXXaXjjjuuybk2bNigQYMG6ZtvvlFycrJ/fPLkyTr77LN11llnye1266abbtLq1asDjs3KytI999wjSbr33nt17733BvwP3oknnqjp06fr6quv1uuvv6577rlHV155ZaPOVUcyb948fffdd/7XPm/evIBzXHjhhbruuuv08ssvt2leAAAAAACOhmmaqq6uVlhYWJM3POPj47Vr164mj7Xb7YqNjVV8fLzi4uIoWAIAwGJ2u11DhgxRcnKycnNz/V9kPlzDlREAoLuKjIxUSkqK8vPzFRsbq4yMDJakRp9GERP6nkeOaf+xUx+VJsxqetuz46Xq4vbNe/r/SGc004XnlZ9LB7a0bp77Drbv/K1kmqb++te/SpJuueWWRgVM9eLi4vTII49o6tSpWrVqlfbt29eoirjezTffrEmTJsnn+2+hltfrVXh4uGbMmKHHHntMGzduVHFxseLi4vwfNJ5zzjmKj49XcXGxFi1a1GQRU2VlpT788ENJ0i9/+UuFhIS0+bXExsb6X8vKlSu1ffv2Zl9LQ6tXr9aaNWskSbNmzQooYDp8/vnz5+vUU0+Vz+fTc889p2effbbZOf/2t78FFDDVO+OMMzRr1iw9//zzWrNmjdauXatx48YFHOd2uzVu3LhGBUz1bDabnn76ab399tuqrKzUO++8o1mzmrnem/Hcc89Jkvr166fHH3+8yX2efPJJLV68WAcOHGjT3AAAAAAAtIXX61VpaalKSkpUUlKiuro6jR8/vskbAhEREXI6nf5lHIKDgxUfH6/4+HjFxMQccfl3AADQ9cLCwjRy5EgVFxcrNzfX31Fx//79qqmpsTgdABximqaKi4v9X45oyuDBgxUXF6f4+Pgm7+EBfcn/z959h0dVpv8f/0xJMumF0EJJkCIgKEoTRQFFcBHsYNmVooh1Xf269lVhXQvquupaUYTVRVQUEVQUCyAi0lGkSO89pEx6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cqW2b9+uzMxMFRQUKCcnx+92kZGRio6OVpMmTdSpUyedffbZ6tmzp9q1a6e4uDjKxQEAAL/CwsLUvn179enTRykpKX7PGVwul3bt2qXly5dr165dKi4uroWRAqjL8vPz9fPPP2vHjh0BjxEtW7ZUnz591KFDB/N6JoDQEMQEIGRWq1UPP/ywJGnHjh0aPXq0CgsLA7bPzs7WK6+8Uu3juu6668w3GzNmzNDMmTMlSX369FG7du38bmO1WnXvvfdKOpG5afTo0UpPT1d+fr7fOywq8lr69OmjXr16SZLeeustfffdd6XaZGVl6ZZbbjHHdNtttwXt8//+7//8lmJbvHixpkyZIknq2bOnevfu7bP+oYceks1mk8fj0dVXX619+/YF3Ifb7daMGTOCtgnEO/5Dhw6ZP9+T3XPPPWa5PgAAAABA4+JwOHTkyBH9+uuvWrp0qX777TcdOHDA741S3pLpJ7NYLOrZs6e6deumli1bKiIiorqHDQAAGpCIiAh17NhRvXv3VvPmzf22cblc2r17t5YvX66dO3dW+U3QAOovh8MR8D1Is2bN1Lt3b3Xq1EkOh6OGRwY0DORTBlAut956q7755ht9+umnmjVrltasWaNbbrlFffr0UXx8vLKzs7V582YtWrRIc+fOlcPh0J133lmtY2rdurUGDBigRYsW6dVXX1VmZqYk6YYbblBUVJRcLpdcLpc8Ho/PdjfddJMWLlyoefPm6dNPP9W6det04403qnfv3rJarcrJydHhw4f1ww8/VPi1vPXWW+rbt6+Kioo0bNgw/fnPf9aIESMUHR2ttWvX6plnntGOHTskSX/96199ysCd7IwzztDGjRvVs2dPPfTQQ+rTp48KCwv15Zdf6l//+pdcLpfsdrteffXVUtt2795dzz//vO655x5t3LhR3bp104QJE3TBBReoefPmKigo0K5du7Rs2TJ9/PHHOnjwoNavX29m3grVbbfdpmnTpmnt2rV6/fXXtXPnTt16661q06aN9u7dq9dee00LFixQr169tGrVqnL1DQAAAACof9xutzIyMnT48GH16NFDDodD+/fvD2nb48ePKzU11e86si0BAIDKioyMVOfOndWmTRvt2rVLx44dK9XG7XYrOzubcw8AJovFotTUVLPKinSi5HVaWppiYmJqcWRAw0AQE4BysVgs+vDDD/WXv/xFb7zxhrZv3677778/YPtmzZrVyLj++Mc/atGiRWYAk91u1zXXXCObzSabzaaIiAh5PB653W65XC6zNu306dN1//3365133tHOnTv16KOPBtxHs2bN5HK5ZLVaQ65b26NHD82bN08jR45Udna2/vnPf+qf//xnqXZ33HGHnn766TL7uvPOO3Xbbbf5DaYKDw/Xf/7zH/Xt29fv9nfffbeio6N19913KysrS88995yee+45v23Dw8MrFCFut9v1+eef64ILLtDvv/+ur776Sl999ZVPmyFDhujee+/V0KFDy90/AAAAAKD+MAxDP//8s5nxOJT3meHh4UpKSlJSUpISExOre4gAAACKjo7WaaedJqfTqT179pQKZmrbtm0tjQxAbcnLy9PRo0fVtm1bv0GMycnJioqKUmRkpNq2bau4uLhaGCXQMFFODkC5hYWF6bXXXtMvv/yiP//5z+revbvi4+Nls9kUHx+vHj166KabbtLHH3+sTZs21ciYrr76ap/UjUOGDFHTpk192litVoWFhSkyMlLR0dHm15deekk//fSTbrnlFp122mnma4mLi/N5LRs3blR+fr5yc3OVm5urwsJCMxgqmCFDhmjbtm16+OGH1aNHD8XFxSkiIkJt27bVH//4Ry1ZskSvvPJKSIFR48eP15IlSzRq1CilpKQoPDxcrVq10ujRo7V27Vpde+21Qbe/+eabtWPHDk2aNEnnnnuukpOTZbfbFR0drU6dOumqq67SG2+8of3796tDhw5ljseflJQUrV27Vv/4xz/UrVs3RUZGKiEhQWeffbZee+01zZ8/X+Hh4RXqGwAAAABQ9wQqr2KxWBQfH1/m9vHx8WrXrp169uyps88+W6eeeqqaNm0qu537LwEAQM2JjY3Vaaedpp49e5rXF+Li4pSQkOC3vWEYysrKotQc0IBkZWVpw4YNWrlypXbt2qWsrCy/7SwWi8466yx169aNACagivFJAIAK6969u15++eVybzdx4kRNnDixzHYDBw4M+eQ/ISFBBQUFIY/BYrHIbrfLbrcrIiJCffr00VlnnSXDMGS323XkyBFJJ7Iv2Ww2SSdqYBcXF0uSPB6PioqKNGrUKI0aNUp2u102m00ej8dvMFLTpk315JNP6sknnwx5jIGcffbZ+vDDDyu8ffPmzfXYY4/pscceq/RYAomMjNQjjzyiRx55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qJ49e6p///46/fTTlZaWpsTERDMzVlni4uL8Pu9yufT777/r4MGDZWZ7AgAAAKrT1q1b9dtvv2nPnj3KyMgIOYBJOvFeJFD78PBwApgAAI3Srl27ZLFYZLFYNHDgQL9txo8fr/j4eEnSgw8+qPT0dJ/1brdbt99+u5lZ/b777qvWMQMAAAC1iUxMAOqklJQUdenSRZs2bdJHH32kZ555RjExMaXaud1uTZ8+XdKJIJOzzjrLXNezZ08lJiYqIyND7733nu655x6/QT779+/XggULgo6nXbt2+uWXX4IGEc2fP1+ZmZmhvcCTlPywP1g2pzfeeCNoPw6Hw1wuLCwM2G7w4MGKiopSXl6eXn75ZY0aNarcZRwGDRokm80mt9ut//znP7ryyiv9tlu5cqV+++23cvVdl9lsNiUmJpqZqLwlNrKyssy71k8usREWFubzuynJ6XTq0KFDZkYxm82m2NhYxcbGKi4ujjvrAAAAUGmGYSgnJ0dOp1NutztgJtbY2FgdO3aszP4sFot5vup9RESQ/RgA0LBs27bNzJzu5c3QnZOTY34m6XXxxRerRYsW5d5PUlKSJk+erFtvvVW7d+9W37599cgjj6h79+46cOCAXnzxRS1cuFCSdN111wUMhgIAAAAaAoKYANRZd9xxh+68804dPXpUd911l955551SbSZNmqSNGzdKkm6++WafD84jIiI0btw4vfDCC1q3bp2ee+453X///T7bu1wu3XzzzSoqKgo6lgEDBuiXX37R8uXLtXTpUp177rk+6w8dOqQ///nPFX2p6tixo7k8ffp0nX322aXavP766/rss8+C9tOyZUtzefv27Tr11FP9tktISNCdd96pZ599Vj/99JPuuecevfDCC7Ja/SfoO3z4sObNm6fx48f77Ouyyy7T7NmzNXfuXH300UcaNWqUz3Y5OTm65ZZbgo65vrNYLIqOjlZ0dLT5nMvlMgOasrOzFRYWFjBI7OSyG263W5mZmT4BcWFhYerUqZNycnKUnZ2tyMhIhYWFVcvrAQAAQP1mGIYKCwuVmZmptm3bKiYmRr/++qtZGttut6tVq1Z+z08DZQ+NiIjwCViKiYkJ+N4BAICG4scff9S4ceP8rktPTy+1buHChRUKYpKkW265RQcOHNATTzyh7du368YbbyzVZtiwYX4/HwUAAAAaEoKYANRZt956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779fp59+urKysjRr1iy99dZbuuaaayq9HwChMQxDERERAbM5eduULOnkDWyy2Wx+25c3iOlkgQIRiouLzbGEmuXJy263q2vXrn4z0nk8Hh0+fFh2u93vgwAoNFQej0eGYQT8Wz548KCcTmepYKXi4mJ5PJ6gfScmJgYMYqpMFrhgx5fw8HAzOCnQwxuwxN82AAAAAAAAAFQfgpjQOHg8Uv7x2h5FzYlMkqzWat/NunXrtHjxYvXt29d8rlevXurYsaOGDx8up9Opvn37yjAMrVixQu3btzfb9enTR8nJybrjjju0Z88effHFF7riiit8+n/jjTfMAKbRo0dr+vTp5kWjnj17asSIEXrkkUf01FNPafv27XriiSc0efJknz6eeOIJ7d27V5L01FNP6aGHHjLX9ezZU1dffbWGDx+uBQsWVO0PpwJ69Oihffv2KSEhodS6oUOH6s4779Tw4cP1zTffaNKkSRo9erR58TA6OlrdunXTqlWrzG06deqktLS0gPv7+9//rjVr1ighIUHffvutevbs6bO+f//++uMf/6h+/frp4MGDevjhhzVjxgyfNvfee6+Zgem///2vrrvuOnNdr169NHLkSJ133nk+46qI9evX69///rck6ayzztLixYt9AtYuvPBCnXPOORozZkyl9gOgapUsXeevzNvJEhIS1L17dzPg6eQyUd6vgQQLYqool8sla4D/qcXFxT7ZCE9ms9kCBjjZbDY1b95cUVFRpbYzDMMM9rLZbARMoNrk5eWpsLBQbrfbzIjkcrl8vve37PF41KRJE3Xr1s1vvxkZGTp69GiFxhTs77UiQUwlg5ACSUlJUUpKCn9rAAAAAAAAAFDLCGJC45B/XHqufdntGor7tkvRydW+m7vvvtsngMnrkksuUWpqqnbv3q2jR4/q9ddf9wlg8ho3bpzuvfdeFRQUaMmSJaWCmF599VVJUtOmTfXKK6/4vbA0adIkzZ49W5s3b9Zbb72lv//97+ZFqqKiIk2dOlWSdPrpp+vBBx8stX1YWJimTp2qU045pVIXuatCcnLw31l4eLiee+459ejRQ7t379a6detKBR6FKicnx/z5PvHEEwH7SU1N1aOPPqrbb79ds2bN0pQpUxQdHS1JOnTokD799FNJ0vDhw30CmLxiY2M1ZcoUv/OkPN544w0zc8OUKVP8BkOMHj1aH3zw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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "dp = Pulse(0, 40, 0.9, 400e6, 0, eCap(alpha=2), 0, PulseType.DRIVE)\n", "dp.plot(sampling_rate=100)" @@ -742,9 +793,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "'Envelope_Waveform_I(num_samples = 200, amplitude = 0.9, shape = Rectangular())'" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "duration = 200 # ns\n", "amplitude = 0.9 \n", @@ -792,7 +854,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 24, "metadata": {}, "outputs": [], "source": [ @@ -803,7 +865,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 25, "metadata": {}, "outputs": [], "source": [ @@ -814,34 +876,34 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "# initialise a PulseSequence with multiple pulses at once\n", "ps = PulseSequence(p1, p2, p3)\n", "assert ps.count == 3 and len(ps) ==3\n", - "assert ps[0] == p1\n", + "assert ps[0] == p3\n", "assert ps[1] == p2\n", - "assert ps[2] == p3\n", + "assert ps[2] == p1\n", "# * please note that pulses are always sorted by channel first and then by their start time" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 27, "metadata": {}, "outputs": [], "source": [ "# initialise a PulseSequence with the sum of multiple pulses\n", "other_ps = p1 + p2 + p3\n", "assert other_ps.count == 3 and len(other_ps) ==3\n", - "assert other_ps[0] == p1\n", + "assert other_ps[0] == p3\n", "assert other_ps[1] == p2\n", - "assert other_ps[2] == p3\n", + "assert other_ps[2] == p1\n", "# * please note that pulses are always sorted by channel first and then by their start time\n", "\n", - "plist = [p1, p2, p3]\n", + "plist = [p3, p2, p1]\n", "n = 0\n", "for pulse in ps:\n", " assert plist[n] == pulse\n", @@ -850,7 +912,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 28, "metadata": {}, "outputs": [], "source": [ @@ -861,17 +923,29 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "AssertionError", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mAssertionError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[29], line 5\u001b[0m\n\u001b[1;32m 3\u001b[0m yet_another_ps\u001b[38;5;241m.\u001b[39madd(p4)\n\u001b[1;32m 4\u001b[0m yet_another_ps\u001b[38;5;241m.\u001b[39madd(p5, p6)\n\u001b[0;32m----> 5\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m yet_another_ps[\u001b[38;5;241m0\u001b[39m] \u001b[38;5;241m==\u001b[39m p4\n\u001b[1;32m 6\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m yet_another_ps[\u001b[38;5;241m1\u001b[39m] \u001b[38;5;241m==\u001b[39m p5\n\u001b[1;32m 7\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m yet_another_ps[\u001b[38;5;241m2\u001b[39m] \u001b[38;5;241m==\u001b[39m p6\n", + "\u001b[0;31mAssertionError\u001b[0m: " + ] + } + ], "source": [ "# multiple pulses can be added at once\n", "yet_another_ps = PulseSequence()\n", "yet_another_ps.add(p4)\n", "yet_another_ps.add(p5, p6)\n", - "assert yet_another_ps[0] == p4\n", + "assert yet_another_ps[0] == p6\n", "assert yet_another_ps[1] == p5\n", - "assert yet_another_ps[2] == p6" + "assert yet_another_ps[2] == p4" ] }, { @@ -1104,44 +1178,6 @@ "assert ps1 == ps2" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "hash(ps1)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "hash(ps2)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for pulse in ps1.pulses:\n", - " print(pulse.serial)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for pulse in ps2.pulses:\n", - " print(pulse.serial)" - ] - }, { "cell_type": "markdown", "metadata": {}, diff --git a/src/qibolab/pulses.py b/src/qibolab/pulses.py index 401ababb82..068dd818e0 100644 --- a/src/qibolab/pulses.py +++ b/src/qibolab/pulses.py @@ -861,15 +861,28 @@ def modulated_waveforms(self, sampling_rate): # -> tuple[Waveform, Waveform]: return self.shape.modulated_waveforms(sampling_rate) def __hash__(self): + """Hash the content. + + .. warning:: + + unhashable attributes are not taken into account, so there will be more + clashes than those usually expected with a regular hash + + .. todo:: + + This method should be eventually dropped, and be provided automatically by + freezing the dataclass (i.e. setting ``frozen=true`` in the decorator). + However, at the moment is not possible nor desired, because it contains + unhashable attributes and because some instances are mutated inside Qibolab. + """ return hash( - tuple(getattr(self, f.name) for f in fields(self) if f.name != "type") + tuple( + getattr(self, f.name) + for f in fields(self) + if f.name not in ("type", "shape") + ) ) - def __eq__(self, other): - if isinstance(other, Pulse): - return hash(self) == hash(other) - return NotImplemented - def __add__(self, other): if isinstance(other, Pulse): return PulseSequence(self, other) @@ -1061,7 +1074,6 @@ def plot(self, savefig_filename=None, sampling_rate=SAMPLING_RATE): ax2.legend() # ax2.axis([ -1, 1, -1, 1]) ax2.axis("equal") - plt.suptitle(self.serial) if savefig_filename: plt.savefig(savefig_filename) else: From 87628cebb8573d7b5c68d4d9d7f6ae7205949b7e Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 17 Jan 2024 17:51:43 +0100 Subject: [PATCH 0019/1006] Drop Waveform.serial, in base class and subclasses --- src/qibolab/pulses.py | 36 +----------------------------------- 1 file changed, 1 insertion(+), 35 deletions(-) diff --git a/src/qibolab/pulses.py b/src/qibolab/pulses.py index 068dd818e0..a2a2eb89ac 100644 --- a/src/qibolab/pulses.py +++ b/src/qibolab/pulses.py @@ -51,7 +51,6 @@ def __init__(self, data): """Initialises the waveform with a of samples.""" self.data: np.ndarray = np.array(data) - self.serial: str = "" def __len__(self): """Returns the length of the waveform, the number of samples.""" @@ -65,18 +64,7 @@ def __eq__(self, other): `Waveform.DECIMALS` decimal places, are all equal. """ - return self.__hash__() == other.__hash__() - - def __hash__(self): - """Returns a hash of the array of data, after rounding each sample to - `Waveform.DECIMALS` decimal places.""" - - return hash(str(np.around(self.data, Waveform.DECIMALS) + 0)) - - def __repr__(self): - """Returns the waveform serial as its string representation.""" - - return self.serial + return np.allclose(self.data, other.data) def plot(self, savefig_filename=None): """Plots the waveform. @@ -94,7 +82,6 @@ def plot(self, savefig_filename=None): plt.grid( visible=True, which="both", axis="both", color="#888888", linestyle="-" ) - plt.suptitle(self.serial) if savefig_filename: plt.savefig(savefig_filename) else: @@ -198,9 +185,7 @@ def modulated_waveforms(self, sampling_rate=SAMPLING_RATE): mod_signals = np.array(result) modulated_waveform_i = Waveform(mod_signals[:, 0]) - modulated_waveform_i.serial = f"Modulated_Waveform_I(num_samples = {num_samples}, amplitude = {format(pulse.amplitude, '.6f').rstrip('0').rstrip('.')}, shape = {str(pulse.shape)}, frequency = {format(pulse._if, '_')}, phase = {format(global_phase + pulse.relative_phase, '.6f').rstrip('0').rstrip('.')})" modulated_waveform_q = Waveform(mod_signals[:, 1]) - modulated_waveform_q.serial = f"Modulated_Waveform_Q(num_samples = {num_samples}, amplitude = {format(pulse.amplitude, '.6f').rstrip('0').rstrip('.')}, shape = {str(pulse.shape)}, frequency = {format(pulse._if, '_')}, phase = {format(global_phase + pulse.relative_phase, '.6f').rstrip('0').rstrip('.')})" return (modulated_waveform_i, modulated_waveform_q) def __eq__(self, item) -> bool: @@ -236,7 +221,6 @@ def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: if self.pulse: num_samples = int(np.rint(self.pulse.duration * sampling_rate)) waveform = Waveform(self.pulse.amplitude * np.ones(num_samples)) - waveform.serial = f"Envelope_Waveform_I(num_samples = {num_samples}, amplitude = {format(self.pulse.amplitude, '.6f').rstrip('0').rstrip('.')}, shape = {repr(self)})" return waveform raise ShapeInitError @@ -246,7 +230,6 @@ def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: if self.pulse: num_samples = int(np.rint(self.pulse.duration * sampling_rate)) waveform = Waveform(np.zeros(num_samples)) - waveform.serial = f"Envelope_Waveform_Q(num_samples = {num_samples}, amplitude = {format(self.pulse.amplitude, '.6f').rstrip('0').rstrip('.')}, shape = {repr(self)})" return waveform raise ShapeInitError @@ -290,7 +273,6 @@ def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: / (1 + self.g) ) - waveform.serial = f"Envelope_Waveform_I(num_samples = {num_samples}, amplitude = {format(self.pulse.amplitude, '.6f').rstrip('0').rstrip('.')}, shape = {repr(self)})" return waveform raise ShapeInitError @@ -300,7 +282,6 @@ def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: if self.pulse: num_samples = int(np.rint(self.pulse.duration * sampling_rate)) waveform = Waveform(np.zeros(num_samples)) - waveform.serial = f"Envelope_Waveform_Q(num_samples = {num_samples}, amplitude = {format(self.pulse.amplitude, '.6f').rstrip('0').rstrip('.')}, shape = {repr(self)})" return waveform raise ShapeInitError @@ -346,7 +327,6 @@ def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: ) ) ) - waveform.serial = f"Envelope_Waveform_I(num_samples = {num_samples}, amplitude = {format(self.pulse.amplitude, '.6f').rstrip('0').rstrip('.')}, shape = {repr(self)})" return waveform raise ShapeInitError @@ -356,7 +336,6 @@ def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: if self.pulse: num_samples = int(np.rint(self.pulse.duration * sampling_rate)) waveform = Waveform(np.zeros(num_samples)) - waveform.serial = f"Envelope_Waveform_Q(num_samples = {num_samples}, amplitude = {format(self.pulse.amplitude, '.6f').rstrip('0').rstrip('.')}, shape = {repr(self)})" return waveform raise ShapeInitError @@ -416,7 +395,6 @@ def fvec(t, gaussian_samples, rel_sigma, length=None): pulse = fvec(t, gaussian_samples, rel_sigma=self.rel_sigma) waveform = Waveform(self.pulse.amplitude * pulse) - waveform.serial = f"Envelope_Waveform_I(num_samples = {num_samples}, amplitude = {format(self.pulse.amplitude, '.6f').rstrip('0').rstrip('.')}, shape = {repr(self)})" return waveform raise ShapeInitError @@ -427,7 +405,6 @@ def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: if self.pulse: num_samples = int(np.rint(self.pulse.duration * sampling_rate)) waveform = Waveform(np.zeros(num_samples)) - waveform.serial = f"Envelope_Waveform_Q(num_samples = {num_samples}, amplitude = {format(self.pulse.amplitude, '.6f').rstrip('0').rstrip('.')}, shape = {repr(self)})" return waveform raise ShapeInitError @@ -470,7 +447,6 @@ def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: ) ) waveform = Waveform(i) - waveform.serial = f"Envelope_Waveform_I(num_samples = {num_samples}, amplitude = {format(self.pulse.amplitude, '.6f').rstrip('0').rstrip('.')}, shape = {repr(self)})" return waveform raise ShapeInitError @@ -493,7 +469,6 @@ def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: * i ) waveform = Waveform(q) - waveform.serial = f"Envelope_Waveform_Q(num_samples = {num_samples}, amplitude = {format(self.pulse.amplitude, '.6f').rstrip('0').rstrip('.')}, shape = {repr(self)})" return waveform raise ShapeInitError @@ -554,7 +529,6 @@ def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: data = data / np.max(np.abs(data)) data = np.abs(self.pulse.amplitude) * data waveform = Waveform(data) - waveform.serial = f"Envelope_Waveform_I(num_samples = {num_samples}, amplitude = {format(self.pulse.amplitude, '.6f').rstrip('0').rstrip('.')}, shape = {repr(self)})" return waveform raise ShapeInitError @@ -576,7 +550,6 @@ def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: data = data / np.max(np.abs(data)) data = np.abs(self.pulse.amplitude) * data waveform = Waveform(data) - waveform.serial = f"Envelope_Waveform_Q(num_samples = {num_samples}, amplitude = {format(self.pulse.amplitude, '.6f').rstrip('0').rstrip('.')}, shape = {repr(self)})" return waveform raise ShapeInitError @@ -634,7 +607,6 @@ def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: ) ) ) - waveform.serial = f"Envelope_Waveform_I(num_samples = {num_samples}, amplitude = {format(self.pulse.amplitude, '.6f').rstrip('0').rstrip('.')}, shape = {repr(self)})" return waveform raise ShapeInitError @@ -644,7 +616,6 @@ def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: if self.pulse: num_samples = int(np.rint(self.pulse.duration * sampling_rate)) waveform = Waveform(np.zeros(num_samples)) - waveform.serial = f"Envelope_Waveform_Q(num_samples = {num_samples}, amplitude = {format(self.pulse.amplitude, '.6f').rstrip('0').rstrip('.')}, shape = {repr(self)})" return waveform raise ShapeInitError @@ -685,7 +656,6 @@ def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: * (1 + np.tanh(self.alpha * (1 - x / num_samples))) / (1 + np.tanh(self.alpha / 2)) ** 2 ) - waveform.serial = f"Envelope_Waveform_I(num_samples = {num_samples}, amplitude = {format(self.pulse.amplitude, '.6f').rstrip('0').rstrip('.')}, shape = {repr(self)})" return waveform raise ShapeInitError @@ -693,7 +663,6 @@ def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: if self.pulse: num_samples = int(self.pulse.duration * sampling_rate) waveform = Waveform(np.zeros(num_samples)) - waveform.serial = f"Envelope_Waveform_Q(num_samples = {num_samples}, amplitude = {format(self.pulse.amplitude, '.6f').rstrip('0').rstrip('.')}, shape = {repr(self)})" return waveform raise ShapeInitError @@ -722,7 +691,6 @@ def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: num_samples = int(np.rint(self.pulse.duration * sampling_rate)) waveform = Waveform(self.envelope_i * self.pulse.amplitude) - waveform.serial = f"Envelope_Waveform_I(num_samples = {num_samples}, amplitude = {format(self.pulse.amplitude, '.6f').rstrip('0').rstrip('.')}, shape = {repr(self)})" return waveform raise ShapeInitError @@ -735,7 +703,6 @@ def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: num_samples = int(np.rint(self.pulse.duration * sampling_rate)) waveform = Waveform(self.envelope_q * self.pulse.amplitude) - waveform.serial = f"Envelope_Waveform_Q(num_samples = {num_samples}, amplitude = {format(self.pulse.amplitude, '.6f').rstrip('0').rstrip('.')}, shape = {repr(self)})" return waveform raise ShapeInitError @@ -936,7 +903,6 @@ def copy(self): # -> Pulse|ReadoutPulse|DrivePulse|FluxPulse: self.qubit, ) else: - # return eval(self.serial) return Pulse( self.start, self.duration, From 2f76dbcbc5d10ef758d11d112716db4e8a6487cb Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 17 Jan 2024 18:00:44 +0100 Subject: [PATCH 0020/1006] Mock frozen dataclass hash for Pulse --- src/qibolab/pulses.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/qibolab/pulses.py b/src/qibolab/pulses.py index a2a2eb89ac..0f5fa3038e 100644 --- a/src/qibolab/pulses.py +++ b/src/qibolab/pulses.py @@ -41,8 +41,6 @@ class Waveform: Attributes: data (np.ndarray): a numpy array containing the samples. - serial (str): a string that can be used as a lable to identify the waveform. It is not automatically - generated, it must be set by the user. """ DECIMALS = 5 @@ -758,6 +756,17 @@ def __post_init__(self): # TODO: drop the cyclic reference self.shape.pulse = self + def __hash__(self): + """Return hash(self). + + .. todo:: + + this has to be replaced by turning :cls:`Pulse` into a _frozen_ dataclass + """ + return hash( + tuple(getattr(self, f.name) for f in fields(self) if f.name != "shape") + ) + @property def finish(self) -> Optional[int]: """Time when the pulse is scheduled to finish.""" From a41572b2b8e7801a1d1b6e39e0cd6a95060ddeac Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 17 Jan 2024 18:18:27 +0100 Subject: [PATCH 0021/1006] Fix some docstrings related warnings --- src/qibolab/pulses.py | 56 +++++++++++++------------------------------ 1 file changed, 16 insertions(+), 40 deletions(-) diff --git a/src/qibolab/pulses.py b/src/qibolab/pulses.py index 0f5fa3038e..98bd594795 100644 --- a/src/qibolab/pulses.py +++ b/src/qibolab/pulses.py @@ -1231,8 +1231,7 @@ def copy(self): @property def ro_pulses(self): - """Returns a new PulseSequence containing only its readout pulses.""" - + """A new sequence containing only its readout pulses.""" new_pc = PulseSequence() for pulse in self: if pulse.type == PulseType.READOUT: @@ -1241,9 +1240,7 @@ def ro_pulses(self): @property def qd_pulses(self): - """Returns a new PulseSequence containing only its qubit drive - pulses.""" - + """A new sequence containing only its qubit drive pulses.""" new_pc = PulseSequence() for pulse in self: if pulse.type == PulseType.DRIVE: @@ -1252,9 +1249,7 @@ def qd_pulses(self): @property def qf_pulses(self): - """Returns a new PulseSequence containing only its qubit flux - pulses.""" - + """A new sequence containing only its qubit flux pulses.""" new_pc = PulseSequence() for pulse in self: if pulse.type == PulseType.FLUX: @@ -1263,9 +1258,7 @@ def qf_pulses(self): @property def cf_pulses(self): - """Returns a new PulseSequence containing only its coupler flux - pulses.""" - + """A new sequence containing only its coupler flux pulses.""" new_pc = PulseSequence() for pulse in self: if pulse.type is PulseType.COUPLERFLUX: @@ -1273,9 +1266,7 @@ def cf_pulses(self): return new_pc def get_channel_pulses(self, *channels): - """Returns a new PulseSequence containing only the pulses on a specific - set of channels.""" - + """Return a new sequence containing the pulses on some channels.""" new_pc = PulseSequence() for pulse in self: if pulse.channel in channels: @@ -1283,9 +1274,7 @@ def get_channel_pulses(self, *channels): return new_pc def get_qubit_pulses(self, *qubits): - """Returns a new PulseSequence containing only the pulses on a specific - set of qubits.""" - + """Return a new sequence containing the pulses on some qubits.""" new_pc = PulseSequence() for pulse in self: if not isinstance(pulse, CouplerFluxPulse): @@ -1294,9 +1283,7 @@ def get_qubit_pulses(self, *qubits): return new_pc def coupler_pulses(self, *couplers): - """Returns a new PulseSequence containing only the pulses on a specific - set of couplers.""" - + """Return a new sequence containing the pulses on some couplers.""" new_pc = PulseSequence() for pulse in self: if isinstance(pulse, CouplerFluxPulse): @@ -1306,8 +1293,7 @@ def coupler_pulses(self, *couplers): @property def finish(self) -> int: - """Returns the time when the last pulse of the sequence finishes.""" - + """The time when the last pulse of the sequence finishes.""" t: int = 0 for pulse in self: if pulse.finish > t: @@ -1316,8 +1302,7 @@ def finish(self) -> int: @property def start(self) -> int: - """Returns the start time of the first pulse of the sequence.""" - + """The start time of the first pulse of the sequence.""" t = self.finish for pulse in self: if pulse.start < t: @@ -1326,15 +1311,12 @@ def start(self) -> int: @property def duration(self) -> int: - """Returns duration of the sequence calculated as its finish - start times.""" - + """Duration of the sequence calculated as its finish - start times.""" return self.finish - self.start @property def channels(self) -> list: - """Returns list containing the channels used by the pulses in the - sequence.""" - + """List containing the channels used by the pulses in the sequence.""" channels = [] for pulse in self: if not pulse.channel in channels: @@ -1344,9 +1326,7 @@ def channels(self) -> list: @property def qubits(self) -> list: - """Returns list containing the qubits associated with the pulses in the - sequence.""" - + """The qubits associated with the pulses in the sequence.""" qubits = [] for pulse in self: if not pulse.qubit in qubits: @@ -1355,9 +1335,8 @@ def qubits(self) -> list: return qubits def get_pulse_overlaps(self): # -> dict((int,int): PulseSequence): - """Returns a dictionary of slices of time (tuples with start and finish + """Return a dictionary of slices of time (tuples with start and finish times) where pulses overlap.""" - times = [] for pulse in self: if not pulse.start in times: @@ -1375,9 +1354,8 @@ def get_pulse_overlaps(self): # -> dict((int,int): PulseSequence): return overlaps def separate_overlapping_pulses(self): # -> dict((int,int): PulseSequence): - """Separates a sequence of overlapping pulses into a list of non- + """Separate a sequence of overlapping pulses into a list of non- overlapping sequences.""" - # This routine separates the pulses of a sequence into non-overlapping sets # but it does not check if the frequencies of the pulses within a set have the same frequency @@ -1405,8 +1383,7 @@ def separate_overlapping_pulses(self): # -> dict((int,int): PulseSequence): @property def pulses_overlap(self) -> bool: - """Returns True if any of the pulses in the sequence overlap.""" - + """Whether any of the pulses in the sequence overlap.""" overlap = False for pc in self.get_pulse_overlaps().values(): if len(pc) > 1: @@ -1415,12 +1392,11 @@ def pulses_overlap(self) -> bool: return overlap def plot(self, savefig_filename=None, sampling_rate=SAMPLING_RATE): - """Plots the sequence of pulses. + """Plot the sequence of pulses. Args: savefig_filename (str): a file path. If provided the plot is save to a file. """ - if len(self) > 0: import matplotlib.pyplot as plt from matplotlib import gridspec From b2216725e65d5fd5c097be573c0beaf17fa10fd5 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 17 Jan 2024 18:23:57 +0100 Subject: [PATCH 0022/1006] Fix dummy tests, avoid serial check In general, the checks on the serial are quite trivial, just putting the exact same function generating the string that has been used on the other side The only non-trivial part of these tests is the check that the pulse has not been modified after the initialization However, if needed, we'll be able to restore these tests after freezing the dataclasses --- tests/test_dummy.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/tests/test_dummy.py b/tests/test_dummy.py index f0abb0559f..c528304ee0 100644 --- a/tests/test_dummy.py +++ b/tests/test_dummy.py @@ -61,12 +61,6 @@ def test_dummy_execute_coupler_pulse(): options = ExecutionParameters(nshots=None) result = platform.execute_pulse_sequence(sequence, options) - test_pulse = ( - "CouplerFluxPulse(0, 30, 0.05, GaussianSquare(5, 0.75), flux_coupler-0, 0)" - ) - - assert test_pulse == pulse.id - def test_dummy_execute_pulse_sequence_couplers(): platform = create_platform("dummy_couplers") From e423122b32443e1a7c7b106dae88621a47f9c1c1 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 17 Jan 2024 18:29:47 +0100 Subject: [PATCH 0023/1006] Fix pulses tests, mainly dropping those based on the string representation --- tests/test_pulses.py | 101 +++++-------------------------------------- 1 file changed, 10 insertions(+), 91 deletions(-) diff --git a/tests/test_pulses.py b/tests/test_pulses.py index 62238e74e7..c168f65d7a 100644 --- a/tests/test_pulses.py +++ b/tests/test_pulses.py @@ -68,10 +68,7 @@ def test_pulse_init(): type=PulseType.READOUT, qubit=0, ) - assert ( - repr(p0) - == "Pulse(0, 50, 0.9, 20_000_000, 0, Rectangular(), 0, PulseType.READOUT, 0)" - ) + assert p0.relative_phase == 0.0 p1 = Pulse( start=100, @@ -84,10 +81,7 @@ def test_pulse_init(): type=PulseType.READOUT, qubit=0, ) - assert ( - repr(p1) - == "Pulse(100, 50, 0.9, 20_000_000, 0, Rectangular(), 0, PulseType.READOUT, 0)" - ) + assert p1.type is PulseType.READOUT # initialisation with non int (float) frequency p2 = Pulse( @@ -101,10 +95,6 @@ def test_pulse_init(): type=PulseType.READOUT, qubit=0, ) - assert ( - repr(p2) - == "Pulse(0, 50, 0.9, 20_000_000, 0, Rectangular(), 0, PulseType.READOUT, 0)" - ) assert isinstance(p2.frequency, int) and p2.frequency == 20_000_000 # initialisation with non float (int) relative_phase @@ -119,10 +109,6 @@ def test_pulse_init(): type=PulseType.READOUT, qubit=0, ) - assert ( - repr(p3) - == "Pulse(0, 50, 0.9, 20_000_000, 1, Rectangular(), 0, PulseType.READOUT, 0)" - ) assert isinstance(p3.relative_phase, float) and p3.relative_phase == 1.0 # initialisation with str shape @@ -137,10 +123,7 @@ def test_pulse_init(): type=PulseType.READOUT, qubit=0, ) - assert ( - repr(p4) - == "Pulse(0, 50, 0.9, 20_000_000, 0, Rectangular(), 0, PulseType.READOUT, 0)" - ) + assert isinstance(p4.shape, Rectangular) # initialisation with str channel and str qubit p5 = Pulse( @@ -154,10 +137,6 @@ def test_pulse_init(): type=PulseType.READOUT, qubit="qubit0", ) - assert ( - repr(p5) - == "Pulse(0, 50, 0.9, 20_000_000, 0, Rectangular(), channel0, PulseType.READOUT, qubit0)" - ) assert p5.qubit == "qubit0" # initialisation with different frequencies, shapes and types @@ -182,10 +161,6 @@ def test_pulse_init(): type=PulseType.READOUT, qubit=0, ) - assert ( - repr(p12) - == "Pulse(5.5, 34.33, 0.9, 20_000_000, 1, Rectangular(), 0, PulseType.READOUT, 0)" - ) assert isinstance(p12.start, float) assert isinstance(p12.duration, float) assert p12.finish == 5.5 + 34.33 @@ -385,7 +360,8 @@ def test_pulse_aliases(): channel=0, qubit=0, ) - assert repr(rop) == "ReadoutPulse(0, 50, 0.9, 20_000_000, 0, Rectangular(), 0, 0)" + assert rop.start == 0 + assert rop.qubit == 0 dp = DrivePulse( start=0, @@ -397,12 +373,13 @@ def test_pulse_aliases(): channel=0, qubit=0, ) - assert repr(dp) == "DrivePulse(0, 2000, 0.9, 200_000_000, 0, Gaussian(5), 0, 0)" + assert dp.amplitude == 0.9 + assert isinstance(dp.shape, Gaussian) fp = FluxPulse( start=0, duration=300, amplitude=0.9, shape=Rectangular(), channel=0, qubit=0 ) - assert repr(fp) == "FluxPulse(0, 300, 0.9, Rectangular(), 0, 0)" + assert fp.channel == 0 def test_pulsesequence_init(): @@ -570,9 +547,6 @@ def test_waveform(): assert wf1 != wf2 assert wf1 == wf3 np.testing.assert_allclose(wf1.data, wf3.data) - assert hash(wf1) == hash(str(np.around(np.ones(100), Waveform.DECIMALS) + 0)) - wf1.serial = "Serial works as a tag. The user can set is as desired" - assert repr(wf1) == wf1.serial def modulate( @@ -637,23 +611,6 @@ def test_pulseshape_rectangular(): pulse.shape.modulated_waveform_q(sampling_rate).data, mod_q ) - assert ( - pulse.shape.envelope_waveform_i().serial - == f"Envelope_Waveform_I(num_samples = {num_samples}, amplitude = {format(pulse.amplitude, '.6f').rstrip('0').rstrip('.')}, shape = {str(pulse.shape)})" - ) - assert ( - pulse.shape.envelope_waveform_q().serial - == f"Envelope_Waveform_Q(num_samples = {num_samples}, amplitude = {format(pulse.amplitude, '.6f').rstrip('0').rstrip('.')}, shape = {str(pulse.shape)})" - ) - assert ( - pulse.shape.modulated_waveform_i().serial - == f"Modulated_Waveform_I(num_samples = {num_samples}, amplitude = {format(pulse.amplitude, '.6f').rstrip('0').rstrip('.')}, shape = {str(pulse.shape)}, frequency = {format(pulse._if, '_')}, phase = {format(global_phase + pulse.relative_phase, '.6f').rstrip('0').rstrip('.')})" - ) - assert ( - pulse.shape.modulated_waveform_q().serial - == f"Modulated_Waveform_Q(num_samples = {num_samples}, amplitude = {format(pulse.amplitude, '.6f').rstrip('0').rstrip('.')}, shape = {str(pulse.shape)}, frequency = {format(pulse._if, '_')}, phase = {format(global_phase + pulse.relative_phase, '.6f').rstrip('0').rstrip('.')})" - ) - def test_pulseshape_gaussian(): pulse = Pulse( @@ -704,23 +661,6 @@ def test_pulseshape_gaussian(): pulse.shape.modulated_waveform_q(sampling_rate).data, mod_q ) - assert ( - pulse.shape.envelope_waveform_i().serial - == f"Envelope_Waveform_I(num_samples = {num_samples}, amplitude = {format(pulse.amplitude, '.6f').rstrip('0').rstrip('.')}, shape = {str(pulse.shape)})" - ) - assert ( - pulse.shape.envelope_waveform_q().serial - == f"Envelope_Waveform_Q(num_samples = {num_samples}, amplitude = {format(pulse.amplitude, '.6f').rstrip('0').rstrip('.')}, shape = {str(pulse.shape)})" - ) - assert ( - pulse.shape.modulated_waveform_i().serial - == f"Modulated_Waveform_I(num_samples = {num_samples}, amplitude = {format(pulse.amplitude, '.6f').rstrip('0').rstrip('.')}, shape = {str(pulse.shape)}, frequency = {format(pulse._if, '_')}, phase = {format(global_phase + pulse.relative_phase, '.6f').rstrip('0').rstrip('.')})" - ) - assert ( - pulse.shape.modulated_waveform_q().serial - == f"Modulated_Waveform_Q(num_samples = {num_samples}, amplitude = {format(pulse.amplitude, '.6f').rstrip('0').rstrip('.')}, shape = {str(pulse.shape)}, frequency = {format(pulse._if, '_')}, phase = {format(global_phase + pulse.relative_phase, '.6f').rstrip('0').rstrip('.')})" - ) - def test_pulseshape_drag(): pulse = Pulse( @@ -777,23 +717,6 @@ def test_pulseshape_drag(): pulse.shape.modulated_waveform_q(sampling_rate).data, mod_q ) - assert ( - pulse.shape.envelope_waveform_i().serial - == f"Envelope_Waveform_I(num_samples = {num_samples}, amplitude = {format(pulse.amplitude, '.6f').rstrip('0').rstrip('.')}, shape = {str(pulse.shape)})" - ) - assert ( - pulse.shape.envelope_waveform_q().serial - == f"Envelope_Waveform_Q(num_samples = {num_samples}, amplitude = {format(pulse.amplitude, '.6f').rstrip('0').rstrip('.')}, shape = {str(pulse.shape)})" - ) - assert ( - pulse.shape.modulated_waveform_i().serial - == f"Modulated_Waveform_I(num_samples = {num_samples}, amplitude = {format(pulse.amplitude, '.6f').rstrip('0').rstrip('.')}, shape = {str(pulse.shape)}, frequency = {format(pulse._if, '_')}, phase = {format(global_phase + pulse.relative_phase, '.6f').rstrip('0').rstrip('.')})" - ) - assert ( - pulse.shape.modulated_waveform_q().serial - == f"Modulated_Waveform_Q(num_samples = {num_samples}, amplitude = {format(pulse.amplitude, '.6f').rstrip('0').rstrip('.')}, shape = {str(pulse.shape)}, frequency = {format(pulse._if, '_')}, phase = {format(global_phase + pulse.relative_phase, '.6f').rstrip('0').rstrip('.')})" - ) - def test_pulseshape_eq(): """Checks == operator for pulse shapes.""" @@ -873,9 +796,7 @@ def test_pulse(): channel=1, ) - target = f"Pulse({pulse.start}, {pulse.duration}, {format(pulse.amplitude, '.6f').rstrip('0').rstrip('.')}, {format(pulse.frequency, '_')}, {format(pulse.relative_phase, '.6f').rstrip('0').rstrip('.')}, {pulse.shape}, {pulse.channel}, {pulse.type}, {pulse.qubit})" - assert pulse.id == target - assert repr(pulse) == target + assert pulse.duration == duration def test_readout_pulse(): @@ -890,9 +811,7 @@ def test_readout_pulse(): channel=11, ) - target = f"ReadoutPulse({pulse.start}, {pulse.duration}, {format(pulse.amplitude, '.6f').rstrip('0').rstrip('.')}, {format(pulse.frequency, '_')}, {format(pulse.relative_phase, '.6f').rstrip('0').rstrip('.')}, {pulse.shape}, {pulse.channel}, {pulse.qubit})" - assert pulse.id == target - assert repr(pulse) == target + assert pulse.duration == duration def test_pulse_sequence_add_readout(): From 7a6d503793fd02d5ca0f875531a1c6e32166181b Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 17 Jan 2024 18:36:55 +0100 Subject: [PATCH 0024/1006] Fix rfsoc test, mostly broken by programmatic replacements --- tests/test_instruments_rfsoc.py | 56 ++++++++++++++++++++++----------- 1 file changed, 38 insertions(+), 18 deletions(-) diff --git a/tests/test_instruments_rfsoc.py b/tests/test_instruments_rfsoc.py index c4f6b92efe..312ce6f777 100644 --- a/tests/test_instruments_rfsoc.py +++ b/tests/test_instruments_rfsoc.py @@ -389,7 +389,7 @@ def test_play(mocker, dummy_qrc): averaging_mode=AveragingMode.SINGLESHOT, ) results = instrument.play(platform.qubits, platform.couplers, seq, parameters) - assert pulse.id in results.keys() + assert pulse1.id in results.keys() parameters = ExecutionParameters( nshots=nshots, @@ -397,7 +397,7 @@ def test_play(mocker, dummy_qrc): averaging_mode=AveragingMode.SINGLESHOT, ) results = instrument.play(platform.qubits, platform.couplers, seq, parameters) - assert pulse.id in results.keys() + assert pulse1.id in results.keys() parameters = ExecutionParameters( nshots=nshots, @@ -405,7 +405,7 @@ def test_play(mocker, dummy_qrc): averaging_mode=AveragingMode.CYCLIC, ) results = instrument.play(platform.qubits, platform.couplers, seq, parameters) - assert pulse.id in results.keys() + assert pulse1.id in results.keys() def test_sweep(mocker, dummy_qrc): @@ -441,7 +441,7 @@ def test_sweep(mocker, dummy_qrc): results = instrument.sweep( platform.qubits, platform.couplers, seq, parameters, sweeper0, sweeper1 ) - assert pulse.id in results.keys() + assert pulse1.id in results.keys() parameters = ExecutionParameters( nshots=nshots, @@ -451,7 +451,7 @@ def test_sweep(mocker, dummy_qrc): results = instrument.sweep( platform.qubits, platform.couplers, seq, parameters, sweeper0, sweeper1 ) - assert pulse.id in results.keys() + assert pulse1.id in results.keys() parameters = ExecutionParameters( nshots=nshots, @@ -461,7 +461,7 @@ def test_sweep(mocker, dummy_qrc): results = instrument.sweep( platform.qubits, platform.couplers, seq, parameters, sweeper0, sweeper1 ) - assert pulse.id in results.keys() + assert pulse1.id in results.keys() def test_validate_input_command(dummy_qrc): @@ -551,18 +551,22 @@ def test_merge_sweep_results(dummy_qrc): assert targ_dict.keys() == out_dict1.keys() assert ( - out_dict1["serial1"].idize["MSR[V]"] == targ_dict["serial1"].idize["MSR[V]"] + out_dict1["serial1"].serialize["MSR[V]"] + == targ_dict["serial1"].serialize["MSR[V]"] ).all() assert ( - out_dict1["serial1"].idize["MSR[V]"] == targ_dict["serial1"].idize["MSR[V]"] + out_dict1["serial1"].serialize["MSR[V]"] + == targ_dict["serial1"].serialize["MSR[V]"] ).all() assert dict_a.keys() == out_dict2.keys() assert ( - out_dict2["serial1"].idize["MSR[V]"] == dict_a["serial1"].idize["MSR[V]"] + out_dict2["serial1"].serialize["MSR[V]"] + == dict_a["serial1"].serialize["MSR[V]"] ).all() assert ( - out_dict2["serial1"].idize["MSR[V]"] == dict_a["serial1"].idize["MSR[V]"] + out_dict2["serial1"].serialize["MSR[V]"] + == dict_a["serial1"].serialize["MSR[V]"] ).all() @@ -695,10 +699,18 @@ def test_convert_av_sweep_results(dummy_qrc): ), } - assert (out_dict[serial1].idize["i[V]"] == targ_dict[serial1].idize["i[V]"]).all() - assert (out_dict[serial1].idize["q[V]"] == targ_dict[serial1].idize["q[V]"]).all() - assert (out_dict[serial2].idize["i[V]"] == targ_dict[serial2].idize["i[V]"]).all() - assert (out_dict[serial2].idize["q[V]"] == targ_dict[serial2].idize["q[V]"]).all() + assert ( + out_dict[serial1].serialize["i[V]"] == targ_dict[serial1].serialize["i[V]"] + ).all() + assert ( + out_dict[serial1].serialize["q[V]"] == targ_dict[serial1].serialize["q[V]"] + ).all() + assert ( + out_dict[serial2].serialize["i[V]"] == targ_dict[serial2].serialize["i[V]"] + ).all() + assert ( + out_dict[serial2].serialize["q[V]"] == targ_dict[serial2].serialize["q[V]"] + ).all() def test_convert_nav_sweep_results(dummy_qrc): @@ -740,10 +752,18 @@ def test_convert_nav_sweep_results(dummy_qrc): ), } - assert (out_dict[serial1].idize["i[V]"] == targ_dict[serial1].idize["i[V]"]).all() - assert (out_dict[serial1].idize["q[V]"] == targ_dict[serial1].idize["q[V]"]).all() - assert (out_dict[serial2].idize["i[V]"] == targ_dict[serial2].idize["i[V]"]).all() - assert (out_dict[serial2].idize["q[V]"] == targ_dict[serial2].idize["q[V]"]).all() + assert ( + out_dict[serial1].serialize["i[V]"] == targ_dict[serial1].serialize["i[V]"] + ).all() + assert ( + out_dict[serial1].serialize["q[V]"] == targ_dict[serial1].serialize["q[V]"] + ).all() + assert ( + out_dict[serial2].serialize["i[V]"] == targ_dict[serial2].serialize["i[V]"] + ).all() + assert ( + out_dict[serial2].serialize["q[V]"] == targ_dict[serial2].serialize["q[V]"] + ).all() @pytest.fixture(scope="module") From 2defff83cea50ddefbae39ec39bea0d12d1abefd Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 17 Jan 2024 18:48:07 +0100 Subject: [PATCH 0025/1006] Replace waveform.serial with underlying data hash --- src/qibolab/instruments/qm/config.py | 2 +- src/qibolab/instruments/qm/sweepers.py | 2 +- src/qibolab/pulses.py | 16 ++++++++-------- tests/test_instruments_qm.py | 4 ++-- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/qibolab/instruments/qm/config.py b/src/qibolab/instruments/qm/config.py index 41c1f3e4af..04beb8bc6d 100644 --- a/src/qibolab/instruments/qm/config.py +++ b/src/qibolab/instruments/qm/config.py @@ -346,7 +346,7 @@ def register_waveform(self, pulse, mode="i"): self.waveforms[serial] = {"type": "constant", "sample": pulse.amplitude} else: waveform = getattr(pulse, f"envelope_waveform_{mode}")(SAMPLING_RATE) - serial = waveform.serial + serial = hash(waveform) if serial not in self.waveforms: self.waveforms[serial] = { "type": "arbitrary", diff --git a/src/qibolab/instruments/qm/sweepers.py b/src/qibolab/instruments/qm/sweepers.py index 1e35e71feb..2ccd91ff57 100644 --- a/src/qibolab/instruments/qm/sweepers.py +++ b/src/qibolab/instruments/qm/sweepers.py @@ -29,7 +29,7 @@ def maximum_sweep_value(values, value0): def _update_baked_pulses(sweeper, qmsequence, config): """Updates baked pulse if duration sweeper is used.""" - qmpulse = qmsequence.pulse_to_qmpulse[sweeper.pulses[0].serial] + qmpulse = qmsequence.pulse_to_qmpulse[sweeper.pulses[0].id] is_baked = isinstance(qmpulse, BakedPulse) for pulse in sweeper.pulses: qmpulse = qmsequence.pulse_to_qmpulse[pulse.id] diff --git a/src/qibolab/pulses.py b/src/qibolab/pulses.py index 98bd594795..ff0ddb7e30 100644 --- a/src/qibolab/pulses.py +++ b/src/qibolab/pulses.py @@ -46,31 +46,31 @@ class Waveform: DECIMALS = 5 def __init__(self, data): - """Initialises the waveform with a of samples.""" - + """Initialise the waveform with a of samples.""" self.data: np.ndarray = np.array(data) def __len__(self): - """Returns the length of the waveform, the number of samples.""" - + """Return the length of the waveform, the number of samples.""" return len(self.data) + def __hash__(self): + """Hash the underlying data.""" + return hash(self.data.tobytes()) + def __eq__(self, other): - """Compares two waveforms. + """Compare two waveforms. Two waveforms are considered equal if their samples, rounded to `Waveform.DECIMALS` decimal places, are all equal. """ - return np.allclose(self.data, other.data) def plot(self, savefig_filename=None): - """Plots the waveform. + """Plot the waveform. Args: savefig_filename (str): a file path. If provided the plot is save to a file. """ - import matplotlib.pyplot as plt plt.figure(figsize=(14, 5), dpi=200) diff --git a/tests/test_instruments_qm.py b/tests/test_instruments_qm.py index 33f61c23c6..1ce44d8e68 100644 --- a/tests/test_instruments_qm.py +++ b/tests/test_instruments_qm.py @@ -306,8 +306,8 @@ def test_qm_register_pulse(qmplatform, pulse_type, qubit): "length": pulse.duration, "digital_marker": "ON", "waveforms": { - "I": pulse.envelope_waveform_i().serial, - "Q": pulse.envelope_waveform_q().serial, + "I": hash(pulse.envelope_waveform_i()), + "Q": hash(pulse.envelope_waveform_q()), }, } From 0deefaa4b78d42e489d8596ca5b976c53b43ef22 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 17 Jan 2024 18:56:42 +0100 Subject: [PATCH 0026/1006] Add note about waveform hash (lacking) reliability --- src/qibolab/pulses.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/qibolab/pulses.py b/src/qibolab/pulses.py index ff0ddb7e30..fd3ddf9867 100644 --- a/src/qibolab/pulses.py +++ b/src/qibolab/pulses.py @@ -54,7 +54,14 @@ def __len__(self): return len(self.data) def __hash__(self): - """Hash the underlying data.""" + """Hash the underlying data. + + .. todo:: + + In order to make this reliable, we should set the data as immutable. This we + could by making both the class frozen and the contained array readonly + https://numpy.org/doc/stable/reference/generated/numpy.ndarray.flags.html#numpy.ndarray.flags + """ return hash(self.data.tobytes()) def __eq__(self, other): From 44a9f8345a6a5af2936db8172334d5084769dbdf Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 17 Jan 2024 19:17:35 +0100 Subject: [PATCH 0027/1006] Fix QM issues by stringifying pulses ID QM requires some keys to be strings, because of the way they are later processed. And before they were (by accident, since we were using the serial as an identifier). --- src/qibolab/instruments/qm/sweepers.py | 2 +- tests/test_instruments_qm.py | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/qibolab/instruments/qm/sweepers.py b/src/qibolab/instruments/qm/sweepers.py index 2ccd91ff57..e745d6bde8 100644 --- a/src/qibolab/instruments/qm/sweepers.py +++ b/src/qibolab/instruments/qm/sweepers.py @@ -182,7 +182,7 @@ def _sweep_start(sweepers, qubits, qmsequence, relaxation_time): def _sweep_duration(sweepers, qubits, qmsequence, relaxation_time): sweeper = sweepers[0] - qmpulse = qmsequence.pulse_to_qmpulse[sweeper.pulses[0].serial] + qmpulse = qmsequence.pulse_to_qmpulse[sweeper.pulses[0].id] if isinstance(qmpulse, BakedPulse): values = np.array(sweeper.values).astype(int) else: diff --git a/tests/test_instruments_qm.py b/tests/test_instruments_qm.py index 1ce44d8e68..63f3db384b 100644 --- a/tests/test_instruments_qm.py +++ b/tests/test_instruments_qm.py @@ -325,8 +325,21 @@ def test_qm_register_pulse(qmplatform, pulse_type, qubit): }, } +<<<<<<< HEAD controller.config.register_element( platform.qubits[qubit], pulse, controller.time_of_flight, controller.smearing +======= + opx.config.register_element( + platform.qubits[qubit], pulse, opx.time_of_flight, opx.smearing + ) + opx.config.register_pulse(platform.qubits[qubit], pulse) + assert opx.config.pulses[str(pulse.id)] == target_pulse + assert target_pulse["waveforms"]["I"] in opx.config.waveforms + assert target_pulse["waveforms"]["Q"] in opx.config.waveforms + assert ( + opx.config.elements[f"{pulse_type}{qubit}"]["operations"][str(pulse.id)] + == pulse.id +>>>>>>> 5f1fb614 (Fix QM issues by stringifying pulses ID) ) qmpulse = QMPulse(pulse) controller.config.register_pulse(platform.qubits[qubit], qmpulse) @@ -347,11 +360,19 @@ def test_qm_register_flux_pulse(qmplatform): "length": pulse.duration, "waveforms": {"single": "constant_wf0.005"}, } +<<<<<<< HEAD qmpulse = QMPulse(pulse) controller.config.register_element(platform.qubits[qubit], pulse) controller.config.register_pulse(platform.qubits[qubit], qmpulse) assert controller.config.pulses[qmpulse.operation] == target_pulse assert target_pulse["waveforms"]["single"] in controller.config.waveforms +======= + opx.config.register_element(platform.qubits[qubit], pulse) + opx.config.register_pulse(platform.qubits[qubit], pulse) + assert opx.config.pulses[str(pulse.id)] == target_pulse + assert target_pulse["waveforms"]["single"] in opx.config.waveforms + assert opx.config.elements[f"flux{qubit}"]["operations"][str(pulse.id)] == pulse.id +>>>>>>> 5f1fb614 (Fix QM issues by stringifying pulses ID) def test_qm_register_pulses_with_different_frequencies(qmplatform): From a9bebad27626daef4158858026ea93127b6c49f7 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 17 Jan 2024 19:21:10 +0100 Subject: [PATCH 0028/1006] Drop serial from pulse subclasses --- src/qibolab/pulses.py | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/qibolab/pulses.py b/src/qibolab/pulses.py index fd3ddf9867..1c969cc5a3 100644 --- a/src/qibolab/pulses.py +++ b/src/qibolab/pulses.py @@ -1093,10 +1093,6 @@ def __init__( qubit=qubit, ) - @property - def serial(self): - return f"ReadoutPulse({self.start}, {self.duration}, {format(self.amplitude, '.6f').rstrip('0').rstrip('.')}, {format(self.frequency, '_')}, {format(self.relative_phase, '.6f').rstrip('0').rstrip('.')}, {self.shape}, {self.channel}, {self.qubit})" - @property def global_phase(self): # readout pulses should have zero global phase so that we can @@ -1148,10 +1144,6 @@ def __init__( qubit=qubit, ) - @property - def serial(self): - return f"DrivePulse({self.start}, {self.duration}, {format(self.amplitude, '.6f').rstrip('0').rstrip('.')}, {format(self.frequency, '_')}, {format(self.relative_phase, '.6f').rstrip('0').rstrip('.')}, {self.shape}, {self.channel}, {self.qubit})" - class FluxPulse(Pulse): """Describes a qubit flux pulse. @@ -1186,10 +1178,6 @@ def modulated_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: def modulated_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: return self.shape.envelope_waveform_i(sampling_rate) - @property - def serial(self): - return f"{self.__class__.__name__}({self.start}, {self.duration}, {format(self.amplitude, '.6f').rstrip('0').rstrip('.')}, {self.shape}, {self.channel}, {self.qubit})" - class CouplerFluxPulse(FluxPulse): """Describes a coupler flux pulse. From 3a163401950487c08522d5e3f363c6a23a54fed2 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 17 Jan 2024 19:22:50 +0100 Subject: [PATCH 0029/1006] Remove duplicated hash method --- src/qibolab/pulses.py | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/qibolab/pulses.py b/src/qibolab/pulses.py index 1c969cc5a3..8fa3bc7c72 100644 --- a/src/qibolab/pulses.py +++ b/src/qibolab/pulses.py @@ -763,17 +763,6 @@ def __post_init__(self): # TODO: drop the cyclic reference self.shape.pulse = self - def __hash__(self): - """Return hash(self). - - .. todo:: - - this has to be replaced by turning :cls:`Pulse` into a _frozen_ dataclass - """ - return hash( - tuple(getattr(self, f.name) for f in fields(self) if f.name != "shape") - ) - @property def finish(self) -> Optional[int]: """Time when the pulse is scheduled to finish.""" From 4853f4b5b69aca74b52fb008272f175ed477cb31 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 18 Jan 2024 14:16:08 +0100 Subject: [PATCH 0030/1006] Drop Pulse subclasses --- src/qibolab/pulses.py | 141 ++---------------------------------------- 1 file changed, 4 insertions(+), 137 deletions(-) diff --git a/src/qibolab/pulses.py b/src/qibolab/pulses.py index 8fa3bc7c72..7c96c6f228 100644 --- a/src/qibolab/pulses.py +++ b/src/qibolab/pulses.py @@ -1,6 +1,4 @@ """Pulse and PulseSequence classes.""" - -import copy import re from abc import ABC, abstractmethod from dataclasses import dataclass, fields @@ -777,6 +775,10 @@ def global_phase(self): This phase is calculated from the pulse start time and frequency as `2 * pi * frequency * start`. """ + if self.type is PulseType.READOUT: + # readout pulses should have zero global phase so that we can + # calculate probabilities in the i-q plane + return 0 # pulse start, duration and finish are in ns return 2 * np.pi * self.frequency * self.start / 1e9 @@ -1052,141 +1054,6 @@ def plot(self, savefig_filename=None, sampling_rate=SAMPLING_RATE): plt.close() -class ReadoutPulse(Pulse): - """Describes a readout pulse. - - See - :class: `qibolab.pulses.Pulse` for argument desciption. - """ - - def __init__( - self, - start, - duration, - amplitude, - frequency, - relative_phase, - shape, - channel=0, - qubit=0, - ): - super().__init__( - start, - duration, - amplitude, - frequency, - relative_phase, - shape, - channel, - type=PulseType.READOUT, - qubit=qubit, - ) - - @property - def global_phase(self): - # readout pulses should have zero global phase so that we can - # calculate probabilities in the i-q plane - return 0 - - def copy(self): # -> Pulse|ReadoutPulse|DrivePulse|FluxPulse: - """Returns a new Pulse object with the same attributes.""" - - return ReadoutPulse( - self.start, - self.duration, - self.amplitude, - self.frequency, - self.relative_phase, - copy.deepcopy(self.shape), # self.shape, - self.channel, - self.qubit, - ) - - -class DrivePulse(Pulse): - """Describes a qubit drive pulse. - - See - :class: `qibolab.pulses.Pulse` for argument desciption. - """ - - def __init__( - self, - start, - duration, - amplitude, - frequency, - relative_phase, - shape, - channel=0, - qubit=0, - ): - super().__init__( - start, - duration, - amplitude, - frequency, - relative_phase, - shape, - channel, - type=PulseType.DRIVE, - qubit=qubit, - ) - - -class FluxPulse(Pulse): - """Describes a qubit flux pulse. - - Flux pulses have frequency and relative_phase equal to 0. Their i - and q components are equal. See - :class: `qibolab.pulses.Pulse` for argument desciption. - """ - - PULSE_TYPE = PulseType.FLUX - - def __init__(self, start, duration, amplitude, shape, channel=0, qubit=0): - super().__init__( - start, - duration, - amplitude, - 0, - 0, - shape, - channel, - type=self.PULSE_TYPE, - qubit=qubit, - ) - - def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: - """Flux pulses only have i component.""" - return self.shape.envelope_waveform_i(sampling_rate) - - def modulated_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: - return self.shape.envelope_waveform_i(sampling_rate) - - def modulated_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: - return self.shape.envelope_waveform_i(sampling_rate) - - -class CouplerFluxPulse(FluxPulse): - """Describes a coupler flux pulse. - - See - :class: `qibolab.pulses.FluxPulse` for argument desciption. - """ - - PULSE_TYPE = PulseType.COUPLERFLUX - - -class PulseConstructor(Enum): - """An enumeration to map each ``PulseType`` to the proper pulse - constructor.""" - - READOUT = ReadoutPulse - DRIVE = DrivePulse - FLUX = FluxPulse - - class PulseSequence(list): """A collection of scheduled pulses. From 336661fc159e3c3e0b72dc8ea3150e4ed698d1af Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 18 Jan 2024 14:16:40 +0100 Subject: [PATCH 0031/1006] Introduce alternative (simplified) constructor for flux pulses --- src/qibolab/pulses.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/qibolab/pulses.py b/src/qibolab/pulses.py index 7c96c6f228..6de1192b7a 100644 --- a/src/qibolab/pulses.py +++ b/src/qibolab/pulses.py @@ -761,6 +761,10 @@ def __post_init__(self): # TODO: drop the cyclic reference self.shape.pulse = self + @classmethod + def flux(cls, start, duration, amplitude, shape, **kwargs): + return cls(start, duration, amplitude, 0, 0, shape, **kwargs) + @property def finish(self) -> Optional[int]: """Time when the pulse is scheduled to finish.""" From 0f4154e8e116f6d55ee8aa34616bf8c5d5b0483c Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 18 Jan 2024 14:17:45 +0100 Subject: [PATCH 0032/1006] Replace usage of pulse subclasses (import related) Minimal replacement, such that pytest can at least report --- src/qibolab/compilers/compiler.py | 4 ++-- src/qibolab/native.py | 10 ++-------- src/qibolab/platform/platform.py | 15 +-------------- tests/test_pulses.py | 3 --- 4 files changed, 5 insertions(+), 27 deletions(-) diff --git a/src/qibolab/compilers/compiler.py b/src/qibolab/compilers/compiler.py index ded9b11bfa..905d5e80c5 100644 --- a/src/qibolab/compilers/compiler.py +++ b/src/qibolab/compilers/compiler.py @@ -15,7 +15,7 @@ u3_rule, z_rule, ) -from qibolab.pulses import PulseSequence, ReadoutPulse +from qibolab.pulses import PulseSequence, PulseType @dataclass @@ -119,7 +119,7 @@ def _compile_gate( # shift start time and phase according to the global sequence for pulse in gate_sequence: pulse.start += start - if not isinstance(pulse, ReadoutPulse): + if pulse is not PulseType.READOUT: pulse.relative_phase += virtual_z_phases[pulse.qubit] sequence.append(pulse) diff --git a/src/qibolab/native.py b/src/qibolab/native.py index 6f2bcf27d9..ac5e52b5b3 100644 --- a/src/qibolab/native.py +++ b/src/qibolab/native.py @@ -2,13 +2,7 @@ from dataclasses import dataclass, field, fields, replace from typing import List, Optional, Union -from qibolab.pulses import ( - CouplerFluxPulse, - FluxPulse, - PulseConstructor, - PulseSequence, - PulseType, -) +from qibolab.pulses import Pulse, PulseSequence, PulseType @dataclass @@ -79,7 +73,7 @@ def pulse(self, start, relative_phase=0.0): or :class:`qibolab.pulses.FluxPulse` with the pulse parameters of the gate. """ if self.pulse_type is PulseType.FLUX: - return FluxPulse( + return Pulse.flux( start + self.relative_start, self.duration, self.amplitude, diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index ef2e51af34..bf237668db 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -48,7 +48,7 @@ def unroll_sequences( new_pulse = pulse.copy() new_pulse.start += start total_sequence.append(new_pulse) - if isinstance(pulse, ReadoutPulse): + if pulse.type is PulseType.READOUT: readout_map[pulse.id].append(new_pulse.id) start = total_sequence.finish + relaxation_time return total_sequence, readout_map @@ -385,19 +385,6 @@ def create_qubit_readout_pulse(self, qubit, start): qubit = self.get_qubit(qubit) return self.create_MZ_pulse(qubit, start) - def create_qubit_flux_pulse(self, qubit, start, duration, amplitude=1): - qubit = self.get_qubit(qubit) - pulse = FluxPulse( - start=start, - duration=duration, - amplitude=amplitude, - shape="Rectangular", - channel=self.qubits[qubit].flux.name, - qubit=qubit, - ) - pulse.duration = duration - return pulse - def create_coupler_pulse(self, coupler, start, duration=None, amplitude=None): coupler = self.get_coupler(coupler) pulse = self.couplers[coupler].native_pulse.CP.pulse(start) diff --git a/tests/test_pulses.py b/tests/test_pulses.py index c168f65d7a..e59e18c263 100644 --- a/tests/test_pulses.py +++ b/tests/test_pulses.py @@ -11,15 +11,12 @@ SNZ, Custom, Drag, - DrivePulse, - FluxPulse, Gaussian, GaussianSquare, Pulse, PulseSequence, PulseShape, PulseType, - ReadoutPulse, Rectangular, ShapeInitError, Waveform, From 599cf8e825901e56853e7139f62761591f9eeb19 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 18 Jan 2024 14:24:37 +0100 Subject: [PATCH 0033/1006] Strip all imports of removed objects --- src/qibolab/pulses.py | 4 +- tests/test_dummy.py | 2 +- .../test_instruments_qblox_cluster_qcm_bb.py | 2 +- .../test_instruments_qblox_cluster_qcm_rf.py | 2 +- .../test_instruments_qblox_cluster_qrm_rf.py | 2 +- tests/test_instruments_qm.py | 44 +++++-------------- tests/test_instruments_qmsim.py | 8 ++-- 7 files changed, 23 insertions(+), 41 deletions(-) diff --git a/src/qibolab/pulses.py b/src/qibolab/pulses.py index 6de1192b7a..fdce0ce9a6 100644 --- a/src/qibolab/pulses.py +++ b/src/qibolab/pulses.py @@ -763,7 +763,9 @@ def __post_init__(self): @classmethod def flux(cls, start, duration, amplitude, shape, **kwargs): - return cls(start, duration, amplitude, 0, 0, shape, **kwargs) + return cls( + start, duration, amplitude, 0, 0, shape, type=PulseType.FLUX, **kwargs + ) @property def finish(self) -> Optional[int]: diff --git a/tests/test_dummy.py b/tests/test_dummy.py index c528304ee0..4aa828731e 100644 --- a/tests/test_dummy.py +++ b/tests/test_dummy.py @@ -2,7 +2,7 @@ import pytest from qibolab import AcquisitionType, AveragingMode, ExecutionParameters, create_platform -from qibolab.pulses import CouplerFluxPulse, PulseSequence +from qibolab.pulses import PulseSequence from qibolab.qubits import QubitPair from qibolab.sweeper import Parameter, QubitParameter, Sweeper diff --git a/tests/test_instruments_qblox_cluster_qcm_bb.py b/tests/test_instruments_qblox_cluster_qcm_bb.py index d6f7309d1b..cf1c8d6430 100644 --- a/tests/test_instruments_qblox_cluster_qcm_bb.py +++ b/tests/test_instruments_qblox_cluster_qcm_bb.py @@ -6,7 +6,7 @@ from qibolab.instruments.abstract import Instrument from qibolab.instruments.qblox.cluster_qcm_bb import QcmBb from qibolab.instruments.qblox.port import QbloxOutputPort -from qibolab.pulses import FluxPulse, PulseSequence +from qibolab.pulses import PulseSequence from qibolab.sweeper import Parameter, Sweeper, SweeperType from .qblox_fixtures import connected_controller, controller diff --git a/tests/test_instruments_qblox_cluster_qcm_rf.py b/tests/test_instruments_qblox_cluster_qcm_rf.py index f7926d6d93..468eadd350 100644 --- a/tests/test_instruments_qblox_cluster_qcm_rf.py +++ b/tests/test_instruments_qblox_cluster_qcm_rf.py @@ -4,7 +4,7 @@ from qibolab.instruments.abstract import Instrument from qibolab.instruments.qblox.cluster_qcm_rf import QcmRf from qibolab.instruments.qblox.port import QbloxOutputPort -from qibolab.pulses import DrivePulse, PulseSequence +from qibolab.pulses import PulseSequence from qibolab.sweeper import Parameter, Sweeper, SweeperType from .qblox_fixtures import connected_controller, controller diff --git a/tests/test_instruments_qblox_cluster_qrm_rf.py b/tests/test_instruments_qblox_cluster_qrm_rf.py index eb7b6adcd5..86199ab603 100644 --- a/tests/test_instruments_qblox_cluster_qrm_rf.py +++ b/tests/test_instruments_qblox_cluster_qrm_rf.py @@ -4,7 +4,7 @@ from qibolab.instruments.abstract import Instrument from qibolab.instruments.qblox.cluster_qrm_rf import QrmRf from qibolab.instruments.qblox.port import QbloxInputPort, QbloxOutputPort -from qibolab.pulses import DrivePulse, PulseSequence, ReadoutPulse +from qibolab.pulses import PulseSequence from qibolab.sweeper import Parameter, Sweeper, SweeperType from .qblox_fixtures import connected_controller, controller diff --git a/tests/test_instruments_qm.py b/tests/test_instruments_qm.py index 63f3db384b..154ca3ec95 100644 --- a/tests/test_instruments_qm.py +++ b/tests/test_instruments_qm.py @@ -9,7 +9,7 @@ from qibolab.instruments.qm.acquisition import Acquisition, declare_acquisitions from qibolab.instruments.qm.controller import controllers_config from qibolab.instruments.qm.sequence import BakedPulse, QMPulse, Sequence -from qibolab.pulses import FluxPulse, Pulse, PulseSequence, ReadoutPulse, Rectangular +from qibolab.pulses import Pulse, PulseType, PulseSequence, Rectangular from qibolab.qubits import Qubit from qibolab.sweeper import Parameter, Sweeper @@ -54,8 +54,8 @@ def test_qmpulse_declare_output(acquisition_type): def test_qmsequence(): - qd_pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), "ch0", qubit=0) - ro_pulse = ReadoutPulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), "ch1", qubit=0) + qd_pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), "ch0", PulseType.DRIVE, qubit=0) + ro_pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), "ch1", PulseType.READOUT, qubit=0) qmsequence = Sequence() with pytest.raises(AttributeError): qmsequence.add("test") @@ -80,7 +80,7 @@ def test_qmpulse_previous_and_next(): qmsequence.add(qd_pulse) for qubit in range(nqubits): ro_pulse = QMPulse( - ReadoutPulse( + Pulse( 40, 100, 0.05, @@ -88,6 +88,7 @@ def test_qmpulse_previous_and_next(): 0.0, Rectangular(), f"readout{qubit}", + PulseType.READOUT, qubit=qubit, ) ) @@ -102,7 +103,7 @@ def test_qmpulse_previous_and_next(): def test_qmpulse_previous_and_next_flux(): y90_pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), f"drive1", qubit=1) x_pulse_start = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), f"drive2", qubit=2) - flux_pulse = FluxPulse( + flux_pulse = Pulse.flux( start=y90_pulse.finish, duration=30, amplitude=0.055, @@ -113,11 +114,11 @@ def test_qmpulse_previous_and_next_flux(): theta_pulse = Pulse(70, 40, 0.05, int(3e9), 0.0, Rectangular(), f"drive1", qubit=1) x_pulse_end = Pulse(70, 40, 0.05, int(3e9), 0.0, Rectangular(), f"drive2", qubit=2) - measure_lowfreq = ReadoutPulse( - 110, 100, 0.05, int(3e9), 0.0, Rectangular(), "readout1", qubit=1 + measure_lowfreq = Pulse( + 110, 100, 0.05, int(3e9), 0.0, Rectangular(), "readout1", PulseType.READOUT, qubit=1 ) - measure_highfreq = ReadoutPulse( - 110, 100, 0.05, int(3e9), 0.0, Rectangular(), "readout2", qubit=2 + measure_highfreq = Pulse( + 110, 100, 0.05, int(3e9), 0.0, Rectangular(), "readout2", PulseType.READOUT, qubit=2 ) drive11 = QMPulse(y90_pulse) @@ -325,21 +326,8 @@ def test_qm_register_pulse(qmplatform, pulse_type, qubit): }, } -<<<<<<< HEAD controller.config.register_element( platform.qubits[qubit], pulse, controller.time_of_flight, controller.smearing -======= - opx.config.register_element( - platform.qubits[qubit], pulse, opx.time_of_flight, opx.smearing - ) - opx.config.register_pulse(platform.qubits[qubit], pulse) - assert opx.config.pulses[str(pulse.id)] == target_pulse - assert target_pulse["waveforms"]["I"] in opx.config.waveforms - assert target_pulse["waveforms"]["Q"] in opx.config.waveforms - assert ( - opx.config.elements[f"{pulse_type}{qubit}"]["operations"][str(pulse.id)] - == pulse.id ->>>>>>> 5f1fb614 (Fix QM issues by stringifying pulses ID) ) qmpulse = QMPulse(pulse) controller.config.register_pulse(platform.qubits[qubit], qmpulse) @@ -352,7 +340,7 @@ def test_qm_register_flux_pulse(qmplatform): qubit = 2 platform = qmplatform controller = platform.instruments["qm"] - pulse = FluxPulse( + pulse = Pulse.flux( 0, 30, 0.005, Rectangular(), platform.qubits[qubit].flux.name, qubit ) target_pulse = { @@ -360,19 +348,11 @@ def test_qm_register_flux_pulse(qmplatform): "length": pulse.duration, "waveforms": {"single": "constant_wf0.005"}, } -<<<<<<< HEAD qmpulse = QMPulse(pulse) controller.config.register_element(platform.qubits[qubit], pulse) controller.config.register_pulse(platform.qubits[qubit], qmpulse) assert controller.config.pulses[qmpulse.operation] == target_pulse assert target_pulse["waveforms"]["single"] in controller.config.waveforms -======= - opx.config.register_element(platform.qubits[qubit], pulse) - opx.config.register_pulse(platform.qubits[qubit], pulse) - assert opx.config.pulses[str(pulse.id)] == target_pulse - assert target_pulse["waveforms"]["single"] in opx.config.waveforms - assert opx.config.elements[f"flux{qubit}"]["operations"][str(pulse.id)] == pulse.id ->>>>>>> 5f1fb614 (Fix QM issues by stringifying pulses ID) def test_qm_register_pulses_with_different_frequencies(qmplatform): @@ -427,7 +407,7 @@ def test_qm_register_baked_pulse(qmplatform, duration): qubit = platform.qubits[3] controller = platform.instruments["qm"] controller.config.register_flux_element(qubit) - pulse = FluxPulse( + pulse = Pulse.flux( 3, duration, 0.05, Rectangular(), qubit.flux.name, qubit=qubit.name ) qmpulse = BakedPulse(pulse) diff --git a/tests/test_instruments_qmsim.py b/tests/test_instruments_qmsim.py index 8488621d59..9c20eaac9d 100644 --- a/tests/test_instruments_qmsim.py +++ b/tests/test_instruments_qmsim.py @@ -23,7 +23,7 @@ from qibolab import AcquisitionType, AveragingMode, ExecutionParameters, create_platform from qibolab.backends import QibolabBackend -from qibolab.pulses import SNZ, FluxPulse, PulseSequence, Rectangular +from qibolab.pulses import Pulse, SNZ, PulseSequence, Rectangular from qibolab.sweeper import Parameter, Sweeper from .conftest import set_platform_profile @@ -388,7 +388,7 @@ def test_qmsim_chevron(simulator, folder, sweep): lowfreq, highfreq = 1, 2 initialize_1 = simulator.create_RX_pulse(lowfreq, start=0, relative_phase=0) initialize_2 = simulator.create_RX_pulse(highfreq, start=0, relative_phase=0) - flux_pulse = FluxPulse( + flux_pulse = Pulse.flux( start=initialize_2.finish, duration=31, amplitude=0.05, @@ -439,7 +439,7 @@ def test_qmsim_tune_landscape(simulator, folder, qubits, use_flux_pulse): y90_pulse = simulator.create_RX90_pulse(lowfreq, start=0, relative_phase=np.pi / 2) x_pulse_start = simulator.create_RX_pulse(highfreq, start=0, relative_phase=0) if use_flux_pulse: - flux_pulse = FluxPulse( + flux_pulse = Pulse.flux( start=y90_pulse.finish, duration=30, amplitude=0.055, @@ -492,7 +492,7 @@ def test_qmsim_snz_pulse(simulator, folder, qubit): shape = SNZ(t_half_flux_pulse=duration // 2, b_amplitude=2) channel = simulator.qubits[qubit].flux.name qd_pulse = simulator.create_RX_pulse(qubit, start=0) - flux_pulse = FluxPulse(qd_pulse.finish, duration, amplitude, shape, channel, qubit) + flux_pulse = Pulse.flux(qd_pulse.finish, duration, amplitude, shape, channel, qubit) ro_pulse = simulator.create_MZ_pulse(qubit, start=flux_pulse.finish) sequence.append(qd_pulse) sequence.append(flux_pulse) From b0a49955f0a5a6b2aaf433553af209d0520bf890 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 18 Jan 2024 14:29:54 +0100 Subject: [PATCH 0034/1006] Fix backends test, remove explicit copy methods To copy, both shallow and deep, just use the dedicated standard library module --- src/qibolab/native.py | 6 +-- src/qibolab/platform/platform.py | 4 +- src/qibolab/pulses.py | 65 +------------------------------- 3 files changed, 7 insertions(+), 68 deletions(-) diff --git a/src/qibolab/native.py b/src/qibolab/native.py index ac5e52b5b3..2148a91e96 100644 --- a/src/qibolab/native.py +++ b/src/qibolab/native.py @@ -82,16 +82,16 @@ def pulse(self, start, relative_phase=0.0): qubit=self.qubit.name, ) - pulse_cls = PulseConstructor[self.pulse_type.name].value channel = getattr(self.qubit, self.pulse_type.name.lower()).name - return pulse_cls( + return Pulse( start + self.relative_start, self.duration, self.amplitude, self.frequency, relative_phase, self.shape, - channel, + type=self.pulse_type, + channel=channel, qubit=self.qubit.name, ) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index bf237668db..60af19d9a3 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -1,5 +1,5 @@ """A platform for executing quantum algorithms.""" - +import copy from collections import defaultdict from dataclasses import dataclass, field, replace from typing import Dict, List, Optional, Tuple @@ -45,7 +45,7 @@ def unroll_sequences( start = 0 for sequence in sequences: for pulse in sequence: - new_pulse = pulse.copy() + new_pulse = copy.deepcopy(pulse) new_pulse.start += start total_sequence.append(new_pulse) if pulse.type is PulseType.READOUT: diff --git a/src/qibolab/pulses.py b/src/qibolab/pulses.py index fdce0ce9a6..da7d98c3cb 100644 --- a/src/qibolab/pulses.py +++ b/src/qibolab/pulses.py @@ -880,67 +880,6 @@ def __mul__(self, n): def __rmul__(self, n): return self.__mul__(n) - def copy(self): # -> Pulse|ReadoutPulse|DrivePulse|FluxPulse: - """Returns a new Pulse object with the same attributes.""" - - if type(self) == ReadoutPulse: - return ReadoutPulse( - self.start, - self.duration, - self.amplitude, - self.frequency, - self.relative_phase, - repr(self.shape), # self.shape, - self.channel, - self.qubit, - ) - elif type(self) == DrivePulse: - return DrivePulse( - self.start, - self.duration, - self.amplitude, - self.frequency, - self.relative_phase, - repr(self.shape), # self.shape, - self.channel, - self.qubit, - ) - - elif type(self) == FluxPulse: - return FluxPulse( - self.start, - self.duration, - self.amplitude, - self.shape, - self.channel, - self.qubit, - ) - else: - return Pulse( - self.start, - self.duration, - self.amplitude, - self.frequency, - self.relative_phase, - repr(self.shape), # self.shape, - self.channel, - self.type, - self.qubit, - ) - - def shallow_copy(self): # -> Pulse: - return Pulse( - self.start, - self.duration, - self.amplitude, - self.frequency, - self.relative_phase, - self.shape, - self.channel, - self.type, - self.qubit, - ) - def is_equal_ignoring_start(self, item) -> bool: """Check if two pulses are equal ignoring start time.""" return ( @@ -1134,7 +1073,7 @@ def get_qubit_pulses(self, *qubits): """Return a new sequence containing the pulses on some qubits.""" new_pc = PulseSequence() for pulse in self: - if not isinstance(pulse, CouplerFluxPulse): + if pulse.type is not PulseType.COUPLERFLUX: if pulse.qubit in qubits: new_pc.append(pulse) return new_pc @@ -1143,7 +1082,7 @@ def coupler_pulses(self, *couplers): """Return a new sequence containing the pulses on some couplers.""" new_pc = PulseSequence() for pulse in self: - if isinstance(pulse, CouplerFluxPulse): + if pulse.type is not PulseType.COUPLERFLUX: if pulse.qubit in couplers: new_pc.append(pulse) return new_pc From a1762e2dc22deee353f425af530b497d74dd5adf Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 18 Jan 2024 14:51:34 +0100 Subject: [PATCH 0035/1006] Fix compilers tests --- src/qibolab/compilers/compiler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibolab/compilers/compiler.py b/src/qibolab/compilers/compiler.py index 905d5e80c5..7bfa9f0e16 100644 --- a/src/qibolab/compilers/compiler.py +++ b/src/qibolab/compilers/compiler.py @@ -119,7 +119,7 @@ def _compile_gate( # shift start time and phase according to the global sequence for pulse in gate_sequence: pulse.start += start - if pulse is not PulseType.READOUT: + if pulse.type is not PulseType.READOUT: pulse.relative_phase += virtual_z_phases[pulse.qubit] sequence.append(pulse) From 0f054f5ed415850a885ab7d8dedba33a33f7d51d Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 18 Jan 2024 15:50:56 +0100 Subject: [PATCH 0036/1006] Fix pulses tests --- tests/test_pulses.py | 125 ++++++++++++++++++++++++++++--------------- 1 file changed, 81 insertions(+), 44 deletions(-) diff --git a/tests/test_pulses.py b/tests/test_pulses.py index e59e18c263..aab7088133 100644 --- a/tests/test_pulses.py +++ b/tests/test_pulses.py @@ -1,5 +1,5 @@ """Tests ``pulses.py``.""" - +import copy import os import pathlib @@ -30,8 +30,10 @@ def test_plot_functions(): p0 = Pulse(0, 40, 0.9, 0, 0, Rectangular(), 0, PulseType.FLUX, 0) p1 = Pulse(0, 40, 0.9, 50e6, 0, Gaussian(5), 0, PulseType.DRIVE, 2) p2 = Pulse(0, 40, 0.9, 50e6, 0, Drag(5, 2), 0, PulseType.DRIVE, 200) - p3 = FluxPulse(0, 40, 0.9, IIR([-0.5, 2], [1], Rectangular()), 0, 200) - p4 = FluxPulse(0, 40, 0.9, SNZ(t_idling=10), 0, 200) + p3 = Pulse.flux( + 0, 40, 0.9, IIR([-0.5, 2], [1], Rectangular()), channel=0, qubit=200 + ) + p4 = Pulse.flux(0, 40, 0.9, SNZ(t_idling=10), channel=0, qubit=200) p5 = Pulse(0, 40, 0.9, 400e6, 0, eCap(alpha=2), 0, PulseType.DRIVE) p6 = Pulse(0, 40, 0.9, 50e6, 0, GaussianSquare(5, 0.9), 0, PulseType.DRIVE, 2) ps = PulseSequence([p0, p1, p2, p3, p4, p5, p6]) @@ -141,8 +143,12 @@ def test_pulse_init(): p7 = Pulse(0, 40, 0.9, 0, 0, Rectangular(), 0, PulseType.FLUX, 0) p8 = Pulse(0, 40, 0.9, 50e6, 0, Gaussian(5), 0, PulseType.DRIVE, 2) p9 = Pulse(0, 40, 0.9, 50e6, 0, Drag(5, 2), 0, PulseType.DRIVE, 200) - p10 = FluxPulse(0, 40, 0.9, IIR([-1, 1], [-0.1, 0.1001], Rectangular()), 0, 200) - p11 = FluxPulse(0, 40, 0.9, SNZ(t_idling=10, b_amplitude=0.5), 0, 200) + p10 = Pulse.flux( + 0, 40, 0.9, IIR([-1, 1], [-0.1, 0.1001], Rectangular()), channel=0, qubit=200 + ) + p11 = Pulse.flux( + 0, 40, 0.9, SNZ(t_idling=10, b_amplitude=0.5), channel=0, qubit=200 + ) p13 = Pulse(0, 40, 0.9, 400e6, 0, eCap(alpha=2), 0, PulseType.DRIVE) p14 = Pulse(0, 40, 0.9, 50e6, 0, GaussianSquare(5, 0.9), 0, PulseType.READOUT, 2) @@ -175,7 +181,6 @@ def test_pulse_attributes(): relative_phase=0.0, shape=Rectangular(), channel=channel, - type=PulseType.READOUT, qubit=qubit, ) @@ -340,27 +345,28 @@ def test_pulse_hash(): t0 = 0 p1 = Pulse(t0, 40, 0.9, 100e6, 0, Drag(5, 1), 0, PulseType.DRIVE) - p2 = p1.shallow_copy() - p3 = p1.copy() + p2 = copy.copy(p1) + p3 = copy.deepcopy(p1) assert p1 == p2 assert p1 == p3 def test_pulse_aliases(): - rop = ReadoutPulse( + rop = Pulse( start=0, duration=50, amplitude=0.9, frequency=20_000_000, relative_phase=0.0, shape=Rectangular(), + type=PulseType.READOUT, channel=0, qubit=0, ) assert rop.start == 0 assert rop.qubit == 0 - dp = DrivePulse( + dp = Pulse( start=0, duration=2000, amplitude=0.9, @@ -373,7 +379,7 @@ def test_pulse_aliases(): assert dp.amplitude == 0.9 assert isinstance(dp.shape, Gaussian) - fp = FluxPulse( + fp = Pulse.flux( start=0, duration=300, amplitude=0.9, shape=Rectangular(), channel=0, qubit=0 ) assert fp.channel == 0 @@ -408,9 +414,9 @@ def test_pulsesequence_init(): def test_pulsesequence_operators(): ps = PulseSequence() - ps += [ReadoutPulse(800, 200, 0.9, 20e6, 0, Rectangular(), 1)] - ps = ps + [ReadoutPulse(800, 200, 0.9, 20e6, 0, Rectangular(), 2)] - ps = [ReadoutPulse(800, 200, 0.9, 20e6, 0, Rectangular(), 3)] + ps + ps += [Pulse(800, 200, 0.9, 20e6, 0, Rectangular(), 1, type=PulseType.READOUT)] + ps = ps + [Pulse(800, 200, 0.9, 20e6, 0, Rectangular(), 2, type=PulseType.READOUT)] + ps = [Pulse(800, 200, 0.9, 20e6, 0, Rectangular(), 3, type=PulseType.READOUT)] + ps p4 = Pulse(100, 40, 0.9, 50e6, 0, Gaussian(5), 3, PulseType.DRIVE) p5 = Pulse(200, 40, 0.9, 50e6, 0, Gaussian(5), 2, PulseType.DRIVE) @@ -459,12 +465,12 @@ def test_pulsesequence_start_finish(): def test_pulsesequence_get_channel_pulses(): - p1 = DrivePulse(0, 400, 0.9, 20e6, 0, Gaussian(5), 10) - p2 = ReadoutPulse(100, 400, 0.9, 20e6, 0, Rectangular(), 30) - p3 = DrivePulse(300, 400, 0.9, 20e6, 0, Drag(5, 50), 20) - p4 = DrivePulse(400, 400, 0.9, 20e6, 0, Drag(5, 50), 30) - p5 = ReadoutPulse(500, 400, 0.9, 20e6, 0, Rectangular(), 20) - p6 = DrivePulse(600, 400, 0.9, 20e6, 0, Gaussian(5), 30) + p1 = Pulse(0, 400, 0.9, 20e6, 0, Gaussian(5), 10) + p2 = Pulse(100, 400, 0.9, 20e6, 0, Rectangular(), 30, type=PulseType.READOUT) + p3 = Pulse(300, 400, 0.9, 20e6, 0, Drag(5, 50), 20) + p4 = Pulse(400, 400, 0.9, 20e6, 0, Drag(5, 50), 30) + p5 = Pulse(500, 400, 0.9, 20e6, 0, Rectangular(), 20, type=PulseType.READOUT) + p6 = Pulse(600, 400, 0.9, 20e6, 0, Gaussian(5), 30) ps = PulseSequence([p1, p2, p3, p4, p5, p6]) assert ps.channels == [10, 20, 30] @@ -475,13 +481,33 @@ def test_pulsesequence_get_channel_pulses(): def test_pulsesequence_get_qubit_pulses(): - p1 = DrivePulse(0, 400, 0.9, 20e6, 0, Gaussian(5), 10, 0) - p2 = ReadoutPulse(100, 400, 0.9, 20e6, 0, Rectangular(), 30, 0) - p3 = DrivePulse(300, 400, 0.9, 20e6, 0, Drag(5, 50), 20, 1) - p4 = DrivePulse(400, 400, 0.9, 20e6, 0, Drag(5, 50), 30, 1) - p5 = ReadoutPulse(500, 400, 0.9, 20e6, 0, Rectangular(), 30, 1) - p6 = FluxPulse(600, 400, 0.9, Rectangular(), 40, 1) - p7 = FluxPulse(900, 400, 0.9, Rectangular(), 40, 2) + p1 = Pulse(0, 400, 0.9, 20e6, 0, Gaussian(5), 10, qubit=0) + p2 = Pulse( + 100, + 400, + 0.9, + 20e6, + 0, + Rectangular(), + channel=30, + qubit=0, + type=PulseType.READOUT, + ) + p3 = Pulse(300, 400, 0.9, 20e6, 0, Drag(5, 50), 20, qubit=1) + p4 = Pulse(400, 400, 0.9, 20e6, 0, Drag(5, 50), 30, qubit=1) + p5 = Pulse( + 500, + 400, + 0.9, + 20e6, + 0, + Rectangular(), + channel=30, + qubit=1, + type=PulseType.READOUT, + ) + p6 = Pulse.flux(600, 400, 0.9, Rectangular(), channel=40, qubit=1) + p7 = Pulse.flux(900, 400, 0.9, Rectangular(), channel=40, qubit=2) ps = PulseSequence([p1, p2, p3, p4, p5, p6, p7]) assert ps.qubits == [0, 1, 2] @@ -492,12 +518,12 @@ def test_pulsesequence_get_qubit_pulses(): def test_pulsesequence_pulses_overlap(): - p1 = DrivePulse(0, 400, 0.9, 20e6, 0, Gaussian(5), 10) - p2 = ReadoutPulse(100, 400, 0.9, 20e6, 0, Rectangular(), 30) - p3 = DrivePulse(300, 400, 0.9, 20e6, 0, Drag(5, 50), 20) - p4 = DrivePulse(400, 400, 0.9, 20e6, 0, Drag(5, 50), 30) - p5 = ReadoutPulse(500, 400, 0.9, 20e6, 0, Rectangular(), 20) - p6 = DrivePulse(600, 400, 0.9, 20e6, 0, Gaussian(5), 30) + p1 = Pulse(0, 400, 0.9, 20e6, 0, Gaussian(5), 10) + p2 = Pulse(100, 400, 0.9, 20e6, 0, Rectangular(), 30, type=PulseType.READOUT) + p3 = Pulse(300, 400, 0.9, 20e6, 0, Drag(5, 50), 20) + p4 = Pulse(400, 400, 0.9, 20e6, 0, Drag(5, 50), 30) + p5 = Pulse(500, 400, 0.9, 20e6, 0, Rectangular(), 20, type=PulseType.READOUT) + p6 = Pulse(600, 400, 0.9, 20e6, 0, Gaussian(5), 30) ps = PulseSequence([p1, p2, p3, p4, p5, p6]) assert ps.pulses_overlap @@ -507,12 +533,12 @@ def test_pulsesequence_pulses_overlap(): def test_pulsesequence_separate_overlapping_pulses(): - p1 = DrivePulse(0, 400, 0.9, 20e6, 0, Gaussian(5), 10) - p2 = ReadoutPulse(100, 400, 0.9, 20e6, 0, Rectangular(), 30) - p3 = DrivePulse(300, 400, 0.9, 20e6, 0, Drag(5, 50), 20) - p4 = DrivePulse(400, 400, 0.9, 20e6, 0, Drag(5, 50), 30) - p5 = ReadoutPulse(500, 400, 0.9, 20e6, 0, Rectangular(), 20) - p6 = DrivePulse(600, 400, 0.9, 20e6, 0, Gaussian(5), 30) + p1 = Pulse(0, 400, 0.9, 20e6, 0, Gaussian(5), 10) + p2 = Pulse(100, 400, 0.9, 20e6, 0, Rectangular(), qubit=30, type=PulseType.READOUT) + p3 = Pulse(300, 400, 0.9, 20e6, 0, Drag(5, 50), 20) + p4 = Pulse(400, 400, 0.9, 20e6, 0, Drag(5, 50), 30) + p5 = Pulse(500, 400, 0.9, 20e6, 0, Rectangular(), qubit=20, type=PulseType.READOUT) + p6 = Pulse(600, 400, 0.9, 20e6, 0, Gaussian(5), 30) ps = PulseSequence([p1, p2, p3, p4, p5, p6]) n = 70 @@ -525,9 +551,18 @@ def test_pulsesequence_separate_overlapping_pulses(): def test_pulse_pulse_order(): t0 = 0 t = 0 - p1 = DrivePulse(t0, 400, 0.9, 20e6, 0, Gaussian(5), 10) - p2 = ReadoutPulse(p1.finish + t, 400, 0.9, 20e6, 0, Rectangular(), 30) - p3 = DrivePulse(p2.finish, 400, 0.9, 20e6, 0, Drag(5, 50), 20) + p1 = Pulse(t0, 400, 0.9, 20e6, 0, Gaussian(5), 10) + p2 = Pulse( + p1.finish + t, + 400, + 0.9, + 20e6, + 0, + Rectangular(), + qubit=30, + type=PulseType.READOUT, + ) + p3 = Pulse(p2.finish, 400, 0.9, 20e6, 0, Drag(5, 50), 20) ps1 = PulseSequence([p1, p2, p3]) ps2 = PulseSequence([p3, p1, p2]) @@ -798,7 +833,7 @@ def test_pulse(): def test_readout_pulse(): duration = 2000 - pulse = ReadoutPulse( + pulse = Pulse( start=0, frequency=200_000_000, amplitude=1, @@ -806,6 +841,7 @@ def test_readout_pulse(): relative_phase=0, shape=f"Rectangular()", channel=11, + type=PulseType.READOUT, ) assert pulse.duration == duration @@ -839,7 +875,7 @@ def test_pulse_sequence_add_readout(): ) sequence.append( - ReadoutPulse( + Pulse( start=128, frequency=20_000_000, amplitude=0.9, @@ -847,6 +883,7 @@ def test_pulse_sequence_add_readout(): relative_phase=0, shape="Rectangular()", channel=11, + type=PulseType.READOUT, ) ) assert len(sequence) == 3 From 26c8ab09b5497c2393973218b498b8c1581d14a4 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 18 Jan 2024 15:56:04 +0100 Subject: [PATCH 0037/1006] Fix QM tests --- tests/test_instruments_qm.py | 62 ++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/tests/test_instruments_qm.py b/tests/test_instruments_qm.py index 154ca3ec95..cf17b28126 100644 --- a/tests/test_instruments_qm.py +++ b/tests/test_instruments_qm.py @@ -9,8 +9,12 @@ from qibolab.instruments.qm.acquisition import Acquisition, declare_acquisitions from qibolab.instruments.qm.controller import controllers_config from qibolab.instruments.qm.sequence import BakedPulse, QMPulse, Sequence +<<<<<<< HEAD from qibolab.pulses import Pulse, PulseType, PulseSequence, Rectangular from qibolab.qubits import Qubit +======= +from qibolab.pulses import Pulse, PulseSequence, PulseType, Rectangular +>>>>>>> 552fc49f (Fix QM tests) from qibolab.sweeper import Parameter, Sweeper from .conftest import set_platform_profile @@ -54,8 +58,23 @@ def test_qmpulse_declare_output(acquisition_type): def test_qmsequence(): +<<<<<<< HEAD qd_pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), "ch0", PulseType.DRIVE, qubit=0) ro_pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), "ch1", PulseType.READOUT, qubit=0) +======= + qd_pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), "ch0", qubit=0) + ro_pulse = Pulse( + 0, + 40, + 0.05, + int(3e9), + 0.0, + Rectangular(), + "ch1", + qubit=0, + type=PulseType.READOUT, + ) +>>>>>>> 552fc49f (Fix QM tests) qmsequence = Sequence() with pytest.raises(AttributeError): qmsequence.add("test") @@ -90,6 +109,7 @@ def test_qmpulse_previous_and_next(): f"readout{qubit}", PulseType.READOUT, qubit=qubit, + type=PulseType.READOUT, ) ) ro_qmpulses.append(ro_pulse) @@ -115,10 +135,33 @@ def test_qmpulse_previous_and_next_flux(): x_pulse_end = Pulse(70, 40, 0.05, int(3e9), 0.0, Rectangular(), f"drive2", qubit=2) measure_lowfreq = Pulse( +<<<<<<< HEAD 110, 100, 0.05, int(3e9), 0.0, Rectangular(), "readout1", PulseType.READOUT, qubit=1 ) measure_highfreq = Pulse( 110, 100, 0.05, int(3e9), 0.0, Rectangular(), "readout2", PulseType.READOUT, qubit=2 +======= + 110, + 100, + 0.05, + int(3e9), + 0.0, + Rectangular(), + "readout1", + qubit=1, + type=PulseType.READOUT, + ) + measure_highfreq = Pulse( + 110, + 100, + 0.05, + int(3e9), + 0.0, + Rectangular(), + "readout2", + qubit=2, + type=PulseType.READOUT, +>>>>>>> 552fc49f (Fix QM tests) ) drive11 = QMPulse(y90_pulse) @@ -338,10 +381,22 @@ def test_qm_register_pulse(qmplatform, pulse_type, qubit): def test_qm_register_flux_pulse(qmplatform): qubit = 2 +<<<<<<< HEAD platform = qmplatform controller = platform.instruments["qm"] pulse = Pulse.flux( 0, 30, 0.005, Rectangular(), platform.qubits[qubit].flux.name, qubit +======= + platform = create_platform("qm") + opx = platform.instruments["qmopx"] + pulse = Pulse.flux( + 0, + 30, + 0.005, + Rectangular(), + channel=platform.qubits[qubit].flux.name, + qubit=qubit, +>>>>>>> 552fc49f (Fix QM tests) ) target_pulse = { "operation": "control", @@ -405,10 +460,17 @@ def test_qm_register_pulses_with_different_frequencies(qmplatform): def test_qm_register_baked_pulse(qmplatform, duration): platform = qmplatform qubit = platform.qubits[3] +<<<<<<< HEAD controller = platform.instruments["qm"] controller.config.register_flux_element(qubit) pulse = Pulse.flux( 3, duration, 0.05, Rectangular(), qubit.flux.name, qubit=qubit.name +======= + opx = platform.instruments["qmopx"] + opx.config.register_flux_element(qubit) + pulse = Pulse.flux( + 3, duration, 0.05, Rectangular(), channel=qubit.flux.name, qubit=qubit.name +>>>>>>> 552fc49f (Fix QM tests) ) qmpulse = BakedPulse(pulse) config = controller.config From 9ea0f04516ed36ad2817d6d983b48be1d2e6ab64 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 18 Jan 2024 16:05:08 +0100 Subject: [PATCH 0038/1006] Fix tests for dummy --- src/qibolab/native.py | 5 ++++- tests/test_dummy.py | 5 +++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/qibolab/native.py b/src/qibolab/native.py index 2148a91e96..b2d2d47085 100644 --- a/src/qibolab/native.py +++ b/src/qibolab/native.py @@ -157,11 +157,14 @@ def pulse(self, start): Returns: A :class:`qibolab.pulses.FluxPulse` with the pulse parameters of the gate. """ - return CouplerFluxPulse( + return Pulse( start + self.relative_start, self.duration, self.amplitude, + 0, + 0, self.shape, + type=PulseType.COUPLERFLUX, channel=self.coupler.flux.name, qubit=self.coupler.name, ) diff --git a/tests/test_dummy.py b/tests/test_dummy.py index 4aa828731e..e1f99b7c95 100644 --- a/tests/test_dummy.py +++ b/tests/test_dummy.py @@ -2,7 +2,7 @@ import pytest from qibolab import AcquisitionType, AveragingMode, ExecutionParameters, create_platform -from qibolab.pulses import PulseSequence +from qibolab.pulses import Pulse, PulseSequence, PulseType from qibolab.qubits import QubitPair from qibolab.sweeper import Parameter, QubitParameter, Sweeper @@ -155,7 +155,7 @@ def test_dummy_single_sweep_coupler( platform = create_platform("dummy_couplers") sequence = PulseSequence() ro_pulse = platform.create_qubit_readout_pulse(qubit=0, start=0) - coupler_pulse = CouplerFluxPulse( + coupler_pulse = Pulse.flux( start=0, duration=40, amplitude=0.5, @@ -163,6 +163,7 @@ def test_dummy_single_sweep_coupler( channel="flux_coupler-0", qubit=0, ) + coupler_pulse.type = PulseType.COUPLERFLUX if parameter is Parameter.amplitude: parameter_range = np.random.rand(SWEPT_POINTS) else: From 52837676f6528d84b6a212692444ae3f8b8b9b66 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 18 Jan 2024 16:19:05 +0100 Subject: [PATCH 0039/1006] Fix Zurich tests --- tests/test_instruments_qm.py | 61 ------------------------------ tests/test_instruments_zhinst.py | 65 ++++++++++++++++++++++++-------- 2 files changed, 50 insertions(+), 76 deletions(-) diff --git a/tests/test_instruments_qm.py b/tests/test_instruments_qm.py index cf17b28126..3bdf9d882c 100644 --- a/tests/test_instruments_qm.py +++ b/tests/test_instruments_qm.py @@ -9,12 +9,8 @@ from qibolab.instruments.qm.acquisition import Acquisition, declare_acquisitions from qibolab.instruments.qm.controller import controllers_config from qibolab.instruments.qm.sequence import BakedPulse, QMPulse, Sequence -<<<<<<< HEAD from qibolab.pulses import Pulse, PulseType, PulseSequence, Rectangular from qibolab.qubits import Qubit -======= -from qibolab.pulses import Pulse, PulseSequence, PulseType, Rectangular ->>>>>>> 552fc49f (Fix QM tests) from qibolab.sweeper import Parameter, Sweeper from .conftest import set_platform_profile @@ -58,23 +54,8 @@ def test_qmpulse_declare_output(acquisition_type): def test_qmsequence(): -<<<<<<< HEAD qd_pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), "ch0", PulseType.DRIVE, qubit=0) ro_pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), "ch1", PulseType.READOUT, qubit=0) -======= - qd_pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), "ch0", qubit=0) - ro_pulse = Pulse( - 0, - 40, - 0.05, - int(3e9), - 0.0, - Rectangular(), - "ch1", - qubit=0, - type=PulseType.READOUT, - ) ->>>>>>> 552fc49f (Fix QM tests) qmsequence = Sequence() with pytest.raises(AttributeError): qmsequence.add("test") @@ -135,33 +116,10 @@ def test_qmpulse_previous_and_next_flux(): x_pulse_end = Pulse(70, 40, 0.05, int(3e9), 0.0, Rectangular(), f"drive2", qubit=2) measure_lowfreq = Pulse( -<<<<<<< HEAD 110, 100, 0.05, int(3e9), 0.0, Rectangular(), "readout1", PulseType.READOUT, qubit=1 ) measure_highfreq = Pulse( 110, 100, 0.05, int(3e9), 0.0, Rectangular(), "readout2", PulseType.READOUT, qubit=2 -======= - 110, - 100, - 0.05, - int(3e9), - 0.0, - Rectangular(), - "readout1", - qubit=1, - type=PulseType.READOUT, - ) - measure_highfreq = Pulse( - 110, - 100, - 0.05, - int(3e9), - 0.0, - Rectangular(), - "readout2", - qubit=2, - type=PulseType.READOUT, ->>>>>>> 552fc49f (Fix QM tests) ) drive11 = QMPulse(y90_pulse) @@ -381,22 +339,10 @@ def test_qm_register_pulse(qmplatform, pulse_type, qubit): def test_qm_register_flux_pulse(qmplatform): qubit = 2 -<<<<<<< HEAD platform = qmplatform controller = platform.instruments["qm"] pulse = Pulse.flux( 0, 30, 0.005, Rectangular(), platform.qubits[qubit].flux.name, qubit -======= - platform = create_platform("qm") - opx = platform.instruments["qmopx"] - pulse = Pulse.flux( - 0, - 30, - 0.005, - Rectangular(), - channel=platform.qubits[qubit].flux.name, - qubit=qubit, ->>>>>>> 552fc49f (Fix QM tests) ) target_pulse = { "operation": "control", @@ -460,17 +406,10 @@ def test_qm_register_pulses_with_different_frequencies(qmplatform): def test_qm_register_baked_pulse(qmplatform, duration): platform = qmplatform qubit = platform.qubits[3] -<<<<<<< HEAD controller = platform.instruments["qm"] controller.config.register_flux_element(qubit) pulse = Pulse.flux( 3, duration, 0.05, Rectangular(), qubit.flux.name, qubit=qubit.name -======= - opx = platform.instruments["qmopx"] - opx.config.register_flux_element(qubit) - pulse = Pulse.flux( - 3, duration, 0.05, Rectangular(), channel=qubit.flux.name, qubit=qubit.name ->>>>>>> 552fc49f (Fix QM tests) ) qmpulse = BakedPulse(pulse) config = controller.config diff --git a/tests/test_instruments_zhinst.py b/tests/test_instruments_zhinst.py index cabd82a1df..535e957e37 100644 --- a/tests/test_instruments_zhinst.py +++ b/tests/test_instruments_zhinst.py @@ -257,8 +257,8 @@ def test_zhsequence(dummy_qrc): IQM5q.qubits[0] ) qd_pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), drive_channel, qubit=0) - ro_pulse = ReadoutPulse( - 0, 40, 0.05, int(3e9), 0.0, Rectangular(), readout_channel, qubit=0 + ro_pulse = Pulse( + 0, 40, 0.05, int(3e9), 0.0, Rectangular(), readout_channel, PulseType.READOUT, qubit=0 ) sequence = PulseSequence() sequence.add(qd_pulse) @@ -284,11 +284,11 @@ def test_zhsequence_couplers(dummy_qrc): ) couplerflux_channel = IQM5q.couplers[0].flux.name qd_pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), drive_channel, qubit=0) - ro_pulse = ReadoutPulse( - 0, 40, 0.05, int(3e9), 0.0, Rectangular(), readout_channel, qubit=0 + ro_pulse = Pulse( + 0, 40, 0.05, int(3e9), 0.0, Rectangular(), readout_channel, PulseType.READOUT, qubit=0 ) - qc_pulse = CouplerFluxPulse( - 0, 40, 0.05, Rectangular(), couplerflux_channel, qubit=3 + qc_pulse = Pulse( + 0, 40, 0.05, Rectangular(), couplerflux_channel, PulseType.COUPLERFLUX, qubit=3 ) sequence = PulseSequence() sequence.add(qd_pulse) @@ -307,12 +307,12 @@ def test_zhsequence_multiple_ro(dummy_qrc): sequence = PulseSequence() qd_pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), "ch0", qubit=0) sequence.add(qd_pulse) - ro_pulse = ReadoutPulse( - 0, 40, 0.05, int(3e9), 0.0, Rectangular(), readout_channel, qubit=0 + ro_pulse = Pulse( + 0, 40, 0.05, int(3e9), 0.0, Rectangular(), readout_channel, PulseType.READOUT, qubit=0 ) sequence.add(ro_pulse) - ro_pulse = ReadoutPulse( - 0, 5000, 0.05, int(3e9), 0.0, Rectangular(), readout_channel, qubit=0 + ro_pulse = Pulse( + 0, 5000, 0.05, int(3e9), 0.0, Rectangular(), readout_channel, PulseType.READOUT, qubit=0 ) sequence.add(ro_pulse) platform = create_platform("zurich") @@ -377,7 +377,7 @@ def test_experiment_flow(dummy_qrc): qf_pulses = {} for qubit in qubits.values(): q = qubit.name - qf_pulses[q] = FluxPulse( + qf_pulses[q] = Pulse.flux( start=0, duration=500, amplitude=1, @@ -416,7 +416,7 @@ def test_experiment_flow_coupler(dummy_qrc): qf_pulses = {} for qubit in qubits.values(): q = qubit.name - qf_pulses[q] = FluxPulse( + qf_pulses[q] = Pulse.flux( start=0, duration=500, amplitude=1, @@ -431,7 +431,7 @@ def test_experiment_flow_coupler(dummy_qrc): cf_pulses = {} for coupler in couplers.values(): c = coupler.name - cf_pulses[c] = CouplerFluxPulse( + cf_pulses[c] = Pulse.flux( start=0, duration=500, amplitude=1, @@ -439,6 +439,7 @@ def test_experiment_flow_coupler(dummy_qrc): channel=platform.couplers[c].flux.name, qubit=c, ) + cf_pulses[c].type = PulseType.COUPLERFLUX sequence.append(cf_pulses[c]) options = ExecutionParameters( @@ -572,7 +573,7 @@ def test_experiment_sweep_single_coupler(dummy_qrc, parameter1): cf_pulses = {} for coupler in couplers.values(): c = coupler.name - cf_pulses[c] = CouplerFluxPulse( + cf_pulses[c] = Pulse.flux( start=0, duration=500, amplitude=1, @@ -580,6 +581,7 @@ def test_experiment_sweep_single_coupler(dummy_qrc, parameter1): channel=platform.couplers[c].flux.name, qubit=c, ) + cf_pulses[c].type = PulseType.COUPLERFLUX sequence.append(cf_pulses[c]) parameter_range_1 = ( @@ -780,8 +782,41 @@ def test_experiment_sweep_punchouts(dummy_qrc, parameter): IQM5q.experiment_flow(qubits, couplers, sequence, options) +<<<<<<< HEAD assert measure_channel_name(qubits[0]) in IQM5q.experiment.signals assert acquire_channel_name(qubits[0]) in IQM5q.experiment.signals +======= + assert "measure0" in IQM5q.experiment.signals + assert "acquire0" in IQM5q.experiment.signals + + +# TODO: Fix this +def test_sim(dummy_qrc): + platform = create_platform("zurich") + IQM5q = platform.instruments["EL_ZURO"] + sequence = PulseSequence() + qubits = {0: platform.qubits[0]} + platform.qubits = qubits + ro_pulses = {} + qd_pulses = {} + qf_pulses = {} + for qubit in qubits: + qd_pulses[qubit] = platform.create_RX_pulse(qubit, start=0) + sequence.append(qd_pulses[qubit]) + ro_pulses[qubit] = platform.create_qubit_readout_pulse( + qubit, start=qd_pulses[qubit].finish + ) + sequence.append(ro_pulses[qubit]) + qf_pulses[qubit] = Pulse.flux( + start=0, + duration=500, + amplitude=1, + shape=Rectangular(), + channel=platform.qubits[qubit].flux.name, + qubit=qubit, + ) + sequence.append(qf_pulses[qubit]) +>>>>>>> 1b1e4cd4 (Fix Zurich tests) def test_batching(dummy_qrc): @@ -826,7 +861,7 @@ def test_experiment_execute_pulse_sequence_qpu(connected_platform, instrument): qf_pulses = {} for qubit in qubits.values(): q = qubit.name - qf_pulses[q] = FluxPulse( + qf_pulses[q] = Pulse.flux( start=0, duration=500, amplitude=1, From 690e10c02bbbe115b8e45b2051e75b28cb18d108 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 18 Jan 2024 16:35:45 +0100 Subject: [PATCH 0040/1006] Remove leftover calls to pulse specific copy --- examples/pulses_tutorial.ipynb | 23 ------------------- .../instruments/qblox/cluster_qcm_bb.py | 4 ++-- .../instruments/qblox/cluster_qcm_rf.py | 4 ++-- .../instruments/qblox/cluster_qrm_rf.py | 4 ++-- src/qibolab/instruments/qblox/sequencer.py | 6 +++-- src/qibolab/native.py | 7 +++--- src/qibolab/pulses.py | 3 ++- 7 files changed, 16 insertions(+), 35 deletions(-) diff --git a/examples/pulses_tutorial.ipynb b/examples/pulses_tutorial.ipynb index 696c86b20c..a80241221c 100644 --- a/examples/pulses_tutorial.ipynb +++ b/examples/pulses_tutorial.ipynb @@ -310,29 +310,6 @@ "#### Methods" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Pulse implements the following methods:\n", - "- `copy()` returns a deep copy of the object. The later changes to the original do not impact the replica.\n", - "- `shallow_copy()` returns a shallow copy of the object. The replica references to the same `start`, `duration` and `shape` objects.\n", - "The difference in the behaviour of these two methods can be appreciated in the below example:" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "p1 = Pulse(0, 40, 0.9, 100e6, 0, Drag(5,1), 0, PulseType.DRIVE)\n", - "p2 = p1.shallow_copy()\n", - "p3 = p1.copy()\n", - "assert p1 == p2\n", - "assert p1 == p3" - ] - }, { "cell_type": "markdown", "metadata": {}, diff --git a/src/qibolab/instruments/qblox/cluster_qcm_bb.py b/src/qibolab/instruments/qblox/cluster_qcm_bb.py index 23eea1877f..1bae9d543b 100644 --- a/src/qibolab/instruments/qblox/cluster_qcm_bb.py +++ b/src/qibolab/instruments/qblox/cluster_qcm_bb.py @@ -1,5 +1,5 @@ """Qblox Cluster QCM driver.""" - +import copy import json from qblox_instruments.native.generic_func import SequencerStates @@ -354,7 +354,7 @@ def process_pulse_sequence( self._sequencers[port].append(sequencer) # make a temporary copy of the pulses to be processed - pulses_to_be_processed = non_overlapping_pulses.shallow_copy() + pulses_to_be_processed = copy.copy(non_overlapping_pulses) while not pulses_to_be_processed.is_empty: pulse: Pulse = pulses_to_be_processed[0] # attempt to save the waveforms to the sequencer waveforms buffer diff --git a/src/qibolab/instruments/qblox/cluster_qcm_rf.py b/src/qibolab/instruments/qblox/cluster_qcm_rf.py index 573624ab18..f79d5d9d92 100644 --- a/src/qibolab/instruments/qblox/cluster_qcm_rf.py +++ b/src/qibolab/instruments/qblox/cluster_qcm_rf.py @@ -1,5 +1,5 @@ """Qblox Cluster QCM-RF driver.""" - +import copy import json from qblox_instruments.native.generic_func import SequencerStates @@ -375,7 +375,7 @@ def process_pulse_sequence( self._sequencers[port].append(sequencer) # make a temporary copy of the pulses to be processed - pulses_to_be_processed = non_overlapping_pulses.shallow_copy() + pulses_to_be_processed = copy.copy(non_overlapping_pulses) while not pulses_to_be_processed.is_empty: pulse: Pulse = pulses_to_be_processed[0] # attempt to save the waveforms to the sequencer waveforms buffer diff --git a/src/qibolab/instruments/qblox/cluster_qrm_rf.py b/src/qibolab/instruments/qblox/cluster_qrm_rf.py index 63322f5d2a..5d6ded76e5 100644 --- a/src/qibolab/instruments/qblox/cluster_qrm_rf.py +++ b/src/qibolab/instruments/qblox/cluster_qrm_rf.py @@ -1,5 +1,5 @@ """Qblox Cluster QRM-RF driver.""" - +import copy import json import time @@ -435,7 +435,7 @@ def process_pulse_sequence( self._sequencers[port].append(sequencer) # make a temporary copy of the pulses to be processed - pulses_to_be_processed = non_overlapping_pulses.shallow_copy() + pulses_to_be_processed = copy.copy(non_overlapping_pulses) while not pulses_to_be_processed.is_empty: pulse: Pulse = pulses_to_be_processed[0] # attempt to save the waveforms to the sequencer waveforms buffer diff --git a/src/qibolab/instruments/qblox/sequencer.py b/src/qibolab/instruments/qblox/sequencer.py index 185375185d..db0c068935 100644 --- a/src/qibolab/instruments/qblox/sequencer.py +++ b/src/qibolab/instruments/qblox/sequencer.py @@ -1,3 +1,5 @@ +import copy + import numpy as np from qblox_instruments.qcodes_drivers.sequencer import Sequencer as QbloxSequencer @@ -48,7 +50,7 @@ def add_waveforms( Raises: NotEnoughMemory: If the memory needed to store the waveforms in more than the memory avalible. """ - pulse_copy = pulse.copy() + pulse_copy = copy.deepcopy(pulse) for sweeper in sweepers: if sweeper.pulses and sweeper.parameter == Parameter.amplitude: if pulse in sweeper.pulses: @@ -122,7 +124,7 @@ def bake_pulse_waveforms( """ # In order to generate waveforms for each duration value, the pulse will need to be modified. # To avoid any conflicts, make a copy of the pulse first. - pulse_copy = pulse.copy() + pulse_copy = copy.deepcopy(pulse) # there may be other waveforms stored already, set first index as the next available first_idx = len(self.unique_waveforms) diff --git a/src/qibolab/native.py b/src/qibolab/native.py index b2d2d47085..8c08595e1e 100644 --- a/src/qibolab/native.py +++ b/src/qibolab/native.py @@ -1,3 +1,4 @@ +import copy from collections import defaultdict from dataclasses import dataclass, field, fields, replace from typing import List, Optional, Union @@ -39,7 +40,7 @@ def from_dict(cls, name, pulse, qubit): qubits (:class:`qibolab.platforms.abstract.Qubit`): Qubit that the pulse is acting on """ - kwargs = pulse.copy() + kwargs = copy.deepcopy(pulse) kwargs["pulse_type"] = PulseType(kwargs.pop("type")) kwargs["qubit"] = qubit return cls(name, **kwargs) @@ -131,7 +132,7 @@ def from_dict(cls, pulse, coupler): coupler (:class:`qibolab.platforms.abstract.Coupler`): Coupler that the pulse is acting on """ - kwargs = pulse.copy() + kwargs = copy.deepcopy(pulse) kwargs["coupler"] = coupler kwargs.pop("type") return cls(**kwargs) @@ -207,7 +208,7 @@ def from_dict(cls, name, sequence, qubits, couplers): sequence = [sequence] for i, pulse in enumerate(sequence): - pulse = pulse.copy() + pulse = copy.deepcopy(pulse) pulse_type = pulse.pop("type") if pulse_type == "coupler": pulse["coupler"] = couplers[pulse.pop("coupler")] diff --git a/src/qibolab/pulses.py b/src/qibolab/pulses.py index da7d98c3cb..f4c46d9cb8 100644 --- a/src/qibolab/pulses.py +++ b/src/qibolab/pulses.py @@ -1,4 +1,5 @@ """Pulse and PulseSequence classes.""" +import copy import re from abc import ABC, abstractmethod from dataclasses import dataclass, fields @@ -875,7 +876,7 @@ def __mul__(self, n): raise TypeError(f"Expected int; got {type(n).__name__}") if n < 0: raise TypeError(f"argument n should be >=0, got {n}") - return PulseSequence(*([self.copy()] * n)) + return PulseSequence(*([copy.deepcopy(self)] * n)) def __rmul__(self, n): return self.__mul__(n) From 6d135b296ea12fbbf74d2f77e364da2c6a55d568 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 18 Jan 2024 16:50:28 +0100 Subject: [PATCH 0041/1006] Fix doctests --- doc/source/main-documentation/qibolab.rst | 22 ++++++++-------------- doc/source/tutorials/pulses.rst | 13 ++++--------- 2 files changed, 12 insertions(+), 23 deletions(-) diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index 8635dfa68f..935f1e453b 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -275,12 +275,6 @@ Pulses In Qibolab, an extensive API is available for working with pulses and pulse sequences, a fundamental aspect of quantum experiments. At the heart of this API is the :class:`qibolab.pulses.Pulse` object, which empowers users to define and customize pulses with specific parameters. -The API provides specialized subclasses tailored to the main types of pulses typically used in quantum experiments: - -- Readout Pulses (:class:`qibolab.pulses.ReadoutPulse`) -- Drive Pulses (:class:`qibolab.pulses.DrivePulse`) -- Flux Pulses (:class:`qibolab.pulses.FluxPulse`) - Each pulse is associated with a channel and a qubit. Additionally, pulses are defined by a shape, represented by a subclass of :class:`qibolab.pulses.PulseShape`. Qibolab offers a range of pre-defined pulse shapes: @@ -313,13 +307,13 @@ To illustrate, here are some examples of single pulses using the Qibolab API: ) In this way, we defined a rectangular drive pulse using the generic Pulse object. -Alternatively, you can achieve the same result using the dedicated :class:`qibolab.pulses.DrivePulse` object: +Alternatively, you can achieve the same result using the dedicated :class:`qibolab.pulses.Pulse` object: .. testcode:: python - from qibolab.pulses import DrivePulse, Rectangular + from qibolab.pulses import Pulse, Rectangular - pulse = DrivePulse( + pulse = Pulse( start=0, # timing, in all qibolab, is expressed in ns duration=40, amplitude=0.5, # this amplitude is relative to the range of the instrument @@ -340,7 +334,7 @@ To organize pulses into sequences, Qibolab provides the :class:`qibolab.pulses.P sequence = PulseSequence() - pulse1 = DrivePulse( + pulse1 = Pulse( start=0, # timing, in all qibolab, is expressed in ns duration=40, amplitude=0.5, # this amplitude is relative to the range of the instrument @@ -350,7 +344,7 @@ To organize pulses into sequences, Qibolab provides the :class:`qibolab.pulses.P channel="channel", qubit=0, ) - pulse2 = DrivePulse( + pulse2 = Pulse( start=0, # timing, in all qibolab, is expressed in ns duration=40, amplitude=0.5, # this amplitude is relative to the range of the instrument @@ -360,7 +354,7 @@ To organize pulses into sequences, Qibolab provides the :class:`qibolab.pulses.P channel="channel", qubit=0, ) - pulse3 = DrivePulse( + pulse3 = Pulse( start=0, # timing, in all qibolab, is expressed in ns duration=40, amplitude=0.5, # this amplitude is relative to the range of the instrument @@ -370,7 +364,7 @@ To organize pulses into sequences, Qibolab provides the :class:`qibolab.pulses.P channel="channel", qubit=0, ) - pulse4 = DrivePulse( + pulse4 = Pulse( start=0, # timing, in all qibolab, is expressed in ns duration=40, amplitude=0.5, # this amplitude is relative to the range of the instrument @@ -418,7 +412,7 @@ Typical experiments may include both pre-defined pulses and new ones: sequence = PulseSequence() sequence.append(platform.create_RX_pulse(0)) sequence.append( - DrivePulse( + Pulse( start=0, duration=10, amplitude=0.5, diff --git a/doc/source/tutorials/pulses.rst b/doc/source/tutorials/pulses.rst index 6fdab05e1b..1902112503 100644 --- a/doc/source/tutorials/pulses.rst +++ b/doc/source/tutorials/pulses.rst @@ -8,20 +8,14 @@ pulses (:class:`qibolab.pulses.Pulse`) through the .. testcode:: python - from qibolab.pulses import ( - DrivePulse, - ReadoutPulse, - PulseSequence, - Rectangular, - Gaussian, - ) + from qibolab.pulses import Pulse, PulseSequence, PulseType, Rectangular, Gaussian # Define PulseSequence sequence = PulseSequence() # Add some pulses to the pulse sequence sequence.append( - DrivePulse( + Pulse( start=0, frequency=200000000, amplitude=0.3, @@ -32,7 +26,7 @@ pulses (:class:`qibolab.pulses.Pulse`) through the ) ) sequence.append( - ReadoutPulse( + Pulse( start=70, frequency=20000000.0, amplitude=0.5, @@ -40,6 +34,7 @@ pulses (:class:`qibolab.pulses.Pulse`) through the relative_phase=0, shape=Rectangular(), qubit=0, + type=PulseType.READOUT, ) ) From 5a8ac1b727ac56f5d37b2b835fe4bfcc614a415b Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 18 Jan 2024 17:47:34 +0100 Subject: [PATCH 0042/1006] Remove intermediate frequency from pulse Following @PiergiorgioButtarini removal of last usage in Qblox, in #729 --- src/qibolab/pulses.py | 17 ++++++----------- tests/test_pulses.py | 13 ++++++++----- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/src/qibolab/pulses.py b/src/qibolab/pulses.py index f4c46d9cb8..5ecff0f1d0 100644 --- a/src/qibolab/pulses.py +++ b/src/qibolab/pulses.py @@ -140,36 +140,32 @@ def envelope_waveforms( self.envelope_waveform_q(sampling_rate), ) - def modulated_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: + def modulated_waveform_i(self, _if: int, sampling_rate=SAMPLING_RATE) -> Waveform: """The waveform of the i component of the pulse, modulated with its frequency.""" return self.modulated_waveforms(sampling_rate)[0] - def modulated_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: + def modulated_waveform_q(self, _if: int, sampling_rate=SAMPLING_RATE) -> Waveform: """The waveform of the q component of the pulse, modulated with its frequency.""" return self.modulated_waveforms(sampling_rate)[1] - def modulated_waveforms(self, sampling_rate=SAMPLING_RATE): + def modulated_waveforms(self, _if: int, sampling_rate=SAMPLING_RATE): """A tuple with the i and q waveforms of the pulse, modulated with its frequency.""" pulse = self.pulse - if abs(pulse._if) * 2 > sampling_rate: + if abs(_if) * 2 > sampling_rate: log.info( f"WARNING: The frequency of pulse {pulse.id} is higher than the nyqusit frequency ({int(sampling_rate // 2)}) for the device sampling rate: {int(sampling_rate)}" ) num_samples = int(np.rint(pulse.duration * sampling_rate)) time = np.arange(num_samples) / sampling_rate global_phase = pulse.global_phase - cosalpha = np.cos( - 2 * np.pi * pulse._if * time + global_phase + pulse.relative_phase - ) - sinalpha = np.sin( - 2 * np.pi * pulse._if * time + global_phase + pulse.relative_phase - ) + cosalpha = np.cos(2 * np.pi * _if * time + global_phase + pulse.relative_phase) + sinalpha = np.sin(2 * np.pi * _if * time + global_phase + pulse.relative_phase) mod_matrix = np.array([[cosalpha, -sinalpha], [sinalpha, cosalpha]]) / np.sqrt( 2 @@ -752,7 +748,6 @@ class Pulse: """Pulse type, as an element of PulseType enumeration.""" qubit: int = 0 """Qubit or coupler addressed by the pulse.""" - _if: int = 0 def __post_init__(self): if isinstance(self.type, str): diff --git a/tests/test_pulses.py b/tests/test_pulses.py index aab7088133..97f14d6863 100644 --- a/tests/test_pulses.py +++ b/tests/test_pulses.py @@ -611,6 +611,7 @@ def test_pulseshape_rectangular(): channel=1, qubit=0, ) + _if = 0 assert pulse.duration == 50 assert isinstance(pulse.shape, Rectangular) @@ -628,10 +629,10 @@ def test_pulseshape_rectangular(): pulse.amplitude * np.zeros(num_samples), ) global_phase = ( - 2 * np.pi * pulse._if * pulse.start / 1e9 + 2 * np.pi * _if * pulse.start / 1e9 ) # pulse start, duration and finish are in ns mod_i, mod_q = modulate( - i, q, num_samples, pulse._if, global_phase + pulse.relative_phase, sampling_rate + i, q, num_samples, _if, global_phase + pulse.relative_phase, sampling_rate ) np.testing.assert_allclose(pulse.shape.envelope_waveform_i(sampling_rate).data, i) @@ -655,6 +656,7 @@ def test_pulseshape_gaussian(): channel=1, qubit=0, ) + _if = 0 assert pulse.duration == 50 assert isinstance(pulse.shape, Gaussian) @@ -681,7 +683,7 @@ def test_pulseshape_gaussian(): 2 * np.pi * pulse.frequency * pulse.start / 1e9 ) # pulse start, duration and finish are in ns mod_i, mod_q = modulate( - i, q, num_samples, pulse._if, global_phase + pulse.relative_phase, sampling_rate + i, q, num_samples, _if, global_phase + pulse.relative_phase, sampling_rate ) np.testing.assert_allclose(pulse.shape.envelope_waveform_i(sampling_rate).data, i) @@ -705,6 +707,7 @@ def test_pulseshape_drag(): channel=1, qubit=0, ) + _if = 0 assert pulse.duration == 50 assert isinstance(pulse.shape, Drag) @@ -734,10 +737,10 @@ def test_pulseshape_drag(): * sampling_rate ) global_phase = ( - 2 * np.pi * pulse._if * pulse.start / 1e9 + 2 * np.pi * _if * pulse.start / 1e9 ) # pulse start, duration and finish are in ns mod_i, mod_q = modulate( - i, q, num_samples, pulse._if, global_phase + pulse.relative_phase, sampling_rate + i, q, num_samples, _if, global_phase + pulse.relative_phase, sampling_rate ) np.testing.assert_allclose(pulse.shape.envelope_waveform_i(sampling_rate).data, i) From ac01562c11a4e6cf2501b88730dd9651d5e43eb1 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 18 Jan 2024 17:50:55 +0100 Subject: [PATCH 0043/1006] Pass explicitly the if to modulated waveform tests --- tests/test_pulses.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/test_pulses.py b/tests/test_pulses.py index 97f14d6863..baaebe19da 100644 --- a/tests/test_pulses.py +++ b/tests/test_pulses.py @@ -638,10 +638,10 @@ def test_pulseshape_rectangular(): np.testing.assert_allclose(pulse.shape.envelope_waveform_i(sampling_rate).data, i) np.testing.assert_allclose(pulse.shape.envelope_waveform_q(sampling_rate).data, q) np.testing.assert_allclose( - pulse.shape.modulated_waveform_i(sampling_rate).data, mod_i + pulse.shape.modulated_waveform_i(_if, sampling_rate).data, mod_i ) np.testing.assert_allclose( - pulse.shape.modulated_waveform_q(sampling_rate).data, mod_q + pulse.shape.modulated_waveform_q(_if, sampling_rate).data, mod_q ) @@ -689,10 +689,10 @@ def test_pulseshape_gaussian(): np.testing.assert_allclose(pulse.shape.envelope_waveform_i(sampling_rate).data, i) np.testing.assert_allclose(pulse.shape.envelope_waveform_q(sampling_rate).data, q) np.testing.assert_allclose( - pulse.shape.modulated_waveform_i(sampling_rate).data, mod_i + pulse.shape.modulated_waveform_i(_if, sampling_rate).data, mod_i ) np.testing.assert_allclose( - pulse.shape.modulated_waveform_q(sampling_rate).data, mod_q + pulse.shape.modulated_waveform_q(_if, sampling_rate).data, mod_q ) @@ -746,10 +746,10 @@ def test_pulseshape_drag(): np.testing.assert_allclose(pulse.shape.envelope_waveform_i(sampling_rate).data, i) np.testing.assert_allclose(pulse.shape.envelope_waveform_q(sampling_rate).data, q) np.testing.assert_allclose( - pulse.shape.modulated_waveform_i(sampling_rate).data, mod_i + pulse.shape.modulated_waveform_i(_if, sampling_rate).data, mod_i ) np.testing.assert_allclose( - pulse.shape.modulated_waveform_q(sampling_rate).data, mod_q + pulse.shape.modulated_waveform_q(_if, sampling_rate).data, mod_q ) From 5568631ab11a96c85b7b970fceea5912f1421a5e Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 18 Jan 2024 17:57:26 +0100 Subject: [PATCH 0044/1006] Propagate IF parameter to all modulated call --- src/qibolab/pulses.py | 4 ++-- tests/test_pulses.py | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/qibolab/pulses.py b/src/qibolab/pulses.py index 5ecff0f1d0..53a53c4f99 100644 --- a/src/qibolab/pulses.py +++ b/src/qibolab/pulses.py @@ -144,13 +144,13 @@ def modulated_waveform_i(self, _if: int, sampling_rate=SAMPLING_RATE) -> Wavefor """The waveform of the i component of the pulse, modulated with its frequency.""" - return self.modulated_waveforms(sampling_rate)[0] + return self.modulated_waveforms(_if, sampling_rate)[0] def modulated_waveform_q(self, _if: int, sampling_rate=SAMPLING_RATE) -> Waveform: """The waveform of the q component of the pulse, modulated with its frequency.""" - return self.modulated_waveforms(sampling_rate)[1] + return self.modulated_waveforms(_if, sampling_rate)[1] def modulated_waveforms(self, _if: int, sampling_rate=SAMPLING_RATE): """A tuple with the i and q waveforms of the pulse, modulated with its diff --git a/tests/test_pulses.py b/tests/test_pulses.py index baaebe19da..6e0705ff39 100644 --- a/tests/test_pulses.py +++ b/tests/test_pulses.py @@ -37,7 +37,7 @@ def test_plot_functions(): p5 = Pulse(0, 40, 0.9, 400e6, 0, eCap(alpha=2), 0, PulseType.DRIVE) p6 = Pulse(0, 40, 0.9, 50e6, 0, GaussianSquare(5, 0.9), 0, PulseType.DRIVE, 2) ps = PulseSequence([p0, p1, p2, p3, p4, p5, p6]) - wf = p0.modulated_waveform_i() + wf = p0.modulated_waveform_i(0) plot_file = HERE / "test_plot.png" @@ -619,8 +619,8 @@ def test_pulseshape_rectangular(): assert repr(pulse.shape) == "Rectangular()" assert isinstance(pulse.shape.envelope_waveform_i(), Waveform) assert isinstance(pulse.shape.envelope_waveform_q(), Waveform) - assert isinstance(pulse.shape.modulated_waveform_i(), Waveform) - assert isinstance(pulse.shape.modulated_waveform_q(), Waveform) + assert isinstance(pulse.shape.modulated_waveform_i(_if), Waveform) + assert isinstance(pulse.shape.modulated_waveform_q(_if), Waveform) sampling_rate = 1 num_samples = int(pulse.duration / sampling_rate) @@ -665,8 +665,8 @@ def test_pulseshape_gaussian(): assert repr(pulse.shape) == "Gaussian(5)" assert isinstance(pulse.shape.envelope_waveform_i(), Waveform) assert isinstance(pulse.shape.envelope_waveform_q(), Waveform) - assert isinstance(pulse.shape.modulated_waveform_i(), Waveform) - assert isinstance(pulse.shape.modulated_waveform_q(), Waveform) + assert isinstance(pulse.shape.modulated_waveform_i(_if), Waveform) + assert isinstance(pulse.shape.modulated_waveform_q(_if), Waveform) sampling_rate = 1 num_samples = int(pulse.duration / sampling_rate) @@ -717,8 +717,8 @@ def test_pulseshape_drag(): assert repr(pulse.shape) == "Drag(5, 0.2)" assert isinstance(pulse.shape.envelope_waveform_i(), Waveform) assert isinstance(pulse.shape.envelope_waveform_q(), Waveform) - assert isinstance(pulse.shape.modulated_waveform_i(), Waveform) - assert isinstance(pulse.shape.modulated_waveform_q(), Waveform) + assert isinstance(pulse.shape.modulated_waveform_i(_if), Waveform) + assert isinstance(pulse.shape.modulated_waveform_q(_if), Waveform) sampling_rate = 1 num_samples = int(pulse.duration / 1 * sampling_rate) From 0bb09c28c86c55fbc7ebc437fe02adf0d84832ad Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 18 Jan 2024 18:18:40 +0100 Subject: [PATCH 0045/1006] Start rearranging pulses into a subpackage --- src/qibolab/pulses/__init__.py | 0 src/qibolab/pulses/plot.py | 128 +++++ src/qibolab/pulses/pulse.py | 199 +++++++ src/qibolab/pulses/sequence.py | 260 +++++++++ src/qibolab/{pulses.py => pulses/shape.py} | 625 +-------------------- src/qibolab/pulses/waveform.py | 42 ++ 6 files changed, 630 insertions(+), 624 deletions(-) create mode 100644 src/qibolab/pulses/__init__.py create mode 100644 src/qibolab/pulses/plot.py create mode 100644 src/qibolab/pulses/pulse.py create mode 100644 src/qibolab/pulses/sequence.py rename src/qibolab/{pulses.py => pulses/shape.py} (51%) create mode 100644 src/qibolab/pulses/waveform.py diff --git a/src/qibolab/pulses/__init__.py b/src/qibolab/pulses/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/qibolab/pulses/plot.py b/src/qibolab/pulses/plot.py new file mode 100644 index 0000000000..1328268f20 --- /dev/null +++ b/src/qibolab/pulses/plot.py @@ -0,0 +1,128 @@ +"""Plotting tools for pulses and related entities.""" +import matplotlib.pyplot as plt +import numpy as np + +from .pulse import Pulse +from .shape import SAMPLING_RATE +from .waveform import Waveform + + +def waveform(wf: Waveform, filename=None): + """Plot the waveform. + + Args: + filename (str): a file path. If provided the plot is save to a file. + """ + plt.figure(figsize=(14, 5), dpi=200) + plt.plot(wf.data, c="C0", linestyle="dashed") + plt.xlabel("Sample Number") + plt.ylabel("Amplitude") + plt.grid(visible=True, which="both", axis="both", color="#888888", linestyle="-") + if filename: + plt.savefig(filename) + else: + plt.show() + plt.close() + + +def pulse(pulse_: Pulse, filename=None, sampling_rate=SAMPLING_RATE): + """Plot the pulse envelope and modulated waveforms. + + Args: + filename (str): a file path. If provided the plot is save to a file. + """ + import matplotlib.pyplot as plt + from matplotlib import gridspec + + waveform_i = pulse_.shape.envelope_waveform_i(sampling_rate) + waveform_q = pulse_.shape.envelope_waveform_q(sampling_rate) + + num_samples = len(waveform_i) + time = pulse_.start + np.arange(num_samples) / sampling_rate + _ = plt.figure(figsize=(14, 5), dpi=200) + gs = gridspec.GridSpec(ncols=2, nrows=1, width_ratios=np.array([2, 1])) + ax1 = plt.subplot(gs[0]) + ax1.plot( + time, + waveform_i.data, + label="envelope i", + c="C0", + linestyle="dashed", + ) + ax1.plot( + time, + waveform_q.data, + label="envelope q", + c="C1", + linestyle="dashed", + ) + ax1.plot( + time, + pulse_.shape.modulated_waveform_i(sampling_rate).data, + label="modulated i", + c="C0", + ) + ax1.plot( + time, + pulse_.shape.modulated_waveform_q(sampling_rate).data, + label="modulated q", + c="C1", + ) + ax1.plot(time, -waveform_i.data, c="silver", linestyle="dashed") + ax1.set_xlabel("Time [ns]") + ax1.set_ylabel("Amplitude") + + ax1.grid(visible=True, which="both", axis="both", color="#888888", linestyle="-") + start = float(pulse_.start) + finish = float(pulse._finish) if pulse._finish is not None else 0.0 + ax1.axis((start, finish, -1.0, 1.0)) + ax1.legend() + + modulated_i = pulse_.shape.modulated_waveform_i(sampling_rate).data + modulated_q = pulse_.shape.modulated_waveform_q(sampling_rate).data + ax2 = plt.subplot(gs[1]) + ax2.plot( + modulated_i, + modulated_q, + label="modulated", + c="C3", + ) + ax2.plot( + waveform_i.data, + waveform_q.data, + label="envelope", + c="C2", + ) + ax2.plot( + modulated_i[0], + modulated_q[0], + marker="o", + markersize=5, + label="start", + c="lightcoral", + ) + ax2.plot( + modulated_i[-1], + modulated_q[-1], + marker="o", + markersize=5, + label="finish", + c="darkred", + ) + + ax2.plot( + np.cos(time * 2 * np.pi / pulse_.duration), + np.sin(time * 2 * np.pi / pulse_.duration), + c="silver", + linestyle="dashed", + ) + + ax2.grid(visible=True, which="both", axis="both", color="#888888", linestyle="-") + ax2.legend() + # ax2.axis([ -1, 1, -1, 1]) + ax2.axis("equal") + if filename: + plt.savefig(filename) + else: + plt.show() + plt.close() diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py new file mode 100644 index 0000000000..18e16c2530 --- /dev/null +++ b/src/qibolab/pulses/pulse.py @@ -0,0 +1,199 @@ +"""Pulse class.""" +import copy +from dataclasses import dataclass, fields +from enum import Enum +from typing import Optional + + +class PulseType(Enum): + """An enumeration to distinguish different types of pulses. + + READOUT pulses triger acquisitions. DRIVE pulses are used to control + qubit states. FLUX pulses are used to shift the frequency of flux + tunable qubits and with it implement two-qubit gates. + """ + + READOUT = "ro" + DRIVE = "qd" + FLUX = "qf" + COUPLERFLUX = "cf" + + +@dataclass +class Pulse: + """A class to represent a pulse to be sent to the QPU.""" + + start: int + """Start time of pulse in ns.""" + duration: int + """Pulse duration in ns.""" + amplitude: float + """Pulse digital amplitude (unitless). + + Pulse amplitudes are normalised between -1 and 1. + """ + frequency: int + """Pulse Intermediate Frequency in Hz. + + The value has to be in the range [10e6 to 300e6]. + """ + relative_phase: float + """Relative phase of the pulse, in radians.""" + shape: PulseShape + """Pulse shape, as a PulseShape object. + + See + :py: mod:`qibolab.pulses` for list of available shapes. + """ + channel: Optional[str] = None + """Channel on which the pulse should be played. + + When a sequence of pulses is sent to the platform for execution, + each pulse is sent to the instrument responsible for playing pulses + the pulse channel. The connection of instruments with channels is + defined in the platform runcard. + """ + type: PulseType = PulseType.DRIVE + """Pulse type, as an element of PulseType enumeration.""" + qubit: int = 0 + """Qubit or coupler addressed by the pulse.""" + + def __post_init__(self): + if isinstance(self.type, str): + self.type = PulseType(self.type) + if isinstance(self.shape, str): + self.shape = PulseShape.eval(self.shape) + # TODO: drop the cyclic reference + self.shape.pulse = self + + @classmethod + def flux(cls, start, duration, amplitude, shape, **kwargs): + return cls( + start, duration, amplitude, 0, 0, shape, type=PulseType.FLUX, **kwargs + ) + + @property + def finish(self) -> Optional[int]: + """Time when the pulse is scheduled to finish.""" + if None in {self.start, self.duration}: + return None + return self.start + self.duration + + @property + def global_phase(self): + """Global phase of the pulse, in radians. + + This phase is calculated from the pulse start time and frequency + as `2 * pi * frequency * start`. + """ + if self.type is PulseType.READOUT: + # readout pulses should have zero global phase so that we can + # calculate probabilities in the i-q plane + return 0 + + # pulse start, duration and finish are in ns + return 2 * np.pi * self.frequency * self.start / 1e9 + + @property + def phase(self) -> float: + """Total phase of the pulse, in radians. + + The total phase is computed as the sum of the global and + relative phases. + """ + return self.global_phase + self.relative_phase + + @property + def id(self) -> int: + return id(self) + + def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: + """The envelope waveform of the i component of the pulse.""" + + return self.shape.envelope_waveform_i(sampling_rate) + + def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: + """The envelope waveform of the q component of the pulse.""" + + return self.shape.envelope_waveform_q(sampling_rate) + + def envelope_waveforms( + self, sampling_rate=SAMPLING_RATE + ): # -> tuple[Waveform, Waveform]: + """A tuple with the i and q envelope waveforms of the pulse.""" + + return ( + self.shape.envelope_waveform_i(sampling_rate), + self.shape.envelope_waveform_q(sampling_rate), + ) + + def modulated_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: + """The waveform of the i component of the pulse, modulated with its + frequency.""" + + return self.shape.modulated_waveform_i(sampling_rate) + + def modulated_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: + """The waveform of the q component of the pulse, modulated with its + frequency.""" + + return self.shape.modulated_waveform_q(sampling_rate) + + def modulated_waveforms(self, sampling_rate): # -> tuple[Waveform, Waveform]: + """A tuple with the i and q waveforms of the pulse, modulated with its + frequency.""" + + return self.shape.modulated_waveforms(sampling_rate) + + def __hash__(self): + """Hash the content. + + .. warning:: + + unhashable attributes are not taken into account, so there will be more + clashes than those usually expected with a regular hash + + .. todo:: + + This method should be eventually dropped, and be provided automatically by + freezing the dataclass (i.e. setting ``frozen=true`` in the decorator). + However, at the moment is not possible nor desired, because it contains + unhashable attributes and because some instances are mutated inside Qibolab. + """ + return hash( + tuple( + getattr(self, f.name) + for f in fields(self) + if f.name not in ("type", "shape") + ) + ) + + def __add__(self, other): + if isinstance(other, Pulse): + return PulseSequence(self, other) + if isinstance(other, PulseSequence): + return PulseSequence(self, *other) + raise TypeError(f"Expected Pulse or PulseSequence; got {type(other).__name__}") + + def __mul__(self, n): + if not isinstance(n, int): + raise TypeError(f"Expected int; got {type(n).__name__}") + if n < 0: + raise TypeError(f"argument n should be >=0, got {n}") + return PulseSequence(*([copy.deepcopy(self)] * n)) + + def __rmul__(self, n): + return self.__mul__(n) + + def is_equal_ignoring_start(self, item) -> bool: + """Check if two pulses are equal ignoring start time.""" + return ( + self.duration == item.duration + and self.amplitude == item.amplitude + and self.frequency == item.frequency + and self.relative_phase == item.relative_phase + and self.shape == item.shape + and self.channel == item.channel + and self.type == item.type + and self.qubit == item.qubit + ) diff --git a/src/qibolab/pulses/sequence.py b/src/qibolab/pulses/sequence.py new file mode 100644 index 0000000000..fc488a3721 --- /dev/null +++ b/src/qibolab/pulses/sequence.py @@ -0,0 +1,260 @@ +"""PulseSequence class.""" +import numpy as np + + +class PulseSequence(list): + """A collection of scheduled pulses. + + A quantum circuit can be translated into a set of scheduled pulses + that implement the circuit gates. This class contains many + supporting fuctions to facilitate the creation and manipulation of + these collections of pulses. None of the methods of PulseSequence + modify any of the properties of its pulses. + """ + + def __add__(self, other): + """Return self+value.""" + return type(self)(super().__add__(other)) + + def __mul__(self, other): + """Return self*value.""" + return type(self)(super().__mul__(other)) + + def __repr__(self): + """Return repr(self).""" + return f"{type(self).__name__}({super().__repr__()})" + + def copy(self): + """Return a shallow copy of the sequence.""" + return type(self)(super().copy()) + + @property + def ro_pulses(self): + """A new sequence containing only its readout pulses.""" + new_pc = PulseSequence() + for pulse in self: + if pulse.type == PulseType.READOUT: + new_pc.append(pulse) + return new_pc + + @property + def qd_pulses(self): + """A new sequence containing only its qubit drive pulses.""" + new_pc = PulseSequence() + for pulse in self: + if pulse.type == PulseType.DRIVE: + new_pc.append(pulse) + return new_pc + + @property + def qf_pulses(self): + """A new sequence containing only its qubit flux pulses.""" + new_pc = PulseSequence() + for pulse in self: + if pulse.type == PulseType.FLUX: + new_pc.append(pulse) + return new_pc + + @property + def cf_pulses(self): + """A new sequence containing only its coupler flux pulses.""" + new_pc = PulseSequence() + for pulse in self: + if pulse.type is PulseType.COUPLERFLUX: + new_pc.append(pulse) + return new_pc + + def get_channel_pulses(self, *channels): + """Return a new sequence containing the pulses on some channels.""" + new_pc = PulseSequence() + for pulse in self: + if pulse.channel in channels: + new_pc.append(pulse) + return new_pc + + def get_qubit_pulses(self, *qubits): + """Return a new sequence containing the pulses on some qubits.""" + new_pc = PulseSequence() + for pulse in self: + if pulse.type is not PulseType.COUPLERFLUX: + if pulse.qubit in qubits: + new_pc.append(pulse) + return new_pc + + def coupler_pulses(self, *couplers): + """Return a new sequence containing the pulses on some couplers.""" + new_pc = PulseSequence() + for pulse in self: + if pulse.type is not PulseType.COUPLERFLUX: + if pulse.qubit in couplers: + new_pc.append(pulse) + return new_pc + + @property + def finish(self) -> int: + """The time when the last pulse of the sequence finishes.""" + t: int = 0 + for pulse in self: + if pulse.finish > t: + t = pulse.finish + return t + + @property + def start(self) -> int: + """The start time of the first pulse of the sequence.""" + t = self.finish + for pulse in self: + if pulse.start < t: + t = pulse.start + return t + + @property + def duration(self) -> int: + """Duration of the sequence calculated as its finish - start times.""" + return self.finish - self.start + + @property + def channels(self) -> list: + """List containing the channels used by the pulses in the sequence.""" + channels = [] + for pulse in self: + if not pulse.channel in channels: + channels.append(pulse.channel) + channels.sort() + return channels + + @property + def qubits(self) -> list: + """The qubits associated with the pulses in the sequence.""" + qubits = [] + for pulse in self: + if not pulse.qubit in qubits: + qubits.append(pulse.qubit) + qubits.sort() + return qubits + + def get_pulse_overlaps(self): # -> dict((int,int): PulseSequence): + """Return a dictionary of slices of time (tuples with start and finish + times) where pulses overlap.""" + times = [] + for pulse in self: + if not pulse.start in times: + times.append(pulse.start) + if not pulse.finish in times: + times.append(pulse.finish) + times.sort() + + overlaps = {} + for n in range(len(times) - 1): + overlaps[(times[n], times[n + 1])] = PulseSequence() + for pulse in self: + if (pulse.start <= times[n]) & (pulse.finish >= times[n + 1]): + overlaps[(times[n], times[n + 1])] += [pulse] + return overlaps + + def separate_overlapping_pulses(self): # -> dict((int,int): PulseSequence): + """Separate a sequence of overlapping pulses into a list of non- + overlapping sequences.""" + # This routine separates the pulses of a sequence into non-overlapping sets + # but it does not check if the frequencies of the pulses within a set have the same frequency + + separated_pulses = [] + for new_pulse in self: + stored = False + for ps in separated_pulses: + overlaps = False + for existing_pulse in ps: + if ( + new_pulse.start < existing_pulse.finish + and new_pulse.finish > existing_pulse.start + ): + overlaps = True + break + if not overlaps: + ps.append(new_pulse) + stored = True + break + if not stored: + separated_pulses.append(PulseSequence([new_pulse])) + return separated_pulses + + # TODO: Implement separate_different_frequency_pulses() + + @property + def pulses_overlap(self) -> bool: + """Whether any of the pulses in the sequence overlap.""" + overlap = False + for pc in self.get_pulse_overlaps().values(): + if len(pc) > 1: + overlap = True + break + return overlap + + def plot(self, savefig_filename=None, sampling_rate=SAMPLING_RATE): + """Plot the sequence of pulses. + + Args: + savefig_filename (str): a file path. If provided the plot is save to a file. + """ + if len(self) > 0: + import matplotlib.pyplot as plt + from matplotlib import gridspec + + fig = plt.figure(figsize=(14, 2 * len(self)), dpi=200) + gs = gridspec.GridSpec(ncols=1, nrows=len(self)) + vertical_lines = [] + for pulse in self: + vertical_lines.append(pulse.start) + vertical_lines.append(pulse.finish) + + n = -1 + for qubit in self.qubits: + qubit_pulses = self.get_qubit_pulses(qubit) + for channel in qubit_pulses.channels: + n += 1 + channel_pulses = qubit_pulses.get_channel_pulses(channel) + ax = plt.subplot(gs[n]) + ax.axis([0, self.finish, -1, 1]) + for pulse in channel_pulses: + num_samples = len( + pulse.shape.modulated_waveform_i(sampling_rate) + ) + time = pulse.start + np.arange(num_samples) / sampling_rate + ax.plot( + time, + pulse.shape.modulated_waveform_q(sampling_rate).data, + c="lightgrey", + ) + ax.plot( + time, + pulse.shape.modulated_waveform_i(sampling_rate).data, + c=f"C{str(n)}", + ) + ax.plot( + time, + pulse.shape.envelope_waveform_i(sampling_rate).data, + c=f"C{str(n)}", + ) + ax.plot( + time, + -pulse.shape.envelope_waveform_i(sampling_rate).data, + c=f"C{str(n)}", + ) + # TODO: if they overlap use different shades + ax.axhline(0, c="dimgrey") + ax.set_ylabel(f"qubit {qubit} \n channel {channel}") + for vl in vertical_lines: + ax.axvline(vl, c="slategrey", linestyle="--") + ax.axis([0, self.finish, -1, 1]) + ax.grid( + visible=True, + which="both", + axis="both", + color="#CCCCCC", + linestyle="-", + ) + if savefig_filename: + plt.savefig(savefig_filename) + else: + plt.show() + plt.close() diff --git a/src/qibolab/pulses.py b/src/qibolab/pulses/shape.py similarity index 51% rename from src/qibolab/pulses.py rename to src/qibolab/pulses/shape.py index 53a53c4f99..1d754e86e6 100644 --- a/src/qibolab/pulses.py +++ b/src/qibolab/pulses/shape.py @@ -1,12 +1,7 @@ -"""Pulse and PulseSequence classes.""" -import copy +"""PulseShape class.""" import re from abc import ABC, abstractmethod -from dataclasses import dataclass, fields -from enum import Enum -from typing import Optional -import numpy as np from qibo.config import log from scipy.signal import lfilter @@ -18,81 +13,6 @@ """ -class PulseType(Enum): - """An enumeration to distinguish different types of pulses. - - READOUT pulses triger acquisitions. DRIVE pulses are used to control - qubit states. FLUX pulses are used to shift the frequency of flux - tunable qubits and with it implement two-qubit gates. - """ - - READOUT = "ro" - DRIVE = "qd" - FLUX = "qf" - COUPLERFLUX = "cf" - - -class Waveform: - """A class to save pulse waveforms. - - A waveform is a list of samples, or discrete data points, used by the digital to analogue converters (DACs) - to synthesise pulses. - - Attributes: - data (np.ndarray): a numpy array containing the samples. - """ - - DECIMALS = 5 - - def __init__(self, data): - """Initialise the waveform with a of samples.""" - self.data: np.ndarray = np.array(data) - - def __len__(self): - """Return the length of the waveform, the number of samples.""" - return len(self.data) - - def __hash__(self): - """Hash the underlying data. - - .. todo:: - - In order to make this reliable, we should set the data as immutable. This we - could by making both the class frozen and the contained array readonly - https://numpy.org/doc/stable/reference/generated/numpy.ndarray.flags.html#numpy.ndarray.flags - """ - return hash(self.data.tobytes()) - - def __eq__(self, other): - """Compare two waveforms. - - Two waveforms are considered equal if their samples, rounded to - `Waveform.DECIMALS` decimal places, are all equal. - """ - return np.allclose(self.data, other.data) - - def plot(self, savefig_filename=None): - """Plot the waveform. - - Args: - savefig_filename (str): a file path. If provided the plot is save to a file. - """ - import matplotlib.pyplot as plt - - plt.figure(figsize=(14, 5), dpi=200) - plt.plot(self.data, c="C0", linestyle="dashed") - plt.xlabel("Sample Number") - plt.ylabel("Amplitude") - plt.grid( - visible=True, which="both", axis="both", color="#888888", linestyle="-" - ) - if savefig_filename: - plt.savefig(savefig_filename) - else: - plt.show() - plt.close() - - class ShapeInitError(RuntimeError): """Error raised when a pulse has not been fully defined.""" @@ -708,546 +628,3 @@ def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: def __repr__(self): return f"{self.name}({self.envelope_i[:3]}, ..., {self.envelope_q[:3]}, ...)" - - -@dataclass -class Pulse: - """A class to represent a pulse to be sent to the QPU.""" - - start: int - """Start time of pulse in ns.""" - duration: int - """Pulse duration in ns.""" - amplitude: float - """Pulse digital amplitude (unitless). - - Pulse amplitudes are normalised between -1 and 1. - """ - frequency: int - """Pulse Intermediate Frequency in Hz. - - The value has to be in the range [10e6 to 300e6]. - """ - relative_phase: float - """Relative phase of the pulse, in radians.""" - shape: PulseShape - """Pulse shape, as a PulseShape object. - - See - :py: mod:`qibolab.pulses` for list of available shapes. - """ - channel: Optional[str] = None - """Channel on which the pulse should be played. - - When a sequence of pulses is sent to the platform for execution, - each pulse is sent to the instrument responsible for playing pulses - the pulse channel. The connection of instruments with channels is - defined in the platform runcard. - """ - type: PulseType = PulseType.DRIVE - """Pulse type, as an element of PulseType enumeration.""" - qubit: int = 0 - """Qubit or coupler addressed by the pulse.""" - - def __post_init__(self): - if isinstance(self.type, str): - self.type = PulseType(self.type) - if isinstance(self.shape, str): - self.shape = PulseShape.eval(self.shape) - # TODO: drop the cyclic reference - self.shape.pulse = self - - @classmethod - def flux(cls, start, duration, amplitude, shape, **kwargs): - return cls( - start, duration, amplitude, 0, 0, shape, type=PulseType.FLUX, **kwargs - ) - - @property - def finish(self) -> Optional[int]: - """Time when the pulse is scheduled to finish.""" - if None in {self.start, self.duration}: - return None - return self.start + self.duration - - @property - def global_phase(self): - """Global phase of the pulse, in radians. - - This phase is calculated from the pulse start time and frequency - as `2 * pi * frequency * start`. - """ - if self.type is PulseType.READOUT: - # readout pulses should have zero global phase so that we can - # calculate probabilities in the i-q plane - return 0 - - # pulse start, duration and finish are in ns - return 2 * np.pi * self.frequency * self.start / 1e9 - - @property - def phase(self) -> float: - """Total phase of the pulse, in radians. - - The total phase is computed as the sum of the global and - relative phases. - """ - return self.global_phase + self.relative_phase - - @property - def id(self) -> int: - return id(self) - - def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: - """The envelope waveform of the i component of the pulse.""" - - return self.shape.envelope_waveform_i(sampling_rate) - - def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: - """The envelope waveform of the q component of the pulse.""" - - return self.shape.envelope_waveform_q(sampling_rate) - - def envelope_waveforms( - self, sampling_rate=SAMPLING_RATE - ): # -> tuple[Waveform, Waveform]: - """A tuple with the i and q envelope waveforms of the pulse.""" - - return ( - self.shape.envelope_waveform_i(sampling_rate), - self.shape.envelope_waveform_q(sampling_rate), - ) - - def modulated_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: - """The waveform of the i component of the pulse, modulated with its - frequency.""" - - return self.shape.modulated_waveform_i(sampling_rate) - - def modulated_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: - """The waveform of the q component of the pulse, modulated with its - frequency.""" - - return self.shape.modulated_waveform_q(sampling_rate) - - def modulated_waveforms(self, sampling_rate): # -> tuple[Waveform, Waveform]: - """A tuple with the i and q waveforms of the pulse, modulated with its - frequency.""" - - return self.shape.modulated_waveforms(sampling_rate) - - def __hash__(self): - """Hash the content. - - .. warning:: - - unhashable attributes are not taken into account, so there will be more - clashes than those usually expected with a regular hash - - .. todo:: - - This method should be eventually dropped, and be provided automatically by - freezing the dataclass (i.e. setting ``frozen=true`` in the decorator). - However, at the moment is not possible nor desired, because it contains - unhashable attributes and because some instances are mutated inside Qibolab. - """ - return hash( - tuple( - getattr(self, f.name) - for f in fields(self) - if f.name not in ("type", "shape") - ) - ) - - def __add__(self, other): - if isinstance(other, Pulse): - return PulseSequence(self, other) - if isinstance(other, PulseSequence): - return PulseSequence(self, *other) - raise TypeError(f"Expected Pulse or PulseSequence; got {type(other).__name__}") - - def __mul__(self, n): - if not isinstance(n, int): - raise TypeError(f"Expected int; got {type(n).__name__}") - if n < 0: - raise TypeError(f"argument n should be >=0, got {n}") - return PulseSequence(*([copy.deepcopy(self)] * n)) - - def __rmul__(self, n): - return self.__mul__(n) - - def is_equal_ignoring_start(self, item) -> bool: - """Check if two pulses are equal ignoring start time.""" - return ( - self.duration == item.duration - and self.amplitude == item.amplitude - and self.frequency == item.frequency - and self.relative_phase == item.relative_phase - and self.shape == item.shape - and self.channel == item.channel - and self.type == item.type - and self.qubit == item.qubit - ) - - def plot(self, savefig_filename=None, sampling_rate=SAMPLING_RATE): - """Plots the pulse envelope and modulated waveforms. - - Args: - savefig_filename (str): a file path. If provided the plot is save to a file. - """ - - import matplotlib.pyplot as plt - from matplotlib import gridspec - - waveform_i = self.shape.envelope_waveform_i(sampling_rate) - waveform_q = self.shape.envelope_waveform_q(sampling_rate) - - num_samples = len(waveform_i) - time = self.start + np.arange(num_samples) / sampling_rate - fig = plt.figure(figsize=(14, 5), dpi=200) - gs = gridspec.GridSpec(ncols=2, nrows=1, width_ratios=[2, 1]) - ax1 = plt.subplot(gs[0]) - ax1.plot( - time, - waveform_i.data, - label="envelope i", - c="C0", - linestyle="dashed", - ) - ax1.plot( - time, - waveform_q.data, - label="envelope q", - c="C1", - linestyle="dashed", - ) - ax1.plot( - time, - self.shape.modulated_waveform_i(sampling_rate).data, - label="modulated i", - c="C0", - ) - ax1.plot( - time, - self.shape.modulated_waveform_q(sampling_rate).data, - label="modulated q", - c="C1", - ) - ax1.plot(time, -waveform_i.data, c="silver", linestyle="dashed") - ax1.set_xlabel("Time [ns]") - ax1.set_ylabel("Amplitude") - - ax1.grid( - visible=True, which="both", axis="both", color="#888888", linestyle="-" - ) - ax1.axis([self.start, self.finish, -1, 1]) - ax1.legend() - - modulated_i = self.shape.modulated_waveform_i(sampling_rate).data - modulated_q = self.shape.modulated_waveform_q(sampling_rate).data - ax2 = plt.subplot(gs[1]) - ax2.plot( - modulated_i, - modulated_q, - label="modulated", - c="C3", - ) - ax2.plot( - waveform_i.data, - waveform_q.data, - label="envelope", - c="C2", - ) - ax2.plot( - modulated_i[0], - modulated_q[0], - marker="o", - markersize=5, - label="start", - c="lightcoral", - ) - ax2.plot( - modulated_i[-1], - modulated_q[-1], - marker="o", - markersize=5, - label="finish", - c="darkred", - ) - - ax2.plot( - np.cos(time * 2 * np.pi / self.duration), - np.sin(time * 2 * np.pi / self.duration), - c="silver", - linestyle="dashed", - ) - - ax2.grid( - visible=True, which="both", axis="both", color="#888888", linestyle="-" - ) - ax2.legend() - # ax2.axis([ -1, 1, -1, 1]) - ax2.axis("equal") - if savefig_filename: - plt.savefig(savefig_filename) - else: - plt.show() - plt.close() - - -class PulseSequence(list): - """A collection of scheduled pulses. - - A quantum circuit can be translated into a set of scheduled pulses - that implement the circuit gates. This class contains many - supporting fuctions to facilitate the creation and manipulation of - these collections of pulses. None of the methods of PulseSequence - modify any of the properties of its pulses. - """ - - def __add__(self, other): - """Return self+value.""" - return type(self)(super().__add__(other)) - - def __mul__(self, other): - """Return self*value.""" - return type(self)(super().__mul__(other)) - - def __repr__(self): - """Return repr(self).""" - return f"{type(self).__name__}({super().__repr__()})" - - def copy(self): - """Return a shallow copy of the sequence.""" - return type(self)(super().copy()) - - @property - def ro_pulses(self): - """A new sequence containing only its readout pulses.""" - new_pc = PulseSequence() - for pulse in self: - if pulse.type == PulseType.READOUT: - new_pc.append(pulse) - return new_pc - - @property - def qd_pulses(self): - """A new sequence containing only its qubit drive pulses.""" - new_pc = PulseSequence() - for pulse in self: - if pulse.type == PulseType.DRIVE: - new_pc.append(pulse) - return new_pc - - @property - def qf_pulses(self): - """A new sequence containing only its qubit flux pulses.""" - new_pc = PulseSequence() - for pulse in self: - if pulse.type == PulseType.FLUX: - new_pc.append(pulse) - return new_pc - - @property - def cf_pulses(self): - """A new sequence containing only its coupler flux pulses.""" - new_pc = PulseSequence() - for pulse in self: - if pulse.type is PulseType.COUPLERFLUX: - new_pc.append(pulse) - return new_pc - - def get_channel_pulses(self, *channels): - """Return a new sequence containing the pulses on some channels.""" - new_pc = PulseSequence() - for pulse in self: - if pulse.channel in channels: - new_pc.append(pulse) - return new_pc - - def get_qubit_pulses(self, *qubits): - """Return a new sequence containing the pulses on some qubits.""" - new_pc = PulseSequence() - for pulse in self: - if pulse.type is not PulseType.COUPLERFLUX: - if pulse.qubit in qubits: - new_pc.append(pulse) - return new_pc - - def coupler_pulses(self, *couplers): - """Return a new sequence containing the pulses on some couplers.""" - new_pc = PulseSequence() - for pulse in self: - if pulse.type is not PulseType.COUPLERFLUX: - if pulse.qubit in couplers: - new_pc.append(pulse) - return new_pc - - @property - def finish(self) -> int: - """The time when the last pulse of the sequence finishes.""" - t: int = 0 - for pulse in self: - if pulse.finish > t: - t = pulse.finish - return t - - @property - def start(self) -> int: - """The start time of the first pulse of the sequence.""" - t = self.finish - for pulse in self: - if pulse.start < t: - t = pulse.start - return t - - @property - def duration(self) -> int: - """Duration of the sequence calculated as its finish - start times.""" - return self.finish - self.start - - @property - def channels(self) -> list: - """List containing the channels used by the pulses in the sequence.""" - channels = [] - for pulse in self: - if not pulse.channel in channels: - channels.append(pulse.channel) - channels.sort() - return channels - - @property - def qubits(self) -> list: - """The qubits associated with the pulses in the sequence.""" - qubits = [] - for pulse in self: - if not pulse.qubit in qubits: - qubits.append(pulse.qubit) - qubits.sort() - return qubits - - def get_pulse_overlaps(self): # -> dict((int,int): PulseSequence): - """Return a dictionary of slices of time (tuples with start and finish - times) where pulses overlap.""" - times = [] - for pulse in self: - if not pulse.start in times: - times.append(pulse.start) - if not pulse.finish in times: - times.append(pulse.finish) - times.sort() - - overlaps = {} - for n in range(len(times) - 1): - overlaps[(times[n], times[n + 1])] = PulseSequence() - for pulse in self: - if (pulse.start <= times[n]) & (pulse.finish >= times[n + 1]): - overlaps[(times[n], times[n + 1])] += [pulse] - return overlaps - - def separate_overlapping_pulses(self): # -> dict((int,int): PulseSequence): - """Separate a sequence of overlapping pulses into a list of non- - overlapping sequences.""" - # This routine separates the pulses of a sequence into non-overlapping sets - # but it does not check if the frequencies of the pulses within a set have the same frequency - - separated_pulses = [] - for new_pulse in self: - stored = False - for ps in separated_pulses: - overlaps = False - for existing_pulse in ps: - if ( - new_pulse.start < existing_pulse.finish - and new_pulse.finish > existing_pulse.start - ): - overlaps = True - break - if not overlaps: - ps.append(new_pulse) - stored = True - break - if not stored: - separated_pulses.append(PulseSequence([new_pulse])) - return separated_pulses - - # TODO: Implement separate_different_frequency_pulses() - - @property - def pulses_overlap(self) -> bool: - """Whether any of the pulses in the sequence overlap.""" - overlap = False - for pc in self.get_pulse_overlaps().values(): - if len(pc) > 1: - overlap = True - break - return overlap - - def plot(self, savefig_filename=None, sampling_rate=SAMPLING_RATE): - """Plot the sequence of pulses. - - Args: - savefig_filename (str): a file path. If provided the plot is save to a file. - """ - if len(self) > 0: - import matplotlib.pyplot as plt - from matplotlib import gridspec - - fig = plt.figure(figsize=(14, 2 * len(self)), dpi=200) - gs = gridspec.GridSpec(ncols=1, nrows=len(self)) - vertical_lines = [] - for pulse in self: - vertical_lines.append(pulse.start) - vertical_lines.append(pulse.finish) - - n = -1 - for qubit in self.qubits: - qubit_pulses = self.get_qubit_pulses(qubit) - for channel in qubit_pulses.channels: - n += 1 - channel_pulses = qubit_pulses.get_channel_pulses(channel) - ax = plt.subplot(gs[n]) - ax.axis([0, self.finish, -1, 1]) - for pulse in channel_pulses: - num_samples = len( - pulse.shape.modulated_waveform_i(sampling_rate) - ) - time = pulse.start + np.arange(num_samples) / sampling_rate - ax.plot( - time, - pulse.shape.modulated_waveform_q(sampling_rate).data, - c="lightgrey", - ) - ax.plot( - time, - pulse.shape.modulated_waveform_i(sampling_rate).data, - c=f"C{str(n)}", - ) - ax.plot( - time, - pulse.shape.envelope_waveform_i(sampling_rate).data, - c=f"C{str(n)}", - ) - ax.plot( - time, - -pulse.shape.envelope_waveform_i(sampling_rate).data, - c=f"C{str(n)}", - ) - # TODO: if they overlap use different shades - ax.axhline(0, c="dimgrey") - ax.set_ylabel(f"qubit {qubit} \n channel {channel}") - for vl in vertical_lines: - ax.axvline(vl, c="slategrey", linestyle="--") - ax.axis([0, self.finish, -1, 1]) - ax.grid( - visible=True, - which="both", - axis="both", - color="#CCCCCC", - linestyle="-", - ) - if savefig_filename: - plt.savefig(savefig_filename) - else: - plt.show() - plt.close() diff --git a/src/qibolab/pulses/waveform.py b/src/qibolab/pulses/waveform.py new file mode 100644 index 0000000000..7c530bf362 --- /dev/null +++ b/src/qibolab/pulses/waveform.py @@ -0,0 +1,42 @@ +"""Waveform class.""" +import numpy as np + + +class Waveform: + """A class to save pulse waveforms. + + A waveform is a list of samples, or discrete data points, used by the digital to analogue converters (DACs) + to synthesise pulses. + + Attributes: + data (np.ndarray): a numpy array containing the samples. + """ + + DECIMALS = 5 + + def __init__(self, data): + """Initialise the waveform with a of samples.""" + self.data: np.ndarray = np.array(data) + + def __len__(self): + """Return the length of the waveform, the number of samples.""" + return len(self.data) + + def __hash__(self): + """Hash the underlying data. + + .. todo:: + + In order to make this reliable, we should set the data as immutable. This we + could by making both the class frozen and the contained array readonly + https://numpy.org/doc/stable/reference/generated/numpy.ndarray.flags.html#numpy.ndarray.flags + """ + return hash(self.data.tobytes()) + + def __eq__(self, other): + """Compare two waveforms. + + Two waveforms are considered equal if their samples, rounded to + `Waveform.DECIMALS` decimal places, are all equal. + """ + return np.allclose(self.data, other.data) From 99bdec1d639c6895f31661c155deea4a84993164 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 18 Jan 2024 18:30:32 +0100 Subject: [PATCH 0046/1006] Exports relevant objects from pulses subpackage, fix internal imports --- src/qibolab/pulses/__init__.py | 16 ++++++++++++++++ src/qibolab/pulses/plot.py | 2 +- src/qibolab/pulses/pulse.py | 5 +++++ src/qibolab/pulses/sequence.py | 3 +++ src/qibolab/pulses/shape.py | 21 ++++++++++++--------- 5 files changed, 37 insertions(+), 10 deletions(-) diff --git a/src/qibolab/pulses/__init__.py b/src/qibolab/pulses/__init__.py index e69de29bb2..10478384c1 100644 --- a/src/qibolab/pulses/__init__.py +++ b/src/qibolab/pulses/__init__.py @@ -0,0 +1,16 @@ +from .pulse import Pulse, PulseType +from .sequence import PulseSequence +from .shape import ( + IIR, + SAMPLING_RATE, + SNZ, + Custom, + Drag, + Gaussian, + GaussianSquare, + PulseShape, + Rectangular, + ShapeInitError, + eCap, +) +from .waveform import Waveform diff --git a/src/qibolab/pulses/plot.py b/src/qibolab/pulses/plot.py index 1328268f20..8916e8bf05 100644 --- a/src/qibolab/pulses/plot.py +++ b/src/qibolab/pulses/plot.py @@ -74,7 +74,7 @@ def pulse(pulse_: Pulse, filename=None, sampling_rate=SAMPLING_RATE): ax1.grid(visible=True, which="both", axis="both", color="#888888", linestyle="-") start = float(pulse_.start) - finish = float(pulse._finish) if pulse._finish is not None else 0.0 + finish = float(pulse_.finish) if pulse_.finish is not None else 0.0 ax1.axis((start, finish, -1.0, 1.0)) ax1.legend() diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index 18e16c2530..6e7661bd46 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -4,6 +4,11 @@ from enum import Enum from typing import Optional +import numpy as np + +from .shape import SAMPLING_RATE, PulseShape +from .waveform import Waveform + class PulseType(Enum): """An enumeration to distinguish different types of pulses. diff --git a/src/qibolab/pulses/sequence.py b/src/qibolab/pulses/sequence.py index fc488a3721..a846a92d50 100644 --- a/src/qibolab/pulses/sequence.py +++ b/src/qibolab/pulses/sequence.py @@ -1,6 +1,9 @@ """PulseSequence class.""" import numpy as np +from .pulse import PulseType +from .shape import SAMPLING_RATE + class PulseSequence(list): """A collection of scheduled pulses. diff --git a/src/qibolab/pulses/shape.py b/src/qibolab/pulses/shape.py index 1d754e86e6..db3133f4c2 100644 --- a/src/qibolab/pulses/shape.py +++ b/src/qibolab/pulses/shape.py @@ -2,9 +2,12 @@ import re from abc import ABC, abstractmethod +import numpy as np from qibo.config import log from scipy.signal import lfilter +from .waveform import Waveform + SAMPLING_RATE = 1 """Default sampling rate in gigasamples per second (GSps). @@ -133,7 +136,7 @@ class Rectangular(PulseShape): def __init__(self): self.name = "Rectangular" - self.pulse: Pulse = None + self.pulse: "Pulse" = None def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: """The envelope waveform of the i component of the pulse.""" @@ -173,7 +176,7 @@ class Exponential(PulseShape): def __init__(self, tau: float, upsilon: float, g: float = 0.1): self.name = "Exponential" - self.pulse: Pulse = None + self.pulse: "Pulse" = None self.tau: float = float(tau) self.upsilon: float = float(upsilon) self.g: float = float(g) @@ -222,7 +225,7 @@ class Gaussian(PulseShape): def __init__(self, rel_sigma: float): self.name = "Gaussian" - self.pulse: Pulse = None + self.pulse: "Pulse" = None self.rel_sigma: float = float(rel_sigma) def __eq__(self, item) -> bool: @@ -277,7 +280,7 @@ class GaussianSquare(PulseShape): def __init__(self, rel_sigma: float, width: float): self.name = "GaussianSquare" - self.pulse: Pulse = None + self.pulse: "Pulse" = None self.rel_sigma: float = float(rel_sigma) self.width: float = float(width) @@ -343,7 +346,7 @@ class Drag(PulseShape): def __init__(self, rel_sigma, beta): self.name = "Drag" - self.pulse: Pulse = None + self.pulse: "Pulse" = None self.rel_sigma = float(rel_sigma) self.beta = float(beta) @@ -407,7 +410,7 @@ class IIR(PulseShape): def __init__(self, b, a, target: PulseShape): self.name = "IIR" self.target: PulseShape = target - self._pulse: Pulse = None + self._pulse: "Pulse" = None self.a: np.ndarray = np.array(a) self.b: np.ndarray = np.array(b) # Check len(a) = len(b) = 2 @@ -488,7 +491,7 @@ class SNZ(PulseShape): def __init__(self, t_idling, b_amplitude=None): self.name = "SNZ" - self.pulse: Pulse = None + self.pulse: "Pulse" = None self.t_idling: float = t_idling self.b_amplitude = b_amplitude @@ -557,7 +560,7 @@ class eCap(PulseShape): def __init__(self, alpha: float): self.name = "eCap" - self.pulse: Pulse = None + self.pulse: "Pulse" = None self.alpha: float = float(alpha) def __eq__(self, item) -> bool: @@ -595,7 +598,7 @@ class Custom(PulseShape): def __init__(self, envelope_i, envelope_q=None): self.name = "Custom" - self.pulse: Pulse = None + self.pulse: "Pulse" = None self.envelope_i: np.ndarray = np.array(envelope_i) if envelope_q is not None: self.envelope_q: np.ndarray = np.array(envelope_q) From 05b9d3e6045713102dd0bc94d552cf0e7c1c4ab9 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 18 Jan 2024 18:32:12 +0100 Subject: [PATCH 0047/1006] Remove pulse combination methods They intrinsically require the pulse to be aware of the sequence; but, for isolation sake, if the sequence is aware of the pulse, and not the opposite --- src/qibolab/pulses/pulse.py | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index 6e7661bd46..2c149c7ec6 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -1,5 +1,4 @@ """Pulse class.""" -import copy from dataclasses import dataclass, fields from enum import Enum from typing import Optional @@ -173,23 +172,6 @@ def __hash__(self): ) ) - def __add__(self, other): - if isinstance(other, Pulse): - return PulseSequence(self, other) - if isinstance(other, PulseSequence): - return PulseSequence(self, *other) - raise TypeError(f"Expected Pulse or PulseSequence; got {type(other).__name__}") - - def __mul__(self, n): - if not isinstance(n, int): - raise TypeError(f"Expected int; got {type(n).__name__}") - if n < 0: - raise TypeError(f"argument n should be >=0, got {n}") - return PulseSequence(*([copy.deepcopy(self)] * n)) - - def __rmul__(self, n): - return self.__mul__(n) - def is_equal_ignoring_start(self, item) -> bool: """Check if two pulses are equal ignoring start time.""" return ( From 1cf48e4321bf55f3799955eb56dd5f38a6df4d51 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 18 Jan 2024 18:36:45 +0100 Subject: [PATCH 0048/1006] Move sequence plotting to dedicated module --- src/qibolab/pulses/plot.py | 69 +++++++++++++++++++++++++++++++++ src/qibolab/pulses/sequence.py | 71 ---------------------------------- 2 files changed, 69 insertions(+), 71 deletions(-) diff --git a/src/qibolab/pulses/plot.py b/src/qibolab/pulses/plot.py index 8916e8bf05..b662cf6b3c 100644 --- a/src/qibolab/pulses/plot.py +++ b/src/qibolab/pulses/plot.py @@ -3,6 +3,7 @@ import numpy as np from .pulse import Pulse +from .sequence import PulseSequence from .shape import SAMPLING_RATE from .waveform import Waveform @@ -126,3 +127,71 @@ def pulse(pulse_: Pulse, filename=None, sampling_rate=SAMPLING_RATE): else: plt.show() plt.close() + + +def sequence(ps: PulseSequence, filename=None, sampling_rate=SAMPLING_RATE): + """Plot the sequence of pulses. + + Args: + filename (str): a file path. If provided the plot is save to a file. + """ + if len(ps) > 0: + import matplotlib.pyplot as plt + from matplotlib import gridspec + + _ = plt.figure(figsize=(14, 2 * len(ps)), dpi=200) + gs = gridspec.GridSpec(ncols=1, nrows=len(ps)) + vertical_lines = [] + for pulse in ps: + vertical_lines.append(pulse.start) + vertical_lines.append(pulse.finish) + + n = -1 + for qubit in ps.qubits: + qubit_pulses = ps.get_qubit_pulses(qubit) + for channel in qubit_pulses.channels: + n += 1 + channel_pulses = qubit_pulses.get_channel_pulses(channel) + ax = plt.subplot(gs[n]) + ax.axis([0, ps.finish, -1, 1]) + for pulse in channel_pulses: + num_samples = len(pulse.shape.modulated_waveform_i(sampling_rate)) + time = pulse.start + np.arange(num_samples) / sampling_rate + ax.plot( + time, + pulse.shape.modulated_waveform_q(sampling_rate).data, + c="lightgrey", + ) + ax.plot( + time, + pulse.shape.modulated_waveform_i(sampling_rate).data, + c=f"C{str(n)}", + ) + ax.plot( + time, + pulse.shape.envelope_waveform_i(sampling_rate).data, + c=f"C{str(n)}", + ) + ax.plot( + time, + -pulse.shape.envelope_waveform_i(sampling_rate).data, + c=f"C{str(n)}", + ) + # TODO: if they overlap use different shades + ax.axhline(0, c="dimgrey") + ax.set_ylabel(f"qubit {qubit} \n channel {channel}") + for vl in vertical_lines: + ax.axvline(vl, c="slategrey", linestyle="--") + ax.axis((0, ps.finish, -1, 1)) + ax.grid( + visible=True, + which="both", + axis="both", + color="#CCCCCC", + linestyle="-", + ) + if filename: + plt.savefig(filename) + else: + plt.show() + plt.close() diff --git a/src/qibolab/pulses/sequence.py b/src/qibolab/pulses/sequence.py index a846a92d50..d1539b3548 100644 --- a/src/qibolab/pulses/sequence.py +++ b/src/qibolab/pulses/sequence.py @@ -1,8 +1,6 @@ """PulseSequence class.""" -import numpy as np from .pulse import PulseType -from .shape import SAMPLING_RATE class PulseSequence(list): @@ -192,72 +190,3 @@ def pulses_overlap(self) -> bool: overlap = True break return overlap - - def plot(self, savefig_filename=None, sampling_rate=SAMPLING_RATE): - """Plot the sequence of pulses. - - Args: - savefig_filename (str): a file path. If provided the plot is save to a file. - """ - if len(self) > 0: - import matplotlib.pyplot as plt - from matplotlib import gridspec - - fig = plt.figure(figsize=(14, 2 * len(self)), dpi=200) - gs = gridspec.GridSpec(ncols=1, nrows=len(self)) - vertical_lines = [] - for pulse in self: - vertical_lines.append(pulse.start) - vertical_lines.append(pulse.finish) - - n = -1 - for qubit in self.qubits: - qubit_pulses = self.get_qubit_pulses(qubit) - for channel in qubit_pulses.channels: - n += 1 - channel_pulses = qubit_pulses.get_channel_pulses(channel) - ax = plt.subplot(gs[n]) - ax.axis([0, self.finish, -1, 1]) - for pulse in channel_pulses: - num_samples = len( - pulse.shape.modulated_waveform_i(sampling_rate) - ) - time = pulse.start + np.arange(num_samples) / sampling_rate - ax.plot( - time, - pulse.shape.modulated_waveform_q(sampling_rate).data, - c="lightgrey", - ) - ax.plot( - time, - pulse.shape.modulated_waveform_i(sampling_rate).data, - c=f"C{str(n)}", - ) - ax.plot( - time, - pulse.shape.envelope_waveform_i(sampling_rate).data, - c=f"C{str(n)}", - ) - ax.plot( - time, - -pulse.shape.envelope_waveform_i(sampling_rate).data, - c=f"C{str(n)}", - ) - # TODO: if they overlap use different shades - ax.axhline(0, c="dimgrey") - ax.set_ylabel(f"qubit {qubit} \n channel {channel}") - for vl in vertical_lines: - ax.axvline(vl, c="slategrey", linestyle="--") - ax.axis([0, self.finish, -1, 1]) - ax.grid( - visible=True, - which="both", - axis="both", - color="#CCCCCC", - linestyle="-", - ) - if savefig_filename: - plt.savefig(savefig_filename) - else: - plt.show() - plt.close() From c311265a3ac2f87d976bc2fb9d421efc13163ad0 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 18 Jan 2024 18:46:23 +0100 Subject: [PATCH 0049/1006] Fix plotting tests, require explicit import The plotting module won't be imported as a side effect of importing anything else in Qibolab, thus we could keep the matplitlib import top-level, and not have it as a (mandatory) dependency. Yet, we could make it part of an extra --- tests/test_pulses.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/test_pulses.py b/tests/test_pulses.py index 6e0705ff39..3b337de406 100644 --- a/tests/test_pulses.py +++ b/tests/test_pulses.py @@ -21,6 +21,7 @@ ShapeInitError, Waveform, eCap, + plot, ) HERE = pathlib.Path(__file__).parent @@ -41,15 +42,15 @@ def test_plot_functions(): plot_file = HERE / "test_plot.png" - wf.plot(plot_file) + plot.waveform(wf, plot_file) assert os.path.exists(plot_file) os.remove(plot_file) - p0.plot(plot_file) + plot.pulse(p0, plot_file) assert os.path.exists(plot_file) os.remove(plot_file) - ps.plot(plot_file) + plot.sequence(ps, plot_file) assert os.path.exists(plot_file) os.remove(plot_file) From 68f4fab2e3a708b2f298fa28f61b985d485cb50c Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 19 Jan 2024 19:15:24 +0100 Subject: [PATCH 0050/1006] Turn waveform into a bare array --- src/qibolab/pulses/__init__.py | 2 +- src/qibolab/pulses/plot.py | 5 +- src/qibolab/pulses/pulse.py | 9 ++-- src/qibolab/pulses/shape.py | 96 ++++++++++++---------------------- src/qibolab/pulses/waveform.py | 42 --------------- 5 files changed, 40 insertions(+), 114 deletions(-) delete mode 100644 src/qibolab/pulses/waveform.py diff --git a/src/qibolab/pulses/__init__.py b/src/qibolab/pulses/__init__.py index 10478384c1..f0ad2ad163 100644 --- a/src/qibolab/pulses/__init__.py +++ b/src/qibolab/pulses/__init__.py @@ -11,6 +11,6 @@ PulseShape, Rectangular, ShapeInitError, + Waveform, eCap, ) -from .waveform import Waveform diff --git a/src/qibolab/pulses/plot.py b/src/qibolab/pulses/plot.py index b662cf6b3c..0d380830fd 100644 --- a/src/qibolab/pulses/plot.py +++ b/src/qibolab/pulses/plot.py @@ -4,8 +4,7 @@ from .pulse import Pulse from .sequence import PulseSequence -from .shape import SAMPLING_RATE -from .waveform import Waveform +from .shape import SAMPLING_RATE, Waveform def waveform(wf: Waveform, filename=None): @@ -15,7 +14,7 @@ def waveform(wf: Waveform, filename=None): filename (str): a file path. If provided the plot is save to a file. """ plt.figure(figsize=(14, 5), dpi=200) - plt.plot(wf.data, c="C0", linestyle="dashed") + plt.plot(wf, c="C0", linestyle="dashed") plt.xlabel("Sample Number") plt.ylabel("Amplitude") plt.grid(visible=True, which="both", axis="both", color="#888888", linestyle="-") diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index 2c149c7ec6..beb7a09621 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -5,8 +5,7 @@ import numpy as np -from .shape import SAMPLING_RATE, PulseShape -from .waveform import Waveform +from .shape import SAMPLING_RATE, PulseShape, Waveform class PulseType(Enum): @@ -121,9 +120,7 @@ def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: return self.shape.envelope_waveform_q(sampling_rate) - def envelope_waveforms( - self, sampling_rate=SAMPLING_RATE - ): # -> tuple[Waveform, Waveform]: + def envelope_waveforms(self, sampling_rate=SAMPLING_RATE): """A tuple with the i and q envelope waveforms of the pulse.""" return ( @@ -143,7 +140,7 @@ def modulated_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: return self.shape.modulated_waveform_q(sampling_rate) - def modulated_waveforms(self, sampling_rate): # -> tuple[Waveform, Waveform]: + def modulated_waveforms(self, sampling_rate): """A tuple with the i and q waveforms of the pulse, modulated with its frequency.""" diff --git a/src/qibolab/pulses/shape.py b/src/qibolab/pulses/shape.py index db3133f4c2..d364a56918 100644 --- a/src/qibolab/pulses/shape.py +++ b/src/qibolab/pulses/shape.py @@ -3,11 +3,10 @@ from abc import ABC, abstractmethod import numpy as np +import numpy.typing as npt from qibo.config import log from scipy.signal import lfilter -from .waveform import Waveform - SAMPLING_RATE = 1 """Default sampling rate in gigasamples per second (GSps). @@ -15,6 +14,8 @@ a different value. """ +Waveform = npt.NDArray[np.float64] + class ShapeInitError(RuntimeError): """Error raised when a pulse has not been fully defined.""" @@ -53,9 +54,7 @@ def envelope_waveform_q( ) -> Waveform: # pragma: no cover raise NotImplementedError - def envelope_waveforms( - self, sampling_rate=SAMPLING_RATE - ): # -> tuple[Waveform, Waveform]: # pragma: no cover + def envelope_waveforms(self, sampling_rate=SAMPLING_RATE): """A tuple with the i and q envelope waveforms of the pulse.""" return ( @@ -107,8 +106,8 @@ def modulated_waveforms(self, _if: int, sampling_rate=SAMPLING_RATE): result.append(mod_matrix[:, :, n] @ np.array([ii, qq])) mod_signals = np.array(result) - modulated_waveform_i = Waveform(mod_signals[:, 0]) - modulated_waveform_q = Waveform(mod_signals[:, 1]) + modulated_waveform_i = mod_signals[:, 0] + modulated_waveform_q = mod_signals[:, 1] return (modulated_waveform_i, modulated_waveform_q) def __eq__(self, item) -> bool: @@ -143,8 +142,7 @@ def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: if self.pulse: num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - waveform = Waveform(self.pulse.amplitude * np.ones(num_samples)) - return waveform + return self.pulse.amplitude * np.ones(num_samples) raise ShapeInitError def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: @@ -152,8 +150,7 @@ def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: if self.pulse: num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - waveform = Waveform(np.zeros(num_samples)) - return waveform + return np.zeros(num_samples) raise ShapeInitError def __repr__(self): @@ -187,7 +184,7 @@ def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: if self.pulse: num_samples = int(np.rint(self.pulse.duration * sampling_rate)) x = np.arange(0, num_samples, 1) - waveform = Waveform( + return ( self.pulse.amplitude * ( (np.ones(num_samples) * np.exp(-x / self.upsilon)) @@ -196,7 +193,6 @@ def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: / (1 + self.g) ) - return waveform raise ShapeInitError def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: @@ -204,8 +200,7 @@ def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: if self.pulse: num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - waveform = Waveform(np.zeros(num_samples)) - return waveform + return np.zeros(num_samples) raise ShapeInitError def __repr__(self): @@ -240,17 +235,13 @@ def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: if self.pulse: num_samples = int(np.rint(self.pulse.duration * sampling_rate)) x = np.arange(0, num_samples, 1) - waveform = Waveform( - self.pulse.amplitude - * np.exp( - -(1 / 2) - * ( - ((x - (num_samples - 1) / 2) ** 2) - / (((num_samples) / self.rel_sigma) ** 2) - ) + return self.pulse.amplitude * np.exp( + -(1 / 2) + * ( + ((x - (num_samples - 1) / 2) ** 2) + / (((num_samples) / self.rel_sigma) ** 2) ) ) - return waveform raise ShapeInitError def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: @@ -258,8 +249,7 @@ def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: if self.pulse: num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - waveform = Waveform(np.zeros(num_samples)) - return waveform + return np.zeros(num_samples) raise ShapeInitError def __repr__(self): @@ -317,8 +307,7 @@ def fvec(t, gaussian_samples, rel_sigma, length=None): pulse = fvec(t, gaussian_samples, rel_sigma=self.rel_sigma) - waveform = Waveform(self.pulse.amplitude * pulse) - return waveform + return self.pulse.amplitude * pulse raise ShapeInitError @@ -327,8 +316,7 @@ def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: if self.pulse: num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - waveform = Waveform(np.zeros(num_samples)) - return waveform + return np.zeros(num_samples) raise ShapeInitError def __repr__(self): @@ -362,15 +350,13 @@ def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: if self.pulse: num_samples = int(np.rint(self.pulse.duration * sampling_rate)) x = np.arange(0, num_samples, 1) - i = self.pulse.amplitude * np.exp( + return self.pulse.amplitude * np.exp( -(1 / 2) * ( ((x - (num_samples - 1) / 2) ** 2) / (((num_samples) / self.rel_sigma) ** 2) ) ) - waveform = Waveform(i) - return waveform raise ShapeInitError def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: @@ -386,13 +372,11 @@ def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: / (((num_samples) / self.rel_sigma) ** 2) ) ) - q = ( + return ( self.beta * (-(x - (num_samples - 1) / 2) / ((num_samples / self.rel_sigma) ** 2)) * i ) - waveform = Waveform(q) - return waveform raise ShapeInitError def __repr__(self): @@ -450,9 +434,7 @@ def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: ) if not np.max(np.abs(data)) == 0: data = data / np.max(np.abs(data)) - data = np.abs(self.pulse.amplitude) * data - waveform = Waveform(data) - return waveform + return np.abs(self.pulse.amplitude) * data raise ShapeInitError def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: @@ -471,9 +453,7 @@ def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: ) if not np.max(np.abs(data)) == 0: data = data / np.max(np.abs(data)) - data = np.abs(self.pulse.amplitude) * data - waveform = Waveform(data) - return waveform + return np.abs(self.pulse.amplitude) * data raise ShapeInitError def __repr__(self): @@ -519,18 +499,15 @@ def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: np.rint(num_samples * half_pulse_duration / self.pulse.duration) ) idling_samples = num_samples - 2 * half_flux_pulse_samples - waveform = Waveform( - np.concatenate( - ( - self.pulse.amplitude * np.ones(half_flux_pulse_samples - 1), - np.array([self.b_amplitude]), - np.zeros(idling_samples), - -np.array([self.b_amplitude]), - -self.pulse.amplitude * np.ones(half_flux_pulse_samples - 1), - ) + return np.concatenate( + ( + self.pulse.amplitude * np.ones(half_flux_pulse_samples - 1), + np.array([self.b_amplitude]), + np.zeros(idling_samples), + -np.array([self.b_amplitude]), + -self.pulse.amplitude * np.ones(half_flux_pulse_samples - 1), ) ) - return waveform raise ShapeInitError def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: @@ -538,8 +515,7 @@ def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: if self.pulse: num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - waveform = Waveform(np.zeros(num_samples)) - return waveform + return np.zeros(num_samples) raise ShapeInitError def __repr__(self): @@ -573,20 +549,18 @@ def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: if self.pulse: num_samples = int(self.pulse.duration * sampling_rate) x = np.arange(0, num_samples, 1) - waveform = Waveform( + return ( self.pulse.amplitude * (1 + np.tanh(self.alpha * x / num_samples)) * (1 + np.tanh(self.alpha * (1 - x / num_samples))) / (1 + np.tanh(self.alpha / 2)) ** 2 ) - return waveform raise ShapeInitError def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: if self.pulse: num_samples = int(self.pulse.duration * sampling_rate) - waveform = Waveform(np.zeros(num_samples)) - return waveform + return np.zeros(num_samples) raise ShapeInitError def __repr__(self): @@ -613,8 +587,7 @@ def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: raise ValueError("Length of envelope_i must be equal to pulse duration") num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - waveform = Waveform(self.envelope_i * self.pulse.amplitude) - return waveform + return self.envelope_i * self.pulse.amplitude raise ShapeInitError def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: @@ -625,8 +598,7 @@ def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: raise ValueError("Length of envelope_q must be equal to pulse duration") num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - waveform = Waveform(self.envelope_q * self.pulse.amplitude) - return waveform + return self.envelope_q * self.pulse.amplitude raise ShapeInitError def __repr__(self): diff --git a/src/qibolab/pulses/waveform.py b/src/qibolab/pulses/waveform.py deleted file mode 100644 index 7c530bf362..0000000000 --- a/src/qibolab/pulses/waveform.py +++ /dev/null @@ -1,42 +0,0 @@ -"""Waveform class.""" -import numpy as np - - -class Waveform: - """A class to save pulse waveforms. - - A waveform is a list of samples, or discrete data points, used by the digital to analogue converters (DACs) - to synthesise pulses. - - Attributes: - data (np.ndarray): a numpy array containing the samples. - """ - - DECIMALS = 5 - - def __init__(self, data): - """Initialise the waveform with a of samples.""" - self.data: np.ndarray = np.array(data) - - def __len__(self): - """Return the length of the waveform, the number of samples.""" - return len(self.data) - - def __hash__(self): - """Hash the underlying data. - - .. todo:: - - In order to make this reliable, we should set the data as immutable. This we - could by making both the class frozen and the contained array readonly - https://numpy.org/doc/stable/reference/generated/numpy.ndarray.flags.html#numpy.ndarray.flags - """ - return hash(self.data.tobytes()) - - def __eq__(self, other): - """Compare two waveforms. - - Two waveforms are considered equal if their samples, rounded to - `Waveform.DECIMALS` decimal places, are all equal. - """ - return np.allclose(self.data, other.data) From 3fcb8da66e597204c2ae7af022f0b300fba22d4e Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 19 Jan 2024 19:26:42 +0100 Subject: [PATCH 0051/1006] Drop data access for waveforms --- .../instruments/qblox/cluster_qcm_bb.py | 2 +- .../instruments/qblox/cluster_qcm_rf.py | 2 +- .../instruments/qblox/cluster_qrm_rf.py | 2 +- src/qibolab/instruments/qblox/sequencer.py | 6 ++--- src/qibolab/instruments/qm/config.py | 2 +- src/qibolab/instruments/qm/sequence.py | 12 +++------ src/qibolab/pulses/plot.py | 26 +++++++++---------- src/qibolab/pulses/shape.py | 8 +++--- 8 files changed, 27 insertions(+), 33 deletions(-) diff --git a/src/qibolab/instruments/qblox/cluster_qcm_bb.py b/src/qibolab/instruments/qblox/cluster_qcm_bb.py index 1bae9d543b..4b91831a1f 100644 --- a/src/qibolab/instruments/qblox/cluster_qcm_bb.py +++ b/src/qibolab/instruments/qblox/cluster_qcm_bb.py @@ -533,7 +533,7 @@ def process_pulse_sequence( sequencer.waveforms_buffer.unique_waveforms ): sequencer.waveforms[waveform.serial] = { - "data": waveform.data.tolist(), + "data": waveform.tolist(), "index": index, } diff --git a/src/qibolab/instruments/qblox/cluster_qcm_rf.py b/src/qibolab/instruments/qblox/cluster_qcm_rf.py index f79d5d9d92..b7abcb73a5 100644 --- a/src/qibolab/instruments/qblox/cluster_qcm_rf.py +++ b/src/qibolab/instruments/qblox/cluster_qcm_rf.py @@ -527,7 +527,7 @@ def process_pulse_sequence( sequencer.waveforms_buffer.unique_waveforms ): sequencer.waveforms[waveform.serial] = { - "data": waveform.data.tolist(), + "data": waveform.tolist(), "index": index, } diff --git a/src/qibolab/instruments/qblox/cluster_qrm_rf.py b/src/qibolab/instruments/qblox/cluster_qrm_rf.py index 5d6ded76e5..7561526022 100644 --- a/src/qibolab/instruments/qblox/cluster_qrm_rf.py +++ b/src/qibolab/instruments/qblox/cluster_qrm_rf.py @@ -609,7 +609,7 @@ def process_pulse_sequence( sequencer.waveforms_buffer.unique_waveforms ): sequencer.waveforms[waveform.serial] = { - "data": waveform.data.tolist(), + "data": waveform.tolist(), "index": index, } diff --git a/src/qibolab/instruments/qblox/sequencer.py b/src/qibolab/instruments/qblox/sequencer.py index db0c068935..4324f8c85b 100644 --- a/src/qibolab/instruments/qblox/sequencer.py +++ b/src/qibolab/instruments/qblox/sequencer.py @@ -143,7 +143,7 @@ def bake_pulse_waveforms( padded_duration = int(np.ceil(duration / 4)) * 4 memory_needed = padded_duration padding = np.zeros(padded_duration - duration) - waveform.data = np.append(waveform.data, padding) + waveform = np.append(waveform, padding) if self.available_memory >= memory_needed: self.unique_waveforms.append(waveform) @@ -168,8 +168,8 @@ def bake_pulse_waveforms( padded_duration = int(np.ceil(duration / 4)) * 4 memory_needed = padded_duration * 2 padding = np.zeros(padded_duration - duration) - waveform_i.data = np.append(waveform_i.data, padding) - waveform_q.data = np.append(waveform_q.data, padding) + waveform_i = np.append(waveform_i, padding) + waveform_q = np.append(waveform_q, padding) if self.available_memory >= memory_needed: self.unique_waveforms.append(waveform_i) diff --git a/src/qibolab/instruments/qm/config.py b/src/qibolab/instruments/qm/config.py index 04beb8bc6d..65290c0e0d 100644 --- a/src/qibolab/instruments/qm/config.py +++ b/src/qibolab/instruments/qm/config.py @@ -350,7 +350,7 @@ def register_waveform(self, pulse, mode="i"): if serial not in self.waveforms: self.waveforms[serial] = { "type": "arbitrary", - "samples": waveform.data.tolist(), + "samples": waveform.tolist(), } return serial diff --git a/src/qibolab/instruments/qm/sequence.py b/src/qibolab/instruments/qm/sequence.py index fdce211cc8..1e760f8ecf 100644 --- a/src/qibolab/instruments/qm/sequence.py +++ b/src/qibolab/instruments/qm/sequence.py @@ -147,17 +147,11 @@ def bake(self, config: QMConfig, durations: DurationsType): for t in durations: with baking(config.__dict__, padding_method="right") as segment: if self.pulse.type is PulseType.FLUX: - waveform = self.pulse.envelope_waveform_i( - SAMPLING_RATE - ).data.tolist() + waveform = self.pulse.envelope_waveform_i(SAMPLING_RATE).tolist() waveform = self.calculate_waveform(waveform, t) else: - waveform_i = self.pulse.envelope_waveform_i( - SAMPLING_RATE - ).data.tolist() - waveform_q = self.pulse.envelope_waveform_q( - SAMPLING_RATE - ).data.tolist() + waveform_i = self.pulse.envelope_waveform_i(SAMPLING_RATE).tolist() + waveform_q = self.pulse.envelope_waveform_q(SAMPLING_RATE).tolist() waveform = [ self.calculate_waveform(waveform_i, t), self.calculate_waveform(waveform_q, t), diff --git a/src/qibolab/pulses/plot.py b/src/qibolab/pulses/plot.py index 0d380830fd..0ae089c7c1 100644 --- a/src/qibolab/pulses/plot.py +++ b/src/qibolab/pulses/plot.py @@ -44,31 +44,31 @@ def pulse(pulse_: Pulse, filename=None, sampling_rate=SAMPLING_RATE): ax1 = plt.subplot(gs[0]) ax1.plot( time, - waveform_i.data, + waveform_i, label="envelope i", c="C0", linestyle="dashed", ) ax1.plot( time, - waveform_q.data, + waveform_q, label="envelope q", c="C1", linestyle="dashed", ) ax1.plot( time, - pulse_.shape.modulated_waveform_i(sampling_rate).data, + pulse_.shape.modulated_waveform_i(sampling_rate), label="modulated i", c="C0", ) ax1.plot( time, - pulse_.shape.modulated_waveform_q(sampling_rate).data, + pulse_.shape.modulated_waveform_q(sampling_rate), label="modulated q", c="C1", ) - ax1.plot(time, -waveform_i.data, c="silver", linestyle="dashed") + ax1.plot(time, -waveform_i, c="silver", linestyle="dashed") ax1.set_xlabel("Time [ns]") ax1.set_ylabel("Amplitude") @@ -78,8 +78,8 @@ def pulse(pulse_: Pulse, filename=None, sampling_rate=SAMPLING_RATE): ax1.axis((start, finish, -1.0, 1.0)) ax1.legend() - modulated_i = pulse_.shape.modulated_waveform_i(sampling_rate).data - modulated_q = pulse_.shape.modulated_waveform_q(sampling_rate).data + modulated_i = pulse_.shape.modulated_waveform_i(sampling_rate) + modulated_q = pulse_.shape.modulated_waveform_q(sampling_rate) ax2 = plt.subplot(gs[1]) ax2.plot( modulated_i, @@ -88,8 +88,8 @@ def pulse(pulse_: Pulse, filename=None, sampling_rate=SAMPLING_RATE): c="C3", ) ax2.plot( - waveform_i.data, - waveform_q.data, + waveform_i, + waveform_q, label="envelope", c="C2", ) @@ -158,22 +158,22 @@ def sequence(ps: PulseSequence, filename=None, sampling_rate=SAMPLING_RATE): time = pulse.start + np.arange(num_samples) / sampling_rate ax.plot( time, - pulse.shape.modulated_waveform_q(sampling_rate).data, + pulse.shape.modulated_waveform_q(sampling_rate), c="lightgrey", ) ax.plot( time, - pulse.shape.modulated_waveform_i(sampling_rate).data, + pulse.shape.modulated_waveform_i(sampling_rate), c=f"C{str(n)}", ) ax.plot( time, - pulse.shape.envelope_waveform_i(sampling_rate).data, + pulse.shape.envelope_waveform_i(sampling_rate), c=f"C{str(n)}", ) ax.plot( time, - -pulse.shape.envelope_waveform_i(sampling_rate).data, + -pulse.shape.envelope_waveform_i(sampling_rate), c=f"C{str(n)}", ) # TODO: if they overlap use different shades diff --git a/src/qibolab/pulses/shape.py b/src/qibolab/pulses/shape.py index d364a56918..e1ee39aa2f 100644 --- a/src/qibolab/pulses/shape.py +++ b/src/qibolab/pulses/shape.py @@ -100,8 +100,8 @@ def modulated_waveforms(self, _if: int, sampling_rate=SAMPLING_RATE): for n, t, ii, qq in zip( np.arange(num_samples), time, - envelope_waveform_i.data, - envelope_waveform_q.data, + envelope_waveform_i, + envelope_waveform_q, ): result.append(mod_matrix[:, :, n] @ np.array([ii, qq])) mod_signals = np.array(result) @@ -430,7 +430,7 @@ def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: data = lfilter( b=self.b, a=self.a, - x=self.target.envelope_waveform_i(sampling_rate).data, + x=self.target.envelope_waveform_i(sampling_rate), ) if not np.max(np.abs(data)) == 0: data = data / np.max(np.abs(data)) @@ -449,7 +449,7 @@ def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: data = lfilter( b=self.b, a=self.a, - x=self.target.envelope_waveform_q(sampling_rate).data, + x=self.target.envelope_waveform_q(sampling_rate), ) if not np.max(np.abs(data)) == 0: data = data / np.max(np.abs(data)) From cd2a415a9821d04f53c44777b0b8dc57fa302724 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 19 Jan 2024 19:27:37 +0100 Subject: [PATCH 0052/1006] Drop type checks in tests involving waveforms --- tests/test_pulses.py | 55 ++++++++++++-------------------------------- 1 file changed, 15 insertions(+), 40 deletions(-) diff --git a/tests/test_pulses.py b/tests/test_pulses.py index 3b337de406..c9a6d0cc24 100644 --- a/tests/test_pulses.py +++ b/tests/test_pulses.py @@ -19,7 +19,6 @@ PulseType, Rectangular, ShapeInitError, - Waveform, eCap, plot, ) @@ -237,8 +236,8 @@ def test_is_equal_ignoring_start(): ) def test_pulseshape_sampling_rate(shape): pulse = Pulse(0, 40, 0.9, 100e6, 0, shape, 0, PulseType.DRIVE) - assert len(pulse.envelope_waveform_i(sampling_rate=1).data) == 40 - assert len(pulse.envelope_waveform_i(sampling_rate=100).data) == 4000 + assert len(pulse.envelope_waveform_i(sampling_rate=1)) == 40 + assert len(pulse.envelope_waveform_i(sampling_rate=100)) == 4000 def testhape_eval(): @@ -303,7 +302,7 @@ def test_raise_shapeiniterror(): def test_pulseshape_drag_shape(): pulse = Pulse(0, 2, 1, 4e9, 0, Drag(2, 1), 0, PulseType.DRIVE) # envelope i & envelope q should cross nearly at 0 and at 2 - waveform = pulse.envelope_waveform_i(sampling_rate=10).data + waveform = pulse.envelope_waveform_i(sampling_rate=10) target_waveform = np.array( [ 0.63683161, @@ -573,15 +572,6 @@ def sortseq(sequence): assert sortseq(ps1) == sortseq(ps2) -def test_waveform(): - wf1 = Waveform(np.ones(100)) - wf2 = Waveform(np.zeros(100)) - wf3 = Waveform(np.ones(100)) - assert wf1 != wf2 - assert wf1 == wf3 - np.testing.assert_allclose(wf1.data, wf3.data) - - def modulate( i: np.ndarray, q: np.ndarray, @@ -618,10 +608,6 @@ def test_pulseshape_rectangular(): assert isinstance(pulse.shape, Rectangular) assert pulse.shape.name == "Rectangular" assert repr(pulse.shape) == "Rectangular()" - assert isinstance(pulse.shape.envelope_waveform_i(), Waveform) - assert isinstance(pulse.shape.envelope_waveform_q(), Waveform) - assert isinstance(pulse.shape.modulated_waveform_i(_if), Waveform) - assert isinstance(pulse.shape.modulated_waveform_q(_if), Waveform) sampling_rate = 1 num_samples = int(pulse.duration / sampling_rate) @@ -636,13 +622,13 @@ def test_pulseshape_rectangular(): i, q, num_samples, _if, global_phase + pulse.relative_phase, sampling_rate ) - np.testing.assert_allclose(pulse.shape.envelope_waveform_i(sampling_rate).data, i) - np.testing.assert_allclose(pulse.shape.envelope_waveform_q(sampling_rate).data, q) + np.testing.assert_allclose(pulse.shape.envelope_waveform_i(sampling_rate), i) + np.testing.assert_allclose(pulse.shape.envelope_waveform_q(sampling_rate), q) np.testing.assert_allclose( - pulse.shape.modulated_waveform_i(_if, sampling_rate).data, mod_i + pulse.shape.modulated_waveform_i(_if, sampling_rate), mod_i ) np.testing.assert_allclose( - pulse.shape.modulated_waveform_q(_if, sampling_rate).data, mod_q + pulse.shape.modulated_waveform_q(_if, sampling_rate), mod_q ) @@ -664,10 +650,6 @@ def test_pulseshape_gaussian(): assert pulse.shape.name == "Gaussian" assert pulse.shape.rel_sigma == 5 assert repr(pulse.shape) == "Gaussian(5)" - assert isinstance(pulse.shape.envelope_waveform_i(), Waveform) - assert isinstance(pulse.shape.envelope_waveform_q(), Waveform) - assert isinstance(pulse.shape.modulated_waveform_i(_if), Waveform) - assert isinstance(pulse.shape.modulated_waveform_q(_if), Waveform) sampling_rate = 1 num_samples = int(pulse.duration / sampling_rate) @@ -687,13 +669,13 @@ def test_pulseshape_gaussian(): i, q, num_samples, _if, global_phase + pulse.relative_phase, sampling_rate ) - np.testing.assert_allclose(pulse.shape.envelope_waveform_i(sampling_rate).data, i) - np.testing.assert_allclose(pulse.shape.envelope_waveform_q(sampling_rate).data, q) + np.testing.assert_allclose(pulse.shape.envelope_waveform_i(sampling_rate), i) + np.testing.assert_allclose(pulse.shape.envelope_waveform_q(sampling_rate), q) np.testing.assert_allclose( - pulse.shape.modulated_waveform_i(_if, sampling_rate).data, mod_i + pulse.shape.modulated_waveform_i(_if, sampling_rate), mod_i ) np.testing.assert_allclose( - pulse.shape.modulated_waveform_q(_if, sampling_rate).data, mod_q + pulse.shape.modulated_waveform_q(_if, sampling_rate), mod_q ) @@ -716,10 +698,6 @@ def test_pulseshape_drag(): assert pulse.shape.rel_sigma == 5 assert pulse.shape.beta == 0.2 assert repr(pulse.shape) == "Drag(5, 0.2)" - assert isinstance(pulse.shape.envelope_waveform_i(), Waveform) - assert isinstance(pulse.shape.envelope_waveform_q(), Waveform) - assert isinstance(pulse.shape.modulated_waveform_i(_if), Waveform) - assert isinstance(pulse.shape.modulated_waveform_q(_if), Waveform) sampling_rate = 1 num_samples = int(pulse.duration / 1 * sampling_rate) @@ -744,13 +722,13 @@ def test_pulseshape_drag(): i, q, num_samples, _if, global_phase + pulse.relative_phase, sampling_rate ) - np.testing.assert_allclose(pulse.shape.envelope_waveform_i(sampling_rate).data, i) - np.testing.assert_allclose(pulse.shape.envelope_waveform_q(sampling_rate).data, q) + np.testing.assert_allclose(pulse.shape.envelope_waveform_i(sampling_rate), i) + np.testing.assert_allclose(pulse.shape.envelope_waveform_q(sampling_rate), q) np.testing.assert_allclose( - pulse.shape.modulated_waveform_i(_if, sampling_rate).data, mod_i + pulse.shape.modulated_waveform_i(_if, sampling_rate), mod_i ) np.testing.assert_allclose( - pulse.shape.modulated_waveform_q(_if, sampling_rate).data, mod_q + pulse.shape.modulated_waveform_q(_if, sampling_rate), mod_q ) @@ -918,9 +896,6 @@ def test_envelope_waveform_i_q(): custom_shape_pulse.pulse = pulse custom_shape_pulse_old_behaviour.pulse = pulse - assert isinstance(custom_shape_pulse.envelope_waveform_i(), Waveform) - assert isinstance(custom_shape_pulse.envelope_waveform_q(), Waveform) - assert isinstance(custom_shape_pulse_old_behaviour.envelope_waveform_q(), Waveform) pulse.duration = 2000 with pytest.raises(ValueError): custom_shape_pulse.pulse = pulse From 63369aa599f2147ad3781544e07212396d778197 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 19 Jan 2024 19:31:33 +0100 Subject: [PATCH 0053/1006] Replace waveform hash, since NumPy array are unhashable (because mutable) --- src/qibolab/instruments/qm/config.py | 2 +- tests/test_instruments_qm.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/qibolab/instruments/qm/config.py b/src/qibolab/instruments/qm/config.py index 65290c0e0d..cc934fb202 100644 --- a/src/qibolab/instruments/qm/config.py +++ b/src/qibolab/instruments/qm/config.py @@ -346,7 +346,7 @@ def register_waveform(self, pulse, mode="i"): self.waveforms[serial] = {"type": "constant", "sample": pulse.amplitude} else: waveform = getattr(pulse, f"envelope_waveform_{mode}")(SAMPLING_RATE) - serial = hash(waveform) + serial = hash(waveform.tobytes()) if serial not in self.waveforms: self.waveforms[serial] = { "type": "arbitrary", diff --git a/tests/test_instruments_qm.py b/tests/test_instruments_qm.py index 3bdf9d882c..2da93d2fac 100644 --- a/tests/test_instruments_qm.py +++ b/tests/test_instruments_qm.py @@ -308,8 +308,8 @@ def test_qm_register_pulse(qmplatform, pulse_type, qubit): "length": pulse.duration, "digital_marker": "ON", "waveforms": { - "I": hash(pulse.envelope_waveform_i()), - "Q": hash(pulse.envelope_waveform_q()), + "I": hash(pulse.envelope_waveform_i().tobytes()), + "Q": hash(pulse.envelope_waveform_q().tobytes()), }, } From fca4b825c42ef79f86883b6106b82eafdcc69459 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 29 Jan 2024 10:28:14 +0100 Subject: [PATCH 0054/1006] feat(nix): Export convenience env var --- flake.nix | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/flake.nix b/flake.nix index a91b8b4328..e27ab8348e 100644 --- a/flake.nix +++ b/flake.nix @@ -42,10 +42,17 @@ inherit inputs pkgs; modules = [ - ({lib, ...}: { - packages = with pkgs; [pre-commit poethepoet jupyter]; + ({ + lib, + pkgs, + config, + ... + }: { + packages = with pkgs; [pre-commit poethepoet jupyter stdenv.cc.cc.lib zlib]; - env.QIBOLAB_PLATFORMS = platforms; + env = { + QIBOLAB_PLATFORMS = (dirOf config.env.DEVENV_ROOT) + "/qibolab_platforms_qrc"; + }; languages.c = { enable = true; From c3400c323ba9a625b61ccd5130646de3f95f7c53 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 29 Jan 2024 12:06:34 +0100 Subject: [PATCH 0055/1006] fix: serial to id migration for fixed rfsoc tests --- tests/test_instruments_rfsoc.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_instruments_rfsoc.py b/tests/test_instruments_rfsoc.py index 312ce6f777..da943061d1 100644 --- a/tests/test_instruments_rfsoc.py +++ b/tests/test_instruments_rfsoc.py @@ -126,7 +126,7 @@ def test_convert_pulse(dummy_qrc): duration=0.04, adc=None, dac=4, - name=pulse.serial, + name=pulse.id, relative_phase=0, rel_sigma=5, beta=2, @@ -150,7 +150,7 @@ def test_convert_pulse(dummy_qrc): start_delay=0, relative_phase=0, duration=0.04, - name=pulse.serial, + name=pulse.id, type="drive", dac=4, adc=None, @@ -175,7 +175,7 @@ def test_convert_pulse(dummy_qrc): start_delay=0, relative_phase=0, duration=0.04, - name=pulse.serial, + name=pulse.id, type="readout", dac=2, adc=1, From e9439bc2b6e146c716e5b7f31429d9470d13f70d Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 29 Jan 2024 13:37:40 +0100 Subject: [PATCH 0056/1006] chore: Drop pulses tutorial Since pulses are greatly changed, it is much better to rewrite it from scratch, possibly using ideas from the old one, but much of the implementation is going to be reworked anyhow --- examples/pulses_tutorial.ipynb | 1201 -------------------------------- 1 file changed, 1201 deletions(-) delete mode 100644 examples/pulses_tutorial.ipynb diff --git a/examples/pulses_tutorial.ipynb b/examples/pulses_tutorial.ipynb deleted file mode 100644 index a80241221c..0000000000 --- a/examples/pulses_tutorial.ipynb +++ /dev/null @@ -1,1201 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Pulses Tutorial" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Pulse" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Overview" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The `Pulse` object represents the radio-frequency pulses that are used to control qubits. \n", - "The new version of `Pulse` object includes the following changes:\n", - "- It includes a new attribute `finish` that returns the point in time when the pulse finishes (start + duration).\n", - "- The `phase` attribute was replaced with `relative_phase`, since taking care of the global sequence phase is now done by the `PulseSequence`.\n", - "- The attributes `offset_i` and `offset_q` included in the previous version were removed, as those are parameters of the instrument.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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AABosTRA0WK9/PLLOeecc9K/f/907tw5G264YQYNGpQf/OAHWbhwYanTA/6/QqFQr9eQIUPWGOv3v/99hg8fnl69eqV9+/bp1atXhg8fnt///vdN/0agFXn77bdz33335aKLLsqBBx6YjTfeuLZWR44cudbxGqN2a2pq8rOf/Sx77713evbsmY4dO2a77bbL6aefnn/+859rnRO0Ro1R22PGjKn3vX3MmDFrjLdw4cJcdtllGTRoUDbccMN07tw5/fv3zznnnJOXX365YW8YWoFJkyblW9/6VoYNG1Z7n+3SpUv69euXE088MY8++uhaxXPPhvVDY9S2ezasX+bOnZtbb70155xzTgYPHpy+ffumW7duqayszCabbJIhQ4bksssuy5w5c+oV77HHHsvxxx+fPn36pEOHDtlss81ywAEH5JZbblmrvG655ZYMGzYsm222WTp06JA+ffrk+OOPz8SJE9flbUKr0hh1/fDDD9f7fn3JJZesMSefxaFpnX/++XXq8uGHH17jNX7OhmZWhBbonnvuKW6wwQbFJCt99evXr/jCCy+UOk2gWFxlnf7na/DgwauMsXTp0uLJJ5+82utPOeWU4tKlS5vvjUEZW12tjRgxot5xGqt2Z82aVRw0aNAqY7Rv3754/fXXN/BdQ/lrjNq+6aab6n1vv+mmm1Yb64UXXihuv/32q7x+gw02KN57770Nf+NQpvbee+961eIJJ5xQXLx48WpjuWfD+qOxats9G9Yvf/zjH+tVjxtvvHHxD3/4w2pjXXzxxcU2bdqsMsbBBx9crKqqWm2MhQsXFg866KBVxmjTpk3xkksuacxfAig7jVHX48aNq/f9+uKLL15tPj6LQ9N65plnihUVFXXqaty4cauc7+dsKI2KQAvzzDPP5Oijj05VVVW6dOmSCy64IEOHDk1VVVVuvfXWXH/99Zk6dWoOPvjgTJo0KV27di11ykCSz33ucznjjDNWeb5z586rPHfhhRdm9OjRSZKddtop5513XrbbbrtMnz49l112WZ555pnccMMN6dmzZy699NJGzx1as6222ir9+/fPAw88sNbXNkbtLl26NMOHD89TTz2VJDniiCNy6qmnZsMNN8wTTzyR//3f/83bb7+d008/PVtuuWUOPPDAdX+z0Io0pLaXu//++7PFFlus8nyvXr1WeW7evHk5+OCD88ILLyRJTj311BxzzDHp2LFjxo0bl+9+97uZO3dujj766EyYMCE77rjjOucJ5er1119PkmyxxRb59Kc/nb333jtbbbVVli5dmokTJ+aKK67Ia6+9lptvvjlLlizJr3/961XGcs+G9Udj1vZy7tmwfujdu3eGDh2anXfeOb17987mm2+eZcuWZebMmbnjjjvy29/+NrNnz86hhx6aJ598Mh/96EdXiHHdddflm9/8ZpJku+22y9e+9rXssMMOef3113P11Vdn3LhxGTt2bE466aTVfn846aST8rvf/S5JMnTo0Jx11lnZYost8uyzz+bSSy/N9OnTc8kll2TzzTfPaaed1jS/IFAGGqOul7vxxhszaNCgVZ7fZJNNVnnOZ3FoWsuWLctpp52WmpqabLLJJnn77bfXeI2fs6FESt2BBWtr+b+Eq6ioKD722GMrnL/sssvq3REPNL2G1uPzzz9f21W/yy67FBcuXFjn/IIFC4q77LJL7fcFu79Bw1100UXFe++9t/jmm28Wi8Vi8cUXX6yt5fruEtNYtTt69Ojatc8444wVzr/wwgu1u0L27du3uGTJkrV7s9CKNEZtf3A3iRdffHGdc/nGN75RG+eyyy5b4fyECRNqv4esbpdIaM0OPvjg4m9+85tiTU3NSs/PmjWr2K9fv9paGz9+/ErnuWfD+qWxats9G9Yvq6rpD7rrrrtq62348OErnJ8zZ06xW7duxSTFrbbaqjhr1qwV1jjkkEPWuCvFQw89VDvnkEMOWSG3WbNmFbfaaqtikmL37t2L77zzTv3fKLQijVHXH9wBanU7yayJz+LQtK688spikmL//v2LF1xwwRrr1s/ZUDoaoGhRnnjiidpv9KeffvpK5yxdurQ4YMCA2h/QqqurmzlL4IMa2gD1uc99rjbGxIkTVzpn4sSJq/0QCDTMujRJNFbtLr+nb7jhhsUFCxasdM53v/vd2ji33XZbvfIDStcAVV1dXfsXNwMGDFjlVt+nn3567VpPPvnkOq0Frd29995bW0df+MIXVjrHPRtanvrUtns2tEwf+tCHism/Hpn1n77//e/X1tott9yy0utfffXVYtu2bYtJigcddNBK5xx44IG1f+H66quvrnTOLbfcstrmR6D+VlfXjdUA5bM4NJ2XX3652KVLl2KS4sMPP1y8+OKL11i3fs6G0mkTaEHuvvvu2uMTTzxxpXPatGmTE044IUny3nvvZdy4cc2RGtAEisVi/u///i9J0r9//+y2224rnbfbbrvlQx/6UJLk//7v/1IsFpstR2BFjVW7U6dOzZQpU5IkRx11VDp16rTSOCNHjqw9vuuuuxqaPtDExo0bl/fffz9JMmLEiLRps/IfS9U2NNzQoUNrj6dPn77CefdsaJnWVNuNxT0bml/Xrl2TJIsWLVrh3PI/G99ggw1yxBFHrPT6Xr165ROf+ESS5KGHHsq8efPqnJ83b14eeuihJMknPvGJVT4C84gjjsgGG2yQRF1DQ62urhuDz+LQtD7/+c9n/vz5GTFiRAYPHrzG+X7OhtLSAEWL8uijjyZJOnfunJ133nmV8z54A5owYUKT5wU0jRdffDGvv/56kqzxg+Xy86+99lpeeumlpk4NWI3Gqt3l9/01xdlss83Sr1+/JO770BLUt7Z32WWX2j/cUduwbhYvXlx73LZt2xXOu2dDy7Sm2m4s7tnQvJ5//vn89a9/TfKvvzD9oOrq6jz55JNJkt133z2VlZWrjLO8XhcvXpxJkybVOffUU0+lurq6zryVqaysrP0L26eeeipLlixZuzcDJFl9XTcWn8Wh6dx222257777suGGG+byyy+v1zV+zobS0gBFi7K807Vv376pqKhY5bwPfpBcfg1QWrfffnsGDhyYTp06pWvXrtl+++0zYsSI1e7SNnny5NrjNf2AqO5h/dFYtbsucV599dUsWLCg3rkC6+7EE0/MFltskcrKymy88cbZbbfd8vWvfz2vvfbaaq+rb21XVFSkb9++SdzbYV2NHz++9njAgAErnHfPhpZpTbX9n9yzYf21cOHCvPDCC/nhD3+YwYMHp6amJkly9tln15k3derULF26NEnz37NramrywgsvrP6NALXqW9f/6cILL0yfPn3Svn379OjRIzvttFO+9KUvZerUqau9zmdxaBrvvfdezjrrrCTJ97///Wy88cb1us7P2VBaGqBoMRYtWpTZs2cnySq35l2uR48e6dy5c5J/fbMHSm/y5MmZMmVKqqqqMn/+/EybNi0333xz9t133wwfPrx2W/0PmjlzZu3xmuq+d+/etcfqHkqrsWp3XeIUi8U61wFN5+GHH84bb7yRJUuWZM6cOXniiSfyne98J3379s111123yuuW12jnzp3TvXv31a6xvLZnzZpVZ7cLYM2WLVuW733ve7VfH3XUUSvMcc+Glqc+tf2f3LNh/TJmzJgUCoUUCoV07tw5/fr1yznnnJO33norSfLVr341xx13XJ1rSnnPXlkcoK51qev/9Nhjj+WVV15JdXV13nvvvfz1r3/NVVddlQEDBuSSSy5Z4fFYy/ksDk3jvPPOy5tvvpk999wzJ598cr2v83M2lNaqt9CB9cwHn1fepUuXNc7v3LlzFixYkPnz5zdlWsAadOrUKYceemj222+/9O/fP126dMmsWbMyfvz4/OxnP8ucOXNy991357DDDssf//jHtGvXrvbatan75U2PSdQ9lFhj1a7vAbB+2nbbbXPEEUdk9913r/0DlhkzZuTOO+/MHXfckUWLFuWzn/1sCoVCTjvttBWuX17b9f1Mv9z8+fPTvn37RnoXUP6uvPLK2kflHHHEESt9jLx7NrQ89ant5dyzoWXZcccdM2rUqAwaNGiFc+7Z0DKtrq6X23zzzXPEEUdkr732yrbbbpuKioq88sorue+++3LzzTdnyZIl+eY3v5nq6upceumlK1yvrqHxPfLII7nhhhtSUVGRn/3sZykUCvW+1j0bSksDFC3GokWLao9X94zz5Zb/QUtVVVWT5QSs2WuvvbbSfym6//775wtf+EIOPPDAPPPMMxk/fnx++tOf5otf/GLtnLWp+w/+4aq6h9JqrNr1PQDWP8OHD8+IESNW+IOfQYMG5eijj859992XI444IkuWLMmXvvSlHHroodlss83qzF1e22vzmT5R27A2xo8fn69+9atJkk022SQ//elPVzrPPRtalvrWduKeDeuzww8/PLvsskuSf9XL9OnTc9ttt+Wuu+7Ksccem6uuuiqf/OQn61zjng3rt3Wp6+Rf9+WXX365zj8KTpKPfexjOfzww3Paaadl2LBhef/99/O9730vRx99dD760Y/WmauuoXFVV1fntNNOS7FYzJe+9KV85CMfWavr3bOhtDwCjxajQ4cOtcfV1dVrnL98u+2OHTs2WU7Amq1um/xNN900d9xxR+0PeNdee22d82tT9x/cYl/dQ2k1Vu36HgDrn27duq32X7198pOfzEUXXZQkWbhwYUaPHr3CnOW1vTaf6RO1DfX1z3/+M8OHD09NTU06dOiQ22+/PZtssslK57pnQ8uxNrWduGfD+qx79+75yEc+ko985CMZNGhQjjnmmPz2t7/NzTffnBkzZuSwww7LmDFj6lzjng3rt3Wp6+Rfu7b8Z/PTB+2666750Y9+lORfj7ZafvxB6hoa16WXXprnnnsuW221VS6++OK1vt49G0pLAxQtRteuXWuP67N934IFC5LUb5tuoHS23Xbb7L///kmSadOm5fXXX689tzZ1v7zmE3UPpdZYtet7ALRMp512Wu1fuI4fP36F88tre20+0ydqG+rjxRdfzLBhw/Luu++mbdu2ufXWW7PPPvuscr57NrQMa1vb9eWeDeuX//mf/8mnP/3pLFu2LGeeeWbeeeed2nPu2dAyra6u6+uYY47JBhtskGT19+tEXUNDPffcc/nud7+b5F//YP+Dj5arL/dsKC0NULQYHTp0yEYbbZQkmTlz5mrnvvvuu7Xf7Hv37t3kuQENM3DgwNrj1157rfa4V69etcdrqvtXX3219ljdQ2k1Vu2uS5xCoVDnOqD5bbLJJrWf2z94X19ueY0uWLAg77333mpjLa/tnj171tnOG1jR66+/nk984hN5/fXXUygUcuONN+awww5b7TXu2bD+W5fari/3bFj/LK/vBQsW5A9/+EPteCnv2SuLA9Tfquq6vioqKtKvX78kq79fJz6LQ0NdeeWVqa6uzrbbbpuFCxfm1ltvXeH1j3/8o3b+n/70p9rx5X8v7edsKK2KUicAa2PgwIF55JFHMm3atNTU1KSiYuW/hZ977rna4wEDBjRXesA6WtW2/B9sjPpgXa+Muof1R2PV7n/G2XHHHdcYp3fv3uv0L3OAxrW6R+4MHDgwd955Z5J/1e5uu+220nk1NTWZPn16Evd2WJPZs2dn//33z4wZM5L861+qnnDCCWu8zj0b1m/rWttrwz0b1i89e/asPX755Zdrj/v165e2bdtm6dKljXrPrk+cioqKbL/99mtOHlipVdX12ljT/Xo5n8WhYZY/Sm7GjBk59thj1zj/29/+du3xiy++mM6dO/s5G0rMDlC0KHvttVeSf3XKP/3006uc98FtQPfcc88mzwtomMmTJ9ceb7HFFrXH22yzTe3XK9ve94P+/Oc/J0m23HLLbL311o2fJFBvjVW7y+/7a4rz5ptvZurUqUnc92F9MGvWrMyePTtJ3fv6cvWt7UmTJtX+6zm1Dav2/vvv54ADDqj9TP29730vn//85+t1rXs2rL8aUtv15Z4N658P7u7ywUfYVFZWZtddd02STJw4MdXV1auMsbxe27dvn1122aXOuUGDBqWysrLOvJWprq7O448/XntNu3bt1vKdAMutqq7rq6ampvYzdEPu1z6LQ/PwczaUlgYoWpTDDz+89vimm25a6Zxly5bl5ptvTpJ07949Q4cObY7UgHX04osv5o9//GOSZLvttsuWW25Ze65QKNRuEfzcc8/V/sHLf3r88cdrO9wPO+yw1f6LGKDpNVbt9uvXr/Zfvtx2221ZuHDhSuOMGTOm9nj48OENTR9ooFGjRqVYLCZJBg8evML5IUOGpFu3bkmSn//857Vz/5PahjVbuHBhDj744PzlL39Jklx44YU5//zz6329ezasnxpa2/Xlng3rn9tvv732eIcddqhzbvmfjc+dOze//e1vV3r9zJkz8+CDDyZJ9ttvv3Tt2rXO+a5du2a//fZLkjz44IOrfKTOb3/728ydOzeJuoaGWl1d18dvfvObvP/++0lWfr/2WRwaz5gxY1IsFlf7uvjii2vnjxs3rnZ8eQOTn7OhxIrQwuy9997FJMWKioriY489tsL5yy67rJikmKR48cUXN3+CQK177rmnuGTJklWef/PNN4s77bRTbc1eccUVK8x5/vnni23bti0mKe6yyy7FhQsX1jm/cOHC4i677FL7fWHq1KmN/j6gtXvxxRdr63TEiBH1uqaxanf06NG1a3/+859f4fy0adOKG2ywQTFJsW/fvqv9ngPUtba1/eKLLxb/8pe/rHbOvffeW6ysrCwmKXbs2LE4c+bMlc77xje+Ubv2ZZddtsL5xx57rFhRUVFMUhw8eHB93g60OosXLy4OGzastpbOOuusdYrjng3rl8aobfdsWP/cdNNNxaqqqtXO+eEPf1hbb9tss02xpqamzvk5c+YUu3XrVkxS7NOnT3H27Nl1ztfU1BQPOeSQ2hjjxo1b6ToPPfRQ7ZxDDz10hXVmzZpV3GqrrYpJit27dy++8847a/+GoRVoaF2/8847q6zT5Z544oli9+7di0mKhUKhOGnSpJXO81kcms/FF1+8xnutn7OhdArF4ir+6Q6sp5555pnsueeeqaqqSpcuXfK1r30tQ4cOTVVVVW699daMGjUqyb86YydNmrTCv3IBms/WW2+dJUuW5Mgjj8zuu++erbfeOh07dszs2bPz8MMP57rrrqvdbn+vvfbKgw8+mPbt268Q54ILLsj3vve9JMlOO+2U888/P9ttt12mT5+e73//+3nmmWdq51166aXN9wahTD366KOZNm1a7dezZ8/Oueeem+Rf2+iecsopdeaPHDlypXEao3aXLl2awYMHZ8KECUmSI488Mqeeemp69OiRJ598Mt/+9rfz9ttvp02bNrnvvvty4IEHNui9QzlraG0//PDDGTp0aHbfffcccsgh+ehHP5pNNtkkSTJjxozccccdueOOO2p3h/jxj3+cM844Y6W5zJs3L7vsskvtFt2nnXZajjnmmHTs2DHjxo3LpZdemvnz56djx4557LHHsuOOOzbGLwGUlSOPPLJ294d99903V1111Wp3Qq2srEy/fv1Wes49G9YfjVHb7tmw/tl6660zb968HHnkkdlrr72y3XbbpUuXLpk3b16effbZ/OpXv6q9h1ZWVmbs2LH5xCc+sUKc6667Lp/97GeT/Gsn9QsvvDA77LBDXn/99Vx11VUZN25ckuTYY4/Nr3/961Xmc+yxx+bWW29NkgwdOjRnn312tthiizz77LP5zne+k+nTp9eud9pppzXqrwWUi4bW9UsvvZRtttkm//Vf/5XDDz88O++8czbffPO0bds2r7zySu6777784he/qH3k5bnnnpvLLrtspbn4LA7N55JLLsk3v/nNJP/aAWrIkCErnefnbCiR0vZfwbq55557ajtaV/bq169f8YUXXih1mtDq9enTZ5V1+sHXkUceWXz33XdXGWfp0qXFk046abUxTj755OLSpUub781BGRsxYkS9anf5a1Uaq3ZnzZpVHDRo0CpjtG/fvnj99dc39i8DlJ2G1va4cePqdV2nTp2K11133RrzeeGFF4rbb7/9KuNssMEGxXvvvbcpfimgLKxNPef/7xSxKu7ZsP5ojNp2z4b1T33/jKxXr17FBx54YLWxLrroomKhUFhljIMOOmiNu9IsXLiweNBBB60yRps2bTxdAdagoXX9wV2ZV/dq27Zt8ZJLLikuW7Zstfn4LA7Noz47QBWLfs6GUrEDFC3Wyy+/nKuvvjpjx47NzJkzU1lZmb59++bTn/50zjzzzHTq1KnUKUKrN378+IwfPz4TJ07MjBkzMnv27MydOzddunRJ7969s8cee2TEiBHZfffd6xXvd7/7XUaNGpWnnnoqs2fPzsYbb5xBgwbl9NNP19kOjWjkyJH5+c9/Xu/5a/o42Ri1W1NTk+uvvz6//vWvM2XKlCxYsCBbbLFF9ttvv5x11ln58Ic/XO98obVqaG3Pmzcv99xzTyZOnJhJkybljTfeyOzZs1NTU5MePXrkwx/+cPbbb7+ccsoptbtMrMmCBQvy4x//OLfffnumTZuW6urq9O7dOwcddFDOOuus9OnTZ63eI7Qmq9sRZmX69OmTl156abVz3LOh9Bqjtt2zYf3z/PPPZ+zYsZkwYUKmTZuWt956K3PmzEnHjh2zySabZMcdd8wnP/nJHHXUUfX6c+3HHnssP/7xj/PII4/krbfeSvfu3fPRj340J554Yo499th65/XrX/86Y8aMyd/+9re899572XTTTbP33nvnzDPPrPef10Fr1dC6rq6urr1fP/nkk3nttdcye/bsLFq0KN26dcuHPvShDBkyJKecckq23nrreuXkszg0vfruALWcn7OheWmAAgAAAAAAAAAAWqw2pU4AAAAAAAAAAABgXWmAAgAAAAAAAAAAWiwNUAAAAAAAAAAAQIulAQoAAAAAAAAAAGixNECVqbfffjv33XdfLrroohx44IHZeOONUygUUigUMnLkyCZZ85ZbbsmwYcOy2WabpUOHDunTp0+OP/74TJw4sUnWAwAAAAAAAACAQrFYLJY6CRpfoVBY5bkRI0ZkzJgxjbZWVVVVPvWpT+V3v/vdSs+3adMmF110US6++OJGWxMAAAAAAAAAABI7QLUKW221VYYNG9Zk8U866aTa5qehQ4fm7rvvzpNPPpnRo0dnu+22y7Jly3LJJZdk1KhRTZYDAAAAAAAAAACtkx2gytTFF1+cQYMGZdCgQdl0003z0ksvZZtttknSuDtA/elPf8p+++2XJDnkkENy1113pW3btrXnZ8+enZ133jmvvPJKunfvnhkzZqRHjx6NsjYAAAAAAAAAANgBqkx985vfzCc/+clsuummTbrO5ZdfniSpqKjIT37ykzrNT0my8cYb5/vf/36S5L333ssNN9zQpPkAAAAAAAAAANC6aIBinc2bNy8PPfRQkuQTn/hEevXqtdJ5RxxxRDbYYIMkyV133dVs+QEAAAAAAAAAUP40QLHOnnrqqVRXVydJBg8evMp5lZWV2W233WqvWbJkSbPkBwAAAAAAAABA+dMAxTqbPHly7XH//v1XO3f5+Zqamrzw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1DaUH3UN5UltQ/lR11Ce1DaUJ7UN5UddQ61FCxbm53f+oUliewQeAAAAAAAAAADQYmmAAgAAAAAAAAAAWiwNUAAAAAAAAAAAQIulAQoAAAAAAAAAAGixNEABAAAAAAAAAAAtlgYoAAAAAAAAAACgxdIABQAAAAAAAAAAtFgaoAAAAAAAAAAAgBZLAxQAAAAAAAAAANBiaYACAAAAAAAAAABaLA1QAAAAAAAAAABAi6UBCgAAAAAAAAAAaLE0QAEAAAAAAAAAAC2WBigAAAAAAAAAAKDFqih1AtBYTj32kHTs2KHUaUBJ9ejRLScd/ckVxgAAAAAAAACglDp27JDPnXBERl95SaPHbnU7QC1ZsiTvvvtuXn/99bz77rtZsmRJqVNqci+//HLOOeec9O/fP507d86GG26YQYMG5Qc/+EEWLlzYoNhjxoxJoVCo12vMmDGN84ZWoedG3dO2Tav7LQ11VFZUZIf+29V5VVbodQUAAAAAAACgtNq2aZNNN+7RJLHL/m/Fn3766dx1112ZMGFCpkyZklmzZq0wp2fPnhkwYED23HPPDB8+PDvvvHMJMm0a9957b44//vjMnTu3dmzhwoWZNGlSJk2alBtuuCFjx45N3759S5glAAAAAAAAAACsm7JtgPr73/+es88+O+PHj68dKxaLK5379ttvZ9asWfnzn/+c7373uxkyZEiuuuqq7LDDDs2VbpN45plncvTRR6eqqipdunTJBRdckKFDh6aqqiq33nprrr/++kydOjUHH3xwJk2alK5duzZovfvvvz9bbLHFKs/36tWrQfEBAAAAAAAAAOA/lWUD1NixY3PMMcdk4cKFtU1PnTp1St++fdO7d+907tw57du3z+LFi7NgwYK8+uqrmT59ehYsWJAkefjhh7P77rvn9ttvz4EHHljKt9IgZ511VqqqqlJRUZEHHnggu+++e+25fffdN9tvv33OO++8TJ06NVdccUUuueSSBq3Xr1+/bL311g1LGgAAAAAAAAAA1kLZNUC98sor+cxnPpMFCxakoqIiJ598ckaOHJlddtklbdu2XeV1S5cuzaRJk3LTTTflxhtvzMKFC3Pcccfl73//e3r37t2M76BxPPnkk3nkkUeSJCeffHKd5qflzjnnnNx0002ZMmVKrr766lx44YVp165dc6cKAAAAAAAAAADrrE2pE2hs11xz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77507tw5CxYsyJe+9KUmyhAAAAAAAAAAAGgsZdcAtf/++ydJJkyYkOeff36trt1vv/1y//33p1u3bk2RGgAAAAAAAAAA0MjKrgHqv//7v9O5c+cUi8Vccskla339HnvskT/96U/p2bNn4ycHAAAAAAAAAAA0qopSJ9DYOnbsmMceeyxz585Nmzbr1t+144475rHHHssjjzzSyNkBAAAAAAAAAACNqewaoJJkhx12aHCMbbfdNttuu20jZAMAAAAAAAAAADSVsnsEHgAAAAAAAAAA0HpogAIAAAAAAAAAAFosDVAAAAAAAAAAAECLVdGci1VVVWXmzJmZP39+qqqq0rFjx3Tp0iW9evVKx44dmzMVAAAAAAAAAACgDDRpA9SyZcty11135a677sqECRPy6quvplgsrjCvUCikd+/e2XPPPTN8+PAMHz48bdrYnAoAAAAAAAAAAFi9JmuAuv/++/PFL34x06ZNS5KVNj4tVywW8/LLL+eVV17JLbfcku233z7XXHNNhg0b1lTpAQAAAAAAAAAAZaBJGqBGjx6dz372s1m2bFlt41O/fv3Sv3//9O7dO507d0779u2zePHiLFiwIK+++mqee+65TJ06NUkyderUHHzwwRk1alROPPHEpkgRAAAAAAAAAAAoA43eADV58uSceeaZWbp0aTbYYINccMEFGTlyZDbddNM1XvvWW2/lpptuyve+973MnTs3n//857PbbrtlwIABjZ0mAAAAAAAAAABQBto0dsBrrrkmixcvzqabbpqnn346559/fr2an5Jk0003zVe/+tU8/fTT2WSTTbJ48eJcc801jZ0iAAAAAAAAAABQJhq9AerBBx9MoVDI17/+9Wy33XbrFGO77bbL17/+9RSLxTz44IONnCHlavh/75MO7StLnQaUVLeuXTJ4t53qvLp17VLqtAAAAAAAAABo5Tq0r8ynD963SWI3+iPwXn/99STJxz/+8QbFWX798niwJgP69klFRaP/loYWpUOH9jn8gH1KnQYAAAAAAAAA1FFRUZEPf2ibpond2AG7dOmSxYsX55133mlQnHfffTdJ0rlz53pf88orrzRozVXZaqutmiQuAAAAAAAAAADQMI3eANW/f/9MmDAhN9xwQ4YNG7bOca6//vokyYABA+p9zTbbNH6XWKFQSE1NTaPHBQAAAAAAAAAAGq5NYwc87rjjUiwWc+edd+aLX/xiFi1atFbXL1q0KF/84hdz5513plAo5Ljjjqv3tcVisUleAAAAAAAAAADA+qnRd4A69dRTc+ONN2bSpEn58Y9/nFtuuSVHHXVUBg8enP79+6dXr17p0qVLKisrU11dnfnz52fmzJl57rnnMn78+Nx22221j88bNGhQTj311HqvfdNNNzX22wEAAAAAAAAAANZjjd4A1bZt2/z+97/P4YcfngkTJmTOnDn52c9+lp/97Gf1un75jkt77rln7r777rRpU/9NqkaMGLFOOQMAAAAAAAAAAC1TozdAJclGG22U8ePHZ8yYMbniiisyZcqUel87YMCAfOUrX8mIESPWqvkJLv3RL3LVt89Nl86dSp0KlMxbs+bkez/5ZZ2xr55xfDbtuVGJMgIAAAAAAACAZP6Chbnkh6ObJHaTNEAlSZs2bXLSSSflpJNOygsvvJBHH300kydPzsyZMzNv3rwsWrQoHTp0SNeuXdOrV68MHDgwe+21V7bffvumSgkAAAAAAAAAACgzTdYA9UHbb7/9etXYNH369EycODFvvvlmFi5cmDPOOCMbb7xxqdMCAAAAAAAAAADWUrM0QK0v/vKXv+Tss8/OhAkT6ox/6lOfqtMA9eMf/zjf/OY3061bt0yePDnt2rVr7lQBAAAAAAAAAIB6aFPqBJrLfffdlz333DMTJkxIsVisfa3MCSeckKqqqsyYMSP33XdfM2cKAAAAAAAAAADUV6togHrjjTdy7LHHZvHixRk4cGB+//vfZ968eauc37Vr1xx66KFJkt///vfNlSYAAAAAAAAAALCWWkUD1JVXXpkFCxakT58+eeSRR3LAAQekc+fOq71myJAhKRaLefrpp5spSwAAAAAAAAAAYG21igaoP/zhDykUCjnnnHPSvXv3el3Tv3//JMmLL77YhJkBAAAAAAAAAAAN0SoaoF5++eUkya677lrvazbYYIMkyfz585skJwAAAAAAAAAAoOFaRQNUTU1NkmTZsmX1vub9999PknTp0qVJcgIAAAAAAAAAABquVTRAbbbZZkmSGTNm1PuaJ598Mkmy1VZbNUlOAAAAAAAAAABAw7WKBqi99947xWIxt99+e73mV1dX57rrrkuhUMiQIUOaNjkAAAAAAAAAAGCdtYoGqJEjRyZJ7rnnnvzxj39c7dzq6uqccMIJmT59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ao+7dOmyxvnLG6Dmz5/fZOt07ty59nht1vlg4xQAAAAAAAAAAPynRm2AWl/dfPPNGTBgQPbYY4+MGjUq9957bz71qU+lf//+6dSp0xqvP+GEE5ohy8azaNG/twyrrKxc4/z27dsnSe22e02xzvI11mUdAAAAAAAAAABYlVbRADVy5MgUCoXar994441ce+219bq2UCi0uAaoDh061B5XV1evcf7ixYuTJB07dmyydZavsbbrrOlxeW+88UZ23XXXescDAAAAAAAAAKC8lKwB6u23386zzz6bd955J0my4YYb5iMf+Ug23XTTJlmvWCw2Sdz1UdeuXWuP6/O4uQULFiSp3+Py1nWd5Wus7Tq9evVaq5wuuugb6dxp7Rq5oJy8Pfvd/Ojmu+qMnX322em5UffSJLSOlixZkqlTpyZJ+vXrV9aPLYXWRG1D+VHXUJ7UNpQfdQ3lSW1DeVLbUH7UNfzbgoWLcskVo5okdrM2QBWLxVx33XX5yU9+kn/+858rnTNw4MCcccYZOf3009OmTZtGWffFF19slDgtRYcOHbLRRhtlzpw5mTlz5mrnvvvuu7XNSb17916rdT7YnLSmdT64k9ParrM2unTpki6d1/xYQyhXCxetuBtbt24bpEePHiXIZt1VV1fX7hbXvXv3ej3OE1j/qW0oP+oaypPahvKjrqE8qW0oT2obyo+6hn9rV7mwyWI3WwPU22+/nUMOOSSTJk1KsuodmSZPnpwzzzwzN954Y+69995sttlmDV67T58+DY7R0gwcODCPPPJIpk2blpqamlRUrPx/9XPPPVd7PGDAgLVeY2VxGnsdAAAAAAAAAABYlWZpgFq8eHH23XffTJkyJcViMT179sxRRx2VXXfdtfaRd2+99Vaeeuqp3HbbbXn77bfz9NNP5xOf+ESefvrptG/fvjnSLCt77bVXHnnkkSxYsCBPP/10Pv7xj6903vjx42uP99xzz7VaY5tttskWW2yR119/vU6clfnzn/+cJNlyyy2z9dZbr9U6AAAAAAAAAACwKo3zjLk1uPLKKzN58uQkycknn5wZM2bk2muvzf/8z/9k2LBhGTZsWP7nf/4n11xzTWbMmJFTTz01STJlypRceeWVzZFi2Tn88MNrj2+66aaVzlm2bFluvvnmJP/aam/o0KFrtUahUMhhhx2W5F87PD3++OMrnff444/X7gB12GGHpVAorNU6AAAAAAAAAACwKs3SAHXrrbemUChk//33z/XXX5/OnTuvcm6nTp1y3XXXZdiwYSkWi7n11lubI8Wys+uuu2bvvfdOkowePToTJ05cYc4VV1yRKVOmJEnOOuustGvXrs75hx9+OIVCIYVCISNHjlzpOmeffXbatm2bJPnCF76QqqqqOuerqqryhS98IUlSUVGRs88+uyFva7X23vW/VngP0Np06tgx2/XZss6r0/9/pjAAAAAAAAAAlEq7du0yePedmiR2szwCb9q0aUmSM844o97XnHHGGXnggQcyffr0RstjypQpGTVqVB555JHMmDEj8+bNy7Jly1Z7TaFQSE1NTaPl0Jyuvvrq7LnnnqmqqsqwYcPyta99LUOHDk1VVVVuvfXWjBo1KknSr1+/nHPOOeu0Rr9+/XLuuefme9/7XiZNmpQ999wz559/frbbbrtMnz493//+9/PMM88kSc4999xsv/32jfb+/tPeu3407Ss1QNG6de3SKWeO/FSp0wAAAAAAAACAOtpXtsvQ3T/WJLGbpQGqffv2qaqqSu/evet9zfK5lZWVjZLDD3/4w1xwwQWpqalJsVhslJjru5122im/+c1vcvzxx2fu3Ln52te+tsKcfv36ZezYsenates6r/Od73wnb7/9dm688cY888wzOeaYY1aYc/LJJ+d///d/13kNAAAAAAAAAABYmWZpgOrfv38ef/zxvPrqq9lpp/ptZfXqq6/WXttQf/jDH/KVr3wlyb92dNptt92y8847Z8MNN0ybNs3yFMCSOeSQQ/L3v/89V199dcaOHZuZM2emsrIyffv2zac//emceeaZ6dSpU4PWaNOmTUaPHp0jjzwyo0aNylNPPZXZs2dn4403zqBBg3L66afnwAMPbKR3BAAAAAAAAAAA/9YsDVAjR47MxIkT87Of/SyHHnpova752c9+lkKhkBNOOKHB61911VVJkh49euSee+7Jnnvu2eCYLUmfPn3ywx/+MD/84Q/X6rohQ4as1W5ZBx10UA466KC1TQ8AAAAAAAAAANZZs2x/dMopp+SAAw7I/fffnzPOOCOLFi1a5dzFixfnzDPPzB/+8IcMGzYsp512WoPXnzRpUgqFQi666KJW1/wEAAAAAAAAAADlrFF3gPrzn/+8ynNf/vKX88477+S6667L3XffnaOOOiqD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p+b444/PXXfdleOOOy79+/dPp06d1hh3q622Wqd8aF5H/PfgdOzQvtRpQEn16LZBLvnyKaVOAwAAAAAAAADq6NihfY765H4553ONH7tZG6CWa9euXXbbbbfstttujRp3m222WeOcYrGYO++8M3feeWe9YhYKhdTU1DQ0NQAAAAAAAAAAoAmUpAGqqRSLxUadBwAAAAAAAAAArN/KqgHqpptuKnUKAAAAAAAAAABAMyqrBqgRI0aUOgUAAAAAAAAAAKAZtSl1AgAAAAAAAAAAAOuqrHaAonX77R/G5/MnbZmOHdqXOhUomXffn5urR99WZ+ysk49Kj24blCgjAAAAAAAAAEiqFi3Obfc91CSxW0UDVFVVVW6//fYkyYEHHpiePXuudv6sWbPy+9//Pkly7LHHpl27dk2eIw333LRXsnTp0lKnASVVXb0k789bsMIYAAAAAAAAAJTS0qVLM3nqS00Su1U8Au+2227LyJEjc+GFF6ZHjx5rnN+jR49ceOGFOfHEE3PnnXc2Q4ZNZ+HChbnssssyaNCgbLjhhuncuXP69++fc845Jy+//HKD47/00kspFAr1eo0cObLhbwgAAAAAAAAAAD6gVTRA3XvvvUmSo48+OhUVa970qqKiIsccc0yKxWLuvvvuJs6u6UybNi077rhjzj///EyaNCnvvvtuFi5cmOeffz4//OEP81//9V+57777Sp0mAAAAAAAAAACss1bxCLy//OUvKRQK2Weffep9zT777JMrrrgiTz/9dBNm1nTmzZuXgw8+OC+88EKS5NRTT80xxxyTjh07Zty4cfnud7+buXPn5uijj86ECROy4447NnjN//3f/81hhx22yvP12X0LAAAAAAAAAADWRqtogHrjjTeSJL179673Nb169UqSvP76602SU1P7wQ9+kKlTpyZJLrvsspx77rm153bfffcMGTIkgwcPzsKFC3P22Wfn4YcfbvCaW265ZT7ykY80OA4AAAAAAAAAANRXq3gEXtu2bZMkixcvrvc11dXVSZJisdgkOTWlJUuW5JprrkmSDBgwIOecc84Kc/bYY4+cfPLJSZLx48fnqaeeatYcAQAAAAAAAACgMbSKBqhNN900SfKPf/yj3tc8++yzSZKePXs2SU5Nady4cXn//feTJCNGjEibNiv/3zxy5Mja47vuuqs5UgMAAAAAAAAAgEbVKhqg9thjjxSLxVx//fX1vua6665LoVDIbrvt1oSZNY1HH3209njw4MGrnLfLLrukU6dOSZIJEyY0eV4AAAAAAAAAANDYWkUD1HHHHZckmTRpUs4666zVPtauWCzmrLPOytNPP13n2pZk8uTJtcf9+/df5byKior07ds3STJlypQGr3vttdemb9++6dChQ7p165YPf/jD+exnP5u//OUvDY4NAAAAAAAAAAArU1HqBJrDgQcemH333Td/+tOf8qMf/SgTJ07MF7/4xey9997ZfPPNkyRvvPFG/vznP+faa6/N008/nUKhkH322SeHHXZYibNfezNnzkySdO7cOd27d1/t3N69e+fvf/97Zs2alcWLF6d9+/brvO4HG50WL16cyZMnZ/Lkybnuuuty+umn5+qrr17r+Mvfy6q88cYbdb6uXrIk1dXVa7UGlJPqJTUrHWtpdbFkyZKVHgMtm9qG8qOuoTypbSg/6hrKk9qG8qS2ofyoa/i36iasgVbRAJUkt912W4YMGZJ//OMfefrppzNixIhVzi0Wi9lhhx1y5513NmOGjWfevHlJki5duqxxbufOnWuP58+fv04NUN27d8/w4cMzZMiQbL/99unQoUPeeOONPPDAAxk9enTmz5+f6667LvPmzcuvfvWrtYrdu3fvtZo/ZfKUdGjfbq2ugXLy/ryFK4y9MHVq3n6jUwmyaRzPPfdcqVMAmoDahvKjrqE8qW0oP+oaypPahvKktqH8qGtau0WLm64BqlU8Ai9JNtxwwzzxxBM5++yz07FjxxSLxZW+OnXqlC9/+ct5/PHHs+GGG5Y67XWyaNGiJEllZeUa536w4amqqmqt19piiy3y2muv5cYbb8wJJ5yQ3XffPTvttFMOOuigXHXVVfnLX/6SrbbaKkny61//Ovfcc89arwEAAAAAAAAAAKvSanaASpKOHTvmhz/8YS6++OL86U9/yjPPPJPZs2cnSTbeeON87GMfy9ChQ9OtW7dmyadQKDQ4xk033ZSRI0fWGevQoUOS1OuRV4sXL6497tix41qvX1lZudpGq+233z6//OUvs88++yRJrr322hx66KH1jv/qq6+u9vwbb7yRXXfdtfbrAQMHpEuntX8fUC7emv1uMv4vdca279cvm27co0QZrZslS5bUdsD3798/7drZ2Q3KgdqG8qOuoTypbSg/6hrKk9qG8qS2ofyoa/i3+QurktzfJLFbVQPUct26dcvw4cMzfPjwUqfSJLp27ZrkX4+0W5MFCxbUHtfnkXnrYu+9987AgQMzefLkPProo1m2bFnatKnf5mO9evVaq7Uq27Wr185XUK4q2634bb2yXUWLrot26hrKktqG8qOuoTypbSg/6hrKk9qG8qS2ofyoa1q7yiU1TRa7VTZArS+mTJnS4Bibb775CmO9evXKE088kQULFuS9995L9+7dV3n98h2WevbsWedxeI1teQPUokWLMmfOnPTs2bPR19hqy03Ttm3bRo8LLUm7du3SoX3lCmMAAAAAAAAAUEpt27ZNn16bNUlsDVAl1L9//yaJO3DgwNx5551Jkueeey677bbbSufV1NRk+vTpSZIBAwY0SS7LNcbj/tbk+OHD0rFD0zVxQUuwYfcN8t2vfq7UaQAAAAAAAABAHR07tM+JRx2ci85p/Nj1ew4ZLcpee+1Vezx+/PhVzps0aVLtI/D23HPPJs1p8uTJSZL27dtno402atK1AAAAAAAAAABoPTRAlaEhQ4akW7duSZKf//znKRaLK503ZsyY2uPhw4c3WT4TJkzIP//5zyT/as5q08ZvOwAAAAAAAAAAGodOlDJUWVmZL37xi0mSKVOm5PLLL19hzsSJEzN69OgkyeDBgzNo0KCVxioUCikUCtl6661Xev7uu+9eZYNVkkybNi3HHXdc7ddnnHFGfd8GAAAAAAAAAACsUUWpE6BpnHvuufnNb36TqVOn5rzzzsu0adNyzDHHpGPHjhk3blwuvfTS1NTUpGPHjrnqqqvWeZ3hw4enb9++OeKII7LrrrumV69ead++fd54443cf//9GT16dObPn58kOeqoo3LEEUc00jsEAAAAAAAAAAANUGWra9euGTt2bA466KC88MILGTVqVEaNGlVnzgYbbJBf/epX2XHHHRu01rRp03LZZZetds7nPve5XHnllQ1aBwAAAAAAAAAA/pMGqDLWt2/fPPPMM/nxj3+c22+/PdOmTUt1dXV69+6dgw46KGeddVb69OnToDXuueeeTJw4MU888URefvnlzJ49OwsWLMgGG2yQbbfdNnvvvXdOOumkfOQjH2mkd7Vq949/Iidu2Ssd2lc2+Vqwvnp/7vz87Jd31xn77PGHp9sGXUqTEAAAAAAAAAAkWbS4OmMfeqxJYmuAKnOd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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "from qibolab.pulses import Pulse, ReadoutPulse, DrivePulse, FluxPulse\n", - "from qibolab.pulses import PulseShape, Rectangular, Gaussian, Drag, IIR, SNZ, eCap, Waveform\n", - "\n", - "p0 = DrivePulse(start=0, \n", - " duration=40, \n", - " amplitude=1, \n", - " frequency=200e6, \n", - " relative_phase=0, \n", - " shape=Gaussian(5), \n", - " channel=10, \n", - " qubit=0)\n", - "\n", - "p1 = ReadoutPulse(start=p0.duration,\n", - " duration=400,\n", - " amplitude=1, \n", - " frequency=20e6, \n", - " relative_phase=0,\n", - " shape=Rectangular(),\n", - " channel=20, \n", - " qubit=0)\n", - "ps = p0 + p1\n", - "ps.plot()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If one of those variables change, the pulses that use them change automatically:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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s2Llqtxw2/3r7Tvj5GPkgnZLJgAAAAAAAKBlWLFyVSbf/mCj9N0uCqCGDx+eCRMmpLKyMvPnz0+/fv2SJP369csdd9yRf/zHf8yHH36YxYsXF8/p1KlTfvKTnxQfmUfL9+b8d1NVVdXcw4BmVVVVlblvzN9gH7RXMgEAAAAAAAAtQ1VVVd6Y906j9N0kBVBvvvlmo/S7tpBpY0pKSjJhwoRqjx155JGZPXt27rzzzrz44ouprKzMrrvumhNPPDE77LBDQw4XAAAAAAAAAABoYE1SALXTTjs1eJ8lJSWprKxskL4+9alP5eyzz26QvgAAAAAAAAAAgKbTJAVQhUKhKS4DAAAAAAAAAAC0M01SADV58uQkyX/913/lmWeeyRZbbJHDDz88++23Xz796U8nSd59990888wzeeihh7J69eoMHjw455xzTlMMDwAAAAAAAAAAaKWapABq7NixOeOMMzJjxowcfvjhueGGG7LDDjtU23b+/Pk566yz8tvf/jaPPfZYfvaznzXoWNasWZOZM2fm1VdfzZIlS1JVVbXRc0499dQGHQMAAAAAAAAAANAwmqQA6s4778zkyZMzZMiQPPjggyktLa2x7Q477JD7778/Q4cOzeTJk3P44YfnxBNPrPcYVqxYke9973u5/vrrs3jx4jqfV1JSogAKAAAAAAAAAABaqA5NcZFJkyalpKQk//Iv/1Jr8dNapaWlOe+881IoFHLdddfV+/orVqzI5z73uVx++eVZtGhRCoXCJn0BAAAAAAAAAAAtU5OsAPXnP/85STJw4MA6n7O27QsvvFDv61911VWZPn16kmSPPfbI1772tey7777p3bt3OnRokhowAAAAAAAAAACgETRJAdSSJUuSJO+9916dz1nbdu259fGrX/0qSXLAAQfk97//fcrKyurdJwAAAAAAAAAA0PyaZPmj/v37J0luvvnmOp+ztm2/fv3qff25c+empKQkF1xwgeInAAAAAAAAAABoQ5qkAOq4445LoVDIbbfdlokTJ260/Q9+8IPceuutKSkpyahRo+p9/bVFTw1RTAUAAAAAAAAAALQcTfIIvG9961v5xS9+kXfeeSff/va3c+utt2bs2LEZMmRIttlmm5SUlOTdd9/NM888k1/84hf54x//mCTZdtttc+GFF9b7+oMGDcr06dPzzjvv1LsvAAAAAAAAAACg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0bbrFjytWLFik6+1/fbbZ/78+bnxxhtz6qmnZujQodlnn30ycuTIXH311XnuuefSr1+/JMktt9yS++67b5OvAQAAAAAAAAAANWk3K0AlSXl5eX70ox9lwoQJ+f3vf5/nn38+ixYtSpJstdVW+fu///uMGDEiPXv2bJLxlJSU1LuPyZMnZ9y4cevt69y5c5LU6fE+q1atKm6Xl5dv8vXLyspqLbTadddd89///d855JBDkiTXXHNNjj322Dr3/9Zbb9V6/O23385+++1X/H633XdLty6b/jqgrVi6fEXyu+nr7WuNuVi9enWxAn7QoEHZYgur9bB52kom2grZhrZHrqFtkm1oe+Qa2ibZhrZJtqHtkWv4q6XLVyT5baP03a4KoNbq2bNnRo0alVGjRjX3UBpF9+7dk3zySLuNWbZsWXG7Lo/M2xwHH3xwdt9998ycOTOPP/541qxZkw4d6rb4WJ8+fTbpWmVbbFGnla+grSpbXbnhvlaeiy1a+fhpXm0xE22FbEPbI9fQNsk2tD1yDW2TbEPbJNvQ9sg17V11n901lHZZANVSvPTSS/XuY7vttttgX58+fTJ9+vQsW7YsH374YXr16lXj+WtXWNp6663XexxeQ1tbALVy5cosXrw4W2+9dYNfo98On05paWmD9wutSWlpaXbpv8MG+6C9kgkAAAAAAABoGUpLS9O/z7aN0rcCqGY0aNCgRul39913z1133ZUkefnll7P//vtX266ysjJz585Nkuy2226NMpa1GuJxfxvzpVGHp7xz4xVxQWtQ3rlTvjbu/zT3MKDFkAkAAAAAAABoGco7d8ppJx6Vi89r+L7r9hwyWpWDDjqouD116tQa282YMaP4CLwDDzywUcc0c+bMJEmnTp3yqU99qlGvBQAAAAAAAABA+6EAqg0aPnx4evbsmST5+c9/nkKhUG27m266qbg9atSoRhvPE088kRdffDHJJ8VZHTr4zw4AAAAAAAAAgIahEqUNKisry9e//vUkyUsvvZQf/OAHG7SZNm1abrjhhiTJsGHDMmTIkGr7KikpSUlJSXbcccdqj9977701FlglyZw5c3LKKacUvz/nnHPq+jIAAAAAAAAAAGCjOjb3AGgc559/fn71q19l1qxZueCCCzJnzpycfPLJTdHW2AAAJq5JREFUKS8vz5QpU3LZZZelsrIy5eXlufrq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vHjxBsemTJmyWQVQSXL22WdnwYIF+e53v5u5c+fm9NNP36DNyJEjc+ONN25W/wAAAAAAAAAAUBMFUDSISy+9NEcccUSuvfbaPPbYY3n33XfTq1ev7LXXXjnttNMyZsyYRrlunz59UigUGqVvoPnINrRNsg1tj1xD2yTb0PbINbRNsg1tk2xD2yPX0DRKCpIGAAAAAAAAAAC0Uh2aewAAAAAAAAAAAACbSwEUAAAAAAAAAADQaimAAgAAAAAAAAAAWi0FUAAAAAAAAAAAQKulAAoAAAAAAAAAAGi1FEABAAAAAAAAAACtlgIoAAAAAAAAAACg1VIABQAAAAAAAAAAtFoKoGi13njjjZx33nkZNGhQunbtmt69e2fIkCG58sors3z58uYeHvD/lZSU1Olr+PDhG+3r17/+dUaNGpU+ffqkU6dO6dOnT0aNGpVf//rXjf9CoB1577338sADD+Tiiy/OkUcema222qqY1XHjxm1yfw2R3crKyvz0pz/NwQcfnK233jrl5eXZZZddcvbZZ+fFF1/c5DFBe9QQ2b7pppvqPLffdNNNG+1v+fLlmThxYoYMGZLevXuna9euGTRoUM4777y88cYb9XvB0A7MmDEj3/nOd3L44YcX59lu3bpl4MCBOe200/L4449vUn/mbGgZGiLb5mxoWT7++OPcdtttOe+88zJs2LAMGDAgPXv2TFlZWbbZZpsMHz48EydOzOLFi+vU35NPPpkvfelL6d+/fzp37pxtt902RxxxRG699dZNGtett96aww8/PNtuu206d+6c/v3750tf+lKmTZu2OS8T2pWGyPWjjz5a5/n6kksu2eiY3ItD47rwwgvXy+Wjjz660XO8z4YmVoBW6L777iv06NGjkKTar4EDBxZmz57d3MMECoUac/q3X8OGDauxj6qqqsIZZ5xR6/lnnnlmoaqqquleGLRhtWVt7Nixde6nobK7cOHCwpAhQ2rso1OnToXrr7++nq8a2r6GyPbkyZPrPLdPnjy51r5mz55d2HXXXWs8v0ePHoX777+//i8c2qiDDz64Tlk89dRTC6tWraq1L3M2tBwNlW1zNrQsv/vd7+qUx6222qrwm9/8pta+JkyYUOjQoUONfRx11FGFFStW1NrH8uXLCyNHjqyxjw4dOhQuueSShvwngDanIXI9ZcqUOs/XEyZMqHU87sWhcT3//POFjh07rperKVOm1Nje+2xoHh0Drczzzz+fk046KStWrEi3bt3y7W9/OyNGjMiKFSty22235frrr8+sWbNy1FFHZcaMGenevXtzDxlI8pWvfCXnnHNOjce7du1a47GLLrooN9xwQ5Jkn332yQUXXJBddtklc+fOzcSJE/P888/nZz/7WbbeeutcdtllDT52aM/69euXQYMG5aGHHtrkcxsiu1VVVRk1alSeeeaZJMno0aNz1llnpXfv3pk+fXq+973v5b333svZZ5+dHXbYIUceeeTmv1hoR+qT7bV++9vfZvvtt6/xeJ8+fWo8tmTJkhx11FGZPXt2kuSss87KySefnPLy8kyZMiXf//738/HHH+ekk07KE088kb333nuzxwlt1YIFC5Ik22+/fb74xS/m4IMPTr9+/VJVVZVp06blhz/8YebPn5+bb745q1evzi233FJjX+ZsaDkaMttrmbOhZejbt29GjBiRfffdN3379s12222XNWvWZN68ebnzzjtz9913Z9GiRTn22GPz9NNPZ6+99tqgj0mTJuXSSy9Nkuyyyy7513/91+y5555ZsGBBfvzjH2fKlCl58MEHc/rpp9f68+H000/P//7v/yZJRowYkXPPPTfbb799XnjhhVx22WWZO3duLrnkkmy33XYZP3584/yDQBvQELle68Ybb8yQIUNqPL7NNtvUeMy9ODSuNWvWZPz48amsrMw222yT9957b6PneJ8NzaS5K7BgU639S7iOHTsWnnzyyQ2OT5w4sc4V8UDjq28eX3nllWJV/eDBgwvLly9f7/iyZcsKgwcPLv5csPob1N/FF19cuP/++wvvvPNOoVAoFF577bViluu6SkxDZfeGG24oXvucc87Z4Pjs2bOLq0IOGDCgsHr16k17sdCONES2111N4rXXXtvssfz7v/97sZ+JEyducPyJJ54o/gypbZVIaM+OOuqowq9+9atCZWVltccXLlxYGDhwYDFrU6dOrbadORtalobKtjkbWpaaMr2ue+65p5i3UaNGbXB88eLFhZ49exaSFPr161dYuHDhBtc45phjNroqxSOPPFJsc8wxx2wwtoULFxb69etXSFLo1atX4f3336/7C4V2pCFyve4KULWtJLMx7sWhcV111VWFJIVBgwYVvv3tb280t95nQ/NRAEWrMn369OIP+rPPPrvaNlVVVYXddtut+AatoqKiiUcJrKu+BVBf+cpXin1Mmzat2jbTpk2r9SYQqJ/NKZJoqOyundN79+5dWLZsWbVtvv/97xf7uf322+s0PqD5CqAqKiqKH9zstttuNS71ffbZZxev9fTTT2/WtaC9u//++4s5+ud//udq25izofWpS7bN2dA6feYznykknzwy629dccUVxazdeuut1Z7/1ltvFUpLSwtJCiNHjqy2zZFHHln8wPWtt96qts2tt95aa/EjUHe15bqhCqDci0PjeeONNwrdunUrJCk8+uijhQkTJmw0t95nQ/PpEGhF7r333uL2aaedVm2bDh065NRTT02SfPjhh5kyZUpTDA1oBIVCIf/zP/+TJBk0aFD233//atvtv//++cxnPpMk+Z//+Z8UCoUmGyOwoYbK7qxZs/LSSy8lSU488cR06dKl2n7GjRtX3L7nnnvqO3ygkU2ZMiUfffRRkmTs2LHp0KH6t6WyDfU3YsSI4vbcuXM3OG7OhtZpY9luKOZsaHrdu3dPkqxcuXKDY2t/N96jR4+MHj262vP79OmTww47LEnyyCOPZMmSJesdX7JkSR555JEkyWGHHVbjIzBHjx6dHj16JJFrqK/act0Q3ItD4/rqV7+apUuXZuzYsRk2bNhG23ufDc1LARStyuOPP54k6dq1a/bdd98a2607AT3xxBONPi6gcbz22mtZsGBBkmz0xnLt8fnz5+f1119v7KEBtWio7K6d9zfWz7bbbpuBAwcmMe9Da1DXbA8ePLj4yx3Zhs2zatWq4nZpaekGx83Z0DptLNsNxZwNTeuVV17JH//4xySffGC6roqKijz99NNJkqFDh6asrKzGftbmddWqVZkxY8Z6x5555plUVFSs1646ZWVlxQ9sn3nmmaxevXrTXgyQpPZcNxT34tB4br/99jzwwAPp3bt3fvCDH9TpHO+zoXkpgKJVWVvpOmDAgHTs2LHGduveSK49B2hed9xxR3bfffd06dIl3bt3z6677pqxY8fWukrbzJkzi9sbe4Mo99ByNFR2N6eft956K8uWLavzWIHNd9ppp2X77bdPWVlZttpqq+y///75t3/7t8yfP7/W8+qa7Y4dO2bAgAFJzO2wuaZOnVrc3m233TY4bs6G1mlj2f5b5mxouZYvX57Zs2fnRz/6UYYNG5bKysokyTe+8Y312s2aNStVVVVJmn7OrqyszOzZs2t/IUBRXXP9ty666KL0798/nTp1ypZbbpl99tkn3/zmNzNr1qxaz3MvDo3jww8/zLnnnpskueKKK7LVVlvV6Tzvs6F5KYCi1Vi5cmUWLVqUJDUuzbvWlltuma5duyb55Ic90PxmzpyZl156KStWrMjSpUszZ86c3Hzzzfnc5z6XUaNGFZfVX9e8efOK2xvLfd++fYvbcg/Nq6Gyuzn9FAqF9c4DGs+jjz6at99+O6tXr87ixYszffr0/Md//EcGDBiQSZMm1Xje2ox27do1vXr1qvUaa7O9cOHC9Va7ADZuzZo1ufzyy4vfn3jiiRu0MWdD61OXbP8tcza0LDfddFNKSkpSUlKSrl27ZuDAgTnvvPPy7rvvJkm+9a1v5ZRTTlnvnOacs6vrB1jf5uT6bz355JN58803U1FRkQ8//DB//OMfc/XVV2e33XbLJZdcssHjsdZyLw6N44ILLsg777yTAw88MGeccUadz/M+G5pXzUvoQAuz7vPKu3XrttH2Xbt2zbJly7J06dLGHBawEV26dMmxxx6bQw89NIMGDUq3bt2ycOHCTJ06NT/96U+zePHi3HvvvTnuuOPyu9/9LltssUXx3E3J/dqixyRyD82sobLrZwC0TDvvvHNGjx6doUOHFn/B8uqrr+auu+7KnXfemZUrV+bLX/5ySkpKMn78+A3OX5vtut7Tr7V06dJ06tSpgV4FtH1XXXVV8VE5o0ePrvYx8uZsaH3qku21zNnQuuy999657rrrMmTIkA2OmbOhdaot12ttt912GT16dA466KDsvPPO6dixY95888088MADufnmm7N69epceumlqaioyGWXXbbB+XINDe+xxx7Lz372s3Ts2DE//elPU1JSUudzzdnQvBRA0WqsXLmyuF3bM87XWvuLlhUrVjTamICNmz9/frV/Kfr5z38+//zP/5wjjzwyzz//fKZOnZqf/OQn+frXv15ssym5X/eXq3IPzauhsutnALQ8o0aNytixYzf4xc+QIUNy0kkn5YEHHsjo0aOzevXqfPOb38yxxx6bbbfddr22a7O9Kff0iWzDppg6dWq+9a1vJUm22Wab/OQnP6m2nTkbWpe6ZjsxZ0NLdvzxx2fw4MFJPsnL3Llzc/vtt+eee+7JmDFjcvXVV+foo49e7xxzNrRsm5Pr5JN5+Y033ljvj4KT5O///u9z/PHHZ/z48Tn88MPz0Ucf5fLLL89JJ52Uvfbaa722cg0Nq6KiIuPHj0+hUMg3v/nN7LHHHpt0vjkbmpdH4NFqdO7cubhdUVGx0fZrl9suLy9vtDEBG1fbMvmf/vSnc+eddxbf4F1zzTXrHd+U3K+7xL7cQ/NqqOz6GQAtT8+ePWv9q7ejjz46F198cZJk+fLlueGGGzZoszbbm3JPn8g21NWLL76YUaNGpbKyMp07d84dd9yRbbbZptq25mxoPTYl24k5G1qyXr16ZY899sgee+yRIUOG5OSTT87dd9+dm2++Oa+++mqOO+643HTTTeudY86Glm1zcp18smrL3xY/rWu//fbLf/7nfyb55NFWa7fXJdfQsC677LK8/PLL6devXyZMmLDJ55uzoXkpgKLV6N69e3G7Lsv3LVu2LEndlukGms/OO++cz3/+80mSOXPmZMGCBcVjm5L7tZlP5B6aW0Nl188AaJ3Gjx9f/MB16tSpGxxfm+1NuadPZBvq4rXXXsvhhx+eDz74IKWlpbnttttyyCGH1NjenA2tw6Zmu67M2dCy/NM//VO++MUvZs2aNfna176W999/v3jMnA2tU225rquTTz45PXr0SFL7fJ3INdTXyy+/nO9///tJPvmD/XUfLVdX5mxoXgqgaDU6d+6cT33qU0mSefPm1dr2gw8+KP6w79u3b6OPDaif3Xffvbg9f/784nafPn2K2xvL/VtvvVXclntoXg2V3c3pp6SkZL3zgKa3zTbbFO/b153X11qb0WXLluXDDz+sta+12d56663XW84b2NCCBQty2GGHZcGCBSkpKcmNN96Y4447rtZzzNnQ8m1OtuvKnA0tz9p8L1u2LL/5zW+K+5tzzq6uH6Duasp1XXXs2DEDBw5MUvt8nbgXh/q66qqrUlFRkZ133jnLly/PbbfdtsHXX/7yl2L73//+98X9az+X9j4bmlfH5h4AbIrdd989jz32WObMmZPKysp07Fj9f8Ivv/xycXu33XZrquEBm6mmZfnXLYxaN9fVkXtoORoqu3/bz957773Rfvr27btZf5kDNKzaHrmz++6756677krySXb333//attVVlZm7ty5ScztsDGLFi3K5z//+bz66qtJPvlL1VNPPXWj55mzoWXb3GxvCnM2tCxbb711cfuNN94obg8cODClpaWpqqpq0Dm7Lv107Ngxu+6668YHD1Srplxvio3N12u5F4f6WfsouVdffTVjxozZaPvvfve7xe3XXnstXbt29T4bmpkVoGhVDjrooCSfVMo/++yzNbZbdxnQAw88sNHHBdTPzJkzi9vbb799cXunnXYqfl/d8r7r+sMf/pAk2WGHHbLjjjs2/CCBOmuo7K6d9zfWzzvvvJNZs2YlMe9DS7Bw4cIsWrQoyfrz+lp1zfaMGTOKfz0n21Czjz76KEcccUTxnvryyy/PV7/61Tqda86Glqs+2a4rcza0POuu7rLuI2zKysqy3377JUmmTZuWioqKGvtYm9dOnTpl8ODB6x0bMmRIysrK1mtXnYqKijz11FPFc7bYYotNfCXAWjXluq4qKyuL99D1ma/di0PT8D4bmpcCKFqV448/vrg9efLkatusWbMmN998c5KkV69eGTFiRFMMDdhMr732Wn73u98lSXbZZZfssMMOxWMlJSXFJYJffvnl4i9e/tZTTz1VrHA/7rjjav2LGKDxNVR2Bw4cWPzLl9tvvz3Lly+vtp+bbrqpuD1q1Kj6Dh+op+uuuy6FQiFJMmzYsA2ODx8+PD179kyS/PznPy+2/VuyDRu3fPnyHHXUUXnuueeSJBdddFEuvPDCOp9vzoaWqb7ZritzNrQ8d9xxR3F7zz33XO/Y2t+Nf/zxx7n77rurPX/evHl5+OGHkySHHnpounfvvt7x7t2759BDD02SPPzwwzU+Uufuu+/Oxx9/nESuob5qy3Vd/OpXv8pHH32UpPr52r04NJybbrophUKh1q8JEyYU20+ZMqW4f20Bk/fZ0MwK0MocfPDBhSSFjh07Fp588skNjk+cOLGQpJCkMGHChKYfIFB03333FVavXl3j8Xfeeaewzz77FDP7wx/+cIM2r7zySqG0tLSQpDB48ODC8uXL1zu+fPnywuDBg4s/F2bNmtXgrwPau9dee62Y07Fjx9bpnIbK7g033FC89le/+tUNjs+ZM6fQo0ePQpLCgAEDav2ZA6xvU7P92muvFZ577rla29x///2FsrKyQpJCeXl5Yd68edW2+/d///fitSdOnLjB8SeffLLQsWPHQpLCsGHD6vJyoN1ZtWpV4fDDDy9m6dxzz92sfszZ0LI0RLbN2dDyTJ48ubBixYpa2/zoRz8q5m2nnXYqVFZWrnd88eLFhZ49exaSFPr3719YtGjRescrKysLxxxzTLGPKVOmVHudRx55pNjm2GOP3eA6CxcuLPTr16+QpNCrV6/C+++/v+kvGNqB+ub6/fffrzGna02fPr3Qq1evQpJCSUlJYcaMGdW2cy8OTWfChAkbnWu9z4bmU1Io1PCnO9BCPf/88znwwAOzYsWKdOvWLf/6r/+aESNGZMWKFbntttty3XXXJfmkMnbGjBkb/JUL0HR23HHHrF69OieccEKGDh2aHXfcMeXl5Vm0aFEeffTRTJo0qbjc/kEHHZSHH344nTp12qCfb3/727n88suTJPvss08uvPDC7LLLLpk7d26uuOKKPP/888V2l112WdO9QGijHn/88cyZM6f4/aJFi3L++ecn+WQZ3TPPPHO99uPGjau2n4bIblVVVYYNG5YnnngiSXLCCSfkrLPOypZbbpmnn3463/3ud/Pee++lQ4cOeeCBB3LkkUfW67VDW1bfbD/66KMZMWJEhg4dmmOOOSZ77bVXttlmmyTJq6++mjvvvDN33nlncXWIa6+9Nuecc061Y1myZEkGDx5cXKJ7/PjxOfnkk1NeXp4pU6bksssuy9KlS1NeXp4nn3wye++9d0P8E0CbcsIJJxRXf/jc5z6Xq6++utaVUMvKyjJw4MBqj5mzoeVoiGybs6Hl2XHHHbNkyZKccMIJOeigg7LLLrukW7duWbJkSV544YX88pe/LM6hZWVlefDBB3PYYYdt0M+kSZPy5S9/OcknK6lfdNFF2XPPPbNgwYJcffXVmTJlSpJkzJgxueWWW2ocz5gxY3LbbbclSUaMGJFvfOMb2X777fPCCy/kP/7jPzJ37tzi9caPH9+g/xbQVtQ316+//np22mmn/N3f/V2OP/747Lvvvtluu+1SWlqaN998Mw888EB+8YtfFB95ef7552fixInVjsW9ODSdSy65JJdeemmST1aAGj58eLXtvM+GZtK89Vewee67775iRWt1XwMHDizMnj27uYcJ7V7//v1rzOm6XyeccELhgw8+qLGfqqqqwumnn15rH2eccUahqqqq6V4ctGFjx46tU3bXftWkobK7cOHCwpAhQ2rso1OnToXrr7++of8ZoM2pb7anTJlSp/O6dOlSmDRp0kbHM3v27MKuu+5aYz89evQo3H///Y3xTwFtwqbkOf9/pYiamLOh5WiIbJuzoeWp6+/I+vTpU3jooYdq7eviiy8ulJSU1NjHyJEjN7oqzfLlywsjR46ssY8OHTp4ugJsRH1zve6qzLV9lZaWFi655JLCmjVrah2Pe3FoGnVZAapQ8D4bmosVoGi13njjjfz4xz/Ogw8+mHnz5qWsrCwDBgzIF7/4xXzta19Lly5dmnuI0O5NnTo1U6dOzbRp0/Lqq69m0aJF+fjjj9OtW7f07ds3BxxwQMaOHZuhQ4fWqb///d//zXXXXZdnnnkmixYtylZbbZUhQ4bk7LPPVtkODWjcuHH5+c9/Xuf2G7udbIjsVlZW5vrrr88tt9ySl156KcuWLcv222+fQw89NOeee24++9nP1nm80F7VN9tLlizJfffdl2nTpmXGjBl5++23s2jRolRWVmbLLbfMZz/72Rx66KE588wzi6tMbMyyZcty7bXX5o477sicOXNSUVGRvn37ZuTIkTn33HPTv3//TXqN0J7UtiJMdfr375/XX3+91jbmbGh+DZFtcza0PK+88koefPDBPPHEE5kzZ07efffdLF68OOXl5dlmm22y99575+ijj86JJ55Yp99rP/nkk7n22mvz2GOP5d13302vXr2y11575bTTTsuYMWPqPK5bbrklN910U/70pz/lww8/zKc//ekcfPDB+drXvlbn39dBe1XfXFdUVBTn66effjrz58/PokWLsnLlyvTs2TOf+cxnMnz48Jx55pnZcccd6zQm9+LQ+Oq6AtRa3mdD01IABQAAAAAAAAAAtFodmnsAAAAAAAAAAAAAm0sBFAAAAAAAAAAA0GopgAIAAAAAAAAAAFotBVAAAAAAAAAAAECrpQAKAAAAAAAAAABotRRAAQAAAAAAAAAArZYCKAAAAAAAAAAAoNVSAAUAAAAAAAAAALRaCqAAAAAAAAAAAIBWSwEUAAAAAAAAAADQaimAAgAAAAAAAAAAWi0FUAAAAAAAAAAAQKulAAoAAAAAAAAAAGi1FEABAAAAAAAAAACtlgIoAAAAAAAAAACg1VIABQAAAAAAAAAAtFoKoAAAAAAAAAAAgFZLARQAAAAAAAAAANBqKYACAAAAAAAAAABaLQVQAAAAAAAAAABAq6UACgAAAAAAAAAAaLUUQAEAAAAAAAAAAK2WAigAAAAAAAAAAKDVUgAFAAAAAAAAAAC0WgqgAAAAAAAAAACAVuv/ASY7qYumVReIAAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "p0.duration = 80\n", - "ps.plot()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "or" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Initialisation" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The main changes in the initialization of Pulse are those related to the changes in the attributes: \n", - "```python\n", - "def __init__(self, start: int, duration: int, amplitude: float, \n", - " frequency: int, relative_phase: float, shape: PulseShape | str,\n", - " channel: int | str, type: PulseType | str = PulseType.DRIVE, qubit: int | str = 0):\n", - "``` \n", - "The argument `phase` was replaced with `relative_phase`, the `shape` argument continues to support `PulseShape` objects or strings. `channel`and `qubit` support both integers or strings, and finally, the `type` argument supports a string or a constant from PulseType enumeration:\n", - "```python\n", - "class PulseType(Enum):\n", - " READOUT = \"ro\"\n", - " DRIVE = \"qd\"\n", - " FLUX = \"qf\"\n", - "```\n", - "\n", - "Pulse `type` and `qubit` are optional arguments, and default to `PulseType.DRIVE` and `0` respectively.\n", - "\n", - "Below are some examples of Pulse initialization:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "from qibolab.pulses import Pulse, ReadoutPulse, DrivePulse, FluxPulse\n", - "from qibolab.pulses import PulseShape, Rectangular, Gaussian, Drag\n", - "from qibolab.pulses import PulseType, PulseSequence, SplitPulse\n", - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "# standard initialisation\n", - "p0 = Pulse(start = 0, \n", - " duration = 50, \n", - " amplitude = 0.9, \n", - " frequency = 20_000_000, \n", - " relative_phase = 0.0, \n", - " shape = Rectangular(), \n", - " channel = 0, \n", - " type = PulseType.READOUT, \n", - " qubit = 0)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "# initialisation with str shape\n", - "p4 = Pulse(start = 0, \n", - " duration = 50, \n", - " amplitude = 0.9, \n", - " frequency = 20_000_000, \n", - " relative_phase = 0, \n", - " shape = 'Rectangular()', \n", - " channel = 0, \n", - " type = PulseType.READOUT, \n", - " qubit = 0)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "# initialisation with str channel and str qubit\n", - "p5 = Pulse(start = 0, \n", - " duration = 50, \n", - " amplitude = 0.9, \n", - " frequency = 20_000_000, \n", - " relative_phase = 0, \n", - " shape = 'Rectangular()', \n", - " channel = 'channel0', \n", - " type = PulseType.READOUT, \n", - " qubit = 0)\n", - "assert p5.qubit == 0" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "# examples of initialisation with different frequencies, shapes and types\n", - "p6 = Pulse(0, 40, 0.9, -50e6, 0, Rectangular(), 0, PulseType.READOUT)\n", - "p7 = Pulse(0, 40, 0.9, 0, 0, Rectangular(), 0, PulseType.FLUX, 0)\n", - "p8 = Pulse(0, 40, 0.9, 50e6, 0, Gaussian(5), 0, PulseType.DRIVE, 2)\n", - "p9 = Pulse(0, 40, 0.9, 50e6, 0, Drag(5,2), 0, PulseType.DRIVE, 200)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAACTEAAAOLCAYAAACCaFUXAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAB7CAAAewgFu0HU+AAEAAElEQVR4nOzde3ycZZ3///c9M5kcJudz0qZpaRLSk23tASpgKSCuUFD4grhyKovirvJd8NcVhVWsRxYVtD5W97sFpIBg+coCItWvCJYuYLEUWkp6TJqecj6fJjPJnH5/dDNkmsk5k3uSvJ6PRx7cc93XXPc74cqdaeaT6zICgUBAAAAAAAAAAAAAAAAAAGASi9kBAAAAAAAAAAAAAAAAAMxsFDEBAAAAAAAAAAAAAAAAMBVFTAAAAAAAAAAAAAAAAABMRRETAAAAAAAAAAAAAAAAAFNRxAQAAAAAAAAAAAAAAADAVBQxAQAAAAAAAAAAAAAAADAVRUwAAAAAAAAAAAAAAAAATEUREwAAAAAAAAAAAAAAAABTUcQEAAAAAAAAAAAAAAAAwFQUMQEAAAAAAAAAAAAAAAAwFUVMAAAAAAAAAAAAAAAAAExFERMAAAAAAAAAAAAAAAAAU1HEBAAAAAAAAAAAAAAAAMBUFDEBAAAAAAAAAAAAAAAAMBVFTAAAAAAAAAAAAAAAAABMRRETAAAAAAAAAAAAAAAAAFNRxAQAAAAAAAAAAAAAAADAVBQxAQAAAAAAAAAAAAAAADAVRUwAAAAAAAAAAAAAAAAATEUREwAAAAAAAAAAAAAAAABTUcQUAQ0NDXr55Zd1//3361Of+pQyMzNlGIYMw9CGDRsics3f/OY3uvzyy5Wbm6u4uDgVFhbqpptu0q5du0Y8Rnd3t370ox9p1apVSk9Pl8PhUGlpqTZu3KiTJ09GJDcAAAAAAAAAAAAAAABgBAKBgNkhphvDMAY9d+utt2rr1q0Tdi2Xy6XrrrtOf/jDH8Ket1gsuv/++/Xtb397yHEqKip0xRVXqLy8POz55ORkPf3001q/fv24MwMAAAAAAAAAAAAAAAD9sRJThM2ZM0eXX355xMb/h3/4h2AB07p16/Tiiy9q9+7deuyxxzR//nz5/X5t2rRJW7ZsGXSMzs5OXXnllcECpi9+8Yt67bXX9Ne//lU/+MEPlJiYqI6ODt1www3at29fxD4XAAAAAAAAAAAAAAAAzEysxBQB3/72t7Vq1SqtWrVKOTk5OnHihObNmydpYldi+stf/qJLL71UknTVVVfphRdekNVqDZ5vamrSihUrdOrUKaWmpqqyslJpaWkDxrn//vv1ve99T5L0ox/9SF/72tdCzv/1r3/V2rVr5fV6tXbtWr3++usTkh8AAAAAAAAAAAAAAACQWIkpIr7zne9o/fr1ysnJieh1fvKTn0iSbDabfvnLX4YUMElSZmamHnzwQUlSW1ubHn300QFjeDwe/fznP5ckLViwQBs3bhzQ52Mf+5huv/12SdLOnTv1zjvvTOjnAQAAAAAAAAAAAAAAgJmNIqYpqrOzU6+99pok6bLLLtPs2bPD9rv22muVnJwsSXrhhRcGnN+xY4fa29slnVklymIJPyU2bNgQPA43DgAAAAAAAAAAAAAAADBWFDFNUe+88456e3slSWvXrh20n91u1/nnnx98jsfjCTn/5ptvBo+HGmflypVKSEiQJL311ltjzg0AAAAAAAAAAAAAAACczWZ2AIzNwYMHg8elpaVD9i0tLdUrr7wir9er8vJyLVy4cNTj2Gw2FRUVaf/+/Tp06NCo81ZVVQ153u126/Dhw8rJyVFWVpZsNqYmAAAAAAAAgInn9XrV2NgoSVqyZIni4uJMTgSYy+1264MPPpAkfj8PAACAEYvEv614JTpF9S8KGmwruT4FBQXB49OnT4cUMfWN43A4lJqaOuw4+/fvV2Njo3p6ehQbGzvivP0zAAAAAAAAAEA02L17t1atWmV2DMBUH3zwgVavXm12DAAAAExhE/VvK7aTm6I6OzuDx4mJiUP2dTgcweOurq6w4ww3xnDjAAAAAAAAAAAAAAAAAGPFSkxTlNvtDh7b7fYh+/ZfMcnlcoUdZ7gxhhtnOKdPnx72/Mc+9jFJ0ssvv6xzzjlnVOMDE8npdOr555+XJF177bUhBXyAGZiTiCbMR0QT5iOiDXMS0YT5iGjDnEQ0qays1Pr16yWd2ToLmOn6fx/s3r1beXl5k3Ldzs5OPfXUU5Kkm2++WUlJSZNyXUxvzCtMNOYUJhpzCpFg1ryqra0Nrug5Uf+2oohpiuq/l2Bvb++QfXt6eoLH8fHxYccZbozhxhnOcFve9XfOOedowYIFoxofmEgdHR1KSUmRJJWUlCg5OdnkRJjpmJOIJsxHRBPmI6INcxLRhPmIaMOcRLSy2fgVOdD/+yAvL29Uv88fj/4/G2bNmsXPBkwI5hUmGnMKE405hUiIhnk1Uf+2Yju5Kap/5dxwW7s5nc7g8dnbxvWNM5Lt4YYaBwAAAAAAAAAAAAAAABgripimqP5/CVFVVTVk3/5buRUUFIQdx+l0qq2tbUTjZGVlhWwtBwAAAAAAAAAAAAAAAIwHRUxT1MKFC4PHhw8fHrJv33mbzabi4uIxjeP1enXs2DFJYqs3AAAAAAAAAAAAAAAATCiKmKaoVatWyW63S5J27tw5aL/e3l69/fbbwefExMSEnL/wwguDx0ONs2fPnuB2chdccMGYcwMAAAAAAAAAAAAAAABno4hpikpKStKll14qSXr11VcH3VLu+eefV0dHhyTpmmuuGXD+4osvVkpKiiTpiSeeUCAQCDvO1q1bg8fhxgEAAAAAAAAAAAAAAADGiiKmKLV161YZhiHDMLRp06awff7lX/5F0pmt3r7yla/I5/OFnG9qatLXv/51SVJqaqq+8IUvDBjDbrfrn//5nyVJhw4d0k9+8pMBfXbt2qXHHntMkrR27VqtWrVqzJ8XAAAAAAAAAAAAAAAAcDab2QGmozfffFMVFRXBx01NTcHjioqKkFWNJGnDhg1jus4ll1yiz33uc9q2bZteeuklfeITn9Ddd9+t/Px8ffDBB/rBD36gU6dOSZIefPBBpaWlhR3na1/7mp599lkdPXpU99xzjyoqKvS5z31O8fHx2rFjh374wx/K6/UqPj5eP/vZz8aUFQAAAAAAAAAAAAAAABgMRUwR8Oijj+qJJ54Ie+6tt97SW2+9FdI21iImSfrVr36ljo4O/eEPf9COHTu0Y8eOkPMWi0Xf+ta3dMcddww6RlJSkrZv364rrrhC5eXl2rJli7Zs2RLSJzk5WU8//bSWLVs25qwAAAAAAAAAAAAAAABAOGwnN8XFx8dr+/btevrpp/WJT3xC2dnZstvtKigo0Oc//3m9+eabg25H119RUZH27t2rBx98UCtXrlRqaqoSEhJ07rnn6qtf/ar279+v9evXR/4TAgAAAAAAAAAAAAAAwIzDSkwRsHXr1gFbxo3Whg0bRrVC0+c//3l9/vOfH9c1HQ6H7rnnHt1zzz3jGgcAAAAAAAAAAAAAAAAYDVZiAgAAAAAAAAAAAAAAAGAqipgAAAAAAAAAAAAAAAAAmIoiJgAAAAAAAAAAAAAAAACmoogJAAAAAAAAAAAAAAAAgKkoYgIAAAAAAAAAAAAAAABgKoqYAAAAAAAAAAAAAAAAAJiKIiYAAAAAAAAAAAAAAAAApqKICQAAAAAAAAAAAAAAAICpKGICAAAAAAAAAAAAAAAAYCqKmAAAAAAAAAAAAAAAAACYiiImAAAAAAAAAAAAAAAAAKaiiAkAAAAAAAAAAAAAAACAqShiAgAAAAAAAAAAAAAAAGAqipgAAAAAAAAAAAAAAAAAmIoiJgAAAAAAAAAAAAAAAACmoogJAAAAAAAAAAAAAAAAgKkoYgIAAAAAAAAAAAAAAABgKoqYAAAAAAAAAAAAAAAAAJiKIiYAAAAAAAAAAAAAAAAApqKICQAAAAAAAAAAAAAAAICpKGICAAAAAAAAAAAAAAAAYCqKmAAAAAAAAAAAAAAAAACYiiImAAAAAAAAAAAAAAAAAKaymR0AOFtbt0fNXT2jfp4j1qa4GGvYcy3OXgUCgTHlibdblWAP/63S1t0rn39s48bGWJUYG37cdpdHXp9/TOPG2CxKjosJe67D7ZHHO7ZxbVaLUuLDj9vV41WPxzemca0WQ6kJ9rDnunu9cvWObVzDMJTuCD+u2+OTs8c76HM7nb1y+c/MpRZnrzyW0PmYkRgb9nk9Xp+63IOPO5y0BLssFmNAe6/Xr063Z8zjpsTHyGYdWLPq9fnV7hr7uElxMbLbBo7r9wfU2t075nET42yKtYX/Xh7LvaEP94gzuEecMZ57xHCm+z1iuHtkH+4RZ3CPOCNS94juIX6OcY84g9cRH5qMe8RI75F9uEecweuID03kPaL/fPQP8nOMe8SHeB1xRiTvES2jvEf24R7xoen2OmKwzwcAAAAAMHNRxISoc/1je2VLPj3q533304t0y5q5Yc9d9vBOtTjH9ovOuy4t1lc/URL23PX/Z5fKG7rGNO7N5xfqe59ZHPbcHU/u0d+Ot4xp3CuW5OqXN64Ie+4b/7Vff/igbkzjnjcvXc9+aU3Ycw/+8bCeevvkmMYtzk7Un/+/tWHP/efOSm1+rXxM46Y77HrvW58Ie+7/7jmt+393YJgRFkiStm7+24AzJ/7tyrDPePVgg77yzHujytnfu9+8LOwv8N492aq/f+TtMY/7ylc/rpKcpAHtlU1OXf7T/x7zuL/54vlaMz9jQHtrd69WfP/VMY/7i89/VFd+JC/sufGMyz3iDO4RZ4z/HjG4mXGPGPwe2Yd7xBncI86I1D1ifmaCLh/kHPeI/2nndUTQ5N0jhr9H9uEecQavIz408feIM/NxQ7dHqSkDz3KP+BCvI86I/D1i5PfIPtwjPjTdXkcM9vkAAAAAAGYutpMDAAAAAAAAAAAAAAAAYCqKmAAAAAAAAAAAAAAAAACYiiImAAAAAAAAAAAAAAAAAKYyAoFAwOwQQFVVlQoKCiRJf93zvkrOPXfUYzhibYqLsYY91+Ls1VinerzdqgS7Ley5tu5e+fxjGzc2xqrE2PDjtrs88vr8Yxo3xmZRclxM2HMdbo883rGNa7NalBIfftyuHq96PL4xjWu1GEpNsIc9193rlat3bOMahqF0R/hx3R6fnD3eQZ/b2dmprVu3SpI2bNigpKSkkPMZibFhn9fj9anLPfi4w0lLsMtiMQa093r96nR7xjxuSnyMbNaBNaten1/trrGPmxQXI7tt4Lh+f0Ct3b1jHjcxzqZYW/jv5eaunjGPO5XvER0dHfqP//gPSdI//dM/KRATzz1C5t0jhjPd7xHD3SP7cI84g9cRZ0TqHtHt7NIzWx+VdOb+mJyc/OE57hGSeB3R32TcI0Z6j+zDPeIMXkd8aCLvEf3n491f/qJSU1IG9OEe8SFeR5wRyXtES2v7qO6RfbhHfGi6vY4Y7POZDIcOHdLChQslSadPn9bs2bNNywJEg/6/n5/M74mzf+fV/990wFgxrzDRmFOYaMwpRIJZ8yoSryPD/8YCMFFqQsyE/xJjsF8ejddgv+war8F+OTdeg/0ycbwSY22D/gJ0PBLstkF/YTsecTHWQX/BLEkx/h7FW878sjLdYVfyCOdjrM2q2MTBxx0ru80SkV/s2ayRGddiMSL2i8hIjcs94gzuEWcMd48Yq+lyjxjrPbIP94gPcY84Yzz3iBj/4G84c484g9cRH5qMe8R475H9cY84g9cRZ4zlHtF/PlqMgcUJEveI/ngdcUZE7xEO+4TdI/twjziD1xEAAAAAgOmC7eQAAAAAAAAAAAAAAAAAmIoiJgAAAAAAAAAAAAAAAACmoogJAAAAAAAAAAAAAAAAgKkoYgIAAAAAAAAAAAAAAABgKoqYAAAAAAAAAAAAAAAAAJiKIiYAAAAAAAAAAAAAAAAApqKICQAAAAAAAAAAAAAAAICpKGICAAAAAAAAAAAAAAAAYCqKmAAAAAAAAAAAAAAAAACYiiImAAAAAAAAAAAAAAAAAKaiiAkAAAAAAAAAAAAAAACAqShiAgAAAAAAAAAAAAAAAGAqipgAAAAAAAAAAAAAAAAAmIoiJgAAAAAAAAAAAAAAAACmoogJAAAAAAAAAAAAAAAAgKkoYgIAAAAAAAAAAAAAAABgKoqYAAAAAAAAAAAAAAAAAJiKIiYAAAAAAAAAAAAAAAAApqKICQAAAAAAAAAAAAAAAICpKGICAAAAAAAAAAAAAAAAYCqKmAAAAAAAAAAAAAAAAACYiiImAAAAAAAAAAAAAAAAAKaiiAkAAAAAAAAAAAAAAACAqShiAgAAAAAAAAAAAAAAAGAqipgAAAAAAAAAAAAAAAAAmIoiJgAAAAAAAAAAAAAAAACmoogJAAAAAAAAAAAAAAAAgKkoYgIAAAAAAAAAAAAAAABgKoqYAAAAAAAAAAAAAAAAAJiKIiYAAAAAAAAAAAAAAAAApqKICQAAAAAAAAAAAAAAAICpKGICAAAAAAAAAAAAAAAAYCqKmAAAAAAAAAAAAAAAAACYiiImAAAAAAAAAAAAAAAAAKaiiAkAAAAAAAAAAOAsDQ0Nevnll3X//ffrU5/6lDIzM2UYhgzD0IYNGyJyzd/85je6/PLLlZubq7i4OBUWFuqmm27Srl27InI9AAAAIJrYzA4AAAAAAAAAAAAQbXJycibtWi6XS9ddd53+8Ic/hLSfOnVKTz/9tH7zm9/o/vvv17e//e1JywQAAABMNlZiAgAAAAAAAAAAGMKcOXN0+eWXR2z8f/iHfwgWMK1bt04vvviidu/erccee0zz58+X3+/Xpk2btGXLlohlAAAAAMzGSkwAAAAAAAAAAABnuf/++7Vq1SqtWrVKOTk5OnHihObNmzfh1/nLX/6ibdu2SZKuuuoqvfDCC7JarZKkVatW6eqrr9aKFSt06tQpff3rX9f111+vtLS0Cc8BAAAAmI2VmAAAAAAAAAAAAM7yne98R+vXr4/4tnI/+clPJEk2m02//OUvgwVMfTIzM/Xggw9Kktra2vToo49GNA8AAABgFoqYAAAAAAAAAAAATNDZ2anXXntNknTZZZdp9uzZYftde+21Sk5OliS98MILk5YPAAAAmEwUMQEAAAAAAAAAAJjgnXfeUW9vryRp7dq1g/az2+06//zzg8/xeDyTkg8AAACYTBQxAQAAAAAAAAAAmODgwYPB49LS0iH79p33er0qLy+PaC4AmIn8fr/cbrc6OzvV0tKihoYGNTY2avbs2Zo9e7YaGhpUX1+vlpYWdXZ2yuv1mh0ZAKYdm9kBAAAAAAAAAAAAZqKqqqrg8WBbyfUpKCgIHp8+fVoLFy4c9TXCqa2tDR53dnaqo6NjROOOV1dXV9hjYDyYV+gTCATk9Xrl9XoVGxsri2Xg2h4ul0snT56Uz+eT1+uV3+8PO1bf/bm6ujqkvaCgQJmZmWGfU1NTI4vFIpvNJqvVKpvNFvJhGMY4P0NMVdynEAlmzavOzs4JH5MiJgAAAAAAAAAAABP0f+MnMTFxyL4OhyN4PJo3p/oXPw3nqaeeUkpKyoj7T5Snnnpq0q+J6Y95Nb1YrVbFxMQEi4D6jodq67Nv3z653e4BY8bFxWnZsmVjzvTqq6+qtbU17LnzzjtvyEIlr9crj8cT8t++4/b2dnV3d485F6YO7lOIhMmcV+3t7RM+JkVMEXby5En9/Oc/1/bt23X69GnFxsZq/vz5+uxnP6uvfOUrSkhIGNO4J06c0Lx580b1nMLCQp04cWJA+8UXX6ydO3eOaIxAIDCqawIAAAAAAAAAgPD6v6lut9uH7BsbGxs8drlcEcsEAJHWt0LR2UVHDQ0NYVdDSkxM1OLFi8d8vf4FTf2Ndzu4wZ4/kpWW+gqvwjl27NigRUyLFi1SIBAYtACq//FgK0sBQDSjiCmCfv/73+umm24KWXq1u7tbe/bs0Z49e/Too49q+/btKioqmpQ855577qRcBwAAAAAAAAAADC8uLi543NvbO2Tfnp6e4HF8fPyIr3H69Okhz9fW1mr16tWSpJtvvlmzZs0a8djj0dXVFVwp4Oabbx52JSpgJJhX0cXv98vpdKqrq0tdXV3q6emR1+sddNGET33qUyH3xT5ut1uHDh0ac46rrrpKqampA9oDgYD27dsX9jn9t33r25Zz9uzZIdvUXXfddRHJe9lll406bziGYchmsyk2NlaJiYlKTk4OWdUP5uA+hUgwa15VV1frgQcemNAxKWKKkL179+qGG26Qy+VSYmKi7r33Xq1bt04ul0vbtm3TI488oqNHj+rKK6/Unj17lJSUNKrxZ82apQ8++GDYfg888ICeeeYZSdKtt946ZN+VK1fq8ccfH1UOAAAAAAAAAAAwNv3fGxhuizin0xk8Hs0bU7Nnzx5VnuTk5BH3nyh9b64DE4l5Nfm8Xq/a29vV3t6utrY2dXV1jWqXF7vdHvb/2WgKN0czriSVlpYGt6rr++i/klJHR4d27Ngh6UxxUd84fZ9XuBWXYmJilJubK4/HE/Ix0pWfUlJSwuYdrtj1bH0rNnk8HnV1dclqtSovL29UYyCyuE8hEiZzXvVf0GeiUMQUIXfddZdcLpdsNpteeeUVrVmzJnjukksuUXFxse655x4dPXpUDz30kDZt2jSq8WNiYoZdNtHn8+n111+XdOYfHtdcc82Q/R0Ox7iWYgQAAAAAAAAAACPXv8CoqqpKK1euHLRv/xWVCgoKIpoLAMaivb1dZWVlY37+UNuz9bFYLCEFR8N92Gw2WSyWQa+Zk5MzpqxDbRcXHx8fdoec/kVFQ3303z60P4/HM6asfVJSUgY9d/LkScXHxyslJWXQ6wPAZKCIKQJ2796tN954Q5J0++23hxQw9dm4caMef/xxHTp0SJs3b9a//uu/KiYmZkJzvPrqq6qpqZEkXXfddeOuUgYAAAAAAAAAABNn4cKFwePDhw8P2bfvvM1mU3FxcURzAcDZAoGA3G632tvblZGREfZ9zaGKZMIxDCOk2MhqtQ7a7/zzzx+yz1RgGIbsdrvsdvuYnm+327VgwYJhi6AGW/1qsP8/Ho9HJ06cCD6Oi4tTSkpK8CM+Pn7Ioi0AmEgUMUXAiy++GDy+7bbbwvaxWCy65ZZbdO+996qtrU07duzQ5ZdfPqE5nnzyyeDxcFvJAQAAAAAAAACAybVq1SrZ7Xb19vZq586d+sY3vhG2X29vr95+++3gcyb6j6IB4GyBQEBOpzO4PVx7e3twO7OFCxcqKytrwHNsNpscDkfI9pfSmR1j+rZIi42NDRYuWa3WERfHsDrQmZ16srOzh+wTCATk8/mCBU29vb1qb29XT0/PoMVT7e3tIY/dbrfcbrfq6+slnSme6l/U5HA4KGoCEDEUMUXAm2++KenM9mwrVqwYtN/atWuDx2+99daEFjF1dnYGi6nmzp2rj3/84xM2NgAAAAAAAAAAGL+kpCRdeuml+uMf/6hXX31VVVVVIVvM9Xn++efV0dEhSbrmmmsmOyaAGcDv96urqyukaGmw7d3a2trCFjFJUlpammw2W0jRy1RePWmqMQxDNptNNpstuEtPZmbmkM85u4jpbL29vWpsbFRjY6OkM8VqycnJwf+/ycnJFDUBmDCDbwCKMTt06JAkqaioKGSP1rOVlpYOeM5Eee6559Td3S1Juvnmm0f0g+Pw4cM677zzlJqaqri4OM2ePVuf/vSn9eSTT457j1UAAAAAAAAAAGaarVu3yjAMGYahTZs2he3zL//yL5Ikr9err3zlK/L5fCHnm5qa9PWvf12SlJqaqi984QsRzQxgZvD5fGptbdWJEyf0/vvv66233tLevXtVWVmp5ubmQQuYpKGLXubPn69ly5Zp3rx5Sk9Pp4BpCkhMTBzV/yuv16uWlhYdP35c+/btG3KuAMBosRLTBHO73WpqapKksH8t0V9aWlpwScXTp09PaI7+W8ndcsstI3pOfX19cFlASaqurlZ1dbVeeuklPfjgg3ruuee0YMGCMeWpqqoa8nxtbW3w2Ol0Bv+iBDBDV1dX2GPALMxJRBPmI6IJ8xHRhjmJaMJ8RLRhTiKanL3FDTCYN998UxUVFcHHfb/7l6SKigpt3bo1pP+GDRvGdJ1LLrlEn/vc57Rt2za99NJL+sQnPqG7775b+fn5+uCDD/SDH/xAp06dkiQ9+OCDSktLG9N1AKC/999/X52dnaN+XkxMjBISEhQIBFh9Z5rIyclRTk7OgC0E29rahl3oIiEhYdAtTru6uuR2u5WSksI2qABGjCKmCdb/h31iYuKw/fuKmCbylzenTp3Szp07JUkf+9jHVFRUNGR/i8WiSy+9VFdccYWWLl2qjIwMdXZ26r333tN//ud/6tChQzp48KDWrVun3bt3a86cOaPOVFBQMOK+zz//vFJSUkZ9DSASnnrqKbMjACGYk4gmzEdEE+Yjog1zEtGE+Yhow5yE2YbbMgXo8+ijj+qJJ54Ie+6tt97SW2+9FdI21iImSfrVr36ljo4O/eEPf9COHTu0Y8eOkPMWi0Xf+ta3dMcdd4z5GgBmlp6eHvX29iopKSns+eTk5BEVMcXFxYVsDRcfH0/x0jRlGIYSExOVmJioWbNmKRAIyOVyhWwx6Ha7Q54z1Hu6dXV1qq6ulnTmPfH+8yg2NjainwuAqYsipgnW/8Ztt9uH7d93g3a5XBOW4de//rUCgYCkka3C9Pzzzys1NXVA+0UXXaQvf/nL+uIXv6gnnnhC9fX1uvvuu/X8889PWFYAAAAAAAAAAGa6+Ph4bd++Xc8884y2bt2q999/X21tbcrJydFFF12kO++8U2vWrDE7JoAoFQgE5Ha7Q4pNXC6XHA6HVq5cGfY5KSkpwQKT/hISEkKKTeLi4iIdH1HKMAwlJCQoISFBeXl5ks4Ux/WfZ+HeY+7Tf+cdp9Mpp9OpmpoaSaHFcampqYqLi6M4DoAkipgmXP8f5L29vcP27+npkXTmHygTpe+v2WJjY3XDDTcM23+oHy4xMTF69NFH9fbbb+vIkSN64YUXVF1drVmzZo0q03Db5dXW1mr16tWSpGuvvVYlJSWjGh+YSF1dXcHvo5tvvnlEq6oBkcScRDRhPiKaMB8RbZiTiCbMR0Qb5iSiydGjR/XAAw+YHQNTwNatWwdsGTdaGzZsGNUKTZ///Of1+c9/flzXBDD9nb3tV3t7e9j3JZ1OpzweT9itvPpW0ElKSgopWmLbLwwlNjZW2dnZys7OHrKf1+sdcqUvt9stt9ut+vp6SWcWB+k/Dx0OB0VNwAxFEdME678k40i2iOvbf32ifnGze/duHT58WJJ09dVXD1mgNFI2m02333677rnnHknSzp07R/2PqNmzZ4+4r8PhUHJy8qjGByIlMTGR+YiowpxENGE+IpowHxFtmJOIJsxHRBvmJMzmcDjMjgAAwJh0dnaqpqZGTU1N8nq9I3pOe3u7MjMzB7Tb7XZdeOGFslqtEx0TkMfjUWpqqjo6OuT3+4ft39vbq8bGRjU2NkqSZs2apaKiokjHBBCFKGKaYHFxccrIyFBzc7OqqqqG7Nva2hosYiooKJiQ6z/55JPB45FsJTdSCxcuDB6HW1oSAAAAAAAAAAAAwMTy+/1qbGxUdXX1kCvbhGO1WuXxeIY8D0RCfHy8li5dKr/fr87OzpBVw3w+37DP548egJmLIqYIWLhwod544w1VVFTI6/XKZgv/Ze5bMUmSFixYMO7rejwebdu2TZKUnZ2tv/u7vxv3mH1Yrg8AAAAAAAAAAACYXG1tbSHvKQ4lJiYmZEuuxMRE3uODqSwWS3A+SgO3QmxrawtbaNfXP5yenh7FxsZGLDMAc1HEFAEXXnih3njjDTmdTr377rs677zzwvbbuXNn8PiCCy4Y93W3b9+u5uZmSWf2zR6seGosDh48GDzOz8+fsHEBAAAAAAAAAAAAhJeWlqb4+Hi5XK4B52JjY5WamhosEomPj6doCVHNMAwlJiYqMTFRs2bNUiAQkMvlClmpSdKgRUpOp1N79uxRWlqa8vPzlZGRwZwHphmKmCLgM5/5jB544AFJ0uOPPx62iMnv9we3fktNTdW6devGfd3+W8ndeuut4x6vj9fr1a9+9avg449//OMTNjYAAAAAAAAAAAAwk3k8HvX29srhcAw4ZxiG8vPzdezYMUmS3W5XXl6ecnNzFRcXN9lRgQllGIYSEhKUkJCgvLw8SWfemx5MTU2NJKm1tVWtra2KjY1VXl6e8vLyZLfbJyUzgMiymB1gOlq9erUuuugiSdJjjz2mXbt2Dejz0EMP6dChQ5Kku+66SzExMSHnX3/9dRmGIcMwtGHDhmGv2dLSou3bt0uSlixZomXLlo0o644dO9TW1jboeY/Hoy984QvBrFdddZUKCgpGNDYAAAAAAAAAAACAgQKBgDo6OnT48GHt2rVL5eXlg/bNyclRenq6Fi5cqPPOO09z586lgAnT1mC7DXm9XtXX14e09fT06MSJE3r77bd16NAhtbe3KxAITEZMABHCSkwRsnnzZl1wwQVyuVy6/PLLdd9992ndunVyuVzatm2btmzZIkkqKSnRxo0bx329bdu2qbe3V9LoVmF64okndPXVV+vqq6/WxRdfrHPPPVfJycnq6urSu+++qy1btgS3ksvOztbmzZvHnRUAAAAAAAAAAACYiXw+nxoaGlRTU6Ourq5ge3t7u7q6upSYmDjgOTExMVqyZMlkxgSijtPpHHTruEAgoIaGBjU0NMjhcCg/P1/Z2dmDFkQBiF5810bI8uXL9eyzz+qmm25SR0eH7rvvvgF9SkpKtH37diUlJY37en1byVmtVt14442jem5XV5eeeeYZPfPMM4P2WbJkibZt26Z58+aNKycAAAAAAAAAAAAw03R3d6umpkZ1dXXy+Xxh+9TW1qq4uHiSkwFTQ0pKis4//3w1Njaquro6pAiwP6fTqfLyclVWVionJ0f5+flht2oEEJ0oYoqgq666Svv379fmzZu1fft2VVVVyW63q6ioSNdff73uvPNOJSQkjPs65eXl+tvf/iZJ+sQnPqHc3NwRP/frX/+6li1bpl27dungwYNqbGxUS0uLYmNjlZOTo5UrV+q6667TNddcI6vVOu6sAAAAAAAAAAAAwEwQCATU1NSkmpoatbW1Ddl3sBVmAHzIarUqNzdXubm56ujoUE1NjRobG+X3+wf09fl8qqmpUU1NjVJSUlRSUjIh780DiCyKmCKssLBQDz/8sB5++OFRPe/iiy8e8X6dxcXFY97bc8GCBVqwYIHuvvvuMT0fAAAAAAAAAAAAwId6enpUW1ur2tpa9fb2Dtk3Li5OeXl5ys3Nld1un6SEwNSXnJys5ORkzZ8/X3V1daqpqZHb7Q7bt7OzUzExMZOcEMBYUMQEAAAAAAAAAAAAABPg2LFjqq6uHnYBgvT0dOXn5ys9PZ1VmIBxiImJUUFBgWbPnq3W1lbV1NSoubk5pE9WVhZFTMAUQRETAAAAAAAAAAAAAEyA2NjYQQuYbDab8vLylJeXp/j4+ElOBkxvhmEoPT1d6enpcrvdwdXQPB6P8vPzB33eqVOnZLFYlJubK5uN8gnAbHwXAgAAAAAAAAAAAMAEyMnJ0fHjx+X3+4NtSUlJmjVrlrKysmSxWExMB8wMcXFxmjdvngoLC9Xa2qrk5OSw/bxer06dOiWfz6fjx48rOztb+fn5SkpKmuTEAPpQxAQAAAAAAAAAAAAAw/D7/WpsbFRNTY1KSkrkcDgG9ImJiVF2drYaGhooiABMZrFYlJGRMej5hoYG+Xw+SWe+v+vq6lRXV0fhIWAiipgAAAAAAAAAAAAAYBBnb00lSTU1NSouLg7bf+7cuZo/fz5bUwFRLBAIqKamJuy5zs5OHT58WBUVFWwBCUwyfnICAAAAAAAAAAAAQD+BQECtra2qqalRc3PzgPP19fWaN29e2EKl2NjYyYgIYJyKiopUU1OjpqYmBQKBAee9Xq9Onz6t06dPKz09Xfn5+UpPT5dhGCakBWYGipgAAAAAAAAAAAAAQJLH41FdXZ1qamrkdrsH7efz+dTY2Ki8vLxJTAdgohiGodTUVKWmpqqnpyf4fd/b2xu2f0tLi1paWhQXF6e8vDzl5ubKbrdPcmpg+qOICQAAAAAAAAAAAMCM1tHRoZqaGjU2Nsrv9w/ZNyUlRbNmzVJGRsYkpQMQSbGxsSosLNScOXPU1NSkmpoatbW1he3rdrt1/PhxdXd3q7S0dHKDAjMARUwAAAAAAAAAAAAAZqSOjg5VVFSos7NzyH5Wq1U5OTnKz8+Xw+GYpHQAJpNhGMrKylJWVpa6u7tVU1Ojuro6+Xy+AX3z8/NNSAhMfxQxAQAAAAAAAAAAAJhxOjs7tXfv3iH7OBwO5efnKycnR1ardZKSATBbQkKCioqKNG/ePDU0NKimpkZdXV2SpMTERCUlJZmcEJieKGICAAAAAAAAAAAAMOMkJiYqLS1Nra2tIe19q7Hk5+crOTlZhmGYlBCA2axWq/Ly8pSbm6vOzk7V1NQoLS1t0PuC0+lUR0eHcnNzuXcAY0AREwAAAAAAAAAAAIAZxzAMFRcX65133lEgEFBsbKzy8/OVm5sru91udjwAUcQwDCUnJys5OXnQPoFAQOXl5Wpvb1ddXZ2Ki4uVmJg4iSmBqY8iJgAAAAAAAAAAAADTlt/vl8ViCXsuPj5e8+bNkyTNmjVr0H4AMJz6+nq1t7dLkjo6OvTuu+9q9uzZKiwslM1GaQYwEnynAAAAAAAAAAAAAJiWmpqaVFFRoaKiImVmZobtU1BQMMmpAEw3Pp9PlZWVA9qrqqrU0NAw5D0IwIcoJQYAAAAAAAAAAAAwrfT09KisrEwHDhxQT0+PKioq5PP5zI4FYJqyWq0qLS1VXFzcgHO9vb06ePCgysrK1NPTY0I6YOqgiAkAAAAAAAAAAADAtGAYhvLz83Xo0CE1NzcH23t6enTy5EkTkwGY7tLT07Vy5UoVFhbKMIwB51taWnTo0CHNmjUr7HkAbCcHAAAAAAAAAAAAYBro7OzUkiVLlJCQoEAgMOB8V1eXAoEAxQMAIsZqtWru3LnKzs5WRUWFWltbQ84HAgEVFBQoMzNTnZ2dSk5ONikpEJ0oYgIAAAAAAAAAAAAwZfX29qqyslL19fVKSEgYcD4mJkbz589XdnY2BUwAJkVCQoKWLFmixsZGHTt2TL29vSHn4+PjVVFRoY6ODs2fP192u92kpEB0oYgJAAAAAAAAAAAAwJQTCARUW1ur48ePy+v1hu2Tn5+vuXPnKiYmZpLTAZjpDMNQdna20tPTdeLECVVXVw/o09DQoPb2dq1evVoWi8WElEB0oYgJAAAAAAAAAAAAwJTS2dmp8vJydXZ2hj0fHx+v0tJStmoCYDqbzaaioiLl5OTo8OHD6u7uDjk/e/ZsCpiA/8F3AgAAAAAAAAAAAIApwefzqaKiQu+9917YAiav16vjx4/r3HPPpYAJQFRJSkpSSUmJKisrg6vHJSYmatasWSYnA6IHRUwAAAAAAAAAAAAApgTDMNTS0hL2XFpamt5//33V19fLMIxJTgYAwzMMQw0NDdq3b5/S09NVXFw86P3K7/crEAhMckLAXBQxAQAAAAAAAAAAAJgSLBaLioqKQtri4+P1kY98RHPnzpXH4zEpGQCMnNfrVWFh4ZArxlVUVOj999+X0+mcxGSAuShiAgAAAAAAAAAAADBlpKenKysrSxaLRXPnztXKlSuVlpZmdiwAmDAdHR2qra1Ve3u73n33XVVWVsrn85kdC4g4m9kBAAAAAAAAAAAAAKC/lpYWxcbGyuFwhD1fVFSkefPmKT4+fpKTAUBkBQIBlZeXhzw+ffq0GhsbVVRUpIyMDBPTAZFFERMAAAAAAAAAAACAqNDT06Njx46psbFRKSkpWrp0qQzDGNDPbrebkA4AIs/tdofdGtPtdqusrEwZGRkqKipSXFycCemAyGI7OQAAAAAAAAAAAACmCgQCqqqq0jvvvKPGxkZJUnt7u+rr601OBgCTKz4+XqtWrVJBQUHYIs7m5ma98847On36tPx+vwkJgchhJSYAAAAAAAAAAAAApuno6NDRo0fldDoHnKusrFRmZqZsNt7WBDBzWK1WnXPOOcrJyVF5ebna29tDzvv9flVWVqq+vl7FxcVKSUkxKSkwsfhpj6jT1u1Rc1eP2TEwg3U6e+XyWyVJLc5eeSzMR5iLOYlownxENGE+ItowJxFNmI+INsxJDCYtwS6LZeBflwMAZgaPx6Pjx4+rtrY27HmbzaZ58+bJarVOcjIAiA4Oh0NLly5VfX29KisrB2wz53Q6tW/fPuXm5uqcc85RTEyMSUmBiUERE6LO9Y/tlS35tNkxMOMtkCRt3fw3k3MAfZiTiCbMR0QT5iOiDXMS0YT5iGjDnMRA737zMmUkxpodAwAwyQKBwKBvyPfhDXkAOMMwDOXm5iojI2PQws+6ujo1NTXpnHPOUV5engkpgYlBERMAAAAAAAAAAACASeF0OsNujdTH4XCwNRIAhBETE6OSkhLl5uaqvLxcXV1dIee9Xq86OzspYsKURhETAAAAAAAAAAAAgIjy+Xw6efKkqqqqFAgEBpy3WCyaO3euZs2aJYvFYkJCAJgakpOT9dGPflTV1dU6ceKEfD6fpDNFTvPmzTM5HTA+FDEBAAAAAAAAAAAAiJhAIKC9e/fK6XSGPZ+Zman58+crLi5ukpMBwNRkGIZmz56trKwsHTt2TI2NjZo/fz5bcGLKo4gJUee3ty9Xybnnmh0DM1hnZ6e2bt0qSdqwYYOSkpLMDYQZjzmJaMJ8RDRhPiLaMCcRTZiPiDbMSQwmLcFudgQAwCQwDEN5eXmqqKgIaY+Li1NRUZEyMjJMSgYAU1tsbKwWLlyo9vZ2JScnD9qvt7dXMTExMgxjEtMBo0cRE6JOakKMMhJjzY6BGSzG36N4y5llF9MddiUzH2Ey5iSiCfMR0YT5iGjDnEQ0YT4i2jAnAQBAfn6+6urq1NXVJcMwVFBQoDlz5shqtZodDQCmvJSUlEHPeb1e7d+/X7GxsVqwYIFsNspEEL3YUBYAAAAAAAAAAABARBmGoeLiYqWmpmrlypWaN28eBUwAEGGBQEAHDx6U0+lUS0uL9u3bJ7fbbXYsYFAUMQEAAAAAAAAAAACYEH6/f9BzycnJWrp0qRISEiYxEQDMXMeOHVNra2vwsdPp1N69e9XZ2WliKmBwFDEBAAAAAAAAAAAAGLfm5mbt3r1b3d3dZkcBAEjKyspSTExMSFtvb6/27dunpqYmk1IBg6OICQAAAAAAAAAAAMC4VFVVqaysTD09PSorK5PH4zE7EgDMeCkpKVq+fPmAFfD8fr8OHDig06dPKxAImJQOGIgiJgAAAAAAAAAAAABjEggEVF5ermPHjgXbXC6XDhw4MOTWcgCAyREfH69ly5YpNTV1wLnKykqVl5dzv0bUoIgJAAAAAAAAAAAAwKh5vV6VlZWppqZmwLnY2FgTEgEAwomJidGSJUuUm5s74Fxtba3Kysrk9XpNSAaEoogJAAAAAAAAAAAAwKi43W7t27dPLS0tA84VFhaqtLRUFgtvRQJAtLBYLCopKdG8efMGnGttbdXevXvldrtNSAZ8iFcOAAAAAAAAAAAAAEass7NTe/fuldPpDGk3DEOlpaWaO3euDMMwKR0AYDCGYWjOnDlauHDhgELT7u5uvffee+ro6DApHUAREwAAAAAAAAAAAIARampq0r59+9Tb2xvSbrPZtHTpUuXk5JiUDAAwUllZWVq6dKliYmJC2j0ej95//321tbWZEwwzHkVMAAAAAAAAAAAAAIYUCAR0+vRpHThwQH6/P+RcfHy8PvrRjyolJcWkdACA0UpOTtZHP/pRJSQkhLTHx8crMTHRpFSY6ShiAgAAAAAAAAAAADAov9+v8vJyVVZWDjiXmpqq5cuXKz4+3oRkAIDxiIuL0/Lly5WWliZJstvtWrx4sWw2m8nJMFMx8wAAAAAAAAAAAACE5fP5dODAAbW2tg44l5ubq+LiYlksrJsAAFOVzWbTkiVLdOzYMeXk5CguLs7sSJjBKGICAAAAAAAAAAAAEJbFYgm7Ise8efNUUFAgwzBMSAUAmEiGYaioqMjsGADbyQEAAAAAAAAAAAAIzzAMnXvuuUpKSpJ0pqhp4cKFmjNnDgVMADBD+P1+lZWVqb293ewomOYoYgIAAAAAAAAAAAAwKKvVqsWLFyspKUlLly5VVlaW2ZEAAJMkEAjoyJEjam5u1vvvv6/6+nqzI2EaYzs5AAAAAAAAAAAAAEOy2+1avnw5qy8BwAxz8uRJNTQ0SDpT0HT48GG5XC4VFhbyMwETjpWYAAAAAAAAAAAAgBnO7/fr2LFj6unpGbQPb1YDwMwSCATU2dk5oP3kyZM6fPiw/H6/CakwnVHEBAAAAAAAAAAAAMxgHo9HH3zwgaqqqlRWViafz2d2JABAFDAMQ4sXL1Z+fv6Acw0NDXr//ffl8XhMSIbpiiImAAAAAAAAAAAAYIZyuVzau3ev2traJEldXV06dOiQAoGAucEAAFHBMAwVFxerqKhowLmOjg6999576u7uNiEZpiOKmAAAAAAAAAAAAIAZqL29XXv37pXL5Qppb21tldPpNCkVACAazZo1S4sXL5bVag1pd7vdIcWwwHhQxAQAAAAAAAAAAADMMINtA2S327Vs2TIlJiaalAwAEK0yMjK0bNkyxcbGhrR7vV7t379fdXV1JiXDdEEREwAAAAAAAAAAADBDBAIBnTx5MuyWcQ6HQ8uXL1dSUpJJ6QAA0S4xMVHLly8fUOwaCAR05MgRHT9+nC1JMWYUMQEAAAAAAAAAAAAzgN/v15EjR3TixIkB59LT07Vs2TLFxcVNfjAAwJQSGxurZcuWKSMjY8C5U6dO6dChQ/L5fCYkw1RHERMAAAAAAAAAAAAwzXk8Hu3fv1/19fUDzuXn52vx4sWy2WwmJAMATEVWq1WLFi3S7NmzB5zr7OykiAljwisRAAAAAAAAAAAAYBrr7u5WWVmZXC7XgHPz588P+wY0AADDMQxD8+fPV3x8vMrLyyWdKW5avHix7Ha7yekwFVHEBAAAAAAAAAAAAExTbW1tOnDggLxeb0i7xWLRwoULw24FBADAaOTn5ysuLk6HDh3SwoUL5XA4zI6EKYoiJgAAAAAAAAAAAGCaOn369IACJrvdriVLligxMdGkVACA6SY9PV3nnXceW5NiXCxmBwAAAAAAAAAAAAAQGQsWLFBCQkLwcWJioj760Y9SwAQAmHBDFTAFAgHV1dUpEAhMYiJMNRQxAQAAAAAAAAAAANOUzWbT4sWLFRMTo4yMDC1btkyxsbFmxwIAzDDHjh3TkSNHdPDgQfn9frPjIEpRxAQAAAAAAAAAAABMY/Hx8Vq+fLkWLVokq9VqdhwAwAxTXV2t6upqSVJTU5PKy8tZkQlhUcQEAAAAAAAAAAAATHPx8fEyDMPsGACAGaanp0eVlZUhbXV1daqqqjIpEaIZRUwAAAAAAAAAAADAFNfc3KwTJ06wsgUAIKrExsZq8eLFslhCy1MqKyvV2NhoUipEK4qYAAAAAAAAAAAAgCmsq6tLBw8e1MmTJ3X48GH5/X6zIwEAEJSWlqbS0tIB7YcPH1ZHR4cJiRCtKGICAAAAAAAAAAAApqienh6VlZUFC5caGhr0/vvvy+fzmZwMAIAPZWVlad68eSFtfr9fZWVlcrvdJqVCtKGICQAAAAAAAAAAAJiCfD6fysrK1NPTE9IeFxc3YNseAADMVlBQoNzc3JA2j8ejsrIyeb1ek1IhmvDqBQAAAAAAAAAAAJhiAoGADh06pK6urpD25ORknXvuuTIMw6RkAACEZxiGiouLlZqaGtLudDp18OBBBQIBc4IhalDEBAAAAAAAAAAAAEwxlZWVam5uDmmLi4vT4sWLWYUJABC1LBaLFi1apISEhJD21tZWVVRUUMg0w/EKBgAAAAAAAAAAAJhCampqVFVVFdJms9m0ZMkSxcTEmJQKAICRsdlsWrx48YCfWTU1NaqurjYpFaIBRUwAAAAAAAAAAADAFNHS0qLy8vKQNsMwwq5qAQBAtIqPj9eiRYsGbH967NgxNTU1mZQKZqOIKcJOnjypjRs3qrS0VA6HQ+np6Vq1apV+/OMfq7u7e1xjb926VYZhjOhj69atw47X3d2tH/3oR1q1apXS09PlcDhUWlqqjRs36uTJk+PKCgAAAAAAAAAAgPFxOp06ePDggPaSkhKlpqZOfiAAAMYhJSVFpaWlA9p7e3tNSINoYDM7wHT2+9//XjfddJM6OjqCbd3d3dqzZ4/27NmjRx99VNu3b1dRUZGJKc+oqKjQFVdcMaBy/8iRIzpy5IgeffRRPf3001q/fr1JCQEAAAAAAAAAAGau3t5effDBB/L5fCHtc+bMUW5urkmpAAAYn+zsbLlcLp04cUIWi0ULFy5URkaG2bFgEoqYImTv3r264YYb5HK5lJiYqHvvvVfr1q2Ty+XStm3b9Mgjj+jo0aO68sortWfPHiUlJY3ren/605+Un58/6PnZs2cPeq6zs1NXXnllsIDpi1/8oj73uc8pPj5eO3bs0AMPPKCOjg7dcMMNeuutt7Rs2bJxZQUAAAAAAAAAAMDI+Xw+lZWVqaenJ6Q9KytLc+fONScUAAATZM6cOfJ6vcrJyVFiYqLZcWAiipgi5K677pLL5ZLNZtMrr7yiNWvWBM9dcsklKi4u1j333KOjR4/qoYce0qZNm8Z1vZKSkjG/SP3xj3+so0ePSpJ+9KMf6Wtf+1rw3Jo1a3TxxRdr7dq16u7u1t13363XX399XFkBAAAAAAAAAAAwckeOHFFnZ2dIW3JyskpLS2UYhkmpAACYGIZhaP78+WbHQBSwmB1gOtq9e7feeOMNSdLtt98eUsDUZ+PGjVqwYIEkafPmzfJ4PJOasY/H49HPf/5zSdKCBQu0cePGAX0+9rGP6fbbb5ck7dy5U++8886kZgQAAAAAAAAAAJjJ8vLyZLVag4/j4uK0aNEiWSy81QcAAKYPXtlEwIsvvhg8vu2228L2sVgsuuWWWyRJbW1t2rFjx2REG2DHjh1qb2+XJN16662DvtjdsGFD8PiFF16YjGgAAAAAAAAAAACQlJaWpuXLlysuLk5Wq1WLFy+W3W43OxYAAJOira1NtbW1ZsfAJKCIKQLefPNNSZLD4dCKFSsG7bd27drg8VtvvRXxXOH0ZZVC85xt5cqVSkhIkGReVgAAAAAAAAAAgJnK4XBo+fLlWrJkiRwOh9lxAACYFHV1ddq/f7+OHj2q5uZms+MgwihiioBDhw5JkoqKimSz2QbtV1paOuA5Y3XbbbcpPz9fdrtdmZmZOv/88/XNb35T1dXVQz7v4MGDYfOczWazqaioaEKyAgAAAAAAAAAAYPTsdrtSUlLMjgEAwKQ4fvy4jhw5okAgIOlMrUJXV5fJqRBJg1fYYEzcbreampokSbNnzx6yb1pamhwOh5xOp06fPj2u677++uvB4+bmZjU3N+tvf/ubHnroIf3sZz/Tl770pbDPq6qqknSmej81NXXIaxQUFGj//v1qbGxUT0+PYmNjR5yv7zqD6b/0m9PpVEdHx4jHBiZa/x98/BBENGBOIpowHxFNmI+INsxJRBPmI6INcxLRxOl0mh0BAIYUCARkGIbZMQAAMN3ZPw99Pp/Kysq0fPnyUdUrYOqgiGmCdXZ2Bo8TExOH7d9XxDTWX96cc845uvbaa7VmzRoVFBRIkiorK/Vf//Vfeu655+R2u/WP//iPMgxDd9xxx6B5R5q1T1dX16huCn3ZRuL555/nrwgQNZ566imzIwAhmJOIJsxHRBPmI6INcxLRhPmIaMOchNna29vNjgAAg/L7/dq/f7+ysrI0a9Yss+MAAGCqwsJCuVwuNTQ0BNt6enp04MABLV26VFar1cR0iASKmCaY2+0OHtvt9mH79xUCuVyuUV/rmmuu0a233jqg+nDVqlW64YYb9PLLL+vaa6+Vx+PRV7/6VV199dXKzc0Nm3c0WceaFwAAAAAAAAAAAOEFAgEdPnxY7e3tam9vl8vl0vz581mVCQAwYxmGoXPPPVdutztkN6fOzk4dPnxYCxcu5OfkNEMR0wSLi4sLHvf29g7bv6enR5IUHx8/6msNt1rR+vXrdf/99+tb3/qWuru79dhjj+lf//Vfw+YdTdax5B1uu7za2lqtXr1aknTttdeqpKRkVOMDE6mrqyv4V6E333zziFYqAyKJOYlownxENGE+ItowJxFNmI+INsxJRJOjR4/qgQceMDsGAAxw4sQJNTY2Bh9XV1fL7/fzngkAYEazWCxatGiR9u7dG7KoTFNTkyorKzV//nwT02GiUcQ0wZKSkoLHI9kirm//9Uj94uaOO+7Q/fffr0AgoJ07dw4oYurLO5qs0ujzzp49e8R9HQ6HkpOTRzU+ECmJiYnMR0QV5iSiCfMR0YT5iGjDnEQ0YT4i2jAnYTaHw2F2BAAYoK6uTqdOnQpps1qtys/PNykRAADRw263a8mSJdq7d6+8Xm+wvaqqSgkJCcrLyzMxHSaSxewA001cXJwyMjIknfmGGUpra2uwMKigoCAiebKzs4N5qqurB5zvKy5yOp1qa2sbcqy+1ZSysrJCtpYDAAAAAAAAAADA2LS1teno0aMD2hcuXMjqhQAA/I+EhISw28cdPXpUra2tJqXCRKOIKQIWLlwoSaqoqAipAjzb4cOHg8cLFiyIWJ6h9oDsy3p2nrN5vV4dO3ZMUmSzAgAAAAAAAAAAzBTd3d06cOCAAoFASHtRUZHS09NNSgUAQHRKS0sLu83qgQMHQnaWwtRFEVMEXHjhhZLOrG707rvvDtpv586dweMLLrggIlkaGxvV1NQkSWGXHO3Lenaes+3Zsyf4TR+prAAAAAAAAAAAADOFx+NRWVnZgD+InzVrlmbNmmVSKgAAoltubu6Ana58Pp/KysrU29trUipMFIqYIuAzn/lM8Pjxxx8P28fv9+vJJ5+UJKWmpmrdunURybJly5Zg9f7atWsHnL/44ouVkpIiSXriiScGVPr32bp1a/D4mmuumfigAAAAAAAAAAAAM4Tf79eBAwfkcrlC2jMyMjR//nyTUgEAMDXMmzdPmZmZIW1ut1tlZWXy+/0mpcJEoIgpAlavXq2LLrpIkvTYY49p165dA/o89NBDOnTokCTprrvuUkxMTMj5119/XYZhyDAMbdiwYcDzT5w4ob179w6Z4+WXX9Z3v/tdSVJ8fLxuu+22AX3sdrv++Z//WZJ06NAh/eQnPxnQZ9euXXrssccknSmEWrVq1ZDXBQAAAAAAAAAAQHiBQEBHjx5Ve3t7SHtiYqIWLFggwzBMSgYAwNRgGIZKS0uVlJQU0p6WlsbP0SnOZnaA6Wrz5s264IIL5HK5dPnll+u+++7TunXr5HK5tG3bNm3ZskWSVFJSoo0bN456/BMnTmjdunVas2aNrrrqKi1dulTZ2dmSpMrKSj333HN67rnngisr/eQnPxl06dGvfe1revbZZ3X06FHdc889qqio0Oc+9znFx8drx44d+uEPfyiv16v4+Hj97Gc/G9sXBAAAAAAAAAAAADp16pTq6+tD2ux2uxYvXiyr1WpSKgAAphar1arFixfrvffeU29vr0pKSpSbm2t2LIwTRUwRsnz5cj377LO66aab1NHRofvuu29An5KSEm3fvn1AdeBo7Nq1K+xKT30SEhL005/+VHfcccegfZKSkrR9+3ZdccUVKi8v15YtW4JFVn2Sk5P19NNPa9myZWPOCgAAAAAAAAAAMJM1NDToxIkTIW0Wi0WLFy9WbGysOaEAAJii7Ha7lixZIo/Ho9TUVLPjYAJQxBRBV111lfbv36/Nmzdr+/btqqqqkt1uV1FRka6//nrdeeedSkhIGNPYK1as0K9//Wvt2rVLe/bsUW1trZqamuT1epWWlqZFixbp0ksv1Re+8IXgCk1DKSoq0t69e/WLX/xCv/3tb1VRUaHe3l4VFBToiiuu0F133aXCwsIxZQUAAAAAAAAAAJjpenp6dOTIkQHtCxYsGNcfvAMAMJM5HA6zI2ACUcQUYYWFhXr44Yf18MMPj+p5F198cXAruHCSkpJ044036sYbbxxvxCCHw6F77rlH99xzz4SNCQAAAAAAAAAAACk2NlalpaU6fPiw/H6/JGn+/PnKzMw0ORkAAEB0sJgdAAAAAAAAAAAAAJgJsrKytHTpUsXExCg/P1+zZs0yOxIAANNWV1eX9u3bJ4/HY3YUjBArMQEAAAAAAAAAAACTJDk5WStWrJDdbpdhGGbHAQBgWmpubtbBgwfl9/tVVlampUuXymJhnZ9ox/8hAAAAAAAAAAAAYBLFxsZSwAQAQIQ0NDSorKwsuH1rR0eHjhw5okAgYHIyDIciJgAAAAAAAAAAAAAAAEwLKSkpio2NDWlraGjQ6dOnTUqEkaKICQAAAAAAAAAAAJhAbrdbe/fuVXt7u9lRAACYcWJjY7V48WJZrdaQ9hMnTqi7u9ukVBgJipgAAAAAAAAAAACACRIIBFReXq6Ojg7t27dPR48elcfjMTsWAAAzSmJiohYsWBDS1vczmm3lohdFTAAAAAAAAAAAAMAEaW5uVktLS/BxbW2tTp06ZWIiAABmpoyMDM2ePTukra2tTY2NjSYlwnAoYgIAAAAAAAAAAAAmgM/nU0VFRUhbTEyMCgsLTUoEAMDMNnfuXMXGxoa0HTt2TF6v16REGApFTAAAAAAAAAAAAMAEOHnypHp6ekLa5s+fL5vNZlIiAABmNqvVqvnz54e09fb26sSJE+YEwpAoYgIAAAAAAAAAAADGyel0qqqqKqQtNTVV2dnZJiUCAACSlJmZqfT09JC26upqdXZ2mpQIg6GICQAAAAAAAAAAABiHQCCg8vJyBQKBYJthGCouLpZhGCYmAwAAhmGoqKhIFktoiczZP7thPoqYAAAAAAAAAAAAgHGor69Xe3t7SFtBQYESEhJMSgQAAPqLj4/XnDlzQto6OztVW1trUiKEQxETAAAAAAAAAAAAMEYej0eVlZUhbXFxcQPeKAUAAOYqKChQfHx8SNvx48fV29trUiKcjSImAAAAAAAAAAAAYIyOHz8uj8cT0lZUVCSr1WpSIgAAEI7FYlFxcXHwsWEYmjVrFj+zo4jN7AAAAAAAAAAAAADAVNTR0TFgG5rMzExlZGSYlAgAAAwlLS1N2dnZ6u3tVXFxMVu/RhmKmAAAAAAAAAAAAIBRCgQCOnr0aEibxWLR/PnzTUoEAABGoqSkRBaLRYZhmB0FZ6GICQAAAAAAAAAAABil6upqOZ3OkLa5c+cqLi7OpEQAAGAk2D4uelnMDgAAAAAAAAAAAABMNbGxsYqJiQk+djgcmjVrlomJAAAApjaKmAAAAAAAAAAAAIBRysrK0urVq5Wfny9JKi4ulsXCW28AAExlbrfb7AgzGtvJAQAAAAAAAAAAAGNgs9lUXFysgoICtpEDAGAK8/l8OnXqlE6fPq2FCxcqMzPT7EgzEkVMAAAAAAAAAAAAwDhQwAQAwNTV0tKi8vLy4CpMFRUVSktLk9VqNTnZzMOalgAAAAAAAAAAAAAAAJiRPB5PyDZyPT09OnnypImJZi6KmAAAAAAAAAAAAAZx8uRJbdy4UaWlpXI4HEpPT9eqVav04x//WN3d3eMae+vWrTIMY0QfW7dunZhPCGPm8/nMjgAAACIgOztbqampIW1VVVVyOp3mBJrBKGICAAAAAAAAAAAI4/e//70+8pGP6OGHH9aRI0fU3d2t1tZW7dmzR/fcc4+WL1+uiooKs2NiEgQCAZWVlenAgQPq6ekxOw4AAJhAhmGouLhYhmEE2wKBgMrLyxUIBExMNvPYzA4AAAAAAAAAAAAQbfbu3asbbrhBLpdLiYmJuvfee7Vu3Tq5XC5t27ZNjzzyiI4ePaorr7xSe/bsUVJS0riu96c//Un5+fmDnp89e/a4xsf4NDY2qq2tTZLU2tqqwsJCzZ49O+TNTgAAMHUlJCSooKBAp06dCra1t7ervr5eubm5JiabWShiAgAAAAAAAAAAOMtdd90ll8slm82mV155RWvWrAmeu+SSS1RcXKx77rlHR48e1UMPPaRNmzaN63olJSWaO3fu+EIjIrxer44dOxZ87PP5VFVVpby8PNlsvNUGAMB0MWfOHDU0NMjtdgfbKisrlZGRoZiYGBOTzRxsJwcAAAAAAAAAANDP7t279cYbb0iSbr/99pACpj4bN27UggULJEmbN2+Wx+OZ1IyYPCdOnFBvb29IW1FREQVMAABMM1arVUVFRSFtHo9Hx48fNynRzEMREwAAAAAAAAAAQD8vvvhi8Pi2224L28diseiWW26RJLW1tWnHjh2TEQ2TrLOzU9XV1SFt6enpyszMNCkRAACIpIyMjAE/52tra9XR0WFSopmFIiYAAAAAAAAAAIB+3nzzTUmSw+HQihUrBu23du3a4PFbb70V8VyYXIFAQOXl5SFtFotFRUVFMgzDpFQAACDS5s+fL4sltJzm6NGjCgQCJiWaOVjnEgAAAAAAAAAAoJ9Dhw5JGn7LsNLS0gHPGavbbrtNR44cUVNTk5KTk1VUVKTLLrtM//RP/6RZs2aNedyqqqohz9fW1gaPOzs7J22Vga6urrDH0aSpqUmdnZ0hbTk5OfJ4PGwfGKWmwrzC1MKcwkRjTk0dubm5qqmpCT52Op06duyYsrOzTUwVnlnz6uzXSROBIiYAAAAAAAAAAID/4Xa71dTUJEmaPXv2kH3T0tLkcDjkdDp1+vTpcV339ddfDx43NzerublZf/vb3/TQQw/pZz/7mb70pS+NadyCgoIR933qqaeUkpIypuuMx1NPPTXp1xxOTEyMli5dGlLE5nK59OKLL7IKwxQRjfMKUxtzChONORXdDMPQkiVLlJCQEGw7deqUXnrppaguZp7MedXe3j7hY1LEBAAAAAAAAAAA8D/6/0V5YmLisP37ipjG+lfv55xzjq699lqtWbMmWHBUWVmp//qv/9Jzzz0nt9utf/zHf5RhGLrjjjvGdA2M3pw5cwaswnX8+HEKmAAAmCECgYAqKyu1ePHiYJvVatWcOXN07NgxE5NNbxQxAQAAAAAAAAAA/A+32x08ttvtw/aPjY2VdGaVntG65pprdOutt8owjJD2VatW6YYbbtDLL7+sa6+9Vh6PR1/96ld19dVXKzc3d1TXGG6FqNraWq1evVqSdPPNN49r67rR6OrqCq4UcPPNN4+oYGyydHZ2qqKiIqQtLS1NN954o0mJMFLRPK8wNTGnMNGYU1PPyZMn1dLSIklKTU3VokWLdPnll5ucKpRZ86q6uloPPPDAhI5JERMAAAAAAAAAAMD/iIuLCx739vYO27+np0eSFB8fP+prDbd12/r163X//ffrW9/6lrq7u/XYY4/pX//1X0d1jeG2xOsvKSlJycnJoxp/IiQmJppy3XD8fr+OHDkS0ma1WlVaWjqiojZEj2iaV5gemFOYaMypqaG0tFQffPCB5s6dq/T0dLPjDGsy51VHR8eEj2mZ8BEBAAAAAAAAAACmqKSkpODxSLaIczqdkka29dxY3HHHHcGVmnbu3BmRa+BDVVVV6u7uDmmbN28eBUwAAMxQMTExWr58+ZQoYJoOKGICAAAAAAAAAAD4H3FxccrIyJB0pqBlKK2trcEipoKCgojkyc7ODuaprq6OyDVwhtvt1smTJ0PakpKSlJ+fb1IiAAAQDc7e+heRQxETAAAAAAAAAABAPwsXLpQkVVRUyOv1Dtrv8OHDweMFCxZELA9vnE2OmJgYzZ49O+TrXVxczNcfAABgklDEBAAAAAAAAAAA0M+FF14o6cxWce++++6g/fpv73bBBRdEJEtjY6OampokiRWBIsxqtWrevHlauXKlUlNTlZ+fH7K9IAAAQH8ej0cdHR1mx5hWKGICAAAAAAAAAADo5zOf+Uzw+PHHHw/bx+/368knn5Qkpaamat26dRHJsmXLFgUCAUnS2rVrI3INhEpISNBHPvIRzZ8/3+woAAAgCgUCAdXX1+udd97RgQMHhly5E6NDERMAAAAAAAAAAEA/q1ev1kUXXSRJeuyxx7Rr164BfR566CEdOnRIknTXXXcpJiYm5Pzrr78uwzBkGIY2bNgw4PknTpzQ3r17h8zx8ssv67vf/a4kKT4+XrfddttYPh2MgWEYslh4Gw0AAITyer16//33dfjwYXk8HvX29urEiRNmx5o2bGYHAAAAAAAAAAAAiDabN2/WBRdcIJfLpcsvv1z33Xef1q1bJ5fLpW3btmnLli2SpJKSEm3cuHHU4584cULr1q3TmjVrdNVVV2np0qXKzs6WJFVWVuq5557Tc889F1yF6Sc/+YlmzZo1cZ8gAAAARs1qtcpqtYa0VVdXKycnh21oJwBFTAAAAAAAAAAAAGdZvny5nn32Wd10003q6OjQfffdN6BPSUmJtm/fPq43rHbt2hV2pac+CQkJ+ulPf6o77rhjzNdAeIFAQG63W/Hx8WZHAQAAU4RhGCoqKtKePXvk9/uD7eXl5Vq+fLkMwzAx3dRHERMAAAAAAAAAAEAYV111lfbv36/Nmzdr+/btqqqqkt1uV1FRka6//nrdeeedSkhIGNPYK1as0K9//Wvt2rVLe/bsUW1trZqamuT1epWWlqZFixbp0ksv1Re+8IXgCk2YWPX19Tp69KgKCgo0Z86cAasqAAAAhBMfH685c+aEbCPX2dmp2tpa5efnmxdsGqCICQAAAAAAAAAAYBCFhYV6+OGH9fDDD4/qeRdffHFwK7hwkpKSdOONN+rGG28cb0SMgdfrVWVlpQKBgE6dOqWGhgaVlJQoLS3N7GgAAGAKKCgoUH19vVwuV7Dt+PHjyszMlN1uNzHZ1GYxOwAAAAAAAAAAAAAwmWpra+XxeIKP3W53yJYwAAAAQ7FYLCouLg5p83q9qq2tNSnR9EAREwAAAAAAAAAAAGaMQCCgmpqakLaMjAxlZGSYlAgAAExFaWlpysrKCmmrqakZcjVODI0iJgAAAAAAAAAAAMwYLS0tcrvdIW0FBQUmpQEAAFPZ2a8hent71dzcbFKaqY8iJgAAAAAAAAAAAMwYZ6/ClJiYqOTkZJPSAACAqSwpKUlJSUkhbdXV1SalmfooYgIAAAAAAAAAAMCM4Ha71dLSEtKWn58vwzBMSgQAAKa6WbNmhTxua2tTd3e3SWmmNoqYAAAAAAAAAAAAMCOcvQqT1WpVdna2SWkAAMB0kJWVJZvNFtJ29msOjAxFTAAAAAAAAAAAAJj2/H6/6urqQtpyc3NltVpNSgQAAKYDi8WivLy8kLa6ujr5fD6TEk1dFDEBAAAAAAAAAABg2mtsbJTH4wlpy8/PNykNAACYTs4uYrJarWwpNwa24bsAAAAAAAAAAAAAU9vZ27qkpqYqISHBpDQAAGA6iY+PV3p6uvx+v/Lz85WZmSnDMMyONeVQxAQAAAAAAAAAAIBpraurSx0dHSFtrMIEAAAm0qJFi2SxsCHaePDVAwAAAAAAAAAAwLR29ipMdrtdGRkZJqUBAADTEQVM48dXEAAAAAAAAAAAANOW1+tVfX19SFteXh5vNAIAAEQZXp0BAAAAAAAAAABg2rJYLCotLVVqamqwLS8vz7xAAAAACMtmdgAAAAAAAAAAAAAgUiwWi7KyspSVlSWn06mOjg7FxsaaHQsAAMwQLpdLcXFxMgzD7ChRjyImAAAAAAAAAAAAzAgOh0MOh8PsGAAAYJoLBAJqaWlRTU2NWlpatHjxYmVkZJgdK+pRxAQAAAAAAAAAAAAAAABMkAMHDqi5uTn4uKamhiKmEbCYHQAAAAAAAAAAAAAAAACYLs4uWGppaZHL5TIpzdRBERMAAAAAAAAAAAAAAAAwQbKzs2W1WkPaamtrTUozdVDEBAAAAAAAAAAAgGnF7/fr8OHDam5uViAQMDsOAACYYaxWq3Jzc0Pa6urq5Pf7TUo0NVDEBAAAAAAAAAAAgGmlublZ9fX1Kisr0+7du3X69GmKmQAAwKTKz88PeezxeNTY2GhSmqmBIiYAAAAAAAAAAABMKzU1NcFjt9utpqYmGYZhYiIAADDTJCQkKDU1NaSt/2sUDEQREwAAAAAAAAAAAKYNp9Optra2kLazV0IAAACYDGe/Buno6FBnZ6dJaaIfRUwAAAAAAAAAAACYNmpra0Mex8TEKCsry6Q0AABgJsvIyJDdbg9pO/u1Cj5EERMAAAAAAAAAAACmBZ/Pp7q6upC23NxcWSy8JQYAACafxWJRXl5eSFt9fb28Xq9JiaIbr9gAAAAAAAAAAAAwLdTX18vn84W0sZUcAAAw09lFTH6/f0DRNc6giAkAAAAAAAAAAABTXiAQUE1NTUhbRkaG4uLiTEoEAAAgxcbGKjMzM6StpqZGgUDApETRiyImAAAAAAAAAAAATHkdHR1yOp0hbazCBAAAosHZr0lcLpfa2trMCRPFKGICAAAAAAAAAADAlHf2KkxxcXFKS0szKQ0AAMCHUlNTlZCQENJ29msXUMQEAAAAAAAAAACAKa63t1eNjY0hbfn5+TIMw6REAAAAHzIMI7gak91uV2FhoYqKikxOFX1sZgcAAAAAAAAAAAAAxqOurk6BQCD42DAM5ebmmpgIAAAgVE5Ojux2uzIyMmSxsOZQOBQxAQAAAAAAAAAAYMoKBAIDtmPJzs5WTEyMSYkAAAAGstlsysrKMjtGVKO0K8JOnjypjRs3qrS0VA6HQ+np6Vq1apV+/OMfq7u7e1xjd3d36/nnn9c//dM/adWqVUpLS1NMTIwyMjK0Zs0abdq0SXV1dcOOc/HFF8swjBF9AAAAAAAAAAAARJOWlhb19PSEtPVt1wIAAICpg5WYIuj3v/+9brrpJnV0dATburu7tWfPHu3Zs0ePPvqotm/fPqZ9Dvfv368LLrhAXV1dA861tLTo7bff1ttvv62f/vSn2rJli2644YZxfS4AAAAAAAAAAADRyOv1ym63q7e3V5KUmJiopKQkk1MBAABgtChiipC9e/fqhhtukMvlUmJiou69916tW7dOLpdL27Zt0yOPPKKjR4/qyiuv1J49e0b9YrqjoyNYwHTBBRdo/fr1WrlypTIyMtTY2Kjnn39ejzzyiDo6OnTjjTcqOTlZn/rUp4Ycc+XKlXr88cfH/DkDAAAAAAAAAABMtpycHGVlZam5uVnV1dXKyclhdwkAAIApiCKmCLnrrrvkcrlks9n0yiuvaM2aNcFzl1xyiYqLi3XPPffo6NGjeuihh7Rp06ZRjW+xWPTZz35W3/72t7Vw4cIB5y+//HJ96lOf0jXXXCOfz6f//b//t8rLy4d80e5wOLR48eJR5QAAAAAAAAAAADCbxWJRVlaWsrKyFAgEzI4DAAAwIi6XS7W1tTIMQ/PmzTM7juksZgeYjnbv3q033nhDknT77beHFDD12bhxoxYsWCBJ2rx5szwez6iu8bGPfUzPPvts2AKmPp/+9Kd17bXXSpKOHTumvXv3juoaAAAAAAAAAAAAUw2rMAEAgGjndDr1wQcfaPfu3Tp9+rSqq6vl8/nMjmU6ipgi4MUXXwwe33bbbWH7WCwW3XLLLZKktrY27dixIyJZ1q1bFzw+duxYRK4BAAAAAAAAAAAAAACAkbFarWppaQk+9vl8qq+vNzFRdKCIKQLefPNNSWe2Z1uxYsWg/dauXRs8fuuttyKSpaenJ3hstVojcg0AAAAAAAAAAAAAAACMTFxcnDIyMkLaampqZvy2uDazA0xHhw4dkiQVFRXJZhv8S1xaWjrgORNt586dweO+7esGc/jwYZ133nk6cuSI3G63MjMztWLFCv2v//W/9Pd///eKiYkZc46qqqohz9fW1gaPnU6nOjo6xnwtYLy6urrCHgNmYU4imjAfEU2Yj4g2zElEE+Yjog1zEtHE6XSaHQHABHC73ZLOvAEIAAAwFeXn56u5uTn4uK9WIiUlxcRU5qKIaYK53W41NTVJkmbPnj1k37S0NDkcDjmdTp0+fXrCs7z//vvavn27JGnJkiXDFjHV19eHLE9WXV2t6upqvfTSS3rwwQf13HPPDTvGYAoKCkbc9/nnn5/R35SILk899ZTZEYAQzElEE+YjognzEdGGOYlownxEtGFOwmzt7e1mRwAwAU6ePKm6ujplZGQoPz9faWlpMgzD7FgAAAAjlpaWpri4uGBxtnRmNaaZXC/BdnITrLOzM3icmJg4bH+HwyFp4v8CraenR1/4whfk8/kkST/4wQ8G7WuxWHTppZfqoYce0quvvqq9e/fqv//7v/Wzn/0sWLR08OBBrVu3TqdOnZrQnAAAAAAAAAAAAKPh8XjU0NAgSWpubtYHH3yg6upqk1MBAACMjmEYys/PD2lrbGxUb2+vSYnMx0pME6x/hZzdbh+2f2xsrCTJ5XJNaI4777xTe/bskSTdeuutuuqqqwbt+/zzzys1NXVA+0UXXaQvf/nL+uIXv6gnnnhC9fX1uvvuu/X888+POs9wK03V1tZq9erVkqRrr71WJSUlo74GMFG6urqCfxV68803j6ggEYgk5iSiCfMR0YT5iGjDnEQ0YT4i2jAnEU2OHj2qBx54wOwYAMahvr5efr8/+NgwDGVnZ5uYCAAAYGxyc3N1/PhxBQIBSVIgEFBdXZ3mzJljcjJzUMQ0wfrvvTyS6rienh5JUnx8/IRleOCBB/Too49KklatWqVf/OIXQ/YPV8DUJyYmRo8++qjefvttHTlyRC+88IKqq6s1a9asUWUabmu9/hwOh5KTk0c1PhApiYmJzEdEFeYkognzEdGE+Yhow5xENGE+ItowJ2G2vtXxAUxNgUBANTU1IW2ZmZkj+sNyAACAaBMTE6Ps7GzV19cH22pqalRQUDAjt8plO7kJlpSUFDweyRZxTqdT0si2nhuJ//zP/9R9990nSSotLdUf/vCHcf+j3Gaz6fbbbw8+3rlz57jGAwAAAAAAAAAAGIv29vYBu1ucvQ0LAADAVHL2a5menh61traalMZcFDFNsLi4OGVkZEiSqqqqhuzb2toaLGIqKCgY97V/85vf6Mtf/rIkqbCwUH/+85+VmZk57nElaeHChcFj9pUGAAAAAAAAAABmaGtrC3mckJCglJQUc8IAAABMgKSkpAEL35z9mmemoIgpAvoKfioqKuT1egftd/jw4eDxggULxnXNl156Sbfccov8fr/y8vL02muvjWoLt+HMxGXKAAAAAAAAAABAdGlvbw95nJ6eznsYAABgSjMMQ+np6SFtZ7/mmSkoYoqACy+8UNKZreLefffdQfv135btggsuGPP1XnvtNX32s5+V1+tVRkaG/vznP2v+/PljHi+cgwcPBo9ZlhUAAAAAAAAAAEw2v9+vjo6OkDZWYQIAANPB2a9pOjs75fP5TEpjHoqYIuAzn/lM8Pjxxx8P28fv9+vJJ5+UJKWmpmrdunVjutZf//pXffrTn1ZPT49SUlL0pz/9SYsWLRrTWIPxer361a9+FXz88Y9/fELHBwAAAAAAAAAAGE5XV5f8fn9IG0VMAABgOkhOTg55HAgE1NnZaVIa89jMDjAdrV69WhdddJHeeOMNPfbYY7r11lu1Zs2akD4PPfSQDh06JEm66667FBMTE3L+9ddfDxY23Xrrrdq6deuA6+zbt09XXnmlnE6nHA6Htm/frhUrVowq644dO7R8+XKlpqaGPe/xePTFL34xmPWqq65SQUHBqK4BAAAAAAAAAAAwXmdvq5KQkDDg/RVgMvX29qqrq0tOp1O9vb0Diuww9Xm9Xi1btkySVF1drfr6enMDISIsFovsdrscDocSExNlt9vNjoQZyGazKTExUV1dXcG2jo6OQWs5piuKmCJk8+bNuuCCC+RyuXT55Zfrvvvu07p16+RyubRt2zZt2bJFklRSUqKNGzeOevxjx47pk5/8pNra2iRJ3//+95WSkqKysrJBn5Odna3s7OyQtieeeEJXX321rr76al188cU699xzlZycrK6uLr377rvasmVLcCu57Oxsbd68edRZAQAAAAAAAAAAxqvvPZE+M+1NPUSPQCCgpqYmNTU1mR0FEeb3+4Mrvvn9fnm9XpMTIVL6ihLr6+uVlZWljIwMGYZhdizMMJmZmYqPj1dKSopSUlLkcDjMjjTpKGKKkOXLl+vZZ5/VTTfdpI6ODt13330D+pSUlGj79u1KSkoa9fhvvPGGGhoago+/+tWvDvucb3/729q0adOA9q6uLj3zzDN65plnBn3ukiVLtG3bNs2bN2/UWQEAAAAAAAAAAMYjEAioo6MjpI2t5GCW2traASuDGYYhq9VqUiJESiAQUGJioiQpJiaGopZpyufzKRAIBB83Njaqt7dX+fn5JqbCTFRYWGh2BNNRxBRBV111lfbv36/Nmzdr+/btqqqqkt1uV1FRka6//nrdeeedSkhIMDXj17/+dS1btky7du3SwYMH1djYqJaWFsXGxionJ0crV67Uddddp2uuuYYXXgAAAAAAAAAAwBROp3PACigUMcEMbrc7pIApIyNDycnJio2NpcBlGvL5fMGFJbKzs3m/dJoKBALq6elRR0eHmpubJZ3ZwjQjI0OxsbEmpwNmFoqYIqywsFAPP/ywHn744VE97+KLLw6p9jzbhg0btGHDhnGmkxYsWKAFCxbo7rvvHvdYAAAAAAAAAAAAkXD2qjdxcXG8sQxT9N/WMDs7WxkZGeaFATAhDMNQXFyc4uLiZLVag4Vrra2tys3NNTkdMLNYzA4AAAAAAAAAAAAADMXv98tm+/Bv81mFCWbp7u4OHqemppoXBEBE9P++7v/9DmBysBITAAAAAAAAAAAAolpBQYFmz56t7u5utbe3Kz4+3uxImKF8Pp8kyWazsbUYMA1ZrVZZrVb5fL7g9zuAyUMREwAAAAAAAAAAAKKeYRhyOBxyOBxmRwEATGOGYZgdAZDf71dXV5fa29uVmZk5Ywq4KWICAAAAAAAAAAAAAAAAosDhw4fV2Ngov98v6cwKYTOliMlidgAAAAAAAAAAAAAAAAAAUiAQCBYwSVJ7e7uJaSYXRUwAAAAAAAAAAAAAAABAFEhJSQl53NbWpkAgYFKayUUREwAAAAAAAAAAAAAAABAFUlNTQx739vbK7XabE2aSUcQEAAAAAAAAAACAqNTU1KSysjKdPn1aHR0dIVurAMBUtXXrVhmGIcMwdOLEiYhc48SJE8FrbN26NSLXiFabNm0Kfu7AVBQfH6+YmJiQtpmypRxFTAAAAAAAAAAAAIhKra2tam5uVmVlpfbu3auDBw+aHQkAACCiDMMYsKUcRUwAAAAAAAAAAACAic5+wy45OdmkJACAs03GilLATEUREwAAAAAAAAAAABAlPB6PnE5nSNvZb+gBAABMR2e/5nG5XOrt7TUpzeShiAkAAAAAAAAAAABRp6OjI+SxxWJRUlKSSWkAAAAmT2JioqxWa0jbTFiNiSImAAAAAAAAAAAARJ22traQx0lJSbJYeGsLAABMf4ZhDNhGlyImAAAAAAAAAAAAwARnv1HHVnLAzLRp0yYZhiHDMCSdWaVt06ZNWrJkiRITE5Wdna0rrrhCf/3rX0Oe19DQoG9+85tatGiRHA6HMjIy9OlPf1p79+4d8np+v1+//vWvdcUVV2jWrFkqLCzU4sWLdemll+qXv/zliLZzam1t1Te+8Q2VlpYqPj5e2dnZuuyyy/Tb3/52RJ9z3+e7adOmIftdfPHFMgxDF1988YjGPVtZWZm+//3v65Of/KRmz56t2NhYJSYmqri4WLfeeqvefvvtsM97/fXXZRiGbrvttmDbvHnzgrn7Pl5//fWwz3/xxRd1/fXXa86cOYqLi1NqaqpWrlyp73znO2ptbR02d1VVlb7yla/onHPOUVxcnPLz83X11Vfr1VdfHdPXAYhWZ7/2ObvAezqymR0AAAAAAAAAAAAA6M/n86mrqyukjSImAKdPn9Zll12mo0ePBtucTqf++Mc/6pVXXtFvfvMbXX/99dq/f7+uuOIKVVdXB/t1d3frpZde0p/+9Cf98Y9/1Lp16waM39LSoquvvlpvvfXWgPadO3dq586d+vd//3f98Y9/VGFhYdiMhw4d0mWXXaaamppgm9vt1muvvabXXntNt912mz7+8Y+P90sxbq+//nrYr0Fvb68qKipUUVGhJ598Ut/4xjf0wAMPTMg1W1tbdd111+kvf/lLSHtPT4/effddvfvuu/rlL3+p3/3udzr//PPDjvHGG29o/fr1IVuO1tbW6ve//71+//vfD1v4BUwlqampIY+dTqe8Xq9stulb6jN9PzMAAAAAAAAAAABMSR0dHQoEAiFtFDEBuP7661VVVaV7771Xf/d3f6eEhAS9+eab+va3v62Ojg7dfvvtWrlypdavXy+Xy6Uf/OAHWrt2rWJiYvT//t//0w9+8AP19PRow4YNKi8vl91uD47t8/m0fv167dq1S5K0du1affnLX1ZKSorq6ur0wgsv6He/+50OHTqkSy+9VPv27VNiYmJIvo6ODn3yk58MFjDdcMMNuvXWW5Wdna2jR4/q4Ycf1uOPP66ysrLJ+6INwuv1yuFw6Morr9Qll1yi0tJSJScnq6GhQQcOHNDPf/5znTx5Uv/2b/+mkpKSkFWXVq1apQ8++EC/+93v9M1vflOS9Kc//Un5+fkh15g3b17wuKenR5dddpnee+89Wa1Wff7zn9cVV1yhefPmyePx6L//+7/18MMPq6GhQVdccYX27t07oFDs1KlTwQImi8WiO+64Q9ddd51SUlK0f/9+/du//Zs2bdqklStXRvArB0yepKQkGYYR8pqovb1dGRkZJqaKrEkvYiovL9eTTz6pXbt2qa6uTi6XS3/6059UVFQU7FNWVqZTp07J4XBo7dq1kx0RAAAAAAAAAAAAJjp7K7mkpCRZrVaT0gCjE/D75ZsBW/70Z01NlWGxRPw6+/bt086dO3XeeecF21auXKni4mKtX79enZ2dOu+88xQIBLR7927Nnz8/2G/16tXKzMzUV77yFZ06dUrbt2/XNddcEzz/f/7P/wkWMN1yyy3aunWr/H6/Ghoa9JGPfEQ33XST7r//fv3whz/UsWPH9L3vfU8PPvhgSL7vfe97On36tCTphz/8oe69997guRUrVui6667T+vXr9corr0Tk6zMay5YtU1VV1YCVXiTpk5/8pO68806tX79ef/7zn/Wd73xHt9xyS/A+7HA4tHjxYu3Zsyf4nJKSEs2dO3fQ6333u9/Ve++9p9TUVL366qtasWJFyPkLL7xQN954o9asWaPa2lrdd999evrpp0P6bNy4MbgC069//Wv9/d//ffDcypUrdf311+uiiy4KyQVMZRaLRcnJySGviyhimiB+v1/33HOPNm/eLL/fH6wUMwxjwL6hfRWUNptNx48f16xZsyYrJgAAAAAAAAAAAEx2dhETqzBhKvG1tan8YxeYHWNSFf/1LdnS0yN+nbvvvjukgKnPlVdeqcLCQp08eVKNjY36j//4j5ACpj633XabNm7cKLfbrTfeeCOkiOkXv/iFJCkrK0v//u//LsMwBjz/O9/5jp5//nkdPnxYjzzyiL773e8qNjZW0plt2B577DFJ0kc+8hF94xvfGPD8mJgYPfbYYzrnnHPk8XjG9kWYIJmZmUOet9vt+vGPf6xly5bp5MmT2rdv34DCo5Hq6uoKfn2/973vDTpOYWGhvvWtb+nLX/6yfvvb32rLli1yOBySFFwNS5LWr18fUsDUJykpSVu2bAk7R4CpKiUlRe3t7bLZbEpJSRmwAtx0E/ly2P/xpS99ST/96U/l8/mUn5+v6667btC+fcvG+Xw+Pffcc5MVEQAAAAAAAAAAACbz+/3BlTb6UMQEQJI+97nPDXruIx/5iKQzi2jccMMNYfvEx8eruLhYklRZWRlsr6mp0aFDhyRJn/3sZ5WUlBT2+TabLbitWmtrq957773guXfffVetra2SpFtvvTVsEZQkzZ49W5dffvmgn4dZenp6dOrUKR08eFBlZWUqKysL2cLq/fffH/PYO3fuDBanDlUnIEkf//jHJUkej0fvvvtusH3Hjh3y+XySFLK13dlWr16tRYsWjTkrEG3y8vK0cuVKfexjH9PixYuVnZ1tdqSImpQiptdeey1YdXrffffpxIkT+r//9/8O+Zzrr79egUBAf/nLXyYjIgAAAAAAAAAAAKJAV1eX/H5/SBtFTACkM1uWDaZvW7TMzEylpaUN26+zszPYVlZWFjwebhWf/uf7P++DDz4IHq9atWrIMVavXj3k+cnidDr1wAMPaOnSpXI4HCosLNSiRYu0ZMkSLVmyRMuXLw/2bWpqGvN1+m/vlpeXJ8MwBv1YvHhxsG9dXV3weCp+fYGJEBcXJ4fDMWhh5HQzKdvJbdmyRdKZFZa+//3vj+g5fTeWAwcORCwXAAAAAAAAAAAAosvZW8klJCQoJibGpDQAoklCQsKg5ywWy7B9+vfrW9VHklpaWoLHw61ykpubG/Z5oxkjJydnyPOT4cSJE7rkkkt0/PjxEfV3uVxjvlZDQ8OYntfd3R08nmpf3/+fvfuOj6rK/z/+vplk0jsJJLQACQKCFCki1bLiBhusBVQUCyK6Cq6Kq/tbV/frrgUVu4IgRbGxKiuCfSkaUUAB6ZAAUhI66XUm8/uDzSyTXmbmpryejwePx51z7z3nPeFymcx85hwA9eOVIqY1a9bIMAzddttttT6nXbt2klyrKwEAAAAAAAAAANC8ZWZmujwumzUFaCosERFK+iHF7BheZWlG/07dMdtJU5gxZcKECdq7d68Mw9Att9yicePGqXv37oqJiZHVapVhGCotLZXFYpEkl6Xl6urMgrFffvml1oWpZTUD5TWFny+A+vFKEVNZZWVCQkKtzym7cdlsNk9EAgAAAAAAAAAAQCPUqVMnRUZGKisrS1lZWSwlhybH8PGRb1SU2TFQB1Fn/H0dOXKk2mPPnITjzPPOXMLuyJEj1S59V9MYhmHI4XBUWFqzvLy8vGr3V2XHjh36/vvvJUmPPPJIlaspnTn7UUNER0c7t2NiYqosTqpO+Z9v+/btqzy2pp8vgMbLxxuDBAcHS5KOHTtW63MOHjwoyfXGDwAAAAAAAAAAgOYtJCRE7dq109lnn63BgwcrJibG7EgAmrmePXs6t3/66adqj127dm2l5/Xq1cu5vW7dumr7qGl/aGioJOnUqVNVHuNwOJSamlptP1XZunWrc/u6666r8rj169dX209tZ0Tq27evczslpX6zlLnz5ws0dbUpcmyqvFLE1LlzZ0nStm3ban3O559/Lkk6++yzPZIJAAAAAAAAAAAAjZthGCwbBMDj4uPj1b17d0nShx9+qNzc3EqPs9vtmj9/vqTTMwP169fPue/cc891zhb09ttvV7n82qFDh/TVV19Vm6dTp06Sqi8i+vzzzyssv1lbZ66GVN1sTm+88Ua1/QQEBDi3i4qKqjzu4osvVlBQkCTppZdeqtfSdBdccIFzabsFCxZUedy6deu0ZcuWOvcPNHa5ubnav3+/Nm/erB9++EGHDh0yO5JHeKWI6ZJLLpHD4dCrr75aq2qwbdu2af78+TIMQ8nJyV5ICAAAAAAAAAAAAABoqe6++25Jp1cXuvfeeys95vHHH3dO3DFp0iT5+/s79/n7++uWW26RJG3cuFEzZsyocL7NZtOkSZNUXFxcbZYRI0ZIOj0rVGUzFx0+fFj33HNPLZ5V5ZKSkpzbZUVZ5b3++uv697//XW0/cXFxzu20tLQqj4uIiNAf//hHSdIPP/yg++67r9q6gSNHjmjOnDkVxrryyislSZ9++qk+/PDDCufl5uZq8uTJ1WYGmqr09HTt3btXJ0+elM1mU1ZWltmRPMIrRUz33nuvgoODlZaWpjvvvNOlsrO8r7/+WpdccokKCwsVFRWlSZMmeSMiAAAAAAAAAAAAAKCFuvPOOzV48GBJ0rx583TRRRfp448/1q+//qpvvvlG11xzjf7v//5PktSlSxf99a9/rdDHo48+qnbt2kmSHnroIV1//fX64osv9Msvv+j999/X+eefr88//1z9+/evNssdd9whX19fORwOXX755XrhhRe0fv16/fDDD5oxY4b69u2rrKwsl2Kkuujbt69zKbxZs2bpuuuu02effaaff/5Z//73v3XNNdforrvu0pAhQ2rsp2w2pr/+9a/6+uuvtWvXLqWmpio1NVUFBQXOY//+979r0KBBkqQXX3xR/fr106uvvqqUlBRt3LhRK1as0CuvvKKrrrpKHTp0qHQWqOeee8651N7111+vu+++WytWrNDPP/+sefPm6dxzz9WGDRtq/PkCTVF4eLjL46ysrHrNatbY+XpjkNatW+uNN97QTTfdpLlz5+rLL7/U6NGjnftffPFFORwOpaSkaMeOHXI4HPLx8dH8+fMVEhLijYgAAAAAAAAAAAAAgBbKYrHos88+0xVXXKGUlBT95z//0X/+858Kx3Xv3l2ff/55pZ9jh4eH64svvtDFF1+sw4cP67333tN7773ncszEiRM1YsQI56xNlTn77LP1zDPP6E9/+pNOnTql++67z2V/VFSUlixZor/+9a/avXt3nZ+rYRh6++23deGFF+rUqVP68MMPK8xs1KtXLy1evFjx8fFV9hMaGqp7771X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ysrKUlFRkX777Te98847GjZsmP74xz9WeJ6Veeutt3T++efr/fff18GDB1VUVKSDBw9q/vz56tOnjxYvXlzt+c8++6x69OihF154QVu2bFF2drYKCwu1d+9eLViwQAMHDtSjjz5a7+cKtGTMxORlN910kxwOh2bPnm12FAAAAAAAAAAAAHhAc51FAID7OBwOXX311c7JLy6//HK9/fbbSklJ0Zo1a/Tiiy+qQ4cOysvL09VXX13t7D5jx47Vtm3bdO+99+rrr7/Wzz//rHfffVfdu3eXJC1dulRvvvmmyzkhISG65JJLJEkff/yxCgsLq+z/888/18mTJyVJN9xwg8eeR1U2btyoyy+/XNnZ2fLz89N9992nFStWaO3atZo1a5Y6deokSXr11Vf18MMP19jXnXfeqdjYWL388sv66aeftGrVKj300EPy9/dXUVGRbrjhhipzzpgxQw8++KBKSkp0zjnn6PXXX9c333yj9evXa9GiRRo8eLAcDof+7//+Ty+99FKdnyvQ0jXX11CNthSrQ4cOkqTNmzebnAQAAAAAAAAAAACewExMaI5KHaXKLMo0O4ZXRfhHyMfwzPwZc+bM0bJly+Tn56dPP/1Ul156qcv+8847TxMmTNCwYcO0detWTZs2rcol09atW6evvvpKI0eOdLb169dPo0aNUo8ePXTkyBG99tprmjx5sst5Y8eO1aeffqrs7Gx99tlnuvrqqyvtv2ymprCwMF122WUeex5VueOOO1RcXCyLxaLPPvvMWXwlSQMGDNA111yjoUOHatu2bXr22Wd100036eyzz660r02bNqljx4768ccf1aZNG2f78OHDNWrUKF1yySUqKSnRXXfdpbVr17qcu23bNv3lL3+RJP3tb3/T3/72N+dyfpJ07rnnaty4cbr55pv1zjvv6C9/+YsmTJhQYeYqAFUr/5rJx8dHPj6Ndh6jWmu0RUxHjhyRJOXl5ZmcBAAAAAAAAAAAAO5WWcESRUxoDjKLMjXigxFmx/CqVdetUlRAlNv7dTgcevrppyVJ9957b4XCnzKRkZGaMWOGkpOTlZKSot27dyspKanCcffcc49LAVOZqKgo3XLLLXrqqae0efNmZWVlKTw83Ln/ggsuUHR0tE6cOKFFixZVWsSUm5urTz/9VJL0hz/8wbkEnSeeR2XWrl2rdevWSZImTZrkUsB0Zv+zZ8/W0KFDVVpaqtdee02vvvpqlX0+99xzLgVMZS644AJNmjRJr7/+utatW6f169erf//+LueVlJSof//+FQqYyvj4+Ojll1/W4sWLlZubq3/961+aNGlSrZ4rgMpfMzWHJeUabRlW2c2ybEYmAAAAAAAAAAAANB+VfdDWHD58A+A+27ZtU1pamiRVOftRmeHDhzu316xZU+kx5Zd4O9O5554r6XTB0d69e132+fn5Ocf//PPPlZmZWeH8Tz75RAUFBZWO4+7nUZlvvvnGuX3bbbdVedyQIUOcy+edeU55kZGRuvLKK6vcf+utt1Y6tnR6WT7pdDFXZQVMZSIiItSrVy9JdXuuACSLxVLh31dzKAZvVEVMp06d0tdff63k5GR99tlnMgxDY8eONTsWAAAAAAAAAAAA3Kx8wZKvr2+zWAYFgPusX7/euT148GAZhlHln5CQEOexhw8frrS/bt26VTlWVNT/ZpLKycmpsH/8+PGSpKKiIv3rX/+qsL9sKbn4+HhdcMEFHn0eldmyZYskyWq1qk+fPtUeO2jQIEnS7t27VVxcXOkxffv2rbawtE+fPrJarZKkzZs3O9t/++03HTt2TJL08MMPV/tcDcNw/mzq8lwBSIZhqH379kpISFD79u21a9cuFRYWmh2rwbxSzm6xWOp1XlJSkh566CE3pwEAAAAAAAAAAIDZys8W0BxmDwDgXkePHq3Xefn5+ZW2BwUFVXnOmUWUdru9wv4hQ4aoY8eO+u2337Ro0SLdfvvtLjnLZiMaN25chYJMdz+Pypw8eVLS6WKsmma1K1sizuFw6NSpU2rdunWFY2JjY6vtw9fXV1FRUTp8+LBzbMk7zxXAaZ06dZIkZWdnu/w7bMq8UsTkcDjqdLyvr6+uueYazZw502WtUQAAAAAAAAAAADQPlc3EBDQHEf4RWnXdKrNjeFWEf4RH+j2zmGjp0qVKSEio1Xk1FeDUh2EYuv766/Xkk09q9erVOnTokNq2bStJ+vDDD2Wz2SRVvmSdN59Hdcu3eaOfM5/ro48+qmuuuaZW5wUHB9drPADNi1deDf7tb3+r8RgfHx+FhoaqU6dOOv/88xUTE+OFZAAAAAAAAAAAADBD+aIlZmJCc+Fj+CgqIKrmA1Gj6Oho53ZERIR69uxpYprTBUpPPvmkSktL9d577+mBBx6Q9L+l5Lp166Z+/fpVOM8bz6NsObwTJ07IZrNVWxhatnSbYRiKjIys9JgjR45UO57NZnOZ/anMmc/Vz8/P9L8zAE1LoyliAgAAAAAAAAAAQMvBcnIAatK3b1/ndkpKioYOHWpiGunss89W7969tWnTJr377rt64IEHtHfvXq1Zs0ZS5bMwSd55HmXFQsXFxdq4caP69+9f5bFr166VJCUlJclqtVZ6zMaNG6sthtq0aZOKi4tdxpakzp07Kzw8XFlZWUpJSanXcwHQcvnUfAgAAAAAAAAAAADgXocOHdLmzZvVpUsXdevWTW3atDE7EoBGpl+/fmrXrp0kafbs2SosLDQ50f8KlTZs2KDt27c7Z2GSpOuvv77Sc7zxPC6++GLn9ltvvVXlcWvWrNG2bdsqnFPeyZMntXTp0ir3nznGmf1YLBYlJydLkr766itt37695vAA8F9eKWL6+9//rr///e86fvx4rc85deqU8zwAAAAAAAAAAAA0LzabTXl5eQoLC1Pr1q0VERFhdiQAjYyPj48eeeQRSdKePXt00003qaioqMrjs7Oz9corr3g00/jx42UYhiRp0aJFeu+99yRJgwcPVufOnSs9xxvPY+DAgc7Zl9588019++23FY7JysrS5MmTnZmmTJlSbZ9/+tOfKl1WbtWqVZo9e7Yk6dxzz9WAAQNc9j/88MOyWCwqLS3V1VdfrYMHD1Y5ht1u16JFi6o9BkDt+Pg0/XmMvLKc3GOPPSbDMHT11VerVatWtTrn5MmTzvMeffRRDycEAAAAAAAAAAAAADQ2d955p77++mt98sknWrx4sX755RdNnjxZAwcOVHh4uLKzs7Vjxw6tXLlSn376qQICAvTHP/7RY3natWunESNGaOXKlXr11VeVmZkpqeql5Lz5PN58800NGjRIxcXFSk5O1j333KPLL79cwcHB2rBhg5566int2bNHkvTAAw+4LANXXu/evbVt2zade+65evjhhzVw4EAVFRVp+fLlmjlzpnOpuVdffbXCub169dKzzz6r++67T9u2bVPPnj11xx136MILL1Tr1q1VWFioffv2ac2aNfrXv/6ljIwMbd682TlbFYDaOXnypNLS0lRcXKxBgwapoKDA7EgN5pUiJgAAAAAAAAAAAAAA6sowDH3wwQeaOnWq3njjDaWlpWn69OlVHh8bG+vxTDfccINWrlzpLGDy9fXVtddeW+053ngeffr00dKlS3XNNdcoOztbzz33nJ577rkKx91999168skna+zrj3/8o6ZMmVJpMZXVatWCBQs0aNCgSs+fNm2agoODNW3aNGVlZWnGjBmaMWNGpcdarVYFBATU4hkCKC8/P1/S6XuMr2/TLwFqtHNJlZSUSJL8/PxMTgIAAAAAAAAAAAAAMIufn59ee+01bdq0Sffcc4969eql8PBwWSwWhYeHq0+fPrrtttv0r3/9S9u3b/d4nquvvlr+/v7Ox5dccoliYmJqPM8bz+OSSy5RamqqHnnkEfXp00dhYWHy9/dXhw4ddMMNN+i7777TK6+8Uqtlp26//XZ99913uvbaaxUfHy+r1aq2bdvqpptu0oYNGzRu3Lhqz580aZL27Nmjxx9/XEOGDFGrVq3k6+ur4OBgde3aVX/4wx/0xhtv6NChQ0pMTKzX8wVasvL1NH5+fnI4HCalcY9GW4a1ceNGSarVzR4AAAAAAAAAAAAA0Lz16tVLL730Up3Oeeyxx/TYY4/VeNzIkSNr/eF/RESECgsL65TjTPV5HpI0ceJETZw4scbjYmJi9I9//EP/+Mc/6pHO1XnnnacPPvig3ue3bt1ajz76qB599NEGZwHgqnwRk2EYstvtJqVxD48UMS1cuLDS9n//+99av359tecWFRUpLS1Nb731lgzD0IABAzwREQAAAAAAAAAAACYpLS1VUFCQbDabSktLzY4DAADQ5FS2shlFTJWYOHGiDMNwaXM4HPp//+//1boPh8MhHx8fTZ061d3xAAAAAAAAAAAAYKLCwkKdc845kqRNmzbJYrFoyJAhFT5fAgAAQOUsFot8fHxcCsJtNpuJiRqu5oUu68nhcDj/VNZW3R8/Pz8NGTJEn376qUaMGOGpiF7x22+/6f7771e3bt0UHBysqKgoDRgwQDNmzFB+fr7bxvn88881ZswYtWvXTv7+/mrXrp3GjBmjzz//vNZ92Gw2vfHGGxo2bJhiYmIUGBioLl26aPLkydq6davbsgIAAAAAAAAA0FQ0pff5m5LyH7D5+PhQwAQAAFBH5WdjaupFTB6ZiWnv3r3ObYfDoc6dO8swDH355ZdKSkqq8jzDMBQQEKDo6GhZLBZPRPOqpUuX6sYbb1R2drazLT8/X+vXr9f69es1Z84cLVu2TImJifUeo7S0VHfccYfmzp3r0n7o0CEdOnRIS5Ys0e23365Zs2bJx6fqmrXjx48rOTlZ69atc2nfs2ePZs+erQULFuiVV17R7bffXu+sAAAAAAAAAAA0JU3pff6mpvwHbJUthwIAALzr8LffauPzz+vYzp0qKSiQX2CgYs46S33+9Ce1uegis+OhEn5+fioqKnI+poipEh07dqy0PT4+vsp9zc2GDRt03XXXqaCgQCEhIXr44Yd1wQUXqKCgQO+//77efPNN7dq1S6NHj9b69esVGhpar3H+8pe/OH+x6du3r6ZPn64uXbooLS1NzzzzjDZs2KA5c+YoJiZG//znPyvtw263a8yYMc4CprFjx2rSpEmKiorSTz/9pCeeeEJHjx7V5MmT1bZtW/3+97+v3w8FAAAAAAAAAIAmoim9z98U2e12l8cUMQEAYJ6Dy5ZpxbRpOpKaWmHfkbQ0bVm+XG0SEzXyhRfUbvRoExKiKszEVA9nrr/XUkydOlUFBQXy9fXVV199pcGDBzv3XXjhhUpKStL06dO1a9cuPffcc3rsscfqPMauXbv07LPPSpL69++v1atXKzAwUJI0YMAAXXHFFRoxYoTWr1+vGTNm6NZbb6302yALFizQ999/L0m666679Oqrrzr3DRw4UL///e917rnnKjs7W/fee6+2b98uX1+vXDoAAAAAAAAAAJiiKb3P3xQxExMANE779u0zOwK8bNfs2Vp2992y11D8cjg1VYuvukqjX31VXe+4w0vpUJPmVsTUfOYdbUTWrl2r7777TpJ02223ufxiU+b+++9X9+7dJUkvvviiSkpK6jzOCy+84LwAX375ZecvNmWCgoL08ssvSzp9oc6cObPSfsp+QYqKitKMGTMq7E9MTNTDDz8sSUpNTdUnn3xS56wAAAAAAAAAADQVTe19/qaIIiYAAMx3cNmyWhUwlbHbbFp29906uGyZh5OhtihiQo2WLFni3L7lllsqPcbHx0c33XSTJCkzM1MrVqyo0xgOh0P//ve/JUndunXTeeedV+lx5513ns466yxJ0r///W85HA6X/bt27dL27dslSddee62CgoIq7WfixInObYqYAAAAAAAAAADNWVN6n7+poogJAADzrZg2rdYFTGXsNptWTpvmmUCos/Kvocov2dvUuHVNsFtvvVWSZBiGc/3mM9vro3xfTUHZ0mzBwcE699xzqzxuxIgRzu2UlBRd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dfhnu94fg8+4HrlHeAGvI8r369bXkY3w31zz6tcz3TYmZ16PjuAY13ukV3CPoF/Xfkt9PfC7NveIJsxD9wjATZra+/xNla+v60dUTX3pEwAAmpre992nLcuX1/v8Pvfd58Y0wGne/YpLCxAQEKDo6NPfIjp48GC1x546dcr5i0f79u3rNM6Z35yoaZwzp4otP059+jEMo07f3AAAAAAAAAAAoKloau/zN1XlZzOhiAkAAO+Ku/hitU5MrNe5bRIT1eaii9ycCHDzTEydO3d2Z3eSThfMpKWlub1fT+rRo4e+++47paamymazVfg2QZkdO3Y4t7t3717nMSrrp67jlO+nT58+NfbTvn17plwGAAAAAAAAADRbTel9/qaqVatWWr9+vWw2m6644gpn4RgAAPCeC154QYuvukp2W+2XFrf4+WnkCy94LhRaNLcWMe3bt8+d3Uk6XcTU1AwdOlTfffed8vLy9PPPP2vQoEGVHrdq1Srn9pAhQ+o0RqdOnRQfH6/09HSXfiqzevVqSVLbtm2VkJBQIeuZecaNG1dpH4cPH9auXbvqlRUAAAAAAAAAgKakKb3P31SFhobq+PHjkqTg4GBZrVaTEwEA0PK0Gz1ao199VcvuvrtWhUwWPz+NfuUVtRs92gvp0BK5tYjp5ptvdmd3TdZVV12lJ598UpI0b968Sn+5KS0t1cKFCyVJERERuuCCC+o0hmEYuvLKK/X6669rx44d+vHHH3XeeedVOO7HH390fkPjyiuvrFAU1rVrV3Xv3l3bt2/Xhx9+qOeee05BQUEV+pk/f75ze8yYMXXKCgAAAAAAAABAU9KU3ucHAABoiK533KGgtm21cto0HU5NrfK4NomJGvnCCxQwwaPcWsQ0b948d3bXZA0cOFDDhg3Td999p7lz5+rmm2/W4MGDXY557rnntH37dknS1KlT5efn57J/5cqVzl94br75ZpciojLTpk3T7NmzZbfbdc8992j16tUKDAx07i8oKNA999wjSfL19dW0adMqzfvAAw/otttu08mTJzV9+nS98sorLvvT0tKcv6wlJiZSxAQAAAAAAAAAaNaa2vv8AAAADdFu9GjdOHq0Dn/7rTbOnKljO3eqJD9ffkFBijnrLPW57z61uegis2OiBXBrERP+58UXX9SQIUNUUFCgSy65RI888oguuOACFRQU6P3339fs2bMlnZ4J6f7776/XGF27dtWDDz6op556SuvXr9eQIUP00EMPqUuXLkpLS9PTTz+tDRs2SJIefPBBJSUlVdrPzTffrLfeekspKSl69dVXdfjwYU2aNEmRkZFau3at/u///k/Z2dny8fHRSy+9VOXa3wAAAAAAAAAANBdN6X1+AAAAd2hz0UW6lGIlmIhqFA/p27evPvjgA914443Kzs7WI488UuGYrl27atmyZQoNDa33OP/4xz909OhRvfXWW9qwYYPGjRtX4ZjbbrtNTzzxRJV9WCwWLVmyRMnJyVq3bp0++ugjffTRRy7H+Pv765VXXtHvf//7emcFAAAAAAAAAKCpaErv8wMAKkpISNBvv/1W5Wx4Znrsscf0+OOPS5IcDofJaQCg8fAxa2CHw6G0tDStW7dO69atU1paWrO7QV9++eX69ddfdd9996lr164KCgpSRESE+vfv7/z2RGJiYoPG8PHx0dy5c7Vs2TJdeeWVio+Pl9VqVXx8vK688kotX75cc+bMkY9P9X/VrVq10g8//KDXXntNQ4cOVXR0tAICAtS5c2dNmjRJP//8s26//fYGZQUAAAAAAAAAoClpSu/zN1WGYaikpES5ubkqLS01Ow4AAABM5PWZmL744gu99tprWrlypfLy8lz2BQUFaeTIkbrrrruazYw/HTt21PPPP6/nn3++TueNHDmyTkVdycnJSk5Orms8F76+vpoyZYqmTJnSoH4AAAAAAAAAAGgumtL7/E2Jw+FQ//795evrqy1btkiSBgwYoKCgIJOTAU2P/fBhFf/8s+yHD8tRXCzDapWlTRtZzz1XljZtzI4HAECtea2IKT8/XxMmTNCSJUskVT4tXl5enpYvX67ly5friiuu0DvvvKPg4GBvRQQAAAAAAAAAAIAXGIZRoa2kpMSEJEDTZTt0SIVffin7gQMV9tkPHlTx+vWytG+vgFGj5Nu2rQkJAQCoG6/MPVpaWqrk5GQtWbJEDodDvr6+Gj16tB5//HG98cYbeuONN/T444/rsssuk5+fnxwOhz799FMlJyc3uyXmAAAAAAAAAAAAINlsNpfHFDEBtVeya5fy5s+vtIDpTPYDB5Q3f75Kdu3yUjLPSE9P15///Gf169dP4eHh8vPzU+vWrdWrVy+NHz9e8+fPV3Z2tqTTM+EZhqHffvtNkrRgwQIZhuHyZ+TIkS79nzp1SvPmzdONN96oHj16KCQkRFarVW3bttX48eP1zjvvqLi4uMp8+/btc/Y9f/58SdLHH3+s5ORkxcfHy9fXVyNHjtT8+fNlGIYef/xx57nlsxmGoX379rn15wcATYVXZmKaNWuWVq9eLcMwNGrUKM2ZM0dtq6j2PXTokCZNmqQvvvhC33//vd544w2WNwMAAAAAAAAAAGhmKGIC6sd26JDyFy+Wyv0bqvoEm/IXL1bwxIlNckam7777TpdddpmzSKnM0aNHdfToUW3ZskXvv/++WrVqpcsuu6xeY/Tt29dZ9HSmI0eO6MiRI1q1apXee+89LV++XG1qWKLP4XDopptu0ttvv12vLADQknmliGnBggWSTq9lvGzZMvn4VD0BVNu2bbV06VINGTJEa9eu1YIFCyhiAgAAAAAAAAAAaGbKFy1RxATUTuGXX9a+gKmMzabCL79UyK23eiaUhxQVFWncuHHKzs5WaGiopkyZogsuuECxsbEqLi7W3r179cMPP+iTTz5xnjNv3jzl5eVp1KhRSk9P15VXXqknnnjCpd/g4GCXx3a7XYMGDdJll12mvn37qnXr1iouLlZaWprmzZunFStWaMOGDRo3bpxWrlxZbeYXXnhBv/76q4YNG6YpU6aoa9euyszM1L59+3TVVVepf//+eu211/T6669LkjZv3lyhj6omBAGA5s4rRUzbt2+XYRi67777qi1gKmOxWPSnP/1J48aN0/bt272QEAAAAAAAAAAAAN7ETExorhwOhxz5+R7p2370aI1LyFV57oEDKtm7V5bYWDenkoygIBmG4fZ+U1JSlJ6eLkl69913K8y0dN5552n8+PGaOXOm8v/7M+/UqZMkyc/PT5IUERGhnj17VjvOf/7zHyUlJVVoHzRokC6++GK9//77+tOf/qRVq1bp22+/1UUXXVRlX7/++qtuuukm59Jx5UVERCj2jL+DmrIBQEvilSKmsptz165da31O2X8SnvjPDgAAAAAAAAAAAOZiJiY0V478fOU8+6zZMSqVv3ChR/oNfeABGeVmN3KHw4cPO7eHDx9e5XG+vr4KCwur9ziVFTCdady4cVq4cKE2btyoJUuWVFvEFBERoVdeeYXPuQGgHmqeFskNunTpIun0uqS1VXZs2bkAAAAAAAAAAABoPpiJCUBN4uLinNvz5s3zypgOh0OHDx/Wrl27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Z2RkaNu2bSoqKnJCVACAxqS4uFh//PGH0tPTK5S1bNlSkZGR9R8ULggkMQGotoKCAt1+++26+uqr9fHHH2v//v06c+aMcnJytGPHDs2cOVMdOnTQ0qVLK23r+PHj6tOnj6ZOnaqtW7cqNzdXubm52rhxox544AHdcsst5aa9laSbb75ZXl5ekqQFCxY4bL+4uFiLFy+WJA0ZMkRBQUFVupbc3Fzt2rVLr732WpWvxZ4VK1aoXbt2euGFF5SYmKisrCwVFhbq4MGD+vTTT3XllVfq/vvvr3Cdtnz00Ue6/PLL9dlnnyk1NVWFhYVKTU3VvHnzFBMTo0WLFjk8fubMmercubNef/117dixQ9nZ2SooKND+/fv13//+V7169dIzzzxT42sFAAAAAAAAADiXwWBQmzZt1L59+wplOTk52rp1q/Ly8pwQGQCgMcjPz9fWrVuVlZVVoaxdu3Zq164dy5vCLpKYAFSLxWLR8OHD9dlnn0mShg0bpk8++URr167V+vXr9cYbb6h169bKy8vT8OHDK53Z55ZbblFSUpIefPBBrVy5Ups3b9aCBQvUqVMnSdLSpUv1/vvvlzvGz89PN9xwgyTpq6++UkFBgd32ly1bplOnTkmS7rjjjipdyy+//KKlS5fqueeeq9a12JKYmKhhw4YpOztbbm5umjJlilatWqUNGzZo9uzZioqKkiS98847evzxxytta9KkSQoNDdVbb72l33//XatXr9ajjz4qDw8PFRYW6o477rAb54wZM/TII4+ouLhYl156qd599139+OOP2rRpk+bPn68+ffrIYrHo+eef15tvvlntawUAAAAAAAAANBxhYWGKjo6Wq6truf0FBQXaunWr9bNzAABqU2FhYYX7t66ururatatatmzppKhwoTA6OwCgvp3MLazxsT4eRnm6udosO5VXJIvFUqN2vdxd5e1u++V4Or9I5pKqtdvE16NG56+ODz74QN9//73c3Ny0ZMkSXXfddeXKL7vsMt1555268sortXPnTj300EMOl0vbuHGjVqxYof79+1v39ejRQ4MHD1bnzp11/PhxzZo1SxMnTix33B133KHPP/9c2dnZ+u677zR8+HCb7ZfO1OTv76+hQ4dW6VrMZrPS09PVs2dP3Xvvverfv3+VrsWWCRMmqKioSK6urvruu+80aNAga1lcXJxGjBihvn37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TD3yyCPl6qxfv14ffvihpLN/eMTFxdlsq/QXRkREhA4cOFDpuUuXkjMajRo1alSV4t2+fbu8vLysa3rbMmfOHH3wwQeSpObNm9da0hUuTPHx8Zo2bZqks29Gs7Oz9dprr+nLL7/U/v375e3trdjYWD311FO6/PLLrcelp6frzTff1Ndff60DBw7I09NTffv2VXx8vLp37+7wnCUlJVqwYIEWLFigLVu26NSpUwoICFDXrl01YsQIjR8/3uEf+NLZzP3p06frm2++0cGDB+Xn56dLL71UEydO1IgRIyq97tLX47PPPqv4+Hi79fr376/Vq1erX79+SkhIqLTdc+3YsUPffPON1qxZo507dyojI0Nubm5q0aKFLr/8ct177702Z3hLSEio8MFFVFRUhXqrVq2yOd30N998o/nz5+v3339Xenq6PD091a5dOw0bNkwPPvhgpescp6am6qWXXtKyZcuUlpam4OBgxcbG6sEHH9TAgQOr9yDYUdXnAAAAAAAAALgQ7N692zpjSceOHR3WLVuenJxcrSSm1NRUh+VHjx61bufk5Cg7O7vKbZ+P3Nxcm9vA+aBfNQx+fn7y8/NTy5YtVVRUpNzcXOXm5qqwsFAmk8l6f8kWR0udVcZRu3l5eSoqKrKZVGWPi4uLXFxcFBUVpf3799vsU7t27apxzHl5eXbjPZ/EooKCArvtenl5KTw8XNLZxysnJ6fG50HNME6hLjirX9XFGEISUx145JFH9Pnnn2v37t2aOnWq9u7dq5EjR8rLy0urVq3Siy++KJPJJC8vL73++uu1cs6kpCRt3rxZknTdddcpNDS0Ssdt3rxZ48eP14ABA/S3v/1N0dHRatKkiUwmk3bt2qX58+drxYoVks5OJzhnzhz5+PjUSsy48B0+fFgDBw7U7t27rfvy8vK0bNkyrVixQgsXLtSIESP0xx9/aMiQITpy5Ii1Xn5+vpYsWaL//e9/WrZsmd0/uk+dOqUbbrhBa9euLbf/xIkTSkhIUEJCgt5++20tW7ZMERERNttITk7WwIEDlZaWZt1XUFCgn376ST/99JPGjRunq6666nweilphKxFJOvuNrL1792rv3r36+OOP9dhjj+mll16qlXNmZmZq+PDh+vnnn8vtLyws1ObNm7V582bNmjVL3377rd3lMdesWaOhQ4eWe0N89OhRLV26VEuXLiXhCAAAAAAAALChbHJRq1atHNYtveEsnf1ctjrKHluZTz75xDqjSn365JNP6v2cuPjRry5MzZs3l4eHh4xGo9zc3GQ0Gq3brq6uDo/9448/9P3339ss69q1q3x9fasVS0lJiUpKSqyzItnqU126dKnxEp979+7VDz/8YLOsbdu2atq0qSTJbDbLZDKpuLjY4b9lt3/66acaxYT6xTiFulCf/SorK6vW2ySJqQ74+fnp+++/15AhQ7Rnzx7NmTNHc+bMKVfH399f8+fPV0xMTK2cs3QWJkkaPXp0tY41m8368ccf9eOPP9qt06RJE3344YcaNmxYjWPExWfEiBFKTU3V448/ruuuu07e3t769ddf9eyzzyo7O1t33323YmNjNXToUJ05c0YvvPCC+vXrJzc3Ny1fvlwvvPCCCgsLNXbsWO3Zs6fCbEpms1lDhw7V+vXrJZ2duez+++9XVFSU0tLS9NFHH+mbb75RcnKyrrnmGiUmJlZ4A5qdna3BgwdbE5huu+02jRkzRqGhodq9e7dee+01zZ07Vzt27KifB80Bk8kkHx8fXX/99br66qvVsWNH+fv7Kz09XTt37tSbb76pgwcP6uWXX1aHDh00btw467FxcXHavn27vv32Wz311FOSpP/9738KCwsrd46yszMVFhZq4MCB2rJli1xdXTVq1CgNGTJEUVFRKi4u1i+//KLXXntN6enpGjJkiLZu3VohUezQoUPWBCYXFxdNmDBBw4cPV0BAgP744w+9/PLLio+PV2xsbB0+cgAAAAAAAMCFp+w31yu7sV72y8XM2gDgYnbs2DG7ZQaDoUJiU9l/Hc0Icj7Ls5lMJrtlVV3+rlRJSYk12cjRDE6HDh3S4cOH7S5FBwAXK5KY6ki7du20detWvfPOO1q0aJH27t2roqIihYeHa8iQIfrnP/9pd9aY6iopKdH8+fMlSYGBgbrhhhuqfOyQIUP04Ycfav369dq6dauOHz+ukydPymKxKDg4WN26ddN1112nsWPHyt/fv1bidYaSEosy86s+PeSFLsjbXS4udb9+bWJiolavXq3evXtb98XGxqp9+/YaOnSocnJy1Lt3b1ksFm3YsEFt27a11uvVq5dCQkI0efJkHTp0SN9//32FpQrfe+89awLT6NGjNW/ePOv0mT179tSwYcP05JNP6sUXX1RKSoqef/55TZ8+vVwbzz//vPWbSS+++KIef/xxa1nPnj01fPhwDR061DrjmDPFxMQoNTVVgYGBFcoGDx6s+++/X0OHDtXKlSs1bdo0jR492vqtAx8fH3Xt2lWbNm2yHtOhQwdFRkbaPd9zzz2nLVu2KDAwUD/++KN69uxZrrxv376644471KdPHx09elRPPPGEdawp9fDDD1tnYPr00091++23W8tiY2M1YsQIXXnlleXiAgAAAAAAAHB2tvhS537B81weHh7W7TNnzlTrPJXN3HT06FH16tVLknTnnXeqZcuW1Wq/pnJzc60zBdx5553VniEFsIV+BXvy8/NVXFxsndXI1k9p2blKE5Vs9anU1FRlZ2dbE6tKf1xdXSvsMxqNcnFxOa+l4nDhY5xCXXBWvzpy5EitrSBUiiSmOuTj46OpU6dq6tSpNTq+qlm1Li4u1Z4+tlRoaKjuuusu3XXXXTU6/kKRmV+knv+2P9PUxWbzUwPVxNej8orn6aGHHiqXwFTq+uuvV0REhA4ePKiMjAy9++675RKYSo0bN04PP/ywCgoKtGbNmgpJTO+8844kqWnTpnr77bdtvqmbNm2avvrqK+3atUvvv/++nnvuOesf9EVFRfrwww8lSZdeeqkee+yxCse7ubnpww8/VJs2baqdLV/bQkJCHJa7u7trxowZiomJ0cGDB5WYmFgh8aiqcnNzrY/v888/b7ediIgIPf3007rvvvu0aNGicktKHjt2TF9//bUkaejQoeUSmEr5+flpzpw5NvsJAAAAAAAAcD5q4ybw3LlzNXbs2PMPpgY8PT2t20VFjr+EW3a2Di8vr2qdp7Kl6sry8/NzyheafX19L+gvUqNhol+hrKr2BYvFYp0pqbi4WFlZWdq2bZsk232qc+fOtR4rGg/GKdSF+uxXpZNd1CaXWm8RQKMxcuRIu2WXXnqppLMfJNx2220263h5eal9+/aSpH379pUrS0tLU3JysiTp1ltvtbuesNFotC6rlpmZqS1btljLNm/erMzMTEnSmDFj7H6o0apVKw0aNMjutThLYWGhDh06pKSkJO3YsUM7duwol9xY+qa5JlavXm1do3T48OEO61511VWSzn7TYPPmzdb9q1atktlslqRyS9udq1evXurSpUuNYwUAAAAAAAAuRmU/86xsibi8vDzrNjM2AEDdKV2yztvbWwEBAQoMDKz2DHgAgJpj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AAAAAAAAAMCpSGICAAAAAAAAAAAAAAAA4FQkMQGolvj4eBkMBhkMBklSdna24uPjFR0dLV9fX4WGhmrIkCFat25duePS09P11FNPqUuXLvLx8VGTJk104403auvWrZWes6SkRJ9++qmGDBmi5s2by93dXU2bNtWAAQM0a9YsFRUVVdpGZmamHnvsMXXs2FFeXl4KDQ3VwIEDtWjRoipdd+k1x8fHO6zXv39/GQwG9e/fv0rtnmvHjh3697//rcGDB6tVq1by8PCQr6+v2rdvrzFjxui3336zeVxCQoIMBoPGjRtn3RcVFWWNu/QnISHB5vHffPONRowYodatW8vT01OBgYGKjY3VtGnTlJmZWWncqampmjx5stq0aSNPT0+FhYXphhtu0I8//lijx8GRBQsWqH///goKCpKvr6+6du2qZ599VqdPn5ZU9ecKAAAAAAAAAAAAANBwGJ0dAIAL1+HDhzVw4EDt3r3bui8vL0/Lli3TihUrtHDhQo0YMUJ//PGHhgwZoiNHjljr5efna8mSJfrf//6nZcuWacCAATbPcerUKd1www1au3Ztuf0nTpxQQkKCEhIS9Pbbb2vZsmWKiIiw2UZycrIGDhyotLQ0676CggL99NNP+umnnzRu3DhdddVV5/NQ1IqEhASbj0NRUZH27t2rvXv36uOPP9Zjjz2ml156qVbOmZmZqeHDh+vnn38ut7+wsFCbN2/W5s2bNWvWLH377be67LLLbLaxZs0aDR06VNnZ2dZ9R48e1dKlS7V06dJaSyYymUwaNWpUhcSznTt3aufOnfr000/rJGkKAAAAAAAAAAAAAFD3SGICUGMjRoxQamqqHn/8cV133XXy9vbWr7/+qmeffVbZ2dm6++67FRsbq6FDh+rMmTN64YUX1K9fP7m5uWn58uV64YUXVFhYqLFjx2rPnj1yd3cv177ZbNbQoUO1fv16SVK/fv10//33KyoqSmlpafroo4/0zTffKDk5Wddcc40SExPl6+tbro3s7GwNHjzYmsB02223acyYMQoNDdXu3bv12muvae7cudqxY0f9PGgOmEwm+fj46Prrr9fVV1+tjh07yt/fX+np6dq5c6fefPNNHTx4UC+//LI6dOhQbtaluLg4bd++Xd9++62eeuopSdL//vc/hYWFlTtHVFSUdbuwsFADBw7Uli1b5OrqqlGjRmnIkCGKiopScXGxfvnlF7322mtKT0/XkCFDtHXr1gqJYocOHbImMLm4uGjChAkaPny4AgIC9Mcff+jll19WfHy8YmNjz/vx+de//mVNYLrkkks0depUXXrppcrKytKiRYv0/vvv67bbbjvv8wAAAAAAAAAAAAAA6h9JTGgcSkqkM6ecHUX98QqWXOp+tcjExEStXr1avXv3tu6LjY1V+/btNXToUOXk5Kh3796yWCzasGGD2rZta63Xq1cvhYSEaPLkyTp06JC+//573XzzzeXaf++996wJTKNHj9a8efOsy9j17NlTw4YN05NPPqkXX3xRKSkpev755zV9+vRybTz//PM6fPiwJOnFF1/U448/bi3r2bOnhg8frqFDh2rFihW1++DUQExMjFJTUxUYGFihbPDgwbr//vs1dOhQrVy5UtOmTdPo0aPl6uoqSfLx8VHXrl21adMm6zEdOnRQZGSk3fM999xz2rJliwIDA/Xjjz+qZ8+e5cr79u2rO+64Q3369NHRo0f1xBNPaP78+eXqPPzww9YZmD799FPdfvvt1rLY2FiNGDFCV155Zbm4amL79u166623JEk9evTQ6tWryyWsXXPNNbr88ss1ZsyY8zoPAAAAAAAAAAAAAMA5SGJC43DmlDSjbeX1LhaPpEg+IXV+moceeqhcAlOp66+/XhERETp48KAyMjL07rvvlktgKjVu3Dg9/PDDKigo0Jo1ayokMb3zzjuSpKZNm+rtt9+2JjCVNW3aNH311VfatWuX3n//fT333HPy8PCQdHYZtg8//FCSdOmll+qxxx6rcLybm5s+/PBDtWnTRsXFxdV/EGpRSIjj58zd3V0zZsxQTEyMDh48qMTExAqJR1WVm5trfXyff/55u+1ERETo6aef1n333adFixZpzpw58vHxkSQdO3ZMX3/9tSRp6NCh5RKYSvn5+WnOnDk2+0l1vPfeeyopKZEkzZkzp8KMW9LZRLfPPvtMy5YtO69zAQAAAAAAAAAAAADqH0lMaHBMJpOKioqqXL+kpEQWi6XSOnU/L1HDZ7FYKn2s7DEYDBWSiEaOHGm33ejoaB08eFAGg0EjRoywJqCU5eHhofbt22v79u3at29fubK0tDQlJydLOrtsnY+Pj802XFxcNHbsWD322GPKzMzUpk2b1KdPH0nS5s2blZmZKUkaM2aMNf5z4w0LC9O1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jBF/4X3EWXU5RjRv3rxaY2RV2mWMOKuxvY8AAAAAAFy8SGJCg2M0GiskxDji4uJS6Qdsjj7wOh911a7BYKiTZbPqs92y/6/J4xQWFqZOnTopOTlZixYt0vTp0+Xr61uhntls1n//+19JZ2cGio2NtZ6vZ8+eCgoKUmZmpj755BNNmTLFGmvZ+I4cOaKVK1eWi730w2CDwSAXFxdFRUVp27Zt2rx5s92Yly9frtOnT9u97rL/d3FxKff/sn343ESpsvHOmTOn3P5zz1E2Uaq4uNjuYz9w4EB5e3srPz9fb7/9tkaOHFntvnH11VfL1dXV+hzccsstFeKVziY47dixw/r/mvSHgQMHas+ePdq+fbu2bdtWLgmrrNIPxEvjqOq5ytYrPa4645A9VV2mr7oc3XxpTO26uro6vLHT0NqtrX5VX+0aDAab7bq5uclkMlm3q3tue+3Whrpqt65ey4wR59+uo2MZI+q23bp6LV/oY8T5jpH22q1NDfG17Ix2G8MYUbY/2nuvzxjxF95HnFWXr+XaHCPLtlsXGsMY4cx26/K1DAAAAAC4sF34a04BuGhNnjxZkpSRkaEHH3zQZp1p06YpKSlJknTPPfeUm4nIw8ND48aNk3R2JqAZM2ZUON5kMumee+5RUVGRw1j69esnSfr999+1du3aCuXHjh3TAw88UIWrsq3st9bLJuKU9e677+rbb7912E6LFi2s2ykpKXbrBQYG6v7775ckrVu3TlOmTHGYDHj8+HF98MEHFc514403SpKWLFmiL774osJxubm5mjhxosOYq2LixInWGy8TJkywOSPW/Pnz9cMPP5z3uQAAAAAAAAAAAAAA9Y8kJgAN1qRJk6zTi8+dO1fXXHONvvzyS23ZskXff/+9/v73v+v555+XJLVt21ZPP/10hTaeeeYZtWrVSpL06KOPatSoUVq+fLm2bNmizz77TJdffrmWLVum2NhYh7FMmDBBRqNRFotFw4YN0+uvv65NmzZp3bp1mjFjhrp3766srKwaL6HRvXt36xJ6s2fP1m233abvvvtOmzdv1rfffqsRI0bovvvu0xVXXFFpO56enpKkp59+WitXrtTu3bu1d+9e7d27V2fOnLHWfe6559S7d29J0htvvKEePXronXfe0dq1a5WYmKhVq1bp7bff1k033aTWrVvrvffeq3C+V1991boEwKhRozR58mStWrVKmzdv1ty5c9WzZ09t3bq10se3Mt26dbMmtW3atEmxsbGaN2+eNm/erJ9//ln33nuvRo8efd7nAQAAAAAAAAAAAAA4B8vJAWiwXF1d9d133+mGG27Q2rVr9fPPP+vnn3+uUK9Tp05atmyZzeXmAgICtHz5cg0cOFDHjh3TwoULtXDhwnJ1xo4dq379+llnbbKlS5cueuWVV/R///d/yszM1JQpU8qVBwcH65tvvtHTTz+tPXv2VPtaDQaDPvnkE1199dXKzMzUF198UWFmo+joaC1atEhhYWF22/Hz89ODDz6oV155RVu2bNGgQYPKla9atUr9+/eXdHamqpUrV2rs2LH66quvtG3bNuvsTLb4+/tX2BcZGaklS5bohhtuUE5OjmbNmqVZs2aVq/PMM8/IYDBo06ZNlT0MDr322mtKS0vTV199pV27dlV4vqKiovT555+rbdu253UeAAAAAAAAAAAAAED9YyYmAA1acHCwfvnlF3388ce67rrr1KxZM7m5ualJkybq37+/3n77bSUmJioiIsJuG126dNHOnTs1depUtW/fXh4eHgoJCdGAAQO0YMECzZ07t0qxTJkyRcuXL9fgwYMVFBQkDw8PRUVFafLkydq6dauuvPLK87rWmJgYJSYmatKkSYqIiJCbm5uCg4PVq1cvzZw5Uxs2bCi3XJw9L7/8st5//31deeWVCg4Olqurq926fn5++vLLL7VmzRqNHz9el1xyifz8/GQ0GhUcHKy4uDhNnjxZP/zwg1auXGmzjf79+2vnzp269957FRERIXd3dzVr1kzXX3+9li9frmnTptX4MSnLzc1NX375pT755BNdeeWVCggIkLe3tzp16qQnnnhCmzdvVps2bWrlXAAAAAAAAAAAAACA+sVMTACqJT4+XvHx8ZXWmzdvnubNm1dpvYSEhErruLi46M4779Sdd95ZeYB2BAcHa/r06Zo+fbrN8rFjx2rs2LGSJLPZrPT0dJv1Bg8erMGDB9s9j6PriYyMlMVicRhn69at9e677zqsU1kbBoNB48eP1/jx4x3WK6tv377q27dvleufKzw8vMIMTGVVtd9UxT/+8Q/94x//qJW2AAAAAAAAAAAAAAANAzMxAQAAAAAAAAAAAAAAAHAqkpgAAAAAAAAAAAAAAAAAOBVJTAAAAAAAAAAAAAAAAACciiQm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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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9JGPfEQ33XST7r//fv3whz/UsWPH9L3vfU8PPvhgSL7vfe97On36tCTphz/8oe69997guRUrVui6667T+vXr9corr0Tk6zMay5YtU1VV1YCVXiTpk5/8pO68806tX79ef/7zn/Wd73xHt9xyS/A+7HA4tHjxYu3Zsyf4nJKSEs2dO3fQ6333u9/Ve++9p9TUVL366qtasWJFyPkLL7xQN954o9asWaPa2lrdd999evrpp0P6bNy4MbgC069//Wv9/d//ffDcypUrdf311+uiiy4KyQVMZRaLRcnJySGviyhimiB+v1/33HOPNm/eLL/fH6wUMwxjwL6hfRWUNptNx48f16xZsyYrJgAAAAAAAAAAAEx2dhETqzBhKvG1tan8YxeYHWNSFf/1LdnS0yN+nbvvvjukgKnPlVdeqcLCQp08eVKNjY36j//4j5ACpj633XabNm7cKLfbrTfeeCOkiOkXv/iFJCkrK0v//u//LsMwBjz/O9/5jp5//nkdPnxYjzzyiL773e8qNjZW0plt2B577DFJ0kc+8hF94xvfGPD8mJgYPfbYYzrnnHPk8XjG9kWYIJmZmUOet9vt+vGPf6xly5bp5MmT2rdv34DCo5Hq6uoKfn2/973vDTpOYWGhvvWtb+nLX/6yfvvb32rLli1yOBySFFwNS5LWr18fUsDUJykpSVu2bAk7R4CpKiUlRe3t7bLZbEpJSRmwAtx0E/ly2P/xpS99ST/96U/l8/mUn5+v6667btC+fcvG+Xw+Pffcc5MVEQAAAAAAAAAAACbz+/3BlTb6UMQEQJI+97nPDXruIx/5iKQzi2jccMMNYfvEx8eruLhYklRZWRlsr6mp0aFDhyRJn/3sZ5WUlBT2+TabLbitWmtrq957773guXfffVetra2SpFtvvTVsEZQkzZ49W5dffvmgn4dZenp6dOrUKR08eFBlZWUqKysL2cLq/fffH/PYO3fuDBanDlUnIEkf//jHJUkej0fvvvtusH3Hjh3y+XySFLK13dlWr16tRYsWjTkrEG3y8vK0cuVKfexjH9PixYuVnZ1tdqSImpQiptdeey1YdXrffffpxIkT+r//9/8O+Zzrr79egUBAf/nLXyYjIgAAAAAAAAAAAKJAV1eX/H5/SBtFTACkM1uWDaZvW7TMzEylpaUN26+zszPYVlZWFjwebhWf/uf7P++DDz4IHq9atWrIMVavXj3k+cnidDr1wAMPaOnSpXI4HCosLNSiRYu0ZMkSLVmyRMuXLw/2bWpqGvN1+m/vlpeXJ8MwBv1YvHhxsG9dXV3weCp+fYGJEBcXJ4fDMWhh5HQzKdvJbdmyRdKZFZa+//3vj+g5fTeWAwcORCwXAAAAAAAAAAAAosvZW8klJCQoJibGpDQAoklCQsKg5ywWy7B9+vfrW9VHklpaWoLHw61ykpubG/Z5oxkjJydnyPOT4cSJE7rkkkt0/PjxEfV3uVxjvlZDQ8OYntfd3R08nmpf3/+fvfuOj6rK/z/+vplk0jsJJLQACQKCFCki1bLiBhusBVQUCyK6Cq6Kq/tbV/frrgUVu4IgRbGxKiuCfSkaUUAB6ZAAUhI66XUm8/uDzSyTXmbmpryejwePx51z7z3nPeFymcx85hwA9eOVIqY1a9bIMAzddttttT6nXbt2klyrKwEAAAAAAAAAANC8ZWZmujwumzUFaCosERFK+iHF7BheZWlG/07dMdtJU5gxZcKECdq7d68Mw9Att9yicePGqXv37oqJiZHVapVhGCotLZXFYpEkl6Xl6urMgrFffvml1oWpZTUD5TWFny+A+vFKEVNZZWVCQkKtzym7cdlsNk9EAgAAAAAAAAAAQCPUqVMnRUZGKisrS1lZWSwlhybH8PGRb1SU2TFQB1Fn/H0dOXKk2mPPnITjzPPOXMLuyJEj1S59V9MYhmHI4XBUWFqzvLy8vGr3V2XHjh36/vvvJUmPPPJIlaspnTn7UUNER0c7t2NiYqosTqpO+Z9v+/btqzy2pp8vgMbLxxuDBAcHS5KOHTtW63MOHjwoyfXGDwAAAAAAAAAAgOYtJCRE7dq109lnn63BgwcrJibG7EgAmrmePXs6t3/66adqj127dm2l5/Xq1cu5vW7dumr7qGl/aGioJOnUqVNVHuNwOJSamlptP1XZunWrc/u6666r8rj169dX209tZ0Tq27evczslpX6zlLnz5ws0dbUpcmyqvFLE1LlzZ0nStm3ban3O559/Lkk6++yzPZIJAAAAAAAAAAAAjZthGCwbBMDj4uPj1b17d0nShx9+qNzc3EqPs9vtmj9/vqTTMwP169fPue/cc891zhb09ttvV7n82qFDh/TVV19Vm6dTp06Sqi8i+vzzzyssv1lbZ66GVN1sTm+88Ua1/QQEBDi3i4qKqjzu4osvVlBQkCTppZdeqtfSdBdccIFzabsFCxZUedy6deu0ZcuWOvcPNHa5ubnav3+/Nm/erB9++EGHDh0yO5JHeKWI6ZJLLpHD4dCrr75aq2qwbdu2af78+TIMQ8nJyV5ICAAAAAAAAAAAAABoqe6++25Jp1cXuvfeeys95vHHH3dO3DFp0iT5+/s79/n7++uWW26RJG3cuFEzZsyocL7NZtOkSZNUXFxcbZYRI0ZIOj0rVGUzFx0+fFj33HNPLZ5V5ZKSkpzbZUVZ5b3++uv697//XW0/cXFxzu20tLQqj4uIiNAf//hHSdIPP/yg++67r9q6gSNHjmjOnDkVxrryyislSZ9++qk+/PDDCufl5uZq8uTJ1WYGmqr09HTt3btXJ0+elM1mU1ZWltmRPMIrRUz33nuvgoODlZaWpjvvvNOlsrO8r7/+WpdccokKCwsVFRWlSZMmeSMiAAAAAAAAAAAAAKCFuvPOOzV48GBJ0rx583TRRRfp448/1q+//qpvvvlG11xzjf7v//5PktSlSxf99a9/rdDHo48+qnbt2kmSHnroIV1//fX64osv9Msvv+j999/X+eefr88//1z9+/evNssdd9whX19fORwOXX755XrhhRe0fv16/fDDD5oxY4b69u2rrKwsl2Kkuujbt69zKbxZs2bpuuuu02effaaff/5Z//73v3XNNdforrvu0pAhQ2rsp2w2pr/+9a/6+uuvtWvXLqWmpio1NVUFBQXOY//+979r0KBBkqQXX3xR/fr106uvvqqUlBRt3LhRK1as0CuvvKKrrrpKHTp0qHQWqOeee8651N7111+vu+++WytWrNDPP/+sefPm6dxzz9WGDRtq/PkCTVF4eLjL46ysrHrNatbY+XpjkNatW+uNN97QTTfdpLlz5+rLL7/U6NGjnftffPFFORwOpaSkaMeOHXI4HPLx8dH8+fMVEhLijYgAAAAAAAAAAAAAgBbKYrHos88+0xVXXKGUlBT95z//0X/+858Kx3Xv3l2ff/55pZ9jh4eH64svvtDFF1+sw4cP67333tN7773ncszEiRM1YsQI56xNlTn77LP1zDPP6E9/+pNOnTql++67z2V/VFSUlixZor/+9a/avXt3nZ+rYRh6++23deGFF+rUqVP68MMPK8xs1KtXLy1evFjx8fFV9hMaGqp7771X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ysrKUlFRkX777Te98847GjZsmP74xz9WeJ6Veeutt3T++efr/fff18GDB1VUVKSDBw9q/vz56tOnjxYvXlzt+c8++6x69OihF154QVu2bFF2drYKCwu1d+9eLViwQAMHDtSjjz5a7+cKtGTMxORlN910kxwOh2bPnm12FAAAAAAAAAAAAHhAc51FAID7OBwOXX311c7JLy6//HK9/fbbSklJ0Zo1a/Tiiy+qQ4cOysvL09VXX13t7D5jx47Vtm3bdO+99+rrr7/Wzz//rHfffVfdu3eXJC1dulRvvvmmyzkhISG65JJLJEkff/yxCgsLq+z/888/18mTJyVJN9xwg8eeR1U2btyoyy+/XNnZ2fLz89N9992nFStWaO3atZo1a5Y6deokSXr11Vf18MMP19jXnXfeqdjYWL388sv66aeftGrVKj300EPy9/dXUVGRbrjhhipzzpgxQw8++KBKSkp0zjnn6PXXX9c333yj9evXa9GiRRo8eLAcDof+7//+Ty+99FKdnyvQ0jXX11CNthSrQ4cOkqTNmzebnAQAAAAAAAAAAACewExMaI5KHaXKLMo0O4ZXRfhHyMfwzPwZc+bM0bJly+Tn56dPP/1Ul156qcv+8847TxMmTNCwYcO0detWTZs2rcol09atW6evvvpKI0eOdLb169dPo0aNUo8ePXTkyBG99tprmjx5sst5Y8eO1aeffqrs7Gx99tlnuvrqqyvtv2ymprCwMF122WUeex5VueOOO1RcXCyLxaLPPvvMWXwlSQMGDNA111yjoUOHatu2bXr22Wd100036eyzz660r02bNqljx4768ccf1aZNG2f78OHDNWrUKF1yySUqKSnRXXfdpbVr17qcu23bNv3lL3+RJP3tb3/T3/72N+dyfpJ07rnnaty4cbr55pv1zjvv6C9/+YsmTJhQYeYqAFUr/5rJx8dHPj6Ndh6jWmu0RUxHjhyRJOXl5ZmcBAAAAAAAAAAAAO5WWcESRUxoDjKLMjXigxFmx/CqVdetUlRAlNv7dTgcevrppyVJ9957b4XCnzKRkZGaMWOGkpOTlZKSot27dyspKanCcffcc49LAVOZqKgo3XLLLXrqqae0efNmZWVlKTw83Ln/ggsuUHR0tE6cOKFFixZVWsSUm5urTz/9VJL0hz/8wbkEnSeeR2XWrl2rdevWSZImTZrkUsB0Zv+zZ8/W0KFDVVpaqtdee02vvvpqlX0+99xzLgVMZS644AJNmjRJr7/+utatW6f169erf//+LueVlJSof//+FQqYyvj4+Ojll1/W4sWLlZubq3/961+aNGlSrZ4rgMpfMzWHJeUabRlW2c2ybEYmAAAAAAAAAAAANB+VfdDWHD58A+A+27ZtU1pamiRVOftRmeHDhzu316xZU+kx5Zd4O9O5554r6XTB0d69e132+fn5Ocf//PPPlZmZWeH8Tz75RAUFBZWO4+7nUZlvvvnGuX3bbbdVedyQIUOcy+edeU55kZGRuvLKK6vcf+utt1Y6tnR6WT7pdDFXZQVMZSIiItSrVy9JdXuuACSLxVLh31dzKAZvVEVMp06d0tdff63k5GR99tlnMgxDY8eONTsWAAAAAAAAAAAA3Kx8wZKvr2+zWAYFgPusX7/euT148GAZhlHln5CQEOexhw8frrS/bt26VTlWVNT/ZpLKycmpsH/8+PGSpKKiIv3rX/+qsL9sKbn4+HhdcMEFHn0eldmyZYskyWq1qk+fPtUeO2jQIEnS7t27VVxcXOkxffv2rbawtE+fPrJarZKkzZs3O9t/++03HTt2TJL08MMPV/tcDcNw/mzq8lwBSIZhqH379kpISFD79u21a9cuFRYWmh2rwbxSzm6xWOp1XlJSkh566CE3pwEAAAAAAAAAAIDZys8W0BxmDwDgXkePHq3Xefn5+ZW2BwUFVXnOmUWUdru9wv4hQ4aoY8eO+u2337Ro0SLdfvvtLjnLZiMaN25chYJMdz+Pypw8eVLS6WKsmma1K1sizuFw6NSpU2rdunWFY2JjY6vtw9fXV1FRUTp8+LBzbMk7zxXAaZ06dZIkZWdnu/w7bMq8UsTkcDjqdLyvr6+uueYazZw502WtUQAAAAAAAAAAADQPlc3EBDQHEf4RWnXdKrNjeFWEf4RH+j2zmGjp0qVKSEio1Xk1FeDUh2EYuv766/Xkk09q9erVOnTokNq2bStJ+vDDD2Wz2SRVvmSdN59Hdcu3eaOfM5/ro48+qmuuuaZW5wUHB9drPADNi1deDf7tb3+r8RgfHx+FhoaqU6dOOv/88xUTE+OFZAAAAAAAAAAAADBD+aIlZmJCc+Fj+CgqIKrmA1Gj6Oho53ZERIR69uxpYprTBUpPPvmkSktL9d577+mBBx6Q9L+l5Lp166Z+/fpVOM8bz6NsObwTJ07IZrNVWxhatnSbYRiKjIys9JgjR45UO57NZnOZ/anMmc/Vz8/P9L8zAE1LoyliAgAAAAAAAAAAQMvBcnIAatK3b1/ndkpKioYOHWpiGunss89W7969tWnTJr377rt64IEHtHfvXq1Zs0ZS5bMwSd55HmXFQsXFxdq4caP69+9f5bFr166VJCUlJclqtVZ6zMaNG6sthtq0aZOKi4tdxpakzp07Kzw8XFlZWUpJSanXcwHQcvnUfAgAAAAAAAAAAADgXocOHdLmzZvVpUsXdevWTW3atDE7EoBGpl+/fmrXrp0kafbs2SosLDQ50f8KlTZs2KDt27c7Z2GSpOuvv77Sc7zxPC6++GLn9ltvvVXlcWvWrNG2bdsqnFPeyZMntXTp0ir3nznGmf1YLBYlJydLkr766itt37695vAA8F9eKWL6+9//rr///e86fvx4rc85deqU8zwAAAAAAAAAAAA0LzabTXl5eQoLC1Pr1q0VERFhdiQAjYyPj48eeeQRSdKePXt00003qaioqMrjs7Oz9corr3g00/jx42UYhiRp0aJFeu+99yRJgwcPVufOnSs9xxvPY+DAgc7Zl9588019++23FY7JysrS5MmTnZmmTJlSbZ9/+tOfKl1WbtWqVZo9e7Yk6dxzz9WAAQNc9j/88MOyWCwqLS3V1VdfrYMHD1Y5ht1u16JFi6o9BkDt+Pg0/XmMvLKc3GOPPSbDMHT11VerVatWtTrn5MmTzvMeffRRDycEAAAAAAAAAAAAADQ2d955p77++mt98sknWrx4sX755RdNnjxZAwcOVHh4uLKzs7Vjxw6tXLlSn376qQICAvTHP/7RY3natWunESNGaOXKlXr11VeVmZkpqeql5Lz5PN58800NGjRIxcXFSk5O1j333KPLL79cwcHB2rBhg5566int2bNHkvTAAw+4LANXXu/evbVt2zade+65evjhhzVw4EAVFRVp+fLlmjlzpnOpuVdffbXCub169dKzzz6r++67T9u2bVPPnj11xx136MILL1Tr1q1VWFioffv2ac2aNfrXv/6ljIwMbd682TlbFYDaOXnypNLS0lRcXKxBgwapoKDA7EgN5pUiJgAAAAAAAAAAAAAA6sowDH3wwQeaOnWq3njjDaWlpWn69OlVHh8bG+vxTDfccINWrlzpLGDy9fXVtddeW+053ngeffr00dKlS3XNNdcoOztbzz33nJ577rkKx91999168skna+zrj3/8o6ZMmVJpMZXVatWCBQs0aNCgSs+fNm2agoODNW3aNGVlZWnGjBmaMWNGpcdarVYFBATU4hkCKC8/P1/S6XuMr2/TLwFqtHNJlZSUSJL8/PxMTgIAAAAAAAAAAAAAMIufn59ee+01bdq0Sffcc4969eql8PBwWSwWhYeHq0+fPrrtttv0r3/9S9u3b/d4nquvvlr+/v7Ox5dccoliYmJqPM8bz+OSSy5RamqqHnnkEfXp00dhYWHy9/dXhw4ddMMNN+i7777TK6+8Uqtlp26//XZ99913uvbaaxUfHy+r1aq2bdvqpptu0oYNGzRu3Lhqz580aZL27Nmjxx9/XEOGDFGrVq3k6+ur4OBgde3aVX/4wx/0xhtv6NChQ0pMTKzX8wVasvL1NH5+fnI4HCalcY9GW4a1ceNGSarVzR4AAAAAAAAAAAAA0Lz16tVLL730Up3Oeeyxx/TYY4/VeNzIkSNr/eF/RESECgsL65TjTPV5HpI0ceJETZw4scbjYmJi9I9//EP/+Mc/6pHO1XnnnacPPvig3ue3bt1ajz76qB599NEGZwHgqnwRk2EYstvtJqVxD48UMS1cuLDS9n//+99av359tecWFRUpLS1Nb731lgzD0IABAzwREQAAAAAAAAAAACYpLS1VUFCQbDabSktLzY4DAADQ5FS2shlFTJWYOHGiDMNwaXM4HPp//+//1boPh8MhHx8fTZ061d3xAAAAAAAAAAAAYKLCwkKdc845kqRNmzbJYrFoyJAhFT5fAgAAQOUsFot8fHxcCsJtNpuJiRqu5oUu68nhcDj/VNZW3R8/Pz8NGTJEn376qUaMGOGpiF7x22+/6f7771e3bt0UHBysqKgoDRgwQDNmzFB+fr7bxvn88881ZswYtWvXTv7+/mrXrp3GjBmjzz//vNZ92Gw2vfHGGxo2bJhiYmIUGBioLl26aPLkydq6davbsgIAAAAAAAAA0FQ0pff5m5LyH7D5+PhQwAQAAFBH5WdjaupFTB6ZiWnv3r3ObYfDoc6dO8swDH355ZdKSkqq8jzDMBQQEKDo6GhZLBZPRPOqpUuX6sYbb1R2drazLT8/X+vXr9f69es1Z84cLVu2TImJifUeo7S0VHfccYfmzp3r0n7o0CEdOnRIS5Ys0e23365Zs2bJx6fqmrXjx48rOTlZ69atc2nfs2ePZs+erQULFuiVV17R7bffXu+sAAAAAAAAAAA0JU3pff6mpvwHbJUthwIAALzr8LffauPzz+vYzp0qKSiQX2CgYs46S33+9Ce1uegis+OhEn5+fioqKnI+poipEh07dqy0PT4+vsp9zc2GDRt03XXXqaCgQCEhIXr44Yd1wQUXqKCgQO+//77efPNN7dq1S6NHj9b69esVGhpar3H+8pe/OH+x6du3r6ZPn64uXbooLS1NzzzzjDZs2KA5c+YoJiZG//znPyvtw263a8yYMc4CprFjx2rSpEmKiorSTz/9pCeeeEJHjx7V5MmT1bZtW/3+97+v3w8FAAAAAAAAAIAmoim9z98U2e12l8cUMQEAYJ6Dy5ZpxbRpOpKaWmHfkbQ0bVm+XG0SEzXyhRfUbvRoExKiKszEVA9nrr/XUkydOlUFBQXy9fXVV199pcGDBzv3XXjhhUpKStL06dO1a9cuPffcc3rsscfqPMauXbv07LPPSpL69++v1atXKzAwUJI0YMAAXXHFFRoxYoTWr1+vGTNm6NZbb6302yALFizQ999/L0m666679Oqrrzr3DRw4UL///e917rnnKjs7W/fee6+2b98uX1+vXDoAAAAAAAAAAJiiKb3P3xQxExMANE779u0zOwK8bNfs2Vp2992y11D8cjg1VYuvukqjX31VXe+4w0vpUJPmVsTUfOYdbUTWrl2r7777TpJ02223ufxiU+b+++9X9+7dJUkvvviiSkpK6jzOCy+84LwAX375ZecvNmWCgoL08ssvSzp9oc6cObPSfsp+QYqKitKMGTMq7E9MTNTDDz8sSUpNTdUnn3xS56wAAAAAAAAAADQVTe19/qaIIiYAAMx3cNmyWhUwlbHbbFp29906uGyZh5OhtihiQo2WLFni3L7lllsqPcbHx0c33XSTJCkzM1MrVqyo0xgOh0P//ve/JUndunXTeeedV+lx5513ns466yxJ0r///W85HA6X/bt27dL27dslSddee62CgoIq7WfixInObYqYAAAAAAAAAADNWVN6n7+poogJAADzrZg2rdYFTGXsNptWTpvmmUCos/Kvocov2dvUuHVNsFtvvVWSZBiGc/3mM9vro3xfTUHZ0mzBwcE699xzqzxuxIgRzu2UlBRd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dfhnu94fg8+4HrlHeAGvI8r369bXkY3w31zz6tcz3TYmZ16PjuAY13ukV3CPoF/Xfkt9PfC7NveIJsxD9wjATZra+/xNla+v60dUTX3pEwAAmpre992nLcuX1/v8Pvfd58Y0wGne/YpLCxAQEKDo6NPfIjp48GC1x546dcr5i0f79u3rNM6Z35yoaZwzp4otP059+jEMo07f3AAAAAAAAAAAoKloau/zN1XlZzOhiAkAAO+Ku/hitU5MrNe5bRIT1eaii9ycCHDzTEydO3d2Z3eSThfMpKWlub1fT+rRo4e+++47paamymazVfg2QZkdO3Y4t7t3717nMSrrp67jlO+nT58+NfbTvn17plwGAAAAAAAAADRbTel9/qaqVatWWr9+vWw2m6644gpn4RgAAPCeC154QYuvukp2W+2XFrf4+WnkCy94LhRaNLcWMe3bt8+d3Uk6XcTU1AwdOlTfffed8vLy9PPPP2vQoEGVHrdq1Srn9pAhQ+o0RqdOnRQfH6/09HSXfiqzevVqSVLbtm2VkJBQIeuZecaNG1dpH4cPH9auXbvqlRUAAAAAAAAAgKakKb3P31SFhobq+PHjkqTg4GBZrVaTEwEA0PK0Gz1ao199VcvuvrtWhUwWPz+NfuUVtRs92gvp0BK5tYjp5ptvdmd3TdZVV12lJ598UpI0b968Sn+5KS0t1cKFCyVJERERuuCCC+o0hmEYuvLKK/X6669rx44d+vHHH3XeeedVOO7HH390fkPjyiuvrFAU1rVrV3Xv3l3bt2/Xhx9+qOeee05BQUEV+pk/f75ze8yYMXXKCgAAAAAAAABAU9KU3ucHAABoiK533KGgtm21cto0HU5NrfK4NomJGvnCCxQwwaPcWsQ0b948d3bXZA0cOFDDhg3Td999p7lz5+rmm2/W4MGDXY557rnntH37dknS1KlT5efn57J/5cqVzl94br75ZpciojLTpk3T7NmzZbfbdc8992j16tUKDAx07i8oKNA999wjSfL19dW0adMqzfvAAw/otttu08mTJzV9+nS98sorLvvT0tKcv6wlJiZSxAQAAAAAAAAAaNaa2vv8AAAADdFu9GjdOHq0Dn/7rTbOnKljO3eqJD9ffkFBijnrLPW57z61uegis2OiBXBrERP+58UXX9SQIUNUUFCgSy65RI888oguuOACFRQU6P3339fs2bMlnZ4J6f7776/XGF27dtWDDz6op556SuvXr9eQIUP00EMPqUuXLkpLS9PTTz+tDRs2SJIefPBBJSUlVdrPzTffrLfeekspKSl69dVXdfjwYU2aNEmRkZFau3at/u///k/Z2dny8fHRSy+9VOXa3wAAAAAAAAAANBdN6X1+AAAAd2hz0UW6lGIlmIhqFA/p27evPvjgA914443Kzs7WI488UuGYrl27atmyZQoNDa33OP/4xz909OhRvfXWW9qwYYPGjRtX4ZjbbrtNTzzxRJV9WCwWLVmyRMnJyVq3bp0++ugjffTRRy7H+Pv765VXXtHvf//7emcFAAAAAAAAAKCpaErv8wMAKkpISNBvv/1W5Wx4Znrsscf0+OOPS5IcDofJaQCg8fAxa2CHw6G0tDStW7dO69atU1paWrO7QV9++eX69ddfdd9996lr164KCgpSRESE+vfv7/z2RGJiYoPG8PHx0dy5c7Vs2TJdeeWVio+Pl9VqVXx8vK688kotX75cc+bMkY9P9X/VrVq10g8//KDXXntNQ4cOVXR0tAICAtS5c2dNmjRJP//8s26//fYGZQUAAAAAAAAAoClpSu/zN1WGYaikpES5ubkqLS01Ow4AAABM5PWZmL744gu99tprWrlypfLy8lz2BQUFaeTIkbrrrruazYw/HTt21PPPP6/nn3++TueNHDmyTkVdycnJSk5Orms8F76+vpoyZYqmTJnSoH4AAAAAAAAAAGgumtL7/E2Jw+FQ//795evrqy1btkiSBgwYoKCgIJOTAU2P/fBhFf/8s+yHD8tRXCzDapWlTRtZzz1XljZtzI4HAECtea2IKT8/XxMmTNCSJUskVT4tXl5enpYvX67ly5friiuu0DvvvKPg4GBvRQQAAAAAAAAAAIAXGIZRoa2kpMSEJEDTZTt0SIVffin7gQMV9tkPHlTx+vWytG+vgFGj5Nu2rQkJAQCoG6/MPVpaWqrk5GQtWbJEDodDvr6+Gj16tB5//HG98cYbeuONN/T444/rsssuk5+fnxwOhz799FMlJyc3uyXmAAAAAAAAAAAAINlsNpfHFDEBtVeya5fy5s+vtIDpTPYDB5Q3f75Kdu3yUjLPSE9P15///Gf169dP4eHh8vPzU+vWrdWrVy+NHz9e8+fPV3Z2tqTTM+EZhqHffvtNkrRgwQIZhuHyZ+TIkS79nzp1SvPmzdONN96oHj16KCQkRFarVW3bttX48eP1zjvvqLi4uMp8+/btc/Y9f/58SdLHH3+s5ORkxcfHy9fXVyNHjtT8+fNlGIYef/xx57nlsxmGoX379rn15wcATYVXZmKaNWuWVq9eLcMwNGrUKM2ZM0dtq6j2PXTokCZNmqQvvvhC33//vd544w2WNwMAAAAAAAAAAGhmKGIC6sd26JDyFy+Wyv0bqvoEm/IXL1bwxIlNckam7777TpdddpmzSKnM0aNHdfToUW3ZskXvv/++WrVqpcsuu6xeY/Tt29dZ9HSmI0eO6MiRI1q1apXee+89LV++XG1qWKLP4XDopptu0ttvv12vLADQknmliGnBggWSTq9lvGzZMvn4VD0BVNu2bbV06VINGTJEa9eu1YIFCyhiAgAAAAAAAAAAaGbKFy1RxATUTuGXX9a+gKmMzabCL79UyK23eiaUhxQVFWncuHHKzs5WaGiopkyZogsuuECxsbEqLi7W3r179cMPP+iTTz5xnjNv3jzl5eVp1KhRSk9P15VXXqknnnjCpd/g4GCXx3a7XYMGDdJll12mvn37qnXr1iouLlZaWprmzZunFStWaMOGDRo3bpxWrlxZbeYXXnhBv/76q4YNG6YpU6aoa9euyszM1L59+3TVVVepf//+eu211/T6669LkjZv3lyhj6omBAGA5s4rRUzbt2+XYRi67777qi1gKmOxWPSnP/1J48aN0/bt272QEAAAAAAAAAAAAN7ETExorhwOhxz5+R7p2370aI1LyFV57oEDKtm7V5bYWDenkoygIBmG4fZ+U1JSlJ6eLkl69913K8y0dN5552n8+PGaOXOm8v/7M+/UqZMkyc/PT5IUERGhnj17VjvOf/7zHyUlJVVoHzRokC6++GK9//77+tOf/qRVq1bp22+/1UUXXVRlX7/++qtuuukm59Jx5UVERCj2jL+DmrIBQEvilSKmsptz165da31O2X8SnvjPDgAAAAAAAAAAAOZiJiY0V478fOU8+6zZMSqVv3ChR/oNfeABGeVmN3KHw4cPO7eHDx9e5XG+vr4KCwur9ziVFTCdady4cVq4cKE2btyoJUuWVFvEFBERoVdeeYXPuQGgHmqeFskNunTpIun0uqS1VXZs2bkAAAAAAAAAAABoPpiJCUBN4uLinNvz5s3zypgOh0OHDx/Wrl27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Z2RkaNu2bSoqKnJCVACAxqS4uFh//PGH0tPTK5S1bNlSkZGR9R8ULggkMQGotoKCAt1+++26+uqr9fHHH2v//v06c+aMcnJytGPHDs2cOVMdOnTQ0qVLK23r+PHj6tOnj6ZOnaqtW7cqNzdXubm52rhxox544AHdcsst5aa9laSbb75ZXl5ekqQFCxY4bL+4uFiLFy+WJA0ZMkRBQUFVupbc3Fzt2rVLr732WpWvxZ4VK1aoXbt2euGFF5SYmKisrCwVFhbq4MGD+vTTT3XllVfq/vvvr3Cdtnz00Ue6/PLL9dlnnyk1NVWFhYVKTU3VvHnzFBMTo0WLFjk8fubMmercubNef/117dixQ9nZ2SooKND+/fv13//+V7169dIzzzxT42sFAAAAAAAAADiXwWBQmzZt1L59+wplOTk52rp1q/Ly8pwQGQCgMcjPz9fWrVuVlZVVoaxdu3Zq164dy5vCLpKYAFSLxWLR8OHD9dlnn0mShg0bpk8++URr167V+vXr9cYbb6h169bKy8vT8OHDK53Z55ZbblFSUpIefPBBrVy5Ups3b9aCBQvUqVMnSdLSpUv1/vvvlzvGz89PN9xwgyTpq6++UkFBgd32ly1bplOnTkmS7rjjjipdyy+//KKlS5fqueeeq9a12JKYmKhhw4YpOztbbm5umjJlilatWqUNGzZo9uzZioqKkiS98847evzxxytta9KkSQoNDdVbb72l33//XatXr9ajjz4qDw8PFRYW6o477rAb54wZM/TII4+ouLhYl156qd599139+OOP2rRpk+bPn68+ffrIYrHo+eef15tvvlntawUAAAAAAAAANBxhYWGKjo6Wq6truf0FBQXaunWr9bNzAABqU2FhYYX7t66ururatatatmzppKhwoTA6OwCgvp3MLazxsT4eRnm6udosO5VXJIvFUqN2vdxd5e1u++V4Or9I5pKqtdvE16NG56+ODz74QN9//73c3Ny0ZMkSXXfddeXKL7vsMt1555268sortXPnTj300EMOl0vbuHGjVqxYof79+1v39ejRQ4MHD1bnzp11/PhxzZo1SxMnTix33B133KHPP/9c2dnZ+u677zR8+HCb7ZfO1OTv76+hQ4dW6VrMZrPS09PVs2dP3Xvvverfv3+VrsWWCRMmqKioSK6urvruu+80aNAga1lcXJxGjBihvn37KikpSTNnztTo0aPVpUsXm21t27ZNERER+u2338qtEXvVVVdp8ODBGjRokIqLi3Xfffdpw4YN5Y5NSkrSk08+KUl69tln9eyzz5bLcO7Zs6dGjhypMWPG6NNPP9WTTz6pO++8s8LMVQAAAAAAAACAC0dwcLC6d++u7du3q7Dwr/sjZrNZ27dvV4cOHdSiRQsnRggAuNgEBQWpQ4cO+vPPPyVJHh4e6tq1q3x9fZ0cGS4EJDGh0en57x9rfOxzN3bR6D6RNssGvrZap/Jqto70P69prynXdrBZNuK99dqTnluldg68fH2Nzl9VFotF06dPlyQ9+OCDFRKYSgUFBWnGjBkaMmSI1q5dqz179tictlaSHnjggXIJTKWCg4M1btw4vfzyy9q+fbuysrIUEBBgLb/uuuvUpEkTnTx5UvPnz7eZxJSbm6slS5ZIkv7+97/L09OzTq/lXBs2bNDGjRslSffcc0+5BKay7c+ZM0d9+/ZVSUmJZs2apXfeecdum6+++mq5BKZSAwYM0D333KN3331XGzdu1KZNmxQbG1vuuOLiYsXGxlZIYCrl4uKit956S4sWLVJubq4WL16se+65p0rXCgAAAAAAAABomHx8fNSjRw/t2LFDOTk55cp2796t/Px8tWnThqV9AAC1pnnz5srPz1dmZqa6du0qD4+6n4wDFweWkwNQZUlJSUpJSZEkuzMflbrqqqus2+vXr7db79wl3srq2bOnpLMJR/v37y9X5ubmphEjRkg6u2Tc6dOnKxz/9ddf68yZMzbPUxfXcq4ff/wrYe7uu++2W++KK66wLp9X9phzBQUF6cYbb7Rbftddd9k8t3R2WT7pbDKXoz9EAwMDFR0dLal61woAAAAAAAAAaLjc3d3VrVs3NW3atEJZamqqkpKSarzaBAAAtkRFRSkmJoYEJlQLSUwAqmzTpk3W7T59+shgMNj9KTsd4LFjx+y22bFjR7tlwcHB1u1zvx0i/ZWYVFhYqMWLF1coL11KLiwsTAMGDKjytRiNRoWFhSksLExGo7HK13KuHTt2SDr7x2FMTIzDur1795Yk7dmzR0VFtmf06t69u4xG+xPoxcTEyN3dXZK0fft26/6DBw8qIyNDkvT44487fN4MBoP1sanOtQIAAAAAAAAAGjZXV1d16tRJ4eHhFco8PT2ZiQkAUC1FRUXWe5C2GAwGubq61mNEuBiQxASgytLT02t0XH5+vt0yb29vu2UuLn8NUWazuUL5FVdcoYiICEnS/Pnzy5Wlp6dbZyMaOXJkubZKy2vC0bWc69SpU5LOJmM5Sj6SZF0izmKxKDMz02ad0NBQh20YjUZr4lfpuaX6uVYAAAAAAAAAQMNnMBjUpk0bXXLJJdakpZCQELVp08bJkQEALiR5eXnaunWrkpKSdPLkSWeHg4uI47vqwEVo81MDa3ysj4f9l8yP/9evxlOternbz0BdNKmPzCUNYwrXsolES5cuVWRkZJWOqyz5pqYMBoNGjRqll156Sb/88ouOHDmili1bSpK++OILmUwmSbaXrHN0LWazuVwCUtkM4ZpcS219e6Wm7ZS91meeeca6DF9lfHx8anQ+AAAAAAAAAEDD1rx5c3l4eOjw4cPq2LEjszABAKosMzNTO3futN6DTE5OVkxMTLnVbYCaIokJjU4T37pZczPYx71O2g30rpt2a6JJkybW7cDAQHXt2tWJ0Zx1xx136KWXXlJJSYkWLlyof/3rX5L+WkquY8eO6tGjR4XjHF2L2Wy2zl4UGhpa42kOS2dFOnnypEwmk8PZmEqXbjMYDAoKCrJZ5/jx4w7PZzKZyiVflSp7rW5ubg3ieQMAAAAAAAAAOFdQUJDdz6MBALDl6NGj2r17d7l9ZrNZe/bsUUxMDEmxOG8sJwegyrp3727dXrt2rRMj+UuXLl3UrVs3SX8lLu3fv1/r16+XZHsWJql+rqU0WaioqEiJiYkO627YsEGS1L59e7m7205cS0xMtM4uZcu2bdtUVFRU7tyS1KZNGwUEBEhqOM8bAAAAAAAAAKBhy83N1b59+2q8CgUA4OJhsViUkpJSIYFJkvz8/NSlSxcSmFArSGICUGU9evRQq1atJElz5sxRQUGBkyM6qzRRaevWrUpOTrYmM0nSqFGjbB5TH9cycOBfSxd+9NFHduutX79eSUlJFY4516lTp7R06VK75WXPUbYdV1dXDRkyRJK0YsUKJScnVx48AAAAAAAAAKDRKioq0o4dO3T48GHt2LHDumQQAKDxMZvNSkpKUmpqaoWykJAQdevWze4kDUB1kcQEoMpcXFz0xBNPSJL27dun0aNHq7Cw0G797Oxsvf3223Ue1+23327N7J0/f74WLlwoSerTp4/atGlj85j6uJZevXopNjZWkvT+++/rp59+qlAnKytLEydOtMZ07733Omzz//7v/2wuK7d69WrNmTNHktSzZ0/FxcWVK3/88cfl6uqqkpISDR8+3OabjFJms1nz5893WAcAAAAAAAAAcHEym83asWOH9TPzU6dOKTEx0eFn6ACAi1NhYaG2bdumEydOVCgLDw9X586d5erq6oTIcLEyOjsAABeWSZMmaeXKlfr666+1aNEibdmyRRMnTlSvXr0UEBCg7Oxs7dq1SwkJCVqyZIk8PT11//3312lMrVq1Ur9+/ZSQkKB33nlHp0+flmR/KbnKrqVnz54ym83Kzc3V8ePH9csvv9T4Wt5//3317t1bRUVFGjJkiB544AENGzZMPj4+2rp1q15++WXt27dPkvSvf/2r3DJw5+rWrZuSkpLUs2dPPf744+rVq5cKCwv1ww8/6D//+Y9MJpOMRqPeeeedCsdGR0dr5syZmjJlipKSktS1a1dNmDBBV199tZo1a6aCggIdOHBA69ev1+LFi3X06FFt377dOlsVAAAAAAAAAKBxyMnJUW5ubrl9ubm52rJli7p27So/Pz8nRQYAqE+5ubnlklpLGQwGtW/fXi1atHBSZLiYkcQEoFoMBoM+//xz/fOf/9R7772nlJQUTZ061W790NDQeonrjjvuUEJCgjWByWg06tZbb3V4TH1cS0xMjJYuXaoRI0YoOztbr776ql599dUK9SZPnqyXXnqp0rbuv/9+3XvvvTaTqdzd3fXf//5XvXv3tnn8Qw89JB8fHz300EPKysrSjBkzNGPGDJt13d3d5enpWYUrBAAAAAAAAABcTAIDA3XppZdq586dMplM1v1FRUVKTExUp06dFBIS4sQIAQB17dSpU0pKSqqwnKjRaFTnzp0VFBTkpMhwsWM5OQDV5ubmplmzZmnbtm164IEHFB0drYCAALm6uiogIEAxMTG6++67tXjxYiUnJ9dLTMOHD5eHh4f1/4MGDVLTpk0rPc7Rtfj7+9fKtQwaNEh79+7VE088oZiYGPn7+8vDw0OtW7fWHXfcoTVr1ujtt9+Wi0vlQ/L48eO1Zs0a3XrrrQoLC5O7u7tatmyp0aNHa+vWrRo5cqTD4++55x7t27dP06ZN0xVXXKGQkBAZjUb5+PioQ4cO+vvf/6733ntPR44cUbt27Wp0vQAAAAAAAACAC1tgYKB69OghLy+vcvtLSkq0c+dOpaamymKxOCk6AEBdOnLkiLZv314hgcnT01Pdu3cngQl1ipmYANRYdHS03nzzzWofFx8fr/j4+Err9e/fv8p/BAUGBqqgoKDasZQqey1ms1np6emSzs6+5Ggd17Fjx2rs2LGVtt+0aVO98MILeuGFF2ocY6nLLrtMn3/+eY2Pb9asmZ555hk988wz5x3LuarznAEAAAAAAAAAGi4vLy91795dO3fuVFZWVrmylJQU5efnq3379jIYDE6KEABQ23Jzc7V3794K+/39/dWlSxe5u7s7ISo0JszEBAAAAAAAAAAAAKACNzc3XXrppWrWrFmFsqNHj2r79u3llpwDAFzYfH19FRUVVW5f06ZN1a1bNxKYUC9IYgIAAAAAAAAAAABgk4uLiy655BJFRkZWKMvMzFRiYuJ5rZQAAGhYwsPD1bx5c0lSRESEOnXqJBcXUktQP+hpAAAAAAAAAAAAAOwyGAzWG9nnLh+Xl5enLVu2KDs720nRAQBqk8FgUPv27RUdHa3IyEiWDUW9IokJAAAAAAAAAAAAQKVCQ0PVrVs3ubm5ldtfXFysY8eOOSkqAEBNFBUV2S1zcXFRcHBwPUYDnEUSEwAAAAAAAAAAAIAqCQgIUPfu3eXt7V1uX7t27ZwYFQCgqiwWi1JTU/X7778rKyvL2eEA5RidHQAAwLEDBw44OwQAAAAAAAAAAKy8vLzUvXt37dy5U4WFherSpYtcXJg7AQAaOovFor179yotLU2StHPnTnXv3l1eXl5Ojgw4iyQmAAAAAAAAAAAAANViNBoVHR2t4uLiCsvLAQAaHpPJpOTkZJ06dcq6r7i4WDt27FCPHj3k6urqxOiAs0hiAgAAAAAAAAAAAFBtLi4u8vDwsFteUFAgi8XCDB8A4GQFBQXasWOH8vLyKpSFhoYymx4aDJKYAAAAAAAAAAAAANQqk8mk7du3q7i4WF26dFFAQICzQwKARik7O1s7duxQcXFxuf0Gg0EdO3ZUaGiokyIDKiKdDgAAAAAAAAAAAECtKSkpUVJSkvLz81VcXKxt27YpPT3d2WEBQKOTkZGhbdu2VUhgcnNzU7du3UhgQoPDTEwAAAAAAAAAAAAAas3hw4eVmZlp/b/FYlFycrLy8vIUERHBskUAUMdKSkp0+PBhHThwiz18sQAAg3BJREFUoEKZt7e3unbtylKfaJBIYgIAAAAAAAAAAABQa1q2bKmsrKxyiUySdOjQIZ04cULt27dXYGCgc4IDgItcVlaW9uzZo7y8vAplgYGB6ty5s9zc3JwQGVA50pwBAAAAAAAAAAAA1Bqj0ajo6GiFhYVVKMvPz9e2bdu0a9cuFRUVOSE6ALg4FRcX688//1RiYqLNBKbmzZsrOjqaBCY0aMzEBAAAAAAAAAAAAKBWGQwGtWvXTl5eXkpJSalQfvz4cZ08eVJRUVFq0aKFDAaDE6IEgIuHxWJRRkaGzbKoqCiFh4cz1qLBYyYmAAAAAAAAAAAAALXOYDCoVatW6tGjh3x9fSuUm0wm7dmzR1u3blVOTo4TIgSAi4e7u7uioqLK7fPx8VFMTIxat25NAhMuCCQxAQAAAAAAAAAAAKgzfn5+6tGjh9q1aydXV9cK5Tk5OdqyZYv27t0rk8nkhAgB4OIQFhYmX19fubq6qm3bturZs6cCAgKcHRZQZSwnBwAAAAAAAAAAAKBOGQwGtWzZUk2bNlVKSorS09Mr1Dl69KhatWolo5FbmABgi8Vi0cmTJxUQECA3N7cK5QaDQR07dpTRaJSHh4cTIgTODzMxAQAAAAAAAAAAAKgX7u7u6tSpky699FJ5eXmVK4uIiJCnp6eTIgOAhu3MmTPasWOHdu7cqf3799ut5+PjQwITLlgkMQEAAAAAAAAAAACoV0FBQYqNjVVkZKRcXFzk7e2tVq1aOTssAGhwSkpKdPDgQW3atEmnTp2SdHbmuqysLCdHBtQ+kpgA4DzMmzdPBoNBBoNBBw4ccHY4AAAAAAAAAABcMFxcXBQREaHY2Fh17NhRLi62b12aTCbrjXsAaEwyMzO1adMmHThwQCUlJeXK9uzZI4vF4qTIgLrBgrIAAAAAAAAAAAAAnObcZeXOdfDgQaWmpiokJETt2rVjmSQAF72ioiKlpKQoPT3dZrm7u7tat25dz1EBdY8kJgAAAAAAAAAAAAANUm5urlJTUyVJJ06cUGZmpiIjI9WyZUsZDAYnRwcAtctisSgtLU379++X2Wy2Wadly5aKjIyU0Ui6By4+9GoAAAAAAAAAAAAADY7FYtGePXvK7TObzUpJSdGxY8fUvn17BQQEOCk6AKhdOTk52r17t3Jzc22W+/n5qX379vLz86vnyID6QxITAAAAAAAAAAAAgAapefPmys/Pl8lkKrc/Ly9PiYmJat68udq0aSM3NzcnRQgA58dkMmn//v1KS0uzWW40GhUVFaUWLVowAx0ueiQxAQAAAAAAAAAAAGhwDAaDWrRooZCQEO3bt0/Hjh2rUOfYsWM6efKk2rRpIy8vLydECQA1ZzKZtHHjRhUVFdksb9asmdq0aSN3d/d6jgxwDhdnBwDgwrVq1SqNGTNGbdq0kbe3t/z9/RUdHa1HHnnEbqawJMXHx8tgMFgzhQsKCjRjxgz16NFDfn5+8vPzU69evfT2229X+GaFJH388cfW41euXFlpnBMnTpTBYJCHh4cyMzMrvRY/Pz916NBBV199taZOnerwWqoqIyNDTz31lLp3767AwEB5enoqMjJSd955p3799VeHx0ZGRspgMGjs2LGSpI0bN+r2229XeHi4PD09FR4ernHjxmnXrl1VimXv3r2aMmWKoqOjFRAQIC8vL7Vp00Zjx47Vpk2bzvdSJUlnzpzRiy++qG7dusnHx0dNmjTRFVdcoffff18lJSVKSEiwPocJCQm1ck4AAAAAAAAAwMXJzc1Nl1xyiWJiYuTj41OhvLi4WH/++af27NlDIhOAC4rRaFRISEiF/d7e3urWrZs6duxIAhMaFWZiAlBtBQUFGjdunD777LMKZTt27NCOHTv07rvvauHChRo2bJjDto4fP67rrrtOiYmJ5fZv3LhRGzdu1IoVK/TNN9/IxeWvnMubb75ZkyZN0pkzZ7RgwQJde+21dtsvLi7W4sWLJUlDhgxRUFBQla9l165d2rVrl2bPnl2la7FnxYoVGjFihLKzs8vtP3jwoA4ePKhPP/1UkydP1ptvvlnuOm356KOPNHHixHLJXampqZo3b54WLlyoTz75RCNGjLB7/MyZM/XEE0+ouLi43P79+/dr//79+vjjj/XUU0/pueeeq8GVnnXs2DFdffXVSk5Otu7Lz8/XunXrtG7dOn355Zf6v//7vxq3DwAAAAAAAABonAICAtSjRw8dOXJEBw4cUElJSbnyvLw8RUdH69ixYzKbzU6KEgCqJyoqShkZGSouLpaLi4siIiLUqlWrSu8bAhcjej2AarFYLBo+fLg16WfYsGH65JNPtHbtWq1fv15vvPGGWrdurby8PA0fPrzSmX1uueUWJSUl6cEHH9TKlSu1efNmLViwQJ06dZIkLV26VO+//365Y/z8/HTDDTdIkr766isVFBTYbX/ZsmU6deqUJOmOO+6o0rX88ssvWrp0qZ577rlqXYstiYmJGjZsmLKzs+Xm5qYpU6Zo1apV2rBhg2bPnq2oqChJ0jvvvKPHH3+80rYmTZqk0NBQvfXWW/r999+1evVqPfroo/Lw8FBhYaHuuOMOu3HOmDFDjzzyiIqLi3XppZfq3Xff1Y8//qhNmzZp/vz56tOnjywWi55//nm9+eab1b5W6eyUl0OHDrUmMA0aNEhff/21Nm3apK+++koDBw7U//73Pz311FM1ah8AAAAAAAAA0Li5uLgoPDxccXFxNmcvcXFxUVhYmJKTk22u9gAAzmKxWGzuNxqNatu2rZo0aaK4uDi1bt2aBCY0WszEhMYn70TNj3X3kdzsTEOad1KS7V88lXLzOtu2LfmnJEuJ7bJz+VR8s17bPvjgA33//fdyc3PTkiVLdN1115Urv+yyy3TnnXfqyiuv1M6dO/XQQw85XC6tdLal/v37W/f16NFDgwcPVufOnXX8+HHNmjVLEydOLHfcHXfcoc8//1zZ2dn67rvvNHz4cJvtL1iwQJLk7++voUOHVulazGaz0tPT1bNnT917773q379/la7FlgkTJqioqEiurq767rvvNGjQIGtZXFycRowYob59+yopKUkzZ87U6NGj1aVLF5ttbdu2TREREfrtt9/UvHlz6/6rrrpKgwcP1qBBg1RcXKz77rtPGzZsKHdsUlKSnnzySUnSs88+q2effda6nJ8k9ezZUyNHjtSYMWP06aef6sknn9Sdd95ZYeaqysyePVubN2+2Xvvs2bPLnePmm2/W3XffrY8++qha7QIAAAAAAAAAUJanp6e6dOmikydPau/evRW+8Ozr6yujkVuhAJyvoKBAKSkp8vf3V0BAgM06oaGhatasWT1HBjQ8/OZG4zOjbc2PHTJT6nWP7bJ34qT8kzVrt99j0gA7s/DM/ZuUsatq7cRn1ez8VWSxWDR9+nRJ0oMPPlghgalUUFCQZsyYoSFDhmjt2rXas2eP2rdvb7PuAw88UC6BqVRwcLDGjRunl19+Wdu3b1dWVla5X+rXXXedmjRpopMnT2r+/Pk2k5hyc3O1ZMkSSdLf//53eXp61um1nGvDhg3auHGjJOmee+4pl8BUtv05c+aob9++Kikp0axZs/TOO+/YbfPVV18tl8BUasCAAbrnnnv07rvvauPGjdq0aZNiY2PLHVdcXKzY2NgKCUylXFxc9NZbb2nRokXKzc3V4sWLdc89dvq7HbNmzZIkNWvWTP/5z39s1nnjjTe0dOlSZWRkVKttAAAAAAAAAADO1aRJEwUGBurQoUM6fPiwLBaLTCaTWrZs6ezQADRyJSUl5Za/zMzMVMeOHW3WtXXvDmiMmIMMQJUlJSUpJSVFkuzOfFTqqquusm6vX7/ebr1zl3grq2fPnpLOJhzt37+/XJmbm5tGjBgh6eyScadPn65w/Ndff60zZ87YPE9dXMu5fvzxR+v23XffbbfeFVdcYV0+r+wx5woKCtKNN95ot/yuu+6yeW7p7LJ80tlkLkdvggIDAxUdHS2petcqSUePHlVSUpIk6dZbb5W3t7fNer6+vrr11lur1TYAAAAAAAAAAPa4uroqKipKHTt2VFZWlg4dOiQ3NzdnhwWgEcvKytKWLVu0b98+lZScXXXHbDbryJEjTo4MaNhIYgJQZZs2bbJu9+nTRwaDwe6Pr6+vte6xY8fstmkv21g6OxtTqZycnArlpYlJhYWFWrx4cYXy0qXkwsLCNGDAgCpfi9FoVFhYmMLCwmQ0Gqt8LefasWOHJMnd3V0xMTEO6/bu3VuStGfPHhUVFdms0717d4dT38bExMjd3V2StH37duv+gwcPWmc9evzxxx0+bwaDwfrYVOdazz1nXFycw7q9evWqVtsAAAAAAAAAAFTG09NTycnJSk9Pt1vn6NGjSk5OtvtZPACcj+LiYv35559KTExUXl5ehfLc3FySLAEHSGICUGWO3vQ7kp+fb7fM3mw90tnlzUqZzeYK5VdccYUiIiIkSfPnzy9Xlp6ebp2NaOTIkeXaKi2vCUfXcq5Tp05JOpuMVdm626VLxFksFmVmZtqsExoa6rANo9FoTfwqPbdUP9d67jkri5U1fQEAAAAAAAAA9a2oqEj79u1Tenq6Nm7cqLS0NFksFmeHBeAiYLFYdPToUW3YsMHuRAEtWrRQp06dVFxcXM/RARcOx3fVgYvRIyk1P9bdx37Z5I2SavhG183Lftm4ZZKlpGbt1rKyiURLly5VZGRklY6rLKGlpgwGg0aNGqWXXnpJv/zyi44cOWJd4/qLL76QyWSSZHvJOkfXYjabyyUgubq6Wstqci21tYZtTdspe63PPPOMdRm+yvj4OOjvlWDdXgAAAAAAAABAQ7Nv3z7rvQOTyaQ9e/bo2LFjat++vfz8/JwcHYALVW5urvbs2aPs7Gyb5b6+vmrfvr38/f3t1gFwFklMaHx8Quqo3SZ10653cOV16kmTJn9dY2BgoLp27erEaM6644479NJLL6mkpEQLFy7Uv/71L0l/LSXXsWNH9ejRo8Jxjq7FbDZbZy8KDQ0tl8RUHaWzIp08eVImk8nhbEylGdkGg0FBQUE26xw/ftzh+UwmU7nkq1Jlr9XNza3OnreycVcWa2XlAAAAAAAAAADUpqKiIp08ebLC/pycHG3ZskVhYWGKioqqdGUFAChlMpl08OBBpaam2ix3dXVVZGSkWrZsyQQAQBWxnByAKuvevbt1e+3atU6M5C9dunRRt27dJP2VuLR//36tX79eku1ZmKT6uZbSZKGioiIlJiY6rLthwwZJUvv27eXu7m6zTmJiovUbIrZs27bNuoZ32USlNm3aKCAgQFLdPm/R0dHW7Y0bNzqsW1k5AAAAAAAAAAC1yd3dXXFxcXZXXEhLS9P69eu1e/du5ebm1nN0AC40Bw4c0G+//WY3galp06aKi4tTq1atSGACqoEkJgBV1qNHD7Vq1UqSNGfOHBUUFDg5orNKE5W2bt2q5ORkazKTJI0aNcrmMfVxLQMHDrRuf/TRR3brrV+/XklJSRWOOdepU6e0dOlSu+Vlz1G2HVdXVw0ZMkSStGLFCiUnJ1cefA2EhYWpU6dOkqRFixbpzJkzNuvl5eXpiy++qJMYAAAAAAAAAACwx93dXZ06ddKll14qLy+vCuUlJSU6evSoNm/erK1btyo9PV0lJSVOiBRAQ2exWGQ2myvs9/LyUnR0tDp37iwPDw8nRAZc2EhiAlBlLi4ueuKJJySdXTd69OjRKiwstFs/Oztbb7/9dp3Hdfvtt1szmOfPn6+FCxdKkvr06aM2bdrYPKY+rqVXr16KjY2VJL3//vv66aefKtTJysrSxIkTrTHde++9Dtv8v//7P5tLsa1evVpz5syRJPXs2VNxcXHlyh9//HG5urqqpKREw4cPt5sVLp1dTm/+/PkO69hTGv+xY8f08MMP26wzZcoU63J9AAAAAAAAAADUt6CgIMXGxioyMlIuLrZvl2ZnZys5OVm//fab9u/fr+Li4nqOEkBDFhYWVu7/BoNBERERio2NVXBwsJOiAi58LOoKoFomTZqklStX6uuvv9aiRYu0ZcsWTZw4Ub169VJAQICys7O1a9cuJSQkaMmSJfL09NT9999fpzG1atVK/fr1U0JCgt555x2dPn1akv2l5Cq7lp49e8psNis3N1fHjx/XL7/8UuNref/999W7d28VFRVpyJAheuCBBzRs2DD5+Pho69atevnll7Vv3z5J0r/+9a9yy8Cdq1u3bkpKSlLPnj31+OOPq1evXiosLNQPP/yg//znPzKZTDIajXrnnXcqHBsdHa2ZM2dqypQpSkpKUteuXTVhwgRdffXVatasmQoKCnTgwAGtX79eixcv1tGjR7V9+3brbFVVde+992ru3LnaunWr3n33Xe3fv1+TJk1SeHi4Dh8+rFmzZmnFihWKjY3Vpk2bqtU2AAAAAAAAAAC1xcXFRREREQoNDdX+/fuVkZFhs15xcbEOHz5c7c/LAVy4LBaLTp8+rbS0NLVt21aenp4V6nh4eCgkJEQnTpxQSEiIoqKi5O3t7YRogYsLSUwAqsVgMOjzzz/XP//5T7333ntKSUnR1KlT7da3t7Z0bbvjjjuUkJBgTWAyGo269dZbHR5TH9cSExOjpUuXasSIEcrOztarr76qV199tUK9yZMn66WXXqq0rfvvv1/33nuvzWQqd3d3/fe//1Xv3r1tHv/QQw/Jx8dHDz30kLKysjRjxgzNmDHDZl13d3ebb8gqYzQa9d133+nqq6/Wn3/+qeXLl2v58uXl6gwaNEgPP/ywBg8eXO32AQAAAAAAAACoTV5eXurcubMKCwt19OhRHT16VEVFReXqhIaGys3NzUkRAqgvJpNJx44dU1pams6cOSNJ8vb2VlRUlM36UVFRdpOcANQMy8kBqDY3NzfNmjVL27Zt0wMPPKDo6GgFBATI1dVVAQEBiomJ0d13363FixcrOTm5XmIaPnx4uXVlBw0apKZNm1Z6nKNr8ff3r5VrGTRokPbu3asnnnhCMTEx8vf3l4eHh1q3bq077rhDa9as0dtvv213ytqyxo8frzVr1ujWW29VWFiY3N3d1bJlS40ePVpbt27VyJEjHR5/zz33aN++fZo2bZquuOIKhYSEyGg0ysfHRx06dNDf//53vffeezpy5IjatWtXo+sNCwvT1q1b9e9//1tdu3aVl5eXAgMDddlll2nWrFlatmyZ3N3da9Q2AAAAAAAAAAB1wcPDQ5GRkerdu7c6deqkgIAAa9m5y0aVdfz4ceXk5NRHiADqSE5Ojv7880+tX79eKSkp1gQmSTp69KhKSkpsHuft7U0CE1DLmIkJQI1FR0frzTffrPZx8fHxio+Pr7Re//79ZbFYqtRmYGCgCgoKqh1LqbLXYjablZ6eLunstytcXV3tHjd27FiNHTu20vabNm2qF154QS+88EKNYyx12WWX6fPPP6/x8c2aNdMzzzyjZ5555rxjscfLy0tPPvmknnzyyTo7BwAAAAAAAAAAtc3FxUWhoaEKDQ1VXl6eTp48KT8/P5t1zWaz9uzZI7PZLD8/P4WFhalp06YO7ysAaBhKSkqUkZGhI0eOOExELC4uVkZGhpo1a1aP0QGNF0lMAAAAAAAAAAAAAHAOHx8f+fj42C0/fvy4zGazpL9mcklJSVHz5s0VFhYmLy+v+goVQBWdOXPGunSkyWRyWNfb21thYWFq0qRJPUUHgCQmAAAAAAAAAAAAAKgGi8WitLS0CvtNJpNSU1OVmpqqoKAgawKEwWBwQpQApLOv11OnTiktLU2nTp1yWNdgMCgkJERhYWEKCAjgtQvUM5KYAAAAAAAAAAAAAKAaLBaLmjZtKpPJpMLCQpt1MjMzlZmZKQ8PD7Vo0UItWrSQu7t7PUcKoLCwUDt27HBYx93d3fo69fDwqKfIAJyLJCYAAAAAAAAAAAAAqAYXFxdFRESodevWOnnypNLS0pSZmWmzbmFhoQ4cOKCDBw+qadOmCgsLk7+/PzO8APXE09NTTZo00cmTJyuUBQYGWmdMc3FxcUJ0AMoiiQkAAAAAAAAAAAAAaqB06amQkBDl5+fr6NGjOnbsmEwmU4W6FotF6enpSk9PV3h4uNq0aeOEiIGLk9lsVn5+vvz8/GyWh4WFWZOYXF1d1bx5c4WFhcnb27s+wwRQCZKYAKCBO3DggLNDqHX9+/eXxWJxdhgAAAAAAAAAANQab29vtW3bVpGRkcrIyNCRI0eUm5trs25ISEg9RwdcnPLz85WWlqZjx47JxcVFl112mc0ZlYKCghQSEqLg4GCFhobK1dXVCdECqAxJTAAAAAAAAAAAAABQS0pneWnevLmys7OVlpamjIwMlZSUSJJ8fX3tzhZTWodlrQD7LBaLTpw4obS0NJ0+fdq632w268SJEwoNDa1wjMFgUJcuXeoxSgA1QRITAAAAAAAAAAAAANQBf39/+fv7q23btjp27JjS0tIUFhYmg8Fgs/6xY8d08OBB61JXHh4e9Rwx0HAVFhbq6NGjOnr0qIqKimzWSUtLs5nEBODCQApvHcrPz9crr7yiuLg4BQcHy8fHRx07dtTDDz+sgwcPnnf7kZGRMhgM1fqxtSxVfHx8lY9PSEg477gBAAAAAAAAAACAxsTNzU3h4eHq1auXmjVrZrOOxWJRWlqaioqKdOjQIf3222/auXOnMjMzZbFY6jlioGGwWCw6ffq0kpKS9Pvvv+vgwYN2E5ikszOhlc5oBuDCw0xMdWTv3r0aMmSI9uzZU27/n3/+qT///FMffPCB5s+fr6FDh9ZbTAEBAWrevHm9nQ8AAAAAAAAAAADAX0onDrAlOztbeXl55fadOHFCJ06ckJeXl8LCwtS8eXMZjdzixcXPZDLp+PHjSktLU35+vsO6RqNRLVq0UIsWLeTl5VVPEQKoC/yGqwM5OTm6/vrrrQlM99xzj0aOHCkvLy+tWrVKL730krKzs3Xbbbdp7dq1iomJqdF5VqxY4TDLVJJ+/PFHTZkyRZJ06623ytPT02H97du3OyyPioqqXpAAAAAAAAAAAAAAKpWZmWm37MyZM0pJSdH+/fsVGhqq5s2by8/PTy4uLLyDi09aWppSUlIqnVHJ399fYWFhatq0Ka8F4CJBElMdmDFjhnbv3i1JeuWVV/TII49Yy/r06aP+/furX79+ys/P10MPPVTjJdo6dOhQaZ3nn3/euj169OhK63ft2rVGsQAAAAAAAAAAAACoucjISIWEhCgtLU3Hjx+3mcBRUlKiY8eO6dixY3JxcZGfn58CAgIUGBiowMBAu7M8ARcST09PuwlMLi4uatasmVq0aCE/P796jgxAXSMdsZYVFxfrzTfflCR16tRJDz/8cIU6l19+ue6++25J0urVq7Vx48Y6iSUrK0tLliyRJLVp00Z9+/atk/MAAAAAAAAAAAAAOH++vr7q0KGD+vTpo3bt2snb29tu3ZKSEmVlZenQoUNKTk6uxyiBmikuLtbJkyeVkpKiLVu26NSpUzbrBQUFVVgWzsvLS23btlWfPn3UoUMHEpiAixQzMdWyVatWKSsrS5I0ZswYu9PWjR07VrNnz5Ykff3114qLi6v1WL744gsVFBRIqtosTAAAAAAAAAAAAACcz2g0qmXLlgoLC1NWVpbS0tJ04sQJWSwWm/UDAgLszsJ06tQpmUwmBQQEyMPDoy7DBsopLCxUVlaW9ScvL69ceVZWloKDgyscZzAY1KJFC+3bt08hISEKCwtjpjGgkSCJqZb9+uuv1u1+/frZrRcbGytvb2/l5+dr7dq1dRLLxx9/LOnsIH/nnXfWyTkAAAAAAAAAAAAA1A2DwWBdKq6wsFDHjh1TRkZGhWSQgIAAu22kpqYqMzNT0tllugICAqw/Xl5eJIagVlgsFhUUFFgTlk6fPm2dcMOe06dP2y1r0aKFQkNDSbwDGhmSmGpZUlKSdbtjx4526xmNRrVr105//PFHnUzvuH//fmtyVN++fdWmTZsqHTdo0CAlJibq9OnTCgwMVOfOnXXddddp4sSJCgoKqnE8qampDsuPHj1q3c7Ly1N2dnaV2zaZTCopKZHFYpHZbK5xjECpsv2IPtW4WCwWlZSUyGQyVWscqmu5ubk2twFnoD+iIaE/oqGhT6IhoT+ioaFPoiE596YvAAAXCg8PD0VERCgiIkLFxcXKzs7W6dOnlZWVpcDAQJvHWCyWcp93FxQUqKCgQMePH5ckubm5KSAgQIGBgQoICJCPjw9JTaiW9PR0nThxQllZWSoqKqrWsTk5OSopKbG5upHRaJTRSDoD0Njwqq9lpck6Pj4+dt8slAoPD9cff/yhjIwMFRYW1moW6ccff2ydTrI6S8mtXLnSup2RkaHVq1dr9erVmj59uubNm6cbb7yxRvGEh4dXue5XX33lMFv8XDExMQoICJCvr6/S09NrEh5g18mTJ50dAupRUVGRcnNzlZWVpSVLljg7HJs++eQTZ4cAWNEf0ZDQH9HQ0CfRkNAf0dDQJ+FsWVlZzg4BAIDz5ubmpiZNmqhJkyYO6+Xm5jr8wnZxcbFOnDihEydOSJJcXV3LzdTk5+dnM8EEKJWZmamMjIwq13dxcZGfn5+1jwFAWSQx1bKcnBxJkq+vb6V1fXx8rNu5ubm1msRU+mGQl5eXbr311krrR0dH66abblKvXr0UFham4uJi/fnnn5o/f75WrFih06dP6+9//7uWLl2qv/3tb7UWJwAAAAAAAAAAAIC6ExwcrOzsbJlMpkrrms1mnTp1SqdOnZIktWvXTi1btqzrENEAmc1mZWdnKysrSyaTSe3atbNZLyAgQMeOHbPbDolxAKqDJKZaVrqup7u7e6V1yyYtnTlzptZiWLdunVJSUiRJN954o/z9/R3Wf+ihhxQfH19hf+/evTV69GjNnj1bkyZNktls1vjx45WSkiJPT89qxXT48GGH5UePHlWvXr0kSbfccos6dOhQ5baPHDmikpISubm5KTQ0tFpxAbaYzWbrDExNmjSRq6urkyNCfcnJybFm//fp08fZ4Vjl5uZak1PvvPPOKiXKAnWF/oiGhP6IhoY+iYaE/oiGhj6JhmT37t166aWXnB0GGrjc3Fxt2bJFGzZs0IYNG7Rx40YdOHBAkhQREWHdrk3r1q3TrFmztGbNGh0/flyBgYHq1q2bxo4dq9tvv73WzwegcfDz81N0dLQsFovy8vKUlZVl/anK0l/2ZsqxWCw6efKkAgIC5ObmVtthwwnOXaIwNzfXuvKPwWBQVFSUzXtm5/aR0iUKS5cpZIlCANXRaJOYamOgnDt3rsaOHVtuX2lyT1V+6RcWFlq3vby8zjueUh9//LF1e8yYMZXWr2zZu4kTJ2rjxo368MMPlZaWpi+//FJ33HFHtWJq1apVlev6+PhUmnhV1vHjx2UymWQwGEg2QY3NmzdP48aNkyTt3btX3t7eks5mh9dWvzpw4ICioqIk2R4/Lmbx8fGaNm2aJFnf8FZX6bj97LPP2ky8rA0Gg0EuLi4yGo3VGofqk6+vb4ONDY0P/RENCf0RDQ19Eg0J/RENDX0SzlZ2hnzAnmHDhikhIaHezhcfH6/nn39eJSUl1n3Hjx/XihUrtGLFCs2fP1+LFy+u9heMAaCUwWCQr6+vfH191bJlS1ksFhUUFFgTmk6fPm2drKGU0Wi0+3szJydHO3fulHT2d2vZmXZqc/UZ1J3CwsJySW15eXl261osFuXk5Ni8r+zp6amwsDD5+voqICBAXl5eJC0BqLFGm8RUV/z8/CSd/ZZGZcr+Iqitb58VFhbqiy++kCS1aNFC1157ba20O3HiRH344YeSpNWrV1c7iQkAAAAAAAAAgAtF2S/iBQcHKzY2VuvWravSZ//VNXv2bOsXANu2basnnnhC0dHRSktL0xtvvKFVq1bp+++/11133aUFCxbU+vkBNE4Gg0FeXl7y8vJS8+bNJVVMavH09LSbjJKVlWXdzsvLU15entLS0iSdTWopm9REUkvDYDKZdOLECevzW92Vgk6fPm0ziclgMKh9+/a1FCWAxq7RJjElJyefdxstWrSosK9Vq1b6/ffflZeXZ3cgL1W6xFrTpk1rLSN56dKlyszMlCSNGjWq1maQ6dy5s3X7yJEjtdImgNpXdkap/fv3KzIy0rkBAQAAAAAAABegUaNGaeLEiYqLi1O7du0kSZGRkbWexHTq1Ck9+uijkqTWrVvrt99+U0hIiLV86NChuvnmm7V06VItXLhQEyZMUP/+/Ws1BgAo5eHhodDQUIWGhkpyvLJC2SSmcxUUFKigoEDHjx+XdHZ5scDAQPn7+8vDw0Oenp7WiSFQe0pKSqyr19ha4s9kMunPP/+sdrt+fn4KCAhQUFBQbYQJAA412iSmjh071km7nTt31pdffilJ2rVrly677DKb9Uwmk1JSUiRJnTp1qrXzV3cpuaoiOxqAs9V0GToAAAAAAACguiZMmFAv5/nggw+siQDTp08vl8AkSa6urpo1a5Z++OEHmc1mzZgxgyQmAPXG0f1Bg8EgFxeXcstg2lNcXKyMjAxlZGRIkpo0aaKuXbvarJuamqrc3Fy5ubnZ/TEajRf9vUuLxSKTyaTi4uJKf0wmk4qKimQ2myVJ4eHhatOmTYU2PTw85OHhocLCQrvndXFxsSYtlSae1dakGQBQFY02iamu9O3b17q9evVqu0lMmzZtsi4nd8UVV9TKuTMyMrR8+XJJUkxMjKKjo2ulXUlKSkqyboeFhdVauwAAAAAAAAAANFbffPONJMnf31+33HKLzTqtWrXSwIED9b///U8//fSTcnJymMEEgNN16dJFJSUlysnJKbcEXWkijSO2ZgkqlZmZqVOnTlWpjXN//Pz8bK6k42wWi0UlJSUVko+8vb3tjucbN26s9nJvpYqLi23uNxgMCggIUHp6unWfq6truaX//Pz85OLiUqPzAkBtIImplvXv318BAQHKysrSf//7X02dOtVmJvC8efOs2zfffHOtnHvhwoXWX0q1OQuTdHZN7lL9+vWr1bYBAAAAAAAAAGhsioqKtGHDBklSnz595O7ubrduv3799L///U+FhYXatGmTBgwYUF9hAoBdLi4u1uQX6WyyTl5eXrmkpqKiogrHOUpispeAY6veuXWLi4vtJjH9+eefOnXqlMMZns79qUoyz+nTp1VUVFTpbEm2VpsIDw+3m8RkNNb8Nr6jxzA4OFglJSXW583X1/ein9UKwIWFJKZa5u7urgcffFDPP/+8kpOTNXPmTD3yyCPl6qxfv14ffvihpLN/eMTFxdlsq/QXRkREhA4cOFDpuUuXkjMajRo1alSV4t2+fbu8vLysa3rbMmfOHH3wwQeSpObNm9da0hUuTPHx8Zo2bZqks29Gs7Oz9dprr+nLL7/U/v375e3trdjYWD311FO6/PLLrcelp6frzTff1Ndff60DBw7I09NTffv2VXx8vLp37+7wnCUlJVqwYIEWLFigLVu26NSpUwoICFDXrl01YsQIjR8/3uEf+NLZzP3p06frm2++0cGDB+Xn56dLL71UEydO1IgRIyq97tLX47PPPqv4+Hi79fr376/Vq1erX79+SkhIqLTdc+3YsUPffPON1qxZo507dyojI0Nubm5q0aKFLr/8ct177702Z3hLSEio8MFFVFRUhXqrVq2yOd30N998o/nz5+v3339Xenq6PD091a5dOw0bNkwPPvhgpescp6am6qWXXtKyZcuUlpam4OBgxcbG6sEHH9TAgQOr9yDYUdXnAAAAAAAAALgQ7N692zpjSceOHR3WLVuenJxcrSSm1NRUh+VHjx61bufk5Cg7O7vKbZ+P3Nxcm9vA+aBfNQx+fn7y8/NTy5YtVVRUpNzcXOXm5qqwsFAmk8l6f8kWR0udVcZRu3l5eSoqKrKZVGWPi4uLXFxcFBUVpf3799vsU7t27apxzHl5eXbjPZ/EooKCArvtenl5KTw8XNLZxysnJ6fG50HNME6hLjirX9XFGEISUx145JFH9Pnnn2v37t2aOnWq9u7dq5EjR8rLy0urVq3Siy++KJPJJC8vL73++uu1cs6kpCRt3rxZknTdddcpNDS0Ssdt3rxZ48eP14ABA/S3v/1N0dHRatKkiUwmk3bt2qX58+drxYoVks5OJzhnzhz5+PjUSsy48B0+fFgDBw7U7t27rfvy8vK0bNkyrVixQgsXLtSIESP0xx9/aMiQITpy5Ii1Xn5+vpYsWaL//e9/WrZsmd0/uk+dOqUbbrhBa9euLbf/xIkTSkhIUEJCgt5++20tW7ZMERERNttITk7WwIEDlZaWZt1XUFCgn376ST/99JPGjRunq6666nweilphKxFJOvuNrL1792rv3r36+OOP9dhjj+mll16qlXNmZmZq+PDh+vnnn8vtLyws1ObNm7V582bNmjVL3377rd3lMdesWaOhQ4eWe0N89OhRLV26VEuXLiXhCAAAAAAAALChbHJRq1atHNYtveEsnf1ctjrKHluZTz75xDqjSn365JNP6v2cuPjRry5MzZs3l4eHh4xGo9zc3GQ0Gq3brq6uDo/9448/9P3339ss69q1q3x9fasVS0lJiUpKSqyzItnqU126dKnxEp979+7VDz/8YLOsbdu2atq0qSTJbDbLZDKpuLjY4b9lt3/66acaxYT6xTiFulCf/SorK6vW2ySJqQ74+fnp+++/15AhQ7Rnzx7NmTNHc+bMKVfH399f8+fPV0xMTK2cs3QWJkkaPXp0tY41m8368ccf9eOPP9qt06RJE3344YcaNmxYjWPExWfEiBFKTU3V448/ruuuu07e3t769ddf9eyzzyo7O1t33323YmNjNXToUJ05c0YvvPCC+vXrJzc3Ny1fvlwvvPCCCgsLNXbsWO3Zs6fCbEpms1lDhw7V+vXrJZ2duez+++9XVFSU0tLS9NFHH+mbb75RcnKyrrnmGiUmJlZ4A5qdna3BgwdbE5huu+02jRkzRqGhodq9e7dee+01zZ07Vzt27KifB80Bk8kkHx8fXX/99br66qvVsWNH+fv7Kz09XTt37tSbb76pgwcP6uWXX1aHDh00btw467FxcXHavn27vv32Wz311FOSpP/9738KCwsrd46yszMVFhZq4MCB2rJli1xdXTVq1CgNGTJEUVFRKi4u1i+//KLXXntN6enpGjJkiLZu3VohUezQoUPWBCYXFxdNmDBBw4cPV0BAgP744w+9/PLLio+PV2xsbB0+cgAAAAAAAMCFp+w31yu7sV72y8XM2gDgYnbs2DG7ZQaDoUJiU9l/Hc0Icj7Ls5lMJrtlVV3+rlRJSYk12cjRDE6HDh3S4cOH7S5FBwAXK5KY6ki7du20detWvfPOO1q0aJH27t2roqIihYeHa8iQIfrnP/9pd9aY6iopKdH8+fMlSYGBgbrhhhuqfOyQIUP04Ycfav369dq6dauOHz+ukydPymKxKDg4WN26ddN1112nsWPHyt/fv1bidYaSEosy86s+PeSFLsjbXS4udb9+bWJiolavXq3evXtb98XGxqp9+/YaOnSocnJy1Lt3b1ksFm3YsEFt27a11uvVq5dCQkI0efJkHTp0SN9//32FpQrfe+89awLT6NGjNW/ePOv0mT179tSwYcP05JNP6sUXX1RKSoqef/55TZ8+vVwbzz//vPWbSS+++KIef/xxa1nPnj01fPhwDR061DrjmDPFxMQoNTVVgYGBFcoGDx6s+++/X0OHDtXKlSs1bdo0jR492vqtAx8fH3Xt2lWbNm2yHtOhQwdFRkbaPd9zzz2nLVu2KDAwUD/++KN69uxZrrxv376644471KdPHx09elRPPPGEdawp9fDDD1tnYPr00091++23W8tiY2M1YsQIXXnlleXiAgAAAAAAAHB2tvhS537B81weHh7W7TNnzlTrPJXN3HT06FH16tVLknTnnXeqZcuW1Wq/pnJzc60zBdx5553VniEFsIV+BXvy8/NVXFxsndXI1k9p2blKE5Vs9anU1FRlZ2dbE6tKf1xdXSvsMxqNcnFxOa+l4nDhY5xCXXBWvzpy5EitrSBUiiSmOuTj46OpU6dq6tSpNTq+qlm1Li4u1Z4+tlRoaKjuuusu3XXXXTU6/kKRmV+knv+2P9PUxWbzUwPVxNej8orn6aGHHiqXwFTq+uuvV0REhA4ePKiMjAy9++675RKYSo0bN04PP/ywCgoKtGbNmgpJTO+8844kqWnTpnr77bdtvqmbNm2avvrqK+3atUvvv/++nnvuOesf9EVFRfrwww8lSZdeeqkee+yxCse7ubnpww8/VJs2baqdLV/bQkJCHJa7u7trxowZiomJ0cGDB5WYmFgh8aiqcnNzrY/v888/b7ediIgIPf3007rvvvu0aNGicktKHjt2TF9//bUkaejQoeUSmEr5+flpzpw5NvsJAAAAAAAAcD5q4ybw3LlzNXbs2PMPpgY8PT2t20VFjr+EW3a2Di8vr2qdp7Kl6sry8/NzyheafX19L+gvUqNhol+hrKr2BYvFYp0pqbi4WFlZWdq2bZsk232qc+fOtR4rGg/GKdSF+uxXpZNd1CaXWm8RQKMxcuRIu2WXXnqppLMfJNx2220263h5eal9+/aSpH379pUrS0tLU3JysiTp1ltvtbuesNFotC6rlpmZqS1btljLNm/erMzMTEnSmDFj7H6o0apVKw0aNMjutThLYWGhDh06pKSkJO3YsUM7duwol9xY+qa5JlavXm1do3T48OEO61511VWSzn7TYPPmzdb9q1atktlslqRyS9udq1evXurSpUuNYwUAAAAAAAAuRmU/86xsibi8vDzrNjM2AEDdKV2yztvbWwEBAQoMDKz2DHgAgJpjJiYANdahQwe7ZaVLooWEhCgoKKjSeueuU7xjxw7rdmWz+JQt37Fjh/r06SNJ2r59u3V/XFycwzZ69eql77//3mGd+pCXl6c333xTn332mXbu3GlNErLlxIkTNT5P2eXdWrRoUeXjyq5FXd3Hd+fOndWIEAAAAAAAAHCs9EuQ56M6n43VtrIzJKWmpjqsW3Y1hvDw8DqLCQAAAHAmkpgA1Ji3t7fdMhcXl0rrlK13brLOqVOnrNuhoaEO22jevLnN46rTRrNmzRyW14cDBw7o6quv1v79+6tU/3wy/9PT02t0XH5+vnX7Qnt8AQAAAAAAcHHp2LGjs0M4Lx06dJCrq6vMZrN27drlsG7Z8k6dOtV1aAAAAIBTkMSERiHI212bnxro7DDqTZC3u7NDqFW1sbZ9bbRR1+68807t379fBoNB48aN08iRI9WpUyc1bdpU7u7uMhgMKikpkaurqySVW1quusomjW3ZskVubm5VOq7st8PKuhAeXwAAAAAAAKAhcXd3V69evbR+/XqtX79eRUVFcne3/dnu6tWrJUkeHh6KjY2tzzABAACAekMSExoFFxeDmvh6ODsMVENwcLB1+/jx4w7rll3irOxxZZexO378uMPl7yo7h8FgkMViUUlJicN6Zdemr45du3bp119/lSQ98cQT+ve//22zXtnZj85HkyZNrNtNmza1m5zkyLmPr6NprCt7fAEAAAAAAIDG6KabbtL69euVnZ2tr776SiNHjqxQJzU1VT/++KMk6ZprrpGfn199hwkAAADUCxdnBwAAtnTt2tW6/fvvvzusu2HDBpvHRUdHW7c3btzosI3Kyks/GMjMzLRbx2KxaO/evQ7bsWfnzp3W7dtuu81uvU2bNjlsp6ozInXv3t26vXbt2iodc67afHwBAAAAAACAi82BAwdkMBhkMBjUv39/m3XGjx+vgIAASdJjjz2mkydPlis3m8267777rDOrP/LII3UaMwAAAOBMJDEBaJDCwsKsa7t/8cUXys3NtVnPbDZr3rx5ks7ODNSjRw9rWc+ePa2zBX3yySd2l187cuSIVqxY4TCeqKgoSY6TiJYtW6bTp087bMcek8lk3XY0m9N7773nsB1PT0/rdmFhod16AwcOlLe3tyTpzTffrNHSdAMGDLAubfff//7Xbr2NGzdqx44d1W4fAAAAAAAAcJa9e/dq3rx55X5KP6PMzc2tUFZ2tvjqCA4O1vTp0yVJBw8eVO/evTV37lxt2rRJS5Ys0bXXXqulS5dKkm6//Xa7yVAAAADAxYAkJgAN1uTJkyVJGRkZevDBB23WmTZtmpKSkiRJ99xzjzw8/lo20MPDQ+PGjZMkJSYmasaMGRWON5lMuueee1RUVOQwln79+kk6OyuUrZmLjh07pgceeKAKV2Vb+/btrdulSVnnevfdd/Xtt986bKdFixbW7ZSUFLv1AgMDdf/990uS1q1bpylTpjhcKu/48eP64IMPKpzrxhtvlCQtWbJEX3zxRYXjcnNzNXHiRIcxAwAAAAAAAA3Nr7/+qnHjxpX7KZ0l6eTJkxXKdu3aVeNzTZw4Uc8884wMBoNSUlJ01113KS4uTjfeeKNWrVolSRoyZIg++uijWrk2AAAAoKEiiQlAgzVp0iT16dNHkjR37lxdc801+vLLL7VlyxZ9//33+vvf/67nn39ektS2bVs9/fTTFdp45pln1KpVK0nSo48+qlGjRmn58uXasmWLPvvsM11++eVatmyZYmNjHcYyYcIEGY1GWSwWDRs2TK+//ro2bdqkdevWacaMGerevbuysrLKJSNVR/fu3a1L4c2ePVu33XabvvvuO23evFnffvutRowYofvuu09XXHFFpe2Uzsb09NNPa+XKldq9e7f27t2rvXv36syZM9a6zz33nHr37i1JeuONN9SjRw+98847Wrt2rRITE7Vq1Sq9/fbbuummm9S6dWubs0C9+uqr1qX2Ro0apcmTJ2vVqlXavHmz5s6dq549e2rr1q2VPr4AAAAAAABAYzZt2jT9+uuvGjVqlMLDw+Xu7q7Q0FBde+21WrBggb7//vtys7ADAAAAFyOjswMAAHtcXV313Xff6YYbbtDatWv1888/6+eff65Qr1OnTlq2bJl8fX0rlAUEBGj58uUaOHCgjh07poULF2rhwoXl6owdO1b9+vWzztpkS5cuXfTKK6/o//7v/5SZmakpU6aUKw8ODtY333yjp59+Wnv27Kn2tRoMBn3yySe6+uqrlZmZqS+++KLCzEbR0dFatGiRwsLC7Lbj5+enBx98UK+88oq2bNmiQYMGlStftWqVdcppDw8PrVy5UmPHjtVXX32lbdu2WWdnssXf37/CvsjISC1ZskQ33HCDcnJyNGvWLM2aNatcndJvkTlaig8AAAAAAABoSMaOHauxY8eeVxuRkZGyWCxVrn/55Zfr8ssvP69zAgAAABcyZmIC0KAFBwfrl19+0ccff6zrrrtOzZo1k5ubm5o0aaL+/fvr7bffVmJioiIiIuy20aVLF+3cuVNTp05V+/bt5eHhoZCQEA0YMEALFizQ3LlzqxTLlClTtHz5cg0ePFhBQUHy8PBQVFSUJk+erK1bt+rKK688r2uNiYlRYmKiJk2apIiICLm5uSk4OFi9evXSzJkztWHDhnLLxdnz8ssv6/3339eVV16p4OBgubq62q3r5+enL7/8UmvWrNH48eN1ySWXyM/PT0ajUcHBwYqLi9PkyZP1ww8/aOXKlTbb6N+/v3bu3Kl7771XERERcnd3V7NmzXT99ddr+fLlmjZtWo0fEwAAAAAAAAAAAABA48BMTACqJT4+XvHx8ZXWmzdvnubNm1dpvYSEhErruLi46M4779Sdd95ZeYB2BAcHa/r06Zo+fbrN8rLfrDKbzUpPT7dZb/DgwRo8eLDd8zi6nqp886p169Z69913HdaprA2DwaDx48dr/PjxDuuV1bdvX/Xt27fK9c8VHh5eYQamsqrabxypzrfWAAAAAAAAAAAAAAAXFmZiAgAAAAAAAAAAAAAAAOBUJDEBAAAAAAAAAAAAAAAAcCqSmAAAAAAAAAAAAAAAAAA4FUlMAAAAAAAAAAAAAAAAAJyKJCYAAAAAAAAAAAAAAAAATkUSEwAAAAAAAAAAAAAAAACnIokJAAAAAAAAAAAAAAAAgFORxAQAAAAAAAAAAAAAAADAqUhiAgAAAAAAAAAAAAAAAOBUJDEBAAAAAAAAAAAAAAAAcCqSmAAAAAAAAAAAAAAAAAA4FUlMAAAAAAAAAAAAAAAAAJyKJCYAAAAAAAAAAAAAAAAATkUSEwAAAAAAAAAAAAAAAACnIokJAAAAAAAAAAAAAAAAgFORxAQAAAAAAAAAAAAAAADAqUhiAgAAAAAAAAAAAAAAAOBUJDEBAAAAAAAAAAAAAAAAcCqSmAAAAAAAAAAAAAAAAAA4FUlMACBp3rx5MhgMMhgMOnDgQJ2c48CBA9ZzzJs3r07O0VDFx8dbrx0AAAAAAAAAAAAAgHORxAQAAAAAAAAAAAAAAADAqUhiAoCLSH3MKAUAAAAAAAAAAAAAQG0jiQkAAAAAAAAAAAAAAACAU5HEBAAAAAAAAAAAAAAAAMCpSGICAAAAAAAAAAAAAAAA4FQkMQGolvj4eBkMBhkMBklSdna24uPjFR0dLV9fX4WGhmrIkCFat25duePS09P11FNPqUuXLvLx8VGTJk104403auvWrZWes6SkRJ9++qmGDBmi5s2by93dXU2bNtWAAQM0a9YsFRUVVdpGZmamHnvsMXXs2FFeXl4KDQ3VwIEDtWjRoipdd+k1x8fHO6zXv39/GQwG9e/fv0rtnmvHjh3697//rcGDB6tVq1by8PCQr6+v2rdvrzFjxui3336zeVxCQoIMBoPGjRtn3RcVFWWNu/QnISHB5vHffPONRowYodatW8vT01OBgYGKjY3VtGnTlJmZWWncqampmjx5stq0aSNPT0+FhYXphhtu0I8//lijx8GRBQsWqH///goKCpKvr6+6du2qZ599VqdPn5ZU9ecKAAAAAAAAAAAAANBwGJ0dAIAL1+HDhzVw4EDt3r3bui8vL0/Lli3TihUrtHDhQo0YMUJ//PGHhgwZoiNHjljr5efna8mSJfrf//6nZcuWacCAATbPcerUKd1www1au3Ztuf0nTpxQQkKCEhIS9Pbbb2vZsmWKiIiw2UZycrIGDhyotLQ0676CggL99NNP+umnnzRu3DhdddVV5/NQ1IqEhASbj0NRUZH27t2rvXv36uOPP9Zjjz2ml156qVbOmZmZqeHDh+vnn38ut7+wsFCbN2/W5s2bNWvWLH377be67LLLbLaxZs0aDR06VNnZ2dZ9R48e1dKlS7V06dJaSyYymUwaNWpUhcSznTt3aufOnfr000/rJGkKAAAAAAAAAAAAAFD3SGICUGMjRoxQamqqHn/8cV133XXy9vbWr7/+qmeffVbZ2dm6++67FRsbq6FDh+rMmTN64YUX1K9fP7m5uWn58uV64YUXVFhYqLFjx2rPnj1yd3cv177ZbNbQoUO1fv16SVK/fv10//33KyoqSmlpafroo4/0zTffKDk5Wddcc40SExPl6+tbro3s7GwNHjzYmsB02223acyYMQoNDdXu3bv12muvae7cudqxY0f9PGgOmEwm+fj46Prrr9fVV1+tjh07yt/fX+np6dq5c6fefPNNHTx4UC+//LI6dOhQbtaluLg4bd++Xd9++62eeuopSdL//vc/hYWFlTtHVFSUdbuwsFADBw7Uli1b5OrqqlGjRmnIkCGKiopScXGxfvnlF7322mtKT0/XkCFDtHXr1gqJYocOHbImMLm4uGjChAkaPny4AgIC9Mcff+jll19WfHy8YmNjz/vx+de//mVNYLrkkks0depUXXrppcrKytKiRYv0/vvv67bbbjvv8wAAAAAAAAAAAAAA6h9JTGgcSkqkM6ecHUX98QqWXOp+tcjExEStXr1avXv3tu6LjY1V+/btNXToUOXk5Kh3796yWCzasGGD2rZta63Xq1cvhYSEaPLkyTp06JC+//573XzzzeXaf++996wJTKNHj9a8efOsy9j17NlTw4YN05NPPqkXX3xRKSkpev755zV9+vRybTz//PM6fPiwJOnFF1/U448/bi3r2bOnhg8frqFDh2rFihW1++DUQExMjFJTUxUYGFihbPDgwbr//vs1dOhQrVy5UtOmTdPo0aPl6uoqSfLx8VHXrl21adMm6zEdOnRQZGSk3fM999xz2rJliwIDA/Xjjz+qZ8+e5cr79u2rO+64Q3369NHRo0f1xBNPaP78+eXqPPzww9YZmD799FPdfvvt1rLY2FiNGDFCV155Zbm4amL79u166623JEk9evTQ6tWryyWsXXPNNbr88ss1ZsyY8zoPAAAAAAAAAAAAAMA5SGJC43DmlDSjbeX1LhaPpEg+IXV+moceeqhcAlOp66+/XhERETp48KAyMjL07rvvlktgKjVu3Dg9/PDDKigo0Jo1ayokMb3zzjuSpKZNm+rtt9+2JjCVNW3aNH311VfatWuX3n//fT333HPy8PCQdHYZtg8//FCSdOmll+qxxx6rcLybm5s+/PBDtWnTRsXFxdV/EGpRSIjj58zd3V0zZsxQTEyMDh48qMTExAqJR1WVm5trfXyff/55u+1ERETo6aef1n333adFixZpzpw58vHxkSQdO3ZMX3/9tSRp6NCh5RKYSvn5+WnOnDk2+0l1vPfeeyopKZEkzZkzp8KMW9LZRLfPPvtMy5YtO69zAQAAAAAAAAAAAADqH0lMaHBMJpOKioqqXL+kpEQWi6XSOnU/L1HDZ7FYKn2s7DEYDBWSiEaOHGm33ejoaB08eFAGg0EjRoywJqCU5eHhofbt22v79u3at29fubK0tDQlJydLOrtsnY+Pj802XFxcNHbsWD322GPKzMzUpk2b1KdPH0nS5s2blZmZKUkaM2aMNf5z4w0LC9O1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jBF/4X3EWXU5RjRv3rxaY2RV2mWMOKuxvY8AAAAAAFy8SGJCg2M0GiskxDji4uJS6Qdsjj7wOh911a7BYKiTZbPqs92y/6/J4xQWFqZOnTopOTlZixYt0vTp0+Xr61uhntls1n//+19JZ2cGio2NtZ6vZ8+eCgoKUmZmpj755BNNmTLFGmvZ+I4cOaKVK1eWi730w2CDwSAXFxdFRUVp27Zt2rx5s92Yly9frtOnT9u97rL/d3FxKff/sn343ESpsvHOmTOn3P5zz1E2Uaq4uNjuYz9w4EB5e3srPz9fb7/9tkaOHFntvnH11VfL1dXV+hzccsstFeKVziY47dixw/r/mvSHgQMHas+ePdq+fbu2bdtWLgmrrNIPxEvjqOq5ytYrPa4645A9VV2mr7oc3XxpTO26uro6vLHT0NqtrX5VX+0aDAab7bq5uclkMlm3q3tue+3Whrpqt65ey4wR59+uo2MZI+q23bp6LV/oY8T5jpH22q1NDfG17Ix2G8MYUbY/2nuvzxjxF95HnFWXr+XaHCPLtlsXGsMY4cx26/K1DAAAAAC4sF34a04BuGhNnjxZkpSRkaEHH3zQZp1p06YpKSlJknTPPfeUm4nIw8ND48aNk3R2JqAZM2ZUON5kMumee+5RUVGRw1j69esnSfr999+1du3aCuXHjh3TAw88UIWrsq3st9bLJuKU9e677+rbb7912E6LFi2s2ykpKXbrBQYG6v7775ckrVu3TlOmTHGYDHj8+HF98MEHFc514403SpKWLFmiL774osJxubm5mjhxosOYq2LixInWGy8TJkywOSPW/Pnz9cMPP5z3uQAAAAAAAAAAAAAA9Y8kJgAN1qRJk6zTi8+dO1fXXHONvvzyS23ZskXff/+9/v73v+v555+XJLVt21ZPP/10hTaeeeYZtWrVSpL06KOPatSoUVq+fLm2bNmizz77TJdffrmWLVum2NhYh7FMmDBBRqNRFotFw4YN0+uvv65NmzZp3bp1mjFjhrp3766srKwaL6HRvXt36xJ6s2fP1m233abvvvtOmzdv1rfffqsRI0bovvvu0xVXXFFpO56enpKkp59+WitXrtTu3bu1d+9e7d27V2fOnLHWfe6559S7d29J0htvvKEePXronXfe0dq1a5WYmKhVq1bp7bff1k033aTWrVvrvffeq3C+V1991boEwKhRozR58mStWrVKmzdv1ty5c9WzZ09t3bq10se3Mt26dbMmtW3atEmxsbGaN2+eNm/erJ9//ln33nuvRo8efd7nAQAAAAAAAAAAAAA4B8vJAWiwXF1d9d133+mGG27Q2rVr9fPPP+vnn3+uUK9Tp05atmyZzeXmAgICtHz5cg0cOFDHjh3TwoULtXDhwnJ1xo4dq379+llnbbKlS5cueuWVV/R///d/yszM1JQpU8qVBwcH65tvvtHTTz+tPXv2VPtaDQaDPvnkE1199dXKzMzUF198UWFmo+joaC1atEhhYWF22/Hz89ODDz6oV155RVu2bNGgQYPKla9atUr9+/eXdHamqpUrV2rs2LH66quvtG3bNuvsTLb4+/tX2BcZGaklS5bohhtuUE5OjmbNmqVZs2aVq/PMM8/IYDBo06ZNlT0MDr322mtKS0vTV199pV27dlV4vqKiovT555+rbdu253UeAAAAAAAAAAAAAED9YyYmAA1acHCwfvnlF3388ce67rrr1KxZM7m5ualJkybq37+/3n77bSUmJioiIsJuG126dNHOnTs1depUtW/fXh4eHgoJCdGAAQO0YMECzZ07t0qxTJkyRcuXL9fgwYMVFBQkDw8PRUVFafLkydq6dauuvPLK87rWmJgYJSYmatKkSYqIiJCbm5uCg4PVq1cvzZw5Uxs2bCi3XJw9L7/8st5//31deeWVCg4Olqurq926fn5++vLLL7VmzRqNHz9el1xyifz8/GQ0GhUcHKy4uDhNnjxZP/zwg1auXGmzjf79+2vnzp269957FRERIXd3dzVr1kzXX3+9li9frmnTptX4MSnLzc1NX375pT755BNdeeWVCggIkLe3tzp16qQnnnhCmzdvVps2bWrlXAAAAAAAAAAAAACA+sVMTACqJT4+XvHx8ZXWmzdvnubNm1dpvYSEhErruLi46M4779Sdd95ZeYB2BAcHa/r06Zo+fbrN8rFjx2rs2LGSJLPZrPT0dJv1Bg8erMGDB9s9j6PriYyMlMVicRhn69at9e677zqsU1kbBoNB48eP1/jx4x3WK6tv377q27dvleufKzw8vMIMTGVVtd9UxT/+8Q/94x//qJW2AAAAAAAAAAAAAAANAzMxAQAAAAAAAAAAAAAAAHAqkpgAAAAAAAAAAAAAAAAAOBVJTAAAAAAAAAAAAAAAAACciiQm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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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WlqqwsJCJSYm6qWXXlLHjh21ePHietfKzMzUwIED9dhjj2nbtm0qKipSUVGRNm3apPvuu0/XXHONTCZTjWP+8pe/yM3NTZK0cOHCOtevrKzUF198IUkaPXq0/P39m+1abFm+fLk6dOig559/Xtu3b1d+fr7Ky8t18OBBffzxxxo8eLDuvffeWtdpzXvvvacLL7xQCxcuVFpamsrLy5WWlqZ58+apR48e+vzzz+s8/qWXXlKXLl3073//W4mJiSooKFBZWZn279+vDz74QP369dP06dMbfa0AAAAAALQWJDEBAAAAAAAA5zCz2axx48ZZkofGjh2rjz76SGvXrtX69ev12muvqW3btiouLta4cePqrexzzTXXKCkpSffff79++OEHbdmyRZ988oni4+MlSYsXL9Y777xT4xhvb2+NHDlSkvTVV1+prKzM5vpLly5VTk6OJOnGG29s1muxZvv27Ro7dqwKCgrk7Oyshx56SCtXrtTGjRv19ttvKyYmRpL0xhtvaNq0afWudddddykkJET/+c9/9Ouvv2r16tV6/PHH5erqqvLyct14440245w1a5YeffRRVVZW6oILLtCbb76pFStWaPPmzZo/f74GDhwos9ms5557TrNnzz7tawUAAAAAoDVxsncAAAAAAAAAQF2OF5U3+lhPVye5OTtaHcsprpDZbG7Uuu4ujvJwsf7WWl5JhapMDV830Mu1UTE01LvvvqslS5bI2dlZixYt0mWXXVZjfMCAAZo0aZIGDx6sXbt26cEHH6yzXdqmTZu0fPlyDR061LKvV69eGjVqlLp06aLMzEzNmTNHd955Z43jrrnmGi1atEgFBQX69ttvNW7cOKvrf/LJJ5IkHx8fjRkzplmvxZo77rhDFRUVcnR01LfffmtJvpKkvn37avz48Ro0aJCSkpL00ksv6aabblLXrl2trrVjxw5FR0drw4YNCgsLs+y/+OKLNWrUKI0cOVKVlZW65557tHHjxhrHJiUl6cknn5QkPfPMM3rmmWcs7fwkqXfv3powYYJuvvlmffzxx3ryySc1adKkWpWrAAAAAAA4W5DEBAAAAAAAgFat9z9XNPrYf1zVVTcNbGd1bMQrq5VTXNGodR+4JE4PXdrR6tj4t9Zrb1ZRg9c68OIVjYqhIcxms2bOnClJuv/++2sl/VTz9/fXrFmzNHr0aK1du1Z7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lZXZXH/p0qXKycmRJN14443Nei3WbN++XWPHjlVBQYGcnZ310EMPaeXKldq4caPefvttxcTESJLeeOMNTZs2rd617rrrLoWEhOg///mPfv31V61evVqPP/64XF1dVV5erhtvvNFmnLNmzdKjjz6qyspKXXDBBXrzzTe1YsUKbd68WfPnz9fAgQNlNpv13HPPafbs2ad9rZJkNBo1ZswYSwLTyJEj9dVXX2nz5s368ssvNWLECH3//fd66qmnGrU+AAAAAAANxSdBAAAAsJv4MB91DvPWjrSabaU6h3lr+tguurB9kJ0iA9CU4sO99dZfe+mfS5KVlltaY6ywzKh/LknWgo2H9PSYLhraKcROUQJo1YqPNf5YF0/J2d3GusclmRu3rrP7ibWtKcmRzKeRnOnZvL/zvPvuu1qyZImcnZ21aNGiWlWQBgwYoEmTJmnw4MHatWuXHnzwwTrbpVVXWxo6dKhlX69evTRq1Ch16dJFmZmZmjNnju68884ax11zzTVatGiRCgoK9O2332rcuHFW1//kk08kST4+PhozZkyzXos1d9xxhyoqKuTo6Khvv/3WknwlSX379tX48eM1aNAgJSUl6aWXXtJNN92krl27Wl1rx44dio6O1oYNGxQWFmbZf/HFF2vUqFEaOXKkKisrdc8992jjxo01jk1KStKTTz4pSXrmmWf0zDPPWNr5SVLv3r01YcIE3Xzzzfr444/15JNPatKkSbUqV9Xn7bff1pYtWyzX/vbbb9c4x9VXX61bb71V77333mmtC5wLsrKytHHjRm3cuNFSbe748eOSpJtvvlnz5s1r8nMuWLBA77//vn777Tfl5eUpNDRUgwcP1tSpUzVw4MAmPx8AAADQmpDEBAAAALtxcDDomSu76po56yRJfh7OenhkJ93QN0pOjhQNBc4VBoNBl3UL19BOIXr3l1S9sXKfSiuraszZl12sye9v0iWdQ/TUmC6KCbKRGADg/DSrfeOPHf2S1O9262Nv9JVKjjdu3SF/l4bZqMLz/uVS9u6GrzUjv/45jWQ2mzVz5kxJ0v3332+zjZu/v79mzZql0aNHa+3atdq7d6/i4uKszr3vvvtqJDBVCwgI0JQpU/Tiiy9q586dys/Pl6+vr2V82LBh8vf3V25urubPn281iamoqEiLFi2SJF177bVyc3Nr1ms5VXWigiTdfvvt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6cYbb9SOHTu0bds2JScn68svv7SMTZw40eoxLXEtI0aM0JNPPilJeu+999SnTx+r89avX29JPBgxYoTN9XJycrR48WJdffXVVsffe++9Gueu5ujoqNGjR2vBggVavny5kpOTFR8ff9rXU5+IiAjFx8crOTlZn3/+uWbOnCl399qtEouLi/XZZ581+fkBSGlpaZZtW63kqkVFRVm2Dx8+rC5dGtZ6+eRzWHP06FHLdmFhoQoKChq07pkqKiqyug2cCe4rVDObzTIajTIajXJ1dZWDQ+3aHqWlpTp48KCqqqpkNBplMllvCV398/nIkSM19kdFRSkoyHrV2PT0dDk4OMjJyUmOjo5ycnKq8YdWvucvfk6hOdjrviosLGzyNUliAgAAwGkrMjnp79/s1ne7sq2Ouzg66JZBMZo6rL283ShvD6BpvbV6n9LzyyRJa1OOa/TsX/TX/m310KUd5edhvRIGAJyvHBwc9MQTT+iee+5RamqqbrrpJn300UdydXW1Or+goEAffvih7r333maN64YbbtDjjz8us9ms+fPn6+uvv5YkDRw4ULGxsVaPaYlr6devn/r06aPNmzfrnXfe0bXXXqtLLrmkxpz8/HzdeeedlpjuvvvuOtf829/+pgsvvFChoaE19q9evVpz586VJPXu3Vt9+/atMT5t2jR99tlnqqqq0rhx4/T999/bTHCoqqrSwoULNWTIkHqTIE5199136/7771dGRoYefvhhzZkzp9achx56SFlZWae1LoCGOfmDHy8vrzrnenr+2Wr5dD6cOjn5qT4fffSRpRJcS/roo49a/Jw493FfnVscHR3l7OxsSQKq3q5rX7Xt27errKys1ppubm7q0aNHo2NasWKFcnNzrY7179+/zkQlo9GoysrKGv+t3s7Pz1dJSUmj48LZg59TaA4teV/l51t/wP1MkMTUzA4ePKjZs2dryZIlOnz4sFxdXdW+fXtdd911mjp1qjw8PBq17oEDBxQTE3Nax0RHR+vAgQO19g8dOlSrV69u0Bq0agAAAEcqPfVdUbSM+dYTmEbEh+qpK+LVLsjT6jgAnInMgjK9tXpfjX1VJrM+WH9Q3+xI18OXdtTE/tFypPobAFjcdddd+uGHH/TVV1/p888/19atW3XnnXeqX79+8vX1VUFBgXbv3q1Vq1Zp0aJFcnNza/YkpsjISA0ZMkSr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5eXlSE5OxuHDh/HTTz8hIyMD586dY4iJiIjqlJ+fj4SEBOj1egwePBha7c0tYGkNuJ0ctTrL9l+FzN166erGkksFBKosJ0rMq8I8XKB0kTfp/YiIiIiIiIiIiFoLFwcZegep0DtIZXFcFEUUlFVULiSsqnx+/b9X88uQXqiFSby5e2srjLiUVYxLWcVWz392Tz9M6RNwczchIupABEHA999/j2effRbLli1DQkICXnzxRZvt1Wp1s4/pvvvuw549e8wBJplMhlmzZtV6jT2eR9++fbF582bMnDkTGo0GH374IT788MMa7Z588km88847dfb11FNP4fHHH7capnJwcMDq1asxePBgq9cvXLgQrq6uWLhwIYqKivD+++/j/ffft9rWwcGhxbcJJCKitqOsrDJbIQgCZLK2HwFqtc+goqICACCXM1xC9ePt5mAOJVUPKXXycoGfuxOkEpaoJiIiIiIiIiIiqiIIAjxdHeDp6oC+waoa5yuMJmQUlptDTVUhp2sFlY8Lyypuegz+Sn5IS0TUUHK5HEuWLMHjjz+Or776Cnv27MHVq1dRUlICNzc3hIWFYcCAAbj99tsxefLkZh/PjBkz8NRTT0Gn0wEAbrvtNvj4+NR5nT2ex2233YYrV67g448/xtatW5GYmAidTgdfX1+MGDECjz32GIYPH16vvh5++GH07NkTH330EQ4cOIDc3Fz4+Phg7NixeOmll9C9e/dar1+wYAGmTp2KL7/8Ejt27MClS5dQWFgIR0dHBAYGolevXvjb3/6Gu+66q9472xARUcd2Y55GLpdDFG9yJUoLa7UhppiYGACo1y851DE4yiQWlZSCPJwrH3tVBpdcHVvtjzMREREREREREVGbI5dK0Mmrcv7NmiJtRWWoqVqwqWqbutSCMlQY65487+RpvW8iIqpbr1698OmnnzbomkWLFmHRokV1ths1alS9PwRVqVQoLy9v0Diqa8zzAIB58+Zh3rx5dbbz8fHBf/7zH/znP/9pxOgsDRkyBN9//32jr/f19cW//vUv/Otf/7rpsRAREd0YYhIEAUajsYVG0zSaJfWxZs0aq8d//fVXnDhxotZrdTodEhISsGLFCgiCgIEDBzbHEKkV6+nvhu7dAmts++bj5ggJqykRERERERERERG1CkpnOZSBSvQMVNY4ZzSJyNSUW92m7lq+FrklOjjK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Lq9xvmquxmQy1TgnkUgsAkvu7u6QSqX2GDYRUasliqL5D18TiYiIiDomu4SYDhw4AEEQ8Nprr+Hxxx+3xy2J2qTevXujqKgIeXl5yM/Ph1arrbV9eXk50tLSkJaWBmdnZwwcOJCVmYiIiIiIiIiImolWq0V+fj7y8vJQWFgIURQRGRkJX1/fGm2lUilUKhXy8/MBAK6urubq2gqFgovRiIiuk0qlKCsrM38tCALc3NxacERERERE1FLsEmIqLy8HAEyYMMEetyNqsyQSCTw8PODh4QEAKCsrM0+MFRUVQRRFm9cqlUoGmIiIiIiIiIiImpDJZEJRURHy8/ORn59v8SF7lfz8fKshJgAIDAw0V9FmZXoiovqpqsbE+W4iIiKijscuIabQ0FDExsaioqLCHrcjajdcXFzg4uKCoKAgGAwGFBYWmqs06fV6i7aenp42+7l48SIEQTBPmslkdvmrT0RERERERETU5uj1evOisoKCAhiNxlrb5+fn2/ywvbb5GiIiqlTb4l0iIiIi6ljskmS44447EBsbi3379mHo0KH2uCVRuyOTyeDt7Q1vb2+IooiSkhLzhFpJSYm5etONDAYDcnNzIYoisrOzAVRWbaoqX+7i4sIVLURERERERETUoZWUlCA3Nxf5+fkoLi5u0LWurq7Q6/VwdHRsptEREbVv1kJMrMRERERE1DHZJcT07LPPYtWqVfjggw9w9913IzQ01B63JWq3BEGAQqGAQqFASEgIDAaDzepKBQUFNd4EFhUVoaioCElJSXB0dDRXaFKpVJBKpfZ4CkRERERERERErUZWVhZSU1Pr1VYul8PT09P8hxWviYhujq0QExERERF1PHZ5h+3j44OtW7di8uTJGDx4MN5++23MmjULSqXSHrcnavdqmyzLz8+v9VqdTof09HSkp6dDIpFApVLBy8sLXl5eXEFIRERERERERO2GTqezOdfh6elZa4jJzc3NXNVaoVCwOggRURMTBMEiuMQQExEREVHHZLdlQr1798a+ffswePBgPPbYY3j88cfh7e0NFxeXWq8TBAEJCQl2GiVR+xMSEgI3Nzfk5+dbrcpUnclkQn5+PvLz83H58mWoVCpERkYyzEREREREREREbZJer0dOTg6ysrJQXFyMIUOGWJ3nUCqVkEqlMBqNAACpVAoPDw9ztSXOjRAR2RdDTEREREQd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4gnDbDbb3cbVV19t1NXVuejI0B85oj2mpaV1u3984oknXHuAGDC++eYbw9PTs117SktLs1ufc0jAeaZNm2b39yohIcHh++N8Z/A4duyYMWrUKLufdXBwsPHhhx+e1T4yMzO7fd7Sk+u7cC1X3I/kXGJwcXab4prS4OLKvy21tbXGrFmz7O7PbDYbS5cudeg+e8pTgJt88803uvnmm1VXV6fAwED913/9l6ZPn666ujq98cYb+n//7//p6NGjuvrqq7Vv3z4FBQW5O2QMAj//+c9177332i0PCAhwYTQY6IYPH67U1FRt3ry5x+s++uijWrNmjSTp/PPP10MPPaSRI0cqIyNDzzzzjL755hutXr1akZGReuqppxwdOgags2mPrT799FPFxsbaLY+Li+v1tjHw5eXlSZJiY2N144036tJLL9Xw4cPV3NysXbt26Y9//KNyc3P16quvqqmpSa+//rrdbdFH4mw5sj22oo/E2YqPj9f06dM1YcIExcfHKyYmRi0tLcrJydE777yjDRs2qLi4WNdee6327Nmj8ePHd9jGypUrtWzZMknSyJEj9dvf/lbjxo1TXl6enn/+eaWlpWnTpk1auHBht9o1Bi9HtMdWL7/8siZNmmS3PCoqyhmHgAGupaVFixcvlsViUVRUlE6dOtXlOpxDAs5jGIZ1OSwsTBMnTtTOnTtVXV3t8H1xvjN4VFVV6eqrr9axY8ckST/72c90yy23yM/PT2lpaXr66adVWVmpm2++WTt27NB555131vv87//+b1133XV2y4cMGXLW+4Djuep+JOcSg4er73FzTWlwccS9ms4sXLhQH3/8sSRp+vTpuu+++xQbG6sDBw7oqaeeUkZGhpYuXaqYmBgtXrzYKTF0ya0pVBjUWp9u9vT0NHbu3Nmh/JlnnuGpO7gMbQ2u8vjjjxsffvihUVBQYBhG+yd5uptNfeTIEevTpBMnTjRqa2vbldfU1BgTJ0609rGMaAd7HNEe2z4RkpmZ6bxgMeBdffXVxptvvmlYLBab5UVFRUZKSoq1vW3bts1mPfpIOIKj2iN9JBzFXlts67333rO2tzlz5nQoLykpMUJCQgxJxvDhw42ioqIO+5g9e3a3RivB4OaI9th2JCbaGpzhz3/+syHJSE1NNf7rv/6ry/bGOSTgXCtXrjRef/31dr87CQkJDh+JifOdweWx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pW7VekJZV1fntJiA3Nxcm09sXH755frVr36lq666St988422bdum//mf/9Gvf/1r1wcJqGd9aNsv5PShcJY5c+Zo/vz5HW4STJo0STfffLM++ugjzZ07V01NTXrggQd07bXXKjo62k3Ror/atm2bHnnkEUlSVFSU/ud//sdmPfpIuEJ326NEHwnnuP766zVx4kRJp/uvjIwMvfXWW3rvvfd066236rnnntM111zTbh36RzhLb9qjdLofzMrK6vCA0H/8x3/o+uuv1+LFizVz5kxVVFToD3/4g26++WaNHz/eJceE/qexsVGLFy+WYRh64IEHNHbs2B6tTx8JDAz8Lg8urZ93T+4xSb37vGNjY5Wbmyt/f/92759//vmaNWuWfvGLX2jGjBk6efKkXn/9dd1888269tpre7wfOJ6r7kfS/wwerrzHzTUlOFp/6quYTg4u5+vra11ubGzssn7r8Jt+fn5OiwnobMjZoUOH6p133rFeXH3xxRddFBXQUU/60LbDF9OHwllCQkI6fcr5mmuu0eOPPy5Jqq2t1Zo1a1wVGgaIH374QXPmzJHFYpGvr6/efvttRUVF2axLHwln60l7lOgj4RyhoaEaO3asxo4dq0mTJumWW27Rhg0b9Oqrr+r48eO67rrrtHbt2nbr0D/CWXrTHqXTT3V2NsLx5MmT9Ze//EWSZBiGdRmw5amnntLhw4c1fPhwPfHEEz1enz4SOK11etCzednq812F3+W+yVntqvXz7sk9Jql3n7e3t3eHBKa2Ro0apX/84x/Wn7l/0He46n4k/c/g4cp73FxTgqP1p76KJCa4XFBQkHW5O8OP1dTUSOresHyAsyQlJenyyy+XJKWnpysvL8/NEWGw6kkf2tp/SvShcK/Fixdbv3Bt27bNzdGgP8nMzNTMmTNVVlYmDw8PvfHGG/rxj39stz59JJypp+2xu+gj4Si33367brzxRrW0tOiXv/ylSktLrWX0j3C1ztpjd91yyy0KDg6WRP8I+w4fPqynn35a0umbxm2nPegu+khgYOB3eXBp/bx7co9Jct7nfemll2rMmDGSpO3bt6ulpcUp+0HPuOp+JP3P4NHX7nFzTQk90Z/6KqaTg8v5+voqPDxcJSUlysnJ6bRuWVmZ9Zekda5PwF3GjBmjjz/+WNLp6ediY2PdHBEGo7i4OOtyV31odna2dZk+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6d+BadOmufow0U+cbXusqKjQ9OnT9aMf/UjXX3+9JkyYoJiYGHl4eOjkyZP66KOP9Nprr1mnAfrNb36jCRMmuOVYMXhwDgk4V3p6urZv397uverqauu/Z15/uPLKKxUdHd3j/XC+M7g8+OCDevPNN3X06FE99NBDSk9P1y233CI/Pz+lpaXpqaeeksVikZ+fn5577rle72fOnDlKTk7W3LlzNXnyZMXFxcnHx0f5+fn69NNPtWbNGmt7vummmzR37lwHHSEcxRX3IzmXGFyc3aa4pjT4OOLeYXf85Cc/0S233KI33nhDGzdu1OWXX677779fsbGxOnDggH7/+9/r5MmTkqTly5dryJAhvdrPWXNL6hTwvzZu3GgEBwdbM/7OfKWkpBjHjh1zd5gY4Fqf+unqdcMNNxhlZWXuDhf93Pz587vV3lpf9jQ3NxsLFy7sdN277rrLaG5uduHRob852/bY9omRzl7+/v7GypUr3XCE6E960hbVxdO69JE4W45oj/SRcKTufmeJi4szNm/e3Om2Hn/8ccNkMtndxqxZs7ocZQeD29m2x7ZPlHb28vDwMJYuXdrpyAdAd3RnJCbD4BwScKa2IwN052Xrd7U7IzG14nxn8Dh27JgxatQou591cHCw8eGHH3a6ja6uM3S33f785z836uvrnXCUcISzuR/ZnZGYDINzicHGmW2Ka0qDjyPuHXZnJCbDOD0y3KxZs+xu22w2u32WLEZiglvNnj1b//73v/X8889r06ZNysnJkbe3t5KTk3XjjTfql7/8pfz9/d0dJga4v//979q2bZt27dql48ePq7i4WJWVlQoMDFR8fLwuuugizZ8/X1OmTHF3qICV2WzWmjVrdMMNN2jVqlXau3eviouLFRERoUmTJunuu+/WVVdd5e4wMcBNmDBB//jHP7Rr1y7t27dP+fn5Ki4ulsVi0ZAhQ3Tuuefqsssu06JFi6xPigCuQB+JvoA+Eo706aefatOmTdqxY4fS09NVWFiokpIS+fn5KSoqSuedd56uueYa3XTTTV1+h162bJmuuOIK/fWvf9WXX36pwsJChYaGavz48brzzjt16623uuio0F+dbXuMjY3V22+/rV27dmnPnj3Kzc1VcXGx6uvrFRISonPOOUfTpk3TokWLlJiY6PoDxKDFOSQwcHC+M3gkJyfrm2++0V//+le9/fbb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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAACTEAAAOLCAYAAACCaFUXAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAB7CAAAewgFu0HU+AAEAAElEQVR4nOzdd3hUZdrH8d+k995JCAkECBDpTUGKCIqgq4IiLgp2xbq2xYK4rq+yWFZWUdFVLAiWtYAIIgooTToSEoQQWggpkN4zmXn/wIyEzCQhJJkA3891cXk4z3Oec5/kGDIz97lvg9lsNgsAAAAAAAAAAAAAAAAA7MTB3gEAAAAAAAAAAAAAAAAAOL+RxAQAAAAAAAAAAAAAAADArkhiAgAAAAAAAAAAAAAAAGBXJDEBAAAAAAAAAAAAAAAAsCuSmAAAAAAAAAAAAAAAAADYFUlMAAAAAAAAAAAAAAAAAOyKJCYAAAAAAAAAAAAAAAAAdkUSEwAAAAAAAAAAAAAAAAC7IokJAAAAAAAAAAAAAAAAgF2RxAQAAAAAAAAAAAAAAADArkhiAgAAAAAAAAAAAAAAAGBXJDEBAAAAAAAAAAAAAAAAsCuSmAAAAAAAAAAAAAAAAADYFUlMAAAAAAAAAAAAAAAAAOyKJCYAAAAAAAAAAAAAAAAAdkUSEwAAAAAAAAAAAAAAAAC7IokJAAAAAAAAAAAAAAAAgF2RxAQAAAAAAAAAAAAAAADArkhiAgAAAAAAAAAAAAAAAGBXJDEBAAAAAAAAAAAAAAAAsCuSmJpBVlaWvv32W02fPl2XX365goKCZDAYZDAYNHny5GY554IFCzRy5EiFhYXJzc1N0dHR+utf/6r169c3eI2SkhL961//Ut++fRUQECBPT0917txZDz/8sA4ePNgscQMAAAAAAAAAAAAAAAAGs9lstncQ5xqDwWBz7Oabb9a8efOa7FylpaUaN26cvvvuO6vjDg4Omj59up555pk610lJSdHo0aO1d+9eq+M+Pj6aP3++xowZc8YxAwAAAAAAAAAAAAAAACejElMza9u2rUaOHNls699yyy2WBKZhw4bp66+/1saNG/Xf//5X7du3l8lk0owZMzR37lybaxQWFuqKK66wJDDdfvvt+vHHH7Vu3To9//zz8vLyUkFBga6//npt37692a4FAAAAAAAAAAAAAAAA5ycqMTWDZ555Rn379lXfvn0VGhqqAwcOKCYmRlLTVmL66aefdMkll0iSxo4dq6+++kqOjo6W8WPHjql37946dOiQ/Pz8lJqaKn9//1rrTJ8+Xc8995wk6V//+pceffTRGuPr1q3TkCFDZDQaNWTIEK1atapJ4gcAAAAAAAAAAAAAAAAkKjE1i2effVZjxoxRaGhos57npZdekiQ5OTlpzpw5NRKYJCkoKEgzZ86UJOXl5endd9+ttUZlZaVmz54tSYqPj9fDDz9ca86FF16oW2+9VZK0evVqbdq0qUmvAwAAAAAAAAAAAAAAAOc3kpjOUoWFhfrxxx8lSSNGjFBkZKTVeddcc418fHwkSV999VWt8ZUrVyo/P1/SiSpRDg7Wb4nJkydbtq2tAwAAAAAAAAAAAAAAADQWSUxnqU2bNqmiokKSNGTIEJvzXFxcNGDAAMsxlZWVNcbXrFlj2a5rnT59+sjDw0OStHbt2kbHDQAAAAAAAAAAAAAAAJzKyd4BoHGSkpIs2507d65zbufOnbV8+XIZjUbt3btXXbp0Oe11nJyc1KFDB/32229KTk4+7XjT0tLqHC8rK9Pu3bsVGhqq4OBgOTlxawIAAAAAAABoekajUdnZ2ZKkhIQEubm52TkiwL7Kysq0c+dOSeL9eQAAADRYc7y24jfRs9TJSUG2WslVi4qKsmwfPny4RhJT9Tqenp7y8/Ord53ffvtN2dnZKi8vl6ura4PjPTkGAAAAAAAAAGgNNm7cqL59+9o7DMCudu7cqX79+tk7DAAAAJzFmuq1Fe3kzlKFhYWWbS8vrzrnenp6WraLioqsrlPfGvWtAwAAAAAAAAAAAAAAADQWlZjOUmVlZZZtFxeXOueeXDGptLTU6jr1rVHfOvU5fPhwveMXXnihJOnbb79VbGzsaa0PNKXi4mJ9+eWXkqRrrrmmRgIfYA/ck2hNuB/RmnA/orXhnkRrwv2I1oZ7Eq1JamqqxowZI+lE6yzgfHfy/wcbN25UeHh4i5y3sLBQH330kSRp0qRJ8vb2bpHz4tzGfYWmxj2FpsY9heZgr/vq6NGjloqeTfXaiiSms9TJvQQrKirqnFteXm7Zdnd3t7pOfWvUt0596mt5d7LY2FjFx8ef1vpAUyooKJCvr68kqWPHjvLx8bFzRDjfcU+iNeF+RGvC/YjWhnsSrQn3I1ob7km0Vk5OvEUOnPz/QXh4+Gm9n38mTv63oU2bNvzbgCbBfYWmxj2FpsY9hebQGu6rpnptRTu5s9TJmXP1tXYrLi62bJ/aNq56nYa0h6trHQAAAAAAAAAAAAAAAKCxSGI6S538JERaWlqdc09u5RYVFWV1neLiYuXl5TVoneDg4Bqt5QAAAAAAAAAAAAAAAIAzQRLTWapLly6W7d27d9c5t3rcyclJcXFxjVrHaDRq3759kkSrNwAAAAAAAAAAAAAAADQpkpjOUn379pWLi4skafXq1TbnVVRUaMOGDZZjnJ2da4wPGjTIsl3XOps3b7a0k7vooosaHTcAAAAAAAAAAAAAAABwKpKYzlLe3t665JJLJEkrVqyw2VLuyy+/VEFBgSTp6quvrjU+dOhQ+fr6SpI++OADmc1mq+vMmzfPsm1tHQAAAAAAAAAAAAAAAKCxSGJqpebNmyeDwSCDwaAZM2ZYnfPII49IOtHqberUqaqqqqoxfuzYMT3++OOSJD8/P91222211nBxcdH9998vSUpOTtZLL71Ua8769ev13//+V5I0ZMgQ9e3bt9HXBQAAAAAAAAAAAAAAAJzKyd4BnIvWrFmjlJQUy9+PHTtm2U5JSalR1UiSJk+e3KjzDB8+XBMmTNDChQu1aNEiXXrppXrwwQcVERGhnTt36vnnn9ehQ4ckSTNnzpS/v7/VdR599FF9+umn2rNnjx577DGlpKRowoQJcnd318qVK/V///d/MhqNcnd317///e9GxQoAAAAAAAAAAAAAAADYQhJTM3j33Xf1wQcfWB1bu3at1q5dW2NfY5OYJOm9995TQUGBvvvuO61cuVIrV66sMe7g4KCnn35ad9xxh801vL29tWTJEo0ePVp79+7V3LlzNXfu3BpzfHx8NH/+fPXo0aPRsQIAAAAAAAAAAAAAAADW0E7uLOfu7q4lS5Zo/vz5uvTSSxUSEiIXFxdFRUVp4sSJWrNmjc12dCfr0KGDtm3bppkzZ6pPnz7y8/OTh4eHOnXqpIceeki//fabxowZ0/wXBAAAAAAAAAAAAAAAgPMOlZiawbx582q1jDtdkydPPq0KTRMnTtTEiRPP6Jyenp567LHH9Nhjj53ROgAAAAAAAAAAAAAAAMDpIIkJAAAAAAAAdmMymVRUVKSCggJVVFSoqqrK3iGhGRiNRvXo0UOSdOTIEWVmZto3IJzVHB0d5eHhIT8/P7m5udk7HAAAAABAEyGJCQAAAAAAAHZRWFioI0eOyGw22zsUNDOTySRfX1/LttFotHNEOJsZjUaVl5crNzdXvr6+Cg8Pl8FgsHdYAAAAAIAzRBITAAAAAAAAWpy1BCaDwSBHR0c7RoXmYjab5eXlJUlydnYm4QRn5OQkuPz8fLm4uCgoKMiOEQEAAAAAmgJJTAAAAAAAAGhRJpOpRgKTl5eXAgIC5OHhQXLLOaqqqkpZWVmSpJCQEJLVcEaqqqqUl5dnuaeys7Pl4+MjFxcXO0cGAAAAADgTDvYOAAAAAAAAAOeXoqKiGglMkZGR8vT0JIEJQIM4OjoqMDBQgYGBln1FRUV2jAgAAAAA0BRIYgIAAAAAAECLKigosGwHBASQvASgUXx8fCzbxcXFdowEAAAAANAUSGICAAAAAABAi6qoqJAkGQwGeXh42DkaAGcrV1dXSxJk9c8VAAAAAMDZiyQmAAAAAAAAtKiqqipJJ1pCUYUJQGMZDAY5OjpKkkwmk52jAQAAAACcKZKYAAAAAAAAAAAAAAAAANgVSUwAAAAAAAAAAAAAAAAA7IokJgAAAAAAAAAAAAAAAAB2RRITAAAAAAAAAAAAAAAAALsiiQkAAAAAAAAAAAAAAACAXZHEBAAAAAAAAOC8MW/ePBkMBhkMBh04cMDe4djdqlWrLF+PVatW2TscAAAAAMB5jCQmAAAAAAAAAAAAAAAAAHZFEhMAAAAAAAAAAAAAAAAAu3KydwAAAAAAAAAAAPsYOnSozGazvcMAAAAAAIBKTAAAAAAAAAAAAAAAAADsiyQmAAAAAAAAAAAAAAAAAHZFEhMAAAAAAABwnli5cqVuvvlmxcbGysPDQz4+PkpISNCjjz6q9PR0m8fNmDFDBoNBBoNBklRWVqZZs2apV69e8vb2lre3t/r166fXX39dRqOx1vEfffSRIiIiFBERoR9++KHeOO+8804ZDAa5uroqNze3Sa+lobKzs/XUU0+pZ8+e8vPzk5ubm9q1a6dJkyZpzZo1dR7brl07GQwGTZ48WZK0adMm3XDDDYqKipKbm5uioqI0ZcoU7d69u0GxpKSk6KGHHlJCQoJ8fX3l7u6u2NhYTZ48WZs3bz6j61y1apXle7tq1aozWgsAAAAAgDNBEhMAAAAAAABwjisrK9MNN9yg4cOH68MPP9T+/ftVWlqqwsJCJSYm6qWXXlLHjh21ePHietfKzMzUwIED9dhjj2nbtm0qKipSUVGRNm3apPvuu0/XXHONTCZTjWP+8pe/yM3NTZK0cOHCOtevrKzUF198IUkaPXq0/P39m+1abFm+fLk6dOig559/Xtu3b1d+fr7Ky8t18OBBffzxxxo8eLDuvffeWtdpzXvvvacLL7xQCxcuVFpamsrLy5WWlqZ58+apR48e+vzzz+s8/qWXXlKXLl3073//W4mJiSooKFBZWZn279+vDz74QP369dP06dMbfa0AAAAAALQWJDEBAAAAAAAA5zCz2axx48ZZkofGjh2rjz76SGvXrtX69ev12muvqW3btiouLta4cePqrexzzTXXKCkpSffff79++OEHbdmyRZ988oni4+MlSYsXL9Y777xT4xhvb2+NHDlSkvTVV1+prKzM5vpLly5VTk6OJOnGG29s1muxZvv27Ro7dqwKCgrk7Oyshx56SCtXrtTGjRv19ttvKyYmRpL0xhtvaNq0afWudddddykkJET/+c9/9Ouvv2r16tV6/PHH5erqqvLyct14440245w1a5YeffRRVVZW6oILLtCbb76pFStWaPPmzZo/f74GDhwos9ms5557TrNnzz7tawUAAAAAoDVxsncAAAAAAAAAQF2OF5U3+lhPVye5OTtaHcsprpDZbG7Uuu4ujvJwsf7WWl5JhapMDV830Mu1UTE01LvvvqslS5bI2dlZixYt0mWXXVZjfMCAAZo0aZIGDx6sXbt26cEHH6yzXdqmTZu0fPlyDR061LKvV69eGjVqlLp06aLMzEzNmTNHd955Z43jrrnmGi1atEgFBQX69ttvNW7cOKvrf/LJJ5IkHx8fjRkzplmvxZo77rhDFRUVcnR01LfffmtJvpKkvn37avz48Ro0aJCSkpL00ksv6aabblLXrl2trrVjxw5FR0drw4YNCgsLs+y/+OKLNWrUKI0cOVKVlZW65557tHHjxhrHJiUl6cknn5QkPfPMM3rmmWcs7fwkqXfv3powYYJuvvlmffzxx3ryySc1adKkWpWrAAAAAAA4W5DEBAAAAAAAgFat9z9XNPrYf1zVVTcNbGd1bMQrq5VTXNGodR+4JE4PXdrR6tj4t9Zrb1ZRg9c68OIVjYqhIcxms2bOnClJuv/++2sl/VTz9/fXrFmzNHr0aK1du1Z7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lZXZXH/p0qXKycmRJN14443Nei3WbN++XWPHjlVBQYGcnZ310EMPaeXKldq4caPefvttxcTESJLeeOMNTZs2rd617rrrLoWEhOg///mPfv31V61evVqPP/64XF1dVV5erhtvvNFmnLNmzdKjjz6qyspKXXDBBXrzzTe1YsUKbd68WfPnz9fAgQNlNpv13HPPafbs2ad9rZJkNBo1ZswYSwLTyJEj9dVXX2nz5s368ssvNWLECH3//fd66qmnGrU+AAAAAAANxSdBAAAAsJv4MB91DvPWjrSabaU6h3lr+tguurB9kJ0iA9CU4sO99dZfe+mfS5KVlltaY6ywzKh/LknWgo2H9PSYLhraKcROUQJo1YqPNf5YF0/J2d3GusclmRu3rrP7ibWtKcmRzKeRnOnZvL/zvPvuu1qyZImcnZ21aNGiWlWQBgwYoEmTJmnw4MHatWuXHnzwwTrbpVVXWxo6dKhlX69evTRq1Ch16dJFmZmZmjNnju68884ax11zzTVatGiRCgoK9O2332rcuHFW1//kk08kST4+PhozZkyzXos1d9xxhyoqKuTo6Khvv/3WknwlSX379tX48eM1aNAgJSUl6aWXXtJNN92krl27Wl1rx44dio6O1oYNGxQWFmbZf/HFF2vUqFEaOXKkKisrdc8992jjxo01jk1KStKTTz4pSXrmmWf0zDPPWNr5SVLv3r01YcIE3Xzzzfr444/15JNPatKkSbUqV9Xn7bff1pYtWyzX/vbbb9c4x9VXX61bb71V77333mmtC5wLsrKytHHjRm3cuNFSbe748eOSpJtvvlnz5s1r8nMuWLBA77//vn777Tfl5eUpNDRUgwcP1tSpUzVw4MAmPx8AAADQmpDEBAAAALtxcDDomSu76po56yRJfh7OenhkJ93QN0pOjhQNBc4VBoNBl3UL19BOIXr3l1S9sXKfSiuraszZl12sye9v0iWdQ/TUmC6KCbKRGADg/DSrfeOPHf2S1O9262Nv9JVKjjdu3SF/l4bZqMLz/uVS9u6GrzUjv/45jWQ2mzVz5kxJ0v3332+zjZu/v79mzZql0aNHa+3atdq7d6/i4uKszr3vvvtqJDBVCwgI0JQpU/Tiiy9q586dys/Pl6+vr2V82LBh8vf3V25urubPn281iamoqEiLFi2SJF177bVyc3Nr1ms5VXWigiTdfvvt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6cYbb9SOHTu0bds2JScn68svv7SMTZw40eoxLXEtI0aM0JNPPilJeu+999SnTx+r89avX29JPBgxYoTN9XJycrR48WJdffXVVsffe++9Gueu5ujoqNGjR2vBggVavny5kpOTFR8ff9rXU5+IiAjFx8crOTlZn3/+uWbOnCl399qtEouLi/XZZ581+fkBSGlpaZZtW63kqkVFRVm2Dx8+rC5dGtZ6+eRzWHP06FHLdmFhoQoKChq07pkqKiqyug2cCe4rVDObzTIajTIajXJ1dZWDQ+3aHqWlpTp48KCqqqpkNBplMllvCV398/nIkSM19kdFRSkoyHrV2PT0dDk4OMjJyUmOjo5ycnKq8YdWvucvfk6hOdjrviosLGzyNUliAgAAwGkrMjnp79/s1ne7sq2Ouzg66JZBMZo6rL283ShvD6BpvbV6n9LzyyRJa1OOa/TsX/TX/m310KUd5edhvRIGAJyvHBwc9MQTT+iee+5RamqqbrrpJn300UdydXW1Or+goEAffvih7r333maN64YbbtDjjz8us9ms+fPn6+uvv5YkDRw4ULGxsVaPaYlr6devn/r06aPNmzfrnXfe0bXXXqtLLrmkxpz8/HzdeeedlpjuvvvuOtf829/+pgsvvFChoaE19q9evVpz586VJPXu3Vt9+/atMT5t2jR99tlnqqqq0rhx4/T999/bTHCoqqrSwoULNWTIkHqTIE5199136/7771dGRoYefvhhzZkzp9achx56SFlZWae1LoCGOfmDHy8vrzrnenr+2Wr5dD6cOjn5qT4fffSRpRJcS/roo49a/Jw493FfnVscHR3l7OxsSQKq3q5rX7Xt27errKys1ppubm7q0aNHo2NasWKFcnNzrY7179+/zkQlo9GoysrKGv+t3s7Pz1dJSUmj48LZg59TaA4teV/l51t/wP1MkMTUzA4ePKjZs2dryZIlOnz4sFxdXdW+fXtdd911mjp1qjw8PBq17oEDBxQTE3Nax0RHR+vAgQO19g8dOlSrV69u0Bq0agAAAEcqPfVdUbSM+dYTmEbEh+qpK+LVLsjT6jgAnInMgjK9tXpfjX1VJrM+WH9Q3+xI18OXdtTE/tFypPobAFjcdddd+uGHH/TVV1/p888/19atW3XnnXeqX79+8vX1VUFBgXbv3q1Vq1Zp0aJFcnNza/YkpsjISA0ZMkSr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PMpXe/PbVGUCNcz035+O8uamDK45O55rpsURaerf32OFEEIIUI9rHt9OTkJMbeXk5DBv3jwOHz7snFdbW8vq1atZs2YNH374IcuWLWPv3r0sWLCAvLw853p1dXV8+eWXfPfdd6xevZrZs2e32395eTmLFy9m06ZNbeaXlpaybt061q1bx3//+19Wr15NXFycyzGmpqYyb9488vPznfMaGhr44Ycf+OGHH7j++us599xzT/ZHcdLWrVvn8mdgsVg4evQoR48e5Z133uH+++/nscce65HnrKioYOnSpfz4449t5jc2NrJz50527tzJiy++yMqVKznrrLNc7mPDhg0sXLgQs7ml+mhBQQFfffUVX331VafBLyGEEP1bQEBAm8e1tbXYbDb0+tP3HO7p+8qEEOIEOBwKPx8uoabRxswEP5fr3D13GOsPl3JZcgy3zer/4aXKOgv/25XHB1uzOFbi+gB9M2+DjsXjorhy6iDGxpikJLMQQgghhBDitBPo68GNMxK5YXoCW9LLeH9rNmsOFGK1t69OW2ex8+G2HD7clsPYGBNXThnE4vFR+Hj0z0NpQ8P9ee7XE7hr7hCe+8F1mKnWYueldcdYvj6dC0ZFcO3Z8STHB8r3PyGEEP3W8VWYQEJMx1u2bBm5ubk88MADXHDBBfj4+LBx40YefvhhzGYzN9xwA5MnT2bhwoXU19fzz3/+k5kzZ2IwGPj222/55z//SWNjI9dddx1HjhzBw6OlBa3dbmfhwoVs2bIFgJkzZ3LnnXeSkJBAfn4+b7zxBitWrCA1NZW5c+eSkpKCn1/bY+tms5n58+c7A0yXX3451157LWFhYRw+fJinn36aN998k/379/feD80Nm82Gr68vF110EXPmzCEpKQmj0UhxcTEHDhzgueeeIysri8cff5xhw4a1qbqUnJzMvn37WLlyJX/5y18A+O6774iKimrzHAkJCc77jY2NzJs3j127dqHT6bjyyitZsGABCQkJWK1W1q9fz9NPP01xcTELFixg9+7d7YJi2dnZzgCTVqvl5ptvZunSpZhMJvbu3cvjjz/OI488wuTJk0/hT04IIcSp5O/vj0ajQWn1Jb+qqorg4OA+HNWp1etHXo4cOcI777zDli1bKCwspL6+nu+++44hQ4Y419m/fz/Z2dn4+voyc+bM3h6iEOIMYm6w8umOXN7dkklm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ICCAO++8E4DNmzfz+9//vsPzp0VFRbz22mvtnmvJkiUAfPnll3zyySfttqupqeGWW27pcMxCCCEGjvz8fDIyMigvL8dms1FV5f788kDWK+3k7rrrLp577jmOHTvGrbfeyosvvohe7/qpv//+e66//noaGhoIDg7mpptu6o0hCiH6sd3ZFby9OZNV+wqw2ttekfBLejlphWaSIozttvMy6NrN6ysNVjs/phWzMiWPn9JKsNg7D3TGBfuwZFwUyybHEhvk0wujFEIIIYQQQgjRE7wMOi6ZEMMlE2I4VFjNpzty+GpvPkVm11fkW+0Ka1OLWZtajI+HjvNHhrNkQjTTh4Rg0PV9aXhfTz2/OSuOq6YOYsuxMt7anMna1CIcxxUNuPbs+D4ZnxBCCCF63q233sr777/Pli1bePPNN8nKyuL2228nISGBgoIC3njjDT7//HMABg8ezF//+td2+3jooYf45JNPyM3N5b777iMlJYVrrrmGsLAwDh8+zNNPP8327duZPHlyh1WWbr75Zl588UVsNhuLFi3ioYceYvr06VgsFjZt2sTTTz+N1Wpl6NChHDly5IRf64QJExg9ejT79+/nlVdeoaKigquvvprIyEhyc3N57733+OyzzzjnnHNchqha78fLy4uGhgb++te/YjAYiIuLc7b6iY6OxttbvUD5b3/7Gz///DNbt27l2WefZd26ddx0002MHz8eX19fKioqOHDgAGvXrmX16tWMGTOGG2+8sc3zPfXUU3z//fdUV1dz5ZVX8vPPP7N06VKMRiN79+7l8ccf5/Dhw53+fIUQQgwMJpOJgoIC5+OqqioURTntKlb2SogpPDycl19+mWuuuYbXX3+d7777josuusi5/Nlnn0VRFDZt2kRaWpqzd99bb72Fn5/7K7yEEKevRpudVXsLeHtzJntyO06RfrYjl78sHNlLI+s6m93B5mNlrEzJ57sDhdQ0dn41bYifJwvHRrJkfBTjYwNOuzcdIYQQQgghhDjTDI/w5y8LR/LAghFszSjjy5R8vtlXgLnB9XfEOoudFSn5rEjJJ8jXg4vGqN8RJw4KRNvH7cQ1Gg1nDwnh7CEh5JTX8d7WLD7enkNlnZXJcYGMjja53K6m0cZPh8twKCAd0YUQQoiBQafT8fXXX7N48WI2bdrEjz/+yI8//thuvREjRrB69WqX5/NMJhPf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Tm/x8AefwKbgUXDbEJJPsOuQksFHrW4ghBBCCHEi9E0VlKInATep8xqq1DBTznbI2Qq526HR3IWdKVCSqk673lZn+QSDzqP9qg4bHPtBnb7+PcSd3RRoWggBsT316oQQQgghxBnI11NPYqhfXw9DiC4ZSMf5B5LjzxlpNBoJMAkhBoSG777rcoCpmaei467ycdwd+hOz9iosORbIyAt+TcC7SzGEh5+ikQrRscDLL0Pr50v+ffe3+Z2u/PgTAn99pVQE64RGo+HOCXfy2+9+65xXXFfMZ4c/46oRV/XaOAwGA42Njc7HEmJyISMjw3lfURQSExPRaDR89913DB061O12Go0GLy8vgoOD0el0p2Joveqrr77iN7/5DWZzy8mkuro6duzYwY4dO3jttddYtWoVQ4YM6fZzOBwObr75Zl5//fU28/Py8sjLy2PFihXceOONvPLKK86yrK6UlpayYMECtm/f3mZ+eno6y5cv5+233+a///0vN954Y7fH2m/pvcArALxM6tQmjHR8MKnVPL2LE31CCCGEEL3FywSD56gTgMMOJWlqoClnm3pbnt61fdWVdWElBbI2qdO390PUBDXQNGIxhLj/jC+EEEIIIYQQA9lAOs4/0LgKMQkhRH9nLyzEnpPTrW3HNobwzs5kBi35Nf5zZkvVJdEvmC66CK2vL3l334PSHIRRFEpfeIGY557t28ENAMkRyUyJmMK2wm3Oea/te41Lh16Kl96rV8YgIaYuiIuLczk/KirK7bLTze7du7n88supr6/Hz8+PBx54gNmzZ1NfX89HH33Eq6++yuHDh7nooovYsWMH/v7+3XqeP//5z84vNhMmTODee+9l8ODBHDt2jH//+9/s3r2b1157jdDQUP7v//7P5T7sdjuXXHKJM8D0q1/9iptuuomgoCC2bt3KP/7xD4qLi7nllluIjo7uh1d8aNSTeN4BTUGkADePA9s+bp4MvfPHQwghhBDilNLqIHyUOk1uuvKjpgRyt7UEm/J2tbSMO1n5u9Xph79B4iy4ZmXP7FcIIYQQQggh+omBdJx/IJIQkxBiILLs3HlS2w++aCne88/vodEI0TP8Z80i+OabKH3+v8551WvW0JCaiteIEX04soHh9vG3s+3blhBTaX0pnxz6hGtGXdMrz284LhApIaYuaN1/70xx9913U19fj16vZ82aNUyb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755590ApVyapovFtRENML7zwwkjubtxasmQJzj//fGzfvh3PP/88brvtNixfvjxinV//+tc4duwYAOD++++HUhn5Bt6yZUv4C89tt90WESIKeeCBB7B+/XoEAgF85zvfwbZt25CSkhJe3tnZie985zsApLasDzzwQMx6H3zwQdx1112w2Wx4+OGH8fTTT0csr6ioCH9ZmzZtGkNMRERERJR8qTnwLbgdf/msE1rRha+fl4uUqn8ClVuBoC/2NhmlgKsZ6Gwb3DFsFdJ0oPsOJLURKFjcE2zKWwioeeKJiIiIxoBgUAoDuW1Ap016dLf2PO/sfu1uk553tkmBJH/nQHsefZ6OZFdAFNN4O89PRESJkblgAayffTbs7buaTsP24oswXnUV5EbjCFZGNHztf/sbbN3B7BDjVVdCVViYpIrGj1hdmAoMBbi85PIkVTT+cYDhUfLkk09ixYoV6OzsxCWXXIL/+q//wgUXXIDOzk789a9/xfr16wFInZC+//3vD+sYpaWleOihh/DYY49hz549WLFiBX7wgx+gpKQEFRUV+PnPf459+/YBAB566CFMnz495n5uu+02/OlPf8KOHTvwu9/9Dg0NDbj77ruRlpaGXbt24X/+539gt9shk8nw1FNPcVxqIiIiIhpT3IIOvnlfQ8p590oX405+JA0TV/5J5IW5G/4CmEuA1nKg5t/SVP1voOXE4A7U1QGUfyxNACDIgKyzukNNS6VQU3qx1DGKiIiIaLgCvj7Bo77BpLbo5Z72kemKlAyd7cmugCiu8XSen4iIEmP+N76BA888M+ztX7hVgy3lv8AVX3scyxasRfqNNyFlzlkjWCHR0LS+sAFNP/955EyFAhn3sQvTYGyp2YKjrUcj5t07/14oZezCNFxMo4ySs88+G6+++ipuvvlm2O12/Nd//VfUOqWlpdi0aRMMZ9A28H//93/R1NSEP/3pT9i3bx9uuOGGqHXuuusu/OQnP4m7D7lcjrfffhtr167F7t278cYbb+CNN96IWEetVuPpp5/Gl7/85WHXSkREREQ06lJMwLzrpMnrkoJMx94D2quBjGnSOhnTpensm6XXpz8DXri0104EYDDD04lBoOGQNO1+rvv4aVKYKTTlngPoM0fwByQiIqJxJRjsDh21SB0hXc2AqyV+xyS3DfA6kl318MjkAATpZ0afQFVKOnDB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//xzSbceP9e+fXuTI4Ir6tChg3W5qhr6888/W5epoTCTv7+/WrVqpaysLJ05c8bscFBPpKena/jw4UpPT5fFYtHKlSs1ZsyYSvehRsJRapKPtqJGwp7GjBmjtWvX6vr16/riiy/04IMPSqI+whwV5aOt3NzcFBwcrKSkJOojKvTWW28pPz9fXbp0UU5OjtasWVNmm++++866/PXXX+vcuXOSpIiICPn4+FAjgX/54Ycfan2Mdu3a2SGSmuGzXDc5Kq86dOig/fv36/r167p8+XKlT1oofr/btGlT6vE49tajRw8dPXpUeXl5unDhgtq0aeOwc8E2zuqPpP64jrrWx809JVTHL2tV8aPhy2N2rWIQE0zRo0cP7d69WykpKSosLJSbW/mp+OOPP1qXu3fv7qzwgHJVNm0j4CzF3+iRStfI8lBDUZdQQ1EdWVlZuueee3TixAlJt75V//DDD1e5HzUSjlDTfKwOaiTspWRHSVpamnU5ODhYjRs3VlFREfURTlNRPlYH9RFVKX7MwYkTJzRp0qQqt//zn/9sXU5NTZWPjw9tSOBfQkJCzA6hVmjv1E2OyqsePXpow4YNkm69nwMHDix3u8LCQh0/flyS499r2i11kzP6I2lLuJa61sdN7YGtalKr3Nzc1K1bN4fGVR4eJwdTDB48WNKtqci++eabCrcrOfXdXXfd5fC4gMocPXrUuswsTDBL586drflX1fSg//jHPyRJt99+uwIDAx0dGlChzMxMZWVlSaJ+ompXrlzRvffea/29+9prr+nJJ5+0aV9qJOytNvloK2ok7KnkNy9LTvft7u6uAQMGSJISExOVn59f4TGK66eHh0el38oDqlJRPtqqsLBQx44dk0R9hGPRhgQaBto7rqW4j0mqvHYnJSVZZ0JxdB9T8d+NHh4eatWqlUPPBds5oz+StoRrqUt93NxTQnX0799f7u7ukiqvVfn5+dq3b591nyZNmjglvpIYxARTjB071rq8atWqcre5efOmVq9eLUny8/NTeHi4M0IDypWamqqdO3dKkrp27arbb7/d5IjgqiwWi/XxNT/++KO1IfFL+/bts46UHjNmDKPxYaply5bJMAxJ0tChQ02OBnVZTk6ORo0apUOHDkmSXnrpJb3wwgs270+NhD3VNh9tRY2EPa1bt8663KtXr1Lriv8Ov3r1qjZu3Fju/qdP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AAAAAAAaOh4nBwAAAKBadu3apaioKF27ds36s7S0NK1cuVLbt29XfHy8QkJC9Mknn2jKlCnKz8+3bnf69Gm9//77+vvf/669e/eqffv25Z7j0qVL+t3vfqevv/661M9v3Lihb775Rt98843ee+89bdmyRQMHDnTMhVZg06ZNmjx5snJycqw/y8jI0ObNm7Vt2zZ99NFHmjBhQpn9zp49q+HDh+vo0aOlfn7p0iVdunRJx44d0xdffKH09HQtXLjQ4dcBAAAAAAAAAEBdwkxMAAAAAGyWnp6u8ePHy8/PT0uWLNH+/fu1e/duPfvss7JYLMrIyNC0adN08OBBPfzww+ratauWL1+uAwcOKDY2Vg899JCkW4Oe/uu//qvcc9y4cUPDhw/X119/rcaNG+uhhx7SJ598on379mn37t169dVX1apVK2VkZGjkyJFlZn9ypCNHjujBBx9U27Zt9c4772jfvn1KTEzUnDlz5OnpqaKiIk2fPl2ZmZll9n366aetA5gmT56sjRs3at++fTp48KC2bt2qV155Rb1793batQAAAAAAAAAAUJcwExMAAAAAmyUnJ6tbt25KSEhQmzZtrD8fPHiw3NzctHDhQiUkJGjUqFEaMGCAdu7cKW9vb+t2YWFhysvL07p167RhwwZlZmaWOo4k/elPf9KhQ4fk5+enXbt2qV+/fqXWDx48WP/xH/+hQYMG6ezZs3rxxRf10UcfOfbC/+XQoUPq16+fvv76a/n6+lp/PnDgQAUFBWny5Mm6evWqPvzwQ82cOdO6Pi8vT1u3bpUkzZo1q9yZliIiIjR37lxdvHjR8RcCAAAAAAAAAEAdw0xMAAAAAKrl7bffLjPwSJKeeOIJ63JWVpaWL19eagBTsccff1ySVFhYqMTExFLrsrOz9e6770qS/vznP5cZwFQsICBAL7/8siRp3bp1un79es0upgZWrlxZagBTsQcffND6eLzdu3eXWnfx4kUVFBRIkn77299WevyWLVvaKVIAAAAAAAAAAOoPBjEBAAAAsJmfn5/uvffectd17txZzZo1kyTdeeed6t69e7nblXxk2okTJ0qti4+P15UrVyRJv/vd7yqNpXgwUEFBgb755hvbLqCWevXqpTvvvLPcdRaLRX379pVU9rpatWold3d3SdLf/vY3FRYWOjZQAAAAAAAAAADqGQYxAQAAALBZt27dZLFYKlzv5+cnSQoODq5yG0m6du1aqXVJSUnW5Xbt2slisVT46tmzp3Xbc+fOVfNKaiYkJKTS9cWzKP3yujw8PDRhwgRJ0vr16xUUFKTnn39en3/+uS5fvuyQWAEAAAAAAAAAqE8YxAQAAADAZuU9Hq6kRo0aVbld8TaSVFRUVGpdRkZGjeLKycmp0X7VZev1//K6JOmdd95RRESEJCktLU2vv/66Ro0apVatWql///56/fXXrbNQAQAAAAAAAADgatzMDgAAAAAAipUc/HPo0CE1adLEpv06dOjgqJDsxtfXV1u3btWBAwe0du1axcXF6dtvv1VRUZGSkpKUlJSkhQsXavPmzRo0aJDZ4QIAAAAAAAAA4FQMYgIAAABQZ7Rq1cq63KZNm3oxOKm6BgwYoAEDBki69di5uLg4xcTEaOPGjcrIyNC4ceN0/PhxeXl5mRwpAAAAAAAAAADOw+PkAAAAANQZffv2tS4nJCSYGIlzNGvWTBEREdqwYYN+//vfS5LOnj2rPXv2mBwZAAAAAAAAAADOxSAmAAAAAHXG8OHD5e3tLUl6++23ZRiGyRE5z7Bhw6zLWVlZJkYCAAAAAAAAAIDzMYgJAAAAQJ3h5+enp556SpK0d+9ezZw5Uzdv3qxw+/Pnz2v58uXOCq/GTpw4ofj4+Eq32bFjh3W5c+fOjg4JAAAAAAAAAIA6xc3sAAAAAACgpD/96U+Kj4/X/v37tXjxYsXFxemxxx5Tnz595OPjo0uXLun777/Xrl279Pe//129evXStGnTzA67UqdOnVJ4eLh69OihyMhIhYaG6vbbb5ck/fzzz/r000+1du1aSVKfPn3061//2sxwAQAAAAAAAABwOgYxAQAAAKhTPDw8tHPnTk2ZMkUbN27UP//5T+vsTOXx9fV1YnS1c/ToUR09erTC9SEhIdq4caMsFosTowIAAAAAAAAAwHwMYgIAAABQ5zRr1kwbNmzQnj179MEHH2j37t1KT09Xbm6ufH191bVrVw0YMECjRo3SiBEjzA63SkOGDFFcXJy+/PJL7du3Tz///LPOnz+vvLw8tWzZUr1791ZUVJSmTJkiDw8Ps8MFAAAAAAAAAMDpLIZhGGYHAQAAAADOFhgYqLS0NEVHRysmJsbscGwWFxen8PBwSVJsbKzCwsLMDQgAAAAAAAAAADtgJiYAAAAALu3y5cv67rvvJEnu7u4KDg42OaKyMjIylJGRIUlKTU01ORoAAAAAAAAAAOyPQUwAAAAAXNqWLVu0ZcsWSVJAQIBOnjxpbkDleO+99zR37lyzwwAAAAAAAAAAwGEamR0AAAAAAAAAAAAAAAAAANdmMQzDMDsIAAAAAAAAAAAAAAAAAK6LmZgAAAAAAAAAAAAAAAAAmIpBTAAAAAAAAAAAAAAAAABMxSAmAAAAAAAAAAAAAAAAAKZiEBMAAAAAAAAAAAAAAAAAUzGICQAAAAAAAAAAAAAAAICpGMQEAAAAAAAAAAAAAAAAwFQMYgIAAAAAAAAAAAAAAABgKgYxAQAAAAAAAAAAAAAAADAVg5gAAAAAAAAAAAAAAAAAmIpBTAAAAAAAAAAAAAAAAABMxSAmAAAAAAAAAAAAAAAAAKZiEBMAAAAAAAAAAAAAAAAAUzGICQAAAAAAAAAAAAAAAICpGMQEAAAAAAAAAAAAAAAAwFQMYgIAAAAAAAAAAAAAAABgKgYxAQAAAAAAAAAAAAAAADAVg5gAAAAAAAAAAAAAAAAAmIpBTAAAAAAAAAAAAAAAAABMxSAmAAAAAAAAAAAAAAAAAKZiEBMAAAAAAAAAAAAAAAAAU/1/RJfNPSGZCccAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "p6.plot()\n", - "p7.plot()\n", - "p8.plot()\n", - "p9.plot()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Attributes" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Pulse implements these attributes:\n", - "- `start`\n", - "- `duration`\n", - "- `finish` (read only)\n", - "- `amplitude`\n", - "- `frequency`\n", - "- `relative_phase`\n", - "- `phase` (read only) returns the total phase of the pulse (global, based on its start + relative)\n", - "- `shape` a `PulseShape` object\n", - "- `channel`\n", - "- `type`\n", - "- `qubit`\n", - "- `serial` a str representation of the object\n", - "- `envelope_waveform_i` a Waveform object\n", - "- `envelope_waveform_q` a Waveform object\n", - "- `envelope_waveforms` a tuple of (Waveform, Waveform)\n", - "- `modulated_waveform_i` a Waveform object\n", - "- `modulated_waveform_q` a Waveform object\n", - "- `modulated_waveforms` a tuple of (Waveform, Waveform)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Methods" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Operators" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Pulse now supports a small set of operators (`==`, `!=`, `+`, `*`).\n", - "Pulse is hashable, but not unmutable (its hash depends on the current value of its parameters), so one can use the following operators to compare pulses:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "p0 = Pulse(0, 40, 1, 100e6, 0, Rectangular(), 0, PulseType.DRIVE, 0)\n", - "p1 = Pulse(100, 40, 1, 100e6, 0, Rectangular(), 0, PulseType.DRIVE, 0)\n", - "p2 = Pulse(0, 40, 1, 100e6, 0, Rectangular(), 0, PulseType.DRIVE, 0)\n", - "\n", - "assert p0 != p1\n", - "assert p0 == p2\n", - "\n", - "# If we change p1 start to 0 it become the same as p0\n", - "p1.start = 0\n", - "assert p0 == p1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Since it is hashable, it can also be used as keys of a dictionary:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "rp = Pulse(0, 40, 0.9, 100e6, 0, Rectangular(), 0, PulseType.DRIVE)\n", - "dp = Pulse(0, 40, 0.9, 100e6, 0, Drag(5,1), 0, PulseType.DRIVE)\n", - "hash(rp)\n", - "my_dict = {rp: 1, dp: 2}\n", - "assert list(my_dict.keys())[0] == rp\n", - "assert list(my_dict.keys())[1] == dp" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Adding two Pulses returns a PulseSequence. Multiplying a Pulse by an integer n returns a PulseSequence with n deep copies of the original pulse." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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LV68OA8++GBuvfXW/OEPf8iyZctSW1ubQqFQ6tLW2vz58+uOu3TpssbxK4JUCxYsKGq+bbfdNocffnh222239OnTJ0kyY8aM3H///bnvvvuyePHifP3rX0+hUMiIESPW6t4r7tdQL06blrff6LRW1wC88MILpS4BWAfpHUAx9A6gGHoHUCz9AyiG3gEUQ+8AGmLu/EWlLmGNyj5INWHChNx66625//776wJItbW1SZLu3bvnkEMOKWV5RVm8eHHdcWVl5RrHt2/fPklSVVW11nMNGzYsJ5xwwicCZ4MGDcpRRx2VRx55JIcffniWLl2ac889N4ceemg23XTTtZ4HAAAAAAAAAACaU1kGqaZNm5bbbrstt99+e1577bUk/xee2nDDDXPYYYfliCOOyH777ZeKinXvH1GHDh3qjhuyzd2SJUuSJB07dlzrubp161bv+YMPPjgXXXRRvve972XRokUZM2ZMLrzwwgbff03bDb7xxhvZeeed677fvl+/9NqoR4PvD5SvpUuX1v12RP/+/dOuXbsSVwSsC/QOoBh6B1AMvQMolv4BFEPvAIqhdwBr66057yf5Y6nLqNe6lxIq0vvvv58777wzt956a5599tkk/xeeSpJCoZAf/ehHOe+889K2bdtSldkkunbtWnfckO36Fi5cmKRh2wAWY8SIEbnoootSW1ubCRMmrFWQqnfv3ms1V2W7igatwgXwUe3atdM7gLWmdwDF0DuAYugdQLH0D6AYegdQDL0DaIjKdq0/ptSm1AU0p5qamjz00EM5/PDDs9lmm+Wb3/xmJk2alNra2lRUVOTggw/O3XffXTd+2223XedDVMmHK1JtuOGGSZJZs2bVO/b999+vC1L16dOnWerZZJNN6uqZPXt2s8wBAAAAAAAAAACN0fqjXkWYNGlSbr311tx999157733kvzf6lO77LJLvva1r+Woo46qC/ccddRRJau1uQwcODBPPPFEpk+fnpqamtVuUbhiqcUkGTBgQLPVUygUmu3eAAAAAAAAAADQWOtdkGrAgAGZNm1akv8LT/Xt2zdf/epXc9xxx2W77bYrZXktZs8998wTTzyRhQsX5rnnnssuu+yyynETJkyoO95jjz2apZZ33nknc+bMSZJsvvnmzTIHAAAAAAAAAAA0xnq3td8///nP1NbWpnPnzjnjjDPy5z//OdOmTcvFF19cNiGqJDnssMPqjm+55ZZVjlm+fHluvfXWJEn37t0zZMiQZqll1KhRdaG2vffeu1nmAAAAAAAAAACAxljvglTJh9vILVy4MM8880wmTZqUt99+u9Qltbidd945X/jCF5IkY8aMyVNPPfWJMVdddVWmTp2aJDn77LPTrl27lc4//vjjKRQKKRQKGT58+Ceuf+WVV/L888/XW8cjjzyS73//+0mSjh075sQTTyzm7QAAAAAAAAAAQLNa77b2O+GEE3L//fdnwYIFee655/Lcc8/lW9/6Vvbdd98cd9xxGTZsWDp16lTqMlvEddddlz322CNVVVUZOnRovvvd72bIkCGpqqrKXXfdlVGjRiVJ+vXrl5EjR671/V955ZUMGTIku+22Ww455JB87nOfyyabbJIkmTFjRu67777cd999datRXXnlldliiy2a7g0CAAAAAAAAAEATWe+CVLfcckt+/vOf5/77789tt92WP/zhD6mpqcmjjz6aRx99NJ06dcqwYcPy1a9+Nfvvv3/atFkvF+VKkuywww65++67c9xxx2XevHn57ne/+4kx/fr1y7hx49K1a9ei53nqqadWueLVCp06dco111yTESNGFD0HAAAAAAAAAAA0p/UuSJV8uIXccccdl+OOOy5vvPFGbrvtttx+++35+9//noULF+aOO+7IHXfckV69euWoo44qdbnN6pBDDslf//rXXHfddRk3blxmzZqVysrK9O3bN1/5yldy5plnFr1C14477pjbb789Tz31VCZPnpw33ngjc+bMSU1NTXr06JFPf/rT2XfffXPKKafUrVQFAAAAAAAAAACt0XoZpPqozTbbLOeff37OP//8PP/88/nlL3+Zu+66K2+//XbefPPNXH/99SkUCkmSX/3qV9l+++2zww47lLjqprXVVlvl6quvztVXX71W1w0ePLhuW75V6dq1a7761a/mq1/9amNLbBL77bljunUrfmUtAAAAAAAAAACaR7duXbPfnjtmzDWlrmT11t997VZhhx12yLXXXpvZs2fn4Ycfzpe//OVUVlamtrY2tbW1ueuuu7LTTjtlu+22y/nnn59JkyaVumTWws6fH5gOlZWlLgMAAAAAAAAAgI/pUFmZnT8/sNRl1KusglQrtG3bNl/84hdzzz335M0338x//ud/Zvfdd68LVL388su56qqrsttuu2WrrbYqdbkAAAAAAAAAAEAzK8sg1Ud169Ytp512WiZOnJjp06fne9/7Xrbddtu6UNWsWbNKXSIAAAAAAAAAANDMyj5I9VHbbrttLr300kyfPj1/+tOfcvLJJ2eDDTYodVkAAAAAAAAAAEAzE6RajT333DM33XRT3nzzzVKXAgAAAAAAAAAANDNBqjVo3759qUuggea8Nzc1y5eXugwAAAAAAAAAAD6mZvnyzHlvbqnLqJcgFeuNUf/167z77vulLgMAAAAAAAAAgI959933M+q/fl3qMuolSAUAAAAAAAAAAJQ9QSoAAAAAAAAAAKDsCVIBAAAAAAAAAABlT5AKAAAAAAAAAAAoe4JUAAAAAAAAAABA2ROkAgAAAAAAAAAAyp4gFQAAAAAAAAAAUPYEqQAAAAAAAAAAgLJX0ZKTVVVVZdasWVmwYEGqqqrSsWPHdOnSJb17907Hjh0bff/XXnutCar8pC233LJZ7gsAAAAAAAAAALQOzRqkWr58eR588ME8+OCDefLJJzNz5szU1tZ+YlyhUEifPn2yxx57ZNiwYRk2bFjatFn7xbK22Wabpij7E7XV1NQ0+X0BAAAAAAAAAIDWo9mCVL///e9z1llnZfr06UmyygDVCrW1tXn11Vfz2muv5c4778z222+f66+/PkOHDl2rOeubAwAAAAAAAAAAYHWaJUg1ZsyYfP3rX8/y5cvrwk39+vVL//7906dPn3Tu3Dnt27fPkiVLsnDhwsycOTMvvPBCpk2bliSZNm1avvjFL2bUqFE58cQTGzzvLbfc0hxvBwAAAAAAAAAAWM81eZBqypQpOfPMM7Ns2bJssMEG+c53vpPhw4enV69ea7z2rbfeyi233JKf/OQnmTdvXs4444zsuuuuGTBgQIPmPuGEExpbPgAAAAAAAAAAUIbaNPUNr7/++ixZsiS9evXKc889lwsuuKBBIaok6dWrV7797W/nueeeyyabbJIlS5bk+uuvb+oSAQAAAAAAAAAAVtLkQarHHnsshUIh//7v/57tttuuqHtst912+fd///fU1tbmsccea+IKWV/t/PkB6da1S6nLAAAAAAAAAADgY7p17ZKdP9+wXelKpcm39nv99deTJLvsskuj7rPi+hX3a0ovvfRSnnrqqbz55ptZtGhRTj/99Gy00UZNPg8ta789d0qHDu1LXQYAAAAAAAAAAB/ToUP77LfnTqUuo15NHqTq0qVLlixZkvfee69R93n//feTJJ07d26KspIk//M//5NzzjknTz755Eqvf/nLX14pSPWzn/0sl156abp165YpU6akXbt2TVYDAAAAAAAAAADQ+jT51n79+/dPkowePbpR97npppuSJAMGNM2SXo888kj22GOPPPnkk6mtra37WpXjjz8+VVVVmTFjRh555JEmmR8AAAAAAAAAAGi9mjxIdeyxx6a2tjb3339/zjrrrCxevHitrl+8eHHOOuus3H///SkUCjn22GMbXdMbb7yRY445JkuWLMnAgQPz29/+NvPnz1/t+K5du+bQQw9Nkvz2t79t9PwAAAAAAAAAAEDr1uRBqlNPPTU77bRTamtr87Of/Sx9+vTJGWeckXvuuSd//etf895776W6ujpJUl1dnffeey9//etfc8899+SMM85Inz598rOf/SxJMmjQoJx66qmNrumaa67JwoULs9VWW+WJJ57IAQccsMYtAwcPHpza2to899xzjZ4fAAAAAAAAAABo3Sqa+oZt27bNb3/72xx22GF58skn8+677+YXv/hFfvGLXzTo+hXb7e2xxx556KGH0qZN47Nev/vd71IoFDJy5Mh07969Qdes2KLw5ZdfbvT8AAAAAAAAAABA69bkK1IlyYYbbpgJEyZk9OjRGTBgQGpraxv8NWDAgIwZMyYTJkzIhhtu2CT1vPrqq0mSnXfeucHXbLDBBkmSBQsWNEkNNL8f//S2vPXOu6UuAwAAAAAAAACAj3nrnXfz45/eVuoy6tXkK1Kt0KZNm5x00kk56aST8uKLL2bixImZMmVKZs2alfnz52fx4sXp0KFDunbtmt69e2fgwIHZc889s/322zd5LTU1NUmS5cuXN/iauXPnJkm6dOnS5PUAAAAAAAAAAACtS7MFqT5q++23b5aAVENtuummeeWVVzJjxozsuuuuDbpm0qRJSZItt9yyOUsDAAAAAAAAAABagWbZ2q+1+cIXvpDa2trce++9DRpfXV2dG2+8MYVCIYMHD27e4gAAAAAAAAAAgJIriyDV8OHDkyS//vWv89///d/1jq2urs7xxx+fl156KYVCIaeeemoLVAgAAAAAAAAAAJRSWQSpBg8enKOOOiq1tbU55JBDcsEFF9Rt3Zckr7zySv785z/niiuuyKc//ence++9KRQK+frXv55Pf/rTJawcAAAAAAAAAABoCRWlLqCljB07NvPnz89vfvObXHnllbnyyitTKBSSJIccckjduNra2iTJ4Ycfnuuuu64ktQIAAAAAAAAAAC2rLFakSpL27dvnkUceyY033phtt902tbW1q/zq3bt3fv7zn+e+++5L27ZtS102AAAAAAAAAADQAspmRaoVTj311Jx66qmZMmVKJk+enLfffjvLli3LhhtumB122CH/8i//UrdSFQAAAAAAAAAAUB7KLki1wsCBAzNw4MBSlwEAAAAAAAAAALQCZbO1HwAAAAAAAAAAwOoIUgEAAAAAAAAAAGWv7Lb2+9///d888cQTmTFjRubPn59ly5bVO75QKGTMmDEtVB0AAAAAAAAAAFAKLRKk2mabbdKmTZv8/ve/T9++fRt0zWuvvZbBgwenUCjkpZdeanQN//znP3PSSSfl6aefbvA1tbW1glQAAAAAAAAAAFAGWiRI9eqrr6ZQKKS6urrB1yxdujSvvPJKCoVCo+efPXt29tprr8yZMye1tbVJki5duqRHjx5p08buhgAAAAAAAAAAUO7KYmu/H/3oR3nnnXdSKBRyyimn5Fvf+lb69etX6rJoYv37bpUunTuXugwAAAAAAAAAAD6mS+fO6d93q1KXUa9WuxzT3LlzkySdOnVq9L1+97vfpVAo5Pjjj8+oUaOEqNZTh//rXuncqUOpywAAAAAAAAAA4GM6d+qQw/91r1KXUa9WG6S6/fbbkyRbbdX4JNrrr7+eJDn++OMbfS8AAAAAAAAAAGD90yxb++2zzz6rfP3EE09M5zVsvbZkyZLMmDEjb7/9dgqFQoYOHdroenr06JG333473bt3b/S9AAAAAAAAAACA9U+zBKkef/zxFAqF1NbW1r1WW1ubZ599dq3us+222+Y73/lOo+vZaaed8pvf/CbTpk3LDjvs0Oj7AQAAAAAAAAAA65dmCVLttddeKRQKdd9PmDAhhUIhO+64Y70rUhUKhXTo0CGbbbZZdt999xx99NFrXMGqIc4666yMGzcuo0aNylFHHdXo+61rXn311Vx//fUZN25cZs6cmfbt22e77bbLkUcemTPOOCOdOnVqknl++9vfZtSoUXn22WfzzjvvZOONN86gQYMyYsSIHHjggU0yBwAAAAAAAAAANIdmW5Hqo9q0aZMkGTt2bAYOHNgcU9Zr//33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r30t119/fWbMmJFTTz01STJ16tRcc801jZ5/iy22SPLh0oLl4rDDDqs7vuWWVe8vuXz58tx6661JPlxqcciQIWs1R6FQyJe+9KUkH6449fTTT69y3NNPP123ItWXvvSldX7PTgAAAAAAAAAA1j8tEqS66667UigUsv/+++emm25K586dVzu2U6dOufHGGzN06NDU1tbmrrvuavT8hxxySJLkySefbPS91hU777xzvvCFLyRJxowZk6eeeuoTY6666qpMnTo1SXL22WenXbt2K51//PHHUygUUigUMnz48FXOc84556Rt27ZJkm9+85upqqpa6XxVVVW++c1vJkkqKipyzjnnNOZt1WvLzTdJp/9/D14AAAAAAAAAAFqPTh07ZsvNNyl1GfVqkSDV9OnTkySnn356g69ZMfall15q9Pzf+ta30rNnz1x11VV58803G32/dcV1112Xjh07pqamJkOHDs1//Md/5Omnn8748eNz2mmn5fzzz0+S9OvXLyNHjixqjn79+uW8885LkkyePDl77LFH7r777kyePDl333139thjj0yePDlJct5552X77bdvmje3CscdfkC6dunUbPcHAAAAAAAAAKA4Xbt0ynGHH1DqMupV0RKTtG/fPlVVVenTp0+Dr1kxtrKystHzb7755vnVr36Vww47LLvvvnt++tOf5qCDDmr0fVu7HXbYIXfffXeOO+64zJs3L9/97nc/MaZfv34ZN25cunbtWvQ8P/rRj/L222/n5ptvzvPPP5+jjz76E2NOPvnk/PCHPyx6DgAAAAAAAAAAaE4tEqTq379/nn766cycOTM77LBDg66ZOXNm3bWNtc8++yRJevbsmWnTpuWQQw5J9+7ds/3226dTp/pXMCoUCvnDH/7Q6BpK5ZBDDslf//rXXHfddRk3blxmzZqVysrK9O3bN1/5yldy5plnrvGfwZq0adMmY8aMyRFHHJFRo0bl2WefzZw5c7LRRhtl0KBBOe2003LggQc20TsCAAAAAAAAAICm1yJBquHDh+epp57KL37xixx66KENuuYXv/hFCoVCjj/++EbP//jjj6dQKNR9X1tbm/fffz+TJk1a7TWFQiG1tbUrXbeu2mqrrXL11Vfn6quvXqvrBg8enNra2gaPP+igg8pipS8AAAAAAAAAANY/LRKkOuWUU/LAAw/k97//fU4//fRcffXV6dChwyrHLlmyJCNHjszvfve7HHDAARkxYkSj599rr73Wi0AUAAAAAAAAAADQPJo0SPWnP/1ptef+7d/+Le+9915uvPHGPPTQQznyyCMzaNCgbLLJJikUCnnrrbfy7LPP5t57782bb76ZQYMGZeTIkXniiSey1157Naquxx9/vFHXAwAAAAAAAAAA67cmDVINHjy4QSs/vfXWW7nhhhvqHTN58uQccMABKRQKqampaaoSWY9d9p+354ffOSsb9+xe6lIAAAAAAAAAAPiId977IJf95+2lLqNeTb61X21tbVPfEhpk2bLaLF+2rNRlAAAAAAAAAADwMcuXLcuyZa07V9SkQarx48c35e0AAAAAAAAAAABaRJMGqfbee++mvF2zeuWVVzJnzpxUVVWtcRWtvfbaq4WqAgAAAAAAAAAASqHJt/Zrzf75z3/mxz/+cX79619n3rx5DbqmUCikpqammSsDAAAAAAAAAABKqWyCVA899FC++tWvZvHixWtcgQoAAAAAAAAAACgvZRGkmjlzZo477rhUVVVliy22yHnnnZdOnTplxIgRKRQKeeyxx/Lee+9l8uTJue222/L6669nzz33zCWXXJK2bduWunwAAAAAAAAAAKCZtUiQap999in62kKhkD/84Q+Nmv/666/PokWL0rVr1zzzzDPZfPPN849//KPu/JAhQ5IkRxxxRC666KKcfPLJufvuuzNmzJjccccdjZobAAAAAAAAAABo/VokSPX444+nUCjUu6VeoVBY6fsVYz/+ejEee+yxFAqFnH766dl8883rHduxY8fcfvvtmTZtWu66664cfvjhOeKIIxpdAwAAAAAAAAAA0Hq1SJBqr732WmMgauHChZk+fXo++OCDFAqF9OvXL5tttlmTzP/KK68kSXbfffe61z5aT01NTSoq/u8fRZs2bXLWWWdl+PDhufnmmwWpAAAAAAAAAABgPddiK1I11G9+85ucddZZee+99zJmzJjssccejZ5/4cKFSZI+ffrUvdapU6e647lz52bDDTdc6ZpPf/rTSZL//d//bfT8AAAAAAAAAABA69am1AV83EEHHZSJEyemoqIiw4YNy+zZsxt9z27duiVJFi9eXPfaR4NTL7300ieumTt3bpJkzpw5jZ4fAAAAAAAAAABo3VpdkCpJNt1005x77rmZM2dOLr/88kbf71Of+lSSZMaMGXWvde3aNVtttVWS5NFHH/3ENf/93/+dJOnevXuj5wcAAAAAAAAAAFq3VhmkSpI999wzSTJu3LhG32u33XZLkjz99NMrvX7wwQentrY2V1xxRcaPH1/3+j333JPrrrsuhUKhSbYWBAAAAAAAAAAAWrdWG6SqrKxMkrz++uuNvtdBBx2U2traPPDAA1m2bFnd6+edd146deqUBQsWZL/99svGG2+crl275phjjsnixYvTpk2bnHfeeY2eHwAAAAAAAAAAaN1abZBq4sSJSZJOnTo1+l6DBw/OxRdfnBNPPDGzZ8+ue33LLbfMvffem27duqW2tjbvvvtuFi5cmNra2rRv3z433XRTdt1110bPT8vYuGe3dGjfvtRlAAAAAAAAAADwMR3at8/GPbuVuox6VZS6gFV56qmn8v3vfz+FQiE777xzo+9XKBRy8cUXr/LcgQcemBdffDH33Xdf/vGPf6Smpibbb799jjzyyGyxxRaNnpuWc+qxh6bbBl1KXQYAAAAAAAAAAB/TbYMuOfXYQ/OT751b6lJWq0WCVN///vfXOGb58uV5//33M3ny5DzzzDNZvnx5CoVCzj23+f/hbbjhhjnttNOafR4AAAAAAAAAAKB1apEg1SWXXJJCodDg8bW1tamoqMjll1+e/fffvxkrAwAAAAAAAAAAaMGt/Wpra+s9XygU0rVr12yzzTbZe++9M2LEiAwcOLCFqgMAAAAAAAAAAMpZiwSpli9f3hLTNMjy5cszZcqUzJgxI/Pnz8+yZcvWeM3xxx/fApUBAAAAAAAAAACl0mIrUpVaVVVVfvjDH+amm27Ku+++2+DrCoWCIBUAAAAAAAAAAKzn2pS6gJZQVVWVffbZJz/5yU8yZ86c1NbWrtUX64arbror730wr9RlAAAAAAAAAADwMe99MC9X3XRXqcuoV1msSHXNNdfkmWeeSZJ85jOfyZlnnpkdd9wxPXv2TJs2ZZElKwtLlizN0qVLS10GAAAAAAAAAAAfs3Tp0ixZ0rpzHS0SpHrttdea5b5bbrllg8bdfffdSZLdd989f/zjH1NZWdks9QAAAAAAAAAAAOumFglSbbPNNk1+z0KhkJqamgaNfemll1IoFHL++ecLUQEAAAAAAAAAAJ/QIkGq2tralphmtSorK1NVVdXgFawAAAAAAAAAAIDy0iJBqltuuSVJ8vOf/zzPPvts2rVrl6FDh2bnnXdOr169kiRvvfVWnn322Tz66KNZunRpdtppp5x++ulNMn///v3zzDPP5M0332yS+wEAAAAAAAAAAOuXFglSnXDCCTn55JMzefLkDB06NGPGjMkWW2yxyrGzZ8/Oqaeemt///vd54oknMnr06EbPP3z48Dz99NO5995786//+q+Nvh8AAAAAAAAAALB+adMSk9x333255ZZbstNOO2XcuHGrDVElyRZbbJGHH344O+64Y2655Zbcc889jZ7/1FNPzT777JNbb701d955Z6PvBwAAAAAAAAAArF9aZEWqG2+8MYVCIf/2b/+Wtm3brnF827ZtM3LkyBxzzDEZNWpUjjzyyAbN89prr6323A033JBTTz01xx13XB588MEce+yx6d+/fzp16rTG+2655ZYNmh8AAAAAAAAAAFg3tUiQ6q9//WuSpF+/fg2+ZsXYv/3tbw2+ZptttlnjmNra2tx///25//77G3TPQqGQmpqaBtcAAAAAAAAAAACse1okSDV//vwkydtvv93ga1aMXXFtQ9TW1jbpOAAAAAAAAAAAoDy0SJBqq622yrRp03LrrbfmgAMOaNA1t956a5K121bvlltuKao+AAAAAAAAAACgvLVIkOpLX/pSLr/88tx111353Oc+l/PPP7/e8VdeeWXuvPPOFAqFDBs2rMHznHDCCY0tFQAAAAAAAAAAKEMtEqT69re/ndtuuy1vvvlmvvOd7+TOO+/MCSeckEGDBmWTTTZJoVDIW2+9lWeffTa33XZb/vKXvyRJNt1001xwwQUtUSIAAAAAAAAAAFDGWiRI1b179zz22GM54IADMmvWrPz1r3/NyJEjVzu+trY2vXv3zu9+97t07969JUoEAAAAAAAAAADKWJuWmmjAgAH5xz/+kZEjR6Z79+6pra1d5Vf37t3zb//2b/n73/+egQMHNsncVVVVufXWW3PrrbfmnXfeWeP4d955p2780qVLm6QGml/XLh1TWdmu1GUAAAAAAAAAAPAxlZXt0rVLx1KXUa8WWZFqha5du+aKK67Ij3/84zz33HP529/+lvfeey9J0qNHj3z2s5/NjjvumMrKyiad95577smJJ56YLbbYIscee+wax/fo0SMXXnhhXn/99VRWVuboo49u0npoHt8c/uX06LZBqcsAAAAAAAAAAOBjenTb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a9eupS4ZaEW+8Y1v5PTTT1/t+c6dO7dgNUBrseWWW6Z///559NFH1/raCy+8sO7Bfocddsj555+f7bbbLi+99FIuv/zyPP/88xk9enQ23njj/PjHP27q0oESa0z/WOH3v/99Nt9889We7927d9H3BlqH119/PUmy+eab5ytf+Uq+8IUvZMstt8yyZcvy1FNP5aqrrsrs2bNz6623ZunSpfmv//qv1d7LsweUj6bsHSt47oDy0KdPnwwZMiQ77rhj+vTpk8022yzLly/PrFmzct999+WBBx7InDlzcuihh2bSpEn53Oc+94l73Hjjjbn00kuTJNttt12++93v5rOf/Wxef/31XHfddRk/fnzGjRuXk046qUH9B1g3NEX/WOHmm2/OoEGDVnt+k002aY63ALQCK0JRNTU12WSTTfL222+v8ZrW9HlHoba2trZZZ4AmtuI3sSoqKvKnP/0pu+2220rnr7jiipx//vlJkosvvtiykECSD7f2S/QF4P9cfPHFGTRoUAYNGpRevXrllVdeyTbbbJMkOeGEExq0pcW0adPy6U9/OjU1Ndlpp53ypz/9KR07dqw7v2jRouy9996ZPHlyKioqMnXqVCtmwnqgKfrH2LFjc+KJJyZJXn755Wy99dbNWDFQagcffHCOP/74HHHEEWnbtu0nzs+ZMyd77LFHpk2bliSZMGFC9tprr0+M8+wB5aWpeofnDigvy5YtW2XP+KiHHnoow4YNS5IMGzYsDzzwwErn33vvvWy77baZO3duttxyyzz33HPZaKONVppj2LBhefjhh5Mk48ePz+DBg5v2jQAtrin6x+OPP54hQ4Yk0RugnF177bU599xz079//wwbNiz/8R//kWT1faG1fd5hfW/WKZMmTapbzvrkk0/+RIgqSUaOHJkBAwYkSa677rosXbq0RWsEANYNl156aQ4++OBGbdF17bXXpqamJklyww03rPRgnySdOnXKDTfckCSpqanJNddcU3zBQKvRFP0DKC+PPPJIjjzyyNX+UGKjjTbKVVddVff9fffdt8pxnj2gvDRV7wDKy5pCEEly2GGH5VOf+lSSrHIL0dGjR2fu3LlJkssuu2ylENWKOX7+85/XzXXFFVc0tmygFWiK/gHw2muv5Xvf+16S5Be/+EWDtiBvbZ93CFKxTnnooYfqjlf8FtXHtWnTJscff3yS5IMPPsj48eNbojQAoMzU1tbmV7/6VZKkf//+2XXXXVc5btddd637cOFXv/pVLAgLAKzKit/aTpKXXnrpE+c9ewCrsqbeAbA6Xbt2TZIsXrz4E+dW/Cxmgw02yOGHH77K63v37p399tsvSfKHP/wh8+fPb55CgVanvv4BcMYZZ2TBggU54YQTsvfee69xfGv8vEOQinXKxIkTkySdO3fOjjvuuNpxH/0X8sknn2z2ugCA8vPyyy/n9ddfT5I1/mVgxfnZs2fnlVdeae7SAIB10JIlS+qOV/Wb4J49gFVZU+8AWJV//vOf+ctf/pLkwx9YflR1dXUmTZqUJNltt93qXUVixTPHkiVLMnny5OYpFmhV6usfAPfcc08eeeSR9OzZM1deeWWDrmmNn3cIUrFOmTp1apKkb9++qaioWO24j/6He8U1AEly7733ZuDAgenUqVO6du2a7bffPieccILV64C1NmXKlLrjNX1o4NkEqM+JJ56YzTffPJWVldloo42y66675t///d8ze/bsUpcGtKAJEybUHQ8YMOAT5z17AKuypt7xcZ47oHwtWrQoL774Yq6++ursvffeddvnnHPOOSuNmzZtWpYtW5bEMwfwoYb2j4+78MILs9VWW6V9+/bp0aNHdthhh5x77rmZNm1aC1QNtLQPPvggZ599dpJVbw28Oq3x8w5BKtYZixcvzpw5c5J8uGRsfXr06JHOnTsnSWbOnNnstQHrjilTpmTq1KmpqqrKggULMn369Nx6663ZZ599MmzYsMydO7fUJQLriFmzZtUdr+nZpE+fPnXHnk2Aj3v88cfzxhtvZOnSpXn33XfzzDPP5Ec/+lH69u2bG2+8sdTlAS1g+fLl+clPflL3/ZFHHvmJMZ49gI9rSO/4OM8dUF7Gjh2bQqGQQqGQzp07p1+/fhk5cmTeeuutJMm3v/3tHHvssStd45kDSIrrHx/35z//Oa+99lqqq6vzwQcf5C9/+UuuvfbaDBgwIJdccoltyGE9c/755+fNN9/MHnvskZNPPrnB17XGZ4/VL+kDrcxH99fu0qXLGsd37tw5CxcuzIIFC5qzLGAd0alTpxx66KHZd999079//3Tp0iXvvPNOJkyYkF/84hd5991389BDD+VLX/pS/vu//zvt2rUrdclAK7c2zyYrAt5JPJsAdbbddtscfvjh2W233eo+BJgxY0buv//+3HfffVm8eHG+/vWvp1AoZMSIESWuFmhO11xzTd0WOocffnh23HHHT4zx7AF8XEN6xwqeO4CP+vznP59Ro0Zl0KBBnzjnmQOoT339Y4XNNtsshx9+ePbcc89su+22qaioyGuvvZZHHnkkt956a5YuXZpLL7001dXV+fGPf9yC1QPN5Yknnsjo0aNTUVGRX/ziFykUCg2+tjU+ewhSsc5YvHhx3XF9e3Kv0L59+yRJVVVVs9UErDtmz56d7t27f+L1/fffP9/85jdz4IEH5vnnn8+ECRPyn//5nznrrLNavkhgnbI2zyYrnksSzybAh4YNG5YTTjjhEx8qDBo0KEcddVQeeeSRHH744Vm6dGnOPffcHHroodl0001LVC3QnCZMmJBvf/vbSZJNNtkk//mf/7nKcZ49gI9qaO9IPHdAOTvssMOy0047JfnwmeCll17KPffckwcffDDHHHNMrr322hx88MErXeOZA0iK6x/Jh88Xr7766id+Wf1f/uVfcthhh2XEiBEZOnRo5s6dm5/85Cc56qij8rnPfa5F3hPQPKqrqzNixIjU1tbm3HPPzWc+85m1ur41PnvY2o91RocOHeqOq6ur1zh+yZIlSZKOHTs2W03AumNVIaoVevXqlfvuu6/uwf6GG25ooaqAddnaPJuseC5JPJsAH+rWrVu9v5l18MEH56KLLkqSLFq0KGPGjGmp0oAW9I9//CPDhg1LTU1NOnTokHvvvTebbLLJKsd69gBWWJvekXjugHLWvXv3fOYzn8lnPvOZDBo0KEcffXQeeOCB3HrrrZkxY0a+9KUvZezYsStd45kDSIrrH8mHq8XUt+PHzjvvnJ/+9KdJktra2rpjYN314x//OC+88EK23HLLXHzxxWt9fWt89hCkYp3RtWvXuuOGLNO2cOHCJA3bBhBg2223zf77758kmT59el5//fUSVwS0dmvzbLLiuSTxbAI03IgRI+p+6DlhwoQSVwM0tZdffjlDhw7N+++/n7Zt2+auu+7KXnvttdrxnj2AZO17R0N57oDy8rWvfS1f+cpXsnz58px55pl577336s555gDqU1//aKijjz46G2ywQRLPHbCue+GFF/If//EfST5cqOKjW+81VGt89hCkYp3RoUOHbLjhhkmSWbNm1Tv2/fffr/uXqE+fPs1eG7B+GDhwYN3x7NmzS1gJsC7o3bt33fGank1mzpxZd+zZBGioTTbZpO7vQJ5NYP3y+uuvZ7/99svrr7+eQqGQm2++OV/60pfqvcazB1BM72gozx1Qflb0j4ULF+Z3v/td3eueOYA1WV3/aKiKior069cviecOWNddc801qa6uzrbbbptFixblrrvu+sTX3//+97rxf/zjH+teX5HnaI3PHhXNdmdoBgMHDswTTzyR6dOnp6amJhUVq/4j/MILL9QdDxgwoKXKA9Zx9S1zD/BxHw1ffvTZY1U8mwDF8nwC6585c+Zk//33z4wZM5J8+Bubxx9//Bqv8+wB5a3Y3rE2PHdAedl4443rjl999dW64379+qVt27ZZtmyZZw5glVbXP9aG5w5YP6zYam/GjBk55phj1jj+Bz/4Qd3xyy+/nM6dO7fKzzusSMU6Zc8990zyYcL5ueeeW+24jy4DucceezR7XcD6YcqUKXXHm2++eQkrAdYF22yzTV2vWNMS1H/605+SJFtssUW23nrr5i4NWE+88847mTNnThLPJrC+mDt3bg444IC6v3v85Cc/yRlnnNGgaz17QPlqTO9oKM8dUH4+ugrMR7fGqayszM4775wkeeqpp1JdXb3ae6x4Jmnfvn122mmnZqoUaG1W1z8aqqamJtOmTUviuQNonZ93CFKxTjnssMPqjm+55ZZVjlm+fHluvfXWJEn37t0zZMiQligNWMe9/PLL+e///u8kyXbbbZctttiixBUBrV2hUKhbxvqFF17I008/vcpxTz/9dN1vSXzpS1/y21ZAg40aNSq1tbVJkr333rvE1QCNtWjRonzxi1/M//zP/yRJLrzwwlxwwQUNvt6zB5SnxvaOhvLcAeXn3nvvrTv+7Gc/u9K5FT+LmTdvXh544IFVXj9r1qw89thjSZJ99903Xbt2bZ5CgVanvv7REHfffXfmzp2bxHMHrOvGjh2b2traer8uvvjiuvHjx4+ve31FEKo1ft4hSMU6Zeedd84XvvCFJMmYMWPy1FNPfWLMVVddlalTpyZJzj777LRr165FawRan4cffjg1NTWrPf/WW2/liCOOqPvtqtNPP72lSgPWceecc07atm2bJPnmN7+Zqqqqlc5XVVXlm9/8ZpKkoqIi55xzTkuXCLRCr7zySp5//vl6xzzyyCP5/ve/nyTp2LFjTjzxxJYoDWgm1dXVGTZsWJ588skkH35e8cMf/nCt7+PZA8pLU/QOzx1QfsaOHZvFixfXO+aaa67Jb37zmyQfrgKx4ucuK5xyyinp1q1bkuTb3/523n333ZXOL1u2LKeffnqWLVuWJDnvvPOaqnyghBrbP95///08/vjj9V4/adKknHnmmUk+DE984xvfaFzRwHqhtX3eUdGsd4dmcN1112WPPfZIVVVVhg4dmu9+97sZMmRIqqqqctddd2XUqFFJPtzHe+TIkSWuFmgNvvnNb2bp0qU54ogjsttuu2XrrbdOx44dM2fOnDz++OO58cYb65av33PPPZt8eXygdZo4cWKmT59e9/2KPpAk06dPz9ixY1caP3z48E/co1+/fjnvvPPyk5/8JJMnT84ee+yRCy64INttt11eeumlXHbZZXU/tDjvvPOy/fbbN8t7AVpWY/vHK6+8kiFDhmS33XbLIYccks997nPZZJNNkiQzZszIfffdl/vuu69uVYgrr7zSapmwjjvmmGPy6KOPJkn22WefnHzyyfn73/++2vGVlZXp16/fJ1737AHlpSl6h+cOKD+XXHJJRo4cmSOOOCJ77rlntttuu3Tp0iXz58/P3/72t9xxxx11Ac3KysqMGjWq7geXK/Ts2TOXXXZZvv71r+fVV1/NLrvskgsvvDCf/exn8/rrr+faa6/N+PHjk3zYqwYPHtzSbxNoBo3tH3Pnzs2QIUPy//7f/8thhx2WHXfcMZtttlnatm2b1157LY888khuu+22ul9q/9a3vpUdd9yxJO8VaF1a2+cdhdoVf0OCdcjDDz+c4447LvPmzVvl+X79+mXcuHHp27dvC1cGtEZbb711Xn311TWOO+KIIzJ69Oh07969+YsCSm748OH55S9/2eDxq3tsXr58eU499dTcfPPNq7325JNPzqhRo9KmjQVhYX3Q2P7x+OOPN2gL8k6dOuWaa67JiBEj1rpGoHVZ2+Xmt9pqq7zyyiurPOfZA8pHU/QOzx1Qfhr6WWjv3r1z8803Z//991/tmIsvvjg/+MEPVvuZyEEHHZT7778/HTp0KLpeoPVobP945ZVXss0226zx+rZt2+Z73/teLrroIluRQxm45JJLcumllyb5cGu/1QWwW9PnHVakYp10yCGH5K9//Wuuu+66jBs3LrNmzUplZWX69u2br3zlKznzzDPTqVOnUpcJtBK//OUvM2HChDz11FOZMWNG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AAAA0OA1qc3FSkpKMnPmzCxevDglJSVp2bJl2rRpk06dOqVly5ZVnv/dd9+thijXtcsuu9TIvAAAAAAAAAAAQP1Qo4VUq1evzq9//ev8+te/zvPPP5/33nsvxWJxnX6FQiGdO3dO3759M2jQoAwaNCiNGm36YVm77757dYS9TmylpaXVPi8AAAAAAAAAAFB/1Fgh1VNPPZXzzz8/06ZNS5L1FlCtUSwW88477+Tdd9/N/fffn7322it33HFHBg4cuElrlrcGAAAAAAAAAADAhtRIIdWoUaPyrW99K6tXry4rburatWu6deuWzp07p3Xr1mnevHmWL1+eJUuW5L333svrr7+eqVOnJkmmTp2ar33taxk5cmSGDh1a4XXvueeemng7AAAAAAAAAADAFq7aC6kmT56cc889N6tWrcpWW22Vyy+/PEOGDMn222+/0bFz587NPffck+uuuy4LFy7MOeeckz59+qR79+4VWnvw4MFVDR8AAAAAAAAAAGiAGlX3hHfccUeWL1+e7bffPq+88kouvfTSChVRJcn222+fyy67LK+88kq22267LF++PHfccUd1hwgAAAAAAAAAALCWai+k+uMf/5hCoZDvf//72XPPPSs1x5577pnvf//7KRaL+eMf/1jNEbKl6v2l7mnXtk1dhwEAAAAAAAAAwGe0a9smvb9UsVvp6kq1X+03e/bsJMl+++1XpXnWjF8zX3V66623MnHixPzrX//K0qVLc/bZZ2ebbbap9nWoXYceuG9atGhe12EAAAAAAAAAAPAZLVo0z6EH7lvXYZSr2gup2rRpk+XLl+fDDz+s0jwfffRRkqR169bVEVaS5K9//WsuvPDCPP/882u9/vWvf32tQqqf/vSnueaaa9KuXbtMnjw5TZs2rbYYAAAAAAAAAACA+qfar/br1q1bkuTuu++u0jx33XVXkqR79+o50uuJJ55I37598/zzz6dYLJZ9rc+pp56akpKSTJ8+PU888US1rA8AAAAAAAAAANRf1V5IdfLJJ6dYLOaRRx7J+eefn2XLlm3S+GXLluX888/PI488kkKhkJNPPrnKMc2ZMycnnXRSli9fnh49euT3v/99Fi1atMH+bdu2zVFHHZUk+f3vf1/l9QEAAAAAAAAAgPqt2gupzjzzzOy7774pFov56U9/ms6dO+ecc87JQw89lNdeey0ffvhhVqxYkSRZsWJFPvzww7z22mt56KGHcs4556Rz58756U9/miTp1atXzjzzzCrHdOutt2bJkiXZdddd8+yzz+awww7b6JWB/fv3T7FYzCuvvFLl9QEAAAAAAAAAgPqtSXVP2Lhx4/z+97/PMccck+effz7z58/Pz3/+8/z85z+v0Pg11+317ds3jz32WBo1qnqt15NPPplCoZDhw4enffv2FRqz5orCt99+u8rrAwAAAAAAAAAA9Vu1n0iVJFtvvXUmTJiQu+++O927d0+xWKzwV/fu3TNq1KhMmDAhW2+9dbXE88477yRJevfuXeExW221VZJk8eLF1RIDNe/an/wycz+YX9dhAAAAAAAAAADwGXM/mJ9rf/LLug6jXNV+ItUajRo1ymmnnZbTTjstb775Zp577rlMnjw5M2fOzKJFi7Js2bK0aNEibdu2TadOndKjR48ceOCB2Wuvvao9ltLS0iTJ6tWrKzxmwYIFSZI2bdpUezwAAAAAAAAAAED9UmOFVJ+211571UiBVEXtsMMOmTFjRqZPn54+ffpUaMxLL72UJNlll11qMjQAAAAAAAAAAKAeqJGr/eqbgw46KMViMQ8//HCF+q9YsSIjRoxIoVBI//79azY4AAAAAAAAAACgzjWIQqohQ4YkSX7729/mD3/4Q7l9V6xYkVNPPTVvvfVWCoVCzjzzzFqIEAAAAAAAAAAAqEsNopCqf//+OeGEE1IsFnPkkUfm0ksvLbu6L0lmzJiRv/zlL7nxxhuz99575+GHH06hUMi3vvWt7L333nUYOQAAAAAAAAAAUBua1HUAtWX06NFZtGhRfve73+Wmm27KTTfdlEKhkCQ58sgjy/oVi8UkybHHHpvbb7+9TmIFAAAAAAAAAABqV4M4kSpJmjdvnieeeCIjRozIHnvskWKxuN6vTp065Wc/+1nGjBmTxo0b13XYAAAAAAAAAABALWgwJ1KtceaZZ+bMM8/M5MmTM2nSpLz//vtZtWpVtt566+yzzz75t3/7t7KTqgAAAAAAAAAAgIahwRVSrdGjR4/06NGjrsMAAAAAAAAAAADqgQZztR8AAAAAAAAAAMCGKKQCAAAAAAAAAAAavAZ3td///b//N88++2ymT5+eRYsWZdWqVeX2LxQKGTVqVC1FBwAAAAAAAAAA1IVaKaTafffd06hRozz11FPp0qVLhca8++676d+/fwqFQt56660qx/DGG2/ktNNOywsvvFDhMcViUSEVAAAAAAAAAAA0ALVSSPXOO++kUChkxYoVFR6zcuXKzJgxI4VCocrrz5o1KwcffHDmzZuXYrGYJGnTpk06dOiQRo3cbggAAAAAAAAAAA1dg7ja77/+67/ywQcfpFAo5Iwzzsh3v/vddO3ata7Dopp167Jr2rRuXddhAAAAAAAAAADwGW1at063LrvWdRjlqrfHMS1YsCBJ0qpVqyrP9eSTT6ZQKOTUU0/NyJEjFVFtoY7994PTulWLug4DAAAAAAAAAIDPaN2qRY7994PrOoxy1dtCqvvuuy9JsuuuVa9Emz17dpLk1FNPrfJcAAAAAAAAAADAlqdGrvY75JBD1vv60KFD03ojV68tX74806dPz/vvv59CoZCBAwdWOZ4OHTrk/fffT/v27as8FwAAAAAAAAAAsOWpkUKq8ePHp1AopFgslr1WLBbz8ssvb9I8e+yxRy6//PIqx7Pvvvvmd7/7XaZOnZp99tmnyvMBAAAAAAAAAABblhoppDr44INTKBTKvp8wYUIKhUJ69uxZ7olUhUIhLVq0yI477pgDDjggJ5544kZPsKqI888/P2PHjs3IkSNzwgknVHm+zc0777yTO+64I2PHjs17772X5s2bZ88998zxxx+fc845J61ataqWdX7/+99n5MiRefnll/PBBx9k2223Ta9evTJs2LB89atfrZY1AAAAAAAAAACgJtTYiVSf1qhRoyTJ6NGj06NHj5pYslxf+cpXcumll+b666/Pt7/97dxxxx1p2rRprcdRFx5//PGccsopWbhwYdlrS5cuzaRJkzJp0qTcfffdGTt2bLp06VLpNVavXp1hw4Zl1KhRa70+a9aszJo1K4899ljOOOOMjBgxouzvAgAAAAAAAAAA1Cc1Ukj1WaeeemoKhUI6dOhQG8ut495770337t1zwAEHZOTIkXn88cfz9a9/Pd26davQaUynnnpqLURZ/V599dWccMIJKSkpSZs2bXL55ZdnwIABKSkpyQMPPJC77rorU6dOzde+9rVMmjQpbdu2rdQ6V1xxRVkR1T777JNLLrkke+65Z956663ccMMNefXVV3P33Xdn2223zbXXXludb3Et1/7kl/mv752f7bepm79nAAAAAAAAAACs39x5H+Xan/yyrsMoV60UUo0ePbo2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d+/eVZ6vUCjkqquuWu+zr371q3nzzTczZsyY/POf/0xpaWn22muvHH/88dl5552rvDa158yTj0q7rdrUdRgAAAAAAAAAAHxGu63a5MyTj8p1/3lRXYeyQbVSSPWDH/xgo31Wr16djz76KJMmTcqLL76Y1atXp1Ao5KKLav4Pb+utt85ZZ51V4+sAAAAAAAAAAAD1U60UUl199dUpFAoV7l8sFtOkSZPccMMN+cpXvlKDkQEAAAAAAAAAANTi1X7FYrHc54VCIW3bts3uu++efv36ZdiwYenRo0ctRQcAAAAAAAAAADRktVJItXr16tpYpkJWr16dyZMnZ/r06Vm0aFFWrVq10TGnnnpqLUQGAAAAAAAAAADUlVo7kaqulZSU5Ec/+lHuuuuuzJ8/v8LjCoWCQioAAAAAAAAAANjCNarrAGpDSUlJDjnkkFx33XWZN29eisXiJn2xebj5rgfy4ccL6zoMAAAAAAAAAAA+48OPF+bmux6o6zDK1SBOpLr11lvz4osvJkk+//nP59xzz03Pnj3TsWPHNGrUIGrJGoTly1dm5cqVdR0GAAAAAAAAAACfsXLlyixfXr/rOmqlkOrdd9+tkXl32WWXCvV78MEHkyQHHHBA/vznP6dZs2Y1Eg8AAAAAAAAAALB5qpVCqt13373a5ywUCiktLa1Q37feeiuFQiGXXHKJIioAAAAAAAAAAGAdtVJIVSwWa2OZDWrWrFlKSkoqfIIVAAAAAAAAAADQsNRKIdU999yTJPnZz36Wl19+OU2bNs3AgQPTu3fvbL/99kmSuXPn5uWXX87TTz+dlStXZt99983ZZ59dLet369YtL774Yv71r39Vy3wAAAAAAAAAAMCWpVYKqQYPHpzTTz89kyZNysCBAzNq1KjsvPPO6+07a9asnHnmmXnqqafy7LPP5u67767y+kOGDMkLL7yQhx9+OP/+7/9e5fkAAAAAAAAAAIAtS6PaWGTMmDG55557su+++2bs2LEbLKJKkp133jmPP/54evbsmXvuuScPPfRQldc/88wzc8ghh+Tee+/N/fffX+X5AAAAAAAAAACALUutnEg1YsSIFAqFfOc730njxo032r9x48YZPnx4TjrppIwcOTLHH398hdZ59913N/jszjvvzJlnnplTTjklv/71r3PyySenW7duadWq1Ubn3WWXXSq0PgAAAAAAAAAAsHmqlUKq1157LUnStWvXCo9Z0/fvf/97hcfsvvvuG+1TLBbzyCOP5JFHHqnQnIVCIaWlpRWOAQAAAAAAAAAA2PzUSiHVokWLkiTvv/9+hces6btmbEUUi8Vq7QcAAAAAAAAAADQMtVJIteuuu2bq1Km59957c9hhh1VozL333ptk067Vu+eeeyoVHwAAAAAAAAAA0LDVSiHV0UcfnRtuuCEPPPBAvvjFL+aSSy4pt/9NN92U+++/P4VCIYMGDarwOoMHD65qqAAAAAAAAAAAQANUK4VUl112WX75y1/mX//6Vy6//PLcf//9GTx4cHr16pXtttsuhUIhc+fOzcsvv5xf/vKX+dvf/pYk2WGHHXLppZfWRogAAAAAAAAAAEADViuFVO3bt88f//jHHHbYYZk5c2Zee+21DB8+fIP9i8ViOnXqlCeffDLt27evjRABAAAAAAAAAIAGrFFtLdS9e/f885//zPDhw9O+ffsUi8X1frVv3z7f+c538o9//CM9evSolrVLSkpy77335t57780HH3yw0f4ffPBBWf+VK1dWSwzUvLZtWqZZs6Z1HQYAAAAAAAAAAJ/RrFnTtG3Tsq7DKFetnEi1Rtu2bXPjjTfm2muvzSuvvJK///3v+fDDD5MkHTp0yBe+8IX07NkzzZo1q9Z1H3rooQwdOjQ777xzTj755I3279ChQ6644orMnj07zZo1y4knnlit8VAzzhvy9XRot1VdhwEAAAAAAAAAwGd0aLdVzhvy9dz2w0vrOpQNqtVCqjWaNm2aPn36pE+fPrWy3uOPP54kOeGEE9KkycbfcpMmTXLiiSfm5ptvzmOPPaaQCgAAAAAAAAAAtnC1drVfXfrrX/+aQqGQgw8+uMJj1vR95ZVXaiosAAAAAAAAAACgnmgQhVRz5sxJknTu3LnCYzp16pQkmT17do3EBAAAAAAAAAAA1B8NopCqcePGSZLly5dXeMyKFSuSJMVisUZiAgAAAAAAAAAA6o8GUUi1/fbbJ0n+8Y9/VHjM3//+9yTJtttuWyMxAQAAAAAAAAAA9UeDKKQ64IADUiwWc9ddd1V4zIgRI1IoFNKnT58ajIzqdOfoMflowcK6DgMAAAAAAAAAgM/4aMHC3Dl6TF2HUa4GUUh18sknJ0kmTZqUCy64oNzr+orFYi644IK88sora42l/lu0uCQrVqys6zAAAAAAAAAAAPiMFStWZtHikroOo1wNopDqq1/9ag455JAUi8X85Cc/yX777Zf77rsv77zzTlasWJEVK1bknXfeyS9/+cvst99++clPfpJCoZCDDz44Rx99dF2HXyVLly7NDTfckF69eqVjx45p3bp1unXrluHDh+edd96p8vwzZsxIoVCo0NeQIUOq/oYAAAAAAAAAAKAGNKnrAGrLQw89lP79++cf//hHXnnllQwePHiDfYvFYr7whS/kkUceqcUIq9+0adNy+OGH580331zr9TfeeCNvvPFG7r777vzqV7/KEUccUUcRAgAAAAAAAABA/dBgCqk6duyYF198MVdccUVGjhyZpUuXrrdf69atc9ZZZ+WHP/xhWrZsWctRVp9Fixbla1/7WlkR1ZlnnpkTTzwxLVu2zLhx4/LjH/84CxcuzAknnJDnn38+X/rSl6q85o9+9KNyT/Dq0KFDldcAAAAAAAAAAICa0GAKqZKkZcuWueWWW3LVVVflz3/+c1599dXMmzcvSbLNNtvk3/7t3zJgwIC0a9eujiOtuhtvvDFTp05Nktxwww25+OKLy57tv//+6d+/f/r165elS5fmwgsvzPjx46u85s4775zPf/7zVZ4HAAAAAAAAAABqW4MqpFqjXbt2GTRoUAYNGlTXodSIlStX5o477kiSdO/ePcOHD1+nzwEHHJDTTz89I0aMyIQJE/Lyyy+nV69etR0qAAAAAAAAAADUC43qOgCq37hx47JgwYIkyeDBg9Oo0fr/bx4yZEhZ+9e//nVthAYAAAAAAAAAAPWSQqot0HPPPVfW7tev3wb77bvvvmnVqlWS5Pnnn6/xuAAAAAAAAAAAoL5SSLUFmjx5clm7W7duG+zXpEmTdOnSJUkyZcqUKq975513pkuXLmnRokXatWuXvffeO9/61rfy17/+tcpzAwAAAAAAAABATWpS1wFQ/WbOnJkkad26ddq3b19u386dO+e1117LBx98kOXLl6d58+aVXvfTBVPLly/P5MmTM3ny5IwYMSJnnXVWbr/99k2ef8172ZA5c+as9f2KlaVZsWLFJq0BNEwrV65cbxugPHIHUBlyB1AZcgdQWfIHUBlyB1AZcgewqVasLK3rEDZKIdUWaNGiRUmSNm3abLRv69aty9qLFy+uVCFV+/btM2jQoPTv3z977bVXWrRokTlz5uTp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H55u3bqldevW6dixY3r16pUbb7wxS5curevwgHqmUChU6Kt///51HSpQS95///088cQTufLKK/PVr34122yzTVkuGDJkyCbP9/vf/z6DBg1Kp06d0rx583Tq1CmDBg3K73//++oPHqhT1ZE/Ro8eXeH9yejRo2v0/QC1Y9KkSfnBD36QgQMHlu0X2rRpk65du2bo0KF57rnnNmk+ew9oGKojd9h3QMOycOHCPPDAAxk+fHj69euXLl26pF27dmnWrFm222679O/fPzfccEPmz59fofn+8pe/5JRTTsmuu+6aFi1aZIcddshhhx2W+++/v4bfCVDbqiN/jB8/vsL7jquvvrr23hxQJy699NK1/rkfP378RsfUh887mtTaSlCNHn/88ZxyyilZuHBh2WtLly7NpEmTMmnSpNx9990ZO3ZsunTpUodRAgD12fbbb18t86xevTrDhg3LqFGj1np91qxZmTVrVh577LGcccYZGTFiRBo18nsMsCWorvwBNBwHH3xwnn322XVeX7FiRd588828+eabGT16dE499dTcddddadas2QbnsveAhqM6cwfQcLz00ks56aST1vvsgw8+yIQJEzJhwoTceOONue+++3LYYYdtcK6rr746P/zhD7N69eqy1+bOnZunn346Tz/9dH71q19lzJgxadGiRbW/D6D2VWf+APjb3/6WW265pcL969PnHQqp2Oy8+uqrOeGEE1JSUpI2bdrk8ssvz4ABA1JSUpIHHnggd911V6ZOnZqvfe1rmTRpUtq2bVvXIQP1yLe//e2cffbZG3zeunXrWowGqC922WWXdOvWLU8//fQmj73iiivKNvb77LNPLrnkkuy555556623csMNN+TVV1/N3XffnW233TbXXnttdYcO1LGq5I81nnrqqey0004bfN6pU6dKzw3UD7Nnz06S7LTTTvnGN76Rgw46KLvssktWrVqViRMn5uabb86sWbNy7733ZuXKlfnf//3fDc5l7wENR3XmjjXsO6Bh6Ny5cwYMGJCePXumc+fO2XHHHbN69erMnDkzY8aMyaOPPpp58+blqKOOyksvvZQvfvGL68wxYsSIXHPNNUmSPffcM9/73vfyhS98IbNnz87tt9+ecePGZezYsTnttNMqlH+AzUN15I81fvGLX6RXr14bfL7ddtvVxFsA6oE1RVGlpaXZbrvt8v777290TH36vKNQLBaLNboCVLM1v4nVpEmTPPPMM9l///3Xen7jjTfmkksuSZJcddVVjoUEknxytV8iLwD/z1VXXZVevXqlV69e2X777TNjxozsvvvuSZLBgwdX6EqLqVOnZu+9905paWn23XffPPPMM2nZsmXZ86VLl6Zfv36ZNGlSmjRpkilTpjgxE7YA1ZE/Ro8enaFDhyZJ3n777ey22241GDFQ14444oiceuqpOe6449K4ceN1ns+bNy99+/bN1KlTkyQTJkzIwQcfvE4/ew9oWKord9h3QMOyatWq9eaMT3vssccyaNCgJMmgQYPy6KOPrvX8ww8/zB577JEFCxZkl112ySuvvJJtttlmrTUGDRqUxx9/PEkybty49O/fv3rfCFDrqiN/jB8/PgMGDEgiN0BDdtttt+Wiiy5Kt27dMmjQoPz4xz9OsuG8UN8+73C+N5uVl156qew469NPP32dIqokGT58eLp3754kuf3227Ny5cpajREA2Dxcc801OeKII6p0Rddtt92W0tLSJMmdd9651sY+SVq1apU777wzSVJaWppbb7218gED9UZ15A+gYXniiSdy/PHHb/CHEttss01uvvnmsu/HjBmz3n72HtCwVFfuABqWjRVBJMkxxxyTz33uc0my3itE77777ixYsCBJcv31169VRLVmjZ/97Gdla914441VDRuoB6ojfwC8++67+c///M8kyc9//vMKXUFe3z7vUEjFZuWxxx4ra6/5LarPatSoUU499dQkyccff5xx48bVRmgAQANTLBbzm9/8JknSrVu39OnTZ739+vTpU/bhwm9+85s4EBYAWJ81v7WdJG+99dY6z+09gPXZWO4A2JC2bdsmSZYtW7bOszU/i9lqq61y7LHHrnd8p06dcuihhyZJ/vSnP2XRokU1EyhQ75SXPwDOOeecLF68OIMHD06/fv022r8+ft6hkIrNynPPPZckad26dXr27LnBfp/+B/L555+v8bgAgIbn7bffzuzZs5Nko/8xsOb5rFmzMmPGjJoODQDYDC1fvrysvb7fBLf3ANZnY7kDYH3eeOON/O1vf0vyyQ8sP23FihV56aWXkiT7779/uadIrNlzLF++PJMmTaqZYIF6pbz8AfDQQw/liSeeSMeOHXPTTTdVaEx9/LxDIRWblSlTpiRJunTpkiZNmmyw36f/xb1mDECSPPzww+nRo0datWqVtm3bZq+99srgwYOdXgdsssmTJ5e1N/ahgb0JUJ6hQ4dmp512SrNmzbLNNtukT58++f73v59Zs2bVdWhALZowYUJZu3v37us8t/cA1mdjueOz7Dug4Vq6dGnefPPN3HLLLenXr1/Z9TkXXnjhWv2mTp2aVatWJbHnAD5R0fzxWVdccUV23XXXNG/ePB06dMg+++yTiy66KFOnTq2FqIHa9vHHH+eCCy5Isv6rgTekPn7eoZCKzcayZcsyb968JJ8cGVueDh06pHXr1kmS9957r8ZjAzYfkydPzpQpU1JSUpLFixdn2rRpuffee3PIIYdk0KBBWbBgQV2HCGwmZs6cWdbe2N6kc+fOZW17E+Czxo8fnzlz5mTlypWZP39+XnzxxfzXf/1XunTpkhEjRtR1eEAtWL16da677rqy748//vh1+th7AJ9VkdzxWfYd0LCMHj06hUIhhUIhrVu3TteuXTN8+PDMnTs3SXLZZZfl5JNPXmuMPQeQVC5/fNZf/vKXvPvuu1mxYkU+/vjj/O1vf8ttt92W7t275+qrr3YNOWxhLrnkkvzrX/9K3759c/rpp1d4XH3ce2z4SB+oZz59v3abNm022r9169ZZsmRJFi9eXJNhAZuJVq1a5aijjsqXv/zldOvWLW3atMkHH3yQCRMm5Oc//3nmz5+fxx57LEcffXT+8Ic/pGnTpnUdMlDPbcreZE2BdxJ7E6DMHnvskWOPPTb7779/2YcA06dPzyOPPJIxY8Zk2bJl+da3vpVCoZBhw4bVcbRATbr11lvLrtA59thj07Nnz3X62HsAn1WR3LGGfQfwaV/60pcycuTI9OrVa51n9hxAecrLH2vsuOOOOfbYY3PggQdmjz32SJMmTfLuu+/miSeeyL333puVK1fmmmuuyYoVK3LttdfWYvRATXn22Wdz9913p0mTJvn5z3+eQqFQ4bH1ce+hkIrNxrJly8ra5d3JvUbz5s2TJCUlJTUWE7D5mDVrVtq3b7/O61/5yldy3nnn5atf/WpeffXVTJgwIf/93/+d888/v/aDBDYrm7I3WbMvSexNgE8MGjQogwcPXudDhV69euWEE07IE088kWOPPTYrV67MRRddlKOOOio77LBDHUUL1KQJEybksssuS5Jst912+e///u/19rP3AD6torkjse+AhuyYY47Jvvvum+STPcFbb72Vhx56KL/+9a9z0kkn5bbbbssRRxyx1hh7DiCpXP5IPtlfvPPOO+v8svq//du/5ZhjjsmwYcMycODALFiwINddd11OOOGEfPGLX6yV9wTUjBUrVmTYsGEpFou56KKL8vnPf36TxtfHvYer/dhstGjRoqy9YsWKjfZfvnx5kqRly5Y1FhOw+VhfEdUa22+/fcaMGVO2sb/zzjtrKSpgc7Ype5M1+5LE3gT4RLt27cr9zawjjjgiV155ZZJk6dKlGTVqVG2FBtSif/7znxk0aFBKS0vTokWLPPzww9luu+3W29feA1hjU3JHYt8BDVn79u3z+c9/Pp///OfTq1evnHjiiXn00Udz7733Zvr06Tn66KMzevTotcbYcwBJ5fJH8slpMeXd+NG7d+/85Cc/SZIUi8WyNrD5uvbaa/P6669nl112yVVXXbXJ4+vj3kMhFZuNtm3blrUrckzbkiVLklTsGkCAPfbYI1/5yleSJNOmTcvs2bPrOCKgvtuUvcmafUlibwJU3LBhw8p+6DlhwoQ6jgaobm+//XYGDhyYjz76KI0bN84DDzyQgw8+eIP97T2AZNNzR0XZd0DD8s1vfjPf+MY3snr16px77rn58MMPy57ZcwDlKS9/VNSJJ56YrbbaKol9B2zuXn/99fz4xz9O8slBFZ++eq+i6uPeQyEVm40WLVpk6623TpLMnDmz3L4fffRR2T9EnTt3rvHYgC1Djx49ytqzZs2qw0iAzUGnTp3K2hvbm7z33ntlbXsToKK22267sv8GsjeBLcvs2bNz6KGHZvbs2SkUCvnFL36Ro48+utwx9h5AZXJHRdl3QMOzJn8sWbIkTz75ZNnr9hzAxmwof1RUkyZN0rVr1yT2HbC5u/XWW7NixYrsscceWbp0aR544IF1vv7xj3+U9f/zn/9c9vqaeo76uPdoUmMzQw3o0aNHnn322UybNi2lpaVp0mT9f4Vff/31snb37t1rKzxgM1feMfcAn/Xp4stP7z3Wx94EqCz7E9jyzJs3L1/5ylcyffr0JJ/8xuapp5660XH2HtCwVTZ3bAr7DmhYtt1227L2O++8U9bu2rVrGjdunFWrVtlzAOu1ofyxKew7YMuw5qq96dOn56STTtpo/x/+8Idl7bfffjutW7eul593OJGKzcqBBx6Y5JMK51deeWWD/T59DGTfvn1rPC5gyzB58uSy9k477VSHkQCbg913370sV2zsCOpnnnkmSbLzzjtnt912q+nQgC3EBx98kHnz5iWxN4EtxYIFC3LYYYeV/bfHddddl3POOadCY+09oOGqSu6oKPsOaHg+fQrMp6/GadasWXr37p0kmThxYlasWLHBOdbsSZo3b5599923hiIF6psN5Y+KKi0tzdSpU5PYdwD18/MOhVRsVo455piy9j333LPePqtXr869996bJGnfvn0GDBhQG6EBm7m33347f/jDH5Ike+65Z3beeec6jgio7wqFQtkx1q+//npeeOGF9fZ74YUXyn5L4uijj/bbVkCFjRw5MsViMUnSr1+/Oo4GqKqlS5fma1/7Wv76178mSa644opceumlFR5v7wENU1VzR0XZd0DD8/DDD5e1v/CFL6z1bM3PYhYuXJhHH310veNnzpyZP/7xj0mSL3/5y2nbtm3NBArUO+Xlj4p48MEHs2DBgiT2HbC5Gz16dIrFYrlfV111VVn/cePGlb2+phCqPn7eoZCKzUrv3r1z0EEHJUlGjRqViRMnrtPn5ptvzpQpU5IkF1xwQZo2bVqrMQL1z+OPP57S0tINPp87d26OO+64st+uOvvss2srNGAzd+GFF6Zx48ZJkvPOOy8lJSVrPS8pKcl5552XJGnSpEkuvPDC2g4RqIdmzJiRV199tdw+TzzxRH7wgx8kSVq2bJmhQ4fWRmhADVmxYkUGDRqU559/Psknn1f86Ec/2uR57D2gYamO3GHfAQ3P6NGjs2zZsnL73Hrrrfnd736X5JNTINb83GWNM844I+3atUuSXHbZZZk/f/5az1etWpWzzz47q1atSpJcfPHF1RU+UIeqmj8++uijjB8/vtzxL730Us4999wknxRPfPvb365a0MAWob593tGkRmeHGnD77benb9++KSkpycCBA/O9730vAwYMSElJSR544IGMHDkyySf3eA8fPryOowXqg/POOy8rV67Mcccdl/333z+77bZbWrZsmXnz5mX8+PEZMWJE2fH1Bx54YLUfjw/UT88991ymTZtW9v2aPJAk06ZNy+jRo9fqP2TIkHXm6Nq1ay6++OJcd911mTRpUvr27ZtLL700e+65Z956661cf/31ZT+0uPjii7PXXnvVyHsBaldV88eMGTMyYMCA7L///jnyyCPzxS9+Mdttt12SZPr06RkzZkzGjBlTdirETTfd5LRM2MyddNJJefrpp5MkhxxySE4//fT84x//2GD/Zs2apWvXruu8bu8BDUt15A77Dmh4rr766gwfPjzHHXdcDjzwwOy5555p06ZNFi1alL///e/51a9+VVag2axZs4wcObLsB5drdOzYMddff32+9a1v5Z133sl+++2XK664Il/4whcye/bs3HbbbRk3blyST3JV//79a/ttAjWgqvljwYIFGTBgQP7P//k/OeaYY9KzZ8/suOOOady4cd5999088cQT+eUvf1n2S+3f/e5307Nnzzp5r0D9Ut8+7ygU1/wXEmxGHn/88ZxyyilZuHDhep937do1Y8eOTZcuXWo5MqA+2m233fLOO+9stN9xxx2Xu+++O+3bt6/5oIA6N2TIkPzP//xPhftvaNu8evXqnHnmmfnFL36xwbGnn356Ro4cmUaNHAgLW4Kq5o/x48dX6AryVq1a5dZbb82wYcM2OUagftnU4+Z33XXXzJgxY73P7D2g4aiO3GHfAQ1PRT8L7dSpU37xi1/kK1/5ygb7XHXVVfnhD3+4wc9EDj/88DzyyCNp0aJFpeMF6o+q5o8ZM2Zk99133+j4xo0b5z//8z9z5ZVXuoocGoCrr74611xzTZJPrvbbUAF2ffq8w4lUbJaOPPLIvPbaa7n99tszduzYzJw5M82aNUuXLl3yjW98I+eee25atWpV12EC9cT//M//ZMKECZk4cWKmT5+eefPmZeHChWnTpk06d+6cAw44IIMHD87+++9f16ECm6FGjRpl1KhROe644zJy5Mi8/PLLmTdvXrbZZpv06tUrZ511Vr761a/WdZhAPdKzZ8/cd999mThxYiZNmpQ5c+Zk3rx5KS0tTYcOHbL33nvny1/+cs4444yyEyMA1rD3ADaFfQc0PE899VTGjh2b559/PtOmTcvcuXMzf/78tGzZMtttt12+9KUv5Ygjjsjxxx+/0Z+jXHPNNTnssMPy05/+NM8++2zmzp2b9u3b54tf/GKGDh2ak046qZbeFVAbqpo/dtpppzz88MOZOHFiXnrppcyaNSvz5s3LsmXL0q5du3zuc59L//79c8YZZ2S33Xar/TcI1Gv16fMOJ1IBAAAAAAAAAAANnvO9AQAAAAAAAACABk8hFQAAAAAAAAAA0OAppAIAAAAAAAAAABo8hVQAAAAAAAAAAECDp5AKAAAAAAAAAABo8BRSAQAAAAAAAAAADZ5CKgAAAAAAAAAAoMFTSAUAAAAAAAAAADR4CqkAAAAAAAAAAIAGTyEVAAAAAAAAAADQ4CmkAgAAAAAAAAAAGjyFVAAAAAAAAAAAQIOnkAoAAAAAAAAAAGjwFFIBAAAAAAAAAAANnkIqAAAAAAAAAACgwVNIBQAAAAAAAAAANHgKqQAAAAAAAAAAgAZPIRUAAAAAAAAAANDgKaQCAAAAAAAAAAAaPIVUAAAAAAAAAABAg6eQCgAAAAAAAAAAaPAUUgEAAAAAAAAAAA2eQioAAAAAAAAAAKDBU0gFAAAAAAAAAAA0eAqpAAAAAAAAAACABu//A59U62Z67FsSAAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "pA = Pulse(0, 40, 1, 100e6, 0, Rectangular(), 'A', PulseType.DRIVE, 0)\n", - "pB = Pulse(0, 40, 1, 100e6, 0, Rectangular(), 'B', PulseType.DRIVE, 0)\n", - "ps = pA + pB\n", - "assert type(ps) == PulseSequence\n", - "ps.plot()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As we have already seen, Pulse also implements a `plot()` method that represents the pulse waveforms:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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WlqqwsJCJSYm6qWXXlLHjh21ePHietfKzMzUwIED9dhjj2nbtm0qKipSUVGRNm3apPvuu0/XXHONTCZTjWP+8pe/yM3NTZK0cOHCOtevrKzUF198IUkaPXq0/P39m+1abFm+fLk6dOig559/Xtu3b1d+fr7Ky8t18OBBffzxxxo8eLDuvffeWtdpzXvvvacLL7xQCxcuVFpamsrLy5WWlqZ58+apR48e+vzzz+s8/qWXXlKXLl3073//W4mJiSooKFBZWZn279+vDz74QP369dP06dMbfa0AAAAAALQWJDEBAAAAAAAA5zCz2axx48ZZkofGjh2rjz76SGvXrtX69ev12muvqW3btiouLta4cePqrexzzTXXKCkpSffff79++OEHbdmyRZ988oni4+MlSYsXL9Y777xT4xhvb2+NHDlSkvTVV1+prKzM5vpLly5VTk6OJOnGG29s1muxZvv27Ro7dqwKCgrk7Oyshx56SCtXrtTGjRv19ttvKyYmRpL0xhtvaNq0afWudddddykkJET/+c9/9Ouvv2r16tV6/PHH5erqqvLyct14440245w1a5YeffRRVVZW6oILLtCbb76pFStWaPPmzZo/f74GDhwos9ms5557TrNnzz7tawUAAAAAoDVxsncAAAAAAAAAQF2OF5U3+lhPVye5OTtaHcsprpDZbG7Uuu4ujvJwsf7WWl5JhapMDV830Mu1UTE01LvvvqslS5bI2dlZixYt0mWXXVZjfMCAAZo0aZIGDx6sXbt26cEHH6yzXdqmTZu0fPlyDR061LKvV69eGjVqlLp06aLMzEzNmTNHd955Z43jrrnmGi1atEgFBQX69ttvNW7cOKvrf/LJJ5IkHx8fjRkzplmvxZo77rhDFRUVcnR01LfffmtJvpKkvn37avz48Ro0aJCSkpL00ksv6aabblLXrl2trrVjxw5FR0drw4YNCgsLs+y/+OKLNWrUKI0cOVKVlZW65557tHHjxhrHJiUl6cknn5QkPfPMM3rmmWcs7fwkqXfv3powYYJuvvlmffzxx3ryySc1adKkWpWrAAAAAAA4W5DEBAAAAAAAgFat9z9XNPrYf1zVVTcNbGd1bMQrq5VTXNGodR+4JE4PXdrR6tj4t9Zrb1ZRg9c68OIVjYqhIcxms2bOnClJuv/++2sl/VTz9/fXrFmzNHr0aK1du1Z7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lZXZXH/p0qXKycmRJN14443Nei3WbN++XWPHjlVBQYGcnZ310EMPaeXKldq4caPefvttxcTESJLeeOMNTZs2rd617rrrLoWEhOg///mPfv31V61evVqPP/64XF1dVV5erhtvvNFmnLNmzdKjjz6qyspKXXDBBXrzzTe1YsUKbd68WfPnz9fAgQNlNpv13HPPafbs2ad9rZJkNBo1ZswYSwLTyJEj9dVXX2nz5s368ssvNWLECH3//fd66qmnGrU+AAAAAAANxSdBAAAAsJv4MB91DvPWjrSabaU6h3lr+tguurB9kJ0iA9CU4sO99dZfe+mfS5KVlltaY6ywzKh/LknWgo2H9PSYLhraKcROUQJo1YqPNf5YF0/J2d3GusclmRu3rrP7ibWtKcmRzKeRnOnZvL/zvPvuu1qyZImcnZ21aNGiWlWQBgwYoEmTJmnw4MHatWuXHnzwwTrbpVVXWxo6dKhlX69evTRq1Ch16dJFmZmZmjNnju68884ax11zzTVatGiRCgoK9O2332rcuHFW1//kk08kST4+PhozZkyzXos1d9xxhyoqKuTo6Khvv/3WknwlSX379tX48eM1aNAgJSUl6aWXXtJNN92krl27Wl1rx44dio6O1oYNGxQWFmbZf/HFF2vUqFEaOXKkKisrdc8992jjxo01jk1KStKTTz4pSXrmmWf0zDPPWNr5SVLv3r01YcIE3Xzzzfr444/15JNPatKkSbUqV9Xn7bff1pYtWyzX/vbbb9c4x9VXX61bb71V77333mmtC5wLsrKytHHjRm3cuNFSbe748eOSpJtvvlnz5s1r8nMuWLBA77//vn777Tfl5eUpNDRUgwcP1tSpUzVw4MAmPx8AAADQmpDEBAAAALtxcDDomSu76po56yRJfh7OenhkJ93QN0pOjhQNBc4VBoNBl3UL19BOIXr3l1S9sXKfSiuraszZl12sye9v0iWdQ/TUmC6KCbKRGADg/DSrfeOPHf2S1O9262Nv9JVKjjdu3SF/l4bZqMLz/uVS9u6GrzUjv/45jWQ2mzVz5kxJ0v3332+zjZu/v79mzZql0aNHa+3atdq7d6/i4uKszr3vvvtqJDBVCwgI0JQpU/Tiiy9q586dys/Pl6+vr2V82LBh8vf3V25urubPn281iamoqEiLFi2SJF177bVyc3Nr1ms5VXWigiTdfvvt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6cYbb9SOHTu0bds2JScn68svv7SMTZw40eoxLXEtI0aM0JNPPilJeu+999SnTx+r89avX29JPBgxYoTN9XJycrR48WJdffXVVsffe++9Gueu5ujoqNGjR2vBggVavny5kpOTFR8ff9rXU5+IiAjFx8crOTlZn3/+uWbOnCl399qtEouLi/XZZ581+fkBSGlpaZZtW63kqkVFRVm2Dx8+rC5dGtZ6+eRzWHP06FHLdmFhoQoKChq07pkqKiqyug2cCe4rVDObzTIajTIajXJ1dZWDQ+3aHqWlpTp48KCqqqpkNBplMllvCV398/nIkSM19kdFRSkoyHrV2PT0dDk4OMjJyUmOjo5ycnKq8YdWvucvfk6hOdjrviosLGzyNUliAgAAwGkrMjnp79/s1ne7sq2Ouzg66JZBMZo6rL283ShvD6BpvbV6n9LzyyRJa1OOa/TsX/TX/m310KUd5edhvRIGAJyvHBwc9MQTT+iee+5RamqqbrrpJn300UdydXW1Or+goEAffvih7r333maN64YbbtDjjz8us9ms+fPn6+uvv5YkDRw4ULGxsVaPaYlr6devn/r06aPNmzfrnXfe0bXXXqtLLrmkxpz8/HzdeeedlpjuvvvuOtf829/+pgsvvFChoaE19q9evVpz586VJPXu3Vt9+/atMT5t2jR99tlnqqqq0rhx4/T999/bTHCoqqrSwoULNWTIkHqTIE5199136/7771dGRoYefvhhzZkzp9achx56SFlZWae1LoCGOfmDHy8vrzrnenr+2Wr5dD6cOjn5qT4fffSRpRJcS/roo49a/Jw493FfnVscHR3l7OxsSQKq3q5rX7Xt27errKys1ppubm7q0aNHo2NasWKFcnNzrY7179+/zkQlo9GoysrKGv+t3s7Pz1dJSUmj48LZg59TaA4teV/l51t/wP1MkMTUzA4ePKjZs2dryZIlOnz4sFxdXdW+fXtdd911mjp1qjw8PBq17oEDBxQTE3Nax0RHR+vAgQO19g8dOlSrV69u0Bq0agAAAEcqPfVdUbSM+dYTmEbEh+qpK+LVLsjT6jgAnInMgjK9tXpfjX1VJrM+WH9Q3+xI18OXdtTE/tFypPobAFjcdddd+uGHH/TVV1/p888/19atW3XnnXeqX79+8vX1VUFBgXbv3q1Vq1Zp0aJFcnNza/YkpsjISA0ZMkSr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PMpXe/PbVGUCNcz035+O8uamDK45O55rpsURaerf32OFEEIIUI9rHt9OTkJMbeXk5DBv3jwOHz7snFdbW8vq1atZs2YNH374IcuWLWPv3r0sWLCAvLw853p1dXV8+eWXfPfdd6xevZrZs2e32395eTmLFy9m06ZNbeaXlpaybt061q1bx3//+19Wr15NXFycyzGmpqYyb9488vPznfMaGhr44Ycf+OGHH7j++us599xzT/ZHcdLWrVvn8mdgsVg4evQoR48e5Z133uH+++/nscce65HnrKioYOnSpfz4449t5jc2NrJz50527tzJiy++yMqVKznrrLNc7mPDhg0sXLgQs7ml+mhBQQFfffUVX331VafBLyGEEP1bQEBAm8e1tbXYbDb0+tP3HO7p+8qEEOIEOBwKPx8uoabRxswEP5fr3D13GOsPl3JZcgy3zer/4aXKOgv/25XHB1uzOFbi+gB9M2+DjsXjorhy6iDGxpikJLMQQgghhBDitBPo68GNMxK5YXoCW9LLeH9rNmsOFGK1t69OW2ex8+G2HD7clsPYGBNXThnE4vFR+Hj0z0NpQ8P9ee7XE7hr7hCe+8F1mKnWYueldcdYvj6dC0ZFcO3Z8STHB8r3PyGEEP3W8VWYQEJMx1u2bBm5ubk88MADXHDBBfj4+LBx40YefvhhzGYzN9xwA5MnT2bhwoXU19fzz3/+k5kzZ2IwGPj222/55z//SWNjI9dddx1HjhzBw6OlBa3dbmfhwoVs2bIFgJkzZ3LnnXeSkJBAfn4+b7zxBitWrCA1NZW5c+eSkpKCn1/bY+tms5n58+c7A0yXX3451157LWFhYRw+fJinn36aN998k/379/feD80Nm82Gr68vF110EXPmzCEpKQmj0UhxcTEHDhzgueeeIysri8cff5xhw4a1qbqUnJzMvn37WLlyJX/5y18A+O6774iKimrzHAkJCc77jY2NzJs3j127dqHT6bjyyitZsGABCQkJWK1W1q9fz9NPP01xcTELFixg9+7d7YJi2dnZzgCTVqvl5ptvZunSpZhMJvbu3cvjjz/OI488wuTJk0/hT04IIcSp5O/vj0ajQWn1Jb+qqorg4OA+HNWp1etHXo4cOcI777zDli1bKCwspL6+nu+++44hQ4Y419m/fz/Z2dn4+voyc+bM3h6iEOIMYm6w8umOXN7dkklm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ICCAO++8E4DNmzfz+9//vsPzp0VFRbz22mvtnmvJkiUAfPnll3zyySfttqupqeGWW27pcMxCCCEGjvz8fDIyMigvL8dms1FV5f788kDWK+3k7rrrLp577jmOHTvGrbfeyosvvohe7/qpv//+e66//noaGhoIDg7mpptu6o0hCiH6sd3ZFby9OZNV+wqw2ttekfBLejlphWaSIozttvMy6NrN6ysNVjs/phWzMiWPn9JKsNg7D3TGBfuwZFwUyybHEhvk0wujFEIIIYQQQgjRE7wMOi6ZEMMlE2I4VFjNpzty+GpvPkVm11fkW+0Ka1OLWZtajI+HjvNHhrNkQjTTh4Rg0PV9aXhfTz2/OSuOq6YOYsuxMt7anMna1CIcxxUNuPbs+D4ZnxBCCCF63q233sr777/Pli1bePPNN8nKyuL2228nISGBgoIC3njjDT7//HMABg8ezF//+td2+3jooYf45JNPyM3N5b777iMlJYVrrrmGsLAwDh8+zNNPP8327duZPHlyh1WWbr75Zl588UVsNhuLFi3ioYceYvr06VgsFjZt2sTTTz+N1Wpl6NChHDly5IRf64QJExg9ejT79+/nlVdeoaKigquvvprIyEhyc3N57733+OyzzzjnnHNchqha78fLy4uGhgb++te/YjAYiIuLc7b6iY6OxttbvUD5b3/7Gz///DNbt27l2WefZd26ddx0002MHz8eX19fKioqOHDgAGvXrmX16tWMGTOGG2+8sc3zPfXUU3z//fdUV1dz5ZVX8vPPP7N06VKMRiN79+7l8ccf5/Dhw53+fIUQQgwMJpOJgoIC5+OqqioURTntKlb2SogpPDycl19+mWuuuYbXX3+d7777josuusi5/Nlnn0VRFDZt2kRaWpqzd99bb72Fn5/7K7yEEKevRpudVXsLeHtzJntyO06RfrYjl78sHNlLI+s6m93B5mNlrEzJ57sDhdQ0dn41bYifJwvHRrJkfBTjYwNOuzcdIYQQQgghhDjTDI/w5y8LR/LAghFszSjjy5R8vtlXgLnB9XfEOoudFSn5rEjJJ8jXg4vGqN8RJw4KRNvH7cQ1Gg1nDwnh7CEh5JTX8d7WLD7enkNlnZXJcYGMjja53K6m0cZPh8twKCAd0YUQQoiBQafT8fXXX7N48WI2bdrEjz/+yI8//thuvREjRrB69WqX5/NMJhPf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Tm/x8AefwKbgUXDbEJJPsOuQksFHrW4ghBBCCHEi9E0VlKInATep8xqq1DBTznbI2Qq526HR3IWdKVCSqk673lZn+QSDzqP9qg4bHPtBnb7+PcSd3RRoWggBsT316oQQQgghxBnI11NPYqhfXw9DiC4ZSMf5B5LjzxlpNBoJMAkhBoSG777rcoCpmaei467ycdwd+hOz9iosORbIyAt+TcC7SzGEh5+ikQrRscDLL0Pr50v+ffe3+Z2u/PgTAn99pVQE64RGo+HOCXfy2+9+65xXXFfMZ4c/46oRV/XaOAwGA42Njc7HEmJyISMjw3lfURQSExPRaDR89913DB061O12Go0GLy8vgoOD0el0p2Joveqrr77iN7/5DWZzy8mkuro6duzYwY4dO3jttddYtWoVQ4YM6fZzOBwObr75Zl5//fU28/Py8sjLy2PFihXceOONvPLKK86yrK6UlpayYMECtm/f3mZ+eno6y5cv5+233+a///0vN954Y7fH2m/pvcArALxM6tQmjHR8MKnVPL2LE31CCCGEEL3FywSD56gTgMMOJWlqoClnm3pbnt61fdWVdWElBbI2qdO390PUBDXQNGIxhLj/jC+EEEIIIYQQA9lAOs4/0LgKMQkhRH9nLyzEnpPTrW3HNobwzs5kBi35Nf5zZkvVJdEvmC66CK2vL3l334PSHIRRFEpfeIGY557t28ENAMkRyUyJmMK2wm3Oea/te41Lh16Kl96rV8YgIaYuiIuLczk/KirK7bLTze7du7n88supr6/Hz8+PBx54gNmzZ1NfX89HH33Eq6++yuHDh7nooovYsWMH/v7+3XqeP//5z84vNhMmTODee+9l8ODBHDt2jH//+9/s3r2b1157jdDQUP7v//7P5T7sdjuXXHKJM8D0q1/9iptuuomgoCC2bt3KP/7xD4qLi7nllluIjo7uh1d8aNSTeN4BTUGkADePA9s+bp4MvfPHQwghhBDilNLqIHyUOk1uuvKjpgRyt7UEm/J2tbSMO1n5u9Xph79B4iy4ZmXP7FcIIYQQQggh+omBdJx/IJIQkxBiILLs3HlS2w++aCne88/vodEI0TP8Z80i+OabKH3+v8551WvW0JCaiteIEX04soHh9vG3s+3blhBTaX0pnxz6hGtGXdMrz284LhApIaYuaN1/70xx9913U19fj16vZ82aNUyb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755590ApVyapovFtRENML7zwwkjubtxasmQJzj//fGzfvh3PP/88brvtNixfvjxinV//+tc4duwYAOD++++HUhn5Bt6yZUv4C89tt90WESIKeeCBB7B+/XoEAgF85zvfwbZt25CSkhJe3tnZie985zsApLasDzzwQMx6H3zwQdx1112w2Wx4+OGH8fTTT0csr6ioCH9ZmzZtGkNMRERERJR8qTnwLbgdf/msE1rRha+fl4uUqn8ClVuBoC/2NhmlgKsZ6Gwb3DFsFdJ0oPsOJLURKFjcE2zKWwioeeKJiIiIxoBgUAoDuW1Ap016dLf2PO/sfu1uk553tkmBJH/nQHsefZ6OZFdAFNN4O89PRESJkblgAayffTbs7buaTsP24oswXnUV5EbjCFZGNHztf/sbbN3B7BDjVVdCVViYpIrGj1hdmAoMBbi85PIkVTT+cYDhUfLkk09ixYoV6OzsxCWXXIL/+q//wgUXXIDOzk789a9/xfr16wFInZC+//3vD+sYpaWleOihh/DYY49hz549WLFiBX7wgx+gpKQEFRUV+PnPf459+/YBAB566CFMnz495n5uu+02/OlPf8KOHTvwu9/9Dg0NDbj77ruRlpaGXbt24X/+539gt9shk8nw1FNPcVxqIiIiIhpT3IIOvnlfQ8p590oX405+JA0TV/5J5IW5G/4CmEuA1nKg5t/SVP1voOXE4A7U1QGUfyxNACDIgKyzukNNS6VQU3qx1DGKiIiIaLgCvj7Bo77BpLbo5Z72kemKlAyd7cmugCiu8XSen4iIEmP+N76BA888M+ztX7hVgy3lv8AVX3scyxasRfqNNyFlzlkjWCHR0LS+sAFNP/955EyFAhn3sQvTYGyp2YKjrUcj5t07/14oZezCNFxMo4ySs88+G6+++ipuvvlm2O12/Nd//VfUOqWlpdi0aRMMZ9A28H//93/R1NSEP/3pT9i3bx9uuOGGqHXuuusu/OQnP4m7D7lcjrfffhtr167F7t278cYbb+CNN96IWEetVuPpp5/Gl7/85WHXSkREREQ06lJMwLzrpMnrkoJMx94D2quBjGnSOhnTpensm6XXpz8DXri0104EYDDD04lBoOGQNO1+rvv4aVKYKTTlngPoM0fwByQiIqJxJRjsDh21SB0hXc2AqyV+xyS3DfA6kl318MjkAATpZ0afQFVKOnDB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//xzSbceP9e+fXuTI4Ir6tChg3W5qhr6888/W5epoTCTv7+/WrVqpaysLJ05c8bscFBPpKena/jw4UpPT5fFYtHKlSs1ZsyYSvehRsJRapKPtqJGwp7GjBmjtWvX6vr16/riiy/04IMPSqI+whwV5aOt3NzcFBwcrKSkJOojKvTWW28pPz9fXbp0UU5OjtasWVNmm++++866/PXXX+vcuXOSpIiICPn4+FAjgX/54Ycfan2Mdu3a2SGSmuGzXDc5Kq86dOig/fv36/r167p8+XKlT1oofr/btGlT6vE49tajRw8dPXpUeXl5unDhgtq0aeOwc8E2zuqPpP64jrrWx809JVTHL2tV8aPhy2N2rWIQE0zRo0cP7d69WykpKSosLJSbW/mp+OOPP1qXu3fv7qzwgHJVNm0j4CzF3+iRStfI8lBDUZdQQ1EdWVlZuueee3TixAlJt75V//DDD1e5HzUSjlDTfKwOaiTspWRHSVpamnU5ODhYjRs3VlFREfURTlNRPlYH9RFVKX7MwYkTJzRp0qQqt//zn/9sXU5NTZWPjw9tSOBfQkJCzA6hVmjv1E2OyqsePXpow4YNkm69nwMHDix3u8LCQh0/flyS499r2i11kzP6I2lLuJa61sdN7YGtalKr3Nzc1K1bN4fGVR4eJwdTDB48WNKtqci++eabCrcrOfXdXXfd5fC4gMocPXrUuswsTDBL586drflX1fSg//jHPyRJt99+uwIDAx0dGlChzMxMZWVlSaJ+ompXrlzRvffea/29+9prr+nJJ5+0aV9qJOytNvloK2ok7KnkNy9LTvft7u6uAQMGSJISExOVn59f4TGK66eHh0el38oDqlJRPtqqsLBQx44dk0R9hGPRhgQaBto7rqW4j0mqvHYnJSVZZ0JxdB9T8d+NHh4eatWqlUPPBds5oz+StoRrqUt93NxTQnX0799f7u7ukiqvVfn5+dq3b591nyZNmjglvpIYxARTjB071rq8atWqcre5efOmVq9eLUny8/NTeHi4M0IDypWamqqdO3dKkrp27arbb7/d5IjgqiwWi/XxNT/++KO1IfFL+/bts46UHjNmDKPxYaply5bJMAxJ0tChQ02OBnVZTk6ORo0apUOHDkmSXnrpJb3wwgs270+NhD3VNh9tRY2EPa1bt8663KtXr1Lriv8Ov3r1qjZu3Fju/qdP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AAAAAAAaOh4nBwAAAKBadu3apaioKF27ds36s7S0NK1cuVLbt29XfHy8QkJC9Mknn2jKlCnKz8+3bnf69Gm9//77+vvf/669e/eqffv25Z7j0qVL+t3vfqevv/661M9v3Lihb775Rt98843ee+89bdmyRQMHDnTMhVZg06ZNmjx5snJycqw/y8jI0ObNm7Vt2zZ99NFHmjBhQpn9zp49q+HDh+vo0aOlfn7p0iVdunRJx44d0xdffKH09HQtXLjQ4dcBAAAAAAAAAEBdwkxMAAAAAGyWnp6u8ePHy8/PT0uWLNH+/fu1e/duPfvss7JYLMrIyNC0adN08OBBPfzww+ratauWL1+uAwcOKDY2Vg899JCkW4Oe/uu//qvcc9y4cUPDhw/X119/rcaNG+uhhx7SJ598on379mn37t169dVX1apVK2VkZGjkyJFlZn9ypCNHjujBBx9U27Zt9c4772jfvn1KTEzUnDlz5OnpqaKiIk2fPl2ZmZll9n366aetA5gmT56sjRs3at++fTp48KC2bt2qV155Rb1793batQAAAAAAAAAAUJcwExMAAAAAmyUnJ6tbt25KSEhQmzZtrD8fPHiw3NzctHDhQiUkJGjUqFEaMGCAdu7cKW9vb+t2YWFhysvL07p167RhwwZlZmaWOo4k/elPf9KhQ4fk5+enXbt2qV+/fqXWDx48WP/xH/+hQYMG6ezZs3rxxRf10UcfOfbC/+XQoUPq16+fvv76a/n6+lp/PnDgQAUFBWny5Mm6evWqPvzwQ82cOdO6Pi8vT1u3bpUkzZo1q9yZliIiIjR37lxdvHjR8RcCAAAAAAAAAEAdw0xMAAAAAKrl7bffLjPwSJKeeOIJ63JWVpaWL19eagBTsccff1ySVFhYqMTExFLrsrOz9e6770qS/vznP5cZwFQsICBAL7/8siRp3bp1un79es0upgZWrlxZagBTsQcffND6eLzdu3eXWnfx4kUVFBRIkn77299WevyWLVvaKVIAAAAAAAAAAOoPBjEBAAAAsJmfn5/uvffectd17txZzZo1kyTdeeed6t69e7nblXxk2okTJ0qti4+P15UrVyRJv/vd7yqNpXgwUEFBgb755hvbLqCWevXqpTvvvLPcdRaLRX379pVU9rpatWold3d3SdLf/vY3FRYWOjZQAAAAAAAAAADqGQYxAQAAALBZt27dZLFYKlzv5+cnSQoODq5yG0m6du1aqXVJSUnW5Xbt2slisVT46tmzp3Xbc+fOVfNKaiYkJKTS9cWzKP3yujw8PDRhwgRJ0vr16xUUFKTnn39en3/+uS5fvuyQWAEAAAAAAAAAqE8YxAQAAADAZuU9Hq6kRo0aVbld8TaSVFRUVGpdRkZGjeLKycmp0X7VZev1//K6JOmdd95RRESEJCktLU2vv/66Ro0apVatWql///56/fXXrbNQAQAAAAAAAADgatzMDgAAAAAAipUc/HPo0CE1adLEpv06dOjgqJDsxtfXV1u3btWBAwe0du1axcXF6dtvv1VRUZGSkpKUlJSkhQsXavPmzRo0aJDZ4QIAAAAAAAAA4FQMYgIAAABQZ7Rq1cq63KZNm3oxOKm6BgwYoAEDBki69di5uLg4xcTEaOPGjcrIyNC4ceN0/PhxeXl5mRwpAAAAAAAAAADOw+PkAAAAANQZffv2tS4nJCSYGIlzNGvWTBEREdqwYYN+//vfS5LOnj2rPXv2mBwZAAAAAAAAAADOxSAmAAAAAHXG8OHD5e3tLUl6++23ZRiGyRE5z7Bhw6zLWVlZJkYCAAAAAAAAAIDzMYgJAAAAQJ3h5+enp556SpK0d+9ezZw5Uzdv3qxw+/Pnz2v58uXOCq/GTpw4ofj4+Eq32bFjh3W5c+fOjg4JAAAAAAAAAIA6xc3sAAAAAACgpD/96U+Kj4/X/v37tXjxYsXFxemxxx5Tnz595OPjo0uXLun777/Xrl279Pe//129evXStGnTzA67UqdOnVJ4eLh69OihyMhIhYaG6vbbb5ck/fzzz/r000+1du1aSVKfPn3061//2sxwAQAAAAAAAABwOgYxAQAAAKhTPDw8tHPnTk2ZMkUbN27UP//5T+vsTOXx9fV1YnS1c/ToUR09erTC9SEhIdq4caMsFosTowIAAAAAAAAAwHwMYgIAAABQ5zRr1kwbNmzQnj179MEHH2j37t1KT09Xbm6ufH191bVrVw0YMECjRo3SiBEjzA63SkOGDFFcXJy+/PJL7du3Tz///LPOnz+vvLw8tWzZUr1791ZUVJSmTJkiDw8Ps8MFAAAAAAAAAMDpLIZhGGYHAQAAAADOFhgYqLS0NEVHRysmJsbscGwWFxen8PBwSVJsbKzCwsLMDQgAAAAAAAAAADtgJiYAAAAALu3y5cv67rvvJEnu7u4KDg42OaKyMjIylJGRIUlKTU01ORoAAAAAAAAAAOyPQUwAAAAAXNqWLVu0ZcsWSVJAQIBOnjxpbkDleO+99zR37lyzwwAAAAAAAAAAwGEamR0AAAAAAAAAAAAAAAAAANdmMQzDMDsIAAAAAAAAAAAAAAAAAK6LmZgAAAAAAAAAAAAAAAAAmIpBTAAAAAAAAAAAAAAAAABMxSAmAAAAAAAAAAAAAAAAAKZiEBMAAAAAAAAAAAAAAAAAUzGICQAAAAAAAAAAAAAAAICpGMQEAAAAAAAAAAAAAAAAwFQMYgIAAAAAAAAAAAAAAABgKgYxAQAAAAAAAAAAAAAAADAVg5gAAAAAAAAAAAAAAAAAmIpBTAAAAAAAAAAAAAAAAABMxSAmAAAAAAAAAAAAAAAAAKZiEBMAAAAAAAAAAAAAAAAAUzGICQAAAAAAAAAAAAAAAICpGMQEAAAAAAAAAAAAAAAAwFQMYgIAAAAAAAAAAAAAAABgKgYxAQAAAAAAAAAAAAAAADAVg5gAAAAAAAAAAAAAAAAAmIpBTAAAAAAAAAAAAAAAAABMxSAmAAAAAAAAAAAAAAAAAKZiEBMAAAAAAAAAAAAAAAAAU/1/RJfNPSGZCccAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "drag_pulse = Pulse(0, 40, 0.9, 50e6, 0, Drag(5,2), 0, PulseType.DRIVE, 200)\n", - "drag_pulse.plot()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### ReadoutPulse, DrivePulse & FluxPulse Aliases" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "These objects are subclasses of the Pulse object. They have a different representation, and in their instantiation one does not require to specify the type." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "rop = ReadoutPulse(start = 0,\n", - " duration = 50, \n", - " amplitude = 0.9, \n", - " frequency = 20_000_000, \n", - " relative_phase = 0.0, \n", - " shape = Rectangular(), \n", - " channel = 0, \n", - " qubit = 0)\n", - "assert isinstance(rop, Pulse)\n", - "\n", - "dp = DrivePulse(start = 0,\n", - " duration = 2000, \n", - " amplitude = 0.9, \n", - " frequency = 200_000_000, \n", - " relative_phase = 0.0, \n", - " shape = Gaussian(5), \n", - " channel = 0, \n", - " qubit = 0)\n", - "assert isinstance(rop, Pulse)\n", - "\n", - "fp = FluxPulse(start = 0,\n", - " duration = 300, \n", - " amplitude = 0.9, \n", - " shape = Rectangular(), \n", - " channel = 0, \n", - " qubit = 0)\n", - "\n", - "assert isinstance(rop, Pulse)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### SplitPulse" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Sometimes the length of the pulse is so long that it doesn't fit in the memory of one sequencer. In that case it needs to be played by two (or more) sequencers.\n", - "The `SplitPulse` class was introduced to support splitting a long puse into smaller portions:" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAACWwAAALKCAYAAACs8YqSAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAB7CAAAewgFu0HU+AAEAAElEQVR4nOz9eXQsd30n/L9r7epdu3Tvle6++Ron8RgbG5MYE/CZDDFbEsjwIzZ7SCAsB4YESAiZOSQhgTFLIMEL9jCZBycTHhzABBgmYGw/gJcAMfjuq3apJfXe1bX+/qilu6XWvVpaUkt6v87pU2t3lWS5b3fV+/v5CK7ruiAiIiIiIiIiIiIiIiIiIiIiIqI1J270CRAREREREREREREREREREREREW0XDGwRERERERERERERERERERERERGtEwa2iIiIiIiIiIiIiIiIiIiIiIiI1gkDW0REREREREREREREREREREREROuEgS0iIiIiIiIiIiIiIiIiIiIiIqJ1wsAWERERERERERERERERERERERHROmFgi4iIiIiIiIiIiIiIiIiIiIiIaJ0wsEVERERERERERERERERERERERLROGNgiIiIiIiIiIiIiIiIiIiIiIiJaJwxsERERERERERERERERERERERERrRMGtoiIiIiIiIiIiIiIiIiIiIiIiNYJA1tERERERERERERERERERERERETrhIEtIiIiIiIiIiIiIiIiIiIiIiKidcLAFhERERERERERERERERERERER0TphYIuIiIiIiIiIiIiIiIiIiIiIiGidMLBFRERERERERERERERERERERES0ThjYIiIiIiIiIiIiIiIiIiIiIiIiWicMbBEREREREREREREREREREREREa0TBraIiIiIiIiIiIiIiIiIiIiIiIjWCQNbRERERERERERERERERERERERE64SBrS1qamoKX//61/HhD38Yv/Zrv4aenh4IggBBEPD6179+TY75pS99CbfddhsGBgagaRr27NmD173udfjBD36wJscjIiIiIiIiIiIiIiIiIiIiItpsBNd13Y0+CWo9QRAW3XbnnXfigQceaNmxKpUKfvM3fxPf+MY3mm4XRREf/vCH8ad/+qctOyYRERERERERERERERERERER0WbEClvbwO7du3Hbbbet2eu/8Y1vDMNat956Kx566CE8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uo8oirjjjjvwgQ98ANlsFt/97ndx2223LfkYruvin//5nwEAR48exY033th0vxtvvBFHjhzByZMn8c///M/4m7/5GwZu1oAsCmE/2Iiflo7IXi9Yb73oBav8EFWwrWE/f70q1/WQrQtURfxAVVRt7DnLVn9ERERERERERERERERERLRagiCE96HXg2nXQmHVhoCYEwbBqpaDquXAsLwAWNVyUDXr5i3bX/bmDcsJnzN/W/1zmRXb3loa2JIk738YQRDCqkv161di/mutxJ49e1b1/M3oscceAwDE43Fcd911i+53yy23hPOPP/74sgJb58+fx9jY2ILXWew4J0+exOjoKC5cuIB9+/Yt+TjtTJW9EJQiCVBlEYokhuuCZW+bBLVuH0VaPCQVCQJUihRWrorM39YkdMXQFBERERERERERERERERER0dIF9+9TWmtbRy6FZV852GXYiwe+ghCZYXtT065fdmHYDkx/uXFb3bLlwLS9fWl9tTSwtVjbwe3WjrAdHD9+HABw8OBByPLi/5mPHj264DlL9eyzzzZ9naUcZ60CW8/bpUKKxCBLAlRJgCx6D0USvHWiCFmqXydCFQVIkgBF9N6MZdF7riSJUIL9RAGqJEKS4K0TRUgi1qBSmOM/mrD8BwDTfxRbfHQiolazbRuGYQAALly4sKoQNxERtR7fp4mI2hffo4mI2hvfp4mI2hvfp4los5L9RxwARP/RNEsWbGwN13VhOy4Mx4VluzD9h+W4MB0Xlu3ACJZtL+Rl2YDpOP722vpgf+81AMv1ttmOC6sqwD3bstPe1Foa2PrTP/3TZa2ntaHrOjKZDABgcHDwsvt2dnYiHo+jVCpheHh4WccZGRkJ5690nKGhoXB+OcepP0Yz4+PjDcuRk98GHBMAYPgPIiIiIiIiIiIiIiIiIiIiIto4AgBFVGCoXRt9Km2Bga0tqFAohPOJROKK+weBrWJxefWalnOceDwezi/nOPVBLyIiIiIiIiIiIiIiIiIiIiKiza519dE2gePHj+M973kPnvvc56KrqwuKokCSpMs+LtdOsF3puh7Oq6p6xf0jkQgAoFKprNlxgmOs5DhERERERERERERERERERERERFvF5ksjrdB//+//HR/4wAdgWRZc193o01lTmqaF80Fv5supVqsAgGg0umbHCY6x3ONcqX3i+Pg4brjhhiW/HhERERERERERERERERERERHRRtqwwNbU1BSeeeYZzM7OAgC6urrwnOc8B/39/S0/1je/+U28733vAwAIgoAbb7wR1113Hbq6uiCKW6/IWDKZDOeX0n6wVCoBWFr7xJUeJzjGco8zODi4rHN63/vei97uzmU9h4iI1o5pmnj22WcBAMeOHYOiKBt8RkREVI/v00RE7Yvv0URE7Y3v00RE7Y3v00RE7Wl6Zg5//un7N/o02sK6BrZc18XnP/95fO5zn8PPf/7zpvscO3YMv//7v4/f/d3fbVmY6pOf/CQAoLOzE1/96ldx8803t+R125Wmaeju7sbMzAxGRkYuu+/c3FwYphoaGlrWcerDVFc6Tn2lrOUeZzn+f//jJ3CVODRFhKZIiCgSNNmbD9Zpcm0+IovePsF2WWrcVxERWbDOe54ibb2wHxFRqxmGEVZWTCQSS2rVS0RE64fv00RE7Yvv0URE7Y3v00RE7Y3v00REy+O6LqqWA920w6luBlMbuuWg6k910/bmg+2WjarpQLfqn+Og2rDeW4dqCYc3+odtE+sW2JqamsLtt9+Op556CgAWbUv47LPP4h3veAe+8IUv4Gtf+xoGBgZWfeynnnoKgiDgwx/+8JYPawWOHTuGRx99FGfOnIFlWZDl5v+pT5w4Ec5fddVVyz5Gs9dp9XGWo1CxUazoa/b69SRRqAuDSYiEga/auqgiIap605jaOK8pEmKqjKgqIqrIiKr+Pv5zYqoXLhNFYV1+HiIiIiIiIiIiIiIiIiIiImovtuOiYtooGxZ0wwnnK36YqmI43jbT9rd5U92om6/fZtSWg4BV1XLW5WdJwFyX42wG6xLYqlareNGLXoTjx4/DdV309vbi1a9+NW644YawBeLk5CSefPJJ/OM//iOmpqbw9NNP48UvfjGefvppRCKRVR2/XC4DAF7wghes+mfZLF7wghfg0UcfRalUwtNPP43nPe95Tfd75JFHwvnlhtn27duHnTt3YmxsrOF1mvn+978PANi1axf27t27rOO0K9txUTJslAx7TY+jKaIf8pKhKaIf8qoLgc0LhWmqhFiwvz8fBMASERmxiIy46m1XZVYJIyIiIiIiIiIiIiIiIiIiWg3TdlCu2igZFsqGhVIwH66zUapaYYCq4genghBVfaBKN2vbKoYNw16fMBWtr3UJbN1111149tlnIQgC3vSmN+GTn/wk4vH4gv1+53d+B3/5l3+J97znPbjnnntw/Phx3HXXXfijP/qjVR1/165dOHfuHAzDWNXrbCaveMUr8Bd/8RcAgPvvv79pYMtxHHzxi18EAHR0dODWW29d1jEEQcDLX/5y/O3f/i1OnDiBH/7wh7jxxhsX7PfDH/4wrLD18pe/HILAilHL4SVaHcyVW580VSURsYiEuCojpkqIRWQkIl6YKx4ue9viqoxYxA991W2PqxLiETnczlaRRERERERERERERERERETUjlzXhW4688JUXsCqYWrYKFf9aZPtZb96VfA6DFXRcq1LYOvBBx+EIAh4yUtegnvuueey+8ZiMXz+85/HxYsX8e1vfxsPPvjgqgNbt99+Oz71qU/h8ccfx0033bSq19osbrjhBvzyL/8yHn30Udx333248847F/zsn/jEJ3D8+HEAwLve9S4oitKw/Xvf+14Y4rrzzjvxwAMPLDjOu9/9btx9992wbRt/8Ad/gO9///thP2gAqFQq+IM/+AMAgCzLePe7393Cn7JRd08X/ublNwCyEvZDbeyr2tgbter3Uq3tW9d/dd46y2newnOzM2wHRtlBtoVhMFUSEQ9CX3XTuOqFvxJabZoMlxUkIjKSmvcItkdkqWXnRUREREREREREREREREREm4/ruqhaDgq6hWLVQjGYVi0UqyaKVdtfZ6JUtf39/PmqhaJuolitVb1yt+bt/zURkUVEZBGaIvkPbz5YF5Fr6zRFrC3Ltf0jdfvDNvF/vzay0T/W/5+9+46TrKrz//+unDunmemenjxDUlGGJUgShAVBHPyJwKKAAVZ01V0WcNfvoruGXTEiqysoQV0kKSIsRhCRMDCDoiJhZnpiT+ocKsf7++NW3e6a7p7pUN1d3fN6Ph71uLfuvXXPqVFO36p6388pCzMS2Gpra5MkXXvtteN+zbXXXqtf//rX2rp165Tb/+d//mf98Ic/1Fe/+lVdfvnlampqmvI554JbbrlFJ598suLxuM4++2z967/+q8444wzF43Hdd999uv322yVJq1at0nXXXTepNlatWqXrr79e//Vf/6UXX3xRJ598sm688UYtX75cW7du1Ze+9CW99NJLkqTrr79eK1euLNn7O9A1l7xDy5YtmpZzZ7I5JTLFgS5zHtesklYQLFe0L57OKpkvWRg7YH7YodKGGSXSuWHzy8791G0hBFaKimBuh30o4DUi5DXsucepoHco9HXgsT6Xg8puAAAAAAAAAAAAADCDDMNQNJVVOJHWYDyjwUS6OGyVyCiczCg6IoQ18nl2nhZZmSyvyy6/2/wtvGjd7ZDf5ZDPbQam/G6HfKM89xa2DQtjDQWzzKXbYZfdXvrf2VcG36Ev/7+Pl/y8c82MBLY8Ho/i8bhaWlrG/ZrCsW63e8rtL1y4UD/72c/0rne9SyeddJL++7//W+edd96Uz1vujj32WN1///26/PLLNTg4qH/9138dccyqVav02GOPKRQKTbqdL3zhC+rs7NSdd96pl156SZdccsmIYz74wQ/q85///KTbmG1Oh11Bh11Bz/T+J5PLGUpk8sGuYfPVmusZxVO5fMhrtPBXcRAsns4png+CxZJDx88lqWxOvdGUeqNTm87UbpOCHqcqfC5VeF2q8DnzS5dC3qH1Cu8ox3hdCnqdckzDHyIAAAAAAAAAAAAAKFfprFnVanjgavj64Bj7wsn8MpHW4Zqz8jjtCnic8rvN2aj8+VmpfG4zNOXPB6h8rqFAlS8fphq+z+92yue258NWZijL45yeIBVm1owEttasWaPnn39e7e3tOvbYY8f1mvb2duu1U/W2t71NklRTU6PNmzfrggsuUFVVlVauXCm/33/Q19psNj3xxBNT7sNsueCCC/SXv/xFt9xyix577DHt3r1bbrdbK1as0Hve8x597GMfO+S/waHY7Xbdcccdeve7363bb79dGzduVHd3t+rq6rR27Vpdc801Ovfcc0v0juY3u90mv9spv3t6/tPM5gxrPt1o0lxGksVz8kaSQ3PxRpOZorl7C68pbIskM0pmyr8qWM6QBhMZDSYykuKTOkcoH/gKjRrqGj0MVnge8roIfAEAAAAAAAAAAACYUdmcoXAirf5YWgNx89GfX1rhqnzwarCwbVgIa64VBJkMm01moMrtGDVgVbR9jABW0fEes8KV02Gf7beGMjcjga0rr7xS69ev13e+8x29853vHNdrvvOd78hms+n973//lNv/3e9+VzQdmmEY6uvr04YNG8Z8jc1mk2EY82IatdbWVn3ta1/T1772tQm97vTTT5cxgclbzzvvvMOictlc5rDbFPK6FPK6SnbOTDanWL6K18jw11A4rDAf8NC8wuY8weFhpSzDifItZRlOmuU4Jyvk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csop+s53vqNMJjPu8wDAZJRinL777rvHfb199913H/J8sVhMN998s9auXauamhoFAgGtWbNG1113nXbu3Dnu91aq702ee+45XX755WptbZXX61VTU5POOecc3XvvveM+BwBM1osvvqj/+I//0Nlnn21dAweDQa1atUpXXXWVnnnmmQmdj+tpACitUozTXE8DQOkNDg7qvvvu03XXXafTTjtNK1asUGVlpdxutxoaGnT66afr5ptvHvd1Z6nGsnvvvVdnn322mpqa5PV61draqssvv1zr168f9znKbZyfEgOYgx555BGjoqLCkDTqY9WqVcaWLVtmu5sAUDbGGi8PfJx22mljniObzRof/OAHD/r6D33oQ0Y2mz1oX7q6uoy1a9eOeQ6Px2N897vfPeR7ev75542mpqYxz7NgwQLjhRdemOg/FQCU1MHGzCuuuGLc55mvY/Dtt99uuN3uMc9z/PHHG11dXeP+dwKAiSrFOH3XXXeN+3r7rrvuOui5tmzZYqxcuXLM11dUVBiPPvroIftUqu9NPvOZzxh2u33M87zjHe8w4vH4uP6dAGCiTjnllHGNre9///uNZDJ50HNxPQ0ApVeqcZrraa6nAZTeb37zm3GNq3V1dcYvf/nLg56rFGNZLBYzzjvvvDHPYbfbjc9+9rOHfF/lNs5PFYEtzDl//OMfDZ/PZ0gygsGg8YUvfMF47rnnjCeeeML48Ic/XPQf0eDg4Gx3FwDKQmFs/MhHPmK8/PLLYz62bds25jk+9alPWec59thjjXvvvdfYsGGDce+99xrHHnuste9f/uVfxjxHJpMx3vrWt1rHXnTRRcYvfvEL44UXXjC++c1vGg0NDdaF2c9//vMxz7Nr1y6jvr7ekGQ4nU7jhhtuMH7/+98bv//9740bbrjBcDqdhiSjoaHBaG9vn9K/HQBMxfAPeYsXLzbOPvts6/lEAlvzcQx+7LHHrA/6jY2Nxje/+U3jhRdeMH7xi18YF110kdXPt771rUYmkxn3vxUATEQpxunhPzD96le/Ouj1dl9f35jnGRwcNFatWmWd68Mf/rDxxBNPGM8995zxhS98wQgGg4Ykw+/3Gy+99NKY5ynV9ybf+c53rGOXL19u3HHHHcaGDRuMhx9+2DjjjDOsfZdeeum4/p0AYKKWL19uSDIWLlxofOITnzB+/OMfGxs2bDDWr19vfO1rXzMWLVo07rGI62mupwGUXqnGaa6nuZ4GUHq/+c1vjJaWFuP973+/ccsttxgPPfSQsX79euPZZ5817r//fuM973mP4XA4DEmG2+02/vSnP416nlKNZZdccol17BlnnGE8/PDDxoYNG4w77rjD+nsiybjtttvGPEe5jfOlQGALc04hse90Oo3nnntuxP6bb77Z+o/oM5/5zMx3EADK0FTHxU2bNllfGB533HFGLBYr2h+NRo3jjjvOGp/HSp3fcccdVl+uvfbaEfu3bNliJdpXrFhhpNPpUc/zvve9zzrPAw88MGL//fffP6lABACU2k033WQ8+uijxv79+w3DMIzt27dPeHyaj2NwKpUyli1bZt311NbWNuKYa6+91jrPoe6gBYDJKsU4PfwHpu3bt0+6L//2b/9mnefmm28esf/ZZ5+1/h4crDJuKb436enpMSorK60g24HVWTKZjHHBBRdY53nyyScn8lYBYFze8Y53GPfff/+YYaOurq6iH2yeeuqpUY/jeprraQDTo1TjNNfTXE8DKL3xBPZ/+tOfWuPQunXrRuwv1Vj2xBNPWMdccMEFI/rW1dVlLF682JBkVFVVGb29vaOep5zG+VIhsIU55YUXXrD+47jmmmtGPSabzRpHHHGE9R90KpWa4V4CQPmZ6oXFRz7yEesc69evH/WY9evXH/SLS8MwrPG5pqbGiEajox7zn//5nwf94nLfvn3WHaTnnHPOmH0+55xzDMm8s3Xfvn3jeJcAMP0mEwSYj2Pw8B+h/vM//3PUc0SjUaO6utqQZBx55JFjtgUApTRbga1UKmV9CXrEEUeMOSXXNddcY7W1YcOGEftL9b3Jl770Jes8995776jnaW9vt+7GPe+88ybwbgGgdB599FFrvPqHf/iHUY/heprraQCzZzzjNNfTXE8DmD2rV682JHNqxAOVaiw799xzrYDUWBVk77333oOGscptnC8Vu4A55OGHH7bWr7rqqlGPsdvtev/73y9J6u/v15NPPjkTXQOAecswDP3sZz+TJK1Zs0YnnHDCqMedcMIJWr16tSTpZz/7mQzDKNq/efNmvfbaa5Kkiy++WH6/f9TzXHnlldb6T3/60xH7H3nkEeVyOUlj/y0Yfp5cLqdHHnlkzOMAoJzN1zF4+HX98DaH8/v9uvjiiyVJr776qjZv3jxmewAw1z355JMaGBiQJF1xxRWy20f/yu5Q43SpvjcpnKeiokIXXXTRqOdpbm7WWWedJUl64oknFA6HRz0OAKbTGWecYa1v3bp1xH6up7meBjC7DjVOlwrX0wAwOaFQSJKUSCRG7CvFWBYOh/XEE09Iks466yw1NzePep6LLrpIFRUVkkYfn8ttnC8VAluYU5555hlJUiAQ0Fve8pYxjzvttNOs9WeffXba+wUA89n27du1d+9eScXj62gK+/fs2aMdO3YU7SuM4Yc6T1NTk1atWiVp9DF8vOfhbwGA+WC+jsGF86xevVpNTU2TPg8AzBfjHV+PO+44KyRwsPF1Kt+bpFIpbdiwQZJ04oknyu12H/I8yWRSL7744pjHAcB0SSaT1rrD4Rixn+tprqcBzK5DjdOlwvU0AEzcpk2b9Kc//UmSeXPDcKUayzZu3KhUKlV03Gjcbrd1c8XGjRuVTqeL9pfTOF9KBLYwpxTuYlqxYoWcTueYxw0fUAqvAQBIDz74oI488kj5/X6FQiGtXLlSV1xxxUHT4a+++qq1fuAF24EONv5O5jzt7e2KRqOjnqeysvKgX0ouWLDASuPztwDAXDUfx+BIJKL29vYJ9WW08wBAObrqqqu0cOFCud1u1dXV6YQTTtD/+3//T3v27Dno68Y7TjudTq1YsULS6ONiKb432bx5s7LZ7CH7cqjzAMBMeOqpp6z1I444YsR+rqcZpwHMrkON0wfiehoAplcsFtOWLVv0ta99TaeddpoymYwk6ZOf/GTRcaUayyZzHZ3JZLRly5ZJnWcmxvlSIrCFOSORSKi7u1uSxiyVV1BdXa1AICBJ1odXAIB5QfPaa68pHo8rEomora1NP/jBD/S2t71N69ats8qJDrd7925r/VDjb0tLi7V+4Pg7mfMYhlH0uuHnOdQ5hp+HvwUA5qr5OAaX6j0BQDn63e9+p3379imdTqunp0cvvPCCvvCFL2jFihW67bbbxnxdYWwMBAKqqqo6aBuFsbGrq6uoYkGpvjdhnAYwV+RyOf3Xf/2X9bww/d9wXE8zTgOYPeMZpw/E9TQAlN7dd98tm80mm82mQCCgVatW6brrrlNHR4ck6VOf+pQuu+yyotfM5nX0wc5TDuN8KY0dGQPKzPD5ToPB4CGPDwQCikajikQi09ktAJgT/H6/3vnOd+rMM8/UmjVrFAwG1dXVpaeeekrf+c531NPTo4cfflgXXnihfvOb38jlclmvncj4W7h4kTRi/C31ecb7t2C0cwDAXDEfx+BS9QUAysmyZct00UUX6cQTT7S+GNy2bZt+8pOf6Mc//rESiYT+/u//XjabTVdfffWI109mfJXMsdHj8RSdYyLnGe17E8ZpAHPF17/+dWualosuumjUKU24nmacBjB7xjNOF3A9zTgNYOa96U1v0u233661a9eO2DcfrqML5yn1OF9KBLYwZyQSCWv9YHOkFhT+w4vH49PWJwCYK/bs2TNq4vztb3+7/uEf/kHnnnuuXnrpJT311FP6n//5H3384x+3jpnI+FsYe6WR42+pz8PfAgCHg/k4BpeqLwBQLtatW6crrrhCNputaPvatWv13ve+V//3f/+niy66SOl0Wv/4j/+od77znSOmwZrM+CoVj42l+t6EcRrAXPDUU0/pU5/6lCSpoaFB//M//zPqcVxPM04DmB3jHaclrqdH6wsAlNK73vUuHXfccZLMsWbr1q164IEH9NOf/lSXXnqpvvGNb+j8888ves18uI4+8DzlmDdhSkTMGV6v11pPpVKHPL5Q3s7n801bnwBgrjhYedDGxkb9+Mc/tqpq3XrrrUX7JzL+Di8teuD4W+rz8LcAwOFgPo7BpeoLAJSLysrKET8uDXf++efrpptukiTFYjHdcccdI46ZzPgqFY+NpfrehHEaQLl75ZVXtG7dOmUyGXm9Xj344INqaGgY9ViupxmnAcy8iYzTEtfTo/UFAEqpqqpKRx99tI4++mitXbtWl1xyiR566CH94Ac/0LZt23ThhRfq7rvvLnrNfLiOPvA85Zg3IbCFOSMUClnr4yk7F41GJY2vnB0AHO6WLVumt7/97ZKktrY27d2719o3kfG3MPZKI8ffUp+HvwUADgfzcQwuVV8AYC65+uqrrR+hnnrqqRH7JzO+SsVjY6m+N2GcBlDOtm/frrPPPlt9fX1yOBy67777dOqpp455PNfTjNMAZtZEx+nx4noaAErvfe97n97znvcol8vpYx/7mHp7e6198+E6+sDzlGPehMAW5gyv16va2lpJ0u7duw96bF9fn/UfUGGuawDAwR155JHW+p49e6z15uZma/1Q4297e7u1fuD4O5nz2Gy2otcNP8+hzjH8PPwtADBXzccxeNGiRRPuy2jnAYC5pKGhwfpOY/i1dkFhfI1Go+rv7z/ouQpjY319fVGZ/1J9b1Kqvz0AUGp79+7VWWedpb1798pms+nOO+/UhRdeeNDXcD3NOA1g5kxmnB4vrqcBYHoUxuloNKpf/vKX1vbZvI4+2HnKYZwvJQJbmFMKYYK2tjZlMpkxj3v99det9SOOOGLa+wUA88FYZaeHB7mGj6+jOdj4O5nztLS0KBAIjHqegYEB7d+/f8xz7Nu3T4ODg6P2BQDmivk4BodCIetD7lTeEwDMNQeb5mW843Qmk9HWrVsljT4uluJ7k1WrVsnhcByyL4c6DwCUUnd3t97+9rdr27ZtkqRbb71V73//+w/5Oq6nGacBzIzJjtMTwfU0AJRefX29tb5z505rvVRj2WSuo51Op1auXDmp88zEOF9KBLYwp7z1rW+VZCYn//CHP4x53PByqCeffPK09wsA5oNXX33VWl+4cKG1vnTpUuv5aOWmh/v9738vybzbc8mSJUX7CmP4oc6zf/9+bd68WdLoY/h4z8PfAgDzwXwdgwvn2bRp00F/qGIsBzBfdHV1qbu7W1LxtXbBeMfXF1980brD82Dj61S+N3G73Tr++OMlSevXr1cqlTrkeTwej4477rgxjwOAqRgYGNA555xjfW/xX//1X/roRz86rtdyPc31NIDpN5Vxery4ngaA6TG8auHwqf9KNZatXbtWbre76LjRpFIpPf/889ZrXC5X0f5yGudLicAW5pR3vetd1vpdd9016jG5XE4/+MEPJElVVVU644wzZqJrADCnbd++Xb/5zW8kScuXLy8qr2+z2aySqK+//rp1wXSg559/3kqcX3jhhSPueFq1apWVQn/ggQcUi8VGPc/dd99tra9bt27E/ne+852y281LmLH+Fgw/j91u1zvf+c4xjwOAcjZfx+Dh1/XD2xwuFovpgQcekGTe+bRq1aox2wOAcnf77bfLMAxJ0mmnnTZi/+mnn67KykpJ0ve//33r2AMdapwu1fcmhfMMDg7qoYceGvU8u3fv1uOPPy5JOvPMMxUKhUY9DgCmIhaL6R3veIf++Mc/SpI+/elP68Ybbxz367me5noawPSa6jg9XlxPA8D0ePDBB631Y445pmhfKcayUCikM888U5L0+OOPjzkV4UMPPWRVmB1tfC63cb5kDGCOOeWUUwxJhtPpNJ577rkR+2+++WZDkiHJ+MxnPjPzHQSAMvPII48Y6XR6zP379+83jj32WGvs/OpXvzrimE2bNhkOh8OQZBx33HFGLBYr2h+LxYzjjjvOGp83b948alt33HGH1c5HP/rREfvb2tqMiooKQ5KxYsWKMfv9vve9zzrPgw8+OGL/Aw88YO2/4oorxnzvADDTtm/fPuHxaT6OwalUyli2bJkhyaioqDDa2tpGHHPttdda57nrrrtGPQ8AlNpEx+nt27cbf/zjHw96zKOPPmq43W5DkuHz+Yzdu3ePety//du/WW3ffPPNI/Y/99xzhtPpNCQZp5122pjtleJ7k56eHqOystKQZLS2thrd3d1F+zOZjHHBBRdY53nyySfH7A8ATFYymTTOPvtsa6z5xCc+ManzcD3N9TSA6VGKcZrraa6nAUyPu+66y4jH4wc95mtf+5o1Di1dutTIZDJF+0s1lj3xxBPWMe985ztHtNPV1WUsXrzYkGRUVVUZvb29o56nnMb5UiGwhTnnj3/8o+Hz+QxJRjAYNL74xS8a69evN377298aV199tfUfz6pVq4zBwcHZ7i4AzLrW1lZj4cKFxj/8wz8YP/rRj4znnnvOeOmll4zf/OY3xqc//Wmjrq7OGjvf+ta3GolEYtTzfOpTn7KOO/bYY4377rvP2Lhxo3HfffcVBb7+5V/+Zcy+ZDIZ4+STT7aOffe732388pe/NF544QXj1ltvNRoaGgxJht1uN37+85+PeZ5du3YZ9fX11gXVjTfeaDz99NPG008/bdx4443WBVl9fb3R3t4+5X9DAJisp59+2rjrrrusx5e//GVrDDz55JOL9h3sR5T5OAY/9thjht1uNyQZjY2Nxq233mq88MILxi9/+Uvj3e9+d9HfpgM/xANAqUx1nH7yyScNScaJJ55ofPGLXzQee+wxY+PGjcbGjRuN+++/33jPe95j2Gw265zf+ta3xuzL4OCgsWrVKuvYq6++2vjtb39rrF+/3vjiF79oBINB60eql156aczzlOp7k+985zvWscuXLzfuvPNOY+PGjcbPfvYz44wzzrD2XXrppRP5JweAcbvooousseZtb3ub8Ze//MV4+eWXx3xs2rRpzHNxPc31NIDSK8U4zfU019MApkdra6tRU1NjfPjDHza+//3vG88884zxpz/9yXj66aeNb3/720XXtW632/jNb34z6nlKNZZdcskl1rFnnHGG8bOf/czYuHGj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v39/RUVFKTMzU9ddd51Wr17tcxuhNs93igl0Q2+++aaZkJBgSmq2ZGVlmdu2bQv2MAEgZLQ0XzYu48ePb7GN2tpa84Ybbmj1/htvvNGsra1tdSwFBQXmqFGjWmwjMjLSfOaZZ9r8TGvWrDH79+/fYjsDBgww165d294/KgDwq9bmzBkzZvjcTk+dgxcuXGja7fYW2xk9erRZUFDg858TALSXP+bpxYsX+/y8vXjx4lbb2rZtmzl8+PAW709ISDDfeuutNsfkr++b3HfffabNZmuxnYsvvtisrKz06c8JANrr7LPP9mlunT59ulldXd1qWzxPA4D/+Wue5nma52kA/vfhhx/6NK/27dvXfO+991ptyx9zWUVFhTl58uQW27DZbOb999/f5ucKtXm+swhsodv58ssvzejoaFOSGRcXZ/7ud78zP//8c/Pjjz82Z8+e3eB/opKSkmAPFwBCQt3c+JOf/MT89ttvWyw7d+5ssY277rrL085pp51mPv/88+a6devM559/3jzttNM81+6+++4W23A6neZZZ53lqTtt2jTz3XffNdeuXWs+8cQTZlpamufB7J133mmxnb1795qpqammJDM8PNy84447zE8//dT89NNPzTvuuMMMDw83JZlpaWnmvn37OvVnBwCd4f2PvMGDB5uTJk3yvG9PYKsnzsHLli3z/EO/X79+5hNPPGGuXbvWfPfdd81p06Z5xnnWWWeZTqfT5z8rAGgPf8zT3j9gev/991t93j527FiL7ZSUlJhZWVmetmbPnm1+/PHH5ueff27+7ne/M+Pi4kxJZkxMjPnVV1+12I6/vm/y9NNPe+oOHTrUXLRokblu3Tpz6dKl5sSJEz3XrrnmGp/+nACgvYYOHWpKMgcOHGjedttt5iuvvGKuW7fOXL16tfnII4+YgwYN8nku4nma52kA/ueveZrnaZ6nAfjfhx9+aGZkZJjTp083H3/8cfO1114zV69eba5atcp88cUXzR/84AdmWFiYKcm02+3m119/3Ww7/prLrr76ak/diRMnmkuXLjXXrVtnLlq0yPP1RJK5YMGCFtsItXneHwhsodupS+yHh4ebn3/+eZPr8+fP9/xPdN999wV+gAAQgjo7L27ZssXzDcORI0eaFRUVDa6Xl5ebI0eO9MzPLaXOFy1a5BnLTTfd1OT6tm3bPIn2YcOGmTU1Nc22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4wGAjqqurjYnTZrkmWtuu+22DrXD8zTP0wC6hj/maZ6neZ4G0DUWL15sVlZWtlrnkUce8cxDQ4YMMZ1OZ4Pr/prLPv74Y0+dSy+9tEk/BQUF5uDBg01JZlJSknn06NFm2wmled5fCGyh2/nyyy/N6OhoU5IZFxdnPvDAA+bq1avNf//73+acOXM8//NkZWWZJSUlwR4uAARdZmamOXDgQPOnP/2p+a9//cv8/PPPza+++sr88MMPzXvuucfs27evZ+4866yzzKqqqmbbueuuuzz1TjvtNPOFF14w169fb77wwgsNAl933313i2NxOp3muHHjPHWvuOIK87333jPXrl1rPvnkk2ZaWpopybTZbOY777zTYjt79+41U1NTPQ9Ud955p7ly5Upz5cqV5p133ul5IEtNTTX37dvX6T9DAOiolStXmosXL/aUBx980DMHjhs3rsG11n6I0hPn4GXLlpk2m82UZPbr18988sknzbVr15rvvfeeecUVVzT42tT4H/EA4C+dnaeXL19uSjLHjh1rPvDAA+ayZcvM9evXm+vXrzdffPFF8wc/+IFpGIanzaeeeqrFsZSUlJhZWVmeunPmzDH//e9/m6tXrzYfeOABMy4uzvNDqq+++qrFdvz1fZOnn37aU3fo0KHmX//6V3P9+vXmG2+8YU6cONFz7ZprrmnPHzkA+GzatGmeuebcc881v/nmG/Pbb79tsWzZsqXFtnie5nkagP/5Y57meZrnaQBdIzMz00xJSTFnz55t/u1vfzM/++wz8+uvvzZXrlxp/vnPf27wXGu3280PP/yw2Xb8NZddffXVnroTJ04033jjDXP9+vXmX//6V3Po0KGeawsWLGixjVCb5/2BwBa6pTfffNPz20rNlaysLHPbtm3BHiYAhITMzMwW50vvcsUVV5jHjh1rsZ3a2lrz+uuvb7WNG264waytrW11PAUFBeaoUaNabCMyMtJ85pln2vxca9asMfv3799iO/379zfXrFnT3j8uAPCrGTNm+DQH15WW9NQ5eOHChZ7fkm2ujB492iwoKGizHQDoqM7O03U/YGqrxMTEtPpNxzrbtm0zhw8f3mI7CQkJ5ltvvdVmO/76vsm9997b4AdkjcvkyZPb/I1dAOio9szPkvVb/y3heRoA/M8f8zTP0zxPA+gavv5sMD093fzggw9abcsfc1lFRYU5efLkFtuw2Ww+rWYVavN8Zxmm2cLmjkCI27Nnjx5//HEtW7ZM+/fvl91u17Bhw/SDH/xAt9xyi2JiYoI9RAAICStWrNCKFSu0evVq7dy5U4WFhSopKVFcXJwyMjJ05plnasaMGRo7dqxP7b3zzjtauHCh1q9fr8LCQvXt21ejRo3S3LlzddFFF/nUhtPp1DPPPKN//etf2rRpk8rLyzVw4ECdd955uu222zRixAif2iksLNTjjz+upUuXavfu3ZKkIUOG6LLLLtPPfvYz9enTx6d2AKCrzJw5U3/72998rt/WP8964hz8n//8R0888YQ+/vhjHTx4ULGxscrJydEPf/hD3XjjjQoPD/epHQDoiM7O06WlpXrzzTe1evVq5eXl6dChQyosLJTT6VRycrJGjBih8847TzfeeKPS0tJ86qO8vFxPPfWUXn75ZW3fvl0Oh0MZGRmaPHmybrvtNmVmZvrUjr++b/L555/rqaee0sqVK3XkyBElJSXp1FNP1axZs3TNNdf41AYAdIRhGO2qn5mZ6XkubQnP0wDgP/6Yp3me5nkaQNfYsmWLli1bplWrVmn79u06cuSIioqKFB0drbS0NH33u9/VJZdcoiuvvNKn+cxfc9m//vUvLVmyRP/3f/+n48ePq1+/fjr77LN1yy23+PxzylCb5zuDwBYAAAAAAAAAAAAAAAAABIgt2AMAAAAAAAAAAAAAAAAAgN6CwBYAAAAAAAAAAAAAAAAABAiBLQAAAAAAAAAAAAAAAAAIEAJbAAAAAAAAAAAAAAAAABAgBLYAAAAAAAAAAAAAAAAAIEAIbAEAAAAAAAAAAAAAAABAgBDYAgAAAAAAAAAAAAAAAIAAIbAFAAAAAAAAAAAAAAAAAAFCYAsAAAAAAAAAAAAAAAAAAoTAFgAAAAAAAAAAAAAAAAAECIEtAAAAAAAAAAAAAAAAAAgQAlsAAAAAAAAAAAAAAAAAECAEtgAAAAAAAAAAAAAAAAAgQAhsAQAAAAAAAAAAAAAAAECAENgCAAAAAAAAAAAAAAAAgAAhsAUAAAAAAAAAAAAAAAAAAUJgCwAAAAAAAAAAAAAAAAAChMAWAAAAAAAAAAAAAAAAAAQIgS0AAAAAAAAAAAAAAAAACBACWwAAAAAAAAAAAAAAAAAQIAS2AAAAAAAAAAAAAAAAACBACGwBAAAAAAAAAAAAAAAAQIAQ2AIAAAAAAAAAAAAAAACAACGwBQAAAAAAAAAAAAAAAAABQmALAAAAAAAAAAAAAAAAAALk/wHBtzDV57fvVAAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "dp = Pulse(start = 0,\n", - " duration = 30000, \n", - " amplitude = 0.9, \n", - " frequency = 500_000, \n", - " relative_phase = 0.0, \n", - " shape = Gaussian(5), \n", - " channel = 0, \n", - " type = PulseType.READOUT,\n", - " qubit = 0)\n", - "\n", - "sp = SplitPulse(dp)\n", - "sp.channel = 1\n", - "a = 8000\n", - "b = 16000\n", - "sp.window_start = sp.start + a\n", - "sp.window_finish = sp.start + b\n", - "assert sp.window_start == sp.start + a\n", - "assert sp.window_finish == sp.start + b\n", - "ps = PulseSequence(dp, sp)\n", - "ps.plot()\n", - "assert len(sp.envelope_waveform_i()) == b - a\n", - "assert len(sp.envelope_waveform_q()) == b - a\n", - "assert len(sp.modulated_waveform_i()) == b - a\n", - "assert len(sp.modulated_waveform_q()) == b - a" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### PulseShape" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Overview" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`PulseShape` objects are used to represent the different shapes a pulse can take. These objects are responsible for generating the waveforms based on the parameters of the pulse and the sampling rate set in the `PulseShape` class attribute `SAMPLING_RATE`.\n", - "All `PulseShape` objects support the generation of waveforms with an arbitrary sampling rate. This will be useful for whenever we use instruments that use a sampling rate different than 1e9 Hz.\n", - "The types of pulse shapes currently supported are `Rectangular()`, `Gaussian`, `Drag`" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Sampling Rate" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "p14 = Pulse(0, 40, 0.9, 100e6, 0, Drag(5,1), 0, PulseType.DRIVE)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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WlqqwsJCJSYm6qWXXlLHjh21ePHietfKzMzUwIED9dhjj2nbtm0qKipSUVGRNm3apPvuu0/XXHONTCZTjWP+8pe/yM3NTZK0cOHCOtevrKzUF198IUkaPXq0/P39m+1abFm+fLk6dOig559/Xtu3b1d+fr7Ky8t18OBBffzxxxo8eLDuvffeWtdpzXvvvacLL7xQCxcuVFpamsrLy5WWlqZ58+apR48e+vzzz+s8/qWXXlKXLl3073//W4mJiSooKFBZWZn279+vDz74QP369dP06dMbfa0AAAAAALQWJDEBAAAAAAAA5zCz2axx48ZZkofGjh2rjz76SGvXrtX69ev12muvqW3btiouLta4cePqrexzzTXXKCkpSffff79++OEHbdmyRZ988oni4+MlSYsXL9Y777xT4xhvb2+NHDlSkvTVV1+prKzM5vpLly5VTk6OJOnGG29s1muxZvv27Ro7dqwKCgrk7Oyshx56SCtXrtTGjRv19ttvKyYmRpL0xhtvaNq0afWudddddykkJET/+c9/9Ouvv2r16tV6/PHH5erqqvLyct14440245w1a5YeffRRVVZW6oILLtCbb76pFStWaPPmzZo/f74GDhwos9ms5557TrNnzz7tawUAAAAAoDVxsncAAAAAAAAAQF2OF5U3+lhPVye5OTtaHcsprpDZbG7Uuu4ujvJwsf7WWl5JhapMDV830Mu1UTE01LvvvqslS5bI2dlZixYt0mWXXVZjfMCAAZo0aZIGDx6sXbt26cEHH6yzXdqmTZu0fPlyDR061LKvV69eGjVqlLp06aLMzEzNmTNHd955Z43jrrnmGi1atEgFBQX69ttvNW7cOKvrf/LJJ5IkHx8fjRkzplmvxZo77rhDFRUVcnR01LfffmtJvpKkvn37avz48Ro0aJCSkpL00ksv6aabblLXrl2trrVjxw5FR0drw4YNCgsLs+y/+OKLNWrUKI0cOVKVlZW65557tHHjxhrHJiUl6cknn5QkPfPMM3rmmWcs7fwkqXfv3powYYJuvvlmffzxx3ryySc1adKkWpWrAAAAAAA4W5DEBAAAAAAAgFat9z9XNPrYf1zVVTcNbGd1bMQrq5VTXNGodR+4JE4PXdrR6tj4t9Zrb1ZRg9c68OIVjYqhIcxms2bOnClJuv/++2sl/VTz9/fXrFmzNHr0aK1du1Z7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lZXZXH/p0qXKycmRJN14443Nei3WbN++XWPHjlVBQYGcnZ310EMPaeXKldq4caPefvttxcTESJLeeOMNTZs2rd617rrrLoWEhOg///mPfv31V61evVqPP/64XF1dVV5erhtvvNFmnLNmzdKjjz6qyspKXXDBBXrzzTe1YsUKbd68WfPnz9fAgQNlNpv13HPPafbs2ad9rZJkNBo1ZswYSwLTyJEj9dVXX2nz5s368ssvNWLECH3//fd66qmnGrU+AAAAAAANxSdBAAAAsJv4MB91DvPWjrSabaU6h3lr+tguurB9kJ0iA9CU4sO99dZfe+mfS5KVlltaY6ywzKh/LknWgo2H9PSYLhraKcROUQJo1YqPNf5YF0/J2d3GusclmRu3rrP7ibWtKcmRzKeRnOnZvL/zvPvuu1qyZImcnZ21aNGiWlWQBgwYoEmTJmnw4MHatWuXHnzwwTrbpVVXWxo6dKhlX69evTRq1Ch16dJFmZmZmjNnju68884ax11zzTVatGiRCgoK9O2332rcuHFW1//kk08kST4+PhozZkyzXos1d9xxhyoqKuTo6Khvv/3WknwlSX379tX48eM1aNAgJSUl6aWXXtJNN92krl27Wl1rx44dio6O1oYNGxQWFmbZf/HFF2vUqFEaOXKkKisrdc8992jjxo01jk1KStKTTz4pSXrmmWf0zDPPWNr5SVLv3r01YcIE3Xzzzfr444/15JNPatKkSbUqV9Xn7bff1pYtWyzX/vbbb9c4x9VXX61bb71V77333mmtC5wLsrKytHHjRm3cuNFSbe748eOSpJtvvlnz5s1r8nMuWLBA77//vn777Tfl5eUpNDRUgwcP1tSpUzVw4MAmPx8AAADQmpDEBAAAALtxcDDomSu76po56yRJfh7OenhkJ93QN0pOjhQNBc4VBoNBl3UL19BOIXr3l1S9sXKfSiuraszZl12sye9v0iWdQ/TUmC6KCbKRGADg/DSrfeOPHf2S1O9262Nv9JVKjjdu3SF/l4bZqMLz/uVS9u6GrzUjv/45jWQ2mzVz5kxJ0v3332+zjZu/v79mzZql0aNHa+3atdq7d6/i4uKszr3vvvtqJDBVCwgI0JQpU/Tiiy9q586dys/Pl6+vr2V82LBh8vf3V25urubPn281iamoqEiLFi2SJF177bVyc3Nr1ms5VXWigiTdfvvt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6cYbb9SOHTu0bds2JScn68svv7SMTZw40eoxLXEtI0aM0JNPPilJeu+999SnTx+r89avX29JPBgxYoTN9XJycrR48WJdffXVVsffe++9Gueu5ujoqNGjR2vBggVavny5kpOTFR8ff9rXU5+IiAjFx8crOTlZn3/+uWbOnCl399qtEouLi/XZZ581+fkBSGlpaZZtW63kqkVFRVm2Dx8+rC5dGtZ6+eRzWHP06FHLdmFhoQoKChq07pkqKiqyug2cCe4rVDObzTIajTIajXJ1dZWDQ+3aHqWlpTp48KCqqqpkNBplMllvCV398/nIkSM19kdFRSkoyHrV2PT0dDk4OMjJyUmOjo5ycnKq8YdWvucvfk6hOdjrviosLGzyNUliAgAAwGkrMjnp79/s1ne7sq2Ouzg66JZBMZo6rL283ShvD6BpvbV6n9LzyyRJa1OOa/TsX/TX/m310KUd5edhvRIGAJyvHBwc9MQTT+iee+5RamqqbrrpJn300UdydXW1Or+goEAffvih7r333maN64YbbtDjjz8us9ms+fPn6+uvv5YkDRw4ULGxsVaPaYlr6devn/r06aPNmzfrnXfe0bXXXqtLLrmkxpz8/HzdeeedlpjuvvvuOtf829/+pgsvvFChoaE19q9evVpz586VJPXu3Vt9+/atMT5t2jR99tlnqqqq0rhx4/T999/bTHCoqqrSwoULNWTIkHqTIE5199136/7771dGRoYefvhhzZkzp9achx56SFlZWae1LoCGOfmDHy8vrzrnenr+2Wr5dD6cOjn5qT4fffSRpRJcS/roo49a/Jw493FfnVscHR3l7OxsSQKq3q5rX7Xt27errKys1ppubm7q0aNHo2NasWKFcnNzrY7179+/zkQlo9GoysrKGv+t3s7Pz1dJSUmj48LZg59TaA4teV/l51t/wP1MkMTUzA4ePKjZs2dryZIlOnz4sFxdXdW+fXtdd911mjp1qjw8PBq17oEDBxQTE3Nax0RHR+vAgQO19g8dOlSrV69u0Bq0agAAAEcqPfVdUbSM+dYTmEbEh+qpK+LVLsjT6jgAnInMgjK9tXpfjX1VJrM+WH9Q3+xI18OXdtTE/tFypPobAFjcdddd+uGHH/TVV1/p888/19atW3XnnXeqX79+8vX1VUFBgXbv3q1Vq1Zp0aJFcnNza/YkpsjISA0ZMkSr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eZ6EhATv+sGDB/22Cw8P57bbbgPgxx9/5Pe//32b90+Liop44YUXWr3WhRdeCMDy5ct59913Wx1XU1PDjTfe2GafhRBCDBz5+flkZ2dTXl6Oy+Wiqsr//eWBrFemk7v99tt58sknOXjwIDfddBPPPvssBoPvl/7666+55pprsNlsREVFcf311/dGF4UQ/djWIxW88uNhPttZgNPdfETC+kPlZBVayYgPa3VcgFHfaltfsTndfJtVzMfb8vguqwSHu/1A5+CoIC4cn8iiySmkRAb1Qi+FEEIIIYQQQnSHAKOeiycmc/HEZPYWVvPe5qN8siOfIqvvEflOt8rKzGJWZhYTZNJz1qg4LpyYxMyh0Rj1fV8aPths4FfTB3PFtEGsO1jGsh8PszKzCE+LogFXn5raJ/0TQgghRPe76aabeOONN1i3bh0vv/wyOTk53HLLLaSlpVFQUMBLL73EBx98AMCQIUO49957W53jvvvu49133yU3N5c777yTbdu2cdVVVxEbG8u+fft47LHH2LRpE5MnT26zytINN9zAs88+i8vlYsGCBdx3333MnDkTh8PB2rVreeyxx3A6nQwbNoz9+/d3+r1OnDiRMWPGsGvXLv73v/9RUVHBlVdeSUJCArm5ubz++uu8//77nHbaaT5DVE3PExAQgM1m495778VoNDJ48GDvVD9JSUkEBmoDlP/2t7/x/fffs2HDBp544glWrVrF9ddfz4QJEwgODqaiooLdu3ezcuVKVqxYwdixY7nuuuuavd6jjz7K119/TXV1NZdffjnff/89CxcuJCwsjB07dvDQQw+xb9++dn++QgghBgaLxUJBQYH3eVVVFaqqnnAVK3slxBQXF8dzzz3HVVddxYsvvsiXX37Jeeed593/xBNPoKoqa9euJSsryzt337JlywgJ8T/CSwhx4rK73Hy2o4BXfjzM9ty2U6Tvb87lL+eP6qWedZzL7eHHg2V8vC2fL3cXUmNvfzRtdIiZ88clcOGERCakhJ9w/+gIIYQQQgghxMlmRHwofzl/FHfNH8mG7DKWb8vn850FWG2+vyPWOdx8tC2fj7blExls4ryx2nfEUwZFoOvj6cQVReHUodGcOjSao+V1vL4hh3c2HaWyzsnkwRGMSbL4PK7G7uK7fWV4VJAZ0YUQQoiBQa/X8+mnn3LBBRewdu1avv32W7799ttW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WYgpTSdeiWxgqj15LFik0MSCSQrtwLMG0Bak3hYAajYBpqqz2w1uM7gvmXp8HY+M82IPIprWRFFEOBxO2e1bEIQxdQHXaDQJ56XY2YKIpqNgMAi9Xg+pVApBECAZx+858oULod28Gf633hpxajnpvHlQXXnljAwwAcA777yD//zP/8Qll1yCq666CsuWLUNBQQF8Ph/q6+vxi1/8Ij7N21133QWZ7OxlwIsuugg7duzAnj178P3vfx+f/OQnodXGOoCq1ep4p77bbrsNDzzwAKxWKy688EI89NBDWLp0Kfx+P/7+97/jiSeeQCAQwKpVqyZtSrmLLroo/vrrX/86vvWtb8FiscSvpVRUVCR8LURERDR78Sc+UQqCIECjSX/n61judgsEArDZbLDZbABigakFCxYk3FlARERERESUQCIFVIbYYyK+8lHi+2g0FmaKBGPdlCKBxJDT4FgkCBhHmHJv3d1Avy15m/jrUGyavFSKzku/39K1sWnNxqN4Vfpl5euHBIsGwkXxZ3mK8SGv1bnp93vx14ELvpy4H4l84lOq5S2IPYhoTohEIvFO3319fXC5XMjNzcWSJUtSrm8wGOBwOJLGBUGATqdLCC2NJfBERJQtoVAIMpkMUql0QvuRlZRAd+ediHR2IrhvHyJdXRADAQhKJaSFhVCsXg1pUdEkVZ090WgUu3btindcSuWaa67BI488kjB277334uc//znsdju++c1v4pvf/GZ82aWXXoqdO3cCALZs2YK//vWvePvtt1FfX4+77rorYT9qtRovvvgitm/fPmkhpqqqKnz+85/H73//e7z99tt4++23E5afOnUKFRUVk3IsIiIimt4YYiIaB6PRiPXr18dPLvX19cHtdiMajZ5z23A4POIdA5FIZMJ/rBEREREREaUkkQASdWz6sYlYd/fk1DPcZf8xNftdeXPsMdnUxsnfJxHNeqFQKH4+qa+vD/39/UlTJ7lcrqTplQYZDLGAq1QqRU5OTjywNNjFhIhorpMWFUF91VXZLmNKfOMb38CyZcvwt7/9DQcOHIDVao3fQF1UVIR169bhtttuw1Upvv6SkhJ89NFHeOSRR7Br1y6cOXMGfr8/aT25XI7t27fj5z//OV588UUcP34coiiipKQEV1xxBbZs2YKamhps3759Ur+2l19+GWvWrMEf/vAHnDx5ctTXXIiI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skrOmK1bt0IQhIRA13e/+934mCAI2Lx5MwBg8+bNEAQBFRUVKfc1uP53vvMdAMCePXtw0003obS0FEqlEiUlJbj11ltx4sSJtPXs3Lkzvp+dO3emXKe+vh5f/epXsXTpUuj1eigUChQXF2PFihW488478bvf/W5U09/89a9/xdVXX42ioiIolUrMnz8f9957L86cOXPObYmIiGYLv9+fNF37bAwxZbUT044dO/Diiy/ij3/8Y7yl9ODJDovFguuuuw6f+cxnslkiEWWJIAgwGo0wGo3w+/2wWq3o6OhAOBxOWre4uDgLFRIRERERERHNLdFoFDabDe3t7QnTwwGAx+NBX18fjEZj0nYSiQQajSZDVRIR0UwmkSTfex+JREYMwHbs2YM3PvtZhP3+UR0j7Pfjjc9+Fje8++6M78g0GX72s59hy5YtCeferVYrXn75Zfzxj3/E//zP/2DDhg1j3u8rr7yCW265Jelia0dHBzo6OnDo0CE8//zzOHLkCJYuXZp2P9/85jfx/e9/P2GspaUFv/jFL/Dqq69i165dqK2tHXN9REREM43T6Ux4L5fLoVars1PMFMp4iKmurg4vvvgitm3bFk9IDwaXSktL8ZnPfAaf/exncdFFF42qPSgRzX4qlQoLFixARUVF0snSvLy8tN+cw+EwRFFkS10iIiIiIiKiCRi8uaizsxOhUCjtelarNWWIiYiIaCykUmlCoCYSiYy4/o777ht1gGlQ2O/Hzq9/HTe9//64asyGa6+9FmvWrAEAnHfeeQCAe++9F1/+8pfj64x1uta33noLH330Ec477zxs2bIF5513Hnw+H1577TX8+Mc/htfrxa233oqGhgYoFIpR77erqwt33HEHgsEgzGYzvvKVr+CCCy5Afn4+fD4fGhsbsWvXLrz++usj7ueXv/wlPvjgA1x66aW45557sHDhQjidTrz44ot48cUX0d3djTvvvBMffvjhmL5uIiKimWj4VHJGo3FWZmoyEmLq7e3Fb37zG7z44ovYt28fgLPBJaPRCKfTCUEQ8KMf/Qif//znM1ESEc1AEokERUVFKCwshMvlQnt7OywWS9r129vbcfr0aZjNZpSUlECv12ewWiIiIiIiIqKZa3DKuPb2dvT09Iy4rkQiif/tTURENJwYjcLX25s0HolE4B8Y9wpCvNtSMBhM6N4jAIhqtSkv0vUcOXLOKeTSad+9G607diB/hC5A46U2mSCk6Co1EYMzFwxlNptH7GJ0Lv/4xz+wadMmvPbaawkhpUsuuQQmkwn/+3//b7S2tmL79u247rrrRr3f7du3w+PxAADeeeedpBovuugi3HbbbXjqqadG3M8HH3yAu+++G08//XTCf//LL78cCoUCzz77LP7xj3/gwIEDWLly5ajrIyIimomGh5hm41RywBSGmEKhEN544w28+OKL+Mtf/oJQKBQPLikUCmzatAm33HILrrrqqlnZ4oqIpo4gCDAYDCN+Y45Go7BarRBFEV1dXejq6kJOTg5KSkqQn5+fsi0xERERERER0VwXiUTiXZAHLz6mo1KpUFxcjKKiInZBJiKitHy9vfiZ2ZztMlL6/b/8y5Ts98s2GzQFBVOy78mkUqnw/PPPp+yy9LWvfQ3/9//+XwSDQbz33ntjCjF1dnYCiHWGGilkda7rgxaLBT/5yU9SBti+8Y1v4NlnnwUAvPfeewwxERHRrBYIBOAf1nmSIaZR+sc//oEXX3wRv//97+FwOADE7twSBAHr16/HLbfcgs9//vNjbmlJRDQWPT09SXNtu1wuuFwuKBQKFBcXw2KxjKkFLhEREREREdFsd+TIkaS7O4czGo0oKSmByWSala3riYiI5oqPfexjMKcJmOn1elRXV+PYsWNobm4e034HZ1BwOBz47//+b1xzzTXjqu+zn/0slEplymWLFi2CTqdDf3//mOsjIiKaaYb/nS6VSqHVarNUzdSa9BDTRRddBEEQ4l2XFi1ahFtuuQU333wzKioqJvtwREQp+f3+hO9FQwWDQbS0tOD06dMoKChASUkJcnJyslAlERERERER0fRSWFiYMsQ0OMV7cXHxrD1RSkRENNfU1NSMuDwvLw8A4Ha7x7TfT3/60zAajXA6nbjuuuuwceNGXH311diwYQNWrFgRnzpwovXl5uaiv79/zPURERHNNKmmkputNxVN2XRyer0eTz75JG6//fapOgQRUVplZWUoKipCR0cHrFZrUlcmINYlzmazwWazQa/Xo6SkBAUzoMUvERERERER0UREIpG0Fw/NZjOam5sRDocBxKaZKSkpQVFREWSyKTuVSERERFmg0WhGXC6RSADEfncYC5PJhD/96U+46aab0N7ejh07dmDHjh0AgJycHFx++eW488478alPfSor9REREc00qUJMs9WUnHkQRRH9/f2488478eMf/xi33HILbrrppnj7SCKiTFAoFCgvL8e8efPQ09OD9vZ2uFyulOu63W7U1dWhqakJJpMpw5USERERERERTT2fz4f29nZ0dnZi2bJlKbsSS6VSFBUVwePxoKSkBHl5ebP27k4iIsoMtcmEL9tsSeORSAQ9PT0AgPz8/ISAbSQSgc/nS1hfo9HEQyuDdj34II5t3Tru2pbecQc2/OAH494+HTXPMeOSSy5BY2MjXn31Vbz55pt49913cebMGbhcLrz22mt47bXXcOWVV+KPf/zjOcNKREREc5koilAqlfD7/fHgLkNMY7Bz505s3boVr776KtxuNw4ePIhDhw7hoYcewsaNG3Hrrbfi+uuvh06nm+xDExGlJJFIYDabYTab4Xa7YbVa0dXVlXKquVAoBI/Hk4UqiYiIiIiIiCafKIpwOp04c+YM7HZ7fLy9vT3t1OoLFixgcImIiCaNIJFAk6IDfiQSgWrgHK2moCAhxCSKItDfn7C+UqWCXC5PGFu9ZcuEQkyrtmxJWRtNDpVKhZtvvhk333wzAODUqVPYvn07fvKTn6C+vh5vvfUWvvWtb+Hxxx/PcqVERETTlyAIOO+88+LNhPr6+qDX67Nd1pSRnHuVsdmwYQN+9atfoaurC9u2bcOVV14JiUSCSCSCv//977jjjjtQVFSEm266CW+++SZbPBJRRun1eixatAgXXngh5s+fD6VSmbQOp5QjIiIiIiKimU4URTgcDhw6dAiHDx9OCDABQHd3d8qp1wEwwERERFknCELS1KeprieZV6xA8UUXjesYJevXw7x8+bi2pfGZP38+vvKVr2DPnj0oLS0FAPz+97/PclVEREQzgyAI0Ov1KC0tTepOOZtM2VemUqlw00034X/+53/Q1taGRx99NJ4O83q9+P3vf4+rr76aU8wRUVbI5XKUlZXh/PPPx+LFi+Mt91QqVdo7UQGwSxMRERERERFNa8PDS319fSOuR0RENF2NJsQEAJc98QRkKtWY9i1Tq7GR3X+yJicnB2vXrgWA+JSCRERERMAUhpiGKioqwje+8Q0cPHgQBw4cwH333Qez2QxRFNHT0xO/u+vf//3fsWXLFrz33nuZKIuICIIgoKCgACtWrMDq1auxcOHCtHecOp1O7N27F0eOHIHL5cpwpURERERE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e3B6ueHTzhERERERTQZBEFBbW4tly5ahoqKCFzaJiIgm0cUXXxx/vWvXrrTr7d27N96le/369VNa0/HjxwEASqUSJpNpSo9FRERENFeFQqF4SH2QUqlEeXl5liqaexhiIiIimqDCwkKsXr0aWq02aVlHRwcOHDgAr9ebhcqIiIiIaCZzuVyw2WxplyuVSuTm5mawIiIiorlh48aNMBgMAIAXXngBoiimXG/r1q3x19ddd92U1bN7924cO3YMQCxgNfxmOsqeYDCY7RKIiIhoErW0tCAUCiWMVVVVQSqVZqmiuYe/6RIREU2CwenlioqKkpZ5PB7s378fLpcrC5URERER0UwjiiLOnDmDgwcPoq6uDm63O9slERERzSkKhQJf+9rXAAAnTpzAj370o6R1PvzwQzz33HMAgEsvvRRr165NuS9BECAIAioqKlIuf/3119OGpACgsbERX/jCF+Lvv/zlL4/2y6ApFIlE0NzcjH/84x8J080QERHRzOVyuWC1WhPGTCYT8vPzs1TR3MSJfImIiCaJVCrFokWLYDQaUV9fj2g0Gl+mVquh0+myWB0RERERzQThcBgnT55ET09PfOzEiRNYtWoVZDKexiEiIsqUBx54AL/73e9QX1+PBx98EI2NjbjxxhuhVquxY8cOfO9730M4HIZarcYTTzwx7uNcd911qKqqwvXXX49169ahtLQUSqUSHR0deOutt/Dcc8+hv78fAPD5z38e119//SR9hTRedrsdDQ0N8Pv9AICGhgasWrWKHbKIiIhmMFEU0dDQkDAmkUhQVVWVpYrmLp79IiIimmSFhYXQ6XQ4fvw4vF4vpFIpFi9ezBMZRERERDQit9uN48ePxy+IDfL5fDhz5kzaDg5EREQ0+fR6PbZv345NmzahoaEBzzzzDJ555pmEdXJycrBt2zasWLFiQsdqbGzEo48+OuI698O03vUAAJH8SURBVN57Lx5//PEJHYcmh9frTfh9zePxoL29HfPmzctiVURERDQRVqs1HhwfVF5eDpVKlaWK5i6GmIiIiKaAVqvFqlWr0NDQAJPJBLVane2SiIiIiGiaEkURVqsVTU1NKaeTmTdvHsrKyrJQGRER0dxWVVWFAwcO4Kc//SleeeUVNDY2IhgMYt68edi0aRO2bNmC8vLyCR3jT3/6Ez788EP885//xOnTp9HT0wOPx4Oc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y6Uf/ehHZx8wFrVgtEcgWH7/+9/r+uuvV0REhN/y9PR0/dM//ZP352effdZvPfpIBEOw2iMQLIHa4umuu+46LV++XJK837dP99hjj2lwcFCS9MADDyg9Pd3nGD/72c+8x/rhD394rmFjkQpGewRCqbm5Wd/61rckSf/2b/+mqKioM27DOSQQWrfffrtuvPFGlZWVhfQ4nO8sHU6nU//yL/8iSVqxYoXuvPNOnzof/OAH9fnPf16StHv3br399tthjRHzQ7juR3IusXRwjxuhEK57NQ899JAkyWazTTsnmpKenq4HHnhAkjQwMKDHHnsspPEEQhITTPG73/3Ou/y5z33Obx2r1arPfvazkk79kezatSscoQHAvGYYhv7jP/5DklRZWanzzz/fb73zzz/fe9PgP/7jP6YN2w0AC9Ull1ziXW5oaPApp49EOJ2pPQJmmBqifmJiwqds6nt4YmKitm3b5nf7vLw8XXbZZZKkV155RcPDw6EJFEvCTO0RCKUvfelLGhkZ0c0336yLL774jPU5hwQWD853lo5du3Z5E9ZuvvlmWa3+b3fecsst3uXnn38+HKFhngnH/UjOJZYW7nFjoRoeHtYrr7wiSbrssssCTkO4bds2JSYmSjLvs5MkJpjitddekyTFxcVpw4YNAeudfqHh9ddfD3lcADDfNTY2qr29XZLOeDF2qrytrU0nTpwIdWgAEHKTk5PeZX+jQNBHIpzO1B6BcDt27JgOHjwo6dSF89M5HA7t3btXknTBBRfMOCrJVP84OTmpffv2hSZYLHoztUcglH7961/r97//vVJTU71PGZ8J55DA4sD5ztIydY9Jmrnv3rhxo2JjYyVxj2mpCsf9SM4llhbucWOhevvtt+VwOCTN3FdFRUV5kzHffvttU0YSI4kJpjh69KgkqaysTDabLWC90y90TW0DhNJvfvMbVVVVKTY2VgkJCSovL9fNN99MljTmjerqau/ymW4G0Ici3D73uc8pJydHUVFRSk9P1/nnn6//7//7/9TW1mZ2aFgkdu/e7V2eGpL5dPSRCKcztcf3o49EKIyNjamurk7//M//rIsvvtg7fcFXv/rVafVqa2vldrsl0T8idGbbHt/vm9/8pgoLCxUdHa2UlBStW7dOX/va11RbWxuGqLGYDAwM6Ctf+Yok/9NIBcI5JLA4cL6ztMy277bZbN5p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x47MnDkz7733Xqqrq9OtW7fMmTMnY8aMya+//tqw7rvvvstrr72WJUuWZM2aNbn88stP+Rt1dXUZPnx4li9f3mj88OHD2bRpUzZt2pTp06dn0aJF6dev37nZ6B945513MmrUqBw6dKhhrLa2NgsXLsy7776b2bNnZ8SIESe9t3v37gwaNChbt25tNF5XV5e6urp88cUX+eCDD7Jr165MmTLlnO8DAAAAAADOJ05iAgAAztiuXbtyzz33pLS0NK+88krWrVuXlStX5oknnkihUEhtbW3Gjh2bDRs25L777kvnzp0zY8aMrF+/PitWrMjo0aOT/Lf09OSTT57yNw4fPpxBgwZl+fLlufjiizN69OjMmTMnNTU1WblyZV588cWUlZWltrY2d95550mnP51Ln376aUaOHJn27dtn2rRpqampydq1a/P888+nZcuWOXbsWB566KHs3bv3pHcfe+yxhgLTqFGjsmDBgtTU1GTDhg1ZvHhxnnvuufTs2bPJ9gIAAAAAAOcTJzEBAABn7Msvv0yXLl2yevXqtGvXrmF8wIABueSSSzJlypSsXr06gwcPTkVFRZYuXZrWrVs3rKusrEx9fX3mzZuX+fPnZ+/evY2+kySTJk3K5s2bU1pammXLlqVPnz6N5gcMGJB77703/fv3z+7du/PMM89k9uzZ53bj/2fz5s3p06dPli9fnpKSkobxfv365ZprrsmoUaPy448/5s0338yECRMa5uvr67N48eIkyVNPPXXKk5aGDBmSiRMnZv/+/ed+IwAAAAAAcJ5xEhMAAPCXTJ069aTiUZI88sgjDc/79u3LjBkzGhWYThg/fnyS5OjRo1m7dm2juZ9++imvvvpqkuSFF144qcB0QocOHfLss88mSebNm5eff/757DZzFmbOnNmowHTCyJEjG67HW7lyZaO5/fv358iRI0mSW2655bTfb9u27T+UFAAAAAAA/j2UmAAAgDNWWlqa22+//ZRzHTt2TJs2bZIkPXr0yHXXXXfKdb+/Mm3btm2N5qqrq/PDDz8kSYYPH37aLCfKQEeOHMmmTZvObAN/U/fu3dOjR49TzhUKhfTu3TvJyfsqKytL8+bNkyRvvPFGjh49em6DAgAAAADAv4wSEwAAcMa6dOmSQqHwh/OlpaVJkq5du/7pmiQ5ePBgo7mNGzc2PF922WUpFAp/+HfDDTc0rP3+++//4k7OTrdu3U47f+IUpf/dV4sWLTJixIgkydtvv51rrrkmTz/9dN5///0cOHDgnGQFAAAAAIB/EyUmAADgjJ3qerjfu+iii/503Yk1SXLs2LFGc7W1tWeV69ChQ2f13l91pvv/330lybRp0zJkyJAkyY4dOzJ58uQMHjw4ZWVlufHGGzN58uSGU6gAAAAAAOBCc0mxAwAAAJzw+/LP5s2b06xZszN678orrzxXkf4xJSUlWbx4cdavX5+5c+emqqoqH3/8cY4dO5aNGzdm48aNmTJlShYuXJj+/fsXOy4AAAAAADQpJSYAAOC8UVZW1vDcrl27f0U56a+qqKhIRUVFkv9eO1dVVZVZs2ZlwYIFqa2tzV133ZWvv/46rVq1KnJSAAAAAABoOq6TAwAAzhu9e/dueF69enURkzSNNm3aZMiQIZk/f34ef/zxJMnu3buzatWqIicDAAAAAICmpcQEAACcNwYNGpTWrVsnSaZOnZrjx48XOVHTufXWWxue9+3bV8QkAAAAAADQ9JSYAACA80ZpaWkeffTRJMmaNWsyYcKE/Pbbb3+4fs+ePZkxY0ZTxTtr27ZtS3V19WnXfPTRRw3PHTt2PNeRAAAAAADgvHJJsQMAAAD83qRJk1JdXZ1169bl5ZdfTlVVVcaNG5devXrl0ksvTV1dXT777LMsW7YsS5YsSffu3TN27Nhixz6tb7/9NgMHDsz111+foUOHpm/fvrniiiuSJDt37sxbb72VuXPnJkl69eqVm266qZhxAQAAAACgySkxAQAA55UWLVpk6dKlGTNmTBYsWJBPPvmk4XSmUykpKWnCdH/P1q1bs3Xr1j+c79atWxYsWJBCodCEqQAAAAAAoPiUmAAAgPNOmzZtMn/+/KxatSqvv/56Vq5cmV27duWXX35JSUlJOnfunIqKigwePDi33XZbseP+qZtvvjlVVVX58MMPU1NTk507d2bPnj2pr69P27Zt07NnzwwbNixjxoxJixYtih0XAAAAAACaXOH48ePHix0CAACgqZWXl2fHjh25//77M2vWrGLHOWNVVVUZOHBgkmTFihWprKwsbiAAAAAAAPgHOIkJAAC4oB04cCBbtmxJkjRv3jxdu3YtcqKT1dbWpra2NknyzTffFDkNAAAAAAD885SYAACAC9qiRYuyaNGiJEmHDh2yffv24gY6henTp2fixInFjgEAAAAAAOfMRcUOAAAAAAAAAAAAXNgKx48fP17sEAAAAAAAAAAAwIXLSUwAAAAAAAAAAEBRKTEBAAAAAAAAAABFpcQEAAAAAAAAAAAUlRITAAAAAAAAAABQVEpMAAAAAAAAAABAUSkxAQAAAAAAAAAARaXEBAAAAAAAAAAAFJUSEwAAAAAAAAAAUFRKTAAAAAAAAAAAQFEpMQEAAAAAAAAAAEWlxAQAAAAAAAAAABSVEhMAAAAAAAAAAFBUSkwAAAAAAAAAAEBRKTEBAAAAAAAAAABFpcQEAAAAAAAAAAAUlRITAAAAAAAAAABQVEpMAAAAAAAAAABAUSkxAQAAAAAAAAAARaXEBAAAAAAAAAAAFJUSEwAAAAAAAAAAUFT/AeW/jQdkXAKgAAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "p14.plot(sampling_rate=1)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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O3bs0EsvvaQuXbpo6dKlJ50rKytLw4YN06OPPqrNmzerpKREJSUlWr9+ve69915deeWVstvt1cZcfvnl8vb2liQtXLiwzvmrqqq0aNEiSdKECRMUEhLSZOdSm+XLl6tTp0564YUXtGXLFhUWFqqyslIHDx7URx99pJEjR2r69Ok1ztOV9957T8OHD9fChQuVlpamyspKpaWlad68eerbt68+//zzOse/9NJL6tGjh1599VXt2LFDRUVFqqioUEpKij744AMNHjxYzzzzTIPPFQAAAACAloIkJgAAAAAAAOAM5nA4NHnyZGfy0KRJkzR//nytWbNGa9eu1Wuvvaa4uDiVlpZq8uTJJ13Z58orr1RiYqLuu+8+ff/999q4caM++eQTde/eXZK0dOlSvf3229XGBAQEaPz48ZKkxYsXq6Kiotb5v/nmG+Xl5UmSbrjhhiY9F1e2bNmiSZMmqaioSJ6ennrwwQe1YsUKrVu3Tm+99ZY6dOggSXrjjTf0+OOPn3Suu+66S5GRkXr99df1+++/a9WqVXrsscfk5eWlyspK3XDDDbXGOWvWLD3yyCOqqqrSOeecozfffFM//PCDNmzYoI8//ljDhg2Tw+HQ888/r9mzZ5/yuQIAAAAA0JJ4uDsAAAAAAAAAoC5HSiobPNbPy0PeniaXbXmlFjkcjgbN62M2ydfs+tZaQZlFNnv95w3z92pQDPX1zjvvaNmyZfL09NSSJUt00UUXVWsfOnSobrzxRo0cOVI7d+7UAw88UGe5tPXr12v58uUaPXq0c1///v114YUXqkePHsrKytKcOXN05513Vht35ZVXasmSJSoqKtJXX32lyZMnu5z/k08+kSQFBgZq4sSJTXourtxxxx2yWCwymUz66quvnMlXkjRo0CBNmTJFI0aMUGJiol566SXddNNN6tmzp8u5tm7dqvj4eP32229q06aNc/95552nCy+8UOPHj1dVVZXuuecerVu3rtrYxMREPfnkk5KkZ599Vs8++6yznJ8kDRgwQNdee61uvvlmffTRR3ryySd144031li5CgAAAACA1oIkJgAAAAAtmsPhkM3uUJXNIYcctb5gXFJpVbnFJqNBMhkN8vY0ycvDWO3FPgBA6zTgrz80eOxfLuupm4a1d9k27pVVyiu1NGje+8d21oMXdHHZNuVfa7U3u6Tecx148ZIGxVAf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//pXAMAVV1yBb37zm0nrt27dOuNDsW3atIkjrxAREWWZJEnw+Xzx++FweN597z2rf5r9+/dj27ZteOCBB3JdChHNQkqlEsXFxWnXx2IxdHd3x+/7fD6cOHECjY2NKCoqQmlpafzqFCIiIiIiIiLKnWg0iq6uLnR2dsLv9wOQL2Sqra2FRqNJ2t5kMmH16tWwWq3sukxENM9IkgRRFCGKIpRK5aSHBe3+4AN88PDD6DlwAGGPBxqzGYVr1mD17bfDsXr1DFWdXcPdCJcsWZLjSoiIiCib/H4/RFFMWGYymcYccn2umXUhps7OTjz11FN48skncejQIQBgiImIpqSnpwexWCxpuSiK8e5MFosFpaWlKCwsnPSHYSIiIiIiIiKaHq/Xi/b2dnR3dyediJUkCU6nExUVFSkfm5eXl4UKiYgomwKBAKLRaPy+Tqeb8Hnbzt278cbdd6PjnXeS1nW8+y4+eOghlG3ciE0PPICS9eszVnMuhMNhAODwqURERAvMyC5MgDycnFqtnlchplnxjX0gEMDTTz+Niy++GJWVlfi///f/4tChQ2xDSUTTYrPZUF1dPeYYoG63G0eOHMG7776LxsbGefUCT0RERERERDQbiaIIp9OJ/fv3Y+/evejq6koKMA1zOp1Zro6IiGaTVBepptKwfTueueCClAGmkdp37cIzF1yAhu3bM1FeVm3duhWCICR0IPze974XXyYIArZs2QIA2LJlCwRBQHV1dcp9DW//3e9+FwCwe/duXHvttSgvL4dWq0VZWRluuOEG1NfXp61nx44d8f3s2LEj5TbHjh3DV7/6VaxYsQJmsxkajQalpaVYs2YNbrnlFjzzzDMIhULj/ux/+ctfcNlll6G4uBharRY1NTW488470dbWNu5jiYiI5hOv15twfz6OOpTTTkxvvPEGtm3bhj/96U/xX/ZwcKmkpARXXnklPvvZz+ayRCKaw7RaLaqqqlBZWYn+/n50dnait7c35bbRaBStra1obW2FxWJBXl4eBgYGslswERERERER0Tym0WhQVFSEQ4cOJXTZSEWv16OkpARFRUVZqo6IiGaD0V2X0oVcR+rcvRsvfe5ziAaDEzpGNBjES5/7HK5+880535EpE37961/jrrvuSvjb3NHRgaeeegp/+tOf8L//+7+44IILJr3f5557Dtdff328a9Sw4VESPvjg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d2LRpZdmtF5K9Pvf/x5VVVW49NJL8fOf/xyvv/469u/fjzfffBO//vWvcc4556C9vR0AcMcdd+S4WiIiIppNctZjSqlUYvPmzdi8eTPcbjeeeeYZPPnkk9i1axckSYLT6cTDDz+MRx55JOXwTEREs5VCoUBRUREcDgf6+/vhdDpRWFiYdvuPPvoIOp0OFRUV0E3waiEiIiIiIiKi6Ug3JA8AFBYWoqmpCcFgEGq1GmVlZSgtLYVarc5ylUREtFAJggCdTgdBEBICTWMpWb8e1779Nro/+AAHH3kE3QcOIOzxQGM2w7FmDVb94z/CsXp1FqonAIhEInj55Zfx8ssvp93mjjvuwNe+9rUsVkVERESz3awYKM9iseC2227DbbfdhubmZjzxxBN46qmn0NDQkOvSiIimTBAE2O122O32tNsMDg6ir68PANDZ2YmioiJUVlZCr9dnq0wiIiIiIiJaQERRhNPpREtLC5YvXw6LxZK0jSAIqKmpQTQaRVFRUdKQPkRERNmgUk3tKyzH6tW46Fe/ynA1NBkPPPAAPvGJT+Bvf/sbDh48iM7OTvT09ECpVKKiogLnnHMOvvjFL+K8887LdalEREQ0y8yKENNI1dXV+M53voPvfOc72LVrF5588slcl0RENGNaWlri85IkoaurC11dXXA4HKisrEwYko6IiIiIiIhoqkRRRGdnJ1pbWxEKhQAAJ0+exMqVK1Nu73A4slkeERERTcJYQ+sBwNatW7F169YpP37Yjh070q7btGlT2v3YbDZcd911uO666yZ0nJGqq6snXF9zc/Ok909ERESz26wLMY20ceNGbBxn/GIiorkqFAqhv78/5bru7m50d3fD4XCgqqoKBoMhy9URERERERHRfBCLxeLhpXA4nLCur68PHo8HZrM5R9URERERERERUToulwtNTU2wWq3xSavV5rqsGTWrQ0xERPOZVqvFhg0b0NbWhs7OToiimLTNcJipqKgIVVVVHGaOiIiIiIiIJmS481JLS0tSeGmknp4ehpiIiIiIiIiIZqH+/n74fD74fD50dHTAarVizZo1uS5rRjHERESUQzqdDnV1daisrERrays6OjpShpmcTiecTieKi4tRWVnJMBMRERERERGlJIoiurq60NLSEh82LhWLxYKqqirYbLYsVkdERDQ9kiRBEIRcl0FERESUFaNH9VkIn+EZYiIimgU0Gg0WLVqEyspKtLW1ob29HbFYLGm7rq4uOJ1OFBUVoaamBhqNJgfVEhERERER0WwjSVI8vBQMBtNul5eXh6qqKuTl5WWvOCIioimSJAmiKCIWiyEajSIWi8FoNEKhUOS6NCIiIqIZFQqF4Pf7E5YxxERERFmlVqtRU1OD8vJytLa2or29PakzkyRJ6OnpQW1tbY6qJCIiIiIiotmku7sbzc3NCAQCabfJy8tDdXU1rFZrFisjIiKavkAgAEmS4vej0Sgv7iQiIqJ5b3QXJpVKtSCGg2eIiYhoFlKr1aitrUV5eXm8M9PIMFNZWRnUanUOKyQiIiIiIqLZwu12pw0wWa1WVFdXs/MSERHNSYIgQKlUIhqNxpel6mBPRERENN+MDjHl5eUtiGF1GWIiIprFNBpNPMzU2tqKjo4OCIKA8vLytI/huPBEREREREQLS2VlJTo7OxMufrFYLPHwEj8jEhHRXKZSqZJCTDwHSkRERPOZJElJIaaFMJQcwBATEdGcoNFosGjRIlRUVMDj8aTtwhSJRLB//36UlpaitLSUY8MTERERERHNI+m+sNVoNCgrK0NrayvMZjOqq6ths9n45S4REc0LSqUy4b4kSRBFMWk5ERER0Xzh8/kQiUQSljHEREREs45Go0F+fn7a9a2trQgEAmhoaEBbWxuqq6tRVFTEE9dERERERERzmM/nQ3NzM8xmMyorK1NuU1FRAYvFgvz8fH4GJCKieUWhUEChUCR0HIxGowwxERER0bzV19eXcF+n00Gn0+WomuxiiImIaJ4IhUJob29PuH/06FG0traiuroaBQUFPJFNREREREQ0hwSDQZw8eRJdXV0AgIGBAZSUlKTszqtWq1FQUJDtEomIiLJCqVQmhZi0Wm0OKyIiIiKaOaNDTAup2zJDTERE84TL5Ur4ID/M7/fj8OHDMJvNqKmpWTCtBomIiIiIiOaqSCSClpYWtLe3Q5Kk+PJoNIrW1lbU1tbmsDoiIqLsU6lUCUOqiKIIURShUChyWBXRwjDy/SgREc28SCSCwcHBhGVjjdQz3zDEREQ0T5SWlsJoNKKpqSnpDxsAeDweHDx4EHa7HbW1tTAajTmokoiIiIiIiNKJxWJoa2tDa2srYrFYym26u7tRXV3NL22JiGhWUCqViEajiEajiMViMzbEW6r9xmIx/j0kmmGxWCz+vpRDOBIRZUd/f3/CfYVCgby8vNwUkwMMMRERzSNWqxWrV69Gf38/mpqa4PV6k7bp6+tDX18fSkpKUF1dDY1Gk4NKiYiIiIiIaJgkSeju7kZTUxNCoVDKbRQKBcrLy1FRUcEvbImIaNYwGAzxv10DAwMz1iVAEASoVCpEo9H4smg0mnKIVSLKnIGBgfi8wWDIXSFERAuIy+VKuJ+Xl7eggqQMMRERzTOCIMBut8Nms6GnpwfNzc0IBAJJ23V2dqK7uxsVFRUoLy9fUH/8iIiIiIiIZouBgQE0NDSkvAgFkD/jlZSUoKqqihehEBHRrJOXlxfvFtDd3Y1YLAaLxQKtVgtBEDJ6rFQhJkmSMn4cooVOkiSEQiG43e6EL9JtNlsOqyIiWhgkSUJfX1/CsoU0lBzAENOM8vv9ePDBB/Hcc8+hoaEBoVAIFRUVuPTSS/G1r30NVVVV09q/KIp4++238corr+Cdd97BkSNH0NfXB51Oh8rKSlxwwQW44447sGrVqjH3893vfhff+973JnTMN954A5s2bZpW3USUHYIgwOFwoKCgAF1dXWhubk4YNx6QW8E2NzfD4/FgxYoVOaqUiIiIiIho4fH7/WhsbEy6wnIkh8OB6upq6PX6LFZGREQ0cTqdDlarFYODgwDkzgEulwuCIIx70aQkSQiHwwAAj8czoTDSyBATIA9vxRATjTSV5xUlisVikCQpYZnVaoVWq81RRUREC4ff74coignL7HZ7jqrJDYaYZsiJEyewefNmHD9+PGH50aNHcfToUTz66KN4+umn8elPf3rKx6iurkZra2vS8kgkgkOHDuHQoUN4+OGH8Y1vfAM/+MEP+EaNaIFSKBQoLS2Fw+FAa2sr2trakv74VVRU5Kg6IiIiIiKihcfr9WLv3r1p1+fl5aG2thZmszmLVREREU1NSUkJNBoNenp64sskSUoKHI0mimK8E6HZbJ7QcKnhcDjh3KZSqeSQcpRgKs8rGlthYeGC6wJCRJQrRqMR5557LgYGBuByuRAKhaDT6XJdVlYxxDQDPB4PLr300niA6bbbbsM111wDvV6PN954A/fffz/cbjeuvvpq7Nq1C2vWrJnScTo6OgAAdXV1+OxnP4uNGzeitLQUgUAAb7zxBh544AH09/fjRz/6EZRKJb7//e+Pu88PP/xwzPU1NTVTqpWIck+lUqGmpgalpaVobm5GV1cXAKCgoABWqzXH1RERERERES0cRqMxoWvFMIPBgNraWtjtdl6MRkREc4YgCCgoKIDFYoHX64XP50sKG6USjUbjfwutVitUqvG/sopEIvEuO4B8ASc7FtJIU3leUSKFQgGNRgOj0QiTycQhjYmIskypVCI/P3/BBkj5l3sG/PjHP8axY8cAAD/60Y9w7733xtedc8452LRpEy688EL4/X7cfffd2LFjx5SOs2HDBnznO9/BJz/5yaQTW+eddx7+4R/+Aeeccw56enrw4x//GF/84hdRW1s75j45nBTR/KfVarF06VKUlZWhqalpzHCi3++HWq3m1UxEREREREQZJAgCFi1ahH379gEA1Go1qqurUVxczG4BREQ0Z2k0Gtjt9gkPeeJ2u/HnP/8ZgPzdicViGfcxo7sZGgwGVFZWcpgripvK84qIiIhmD54VybBIJIJf/OIXAIDly5fjnnvuSdrm3HPPxa233goA2LlzJ3bv3j2lY73zzju4+OKL016Zt2jRIvzbv/0bADl5/uKLL07pOEQ0P5lMJqxcuRIGgyHlekmScOTIEbz//vtob29PGgObiIiIiIiIxhYIBNKuM5vNKC4uRkVFBTZs2IDS0lIGmIiIiMZhNBqRn5+PqqoqrFu3DuvXr2eAiYiIiGge4ZmRDHvjjTfibSpvuummtCeftmzZEp9/4YUXZqyej33sY/H5hoaGGTsOEc0/TqcTHo8H0WgUJ06cwJ49e9Df35/rsoiIiIiIiGa9cDiMY8eO4f333x/zc9SSJUtQW1vLYU6IiIgmSBAErFixAtXV1TAajbkuh4iIiIgyjCGmDHv77bfj8xdeeGHa7datWxfvfrJr164ZqycUCsXnlUrljB2HiOaXaDSKpqamhGV+vx8HDx7ERx99NObVxERERERERAuVKIpoa2vD+++/j87OTgDAiRMn0na2Tdddm4iIiIiIiIhoIWKIKcMOHz4cn1+2bFna7VQqFerq6gAA9fX1M1bPzp074/PLly8fd/tPfvKTcDgc0Gg0cDgc2LRpE37wgx+w+wrRAiOKIqxWa8p1LpcLu3fvRmNjI6LRaJYrIyIiIiIimp36+vqwd+9eNDQ0IBaLxZf7/X50dHTksDIiIiIiIiIims1aW1tx6NAhOJ3OBf/9K3tVZ1hbWxsAeVzmvLy8MbetqKjAwYMH0dPTg1AolPFxm/1+P372s58BALRaLS6//PJxH/OXv/wlPt/T04OdO3di586d+OEPf4itW7dOaB+pDP9e0hm+OhEAfD4f3G73lI5DlAlerzfl/EJTXl6OvLw8tLW1JXVekiQJra2t6OzsRGlpKex2O68gnkF8TtJswucjzSZ8PtJsw+ckzSZ8PmZPKBRCW1tb2nMZCoUCgUBgwZ/r4HOSZhOfz5frEoiIiIiIiOKcTid8Ph96e3shCALq6upQWlqa67JygiGmDPN4PAAAk8k07rYjx2v2er0ZDzF961vfQktLCwDgy1/+8phP8pUrV+KKK67Ahg0bUFpaikgkgqNHj+Lpp5/Ga6+9hoGBAXz2s5/FSy+9hE996lOTrqWiomLC2/7pT39K2wGGKNuefPLJXJcwKzgcDlRUVECtVicsj0ajaGlpwaFDh9DU1AS/35+jChcOPidpNuHzkWYTPh9ptuFzkmYTPh9nhkKhQHl5OYqLi6FQpG523tPTg5aWFkQikSxXN7vxOUm5Njg4mOsSiCjDJEmCJElp/yYTERERzVZ+vz/hQgtJkmAwGHJYUW4xxJRhwWAQAKDRaMbddmRoaXSXk+l6+umn8eCDDwKQh5G777770m57991347vf/W7S8rPOOgs33ngjHn74Ydxxxx2IxWL44he/iIaGBuh0uozWS0SzW3d3N1wuF8rKylKeoDebzVi5ciWcTidaW1sThk4gIiIiIiKab+x2O6qrq9Oe//F6vWhubmbHISIiohkWCATQ3d2N7u5u5Ofno7a2NtclEREREU1Kd3d3wn21Wr2gm74s2BBTJoY9evzxx7Fly5aEZcPhnnA4PO7jQ6FQfF6v10+7nmE7duzArbfeCkA+qfb888+Puf/xhr27/fbbsXv3bjz22GPo6OjA888/j+uuu25SNbW2to65vrOzExs2bAAAXHXVVViyZMmk9k+USV6vN35V6A033DChzmoLSTAYRHt7e9JQCIIgoLi4GFVVVVi+fDmHl8sgPidpNuHzkWYTPh9ptuFzkmYTPh9nRjAYRFtbW7wT92gqlSo+5Pb555+f5epmNz4naTY5duwY7r///lyXQUTT1N7ejhMnTsTvx2Ix1NTU8LwkERERzRmSJMHpdCYsczgcC/r9zIINMc0Us9kMABO60m5kS7BMnbjZs2cPPvOZzyAUCsFkMuHll1/G8uXLp73f22+/HY899hgAYOfOnZMOMZWXl094W6PRCIvFMqn9E80Uk8nE5+MoFosFDocDfX19OHHiRFInucrKygWdDp5pfE7SbMLnI80mfD7SbMPnJM0mfD5mRl9fH44cOQJJkpLWCYKAsrIyVFVVQaXi6bbx8DlJuWY0GnNdAhFlwOhzkKFQCIODg+NeuE1EREQ0W3g8nvhoX8McDkeOqpkdFuxZlfr6+mnvo6SkJGlZeXk5/v73v8Pn82FgYGDMN8vD3YkKCwsThpabqkOHDuGSSy6Bx+OBVqvFiy++iLPOOmva+wWA0047LT7f3t6ekX0S0dxmt9uxbt06tLa2oqWlBaIowmQypXxtJCIiIiIimuusVivUanVS922bzYa6ujoYDIYcVUZERLQwmUwmGI3GhAvGu7u7GWIiIiKiOWP0UHJ6vT7eOGehWrAhpmXLls3Ifk877TQ8//zzAIAjR47g7LPPTrldNBpFQ0MDAGSkU1JDQwM+8YlPwOVyQaVS4ZlnnsHHP/7xae932EJuV0ZE6SkUClRVVaGoqAgNDQ2oqKhI+3oRi8WgUCj4ekJERERERHOSUqlEXV0dDh8+DADQarVYtGgRCgoK+DmHiIgoRxwOB5qamuL3e3p6UFdXB4VCkcOqiIiIiMYnimJSiGmhDyUHAHwXl2HnnXdefH7nzp1pt9uzZ0/86oCNGzdO65htbW246KKL0NnZCYVCgSeeeAKXX375tPY52vAJOgAoLS3N6L6JaO7T6XQ4/fTTxxwO4Pjx4zhw4MCEhtskIiIiIiLKlVTDxQ0rKCiA3W5HRUUF1q9fj8LCwgV/cpGIiCiXRg+3Eo1G0dfXl6NqiIiIiCauv78fkUgkYVlRUVGOqpk9GGLKsE2bNsXHYX7iiSfSnvjaunVrfP7KK6+c8vG6u7tx0UUXobm5GQDwm9/8Bv/wD/8w5f2l8/DDD8fnL7zwwozvn4jmt8HBQTidTrjdbuzbtw+NjY2IxWK5LouIiIiIiCiBy+XC3r17EQgEUq4XBAErVqxAbW0tlEpllqsjIiKi0XQ6Xfw7mWFOpzNH1RARERFN3OguTGazGXq9PkfVzB4MMWWYRqPB1772NQBAfX09fvKTnyRt8+677+Kxxx4DIAeC1q9fn3JfgiBAEARUV1enXD8wMICLL74YR48eBQA88MADuO222yZV74cffogTJ06Muc0jjzyCRx99FABQXFw8rdAVES08kiQlvM5IkoTW1lbs2bMHLpcrh5URERERERHJwuEwDh8+jI8++gg+nw8NDQ1pt2XnJSIiotlldMcCl8uV1NWAiIiIaDaJRqPo7e1NWDa6w+RCpcp1AfPRvffei2eeeQbHjh3DN7/5TZw4cQLXXHMN9Ho93njjDXz/+99HNBqFXq/Hz372sykdIxQK4dJLL8WBAwcAANdddx0uuugifPTRR2kfYzQaUVNTk7Bs7969+OIXv4iPfexj+NSnPoWVK1ciPz8f0WgUR44cwdNPP43XXnsNAKBUKvHII4/AaDROqWYiWphCoRCi0WjS8mAwiI8++giFhYVYtGgRtFptDqojIiIiIqKFTJIkdHZ2oqmpKeFzi8vlgsvlQn5+fg6rIyIiookoKCjA8ePH4yNjSJIEp9OJ8vLyHFdGRERElFp3dzdEUYzfFwSBIaYhDDHNALPZjO3bt2Pz5s04fvw4HnnkETzyyCMJ21gsFjz99NNYs2bNlI7R2dmJd955J37/6aefxtNPPz3mYy688ELs2LEjaXksFsNf//pX/PWvf0372Pz8fDz22GO47LLLplQvES1cOp0O69atQ0tLC1pbW5OG2ezp6UFfXx9qampQWlrKq5qJiIiIiCgrfD4fjh07BrfbnXJ9d3c3Q0xERERzgFqtRmFhYcKQLF1dXSgrK+O5RiIiIpqVurq6Eu7n5+dDo9HkqJrZhSGmGVJXV4f9+/fjV7/6FZ577jmcOHEC4XAYFRUV2Lx5M+666y5UVVXlukxs3rwZjz32GN59913s378fTqcTLpcLkiTBbrdj9erVuOSSS7BlyxZYLJZcl0tEc5RSqURNTQ0cDgeOHz+OwcHBhPWxWAwnTpyA0+nEkiVLYDKZclQpERERERHNd6Io4uTJkykvsgAAlUqF2tpaFBcX56A6IiIimori4uKEEJPP54PH4+H3GkRERDTreL1eeDyehGU8B3EKQ0wzyGg04pvf/Ca++c1vTunxqU6kDauurh5z/UQ5HA7ccsstuOWWW6a9LyKi8RiNRqxevRpdXV1obGxMGmbO4/Fg7969KC8vR3V1NZRKZY4qJSIiIiKi+ai/vx/Hjx9HIBBIud7hcGDRokW8+pGIiGiOycvLg06nQzAYjC/r6upiiImIiIhmnUgkAr1eHz83odFoYLfbc1zV7MEQExERZZUgCCgpKUF+fj4aGxvhdDqTtmlra0NPTw+WLFnCP9pERERERDRtkUgEDQ0NKT9/APIw2IsXL+bnDyIiojlKEAQUFxejubk5vqy7uxuLFi3ihZJEREQ0q9hsNqxfvx5utxtdXV3Q6XQcAncEhpiIiCgnNBoNli1bhqKiopRXQodCIXR3d/NLBCIiIiIimjJJkuB0OtHQ0JDUCRaQv/AsLy9HVVUVv+AkIiKa40aHmGKxGHp6ejg8CxEREc06giDAarXCarXmupRZR5HrAoiIaGGz2WxYt24dqqqqElLGGo0GixYtymFlREREREQ01wWDQRw7dixlgMlisWDt2rWora1lgImIiGge0Gq1CRdE2mw2aLXaHFZERERERJPFTkxERJRzCoUC1dXVcDgcOHbsGAYHB1FXVwe1Wp3r0oiIiIiIaA7T6/WorKzEyZMn48uUSiVqa2tRUlLCdu1ERETzTFlZGcxmM4qLi6HT6XJdDhERERFNEkNMREQ0axgMBqxevRr9/f1jDiPn9/uh1+v5hQMREREREY2rsrISPT098Pv9KCwsxKJFi9iVgYiIaJ6y2+1jnlckIiIiotmNISYiIppVBEEY80RDKBTCvn37YDKZsHTpUuj1+ixWR0REREREs5EkSZAkCQqFImmdQqHA0qVLEQ6HUVBQkIPqiIiIiIiIiGghi8Vi8Pl8MJvNbNIwDoaYiIhozpAkCcePH0csFsPg4CD27NmD6upqlJeX8w8+EREREdEC5fV6cfToUeTn56O6ujrlNhaLJbtFERERERERERENcTqdOH78OEwmE8rKylBYWAilUpnrsmal5MvTiIiIZqne3l64XK74fVEU0djYiH379sHr9eawMiIiIiIiyjZRFNHU1BT/PNDS0gKfz5frsoiIiIiIiIiI4iRJQkdHB4BTF2IdPXo0x1XNXgwxERHRnKFSqaDVapOWe71e7Nu3DydPnoQoijmojIiIiIiIssntdmPv3r1oaWmBJEkA5JOCR48ejd8nIiIiAuTgc09PD9xud65LISIiogVocHAw6aKr4uLiHFUz+3E4OSIimjNsNhvWr1+PpqYmtLe3J6yTJAnNzc3o7e3FsmXLYDQac1QlERERERHNlFgshubmZrS1taVdHw6HU178QERERAtLOBxGR0cHOjs7EQ6HYbfbsXLlylyXRURERAvMcBemYXq9HjabLUfVzH4MMRER0ZyiVCpRV1eHwsJCHDt2DH6/P2G91+vF3r17UVVVhcrKSgiCkKNKiYiIiIgok9xuN44ePZr0GQAABEFARUUFqqqqoFCw8TgREREBvb29OHnyZPx+X18f/H4/DAZDDqsiIiKihSQYDKKnpydhWUlJCb+/HAPP6hAR0ZxktVpx5plnorKyMmndcFem/fv3J7VnJCIiIiKiuUUURTQ2NmL//v0pA0wmkwlr165FTU0NA0xEREQUV1RUBKVSmbAsXTdHIiIiopkw+r2HUqlESUlJjqqZG3hmh4iI5iyFQoGamhqcccYZKa+g8ng82Lt3L1paWiBJUg4qJCIiIiKi6Rh+T9/a2pq0ThAE1NTUYO3atTCZTDmojoiIiGYzpVKJ0tLShGVOpxORSCRHFREREdFCEo1G0dXVlbCsuLgYKhUHTBsLQ0xERDTnWSwWnHnmmaioqEhaJ0kSmpqa2JGJiIiIiGgOEUURzc3N2LdvX8ruS2azOd6ZlS3YiYiIKJ2ysrKE9wqiKKKjoyOHFREREdFC0dnZiVgslrCsrKwsR9XMHQwxERHRvKBQKFBbW5uyK1NlZSWvzCYiIiIimkMaGhpw8uTJpOWCIKC6uhpnnHEGjEZjDiojIiKiuUSr1cLhcCQsa29vhyiKOaqIiIiIFgJRFNHe3p6wrLCwEHq9PkcVzR0MMRER0bxisViwdu1alJeXAwCMRiOqqqpyXBUREREREU1GRUUFlEplwjKTyYS1a9eiqqqK3ZeIiIhowobPEw6LRCJwOp05qoaIiIgWgp6eHoRCoYRlo9+TUGocbI+IiOYdpVKJRYsWoaCgAEqlEgpF6syuJEkAwC9AiIiIiIhmGZ1Oh0WLFuHYsWMQBAGVlZWorKxM+96eiIiIKB2TyYS8vDwMDAzEl7W1taG4uJjnBYmIiCjjJElCW1tbwjKLxQKLxZKjiuYWhpiIiGjeslqtY65va2tDf38/li5dCq1Wm6WqiIiIiIhoIoqLi+Hz+VBUVASz2ZzrcoiIiGgOq6ioSAgx+f1+uFwuFBQU5K4oIiIimpf6+/vh9XoTllVUVOSomrmHl68REdGC5PP50NTUhP7+fuzZswfd3d25LomIiIiIaEEJBoM4evQoYrFYyvWCIKCuro4BJiIiIpo2m80Go9GYsKylpSXeqZ2IiIgoEyRJwsmTJxOW6fV65Ofn56iiuYchJiIiWnBEUUR9fX38JEU0GkV9fT3q6+sRiURyXB0RERER0fwmSRKcTif27NmDrq4uNDQ05LokIiIimucEQUjqgODxeNDf35+jioiIiGg+ikQiCIVCCcsqKio4hO0kMMREREQLTjAYTBlW6u7uxp49e9DX15eDqoiIiIiI5r9IJIL6+nocOXIk3oGps7MTLpcrx5URERHRfOdwOKDT6RKWtbS05KgaIiIimo80Gg02bNiAJUuWQKfTQavVoqioKNdlzSkMMRER0YJjMBiwbt06FBYWJq0Lh8P48MMPcfz48bTDWhARERER0eT19fVhz5496OnpSVp38uRJDudCREREM0oQBFRWViYsGxwcxMDAQG4KIiIionlJoVCgpKQEGzZswKpVq6BQMJYzGfxtERHRgqRWq3Haaadh+fLlUKlUSes7Ojqwd+9euN3uHFRHRERERDR/xGIxnDhxAh9++CHC4XDS+qKiIqxatYqt1YmIiGjGFRUVQavVxu+bTKYcVkNERETzmSAIMBgMuS5jzkn+1paIiGgBcTgcsFqtOHr0KPr7+xPWBQIB7N+/H1VVVaisrGRSmoiIiIhokjweD44cOQK/35+0TqVSYcmSJSk7pBIRERHNBIVCgYqKCjidTlRVVcFutzNITURERDSLMMREREQLnlarxcqVK9HR0YHGxkaIopiw/uTJk+jr68Py5cuh1+tzVCURERER0dwhSRJaWlrSDhNns9mwdOnShE4IRERERNlQWlqK0tJShpeIiIiIZiGGmIiIiCC3dCwrK4PNZsORI0fg8XgS1ns8HuzduxfLly9Hfn5+jqokIiIiIpr9AoEAjhw5knJoZoVCgdraWn5xSERERDnD9yBERESUSX6/H6IocpjaDGGIiYiIaASDwYA1a9bErxofSZIkjl1LRERERJSGJJIDX/QAAKB3SURBVElwOp04ceIEYrFY0nqTyYTly5fzPTURERERERERzRsNDQ3o6+tDYWEhqqqqYDQac13SnMYQExER0SgKhQLV1dWw2+04cuQIAoEAAGDx4sUcTo6IiIiIaAz9/f0pA0yVlZWoqqqCQqHIQVVERERERERERJk3ODiIvr4+AEBPTw96enpw+umno6CgIMeVzV08c0RERJSGxWLBmWeeieLiYhQUFKCoqCjXJRERERER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ZP35n/+5brzxRs3NzekHP/iB/vf//t9qbm7WO9/5Th09elQpKSlWR8YW8Md//Mf61Kc+tWh/UlLSGqbBZldaWqra2lo9++yzl/3cz3/+83rsscckSfv27dO9996rbdu2qa2tTQ8++KBOnDihRx99VDk5Ofryl7+80tGxCV3NfFzwq1/9SoWFhYv2FxcXX/Gxsfn19fVJkgoLC/WHf/iHeuMb36jS0lKFQiG9/PLL+tu//Vv19vbqu9/9rubn5/X9739/0WPxHomrtZLzcQHvkbhaJSUluvHGG3XgwAGVlJSooKBA4XBYPT09+vGPf6ynnnpKIyMjeve7361XXnlFe/bsiTnGww8/rC9+8YuSpG3btukv/uIvtGvXLvX19ekb3/iGDh8+rGeeeUZ33nnnsuY1tq6VmI8L/uEf/kGHDh1atD83N3c1fgRscuFwWHfddZeCwaByc3M1NDR0yefwGRJYPaZpRh5nZmbq4MGDeumll+T1elf8tfi8s3VMT0/rne98p1paWiRJf/RHf6TbbrtNCQkJOnz4sL7yla9oampK73//+/Xiiy9q7969V/2af/3Xf633vOc9i/ZnZGRc9Wtg5a3V9Ug+S2wda32Nm3NKW8tKXKtZyp133qlf/vKXkqQbb7xRn/nMZ1RYWKgzZ87oy1/+stra2nT//feroKBAd91116pkuCRLS6iwpS3c3exwOMyXXnoppv/BBx/krjusGeYa1spf/uVfmj//+c/NgYEB0zSj7+RZbjX1+fPnI3eTHjx40JydnY3qn5mZMQ8ePBh5j2VFOyxmJebjxXeEtLe3r15YbHrvfOc7zR/+8IdmMBiM2z88PGzW1NRE5tvzzz8fdxzvkVgJKzUfeY/ESllsLl7spz/9aWS+3XLLLTH9o6OjZlpaminJLC0tNYeHh2Ne4+abb17WaiXY2lZiPl68EhNzDavha1/7minJrK2tNf/8z//8kvONz5DA6nr44YfN73//+1H/75SVla34Skx83tlavvCFL0T+Wz744IMx/S+++GLkvf1qdli4+HwZq51sTGtxPZLPElvLWswpziltLStxrWY5fvOb30SOe/PNN8f8fT88PGyWlpaaksz09HRzbGxsxV77cthWqBYKuCyvvPKK/vM//1OS9LGPfUzXXXddzJi7775bdXV1kqRvfOMbmp+fX9OMALAavvjFL+pd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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "p14.plot(sampling_rate=100)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Drag Shape" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This version of the driver includes a fix to the formula that generates the DRAG pulse." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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/zkhJgAAAJyXCDEBwAIYiST05L4+PfZuj148PKhk2jit/ZrKXLq4qVSGYchk4ktpAAAAALgQmEwmbaj3a0O9X1+5ZbUO94f1+N4+/fLdXu3pHp0y9tb11QWP87+fPKgSl003r6tWbXHRXE8bAHAa3njjDSUS2Wrs11xzTcFxdrtdl156qZ544gm98cYbSiaTstls8zVNAAAAYF4QYgKABfCZH7yhdzqCpzV2bY1Pt6yr1q3rq9Va5SG8BAAAAAAXuJZKr1oqvfr8dS3qGonqib19+uXeXu3tHtXVrRV594kmUvqn548olszomw/v06Z6v25ZX61b11VreYVnnn8CAMCkffv25ZZXr14949jVq1friSeeUCqV0qFDh7R27dq5nh4ALHmGYcgwDJnN5rzbh4aGFI/Hc+Pee4vFYmpoaJDJZFIgENDw8LBMJpNMJpMcDoeqqqryHjcWiymZTMpisUy5cY4HAGZGiAkAFsDNa6sLhphMJuniZSW6ZV21bllXrYZS1/xODgAAAACwZNSXuPSZK5v1mSubNRZPyWXP/3Xf8wcHFEtmco93dY1qV9eo/vKXbWqt8ujW9TW6fUO1VlV5ObECAPOoq6srt1yoldykhoaG3HJnZ+dph5hOfo58enp6csvhcFihUOi0jnuuxsbG8i4D54LX1fnNMAyl02klEgmlUimlUiml0+nc8sm3yfWGYaisrEyNjY15j9ne3q5wODzj89bV1UmS+vr6pqx3u90qKspf4TQQCEwbL2WrrFosFlmt1rw3i8Uim80mr9d7Ov9JsATxewpzYaFeV6f6/Xk2CDEBwCzrGonql+/2amdnUH/30S15v/y9bX21vv3LA7nHNotJV7SU65Z11bpxTZUqvI75nDIAAAAA4DzgcRT+qu+X7/YW3Hawb0wH+w7pb58+pOXlbt22oVq3ra/RulofgSYAmGMnn/jxeGaujOd2u3PLZ3Jy6uTw06n86Ec/kt/vP+3xs+VHP/rRvD8nzn+8rs4va9askcfjkcViOeN929ratH379rzbVq5cqbKysrOaU09Pj55++um825YtW6aamppp6w3DyAWtCkkkEnr77bfzbnO5XPJ6vUokEorH44rH40qn02c1fyw8fk9hLszn62p0dPTUg84QIaY51t7err/927/V9u3b1dnZKYfDoRUrVujXfu3X9PnPf14u19lV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x44drFy5knHjxlmStD755BNmzZpldWyjRo3Ys2cPH3zwgWXbqlWr2LNnj9XSqFEjy/74+HjatWvHn3/+ibOzM3369GHhwoX89ddfbNq0iQ8//JCSJUty8eJFOnXqxIkTJzLEfPLkSUsCk5OTE88++yxr164lLCyMmTNnUr16dUaPHs3y5csL6F0TAPc6dXD73/e/VFd//MFB0RR/1e+obrXuanDlStQVB0VT8Oxeienw4cPMnTuXrVu3cv78eWJjY1m1ahXVqlWztNm7dy8nT57Ey8uLVq1a2TtEERERkeKvVHW4/21oMwqObYCIBebqS0mZ3Ew6uwPO7sDH2Y1uVGWPc11ISbZvzNkxGKD2w3BXJ3PC1V9TzdeXmaiz4HOH+TgREREp1C5Hx+f5WC83I+4uzjb3XYlJwGQy5alfD1dnPF1t/7R29UYCySk577ekt1ueYsipb775huXLl+Pi4sKSJUsyVEFq2rQpffr0oWXLluzbt4/hw4dnOV1aarWltFNWNGjQgA4dOnD33Xdz4cIFpkyZwuDBg62Oe+SRR1iyZAlRUVEsW7aM7t272+x/wYIFAPj6+tKlS5cCvRZbnnnmGRISEnB2dmbZsmWW5Csw36zp0aMHLVq0YP/+/Xz++ef07duX2rVr2+xr165dVKpUib/++ouyZctatt9333106NCB9u3bk5iYyHPPPce2bdZVRffv38+bb74JwLvvvsu7775r9aRtw4YN6dWrF/369WP+/Pm8+eab9OnTJ0PlKhGRoih9FSY3Nzfc3d0dFI1I7plSUki+etXRYdiVs78/hmwqVOaHiIgINmzYQJMmTSzbQkJCqF69Ol26dOH69es0adIEk8nEtm3buPPOOy3tGjduTKlSpRg6dCgnT55k+fLlPPzww5b906ZNY+vWrQD07duX2bNnk5KSwsWLF7nnnnt48skneeedd/joo484evQo77//Pp9++qlVfO+//z6nTp0C4KOPPrJKem/YsCHdu3enS5curF69ukDen9yoV68ep0+fxt/fP8O+Dh06MGzYMLp06cKaNWsYM2YMffv2xdnZ/N3Ky8uLOnXqWCXj16hRg8qVK2d6vvfee48dO3bg7+/P2rVradiwodX+Fi1a8MQTT9CsWTPOnTvHqFGj+O6776zajBw50lKBaf78+fTu3duyLyQkhB49etCyZctbnnJZ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bPgEJjeGfb9CLqeUFhERkYLRoEEDypcvD8D06dOJi4tzcERmqTd3du7cyYEDByxProO5UpMt9riWdu3aWV5/++23mbbbunUr+/fvz3BMeleuXGHp0qWZ7k97jrT9ODs706lTJwBWr17NgQMHsg8+D4KCgqhVqxYAixYtIjY21ma7mJgYfvzxxwKJQURuXy4uLkRFRXH16lUCAgIoVaqAKi+KSJFWGMezGstmPIcjxrJSdBhLWFemS/5fBS/JH36uflbrRb0Sk12SmN577z3ee+89/vvvvxwfExkZaTlORERERETymU9ZaPUqvLgbei2AO+/PvO31c7D+Y/iiNvz9Nfzfe9Dpc/CwUWr62ilY1B/mdIUL+wosfBEREckZJycnRo0aBcC///5L3759iY+Pz7R9VFQUkyZNKvC4evfujcFgAOC7775j4cKFADRr1oyqVavaPMYe19K4cWPLE+szZszgjz/+yNDm2rVrDB482BLTkCFDsuzzpZdesjkVx4YNG5g+fToADRs2pFGjRlb733jjDZydnUlJSaF79+6cPn0603MkJyfz3XffZdkmM6nxnz9/npEjR9psM2LECC5evJjrvkVERERuVWEcz2osW3jGslI0pK/ElHRVlZjyk4+rj+W1E07EJtp+OKWosMt0cqNHj8ZgMNC9e/ccZ9JfuXLFctw777xTwBGKiIiIiNymnI1Qs7N5uXwUts+CnfMh1sYXSVMyHFhiXkpWg2bDIPIERMwHU4p12+ObYFoL6P0D1Ghvn2sRERERm5599lnWrFnDr7/+yqJFi9ixYweDBw+mcePG+Pn5ERUVxcGDB1m/fj1LlizB3d2dYcOGFWhM5cuXp1WrVqxfv57Jkydz9epVIPPpN+x5LTNmzKBJkyYkJCTQqVMnnn/+ebp27YqXlxc7d+7kk08+4d9//wXg5Zdftpo6I726deuyf/9+GjZsyBtvvEHjxo2Jj4/n999/54svvrBMzzF58uQMxwYHB/P5558zYsQI9u/fT506dXjmmWdo27YtZcqUIS4ujuPHj7N161Z++uknzp07x549eyxP+OfUkCFDmDVrFjt37mTq1KkcO3aMZ599lgoVKnDq1CmmTJnC6tWrCQkJITw8PFd9i4iIiOSHwjae1Vi28IxlpWhwDtB0cgWpuqk6n1T4BDcnN1wMLpxMPunokG6JXZKYRERE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mzY4OzuTnJzMnDlzeOSRR2y2CwsLY+/evbnqW0QktwwGA4mJibi53ay8qCQmkZxx79CBmNmzITez1hiNuHfoUGAxOYqLiwutWrVix44dJCUlcfXqVUsiUuo4K6sxFtwc12U1plu5ciXnzp3Lp6gzjgHT/i0UKU4STp22Wjd4eOCcpkKs3JorcdYV4txMbjgbivaUlnZJYurXr589TiMiIiIiIuJ49zwGCdGw7kOIu2a97+oJ+OFJqNoaOn4KgTWt95eoDO1GQ+s3YP8SCPsGTv1l+zyRx2HtaPjzQ6jVFUKegsotbiZHiYiIOMDQoUMZNmwYly5d4oUXXuDbb7/N0Oa9995j//79AAwaNMjqho2bmxsDBgxg/PjxREREMHbsWF599VWr45OSkhg0aBAJCQlZxtKqVSt27drF33//TWhoKM2bN7faf/78eZ5//vm8XirVq1e3vJ49ezZNmzbN0Gbq1Kn89ttvWfZzxx13WF4fPXqUu+66y2Y7f39/hg0bxmeffcaWLVsYMWIE48ePx8nJdrH9CxcusHTpUp5++mmrcz344IP88ssvLFmyhB9//JGePXtaHRcdHc3gwYOzjFlEJL9cuHABg8FAs2bN8PHxsZn8KiIZGcuVw7NHD24sWpSzRCajEc8ePTCWK3pT1G/atIk77riDatWq2dyfkJDAhg0bAPD29qZ0mgovd9xxBwcPHuTo0aNZnqN69ers2bOHpUuX8tFHH1lNdwxw/Phx3nzzzVu8Emvpx4B33313vvYvUlgknrZOYnItX16VyPLR1firVuvuKe62GxYhdptOTkRERERE5LbgbIQmg+H5ndBwADaniPt3PUy9F1a8DrFXM+43usE9PWDgKng21Jyg5OJl+3wpibDvF5jTBSY1gq1T4MYV221FREQK2LPPPkuzZs0Ac3X2+++/n59//pkdO3awdu1ann76aT788EMA7rzzTt5+++0MfbzzzjuUL18egNdee43HH3+clStXsmPHDr7//nvuvfdeVqxYQUhISJaxPPPMMxiNRkwmE127duXLL78kPDycLVu2MHbsWOrXr8+1a9eskpFyo379+pap8L7++msee+wxli1bxvbt2/ntt9/o0aMHzz33XIbkKVv9pD6J//bbb7NmzRoOHTrEkSNHOHLkiNWUKO+99x5NmjQBYMKECTRo0IDJkycTGhpKREQE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hx9+qLMwUXl5OePHj68SPIuLiyMuLo6PP/64XkJTItJ4+fj4cOjQocrtvDwtDS1SnZTVq/lh3DjKi0/uy+vy4mJ+GDeOa5YubfQzMtWFd955h8mTJ1NeXl7Zl5yczMcff8zXX3/NggULTuu95pdffsn1119fJbCfkpJCSkoKGzdu5IMPPmDz5s1069atxvP861//4oUXXrDr27NnD++++y7z5s1jyZIldO7c+ZTrE6kv1sJCClautOvzqeHfi3JmXMtc4ZgJ6TwsHs4rpp44PMS0fft2PvroI+bOnVuZFD0SXIqOjubKK69k3LhxDB482C5VKyIiIiIiIg1EeQn88WzV/j1/wowR0Gs8nPM4+EU6tq6Q9nDeU3DOY7DzV1g3x/jTVlF1rLUMtn1vNL9o6HUd9Lyu9uXzRESagKuuuoqkpCT+9a9/ccEFF+Dl5cWyZct48sknyc3N5dZbb6Vfv35cdNFFFBUV8eyzzzJixAjc3Nz4+eefefbZZykpKWHixIns3LkT9+PurK2oqOCiiy5i5eEPsEeMGMG9995Lq1at2LZtG5999hk///wz27Zt49xzz2XDhg34+PjYnSM3N5fRo0dXBpiuueYabrrpJsLCwoiPj+fVV1/lgw8+YMuWLY75odWivLwcb29vxo4dyznnnEOnTp3w8/MjLS2NuLg43njjDfbu3csLL7xAhw4d7GZd6t+/P5s3b+a7777jscceA+CXX34hKirK7hpt27atfFxSUsKoUaNYt24dLi4ujB8/njFjxtC2bVvKyspYunQpr776KmlpaYwZM4b169dXCYrt27evMsBkNpu54447GDduHP7+/mzatIkXXniBqVOn0q9fvzP++Tz00EOVAaaOHTsyZcoUevToQU5ODl9++SXvvfce11xzzRlfR0SaDl9fX7vtvLw8bDabvi8SOc6i++476QDTEeXFxSy+/36uW7asnqqqe5dddlnle5Lu3bsDcNddd3H33XdXjgkMDDylc/7yyy/8/fffdO/encmTJ9O9e3eKior45ptveP311yksLOSGG26o9r1ubVJTU7n55pspLS0lLCyMe++9l7POOouQkBCKiopISEhgyZIlfPvtt7We57333mPFihWMGDGCO++8kw4dOpCdnc1HH33ERx99RHp6Orfcckvl+22RhqBgxQpsx4b3XFzwGT7MeQU1UTkl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wHjPLNKYFa1dS+nevXZ9AVde6aRqmr61B9fabfcO642L2cVJ1dQ/V2dd2MXFhTFjxjBmzBhyc3P5/PPPmTNnDsuXL8dms5GamsqMGTOYOXOm3dTMIiIiIiIi0sRc8R78NR3+fBVK8+z3FWbATw/BqnfhvKeh4xgjPNTQuHtT1uUKPl+Sip81m5v7WPDc9hVk761+fEkOrPvQaIFtoMe10PMaCGrn0LJFROqai4sLP/74I5dccgnLly/njz/+4I8//qgyrnPnzixYsAAfH58q+/z9/fn5558ZNWoUBw8e5NNPP+XTTz+1GzNx4kRGjBhROWtTdbp27cpLL73EAw88QFZWFvfff7/d/qCgIL799lsef/xxdu7cecrP1WQyMWfOHM455xyysrL44osvqsxs1L17d7788kuioqJqPI+vry+TJk3ipZdeYt26dZx//vl2+xctWsTIkSMBY6aq3377jYkTJ/L111+zcePGytmZquPn51elr02bNnz//fdccskl5OXl8c477/DOO+/YjXniiScwmUy1LsV3Ml599VWSk5P5+uuv2b59e5X/Xm3btuXzzz8nJqbmJVpFpHkymUx06NABd3d3fHx8Kmd2ExF7kf37c92yZaRt3MimmTNJ27CB0rw83H19CevVix533EFYz57OLrPZKCsr46effqp1psl//OMfNc5YKtJYZH1u/+8e97ZtsfTu7aRqmr5jZ2IC6Bve10mVOIbDZ2Kqjp+fH7fffjtLly4lMTGRJ598kpiYGGw2m9Y4FhERERERaercLDDsAZi0HvrfDqZq7iQ6lACfjYfZY+HA2qr7G5BccwClg+6DSRvgph+h53hw86r5gKw9sOQFY9apWaNhzf9BUZaDqhURqXtBQUEsXbqUjz76iAsuuIDw8HDc3NwIDAxk8ODBvPHGG2zYsIHWrWueva5r167ExcUxZcoUYmNj8fDwICQkhLPPPptPPvmEDz744KRquf/++/n5558ZPXo0gYGBeHh40LZtW+655x7Wr1/PsGHDzui59urViw0bNvCPf/yD1q1b4+bmRlBQEAMGDOCVV17h77//tlsuriYvvPAC7733HsOGDSMoKAgXl5rvqvX19WXevHn8+eef3HbbbXTs2BFfX19cXV0JCgqif//+3HPPPfz000/89ttv1Z5j5MiRxMXFcdddd9G6dWvc3d0JDw9n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+u53v3tOoURgIXFMYjnheMRywvGI5YZjEsvJWjoeK7WK6ieekLda0O9vflPDPq6f/rX0hORUVVvqB7SlfkBmxVBt/dWqbnq9qr2/qnrsAokvPhfMWjomsfzt379fn/nMZ5a6DABoyDRNvfTSS1aASZJOnTolr9erDRs2LGFlAAAsjf7+fp08eXLaOqfTqYsvvlhOJ6MtrzZrNsQ0H2m8+++/X7fffvu0dR6PR5KseRhnUyqVrMder/esX9/lcs0aPNqyZYv+9//+3/qVX/kVSdLf/u3fzggxTdYrnbnm86n3TFPVTeXz+RQMBs9q/8BC8fv9HI9YVjgmsZxwPGI54XjEcsMxieVkTRyPkZtnbz/6gxmrDJlynNwlx8ld0o8/LYU2SBe8QdryRqn3esl59t/VYG7WxDGJZW3qiPMAsNwYhqELL7xQzz33nOr1urX+yJEj8nq9am1tXcLqAABYXKlUSocOHZq2zjAMXXTRReeUscDyxwS68ywQCEia23RrU+drXKi7z66//npt375dkvT4449PO+GVflmvdOaaF6NeAAAAAACAeVUtSS6/ZNhn7zd2XNr1Zelrvynd2ys9+HZp133SWN/i1AkAAPALgUBA27Ztm7F+3759ymQyS1ARAACLL5vNau/evTPWb926VaFQaAkqwmJYsyMxNTrYz1Z7e/uMdZ2dnfrZz36m8fFxjY6OKhwON91+coq11tbWaVO1zbft27drz549KhaLSqfT01L6U0dI6uvr09VXX33GeiWpq6trYYoFAAAAAACYTw63dPu/S/lh6cAj0r5/lw7+UKqMN9+mWpAOPDyx7H+j9Fv/vHj1AgAASIrH49q4caMOHz5sravX69q9e7euuOIKtbS0LGF1AAAsrEKhoN27d88YpKWnp0eJRGKJqsJiWLMhpq1bty7Ifrdv365//dd/lTSRiL/22msb9qtWq9awZ43S9PNptqnzJkdpkibqnc1ku8Ph0JYtW+anOAAAAAAAgMXQEpUue+fEUilKRx6TXv7+RLAp0998uwve2LytmJE8TIsGAAAWRmdnpwqFggYGBqx11WpVL7zwgq644ooFvUEeAIClUi6X9cILL6hSqUxb39bWpg0bNixRVVgsTCc3z1796ldbjx977LGm/Z5++mlrerZXvepVC1rTnj17JElut1uxWGxa244dO+RyuSTNXm+5XNZPf/pTaxun07lA1QIAAAAAACwwp2cinHTz56X//JL0ez+RXvtxqetayTjt67Itb2i8j1pF+u8XSf/zVdIjfyYd/tHE1HUAAADzxDAMbd68WZFIZNr6UqnU8OIuAAArXbVa1e7du1UsFqetD4VCuuCCC2YdwAWrAyGmeXbjjTda8y/+4z/+o0zTbNjvgQcesB7fcsstC1bPT37yE7300kuSJgJWNtv0f/JAIKDXvva1kqRHH31UfX19Dffz0EMPWfMsL2S9AAAAAAAAi8owpHUXS9d/WHrfw9JHDkm3/r108W9I3a+Wwl2Nt+vbJZUy0uCL0hN/I33l16R7e6QHf1P66f+SUgelJt8LAQAAzJXNZtNFF12kQCAwbX0+n9eLL76oWq22RJUBADC/6vW6XnzxReVyuWnrfT6fLr744hlZB6xO/CvPM5fLpT/6oz+SJO3du1ef+9znZvR58skndd9990mSbrjhBu3YsaPhvgzDkGEY6unpadj+b//2b01DUpJ08OBB3XbbbdbzP/iDP2jY74//+I8lTaQaP/CBD8w44U2lUvroRz8qSQqHw3r/+9/f9DUBAAAAAABWtJaodOnbpd+4T3rvd5v3O/iDmesq+Ynp6f7jo9L/uEr660ul73xI2vsdqTi2YCUDAIDVzW636+KLL5bX6522PpPJaM+eParX60tUGQAA88cwDPl8vmnrPB6PLr30UjkcjiWqCouNf+kF8JGPfET/9E//pP379+vuu+/WwYMH9c53vlNer1c7d+7Upz/9aVWrVXm9Xn3+858/59e55ZZbtHnzZt1666265ppr1NnZKbfbrYGBAT388MO67777rJTi29/+dt16660N9/Orv/qreuc736lvfOMb+va3v63Xv/71+tCHPqT169dr9+7d+ou/+AsdP35cknTvvffOGLYUAAAAAABgzTnxszP3GT0u/fz+icWwS+uvkDbeIPXeIPVcL3EXKQAAmCOXy6VLL71Uzz77rMrlsrV+eHhY+/fv14UXXsgUOwCAFW1yGlWXy6WjR4/K6XTq0ksvlcvlWurSsIgIMS2AQCCg7373u7rpppt04MABfelLX9KXvvSlaX2CwaAefPBBXX755ef1WgcPHtRf/uVfztrn93//9/Xf//t/n7XPP/zDPyiTyeh73/uedu7cqZ07d05rt9ls+rM/+zPdeeed51UvAAAAAADAqvDub0l9T0uHfjAxKtPJZyXNMn2cWZP6n55Ynv3f0odfXrRSAQDA6jA5GsVzzz2narVqrc9kMqpWq3I6nUtYHQAA588wDHV3d8vlcsnv988YhRCrHyGmBbJ582Y9++yz+ru/+zt985vf1MGDB1Uul9XV1aWbbrpJH/zgB9Xd3X1er/Htb39bTz75pH72s5/p2LFjSqVSGh8fVzAY1MaNG3X99dfrjjvu0MUXX3zGfXm9Xn33u9/V1772NT3wwAN6/vnnNTo6qra2Nl1//fX6wz/8Q1133XXnVS8AAAAAAMCqYXdK3ddNLL/6/5PG09LhndKhH06EmnKnmm/b+ytSs5ESTj4nOTxS64XN+wAAgDXL5/Pp4osv1gsvvKB6vS6/369LLrmEABMAYFVpb29f6hKwRAgxLSCfz6e7775bd9999zltb5qz3L0n6eabb9bNN998Tvtu5rbbbtNtt902r/sEAAAAAABY9Xwx6ZLfmFhMUxp86ZejNB1/Uqr9ctoX9d7QfD+P3jMRhvKvmwg79bxK6n61FNtEqAkAAEiSQqGQtm3bppMnT2r79u1yOLjcBwBYearVKp9hmIEjAgAAAAAAAJhPhiGtu3hiedUHpXJeOvFT6fBj0pHHJsJJjVRL0vGfTjzOnZJ2//PEIk2Emrpf+ctQEyM1AQCwpsXjccViMRmcDwAAVqCTJ0/q2LFjuvTSS+Xz+Za6HCwjhJgAAAAAAACAheRqkTb96sQymxNPSdVC47bcKemlhyYWSWqJ/yLU9Gqp+1VSYrtks81v3QAAYFmbLcBkmiYBJwDAsnTq1CkdOHBAkvT888/r0ksvld/vX+KqsFzwzQYAAAAAAACwHBRGpGDH3PrmU9Leb0vfv1v6X6+SPrtROvjowtYHAABWhHq9rr179+rUqVNLXQoAANMMDg7q5Zdftp5XKhU9//zzKpfLs2yFtYSRmAAAAAAAAIDlYPvbpG03S+lDE9POHfuJdPQnE6MwnUlhRAr3NG6rlqVyTmqJzmu5AABg+anX69qzZ4/S6bSSyaQMw1BbW9tSlwUAgJLJpPbt2zdjfUdHh1wu1xJUhOWIEBMAAAAAAACwXBiGFN88sex4n2Sa0vBh6ejjvww1Zfpmbudvk2KbGu/z+JPSV94mxS+UNrxC6nqF1HXtRH+mmQEAYNWo1+t68cUXNTIyYq3bt2+fDMNQIpFYwsoAAGtdKpXS3r17Z6zv6upSd3f3ElSE5YoQEwAAAAAAALBcGcZE2Ci2SbrqPROhptFjE2GmYz+ZCDeNHpO6X9U8kHTiZxN/pl6eWJ75ysTzlvhEoGnDK6SOq6X1l0su36L8WAAAYP4ZhiG/3z8txCRJe/fulWmajMgEAFgSQ0NDDQNMHR0d6u3tlcHNNZiCEBMAAAAAAACwUhiGFOmZWK74rYl1Y31Spdh8m+M/bbw+n5Je/u7EIkmGXUpslzqvkjqumgg2tV4o2ezz+RMAAIAFYhiGent7Va/X1d/fP61t3759qtfram9vX6LqAABr0alTp/Tyyy/PWL9+/Xpt2rSJABNmIMQEAAAAAAAArGShzuZtpikNvji3/Zg1aXD3xPLzBybWrbtU+r0fn3eJAABgcRiGoU2bJqaYPT3ItH//ftXrdXV0dCxFaQCANWZgYED79++fsb69vV2bN28mwISGCDEBAAAAAAAAq5VhSB96UTr1wsSITCd+NrHkBue2fWJ787aDj0782X6F5Iudf60AAGBeTAaZDMNQX1/ftLaDBw+qXq+rq6triaoDAKwF/f39Onjw4Iz1HR0djMCEWRFiAgAAAAAAAFYzh0vqvHpi0R9OjM40cnQizHT8p1Lf09LQS5JZn7ltx1XN97vzM1L/0xOPg53S+sul9sul9ssmHvsT8/6jAACAuTEMQxs3bpTNZtPx48entR0+fFj1el3d3d1LVB0AYDU7ceKEDh8+PGN9Z2enNm7cSIAJsyLEBAAAAAAAAKwlhiFFeyeWy945sa48Lg08PxFo6v/5xDJ2QupsEmKqVadPU5fpm1j2/fsv1wXarVCTI3yB/GZWOfkX7McCAADTGYah3t5e2Ww2HT16dFrb0aNHVa/X1dPTw8VkAMC8SaVSDQNMGzZs4DMHc0KICQAAAAAAAFjrXD6p+5UTy6TsoNQSbdw/9bJULc6+z+zAxLL/+2qR9AFJ42qR+19+LF3/n6Utr5uv6gEAwCy6u7tls9lmXFQ+fvy4qtWqNm/ezEVlAMC8iEajisViSqfT1rqenh5G/8Oc2Za6AAAAAAAAAADLUKBNsjsbt1UKUucOyeE9q136lJfj+ONSZbx5p0M/lDInJ6a9AwAA86Krq0ubN2+esf7kyZMNR8wAAOBc2Gw2bd++XdHoxA0xGzduJMCEs8JITAAAAAAAAADOTufV0vsfnZhWLrVfGnhuYjq6k89Jp3bPHlKSpLaLG6/PJaWv3jLx2BuV2i6SEtulxFap9RdLs9GhAADArDo6OmSz2bR//35rncvlUkdHxxJWBQBYbWw2my666CINDw8rHo8vdTlYYQgxAQAAAAAAADg3dofUtn1iufy2iXX1mpQ++MtQ08DzMgeek1HOSZJMh1dGpLfx/gZf/OXjwrB09McTy1S+hNR6oZTYNvFn61apdZvki83/zwcAwCrT3t4uu92uffv2yWaz6ZJLLpHH41nqsgAAq4zNZiPAhHNCiAkAAAAAAADA/LHZfxEuulC69O2SpOzYqL7+hc8oYQ7pTb+yQ16brfG2gy+def/jQxPL6eGmlrj0vkek2Kbz/AEAAFjdEomEnE6nDMOQ3+9f6nIAACtQsVjUgQMHdMEFF8jtdi91OVhFCDEBAAAAAAAAWFiGTaO2qEYV1Wsv/W15m/Wr5CWXX/rFqE1nJZ+WAu2N204+K/3fz0mxzdMXX1wyjLN/LQAAVrhIJLLUJQAAVqjx8XHt3r1bpVJJu3fv1uWXXy6Hg+gJ5gdHEgAAAAAAAIDl4Ya7pev/WBo7Lp16cWJkpuQ+KfmylD4g1crNt410S66Wxm0DL0j7/n3mek/ol4Gm6CYp0vPLxZ8g4AQAWJNM09ShQ4cUjUYVjUaXuhwAwDIyOjqql156SdVqVdJEoOnFF1/UJZdcIrvdvsTVYTUgxAQAAAAAAABg+bDZfhkk2vbWX66vVaWRI78INe2Thn4Rbkrtl2olqXVr832mDzZeXxyT+n8+sZzO2SKFu6XoRumdDxJoAgCsGUePHlV/f7/6+/u1ZcsWrV+/fqlLAgAsA6dOndL+/ftlmua09ZVKRdVqlRAT5gUhJgAAAAAAAADLn90hxbdMLNtu/uX6ek0aOSrVKs23bRZimk0lLyX3Tkxt1yzAtOfb0t5vS6HOXyxdv3zsCZ39awIAsMT6+/t1/Phx6/mBAwdUKBS0ceNGGQR6AWBNMk1TR48enfb5MCkYDOriiy+W0+lcgsqwGhFiAgAAAAAAALBy2exSbNPsfS5710T4KX1oItA0fHj2qemmivQ0b+vbJe3+ZuM2d3BKuGlKyCnYIQXbpUC75PTOrQYAABaBaZoaGxubsb6vr0+FQkHbtm1jlA0AWGNqtZpefvllJZPJGW2xWIzPBsw7QkwAAAAAAAAAVrftb5tYJtVr0tgJKXVwItSUPjAxmtPIUWnkmFSfMqpTpLv5fsf6mreVMtLQnomlkdgW6f95unFb6qBUGJb8bVJgneRwN38dAADmiWEY2rZtm7xe74zRNtLptJ577jldfPHFcrv5XAKAtaBcLuvFF19UNpud0dbZ2ckofVgQhJgAAAAAAAAArC02+8QIS5EeacvrprfVa1J24JehpvBsIaYT515DsL15264vSz/7n7987o1K/oTka5V88V/8efrjXzx3B5tPfwcAwBkYhqHe3l55vV7t379fpmlabblcTs8++6wuvvhi+f3+JawSALDQxsfH9eKLL6pYLM5o27Jli9avX78EVWEtIMQEAAAAAAAAAJNs9l9O/9bz6tn7XvkeqesVE2Gmsb6JJTc4t9cJzBJiyg5Mf14YnliS+8683/VXSnfubNx29CcTwSxvZObicM2tbgDAmrBu3Tp5PB699NJLqlar1vpSqaTnnntOF154oVpbW5ewQgDAQkmn09q7d69qtdq09Xa7Xdu3b1c0Gl2iyrAWEGICAAAAAAAAgHNx5btnrquWpEz/L0NNY33TQ05j/VJlfGKauGbmGoRqxBtu3vb816Vnv9q4zembCDN5QpI7MHOJbZKuvqPxtsWxiRGsnC0TU98xEhQArArhcFhXXHGFdu/ePW0kjlqtpj179mjDhg3q6elhKiEAWCVM09Tx48d19OjRGW1ut1uXXHKJfD7f4heGNYUQEwAAAAAAAADMF4dbim6cWJopZSdCP83YHJLDI1VnTt1wRr5E87bCSPO2yvjEkulr3L7huuYhpkc/KT193y+eGBNhJleL5PROPHZ6J0JSTu/E4vJN/D3Z3VJ4g/TKP2y834HnpdSBX/R1SXanZNgkwz4xYpb12HbaevvEyFKz/RsAAOakpaVFV155pV588UVlMplpbcePH1cul9O2bdvkcHDJEQBWg3w+P2NdIBDQxRdfLJeL0Vux8DijAAAAAAAAAIDF5A7M3n77v0umKRVHpezgxPRy+bSUG5LGk79YUtMfV8YntvXFm++3MLowNVcKU56YvwxEzcX6K5uHmHZ/U3rib+dc4jSRXumDz53btgCAaZxOpy677DLt379fg4PTRwscHh7WM888o4svvlgtLS1LVCEAYD4YhqELLrhA+XxeuVxOktTa2qoL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arWq1tbWhgGhbDarZ5555pxfu1AoNAwxeTweaxRVu91uTfHn8/msx8wwAmA5IMQ0z1wul/7oj/5In/rUp7R371597nOf00c+8pFpfZ588kndd999kiZ+8dixY0fDfU1+cHZ3d+vo0aNnfO3JqeQcDoduu+22OdW7e/dueb1ea07vRr70pS/py1/+siRp3bp18xa6AlYil8ul9vZ2tbe3q1KpWIGmkZGRhoGmZl/yShN3udrt9oUsFwAAAACAaSZvzkmlUk1/lz1dOp2WaZqMMgwA82z//v3WBf6tW7fO2ndq+969e88qxNTX1zdr+8DAgPU4m81aUz4ttFwu1/AxcD44rpaOzWazRvCRJoI8lUrFmuasWCxaIwhNDsow1bm890yGgorFYtN/71KpNG3GmdNrnlykiWuzk8vk81gsZvWf+hrlclmHDh2SaZrWOXW9XreWMzEMo+G0es1GWJqr4eHhpteeNm3aJKfTKZfLNePcfvLfCQuP9ykshKU6rs52itG5IMS0AD7ykY/on/7pn7R//37dfffdOnjwoN75znfK6/Vq586d+vSnP61qtSqv16vPf/7z8/Kae/bs0c9//nNJ0pve9CYlEok5bffzn/9c73//+/Wa17xGb37zm3XJJZcoFoupWq1q3759evDBB/XII49Imkgzf+lLX5rTcIPAWuB0OrVu3TqtW7dO1WrV+hJ46t2rra2tDbc1TVM///nP5XA4FI/HFY/Hm84BDQAAAADA+Tp16pROnTqlsbGxOW8TCoXU2tqqeDxOgAkAFsDUcFFnZ+esfbu6uqzHJ06cOKvXmbrtmXz1q19VKBQ6q/3Ph69+9auL/ppY/Tiulqcf/vCHDdfHYjH19vae8/Rl3/zmNxtOa+f1enXZZZc13GYugaPJEfOk6ceU2+3WFVdccU61ShPTiTY6N7fZbLrmmmvmvJ9qtapSqaRisahisajdu3drfHz8nOvC4uJ9CgthMY+rs/mOYa4IMS2AQCCg7373u7rpppt04MABfelLX9KXvvSlaX2CwaAefPBBXX755fPympOjMEnS7/zO75zVtrVaTY8++qgeffTRpn1isZjuu+8+3XzzzedcI7CaORwOtbW1qa2tTbVaTcPDw8pkMk2HRc3n81aiPZvN6siRI2ppabECTX6/ny+IAQAAAADzJpPJzOnLxXA4bAWXZpvWCABw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w+DgoA4ePCjDMKaN4DT55+TicDhmPCccgZXENE3V63UrlFSpVJqOmJTL5fTss882ndbtTMrlcsMQ02z/xxtxuVzyeDzWaGstLS1N+07+fgYAAAAAAAAAWH4IMS2AxRqp6Mtf/rLGxsYkSffee++0AJMk2e12feELX9D3vvc91Wo1ffazn20YYvrc5z4naWLkhC984QszLlDE43Hde++9ete73qXR0VF9+ctf1kc+8pGF+aEAAMCadqaRnEzTnHW0pnq9LsMwpo32Mlezjf4yGY4yTdMKU82V1+vVNddc07BtfHxc+XxeDodjxkL4CfOlVqspm82qWq1awaTJx6f/WalUZvz/ueqqqxr+n3Q4HOccYJKahw7tdrvsdrtqtZocDse0gJLb7Z72fLbpJQEAAAAAAAAAKwshphXs3/7t3yRJwWBQt956a8M+nZ2det3rXqeHH35YP/jBD5TNZhUIBKz2bDarH/zgB5Kk173uders7Gy4n1tvvVXBYFCZTEbf+ta3CDEBAIAlYRiGHI7mp7Dbtm3T1q1bValUpo3eNLmUy2VryqtKpTJt27mEmM7FbIGqdDqtI0eONGxrFGyy2+3Wn06ns+m522SwhHDHylSv11Wr1VSr1VStVq3HU9dNLlOfX3jhhfJ4PDP2VygU9Pzzz59zPc2Of6fTec77dDqds/7f2LFjh3WsAwAAAAAAAADWBkJMK1S5XNZTTz0lSbruuutmveh2ww036OGHH1apVNLTTz+t17zmNVbbrl27rIsSN9xwQ9N9uFwuXXvttXrkkUe0a9cuVSqV87poAQAAsFCmTvk2Nbx9OtM0VS6XrWW2cNT5hJhmO2eqVquzts3W7nK5moaYBgYGrOnvJke1sdls1uPTn5/etn79+ob7nQyA2Ww2axubzSbDMNbUyFH1el3lcln1el31et2agq1Wq1nrJh+f/me9Xldvb2/D8/dsNqtnn332nEYSkyaO00YhptmO7bk4PfA3afLffzI0ZxiGNc3i5ChJpy9ut1tOp/OMAbuznVIOAAAAAAAAALDyEWJaofbv329NpbJ169ZZ+05t37t377QQ0549exr2a7afRx55RNVqVQcOHND27dvnXG9fX9+s7SdOnLAeHz58eM77BRbC+Pi4NVXj/v375fP5lrgirHUck1hOVvvxePLkyYbrbTabIpGIKpWKarWa9efp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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "dp = Pulse(0, 2, 1, 4e9, 0, Drag(2,1), 0, PulseType.DRIVE)\n", - "dp.plot(sampling_rate=100)\n", - "# envelope i & envelope q should cross nearly at 0 and at 2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Sudden variant Net Zero" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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ldq6dWuD12+NSGICAKCN6G4t0e/OCWwv4PL4dNObq7XjYOg/LAEAANB8CgsLQ75BNGTIEMXExIQhIgAAAAAAgPq79dZbJR1tRXb77beHnPPII49o8+bNkqTrr79eERER/rGIiAjNnDlTkrR27Vo98cQTQce73W5df/31cjqdtcYyYcIESUerQi1dujRo/MCBA/rNb35Tj2cVWv/+/f3blUlZ1c2ePVsffvhhret07drVv71jx44a5yUkJOi2226TJC1btkx33XVXra3ycnNzNWfOnKBzXXTRRZKkjz76SP/5z3+CjispKdEtt9xSa8xtCUlMAAC0IZed0FXXjesdsK+w3KVrMlbqcGntf/wBAACg6ZSXl2vTpk1Bd9H17dtXnTp1ClNUAAAAAAAA9XfTTTdp7NixkqS5c+fqjDPO0H//+1/9+OOPWrBggX75y1/qT3/6k6Sj73k89NBDQWs8/PDD6tatmyTp/vvv15VXXqnPP/9cP/74o+bNm6dTTjlFn332mUaPHl1rLDfccIMsFot8Pp8uuOACPf3001q1apWWLVumJ554QiNHjlRhYWFAMlJDjBw50t8K78UXX9TUqVP1ySefaPXq1frwww912WWX6ZZbbtGpp55a5zqV1Zgeeughffnll9q2bZsyMzOVmZmp8vJy/9w//vGPOumkkyRJzzzzjE444QQ9//zzWrp0qdauXatFixbpueee08UXX6wePXqErAL11FNPKTY2VpJ05ZVX6tZbb9WiRYu0evVqzZ07V6NGjdKaNWs0fPjwRn1dWhtLuAMAAAAN88B5g7XncJm+3Jzr37fnUJlufGOV3rzuJEVYzGGMDgAAoP1zuVzauHGjXC5XwP60tDT/m3YAAAAAAACtndls1ieffKILL7xQS5cu1TfffKNvvvkmaN7gwYP12Wefhaw8HR8fr88//1xnnnmmDhw4oHfeeUfvvPNOwJwZM2ZowoQJ/qpNoRx33HH629/+pv/3//6fjhw5orvuuitgPCkpSR988IEeeughbd++vcHP1TAMvfHGGzr99NN15MgR/ec//wmqbDRs2DC9++67SktLq3Gd2NhY3X777frb3/6mH3/8UWeffXbA+KJFizRx4kRJRytVffnll5oxY4bef/99rVu3zl+dKZS4uLigfb169dJHH32kCy+8UMXFxXrhhRf0wgsvBMz5/e9/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X1Tv3r0lSc8//7weeOCBOte66aablJycrH/+85/63//+pyVLluj+++9XRESEHA6HrrrqqhrjfOKJJ3TvvffK5XLp+OOP1+zZs/XVV19p1apVeuuttzR27Fj5fD796U9/0rPPPtvg59oRWMIdAAAAaJ36dInRi9NGador/5PL83P1gk/W52h0r6QwRgYAAFCzgwcPBjw2m83q1q1bmKIBAABtWV5enlasWKEVK1Zo5cqVWrlypQ4dOiRJuvrqq5WRkdHk53znnXc0d+5crV+/XgUFBUpJSdH48eN16623auzYsU1+PgAAmpLX51WBoyDcYbSYhIgEmYzmqRszZ84cLViwQFarVR999JHOPffcgPGTTz5Z06ZN0/jx47Vp0ybdeeedNbZMW7lypRYuXKiJEyf6951wwgk655xzNGTIEOXm5uqFF17QjTfeGHDcVVddpX//+98qKirSJ598oilTpoRcv7JSU1xcnCZPntxsz6MmN9xwg5xOp8xmsz755BOdffbZ/rExY8bosssu07hx47R582Y9+eSTmj59uo477riQa61bt049e/bUDz/8oNTUVP/+0047Teecc47OPvtsuVwu3XLLLVqxYkXAsZs3b9aDDz4oSfrDH/6gP/zhD/52fpI0atQoXX755br66qv15ptv6sEHH9S0adOCKld1dCQxAQCAGp3cp5OuHttLc77f5d+XU1gexogAAABq53A4Ah736tVL0dHRYYoGAAC0ZSkpKS12rvLyck2ZMkWffvppwP69e/fqrbfe0jvvvKOHH35Yf/jDH1osJgAAGqrAUaAJ/54Q7jBazJKpS5Rkb/qbvn0+nx5//HFJ0u233x6U+FMpMTFRTzzxhM477zwtXbpU27dvV//+/YPm/eY3vwlIYKqUlJSkmTNn6q9//as2bNigwsJCxcfH+8fPPfdcderUSYcOHdJbb70VMomppKREH330kSTpl7/8pex2e7M9j1Aqk80l6frrrw9IYKq6/ksvvaRx48bJ6/XqhRde0PPPP1/jmk899VRAAlOlSZMm6frrr9fs2bO1cuVKrVq1SqNHjw44zuVyafTo0UEJTJVMJpP++c9/6t1331VJSYnee+89XX/99fV6rh0F7eQAAECtenUO/NDvQJGjhpkAAADhVz2JKTIyMkyRAACA9qRHjx4hPxRrKtdcc40/gWnSpEn64IMP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CUyV3BUVWnzXXc0UUdvywgsv6JRTTtG8efOUnZ0tp9Op/fv3680339To0aP17bff1nutiooKORwO+Xw+vfvuuxo2bJiee+45bdq0SSUlJXK5XMrJydG6des0d+5cXX755dq+fXutaz7wwAM6++yz9cknnyg3N1dOp1O7d+/Wv/71L51wwgm1JlqhfQluYAsAANq1CItZT0w5XgNTYvWXz7aoahe5dVmFuvC57/XStNEa3j0hbDECAAAAAAAAaFler1e7du3yV+gIhfZxAGrj83pVfuhQk6+bv2FDnS3kapK9dKn2LlqkzkOHNnFUUmSnTjJMTVs35uKLL9bo0aMlScOGDZMk3Xzzzbrlllv8cxITgztu1OaLL77QihUrNGzYMN1xxx0aNmyYysvLNX/+fD3zzDMqKyvTtGnTtH37dtlstoBjfVU/RKrC6XQqJydHM2fOlNPpVHJysm677TadfPLJ6ty5s8rLy5WZmaklS5bogw8+qDW+l19+WcuWLdOECRN04403asCAASooKNDrr7+u119/XQcPHtQ111yj5cuXN+h5o20iiQkAgA7IMAxdf1of9UuO0W/eWaMSx889jHOLHPrVi8v1xGXDdeHwtHqt9/nGHC3ZdlAHCiuUU1ih84Z11e1n9G+u8AEAAAAAAAA0IZfLpc2bN6ugoEAFBQUaMWKEzGZzuMMC0MaUHzqkF5KTwx1GkP+cfnqzrHtLXp6imri9ZkJCghISEgL2JScna+gxJGH98MMPOu+88zR//vyAJKXx48erU6dO+v3vf6+9e/dqwYIFuuSSSwKOrS159dNPP1Vpaakk6euvvw6K8ZRTTtH06dP13HPP1RrfsmXLdP311+vFF18MON8ZZ5whm82mOXPm6IcfftCaNWs0cuTIej9vtE20kwMAoAObNChZ8285RT07RQXsd7i9uv2dNXpq4U/yekNn2Ve1es8RvbNinxb9dFBbDxQrM6+kuUIGAAAd2E8//aQNGzZo27Zt2rNnj/+NMgAAAACNV15erjVr1qigoECSVFJSoi1bttRYfQMA0LbY7XbNnTs3qMqSJN1+++3+/d99912t61it1oDHubm5ko5Whho8eHCNx0VGRioyMrLG8a5du+qf//xnyISpe+65x79dV3xoH0hiAgCgg+ufEqsPbjlVY/t0Chr75zeZuuWtH1XmdIc48mcpcfaA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449+sPzaa68FZfpXysjI8G9fcsklTR8oAKDNMJsM9eoUFbBv58GSgMcPTR6il6eP1h8vGqpbJ/XT4K5xLRkiAABoJxITE9W1a1d16tRJMTExioqKqvsgAAAAoA3wer3atGmTysvLA/Z36tRJffv2DVNUAAC0Db1791bnzp0D9lVUVGjjxo3yer1higpNgSSmZnDiiSdq/PjxkqRXXnlFy5cvD5rz1FNPacuWLZKkO+64Q1arNWB88eLFMgxDhmFoxowZQcfv3r1b/5+9O4+Sq67z//+6tfZend7TWbuzmECQNUEISiIMSBAQlMUBWQREGEdgEByZn8rM1xFH9lFUIjsyggKDYnBwYwmbEExYE5J0JyTpdHe60+mturrW+/sjppJb3Z30UlW3lufjnBzrfuou74Rr9e1br/v+rF69er91/O53v9N//Md/SJIKCwt1ySWXDFnH4/Ho61//uiRp7dq1uvXWW4es89prr+m+++6TtDsItXDhwv0eFwCQ+xqqii3LiZ2YAAAAkqGmpkZz587VggULdOSRR/I0OgAAAHKCaZpav369enp6LOMlJSWaP3++DMOwqTIAALKDYRiaN2+eSktLLeOTJk3i52iWc9ldQK666667tHjxYgUCAZ100km68cYbtXTpUgUCAT322GNavny5JGnu3Lm67rrrxrz/zZs3a+nSpTrmmGN02mmn6dBDD1VNTY0kqbm5WU888YSeeOKJeGelW2+9dcSbvddff70ef/xxrV+/XjfccIM2btyo8847T4WFhXr++ef1/e9/X5FIRIWFhbrzzjvH9w8CAMgpjdUlktrjy80dhJgAAAAAAACA0diyZYva29stYx6PRwsWLJDT6bSpKgAAsovT6dSCBQv0t7/9TaFQSHPnzlVdXZ3dZWGCCDGlyOGHH67HH39cF1xwgXp7e3XjjTcOWWfu3LlasWLFkHTgWLz22mvDdnrao6ioSHfccYe+8pWvjLhOaWmpVqxYoWXLlmnDhg1avnx5PGS1R1lZmR599FEddthh464VAJA7hnRiSphODgAAAAAAAMBQO3bs0ObNmy1jDodDCxYskNfrtacoAACylMfj0SGHHKJwOKzy8nK7y0ESEGJKodNOO03vvPOO7rrrLq1YsULbtm2Tx+PR7NmzdfbZZ+trX/uaioqKxrXvI488Ur/4xS/02muvadWqVWpt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BwAAslA23ecHUmXWqafq3Jde0gvXXquWV14Zcb0pixdryR13EGACgCzlnjtXxRdfrMHnnlN0nylsEzmnTVPByScTYEJKJTXE9MADDyRzd1lr0aJF+uQnP6mVK1fqvvvu00UXXaRjjjnGss5tt92mtWvXSpKuvvrqIV0lXnjhhfgvPBdddJElRLTHNddco+XLlysajeqf//mf9dJLL6mwsDD+fiAQ0D//8z9Lklwul6655pph6/3GN76hSy+9VF1dXbrhhhv04x//2PJ+U1NT/Je12bNnE2ICAAAAAIyosdoaYtrUSScmAACQfbLtPj+QKpMXLtQXX35ZO95+W+8sX64da9Yo1NcnT2mpag47TB//yldUc+ihdpcJAJgg15QpKvnylxVta1PorbcUbW+XGQzK8HrlrK2V58gj5ayrs7tM5IGkhpiw11133aXFixcrEAjopJNO0o033qilS5cqEAjoscce0/LlyyXt7oR03XXXjesYc+fO1fXXX68f/OAHWrVqlRYvXqxvfvObmjVrlpqamvRf//VfWr16tSTp+uuv15w5c4bdz0UXXaT7779fr7zyiu6++261tbXp8ssv16RJk/TGG2/o//2//6fe3l45HA7993//94hzfwMAAAAA0FhVYlneuiugUCQmj8thU0UAAADjk033+YFUqzn0UJ149912lwEASDFnXZ0KTz3V7jKQx0ijpMjhhx+uxx9/XBdccIF6e3t14403Dlln7ty5WrFihUpLS8d9nP/8z//Ujh07dP/992v16tU677zzhqxz6aWX6nvf+96I+3A6nXr66ae1bNkyvfnmm3ryySf15JNPWtbxer368Y9/rFNOOWXctQIAAAAAcp/XbQ0rRWOmtnQNaHZNyQhbAAAAZKZsus8PAAAA5ALbHoM0TVNNTU1688039eabb6qpqUmmadpVTkqcdtppeuedd3Tttddq7ty5KioqUnl5uY466qj40xOzZ8+e0DEcDofuu+8+rVixQmeccYbq6+vl8XhUX1+vM844Q88++6zuvfdeORz7/09dVVWlV199VT/5yU903HHHqbKyUgUFBWpsbNTll1+ut956S5dddtmEagUAYDw2bdqkbdu2aceOHerp6VE0GrW7JAAAsB9vb+0eMtbc0Z/+QgAAAJIgm+7zZyvDMBQOh9Xf369YLGZ3OQAAALBR2jsx/d///Z9+8pOf6IUXXpDf77e8V1RUpCVLluiqq67KmY4/M2bM0O23367bb799TNstWbJkTKGuZcuWadmyZWMtz8LlcunKK6/UlVdeOaH9AACQLNFoVFu2bLGMLVy4UEVFRTZVBAAADqTOVzhkrLnTP8yaAAAA2SGb7vNnE9M0ddRRR8nlcum9996TxH0fAACAfJe22P7AwIA+//nP69RTT9WKFSvU398v0zQtf/x+v5599ll99rOf1Zlnnjkk5AQAAPJLKBQaMubxeGyoBAAAjFZdWcGQsY076MQEAAAAK8MwhoyFw2EbKgEAAECmSEsnplgspmXLlmnlypUyTVNut1snnXSSFi1apNraWklSe3u73nzzTf3hD39QKBTSb3/7Wy1btkwvvPDCsBeyAAAg9wWDQcuy0+mUy5X2RpIAAGAMhgsxrW/vs6ESAAAAZLpIJGK510OICQAAIL+l5VvAe+65Ry+99JIMw9DJJ5+se++9V1OmTBl23ZaWFl1++eX6v//7P7388sv62c9+xvRmAADkqcQQk9frtakSAAAwWmWFLnmcDoWisfjYZqaTAwAAwDAikYhlmRATAABAfkvLdHIPPfSQpN1zGa9YsWLEAJMkTZkyRc8884wWLVok0zTj2wIAgPyTGGJiKjkAADKfYRiqLrUGj3sHI+oZ4AspAAAAWCWGlggxAQAA5Le0hJjWrl0rwzB07bXXyuE48CGdTqf+5V/+Jb4tAADIT6FQyLJMJyYAALLDlElDp5Rr7uy3oRIAAABkMjoxAQAAYF9pCTEZhiFJmjt37qi3mTNnjmVbAACQf5hODgCA7DSlvGjIWHMHU8oBAADAik5MAAAA2FdaQkyzZs2SJO3YsWPU2+xZd8+2AAAg/xBiAgAgO9WWDe3EtKmTEBMAAACs6MQEAACAfaUlxPTFL35Rpmnq4YcfHvU2Dz/8sAzD0LnnnpvCygAAQCZLnE7O4/HYVAkAABiLurKhwWOmkwMAAEAiQkwAAADYV1pCTF//+td1xBFH6LHHHtMPf/jDA65/yy236Je//KUOP/xwXXPNNakvEAAAZBzTNOnEBABAlqrzFQ4ZYzo5AAAAJGI6OQAAAOzLlY6DtLW16d5779UVV1yhb33rW/rlL3+piy66SAsXLlRNTY0Mw1B7e7vefPNNPfLII1qzZo0WLlyo5cuXq62tbcT9Tp8+PR3lAwAAGyR2YZIIMQEAkC3qfMNPJxeLmXI4DBsqAgAAQCaiExMAAAD2lZYQ08yZM2UYe29SvvPOO7ruuuv2u82qVat0xBFHjPi+YRhDLm4BAEDuSOzCZBiG3G63TdUAAICxqCsbGmIKRmLa3hPQ1ElFNlQEAACATJQYWopGo4rFYnI40jKRCAAAADJM2q4CTdNM+h8AAJC7EjsxeTweSygaAABkrupSr4ZruLSpkynlAAAAsNdwD6vTjQkAACB/paUT0wMPPJCOwwAAgByS2ImJqeQAAMgeToehmtIC7egbVGyfZ5CaO/z65Jxq+woDAABARolEIjJN0/LgWjgc5j4QAABAnkpLiOmiiy5Kx2EAAEAOcTgcKiwsVDAYVCwW4+YVAABZ5vlvLNG3nnpHT6/ZHh9r7ui3sSIAAABkokgkIrfbHV+mExMAAED+SkuICQAAYKwmT56syZMnyzRNRaNRxWIxu0sCAABjUOhxqqGqxDLWzHRyAAAASLBlyxYtXbpUZWVlcrvdKioqsrskAAAA2IQQEwAAyGiGYcjl4pIFAIBs1FhdbFlu7iDEBAAAAKuOjg5VVlaqrKzM7lIAAABgM4fdBQAAAAAAgNyUGGLa3hPQYDhqUzUAAAAAAAAAMlla2xpEIhGtWLFCK1euVHNzs/r6+hSN7v/mpWEY+vOf/5ymCgEAAAAAQLI0VFlDTKYpbd7p17w6nrIHAAAAAAAAYJW2ENOLL76oiy++WFu2bImPmaY54vqGYcg0TRmGkY7yAAAAAABAkhV5XJrsK1Brz2B8rLmDEBMAAAAAAACAodISYlqzZo0+85nPKBQKyTRNFRQUaM6cOSovL5fDwYx2AAAAAADkmsFwVM+93yaPy/p7f3NHv00VAQAAAAAAAMhkaQkx3XTTTQoGg/J6vbr99tt1ySWXqKCgIB2HBgAAWai/v19tbW3yer3yer0qKChQWRkdGwAAyCamKV392Joh482d/vQXAwAAgIwXi8UUDocVjUZVVFRkdzkAAACwQVpCTC+//LIMw9C//du/6corr0zHIQEAQBbr6+tTS0tLfLmkpERHHnmkjRUBAICxKvQ45St0qycQtow3dxBiAgAAwF5lZWV6++23FYvFJEler1ef+MQnbK4KAAAAdkjLXG6Dg4OSpM985jPpOBwAAMhyoVDIsuzxeGyqBAAATERd2dAuzM0d/TJN04ZqAAAAkIlisVg8wCRJ4XCY60UAAIA8lZYQ08yZMyXtvvAEAAA4kGAwaFn2er02VQIAACaizjc0xNQ7GFGXPzTM2gAAAMhHid8dJYaaAAAAkD/SEmL63Oc+J0l66aWX0nE4AACQ5QgxAQCQG4brxCRJzZ1MKQcAAIDdIpHIkDEeigcAAMhPaQkxXX311Zo8ebJuvfVWbd68OR2HBAAAWYzp5AAAyA21w3RiknZPKQcAAABIUjQalWEYljFCTAAAAPkpLSGm6upqPfvssyosLNTRRx+tn//85+rp6UnHoQEAQBaiExMAALlh8kghJjoxAQAAYB9Op9OyTIgJAAAgP7nSdaCPf/zjeumll3T00Ufrq1/9qq688kpVVVWpqKhov9sZhqGmpqY0VQkAAOwWi8WG3KgixAQAQHYacTq5DkJMAAAA2MvlclmmlSPEBAAAkJ/SFmJ68skndemll6qvr0+maco0Te3YseOA2yW2EAUAALktsQuTRIgJAIBsVTtCiGkTnZgAAACwD5fL+nUVISYAAID8lJYQ02uvvabzzjtP0WhUkjRjxgx9/OMfV3l5uRyOtMxoBwAAskQoFLIsOxyOIS3FAQBAdhhpOrmPdvoVicbkcnJPAAAAAISYAAAAsFtaQkzf+973FI1G5fP59Oijj2rZsmXpOCwAAMhCiZ2YvF4vnRkBAMhS5UVueVwOhSIxy3g4amrbroBmVhXbVBkAAAAyCSEmAAAASFJaHnlctWqVDMPQv//7vxNgAgAA+zVciAkAAGQnwzBUx5RyAAAAOABCTAAAAJDSFGIaGBiQJB133HHpOBwAAMhihJgAAMgtdSNMKdfU0Z/mSgAAAJCpCDEBAABASlOIqaGhQdLeMBMAAMBIQqGQZdnj8dhUCQAASIaROjE104kJAAAAf+d0Oi3LhJgAAADyU1pCTGeddZZM09Rzzz2XjsMBAIAsRicmAAByS52vQKVelyqKrcHkTR2EmAAAALCb2+22LAcCAUWjUZuqAQAAgF3SEmK67rrrNGfOHN15551atWpVOg4JAACyVEFBgQoLC+Vw7L5MIcQEAEB2++Zn5undfz9Z3z9zgWW8uZPp5AAAALBbUVGRZdkwDGb3AAAAyEOuA68ycaWlpfrzn/+ss88+W5/61Kd07bXX6txzz9XcuXNVUDB8W3kAAJCf5s+fL0kyTVPRaFSGYdhcEQAAmAinY/fP8oaqEst4e29Q/cGISrxpuTUBAACADOZ0OjVlyhR5PB75fD6VlpbGH3ADAADAXn19fTIMQ8XFxTn5HVpa7hTuO5exaZr6wQ9+oB/84Aej2tYwDEUikVSVBgAAMpRhGHK5+FITAIBcMaOySIYhmebesc2dfi2Y4rOvKAAAAGSM2bNn210CAABAxtu8ebO6urrkdDrl8/k0ZcqUnPo+LS0xdtM0438Sl0fzBwAAAAAAZLcCt1NTJxVaxpo6mFIOAAAAAAAAGA3TNNXb2ytJikaj6urqyrmmQGmJY333u99Nx2EAAAAAAEAGa6gq0dauQHy5ucNvYzUAAAAAAABA9vD7/UNCSz6fT8Fg0KaKko8QEwAAAAAASIvGqmK9tL4jvrypkxATAAAAAAAAMBo9PT2W5YKCAnm93pwKMaVlOrnxWr16ta699lq7ywAAAAAAABPwwoc79NMXmrSutdcy3tzJdHIAAAAAAADAaCSGmHw+n02VpE5aOjGNRWtrq37xi1/okUce0fvvvy9JuuOOO2yuCgAApENLS4sCgYC8Xq+8Xq9KS0tVWFhod1kAAGCCHv3rFv3xg/Yh45s6/DJNU4Zh2FAVAAAAMpFpmhoYGFBPT4/6+vo0d+5crhcBAEDeM02TEFO6BAIBPfXUU3r44Yf1l7/8RbFYTJK4kQkAQJ7p7OxUd3d3fLmhoUHTp0+3ryAAAJAUdWUFw477Q1Ht6AuqdoT3AQAAkF/C4bDefPNNhcPh+NjUqVNVXFxsY1UAAAD2GxwcVCgUsowRYkqy559/Xg8//LCeeuop9ffvbiFvmqYkafLkyTrzzDP1+c9/3s4SAQBAGiVefHm9XpsqAQAAyVTnGzmk1NTRT4gJAAAAkiS32y2Hw2EZ6+7uJsQEAADy3r5NAKTd1025OJtJ2kNM69at08MPP6xHH31U27Ztk7Q3uDR16lR9/vOf1xe+8AUde+yxdGECACDPBINByzIhJgAAcsNInZgkaVOnX8fOqkpjNQAAAMhk5eXlam/fOxVxT0+PpkyZYmNFAAAA9kucSq68vDwnMzVpCTHt3LlTv/zlL/Xwww/rrbfekrQ3uFReXq7u7m4ZhqFbb71V55xzTjpKAgAAGSYSiSgajVrGCDEBAJAb9teJqbnDn8ZKAAAAkOl8Pt+QEJNpmjn5JR0AAMBoJYaYcnEqOSmFIaZwOKxnnnlGDz/8sP7v//5P4XA4HlzyeDxatmyZLrjgAp166qk52eIKAACMTeJUctLuawYAAJD99jddXHNHfxorAQAAQKZL/EIuFAppcHCQ75IAAEDeCgaDGhwctIwRYhql119/XQ8//LB+9atfadeuXZIUT8gvXrxYF1xwgc455xxNmjQp2YcGAABZLHEqOZfLJafTaVM1AAAgmfbXiWlTJ52YAAAAsFdhYaHcbrfC4XB8rKenhxATAADIW4ldmJxOp4qLi22qJrWSHmI69thjZRhGvOvSxz72MV1wwQU6//zzNXPmzGQfDgAA5IjEEBNTyQEAkDtKvC6Vel3qC0aGvLd1V0ChSEwel8OGygAAAJBpDMOQz+dTZ2dnfKynp0d1dXU2VgUAAGCf4aaSy9WpdlM2nVxpaan++7//WxdddFGqDgEAAHJIYoiJqeQAAMgttb4C9e0YOnVcNGZqS5dfs2tKbagKAAAAmWi4EBMAAEC+Gi7ElKtS8pijaZrq7+/Xl7/8ZR1xxBG6/fbb1dramopDAQCAHBEKhSzLdGICACC3TN7PlHLNHUwpBwAAgL0Sv5gLBAJD7h0BAADkA9M05fV65XQ642OEmMbghRde0MUXX6ySkhKZpqk1a9bo+uuv1/Tp0/UP//APevjhh9XfP/TJSwAAkN+YTg4AgNxWW7afEFMnISYAAADsVVJSYvmiTqIbEwAAyE+GYeiQQw7R4sWLdcQRR2jWrFkqLc3djuZJDzF96lOf0v3336/29nY9+uijOvnkk+VwOBSNRvWXv/xFl1xyierq6vTFL35Rzz77rKLRaLJLAAAAWYgQEwAAua1ufyGmDh52AgAAwF6GYaisrMwy1t3dbU8xAAAAGcAwDJWWlmrq1KlyOFIy6VpGSNnfrKCgQF/84hf1+9//Xlu3btUPf/hDHXLIITJNUwMDA/rVr36l0047TZMnT05VCQAAIIskhpg8Ho9NlQAAgFSo2890cpvoxAQAAIAE5eXllmU6MQEAAOS+tMSz6urq9I1vfENr1qzR6tWrdc0116impkamaaqzs1OGYUiS/uVf/kVXX321Vq5cmY6yAABAhojFYgqHw5YxOjEBAJBb9t+JiRATAAAArHw+n2XZ7/crEonYVA0AAADSIe09pg499FDdfvvt2rZtm373u9/pnHPOkdfrlWma2r59u3784x9ryZIlmjx5sq666ir9+c9/TneJAAAgzUKh0JAxQkwAAOSWOl+BSgtcmlNToiNnlFve2+kPqWcgPPyGAAAAyEulpaXxh+D3oBsTAABAbrNtojyn06lly5bpscceU1tbm+655x4dd9xxkiTTNNXe3q577rlHJ598sl0lAgCANDFNU+Xl5SoqKpLT6ZTD4ZDL5bK7LAAAkEQH15fp3ZtO1h//5Xg99pVj5HJYv5Bq7uy3qTIAAABkIofDobKyMjkcDpWXl2vGjBkqLCy0uywAAACkUEZ8O1hWVqbLL79cl19+uTZv3qyHHnpIv/jFL9TU1GR3aQAAIA0KCwt16KGHxpej0eiQJ+0AAEB22/dnu9vp0PSKIjV37p1GrrnDr8OnT7KjNAAAAGSo+fPny+12y+Gw7Zl8AAAA23zwwQcyTVM+n08+n08lJSU5//1Zxl31zZw5U9/97ne1YcMGrVy5UpdffrndJQEAgDRzOp12lwAAAFKsoarYsrxpn0ATAAAAIEler5cAEwAAyEuxWEw7d+5UZ2enmpqa9Le//U07d+60u6yUy4hOTCNZvHixFi9ebHcZAAAAAAAgyRqri/XndXuXmU4OAAAAAAAA2K2vr0+xWMwy5vP5bKomfYivAwAAAACAtGusLrEsN3fQiQkAAAAAAACQpJ6eHstycXGx3G63TdWkDyEmAAAAAACQdsNNJxeLmTZVAwAAAAAAAGSOxBBTPnRhkjJ8OjkAAAAAAJA7Nu7o0x8/2KH23kFtTpg+LhiJaXtPQFMnFdlUHQAAADKdaZoaHByU1+uVw8Fz+gAAIDeZpkmICQAAwA6maWrt2rXyeDzyer3yeDyqrKyUy8VlCgAAuWZta5/+6//WxZcNQzL3ab7U3OEnxAQAAAAL0zTV2tqq7u5u9fT0KBQK6fDDD1dZWZndpQEAAKSE3+9XNBq1jBFiAgAASINIJKKOjg7L2NFHH02ICQCAHFTnK9jv+5s6/frU3Oo0VQMAAIBsYBiGWlpaNDAwEB/r6ekhxAQAAHJWYhemgoICeb1em6pJL3ptAgAAWwWDwSFjHo/HhkoAAECq1ZVZQ0z7dmGSpOYO6xRzAAAAgDS080DiF3sAAAC5JF+nkpMIMQEAAJslhpg8Ho8cDi5RAADIRTVl+39irLnTn6ZKAAAAkE2GCzGZiYl4AACAHGCaprq7uy1jhJgAAADSJDHElC/tMAEAyEdel1OVxSN3XGzuIMQEAACAoRK/uItEIvL7uXYEAAC5JxAIKBwOW8YIMQEAAKRJKBSyLDOVHAAAua02YUq5fW3vCWgwHE1jNQAAAMgGBQUFKiiwXkcypRwAAMhFidc4Ho9HhYWFNlWTfoSYAACArejEBABAfpnsGznEZJrSJqaUAwAAwDCGm1IOAAAg1yRe4/h8PhmGYVM16UeICQAA2IoQEwAA+aU2IcRU5HFalgkxAQAAYDjDhZhM07SpGgAAgNQYLsSUTwgxAQAAWyVOJ0eICQCA3FaXMJ2c12W9NdHc0Z/OcgAAAJAlEr/AC4VCGhwctKkaAACA5AsGg0Oub/ItxOSyuwAAAJDfEjsxeTwemyoBAADpUJfQiSnx4flmOjEBAABgGIWFhXK73QqHw/Gxnp4eFRYW2lgVAABA8rjdbh122GHq6elRT0+PBgYGVFxcbHdZaUUnphQaGBjQD3/4Qy1cuFAVFRUqLi7WvHnzdN111+mjjz6a8P5jsZheeukl3XjjjVqyZInq6urk8XhUVlamBQsW6KqrrtI777xzwP3cdNNNMgxjVH9eeOGFCdcNAMAe0WhUkUjEMkYnJgAAcltiJ6ZgJGpZbu4gxAQAAIChDMMYdko5AACAXOFwOOTz+TR9+nQdcsghWrRokQzDsLustKITU4ps3LhRy5Yt04YNGyzjH374oT788EPde++9evTRR/XZz3523MeYOXOmtm7dOmQ8HA7r/fff1/vvv6977rlH3/jGN/SDH/wg705uAEDmS+zCJBFiAgAg1yV2YgqEY5bl5o5+mabJ77AAAAAYwufzqbOzM75MiAkAAOSyfLw/RogpBfr6+nTqqafGA0yXX365zjvvPBUWFur555/XzTffrN7eXp177rl65ZVXdNhhh43rONu3b5ckzZ49W5///Oe1ePFi1dfXKxAI6Pnnn9cdd9yhXbt26Yc//KGcTqe+//3vH3Cf77777n7fb2hoGFetAAAMJzHE5HQ65XQ6baoGAACkQ2KIKVHvYERd/pAqSwg2AwAAwCqxE1MgEFAwGOShOAAAgBxBiCkFbrnlFq1fv16S9MMf/lDXX399/L1jjjlGS5Ys0fHHH6+BgQFdc801456ibdGiRfrud7+rk046aUgC77jjjtM//uM/6phjjlFHR4duueUWXXbZZWpsbNzvPhcsWDCuWgAAGI9QKGRZ5oYTAAC5r9TrUpHHqYHQ3mnk3E5D4agZX27u9BNiAgAAwBAlJSVyOp2KRvdeS/b09KimpsbGqgAAAJAsDrsLyDXhcFj//d//LUmaP3++rrvuuiHrHHvssbr00kslSS+++KLefPPNcR3r1Vdf1cknnzxiC7FZs2bpO9/5jiQpEono6aefHtdxAABIlcROTISYAADIfYZhaE5tqebWluhTc6t1zlFTVV9eaFmnuaPfpuoAAACQyQzDsHRjMgxjyP0lAAAAZC86MSXZ888/H5+D+aKLLpLDMXxO7OKLL9Y999wjSfrf//1fLVy4MCX1LF26NP66qakpJccAAGC8vF6vysvLFQqFaP0NAEAe+c0/LbYsX/HIKn20cyC+3NzpT3dJAAAAyBK1tbUqKyuTz+dTaWmpnE6n3SUBAABMiGma2rBhgyorK1VRUTFiI5t8QIgpyV5++eX46+OPP37E9Y466igVFRVpYGBAr7zySsrq2fcJBC7kAQCZpra2VrW1tfHlWCxmYzUAAMAujdUlktrjy80dhJgAAAAwPKaOAwAAuaa7u1utra1qbW1VQUGB6uvrNWXKlBGb5uSy/Psbp9gHH3wQfz1v3rwR13O5XJo9e7Ykae3atSmr58UXX4y/nj9//gHXP+mkk1RTUyOPx6OamhotWbJEP/jBD7Rr166U1QgAwB75eDEGAACkhqpiyzLTyQEAAAAAACBfbN++Pf56cHBQbW1teduNiU5MSbZt2zZJUnFxscrLy/e77rRp0/TOO++oo6MjJVPoDAwM6M4775S0e7qeM84444Db/PGPf4y/7ujo0IsvvqgXX3xR//Vf/6UHH3xwVPsYzp5/l5G0trbGX/v9fvX29o7rOEAy9Pf3D/sasAvnJDIJ5yMyCecjMg3n5PjVFVlvyny0c0Bd3T1yOfLzZk0ycD4i03BOIpP4/XT8AwAAAJAZgsGgOjs7LWP19fWEmJAcfX19kqSSkpIDrltcvPdJ0/7+/qSHmL75zW9qy5YtkqR/+qd/Un19/YjrHnLIIfrc5z6nRYsWqb6+XuFwWB9++KEeffRR/eEPf1B3d7c+//nP65lnntEpp5wy5lqmTZs26nWfeuop+Xy+MR8DSIVHHnnE7hIAC85JZBLOR2QSzkdkGs7JsRmMOSXt7R4ciZm69Sf3y+cM2VdUDuF8RKbhnITdenp67C4BAAAAACRZG75Iu2ctqa2ttaka+xFiSrLBwUFJksfjOeC6+4aWAoFAUut49NFH9eMf/1jS7mnkvve974247jXXXKObbrppyPjRRx+tCy+8UPfcc4+++tWvKhqN6rLLLlNTU5MKCgqSWi8AAAAAIH8VOKLyGhEFzb23KbpjHkJMAAAAGLX+/n4VFRXJ4XDYXQoAAMCoxGKxISGm2tpauVz5G+XJ2795MlpvPfDAA7r44ostY3vCPaHQgW+0BoPB+OvCwsIJ17PHCy+8oEsvvVSSVFFRoSeffHK/+z/QtHdXXHGF3nzzTd13333avn27nnzySZ1//vljqmnr1q37fb+1tVWLFi2SJJ111lmaO3fumPYPJFN/f3/8qdAvfelLo+qsBqQS5yQyCecjMgnnIzIN5+TohSIxPfxGi3b0BbWjL6T2vqBm10rvt+2dYurgT3xaX1o0xcYqsxvnIzIN5yQyyfr163XzzTfbXQaAJIjFYuro6ND27dvV29urefPm5XXnAgAAkF127tw5JFuyvxm28kHehphSpbS0VNLuGzMHsu/c68m6cbNq1SqdfvrpCgaDKikp0bPPPqv58+cfeMMDuOKKK3TfffdJkl588cUxh5imTp066nWLi4tVVlY2pv0DqVJSUsL5iIySS+dkd3e3Wlpa5PV65fF4VFRUpKqqKrvLwhjk0vmI7Mf5iEzDObl/0Zipu196VdGYGR87YV6NJcTU0hfh3zBJOB+RaTgnYbfi4mK7SwCQJGvXrlVnZ2d8efv27YSYAABA1ti+fbtluaysLO8f+snbENPatWsnvI/JkycPGZs6dar++te/yu/3q7u7e79djvZ0J6qurrZMLTde77//vj7zmc+or69PXq9XTz/9tI4++ugJ71eSDjrooPjrlpaWpOwTAJDf/H6/5SZTWVkZISYAAPKE02GoptSr1p7B+FhZgfUWxaYOf+JmAAAAgEVNTY3l/lJvb6/6+vriD5wDAABkqj2Zkn3lexcmKY9DTPPmzUvJfg866CA9+eSTkqR169bpE5/4xLDrRSIRNTU1SVJSOiU1NTXpH/7hH7Rz5065XC49/vjjOuGEEya83z2SMf0eAAD72ndaVUlJCfQCAIDsUecrsISYvG6n5f3mzgN3OAYAAEB+q6qqksfjsUzD0traSogJAABkvNbWVsuy2+1WdXW1TdVkDofdBeSa4447Lv76xRdfHHG9VatWxaeTW7x48YSOuW3bNp144olqbW2Vw+HQQw89pDPOOGNC+0z0wQcfxF+T/gMAJAMhJgAA8ltdWcF+32/vDao/GElTNQAAAMhGhmEMmTWjvb1dkQjXkQAAIHNFo1G1tbVZxurq6uRwEOHhXyDJlixZIp/PJ0l66KGHZJrmsOs9+OCD8ddnnnnmuI+3Y8cOnXjiidq8ebMk6Wc/+5n+8R//cdz7G8k999wTf3388ccnff8AgPyTGGLyeDw2VQIAAOxQmxBiCoSjSmwCvLmTKeUAAACwf5MnT7bMJhGLxYZ8KQgAAJBJ2tvbFY1GLWM0k9mNEFOSeTweff3rX5ckrV27VrfeeuuQdV577TXdd999knYHghYuXDjsvgzDkGEYmjlz5rDvd3d36+STT9aHH34oSbrjjjt0+eWXj6ned999Vxs3btzvOsuXL9e9994raXf6byKhKwAA9ti3zbdEJyYAAPLNZJ81xNTZH9TUSYWWsaYOppQDAADA/nm9XlVVVVnGtm/fPuJD5gAAAHYyTVPbt2+3jFVUVKigYP9dy/OFy+4CctH111+vxx9/XOvXr9cNN9ygjRs36rzzzlNhYaGef/55ff/731ckElFhYaHuvPPOcR0jGAzq1FNP1Zo1ayRJ559/vk488US99957I25TXFyshoYGy9hbb72lyy67TEuXLtUpp5yiQw45RJWVlYpEIlq3bp0effRR/eEPf5AkOZ1OLV++XMXFxeOqGQCAPUzTZDo5AADyXF1CiKm1Z1CNVSXa2hWIjzV30IkJAAAAB1ZfX6+Ojo74ciAQUHd3tyZNmmRjVQAAAEP19vbK77fe86IL016EmFKgtLRUK1as0LJly7RhwwYtX75cy5cvt6xTVlamRx99VIcddti4jtHa2qpXX301vvzoo4/q0Ucf3e82xx9/vF544YUh49FoVH/605/0pz/9acRtKysrdd999+m0004bV70AAOwrEokoFotZxggxAQCQXxKnk2vvGdSn5lTrxfV7v3zaxHRyAAAAGAWfz6eioiINDAzEx7Zv306ICQAAZJxQKCSPxxOfsaSgoEAVFRU2V5U5/n/27js+jvrO//h7V6td9ZWsXmwVy8ZNuBscih1CCOdAOAgQyg8wEDCEEjgCOUiOwBFCKGkEQyAQCMQQeoJDSAw52wfGYBsXbMtFzVW99y3a/f3h01qrXVVrtSqv5+OhBzvf+c7MZ+RBWs1+5vMhiSlAcnNztW3bNq1cuVJvvvmmCgsLZbfbNXHiRC1btkzf//73lZmZGewwtWzZMr3wwgvauHGjtm3bpoqKCtXU1MjtdmvChAmaPXu2zj33XC1fvlwxMTHBDhcAMEZ0r8IkHWvJCgAAxo/u7eRa7B1Kj/UeK66mnRwAAAD6ZjAYlJaWpsLCQs9YdXW1bDYbD84BAIARJTExUfHx8aqpqVFpaakmTJggg8EQ7LBGDJKYAigyMlL33HOP7rnnnkFt31u/5qysrCHp55yUlKTrrrtO11133QnvCwCA/urMLu8UGhoqo9EYpGgAAEAwdK/EJEkx4aFeyyVVLXK73dzIAQAAQJ+Sk5NVXFzsVf27rKxMWVlZwQsKAADAD6PRqMTERCUmJg5J3sdYwqeFAABg2HWvxMQTcQAAjD9hoSGKjfBOWrKYvG9TtNg7VNnkW8ERAAAA6M5kMik5OdlrrKyszCupCQAAYKTh4T1vJDEBAIBhRxITAACQpJRu1ZhsTpfCQ0O8xoqqaCkHAACA/klLS/NattvtqqmpCVI0AAAAGCiSmAAAwLDr3k7ObDYHKRIAABBMKVbvJKbKRpuyEiK9xoqrWoYzJAAAAIxiUVFRiomJ8RorKysLUjQAAAAYKJKYAADAsKMSEwAAkHwrMZU3tisn0TuJqaSaJCYAAAD0X2c1pvDwcE2ePFkzZswIckQAAGC8s9vtam9vD3YYo4Ip2AEAAIDxhyQmAAAgSTmJkZqWEq3kmDClWsO0KHuCiiq928cV004OAAAAA5CYmCiz2azY2FgZDIZghwMAAKDDhw/ryJEjmjBhgtLS0jRhwgTep/SAJCYAADDsYmNjZTabZbPZZLPZaCcHAMA4deOZk3XjmZO9xt7ddsRrmUpMAAAAGAij0ai4uLhghwEAACBJ6ujoUHl5uSSptrZWtbW1yszMVFZWVnADG6FIYgIAAMMuNzfXa9ntdgcpEgAAMNLkJER5LR+ua5Pd6ZLZZAxSRAAAAAAAAMDgVFVVyel0eo0lJSUFKZqRjzuAAAAg6CiZCQAAOmUnRnotd7jcOlRLNSYAAAAAAACMPqWlpV7LcXFxioiIW0P2JQAA0gFJREFUCFI0Ix9JTAAAAAAAYMSICQtVQpTFa6y4iiQmAAAAAAAAjC5NTU1qamryGktLSwtSNKMDSUwAAAAAAGBEyelWjam4miQmAAAADF5zc7P279+v/fv3BzsUAAAwjnSvwmSxWBQfHx+kaEYHU7ADAAAAAAAA6GpyYqQ2ldR6lourmoMYDQAAAEarlpYW7d+/X42NjZIkg8GgrKwsmc3mIEcGAADGOofDocrKSq+x1NRUGQyGIEU0OpDEBAAAAAAAguav249qy4E6lTe2q7yhXVecMknZCd6VmEqoxAQAAIBBMJvNXi1c3G63ysvLNWnSpCBGBQAAxoOKigq5XC7PssFgUGpqahAjGh1IYgIAAMOquLhYbW1tMpvNslgsmjBhgqKiooIdFgAACJL/2Vupv24/Xlq7qLJZp+Z4l9UuriKJCQAAAAMXGhqqpKQkVVRUeMZKS0s1ceJEqiAAAICAcbvdPq3kEhISqAbZDyQxAQCAYVVfX+/1BFxISAhJTAAAjGMpMWFey+WN7cpJ9K7EVNNiV0OrQ9aI0OEMDQAAAGNAWlqaVxKTzWZTTU2NEhISghgVAAAYy+rq6tTW1uY1lpaWFqRoRhdjsAMAAADji91u91q2WCxBigQAAIwEKVbvJKaKxnZNnBAhk9H7yfji6ubhDAsAAABjRHR0tM8DdN0rIwAAAAyl7u81IiIiZLVagxTN6EISEwAAGDZut1s2m81rjCQmAADGt+6VmMoa2hUaYtSkCRFe47SUAwAAwGAYDAafygf+qiMAAAAMhfb2dtXU1HiNpaWl0cq2n0hiAgAAw6Z7FSaJJCYAAMa75G6VmCobbXK73cpO8G4pRyUmAAAADFZSUpJMJpPXGNWYAABAIJSVlXkth4SEKDk5OUjRjD4kMQEAgGHTPYnJYDAoNDQ0SNEAAICRILVbEpO9w6XaFrtyEr2TmEqqqcQEAACAwfH34WF5ebk6OjqCFBEAABiL3G63ysvLvcaSk5N9kqnRM5KYAADAsOneSs5sNlM+EwCAcS4xyiJjt7cDZQ3tykmM8hqjnRwAAABORPeWck6nU1VVVUGKBgAAjEUGg0Hz5s1TZmamzGazJN/3IOgdSUwAAGDYdE9iopUcAAAwhRiVEOX9nqCisd2nnVxJdYtcLvdwhgYAAIAxJCIiQnFxcV5jtJQDAABDzWKxKCsrS6eccopOPvlkRUZG9r0RPEhiAgAAw8ZfJSYAAIDuLeXKG9t92snZnC6VNrQNZ1gAAAAYY7pXQmhqalJTU1OQogEAAGOZ0Wj0SaBG30hiAgAAw8Zut3stU4kJAABIUnJMtySmhnYlRlkUbTF5jdNSDgAAACciPj7e534U1ZgAAABGDpKYAADAsKGdHAAA8CeleyWmhnYZDAZlJ/q2lAMAAAAGy2AwKDU11WussrJSDocjSBEBAACgK5KYAADAsCGJCQAA+OOTxNTYLknKSfBOYiquah62mAAAADA2paamymAwSDrW5iUpKUkulyvIUQEAAECSTH1PAQAAGBrd28mZzeYgRQIAAEaSFD/t5CQpJzHKa7yYSkwAAAA4QWazWRkZGTKbzUpJSZHJxEdlAABg8Nxut7788ktFR0crLS1NYWFhfW+EHvHODAAADAun06mOjg6vMSoxAQAAyU8S0/9VYsr2qcREEhMAAABOXE5OTrBDAAAAY0RDQ4Pq6+tVX1+vw4cPKz4+XieddJJCQ0ODHdqoRBITAAAYFt1byUkkMQEAgGPS48I1LSVaKdYwpcSEKTkmTC6XWzmJ3klMpQ1tand0KCw0JEiRAgAAAAAAAMe43W4dOnTIa6y1tZVKjyeA7xwAABgWRqNRKSkpstlsstvt6ujokNFoDHZYAABgBMiMj9Q/7jjTZ7x7JSa3WyqpbtH01JjhCg0AAAAAAADwq7q6WnV1dV5jqampMhgMQYpo9COJCQAADIvw8HCddNJJwQ4DAACMIhFmk1KtYSpraPeMkcQEAACAQHK73XzwCAAA+uR0OlVYWOg1ZjablZqaGqSIxgbKHwAAAAAAgBGre0u54qrmIEUCAACAsay9vV27du3y+TASAADAnwMHDshut3uNTZ48mVZyJ4jvHgAAAAAAGLFyEqK0obDGs1xc1RLEaAAAADDWuFwuHT16VAcOHJDL5ZIkJScnKyaG6p8AAMC/5uZmHT161GssLi5OiYmJQYpo7KASEwAAAAAAGLGyE7pVYqomiQkAAAyf1tZWPfbYY1q4cKEmTJigyMhITZs2TXfddZcOHjx4wvs/cOCADAZDv76WL19+4icEH3a73SuBSZIKCgrkdruDGBUAABip3G63CgoKvMYMBoOmTJlCS9ohQCUmAAAAAAAwYvlrJ+d2u7kpBAAAAq6wsFDLli3z+ZBq37592rdvn55//nmtWrVK5513XpAixFAICwtTZmamSkpKPGPNzc0qLS1Venp6ECMDAAAjUXl5uRobG73GJk2apPDw8CBFNLaQxAQAAAAAAIJu19EG/XnzIZU3tKu8sV0JURa9dO0i5SREec1rbHeqpsWuhChLkCIFAADjQVNTk775zW96EphuuOEGXXbZZQoPD9fatWv1yCOPqLGxUd/5zne0YcMGzZkz54SP+dOf/lQXXHBBj+vj4uJO+BjwLyMjQxUVFWptbfWMlZSUKCEhQRYL7zsBAMAxdrtdxcXFXmPh4eGaNGlSkCIae0hiAgAAAedyubR9+3aZzWZZLBZZLBalpaXJZOKtCAAAOKaisV1/+uyQZzkp+tiHRelx4TKbjLI7j7f3KKluIYkJAAAE1OOPP679+/dLkh577DHdfffdnnWLFy/W0qVLtWTJErW2tuqOO+7QunXrTviY6enpmjVr1gnvBwNnNBo1ZcoU7dixwzPW0dGh4uJiTZ8+PYiRAQCAkaSkpEROp9NrLDc3V0ajMUgRjT18JwEAQMDZ7XY1NTWppqZGpaWlKikpkdvtDnZYAABgBEmxhnktVzXb5OhwKcRoUFZ8hNe64qrm4QwNAACMMw6HQ08++aQkafr06brrrrt85nzlK1/R9ddfL0lav369Nm/ePKwxYujFxsYqOTnZa6yyslJ1dXVBiggAAIwkDQ0NKi8v9xpLTEzUhAkTghTR2EQSEwAACDibzea1bDQaqcIEAAC8pMR4JzG53VJV07H3ENkJkV7riqtbhi0uAAAw/qxdu1YNDQ2SpGuuuabHJ+uXL1/uef3uu+8OR2gIsJycHJ97VgUFBXK5XD1sAQAAxgOXy+VpM9wpJCREkydPDlJEYxdJTAAAIOC6JzFZLBYZDIYgRQMAAEaiCZFmmUO8b1OUN7ZLknISo7zGi6tIYgIAAIHzySefeF4vWbKkx3kLFixQRMSxipEbNmwIeFwIPLPZrOzsbK+xtrY2HT58OEgRAQCAkSIpKckruT0rK0sWiyWIEY1NJDEBAICA657EZDabgxQJAAAYqQwGg5Kt3jd+Khr+L4mpeyUm2skBAIAAys/P97yeNm1aj/NMJpNyc3MlSXv27Dnh4/72t79Vbm6uwsLCZLVaNXPmTN10003aunXrCe8b/Zeamqro6GivsYMHD6qtrS1IEQEAgGAzGo2aNGmSFi5cqPj4eEVFRSk9PT3YYY1J9HEBAAAB568SEwAAQHcpMWE6XHv8w6GyziSmRO8kpkO1rXJ2uGQK4dksAAAw9I4cOSJJioyMVGxsbK9zJ06cqC+//FJVVVWy2WwndM+ja7KSzWZTfn6+8vPz9eyzz2rFihX6zW9+M6j9d55PT8rKyjyvm5qa1NjYOOBjDEZzc7Pf1yNBWlqa9u3b51l2u93as2ePJk+eTHXxEW4kX1cYnbimMNS4pka/SZMmqaOjQ01NTcEOxSNY11UgvgckMQEAgICz2+1eyyQxAQAAf5JjwryWKzrbySV4t5NzdLh1pK5NWd0qNAEAAAyFzg9joqKi+ph5LNGpU3Nz86DuecTGxurCCy/U0qVLNWXKFIWFhamsrExr1qzRCy+8oObmZj377LNqamrSqlWrBrz/iRMn9nvuK6+8IqvVOuBjnKhXXnll2I/Zl8zMTKWmpnqWm5qa9MYbb6i2tjaIUWEgRuJ1hdGNawpDjWsKgTCc11VDQ8OQ75MkJgAAEHBUYgIAAP2RavVOYir/vySmuEiz4iJCVdfq8Kwrrm4miQkAAAREe/ux9yBms7nPuV3vcQym3VhaWpqOHj2qiIgIr/G5c+dq2bJluuWWW3T22Wfr0KFDevXVV/Wd73xH3/rWtwZ8HAzckSNHFB8f73UdZGZmqr6+Xi6XK4iRAQAAjF0kMQEAgIDrnsTUn5uAAABg/OleiamznZwkZSdEqu5QvWe5uKpFZ00brsgAAMBINBRtvV588UUtX77cayws7Nh7ku6Vpf3pes8jPDx8wMc3m8293ieZMmWK/vSnP+nMM8+UJP32t78dcBLT4cOHe11fVlamRYsWSZKuuuoqpaenD2j/g9Xc3OypFHDVVVf1q/LVcKurq9OBAwckHbveMjMztWjRIhmNtDUeqUbDdYXRhWsKQ41ravRwOBwKDQ0Ndhj9Eqzr6ujRo3rkkUeGdJ8kMQEAgIByu920kwMAAP2SYvXfTk6SchKjtLVrElN1y3CFBQAAxpno6GhJxz4M6ktLy/H3JIH6sOiMM87QjBkzlJ+fr08++UQul2tASTQZGRn9nhsdHa2YmJjBhHlCoqKignLcvkRHR3vapOTm5vpUzMLINlKvK4xeXFMYalxTI1dLS4t27Nih1NRUZWVlyWQaPak1w3ldNTY2Dvk+R893GgAAjEoOh0Nut9trjCQmAADgj087uYZ2ud1uGQwG5SR6t44rrur7Q0UAADC27dmz54T3kZqa6jOWkZGhzz//XC0tLaqvr1dsbGyP23dWOUpMTAzo/Y7OJKb29nbV1NQoMTExYMfCcQaDQTNmzFBISMiQVP4CAAAjn9vtVkFBgVwul44ePaqqqirl5uby/muYkMQEAAACqnsrOYl2cgAAwL/u7eRsTpfqWx2KizQrJ8E7iamESkwAAIx706YFprfsjBkz9Pbbb0uS9u7dq1NPPdXvPKfTqaKiIknS9OnTAxJLJxJogmc0VV4AAAAnrrKy0lOJUTrWYripqYkkpmFC014AABBQ3ZOYzGYzN94AAIBfSdFhPmPl/9dSLifRuz1LRaNNzTbnsMQFAADGl9NPP93zev369T3O27Jli6ed3GmnnRbQmPLz8yUdq24dHx8f0GMBAACMVw6Hw5Ok3slisSgzMzNIEY0/JDEBAICAstvtXsu0kgMAAD0xm4xKiPJ+r9CZxJQZH6HuedAlVVRjAgAAQ2/p0qWyWq2SpD/+8Y9yu91+57300kue1xdeeGHA4tmwYYN2794t6ViCldHIRzsjRff7XgAAYHQ7cOCAHA6H11hubq5CQkKCFNH4wztdAAAQUN0rMZHEBAAAevOVyfE6a1qSLl80SXeePVWTJkRIkiymEGXEhXvNLa5uDkaIAABgjDObzbr99tslSXv27NETTzzhM2fjxo164YUXJElLlizRwoUL/e7LYDDIYDAoKyvL7/q//OUvPSZJSVJhYaGuuOIKz/L3vve9/p4GAqijo0PFxcX67LPPvNrNAACA0auxsVGlpaVeY/Hx8UpISAhSROMTjXwBAEBARUdHKyUlRTabTXa7XeHh4X1vBAAAxq0nL5/b47qchCgdrm3zLBdTiQkAAATI3Xffrddff1379+/XPffco8LCQl122WUKDw/X2rVr9bOf/UxOp1Ph4eH69a9/PejjXHjhhcrNzdVFF12kRYsWKSMjQxaLRWVlZfrnP/+pF154Qc3NxxK3L730Ul100UVDdIYYrNraWhUUFKi9/VjF0IKCAs2bN48KWQAAjGJut1sFBQVeY0ajUbm5uUGKaPwiiQkAAARUQkICWeoAAGBIZCdEav3+Ks9ySTVJTAAAIDCio6P1/vvva9myZSooKNBzzz2n5557zmtOTEyMVq1apTlz5pzQsQoLC/XYY4/1Oufmm2/Wr371qxM6DoZGa2urJ4FJklpaWnT06FFNnDgxiFEBAIATUVpa6kkc75SZmamwsLAgRTR+kcQEAAAAAABGhcmJkV7LtJMDAACBlJubq23btmnlypV68803VVhYKLvdrokTJ2rZsmX6/ve/r8zMzBM6xnvvvaeNGzfq888/18GDB1VdXa2WlhbFxMQoJydHZ5xxhq677jrNmjVriM4KJyo9PV0VFRVeH3QeOHBAiYmJfNAJAMAoZLPZVFJS4jUWERGhjIyMIEU0vpHEBAAAAAAARoWcxCiv5ZKqFrndbhkMhiBFBAAAxrrIyEjdc889uueeewa1vdvt7nX9+eefr/PPP39Q+0ZwGAwGTZkyRdu2bfOMuVwuFRUVaebMmUGMDAAADEZxcbE6Ojq8xqZMmUKr2CDhuw4AAAAAAEaF7ATvSkwt9g5VNtmCFA0AAADGq5iYGKWmpnqNVVdXq6amJkgRAQCAwairq1NlZaXXWHJysmJjY4MTEEhiAgAAAAAAo0NKTJjCQ0O8xoqqaCkHAACA4Zedna3Q0FCvscLCQp9KDgAAYGRyuVwqKCjwGjOZTMrJyQlSRJBIYgIAAAAAACOIs8Ol+97dqetf2qxvPvmx5j/0oQ7WtEiSjEaDTzWm4qqWYIQJAACAcS40NNTnQ8729nYdOnQoSBEBAICBOHLkiNra2rzGsrOzZTabgxQRJMkU7AAAAMDYVVVVpcOHD8tsNstisSgqKsqn1DYAAEBXphCj3tteqmab0zNW1tCuzPhjyUvZiZHKL2v0rCupJokJAAAAwZGcnKzy8nI1NDR4xg4fPqykpCRFRkb2siUAAAi2lJQUtba2qqKiQpIUHR3NZ1gjAJWYAABAwLS2tqqpqUk1NTUqLS1VVVVVsEMCAACjQIo1zGu5orHd83qyTyUm2skBAAAgOAwGg6ZMmSKDweAZc7vdKiwslNvtDmJkAACgL2azWdOmTdPs2bMVGRnp8zsdwUESEwAACBi73e61bLFYghQJAAAYTVJivJOYyhqOJzHlJEZ5rSumEhMAAACCKDIyUhkZGV5j9fX1qqysDFJEAABgIGJjYzV//nxFR0cHOxSIJCYAABBANpvNa5k+wgAAoD+SuyUxlXdJYsruVonpcG2r7E7XsMQFAAAA+JOZmenz8F5RUZGcTmcPWwAAgJGECkwjB0lMAAAgYLonMVGJCQAA9EeK1fs9Q9d2cjmJ3klMLrd0qJZqTAAAAAiekJAQ5ebmeo05HA4dOHAgOAEBAACMUiQxAQCAgKGdHAAAGIwUa7jXctd2ctFhoUqM7vaUexVJTAAAAAiuhIQExcfHe5YTExM1ceLEIEYEAAC6amtr8/ncCiOPKdgBAACAscnlcpHEBAAABiWlWzu5rpWYpGMt5aqajld8LKkmiQkAAADBl5ubq/b2duXk5GjChAnBDgcAAPwft9utvXv3qrW1VdnZ2UpNTaWF3AhFJSYAABAQ/rLZSWICAAD90T2JqbLJpg6X27M8uVtLueKq5mGJCwAAAOhNWFiY5s+fTwITAAAjTHl5uRobG+V0OlVQUKBt27apvb297w0x7EhiAgAAAWGz2byWDQaDTCaKQAIAgL4lW70TnztcblU3H39vkZ3QPYmJSkwAAAAYGajqAADAyOJwOFRcXOwzZjabgxQRekMSEwAACAh/reS4iQMAAPojIdIik9H7fUN5w/Gn43ISorzW0U4OAAAAAAAA/hQXF8vpdHqNTZkyRUYj6TIjEf8qAAAgILpXYqKVHAAA6C+j0aDkbi3lyhu7JDF1aydX02JXQ6tjWGIDAAAABqOhoUHl5eXBDgMAgHGlvLzc5/dvYmIirV9HMJKYAABAQHRPYqIsJwAAGIjkGO8E6K6VmCZOiPCp1FRc3TwscQEAAAADVVFRoR07dmjfvn2qra0NdjgAAIwL9fX12r9/v9dYSEiIJk+eHKSI0B8kMQEAgIDw104OAACgv1KsPVdiCg0xatKECK/1xVW0lAMAAMDIc+DAAe3du1dut1uSlJ+fr5YW3rsCABBIra2t2r17t+f3b6fJkyfzedUIRxITAAAICNrJAQCAE5ESE+61XNGlEpPk21KOSkwAAAAYibp/eNrR0aGdO3f6PAAIAACGhsPh0M6dO+V0Or3GMzIylJqaGqSo0F+mYAcAAADGJpKYAADAicjLiNHXpiUp2Rqm1Jgw5WVYvdZnJ3gnMZVU8zQ7AAAARp6srCy1tbWpqqrKM2az2bRr1y7Nnj1bISEhQYwOAICxxeVyadeuXWpv934YLj4+Xjk5OUGKCgNBEhMAAAiI1NRUtbW1yW63y2azKSwsrO+NAAAA/s+FczN04dyMHtfnJEZ5LdNODgAAACORwWDQSSedpPb2djU1NXnGm5qatHfvXs2YMUMGgyGIEQIAMDa43W7t27dPjY2NXuNRUVGaPn06v29HCZKYAABAQEyaNCnYIQAAgDEsx08lJpfLLaORG1IAAAAYWUJCQjRr1ixt27bNqzJEdXW1SkpKqAwBAMAQOHjwoCorK73GLBaLZs2aReXDUcQY7AAAAAAAAAAGKjvRO4nJ5nSptKEtSNEAAAAAvTObzX4/RD18+LDKysqCFBUAAGNDW1ubDh065DXWmURssViCFBUGgyQmAAAAAAAw6iRGWRRt8S4wTUs5AAAAjGSRkZGaOXOmTzubgoIC1dXVBSkqAABGv/DwcOXl5clkOn6vaPr06YqKigpiVBgMkpgCqLW1VY899pgWLlyoCRMmKDIyUtOmTdNdd92lgwcPnvD+Dxw4IIPB0K+v5cuX92ufr732ms455xylpKQoLCxMmZmZ+n//7/9p48aNJxwvAAAAAABDxWAwKKdbNabiquYgRQMAAAD0T1xcnKZMmeI15na7tXv3brW0kJQPAMBgxcXFae7cuQoLC1Nubq7i4+ODHRIGgSSmACksLNScOXP0wx/+UFu2bFFdXZ1aW1u1b98+/fKXv9TJJ5+sv/3tb8EO06OtrU3f/OY3dcUVV+jDDz9URUWFbDabDh06pFWrVun000/Xgw8+GOwwAQAAAADjmNvt9lrOTvBOYiqp5kMfAAAAjHypqanKyMjwGuvo6NCuXbtkt9uDFBUAAKNfRESEFixYoPT09GCHgkEy9T0FA9XU1KRvfvObKigokCTdcMMNuuyyyxQeHq61a9fqkUceUWNjo77zne9ow4YNmjNnzgkf86c//akuuOCCHtfHxcX1uv11112nv//975Kkr371q/r+97+vtLQ07dy5Uz/72c9UVFSkBx54QKmpqbrxxhtPOF4AAAAAAPry8sYDWrevSmUN7apobNe1X8nSbV87/tR6TqJ3SfBikpgAAAAwSuTk5Ki9vV3V1dWesfb2du3evVuzZ8+W0UgdAgAABiMkJCTYIeAEkMQUAI8//rj2798vSXrsscd09913e9YtXrxYS5cu1ZIlS9Ta2qo77rhD69atO+Fjpqena9asWYPa9n/+53/05z//WZJ0/vnn69133/X8j71w4UJ961vf0vz583Xo0CH98Ic/1CWXXNJnUhQAYHzbs2ePWltbZbFYZLFYlJSUJKvVGuywAADAKLOnrEn/s7fSs1zW2O613redHElMAAAAGB0MBoOmTZumHTt2qKmpyTNutVplMBiCGBkAACOb2+1WS0uLoqKi+p6MUYc07iHmcDj05JNPSpKmT5+uu+66y2fOV77yFV1//fWSpPXr12vz5s3DGmN3TzzxhCTJZDLp6aef9slMTEhI0KOPPipJqq+v1/PPPz/sMQIARpeWlhY1NzerpqZGpaWlamtrC3ZIAABgFEq1hnktlzd4JzF1byd3tL5N7Y6OgMcFAAAADIWQkBDNnDlTFotFBoNBU6dOVU5ODklMAAD04vDhw/riiy909OjRYIeCACCJaYitXbtWDQ0NkqRrrrmmx3Kfy5cv97x+9913hyM0v5qamvSvf/1LknT22Wf79GDudNFFFykmJkZScOMFAIwONpvNa9lisQQpEgAAMJqlxAwsiUmSSmgpBwAAgFHEYrFo1qxZysvLU2pqarDDAQBgRKusrFRJSYkkqbCwUIWFhXK73UGOCkOJJKYh9sknn3heL1mypMd5CxYsUEREhCRpw4YNAY+rJ5s3b5bdbpfUe7xms1mnnnqqZxuHwzEs8QEARp+Ojg45nU6vMZKYAADAYCR3q8RU0a2dXITZ5FOtiSQmAAAAjDZRUVGKi4sLdhgAAIxojY2N2rt3r9fY0aNH1djYGKSIEAimYAcw1uTn53teT5s2rcd5JpNJubm5+vLLL7Vnz54TPu5vf/tb/fSnP9WRI0dksViUkZGhM844QzfeeKPmzZt3wvF2rl+zZo2cTqcKCgo0Y8aMfsd35MiRXteXlZV5Xre0tPCDBkHV3Nzs9zUQLKPtmmxvb/cZs9lsPolNGJ1G2/WIsY3rESMN1+TQiw7xfv9Q02JXdW29zKbjz2RNigtTWZcKTflHanR6pm+FpvGG6xEjDdckRpKWFhJeAQAAgNGkra1Nu3bt8qm6lJOTI6vVGqSoEAgkMQ2xzmSdyMhIxcbG9jp34sSJ+vLLL1VVVSWbzXZCVSq2bt3qeW2z2ZSfn6/8/Hw9++yzWrFihX7zm9/43X/X5KKeWsl1jbfT4cOHB5TE1HXbvrzzzjv8oMGI8corrwQ7BMDLaLgmY2JivH5HOJ1OPffcc0GMCIEyGq5HjB9cjxhpuCaHhs1llOT9t+evfvcHxYQcrw7c3JoqKd6zvGbjdnV8+f4wRTg6cD1ipOGaRLA1NDQEOwQA6Lfm5mYVFRVpxowZCg0NDXY4AAAMO6fTqV27dvl0i0pNTe0zxwGjD0lMQ6ypqUnSsdKffYmMPP5kaHNz86CSmGJjY3XhhRdq6dKlmjJlisLCwlRWVqY1a9bohRdeUHNzs5599lk1NTVp1apVPcbbn5i7xwsAgD/db6Z0ti0FAAAYKLPBJZNccup45aUWd6hidPymVazR+71GfQdtbAEAADA21NbWKj8/Xx0dHdq9e7dOPvlkGY3GvjcEAGCMcLlcys/PV2trq9d4XFycpkyZIoPBEKTIECgkMQ2xzhY6ZrO5z7ldk5ba2toGfKy0tDQdPXpUERERXuNz587VsmXLdMstt+jss8/WoUOH9Oqrr+o73/mOvvWtb/mNtz8xn0i8hw8f7nV9WVmZFi1aJEm66KKLNHXq1AHtHxhKzc3NnqdCr7rqqn4lJQKBNNquyYqKCpWWlnqWk5OTdfPNNwcxIgyl0XY9YmzjesRIwzUZGB/8bosO1h7/G3TxWf+mf5uZ5Fn+pKhWG17f7VluC43RTTfdNO5vYnE9YqThmsRIsn//fj3yyCPBDgMAelVZWak9e/Z4lhsaGrR//36ddNJJ4/69LgBgfHC73SosLFRdXZ3XeEREhGbMmMHvwzFq3CYxDcUF/eKLL2r58uVeY2FhYZL6V3XCZrN5XoeHhw/4+GazudfEoylTpuhPf/qTzjzzTEnSb3/7W58kps54pb5jPpF4B1LGLTIyUjExMQPaPxAoUVFRXI8YUUbDNVlZWem1HBERMeJjxuAM5/Vot9vV3NyslpYW2e12uVyuYTkuRjan06k5c+ZIOnYzt6WlJbgBYUQJCQlRWFiYYmJiFBkZOew3NUbD7+zRIi02wiuJqdFh9Pre5mWaJB1PYmpqd8oREqaEKCoydeJ6xEjDNYlg61pxHgBGKqvVKrPZ7PXZTUVFhcLDw5WZmRnEyAAAGB5HjhxRWVmZ11hoaKjy8vJkMo3bVJcxj3/ZIRYdHS2pf+3Wun7IEqinz8444wzNmDFD+fn5+uSTT+RyubxKjXbGK/Ud83DECwAY/bomvUoaVLtUoJPb7VZ1dbWqq6uDHQpGIJfLJavV6nntdDqDHBFGEqfTKZvNpoaGBoWHh2vSpEm0XRilUqxhXsvlje1ey2mx4TKbjLI7jye4llS3kMQEAACAUc1isWjWrFnavn2718NcBw4cUHh4uJKSknrZGgCA0a26ulrFxcVeY0ajUbNmzfIq1IKxZ9wmMXUtwTlYqampPmMZGRn6/PPP1dLSovr6esXGxva4fWeLtcTExIB+wNuZxNTe3q6amholJiZ6xdvpyJEjWrBgQZ/xStLEiRMDEywAYNQjiQlDqaysTA0NDV5jBoNBISEhQYoII4nb7fYk14eGhlI+GF46OjrkdrslHWuHfejQIWVmZnKdjEI+SUwN3klMIUaDsuIjtL/i+IM5xVXNWpg1YVjiAwAAAAIlOjpa06dP1+7du73G9+7dK4vF4nmwBwCAsaSpqclvPse0adOo6jsOjNskpmnTpgVkvzNmzNDbb78t6dibyFNPPdXvPKfTqaKiIknS9OnTAxJLp95u0s+YMcPzeu/evb3up3O9yWTSlClThiY4AMCY0z2JqbfWp0Bv2tvbvRKY4uPjFRMTI4vFQhICJB1LUulsYZmUlERyG7y4XC41NzervLxcHR0damtrU0tLC1VlR6GUmN4rMUlSTkJUtyQm2ksCAABgbEhISNDkyZM9nylJxx7q2b17t+bOnavw8PAgRgcAwNBqb2/Xrl27vKoQSlJ2drZXsRaMXdTSH2Knn3665/X69et7nLdlyxZPe7bTTjstoDHl5+dLOlYJIz4+3mvdwoULPR8u9xav3W7XZ5995tkmNDQ0QNECAEYzt9stu93uNUYlJgxWfX2953VSUpKSkpIUFhZGAhOAfjEajYqJiVFKSopnrKmpKYgRYbCSuycxNfgmMWUnRnotF1eTxAQAAICxIz09XWlpaV5jDodDu3btorU6AGBMqa+v9/mcKSUlhU5R4whJTENs6dKlnvKdf/zjHz3tC7p76aWXPK8vvPDCgMWzYcMGT5nR008/XUaj9z95dHS0vva1r0mSPvroIx05csTvft555x01NjYGPF4AwOjW/Y2lRBITBq+1tdXzurcWvQDQm6ioKE/yY1tbW5CjwWCkdmsnV9HYLpfL+2/tnIRuSUxVzQIAAADGCoPBoNzcXMXFxXmNt7a2avfu3T7VKgAAGK1SUlI0Y8YMT15DbGyspkyZwsPN4whJTEPMbDbr9ttvlyTt2bNHTzzxhM+cjRs36oUXXpAkLVmyRAsXLvS7L4PBIIPBoKysLL/r//KXv/SYJCVJhYWFuuKKKzzL3/ve9/zO+8EPfiDpWIu7W265RR0dHV7rq6ur9cMf/lDSsR8S3/3ud3s8JgBgfOveSs5gMFC9D4PW+Z7EZDLRJgzAoBmNRs/PkO5/62B0SI8L19nTk3TlKZN019en6pGL8tTR7W/hnETvNoGHalvl7OCDHAAAAIwdBoNBM2bMUGSkdwJ/fX29CgoKev28CACA0SQxMVGzZ8+W1Wr1SmjC+GAKdgBj0d13363XX39d+/fv1z333KPCwkJddtllCg8P19q1a/Wzn/1MTqdT4eHh+vWvfz3o41x44YXKzc3VRRddpEWLFikjI0MWi0VlZWX65z//qRdeeEHNzceePr300kt10UUX+d3PWWedpcsuu0x//vOf9d577+nrX/+67rjjDqWlpWnnzp16+OGHdejQIUnSo48+6pPpDwBAJ7PZrMzMTNntdtlsNrndbrLjAQDACUmIsuj5a/w//NOpeyUmR4dbR+ralNVtHAAAABjNTCaTZs2apa1bt8rhcHjGy8vLFR4erkmTJgUxOgAAhk5MTIxmz57NZ0zjEElMARAdHa33339fy5YtU0FBgZ577jk999xzXnNiYmK0atUqzZkz54SOVVhYqMcee6zXOTfffLN+9atf9TrnD3/4gxobG/X3v/9da9eu1dq1a73WG41G/dd//ZduvPHGE4oXADC2hYWF9VhBEAAAIFDiIs2KiwhVXevxD3KKq5tJYgIAAMCYExYWplmzZmnHjh1ebeRKSkoUHR3Ng+gAgDGDBKbxiSSmAMnNzdW2bdu0cuVKvfnmmyosLJTdbtfEiRO1bNkyff/731dmZuYJHeO9997Txo0b9fnnn+vgwYOqrq5WS0uLYmJilJOTozPOOEPXXXedZs2a1ee+wsPD9f777+vVV1/VSy+9pB07dqi+vl7Jyck644wzdOutt2rx4sUnFC8AAAAAAIGSnRCpukP1nuXiqhadNS148QAAAACBEhMTo2nTpik/P98zlpKSIqvVGsSoAAAYmObmZnV0dPD7C15IYgqgyMhI3XPPPbrnnnsGtX1f/YvPP/98nX/++YPad0+uuOIKXXHFFUO6TwAAAAAAAi0nMUpbuyYxVbcELxgAAAAgwBITE5WTk6Pi4mJlZ2dr4sSJVKwAAIwaNptNO3fulMPh0LRp05SUlBTskDBCkMQEAAAAAABGvZxE79ZxxVXNQYoEAAAAGB4ZGRmyWq2KiYkJdigAAPRbR0eHdu3aJbvdLknas2eP2traNGnSJBJyIWOwAwAAAACAkeall16SwWCQwWDQgQMHgh1O0K1bt87z/Vi3bl2wwwHk7HD5jOUkeCcxlVCJCQAAAGOcwWAggQkAMKq43W7t2bNHzc3eD5/V1dX12akK4wOVmAAAAAAAwIi2/XC9fvPRfpU1tKuisV0JURZ9+B9LvObkJEZ5LVc02tRscyrKwq0PAAAAjE8dHR0yGo1UtQAAjBhFRUWqqanxGgsPD9fMmTNlNFKDByQxAQCAIeJ0OrVp0yZZLBaZzWZZLBbl5OTIZOLtBgAAODHtjg6t3VflWXZ2+D6ZlxkfIYNB6vrQXklVi/IyrMMRIgAAADCitLe3a+fOnUpNTVVGRkawwwEAQKWlpTp69KjXmMlk0qxZsxQaGhqkqDDS8KkiAAAYEjabTQ6HQw6HwzOWm5sbxIgAAENl6dKllHNGUKXEhHktN9mcPlWWLKYQZcSF63Btm2esuLqZJCYAAACMO42Njdq1a5ccDoeKiopkMpmUkpIS7LAAAONYRUWFCgoKvMYMBoNmzpypiIiIIEWFkYh6XAAAYEjYbDav5dDQUEp/AgCAIZFiDfMZK29o9xnLSfBuKVdc1RKwmAAAAICRyGazaceOHV4PGu7bt08lJSU8nAIAGHZut1sHDhzQ3r17fdZNnTpVsbGxwx8URjQ+WQQAAEOiexKTxWIJUiQAAGCsCQsNUWyEd1nxikY/SUyJkV7LxdUkMQEAAGB8sVgsmjRpks/4oUOHtGfPHnV0dAQhKgDAeORyubR3714dPHjQZ92kSZOoEgi/SGICAABDonsSk9lsDlIkAE7U2rVrdc011ygnJ0cRERGKiYlRXl6e7r77bpWWlva43QMPPCCDwSCDwSBJam9v1+OPP6558+YpOjpa0dHRWrRokZ566ik5nU6f7V9++WXP9h9++GGfcd58881KS0tTVlaW6urqhvRc+quqqko//vGPNXfuXMXGxiosLExZWVm66qqr9Mknn/S6bVZWlgwGg5YvXy5J2rx5sy6//HJNnDhRYWFhmjhxoq699lq/Tyn5U1hYqDvvvFN5eXmyWq0KDw9XTk6Oli9fri1btpzQea5bt87zb7Nu3boT2hcwWN1bypX5rcTkncRUUt0c0JgAAACAkWjSpEmaOHGiz3hVVZV27Nghu90ehKgAAOOJw+HQl19+qcrKSp916enpysrKGv6gMCqQxAQAAIZE95sfVGICRp/29nZdfvnlOuuss/Tyyy+rpKREbW1tampq0q5du/TEE09o6tSpWr16dZ/7qqio0OLFi3XPPfdo27Ztam5uVnNzszZv3qzbbrtNF110kVwul9c2F154ocLDwyVJr776aq/7dzgcevvttyVJZ511luLi4gJ2Lj1Zs2aNcnNz9fDDD2v79u1qaGiQzWbTwYMH9ac//UlnnHGGbr31Vp/z9OcPf/iDvvKVr+jPf/6zjhw5IpvNpiNHjuill17SnDlz9Oabb/a6/RNPPKEZM2bo17/+tXbt2qXGxka1t7erpKREf/zjH7Vo0SLdf//9gz5XYCRI7pbE5L8Sk3c7uZKqFlpmAAAAYNwxGAzKycnRlClTfNY1NTVp27ZtammhaikAIDBaW1u1bds2NTQ0+KzLzc1Vbm6u50FYoDuSmAAAwJCgnRwwurndbl188cX685//LEk6//zz9corr2jDhg3auHGjfvOb32jSpElqaWnRxRdf3Gdln4suukj5+fm6/fbb9eGHH+qLL77Qq6++qunTp0uSVq9erd///vde20RHR+tb3/qWJOmdd95Re7tvgkKnDz74QLW1tZ5jBfJc/Nm+fbvOP/98NTY2KjQ0VHfeeafWrl2rTZs26dlnn1V2drYkaeXKlbr33nv73NdNN92kpKQk/fa3v9Xnn3+u9evX64c//KEsFotsNpuuvPLKHuN8/PHHdffdd8vhcOjkk0/WM888o48++khbtmzRqlWrtHjxYrndbj300EN68sknB3yuwEiRavVOYir3V4mpWzu5FnuHKhptPvMAAACA8SAtLU15eXkKCQnxGm9vb9e2bds8f1cDADCUbDabz73dkJAQzZo1S+np6UGKCqOFKdgBAACAsYF2cgi2mubBf0gdaTEpLDTE77raFvugq3iEm0MUYfb/lru+1a4OV//3Gx8V2MTA559/Xu+//75CQ0P13nvv6dxzz/Vaf+qpp+qqq67SGWecod27d+uOO+7otV3a5s2btWbNGi1dutQzNm/ePH3jG9/QjBkzVFFRoaefflorVqzw2u7KK6/U66+/rsbGRv3tb3/TxRdf7Hf/nZWaoqOjdfbZZwf0XPy58cYbZbfbFRISor/97W8655xzPOsWLlyoSy65RKeffrry8/P1xBNP6Oqrr9bMmTP97mvHjh3KzMzUZ5995tUH/swzz9Q3vvENnXPOOXI4HPre976nTZs2eW2bn5+vH/3oR5Kkn/zkJ/rJT37i9RTT/Pnzddlll+maa67Rn/70J/3oRz/SVVdd5VO5ChgNuldi8tdOLjk6TOGhIWpzdHjGiqubldItAQoAAAAYLyZMmKC5c+dq586dXvfvOjo6tHPnTk2dOlWpqalBjBAAMNbExcVp6tSp2rdvn6RjD73PmjVLUVFRfWwJkMQEAACGCO3kEGzzf/rRoLf97wtm6urFWX7Xnf3L9aptsftd15fvf22K7vz6VL/rLvndRhVUNvd7Xwd+/s1BxdAfbrdbjz76qCTp9ttv90n66RQXF6fHH39cy5Yt04YNG1RQUOC3NL0k3XbbbV4JTJ0mTJiga6+9Vj//+c+1c+dONTQ0yGq1etafe+65io+PV01NjVatWuU3iam5uVnvvfeeJGnZsmUKCzuenBCIc+lu06ZN2rx5syTphhtu8Epg6rr/5557TqeffrpcLpeefvpprVy5ssd9/uIXv/BKYOr01a9+VTfccIOeeeYZbd68WVu2bNGCBQu8tnM4HFqwYIFPAlMno9Go3/72t3rzzTfV3Nyst956SzfccEO/zhUYSbonIvlrJ2c0GpSdEKn8skbP2FP/U6iZqVZZI0IDHiMAAAAwEkVGRmrevHnatWuXmpqavNbt379fra2tysnJobUPAGDIpKSkqLW1VXV1dZo1axafGaHfaCcHAABOmMvlksPh8BrjDSkweuTn56uoqEiSeqx81OnMM8/0vN64cWOP86688soe182fP1/SsYSjkpISr3WhoaG65JJLJB1rGVdfX++z/bvvvqu2tjZJvq3kAnEu3X300fGEueuvv77HeaeddpqnfV7XbbqLi4vTBRdc0OP66667zu+xpWNt+STp29/+dq83m2NjY5WXlydpYOcKjCTdk5jK/SQxSdJJKdFey58W1ejCpzeoqKr/iaMAAADAWGM2mzV79mwlJib6rDty5Ijy8/MHXYkaAAB/srOzNWfOHD4vwoCQxAQAAE5Y91ZyEklMwGiyZcsWz+vFixfLYDD0+NW15G95eXmP+5w2bVqP6yZMmOB53f0JUOl4ApTNZtNbb73ls76zlVxaWppOO+20gJ9Ld7t27ZJ07AbwnDlzep17yimnSJIKCgp8KtZ1mjt3rkymnovkzpkzx9Oic+fOnZ7xgwcPqqqqSpJ077339nquBoPB870ZyLkCI0lKt3Zy1c02OTpcPvOuXpwps8n7dkdxdYv+feUG/e/+qoDGCAAAAIxkISEhmj59uiZOnOizLiwsjEpMAIABsdvtnvuT/hgMBoWEhAxjRBgLSGICAAAnrHsSk9Fo5I0pMIpUVlYOarvW1tYe10VERPS4zmg8/mdIR0eHz/rTTjtNmZmZkqRVq1Z5rausrPRUI7r00ku99tW5fjB6O5fuamtrJR1Lxuot+UiSp0Wc2+1WXV2d3zlJSUm97sNkMnkSvzqPLQ3PuQIjSfckJrdbqmzyTaSeOylOf77xVCVEeSdUN7U7tfzFTXpxQwlPmAMAAGDcMhgMysnJ0UknneRJWkpISFBOTk6QIwMAjCYtLS3atm2b8vPzVVNTE+xwMIb0fscdAACgH7pXF7FYLDy5hWH3xY/PHvS2kZae3xZ/9B9LBv1hd7i552S+N29arA7XyPgQvWsi0erVq5WVldWv7fpKvhksg8GgK664Qo888oj+93//V0ePHlV6erok6Y033pDT6ZQkXXHFFT7bDue5DNXPucHup+u53n///Z42fH2JjIwc1PGAYIuNCJXFZJTNebz6UnlDu9Jjw33mzpsUp/duPU03vLxFu0sbPeMut/Tg6nztr2jSg9+a5VOxCQAAABgvUlJSZLFYdPjwYU2bNo17eQCAfqurq9Pu3bs99yf37NmjOXPmeFW+BwaLJCYAAHDCuldiopUcgiE+KjDX3YRIc0D2GxsRmP0ORnx8vOd1bGysZs2aFcRojrnyyiv1yCOPyOVy6bXXXtMPfvADScdbyU2bNk3z5s3zqUY0HOfSWRWppqZGTqez12pMna3bDAaD4uLi/M6pqKjo9XhOp9Or+lOnrucaGho6Iv7dgEAyGAxKsYbpYM3xamLlDe09zk+LDdebNy3WD97cob/v9G6j+NqmwyqqatHv/t/8gP2cBwAAAEa6uLi4Hv9WBQDAn7KyMu3fv99rrKOjQwUFBZozZw5JsThhPHIIAABOWPckJrOZDwOB0WTu3Lme1xs2bAhiJMfNnDlTs2fPlnQ8camkpEQbN26UdCzJyZ/hOJfOZCG73a7t27f3OnfTpk2SpClTpvT4s3H79u2e6lL+7Nixw1PxrmuiUk5OjqxWq6SR8+8GBNp5J6fqqlMzdfc3TtITl8zW7InWXudHmE166vJ5uuPsKT7rNpXU6oKVn2hfeVOgwgUAAABGtebmZhUXF9OOGQAgt9utoqIinwQmSYqOjtbMmTNJYMKQIIkJAACcsPj4eGVlZSk1NVUTJkxQTExMsEMCMADz5s1TRkaGJOm5555Te3vPlU2GU2ei0rZt27Rnzx5PMpPkv5WcNDzncvbZx1sX/uEPf+hx3saNG5Wfn++zTXe1tbVavXp1j+u7HqPrfkJCQrRs2TJJ0po1a7Rnz56+gwdGubu/MU0P/fss3fLVXF08P0MZcRF9bmM0GnTH2VO18op5Cgv1vg1yuLZNFz29QR/l914RDQAAABhv7Ha7du3apcOHD2vXrl1eLc0BAONLR0eH8vPzdeTIEZ91CQkJmj17Ng+3Y8iQxAQAAE5YXFycMjMzNXXqVOXl5Sk9PT3YIQEYAKPRqPvuu0+SVFxcrKuvvtqnwlpXjY2NeuqppwIe1+WXX+55emfVqlV67bXXJEmLFy9WTk6O322G41wWLVqkBQsWSJJ+//vf61//+pfPnIaGBq1YscIT080339zrPv/jP/7Db1u59evX67nnnpMkzZ8/XwsXLvRaf++99yokJEQul0sXX3yx3xsJnTo6OrRq1ape5wBj2TdPTtVbN31FKTFhXuMt9g7d8MoW/W59EU+YAwAAADr29+OuXbs8f0/X1tZq+/btvf59DQAYm2w2m3bs2KHq6mqfdRMnTtSMGTMUEhIShMgwVpmCHQAAAACA4Lvpppv04Ycf6t1339Wbb76prVu3asWKFVq0aJGsVqsaGxu1d+9erVu3Tu+9957CwsJ06623BjSmjIwMLVmyROvWrdPKlStVX18vqedWcsN5Lr///e91yimnyG63a9myZbrtttt0/vnnKzIyUtu2bdPPf/5zFRcXS5J+8IMfeLWB62727NnKz8/X/Pnzde+992rRokWy2Wz6+9//rl/96ldyOp0ymUxauXKlz7Z5eXl64okndOeddyo/P1+zZs3SjTfeqLPOOkvJyclqb2/XgQMHtHHjRr311lsqKyvTzp07PdWqgPFmVrpV7916mm585QttP1zvGXe7pZ9/sFf7y5v0s4vyFBbKzTcAAACMX01NTWpubvYaa25u1tatWzVr1ixFR0cHKTIAwHBqbm72SmrtZDAYNGXKFKWmpgYpMoxlJDEBAAAAkMFg0Ouvv67vf//7+t3vfqeioiLdc889Pc5PSkoalriuvPJKrVu3zpPAZDKZdOmll/a6zXCcy5w5c7R69Wpdcsklamxs1C9+8Qv94he/8Jl3yy236JFHHulzX7feeqtuvvlmv8lUZrNZf/zjH3XKKaf43f6OO+5QZGSk7rjjDjU0NOjxxx/X448/7neu2WxWWFiY33XAeJEUE6Y/33iq7n1np97ddtRr3TvbjqqkpkXPXjVfSdH8vwIAAIDxKTY2VieffLJ2794tp9PpGbfb7dq+fbumT5+uhISEIEYIAAi02tpa5efn+7QTNZlMmjFjhuLi4oIUGcY62skBAAAAkCSFhobq6aef1o4dO3TbbbcpLy9PVqtVISEhslqtmjNnjq6//nq99dZb2rNnz7DEdPHFF8tisXiWzznnHCUmJva53XCcyznnnKPCwkLdd999mjNnjmJiYmSxWDRp0iRdeeWV+vjjj/XUU0/JaOz7z67vfve7+vjjj3XppZcqLS1NZrNZ6enpuvrqq7Vt2zZddtllvW5/ww03qLi4WA8++KBOO+00JSQkyGQyKTIyUlOnTtW3v/1t/e53v9PRo0eVm5s7qPMFxpKw0BD98tLZ+uG50/R/XSs9th2q1wVPbdCuow3BCQ4AAAAYAWJjYzVv3jyFh4d7jbtcLu3evVtHjhyhHTMAjFFHjx7Vzp07fRKYwsLCNHfuXBKYEFBUYgIAAADgJS8vT08++eSAt3vggQf0wAMP9Dlv6dKl/b7RGRsbq/b29gHH0mmw57J8+XItX768z3mJiYl6+OGH9fDDDw8iOm+nnnqqXn/99UFvn5ycrPvvv1/333//CcfS3UD+zYDh1O7oUGiIUSFGQ9+TuzEYDLp56WTlJkXpjj9vU4v9+I25soZ2XfK7jfrlpbP1b3mURgcAAMD4FB4errlz52r37t1qaPBO8i8qKlJra6umTJkiQ/cnAwAAo1Zzc7MKCwt9xmNiYjRz5kyZzeYgRIXxhEpMAADghPChNgAAGC5ut1vXvbRZ5/76fzX7wTWa9l//0L7yphPa59dnJOvt731FGXHeT5i3OTp086qt+s1HBbzfAQAAwLgVGhqqk08+WcnJyT7rysrKtHPnTq+WcwCA0S0qKkrZ2dleY4mJiZo9ezYJTBgWJDEBAIATUlZWpk8//VRffPGFdu7cqUOHDgU7JAAAMEYZDAbtOtqgveVNamhzSJIqGgdfra3TtJQY/fWW07Qoa4LPul99tF+3vrZNbfYOP1sCAAAAY5/RaNRJJ52krKwsn3V1dXXavn37CVVRBgCMLBMnTlRKSookKTMzU9OnT5fRSGoJhgdXGgAAOCE2m00Oh0PNzc2qra1VU9OJVUMAAADoTYo1zGu5rGFoPiyJj7LoT989RZctnOiz7v0vy3TJs5+qrKFtSI4FAAAAjDYGg8HzQXb39nEtLS3aunWrGhsbgxQdAGAoGQwGTZkyRXl5ecrKyqJtKIYVSUwAAOCE2Gw2r2WLxRKkSAAAwHiQHOOdxFQ+BJWYOplNRj1yUZ7uP2+GjN3uz+062qhvPbVB2w7VDdnxAAAAgNEmKSlJs2fPVmhoqNe4w+FQeXl5kKICAAyG3W7vcZ3RaNSECb4Vq4FAI4kJAACckO5JTPREBgAAgZTarRJTxRBVYupkMBh03enZevHaRYoOM3mtq2qy6TvPfaa/bDs6pMcEAAAARhOr1aq5c+cqIiLCayw3NzeIUQEA+svtduvIkSP6/PPP1dDQEOxwAC8kMQEAgBPSPVOfSkwA0D8HDhyQ2+3WSy+9FOxQgFGleyWmsiGsxNTVkqmJevd7pykrPsJr3O506Y7Xt+uxf+yVy+UOyLEBAACAkS48PFxz585VbGyswsPDNXPmTBmNfOwIACOd2+1WYWGhioqK5HK5tHv3brW1tQU7LMCDdxMAAOCE0E4OAAAMp5SYwFZi6io3KUp/ueU0nZYb77Pu6XVFWvGnL9Rscwbs+AAAAMBIZjKZlJeX57e9HABg5HE6ndq1a5dKS0s9Yw6HQ7t27VJHR0cQIwOOI4kJAAAMmtPp9HljSxITAAAIpO7t5MoDVImpU2yEWS9du0jXLM70WfdhfoUufuZTHa5tDWgMAAAAwEhlNBp7vR/Y3t5OhQ8AGAHa29u1fft21dbW+qxLSkqimh5GDK5EAAAwaN2rMEmS2WwOQiQAAGC8SO6WxNTQ5lCbPbBPC4aGGPXgBbP08IWzZDIavNbtLW/SBSs3aFOJ701AAAAAYDxzOp3auXOntm3bpoaGhmCHAwDjVmNjo7Zu3aqWlhavcYPBoOnTpyszM1MGg6GHrYHhRRITAAAYNLvd7rVsMpkUEhISpGgAAMB40L2dnBT4akydrjwlU69cf4piI7xbZdS22HXl85/p9c2HhiUOAAAAYKRzuVzKz89Xa2urHA6HduzYocrKymCHBQDjTlVVlXbs2CGHw+E1HhoaqtmzZyspKSlIkQH+kcQEAAAGrXslJlrJAQCAQIu0mBQdZvIaK28YniQmSVo8OV5/veU0TUmK8hp3dLj1w7d36qG/5cvZ4Rq2eAAAAICR6PDhw6qrq/Msu91u7dmzRyUlJXK5eL8MAIHmcrl08OBB5efn+/zcjYiI0Ny5c2W1WoMUHdAzkpgAAMCgdU9iopUcAAAYDt2rMZU3tg3r8TPjI/XO976ir56U6LPuhU9KdP0ft6ix3eFnSwAAAGB8SE9PV1xcnM/4oUOH9MUXX6i+vn74gwKAcaKhoUFbt27VgQMHfNbFxsZqzpw5Cg8PH/7AgH4giQkAAAxa93ZyVGICAADDIcXaLYmpwdbDzMCJDgvV89cs1I1n5visW7+/Sheu3KCS6pZhjwsAAAAYCUwmk/Ly8pSWluazrrW1VTt27NDevXt97i8CAAbP4XBo37592r59u1pafO9JpKSkKC8vT6GhoUGIDugfU99TAAAA/KOdHAAACIbulZgqGoevnVxXIUaD7ls2XVOTo3XfOztl79JGrqiqRf++coO+Nj1JBhmGPTaHw659LemSpKOr9yk0lIqZCC6uSfTknnNPUnK3n+sAgLHBYDAoNzdX4eHhKioq8llfUVGhmpoaZWdnKzU1VQbD8L9vBoCxxO12q6qqyu+67OxsTZw4kZ+1GPFIYgIAAINGEhMAAAiG7pWYyhqGt51cdxfPz1B2QoRWvPKFqpuPP0ne0ObQO1uPBjGyY+079u2sDGIMQFdck/B189IckpgAYAwzGAzKyMiQ1WrV/v371dzc7LXe6XSqoKBA5eXlmjJliqKjo4MUKQCMfmazWdnZ2SosLPSMRUZGasqUKbJarUGMDOg/kpgAAMCgdU9iMpt5mhoAAATegqwJuurUTKVYw5QSE6bcpKhgh6T5mRP011tP13f/uEV7yhqDHQ4AAAAwokRHR2vevHkqLS1VSUmJOjo6vNY3NTVp69atSk9PV1ZWlkwmPsIEgMFIS0tTeXm52tralJWVpfT0dKovYVThHQAAABi0nJwc2Ww22Ww22e12hYeHBzskAAAwDiyZmqglUxODHYaP9NhwvXXTYv3HG9v1z90VwQ4HAAAAGFEMBoPS09OVmJiooqIiVVb6VmcsKytTRkYGSUwA0AO3262amhpZrVaFhob6rDcYDJo2bZpMJhPdMzAq8Q4AAAAMWkpKSrBDAAAAGFEiLSY9c+V8/X1XmXYebZDcwYnDZrdr+7ZtkqQ5c+fKQsVMBBnXJHpiDedaAIDxxmw2a/r06UpJSVFBQYHa2o63h87MzFRYGG1GAcCftrY2FRYWqra2VqmpqZo6darfeZGRkcMcGTB0SGICAAAAAAAYQkajQeednKbzTk4LWgyNjY16Zt8/JEk3n5WtmJiYoMUCSFyTAADAV1xcnBYsWKDDhw/r0KFDCgsLU0ZGRrDDAoARx+VyeX5WulwuSccq1yUnJ8tqtQY5OmBoGYMdAAAAAACMNC+99JIMBoMMBoMOHDgQ7HAAAAAAABiTjEajMjMztWDBAk2bNk1Go/+PLp1Op2pra4c5OgAIvrq6Om3ZskUHDhzwJDB1KigokNsdpBLQQIBQiQkAAAAAAAAAAABA0ISHh/e6/uDBgzpy5IgSEhKUm5sri8UyTJEBQHDY7XYVFRWpsrLS73qz2axJkyYNc1RA4JHEBAAAAAAARrU2e4ecLpeiw0KDHQoAAACAIdbc3KwjR45Ikqqrq1VXV6esrCylp6fLYDAEOToAGFput1ulpaUqKSlRR0eH3znp6enKysqSyUS6B8YermoAADAobrebmwQAACBoVq4t1HvbS1Xe2K6GNoduWjJZ//lv04IdFgAAAIAh5Ha7VVBQ4DXW0dGhoqIilZeXa8qUKbJarUGKDgCGVlNTk/bv36/m5ma/66OjozVlyhRFR0cPc2TA8CGJCQAADMqOHTvU0tIii8Uii8WijIwMxcXFBTssAAAwTtS12LWvosmzXN7QFsRoAAAAAARKSkqKWltb5XQ6vcZbWlq0fft2paSkKCcnR6GhVGYFMDo5nU6VlJSotLTU73qTyaTs7GylpqbycDnGPJKYAADAoNhsNjmdTjmdTrW0tCglJSXYIQEAgHEkxRrmtVze2B6kSAAAAAAEisFgUGpqqhISElRcXKzy8nKfOeXl5aqpqVFOTo7Cw8ODECUADJ7T6dTmzZtlt9v9rk9OTlZOTo7MZvMwRwYEhzHYAQAAgNHH7XbLZrN5jVksliBFA2CorV27Vtdcc41ycnIUERGhmJgY5eXl6e677+7xaSBJeuCBB2QwGDxPA7W3t+vxxx/XvHnzFB0drejoaC1atEhPPfWUz9OTkvTyyy97tv/www/7jPPmm29WWlqasrKyVFdXN6Tn0l9VVVX68Y9/rLlz5yo2NlZhYWHKysrSVVddpU8++aTXbbOysmQwGLR8+XJJ0ubNm3X55Zdr4sSJCgsL08SJE3Xttddq7969/YqlsLBQd955p/Ly8mS1WhUeHq6cnBwtX75cW7ZsOdFTlSS1tbXpZz/7mWbPnq3IyEjFx8frtNNO0+9//3u5XC6tW7fO82+4bt26ITkm0JPuSUwVjbYeZgIAAAAY7UJDQ3XSSSdpzpw5ioyM9FnvcDi0b98+FRQUkMgEYFQxmUxKSEjwGY+IiNDs2bM1bdo0EpgwrlCJCQAADJjD4ZDb7fYa4000MPq1t7fr2muv1Z///Gefdbt27dKuXbv0zDPP6LXXXtP555/f674qKip07rnnavv27V7jmzdv1ubNm7VmzRr95S9/kdF4/LmKCy+8UDfddJPa2tr06quv6utf/3qP+3c4HHr77bclSWeddZZPO8uhPJeerFmzRpdccokaGxu9xg8ePKiDBw/qT3/6k2655RY9+eSTXufpzx/+8AetWLHCK7nryJEjeumll/Taa6/plVde0SWXXNLj9k888YTuu+8+ORwOr/GSkhKVlJTo5Zdf1o9//GP993//9yDO9Jjy8nKdddZZ2rNnj2estbVVn376qT799FO9/fbb+o//+I9B7x8YqJQY7ySmsoY2ud1uyqoDAAAAY5jVatW8efN09OhRHThwQC6Xy2t9S0uL8vLyVF5ero6OjiBFCQADk52draqqKjkcDhmNRmVmZiojI6PPe4rAWMRVDwAABsxfWVOSmIDRze126+KLL/Yk/Zx//vl65ZVXtGHDBm3cuFG/+c1vNGnSJLW0tOjiiy/us7LPRRddpPz8fN1+++368MMP9cUXX+jVV1/V9OnTJUmrV6/W73//e69toqOj9a1vfUuS9M4776i9vefWUB988IFqa2s9xwrkufizfft2nX/++WpsbFRoaKjuvPNOrV27Vps2bdKzzz6r7OxsSdLKlSt177339rmvm266SUlJSfrtb3+rzz//XOvXr9cPf/hDWSwW2Ww2XXnllT3G+fjjj+vuu++Ww+HQySefrGeeeUYfffSRtmzZolWrVmnx4sVyu9166KGH9OSTTw74XKVjZa3PO+88TwLTOeeco3fffVdbtmzRO++8o7PPPlv//Oc/9eMf/3hQ+wcGI7lbElO7w6XGNt8qbwAAAADGFqPRqIkTJ2rhwoV+q5cYjUalpaVpz549fitBA0CwdH84vJPJZNLkyZMVHx+vhQsXatKkSSQwYdyiEhMAABiw7q3kzGYzb6gRfC3Vg9/WHCmF9lBqvKVGkv8/LvsUGn5s3/601kpul/91/kT63pQbSs8//7zef/99hYaG6r333tO5557rtf7UU0/VVVddpTPOOEO7d+/WHXfc0Wu7tM5qS0uXLvWMzZs3T9/4xjc0Y8YMVVRU6Omnn9aKFSu8trvyyiv1+uuvq7GxUX/729908cUX+93/q6++KulY4tPZZ58d0HPx58Ybb5TdbldISIj+9re/6ZxzzvGsW7hwoS655BKdfvrpys/P1xNPPKGrr75aM2fO9LuvHTt2KDMzU5999plSUlI842eeeaa+8Y1v6JxzzpHD4dD3vvc9bdq0yWvb/Px8/ehHP5Ik/eQnP9FPfvITryo08+fP12WXXaZrrrlGf/rTn/SjH/1IV111lU/lqr48++yz+uKLLzzn/uyzz3od48ILL9T111+vP/zhDwPaL3AiuicxSVJ5Y7usEaFBiAYAAADAcAsLC9PMmTNVU1OjwsJCn4ehoqKiZDLxUSiA4Gtvb1dRUZFiYmJktVr9zklKSlJycvIwRwaMPPzmBgAAA9Y9iclisQQpEqCLxycPfttlT0iLbvC/buVCqbVmcPtd8p/SV3uowvPiv0lVe/u/rwcaBhdDP7jdbj366KOSpNtvv90n6adTXFycHn/8cS1btkwbNmxQQUGBpkyZ4nfubbfd5pXA1GnChAm69tpr9fOf/1w7d+5UQ0OD1x/u5557ruLj41VTU6NVq1b5TWJqbm7We++9J0latmyZwsKOJzIE4ly627RpkzZv3ixJuuGGG7wSmLru/7nnntPpp58ul8ulp59+WitXruxxn7/4xS+8Epg6ffWrX9UNN9ygZ555Rps3b9aWLVu0YMECr+0cDocWLFjgk8DUyWg06re//a3efPNNNTc366233tINN/Rwvffg6aefliQlJyfrV7/6ld85v/nNb7R69WpVVVUNaN/AYJlNRiVEmVXdfLxCZFlDm05KiQ5iVAAAAACGW3x8vGJjY3Xo0CEdPnxYbrdbTqdT6enpwQ4NwDjncrm82l/W1dVp2rRpfuf6u68HjEeUTAAAAAPmrxITgNErPz9fRUVFktRj5aNOZ555puf1xo0be5x35ZVX9rhu/vz5ko4lHJWUlHitCw0N1SWXXCLpWMu4+vp6n+3fffddtbW1SfJtJReIc+nuo48+8ry+/vrre5x32mmnedrndd2mu7i4OF1wwQU9rr/uuuv8Hls61pZPkr797W/3eqMjNjZWeXl5kgZ2rpJUVlam/Px8SdKll16qiIgIv/OioqJ06aWXDmjfwInqXo2porHnNpQAAAAAxq6QkBBlZ2dr2rRpamho0KFDhxQaSpVWAMHT0NCgrVu3qri4WC7XsYr8HR0dOnr0aJAjA0Y2kpgAAMCA2e12r2UqMQGj25YtWzyvFy9eLIPB0ONXVFSUZ255eXmP++zpiSLpWDWmTk1NTT7rOxOgbDab3nrrLZ/1na3k0tLSdNpppwX8XLrbtWuXpGMJnHPmzOl17imnnCJJKigo8PnZ2Wnu3Lm9lrefM2eOJ1l0586dnvGDBw96qh7de++9vZ6rwWDwfG8Gcq7dj7lw4cJe5y5atGhA+wZOVKrVO4mpvMHWw0wAAAAA40FYWJj27NmjysrKHueUlZVpz549Pf6dDgAnwuFwaN++fdq+fbtaWlp81jc3N5NkCfSCJCYAADBgtJMDxpbebuz1prW1tcd1PVXrkY61N+vU0dHhs/60005TZmamJGnVqlVe6yorKz3ViC699FKvfXWuH4zezqW72tpaSceSsXpLPpLkaRHndrtVV1fnd05SUlKv+zCZTJ7Er85jS8Nzrt2P2VesycnJg4oJGKzulZjKG9uCFAkAAACA0cBut6u4uFiVlZXavHmzSktL5Xa7gx0WgDHA7XarrKxMmzZt6vEhwtTUVE2fPl0Oh2OYowNGj97vuAMAAPhBOzmMSHcXDX5bc2TP627ZLGmQN7NCw3ted+0Hkts1uP0Osa6JRKtXr1ZWVla/tusroWWwDAaDrrjiCj3yyCP63//9Xx09elTp6emSpDfeeENOp1OSdMUVV/hsO5znMlR96ge7n67nev/993va8PUlMrKX670PQ3XOwFBJ6Z7E1EA7OQAAAAA9Ky4u9txXcDqdKigoUHl5uaZMmaLo6OggRwdgtGpublZBQYEaGxv9ro+KitKUKVMUExPT4xwAx5DEBAAABox2chiRIhMCtN/4wOw3YkLfc4ZJfPzxc4yNjdWsWbOCGM0xV155pR555BG5XC699tpr+sEPfiDpeCu5adOmad68eT7ViIbjXDqrItXU1MjpdPZajanzqSuDwaC4uDi/cyoqKno9ntPp9Kr+1KnruYaGhgbs361r3H3F2td6YKildG8n10g7OQAAAAD+2e121dTU+Iw3NTVp69atSktLU3Z2dp9VlwGgk9Pp1MGDB3XkyBG/60NCQpSVlaX09HQeDgT6iXZyAABgQDo6OjxPK3UiiQkY3ebOnet5vWHDhiBGctzMmTM1e/ZsSccTl0pKSrRx40ZJx5Kc/BmOc+lMFrLb7dq+fXuvczdt2iRJmjJlSo9V67Zv3+7zc7WrHTt2eJJHuyYq5eTkyGq1Sgrsv1teXp7n9ebNm3ud29d6YKj5JDE10E4OAAAAgH9ms1kLFy7ssRpzaWmpNm7cqP3796u5uXmYowMw2hw4cECfffZZjwlMiYmJWrhwoTIyMkhgAgaAJCYAADAg3VvJSSQxAaPdvHnzlJGRIUl67rnn1N4+MtoxdSYqbdu2TXv27PEkM0n+W8lJw3MuZ599tuf1H/7whx7nbdy4Ufn5+T7bdFdbW6vVq1f3uL7rMbruJyQkRMuWLZMkrVmzRnv27Ok7+EFIS0vT9OnTJUlvvvmm2tr8J4m0tLTojTfeCEgMQE+6t5Ora3Wo3dHRw2wAAAAA453ZbNb06dN18sknKzw83Ge9y+VSWVmZvvjiC23btk2VlZVyuVxBiBTASOd2u9XR4XsPIjw8XHl5eZoxYwafnQCDQBITAAAYkO5JTCEhIQoJCQlSNACGgtFo1H333SdJKi4u1tVXX+03YbFTY2OjnnrqqYDHdfnll3ueUlq1apVee+01SdLixYuVk5Pjd5vhOJdFixZpwYIFkqTf//73+te//uUzp6GhQStWrPDEdPPNN/e6z//4j//w24pt/fr1eu655yRJ8+fP18KFC73W33vvvQoJCZHL5dLFF1/c45Nf0rFKeqtWrep1Tk864y8vL9ddd93ld86dd97p094PCLS02HBdszhT95x7kn556Wy9esMpCjHydCMAAACA3sXFxWnBggXKysqS0ej/49LGxkbt2bNHn332mUpKSuRwOIY5SgAjWVpamteywWBQZmamFixYoAkTJgQpKmD0o6krAAAYkIiICJ100kmy2Wye9kYARr+bbrpJH374od599129+eab2rp1q1asWKFFixbJarWqsbFRe/fu1bp16/Tee+8pLCxMt956a0BjysjI0JIlS7Ru3TqtXLlS9fX1knpuJTec5/L73/9ep5xyiux2u5YtW6bbbrtN559/viIjI7Vt2zb9/Oc/V3FxsSTpBz/4gVcbuO5mz56t/Px8zZ8/X/fee68WLVokm82mv//97/rVr34lp9Mpk8mklStX+mybl5enJ554Qnfeeafy8/M1a9Ys3XjjjTrrrLOUnJys9vZ2HThwQBs3btRbb72lsrIy7dy501Otqr9uvvlmvfjii9q2bZueeeYZlZSU6KabbtLEiRN1+PBhPf3001qzZo0WLFigLVu2DGjfwImItJj04AU9//8FAAAAAD0xGo3KzMxUUlKSSkpKVFVV5Xeew+HQ4cOHB/y3NIDRy+12q76+XqWlpZo8ebLCwsJ85lgsFiUkJKi6uloJCQnKzs5WREREEKIFxhaSmAAAwIBYLBalpKQEOwwAQ8xgMOj111/X97//ff3ud79TUVGR7rnnnh7nJyUlDUtcV155pdatW+dJYDKZTLr00kt73WY4zmXOnDlavXq1LrnkEjU2NuoXv/iFfvGLX/jMu+WWW/TII4/0ua9bb71VN998s99kKrPZrD/+8Y865ZRT/G5/xx13KDIyUnfccYcaGhr0+OOP6/HHH/c712w2+73p0heTyaS//e1vOuuss7Rv3z794x//0D/+8Q+vOeecc47uuusufeMb3xjw/gEAAAAACJbw8HDNmDFDNptNZWVlKisr83l4MykpSaGhoUGKEMBwcTqdKi8vV2lpqdra2iQde7A7Ozvb7/zs7Owek5wADA7t5AAAAABIkkJDQ/X0009rx44duu2225SXlyer1aqQkBBZrVbNmTNH119/vd566y3t2bNnWGK6+OKLvXrHn3POOUpMTOxzu+E4l3POOUeFhYW67777NGfOHMXExMhisWjSpEm68sor9fHHH+upp57qsSx9V9/97nf18ccf69JLL1VaWprMZrPS09N19dVXa9u2bbrssst63f6GG25QcXGxHnzwQZ122mlKSEiQyWRSZGSkpk6dqm9/+9v63e9+p6NHjyo3N3dQ55uWlqZt27bppz/9qWbNmqXw8HDFxsbq1FNP1dNPP60PPvhAZrN5UPsGAAAAACDYLBaLsrKydMopp2j69OmyWq2edd3bRnVVUVGhpqam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ZtlsNjmdTs+9J396a3XWl97229LSIrvd7jepqidGo1FGo1HZ2dkqKSnxe03t3bt30DG3tLT0GO+JJBa1t7f3uN/w8HBNnDhR0rHvV1NT06CPg8Hh5xQCIVjXVSB+hpDEFAB33323Xn/9de3fv1/33HOPCgsLddlllyk8PFxr167Vz372MzmdToWHh+vXv/71kBwzPz9fX3zxhSTp3HPPVVJSUr+2++KLL/Td735XX/3qV/Vv//ZvysvLU3x8vJxOp/bu3atVq1ZpzZo1ko5V33juuecUGRk5JDEDAEaPzj/CnE6nnE6noqKighwRgEA6fPiwzj77bO3fv98z1tLSog8++EBr1qzRa6+9pksuuURffvmlli1bpqNHj3rmtba26r333tM///lPffDBBz3eWK+trdW3vvUtbdiwwWu8urpa69at07p16/TUU0/pgw8+UGZmpt997NmzR1//+tdVXl7uGWtvb9e//vUv/etf/9K1116rM88880S+FUPCXyKSdOyp68LCQhUWFurll1/Wf/7nf+qRRx4ZkmPW1dXp4osv1v/8z/94jdtsNn3xxRf64osv9PTTT+uvf/1rjy2wP/74Y5133nleN73Kysq0evVqrV69moQjjEjJMWE6UNPqWa5oJIkJAACMXF2TizIyMnqd2/mBs3Tsb7aB6LptX1555RVPRZXh9Morrwz7MTH2cV2NTikpKbJYLDKZTAoNDZXJZPK87qtTwJdffqn333/f77pZs2YN+L62y+WSy+XyVEXyd03NnDlz0C0+CwsL9fe//93vusmTJysxMVHSsU4JTqdTDoej1/92ff2vf/1rUDFhePFzCoEwnNdVQ0PDkO+TJKYAiI6O1vvvv69ly5apoKBAzz33nJ577jmvOTExMVq1apXmzJkzJMfsrMIkSVdfffWAtu3o6NBHH32kjz76qMc58fHxeuGFF3T++ecPOkYAwOjV/UkSi8USpEgADIdLLrlER44c0b333qtzzz1XERER+uSTT/STn/xEjY2Nuv7667VgwQKdd955amtr08MPP6wlS5YoNDRU//jHP/Twww/LZrNp+fLlKigo8Kmm1NHRofPOO08bN26UdKw66a233qrs7GyVlpbqD3/4g/7yl79oz549+trXvqbt27f73GRqbGzUsmXLPAlMl156qZYvX66kpCTt379fv/zlL/Xiiy9q165dw/NN64XT6VRkZKS++c1v6qyzztK0adMUExOjyspK7d69W08++aQOHjyon//855o6daquvfZaz7YLFy7Uzp079de//lU//vGPJUn//Oc/lZaW5nWMrtWZbDabzj77bG3dulUhISG64oortGzZMmVnZ8vhcOh///d/9ctf/lKVlZVatmyZtm3b5pModujQIU8Ck9Fo1I033qiLL75YVqtVX375pX7+85/rgQce0IIFCwL4nQMGLtUa5rVMJSYAADCSdX1yva8P1rs+XEzVBgBjWdeH1bozGAw+iU1d/9tbRZATac/mdDp7XNff9nedXC6XJ9motwpOhw4d0uHDh3tsRQcAYxVJTAGSm5urbdu2aeXKlXrzzTdVWFgou92uiRMnatmyZfr+97/f4xPlA+VyubRq1SpJUmxsrL71rW/1e9tly5bphRde0MaNG7Vt2zZVVFSopqZGbrdbEyZM0OzZs3Xuuedq+fLliomJGZJ4AQCjT/c/pvpq7wQMF5fLrbrW/peAHgviIswyGgPbp3779u1av369TjnlFM/YggULNGXKFJ133nlqamrSKaecIrfbrU2bNmny5MmeeYsWLVJCQoJuueUWHTp0SO+//75PO+Lf/e53ngSmq6++Wi+99JKnRPb8+fN1/vnn60c/+pF+9rOfqaioSA899JAeffRRr3089NBDnqeP7733Xj300EOep/Hmz5+viy++WOedd56nqmgwzZkzR0eOHFFsbKzPum984xu69dZbdd555+nDDz/Ugw8+qKuvvtpzLpGRkZo1a5a2bNni2Wbq1KnKysrq8Xj//d//ra1btyo2NlYfffSR5s+f77X+9NNP15VXXqnFixerrKxM9913n+fviU533XWXpwLTn/70J11++eWedQsWLNAll1yiM844wysuYCRI7pbEVEYlJgAAMIK1tx9/r9LXvZauD5S1tbUN6Dh9VW4qKyvTokWLJElXXXWV0tPTB7T/wWpubvZUCrjqqquo/I0hwXWFnrS2tsrhcHiqGvn76lzXXWeikr9r6siRI2psbPQkVnV+hYSE+IyZTCYZjcYTahWH0Y+fUwiEYF1XR48eHbLuAp1IYgqgyMhI3XPPPbrnnnsGtX1/s2qNRuOAy8d2SkpK0nXXXafrrrtuUNsDAMaH7n3CqcSEkaKu1a75P+25muRY9MWPz1Z8VGD/H7zjjju8Epg6ffOb31RmZqYOHjyoqqoqPfPMM14JTJ2uvfZa3XXXXWpvb9fHH3/sk8S0cuVKSVJiYqKeeuopvzduHnzwQb3zzjvau3evfv/73+u///u/PT977Ha7XnjhBUnSjBkzdOutt/psHxoaqhdeeEE5OTkDfiJuqCUkJPS63mw26/HHH9ecOXN08OBBbd++3SfxqL+am5s939+HHnqox/1kZmbqv/7rv/S9731Pb775plfb6PLycr377ruSpPPOO88rgalTdHS0nnvuOb/XCRBMKTHeSUwVVGICAGBMG4oPgV988UUtX778xIMZhLCw4+9dut976a7rA2bh4eEDOk5freq6io6ODsoDzVFRUTxIjSHHdYWu+nstuN1uT6Ukh8OhhoYG7dixQ5L/a2rGjBlDHivGD35OIRCG87rqfBB2KBmHfI8AAGBMcbvdtJMDxpnLLrusx3Unn3yypGMfFnznO9/xOyc8PFxTpkyRJBUXF3utKy0t1Z49eyQdawEXHR3tdx8mk8nTVq2urk5bt271rPviiy9UV1cn6Vjru54+uMjIyNA555zT47kEi81m06FDh5Sfn69du3Zp165dXg8wdN4YG4z169d7+pBffPHFvc4988wzJR17mvCLL77wjK9du1YdHR2S5NXarrtFixZp5syZg44VCASfdnJUYgIAACNY17+H+moR19LS4nlNxQYACJzOlnURERGyWq2KjY0dcAU8AMDgUYkJAAD0yt+TgCQxAWPb1KlTe1zX2RItISFBcXFxfc5ramryGt+1a5fndV9VfLqu37VrlxYvXixJ2rlzp2d8zpw5ve5j0aJFev/993udMxxaWlr05JNP6s9//rN2797tSRLyp7q6etDH6dreLTU1td/blZeXe153/f4uXLiw1+0WLVqk3bt3DyBCILCSu1diamyXy+UOeBtOAAAQHJ0PSJyIgbxvHmpdKyQdOXKk17lduzFMnDgxYDEBAAAAwUQSEwAA6FX3KkydT6IAGLsiIiJ6XGc0Gvuc03Ve92Sd2tpaz+ukpKRe95GSkuJ3u66v4+Pje91HcnJyr+uHw4EDB3TWWWeppKSkX/NP5Om+ysrKQW3X2trqeT2Qf6OR8P0FukrpVonJ0eFWbatdCQFuwwkAAIJj2rRpwQ7hhEydOlUhISHq6OjQ3r17e53bdf306dMDHRoAAAAQFCQx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M2fm2T8jI0NPP/200tPTC4ylc+fOkm6NCrV169Y828+fP6+//vWvRTgr63KO/pidlPVnn332mX744YcC66lXr55l+ejRo/mW8/Hx0fPPPy9J2rZtm8aPH1/gVHkXLlzQnDlz8hzr4YcfliStWLFC3333XZ79kpOT9cwzzxQYc1E888wzliSrMWPGWE30mj9/vlavXl3qYwEAAAAAAAAAyjeSmAAAAACUqbFjx6pDhw6SpHnz5qlr165aunSp9uzZo1WrVumRRx7RlClTJEmNGzfWxIkT89TxxhtvKCAgQJL09ttva9iwYVq7dq327NmjRYsW6d5779WaNWsUEhJSYCxjxoyRk5OTzGaz+vbtqw8++EDR0dHatm2bpk+frrZt2+ratWsFTkVbkLZt21qmwps1a5aGDBmilStXavfu3frhhx80aNAgPffcc7rvvvsKrSd7NKaJEydq/fr1Onz4sGJjYxUbG6vU1FRL2TfffNMyxd6HH36ou+66S59++qm2bt2qffv2KTIyUp988on69++vBg0aWB0F6r333pOX162pp4YOHapx48YpMjJSu3fv1rx589SuXTvt3bu30N9vYe68805LUlt0dLRCQkIUERGh3bt3a+PGjXr22Wf1xBNPlPo4AAAAAAAAAIDyj1F/AQAAAJQpR0dHrVy5Uv369dPWrVu1ceNGbdy4MU+55s2ba82aNVanm6tevbpWrVql7t276+LFi1q0aJEWLVqUq8zIkSPVuXNny6hN1rRs2VLTpk3T3/72NyUkJGj8+PG5tvv6+mr58uWaOHGijhw5UuxzNZlM+vrrr/XAAw8oISFB3333XZ6RjVq3bq3FixfL398/33q8vLz0wgsvaNq0adqzZ4969OiRa3tkZKTCwsIk3Rqpav369Ro5cqSWLVum3377zTI6kzXe3t551gUFBWnFihXq16+fkpKSNHPmzDwjXr3xxhsymUwFTsVXFP/5z3909uxZLVu2TL///nue16thw4b69ttv1bhx41IdBwAAAAAAAABQvjESEwAAAIAy5+vrq19++UVfffWVHnzwQdWpU0fOzs6qWbOmwsLC9Mknn2jfvn0KDAzMt46WLVsqMjJSzz33nIKDg+Xq6qpatWqpS5cuWrBggebNm1ekWMaPH6+1a9eqZ8+eqlGjhlxdXdWwYUONGzdOe/fuVadOnUp1rm3a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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "dp = FluxPulse(0, 40, 0.9, SNZ(17, b_amplitude=0.8), 0, 200)\n", - "dp.plot()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Infinite Impulse Response (Filter) Shape" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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mqrJkyfrzjvvVFlZWbNx5+Xl6brrrtPgwYPlcrmUnZ2ts846Sx9++GGbvg6dlS3WAQAAAAAAAAAAAAAAAKCx3bt366STTtKmTZtCbdXV1Xr33Xe1YMECvfjiizrvvPO0evVqnX766crPzw/1q6mp0Ztvvqn3339f7777rmbMmNFo/NLSUp111llavHhxWHtJSYk++eQTffLJJ/rXv/6ld999VwMHDowY44YNG3TSSSdpz549oTa3262PPvpIH330kS6//HIdd9xxB/ulOGiffPJJxK+B1+vVli1btGXLFj3zzDP6zW9+o7vvvrtd9llWVqZZs2bp448/Dmv3eDxasWKFVqxYoYceekhvvPGGjjzyyIhjfPbZZ5o5c6YqKipCbXv37tVbb72lt956S7fffnu7xNoZkMQEAAAAAAAAAAAAAADQCZ133nnKy8vTbbfdptNOO03x8fH6/PPP9Yc//EEVFRW68sorNXnyZM2cOVO1tbW66667dPzxx8tut+u9997TXXfdJY/Hozlz5mjz5s1yOByhsQOBgGbOnKklS5ZIko4//nhdf/31ys3N1Z49e/Tkk0/q9ddf14YNG3TiiSdq5cqVSkxMDIuvoqJCp556aiiB6YILLtBll12mzMxMbdq0SQ888ICeeuoprV279tB90aLw+/1KSEjQGWecoRNOOEEjR45UcnKyioqKtG7dOj344IPauXOn7rnnHg0fPjys6tKUKVO0Zs0avfHGG/q///s/SdL777+v7OzssH3k5uaGlj0ej0466SR9/fXXslqtuvjii3X66acrNzdXPp9Pn376qR544AEVFRXp9NNP1zfffNMoUWzXrl2hBCaLxaJrrrlGs2bNUkpKilavXq177rlHf/zjH3XYYYd14Ffu0CGJCQAAAAAAAAAAAAAAHBQzGFSgvDzWYRwy1tRUGRZLh+9n5cqVWrRokY444ohQ2+TJkzVs2DDNnDlTlZWVOuKII2SappYuXaohQ4aE+k2dOlUZGRm67rrrtGvXLs2fP18//OEPQ+v/85//hBKYLr30Us2dOzc0hd2kSZN05pln6ne/+53+8pe/aOvWrfrTn/6ke++9Nyy+P/3pT9q9e7ck6S9/+Ytuu+220LpJkyZp1qxZmjlzphYsWND+X5xWmjBhgvLy8pSamtpo3amnnqrrr79eM2fO1AcffKA777xTl156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xVq0aJFmzZql5ORkrV69Wvfcc482bdqkww47rFtMKUcSEwA0odrj1xtLduj5r3ZpY0Flk30dNovOGNdXFx8xQJMHpnFis5UsFkNZyS5lJbs0eVDjqeJqvQHtLqvRzn012rmvWiOyIl8A2F1a06b9e/xBbS2uViBoRu3zo4e/ULzDqj7JLvVNjVN2St1z3xSX+qa4lOSyt2nfAAAAADon0zRVWFioPXv2qLKy6c+EkkLVhZqabg1Ns1gsoSn2WioQCMhms4VNDdAa0ZKjPB6Pvv3229BrwzDkdDpDCU2RHjabjfMBAAAAALoMq9Wqt99+W2eddZYWL16sjz/+WB9//HGjfqNGjdK7774bcbq5lJQUvffeezrppJNUUFCgF198US+++GJYnzlz5uj444/X5ZdfHjWWMWPG6K9//at++ctfqqysTDfddFPY+vT0dL3++uv6/e9/36YkJsMw9Oyzz+qEE05QWVmZXnrpJb300kthfcaNG6eXX345apVlqe4mpZ///Of661//qq+//lqnnHJK2PqFCxdq+vTpkuoqVX3wwQeaM2eOXn31Va1atUrXX3991LEj3ewzaNAgvfnmmzrrrLNUWVmphx56SA899FBYn//7v/9TTU0NSUwA0N0VVHj0+zfWNdlncEaCLj5igH50eH+lJTgOUWQ9T5zDquFZSRoeJXmpXrzTpp8cP1i79tUlPO0qrVGVp+UnsqNNh+f2BbRiZ1mT2yY5beqb6lKflAMJTikHEpxSXRqTnaJ0jg8AAACgy6iurta3337bbPKSYRjq1auXsrKylJ6e3q2niuusMjMzlZmZKZ/PF6re1HCKuuamqYs2ldz3KzyZphmqChWNxWIJJTQNGzaMhDYAAAAAnV56ero+/fRTPf/883rhhRf0zTffqLS0VMnJyRo3bpxmzZqlq6++Wg5H9OtcY8aM0bp163Tvvffqtdde065du5SUlKRx48bp6quv1kUXXaS5c+c2G8tNN92k0aNH6+9//7uWLl2qmpoaZWdn6/TTT9ctt9yiAQMGHNR7nTBhglauXKm7775b7777rvbs2aOkpCQNHTpU559/vq677rqoN7o0dM8992jYsGF65plntG7dOu3fv1+BQCBi36SkJP3vf//T559/rqefflqfffaZ9uzZo9raWiUnJ2vIkCGaOnWqzjjjjEYJUfWmT5+udevW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5557rtavX6+f//zn+uCDD7RixQq98MILGjVqlCTprbfe0mOPPRa2TVJSks466yxJ0quvviq32x11/HfffVelpaWSpEsuuaTD3kc0K1eu1JlnnqmKigrZ7XbddNNNWrhwoZYuXapHHnlEubm5kqR///vfuu2225od66c//akyMzP1//7f/9NXX32lRYsW6dZbb5XT6ZTH49Ell1wSNc777rtPv/71r+Xz+TR+/Hg9/PDD+vDDD7V8+XI9//zzOuqoo2Sapv70pz/pwQcfbPV77QlssQ4AACKxWy36xwUT5LBadOSQXjr38P6xDglAD/LLU4Zr0aZibSyoDLU9+tk2zRiZqSMH94phZAAAAN2b3+/Xhg0bZJpmWPvIkSPldDpjFBUAoKcqKirS0qVLtXTpUi1btkzLli3Tvn37JEmXXXaZ5s6d2+77fPHFF/XUU09p9erVKi8vV1ZWlqZNm6brrrtORx11VLvvDwCA9hQ0gyr3lMc6jEMm1Zkqi9ExdWMef/xxzZ8/X3a7XW+++aZOO+20sPVHHnmkZs+erWnTpmndunW68cYbo06ZtmzZMi1YsEDTp08PtR1++OE69dRTNXr0aBUWFuqhhx7ST37yk7DtLrnkEv33v/9VRUWF3n77bc2aNSvi+PWVmpKTkzVz5swOex/RXHPNNfJ6vbJarXr77bd1yimnhNZNmTJF5513no499litX79e999/vy699FKNGTMm4lirVq3SwIED9eWXX6pPnz6h9uOOO06nnnqqTjnlFPl8Pl177bVaunRp2Lbr16/X7373O0nSH/7wB/3hD38ITecnSZMmTdKFF16oyy67TM8995x+97vfafbs2Y0qV/V0JDEB6LRsVov+dv5hYb/cAeBQcNqs+vsFE3T2vxbLG6grLWqa0q9eWqV3b5ymZJc9xhECAAB0T/n5+aqtrQ1ry8nJ4YQeACAmsrKyDtm+amtrNWvWLL3zzjth7bt27dLzzz+vF198Ubfffrv+8Ic/HLKYAABorXJPuY7/7/GxDuOQWXTBIqW70tt9XNM0de+990qSfv7znzdK/KmXlpam++67T6effroWL16szZs3a9iwYY363XDDDWEJTPXS09N1+eWX65577tGaNWu0f/9+paSkhNafdtpp6tWrl/bt26fnn38+YhJTVVWV3nzzTUnSj370o7AKyu39PiKpTzaXpKuvvjosganh+I8++qiOPfZYBYNBPfTQQ/r3v/8ddcy//e1vYQlM9WbMmKGrr75aDz/8sJYtW6bly5dr8uTJYdv5fD5Nnjy5UQJTPYvFov/3//6fXn75ZVVVVemVV17R1Vdf3aL32lMwnRyATo0EJgCxMqpvsm4+dXhYW355re58c32MIgIAAOj+BgwYoIEDB4ZeJyUladCgQbELCACAAwYMGBDxolh7ueKKK0IJTDNmzNDrr7+upUuX6oknntCQIUMUDAZ1xx136NFHH+2wGAAAQOewfv16bd26VZKiVj+qd9xxx4WWlyxZErHP96d4a2jSpEmS6hKOvj+1u91u13nnnSepbsq48vLyRtu/9tproZuRvr+f9n4fkXz44Yeh5SuvvDJqv2OOOSY0fV7Dbb4vLS1NZ599dtT1V1xxRcR9S3XT8kl1yVxNXeNOTU3VuHHjJLXuvfYUJDEBiLndpTUKBM3mOwLAIXblsYN1RG74XRT/+zpP767ZG6OIAAAAujfDMDRo0CAddthhSkhI0KhRo2SxcPoKABAbt99+u9566y0VFBRo586deuSRRzpkPx9//LHmzZsnSTrzzDP1wQcf6Oyzz9aUKVN0xRVX6Msvv9SAAQMkSbfeeqvKyso6JA4AANA5LF++PLR81FFHyTCMqI/ExMRQ34KCgojjjRw5Muq+0tO/uwZSWVnZaH19YpLH49Err7zSaH39VHLZ2dmaMWNGh76PSNauXStJcjgcmjBhQpN9jzjiCEnS5s2b5fV6I/aZOHGibLboE5pNmDBBDodDkrRmzZpQ+86dO1VcXCxJuu2225p8r4ZhhL42rXmvPQVngQDE1P4an877zxJd/NiXyi+vbX4DADiErBZDfzv/MCU5w/9hve21Ndpf44tRVAAAAN1famqqJk2apLi4uFiHAgDowe68807NnDmzw6eVu//++yVJNptNDz30kKxWa9j6jIyM0FQs5eXlevzxxzs0HgAAEFtFRUVt2q6mpiZie3x8fNRtGt44FAgEGq0/5phjQhWTn3/++bB1RUVFoWpEF154YaObkNr7fURSWloqqS4Zq6nkI0mhKeJM04yaFJ6ZmdnkGDabLZT4Vb9v6dC8156i6e8iAHQg0zT129fXqKDCrYIKt077x6f68zljdfaEfrEODQBC+qfF686zx+iXL60KtZXX+PTyit26atrgGEYGAADQvTG9OACgJ6isrNRHH30kSTrppJPUv3//iP3OPfdcJScnq6KiQq+99pp+/etfH8owAQBokVRnqhZdsCjWYRwyqc7UDhm3YTLRW2+91eJp1ptLwGkLwzB08cUX6+6779ann36q/Px89etXdy33pZdekt/vlxR5yrpD+T7a6xxCW8dp+F5vv/320DR8zUlISGjT/rozkpgAxMxr3+Rr/urvpmSqdPv10vLdOuuwbE5WA+hUfjixn95Zs1cfbvguk/6Fpbt05bG5/L4CAAAAAABttmzZstB0Jscff3zUfg6HQ0ceeaQWLFigZcuWyefzyW63H6owAQBoEYthUborvfmOaFKvXr1Cy6mpqRo7dmwMo6lLULr77rsVDAb14osv6uabb5b03VRyI0eO1OGHH95ou0PxPuqrIu3bt09+v7/Jakz1U7cZhqG0tLSIfQoLC5vcn9/vD6v+VK/he7Xb7TH/nnVlTCcHICZ2l9bo9jfWhbWlxNl1/3mHkRAAoNMxDKNR1aVtxdVaur00yhYAAABojsfj0TfffKPKyspYhwIAQMysX78+tDxy5Mgm+9av9/v92rx5c4fGBQA9RU1NjSoqKlReXq59+/apuLhYhYWF2rNnj/Ly8lRQUKCcnBzl5OSooKBAeXl52rNnjwoLC1VeXh513GAwKNM0D90bQbcyceLE0PLixYtjGEmdMWPG6LDDDpP0XeLS9u3btWTJEkmRqzBJh+Z91CcLeb1erVy5ssm+S5culSQNGzZMDocjYp+VK1eGqktFsmrVqlACesNEpcGDByslJUVS5/iedWVUYgJwyAWCpn750kpVecL/ANx97jj1TYmLUVQA0LQjctM1uHeCthVXh9qW7SjVEYN7NbEVAAAAIjFNUxs3blRFRYW++eYbDR48WP369eOmFgBAj5OXlxdajjaVXL2cnJzQ8u7duzV69OhW7yOSvXsbVMuvrFRFRUWLxj1YVVVVEZeBg8Fx1TMEg0F5vV55vV75fL7QcyAQUDAYDCUQ1S/36tVLWVlZEcfauHGjamtrm9xf/dRZDX9fSlJycrKGDBkScZudO3eqtLRUhmHIYrE0eny/3eFwyG63y+FwyOFwyOVyteEr03H8fn/o69pw2iy0XsOvX7Sv5WGHHab+/fsrLy9Pjz76qK6//vpWHxPBYLDZ/USKJ1rfiy66SKtWrdI333yjtWvX6rXXXgutu+CCCyJu1x7vI9J7abivGTNmhJafeOKJsMSphpYsWRJKHj/xxBOjvs/S0lK98cYbOueccyKuf+KJJ8L23XCcH/zgB5o3b54WLFigtWvXatSoUc2/uXbSkuOqOfW/N/1+f4v/H+yIG9NIYgJwyP1n0VYt21EW1vajw/vr9HF9YxQRADTPMAxdPHWAHvpkq2ZN6q8Lp+RocO/EWIcFAADQJe3evTt017Jpmtq6dauCwaAGDBgQ28AAADjEGl74SUxs+jxDQkJCaLk1yRkNk5+a8+yzz4aqCBxKzz777CHfJ7o/jqvuZdiwYXI6nXI6na2eTnPFihXauXNnxHVjxoxRUlJSm2Lavn27FixYEHHdsGHD1KtXr1DST2uSCtxud9SKMk6nUzabLZS4dahMmDBBKSkpSkxMVFFR0SHbb3e3b9++qOuuu+463Xbbbdq2bZsuuugiPfjgg3I6nRH7VlZW6uWXX9YVV1wRaquu/u6G7Ka+Zw0ripWXl0fte9JJJ8kwDJmmqccff1zvvfeeJGnSpElNHhcH+z4khSXU7Nu3T/Hx8aHXgwYN0mGHHaZVq1bp8ccf14wZMzRt2rRG219zzTWSJIvFovPOO69RvA1/Rm+66SYNGzZMvXv3DuuzZMkSPfbYY5Kk8ePHa+DAgWHjXH311Xr55ZcVCAT0ox/9SC+88IKys7MjvtdAIKA33nhDRx55ZNQ+bdXUcdUUr9erqqoq7d+/X2+++WaLttm/f3+b9tUUkpg62M6dO/Xggw9q/vz52r17t5xOp4YMGaLzzz9f1113XdgPWGvs2LFDubm5rdpm4MCB2rFjR6P26dOna9GiRS0ag7KHOFir88r19w82hbXlpMfpjrNadtcQAMTSJUcM1OyjBspps8Y6FAAAgC6roqJC27dvD2tzOp3q25cbWwAAPY/b7Q4tR5vWpF7DC37NVQ0BgM7KMAw5HI5QQlL9ssPhUHFxcdSL74mJiVETH5pjsViirmtY4aW1mkpMamqfzfF4PFHXZWVlhRIegsGgPB6PvF6vPB5PxGWu7XZdl156qT799FO9++67euutt7RmzRr9+Mc/1sSJE5WUlKSqqipt2bJFX3zxhRYsWCCn09ko+ac9ZWdn66ijjtIXX3yhuXPnhpJXzj333Ji/j/vuu08zZ86U1+vV7Nmzdfnll+uUU05RfHy81q5dq3/961+hRMaf/vSnTU7hO3r0aG3evFmnnXaarr/+ek2cOFEej0cff/yxHnvsMfn9ftlsNv3lL39ptO2oUaN0++236w9/+IM2bdqkE044QZdccomOPfZYZWRkyOPxaPfu3VqxYoXmz5+vwsJCffzxx+2exNTVkcTUgd566y39+Mc/DssMrKmp0fLly7V8+XI9/vjjmj9/voYOHXpI4hkxYsQh2Q8QTY3XrxvnrZQ/+N0/TBZD+vv5E5Tkal3WPADEQpyD5CUAAICD4ff7tWHDhkbtI0eObPXd1AAAdAcNp1Txer1N9m14UTsuLq7F+9i9e3eT6/fu3aupU6dKkmbPnh2aNqmjVVVVhSrlzJ49u9lKVEBLcFx1HqZpyuPxqKamRjU1NaqtrZXb7Zbf74+6zYgRI6JezN+0aVNYZZnWGDlypE477bSI67Zu3arKysqIU75ZLBYFg8FQ8sPAgQNDbcFgUOPHj9epp54acdzNmze3eUrD3NxcTZ8+PeK67du3hyrnWCwWxcXFNfk3wWazyeVyKS4uTvHx8UpPT29TTPn5+QoGg7Lb7crMzGzTGKgTCARCyXq9evWS1Rr9usOrr76qm266SY888oh27NihP//5z1H7ZmVlhX1vGlZwbOp7lpqaGrbcVN/LLrtMX3zxRSiByWaz6YorrmhUsag934dUN3VjvV69ejVaf8IJJ+j111/XhRdeqIqKCj3yyCN65JFHGo197bXX6h//+EfEJMP678PkyZP1i1/8Qtddd51+97vfNerncDj01FNPRf2d8rvf/U5ZWVn65S9/qYqKCj388MN6+OGHI/Z1OBzKzs5ul5+p1hxX0VRWViopKUkpKSk66qijWrRNfn6+7r777lbvqykkMXWQb775RhdccIFqa2uVmJio2267TTNmzFBtba3mzZunxx57TJs2bdIZZ5yh5cuXt7pMYb9+/bRmzZpm+91999164YUXJNX9UmnK5MmT9dRTT7UqDqA1/vLOBm0rCf8H8/oZQzV5UNv+YQIAAAAAdB2maWrTpk1hFSekugsBDU+aAgDQkzS8NtDcxe6GF+9bk5jRv3//VsXT8ELhoZKYmBiT/aJ747g69EzT1LZt21RZWamqqqpWTaFWv32071lCQkKjJKb6BJ36qk42m00Wi0VWqzX0bLVa5XQ6o16LnTBhggzDiBpTRUWFPvroI0nSySef3OJjauzYsaFp5AKBQCjxqX654bPf7w9VT3K73U0eu639mvr9flVVVamqqkrx8fEaNGhQq7avV1hYKL/fL8Mw2pQcgcjqj9Gm1j/88MO69tpr9dhjj+mTTz7Rrl27VFVVpcTEROXm5mrSpEn6wQ9+oJkzZ4aN1TBRp7l9tDSe888/Xz//+c9DidWnnHKK+vTp06L32db3Eem9RIrxBz/4gbZs2aJ//OMfeuedd7Rt2zZ5PB5lZWVp2rRp+ulPf6pjjz222VgNw9A111yj8ePH6+9//7s+//xzlZSUqHfv3jrxxBN16623avTopmcY+slPfqJzzjlHjzzyiBYsWKBvv/1W5eXlcjqd6tevn8aNG6eTTz5ZP/rRj5SRkdFsTK3V3PcxGsMwZLFYZLPZWvy7rmFBn/ZCElMH+cUvfqHa2lrZbDYtWLAgLFPthBNO0LBhw3TLLbdo06ZN+tvf/qY77rijVePb7XaNHTu2yT6BQECffPKJpLoPHj/84Q+b7J+QkNDsmEBbfbShUM99uSus7bCcVN1w4rAYRQQAAAAAOJQKCgpUXFwc1paSkqKBAwfGKCIAAGKvYYJRXl6eJk+eHLVvw4pKOTk5HRoXAERjmqYCgYBstsaXmQ3DUGlpqWpqato0dnPTqKWkpDRKWjpYTSUwHYy2Tn0nqdkp4AzDaNM0cU0lwNZXeEpKSlJiYqKSkpIUHx/fYV8ftM64ceP04IMPtmqbO+64o0U5CNOnT2/x8ZSamtroxqTWaMv7kKQ5c+Zozpw5zfbr3bu37rrrLt11111tiC7ckUceqf/+979t3j4rK0u33367br/99oOOpachiakDLF26VJ999pkk6corr4xYautXv/qVnnrqKW3YsEH//Oc/9bvf/a7dy6Z/+OGH2rNnjyRp1qxZrSovC7Sn4kqPbnlldVhbnN2qf1wwQXZr2+cEBoDOIhg05QsG5bRxBwoAAEAk1dXV2rJlS1ibzWbTyJEjOSkOAOjRGt7Jv3Hjxib71q+32WwaNoybQwF0PNM0VVNTE6qsVP/ct29fDR06NOI2iYmJLUpislqtoYSk+uf4+Pio/ds6DVpX1NRnpMMPP1ymacrr9crtdoeqNzV89ng8EaftayqJqby8XBUVFWFVVSwWixITE5WYmCiPx8NnNwCHBElMHeD1118PLV9++eUR+1gsFl166aW67bbbVF5eroULF+qUU05p1zieeeaZ0HJzU8kBHcU0Tf3mf6u1rzp8Pvfbzxyt3IyEKFsBQNdQVOHWS8t368WluzXn6EG6+rjBsQ4JAACg0wkGg9qwYYOCwWBY+4gRI+RyuWIUFQAAncOUKVPkcDjk9Xq1aNEi/eY3v4nYz+v16ssvvwxt0943RQOAaZqqra1VRUVFKFmpqqqq0f/xklRZWRl1nKSkJBUVFYVeOxyOUGWfxMREuVwuuVyudqmi1FMZhhGqRhVN/RR1tbW1oe9lSkpKxL6maUac0jQYDIYSm1wulxwOhywWi6qrq8Om7LNYLCQ4AWg3/HXoAJ9//rmkuunZJk2aFLXf8ccfH1pevHhxuyYxVVZWhpKpBg0apOOOO67dxgZao8rjV6UnPNv75NFZunAK5Y4BdG1Pfr5df3lng/zBujKrLy7dpaum5fJhDQAA4Hu2bt2q6urqsLbs7GxlZGTEKCIAADqPpKQknXjiiXr33Xf14YcfKi8vL2yKuXqvvvpqqDrGD3/4w0MdJoBuyu/3q7y8XKWlpSorK2vxNFFVVVUyTTPiudC0tDQNHDgwlLR0MNOqoe1sNptsNpsSEhKa/exVU1MTMVktmmAwGNbfZrMxIxCAdsM8Th1gw4YNkqShQ4c2mUU8cuTIRtu0l1deeSVUqnH27NktuqC6ceNGHXHEEUpNTZXL5VL//v119tln65lnnpHP52vX+NBzJLnsevHqI3XLaSNksxjKSHTqnnPHcZEfQJc3Jjs5lMAkSdtKqvXlttIYRgQAAND5lJSUhKa6r5eQkKDBg6lgCQDoGebOnSvDMGQYhu64446IfW6++WZJdckE1113nQKBQNj6kpIS3XrrrZKk1NRUXXXVVR0aM4CeYfv27friiy+0bt067d27t8UJTFJdEkttbW3EdQkJCRo0aJB69epFAlMX4XK5NHbs2DZ/36xWawdFBqAnohJTO3O73SopKZGkiHdLNJSWlqaEhARVV1dr9+7d7RpHw6nkLr300hZtU1hYqMLCwtDr/Px85efn680339S9996rV155RaNGjWpTPHl5eU2u37t3b2i5uro6bL5VdA8/PjxTh2fHq8rtlz3oUUWFJ9YhRdWwZGak8pnAocYx2TmN7GVTbq84bd/33Yf1ZxZv1Zje3bucO8cjOhOOR3Q2HJPoTDrD8ej1erVx48awNsMwlJOT06gyE7q/znBMAvX4HYSW+vzzz7Vly5bQ6/pz/5K0ZcsWzZ07N6z/nDlz2rSfE044QRdeeKHmzZunN998UyeffLJuvPFGZWdna82aNbrrrru0a9cuSdK9996rtLS0Nu0HABpyOp0yTbP5jgf6NpwSLikpSQ6Ho4MjxKFitVrVq1cv9erVK9Tm9XpVVVUVmlqwvnhGJNGKepimqZqaGlksFtlsttDUcwDQFJKY2lnDOWATExOb7V+fxNSeJ2927dqlRYsWSZKOPvpoDR06tMn+FotFJ554ok4//XQddthh6tWrlyorK/X111/rkUce0YYNG7R+/XrNmDFDS5cu1YABA1odU05Oy6cOe/XVV6POyYruYUWsA2iFZ599NtYhAGE4JjuXvu5e2q6+odfvry9UVv6nirMEmtiq++B4RGfC8YjOhmMSnUmsjsfBgwcrMzMzrG3r1q1asmRJTOJB58HvSMTa/v37Yx0CuojHH39cTz/9dMR1ixcv1uLFi8Pa2prEJElPPvmkKioq9M4772jhwoVauHBh2HqLxaLf//73uuaaa9q8DwA9g2maqqqqUmlpqfbv369x4yLPjpGenh5xe4fDoeTk5LCkJRKWeh6Hw6H09PTQcbJ582b5fD5ZrVY5HA4Fg0EFAgEZhhE1MSkQCISmnvP7/ZIUSmiy2WyyWCzM3IJOY8eOHbEOAQeQxNTOGpZabMkf9PpyfNFKLrbFc889F8qcbkkVpldffVWpqamN2qdNm6Zrr71WV199tZ5++mkVFhbqxhtv1KuvvtpusQIA0JWNcJTrq9osBQ7M0BuURd96UzXBtS/GkQEAAMTe9u3bVVNTo379+slut2vfvn0qKiqKdVgAAHRKcXFxmj9/vl544QXNnTtXq1atUnl5ubKysjRt2jRdf/31Ouqoo2IdJoBOyuv1qqysTKWlpSorK5PP5wutq6ioiFg8wOVyKT4+XrW1tUpJSVF6enpoFhkSSxBJ/fSo9de3TdNssprX96dHleqmIvR6vfJ6vTIMQ1arlSpNAMKQxNTOXC5XaNnr9Tbb3+Opm1IrLi6u3WKov5vN6XTqggsuaLZ/pASmena7XY8//ri+/PJLffvtt3rttdeUn5+vfv36tSqm5qbL27t3r6ZOnSpJOvfcczV8+PBWjY/Oo9rjl2EYind03flvq6qqQj9Hs2fPblFVNaAjcUx2bkVvbNT8dcWh13viBus/Pzmv237Q53hEZ8LxiM6GYxKdSWc6Hv1+v4qLizVu3DiddNJJMYsDsdWZjklg06ZNuvvuu2MdBrqAuXPnNpoyrrXmzJnTqgpNF198sS6++OKD2ieA7s80TVVUVKi0tFSlpaVNzvhSWloadQaU0aNHy+l0Rp0ODGhKfVJTNPXVl6IxTVN+v79RlSar1Sqr1dptz7EDaBp/kdpZUlJSaLklU8TVz7/eXiduli5dqo0bN0qSzjrrrCYTlFrKZrPpyiuv1C233CJJWrRoUas/RPXv37/FfRMSEpScnNyq8dF53PHflVqxq0z/uGCCJg7o+nOzJyYmcjyiU+GY7HwuO3ZoWBLTztJarS/x66ghvZrYqnvgeERnwvGIzoZjEp1JZzgeo01VgZ6pMxyT6NkSEhJiHQIAAK1mmqbKy8tVWFiokpKSiFVuIiktLVVubm7EdfxNREeKi4sLJSm15Hitr9Ik1SVIURUM6JlIYmpnLpdLvXr10r59+5SXl9dk37KyslASU05OTrvs/5lnngktt2QquZYaPXp0aDk/P7/dxkX3snR7qV79pu74mPWfJfr5CcN03Ywhslkp/wig+5oyKE1DMxO1pei75OUXlu7qEUlMAAAAAAAAADqWaZrasWOHCgsLQzO8tERcXJzS09O5oQAxY7FY5HA45HA4ZJqmAoFAKKEpGAw2uy0JTEDPRGZBB6hP+NmyZUuTZfLqKyZJ0qhRow56vz6fT/PmzZMkZWZm6rTTTjvoMevxRwLNMU1T97y7IfQ6EDT1+OfbVFzV8n+oAaArMgxDF00dENb2/toC7eP3HwAAAAAAAICDZBiG9u/f32wCk8ViUa9evTRs2DBNnTpVU6dO1dChQ0liQqdgGIZsNptcLpcSEhKUkJDQ5FSGdrs96lh+v7/ZJCgAXRdJTB3g2GOPlVQ3VdyKFSui9lu0aFFo+Zhjjjno/c6fP1/79u2TVDdvdnvOX7t+/frQcnZ2druNi+7jg/WF+npXeVjbzaeMUN+UuNgEBACH0I8O7yeH7bt/q7yBoP73ddMVGQEAALobj8ejqqqq5jsCAAAAaMQ0zajr+vTpE7E9ISFBOTk5Gj9+vI455hiNHTtW2dnZiovj2gw6t/oqTXFxcUpMTFRcXJwcDocslrrz7NGuc5umKbfbrerqatXW1srn8zX5swOg6yGJqQOcc845oeWnnnoqYp9gMBia+i01NVUzZsw46P02nErusssuO+jx6vn9fj355JOh18cdd1y7jY3uwR8I6q/vfxvWNiA9vlFlEgDorlLjHTpjXN+wtheX7ubDEwAA6FF27NihFStW6Ntvv23VNBcAAABAT2WapiorK7VlyxZ98803Uc8nZmRkhJI7EhISNHjwYB155JGaPHmyBg8erLS0tNB6oKupr9LkdDqVkJCgxMTEqLMEBQKB0M+J3+8PJTS53e6wdQC6Lv6adYCpU6dq2rRpkqQnnnhCS5YsadTnb3/7mzZsqJt66xe/+EWjkniffPKJDMOQYRiaM2dOs/ssLS3V/PnzJUnjxo3ThAkTWhTrwoULVV5eHnW9z+fTVVddFYr1zDPPVE5OTovGRs/x6tf52lIUfrftr04ZHlaVBAC6u+8nbm4vqdaSbftiFA0AAMChVVVVpYKCAklSQUGBli5dqpKSkhhHBQAAAHROHo9Hu3fv1vLly/X1118rPz9flZWVUa/Z2Ww2DR8+XIcffrgmTZqknJwcOZ3OQxs0cIhES2CS6q5df59pmvL5fKqpqVFNTY08Hg/TzQFdWPvNN4Yw//znP3XMMceotrZWp5xyin77299qxowZqq2t1bx58/Too49KkoYPH65f/epXB72/efPmyev1SmpdFaann35aZ511ls466yxNnz5dI0aMUHJysqqqqrRixQo9+uijoankMjMz9c9//vOgY0X34vYF9MAHm8LaxmQn68zxTDsIoGeZMihNQzMTw5I6X1y6W0cPyYhhVAAAAIfGtm3bGrUlJyfHIBIAAACgcwoEAiopKVFhYaHKysoi9iksLFRaWlrEdVlZWR0ZHtAlNJXgJNXNhuT1euX1emW1WmW322Wz2ZrdDkDnQRJTB5k4caL++9//6sc//rEqKir029/+tlGf4cOHa/78+UpKSjro/dVPJWe1WnXJJZe0atuqqiq98MILeuGFF6L2GTdunObNm6fc3NyDihPdz9Nf7FBBhTus7dbTRspi4Z8BAD2LYRi6aOoA/entuuTfacMydOb4vs1sBQAA0PWVlpY2ugiTk5Mjh8MRo4gAAACAzsE0Te3fv1+FhYUqLi5WIBBosn9JSYkCgYCsVushihDoWlwul5xOp3w+n/x+f5M/U4FAILTeZrOFEpoAdG78lHagM888U6tXr9Y///lPzZ8/X3l5eXI4HBo6dKjOO+88XX/99YqPjz/o/WzevFlfffWVJOnkk09Wnz59WrztrbfeqgkTJmjJkiVav369iouLVVpaKqfTqaysLE2ePFmzZs3SD3/4Q/5hQiP7a3z698ItYW3HDO2lacOoOgKgZ/rR4f20r8qjC6cM0IBeB/83HgAAoLMzTbNRFSaHw8FU9AAAAOjRfD6f9uzZo4KCArnd7mb711+Xy8rK4noc0AzDMORwOORwOBQMBuXz+eTz+WSaZtRt/H6/JJHEBHQB/JR2sIEDB+qBBx7QAw880Krtpk+f3uQv2oaGDRvW4r7fN2rUKI0aNUo33nhjm7ZHz/bwoq2qcPvD2m49bSQlGQH0WKnxDt1y2shYhwEAAHDIFBYWqrq6Oqxt0KBBXHgBAABAj7V7927t2LFDwWCwyX5Wq1W9e/dWVlaWUlJSuLYCtIHFYpHT6ZTD4VAgEJDf75fP54vYlwQmoGvgJxVAm+zdX6unFm8PaztjfF+N758am4AAAAAAAIdUIBDQjh07wtri4+NbVSEaAAAA6G6sVmuTCUxpaWnKyspSRkYGyf9AOzEMQzabTTabTU6nM5TMVD+dXP36SEzTVDAY5OcR6CRIYgLQJv/8cLM8/u/+CbdZDN18yogYRgQAAAAAOJTy8/Pl8XjC2gYPHswd5AAAAOjRsrKytGPHjrBqMPHx8aHp4pxOZwyjA7o/wzBkt9tlt9sVDAZDU8lF+6waCARUW1srq9Uqh8Mhq9XK51oghkhiAtBqW4oq9dLy3WFtF07NUW5GQowiAgAAAAAcSl6vV7t27QprS01NVXp6eowiAgAAAA4N0zRVUlKihIQExcfHN1pvtVqVnZ2tnTt3qnfv3urfv7+SkpJIigBiwGKxyOFwNNnH6/VK+i6ZqX4bm83Gzy0QA5ZYBwCg69lSVKUEx3c5kHF2q35+4rAYRgQAnVcgaOqjDYV6b21BrEMBAABoNzt37gyV5a9HFSYAAAB0Z4FAQHv27NGyZcu0fv36Rkn9DfXr109Tp07V6NGjlZyczP/JQCcVCAQafbYNBoNyu92qrq6W1+uVaZoxiq5tBg0aJMMwNGfOnFiH0sgdd9whwzD4nYgmUYkJQKudNravpub20r8XbtGzS3bqqmm5ykxyxTosAOhUiirdevGr3frvsl3as9+tQb3idcroLFks/HMOAAC6tpqaGu3duzesLSsrS0lJSTGKCAAAAOg4Pp9Pe/bsUX5+ftgUcUVFRRo0aJBcrsbXR+qnsgLQuZmmKcMwIiYqmaYpj8cjr9cb+pm2WKgRA3Q0kpgAtEl6gkO/nzlac44epNR4/hEHgO/bta9Gf/9wU+j1jn01+nLbPh09NCOGUQEAABy87du3h53gNQxDgwYNil1AAAAAQAdwu93Ky8vT3r17FQwGG603TVP5+fkaMmRIDKIDECgokHfFCgUKCmR6vTIcDln79JFj0iRZ+/Rp0Rg2m00JCQny+Xzy+XxRf9a9Xm8omcnhcJDMBHQgkpgAHJSc9MbzPQMApEkD0zQsM1Gbi6pCbc8v3UUSEwAA6NL279+vkpKSsLb+/ftHvPscAAAA6Iqqqqq0e/duFRUVNdkvMTFRKSkphygqAPX8+flyv/++Art3N1oXyMuTd/lyWXNy5Dr1VNn69Wt2PMMw5HA4ZLfb5ff75fV6IyYzSQolO9lsNjkcDlmt1oN+PwDCkSIIAADQAQzD0MVHDAhrW7CuQCVVnhhFBAAAcPDi4uKUnZ0dem2z2TRgwIAmtgAAAAA6P9M0VVZWptWrV2vFihVNJjClpaVp/PjxOvzww5WRwQ2LwKHk27RJ1XPnRkxgaiiwe7eq586Vb9OmJvs1ZBiG7Ha74uPjFRcX12SCkt/vV21tbcRp6NrTnj179Jvf/EaHH364UlJSZLfblZWVpXHjxumiiy7S3LlzVVFRIUmaPn26DMPQzp07JUlPP/20DMMIe0yfPj1s/LKyMj311FP68Y9/rNGjRysxMVEOh0N9+vTRqaeeqkcffVRerzdqfDt27AiNPXfuXEnSq6++qtNPP13Z2dmy2WyaPn265s6dK8MwdOedd4a2/X5shmFox44d7fr1Q9dEJSYAAIAOcu7E/rrn3Y3y+Ovu2vAFTL2yIk8/PZ4S0wAAoGtyOBwaNmyY+vXrp23btiktLU02G6eXAAAA0HWVl5dr27ZtqqysbLJfZmamcnJylJiYeIgiA9CQPz9fNS+/LPn9LdzAr5qXX1bCnDktqshUzzAM2Ww22Ww2BQIBeb1e+SPs0263yzCMFo/bWp999plmzpwZSlKqV1RUpKKiIq1du1bz5s1TRkaGZs6c2aZ9TJw4MZT01FBhYaEWLFigBQsW6D//+Y/eeecd9Wlmij7TNHXppZfq2WefbVMsQD3OMgFoltsX0L8XbtGcowepV6Iz1uEAQJeREm/XGeP76tWv80Nt85bu0jXTBsti6bgPNwAAAB0tPj5eY8eO7fC7TgEAAICOtnv37qgJTBaLRX379mUKZaATcL//fssTmOr5/XK//74Sr7iiTfu0Wq2Ki4tTMBiU1+uVz+cLrbPb7W0asyU8Ho8uvPBCVVRUKCkpST/72c80Y8YMZWZmyuv1avv27friiy/02muvhbZ56qmnVF1drVNPPVV79uzR2WefrT//+c9h4yYkJIS9DgQCOuKIIzRz5kxNnDhRWVlZofGfe+45vffee/rmm2904YUX6pNPPmky5n/84x9avXq1pk2bpp/97GcaPny4ysvLtWPHDp1zzjmaPHmyHnroIT388MOSpDVr1jQao18rks3QfZHEBKBZz325U//v4y16avEOXT1tsK6alqsEJ78+AKAlLjliQFgS0459NVqybZ+OGUqpaQAA0PV15F2nAAAAwKEwePBglZaWhrXZ7Xb169dP2dnZHZqoAHQ3pmnKrKlp93EDRUXNTiEXddvdu+Xbvl3WzMyDisGhuuSKUFWm2lqZ8fGNPhebpimv1yu73S6LxdKmfS1evFh79uyRJL3wwguNKi0deeSRuuiii/T3v/9dNQe+3rm5uZK+S65KTU3V2LFjm9zPxx9/rGHDhjVqP/roo3XJJZfoqaee0hVXXKFFixbpo48+0oknnhh1rNWrV+vSSy8NTR33fampqcps8D1oLjb0XGQhAGhShdunfy/cIkmq8vj19w83af3e/Xpk9uQYRwYAXcPhA9I0PCtRmwqrQm0vLN1FEhMAAAAAAADQCSQkJKhv377au3evXC6XcnJylJWVJavVGuvQgC7HrKlR5f33xzqMRmqeeabdx/RISrr5Zhnfq27k9XpDD4fDIYfD0eobgAoKCkLLxx13XNR+NptNycnJrRq7oUgJTA1dfvnlevDBB7Vy5Uq9/vrrTSYxpaam6l//+hc3O+GgtS31D0CP8eiibSqr8YW1/eT4ITGKBgC6HsMwdPHUAWFtC9YVqKTKE6OIAAAAWicYDMY6BAAAAKDNTNNUcXGx9u3bF7XPoEGDNGzYME2dOlXZ2dkkMAFok/pp5+p5vV5VV1fL5/O1ajr2vn37hpafeuqpdo0xGtM0VVBQoE2bNmnt2rWhR/0Ub6tWrWpy+zPPPFNJSUmHIlR0cyQxAYiqqMKtJz7fHtZ26pgsHT4gLUYRAUDX9MOJ/eW0ffdvly9g6uXleTGMCAAAoGXcbre+/PJL7d69m2QmAAAAdDkVFRVauXKl1q9fry1btkT9n9bhcCg7O5sKIgAOSsMEpnqmacrtdqumpua7qeiaceyxx2rw4MGSpBtvvFFTp07V3XffrcWLF0fcx8GYP3++Zs6cqZSUFPXt21cjRozQuHHjQo/58+dLkkpKSpocZ/z48e0aF3oukpgARPXPjzar1hcIvbYY0q9PHRHDiACga0qJt2vm+Oywtte+IYkJAAB0ftu3b5fP59O2bdu0dOlSFRUVxTokAAAAoFkOh0M7duzQN998o4qKCkl1Cfr5+fkxjgxAd+ZwOGSz2SKuCwaDqq2tlcfjkcXSdJqG3W7XW2+9pVGjRkmSli1bpt/+9rc69thjlZqaqtNOO00vvPCCAoFAk+M0xTRNXXXVVZo5c6bmz5+vysrKJvvX1tY2uT4tjSIYaB+Rf4IA9Hjbiqs0b9nusLbzJ+doaCZlAAGgLS6YkqP/ff1d4tKmwiptKqzU8Cx+rwIAgM6psrIyLGnJ4/GooqJCmZmZMYwKAAAAiC4QCCgnJ0d9+/ZVWVlZo/U7d+5Unz59ZLfbYxAd0P0Z8fFKuvnmdh/X/cEH8jUznVlT7BMmyHXSSe0YUR0jPj7stcViUVxcnAKBgDweT8Qko0AgoLi4uGanmBs9erTWrFmjt956S2+99ZY+/fRTbdmyRbW1tXr//ff1/vvv64EHHtA777zTps/pTz75pJ544glJ0oQJE3TjjTfqiCOOUL9+/RQfHx+aVvPSSy/Vs88+2+x0eEzDifZCEhOAiP62YJMCwe/+GDltFt140vAYRgQAXdvkgWnqk+xSQYU71Pb26r365ckkMQEAgM7HNE1t3bo1rM1qtWrgwIExiggAAACIzjRN7d27V9u3b1e/fv0i9nG5XBo8eHDUKikADp5hGDISEtp9XOeRRx5UEpPziCNk6YC4orFarYqLi5Pf75fX6200laVhGHI4HKqtrZXT6ZTdbo84naXVatU555yjc845R5K0d+9evffee/r3v/+tFStWaMWKFfrJT36i1157rdUxPvbYY5KkoUOH6osvvlBcXFzEfqWlpa0eGzgYTCcHoJFVu8s1f83esLbLj8lVnxRXjCICgK7PYjF0+ri+YW0fbSiMUTQAAABNKysr0/79+8PaBgwYwB3rAAAA6FRM09S+ffu0fPlybd68WX6/v1Efq9WqwYMHa8qUKerdu3fERAEAnZu1Tx9Zc3Latm1Ojqx9+rRzRM0zDEN2u13x8fFyOp1Rf/d4PB7V1NRE/P31fX379tXll1+uJUuW6PDDD5ckvf3222FTvbX0d9y6deskSWeddVbUBCbTNPX111+3aLyW4PcvWoIkJgBhTNPUve9tDGtLdtn0s+OHxCgiAOg+Zh7WV06bRaeN6aN/XTxRL//0qFiHBAAAENHu3eHTizudzqh3tAMAAACxUFVVpdWrV2vt2rWqqamJ2Kdfv3464ogjlJOTI4uFy6JAV+Y69VSptZXUbLa67WKovupSfHx81BuDvl+pqTl2u13HH3+8JMnv96u8vDy0zuWqK0rh8XiaHKM+aaq6ujpqnzfeeEN79+6Nur616mOTmo8PPRd/rQGE+Wxzib7Yui+s7boZQ5USz922AHCwJuakasXvT9Z/Zk/SzPHZindQuhoAAHQ+VVVVYSdAJWngwIGyWq2xCQgAAABowOv16ttvv9WKFSsa/d9ar7S0VKNGjdLQoUOpJgp0E7Z+/RR/3nktT2Sy2RR/3nmydZIbciwWi1wul1wuV6OqS1arNWyqy88++0xbtmyJOpbX69WiRYskSYmJierdu3doXd++dTNCfH+K+O8bNmyYJOmtt96KOGXc1q1bdd111zXzrlqnPraWxIeeiyQmACHBoKl73g2vwtQ3xaXLjh4Um4AAoJsxDEOJThKXAABA55afnx/22m63KysrK0bRAAAAAOEMw9C+ffsirouLi9P69eu1adOmsIofALoH+/DhSpgzp9mp5aw5OUqYM0f24cMPUWQtZ7FY5Ha7VVtbG6oQ53Q6w/p89NFHGjFihKZPn6777rtP77//vr7++mstXrxYTz31lKZNmxaa5u3KK68MS4A6+uijJUnLli3TPffco1WrVmnLli3asmVL2Of9Sy+9VJK0Z88eHXXUUXryySe1dOlSffrpp7rjjjs0adIklZaWhqataw/1sUnSTTfdpE8//VSbN28OxdeSKfXQ/XEVDUDI22v2av3eirC2G08aJpedu20BAAAAoCfwer0qLCwMa8vOzmbqDQAAAHQadrtdw4cP17p160JtDodDubm5iouL08KFC2MYHYCOZuvXT4lXXKFAQYG8K1YoUFgo0+OR4XTKmpUlx6RJsvbpE+swmxUIBOR0OmUYRsTKx8FgUIsWLQpVXIrk7LPP1t133x3W9rOf/UwPP/ywSktLddttt+m2224LrTv++OP1ySefSJJ+8Ytf6IMPPtCCBQu0adMmXXnllWHjxMXF6ZlnntH8+fNDCVMHa+jQoTr//PP10ksvacGCBVqwYEHY+u3bt2vQoEHtsi90XSQxAZAkmaapRz8NL9s3NDNRPzq8f4wiAgAAAAAcanv27JFpmqHXhmEoOzs7hhEBAAAAjWVkZCgzM1MlJSXKyclRTk6OrFarKioqmt8YQLdg7dNHcWecEeswDkq0BKabb75Z48eP14IFC/T111+roKBAxcXFkqQ+ffpo6tSpuvTSS3VGhPffr18/LV26VHfffbcWLVqkvLw8ud3uRv3sdrvmz5+vhx9+WM8884zWr18v0zTVr18/nXTSSfrFL36hkSNHav78+e36np977jlNnjxZr7zyir799ltVVlYqGAy26z7QtZHEBCDkhhOG6anF2/Xltrp5T3958nDZrNxtCwAAAAA9QTAY1J49e8LaMjMz5XA4YhQRAAAAejKv1ytJUf8fHTp0qAYPHtxoGiYA6OoSExN1zjnn6JRTTgm70chqtcrlcjVbLXnIkCF6/PHHm92PzWbTDTfcoBtuuCFqn7lz52ru3LkR1w0aNCgsvpaw2+369a9/rV//+tet2g49B0lMACTVZfqeOqaPTh3TR+v3VOj1lfk6dUznL7UIAF2Zxx/Qp5tK9PbqPbrimFwdlpMa65AAAEAPVlRUJJ/PF9bWvz/VeQEAAHBomaap4uJibd68WampqRo9erQMw2jUz263xyA6ADg0vF5vowShQCCgmpoaOZ1O2Wy2iL8bga6OJCYAjYzOTtbo7ORYhwEA3doDC77VU4t3qNLjlyT1SnCSxAQAAGLGNE3l5eWFtaWmpioxMTFGEQEAAKAn8nq92rx5s0pKSiRJJSUlKi4uVmZmZowjA4BDy+FwyDRN+f3+sHbTNOV2u2Wz2eR0OputygR0NRzRAAAAsWAYoQQmSXpnzV4Fg60ruwoAANBeysvLVV1dHdZGFSYAAAAcKqZpqqioSMuWLQslMNXbvHlzaGo5AOgpLBaL4uLi5HK5IlZc8vv9qqmpkc/na/WUbkBnRhITAABADMwc3zfsdUGFWyt2lcUoGgAA0NOlpKRo1KhRSkpKkiTFxcUpPT09xlEBAACgJ/B6vVq/fr02bNjQqOKIVFchlCmTAPRUdrtd8fHxstkaT7JVX5XJ7XYrGAzGIDqg/TGdHAAAQAwMz0rS8KxEbSqsCrW9vWqPpgziYiEAADj0LBaLMjMz1bt3b1VUVCgQCHChCAAAAB2uqKhIW7Zskc/na7TObrdr6NChTCUHoMerr8rk8/nk8XgaVV7y+/0KBAJyOp2y2Wx8nkeXRhIT0IOZpqnfvrZWp4zO0vHDe8ti4Q9aZxMImnL7AnUPf/C7ZV9QHl9Abn/dcn2b2xdQrS9wYF1QXn9QDptFTptFLrtVTptFzgPPrhY+x9mtHBtAB5k5PlsPfLAp9PqdtQW6/cwxsvIzBwAAYsQwDKWkpMQ6DAAAAHRzXq9XmzdvbjR1XL2MjAwNGzZMDofjEEcGAJ2X3W6X1WqVx+NpVLmuviqTzWaT0+mUxcKkXOiaSGICerDFW/bpxaW79OLSXcrNSNBlRw3UJUcOlN3KH7VDxTRNFVd6tGNfjXbuq9bOfTXaceB5575qVbgbl8491CyGlBJnV1q8Q6nx9c8OpcXblZZQ15YaV/c6Nd6htIS6Pi67NdahA53eGeP7hiUxFVd69NX2fTp6SEYMowIAAAAAAAA6TnFxsTZv3hyx+pLNZtOwYcPUu3dvKokAQATNVWWisjK6OpKYgB5s7hfbQ8vbS6r1zJc7delRg2IXUDcVCJrau782lKC0KyxRqUa1vkCsQ2xS0JTKanwqq2n8gbIpLrtFafEOpcU71CvRod5JzrpHYvhzRqJTqfF2/qFCjzSkd6JG9U3Whr0Voba3V+8liQkAAAAAAADdjtfr1ZYtW1RcXBxxPdWXAKDlolVlcrlcXHNDl0YSE9BD7dxXrY82FoW1XX70IKYNO0imaWpTYZU++bZIS7eXavu+auWV1sobCMY6tEPO7Qtq73639u53N9vXbjWUkViX0FSf4JSR5DiQ6ORS7ySnMg8kQSU4+dOF7mXm+L5hSUzvrS3QH88aIxtV8QAAAAAAANCN7NmzJ2ICE9WXAKBtvl+VyWazyWbjOhq6No5goIea+8UONawumOSy6dzD+8cuoC6s0u3T4i37tGhTkT75trhFSTsHw2ox5LJZ5LJb5bJb5bRb5LJZ5bLXtcU1aHfaLPL6Tbn9AXl8QXkOPLv9Abl9AXn8wbBnty82yVa+gNnihKcEh1WZya5QZafMJKcyk1yhJKfM5LrXaVR3Qhdx5vhs3ff+t6HXpdVefbF1n44b3juGUQEAgJ6gqKhIRUVF6t+/v1JSUvj/GQAAAB1qwIABKi4uVk1NTaiN6ksAcPDqqzI19bm+fto5PvujsyOJCeiBKt0+vbw8L6ztwik5VLhpoYbVlhZ+W6TlO8rkD5rNb9gEh82iAenxGtQrXgN7JWhQr3gN6JWgvikuxR1ISKpPTrJ3YHUW0zTlDQTlbpDwVOH2qbzGp7Iar8pqfCqvPvBc6w211z/vr/XJPLgvRbOqvQFtL6nW9pLqJvvVV3eqS25yqXeSI1TpqWHVp4xEhxKdNv5pQ8wM6BWv8f1TtDpvf6ht/uq9JDEBAIAOZZqm8vLyVFlZqX379ikxMVG5ublKT0+PdWgAAADopiwWi0aOHKmvv/6a6ksA0M4slujXD03TlNvtVjAYVFxcXJN9gVgjYwHogV5Zkacqz3dzo1oM6dKjBsUuoC6gyuPX55tLtGhTkRZ9W6w9bai2lOCwamCvBA0MS1SK16BeCeqT7OoUU/kZhiGnzSqnzSrJ3urtA0FTFbUHEptqfSqv8WpflVclVV4VV3pUUuVRcaVHxVV1y+U1vvZ/EweEV3fa32Rfp80SluAUKeGpV6JD6fEOpcTZO8X3Ct3LzPF9w5KY3ltXoD+dM1YOGx8kAABAx6ioqFBlZWXodVVVlQKBQAwjAgAAQE+QlJSkUaNGKTU1lepLAHCI+Hw++f1114ZramrkcrmYdg6dFkcm0MMEg6ae/mJHWNvJo7OUkx4fm4A6KdOUSoNOPfVlnr7cUaHlO0vlC7S8xFC/1DgdP6K3Dh+QFqqulJHo6PZ3lFgthtISHEpLaNmHT48/cCDJ6UBy04FHSVVdolPDtmpvx11Q8fiDyi+vVX55bbN9LYaUFl/3HtPjHUpLsCs9wan0BLvS4h3qlehQWrxD6QnfPeLsTZfwBE4f11d/eWdj6PX+Wp8WbynRjJGZMYwKAAB0Z3l54dV5nU6nMjIyYhQNAAAAugvTNLV3715lZGRETVLKzOScFwAcKn6/Xx6PJ/TaNE3V1tbK6XTKbrdz/QqdDklMQA+z8Nsi7dhXE9Z2+TG5MYqm83H7Apq3Yo9eqBimiqBT+nh7i7azWw1NzU3X9OGZmj6it4ZmJvJHvwWcNquyU+OUnRrXbN9qj19FBxKaiirdKqrwhL2ue/aotNrboTEHTWlftVf7WrEfp82itANVnFLi7EqOsys5zvbda5c9bN13yzbF2a0d+G7QWfRPi9fEAan6Zld5qO2t1XtIYgIAAB2itrZWJSUlYW39+vXjMwwAAAAOSiAQ0KZNm1RUVKSioiKNHz+eKYsAIMYMw5DFYlEwGAxr93g8CgQCcrlcnA9Ap0ISE9DDzP1eFaaRfZJ0RG56bILpRKo8fj3/5U499tl2lVR5JDmb3aa+2tL04b119NAMJTr5ldqREpw25Tptys1IaLKfLxBUSZWnUZJTSZVHJZXeUJWnkg6u7tSQxx9UQYVbBRWtn4bQbjWU5LQp6B4muxHQ8udXKyXepUSnVQlOmxKdNiUceNS3hdod9evr2p02C/+IdmIzx2eHJTEt31GmYNBk+kIAANDu8vPzw15brVb17ds3RtEAAACgO6itrdW6detUXV0tSdq/f7+2bdumoUOHxjgyAOjZrFar4uPj5Xa7Q1PK1fP7/aHp5axWbqpH58AVd6AH2VxYqc82h99te8UxuT06qaG8xqunFu/Q3C92aH+tr8m+VFvqGuxWi/qmxKlvSvPVnWq8fpVUeuuSmg486qezi1XC0/f5AqZKa3yqT6wr3rlf0v42jWW1GHLZLIpzWOW0WRXnsMpltyjObpWrwSPObjnwbJXzwHN9P4fNIrvVIofNIseBZ3vo2ZAz7HWDflZLKBnHNE35g6b8AVP+YFD+gClfMKjAgTZfIBi23hcwD6wLymIxNLJPklLjWzZlYVdyxri+evCjzTp5dJZmju+rY4ZmkMAEAADand/vV0FBQVhbnz59ZLNxiggAAABts2/fPm3cuLHRxfH8/Hz16dNHiYmJMYoMACDVVWNyuVzyer3yesNnGgkGg6FEJrvdHqMIge9whgroQZ76XhWm9ASHzpqQHZtgYqyowq3HP9+u57/c2WRySt9kp2aMyqLaUjcV77BpQC+bBvSKb7av2xdQeY1P+6o9Kqv2qbTGq9Iqj0prfCqr9h547VVZjVel1XXPvoB5CN5FywWCpqq9gZglZNkshswDcRysoZmJmjwwTZMOPHIzErp8UmGfFJdW/N9JslkpsQ0AADpOQUGBAoHw/wf79esXo2gAAADQlZmmqV27dmnHjh2N1lmtVo0cOZIEJgDoJAzDkNPplNVqldvtlmmGX6txu90KBoNyOBxd/noLujauxgM9RHmNV69+nRfWdvHUAXLZe1ZpwN2lNXr002367/Ld8vqDUfv1t1XpcFex/nTdbKWkpBzCCNFZuexW9Umxqk+Kq0X9TdNUpcdfl+BU7VV5jU/7a+seFbUNlt31y35VHFhX6fE3v4MuyN8OyUv1thRVaUtRleYt2y1J6pXg0OED00KJTeP6p8hp63q/30hgAgAAHck0zUZTyWVkZCgurvkqpgAAAEBDfr9fGzdu1L59+xqti4+P15gxYxQf3/zNowCAQ8tmsyk+Pl61tbUKBsOvlXq9XgUCAblcLlksXK9AbJDEBPQQ85btltv33R8im8XQ7KMGxjCiQ2tLUZUe/mSr3liZ32QixcmjszRnal99/sZzkkSmMdrMMAwlu+xKdtk1sFdCq7b1B4KqdPtDCU579+3X/958R17ToqlHH6eAYVOV169qj1/VnoCqPPXL/gPLgbplr19m5yoG1WH2VXv1wfpCfbC+UJLksFo0rn+KJg9MCyU39Up0xjhKAACA2Nq3b5/cbndYG1WYAAAA0FrV1dVat26damtrG63r3bu3RowYIau1691gCAA9hcViUXx8vNxud6OpQAOBgGpqahQXF8fvcsQESUxAD5Hksikr2anCCo8k6fRxfZWV3LKKMl3Z2vz9euiTLXp3bUHUZA6LIZ15WLaunT5UI/okqaKiQp8f2jCBMDarRWkJDqUlOCRJg5ItWumokCT9eGo/JScnt2gc0zRV6wuEEptqvH65fQG5fUG5fQHVHliu9QXk8QVU6w3I7Q+o1huU2x+QO/T6u36+QFC+QFBe/4FHwJTXH5AvYMobCLbLVHH1rBZDNoshu9Uiq8WQ3Wqo0u2Xp4kqavW8gaBW7CzTip1lobbcjARNGpim08b00YmjMklSBAAAPU5eXnh13sTERCrPAgAAoFWKior07bffNqreIUmDBw9W//79Oe8GAO1o165duuuuu/Thhx8qPz9fHk/dtd7XXntNr7/+up5++mkNHDgw4tSeTTEMQy6XSz6fLzRmPdM05Xa7FR8fr0WLFmnGjBmSpIULF2r69Ont8ba0Y8cO5ebmSpKeeuopzZkzp13GRddHEhPQQ1xyxECdPzlH76zZq6cW79DlxwyKdUgdatmOUv174RZ98m1x1D52q6FZk/rrJ8cN0aCM1lXKAboCwzAU77Ap3mGTkg7NPgNBsy7J6UCiU8OEJ48/KMPQd0lJFotsVqPucWA51GYxIp7s8PqDWr+3Qst3lGrFzjIt31mm4kpPhEga215Sre0l1XplRZ7OndhP9513mKwWTqgAAICeobKyUvv37w9r4wITAAAAWso0TW3btq1RYrwk2e12jRo1SmlpaTGIDAC6r127dmnSpEkqKSnpkPENw5DD4ZDFYpHb7ZbZoCKEy+XinAFigiQmoAexWy06e0I/nT2h+04XUFLl0W/+t0YfbiiM2sdlt+jiqQN19XG56psSdwijA7o/q8WQ1WKVy94xJUYdNosm5KRqQk6qrppWd/Ikr6xWy3eWavmOuspL3xZWNjuN3qvf5MswDN03a7wsnTSRqdLt04cbCvX2qr2aNam/fjCub6xDAgAAXdj3LzY5HA717t07RtEAAACgK/H7/Vq7dm2jpHhJSkpK0ujRo+Vydf+ZHwDgUPvzn/+skpIS2Ww23XXXXTruuOOUmJgoSRo4cKBef/31dtmPzWYLTS8XCATkcrmYSg4xQxITgG7j003F+uVLq1RSFbkqS5LTpkuPHqgrjslVr0TnIY4OQEcwDEM56fHKSY/XDyf2lyRVuH36Zlf5genkSvXNrnLVeAONtv3f13myWQzdfe64TpfI9P8+2qz/t3CLvAemzrNZDZKYAABAm3m9XhUXh1epzc7OlsViiVFEAAAA6Eqi/d/Yp08fDRs2jP8rAcRE0apVWvXIIypeuVLeyko5kpLUe8IEHfaTnyjzsMNiHV67+PDDDyVJ55xzjm655ZZG6+fOnau5c+e2y74sFovi4uLk9/tlt9tD7dOnTw+r0AR0NJKYAHR5Hn9A97//rR77bHvE9ekJDl15bK5mHzVQyS57xD4Auo9kl13HD++t44fXVRbwB4LaWFCpL7aW6P73N8kbCIb6/nf5blkshu46Z2ynSmTKSnaFEpgkaeG3xap0+5TE7zAAANAGFotFOTk52rNnj/x+vywWi7Kzs2MdFgAAALoIi8Wi0aNHa8WKFfJ6vTIMQ8OGDVPfvtx0B+DQ27tsmRbeeKP2fPFFo3V7lizRqocfVr9jjtH0v/9dfadMiUGE7Sc/P1+SNHz48EOyP8MwwhKYvs80zUZJTkB7I4kJQJe2tbhKP3/xG63bU9FoXUaiQ9dOH6qLpg5QnIOSh0BPZbNaNLZfisb2S9HQzET95NkV8gW+u2vgxaW7ZLMY+uPZYzrN/M6njumj372+JhSn1x/UhxsKQ9WmAAAAWsNmsyk3N1cDBgxQUVGRfD4fJxwBAADQKg6HQ2PGjNGGDRs0atQoJScnxzokAD3Q1vnz9dasWfK73U32y1+8WP897jid+corGnLGGYcouvbn9XolqdN8hvd4PPL5fAoGg3I4HJ3mmgq6F+o7At3Yp5uKtWtfTazD6BCmaWre0l2a+eDnEROYpo/orfduPE5XHJtLAhOAkBNGZumhSybJ9r2qS89+uVN3vrW+05RETYm3a9qw3mFt81fvjVE0AACgu7Barerbt68GDBgQ61AAAADQBSUnJ2vKlCkkMAGIib3LlrUogame3+3WW7Nmae+yZR0cWfuaO3euDMMISxC68847Q22GYWjOnDmSpDlz5sgwDA0aNCjiWPX977jjDknSsmXLdNFFF6l///5yOp3q16+fZs+erQ0bNkSN55NPPgmN8/HHH0uqS67yeDyhayqbNm3SDTfcoLFjxyopKUkOh0PZ2dmaMGGCrrjiCv33v/+Vx+Np9r1/8MEHOvPMM9WnTx85nU7l5ubqZz/7mfLy8lrwlUN3QRIT0E15/AH98qVVOv7+hbrq6eX6YktJp7k4f7D21/h03Qtf6zevrlGtLxC2zmG16A9njtZTc6YoI9EZowgBdGYn/3/27ju+roL+//j7juy904yONE33HtCW0pZRlJatoCBLZAgqIIqKC/2K/BQpoIJMQUQZYkFpq8wOoC2le6UjXUmavedNcsfvj9q0J2naJrn3npvk9Xw8+njc88kZH8JJ7sk9n/P5jEnRH6+dIluHQqaX1hzSr5blBszvyoXjje24V+0tV21zm0nZAAAAAAAAoL/zeDw6cuSI3G53l+tYrdxaBGCOFffcc8YFTMc4HQ6tvPdeH2XUtzz11FOaNWuWXnvtNR05ckStra0qKirSK6+8omnTpmn16tXd2l9bW5scDofeeOMNjR8/Xn/84x+1c+dONTQ0qK2tTcXFxdq6datefPFFfeUrX9G+fftOub8f/ehHWrBggZYuXarS0lK1trbq0KFDevrppzVlypRTFlqhf2GcHNBPLd9erIqGoxWtH+SW6oPcUr1377nKSYkyObPe+exApe59fYuKajtfpGQnR+r3X5msMWk8BQLg1L4wLlW//8pkfee1zXK5jxctvfDJQdmtFv3wi6NMb4N64dgUBS+xqtV19EOjNpdH7+0s0ZenZZqaFwAAAAAAAPoft9ut3NxcVVRUqK6uTqNGmf/5GIC+x+N2q7my0uv7rdi+XUVr1vRo2yOffqr8FSuUOG6cl7OSwhISZPFycefll1+uadOmSZLGjx8vSfrmN7+pO++8s32duLi4bu3z3Xff1fr16zV+/HjdfffdGj9+vJqbm/XWW2/piSeeUFNTk66//nrt27dPwcHBZ7zfoqIiff3rX1dra6uSk5P1rW99S2effbYSExPV3NysvLw8rVq1Sm+//fYp9/Pcc89pzZo1mjt3rm6//Xbl5OSopqZGL7/8sl5++WWVl5fr61//utauXdut/270TRQxAf2Qx+PRi58eMsTOGhbfpwuYnC63nvhwn55ckSf3SZqkXHfWYP1k4RhGxwE4YwsnDJLL49E9r202/F55ZvUB2awWff+ikaZ+UBMdGqS5I5P0/q7S9tjSbcUUMQEAAAAAAMCrnE6ndu7cqZqaGklSWVmZ7Ha7srOzKWQC0C3NlZV6KjnZ7DQ6eeO883yy3zvLyhSelOTVfcbGxio2NtYQS05O1rheFGGtW7dOF198sd566y1DkdKcOXOUkJCgn/zkJ8rPz9eyZct0xRVXdLmfjgVO7777rhobGyVJH3zwQXvR1TGzZs3SDTfcoD/+8Y+nzG/NmjW69dZb9cwzzxjed84//3wFBwfr+eef17p167R582ZNnjz5jP+70TfR8xHohzblV2tbYa0hdvPsYSZl03sFVU26+pm1+sNHnQuYYsOD9Mz1U/XQFeMpYALQbZdOTNPiqyep42cxT63cr8c+OHVrU39YNME4Uu7TvApVN7aalA0AAOhLmpublZmZqaCgILNTAQAAQABra2vTtm3b2guYjikuLlZTU5M5SQEAvCo0NFQvvvjiSbssfec732mPf/zxx6fcj91uV1hYWPtyaenRh7BjY2OVlZXV5TjSsLAww3YdDRo0SH/4wx9OWjj7ve99r/316fJD/0ARE9AP/blDF6b02DBdOCbFnGR66V9bjujiJz7WpvyaTl+bmZWg/959ri4am+r/xAD0G5dPTtcjX5rYqZDp9x/u0xMmFzKdPzpFIfbjl2tOt0fv7iwxMSMAANBXlJeXKz09XZMnT9ahQ4dUX19vdkoAAAAIMA6HQ1u2bOl0rWiz2TRhwgRFRESYlBkAwJsuvPBCJXfRISsqKkojRoyQJB04cOC0+zpWyGSxWJSaevQebU1Njd555x01Nzd3Wch0Kl/60pcUEhJy0q+NHDlSkZGRZ5wf+j6KmIB+pqimWf/dYbzBfeOsIbJZ+1bL14YWp777xhbd/doW1bc4DV+zWy26/wsj9co3zlJqTKhJGQLoT740NUO/uXJCp/hjH+zVkyvyTMjoqMgQu84bZfzDYum2YpOyAQAAfYXT6VR1dbUkyWq1qrq6WhUVFSZnBQAAgEDS1NSkLVu2dOq2FBQUpIkTJ3YaZQQA6LtGjRp1yq/Hx8dL0hk/AHWskOniiy9uf7+49tprdfHFF+u3v/2t1q9fL5fL5bX84uLiupUf+ja72QkA8K6/rjss1wkz18KCbLpm2mATM+q+LQU1uvu1zTpc2blV7ZCEcD3xlcmalBnr/8QA9GtXT8+U0+3RA29tN8QfeXePbFaL7pg73JS8Fk1I039OKE5ds79CFQ0tSow8+VMJAAAAFRUVnZ58TEtLMykbAAAABJr6+npt375dbW1thnhISIgmTJig8PBwkzID0NeFJSTozrIyr+931f33a+dLL/V4+3E336xzf/Mb7yX0P2EJCV7fpy+c7ve61Xq09013Co9sNpsyMzP12muv6etf/7qKioq0evVqrV69WpIUHR2t888/X1//+te1aNEiv+eHvosiJqAfaW516dX1+YbYVVPTFRMeZFJG3fevLUd03xtb5TyhEOuYK6ek65eXjVNkCL+6APjGtWcNlsvj0U/f3mGI/7//7JbdatE35mT5PafzRiUrPNimptajF+duj/SfHSW6/uwhfs8FAAD0DSUlxu680dHRXbZlBwAAwMBSU1OjHTt2dLoRHB4ervHjxys0lOkHAHrOYrUqPCnJ6/udevfdvSpimnL33T7Ja6CzWq268MILtW3bNr311lt67733tGbNGh05ckR1dXV666239NZbb+miiy7SkiVLKJLFGWGcHNCP/GvLEdU0GZ+cuGnWMJOy6b5/bTmie1/f0qmAKSrErie+MkmLr55EARMAn7v+7CF68JIxneK/WparFz896Pd8woJtOn90iiG2dGuR3/MAAAB9Q3Nzs2praw2xhD7yZCgAAAB8q6KiQtu2betUwBQVFaVJkyZRwAQgYCVPmqS0WbN6tG367NlKnjjRyxnhGKvVqri4OF177bV64YUXlJubq23btumRRx5RTk6OJOndd9/Vj3/8Y5MzRV9BERPQT3g8Hr205pAhdm5OkrKTI81JqJuOFTB1bMA0ZXCslt89R5dNSjcnMQAD0k2zh+knC0d3iv/inV16ee0hv+ezcPwgw/KRmmY52mibCgAAOistLTUst7W1KTo62qRsAAAAEChKSkq0c+dOeTzGD+FjY2M1YcIEBQX1nYkOAAam+Y8/Lns3iy3tYWGa99hjPsoIx1itVoWFhclms0mShg4dqrvvvluff/65MjIyJElvvPGGmSmiD6GlCdBPbC2s1e6SekPs5llDzUmmm/69teikBUw3zhyiny4aI7uNeksA/veNOVlyezz69fLdhvjP/rVTdqtV15412G+5zBuZpOFJEZozIkmXTBykyZlxslotfjs+AADoGzweT6cipsrKSlmt/E0FAAAwkBUVFWnfvn2d4omJiRo9ejTXiwD6hEHTp+uSN9/UO1/6kpwOx2nXt4eF6ZJ//EODpk/3Q3awWCwKCwuTw+GQzWZTUFCQgoKCNH36dBUWFqqiosLsFNFHcFUC9BP/3FhoWB4cH665OYE/2/WdrUW657XNnQqYbp49VA9eOpYCJgCmuu3c4br/CyM7xX/y9nbtOFJ7ki18IzTIpg++O1cPXjpWU4fEU8AEAABOqra2Vo4OH+SWl5eblA0AAAACRUxMjOx2Y1+D1NRUjRkzhgImAH3K8IULdc3q1UqfPfuU66XPnq1rVq3S8IUL/ZTZwPTuu++quLi4fdlisSg0NFTBwcGSjn5OsX79eknSsGHDTMkRfQ+dmIB+oMXp0jvbigyxK6ekB/xN7qXbinTPSTow3Tx7qH62aIwslsDOH8DAcOe8bLlcHj36/t72mNsj/WrZLr1669l++13F70QAAHA6JSUlhuWmpiY1NjaalA0AAAACRUREhMaNG6dt27bJ7XYrMzNTw4YN4/MmAH3SoOnT9dVPPlHZ1q3a9uyzKtuyRa319QqOilLypEmacNttSp440ew0B4RXX31Vl1xyiS688EItWLBA48aNU3x8vOrr67Vjxw798Y9/1JEjRyRJd9xxhyTJ6XS2j50DToYiJqAf2HioWjVNbYbYVVMyTMrmzCzbVqy7X9siV4cKpptmUcAEIPB8+/wRqm9x6tnVB9pj6w5U6b1dpbpobKqJmQEAABzlcrk6dV2iCxMAAACOiYmJ0dixY9XY2KjMzEyz0wGAXkueOFEXPPmk2WkMeG1tbVq+fLmWL1/e5Tp33HGHvvOd76itrU0Oh0N2u10ej6fL9TGwUcQE9AOzshO14nvz9NamQv1z0xGlx4UpMz7c7LS6tGxbsb7z2uaTFjD9/BIKmAAEpu9emKNl24p1pKa5Pfbw8lzNH5msYDtttwEAgLnKy8vldrsNsYqKCpOyAQAAQCCKj49XfHy82WkAAPqJxx57TBdeeKE++ugjbdu2TcXFxSovL5fNZlNmZqZmzpypb3zjGzrnnHPkdDrlcDgkHe3G1NLSYnL2CFQUMQH9xLDECH13wUjdc0GOqppazU6nS10VMN04cwgFTAACWmiQTfd/YaTufm1Le+xQZZNeXntI35iTZVpeHo+H350AAEClpaWG5ejoaLW1tXWxNgAAAPojj8ejxsZGRUZGmp0KAMALTtet6KWXXtJLL73U4+2PWblyZZdfmzdvXpf7iYuL03XXXafrrrvulPv3eDztBUzHpKenq7m5WSEhIae9x3Ho0KFTfh39C20DgH7GarUoMTLE7DROavn2kxcw3TBziB68dCw34QEEvEsnpmny4FhD7IkP96mq0b/Fo2X1Dv117SFd88xa/fnTQ349NgAACDwOh0M1NTWGGE/YAwAADDz5+fnauHGjiouLzU4FAIB2FotFoaGhneJtbW1qbQ3c5hwwB0VMAPziP9uL9e1XOxcwXX/2EP2CAiYAfYTFYtFPF40xxOodTj3+wV6/5fD0qv06+9cf6qf/2qnPDlbpna1Ffjs2AAAITFVVVYZlu92umJgYk7IBAACAGYqKito7Vezdu1f5+fnmJgQAwAnsdrvCwsI6xVtbWylkggFFTAB87r87Tl7A9LWzB+uXl1HABKBvmTI4TpdOTDPE/vZZvvaV1vvl+KMHRevEX6dbCmpUUNXkl2MDAIDAlJaWpunTpyszM1PBwcFKSkqS1cpHPgAAAANFWVmZ9u3bZ4gdPHhQ9fX++bwKAIAzYbfbT9qRqaWlRW1tbSZkhEDEJ1oAfOq/O0r0rb9vlvMkBUz/d9k4CpgA9Ek/+OIohdiPX0a53B49tDzXL8eeNTxBseFBhth/dtAiHACAgS48PFxZWVk6++yzlZWVZXY6AAAA8JOqqirt3r27U3z48OGKiooyISMAALoWFBSkkJCQTnGHw0EhEyRRxAT0WU6XW19+eo0e/2BvwHbgOFrAtKlTAdN1Zw3WLy+lgAlA35UeG6Zb5xhvDq7cU65Ve8t9fuwgm1VfGJtqiC3bRhETAAA4ymKxyG63m50GAAAA/KC2tlY7d+6Ux2P8DH7IkCHKyMgwKSsAAE4tODhYwcHBneIOh0NOp9OEjBBIKGIC+qhP8ir0+aFqPf7BPs357Qpd/cxaNbYEzi/1d3eevIDp2rOOdmCyWilgAtC3fXPecCVFGZ8W+NXSXXK63D4/9sIJgwzLWwtrA7agFQAAAAAAAN7X2NioHTt2yO02fhaVlpamIUOGmJQVAABnJjg4WEFBQZ3izc3NcrlcJmSEQEERE9BHLdl0xLDc3OpSREhgPG373s4S3fW3zgVMX50xWL+igAlAPxERYtf3F4w0xPaVNejVzwt8fuyZWQmK6zBSbtl2ujEBAAAAAAAMBM3Nzdq2bVunbhXJycnKzs5mCgIAIOBZLBaFhIRQyIROKGIC+qA6R5ve3VliiF01Jd2kbIze31Wqu07SgemrMzL10OUUMAHoX66amqExg6INscfe36vaZt/ObbbbrPrCOGM3JkbKAQAw8HQcGwIAAID+r7W1Vdu2bVNra6shHh8fr5EjR1LABADoM44VMtntxkYdHo9Hzc3NnboNYmCgiMnHDh8+rPvuu0+jRo1SRESE4uPjNX36dD3yyCNqaurd2JeXXnpJFovljP699NJLp91fU1OTfvvb32r69OmKj49XRESERo0apfvuu0+HDx/uVa7wruXbitXiPP5LO8hm0aWTzC9iyi2u07f+vkltLuMH6V+ZnqmHLh9PAROAfsdmteini8YYYlWNrXpyRZ7Pj72ow0i57Udqdbiy0efHBQAAgcHhcGjDhg06fPiwHA6H2ekAAADAD5xOp7Zt29bp+i86OlpjxoyR1cptPwBA32KxWBQaGiqbzWaI2+12CnMHKK5mfOidd97RhAkTtHjxYu3Zs0dNTU2qrq7Whg0bdP/992vy5MnKy/P9Tc4zkZeXp0mTJukHP/iBNmzYoOrqajU1NWnPnj1avHixJkyYoKVLl5qdJv6n4yi5+SOTFR8RbFI2R9U72nTn3zYZiqukowVMv76CAiYA/dfM4QlaMCbFEHvx04M+Lyg6a1i8Ejr87mekHAAAA0dpaamampp06NAhffbZZ9q5c6fZKQEAAMCHXC6Xtm/frsZG42dOERERGjduXKebvwAA9BUWi0VhYWHtxbjBwcEKCQmhiGmAoojJRzZv3qxrrrlGdXV1ioyM1EMPPaQ1a9boww8/1K233ipJ2rt3rxYuXKj6+vpeH+/dd9/V9u3bu/x3+eWXd7ltfX29Fi5cqH379kmSbr31Vn344Ydas2aNHnroIUVGRqqurk7XXHONtmzZ0utc0Tv5lU1af6jKELtySoZJ2Rzl8Xj0wyXbdbDC+MfTVVMyKGACMCA8cPFoBdmO/65rc3n08PLdPj3m0ZFyqYYYI+UAABgYPB6PSktLDbGgoCCTsgEAAICveTwe7dq1S3V1dYZ4aGioxo8fz7UgAKDPO1bIFBISQgGTSTwez+lX8gP76VdBT9x9991qbm6W3W7Xe++9p5kzZ7Z/7bzzztOIESN0//33a+/evXr00Uf14IMP9up4OTk5Gjp0aI+2feSRR7R3715J0m9/+1t9//vfb//azJkzNW/ePM2dO1dNTU265557tHLlyl7lit7556ZCw3JceJDOG5VsUjZH/XXd4U43zidkxOjXV46jgAnAgDA0MUI3zhyq5z852B77784SrTtQqbOzEnx23IUTBulvn+W3L+8sqtPBikYNS4zw2TEBAID56urq1NzcbIilpKR0sTYAAAD6OovFori4OFVVHX/AOTg4WBMmTFBISIiJmQEYKGw2m5xOp5xOp1wuF93f4BNWq1XBweZOHxqoXC6XXC6XJJn+800nJh9Yv369Pv74Y0nSLbfcYihgOua+++7T6NGjJUlPPPGE2tra/JrjMW1tbfr9738vSRo9erTuu+++TuvMmjVLt9xyiyRp1apV+vzzz/2aI45zuz1astlYxHTpxDQF2837Ud5aUKP/W7rLEIsOtevJa6coxM4FDICB49vnj1BcuPGpt18t2yW323eV62cNS1BipPGCfjkj5QAA6Pc6dmEKCwtTdHS0SdkAAADAHzIyMjRy5EhJkt1u1/jx4xUWFmZyVgAGivDw8PbXNTU15iWCAc3j8QRMt6D+5sSf6xN/3s1AEZMPvP322+2vb7755pOuY7VadcMNN0g6ekKsWLHCH6l1smLFCtXW1kqSbrzxxvY5kx3ddNNN7a/feustf6SGk9hwuFoFVcanba+aat4oudqmNt31901qcxnfLB69epIy48395QYA/hYTFqR7L8wxxHYcqevUQc+bbFZLp5FySxkpBwBAv+ZyuVRWVmaIpaSk0GYdAABgAEhNTdXYsWM1btw4RUZGmp0OgAEkNja2/XVZWZnKysrkcDgoKIHfuN1uNTU1qbW11exU+g2PxyOHw9H+M31MXFyciVkxTs4nPvnkE0lSRESEpk6d2uV6c+fObX/96aefasGCBT7PraNjuXbMp6Np06YpPDxcTU1N+vTTT/2RGk7inxuNN8KzkyM1Pj3GlFw8Ho/u+8cWFVYbi6puPzdLF45hjAGAgenaGYP18trDyitraI898u4eXTx+kCJCfHPZtXB8ml5Zd3ykXJvLrTpHm6JDg06xFQAA6KsqKyvb23sfwyg5AACAgSMxMdHsFAAMQKGhoYqJiWlvjlFZWanKykpZLBbTR0/1NR6Pp70Qp76+noeSzoDH45Hb7W4vmrNarV02ZxmoenJeuVyuToWIMTExpo+qpYjJB3JzcyVJ2dnZstu7/haPGjWq0zY9dfPNN2vPnj2qqKhQdHS0srOzdcEFF+ib3/ym0tPTu9xu167jY8BOzKcju92u7Oxsbdu2rde5omeaW11a1mFE0FVTMkx7Y3t29QF9kGt8+nf60Dh976KRpuQDAIHAbrPqxwtH6+YXj49eLatv0TOr9uu7C3zz+3HGsHjNGBavs4fFa9HENOWkRPnkOAAAIDCUlJQYlmNjYxUaGmpSNgAAAPAFj8fDTW0AAWfQoEEKDg5WeXl5e8zj8cjpdJqYVd/jdrvV0HD0QeioqCiKcU7jWHFOx2KboKAgCuhO4I3zKikpSQkJCd5OrdsoYvIyh8OhiooKSUfnE59KXFycIiIi1NjYqIKCgl4dd+XKle2vj1W+fvbZZ3r00Uf1+OOP6/bbbz/pdoWFRzv7REREGNoAnkxmZqa2bdum8vJytbS0dKsC79hxulJcfLw4p7GxUXV1dWe874Fi2c4yNbQcvwiwWqQLRkSb8r3aVFCr3/53tyEWF2bXry8ZoebGBjV3sV1fcewXfMfXgFk4J/uWqYNCNSsrTmsOVLfHnl19QIvGxCs12jfV689/dez/Xnl8/r7A+YhAwvmIQMM5CV9rbW1VdXW1IRYTE3PS93/ORwQazkkEksbGRrNTAIAuNTc3Kzc3VyNHjlRERITZ6QBAO4vFosTEREVHR6uhoUGNjY1qbW2V2+02O7U+xel0tne0iomJOWVTFBzldrs7XcO3tbUpOjqaQqb/6cl5ZbVaFRwcrIiICEVGRio4ONjXaZ4RfiK8rL6+vv31mcwjPlbE1NMPb7KysnTllVdq5syZyszMlCQdOHBA//znP/Xmm2/K4XDojjvukMVi0W233dZlvmea6zENDQ3dKmI6ltuZWLJkiWJizBmRFsiW1g+RdLy7RrqtXkte+bPf82hy2/RmXbZcnhPHFHk027ZPS17Z4vd8fO2vf/2r2SkABpyTfUOmK0QWZcujo0/MOZxu3fXse7og4tRFvX0N5yMCCecjAg3nJHwhLS1NgwcPbl92Op36xz/+cdoPjDkfEWg4J2G2Yx/uA0Cgcblc2rlzpxobG7Vp0yaNHDlSycnJZqcFAAbBwcGKj49XfHy82an0SXV1dfr3v/8tSZo5c6aio6NNzqhvyM/P18GDBw0xi8WiyZMnUwim/nVe8X/TyxwOR/vrM6lUO1YI1Nzc/d41V1xxhW688cZOLUWnT5+ua665RkuXLtWVV16ptrY23Xvvvbr00kuVmpp60ny7k2tP80XPudu743mk/90QzwmuMSWPDxsz1WgoYJKmhZYrM4gn2ADgmHhbi8aEVGlny/G2m/taYzU+pFIpdt5DAQBAzyQlJRmWq6qqeOIVAACgn/B4PNq7d297pwm3263c3Fx5PB6lpKSYnB0AAObKzMxUY2OjysrK2mNNTU3as2ePxowZwxjWfoQiJi8LDQ1tf93a2nra9VtaWiRJYWFh3T7W6boVLVq0SD/72c/005/+VE1NTXrhhRf04x//+KT5difXnuR7unF5xcXFmjFjhiTpyiuvVE5OTrf2PxDcJamkrkXLd5bpgz2V+vV11ygsyL/t8f708WEVfpxviJ09NFZ/+so5sln7zxtDQ0ND+1Oh119//Rl1KgN8iXOyb7qmsVWXPL1B9S2u9tiBmMn6+fUT+vTFNOcjAgnnIwIN5yR8qbGxUXv37jXEZs+erYsuuuik63M+ItBwTiKQ7N27Vw8//LDZaQCAQVFRkeHGrCSFh4crISGhiy0AABg4LBaLcnJy1NjYaBgtV1FRocLCwm5NhkJgo4jJy6Kijo/7OpMRccd+wHz1wc1tt92mn/3sZ/J4PFq1alWnIqZj+XYnV6n7+WZkZJzxuhEREX26vZkvRUdLORlJuufkn1H71Cf7KvT0J8YCpuSoEP3xa9MUF3nmowX7msjISM5HBBTOyb4jOlr69vkj9Ovlu9tjWwrrtPpQoy6ZmOaXHFxuj0+LTDkfEUg4HxFoOCfhbaWlpYbl0NBQDRo06IyKozkfEWg4J2G2iIgIs1MAAIPa2lrt37/fELPZbBo7diwjcgAA+J9j742bNm2S0+lsjx84cECRkZGKi4szMTt4i9XsBPqb0NDQ9qr4wsLCU65bXV3dXhjkq8rA5OTk9nyOHDnS6evHiosaGxtVU1Nzyn0d66aUlJRkGC2H/q+k1qG7X9ssj+d4zGa16I/XTlFiPy5gAoDeunHWUA1JCDfE/t9/dsvR5upii947XNmop1bmaeHvP9YfPtrns+MAAAD/cbvdnZ7KT01N7dPdHQEAAHBUS0uLdu3aJc+JH8BLGjVqlMLDw7vYCgCAgSksLEyjRo3qFM/NzZXD4TAhI3gbRUw+MGbMGElSXl6eoQKwo927j3dmGD16tM/yOdWHmsdy7ZhPR06ns/0pAF/misDjdLn17Vc3qbLROHLw+xeN1Ixh8SZlBQB9Q4jdph990XgxfaSmWS98ctAnx3t61X7NfWSlfvvfPdpZVKdl24p9chwAAOBfra2tnToip6SkmJQNAAAAvMXtdmvXrl1qbTV+/j548GAlJiaalBUAAIEtISFBQ4cONcTa2tq0a9cuud1uc5KC11DE5APnnHOOpKPdjTZu3NjleqtWrWp/PXv2bJ/kUl5eroqKCklSWlrn0TXHcu2YT0cbNmxo7xrlq1wRmB55b48+P1RtiJ0/Klm3zckyKSMA6FsuGpuqszoUfT61Ik9l9d5/ImD6UGOr1H1lDdpbWu/14wAAAP8KDQ3VxIkTddZZZ2no0KFKTU1VaGio2WkBAACgl/bv36+6ujpDLC4urtONWQAAYDR48OD2iVTH1NfXa9++fZ26G6JvoYjJBy6//PL21y+++OJJ13G73Xr55ZclSbGxsZo/f75Pcnn22Wfbf0jnzp3b6evz5s1TTEyMJOkvf/lLlz/QL730UvvrK664wvuJ4qQqG1rkcpv3S/aDXaV6ZtUBQyw9NkyPXj1RVitjCwDgTFgsFv100Rid2BixsdWl33/o/VFvkzPjNCjGeENzKd2YAADoN0JDQzVkyBCNHDnS7FQAAADQSyUlJSoqKjLEQkNDNXr0aMYGAwBwGhaLRaNGjVJYWJghXlJSotLSUpOygjdQxOQDM2bM0Jw5cyRJL7zwgtauXdtpnUcffVS5ubmSpLvvvltBQUGGr69cuVIWi0UWi0U33XRTp+0PHTqkzZs3nzKPpUuX6pe//KWko7Mhb7755k7rBAcH6zvf+Y6ko3Mif/e733VaZ+3atXrhhRckHS2Emj59+imPC+954K3tmvnwh3p4ea7fO2kUVDXpvn9sNcSCbBY9ed0UxYYH+zUXAOjrxqXH6KopGYbYG58XqrTOu92YrFaLvjhukCG2bFsRTx0AAAAAAAAEkGOdIk5ktVo1ZsyYTveLAADAydntdo0dO1ZW6/Gyl9jY2E4dmtC3UMTkI0888YTCwsLkdDq1YMECPfzww1q3bp1WrFih22+/Xffff78kKScnR/fdd1+393/o0CFNmTJFs2bN0sMPP6zly5drw4YN2rBhg9544w1dffXVuvTSS9vnKP/ud79Tenr6Sff1/e9/Xzk5OZKk+++/X7fffrtWrFihdevW6eGHH9aCBQvkdDoVFhamxx9/vGffEHRbdWOrPtpdprL6Fj2z+oAWPLZay/zUTaPF6dK3/r5Jtc1thviPLx6tSZmxfskBAPqb7y0YqWDb8UuvVpdbz60+cIotembhBGMR0/7yRu1hpBwAAAAAAEBAaGtr065du+R2uw3xnJwcRUVFmZQVAAB9U0RERHvH6szMTE2YMIGC4D7ObnYC/dXkyZP1+uuv62tf+5rq6ur0wAMPdFonJydHy5Yt69VF6dq1a0/a6emY8PBwPfbYY7rtttu6XCcqKkrLli3TxRdfrH379unZZ5/Vs88+a1gnOjpaf/vb3zRp0qQe54ru+ffWIrW5jnfOCLZbNScn0S/Hfnj5bm0trDXEFo4fpBtnDfXL8QGgP0qNCdWXpmXo75/lt8f+9lm+7pqfrbgI73W4m5wZq7SYUBXVHu/ytGxbsUalRnvtGAAAAAAAAOg+j8ej3NxcORzG7txpaWlKSUkxKSsAAPq25ORkhYeHKzIy0uxU4AV0YvKhSy65RNu2bdO9996rnJwchYeHKzY2VtOmTdNvfvMbbd68WdnZ2T3a99SpU/XKK6/orrvu0llnnaXBgwcrPDxcwcHBSklJ0XnnnaeHHnpIBw8ePGUB0zHZ2dnavHmzfvOb32jatGmKjY1VeHi4Ro4cqXvvvVfbtm3TokWLepQreuafmwoNywvGpCg61PdVo8u2FeulNYcMsWGJEfp/V41nDjcA9NId5w6XzXr8d2lzm0svfnrQq8ewWi26eHzHkXLFjJQDAKAPampq4j0cAACgH/F4PAoONj7MFh0dreHDh5uUEQAA/QMFTP0HnZh8bMiQIVq8eLEWL17cre3mzZt3yg8qo6KidN111+m6667rbYrtIiIidP/997ePuoN59pXWa1uHTkhXTc3w+XEPVTTqB//cZoiF2K168topivJDARUA9HeDE8J16cQ0vbX5SHvspTWHdOu5WV79PbtwwiA9/8nx4qgDFY3KLa7XmDS6MQEA0Fe43W5t3rxZNptNKSkpSklJUXh4uNlpAQAAoBesVqtGjhypqKgo7d+/X0FBQRozZoysVnoOAAAASHRiAgLSPzcdMSwnRYVoTrZvR8l5PB79aMl2NbQ4DfFfXjaWm94A4EV3zjM+WVfncOqv6w579RiTMmOVHhtmiC3bXuTVYwAAAN+qrKyU0+lUS0uL8vPz9fnnn6ulpcXstAAAANBLFotF6enpmjhxosaMGaOQkBCzUwIAoN9yOp3atWuXGhoazE4FZ4giJiDAuNwevbXZOEruisnpstt8++P6ry1FWnug0hC7akqGrp6W6dPjAsBAMyIlSl8Ym2qIvfDxQTW3urx2DIvFooUTGCkHAEBfVlpaaliOiYnhBhcAAEA/EhMTo5iYGLPTAACg32poaNDGjRtVXl6unTt3yul0nn4jmI4iJiDAfJpXodI649O1V05J9+kxa5vb9KtluYZYWkyofnnZWFksFp8eGwAGorvmZxuWKxtb9frn+V49xsLxxiKmQ5VN2llU59VjAAAA32htbVVlpfEhk9TU1C7WBgAAAAAAwInq6uq0efNmORwOSZLD4VBubi4Pe/cBFDEBAeafm4xdmMamRWtUqm/HuT363h5VNBgLp35+6VhFhNh9elwAGKjGZ8To3JwkQ+yZ1QfU6nR77RgTMmKUEddxpFyx1/YPAAB8p7y83LBstVqVmOjbEeMAAADwvrKysvabpwAAwH8iIyMVERFhiFVVVSk/37sPlMP7KGICAki9o03v7iwxxK6akuHTY24rrNFf1x02xM4flawFY1J8elwAGOi+1aEbU3Gto9M40d5gpBwAAH1XWVmZYTkxMVF2Ow+ZAAAA9CWNjY3avXu3Nm3apOrqarPTAQBgQLFarRozZoyCgoIM8cOHD6uhocGkrHAmKGICAsh/tpfI0Xa8C4fdatGlk9J8djyX26Mfv7VDJ97PDg2y6sFLGSMHAL42Y1i8ZgyNN8T+tHK/nC7vdWNaNN74HhIfEazqpjav7R8AAHhfS0uL6uqMI2CTkpK6WBsAAACByOPxaM+ePfJ4PGpra9O2bdtUUFBgdloAAAwooaGhGj16tCHm8Xi0e/duud3euxcD76KICQggb3YYJTdvZJISI0N8dry/fXZY24/UGmLfPm+EMuPDfXZMAMBxd51n7MZ0qLLJqyPfxqVH6wtjU/Xji0frkx/M19t3zVZ8RLDX9g8AALyv4yg5m82m+Pj4LtYGAABAICooKFB9fb0h1traalI2AAAMXHFxcRo8eLAh1tjYyFi5AEYRExAgCqqatP5glSHmy1FyZfUOPfLuHkNseFKEbp2T5bNjAgCMzh2RqPHpMYbYUyv2y+32zsg3i8Wip6+fqlvPzVJGHAWqAAD0BScbJWe18vENAABAX9HY2KhDhw4ZYmFhYRo6dKgp+QAAMNANGTJEERERhlh+fj5j5QIUn4IBAeLtzUcMyzFhQTpvdLLPjvfrZbmqdzgNsf+7fJyC7fxaAAB/sVgsumv+cENsT2m9Ptxd1sUWAACgP3M4HJ2e2GeUHAAAQN9x4hi5E40aNUo2m82krAAAGNisVqtGjhxpiDFWLnBRrQAEiLHp0TpvVLKCbBZJ0iUTBynE7ps/atbkVejtLUWG2BWT0zVreKJPjgcA6NqCMakakRxpiP1xRV6nD7sAAED/13GUnN1uV1xcnEnZAAAAoLvy8/M7FaVnZGQoOjrapIwAAIAkRUVFMVauj7CbnQCAo84blaLzRqWotqlN7+4q0bi0mNNv1AMtTpd+8q8dhlhUqF0PXDzaJ8cDAJya1WrRnfOH697Xt7bHthbU6NO8Sp0zguJSAAAGko5FTIySAwAA6DsaGxt1+PBhQyw8PFzDhg0zKSMAAHCiIUOGqLKyUo2Nje2x/Px8JSQkKCoqysTMcCI+CQMCTEx4kK6elqkxab55MuO51Qd0oLzRELv/opFKigrxyfEAAKd3yYQ0ZcaHGWJPrsjz2fE8Ho8cbS6f7R8AAHRfc3Mzo+QAAAD6KLfbrd27d3fqrD1y5EiK0gEACBDHxspZLJb22LFRsIyVCxxcOQEDSH5lk/7wkfGm+ISMGF171hCTMgIASJLdZtUdc4cbYmsPVGrj4WqvHcPj8WhnUa1++9/dmve7lXr0vT1e2zcAAOg9RskBAAD0XQUFBWpoaDDEMjMzGSMHAECA6WqsXGFhoUkZoSOKmIABwuPx6Of/3qEW5/EqUqtFeujy8bJZLafYEgDgD1+amqGUaGNXPG92Y3ru4wNa+PtP9NTK/Tpc2aRl24o7PR0IAADMEx4ebihaSkpKMjwZCAAAgMDU0NBw0jFyQ4cONSchAABwSoMHD1ZERET7cnJysgYNGmRiRjgRRUzAAPHuzlKt2GN8svf6s4dofEaMSRkBAE4UYrfp1jlZhthHu8u0s6jWK/s/N8c4jqao1qHNBTVe2TcAAOi9xMRETZgwQbNmzVJOTg4fngEAAPQBbrdbe/bsYYwcAAB9iNVq1ahRoxQSEqKxY8dq9OjRCgoKMjst/A9XUICJPB6P1uyvUJvLtzM2G1uc+sU7Ow2xxMgQ3XfRSJ8eFwDQPdeeNVhx4cYL5adW7PfKvkemRGl4UoQh9s7WIq/sGwAAeE9QUJAGDRqkqKgos1MBAADAaTBGDgCAvikyMlIzZsxQYmKi2amgA4qYABPtLKrTtc99phkPfaAfLdmuT/Mq5HZ7f7TPEx/uU3GtwxD76aLRig6lohQAAkl4sF1fnz3MEFu+o1j7yxu62OLMWSwWLZyQZoi9s7VITh8X0gIAAAAAAPRXbW1thmXGyAEA0HfQNTEw8X8FMNHSbcWSpOqmNr26Pl8/XLJNFot3j7G7pE4vfHLQEJudnaBLJ6Z1sQUAwEw3zBqqqBB7+7LHI/1ppXe6MV0+yfi7v6KhVR/vq/DKvgEAAAAAAAaa7OxsTZgwQSEhIZIYIwcAANBbXEkBJvF4PFq23TjGZ+H4NFm8WMXkdnv0k7d2yHVCd6dgm1W/vGycV48DAPCemLAgXT9ziCH29uYjKqxu6vW+s5IiNSkz1hD756bCXu8XAAAAAABgoIqLi9O0adM0duxYxsgBANAPtLa2qqyszOw0BiyKmACTbCusVUFVsyG2aMIgrx7jzU2F2nC42hC7fW6WhidFevU4AADv+vo5wxQadPwyzen26JlVB7yy7yunpBuW399VqjpHWxdrAwAAX6utrZXH4/2x4gAAAPAfu92uxMREs9MAAAC94PF4VFpaqs8//1y5ubmqr683O6UBiSImwCTLthcblocmhGtsmvee0qhubNXDy3MNscz4MN01P9trxwAA+EZiZIi+Mn2wIfb6hgKV1Tl6ve9FE9IUZDveja/F6dZ/OrwnAQAA/2hsbNSWLVu0du1a7du3TzU1NRQ0AQAAAAAA+JnH41Fubq52794tp9MpSdq9e7fcbrfJmQ08FDEBJvB4PFq2zXjDeNEE746S+81/d6u6ydhZ45eXjlNokM1rxwAA+M7tc7MMxUatTrde+ORgr/cbHxGseSOTDbElm470er8AAKD7ysvLJUltbW0qKipSbm7uabYAAACAmVwul9kpAAAAH7BYLIqIiDDEmpqadOjQIXMSGsAoYgJMsCm/RkdqjKPkFnpxlNzGw1V67fMCQ+wLY1M1f1RyF1sAAALNoJgwXTUlwxB7Zd1h1TS19nrfV042jpT77GCVCquber1fAABw5jwej8rKygyxpKQkrz7cAgAAvOPw4cO67777NGrUKEVERCg+Pl7Tp0/XI488oqam3v09/dJLL8lisZzRv5deesk7/0HokYaGBq1bt05FRUV0zwQAoB/KzMxUZGSkIVZQUKC6ujqTMhqYKGICTNCxC9PwpAiNSo3yyr6dLrd+/NYOQyw82KafXTLGK/sHAPjPHXOHy3rCfczGVpde/PRQr/d73uhkRYfaDbG3N9ONCQAAf2psbFRzs/HhluRkHjwBACDQvPPOO5owYYIWL16sPXv2qKmpSdXV1dqwYYPuv/9+TZ48WXl5eWanCR/zeDzau3evnE6n9u3bp+3bt8vhcJidFgAA8CKr1aqRI0d2esBs7969FDD7EUVMgJ+53R4t324sYlroxVFyL605pN0l9YbYvRfkKC02zCv7BwD4z9DECC2akGaIvbTmkBpanL3ab4jdpkUTjftdsvkIF+EAAPjRsVFyx4SEhCgqyjsPtwAAAO/YvHmzrrnmGtXV1SkyMlIPPfSQ1qxZow8//FC33nqrpKM3tRYuXKj6+vrT7O303n33XW3fvr3Lf5dffnmvj4GeKSsrM/w/rq6uVklJiYkZAQAAX4iMjNSQIUMMscbGRt73/ch++lUAeNPG/GqV1Bmf0FjkpVFyxbXNeuz9vYbYqNQo3TR7qFf2DwDwv7vmZ+vfW4val2ub2/TKusO6Y+7wXu33qinp+vtn+e3LB8obtbWwVpMyY3u1XwAAcHoej6dTEROj5AAACDx33323mpubZbfb9d5772nmzJntXzvvvPM0YsQI3X///dq7d68effRRPfjgg706Xk5OjoYOHdq7pOF1LpdLBw8eNMTCwsI0ePBgkzICAAC+lJmZqfLycjU2NrbHDh06pOTkZNlsNhMzGxjoxAT42dITbkRLUk5KpHJSvPO07a+W5qqx1WWMXT5OQTZ+1AGgrxqZGqULx6QYYs9/fFCONlcXW5yZKYPjNCQhXJJkt1p0wegU2a3cOAUAwB8aGho6jZJLSkoyKRsAAHAy69ev18cffyxJuuWWWwwFTMfcd999Gj16tCTpiSeeUFtbm19zhH8UFhaqpaXFEMvKypLVyufuAAD0R1arVVlZWYZYa2ur8vPzu9gC3sQVFuBHLrdHy3cYW811HBPUU5vzq7Wsw5i6q6dlaNrQeK/sHwBgnrvmZxuWKxpa9MaGgl7t02Kx6K752frFpWP12QPn6/kbp2lcekyv9gkAAM5Mxy5MoaGhjJIDACDAvP322+2vb7755pOuY7VadcMNN0iSampqtGLFCn+kBj9qbW1VQYHxM5jY2FglJCSYlBEAAPCH+Ph4xccb77OfrLAZ3kcRE+BH6w9Wqbze+IttoZdGyf3uvT2G5djwIP3wi6O9sm8AgLkmZcbqnOxEQ+yZVQfU5nL3ar9XT8vUjbOGKiEypFf7AQAAZ45RcgAA9A2ffPKJJCkiIkJTp07tcr25c+e2v/700099nhf869ChQ3K5jN2ws7KyuHYDAGAA6NiNye12dxoxC++zm50AMJAs3WYcJTd6ULSGJ0X2er+f5lXo07xKQ+yuedmKjwju9b4BAIHhrvnZ+iSvon35SE2z/rWlSF+ammFiVgAAoLvq6+vlcDgMMUbJAQAQeHJzcyVJ2dnZstu7vpUyatSoTtv01M0336w9e/aooqJC0dHRys7O1gUXXKBvfvObSk9P7/F+CwsLT/n14uLjHf7r6+tVV1fX42N1R0NDw0lfB4rm5mbD90Y62pXB4/H47XuE7gv08wp9D+cUvI1zqm9JTExURcXxezOlpaWKjY1VeHi4iVl1ZtZ5VV9f7/V9UsQE+NGCsamqdzj1QW6pmlpdWuSFLkwej0ePvGvswpQSHaLrZw7p9b4BAIHj7Kx4TR0Sp42Hq9tjT63M0xWT02Wz8vQfAAB9RccuTGFhYYqM7P3DLQAAwHscDkf7zaqMjFM/PBQXF6eIiAg1NjZ2GjvWXStXrmx/XVlZqcrKSn322Wd69NFH9fjjj+v222/v0X4zMzPPeN2//vWvionx/7j5v/71r34/5umMGjVKsbGx7csul0vvv/++2trazEsK3RKI5xX6Ns4peBvnVOCz2+2aNGmSoah9/fr1vS5e9yV/nle1tbVe3ydFTIAfzc1J0tycJDW3urRyT5kmZsb2ep8f5JZpS0GNIfad80coNMjW630DAAKHxWLRXfOH6+svbWiPHShv1Hs7S/TF8d4ZTQoAAHyLUXIAAPQNJz5RfibFxseKmHr61HtWVpauvPJKzZw5s73g6MCBA/rnP/+pN998Uw6HQ3fccYcsFotuu+22Hh0D3RMTE2MoYJKOdqyigAkAgIHF6XSqqKhIgwcPbo/FxMQoMjKSTlo+QhETYIKwYJtXbji73R79rkMXpsHx4bp62pk/WQMA6Dvmj0zWqNQo7S45/mHqUyv36wvjUr1287PV6dam/GqdnZXglf0BAIDj6uvr1dLSYogxSg4AgMBz4ujX4ODg064fEhIi6ej4se664oordOONN3b6u3769Om65pprtHTpUl155ZVqa2vTvffeq0svvVSpqandOsbpOkQVFxdrxowZkqTrr7++V6PruqOhoaG9U8D1118fMN0pPR6Pdu/ebTgP7Ha7Lr74YtlsPDwc6AL1vELfxTkFb+Oc6nvcbrd27dqltrY2hYeHKz09XZMnTzY7LQOzzqsjR47o4Ycf9uo+KWIC+rB3thVpT6lxzuR3L8xRkM1qUkYAAF+yWCy6c362vvPq5vbY9iO1+nhfhc7N6fkNUI/Hoy0FNXpr8xG9s7VI1U1tWvX9eRqSEOGNtAEAwP+UlZUZlsPDwxURwfstAACBJjQ0tP11a2vradc/VqQcFhbW7WOdbnTbokWL9LOf/Uw//elP1dTUpBdeeEE//vGPu3WM043EO1FUVJSio6O7tX9viIyMNOW4J1NcXGwoYJKOdsuKi4szKSP0VCCdV+gfOKfgbZxTfUdOTo5cLpeSk5MDvqO2P8+ruro6r++TSgegj2pzubX4/b2G2MiUKF0yMc2kjAAA/nDxuFQNSQg3xJ5amderfba5PPr6S5/r5bWHVd10tC36W5uP9GqfAACgs/j4eCUlJclqPfpxDKPkAAAITFFRUe2vz2RMSGNjo6QzGz3XE7fddlv7NcOqVat8cgwc5XQ6dfDgQUMsIiKi292vAABA/5KYmKiUlBQ+x/EDipiAPuofGwp1uLLJELtvQY5sVn5xAkB/ZrdZdcfc4YbYugNV2ni4usf7DLZbOxXBvrX5iDweT4/3CQAAOouPj9eYMWM0a9YsjR49WikpKWanBAAATiI0NFQJCUfHrBcWFp5y3erq6vYipszMTJ/kk5yc3J7PkSM8dORLLS0tCgoKMsSGDx/ODUsAAAA/oYgJ8LFWp1vLtxerudXltX062lz6/Yf7DLGJmbG6cAwfgAPAQHDllHSlRIcYYn/qZTemKyanG5YPVzZpU35Nr/YJAABOzmazKTk5uUcjZwAAgH+MGTNGkpSXlyen09nlert3725/PXr0aJ/lQxGNf0RERGjatGkaMWKEgoKCFB8fzxg5AAAAP6KICfCxj/eV686/bdKU/3tf3/r7Jr27s6TX+3xl3WGV1Blnct9/0Uj+kAWAASLEbtOtc7IMsQ9yy7S7pOezhydlxiorMcIQW7Lp1E+bAgAAAADQX51zzjmSjo6K27hxY5frnTjebfbs2T7Jpby8XBUVFZKktLS006yN3rJYLEpLS9OMGTOUk5NjdjoAACCAeTwe1dTUmJ1Gv0IRE+BjS7cVS5Ka21xauq1Yz64+0Kv9NbQ49dTK/YbYrOEJmp2d2Kv9AgD6lq/OGKzYcGN78z91eH/oDovF0qkb09JtxWpxeq+TIAAAAAAAfcXll1/e/vrFF1886Tput1svv/yyJCk2Nlbz58/3SS7PPvts+8j3uXPn+uQY6MxutyskJOT0KwIAgAGppqZGmzZt0tatW1VbW2t2Ov0GRUyADznaXHp/V6khtmjCoF7t88+fHFRVY6sh9r2LRvZqnwCAvicixK6bZg01xN7ZWqTDlY093uflHYqYapvbtGJ3WY/3BwAAAABAXzVjxgzNmTNHkvTCCy9o7dq1ndZ59NFHlZubK0m6++67FRRkfNho5cqVslgsslgsuummmzptf+jQIW3evPmUeSxdulS//OUvJUlhYWG6+eabe/KfAwAAAC/as2ePtm7dqoaGBknS/v3724vO0TsUMQE+tGpvuRpajs9Lt1iki8f3vIipurFVz3Xo5HTB6BRNGcxMbgAYiG6aNVThwbb2ZbdHeqYXHf8y48M1Y1i8IbZk05Ee7w8AABxtK15RUSG32212KgAAoJueeOIJhYWFyel0asGCBXr44Ye1bt06rVixQrfffrvuv/9+SVJOTo7uu+++bu//0KFDmjJlimbNmqWHH35Yy5cv14YNG7Rhwwa98cYbuvrqq3XppZeqtfXoQ62/+93vlJ6efpq9AgAAwNciIiIMy/X19SovLzcpm/7FbnYCQH+27H+j5I6ZPjReKdGhPd7f06v3q75DUdR9C5jJDQADVWx4sK47a7Ce+/hge+zNDYW6+/wRPX6/uXJyutYfrGpfXrGnTNWNrYqLCO51vgAADEQ1NTXauXOnbDabEhISlJSUpISEBFksFrNTAwAApzF58mS9/vrr+trXvqa6ujo98MADndbJycnRsmXLFBUV1ePjrF279qSdno4JDw/XY489pttuu63Hx8DJud1u7d27V+np6b36fwgAAAaWtLQ0FRUVqbm5uT124MABJSYmymqll1Bv8N0DfKS51aUPco2j5C7pxSi50jqH/rLmkCF26cQ0jR4U3eN9AgD6vm/MyVKw7fglXavLrec/7nk3posnDFKw/fj+2lweLd1W1KscAQAYyI49hedyuVRWVqbDhw9TwAQAQB9yySWXaNu2bbr33nuVk5Oj8PBwxcbGatq0afrNb36jzZs3Kzs7u0f7njp1ql555RXdddddOuusszR48GCFh4crODhYKSkpOu+88/TQQw/p4MGDFDD5SFFRkUpLS7Vp0ybl5ubK4XCYnRIAAOgDrFarsrKyDLGWlhYVFhaalFH/QScmwEdW7ilTU6urfdlqkb4wrudFTH/8KE+OtuPjB2xWi+69gC5MADDQpUSH6kvTMvT3z/LbY3/7LF93zc9WbHj3uydFhwbpwjEphm6CSzYf0fUzh3ojXQAABhS3292plXhSUpJJ2QAAgJ4aMmSIFi9erMWLF3dru3nz5snj8XT59aioKF133XW67rrrepsieqCtrU2HDx9uXy4rK1NLS4smTZpkXlIAAKDPSEhIUExMjGpra9tj+fn5Sk1NVXAw0y16ik5MgI8s7TBK7uysBCVFhfRoX/mVTXp1fb4hdvW0TA1NjOhiCwDAQHL7uVmyntDQoanVpZc6dO/rjqumpBuWN+fX6EB5Q4/3BwDAQFVTUyOn02mIUcQEAAAQGIqKijpdqw0bNsykbAAAQF9jsVg0fPhwQ8zlcunIkSMmZdQ/UMQE+EBTq1Mf7jaOkls0Ia3H+3v8w71yuo8/sRNst+o75/esRTEAoP8ZkhChSyYa32deWnNIjS3OLrY4tTkjkpQQYXxK4O3NXHQDANBdHbswRUVFKSwszKRsAAAAcMzJbjAmJiYqJibGpIwAAEBfFBUVpeTkZEOsqKhILperiy1wOhQxAT7wYW5Zp9FvXxiX2qN97S2t11sdbhzfcPYQDYrhg28AwHHfnGes9q9pauvUxe9MBdmsnYqilmw+Ire76xb4AADAyO12q6KiwhCjCxMAAEBgKC0tVVtbmyE2ZMgQk7IBAAB92eDBgw3LTqdTxcXFXayN06GICfCBZR1Gyc0anqD4iJ7NvVz83l6dODY9ItjW6UY1AACjUqN1wWhjtf9zHx9Qi7Nn1f5XTcmQJIUGWXXpxDT96vJxvc4RAICBpLq6mlFyAAAAAcjj8aigoMAQi4uLU2RkpEkZAQCAviwiIkIJCQmGWGFhodxudxdb4FTsZicA9DcNLU6t2FNmiC2aMKhH+9paUKP/7iwxxG6Zk6WEyJAe5wcA6L++OS9bH+Qefw8qrWvRkk1H9NUZg0+x1cmNS4/WH6+drLk5SYoKDfJmmgAADAgdR8lFR0crNDTUpGwAAABwTEVFhRwOhyGWmZlpUjYAAKA/yMzMVGVlZftyS0uLysvLlZKSYmJWfROdmAAv+zC3VC3O41WVdqtFF43t2Si53723x7AcGx6kb8wZ1qv8AAD919QhcTo7K94Qe3rVfjld3a/2t1gsWjQhjQImAAB6gFFyAAAAgelkXZgiIyMVGxtrTkIAAKBfiImJUXR0tCFWUFAgz4kjl3BGKGICvOydrcZRcnNGJCo2vPuj5Nbur9TH+4wfen9z7nBFczMZAHAKd87LNiwfrmzS8h0lXawNAAB8oaqqSi6XcaQrRUwAAADmq62tVX19vSGWmZkpi8ViUkYAAKC/6NjZsbGxUdXV1SZl03dRxAR42a1zhunaswYrPuJo4dLCCWnd3ofH4+nUhSk5KkQ3zBzqjRQBAP3YnBGJGp8eY4g9tSKPan8AAPyo4yi5mJgYhYQwFhwAAMBsHbswhYaGUmwOAAC8IiEhQWFhYe3Ldrtdra2tJmbUN9nNTgDob87KStBZWQn65aVjtfZApSZmxnZ7Hyv2lGnjYWNV5rfPH6GwYJuXsgQA9FcWi0V3zR+uO17Z1B7bXVKvFXvKdN4oZi8DAOBrbrdblZWVhhg3xgAAAMzX0NCgqqoqQywjI4MuTAAAwCssFosyMzN1+PBhZWRkKDU1VXY7JTndRScmwEfsNqvmjEjq9vg3t9ujR97da4hlxofpmmmZXWwBAIDRgjGpGp4UYYg9uWJ/r7sxNbU6tWxHmQ62RvVqPwAA9GcnGyWXmJhoUjYAAAA4prCw0LBst9uVmppqUjYAAKA/SklJ0YwZM5SRkUEBUw/xXQMCzLLtxcotrjPE7r0gR8F2ag4BAGfGarXom/Oy9b1/bG2PbTxcrfUHq3RWVkK397e7pE7PrT6o/+4oVmOrS0m2JA0LrvdmygAA9BuMkgMAAAg8DodDZWVlhlh6erpsNqYfAAAA77FauaffW3wHgQDidLm1+H1jF6YRyZG6bFK6SRkBAPqqyyalKT02zBB7cuX+Hu2rpNahf24qVGPr0a4S5a5wVbu4GQsAwMmkpqYa2oUzSg4AAMB8FotFKSkp7aPjrFar0tP53B0AACDQ0IkJCCD/3FSogxWNhth9C0bKZmUmNwCge4JsVt12bpZ+/u+d7bHVe8u140itxqXHdGtf52QnKikqROX1Le2xPa2x3koVAIB+JS4uTnFxcRoxYoRqamoUGRlpdkoAAAADXkhIiEaOHKmhQ4fqyJEjslgsCgoKMjstAAAAdEAnJsALqhpb9frn+appau3xPlqcLj3xwT5DbEJGjC4am9Lb9AAAA9TV0zKVEBFsiD21Mq/b+7HbrLp8Upohtq8lRm6Pp1f5AQDQn1mtVsXHxys4OPj0KwMAAMAvQkJClJWVpWHDhpmdCgAAGEBaW1tVXV1tdhp9AkVMgBf8d0eJfvDP7Zr2qw9004vr9e+tRd3ex2vrC1RU6zDEvn/RyPb2tgAAdFdYsE1fP8f4odx/dpRof3lDt/d1xeQMw3KDJ1gbDtf2Kj8AAAAAAAAAAID+qqmpSXv37tW6deu0a9cuuVwus1MKeBQxAV6wdNvRoiWn26OVe8r17o6Sbm3f6nTrmVX7DbGzs+J1Tnai13IEAAxM188coqiQ4xOEPR7p6ZX7T7HFyY1Ji9ao1ChD7J0dZb3ODwAAAAAAAAAAoL9paWnR559/ruLiYnk8HjmdThUXF5udVsCjiAnopfL6Fq07UGmILZowqFv7eHvLkU5dmO69IIcuTACAXosODdL1M4cYYm9tPqIjNc3d3teVU9INy+/vrlC9o61X+QEAAAAAAAAAAPQ3ISEhSkhIMMQKCwvldrtNyqhvoIgJ6KX/7iiW23N8OSLYpvmjks94e5fb06kjxvShcTorK6GLLQAA6J6vnzNMIfbjl31Ot0fPrT7Q7f1cNild1hPqa5taXXpr8xFvpAgAQJ/mdrtVWloqp9NpdioAAAD4n6qqKhUWFjK2BQAAmCYzM9Ow3NLSovLycpOy6RsoYgJ66Z1txpZvF4xJUWiQ7Yy3/8+OYh2oaDTE7pyf7ZXcAACQpMTIEH1luvFC+bXP81XZ0NKt/aREh2reCGOR7V/WHJLH4+liCwAABoaqqirt3r1ba9as0fbt21VaWmp2SgAAAAOax+PRoUOHtH//fq1bt04HDx5Ua2ur2WkBAIABJjo6WtHR0YZYQUEB91VOgSImoBdK6xz6/FCVIbZw/JmPkvN4PHpyhbEL09i0aM3LSfJKfgAAHHPruVmyn9BGydHm1vOfHOz2fr46Lc2wvL+8UZ/kVfQ6PwAA+rJjT9B5PB5VVVWpuLj4NFsAAADAl2pra1VfXy9Jcjqdys/PV01NjblJAQCAAcdisXTqxtTY2Kjq6mqTMgp8FDEBvbBsW7FOLJKMCrFr7sgzL0BasadMucV1hthd87NlsVi62AIAgJ7JiAvXZZPSDbGXPj2kim52Y5oxJEZxVoch9pc1h3qbHgAAfZbb7VZlZaUhlpTEgykAAABmKigoMCyHhoZyjQYAAEyRkJCgsLAwQ6zjtQqOo4gJ6IVl241P1144NkUh9jMbJefxePTHj/IMsaykCF00NtVr+QEAcKK75g/XCc2Y1Nzm0p9W7u96g5OwWCwaF2rsQvjh7jLlVzZ5I0UAAPqcqqoquVwuQywxMdGkbAAAANDU1KSqKuNnFxkZGTw8DAAATHGybkw1NTVqaGgwKaPARhET0ENFNc3aeNjY5m3RhDMfJbfuQJU25dcYYnfOy5bNyh9SAADfyEqK1FVTMgyxv647rJJaRxdbnNzI4BoFW47frPV4pFc+O+yVHAEA6GsqKoxjVaOjoxUSEmJSNgAAACgtLTUs2+12paby8DAAADBPSkqKgoODDbGO1yw4iiImoIeWbTN2YYoJC9I52WfejvaplcYuTOmxYbpsUppXcgMAoCvfOX+EgmzHC2ZbnW794aN93dpHkMWtUcHGQt68Mp4YAAAMPG63u1MRU3JysknZAAAAwOPxdLohmJKSIpvtzCYoAAAA+ILValVKSoohVlZWJo/HY1JGgYsiJqCHlnYYJXfR2BQF28/sR2prQY0+3mf8oPuOuVkKsvEjCQDwrcz4cF0z3di29PXPC1RQ1b1xcONCqhRqt+pLUzP0zrfO0Z9vmu7NNAEA6BMYJQcAABBYamtr1dLSYoh1vGEIAABgho7XJK2traquru5i7YGLigmgBwqqmrS1oMYQWzjhzLsoPbnC2IUpMTJEX56W2cXaAAB417fPG6GQEwpvnW6Pnviwe92YYmyt+ujus/S7L0/U+IwYb6cIAECfwCg5AACAwFJSUmJYjoiIUGRkpEnZAAAAHBcREaGoqChDrOO1CyhiAnpkaYdRcnHhQZo1POGMtt1bWq/3dhnb2d46Z5hCg2hnCwDwj5ToUF1/9hBDbMmmQu0v795IuMgQuzfTAgCgTznZKLmkpDMfMQ4AAADvcrlcna7PUlJSZLFYTMoIAADAqGM3psrKSjmdTpOyCUwUMQE9sGx7kWH5C+MGnfEouKc6dGGKCQvSdR1uJAMA4Gt3zBuu8ODjBbRuj/T4B93rxgQAwEB2slFyFDEBAACYp6KiotP1WXJysknZAAAAdJacnGwosHa73aqsrDQxo8BDERPQAw9fMUG3n5ul9NgwSdKiCYPOaLv8yib9e6uxAOqmWUPpZAEA8LvEyBDdPHuoIfbO1iLlFteZkxAAAH0Mo+QAAAACS2mpcQJCXFwc12cAACCgBAUFKT4+Xna7XWlpaZo8eTJF1x1QOQH0wPiMGI3PiNEPvzhKmwtqNCE95oy2+9Oq/XJ7ji+HB9t006yhvkkSAIDTuG3OcL289rDqHcdblS5+f6+eu2Faj/fp8XhUWN2szPhwb6QIAEBAYpQcAABAYGlpaVF1dbUhlpqaalI2AAAAXRsxYoSCgoJktdJz6GT4rgC9YLFYNGVwnOxnMEqupNahf24sNMS+dvYQxUUE+yo9AABOKSY8SLfOyTLE3t9Vqq0FNd3eV2OLU39dd1gLHluty578VI421+k3AgCgj6qurmaUHAAAQADp2IXJZrMpISHBpGwAAAC6FhISQgHTKfCd8bHDhw/rvvvu06hRoxQREaH4+HhNnz5djzzyiJqamnq176amJi1ZskTf/OY3NX36dMXFxSkoKEgJCQmaOXOmHnzwQZWUlJx2P/PmzZPFYjmjf+i55z4+oFaXu3052G7VN84ZZmJGAABIN88eqrjwIEPs0ff3dmsfVY2tOvvhD/XTt3doX1mDqhpbtXRbsTfTBAAgoJSXlxuWGSUHAABgrpqaGsNyUlKSbDabOckAAACgxyhi8qF33nlHEyZM0OLFi7Vnzx41NTWpurpaGzZs0P3336/JkycrLy+vR/vetm2bUlJSdNVVV+npp5/Whg0bVFNTI6fTqaqqKq1bt06/+MUvNHLkSL3++ute/i9Dd1U1turvn+UbYldPy1BydKhJGQEAcFRUaJC+OW+4IbZ6b7nWH6w6433ERwRrQoZxtOpf1hySx+PpYgsAAPq2tLQ0paentxcu0YUJAADAXOPHj9fEiROVkpIim82mlJQUs1MCAABAD9jNTqC/2rx5s6655ho1NzcrMjJSP/rRjzR//nw1Nzfrtdde03PPPae9e/dq4cKF2rBhg6Kiorq1/7q6OjU0NEiSZs+erUWLFmnatGlKSEhQeXm5lixZoueee051dXW67rrrFB0drS9+8Yun3Oe0adP04osv9vi/GV178dODaj5hrI7NatHt5w4/xRYAAPjP9WcP1XMfH1R5fUt77Hfv7dHrt519xp0Yb5g5VJ/mVbYvbz9Sq035NZo6JM7r+QIAYLbo6GhFR0dr+PDhqqurU1hYmNkpAQAADGgWi0WxsbGKjY2Vy+ViRAsAAEAfRRGTj9x9991qbm6W3W7Xe++9p5kzZ7Z/7bzzztOIESN0//33a+/evXr00Uf14IMPdmv/VqtVV199tX7+859rzJgxnb6+YMECffGLX9QVV1whl8ulb3/729q3b98pb0RGRERo3Lhx3cpjIDlQ3qCPdpdp4YRBGhRz5h9Q1zva9NKaQ4bYZZPSlBkf7uUMAQDombBgm741P1s///fO9tj6g1X6NK9S54xIPKN9XDA6RemxYTpS09wee3ntIYqYAAD9msViUUxMzOlXBAAAgN8wRg4AAPQlbW1tKisrU0VFhcaNGzfgr2UoRfeB9evX6+OPP5Yk3XLLLYYCpmPuu+8+jR49WpL0xBNPqK2trVvHmDVrll5//fWTFjAdc9lll+nKK6+UJO3fv1+bN2/u1jFg9PbmI/rVslzNfPgjfelPa/TW5sIz2u6v6w6r3uFsX7ZYpDvn0YUJABBYvjIjU2kxxjGnv3tvzxmPhLNZLbp+5hBDbPn2YpXVO7yWIwAAAAAAAAAAQH/g8Xi0c+dOrV27Vnl5eaqpqVFlZeXpN+znKGLygbfffrv99c0333zSdaxWq2644QZJUk1NjVasWOGTXObPn9/+ev/+/T45xkDg8Xi0dFtx+/KGw9XaeaTutNs1t7r0wscHDbGLxqQqO7l74wMBAPC1ELtN3zl/hCG2paBGH+aWnfE+rpmWqRD78cvLNpdHf/8s32s5AgAAAAAAAAAA9AcWi0VOp9PwMHlpaamJGQUGiph84JNPPpF0dDzb1KlTu1xv7ty57a8//fRTn+TS0tLS/nqgtx3rjV3FdTpQ0WiILZww6LTbvbGhQJWNrYbYXfOzvZobAADectXUDA1JMI47ffT9vXK7z6wbU1xEsC6flG6I/e2zfLU63V7LEQAAAAAAQNIZd48GAAAIVKmpqYblqqoqtba2drH2wGA3O4H+KDc3V5KUnZ0tu73rb/GoUaM6beNtq1atan99bHxdV3bv3q2zzjpLe/bskcPhUGJioqZOnaqrrrpKX/3qVxUUFNTjPAoLTz16rbj4eJejxsZG1dWdvsuRPy35/JBhOS0mRFkx1lPm2eZy608r8wyxWVlxGhJtCbj/Phg1NDSc9DVgFs5J+NPtszP1wL/3tC/nFtdpyecHtGB0kqTTn49XTUzU6xsK2pfL61u05PMDunhssg+zxkDF70cEGs7J/s3tdquyslKxsbG9+vvYXzgfEWg4JxFIGhsbT78SgIBXXFyssrIypaSkKCkp6ZT3YwAAAAJRYmKirFar3O7jD4OXlpYqMzPTxKzMxRWdlzkcDlVUVEiSMjIyTrluXFycIiIi1NjYqIKCglOu2xNbt27VsmXLJEnjx48/bRFTaWmpoT3ZkSNHdOTIEf373//Wb37zG7355pun3UdXuvNDtmTJEsXExPToOL7g8Uj/qMuRFNweS3YU6umnN55yu90tsSppMp4DSWUb9ac/feyLNOEjf/3rX81OATDgnISvuT1SnDVb1e7Q9tiv/rVF+1bkyWoxrtvV+ZhqH6YSZ0T78mNLN+vw6gM+yRc4ht+PCDSck/1PbGysRo0apYKCAtXX16uysrLPtPjmfESg4ZyE2Wpra81OAYAXlJSUqL6+XrW1tcrLy1NWVpbS09NPvyEAAECAsNlsSkpKMnzGNNCLmBgn52X19fXtryMjI0+7fkTE0Rt83n4CraWlRd/4xjfkcrkkSQ899FCX61qtVp1//vl69NFH9cEHH2jz5s1avXq1Hn/88faipV27dmn+/PnKz8/3ap59QbkrVHXuYEMsO/jUH3S4PdImR5IhlmpvVFpQk9fzAwDAm6wWaXpYmSFW4w7VvtbYM97H+JBKw3KpK1zlztAu1gYAoG9ISEiQJFksFkVHR7cvAwAAwP+ampoM92PcbrdCQ/nsAQAA9D0pKSmG5cbGxgHdwZhOTF7mcDjaXwcHB59izaNCQkIkSc3NzV7N41vf+pY2bNggSbrxxht1ySWXdLnukiVLFBsb2yk+Z84c3Xnnnbr11lv1l7/8RaWlpbrnnnu0ZMmSbudzuk5TxcXFmjFjhiTpyiuvVE5OTreP4SuPfnhA+uxI+3JmXKh+esdNslgsXW7z7q5y1b692xD72VUzdM7wL/gsT3hPQ0ND+1Oh119//RkVJAK+xDkJf3N7PMr/82btLj0+YmFvcLYeuW2qWpqbTns+trnc2vrU5yqrPz63uW3YbH1zUeC8v6N/4PcjAg3nZP/ldru1Y8eO9geFpKMj2+fOnWtiVqfG+YhAwzmJQLJ37149/PDDZqcBoBdKSkoMy0FBQYqPjzcpGwAAgJ6LjY1VSEiIWlpa2mMlJSXKzs42MSvzUMTkZSdW+re2tp5izaOOnYhhYWFey+Hhhx/W888/L0maPn26nnzyyVOuf7ICpmOCgoL0/PPPa926ddqzZ4/eeustHTlypNstWU83Wu9EERERio6O7tb+fcXj8eiDPVWG2KWT0k857s7j8ejPn201xMalR+uLk4acsvAJgSkyMjJgzkdA4pyE/9z/xdH6+ksb2pcLaxx6d2+dFo2ObY+d6ny8/uyhevT9ve3L/9lVrp9dOl4JkSE+yxkDG78fEWg4J/uXyspKQwGTdHRs+rEHkwId5yMCDeckzHasOz6Avsnj8aiszNhFOiUlhc/fAQBAn2SxWJSSkmKYilVWVqbhw4cPyOsbxsl5WVRUVPvrM2nx1dh4tMOBt54+e+aZZ/TAAw9IkkaNGqXly5f3+o9yu92uW265pX151apVvdpfX7K5oEZHaoxdshZNSDvlNiv2lCm3uM4Qu2te9oD8BQMA6Lvmj0zW5MGxhtgfPtqnFqf7jLb/6lmDFWw7fqnZ6nTrzY2F3kwRAAC/KS8vNyxHR0f3mQImAACA/qa2ttbQqUDqPIYFAACgL+l4LdPW1qbq6mqTsjEXRUxeFhoaqoSEBElSYeGpb9RVV1e3FzFlZmb2+tivvvqq7rzzTknSkCFD9P777ysxMbHX+5WkMWPGtL8+cuTIKdbsX5ZuLTYsZyVFaFRqVBdrH30C5I8f5Rliw5MidNHYVJ/kBwCAr1gsFn1vwUhDrLjWoTc3F3exhVFiZIgWTRgkSZqQEaNHvzxRN84a6u00AQDwObfbrYqKCkMsKSnJpGwAAABQVWWcnhAREcGYUgAA0KeFh4cbGuZIna95BgqKmHzgWMFPXl6enE5nl+vt3r27/fXo0aN7dcx///vfuuGGG+R2uzVo0CB9+OGH3RrhdjoDsYuQ2+3R8u3GG7WLJqSd8nux7kCVNuXXGGJ3zsuW1Trwvn8AgL5vdnaiZmYlGGLPrylQm+fM3tfuOi9bS+6cpX/dNVtXTc1QaJDNF2kCAOBT1dXVnUbJUcQEAABgno439I49WA4AANCXdbymoYgJXnPOOedIOjoqbuPGjV2ud+JYttmzZ/f4eB9++KGuvvpqOZ1OJSQk6P3339fw4cN7vL+T2bVrV/vrtLRTj1PrLzbmV6ukzmGIHeso0ZUnVxi7MGXEhenSSQPj+wUA6J/uW5BjWK5sbNOOljP7cHB4UqSmDI4bkMXQAID+g1FyAAAAgaOlpaV9wsUx8fHxJmUDAADgPR2vaZqbm9Xc3GxSNuahiMkHLr/88vbXL7744knXcbvdevnllyVJsbGxmj9/fo+OtWbNGl122WVqaWlRTEyM3n33XY0dO7ZH++qK0+nUn//85/blc88916v7D1RLtxYZlnNSIpWT0vUouS0FNfokzzhi4Pa5wxVk48cMANB3TRsar3kjjd0mNjsS1erh/Q0A0P8xSg4AACCwdOxIYLfbFR0dbVI2AAAA3hMZGamgoCBDbCB2Y+Lukw/MmDFDc+bMkSS98MILWrt2bad1Hn30UeXm5kqS7r777k4n48qVK2WxWGSxWHTTTTed9DhbtmzRwoUL1djYqIiICC1btkxTp07tVq4rVqxQTU1Nl19va2vTN77xjfZcL7nkEmVmZnbrGH2R2+3R8h0lhtiiCafuqNSxC1NiZIi+PNV7I/0AADDLfReONCy3eOza6qBVOwCg/2OUHAAAQGCprq42LMfF0QEaAAD0DxaLpVM3ptraWpOyMY/d7AT6qyeeeEKzZ89Wc3OzFixYoAceeEDz589Xc3OzXnvtNT377LOSpJycHN13333d3v/+/ft10UUXtRcg/epXv1JMTIx27NjR5TbJyclKTk42xP7yl7/o0ksv1aWXXqp58+Zp5MiRio6OVkNDgzZu3Khnn322fZRccnKynnjiiW7n2hdZrRa9ftvZWr69WEu3FWt3Sb0WnmKU3J6Ser2/q9QQu3XOMIUG2XydKgAAPjc+I0YXjU3RuzuPv9dtcySqpqlNPOwIAOjPGCUHAAAQODwez0mLmAAAAPqL+Ph4NTU1KT4+XvHx8YqK6npSVH9FEZOPTJ48Wa+//rq+9rWvqa6uTg888ECndXJycrRs2bIenXgff/yxysrK2pfvvffe027z85//XA8++GCneENDg/7+97/r73//e5fbjh8/Xq+99pqGDRvW7Vz7qqykSH3rvBH61nkjdKiiUUMTI7pc96mVxi5MMWFBuu7sIb5OEQAAv7n3why9t6tUHs/R5VbZ9JfPCvXTy868I5PH49H6g1V6ee1hTRsap5tnD5zrCgBA3+N2u1VZWWmI0YUJAADAPHV1dXI6nYZYx24FAAAAfdnJGtMMNBQx+dAll1yibdu26YknntCyZctUWFio4OBgZWdn68tf/rK+9a1vKTw83NQcf/CDH2jSpElau3atdu3apfLyclVVVSkkJEQpKSmaNm2avvSlL+mKK66QzTZwuwqdqoDpcGWj3tlaZIjdPHuoIkP48QIA9B+jUqN1yYQ0/fuE97xXPi/STXNGKDP+9Ncza/Iq9H/LcpVbXCdJ2n6kVjfMHCqblZbvAIDAVF1d3ekmGUVMAAAA5qmqqjIsR0RE0CUTAACgn6HKwseGDBmixYsXa/Hixd3abt68efIca3VwEjfddJNuuummXmYnjR49WqNHj9Y999zT630NVE+v2i/3Cf+rIoJtumnWUNPyAQDAV+65YISWbSuS63/vey1Ot/5v6S49e8O0024bZLe2FzBJUn5Vk1buKdP5o1N8lS4AAL3CKDkAAIDAUldXZ1hmlBwAAED/YzU7AaAvK65t1psbCw2xr509RLHhwSZlBACA72QlRerLUwYZYu/tKtWK3WVdbHHctCFxGjMo2hB7ac0hb6YHAIBXZWZmasiQIe0dlOnCBAAAYK4JEyZo0qRJGjx4sKKiopSQcOYj7gEAANA3UMQE9MJzqw+qzXW8DVOw3apbzhlmYkYAAPjWt84dolCLcbTOg+/slKPNdcrtLBZLp06FH++rUF5Zg7dTBADAKyIiIjR06FBNnz5d06ZNU0oK3QMBAADMZLFYFBMTo2HDhmnKlCmKjY01OyUAAAB4GUVMwAk+P1Slxz/Ye0Y3VCsbWvT39YcNsWumZSo5OtRX6QEAYLrosCDNDCsxxA5XNum51QdOu+2lk9IUGx5kiD21Is+r+QEA4AsREREKCgo6/YoAAAAAAACAlzQ3N+vIkSPKz883OxW/oYgJOMFr6wv0+Af7dMHiVfrC46u1ZFNhl+v++dODcrS525ftVotun5vljzQBADDVyOAapdoaDbE/rshTQVXTKbcLDbLpqzMGG2JvbTmivaX1Xs8RAAAAAAAAAACgL6qrq9Nnn32m9evXKy8vT/n5+XK73affsB+giAn4nxanS+/tOt5ZYndJvaoaW0+6bp2jTS+vMXZhumxSujLiwn2aIwAAgcBikeaEF8tqOR5rcbr1y6W7TrvtrXOyFBFsa1/2eKTfvbvHF2kCAAAAAAAAAAD0OSEhIXI4HO3LLpdL9fUD44FwipiA//l4b4XqHU5DbOGEQSdd969rD6u+5fi6Fov0zXnDfZofAACBJNHu0DVTjO+T7+8q1Ue7S0+5XXxEsL4xx9i58L1dpdpSUOPtFAEAAAAAAAAAAPqckJAQRUREGGJVVVUmZeNfFDEB/7N0W5FhedqQOA2KCeu0XnOrSy98ctAQ++K4VGUnR/o0PwAAAs1dc4cqISLYEHvw37vkaHOdcrtvzBmm2PAgQ4xuTACAQNDa2qoDBw6osbHx9CsDAADALw4cOKCioiI1NzebnQoAAIDfxMfHG5YpYgIGEEebS+/vMnaOWNRFF6ZX1+d3GjN357xsn+UGAECgig6160cXjzbE8qua9MyqA6fcLio0SHd26GD4SV6F1uRVeD1HAAC6o6ysTAUFBdqwYYM2bdqkkpKS028EAAAAn2lra1NBQYH27dun9evXa/369WpqajI7LQAAAJ/rWMTU0NCg1tbWLtbuPyhiAiR9tLtMja3Hu0ZYLNLF4zsXMbU4XXp2tfHG7PyRSRqXHuPzHAEACERXTk7XtCFxhthTK/OUX3nqDxRvmDlUKdEhhthv390jj8fj9RwBADgTHo/HULRUX1+v6upqEzMCAABATU2NYbmlpUUhISEnXxkAAKAfiY6Ols1mM8QGwmdVFDEBkl7/vMCwfNaweCVHh3Za761NR1RS5zDE7ppPFyYAwMBltVr0y8vGyWo5HmtxuvXLpTtPuV1okE3fOX+EIbaloKZTZ0QAAPyloaGh0xi51NRUk7IBAACA1HlsSkxMTKebeQAAAP2R1WpVbGysITYQRspRxIQBr7C6Sav3lRtiX5qa2Wk9p8utP63ab4idNSxe04bGd1oXAICBZExatG6YOdQQ+yC3TB/mnrog6eppmRqSEG6Ivbz2sLfTAwDgjJSWGt+3QkJCOn1QBAAAAP/xeDydbtR1HKsCAADQn3W89qmqqur3Ey0oYsKA98aGQp34cx4VYtfCk4ySW7a9WIc7jMahCxMAAEfde2GOEiON7dwffGenHG2uLraQgmxWfffCHElSTFiQfvjFUXruhmk+zRMAgJNxu92diphSUlJksVi62AIAAAC+1tjYqNbWVkOMIiYAADCQdLz2cTqdqq+vNykb/6CICQOay+3RPzYYR8ldNjlNYcHGdrRut0dPrTB2YZqQEaM5IxJ9niMAAH1BTFiQfvTFUYZYQVWznu7QxbCjSyak6aeLxmj1/fN1x9zhnd6DAQDwh8rKSjmdTkOMUXIAAADm6tiFKTQ0VGFhYSZlAwAA4H+hoaEKDzdOtOjvI+UoYsKAtnpvuYprHYbYV6YP7rTeB7ml2lNqrGi8a342T+UCAHCCK6eka/rQOEPsqZX7ld+hk+GJrFaLbjlnmGLCgnydHgAAXerYhSkmJoYbZAAAACarqakxLMfFxfGZPAAAGHDi4oz3XTpeI/U3FDFhQHt1fb5heXx6jMalxxhiHo9HT640dpHISYnUhaNTfJ4fAAB9icVi0S8vGyeb9fgHiq1Ot37xzk4TswIA4NRaW1tVWVlpiKWk8PceAACAmTwejxoaGgyx2NhYc5IBAAAwUcdroIaGBnk8HnOS8QOKmDBgldU79OHuMkPsmumZndb7NK9SWwtqDLE752XLauWJDwAAOho9KFo3zBxiiH24u0wf7CrtYgsAAMzVsQuT1WpVUlKSSdkAAABAklpaWtTW1maIRUVFmZQNAACAeTpeA7lcLjU3N5uUje/5vYhp3759+ulPf6oLLrhA48aN0/Dhw5WXl2dYZ8eOHVq+fLlWrVrl7/QwgGwrqJX9hEKksCCbLpuU1mm9P67YZ1geHB+uRRMG+Tw/AAD6qnsvzFFiZIgh9uA7O+Voc3VrP/mVTap3tJ1+RQAAesjj8XQqYkpKSpLdbjcpIwAAAEjq1IXJbrcrNDTUpGwAAADMExwcrKCgIEOs47VSf+K3T+Xcbrfuv/9+PfHEE3K73e3trSwWi1pbWw3r5ufna9GiRbLb7Tp48KDS09P9lSYGkAvGpGj9Axfo7S1H9Or6fI1Pj1FUqPGHf+PhKq07UGWI3TF3uOw2mpgBANCV6NAg/XjhKN37+tb2WGF1s55auV/fvTDntNuX1jn0h4/26bX1BbpzfvYZbQMAQE80NDSosbHREGOUHAAAgPnq6+sNy5GRkbJYmI4AAAAGHovFoqioKNXW1ioqKkqRkZEKCwszOy2f8Vslxu23367HHntMLpdLaWlp+tKXvtTluhdffLGGDRsml8ulN998018pYgCKCQ/SjbOG6j93z9H/XT6u09efXLHfsJwSHaKrplJUBwDA6Vw+KV0zhsYbYk+v2q/DlY1dbHHU25uPaO4jK/TKunw53R698PEBVTa0+DJVAMAAVlJSYlgOCQlRbGysOckAAACgXcfuApGRkSZlAgAAYL7Ro0dr9uzZmjhxooYPH96vx+z6pYjpww8/1AsvvCBJeuCBB3To0CG98cYbp9zmy1/+sjwejz766CN/pIgBzmKxKDTIZojtLKrVR7vLDLFb52QpxG5cDwAAdGaxWPTLy8fKdsLo1lanWw/+e2d7R86TGZMWrRanu325sdWlp1bu73J9AAB6yu12q6zM+DdfamoqT/gDAACYzOPxdOrE1J9v1AEAAJyO3W4fMJ9Z+aWI6dlnn5V0tMPSr371K9lspy8CmTFjhiRp586dPs0N6ErHG6Zx4UG69qzBJmUDAEDfMyo1WjfOHGqIrdhTrg9yy06+gaSclChdMdnY9fCv6w6rqKbZFykCAAaw+vp6uVwuQ4xRcgAAAOZrbW1VW1ubIUYREwAAwMDglyKmtWvXymKx6JZbbjnjbTIyMiR1bu0O+MP+8gYt315siH199jCFB9tNyggAgL7pngtHKCkqxBB78N871dzq6mIL6d4LchRkM3Zw+v2H+3yWIwBgYIqJidHZZ5+t4cOHKzIyUjExMQoLCzM7LQAAAEhKT09XTEyMbDabbDabQkNDzU4JAAAAfuCXIqZj7dmHDh16xtsEBQVJkpxOpy9SwgDl8XjU1Hr6c+rplft14qSbqBC7bpg11HeJAQDQT0WHBunHF482xI7UNOtPK/O63CYzPlxfmW7sfviPjYU6UN7gkxwBAANXcHCwMjIyNHXqVI0bN87sdAAAACApJCRE2dnZmjRpkmbPnq1p06YNmPEpAAAAA51fipgiIiIkSeXl5We8TWFhoSQpPj7eJzlhYNpcUKPpv/pAP1qyXdsKa+Q5sVLpfwqrm/TW5iOG2PUzhygmLMhfaQIA0K9cNilNM4YZr+meXnVAhyoau9zm2+dlKzTo+KWqy+3RYx/QjQkA4Dt2O513AQAAAo3FYqELEwAAwEm4XF1PvOjL/FLElJWVJUnatWvXGW/zn//8R5I0duxYn+SEgem19flqbHXp1fX5uvSPn+qOVzZ2Wue51QfkdB8vbgoNsurr5wzzZ5oAAPQrFotF/3fZONmsJ4yIc7n14Ds7T1pQLEnJ0aG6aZbx/fedrUXaWVTr01wBAAAAAAAAAAACTWtrq/Lz87Vr1y599tlnWrduXZf3WPoyvxQxLViwQB6PR08++aTcbvdp19+1a5deeuklWSwWXXzxxX7IEANBvaNN72wtNsQmZMQalsvrW/Ta5wWG2FemD1ZiZIiv0wMAoF8bmRqlmzuMZl25p1z/2lLU5TZ3zM1SVKixK8aj7+31RXoAAAAAAAAAAAABy+126+DBgyovL5fD4ZDT6ZTD4TA7La/zSxHTd77zHUVERGj//v2644475HQ6u1z3/fff14IFC+RwOBQfH69bb73VHyliAHhna7Ga2463VLNZLfry1AzDOs9/ckAtzuOFdkE2i247N8tvOQIA0J/dfcEIJUcZC4N//NZ2HexirFxseLBu7/A+/NHuMm04VOWzHAEA/V9/fEINAAAAAAAA/VtISIiCgoIMsfr6epOy8R2/FDGlpKTo6aefliS98MILGj58uO688872rz/xxBO67bbbNHbsWH3hC19QUVGRrFarXnrpJUVGRvojRQwAr32eb1g+b1SykqOPz9KubWrTK2sPG9a5cnKG0mLD/JIfAAD9XVRokH52yRhDrLHVpbv+tkmOtpPPbr559jAlRAQbYr99dw83oAEAPeJ2u7V+/Xrt27dP9fX1vJ8AAAAEGK7PAAAATs5isXSqn2loaDApG9/xSxGTJF133XV69dVXFR0drYKCAj3zzDOyWCySpOeff14vvPCCcnNz5fF4FBkZqX/84x9auHChv9JDP7ezqFbbCmsNsa/OyDQsv7TmkBpbj99AtVqkO+YN90t+AAAMFIsmpHXqhLiruE4PL8896foRIXbdNT/bEFt/sEqr91X4LEcAQP9VWVkph8OhoqIibdq0SRs3bpTLdfJCWgAAAPjfzp07tX79euXm5qqgoEBNTU1mpwQAABAwoqKiDMt0Yuqlq6++Wnl5efrFL36hqVOnymazyePxtP8bO3asfvSjHykvL09XXHGFP1NDP/f65wWG5dToUM3NSW5fbmxx6sU1Bw3rLJyQpmGJEX7JDwCAgeQXl41VdrLxaYG/rD2s/+4oPun61509WGkxoYbYI+/u5ulMAEC3lZSUGJaDgoJks9lMygYAAAAd1dfXq7m5WWVlZTpw4EC/vDEHAADQUyfrxNTf7pX4tYhJkhISEvTTn/5U69evl8PhUFlZmYqLi9XS0qLt27froYceUnJy8ul3BJyh5laX3tp8xBC7elqGbFZL+/JzHx9QTVObYZ076cIEAIBPhAfb9eS1UxRiN16Kfv/NbSqo6vyEZYjdpnsuyGlftliknJQoNbXSOQMAcOZaWlpUVVVliKWkpJiUDQAAADpqaWlRa2urIdax2wAAAMBA1vHayOl0yuFwmJSNb/i9iMlwcKtViYmJSklJUVBQkJmpoB/7z45i1Tuc7csWi/TlacdHyZXVOfTMqgOGbS4YnazRg6L9liMAAAPNyNQo/eLSsYZYvcOpb726Wa1Od6f1r5ySruFJEbpobIrevedcLb56kiJC7P5KFwDQD5SWlhqWbTabkpKSTMoGAAAAHTU0NBiWbTabwsLCTMoGAAAg8ISEhMhuN94b6XgN1deZWsQE+MNr642j5M7JTlRmfHj78uL396q57XgnB6tF+t5FI/2WHwAAA9U10zN16cQ0Q2xrQY1+996eTuvabVb961vn6JnrpyknhacwAQDd4/F4OhUxJSUlMUoOAAAggHQcHRcZGSmLxdLF2gAAAAOPxWLp1I2pv43fpYgJ/dr+8gatP2QcF/DVGYPbX+8uqdMbG4xFTldPy9SoVLowAQDgaxaLRQ9dMU5DE8IN8WdXH9BHu0s7rR9J5yUAQA/V19erqck4spRRcgAAAIGlYxeByMhIkzIBAAAIXB2vkfpbJyav3gnKysry5u4kHb25tX//fq/vFwPD658bC5QSIoJ1wejjH1T/evluuT3Hvx4WZNN3L8zxV3oAAAx4UaFB+uO1U3TlU2vU6jo+Ru6+N7Zq+d1zNCiGtvEAgN4rKSkxLIeGhiomJsakbAAAAHAyHbsIdOwyAAAAgM7XSPX19fJ4PF2s3fd4tYjp0KFDZ7TesfafHb+RJ4vTKhQ91ep0658bCw2xq6ZmKNh+tAHZqr3lWr233PD12+dmKTk61G85AgAAaVx6jH68cLR+/u+d7bHqpjbd/eoW/f3Ws2S3nb55aE1Tq2LDg32ZJgCgj3K73SorKzPEUlNT+bwBAAAggLS1tam1tdUQoxMTAABAZx2vkZxOZ6frqL7Mq0VMN9544ym/vmXLFm3dulUej0exsbGaPHlye/v20tJSbdmyRdXV1bJYLJo4caImTpzozfQwwHyQW6rKRuMP6zXTMyVJLrdHDy/PNXwtOSpEt53r/W5iAADg9G6YOURr9lfo3Z3Hx8itP1SlJz7cp/sWjOxyO0ebS7/97x69tblQ/73nXKVQjAwA6KCiokIul8sQY5QcAABAYGlubjYsW61WhYeHd7E2AADAwBUaGiq73S6n09ke63gt1Zd5tYjpxRdf7PJrf/7zn/X3v/9dGRkZevTRR3XFFVfIbjce3uVyacmSJfr+97+vXbt26a677tItt9zizRQxgAxPitTV0zL0ztZiNbe5NGNYvIYnHa1KfHNjgXaXGFvTfm/BSIUHe/VHAgAAnCGLxaLfXjVRO458rCM1xy+2/7giT2cNS9A5IxI7bbO1oEbffWOL9pc3SpLuf3ObXrp5Op01AAAGHUfJxcbGKjSUolcAAIBA0rF7QHh4OH/fAwAAnITFYlF4eLjq6uraY/2pE9PpZ3N4wYYNG3THHXcoMTFR69at05e//OVOBUySZLPZ9OUvf1lr165VfHy87rzzTm3YsMEfKaIfGpkapd9+aaLW//h8/fqK8bpz3nBJUmOLU4++t9ew7qjUKF01NcOMNAEAwP/EhAfpD9dOlt16/ENKj0e65/UtKqt3dFr/pTWH2guYpKOjYv++Pt8vuQIA+oaWlhZVV1cbYqmpqSZlAwAAgK50vPFG0TkAAEDXQkJCDMttbW0mZeJ9filieuyxx+RyufTAAw8oLS3ttOsPGjRIDzzwgNra2rR48WI/ZIj+LCo0SNeeNVjzRiZLkp5dfUBl9S2GdX68cLRsVp7qAADAbFMGx+n+LxjHx1U0tOje17fI5fYY4j+/ZIySo4wX6g8ty9XhykYBACAdHV1/IpvNpsTEzt39AAAAYK6ORUwdb8wBAADguISEBKWnpysrK0tjxoxRQkKC2Sl5jV+KmD7++GNJ0llnnXXG25x99tmSpE8++cQnOWFgKq1z6NnVBwyxuTlJmjMiyaSMAABAR984J0vzRxrfmz/Nq9SfVuYZYrHhwfrtlyYYYk2tLt33xtZOBU8AgIHH4/F0GiWXlJQkm81mUkYAAADoSsfuARQxAQAAdC0lJUXZ2dnKzMxUUlJSv+pi6ZcipvLycklH27ifqWPrHtsW8IbF7+1Vc5urfdlqkR64eLSJGQEAgI6sVosevXqSUqKNH1gufn+v1h+sMsTmjUzWtWcNNsQ2HK7W8x8bi5YBAAOP2+1WVFSUrNbjH30wSg4AACAwMU4OAAAAkp+KmJKSjj5J/5///OeMt1m+fLkk0eYdXpNbXKc3NhYYYtdMz9TI1CiTMgIAAF2JjwjW778yWSdOe3V7pO+8ullVjcYPNn988WgNjg83xB59b6/2lNT7I1UAQICy2WwaPXq0Zs6cqZycHCUlJSk6OtrstAAAAHASjJMDAACA5KcipvPOO08ej0eLFy/Wp59+etr116xZo8cee0wWi0Xnn3++HzJEf1FW59Ar6w6r3tHW6Wu/Xp4rzwmTZcKDbbr3ghw/ZgcAALrjrKyETu/VJXUOfe8fW+U+YVxcRIhdj149UZYTCp5aXW7d+/oWtTrd/koXABCg7Ha7Bg0apDFjxshy4psFAAAAAoLFYtHgwYM1ZMgQpaamKjY2lk5MAAAAA5Rfiph++MMfKiQkRC0tLTr//PN1zz33aMuWLfKcUFHi8Xi0ZcsW3XvvvTrvvPPkcDgUHBysH/7wh/5IEf3EPzYW6idv79CMhz7U9/6xVZvzqyVJK/eU6eN9FYZ1bz93uJKj+UMIAIBAduf8bM3OTjDEPtpdphc+OWiITR8ar9vmZBliu4rr9IeP9vk8RwAAAAAA0HMej0cJCQkaOnSoRo4cqYkTJyo4ONjstAAAAGACvxQxjRo1Sn/5y19ks9nU2tqqP/zhD5o6darCw8OVnp6ujIwMhYeHa+rUqfr973+v1tZW2e12vfjiixo1apQ/UkQ/4HZ79Nrn+ZKk5jaX3txYqNfWF8jpcuvXy3MN66ZEh+jWc4eZkSYAAOgGm9Wix66ZpMRI44eXv/nv7vZi5WPuvTBHOSmRhtiTK/I6rQcAAAAAAAAAANAfeDweOZ1O2Ww2s1PxCr8UMUnS1VdfrU8//VRTp06Vx+ORx+NRS0uLiouLVVRUpJaWlvb4lClT9Mknn+grX/mKv9JDP7D2QKUKqpoNsWtmZOrNjYXaW9pgiN+3YKTCg+3+TA8AAPRQclSoHr9msmFcnNPt0bf+vlm1TcdHyIYG2bT46kmyW4+v6PZI972xVc2tLn+mDAAAAAAAAAAA4DMHDx7U+vXr9cknn2j79u1KTU01OyWv8GsVx/Tp0/X5559rw4YN+uCDD7R9+3ZVVVVJkuLi4jR+/HhdcMEFmj59uj/TQj/x6vp8w/LIlCjlJEfq9r9uNMRHpUbpqikZ/kwNAAD00jkjEnXXvGz9cUVee+xITbO+9eomPX/jNIXYjz5hMC49RnefP0KPvr+3fb0DFY36zX9368FLx/o9bwCA/9XX1ys8PLzfPH0GAAAAAAAAdOR0OtXcfLzJS0hIiInZeI8prWimTZumadOmmXFo9FNVja16b2epIfaVGZl69uODKq9vMcR/snCMbCd0aAAAAH3DPReM0GcHK/X5oePj4T7eV6G7/rZJT103VcH2o01GvzlvuD7YXaatBTXt6/13R4m+uyBH0aFB/k4bAOBHDodDW7ZskcViUVJSklJSUhQTEyOLhb8BAQAAAAAA0H90LFoKDg42KRPv8ts4OcCXlmwqVKvL3b4cbLdq1vAEPbt6v2G9eSOTdM6IRH+nBwAAvMBus+r3X52suHBjIdIHuWW65/XNcv7vWsBus2rx1RMV8r+ipksnpum/98yhgAkABoD9+/fL7XbL5XKppKREW7duVVNTk9lpAQAA4BQoOAcAAOi+0NBQwzKdmIAAUdPUqqdXHTDEvjguVc9/fFCOtuOFTVaL9MDFo/2dHgAA8KJBMWF68eYZ+trzn6mhxdkeX769REG2rVp89STZrBYNT4rULy8bq4gQuxZNSDMxYwCAv1RVVamiosIQS0tLU0REhEkZAQAA4ExMnTpV27dvV1hYmEJCQjRs2DCFh4ebnRYAAEBA61i0RBFTN6xevbpX25977rleygT90a+W5aqiwTgybtbwBP1wyXZD7Jrpg5WTEuXP1AAAgA9MyozVSzdP1w1/Xq+mVld7/F9bihRit+r/XTlBVqtF10wfbGKWAAB/crvdysvLM8TsdruGDh1qTkIAAAA4IzabTXa7XU6nU/X19aqvr9ewYcPMTgsAACDgdezEZLVaZbf3/T5GfvkvmDdvXo/bgVosFjmdztOviAFp9d5yvbmx0BA7f1SS/r21SB7P8Vh4sE33XjjCz9kBAABfmTY0Xs/fOE03v/i5WpzHOy++saFQwXar/u+ycbSjB4ABpLCwUM3NzYZYVlaWgoIYJQoAABDIgoODO8U63pADAABAZye7juoP3Zis/jqQx+Pp8T/gZBpbnPpRh25LUSF2LZyQpk/zKg3xO+YOV3IUf/gAANCfzBqeqGdvmKZgm/GS9pV1+fq/pbmnvI7kOhMA+g+Hw6HDhw8bYlFRUUpNTTUpIwAAAJypjjfagoKCZLX67dYVAABAn2WxWPrlSDm/dGJasWLFaddpbGzU3r179dprr2n9+vWaPXu2fvGLX8hms/khQ/RFj7y7R0dqjE/a3v+FUfrTyv2GWEp0iG6dk+XP1AAAgJ/MzUnSU9dN0R2vbJTTfbwo6c+fHlSw3aoffGFkp45MZfUOPbBku744bpCumprh75QBAF524MABud1uQ2zEiBF05AMAAOgDOt5oowsTAADAmQsNDVVLS0v78sm6M/U1filimjt37hmtd/HFF+uee+7RI488oh/84Af685//rFdeecXH2aEv2ni4Wn9Ze8gQOzsrXjartK+swRD/3oKRCgumGA4AgP7qgjEp+sNXJ+tbr26W64RCpqdX7VdokFX3XJDTHlu+vVg/fmu7qpva9NmBKs0cnqC02DAz0gYAeEF1dbXKy8sNsUGDBikqKsqkjAAAANAdHW+09YfuAQAAAP7SHzsxBWRPzu9///u68sor9eqrr+q1114zOx0EoKdW5OnECTAhdqt+tmiMFr+/z7De6EHRunIKHRYAAOjvvjh+kBZfPVEdm248/sE+PbUyT5K0taBGd/5tk6qb2iRJ9S1Off/NrYbCJwBA3+F2u5WXl2eI2e12kg8IbgABAABJREFUDRs2zKSMAAAA0F10YgIAAOi5jtdOFDH50A033CCPx6Nnn33W7FQQgP547RTdOmeYrP+7UfndC3P03x0lqmhoMaz3k4WjZbMyQgAAgIHgsknp+s1VEzrFf/vfPXrhk4OamBmrKyenG772aV6lHliyXW4KmQCgzzly5IiampoMsWHDhikoKMikjAAAANBddGICAADouY7XToyT86HBgwdLkrZv325yJghEYcE2/XjhGC2akKa/rDmkheMH6YLHVhnWmT8ySbOzE03KEAAAmOHqaZlqdbr1k7d3GOL/t3SXgu1W/fzSsVp7oFLFtY72r72+oUDhITb9bNEYWTq2cgIABKSWlhYdOnTIEIuKitKgQYPMSQgAAAA9QicmAACAnmOcnB+VlpZKkhobG03OBIFsYmasfvOlCfrx2zvkaHO3x60W6UcXjzYxMwAAYJavnT1EP1s0plP8p2/v0Ls7SvT4NZMUbDNeBr/46SEtfn+vv1IEAPTS/v375Xa7DbHs7GyKUQEAAPoQj8dDJyYAAIBe6FgAHhQU1Okzs74mYIuYnnzySUnHOzIBJ+N2e3T/m9u0am+5If6VGYOVkxJlUlYAAMBsXz9nmH74xVGd4j9Ysk0ldQ49ed2UTiNn//BRnv60cr+/UgQA9FBra6tqamoMsdTUVEVHR5uTEAAAAHrE5XJ1KkLvDyNQAAAA/OVk104ul8uETLwnoIqYqqur9f777+viiy/W0qVLZbFYdOWVV5qdFgKUx+PRr5bl6q3NRwzx2PAg3XtBjklZAQCAQHHH3OGdrgk8Hum7b2xVm8utxVdPVMeGHb/57269vPaQ/5IEAHRbcHCwpk+frrS0NEmS3W5XVlaWyVkBAACgu07WJcBqDajbVgAAAAHNZrNp+PDhyszMVF5envbs2SObzWZ2Wr1i98dBevpNGjFihH7wgx94ORv0NR6PR//vP7v1lRmDNSwxoj3+1Mr9+vOnBw3rhgZZ9cKN05QURctZAAAgfef8bLU4XXrqhA5LLrdH33l1s57+2lQ9fMV4/XDJdsM2P/vXToUH2/WlqRn+ThcAcIaCgoI0YsQIpaamqqWlRUFBQWanBAAAgG46WRFTX7/pBgAA4E9Wq1UZGRmqq6tTRUVFe6wv80v2Ho+nW/9sNpu++tWvavXq1YqJifFHighgr31eoGdWH9AXHl+tZ1btl9Pl1qvr8/XIu3sM69mtFv3pa1M1dUi8SZkCAIBAY7FY9P2LRuqWc4YZ4k63R3f+bZNSY0L100VjOm13/5tbtXx7sb/SBAD0UFRUlBITE81OAwAAAD1wsiKmjuPlAAAAMLD4pRPTz3/+89OuY7VaFRUVpWHDhmnWrFlKSkryQ2YIdCW1Dv16Wa4kqcXp1sP/2a3/7CjRtsKaTuv+7ssTNX9ksp8zBAAAgc5isegnC0erxenSK+vy2+OtLre+8ZcN+uEXR+m7F4zQ4g/2tX/N7ZHufm2zwoJsmj+K6wsAAAAAALzN4/EYlm02G0VMAAAAA1zAFDEBHXk8Hv3k7e36/+zdd5xcBb3///eZvr337GZ300MapAGhBEVKAAFFxAoKiOC9lIvgT/3eq/de70VBBSxXQZCiKBaKICiI9JoEEhLSNtm0bdmSbbNtZmfm/P5YMsnZkmw/uzuv58M8Muczp3yyDrNnznzO5+MPhCzxD6paFLF+ttF/nD9fFx1fMI7ZAQCAycQwDP3XxxcoGIroj+sro/FQxNT3ntmmj8zN1uUnT9dDb+6LPtcdNvWXjVUUMQEAAAAAMAbcbrf27dsnp9OpE044QV6v1+6UAAAAYLNxKWIChuOvm2r0wrY6S8zlMBTqVcH0tTNm6Mu9RsQAAAD05nAYuu0Ti9QdNvXEhirLcy9ur1N+ik9nH5ej57bUSpI+cUKBbv/kIjtSnRBCoVD0TzgctiwfGQuHw3I4HHI4HHI6ndEOqxkZGf3uNxAIREdIH9qOO20BHE0kEtHevXtVUFDAF1sAAABTiMfjUU1Nzyj3Cy64QMnJyTZnBAAAALuNSxHTf/3Xf0mSrrvuOmVmZg5qm6amJv30pz+VJP3Hf/zHmOWGiamxPajvPrXFEjMM9Slg+syKIn39rDnjmRoAAJjEnA5DP/zUYhWkxunnL+/SkZ3rq1u6VOsPaEF+shYXpui/L1woh2PqFdeYpqmOjg75/X5lZGTI7Xb3u97bb7+tcDg8rGPk5eUNWMS0fft2NTc3W2Iul0sej0der1cej2fAxw6HY1j5AJjcqqurVVFRoerqak2fPl0FBQW8HwAAAAAAAAD96D2yd7IZlyKm7373uzIMQ5dccsmgi5gaGxuj21HEFHv++69bdbA9aIn1/m/tnONy9b2LFnDnPgAAGBKnw9DXz56jlaXpuukPG9XQdvicIxwx9UF1q9ITPGrsCCozcfJ3/AgEAvL7/WptbZXf75ff748WJy1YsGDAYiOXyzXsIqajFRdEIpE+sUPdnTo6Oo6634yMDC1YsKDf57q7uxUKheRy0WwWmEqCwaD27t0rSQqHw9q9e7f8fr/mz59vb2IAAAAAAADABLBlyxY1NTVpxYoVcjgcamhoUEpKit1pDRtX+DHhrN3XrCc2NB51nZNKM3TXZUvknILdEQAAwPg4dVaWnr3+VN3w6Ea9tfug5blXdzZozd2v6e7LjtdJM/ov8pmIQqFQtFDpUOFSMBgccP1D3Zj643K5FAgEhpWH0+kc8LnhFkYda7/V1dX64IMP5HK5FBcXJ5/PZ/kTFxcnr9dL9xZgktm9e3ef942CggKbsgEAAAAAAAAmlnA4rHA4HL323d+NxJPJhC1i6u7ulqQBx1tg6rrrpb2SMfDs6wUFybr3i0vlcw/8JRYAAMBgZCf79NurVupnL+7S3f8s05GTa+v8AX3uvrd1/Udn6V8/MktOh6GDbQF964nN+s+PL1Buis++xI9QXV0dLVg6Viej3lpbWwd87siCIafTKZfLJZfLZXl8aDkSiSgSiUQ/LCUkJAy435F8gPJ6B+6MdahY68hCroH2caio6VCBU0JCghITE4edF4Cx0dLSotraWkssJydnUt9JBgAAAAAAAIym3jf/Mk5ujGzcuFGSlJWVZW8iGHf1/qBcA9QwlWQm6MEvrVCSj+I2AAAwOpwOQzecOUsrStJ1w6MbVOc/3H0oYkp3vbBTa/c06ltr5umGRzeovL5du+ra9MdrTlLGBBg3V1VVNeTiJamnmOdoRUHHHXecHA6HnE7nqI7vXb58ucLhsKXoqbu7W8FgUIFAQMFg0PI4EAhEP3R5PJ4B9zvYrlGBQECBQEAtLS3RWGZmpo477rh+129vb5fD4ZDP52OMMTCOTNPUzp07LTGn06nS0lKbMgIAAAAAAAAmnt7TB+jE1I+HH3643/hf/vIXrV+//qjbBgIBlZeX69e//rUMw9Dy5cvHIkVMQtlJXj385RXKnABfFgIAgKnnpBkZevaGU3XTHzbqtZ0NlufeLD+oj//s9WinpvL6dn3h/rX6/VdOVEqcvcXVSUlJxyxicjqdSkpKUnJyspKSkpSUlHTUAibp6AVDI2EYhlyuwX8MMU1ToVBIwWBwwC6thmFEO7kOR1xc3IDP7dq1S83NzTIMQ16vV3FxcdEuTkc+PtqoOwBDV11drfb2dkusuLh4zN6bAAAAMP4OHDigJUuWKBKJaMeOHcrOztb06dPtTgsAAGBS6X1tmiKmflxxxRV97lI2TVP/7//9v0HvwzRNORwO3XDDDaOdHiahZJ9Lv7lypQrT4+1OBQAATGGZiV499KUV+uWr5frR82UKHzFfLtKrA+vWmlZd8cBaPfzlsesSaZqmGhoaFAqFlJeX1+86ycnJlnFLhmEoISEhWrCUnJysuLi4SdtFyDAMud3uo46ZNk1TixcvlsfjUVdXl7q6utTZ2Rl93NXVpVAoNOD2Pt/AowE7Ozujxzi0r6ampj7reTye6Hi6QwVOSUlJRx2tB6B/wWBQe/bsscQSEhJUUFBgU0YAAAAYC93d3dHPYx0dHYPusAsAAIDD6MQ0SP3N2Rvs7D2Px6Ply5frm9/8pk4//fTRTm1c7du3Tz/5yU/0zDPPqKKiQl6vVzNmzNCll16qr33ta4qPH52inL/97W+69957tW7dOtXX1ysrK0vLly/XV77yFZ177rmD2kcoFNJ9992nRx55RNu3b1dbW5vy8/N15pln6vrrrx9wxMZY87kdeuBLyzUnN8mW4wMAgNjicBi6bvVMLS9O1/W/36Calq4B192wv1lrfvKa7rx0iZYVp49aDsFgUDU1NaqpqVEgEJDL5VJ2dna/3X5SUlKUnZ0dLVhKTEzs86ElFjgcDsXHxw94fh0KhfoUNh0qdhqoE1MkEhn0RfRDY/BaW1ujsWnTpmnGjBn9rt/c3CyHw6G4uDi5XK5JW2QGjLbW1laVl5crHA5b4jNnzuS/EwAAYJvJdJ1/Mun9BVssfpYFAAAYKToxDcKRd0yapqnS0lIZhqHnnntOs2bNGnA7wzDk8/mUkZExJcYxPP300/r85z9v+SKjo6ND69ev1/r163XffffpmWee0cyZM4d9jEgkoq985Su6//77LfGqqipVVVXpySef1FVXXaV77rnnqB8AGhoatGbNGq1bt84S3717t+6991499NBD+tnPfqarrrpq2LkOh9Nh6BefW6ql00fvS0EAAIDBWF6crmevP1Vf/9P7+uf2ugHXq2js1KX3vKWvnTFT1390ltzO4V909fv9qqqqUl1dneUGgFAopPr6euXm5vbZJiEhQfPmzRv2MWOFy+WKjtIbrGAwKKfT2aeYYrCO1uFpx44d6urqKZBzOp3RDk5er9fyx+fzyePxcDEfU15LS4v27dvXb6ez7Oxspaamjn9SAAAAmlzX+Seb3l+wTYXvhWJZ3fvv6/177lH9xo0K+v3yJCUpa8kSLb7mGmUvXmx3esCoMOvr1fnaawofOCAzGJTh8ciZmyvP0qVy9nPdDgDGA52YBmGgmcX5+fkxM894w4YN+vSnP63Ozk4lJibqm9/8ps444wx1dnbq0Ucf1a9+9SuVlZXpvPPO0/r164f0ZcqRvv3tb0c/2Bx//PG69dZbNWPGDJWXl+v222/Xhg0bdN999ykrK0v/+7//2+8+wuGwLr744mgB0yc+8QldffXVSk9P1zvvvKPvfe97qqur0zXXXKOCgoJxvePjh59apDPmZo/b8QAAAI6UluDRfZcv0/2v79H3/7Zdod4z5T4UMaWfvrhLr+5s0F2fXqKSzMGPEItEImpoaFBVVZXlonhvVVVVysnJoRPJOPL5fFq1alW0i9OhTk5HPg4Gg0fdvj+HRtMdEg6H1d7ervb29gH35fF4ooVNubm5ysjIGP4/DJhgdu3apaqqqn6fczqdKi0tHeeMAAAAekym6/yTEZ2Ypoaadev00o03qvrNN/s8V/3WW3r/F79QwapVWn3nncpbvtyGDIGRy4pEtKq7W/rtb9X7SlC4slLB9evlLCyU7+yz5WIUOoBxRiemYZjsP6ThuOGGG9TZ2SmXy6Xnn39eJ510UvS5j3zkI5o1a5ZuvfVWlZWV6Uc/+pG++93vDvkYZWVl+uEPfyhJWrZsmV599dXoKIzly5fr4x//uE4//XStX79ed9xxh7785S/3ezfIQw89pNdff12SdN111+nnP/959LkVK1bo3HPP1dKlS9Xa2qrrr79e27Ztk8s19i+dfz9/vi4+ftqYHwcAAOBoDMPQVaeWaun0NP3L7zaoqrlzwHXfr2jWmrtf039cMF+XLS88asFRMBhUdXW1ampqjloII0lJSUkq4AKILQzDkNvtltvtVnJycp/nw+FwnzF1h5YHGlM32BF1Rzo0rs7v9ystLW3A9TZt2iSHwyGPxzPgH74YwESTnp7ebxGT2+3W/Pnz5fV6bcgKAABgcl3nn4zoxDT5lT/zjJ6+5BKFjrhRpz9Vb7yhP5x2mi74858147zzxik7YHSYu3frwmDwmF+qhysq1P7gg4r/1Kfknj17XHIDAGnqdWLi6vUYWLt2rV577TVJ0pVXXmn5YHPIzTffHB37cffdd6u7u3vIx7nrrrsUCoUkST/96U/7fEkSHx+vn/70p5J6RpDceeed/e7n0Aek9PR03XHHHX2enzlzpr75zW9K6rlD9oknnhhyrkN13eoZuvKUkjE/DgAAwGAdX5SmZ68/VWcfl3PU9Tq7w/rm45v1ld+8q4NtfYtVTNNURUWF3n77be3bt2/AAibDMJSTk6Pjjz9eJ5xwAl2YJiin06nExERlZmZq2rRpmjlzphYuXKjly5crPj6+321CodBRR80dy0AFHZFIRE1NTTp48KBqamq0b98+7dy5U1u2bNGGDRv0zjvv6LXXXtMbb7yhdevW6f3339e2bdu0a9cu7d+/X21tbcPOCRiJtLQ0S9cCt9ut0tJSrVy5kjFyAADANpPtOv9kdOQYdYlOTJNNzbp1gypgOiTU1aWnL7lENR9OBQEmg1BVlfTXvw6+K0gopI4//alnOwAYJ1OtExNnhGPgySefjD7+0pe+1O86DodDX/ziFyVJzc3Neumll4Z0DNM09Ze//EWSNHfuXJ144on9rnfiiSdqzpw5kqS//OUvfT4UlJWVadu2bZKkSy+9dMAvWq644oro47EuYjr3uCzdcvacMT0GAADAcKTEu/XLzy/V9y5aoPQEz1HX/cfWWp1z12vq6g5HY11dXXr//fe1e/fuPudlh3g8HhUXF+vEE0/U3Llz++3+g8ktMTFRK1eu1GmnnaYVK1Zo0aJFmj17tqZPn67c3FylpqYqLi5uwAv4AxUxDfYLk1AopI6ODjU3N6uurk5VVVXas2fPUYuY1q9frw0bNmjz5s3avn27ysvLtW/fPlVXV6u+vl5NTU1qa2tTV1eXQqHQgK9vxCbTNNXQ0KCWlpZ+nzcMQ9OnT5fH49GMGTO0cuVKFRYWcic+AACw1WS6zj9Z0YlpcnvpxhsHXcB0SKirSy/fdNMYZQSMvq7nnpPC4WOveKRQqGc7ABgnU60T06jOBPvyl78sqecC5KH5zUfGh6P3viaDQ6PZEhIStHTp0gHXO/3006OP33jjDZ111lmDPsaePXtUXV3dZz8DHWfHjh2qqqrS3r17VVJyuMPRoVyPtZ/c3FzNnj1bZWVleuONNwad53DcuNiU0VA29A3d8ZK7/5Ed6miUNMwPdq44ydN/cZc6myRzmG8CLq/kSez/ua4WKRIa3n6dbsk7wJedgVYpPPS7gSRJDpfkS+n/uWCbFBr6WBRJkuGQ4gYYiRLskEIDj+w5xo6l+PT+n+rulLo7BtzS0dam9Eh9z+ODO6VAr/+f4jP63zAU6PlZDJcvTervy8pQUAr6h79fb4rk7OftPhySAv1/kTQoniTJ1c8X+JGI1NU0gv0m9vz30Z+Og8Pf7yR+jzA6/Ioz2z98fFDqruc9QrLtPeKYpvh7xDHfIw+Zwu8RhqTPz5AuLpymP79fp4fX1amps///JsNt0tcf/Ke+clqpFk1LVXVl7YBf4ifHuVWQHq/MZJ8cRpfUsmfgfDmPkCQZ7R3W90fnEV2tJsF7hCEpTlKcR5IjIrkCUoIk+ST5ZJqmQhFTge6wurrDCnRHFOgOy9dWIXX2ej/wpSnYOcz32g+5O+qk+l6vT2+KwnKovb19yPtzGIZcTkMzc5OVldyr89SH7xGVBxrkcDjkdDrkdDrlMiRHqE1Ow5DDYchhGHI6eh4b0rG7kY3gPcI0TYUjPf+tu5y9fr4fvkfUtHSqO2wqFIkofOjvjiZFwhGFIqb87R3q6OqQKYfeWb9OXp9PEbNn39nJPuUkx8mUqQ//J9PllVw+baxoVnsgLNOUTPWcO7i6/Uc9PTn0o8hO8qo4I8H6pNMtw5OgrQda1doRkmH0vN4Mh+Tp7pDULYckh3p2YjgkQw7Leik+j4ozEz78uffE5XTJ8CWruqlTbYFuGUbP/0eGJGeoTS4zJIdhyGFIHpdDeck+NbYHta++Te2BkJLj3FpSnN73/0eHS+neZK1cMKPnosuRvyc4j+gxjPOII39nG+311vfI6H75rBEVo581+hjD8whHS9PgziN747PGYVP8s8ag9fceEZfe/78BGIHJdJ1/srKziKk73K39/v3D2jbFmyKHEbvvOWawW7Uv/FPVb745rO2r3nhD2194RunHzRvlzHq0t7UpHOz5PXOwdq+62gd5zoGYEop0a3/7Ed2SwiF1H6i1rONrC2h2xfA6KoUrKrTztacVSuH1h746OjoU7KiQJO3c+tqATUYmAndengy32+40bNcd6db+1v0qSi6S2zG4n0dRUpHczvH52VHEdBQPPvhg9GLkkYVHR8aHwjTNSVnEdKiz0cyZM+VyDfwjnjt3bp9tBmvr1q397mcwxznyw81Q91NWVqaKigq1t7crISHhqOsfqbKy8qjP19TURB+nPH6ZlBy7HwBgv0RJVx9aeOhXNmYC9EiSdP2hhV/ebWMmAO+RR0qQdPmHf3S0yWBVkn7f87DYcKlx2Y/VnljcEzAjyj3wogoqn1Zi21GKltCvqf7+aEhyf/hnMJe8vJ5Uzco8UUFP2uE/3tToY/MYH7C9j39R6ud12O3NlE7+9ZDzj5imgiFT+vs3pfq+N0KYkspXP9nzJfKgdhiWMxKQIxKUIxxQye7fKKfu1X5X3TXzKpmGQ45ISIYZkiPS/eHfoV5/W+NGJKT4jkq5Ag397jc1Lk+mJMOMfPgnLEMR6dBjM6JTjIgkU8brP5VMs+exTMn88O9+nD24n8CQ5R7luZ5MjJ4/Rk+WH5Yq9VQtmaYcZv+FDCXOOJkOl0w5JBkyjUP7MaL7aU2Zp/eKL1VHQlF0u9bObjX//mqlNW3qs88jjo5RYvmdfU9s/87GxMB5JMaS/6sbZQ5U5NWP4RRoI/ZMpuv8xzKU6/N+v1+tra2D3vdIhHt1N+nq6hqXY//72n/Xi1UvjvlxprKVD1fr6K/Yo/vhbV/UO1/MH7V8+vjwY8jv33x67I6BKe/mg8drtmYMe/vX1/1RP87YOHoJYWop7fnrjztesTePY9lgdwKT20cKPqL/XvHfY36crl6dEcPh8Lidz/n9I7jxZQCjWsRUVFTUb7HSQPGpqKurSw0NPRe8p02bdtR109LSlJCQoPb2dlVUVAzpOEd+6DjWcQoLC6OPex9nOPsxTVOVlZXR9rWDcWQOAAAAscphhjRv6w/17tIfy9PdrLlb71Rqyxa708IU4Qk2K7/67/0+Z0oKuRKiBU3dnjQFvIce9xQ6eQKN/W4bcieNKC9nuP+OExGnb/AFTJLkcCrsiFdYPXenHa0oqyb/bEWcA3RbOYbSXfersOIv/T63ccn/KOjLHNZ+i/b+QSV7Hun3uXeX/qinuPEohU4Dya35h2btvLff595f/F9qSV3QU1hkSD2FRoP7mWfWvaHjtvyg3+d2zL1eDdmrhpTnIfumf7rfIiYAAEbigQcfUKcx+BsuB+qOChwy2a7zH8tQrs//5je/UUrKAB3wRtmyZcssBWJPPfXUmHwR1tuLuRQwjVT6/uF2LDy0/dDG0AF2mBlMtXV7AJPfi1UvKv8XY1i0+6GEhAQtXLgwutzd3a1f/OIXY35caWw+W41qEdPevXuHFJ+KjjzBTkw89v3Shz7ctLUNreXzUI5zZMek3scZrf0AAABgcBLa92vBB/+j5NYyuULcAY7xYUhyh9rlDrUroePod2H35u2q17wPfqCQO1nd7iR1u5MUciUdfhyNJfZbIOMM9V/EFHKOrFW2I9LPaKwPRRzD/6hrRMJHeXJsOsaaDne0KGuoQ6dMY+CRG6bhkDmCn8VAhlpodUh8+37lVT/X081qdFMCAAAYVZPtOv9k1fvmd9Mc5ghWjDt318jG1Li6jvK5C5gg4iMj+zw90u0BYLCCwaAqKysVDocViUQYJwerI1t1eTyeo6zZw+vtuTu4s3NoVetDOc6hY/R3nNHaz7Ec686QmpoarVixYkj7BAAAmIg64gtUNudfNHvHzxTfUdXvOumN9OHF5OEOtSm7n3FwvZlyKOz0KeSKV9gZp7ArXiFnnBLaB/4skH5wvUIfrht2xivkilPE4R1UF6WBiphMOaSjFPYci6GBP+QfrWDo2Ab+QsYco5Keke31KFubQ7sQktC2V0V7/6Cs+reO+vMFAGC4vnTFl4Y0Tq6srEy33XbbGGaEyW6yXec/lqFcn//CF76ggoKCIe1/uN5//33Ll2wXX3zxoIrGRqp6bTXj5Eao2zeyGzxCvpF8tgLGR4ej/xHr47U9gMnvIwUf0bUXXzsux2pra9NvfvMbST3nc+NxTiVJVVVVo/7ZiiKmUebz+aKPg8GB7ww+JBAISJLi4uLG7DiHjtHfcXrv58jloeznWI7VCvdI7Zf8QZo1jBmz7njJPUBeHY0a+j3NH3LFSZ4B7hLvbBryBfzD+/VKngHePLpapMgwT26cbsmb3P9zgVYp3D28/Tpckm+ANsLBNikU6P+5YzEcUlzaAPvtkELDbUtrSPHp/T/V3Sl1998RQOp5k//9o7+XJH3mss/0fZMf6KJYKNDzsxguX5rk6OfDXygoBUfQRtmbIjn7ebsPh6TACFr8eZIkVz8XVyIRqatpBPtN7Pnvoz8dB4e/30n8HuH3+/XAgw9I6rkwm+SO8B4h2fYecUxT/D3imO+Rh8Tge4Rpmqpp6lR5basiprTt9F/p+JnTFHD49Nh7FXrwzX1qbD/6eVuqz6VVJck6bUaKTipOVqJ3gIt6nEdIkvztHXrg0Sckffj+mHTE2LNJ8B4RCIXV1B5UQ1tQjf52NbW2qamzW80d4Z6/O3v+buoMqbkjpPbgFCv+6JK09shAWJJfhvySTLkdktfpkNdpyOMy5HEa8rkd8rkMeZ2GDOfXlFbyb/I4HXI7DbmdDrk9HnncLnmaOuQwJJfDkNNhyOUw5FJYTochhyE5jZ6/HQ5DDkkOw5Dx4cS1XfP/RbXLbpbjw3UMw5DDEyeHy6tQdaU0zLvDuxZ/SU1n/Eu0NMgwDBkur+SJV2TnXilw7M+P/QnNu1jtp19uiZlOt+RNVLh8v9Q+vP8OAtNPV92yCz7855oyTcl0uGR6EtR5oE5qO3onOdM0VePv1nO7/Npc65GpL0j6woDrx3ucWj0nW+ccl6OVpRlyOz/8ncd5RI9hnEcc+Tv7siuuVVJyP+/DfNY4LEY/a/QxhucRbS1NgzuP7I3PGodN8c8ag9bPe0RSXHr//4YBHNnRBujPZLvOfyxDuT6flJSk5OQB3s9HmdPptBQx+Xy+cTn23Wfere5wt/b79w9r+xRvihxj1KV1MjCD3Xrj7/+isl1/HvY+Tl31CX39rP8cxawOa29r0+8ffVSS9JnLLlPCOH2Ji8klFOnW/vYjbj4Mh9R9oNayTl6gQappHfYxZuQv1B+XfGLY22Pq6ujo0LN/+5skac255yo+fmTdyseSOy9Phtttdxq26450a3/rfhUlF8ntGNzPoyipSG6nPT+7xMTEcTufa20d/vvkQChiGmVHfnEymJau7e09F36HWgk3lOMcOkZ/x+m9n6MVMR1tP6MpklYiZc0Z3Z0mZI7u/tjvOO13bHZ7LBFvqxodWT2PM2ZJ4/Qmb4/csdltUvbY7HfSvYZHZ79m2KNOo+c/CDM+Y+xekxP859B3v2OzWxyp73vEqLxHTsH3iGAwqB07dqix8fAJe1tXSHtbwiotzdHnP5qjT556vK54YK3e2dM44H4au6Td20L6zbaDcjsbtbIkQx+dl60z5+WoMH2QH2Yn3X/Lw9+v6W21vj8mHPF6tOk9IhSO6GB7UPX+gOrbAqr3B9QQ/Tuoen/jh38H1NI5mKIwlybbxza305DX5ZTX7ZDP5dTZx+Xo+KI0xbmdivM45XM75XM7FOd26o3yBiX73EqP9ygtwa0kn1txbqd8Hqd8LqfcTqPPiAk7zZ1RItM0o38kWZb9fr9++9vfSpI+97nPKTExMbqe2+2We4CLPgt8ydEvb442QqO/n4Xb7R7wc9zc+ckKh8N9thvMstPpHLAbQHZOfjTfI7c99Ngwev5/czgcmrHnoP77r9u0uapFDkOKDPDPawxKv93crt9u3q20+AqduzBPnzi+QMuKi/vfYKRi4DziyN/ZZkKW9T1yXPBZg/1a9xtxjcFnbT5rTGJj9B4BjJLJdp1/snL0Kj4Mh8dvxJjb6daM1GHcTA3JJ534jW+r7NHhFzGtvOnrys4rHcWkDmttbZXT01MAnZFTPG5f4mLyyVev7yLnWRfD8w6o7Z57hr3/nLM+rvxcznnQV2trqzyvfCBJmjX/VN6nJom56XPtTiFmTK6r4ZOAz+dTRkaGDh48qMrKyqOu29TUFP3gUVhYOKTjHHnnxLGOc2Sr2N7H6b2fzMyBL/4c2o9hGEO6cwMAAGAqO3jwoHbs2KHu7r4FKY2NjSouLpbD4VCcx6lfXb5M335is55+v+aY++0Om3p9V4Ne39Wg/3x6q2bnJOqj83J05rxsLSlMk9MxcQo7YkFbIKS61i7V+XsKkur8AdX5u1TfGojG6tsCauoIDrdRj+3WLMzVqbOylOB1KdHrVKLXrQSvU4lel779xAdK8rmUkeBReoJHqfEepca7lXbE32nxHiX5XHIM4bVZmjW5vnw5VJwzkEAgEL1D3uv1DvoO+bHqBjFWd/K5XIO/lLCiJENP/+sp2lzZonDE1L7Gdj21sVqv7qxXd7j//1iaOrr1u3f263fv7NcVJxfrOxfMn1DFbAAAYOqbbNf5J6vU1FRt3rxZ4XBYixcvHnKHKdgne8kS5Z98sqrffHPI2xasWqXsxYvHICtgdDlzc+UsLFT4GCM5+922sFBOCpgAYFhGtYiptHT0q6YNw1B5efmo73cszZ8/X6+99pp27dqlUCg04AXe7du3Rx/Pmzev33WOdoz+9jPU4/Tez5IlS465n8LCQlouAwCAmBcOh1VeXq6amv4LkgoKClRSUmK5szTZ59ZPP3OCPja/Wt/9ywdq7Bj8eLay2jaV1bbpFy+XKz3Bo9VzsnTmvBwtL05XZqKHL/iHIRIx1dQRVH1bQHVHFCPV+T8sVmo9/LgjOH53BB+LISntw2Ki9ASP0uM9Sk/0KMXn1i9eOfpnp8xEr7KSPvxz5OMkr44vTB2w49dvr1o5Bv8SxJKF03ruhF5SlKoLlxSouSOov39wQE+9X623dh8csPjvwTf3KifZp2tXc5c8AAAYX5PpOv9klZ+fr7/85S+SpDVr1kyZDlOx4oy77tIfTjtNoa6uQW/jiovT6jvvHMOsgNHlO/tstT/wgDSUTnEul3xnnz12SQHAFDeqRUx79+4dzd1J6r9d/kR3yimn6LXXXlN7e7veffddrVzZ/wX/V155Jfp41apVQzpGSUmJ8vPzVV1dbdlPf1599VVJPV+kFfdqxX/KKadY8rnsssv63ceBAwdUVlY2rFyHyu/3j+n+AQAARsrv92vbtm3q7Ozs85zb7dacOXOUkZEx4PYfX5yvs+bn6KmN1Xrwzb3aWjO0udGN7UE9/l6VHn+vSpKU5HOpNDNBpVmJKslMUGlWgkoye/7Ee2Kr+appmmrp7FZD2+GipEPj2w6NdTv0+GB7UOGBZltNYN/5+HxdcXJJv881tgcV53FaipOyEr3KTvIqPcEjl9PR73bAeEuN9+iyFUW6bEWRfvfOfn3ric0DrvuDv29XSWa8zlmQN44ZAgCAWDeZrvMDdshbvlwX/PnPevqSSwZVyOSKi9MFf/qT8pYvH4fsgNHhKiiQzj9fob/8ZXBfqrtciv/Up3q2AwAMy6h+o3H55ZeP5u4mrYsuuki33XabJOmBBx7o98NNJBLRww8/LKmnZeoZZ5wxpGMYhqELL7xQv/jFL7R9+3a9/fbbOvHEE/us9/bbb0fv0Ljwwgv7FIXNnj1b8+bN07Zt2/THP/5RP/rRj/odOfDggw9GH1988cVDynWo9u3bpzlz5iglJWVMjwMAADAcLS0t2rRpkyKRSJ/nMjIyNHv2bHk8nmPux+d26tLlhfrUsml6d1+THnxzr/7+wQGFhlFU4+8K6f3KFr1f2dLnubwU3xGFTYkqzUpQaWaCpqXFT/iRdKZpqj0YVnNHUM0d3T1/OoNq6uhWS0dQdc3teqe9QF2mU68+sEGNHSE1tAUGHFE13lLi3CpIjVNWkjfaASkz0aPMRK++/qf3B/X/tWFIWYle5afGKT/Vp7yUOM3PG/g8+QeXLBrNfwIwLur9ATkdxlGLCm/8w0b9KTU+2tEJAABgrE2m6/yAXWacd54+/eqrevmmm1T1xhsDrlewapVW33knBUyYlIzSUv3F49HJ3d3KG6iNsHpGyPnOPpsCJgAYoVEtYnrggQdGc3eT1ooVK3Tqqafqtdde0/3336/LL79cJ510kmWdH/3oR9q2bZsk6YYbbpDb7bY8//LLL0c/8Fx++eWWIqJDbrzxRt17770Kh8P613/9V7366quWmdGdnZ3613/9V0mSy+XSjTfe2G++X//613XllVeqsbFRt956q372s59Zni8vL49+WJs5c+aYFzFJUllZmZYuXWoZvwIAAGA3v9+vzZs39ylgcjgcmjlzpnJzc4d8MdkwDC0rTtey4nQdaOnS797Zp9+t3a+GtqBlvbPm52jvwXaV1bYNaf81LV2qaenSm+UHLXGP06GijHgVpMYpweuUz+1UvMepeI9LcdHHTsV5XB/+7ewbd/ds1x2JKNAdUTAcUTAUUSAU/vDvnuVDsUCfWM/f/q5uNXd+WKTUEYw+bukMDqIgKe3Df+jQfi7j4cYzZ+lLq/rvmHT3P3dqT0O7fG6HCtPiVZje8/9FXqqv5++UOOWl+JST7JPHxTkxprYbzpyli47P1/+9VK7H3qvst8Cvqzuiqx5ep7987RTlpvhsyBIAAMSayXadH7BL3vLl+szrr6vu/fe16d57Vbdxo4J+vzxJScpeskSLvvIVZS9ebHeawIjUOxz6i9err15yiTzbtytcWyszEJDh9cqZkyPP0qVy5ubanSYATAmxNVtiHN19991atWqVOjs7ddZZZ+lb3/qWzjjjDHV2durRRx/VvffeK6mnE9LNN988rGPMnj1bt9xyi77//e9r/fr1WrVqlb7xjW9oxowZKi8v1w9+8ANt2LBBknTLLbdo1qxZ/e7n8ssv169//Wu98cYb+vnPf64DBw7o6quvVlpamtauXav//u//VmtrqxwOh37yk58MOPt7NHV0dGjfvn0qKen/Sx8AAIDx1t7erk2bNikcDlviSUlJmjt3br/dLIcqN8Wnfztrjr72kZl6dnONHnxzn96vaFZusk8//9wJcjsdqmjs0AvbavXPbXVau7dRwVDfjlCDEQxHtKuuTbvqJl7xz3gzJKUneJSV5FV2sk/ZST3j1zITPfreM9s03IlzFY19xw0e8qsvLlVKnEeZiR7uogYkTc9I0A8uWaR//ehM/dfTW/X81to+69S2BnTlQ+v0p6+eFHOjMgEAgD0m03V+wG7ZixfrzJ//3O40gDFlZGUpbsYMu9MAgCmNq35j5Pjjj9cf/vAHff7zn1dra6u+9a1v9Vln9uzZeuaZZ5SUlDTs4/zP//yP6urq9Otf/1obNmzQZZdd1medK6+8Ut/73vcG3IfT6dSTTz6pNWvWaN26dXrsscf02GOPWdbxer362c9+pnPPPXfYuQ5VRUWFsrKylJiYOG7HBAAA6E9nZ6c2bdqkUChkiWdkZGj+/Pmj3j3S63Lq4uOn6eLjp2ljRbMa/AG5nT3HKEyP15dWlehLq0oUjpi664Uy/fTFXZbtHYaGXXgzlTgNQ6bMY/4s/v38+fryKf0Xzz/01j7tO9hx1O3TEzwqTI9XUXq8itLjop2VZmYPfB47M3v4nwGAqWxaWrx+dOlifeRHr6jeH+jz/JbqVt346Eb98vNL5ZjgIzEBAMDkN5mu8wMAAABTgW1FTKZpavfu3WpsbJQkpaenq7S0dErdhXzBBRdo06ZNuvvuu/XMM8+osrJSHo9HM2fO1Kc+9Sn9y7/8y4jv2Hc4HLr//vv1yU9+Uvfee6/WrVunhoYGZWZmavny5brmmmsGVXiUmZmpN998U7/61a/0u9/9Ttu2bVN7e7vy8/P10Y9+VDfccIOOO+64EeU6VKZpaseOHTrhhBOm1OsCAABMPi6XSx6PR8Hg4RFvqampY1LA1NuSwtQBn3M6DO1v7Ftg01/RTqLXJbfTUGd3WF3dw+veZCenYSg5zqX0BI9S4z1Ki3cr3iXtLdsqjxHWu1056v3PDpuDq+Sqbh64Y1JRerz2N3YoL9mnoox4FWckqCgjXtPTEzQ9I15FGfFK9rkH3B7A0CX53PrWmrm66Q/v9/v881tr9YPntuub584b58wAAEAsmkzX+SebxsZGzZ07Vw6HQzt27FBGRoZKS0vtTgsAAAA2Gvcipr///e/6v//7P7388stqb2+3PBcfH6/Vq1fruuuumzIn5NOnT9ePf/xj/fjHPx7SdqtXr5Y5yC9dJGnNmjVas2bNUNOzcLlcuvbaa3XttdeOaD+jqa2tTZWVlSosLLQ7FQAAEMPcbrcWL16szZs3q7W1VcnJyVqwYMGYFzANxvsVzYNary1g7SLlchialZOojy8uUGcwpM7usDqCYXUGe/5uaAuoszus7nBEwVBEXd0RdQRD6uqOKBg+dhGUx+WQN/rHGV0+dGyHw5DTMNTzI+wpWA9HIgqEIuoIhuXv7FZrV7cOTcsLm6a+dsZMXXXq4Qvara2t+sUvXpQkVXuLVN3St2vLYFQ0Ddxp6c5PL1Gi1yWf2zmsfQMYnouWFOj371Ro7d7Gfp+/55XdKs1M0KeXF41zZgAAIBZNpuv8k0kgEFBqaqokqaOjY1TGtAMAAGByG7cipo6ODn3hC1/Qk08+KUn9nri3t7fr2Wef1bPPPquPf/zj+u1vf6uEhITxShEThM/nsyzv3btXGRkZfIABAAC2crlcWrRokfbs2aPi4mI5nROjqOU7FxynjRXN2ljRrPcrm9Xc0T2o7UIRUwWp8bp29Yx+n7/kF29qS3VrdNkwero5ZSV5leh1KsHrUrzbKa/bqVDEVCAUUXcoos5QSJ9bMV2fO3F6v/s944cva3tDe7/PHUtta9eAz01L9R2ziCk7yaui9J5Rb4Xp8SpMi1NherxKMgf+zJGZ6B1WrgBGxjAM/eeFx+n8n76u8AAzIb/9xAcqSk/QSTMyxjk7AAAAjIbeNwaFw2GbMgEAAMBEMS5FTJFIRGvWrNFrr70m0zTldrt11llnacWKFcrJyZEk1dbWat26dXr++ecVDAb11FNPac2aNXr55ZcZJRZj8vPz1dbWFl2ORCIqKyvT4sWLeS0AAABbOZ1OzZw50+40LM6Ym60z5mZL6rlRYH9jR7SoaWNFs7ZUtyoY6r9z0pLClAH329plLYYyTcnfFZK/KzTAFodVtww8nm0kHY1qWwcuUipI9SnpQPuHBUpxh4uV0nr+npYWRzclYJKZl5esL5w4XQ++ubff50MRU1/97bt64rqTVZqVOL7JAQAAYMR6FzFFIpNv9DkAAABG17gUMd1zzz169dVXZRiGzj77bN13330qKCjod92qqipdffXV+vvf/67XX39dv/zlLyfUeDOMvfj4eKWkpKiqqioaa2lpUU1NjfLz823MDAAAxIJwOCzDMCbEqLihMgxD0zMSND0jQRcu6TnfDoYi2nHAr40VTdpY0aL3K5u1q66nYHxxYeqA+xpMsdJAOoMDX3iO9wy9kMgwpIwEr+KOUoT0/86ZqR9ftpSid2CKueljs/XXTdVqaAv2+3xLZ7eufGi9nrjuZKXGe8Y5OwAAAIwERUwAAADobVyKmB566CFJ0vLly/XMM88c9QuhgoICPf3001q1apXWrl2rhx56iCKmGFRSUqKDBw+qq+vwyJDdu3crIyNDXi8jPQAAwNiIRCLasmWLHA6H5s+fPykLmXrzuBxaOC1FC6el6Asn9cRau7q1ubJFS45SxNTP9OdB6+weuADqUCGS1+VQvMepOLdTyXFu5ST7lJPsVU6yT9nJPuUkeT+M+ZSR6JHbefT/L9xOBwVMwBSUEufW/3fuPH39T+8rN9mnb6+Zp6c2VesfW2uj6+xpaNdXf/uuHv7ySnlck/99GwAAIFYwTg4AAAC9jUsR07Zt22QYhm666aZBfRHkdDr1b//2b7rsssu0bdu2ccgQE43T6dSsWbO0efPmaCwcDqusrEwLFizgCyoAADDqTNPUtm3b1NTUJEn64IMPdNxxx8npnHojyJJ9bq2amXnUdd7+1kcVjphqC4Tk7+pWa2fP3/6ukFo//Nvf1a32YFhel0NxbqfiPU753E7NzB54rNN9ly+Tx+mQw8H5HIDB+cTxBeoIhvTJE6YpwevSR+dn61O/fEtbqluj67y9u1H/78nN+sEnF/F5EQAAYJKgiAkAAAC9jUsR06ELiLNnzx70NrNmzbJsi9iTnp6unJwc1dYevsO2sbFR9fX1ys7OtjEzAAAw1ZimqR07dqihoSEaa2pq0rZt27RgwQIbM7OX02EoJc6tlDi3lDY6+/QdZSQcAPTH4TD0xZOKo8vxHpfuu3yZLvzZG6rzB6LxP66v1MzsRH3ltBk2ZAkAAIChYpwcAAAAehuXPuszZvRcQKyrqxv0NofWPbQtYtOMGTPkdrstsUPdEQAAAEaDaZrauXOnpXBa6ukMWVRUZFNWAICjyUuJ0/2XL5fPbb2scdvftuu5LQdsygoAAABDQScmAAAA9DYuRUyf+cxnZJqmHn744UFv8/DDD8swDH36058ew8ww0bnd7mhXLrfbrXnz5g2poxcAAMDRmKap3bt3q6amxhJ3OBxasGCBkpOTbcoMAHAsC6el6K5PL7HETFO68dGN+qCqxZ6kAAAAMGj9dWIyTdOmbAAAADARjEsR0/XXX68TTjhBjz76qG6//fZjrn/HHXfo97//vY4//njdeOONY58gJrSsrCzNnDlTy5cvV3Z2NiMGAQDAqNm3b58qKystMcMwNH/+fKWmptqTFABg0Dwuh84+LscS6+wO66qH1utAS5dNWQEAAGAwehcxSaKICQAAIMa5xuMgBw4c0H333adrrrlG3/zmN/X73/9el19+uaUopba2VuvWrdNvfvMbbdy4UcuXL9e9996rAwcGbgPPeI/YUVBQYHcKAABgiqmsrNS+ffv6xOfNm6eMjAwbMgIADNb+gx36r79u0Qvb6uR1GVqzMFfPbj58/eBAa5euenid/njNSYr3jMulDwAAAAxRf0VM4XC43zgAAABiw7hcySsuLrZ0z9m0aZNuvvnmo26zfv16nXDCCQM+bxiGQqHQqOUIAACA2FFTU6Py8vI+8Tlz5igrK8uGjAAAg3WwLaCz73pVnd1hSVIgZCocNrWiJF1r9zRG1/ugqlU3/WGjfvG5pXI46OgLAAAw0fQ3dSEcDsvtdtuQDQAAACaCcStnN01z1P8AAAAAQ9XQ0KCysrI+8ZkzZyo3N9eGjAAAQ5GR6NUnl1q79T63tVZXnDxd0zPirfEttfrzu9axoQAAAJgYnE6nIpGIJRYMBm3KBgAAABPBuHRieuCBB8bjMIhBDQ0Nqqqq0oIFC+R0Ou1OBwAATHCBQEA7duzoEy8tLWV8LQBMIl8/a46e2VSjpo7uaOyHz5fpl59fqk/f85Zauw53br7zhTJ9fEm+fG4+MwIAAEwkhmEoGAzK5/NFY4FAwMaMAAAAYLdxKWK6/PLLx+MwiCHBYFC7du1SfX29JGnfvn0qLS21OSsAADCRmaapsrKyPiOJi4qKVFhYaFNWAIDhSI336BvnzNX/9/jmaGx3fbte3lGvOz+9RFc+tD4ar2np0m/f3qerTuUzIwAAwETj9/sVCARUUlKipKQkxcfHH3sjAAAATFnjNk4OGE07duyIFjBJUkVFhfx+v40ZAQCAic7v96uxsdESy8rKUnFxsT0JAQBG5NJlhVpcmGqJ/fTFnZqXl6STSjMs8Z+9tEutXd0CAADAxFJeXq5t27Zp+vTpKi4uVkJCgt0pAQAAwEYUMWFSKi0tlWEYllhZWVmf+dkAAACHJCcna8mSJdE29R6PR7NmzepzTgEAmBwcDkP/feFxOvJtvCMY1v88u13fOHeuZd3mjm796tXd45whAAAAAAAAgKGgiAmTUkJCgoqKiiyxtrY2VVZW2pQRAACYDFJSUrRs2TLl5+dr9uzZcrvddqcEABiBRdNSddly62fDZzbVqD0Q0jnH5Vri9722R/X+wHimBwAAAAAAAIyZffv2ae/evTp48KCSk5PldDrtTmnEXON5sFAopGeeeUavvfaadu/eLb/fr3A4fNRtDMPQP//5z3HKEJNJUVGRGhoa1N7eHo3t3btXmZmZzM0GAAADcjqdmjVrlt1pAABGya1nz9HfPqhRc8fhcXHfeWqLfnLZ8Xp+6wFFzJ5YZ3dYP3txp/7zwgU2ZQoAAAAAAACMnpqaGgUCPTftzZ8/Xzt27LA5o5EbtyKmV155RVdccYX2798fjZmmOeD6hmHINE3Ge2BADodDs2fP1oYNG6Ix0zS1Y8cOLVmyhNcOAAAAAMSAtASPbjl7jr79xAfR2K66Nr2+q16XLJ2mP64/3LH3d2v368pTSlWUwY0vAAAAAAAAmLwikUi0gOmQ3suT0bgUMW3cuFHnnHOOgsGgTNOUz+fTrFmzlJqaKoeDiXYYvuTkZE2bNs0yRq61tVWNjY3KyMiwMTMAAAAAwHi5bHmRHl1boc1VLdHY3S/s1O+uPlFPbqxWMBSRJHWHTd35Qpnu/PQSmzIFAAAAAAAARi4YDPaJUcQ0SN/97ncVCATk9Xr14x//WF/60pfk8/nG49CIAcXFxWpoaFBXV1c0VlNTQxETAAAxbt++fXI4HJo2bRodGgFginM6DP3Xhcfp4v97MxprD4Z1/+t79MUTp+u+1/dE409urNJXTivVvLxkO1IFAABAL9OmTdPu3bsViUTU1dWluXPnKj093e60AAAAJrQj6yMkKRwOKxwO25TN6BmXNkivv/66DMPQt7/9bV177bUUMGFUOZ1OFRYWWmIHDx6cElWGAABgeFpbW7V3717t3r1b77//vjo7O+1OCQAwxo4vStOnl1k/Gz71frXOOi5Xid7D93CZpnTHczvGOz0AAAAMIC0tTS0tLfL7/eru7ubaPgAAwCBMxVFy0jgVMR2qADvnnHPG43CIQdnZ2X1GE9bW1tqUDQAAsFM4HNb27dujyy0tLXrvvfcUCoVszAoAMB5uPWeOkn0uTUuL0w0fnaVXbzlDK0rS9ZXTSi3rvbi9Tmv3NNqUJQAAAI7U+wu33l0FAAAA0Ffvc6b+xstNRuNSxFRcXCxJ6u7uHo/DIQa5XC5lZ2dbYjU1NTJN06aMAACAXfbs2dOn81JBQYFcrnGZpAwAsFFGold/u/E0vXrLGbrpY7NVlBEvSbrylBJlJnos697+9+18ZgQAAJgApmoXAQAAgLE0Vc+hxqWI6aKLLpIkvfrqq+NxOMSovLw8y3JXV5eam5vtSQYAANiiqalJVVVVllhSUpKKiopsyggAMN4KUuPkcBiWWILXpX/9yCxLbP2+Jr24vW48UwMAAEA/encNoBMTAADAsfU+Z6KIaQhuuOEG5eXl6Yc//KH27t07HodEDEpKSlJ8fLwlVlNTY1M2AABgvIVCIe3YscMSczgcmjt3bp+xswCA2POZFUWalhZnid3+9x0KR+jGBAAAYKep2kUAAABgLPU+Z2Kc3BBkZWXp2WefVVxcnFauXKlf/epXamlpGY9DI4YYhhHtxuTxeFRUVKTS0lKbswIAAOOlvLy8z0l7SUlJnyJnAEBs8rgcuvms2ZbYjlq/nnq/aoAtAAAAMB76K2Ji7C8AAMDATNOcsp2YXON1oEWLFunVV1/VypUr9dWvflXXXnutMjMzj/mlkmEYKi8vH6csMdnl5OQoLi5O6enpMgzj2BsAAIApoaGhQQcOHLDEUlNTVVBQYFNGAICJ6OOLC3TPK7u1/YA/GvvR82U6b2G+PC669gEAANihd9cA0zQVDAbl9XptyggAAGBiC4VCikQilthU6cQ0bkVMjz32mK688kr5/X6ZpinTNFVXV3fM7ShEwVC43W5lZGTYnQYAABhHwWBQZWVllpjT6dScOXM4lwQAaP/BDv35vUq9Vd6gR79ykm45e46ufGh99PnKpk797p19umJViY1ZAgAAxK7u7m4ZhmHpvtTV1UUREwAAwAB6d2GSKGIakrfeekuXXXaZwuGwJGn69OlatGiRUlNT5XBwpyMAAACGxzRN7dy5U93d3Zb4zJkz5fP5bMoKADARtAVC+vKD67R2T2M09mZ5gz4yN1vLpqdp/b6maPynL+7SJcsKlegdt3u9AAAAcASPx2MZgTJVxqEAAACMhd7nSm63e8qM4x2Xq3Pf+973FA6HlZKSokceeURr1qwZj8MCAABgiqurq1NDQ4MllpGRoZycHJsyAgBMFIlel9oDIUvsT+srdeqsLH3j3Ln61C/fisYPtgf169f36PqPzhrvNAEAAKCeL94oYgIAABic3udKHo/HpkxG37i0QVq/fr0Mw9B//ud/UsAEAACAUREIBLRz505LzO12a/bs2YyRAwBIkj61dJpl+bktB9TS2a3lxen66Nxsy3P3vrpbje1To+02AADAZNP7i7f+RqQAAACgh9PpVFJSktxutyRF/54KxqWIqaOjQ5J0yimnjMfhAIvOzk7t2bNHdXV1dqcCAABG0a5du6Ljig+ZNWvWlLrjAAAwMh9fUiC383BhayAU0TObaiRJXz97jo6seW0LhPR/L+0a7xQBAACgvkVMdGICAAAYWG5urk444QSdfPLJOuWUU1RYWGh3SqNmXIqYSkpKJB0uZgLGQ0tLizZt2qS1a9dq//79qqiosDslAAAwikpLS5WSkhJdzs7OVlZWlo0ZAQAmmvQEjz461zpi9M/v9nw2nJeXrIuWFFiee/jtfapq7hy3/AAAANCDTkwAAADD43Q65XK57E5j1IxLEdMnPvEJmaap5557bjwOB0iSQqGQmpqaosttbW3y+/02ZgQAAEZTXFycFi9erNLSUsXFxWnmzJl2pwQAmIAu6TVS7r39zdpV1yZJuunM2ZZOTcFQRHe/UDau+QEAAKBvEVNHR4cikYhN2QAAAMAu41LEdPPNN2vWrFm66667tH79+vE4JKD09HR5vV5L7MCBAzZlAwAAxoJhGCosLNSyZcum1MxnAMDoOX1OljITrZ8NH3uvUpJUlBGvz64osjz353crtauOG2AAAADGU1xcnHw+n7KyslRSUqKFCxfKOHL2LwAAAGLCuBQxJSUl6Z///KcWLFig0047Td/+9re1adMm2oFiTBmGodzcXEustrZW4XDYpowAAMBYcTjG5bQWADAJuZ0OXXx8viX2+HuVCkdMSdK/fGSW4j3O6HMRU7rjuR3jmiMAAECsc7lcWrlypebPn6+ioiKlpaVRxAQAABCDxuXbHqfTqenTp2vt2rXq6urS97//fR1//PFKSEiQ0+k86p+pNLsP4693EVM4HFZ9fb1N2QAAAAAA7PDJXiPlalsDen1XgyQpK8mrK08psTz/3JZabdjfJAAAAAAAAADjZ1yKmEzTjP7pvTyYP8Bw+Xw+paenW2I1NTU2ZQMAAEaiq6uLc0MAwLDMzU3WwoIUS+xP6yuij68+rVRp8daxpD/4+3Z+7wAAAAAAAGBC2bp1qzZv3qy9e/eqoaFB3d3ddqc0qsalzdF3vvOd8TgM0K/c3Fw1NjZGl1tbW9Xe3q6EhAQbswIAAEMRiUS0ceNGeTwelZSUKDU1lbbyAIAh+dSyadpc1RJdfn5rrVo6upUS71ayz62vnTFT33tmW/T5t3c36rWdDTptdpYd6QIAAAAAAAAWpmmqsbFR4XA4WgNx3HHHyePx2JzZ6KGICVNeRkaG3G63pQLxwIEDmjFjho1ZAQCAoaiurlYgEFAgENCmTZuUmpqq4447jtHDAIBBu2BRvr73120KhiOSpGAooqc3VevzJ06XJH3+xOm6//U9qmnpim5z+3PbdcrMTDkcFM4CAAAAAADAXp2dnQqHw5ZYUlKSAoGATRmNvnEZJzdcGzZs0E033WR3GpjkHA6HcnNzLbHa2lpFIhGbMgIAAEMRCoW0f/9+S8w0TTmdTpsyAgBMRmkJHp05P9sS+/O7ldHHPrdTN5052/L8B1WtevYDRpIDAACMN9M01dHRoc7OTrtTAQAAmDDa2tosy263e0p1YZImYBFTTU2N7rjjDi1atEjLli3TT37yE7tTwhTQu4ipu7tbDQ0NNmUDAACGoqqqqs9M55KSEsbJAQCG7JKl06KPHYaUGu9WV/fhu9c+cUKBZmRZR4//+B9lCkfMccsRAAAglh04cEAbN27UG2+8oXXr1qmysvLYGwEAAMQIv99vWU5KSppy35VMiPkbnZ2devzxx/Xwww/rxRdfjHbIMU1zyv3AYY/4+HilpKSopaUlGqupqVF2dvZRtgIAAHbr7u5WRUWFJZaRkaGUlBSbMgIATGanzcrSiaXpWj0nWxcfX6CcZJ/leZfToVvOnqOv/va9aGx3fbue33JA5y7MG+90AQAAYk4gELBcx+/dbQAAACCW9T43SkxMtCmTsWNrEdNLL72khx9+WI8//nj0h22aPXc35uXl6eKLL9YnP/lJO1PEFJKXl2f58NPc3KzOzk7FxcXZmBUAADia/fv395nvXFxcbE8yAIBJz+V06NGvnHTUdc4+Llfz8pK1raY1GvvFK+U6Z0EuN1oBAACMsaSkJMtyW1sbN7wDAACop5amdxFT73OnqWDci5i2b9+uhx9+WI888ki0DeihwqVp06bpk5/8pC655BKdfPLJnJRiVGVlZWnXrl0KhULR2IEDB1RSUmJjVgAAYCCBQEDV1dWWWHZ29pS8swAAMHEYhqFrV8/Q9b/fEI1tqmzRG7sO6pRZmTZmBgAAMPX1/swfiUTU0dGhhISEAbYAAACIDV1dXZZaB4lOTMN28OBB/f73v9fDDz+sd999V9LhwqXU1FQ1NzfLMAz98Ic/1KWXXjoeKSEGORwO5eTkqKqqKhrr7u62MSMAAHA0+/bti44Zlnq+VKYLEwBgPKxZkKsfZcRr38GOaOwXr+yiiAkAAGCMeTweeb1eBQKBaMzv91PEBAAAYp7f77csu91ueb1em7IZO46x2nF3d7cef/xxXXTRRSooKNANN9yg9evXyzRNud1uXXTRRfrzn/+smpqasUoB6CM3N1c+n0/FxcU68cQTNXv2bLtTAgAA/ejs7NSBAwcssdzcXMbAAgDGhcvp0FdOK7XE3th1UO9XNNuTEAAAQAzp3VGg99gUAACAWNT7nCgxMXFKTjcb9U5Mb7/9th5++GH98Y9/VFNTkyRF5xWvWrVKn//853XppZcqLS1ttA8NHFNiYqJWrFgxJf9jBgBgKtm7d2+0c6fU04Vp+vTpNmYEAJjKQuGIav0BFaQeLpb95AnTdNcLO1XvP9wF4Bcvl+uXX1hqR4oAAAAxIykpSQcPHowu9+46AAAAEIt6nxMlJSXZlMnYGvUippNPPlmGYUS/dJozZ44+//nP63Of+xzjPzAhUMAEAMDE1tbWprq6OkusoKBgSrZFBQDYq6zWrz+tr9ATG6qVn+rTU/9ySvQ5n9upK08p0ff/tj0ae27rAe2qa9PM7MT+dgcAAIBR0F8npkM3ywMAAMQi0zT77cQ0FY3ZOLmkpCQ98MAD2rZtm7797W9TwAQAAIBB2bt3r2XZ6XSqqKjInmQAAFPWO7sP6qw7X9WvXtujhraANlW2aMcB6x1tn1tZpCTf4fu/TFO655Xy8U4VAAAgpvTuKhCJRNTR0WFTNgAAAPbr6upSKBSyxKZqJ6YxKWI6VAX25S9/WSeccIJ+/OMfq6amZiwOBQAAgCmktbXV0jJekqZNmya3221TRgCAqWrp9DRlJ1m7/D32XqVlOcnn1hdPso4zfWJDlaqbO8c8PwAAgFjl8Xj6dGPu3XkAAAAglvQ+F3K5XFN2esWoFzG9/PLLuuKKK5SYmCjTNLVx40bdcsstKioq0sc+9jE9/PDDnGxiwolEIgoGg3anAQBAzAsGg5aCJZfLpWnTptmYEQBgqnI5Hbr4hAJL7PH3qtQdjlhiX1pVIq/r8OWTUMTUfa/tGZccAQAAYlXv8Sh+v3+ANQEAAKa+3udCSUlJU3bU7qgXMZ122mn69a9/rdraWj3yyCM6++yz5XA4FA6H9eKLL+pLX/qScnNz9ZnPfEbPPvuswuHwaKcADFpHR4d2796tt99+W7t27bI7HQAAYl5mZqZWrlypkpISuVwuFRUVyeVyHXtDAACG4VNLrYWyDW0BvVpWb4llJnr16eWFltjv1+5XYzs3wgAAAIyV3uNRKGICAACxLCcnRzNnzlROTo4SEhKm7Cg5aYzGyUmSz+fTZz7zGf3tb39TRUWFbr/9di1cuFCmaaqjo0N//OMfdcEFFygvL2+sUgCOqr6+XuvWrVNFRYW6u7vV0NBANyYAACYAp9OpoqIirVy5UgUFBcfeAACAYZqZnaQlhamW2J/freyz3tWnlsrpOHx3W2d3WA+9uXeMswMAAIhdvTsxtbW1yTRNm7IBAACwV0JCggoKCjR37lwtW7ZMxcXFdqc0ZsasiOlIubm5+vrXv66NGzdqw4YNuvHGG5WdnS3TNNXQ0BBtc/Vv//ZvuuGGG/Taa6+NR1qIcampqXI4Dv8nYJqmamtrbcwIAAAcyeVyWX5XAwAwFi7p1Y3phW21fbosFabH6+OL8y2xB9/cq/ZAaMzzAwAAiEW9uwtEIhF1dHTYlA0AAMDEMlVHyUnjVMR0pMWLF+vHP/6xKisr9de//lWXXnqpvF6vTNNUdXW1fvazn2n16tXKy8vTddddp3/+85/jnSJihNvtVmZmpiVWU1PD3RwAAAAAEEMuWJQvj+vw5ZHusKmnNlb1We+rp8+wLLd0duv3a/ePeX4AAACxyOPxyOPxRJcdDoe6urpszAgAAADjwbZb251Op9asWaNHH31UBw4c0D333KNTTjlF0uGOOPfcc4/OPvtsu1JEDOg9zrCzs1Otra02ZQMAAAAAGG8p8W6dNT/HEvvze31Hys3JTdKZ87ItsV+9tluBUHhM8wMAAIhV06dP15w5c7R06VKdcsopysjIsDslAAAAjLEJMZ8jOTlZV199tV599VWVl5frO9/5jmbMmCHTNOmKgzGVkpKiuLg4S6ympsambAAAiD2RSETl5eXcTQkAsNWnlhValj+oatW2mr43uFy7eqZlubY1oCc39O3aBAAAgJHLz89Xbm6uEhMTp/TIFAAAABw2IYqYjlRcXKzvfOc72rlzp1577TVdffXVdqeEKcwwjD7dmOrr6xUKhWzKCACA2HLgwAFVVlZq7dq12rlzp4LBoN0pAQBi0CkzM5WT7LXE/vxu325MS6enaUVJuiV2zyu7FY5wAxYAAAAAAABGVyAQ0MGDBxUOx04n8AlXxHSkVatW6Ze//KXdaWCKy8nJsdzFEYlEVFtba2NGAADEhnA4rH379knqGSdcXV2tbdu22ZwVACAWOR2GPnHCNEvsyQ1V6g5H+qx73eoZluXdDe16bsuBMc0PAAAAAAAAsae+vl4ffPCB3njjDb3//vsxMVVqQhcxAePB4/H0maVNERMAAGOvqqqqT+el6dOn25QNACDWXbLUWsR0sD2ol3fU91nv9NlZmp+XbIn94uVymSbdmAAAAAAAADB6GhsbJfXcCN7c3KzW1labMxp7FDEBknJzcy3Lfr9fnZ2dNmUDAMDUFwqFVFFRYYmlpaUpNTXVnoQAADFvRlaiTihKtcT+/G5Fn/UMw9C1vboxba5q0eu7GsYyPQAAAAAAAMSQcDislpYWSyw9Pd2mbMYPRUyAer40dblcllh9fd87bgEAwOioqKhQKBSyxEpKSmzKBgCAHpcsLZQkuZ2G1izM1WdWFPW73pqFeZqeEW+J/eLl8jHPDwAAIBaZpqm2tjbt379fGzduVEMDxeMAAGDqa2lpUSQSscRi4UZw17FXAaY+h8OhrKwsywzJ+vp6FRX1f8EaAAAMXzAYVGVlpSWWmZmppKQkmzICAKDH+YvzFAyFdeGSAqUleAZcz+kwdM1pM/StJzZHY2+WH9TGimYtKUwdh0wBAABix9atWy2FS/Hx8crMzLQxIwAAgLF3aJTcIcnJyXK73TZlM37oxAR8KCsry7Lc1tbGSDkAAMbA/v37+9w9UFxcbE8yAAAcIdnn1hWrSo5awHTIJ5cWKDvJa4n94uVdY5UaAABAzEpOTrYsNzY2yjRNm7IBAAAYH72LmGJhlJxEERMQlZqa2qdysa6uzqZsAACYmrq6ulRdXW2J5eTkKCEhwaaMAAAYHq/LqStPsY5CfW5LrXbV+W3KCAAAYGrq/YVdIBBQR0eHTdkAAACMvc7Ozj4NVyhiAmKMYRjRbkyGYSg9PV2JiYk2ZwUAwNRSUVFhuVvSMAy6MAEAJq3PrixSss9lif3yld02ZQMAADA1xcfHy+u1dsBsamqyKRsAAICx1/tcx+12x0ztAkVMwBHy8vI0e/ZsnXTSSVq4cKEyMjLsTgkAgCkjFAqptrbWEsvLy5PP57MpIwAARibJ59YXTyq2xJ7cUKWqZkaTAwAAjBbDMJSWlmaJ9R6vAgAAMJX0PtdJS0uTYRg2ZTO+KGICjpCYmKi8vLw+Y+UAAMDIHThwQOFw2BIrLCy0KRsAAAanOxzRyzvqVNPSf2HSl1YVy+c+fHklFDF132t0YwIAABhNvcenNDc397nGAAAAMBVEIpE+nZhiZZScRBETAAAAxoFpmqqurrbEMjMz6cIEAJiw3io/qFv//L6Wfe8FXfHAOj3+XlW/62UkevXpZdai3EfXVqixPTgeaQIAAMSE3p2YTNNUc3OzPckAAACMoZaWFkUiEUus97nQVEYREwAAAMZcU1OTOjutHSwKCgpsygYAgGN7ZnO1/ri+Ui2d3T3Lm2oGXPfq00rldBxu6d3ZHdaDb+wZ8xwBAABihcvlUnJysiXWu0MBAADAVND7HCcpKUkej8embMYfRUwAAAAYc26329LuNCEhQSkpKTZmBADA0a1ZmGdZ3lrTqr0N7f2uOy0tXhcuzrfEHnprn9oCoTHLDwAAINb0HqPS2NhoUyYAAABjp/c5Tix1YZIoYgKO6dDMSdM07U4FAIBJKykpSQsXLtSKFSs0bdo0FRYWyjCMY28IAIBNVpZkKDPRepfbM5sH7sb01dUzLMstnd36/Tv7xyQ3AACAWNS7iKmzs7NP12cAAIDJLBAIqL3dehNd73OgqY4ipjHU0dGh22+/XcuXL1d6eroSEhI0d+5c3Xzzzdq3b9+I9x+JRPTqq6/qW9/6llavXq3c3Fx5PB4lJydrwYIFuu6667Rp06Zj7ue73/2uDMMY1J+XX355xHlPBqZpqqmpSWVlZXrrrbe0adOmPm8WAABg6OLi4jRjxgzl5OTYnQoAAEfldBg6Z0GuJXa0kXKzc5J05jzr77f7Xt+tQCg8JvkBAADEmsTERLndbkuMbkwAAGAqMU1TeXl58nq9kiSn09lnpO5U57I7galq165dWrNmjXbu3GmJ79ixQzt27NB9992nRx55ROeff/6wj1FcXKyKioo+8e7ubm3ZskVbtmzRPffco69//ev6/ve/T7eDISorK1NXV1d0ua6uTomJiTZmBAAAAAAYT2sW5um3bx/upnRopFxxZkK/6193xgy9sK02ulzbGtAT71XpshVFY54rAADAVGcYhtLT01Vbe/h8q7GxUQUFBTZmBQAAMHp8Pp9mz54t0zTV2dmpjo6OmKvzoIhpDPj9fp133nnRAqarr75al112meLi4vTSSy/ptttuU2trqz796U/rjTfe0JIlS4Z1nOrqaknSzJkz9clPflKrVq1Sfn6+Ojs79dJLL+nOO+9UU1OTbr/9djmdTv3v//7vMfe5efPmoz5fUlIyrFwnG8MwlJWVZSkSq6+vV0lJScy9SQAAAABArDo0Uq6hLRiNPbO5Rl87Y2a/659QlKYTS9P19u7DHQHueXW3PrWsUE4HnyUBAABGKi0tzVLE1NzcrEgkIoeDwSMAAGDqMAxD8fHxio+PtzuVcUcR0xi44447VFZWJkm6/fbbdcstt0SfO+mkk7R69Wqdfvrp6ujo0I033jjsEW0rVqzQd77zHZ111ll9CmtOOeUUffazn9VJJ52k+vp63XHHHbrqqqtUWlp61H0uWLBgWLlMRb2LmLq6utTW1qakpCQbswIAAAAAjBenw9DZx+XqkXcOd2N69ihFTJJ07eqZenv32ujynoZ2/e2DGp2/KH9McwUAAIgF6enpluVIJKLW1lalpqbakxAAAABGFaXpo6y7u1s/+clPJEnz5s3TzTff3Gedk08+WVdeeaUk6ZVXXtG6deuGdaw333xTZ5999oCdgWbMmKH/+I//kCSFQiE9+eSTwzpOrEpMTJTP57PE6urqbMoGAIDJx+/3q66uTpFIxO5UAAAYtvMW5VmWt1T3jJQbyGmzMnVcfrIl9vOXymWa5pjkBwAAEEvcbrdSU1OVnp6umTNnasWKFRQwAQAATCEUMY2yl156SS0tLZKkyy+/fMAWpldccUX08RNPPDFm+ZxxxhnRx+Xl5WN2nKnIMAxlZ2dbYvX19Vx4BgBgkPbt26dt27bpnXfe0b59+xQMBo+9EQAAE8yhkXJHemZzzYDrG4ah61ZbOzVtq2nVyzvqxyQ/AACAWLNo0SItXLhQBQUFiouLszsdAAAAjCKKmEbZ66+/Hn18+umnD7jesmXLovML33jjjTHLJxAIRB87nc4xO85UlZWVZVkOBALy+/02ZQMAwOTR1dWlgwcPSpKCwaD27t2r+nq+vAUATD6HRsod6dmjFDFJ0jkLclWalWCJ/eylXdwUAwAAMAoGmk4BAAAwWXV1dam9feDO37GEIqZRtnXr1ujjuXPnDriey+XSzJk9d2Zu27ZtzPJ55ZVXoo/nzZt3zPXPOussZWdny+PxKDs7W6tXr9b3v/99NTU1jVmOE1lCQkKfOzkYKQcAwLFVV1dblp1Op3JycmzKBgCAkTlv4dBGyjkdhq49fYYl9u6+Jq3d0zgm+QEAAAAAAGDyqqys1Pr16/Xee++pqqpK3d3ddqdkG5fdCUw1lZWVknqKX441h7mwsFCbNm1SfX29AoGAvF7vqObS0dGhu+66S5Lk9Xp14YUXHnObf/zjH9HH9fX1euWVV/TKK6/oBz/4gR588MFB7aM/h34uA6mpOXwXa3t7u1pbW4d1nLGQkpKizs7O6HJdXZ2ysrK422MKa2tr6/cxYBdek5hIBvN6jEQifYqY0tLS1NHRMaa5Ifbw/oiJhtfk1DU30630eLcaOw5fQHp8/V5ddXLhgNt8ZEaS8pK9qmk93CH57n9s1y8/s3BMcz2E1yMmGl6TmEi4wxkAAADARBGJRKKNVPx+v/x+v4LBoEpKSmzOzB4UMY2yQ6PGEhMTj7luQsLh1vJtbW2jXsT0jW98Q/v375ckfe1rX1N+fv6A6y5cuFAXXXSRVqxYofz8fHV3d2vHjh165JFH9Pzzz6u5uVmf/OQn9fTTT+vcc88dci6FhQNf2O3t8ccfV0pKypCPMVbi4uK0ePHi6HJ3d7ceeeQRxsrFiN/85jd2pwBY8JrERDLQ6zErK0szZli7T7zwwgvq6uoaj7QQo3h/xETDa3LqyQ3lqVEZ0eXfvbZN3e//9ajbzOhOV40OfxZ/c0+z/vOnDyjbNb6/E3k9YqLhNQm7tbS02J0CAAAAAEiSGhsb+3ReiuXJFhQxjbJDX855PJ5jrntk0dKRnX5GwyOPPKKf/exnknrGyH3ve98bcN0bb7xR3/3ud/vEV65cqS9+8Yu655579NWvflXhcFhXXXWVysvL5fP5RjXfiayzs1MdHR2Kj4+PxjIyMihiAgBgALm5uZbl5uZmCpgAAJPeDE+rtgYz5FFYxR6/St0tMk3paE1653mb9G5XtjrNw5df3uvK0jmJFeOQMQAAwNRnmqZaW1tVW1urcDisefPm2Z0SAADAkNTW1lqWk5OTLbUJsSZmi5hGYxTYAw88oCuuuMISO1TcEwwGj7l9IHC4pXxcXNyI8znk5Zdf1pVXXilJSk9P12OPPXbU/R9r7N0111yjdevW6f7771d1dbUee+wxfe5znxtSThUVR79AW1NToxUrVkiSPvGJT2j27NlD2v9YO3DggGXk3bRp03TOOecwUm6Kamtri94V+oUvfGFQndWAscRrEhPJsV6PbW1t2rlzpyV2wgkn6Iwzzhi3HBE7eH/ERMNrcmoLRUydVd6oE0vS5HU5Br1dwlsVuuulvdHlPd0pOuuSMzQjK2HgjUYBr0dMNLwmMZGUlZXptttuszsNACPU1tamLVu2WG6cmjFjxqBuMgcAAJgIuru7dfDgQUsslrswSTFcxDRWkpKSJPWcPB/LkbPXR+vCzfr16/Xxj39cgUBAiYmJevbZZ0flzoNrrrlG999/vyTplVdeGXIR07Rp0wa9bkJCgpKTk4e0/7HmcrksRUyhUEiRSERpaWk2ZoXxkJiYOOFej4htvCYxkfT3eqysrLQs+3w+TZs2jcJfjDneHzHR8Jqcmi5YOvTR51eePlu/fqtSrV2haOw362v1408vGcXMjo7XIyYaXpOwW0LC2BaSAhgfPp+vzw3ldXV1Q/o+AgAAwE719fUyTTO6bBiGsrKybMzIfjFbxLRt27YR7yMvL69PbNq0aXrnnXfU3t6u5ubmo3Y5OtSdKCsryzJabri2bNmic845R36/X16vV08++aRWrlw54v1K0vz586OPq6qqRmWfk0l8fLwSEhIshWf19fUUMQEAcIRAIKCGhgZLLD8/nwImAEBMS/K5dcXJxfrJi7uisb+8X62bPjZbhemx2xocAABgpFwulzIzM1VXVxeN1dbWUsQEAAAmjd6j5DIyMuR2u23KZmKI2SKmuXPnjsl+58+fr8cee0yStH37dp144on9rhcKhVReXi5Jo9Ipqby8XB/72Md08OBBuVwu/eEPf9BHP/rREe/3EL58lLKzs7Vnzx45HA5lZmYqMzPT7pQAAJhQqqurLXcMOBwO5ebm2pgRAAATwxWrSvSr1/aoszssSQpHTN3zarm+d9FCmzMDAACY3HJzcy1FTG1tbWpra2NsKQAAmPA6OjrU2tpqicX6KDlJctidwFRzyimnRB+/8sorA663fv36aFefVatWjeiYlZWVOvPMM1VTUyOHw6GHHnpIF1544Yj22dvWrVujj/Pz80d135NFdna25s+fr5NPPlnz5s1Tenq63SkBADBhRCIRy+hVqedkO9bvGAAAQJLSEzz67MoiS+yP6ytV19plU0YAAABTQ2pqqjwejyXWu6MBAADARNT7nMXtdlODIIqYRt3q1auVkpIiSXrooYcs3QiO9OCDD0YfX3zxxcM+Xl1dnc4880zt3btXkvTLX/5Sn/3sZ4e9v4Hcc8890cenn376qO9/MvD5fMrKypLT6bQ7FQAAJpz6+np1d3dbYrFa+AwAiB0dwZD+uqla1c2dx1z36lNL5XEevgwTDEV03+t7xjI9AACAKc8wjD4dC+rq6gb8bgYAAGAiME2zTxFTdna2HA5KePgJjDKPx6Prr79ekrRt2zb98Ic/7LPOW2+9pfvvv19ST0HQ8uXL+92XYRgyDEPFxcX9Pt/c3Kyzzz5bO3bskCTdeeeduvrqq4eU7+bNm7Vr166jrnPvvffqvvvuk9TTmnUkRVcAAGBqqqqqsiynpKTQuh0AMGW9uL1W1z3yrk7473/oX363QX/ZWH3MbXJTfPrk0mmW2G/f3qfmjuBYpQkAABATehcxBYNBNTU12ZQNAADAsbW0tCgQCFhijJLr4bI7ganolltu0R/+8AeVlZXp1ltv1a5du3TZZZcpLi5OL730kv73f/9XoVBIcXFxuuuuu4Z1jEAgoPPOO08bN26UJH3uc5/TmWeeqQ8++GDAbRISElRSUmKJvfvuu7rqqqt0xhln6Nxzz9XChQuVkZGhUCik7du365FHHtHzzz8vSXI6nbr33nuVkJAwrJwBAMDU1N3d3acLU0FBgU3ZAAAw9l7YVqdnNx+ILj+zuVrXrp5xzO2+enqp/rBuvyIfNgboCIb1wBt7ddPHZo9VqgAAAFNeQkKCkpKS5Pf7o7EDBw4wjgUAAExYBw4csCwnJCRwY/iHKGIaA0lJSXrmmWe0Zs0a7dy5U/fee6/uvfdeyzrJycl65JFHtGTJkmEdo6amRm+++WZ0+ZFHHtEjjzxy1G1OP/10vfzyy33i4XBYL7zwgl544YUBt83IyND999+vCy64YFj5AgCAqcvtdmvFihVqbGxUVVWVOjo6lJmZaXdaAACMmfMW5ul37+yPLn9Q1ar9BztUlBF/1O2mZyTo44vz9eQRnZsefHOvrj6tVIleLtEAAAAMV05OjqWI6eDBgwqFQnK5OMcCAAATSzgcVkNDgyWWk5MjwzBsymhiYZzcGJk5c6Y2bNigH/zgB1q2bJlSU1MVHx+vOXPm6KabbtKmTZt0/vnn252m1qxZo/vvv19XXXWVli5dqmnTpikuLk4+n0/5+fk699xzdffdd2v37t268MIL7U53wgmHw6qvr1ckErE7FQAAbGUYhjIyMrRo0SItW7aMk20AwJS2siRd6QkeS+yZzTWD2vba1TMtyy2d3frdO/tGLTcAAIBYlJ2dbbkWEYlEVF9fb2NGAAAA/WtoaFA4HLbEsrOzbcpm4qEEfQwlJCTo1ltv1a233jqs7U3THPC54uLioz4/WNnZ2fryl7+sL3/5yyPeVyxpaGhQXV2dDh48qEgkogULFigjI8PutAAAmBC4yxEAMNW5nA6dsyDX0o1psCPl5uQm6WPzc/SPrbXR2K9e26MvnlQsn9s5JvkCAABMdW63W+np6Tp48GA0Vltbq7y8PBuzAgAA6CstLU0zZsxQbW2t2tralJaWJq/Xa3daEwadmIBhqKiosHRgqqurszkjAAAAAMB4Om+h9QuxQyPlBuNrZ1i7MdX7A/rTu5WjlhsAAEAsys3NtSy3tLSos7PTpmwAAAD65/F4NG3aNC1dulTLli1TSUmJ3SlNKBQxAcPQu53boY5MAAAAAIDYMJKRcksKU3XKzExL7J5XytUd5nMlAADAcKWnp/fpDl1bWzvA2gAAAPZLSEhQUlKS3WlMKBQxAcOQmWm92BwOh9XY2GhTNgAA2CMQCNidAgAAtnE5HTr7OOvd/s8OsohJkq47wzp6rrKpU0+/Xz0quQEAAMQih8NhuQHZ4XDINE0bMwIAAMBQUcQEDIPX61VKSoolxkg5AEAsiY+P19atW/X++++roaGBi4IAgJh0/iLrSLnNVS2DHil3UmmGji9KtcT+7+VyRSL8TgUAABiunJwcpaamau7cuTr55JMZzwIAADDJUMQEDFN/I+XC4bBN2QAAML5ycnIkSc3NzdqyZYs2bNhgc0YAAIy/kYyUMwxD/3LGTEtsV12bnt96YNTyAwAAiDXJyclavHixcnJy5HQ67U4HAAAAQ0QREzBMvUfKRSIRRsoBAGKC0+ns83swPT3dpmwAALDPSEfKfWRutubmJlliP3+pnA6HAAAAAAAAU0goFNKWLVvU1NTEdZ9joIgJGCaPx6PU1FRLjJFyAIBYkJ2dbbmb0TAM5efn25gRAAD2OW/h8EfKGYah63p1Y9pc1aJXdzaMWn4AAAAAAACw14EDB9TQ0KBNmzbpvffeU319vd0pTVgUMQEj0HukXGNjIyPlAABTmmma0VFyh2RlZcnj8QywBQAAU9uJpcMfKSf1FEEVZ8RbYj9/adeo5AYAAAAAAAB7RSIRVVZWRpfb2tpUW1trY0YTG0VMwAhkZmbKMIzociQS0cGDB23MCACAsdXS0iKfz2eJ0YUJABDLRjpSzukwdO3qGZbY2j2NWreXceUAAACjpbOzUy0tLXanAQAAYlB9fb0CgYAlVlhYaFM2Ex9FTMAIuN1uRsoBAGJKQ4N1vE1iYqKSk5NtygYAgInh0Ei5zESvvnDidH1rzbwhbX/x8dOUl2ItEqYbEwAAwMj5/X5t3bpVa9eu1Y4dO2Sapt0pAQCAGGKapioqKiyx5ORkpaSk2JTRxOeyOwFgssvOzlZTU1N0ubGxUaFQSC4X/3kBAKaWzs5O+f1+S6ygoMDSlRAAgFh0Ymm6fn/1iVpRki6nY+i/Fz0uh75yWqn+8+mt0djLO+r1QVWLFhRwUQsAAGA4WltbtWHDhuhyZ2enDh48qMzMTBuzAgAAsaSxsVHt7e2WGF2Yjo5OTMAIZWRkWL68NU2TkXIAgCmp94xmp9Op7Oxsm7IBAGDicDkdOmlGxrAKmA65bHmR0hM8ltgvXi4faWoAAAAxKykpSYmJiZbY/v376cYEAADGTe8uTPHx8crIyLApm8mBIiZghNxut9LS0iwxRsoBAKYa0zT7FDGlpaXJ4eB0EgCA0RDncerKU0ossWc/qFF5fZtNGQEAAExuhmH06XTg9/vV0tJiU0YAACCWtLa29jnvKCwsZLrFMfCtEzAKDnWhcLvdysvLowUcAGDKaW1tVVdXlyWWnp5uUzYAAExNXzhpupK8h0eTmybdmAAAAEYiKytLXq/XEuvdEQEAAGAs9D7n8Hg8TLcYBIqYgFGQkZGhhQsX6qSTTtLs2bOVmppqd0oAAIyq3l2YOjs7FR8fb1M2AABMTck+t7548nRL7MkNVaps6rApIwAAgMmtv25MjY2Nam9vtykjAAAQCzo6OtTQ0GCJTZs2jekWg8BPCBgFLpdL6enptH4DAExJkUhE9fX1llhDQwO/9wAAOIrG9qB+v3a/qpo7h7Tdl1aVyOc+fLkmFDF1zyu7Rzs9AACAmJGbmyuXy2WJ0Y0JAACMpcrKSsuy0+lUXl6eTdlMLhQxAQAA4KgOHjyoUChkifW+gwAAAPR46v1qfeH+d7T8f17QNx/frKffrx7S9pmJXl22vMgSe3TdflU00o0JAABgOJxOpwoKCiyxuro6BQIBmzICAABTWTAY1IEDByyx/Pz8PkXV6B9FTAAAADiqpKQkFRUVyefzSZJaW1u50AcAwADeKm/QazsbFI6YkqRnN9cMeR/XnF4qj+vwJZvusKk7/1E2ajkCAADEmvz8fMv4FtM0+3RIAAAAGA1VVVUyTTO6bBhGn4JqDIwiJgAAAByVz+dTSUmJVqxYoVmzZtFyHQCAo1iz0NoafFNly5C7KOWlxOkLJ063xJ7YWKUdB/wjzg8AACAWeTwe5ebmWmI1NTV9Ok8DAACMRDgcVnW1tSt3Tk6OvF6vTRlNPhQxAWOku7tbNTU1CgaDdqcCAMCoMAxDiYmJ8vv5AhUAgIGcVJqhtHi3JfbMMLoxXbd6hhI8zuiyaUo/fH7HiPMDAACIVdOmTbMs9/clIwAAwEiYpqmCggK53YevDfU+B8HRUcQEjLK6ujpt3rxZb731lsrKytTQ0GB3SgAAAACAceJyOnTOAutd/s9sGnoRU0aiV1efVmqJ/WNrrd7d1zSi/AAAAGJVXFycsrKyLLGqqipFIhGbMgIAAFONy+VScXGxVq5cqZkzZyo/P18JCQl2pzWpUMQEjLKGhgY1NjZG51zW1dXZnBEAAAAAYDydvyjfsry5qkV7G9qHvJ+rTi1VeoLHErvjue3Rz5sAAAAYmsLCQstyMBhUbW2tTdkAAICpyul0qqCgQLNmzbI7lUmHIiZglGVnZ1uWW1paGCkHAAAAADFkZUm6MnoVHw1npFyi16XrVs+wxN7e3ajXdtLxFwAAYDiSkpKUmpoaXTYMQ11dXfYlBAAAAAuKmIBRlp6eLqfTaYnV19fblA0AAMNjmqYqKirU2dlpdyoAAEw6LqdD5y4c+Ug5Sfr8idOVn+KzxO54bociEboxAQAADEdhYaEcDocKCgq0YsUKlZSU2J0SAAAAPkQREzDKHA6HMjIyLDFGygEAJpuWlhbt3r1ba9eu1YYNG1RTU8PoGgAAhuC8hdaRcltrWrW7vm3I+/G5nbrxzNmW2OaqFv3tgwMjyg8AACBWpaWl6cQTT9TMmTPl8/mOvQEAAADGDUVMwBjIysqyLLe2tioQCNiUDQAAQ1dbWxt93NraqsrKShuzAQBg8llRkq6sJK8lNtxuTJ84oUAzshIssR/9Y4dC4ciw8wMAAIhVhmHI7XbbnQYAAJgi/H6/ysvLGVE7SihiAsYAI+UAAJNZOBzu83srJydHhmHYlBEAAJOP02FozQLrSLm/DrOIyeV06Oaz5lhiu+vb9dh7FBkDAAAAAADYad++faqsrNTatWu1fft2tbe3253SpEYREzAGHA6HMjMzLTFGygEAJouDBw8qHA5bYtnZ2TZlAwDA5HX+YutIuR21fu2s9Q9rX+cuyNXCghRL7K4XdqqrOzzAFgAAAAAAABhLTU1NOnjwoCTJNE3V1tZGlzE8FDEBY6T3SDm/308LOQDApHDkKDlJSk1Nlc/nsykbAAAmr6VFacpJto6UG243JsMwdOs51m5MNS1d+u3b+4adHwAAAA7r7u7W3r17ZZqm3akAAIBJwDRN7d692xJzu93Kz88fYAsMBkVMwBhJS0uTy+WyxBgpBwCY6ILBoBobGy2xnJwcm7IBAGByczgMrVmYZ4k9s7lm2F+MnTIzUyeVZlhiP39pl/xd3cPOEQAAINZFIhFVVFTonXfe0b59+1RTM7yicwAAEFtqa2vV1tZmiRUXF/epEcDQUMQEjJH+RspRxAQAmOh6jz/t7/cZAAAYvPMX9dx9V5Qer+tWz9Ddly0Z9r4Mw9AtvboxNXV0677X9owkRQAAgJi2detW7d69W+Fwz5jevXv3KhQK2ZwVAACYyMLhsPbssV6PiY+PV15e3gBbYLAoYgLGUH8j5To7O23KBgCAY+tdxJSZmcldAwAAjMDxhan667+eolduWa1bz5mr4/JTZBjGsPd3QlGazppv7ZJ432u7dbAtMNJUAQBAPzo6OnT77bdr+fLlSk9PV0JCgubOnaubb75Z+/aNfKzr3r17ZRjGoP5cccUVI/8HoY+CggLLcnd3t/bv329TNgAAYDKoqKhQMBi0xGbMmDGiaz7oQRETMIYYKQcAmEza29vl9/stMUbJAQAwMg6HoQUFIytc6u3rZ8/RkbtrD4b185fKR23/AACgx65du7RkyRJ94xvf0Pr169XU1KSOjg7t2LFDP/7xj7Vo0SL99a9/tTtNjFBaWpoyMqwjeysrK9XV1WVTRgAAYCILBAKqqKiwxNLS0pSenm5TRlMLt9UDY8gwDGVlZVlmaNfX16uoqMjGrAAA6F9tba1l2ePxKC0tzaZsAADAQGbnJOni4wv0+HtV0dhv396nK08tUUFqnI2ZAQAwdfj9fp133nnauXOnJOnqq6/WZZddpri4OL300ku67bbb1Nraqk9/+tN64403tGTJkhEf83vf+54uvPDCAZ/nM/rYKS0tVWNjo0zTlCSZpqk9e/Zo3rx5NmcGAAAmmr179yoSiVhipaWlNmUz9VDEBIyxQ0VMXq9X2dnZfUbMAQAwEZim2WeUXHZ2Nq1PAQCYoG46c7aefr9a3eGeL9qC4YjufqFMt1+y2ObMAACYGu644w6VlZVJkm6//Xbdcsst0edOOukkrV69Wqeffro6Ojp044036uWXXx7xMQsKCrRgwYIR7wdDFx8fr7y8PFVXV0djdXV1KigoUHJyso2ZAQCAiaStrU0HDhywxPLy8pSYmGhTRlMP4+SAMZaamqrjjz9eK1euVGlpqZKSkuxOCQCAPpqbmxUIBCwxRskBADBxFabH63Mrp1tif363Urvq/ANsAQAABqu7u1s/+clPJEnz5s3TzTff3Gedk08+WVdeeaUk6ZVXXtG6devGNUeMvuLiYjmdTkusvLw82p0JAADENtM0VV5ebok5nU4VFxfbk9AURRETMMYMw1BycjKdLAAAE1rvUXIJCQncOQAAwBipbOrQPa+Ua8eBkRUcfe2MmYr3HP6iLWJKP3q+bKTpAQAQ81566SW1tLRIki6//HI5HP1/lXLFFVdEHz/xxBPjkRrGkNvt1vTp1iLx1tZWNTQ02JQRAACYSBobG9Xc3GyJFRYWyuPx2JPQFEUREwAAQIyLRCJ9LsjRhQkAgNH3+HuVuujnb+iUH7yk2/62XY+/Vzmi/WUlefXlVSWW2N8+OKBNlc0j2i8AALHu9ddfjz4+/fTTB1xv2bJlio+PlyS98cYbY54Xxl5BQYF8Pp8ltnv3bkUiEZsyAgAAE0EkEtHu3bstMa/Xq2nTptmU0dRFERMAAECMczgcWr58uUpKSqIXX7Ozs23OCgCAqae8vk0bK5qjy3/dVDPi8SRfOb1UqfFuS+yO53aMaJ8AAMS6rVu3Rh/PnTt3wPVcLpdmzpwpSdq2bduIj/vTn/5UM2fOlM/nU0pKio477jh99atf1XvvvTfifWNwHA6HSktLLbGuri5VVVXZlBEAAJgI2tra1NXVZYmVlJT0GUWLkXPZnQAAAADs5/V6VVRUpMLCQnV1dcnr9dqdEgAAU855C/P185fKo8tVzZ3aWNGs44vShr3PZJ9b154+Q7f9bXs09trOBr2zt3kkqQIAENMqK3u6JSYkJCg1NfWo6xYWFmrTpk2qr69XIBAY0efpI4uVAoGAtm7dqq1bt+qee+7RNddco7vvvntY+z/07xlITU1N9LHf71dra+uQjzEcbW1t/T62m8fjUUJCgtrb26Oxffv2KSEhQS4XX6tNdBP1dYXJi9cURhuvqclr3rx5qqmpUWNjo+Li4uTz+cbtvOlY7Hpd+f3+Ud8nZ1uADQKBgOrr65Wenh7teAEAwERgGIbi4uLsTgMAgClpXl6SSjMTtLvh8Bdif91UM6IiJkm6/ORi/fqNPaptDURjd7+8V6eYkmGMaNcAAMSkQ1/GJCYmHnPdhISE6OO2trZhFRmlpqbq4osv1urVqzVr1iz5fD7V1NTo+eef1/3336+2tjbdc8898vv9euSRR4a8/8LCwkGv+5vf/EYpKSlDPsZI/eY3vxn3Yx5NYmKiFixYEF0Oh8N6/vnntW/fPhuzwlBNtNcVJj9eUxhtvKYmp/j4eBmGoZdeesnuVPo1nq+rlpaWUd8n4+SAcVRbW6sNGzbo7bffVnl5uWpra+1OCQAAAAAwTgzD0PmL8iyxZzfXKBIZ2Ug5n9up6z86yxL7oNqvvd1JI9ovAACx6tCoEI/Hc8x1jyxa6uzsHPKx8vPzVVVVpV//+tf64he/qJNOOknHH3+81qxZo7vuukvvvfeeioqKJEm/+93v9NRTTw35GBi6trY2NTQ0WGI5OTl0YgIAAOro6LB0bMTo4mwLGEdtbW2WlnL19fUqLi6Wwa2xAAAAABATzluUr5+8uCu6XNPSpff2N2lZcfqI9nvpskL96tXd2nuwIxp7pzNH092j39YbAICJYjSuqz7wwAO64oorLDGfzydJCgaDx9w+EDjcCXE4nY09Hs9Ri6VmzZql3/72tzrttNMkST/96U/18Y9/fEjHqKioOOrzNTU1WrFihSTpC1/4ggoKCoa0/+Fqa2uLdgr4whe+MKjOV+MpEAho27ZtMk1TiYmJKigo0NKlS+1OC8cw0V9XmHx4TWG08ZrCWLDrdVVVVaXbbrttVPdJERMwjrKysizzxzs7O9Xe3s4vJwAAAACIEXNykzQrO1E769qisb9uqhlxEZPb6dC/nTVH1/9+QzTWFPGpLJg6ov0CABCLkpJ6uhm2tbUdY01Z7sIfq+u8p556qubPn6+tW7fq9ddfVyQSkcMx+EEb06ZNG/S6SUlJSk5OHk6aI5KYmGjLcY8lGAzK5/MpPT2dm5EnoYn6usLkxWsKo43XFMbCeL6ujmzgMlooYgLGUVJSkrxer+XunLq6OoqYAAC2qKioUDAYVG5urhISEuxOBwCAmHHeojzd9cLO6PKzm2v07+fPl9Mxsi/Gzl+Yp1++XK6tNYcvIK3vylYwFBnRfgEAmKi2bds24n3k5eX1iU2bNk3vvPOO2tvb1dzcrNTU1AG3P9TlKCsryzJabrQdKmLq6urSwYMHlZWVNWbHwmHj1ZUKAABMLKZpqrq6mnGyNuCnDYwjwzD6dGOqr69XSUkJd3EAAMaVaZqqrKxUMBhUZWWlEhMTNWPGjKNemAUAAKPj/F5FTHX+gNbtbdSJpRkj2q/DYeiWs+foSw+ui8b8EY/+vKFGX/1o6oj2DQDARDR37twx2e/8+fP12GOPSZK2b9+uE088sd/1QqGQysvLJUnz5s0bk1wO4foxAADA+GloaNCuXbu0b98+TZ8+XXl5eUPqhInh46cMjLPs7GzLcldX16DaEgMAMJqampoUDAajy21tbXK73TZmBABA7JiZnaS5uUmW2DObakZl36vnZGlFr9F0975Rodau7lHZPwAAseCUU06JPn7llVcGXG/9+vXRcXKrVq0a05y2bt0qSfJ6vcrIGFnhMwAAAAYWDoe1e/duSVJ3d7d27dqlLVu22JxV7KCICRhniYmJ8vl8llhdXZ1N2QAAYlXv3z2JiYmMlAMAYBydv8g6uuZvH9QoFB752DfDMHTrOXMsscaObv3ouR0j3jcAALFi9erVSklJkSQ99NBDMk2z3/UefPDB6OOLL754zPJ54403ol+cnXLKKXQBmABCoZBqa2vtTgMAAIyBPXv2qKuryxLLzc21KZvYw5kuMM4OjZQ7Un19/YAfhAEAGG3hcFj19fWWWE5Ojk3ZAAAQm85blG9ZbmgLau2exlHZ97LidJ0+y9qN6eG392ljRfOo7B8AgKnO4/Ho+uuvlyRt27ZNP/zhD/us89Zbb+n++++XJJ1++ulavnx5v/syDEOGYai4uLjf55988smjXhvetWuXPvvZz0aXr7vuusH+MzBGGhsbtW7dOm3fvl1NTU12pwMAAEZRc3OzqqqqLLGUlBRlZmbalFHsoYgJsEHvkXKBQEB+v9+mbAAAsaahoUGRiLXTQ+/fTQAAYGyVZCbouPxkS+zpURopJ0nf+NgMuXT4971pSt96fPOodHsCACAW3HLLLZo9e7Yk6dZbb9U111yjl156SW+//bZuu+02nXXWWQqFQoqLi9Ndd9017ONcfPHFmj17tr7xjW/oscce0zvvvKONGzfqb3/7m2688UYdf/zx2r9/vyTp0ksv1Sc+8YnR+OdhmHbt2qXNmzcrGAxKknbs2KFQKGRzVgAAYDSEw2GVlZVZYg6HQ7Nnz5ZhGDZlFXtcdicAxKKEhATFxcWps7MzGqurq1NycvJRtgIAYHT0bneenp4uj8djUzYAAMSu8xblaUt1a3T5uS0H9L2LFsjpGPmFsWmpPi2Lq9PbnYfbnW+tadWDb+7VVaeWjnj/AABMdUlJSXrmmWe0Zs0a7dy5U/fee6/uvfdeyzrJycl65JFHtGTJkhEda9euXbr99tuPus61116rO++8c0THwcjFxcVZlgOBgHbv3h0teAMAAJPXnj17LN/fS1JxcbHi4+Ntyig20YkJsAEj5QAAdgkEAn1anTNKDgAAe5y/sGek3HH5ybr1nDl68rpVo1LAdMgib4PSHV2W2I+eL1NlU8eoHQMAgKls5syZ2rBhg37wgx9o2bJlSk1NVXx8vObMmaObbrpJmzZt0vnnnz+iYzz11FP65je/qY985COaMWOGUlJS5HK5lJ6ermXLlummm27S5s2b9X//93/yer2j9C/DcOXn5yslJcUSq6mpUWPj6IwFBgAA9uhvjFxycrKmTZtmU0axi05MgE2ys7OjbYAlKRgMqrW1tc8HIAAARlNdXZ1l2el0KiMjw6ZsAACIbUUZ8Xr9G2doWtrY3NHnNKTTE6r0hH9GNNbZHdZ3n9qiX31xGa3QAQAYhISEBN1666269dZbh7X9sW5cveCCC3TBBRcMa98Yf4ZhaM6cOVq/fr0ikcNjesvKyrRs2TK5XHztBgDAZBMOh7Vjxw5LzOFwaM6cOVw7sQGdmACbJCQk9Gk9V19fb1M2AIBYYJpmn1FyWVlZcjqdNmUEAADGqoDpkFxXpz51fK4l9sK2Oj23pXaALQAAAHA0cXFxKi21juc9NFYOAABMPnv27FFXl7WTNWPk7EMRE2AjRsoBAMZTe3u72tvbLTFGyQEAMPXdsLpYmYnW8TPffWqL/F3dNmUEAAAwueXn5ys1NdUSY6wcAACTD2PkJh6KmAAbZWdnS+rpylRcXKzFixfTkg4AMGZ6d2Hyer2MMQUAIAYkx7n17+fPs8QOtHbpR8+X2ZQRAADA5GYYhmbPni2Hw/o1W1lZmUKhkE1ZAQCAoWCM3MREERNgo/j4eK1YsULLli3T9OnTaUkHABgzpmn2GVuanZ3NiTgAADHi44vzdeqsTEvs4bf2alNlsz0JAQAATHJxcXGaMWOGJRYIBFReXm5TRgAAYCh2797dZ4xcSUkJ39nbjCImwGZxcXF2pwAAiAF+v1+BQMASO9QREAAATAymaWrHAb9+9PwOvVV+cFT3bRiGvnfRAnldhy8FRUzpW09sVigcGdVjAQAAxIq8vLw+Y+UOHDjAWDkAACYBr9drudE7OTlZBQUFNmYEiSImAACAmOD3+y3LcXFxSkhIsCkbAADQ25/frdTH7nxVZ9/1qn764i79cX3FqB9jekaCrv/oLEvsg6pWPfTWvlE/FgAAQCwwDENz5syR0+m0xBkrBwDAxFdUVKSlS5cqMTGRMXITCEVMAAAAMaCgoEAnnXSSZs2apZSUFEbJAQAwwfi7urWrri26/I+tterqDo/6ca4+tVSzshMtsR89v0PVzZ2jfiwAAIBY4PP5VFpaaokxVg4AgMkhISFBxx9/vBYvXswYuQmCIiYAAIAY4fF4lJ+fryVLlmj69Ol2pwMAAI6wZmGejqwvbguE9EpZ/agfx+Ny6H8/sdAS6wiG9d2ntoz6sQAAAGJFf2PlHA6HTNO0JyEAADBoDodDycnJdqeBD1HEBEww7e3t2rt3r1paWuxOBQAwhdGFCQCAiSUn2aflxemW2DObasbkWMuL03XZ8kJL7PmttXpuy4ExOR4AAMBUd+RYOa/Xq0WLFmnWrFlcfwEAABgil90JAOhRW1uriooKtbe3S5K6urqUkpJic1YAAAAAgPFywaI8rd3TGF1+YVvPSDmf2znqx/r/zp2rf2yt1cH2YDT23ae2aNXMTCV6uVwEAAAwVD6fTwsWLFBiYqJcLs6nAACYaAKBgLxer91p4BjoxARMEMFgMFrAJEn19fUKh8M2ZgQAAAAAGE/nLMiT44ib9TuCYb20vW5MjpUa79G/nz/fEqtp6dKd/ygbk+MBAADEgtTUVAqYAACYgJqamvTOO+9oz549ikQidqeDo6CICZggsrOzLcuRSEQNDQ02ZQMAAAAAGG9ZSV6dWJphif1189iMlJOkC5fk65SZmZbYA2/s0QdVjDcHAAAAAABTQzgcVllZmUzT1P79+/Xee+/J7/fbnRYGQBETMEF4vV6lp6dbYgcOHLApGwDAVGCapt577z3t2rVLLS0tMk3T7pQAAMAxnLcoz7L84rY6dQRDY3IswzD03xctkMd1+PJQxJS+9cRmhSOcNwAAAIym7u5uu1MAACAm7d69W11dXdHl9vZ2tbRwA9dERRETMIHk5ORYlpubmy1vqAAADEVLS4v8fr+qqqq0ceNGvf3221wwAwBggjt3QZ6cR8yU6+wO68UxGiknSSWZCfrXM2ZaYpsqW/Sbt/aO2TEBAABiiWmaqq6u1jvvvKPa2lq70wEAIKbU19erurraEktJSVFBQYFNGeFYKGICJpCMjAw5nU5LjA81AIDhqq+vtyy73W653W6bsgEAAIORnuDRyTOsI+Wefr96gLVHx1dOL9WMrARL7IfPl6mmpXNMjwsAADDVdXV1adOmTdq5c2d0lE1bW5vdaQEAEBPa29u1fft2S8zhcGjOnDkyDGOArWA3ipiACcTpdCo7O9sSq62tZfwPAGDITNNUQ0ODJZaVlWVTNgAAYCjO7z1SbnudmtqDY3Y8r8up/714oSXWFgjpP5/aOmbHBAAAiAUtLS1qbm6OLkciEW3ZsoVO2QAAjLFQKKQtW7YoEolY4jNmzFBcXJxNWWEwKGICJpjeI+U6Ozvl9/ttygYAMFm1tLQoGLR+2UkREwAAk8M5C/LkcR2+ZNMdNvXUGHdjWlmaoUuXTbPE/r7lgF7YSndgAACA4crJyVF+fr4l1tXVpW3btnHzMgAAY8Q0TW3fvl2dndYO07m5ucrLyxtgK0wUFDEBE0xycnKf6k9GygEAhqr3KLmEhATFx8fblA0AABiKlDi3zj4u1xJ77L3KMT/uN8+dp/QEjyX2nae2qD0QGvNjAwAATFUzZsxQUlKSJdbU1KS9e/fakxAAAFPc/v37dfDgQUvs/2fvvuOjqNM/gH9me8pm03snISEQCARCVVARPRQ9FTiFQ8EC9tPz1J/lFM/zLOAVCyo2LNjbgRW5A04QgdBJIwkppPeebJ3fHzFLlt1NI8mkfN6vFy9mv/OdmWfDstmdeeZ53N3dERMTwzZywwCTmIiGGEEQ7KoxVVRU2JW6IyIickYURbskJlZhIiIiGl6umRJi8zizrBFl9W0DekwvNxUeWTjOZqy4rhX/3H5yQI9LRERENJLJZDKMHz8eSqXSZrywsBBVVVUSRUVERDQy1dTU2CUKKxQKjB8/HnK5XJqgqFeYxEQ0BJ2dxGQymeyyRYmIiJypr6+H0Wi0GWMSExER0fByXqwfAjzUmBLuiaeumoADj8xHoE4z4Me9ekoIZkb72Iy9tScfJ4rrB/zYRERERCOVWq1GQkKC3XhmZiZaWlokiIiIiGjkaW1tRUZGht14QkICNJqBP6dC/YNJTERDkEajgU6nsxljSzkiIuqps6swubu7s5UcERHRMCOXCdh2z1x8cftsLJ8eAZ2LsvuN+oEgCPjrVROgkp85ZWS2iLjzg0OobzV2sSURERERdcXT0xNjxoyxGTObzUhLS4PZbJYoKiIiopHBbDYjPT0dJpPJZjwqKgpeXl4SRUV9wSQmoiEqMDDQ5nFNTQ0MBoNE0RAR0XDBVnJEREQjh851cBKXzjbGzx23X2B7gS2/ugV/+vQoLBZRkpiIiIiIRoKQkBD4+/vbjLW0tCArKwuiyM9ZREREfZWTk4OmpiabMV9fX4SFhUkUEfUVk5gGUEtLC5577jlMmzYN3t7ecHNzQ3x8PO677z4UFBSc8/7z8/MhCEKP/qxcubJH+/zwww+xYMECBAYGQqPRICIiAr///e+xd+/ec46XesfX1xcyme1/0YaGBomiISKi4aKuro6t5IiIiOic3TZvDCaF2lYI/jG9HK/sypUoIiIiIqLhTxAEjB07Fm5ubjbjlZWVKCoqkigqIiKi4S84OBhqtdr62NXVFXFxcRAEQcKoqC+YxDRAcnJykJSUhAcffBCpqamora21ZtP//e9/x8SJE/H1119LHaZVa2srLrvsMixbtgw//vgjysvLodfrUVhYiM2bN2POnDl44oknpA5zVFEoFPD19YVWq0VMTAxmzpwJX19fqcMiIqIhzlErORcXF4miISIiouFKrZBjw++T4XVWNajnt2Vhd3aVRFERERERDX9yuRzjx4+HQqGwGT916hRqa2slioqIiGh402q1SE5OhpeXl9PftTQ88F9tADQ2NuKyyy5DdnY2AOCWW27BtddeCxcXF+zYsQNPP/00Ghoa8Lvf/Q579uxBUlLSOR/zr3/9K6688kqn67vr83jjjTfi22+/BQBccMEF+MMf/oDg4GAcP34cf/vb35Cbm4u1a9ciKCgIq1evPud4qWfi4uLsqjERERE5I4oiqqpsLyqyChMREdHII4rioNxJGOLpghevm4Lr39qHji5yFhG4+6PD2HrXHIR4MlGaiIiIqC9cXFwQHx+PEydO2IxnZGRg+vTpkMvlEkVGREQ0fCmVSiQmJqK5uRmurq5Sh0N9xCSmAbBu3TqcPHkSAPDcc8/h/vvvt66bOXMm5s2bh7lz56KlpQX33HMPdu7cec7HDAkJwYQJE/q07X//+1989NFHAIBFixbhyy+/tH5AnjZtGq644gokJyejsLAQDz74IJYsWdJtUhT1DyYwERFRb7CVHBER0cgliiIOFtTi80NFKKptxXs3TR+U486J9cV9C+Kw7ocs61hNswG3v38Qn9w6E2oFL7ARERER9YWPjw8iIiJQUFAAoL1CU1xcHBOYiIiIzoEgCHB3d5c6DDoHzJDoZ0ajES+88AIAYNy4cbjvvvvs5syaNQs33XQTAGDXrl04cODAoMZ4tvXr1wNob1+2YcMGuw/Ivr6+ePbZZwG0Xxx94403Bj1GIiIi6l5LS4tNVQatVstWckRERCNAYXULLnx+Fxa/uhcf7j+Nn7KrkFPROGjHv23uGMwfF2AzdrSoHk9sTR+0GIiIiIhGooiICHh7e8PNzQ3Jycnw8fGROiQiIiIiSTGJqZ/t2LED9fX1AIAbbrjBaSWdlStXWpe//PLLwQjNocbGRvznP/8BAMyfPx+hoaEO51199dXw8PAAIG28RERE5FxISAhmzZqF+Ph4+Pj4wN/fX+qQiIiIqB8Ee2rQ2GayGfvsYPGgHV8mE/D80kmI8LEtxf7BvkJ8mnp60OIgIiIiGmkEQcC4ceMwefJk3ohGRETUQ+Xl5cjLy4MoilKHQgOASUz9bPfu3dbluXPnOp03depUax/GPXv2DHhczhw4cAAGgwFA1/GqVCrMmDHDus3ZrWpocPENmYiInFEoFAgICMCECROcJicTERHR8KKQy3DV5GCbsS8PF8FsGbzvhjoXJV79fTI0SttTSY9+dQJpJfWDFgcRERHRSKNQKNhCjoiIqIcaGxtx8uRJFBYW4sSJE8xbGIEUUgcw0qSnnymlHh8f73SeQqFATEwMjh07hoyMjHM+7osvvoi//vWvKCoqglqtRmhoKM477zysXr0aU6ZMOed4O9Zv27YNJpMJ2dnZSEhI6HF8RUVFXa4vLS21Ljc3N6OhoaHH+x4tRFFES0sLampqUF9fj3HjxvGLzQBpampyuEwkFb4maSjh65GGEr4eaajha5IG0iVxXnj9pzzr4/IGPbYdK8TsaC+H8wfi9RjiBjz2m1g8vCXLOqY3WbD63VR8vCoJHi7KfjkOjUx8j6ShpLm5WeoQiIh6TBRFCIIgdRhERESSMxqNSE9Ph8ViAQDU1NTg0KFDSE5OhkLB1JeRgv+S/awjWcfNzQ2enp5dzg0LC8OxY8dQWVkJvV4PtVrd5+MeOnTIuqzX65Geno709HS89tprWLNmDf71r3853H/n5KLuqjWEhYVZl0+fPt2rJKbO23bniy++gE6n6/H80SIxMRFubm7Wx1999RUqKiokjGh0eO+996QOgcgGX5M0lPD1SEMJX4801PA1SQPBTz4GleYzbUae/3w3jrl3fdMQ0P+vxwnqIJzQ+1gfF9e1YdmLP2KhewF4fY16gu+RJLX6elaQI6LhoaysDBUVFUhMTGQiExERjWqiKCIjIwNtbW02497e3kxgGmHYTq6fNTY2AgDc3d27nds5IaWvd6B5enpi1apVeOedd/Dzzz/j0KFD+Oabb/CHP/zBGsNrr72GG2+8sct4exJzf8RLfafX620e+/r6ShQJERERERERSSFOVWvzOM/oAb1l8E/tzHIpQ4C8xWas0KTFwTa/QY+FiIiIaCSyWCzIzs5GVlYWamtrkZ2dDVEcvFbCREREQ4koisjNzUVtre15EQ8PD4wZM0aiqGigMCWtn3Vk/qlUqm7ndq6M1Nra2utjBQcHo7i4GK6urjbjkydPxsKFC3HHHXdg/vz5KCwsxAcffIDf/e53uOKKKxzG25OYzyXe06dPd7m+tLQUKSkpAICrr74aY8eO7dX+R4O6ujrk5Z1pHeDh4YEbb7zxnCp4kWNNTU3Wu0JXrFjRo6REooHE1yR1ZzDLivP1SEMJX4801PA1SQOttsWIi17YB5Ol/QKWGTKEzroCiycH2c0d6Nfj4gY9rn3rMGpajNax1LYArLryQswZ492vx6KRge+RNJScPHkSTz/9tNRhEBE5lZmZicrKSuvj0tJSKJVKREVFSRgVERGRNAoLC1FcXGwzplQqkZCQAJmMdXtGmlGbxNQfF/refvttrFy50mZMo9EAAAwGQ7fbd66s4+Li0sVMx1QqVZeJR7GxsXj//fdx/vnnAwBefPFFuySmjniB7mM+l3i7a1XXmZubGzw8PHq1/9HA3d0dRUVFMBrPnCBubm6Gnx/vdB1I7u7ufD3SkMLXJJ3NYrHgwIED0Ol08PPzg5eX16B9aB/M16PBYEBTUxOam5thMBisPa9pdDOZTEhKSgLQ3hKkublZ2oBoSJHL5dBoNPDw8ICbm9ugt17g72waCB4ewPxxAfg+rcw69k16NW6cG9fldgPxevTwAF5aPgW/f2Mffs2pggjgoS0n8fVdcxDm7drl9jS68T2SpNa54jwR0VAUGhqKqqoqm+pLhYWFUCqVvbreQkRENNyVlJQgPz/fZkwQBCQkJLDYxwg1apOYBopWqwXQs3ZrnS+yDNTdZ+eddx4SEhKQnp6O3bt3w2Kx2FzY7IgX6D7mwYiXnJPJZPD397fJMi0vL0dERAR7YRMRjWK1tbVoa2tDW1sbysvLoVAoMH369BHTA1oURVRVVaGqqkrqUGgIslgs0Ol01mWTySRxRDSUmEwm6PV61NfXw8XFBeHh4bwzi0aEa5JDbZKYDhbU4lRlE6L9Bv97+qwxvnjw0ng8/V2mday+1YjbNh/EZ7fOgkYpH/SYiIiIiEYCDw8PjBs3Dunp6Tbjubm5UCgUCAwMlCgyIiKiwVNRUYHs7Gy78bi4OHh6eg5+QDQoRsbVrT7IyMg4530EBdmXaw8NDcW+ffvQ3NyMurq6Lv/zdLRY8/PzG9AswY4kpra2NlRXV9tU7umcsV9UVISpU6d2Gy8AhIWFDUyw1KWAgACbJKa2tjbU19fzTZqIaBTrXFocAFxdXUdMAhPQXi69vr7eZkwQBMjlvChK7UluHcn1SqWSid1kw2w2W+9abm1tRWFhIW8AoBFhXpwffNxUqG4+U03580NFuP+SeEniWX1+NA4X1tkkVp0obsDj/07Ds4snShITERER0Ujg5+eHsWPH4uTJkzbjWVlZUCgU8PX1lSgyIiKigVdTU4PMzEy78ZiYGAQEBEgQEQ2WkXOFq5fi4wfm5F5CQgI+//xzAO09i2fMmOFwnslkQm5uLgBg3LhxAxJLh65O0ickJFiXHb0JdNaxXqFQIDY2tn+Co15xd3eHq6srWlparGPl5eVMYiIiGqUsFotdhaKR1Ga0I1m3g4+PDzw8PKBWq5mEQADak1QqKioAAP7+/kxuIxsWiwVNTU0oKyuD2WxGa2srmpubWVWWhj2lXIYrk0Lw1p4869gXh4rxx4vjIJcN/u9HQRCwbslEnKxoxKnKMxWcP049jcnhnrg2JXzQYyIiIiIaKYKCgmA0GpGXl2cznp6ejokTJ/LaABERjUj19fVIS0uzaasKABEREQgJCZEoKhosrKXfz+bMmWNd3rVrl9N5qamp1vZss2fPHtCYOsqNqtVq+Pj42KybNm0aVCoVgK7jNRgM+OWXX6zbKJXKAYqWuiIIgl2Z2MrKSpjNZokiIiIiKdXW1tr9DhhJSUx1dXXWZX9/f/j7+0Oj0TCBiYh6RCaTwcPDw+bzc2Njo4QREfWfxcmhNo9L69uwN7daomgArUaJV3+fDFeVbTLpY1vScKyoTpqgiIiIiEaIsLAwm64aQHtl4hMnTvA7DhERjTjNzc04ceIELBaLzXhwcDAiIiIkiooGE5OY+tm8efOg0+kAAO+8845ddmCHTZs2WZevuuqqAYtnz549SEtLA9CeYCWT2f6Ta7VaXHTRRQCA7du3o6ioyOF+vvjiCzQ0NAx4vNQ9f39/m8dms9muCgcREY0OZ7eS66hSNFJ0rjzIOwuJqK/c3d2tyY+tra0SR0PUPxKCPZAQ5GEz9vkhx9/nB8vYAC2evca2fZzBZMFt7x9CTafWd0RERETUO4IgIDo62u4GZ7PZjOPHj9ucPyEiIhrORFFERkYGTCaTzbi/vz9iYmJ4g/MowSSmfqZSqXD33XcDADIyMrB+/Xq7OXv37sWbb74JAJg7dy6mTZvmcF+CIEAQBERGRjpc/9VXXzlNkgKAnJwcLFu2zPr49ttvdzjvT3/6E4D2Fnd33HGHXUWHqqoqPPjggwDaLyDefPPNTo9JA0+tVsPLy8tmrLy8XKJoiIhIKiO9lRwA62cShULBNmFE1Gcymcz6HsIKpjSSXNOpGpObSg6tRiFhNO0WTQrGjbOjbMaK61rxh48Ow2xxfv6CiIiIiLomCALGjh1r123DaDTi2LFj0Ov1EkVGRETUfwRBQEJCgs3N2t7e3oiLi2MC0yjCJKYBcP/992Ps2LEAgAceeABr1qzBjh078Msvv+Dpp5/GggULYDKZ4OLign/+8599Ps5VV12FsWPH4sEHH8Tnn3+Offv24ciRI/juu+9wzz33YPLkySgsLAQALF26FFdffbXD/Vx44YW49tprAQBbtmzBxRdfjC1btiA1NRVvv/02ZsyYYd3Ps88+a5dAQ4Pv7Dsuamtr+SWFiGiUqampGdGt5IiIiKhrVyYF47xYX/zjd5Nw4NH5+MuVE6QOCQDw0MJ4TIu0PW/wU3YV1v2QJVFERERERCNDx4Xds6tV6/V6HDt2DEajUZrAiIiI+pGrqyuSkpLg4uICDw8PJCQk2HWbopFN+tv0RiCtVotvvvkGCxcuRHZ2NjZu3IiNGzfazPHw8MDmzZuRlJR0TsfKycnBc8891+Wc2267Df/4xz+6nPPWW2+hoaEB3377LXbs2IEdO3bYrJfJZPjzn/+M1atXn1O81D98fHwgl8ttLl6Xl5cjPDxcwqiIiGgwnd1KTqfTjahWckRERNQ1X3c13rtputRh2FHKZXh52RRc9uJuVDaeudnm1V25UMgE3LdgLO+eJCIiIuojmUyG8ePH49ixY2hsbLSOt7a2oqGhwa5SExER0XCk0WiQlJRkU2GdRg+mrA2QmJgYHD58GM8++yymTp0KT09PuLq6Ii4uDvfeey+OHTuGyy+//JyOsWXLFjz00EO48MILMWbMGOh0OigUCnh7e2Pq1Km49957cfz4cWzYsKHbi5ouLi745ptvsHnzZlx88cXw9/eHSqVCWFgYli1bht27d2Pt2rXnFC/1H7lcbldto7y8vMv2gkRENHJYLBZUV1fbjLEKExEREQ0V/h4avLxsCuQy22Sll3bk4OnvMvndlYiIiOgcKBQKJCYmwsXFBUB7YtOECROYwERERCOKSqWCQsGaPKMR/9UHkJubGx544AE88MADfdq+u5N6ixYtwqJFi/q0b2eWLVuGZcuW9es+aWAEBASgrKwMQPuXFHd3d1gsFmajEhGNAo5ayfn6+koUDREREZG9lChvPHnlBDz85XGb8Y3/OwW90YzHF42HTMaKTERERER9oVQqMXHiRJw4cQKxsbHQ6XRSh0RERNQroiiiuroaPj4+rNhMNpjERDRM6XQ6+Pv7w9PTE35+fsxEJSIaRdhKjoiIiIaDZdPDIQjAw18eR+f7tN7ZWwCD2YKnfpvIRCYiIiKiPtJoNEhOTuaFXyIiGnZEUUROTg5KSkoQGhqK6Oho/j4jK7aTIxqmBEHAuHHjEBQUxAQmIqJRxGw2s5Uc0SDYtGkTBEGAIAjIz8+XOhzJ7dy50/rz2Llzp9ThEFEXGtuMKKtvkzoMq+tSwrF+8SScnav04f7T+NNnR2G2sLUcERERUV/xgi8REQ1HBQUFKCkpAQAUFRUhKyuLrefJiklMRERERMNIbW2tXSs5JjERERGNbmaLiJ+yK/GHjw5j2lPb8dwPmVKHZOOa5FD869rJkJ+VyfTFoWLc8/ERGM0WiSIjIiIiGrmqqqpQVFQkdRhEREQ2iouLUVBQYDNWUVGBxsZGiSKioYblW4iIiIiGEYPBALlcbk1k0ul0UKlUEkdFREREUnr/lwI8viXN+vi742W4/4JwCSOyt2hSMJRyGe768BCM5jN3V249WgKDyYwXr5sClYL32hERERH1h7KyMmRlZQEA5HI5goKCJI6IiIgIKC8vR05Ojt14fHw8PDw8JIiIhiKeHSIiIiIaRoKDgzFr1iyMHz8e/v7+CAwMlDokIhoF5s2bB1EUIYoi5s2bJ3U4RHSW3yQG2lQ5ajWasT2ruostpHHphEC8tiLZLlnph7Ry3Pr+QbQZzU62JCIiIqKe6mjL0+HkyZMoLy+XMCIiIiKgsrLS5vdTh9jYWPj7+0sQEQ1VTGIiGmHMZjNaWlqkDoOIiAaQTCaDr68vxo0bxyQmIiIigr9Wg7ljbdvL/vvY0LxQdWF8AN68YSo0SttTUv/NrMAt76ai1cBEJiIiIqJzIYqi3VhmZiaKi4sliIaIiAgoLS1Fenq63e+oyMhIBAcHSxQVDVVMYiIaAURRRG1tLTIzM/Hzzz8jIyND6pCIiIiIiIhoEC1ODrV5nFpYjwazUqJounZerB82rUqBm0puM/5TdhVWvr0fzXqTRJERERERDX9hYWEICwuzG8/JyUF+fr7DJCciIqKBIIoiCgsLcfLkSbt1ISEhCA8PlyAqGuqYxEQ0AtTV1eHYsWMoLy+HxWJBU1MTmpubpQ6LiIiIhqkdO3bghhtuQHR0NFxdXeHh4YHExETcf//9KCkpcbrd2rVrIQgCBKG9pVFbWxvWrVuHKVOmQKvVQqvVIiUlBS+99BJMJvsL1O+++651+x9//LHbOG+77TYEBwcjMjIStbW1/fpceqqyshKPPvooJk+eDE9PT2g0GkRGRmLFihXYvXt3l9tGRkZCEASsXLkSAHDgwAFcd911CAsLg0ajQVhYGFatWoXMzMwexZKTk4N7770XiYmJ0Ol0cHFxQXR0NFauXInU1NRzep47d+60/tvs3LnznPZFRAPjonH+0LnYJi1lGTylCaYHZkT74N2bpkOrVtiM78urwfVv7UdDm1GiyIiIiIiGv6ioKISEhNiNFxQUICcnh4lMREQ04ERRxKlTp5CXl2e3LigoCGPGjLGeRybqjElMRCOAp6cnVCqVzVhZWZlE0RAREdFw1dbWhuuuuw4XXngh3n33XeTl5aG1tRWNjY04ceIE1q9fj7Fjx2Lr1q3d7qu8vBwzZ87EAw88gMOHD6OpqQlNTU04cOAA7rrrLlx99dWwWCw221x11VVwcXEBAHzwwQdd7t9oNOLzzz8HAFx44YXw8vIasOfizLZt2xATE4OnnnoKR44cQX19PfR6PQoKCvD+++/jvPPOw5133mn3PB156623MGvWLHz00UcoKiqCXq9HUVERNm3ahKSkJHz66addbr9+/XokJCTgn//8J06cOIGGhga0tbUhLy8P77zzDlJSUvDYY4/1+bkS0dCnVshxxSTbEuxZBi8M5etTyRFe2HzLdLvkq4MFtfj9G/tQ12KQKDIiIiKi4U0QBIwZMwaRkZF260pKSpCZmdmj76pERER9IYoiTp48iaKiIrt14eHhiI2NZQITOcUkJqIRQBAE+Pv724xVVFTwSwgR0QjC93QaaKIoYvHixfjoo48AAIsWLcJ7772HPXv2YO/evfjXv/6F8PBwNDc3Y/Hixd1W9rn66quRnp6Ou+++Gz/++CMOHjyIDz74AOPGjQMAbN26Fa+//rrNNlqtFldccQUA4IsvvkBbW5vT/X/33XeoqamxHmsgn4sjR44cwaJFi9DQ0AClUol7770XO3bswP79+/Haa68hKioKAPDyyy/joYce6nZft956K/z9/fHiiy9i37592LVrFx588EGo1Wro9XosX77caZzr1q3D/fffD6PRiIkTJ+KVV17B9u3bkZqais2bN2PmzJkQRRFPPvkkXnjhhV4/VyIaPs5uKddoUaHU5CpRND0zMdQTH94yA95utjfmHCuqx3Wv70N1k16iyIiIiIiGN0EQEBERgdjYWLt1FRUVSEtLg9lsliAyIiIaySwWC9LS0hwW3BgzZgyioqKYwERdUnQ/hYiGg8DAQJtsVoPBgKqqKrvkJiIiGn5MJhP27dsHT09P+Pn5wcfHB3K5XOqwhpxzucjpplZAo3T8M61pNvS5zLqLSg5XleOP3HUtBpgtPd+vj7u6TzH01BtvvIFvvvkGSqUSW7ZswaWXXmqzfsaMGVixYgXOO+88pKWl4Z577umyXdqBAwewbds2zJs3zzo2ZcoUXHLJJUhISEB5eTk2bNiANWvW2Gy3fPlyfPzxx2hoaMDXX3+NxYsXO9x/R6UmrVaL+fPnD+hzcWT16tUwGAyQy+X4+uuvsWDBAuu6adOmYcmSJZgzZw7S09Oxfv16XH/99Rg/frzDfR09ehQRERH45ZdfEBgYaB0///zzcckll2DBggUwGo24/fbbsX//fptt09PT8cgjjwAAHn/8cTz++OM2JwGSk5Nx7bXX4oYbbsD777+PRx55BCtWrLCrXEVEI8PEUB1i/d2RXdFkHcsyDP3/7wnBHvh49Qwse2MfKhvP/D7PKG3AtRt/weZbpsNfq5EwQiIiIqLhKzg4GAqFApmZmTbnN2pqanDs2DEkJiZCoeDlQiIi6h9tbW2oq6uzG4+Li7M590nkDD+VEI0Qbm5u0Gq1aGxstI4VFxcziYmIaASorq6GyWRCVVUVqqqqIJfLMXPmTCYynSX5r9v7vO1frhyP62dGOlw3/++7UNPct3Y2f7goFvdePNbhuiWv7rW5yNyd/Gcu61MMPSGKIp599lkAwN13322X9NPBy8sL69atw8KFC7Fnzx5kZ2c7vKMTAO666y6bBKYO3t7eWLVqFZ555hkcP34c9fX10Ol01vWXXnopfHx8UF1djc2bNztMYmpqasKWLVsAAAsXLoRGc+bC9kA8l7Pt378fBw4cAADccsstNglMnfe/ceNGzJkzBxaLBRs2bMDLL7/sdJ/PP/+8wy/xF1xwAW655Ra88sorOHDgAFJTUzF16lSb7YxGI6ZOnWqXwNRBJpPhxRdfxKeffoqmpiZ89tlnuOWWW3r0XIloeBEEAdckh+KZ7zKtYzkGD7QYzPCQMK6eiA3Qticyvb4PZQ1nKvFlVzTh2tfaE5mCdC4SRkhEREQ0fPn7+0OhUCAtLc2m2ndDQwOOHDmCiRMnQqVSdbEHIiKinnF1dUViYiKOHTsGi8UCQRCQkJAAX19fqUOjYYLt5IhGkNBQ29YBDQ0NNklNREQ0PFVWVto81ul0TGCifpWeno7c3FwAcFr5qMP5559vXd67d6/TecuXL3e6Ljk5GUB7wlFeXp7NOqVSiSVLlgBobxnn6K6dL7/8Eq2trQDsW8kNxHM52/btZxLmbrrpJqfzZs+ebW2f13mbs3l5eeHKK690uv7GG290eGygvS0fAFxzzTVdlmH29PREYmIigN49VyIafq6aHAJZp7cDE+TYnlUlXUC9EO3njk/WzESol22y0qmqZix5dS+OnK6TJjAiIiKiEcDb2xsTJ060q7rU3NyMI0eO2CQ3ERERnQudToeEhAQoFApMnDiRCUzUK0xiIhpBfH197e6W6NxijoiIhh+TyYSamhqbMT8/P4mioZEqNTXVujxz5kwIguD0j7u7u3Wuo77mHeLj452u8/b2ti47SrjuSIDS6/X47LPP7NZ3tJILDg7G7NmzB/y5nO3EiRMAAJVKhaSkpC7nTp8+HQCQnZ0Ng8FxRa/Jkyd3Wbo/KSnJ+hnv+PHj1vGCggJrkuNDDz3U5XMVBMH6s+nNcyWi4SfAQ4Pzx9p+VthyrFyiaHov3McVH6+ZiUgfV5vxotpWXPPKz/j7tiwYzbzARkRERNQXOp0OkyZNsruOEBYWBpmMlwyJiKj/+Pj4YPr06fD09JQ6FBpm+ImEaASRyWQIDg62GausrHR6wYyIiIa+qqoqiKJofSwIAu9aoH5XUVHRp+1aWlqcrnN1dXW6rvOJUbPZbLd+9uzZiIiIAABs3rzZZl1FRYW1GtHSpUvtTrIOxHM5W0diobe3d5fJRwCsLeJEUURtba3DOd21/1UoFNbEr85JjYPxXIloeLpmim2V3v0F9SisHj7/90M8XfDxmpkY4+dmM262iHjhvzm4asMeZJez6jARERFRX7i7uyMpKcnamj06OhpBQUESR0VERMORXq/vcn13506JHOGrhmiECQoKQkFBgfWCtyiKKCkpQWRkpLSBERFRn5zdSq4nSROj1cFH5/d5Wze185/p9j/OtUkk6w0XlfO2f5/eOhNmS9/22986JxJt3bq1x58buku+6StBELBs2TI8/fTT+N///ofi4mKEhIQAAD755BOYTCYAwLJly+y2Hczn0lX7tsHYT+fn+thjj1nb8HXHzc2t+0lENKxdnBAArVqORv2Z94lNP+fjsUUJEkbVOwEeGny8ZiZufifVro3cieIGXPbibjxwSRxunB0Fmax/3o+JiIiIRgsXFxdMnjwZFRUVCA0N7X4DIiKis9TW1iItLQ2RkZH8XUL9ilfAiEYYlUqFgIAAmzYhJSUlCA8PZzlYIqJhxmg02lVuYSs553zc1QOyX283VfeT+sDTdWD22xc+Pj7WZU9PT0yYMEHCaNotX74cTz/9NCwWCz788EP86U9/AnCmlVx8fDymTJliV41oMJ5LR1Wk6upqmEymLhMLOz6TCYIALy8vh3PKy7tu89S5rWTnVnydn6tSqRwS/25ENDRolHJcOTEA7x8ogVowYfmMSNxyfpTUYfWar7san906Ext25uKF/2TD1Cn512Cy4K/fZGB7RjnWL5mEUC/nFQCJiIiIyJ5KpeJFZyIi6pOqqiqkp6dDFEXk5uZCqVQiICBA6rBohGBGA9EI1FGpoIPRaOxzuxEiIpLO2a3kZDKZTdICUX+ZPHmydXnPnj0SRnLG+PHjMWnSJABnEpfy8vKwd+9eAO1JTo4MxnPpSBYyGAw4cuRIl3P3798PAIiNjYVK5Thx7ciRI9bqUo4cPXrU2h64c6JSdHQ0dDodgKHz70ZEQ8fyaSE4z7UEK3RZuOeCKATpXKQOqU8UchnuvigWX94+GzH+7nbrfzlVg0v/+RM+TT3d58qJRERERGSvtrYWJSUlUodBRERDTFlZGdLS0my+g2dmZqK+vl7CqGgkYRIT0Qjk7u5uvaDVobi4mCd0iYiGGbaSo8EyZcoU692XGzduRFtbm8QRtetIVDp8+DAyMjKsyUyA41ZywOA8l/nzz7QufOutt5zO27t3L9LT0+22OVtNTQ22bt3qdH3nY3Tej1wux8KFCwEA27ZtQ0ZGRvfBE9GoEeKpwQR1DZTCyPgemBiqw9d3zcHNc6JwdhfOJr0J9392DKvfO4iqJr00ARIRERGNIA0NDThx4gSys7NRUFDAawtERAQAOH36NLKysuzGfX19odVqJYiIRiImMRGNUGeXgW1qakJLS4tE0RARUW8ZDAa2kqNBI5PJ8PDDDwMATp06heuvvx56vfOLwA0NDXjppZcGPK7rrrsOwq9Xqjdv3owPP/wQADBz5kxER0c73GYwnktKSgqmTp0KAHj99dfxn//8x25OfX091qxZY43ptttu63Kff/zjHx22ldu1axc2btwIAEhOTsa0adNs1j/00EOQy+WwWCxYvHgxioqKnB7DbDZj8+bNXc4hIhrKNEo5Hr08AR/cPAMhnvaVpX5ML8cl//gffkgrc7A1EREREfVEc3Mzjh8/DovFAgDIz89Hbm4uE5mIiEYxURRx6tQpnDp1ym5dYGAgEhISIJMx9YT6B2/lJxqhfHx8oNFoYDQaERAQgJCQELi6ukodFhER9VBVVZXNY7aSo4F266234scff8SXX36JTz/9FIcOHcKaNWuQkpICnU6HhoYGZGZmYufOndiyZQs0Gg3uvPPOAY0pNDQUc+fOxc6dO/Hyyy+jrq4OgPNWcoP5XF5//XVMnz4dBoMBCxcuxF133YVFixbBzc0Nhw8fxjPPPGP9Uv+nP/3Jpg3c2SZNmoT09HQkJyfjoYceQkpKCvR6Pb799lv84x//gMlkgkKhwMsvv2y3bWJiItavX497770X6enpmDBhAlavXo0LL7wQAQEBaGtrQ35+Pvbu3YvPPvsMpaWlOH78uF3COxHRcDJzjA++v+c8PLE1HZ8dtE3MrG42YM17B3HNlFA8fkUCPDRKiaIkIiIiGp5qa2vtWp4XFxfDYDAgLi4OcrlcosiIiEgKZrMZJ0+eREVFhd26sLAwREVFWW9EJeoPTGIiGqEEQUBCQgJcXFzYeoiIaBg6u5Wcj48PTxLRgBIEAR9//DH+8Ic/4NVXX0Vubi4eeOABp/P9/f0HJa7ly5dj586d1gQmhUKBpUuXdrnNYDyXpKQkbN26FUuWLEFDQwOef/55PP/883bz7rjjDjz99NPd7uvOO+/Ebbfd5jCZSqVS4Z133sH06dMdbn/PPffAzc0N99xzD+rr67Fu3TqsW7fO4VyVSgWNRtODZ0hENLRpNUqsXzIJFycE4OEvjqO62WCz/vNDRfjlVDXWLZmIWWN8JYqSiIiIaPjpuOklNzfXZryyshLNzc0YP348b5gmIholWltbkZaWhubmZrt10dHRCAsLkyAqGulY04toBNNqtUxgIiIahgwGgzVhowNbydFgUCqV2LBhA44ePYq77roLiYmJ0Ol0kMvl0Ol0SEpKwk033YTPPvsMGRkZgxLT4sWLoVarrY8XLFjQo/8Pg/FcFixYgJycHDz88MNISkqCh4cH1Go1wsPDsXz5cvz000946aWXelRK+eabb8ZPP/2EpUuXIjg4GCqVCiEhIbj++utx+PBhXHvttV1uf8stt+DUqVN44oknMHv2bPj6+kKhUMDNzQ1jx47FNddcg1dffRXFxcWIiYnp0/MlouGvoqENz2/LwtotaVKH0m8uGR+IH+49HxcnBNitK65rxbLX9+HJr9PRZjRLEB0RERHR8BQaGor4+Hi78ZaWFhw6dMiugjgREY081dXVOHTokMMEprFjxzKBiQYMsxuIiIiIhpizqzDJ5XJ4e3tLFA2NRomJiXjhhRd6vd3atWuxdu3abufNmzcPoij2aJ+enp5oa2vrdSwd+vpcVq5ciZUrV3Y7z8/PD0899RSeeuqpPkRna8aMGfj444/7vH1AQAAee+wxPPbYY+ccy9l6829GRENPeaMea78/gq1HS2A0i1DIBNw6dwwCdSOjMpuvuxobVyTj80PFWLslDU162/Ynb+7Ow66TlXjgkjjMHxcAmYxl7omIiIi6ExAQAKVSiYyMDJv2cmazGWlpaQgPD0dkZCRbCBERjTCiKKKwsBD5+fl26+RyOeLj4+Hry4rHNHBYiYmIiIhoCFKpVNZltpIjIiKic6GWy/Dt8VIYze3JiCaLiHf35ksbVD8TBAGLk0Px/T3nYWa0j936nIomrH7vIC76+y68/0sBKzMRERER9YC3tzemTJkCNzc3u3WFhYU4fvw4jEajBJEREdFAyc7OdpjA5OrqiilTpjCBiQYck5iIRiFRFHknPRHREBYSEoIZM2Zg0qRJCA4ORkCAfXsUIiIiop7ydFXi6imhNmMf7C9Eq2HkJfKEerli883T8efLE6BS2J/2yqtqxqNfncCsZ/6Lf/x4ElVNegmiJCIiIho+XFxcMHnyZPj7+9utq62txaFDh9DU1CRBZERENBACAwPtquz5+vpi8uTJcHV1lSgqGk3YTo5oFDEajSgtLUVJSQni4uLg5eUldUhEROSEIAjw9PSEp6en1KEQERHRCHDj7Ch8sK/Q+riuxYjPDxXh9zMiJIxqYMhkAm6aE4XzY33xx0+O4nhxvd2cmmYD/vWfbLy6KxdXTwnFzedFYYyfuwTREg1vFosIg9kCo9kCo1mE0WyBwWQ5M2Y6s95g6phngcEswmS2wGQRYbaIMFlEWH7922z5ddwswiyeWW/u9MdksbT/bRYxK8YHV00O7T5YIiLqs472QVqtFrm5uTbr2tracPjwYcTFxTlMdCIiouHFw8MDMTExyM7OBgBER0cjNDSU7UNp0DCJiWiUKCgoQGFhISwWCwCguLiYSUxERERERESjRIy/O+bF+WFnVqV17K09eViWEg6ZbGSeiIwN0OLL22dhy9ESvP5THjJKG+zm6E0WfLi/EB/uL8T8cQFYfX40pkV68eQsDXsWi4gWoxktehOa9Ca0GMxo0pvQrDeh2WBGq8GEVoMZbSYL2oxmtBnb/9abziy3Gc1otVl3ZrzN2J6MZLJIX+lbrZQxiYmIaBAIgoDQ0FC4u7sjPT3dpo2cxWLh5yciohEkKCgIra2t8Pb25vVkGnRMYiIaJZRKpTWBCQCqq6vR2toKFxcXCaMiIiIiIiKiwXLTnCibJKZTlc3YdbISF8SP3DvmFXIZrp4Siqsmh2BPTjU2/nQK/ztZ6XDu9oxybM8ox6RQHW45PxqXjg+EQm7fko5oIImiiBaDGQ1tRtS3GtHQakJDq9H2cZsRTW0mNBvOJCU1n5Wo1DIC20U6Yx4CiVRERKOJp6cnkpOTkZaWhsbGRgBAaGgo/Pz8JI6MiIh6w2g0QqFQOExCFQQBY8aMkSAqIiYxEY0aAQEBOHXqFMzmMyexiouLERMTI2FURERERKNXfn6+1CEQ0SgzJ8YXcQFaZJU3Wsfe3J03opOYOgiCgDmxvpgT64vMsga88VMe/n2kGEazffLD0aJ63PnBYYR6ueDG2VH43bQwuKl5Co16x2IRUd9qRE2LAbXNBtQ0G1DbYkBNsxF1LQa7pKSG1l8ft5mYlNNLJgf/j4mIaGCp1WokJSUhNzcXLS0tiI6OljokIiLqhYaGBqSnpyM4OBjh4eFSh0Nkg2dgiEYJuVyOoKAgFBUVWcfKysoQGRkJhYJvBUREQ4HRaIRSqZQ6DCIiIhqhBEHAjXMi8eDnx61ju3OqkFnWgPhADwkjG1zxgR5Yv2QS7r8kDpt+zsfmXwrQ0Gaym1dU24q/fJ2Of24/ieUzInDNlFCM8XNjq5RRqs1oRmWjHlVNemsyUm2zwUGSkgG1Le2JSsxFAlQKGdRyGZQKGZRyAUq5DCq5DCqFDHKZAIVcBrkAKGQdjwXIZQLkgtDpcfscuUwGhUyAXC5AIRMgE9r/nhTmKfXTJCIalWQyGWJjY9lKjohomCktLUV2djZEUUReXh7c3d3h7e0tdVhEVsxcIBpFQkJCbJKYzGYzysrKEBoaKmFUREQEAK2trdi/fz88PT3h7+8PX19fJjQRERFRv7syKQTPfZ+F6maDdeyt3Xl4bvEkCaOSRoCHBg9eGo87L4jBJ6mn8ebuPBTVttrNa2gz4ZWduXhlZy4CPTSYFeODOTG+mB3jiwAPjQSRU39pNZhR1aRHxa/JSVVNelQ1Gs4sN+l/TVwyoElvn+g2nChkAtzUCrirFXBVyeGqVkCjkEGjlEOjlMFFKf91WQ61UgaNQu5gnQxqpfzXde2JSGqFDEr5mT8dCUrKX5OReFGbiGjkk8mct9+tqKhATU0NYmNjIZfLBzEqIiI6m8ViQU5ODkpLS23GMzIyMGXKFLi4uEgUGZEtJjERjSIajQa+vr6oqqqyjpWUlCAkJIQnlYiIJFZRUQEAqKurQ11dHfLz8zFjxgy+PxMREVG/0ijlWD4jAi/8J9s69tWREjxwaTx83dUSRiYdN7UCq2ZHYcWMCHyfVobX/3cKR4vqHc4ta2jDF4eK8cWhYgBAjL+7NaFperQ3PDRMQpeaxSKiutmAisY2VDTqUdmgP7Pc2ClhqVGPZoNZ6nC7pdUo4KFRwsNFCZ1L+7JWo4RW82tCklr+a2KSAu5qOVxVCripFXBTy+GmOjNHreCFYyIiGlzNzc3IysqCxWJBc3MzEhISeIGciEgibW1tSE9PR2Njo906Nzc3JprSkMIkJqJRJiQkxCaJqbW1FTU1NfDx8ZEwKiIiqqystHns4+PDBCYiIiIaECtmRODVnbkwmC0AAIPJgvd/KcA988dKHJm0FHIZLp8YjMsSg7A/rwav/5SH7RnlXW6TU9GEnIombPo5H3KZgImhOsyJ8cWsMb6YEuHJxJF+pDeZUdVkQEVDe0JSe4LSmeWKxjZr1STzEOvj5qaSw8tNBW83FbxcVfByVULn0pGYpPw1SUkBj1+XO8bcNQrIZfxOQEREw4/JZEJaWhoslvbPm01NTTh06BDGjRvHlkVERIOstrYWGRkZMBqNdutCQ0MRFRXVZVU9osHGJCaiUUan08HNzQ3Nzc3WsaKiIiYxERFJqKWlxeZ9GQD8/f0lioaIiIhGOj+tGlckBeOzg2fajb//SwFunTsGGiWTbgRBwPRoH0yP9vk1QSkP29MrUNbQ1uV2ZouIw4V1OFxYhxf/mwONUoaUKB/MHuOD2TG+SAjygIwJKTZEUUR9q9FaJamyUzJSR9Wkjr/rW+1PuEtBJZfB+9eEJG83VXtykqvSJkmp89+erkr+vyIiolGnubkZBoPBZsxkMuH48eOIjIxEeHg4b94jIhpgoiji9OnTyMvLs1snk8kQFxfH6xA0JDGJiWiUEQQBISEhOHnypHWsrq4Ozc3NcHNzkzAyIqLRq6OVXAeVSgWdTidRNERERDQa3Dg7yiaJqarJgC1HS7B0apiEUQ09Mf7u+OtvE/HklSJyK5vxc24VdmdXYe+pajS2mbrcts1owf9OVuJ/J9srbqoVMoR4uiDEywWhXi4I9XJFiGf7coiXC/y1mmFfdUcURbQYzKhpNqC2xdDpbyPKahqxpzkYLaICP206gppmIyqb9DCapa+apFbI4Ouuhq9WDT93Vfuyuxp+WvWvyyr4/rrsoVHwoisREVE3dDodJk+ejLS0NLS2ttqsy8/PR3V1NeLi4nhNgohogLS0tCArKwsNDQ1261xcXJCQkAB3d3cJIiPqHpOYiEahgIAA5OXl2ZQNLC4uxtixo7t1ABGRVM5uJefr68sLI0RERDSgEoI9MGuMD37OrYYgABfF+yPWnycwnREEATH+7ojxd8f1MyNhMltwoqQBe3KqsCenCqn5tdb2fM7oTRacqmrGqapmh+uVcgFBul+Tmjx/TXKyLrsgUKeBUj6wJf5FUYTeZEGLwYxWoxmtBhNaDRa0GExoNZrR0GZCbbPBYZJSbbMBNS0GGExd/Rx+bR9T0jigzwMABAHwcVPDX6uGv8evf2s18NPaJif5adVwVzMxiYiIqL+5ublhypQpyMrKQlVVlc26xsZGHDx4EJGRkQgLC+PvYSKifiKKIoqLi5GXl2dt6dmZt7c3xo0bB4WCaSI0dPHVSTQKyWQyBAUFobCw0DpWXl6OqKgoKJVKCSMjIhp9mpub0dLSYjPGEq5EREQ0GFafH40Yf3esmh2FKF/eBd8bCrkMSWGeSArzxB0XxKDVYEZqQQ325FRjT04VTpTUQ+xlgSGjWURhTQsKa1qczpEJgFIug0oug1Ihg1IunHksl0GpaH98ZuzXxwoZlDIBBrMFrQYzWgxmtBnNnZKVfv3baO513INNJZdZE5HOJChpbJb9tGr4uKmgGOCkLyIiIuqaQqFAQkKCw3ZGoigiLy8PVVVVrMpERNQP9Ho90tPTHVZfAoCIiAhEREQwcZSGPCYxEY1SwcHBOH36NMRfz05aLBaUlpYiPDxc4siIiEYXR63kPDw8JIqGiIiIRpN5cf6YF8fk6f7gopLjvFg/nBfrBwCoazFgb241dudU4efcauQ5qb7UWxaxvaKT3mQB9P2yyyHDy1XZKTnp14pJ7meSlTrW6VyUPOlOREQ0jAiCgPDwcOh0OmRlZdm1l2NVJiKi/qFQKGAwGOzGNRoN4uLi4OnpOfhBEfUBk5iIRim1Wg0/Pz+bi+clJSX8kkBENIhEUbRrJefn58f3YSIiIqJhztNVhd8kBuE3iUEAgIrGNhRWt6C4rhVFtR1/2h8X17a2JyWNMEq5AC9XFbzd2v9oVQKKTmXBVTDhNxfMRpifpzU5ycddBbVCLnXIRERENIB0Oh2Sk5ORn5+PoqIim3WdqzKNGzcOLi4uEkVJRDR8yeVyjB07FseOHbOOhYSEICoqCnI5v2/R8MEkJqJRLCQkxJrE5OnpiZCQEIkjIiIaXZqbm+3uPmMrOSIiIqKRp73dmQZTHawTRRFVTQZrUlNRbXtiU+fHLQbzoMfcQSWXwUUlh4tSDje1HD5uani5KeHtprImKVn/dlPB21UFLzcl3NUKm+T8hoYGvPLKTgDA4slBrD5KREQ0CsnlcowZMwa+vr4OqzK1trZCJmM7WCKivvLy8kJwcDBqampYfYmGLSYxEY1iHh4eiIyMhI+PD9zd3aUOh4ho1Dm7lZxarYZWq5UoGiIiIiKSgiAI1lZpk8O97NaLoojaFiNqmvUwmkUYzRYYTBYYzJb2xyZL+1jHY7PFOsfmsdkCtVwGjUoOV6W8PTFJpei03J6o5Prr3x2PFXJeSCQiIqL+5awqU0xMDNRqtYSRERENfa2trRAEARqNxuH66OhoREdHs/oSDVtMYiIa5SIiIqQOgYhoVGIrOSIiIhqKjGYLvjtRBlEUcWUSq/UOBYIgWFuyEREREY0UZ1dlcnV1ZYVyIqIuiKKI4uJi5OXlwcPDAxMnTnR4PYHJSzTcMYmJiIiISAJNTU1oa2uzGeOJGqKhY9OmTVi1ahUAIC8vD5GRkdIGREQ0wOpbjPhgfyHe3ZuP0vo2BHposDAxCEpW4SEiIiKiAdRRlclisTi9uc9oNMJoNMLV1XWQoyMiGhpaW1uRlZWF+vp6AEBdXR1KS0sRHBwscWRE/Y9nooiIiIgkcHYrOY1Gw9aeREREJJm86mY8+30mSuvbk6zLGtrw7fFSiaMiIiIiotFALpdDqVQ6XZ+bm4uDBw/i9OnTEEVxECMjIpJWR/Wl1NRUawJTh9zcXLS2tkoUGdHAYRITERERkQTUajVcXFysj/39/dlKjoiIiCSTFOaJ5Agvm7G3dufxIhERERERSaq6uhrl5eWwWCw4deoUjhw5gpaWFqnDIiIacK2trTh69ChycnJgsVjs1gcGBkKlYttxGnnYTo6IbIiiiJqaGpSXlyM+Ph4yGXMdiYgGQmhoKEJCQtDU1ITKykq2kiMiIiLJ3TQnCgcLaq2PjxbV42BBLaZGeksYFRERERGNVkajESdPnrQZa2howMGDBxEVFYWQkBDeFEhEI44oiigpKcGpU6ccJi9pNBqMHTsWXl5eDrYmGv6YxEREAM6UIywpKbGWHvT29kZgYKDEkRERjVyCIECr1UKr1UodChEREREWJAQgxNMFxXVnytG/tSePSUxEREREJAmZTAY/Pz8UFxfbjFssFuTm5qKyshKxsbFwd3eXKEIiov7V3NyM7Oxsu9ZxHYKDgxEdHQ25XD7IkRENHpZYISIA7RfSq6qqbHqn5ufnO8zwJSIiIiIiopFHIZdh1exIm7HvT5ThdA3bdRARERHR4JPL5YiJicGkSZOg0Wjs1ndUZcrKyoLBYJAgQiKi/mEwGHDy5EmkpqY6TGBSq9WYOHEiYmNjmcBEIx6TmIjIKiwszOaxXq+3u8OBiIiIRr4dO3bghhtuQHR0NFxdXeHh4YHExETcf//9KCkpcbrd2rVrIQiCtZR7W1sb1q1bhylTplirjqWkpOCll16CyWSy2/7dd9+1bv/jjz92G+dtt92G4OBgREZGora21uGcvj6XnqqsrMSjjz6KyZMnw9PTExqNBpGRkVixYgV2797d5baRkZEQBAErV64EABw4cADXXXcdwsLCoNFoEBYWhlWrViEzM7NHseTk5ODee+9FYmIidDodXFxcEB0djZUrVyI1NfVcnyoAoLW1FX/7298wadIkuLm5wcfHB7Nnz8brr78Oi8WCnTt3Wv8Nd+7c2S/HJKLBtXRaGNxUZ06IWkTgnZ/zpQuIiIiIiEY9T09PTJ06FSEhIQ7Xl5WVYd++fSgoKOCN2UQ07JSWlmL//v0oLS11uD4oKAhTp05l+zgaNZjERERW3t7e0Ol0NmOFhYUOLzISERHRyNPW1obrrrsOF154Id59913k5eWhtbUVjY2NOHHiBNavX4+xY8di69at3e6rvLwcM2fOxAMPPIDDhw+jqakJTU1NOHDgAO666y5cffXVdicWr7rqKri4uAAAPvjggy73bzQa8fnnnwMALrzwQrsv8f35XJzZtm0bYmJi8NRTT+HIkSOor6+HXq9HQUEB3n//fZx33nm48847e3QC9a233sKsWbPw0UcfoaioCHq9HkVFRdi0aROSkpLw6aefdrn9+vXrkZCQgH/+8584ceIEGhoa0NbWhry8PLzzzjtISUnBY4891ufnCrSfFE5OTsYjjzyCY8eOoaWlBTU1Nfj555+xevVqLFy4kHe+Eo0AHhollk6zvcHl4wOn0aTn90IiIiIikk53VZksFgvy8/ORnp4OX19fCSIkIuobhUIBs9lsN95RfWns2LFQKBQSREYkDSYxEZGVIAiIjo62GTOZTDh9+rREERERjSyiKNq07SQaSkRRxOLFi/HRRx8BABYtWoT33nsPe/bswd69e/Gvf/0L4eHhaG5uxuLFi7ut7HP11VcjPT0dd999N3788UccPHgQH3zwAcaNGwcA2Lp1K15//XWbbbRaLa644goAwBdffIG2tjan+//uu+9QU1NjPdZAPhdHjhw5gkWLFqGhoQFKpRL33nsvduzYgf379+O1115DVFQUAODll1/GQw891O2+br31Vvj7++PFF1/Evn37sGvXLjz44INQq9XQ6/VYvny50zjXrVuH+++/H0ajERMnTsQrr7yC7du3IzU1FZs3b8bMmTMhiiKefPJJvPDCC71+rkD7Z8LLL78cGRkZAIAFCxbgyy+/RGpqKr744gvMnz8fP/zwAx599NE+7Z+IhpZVs6Lwa1E9AECj3oSP9hdKFxARERER0a86qjJFRERAJrO/zGk0GhETE4Nx48ZBFEUJIiQi6h1fX194eHhYH8tkMoSHh7P6Eo1aTNkjIhseHh7w9fVFVVWVdayoqAjBwcFQq9USRkZENPzV1dXh2LFj0Gq18PPzg5+fn8M7x6iPmqu6n+OMyg1QujjZbzWAPp70Urq079uRlhpA7EWJc7eBvYvwjTfewDfffAOlUoktW7bg0ksvtVk/Y8YMrFixAueddx7S0tJwzz33dNku7cCBA9i2bRvmzZtnHZsyZQouueQSJCQkoLy8HBs2bMCaNWtstlu+fDk+/vhjNDQ04Ouvv8bixYsd7r+jUpNWq8X8+fMH9Lk4snr1ahgMBsjlcnz99ddYsGCBdd20adOwZMkSzJkzB+np6Vi/fj2uv/56jB8/3uG+jh49ioiICPzyyy8IDAy0jp9//vm45JJLsGDBAhiNRtx+++3Yv3+/zbbp6el45JFHAACPP/44Hn/8cWs7PwBITk7GtddeixtuuAHvv/8+HnnkEaxYsaLXJ0Bee+01HDx40PrcX3vtNZtjXHXVVbjpppvw1ltv9Wq/RDQ0hfu4YkFCAH5IK7eObdiZi6XTwuChUUoYGRERERFRe1WmyMhIBAUFIT8/H2VlZXZz6urqbL4fExFJTRRFh+9LgiBgzJgxOHz4MAICAhAVFcVrsjSqMYmJiOxERUXZJDFZLBYUFBRg7NixEkZFRDT8VVZWAgAaGxvR2NiIiooKJCcnSxzVCLJuTN+3XbgeSLnF8bqXpwEt1X3b79z/Ay5wUoXn7d8AlZk939fa+r7F0AOiKOLZZ58FANx99912ST8dvLy8sG7dOixcuBB79uxBdnY2YmNjHc696667bBKYOnh7e2PVqlV45plncPz4cdTX19u0s7300kvh4+OD6upqbN682WESU1NTE7Zs2QIAWLhwoU0y4EA8l7Pt378fBw4cAADccsstNglMnfe/ceNGzJkzBxaLBRs2bMDLL7/sdJ/PP/+8TQJThwsuuAC33HILXnnlFRw4cACpqamYOnWqzXZGoxFTp061S2DqIJPJ8OKLL+LTTz9FU1MTPvvsM9xyi5PXuxMbNmwAAAQEBOAf//iHwzn/+te/sHXrVut7HRENb6vPH2OTxFTTbMArO3Px4KXxEkZFRERERHSGWq1GXFwcQkJCkJubi7q6OgDtLeYdJTYREUnBaDSisLAQra2tmDBhgsM5Hh4eSElJgYuLkxttiUYRtpMjIjuurq4ICgqyGSstLUVLS4tEERERDX+iKNpd2Pfz85MoGiJb6enpyM3NBQCnlY86nH/++dblvXv3Op23fPlyp+s6kvdEUUReXp7NOqVSiSVLlgBobxnXcQKysy+//NLamvHsVnID8VzOtn37duvyTTfd5HTe7Nmzre3zOm9zNi8vL1x55ZVO1994440Ojw20t+UDgGuuuabLO0w9PT2RmJgIoHfPFWj/HJieng4AWLp0KVxdXR3Oc3d3x9KlS3u1byIaupIjvLAgIcBm7K3deSipY2tcIiIiIhpa3N3dMXHiREyYMAFqtRqFhYVOW8mZTCZYLL2ojE1E1EcWiwVFRUXYv38/ioqKUF1djZqaGqfzmcBE1I5JTETkkKN+0mdfZCQiop6rra2FyWSyGWMSEw0Vqamp1uWZM2dCEASnf9zd3a1zu7qrMT7eeaUOb29v63JjY6Pd+o4EKL1ej88++8xufUcrueDgYMyePXvAn8vZTpw4AQBQqVRISkrqcu706dMBANnZ2TAYDA7nTJ48GQqF8yK5SUlJUKlUAIDjx49bxwsKCqzJkQ899FCXz1UQBOvPprd3o3Y+5rRp07qcm5KS0qt9E9HQ9uBv4iGXnUmQ1JssWL8tS8KIiIiIiIgcEwQBPj4+GDduXJdJAnl5eThw4AAqKyudJjoREZ0LURRRVVWF1NRU5Obm2lwXOHXqFN97iLrBJCYickitViMkJMRmrKqqCg0NDRJFREQ0vJWWlto81mq1vLOChoyKioo+bddVlUZn1XoA2CRKm81mu/WzZ89GREQEAGDz5s026yoqKqzViJYuXWqXdD0Qz+VsHSdDvb29u0w+AmBtESeKImprax3O8ff373IfCoXCmvjV+UTsYDzXs4/ZXawBAQFdriei4WWMnzuWpYRbH08K1WHp1DAJIyIiIiIi6lpXVYqbm5tRUlKCtrY2pKen48iRI7zmQUT9qrGxEUePHkVaWpq1knxnLS0t7HxD1I2uz7gT0agWFhaG0tJSmwzhvLw8TJw4scsvAkREZMtgMKC6utpmjBf6B8D9uX3fVuXmfN0dBwD08e4YZReJaqu+A8ShUb68cyLR1q1bERkZ2aPtukto6StBELBs2TI8/fTT+N///ofi4mJrcvUnn3xi/WyybNkyu20H87n01+ehvu6n83N97LHHrG34uuPm1sXrvRv8DEg0+vxhfixSC2px27wxuDwxCDIZ3weIiIiIaHg6deqUzeOGhgYcPnwY/v7+iIqKgkajkSgyIhru9Ho98vLyUF5e7nSOr68voqOjYTQaBzEyouGHSUxE5JRSqUR4eLjNB/u6ujrU1tbatIEhIqKulZWV2ZSIlclkTGIaCG6+A7Rfn4HZr+vQ+V3q43PmOXp6emLChAkSRtNu+fLlePrpp2GxWPDhhx/iT3/6E4AzreTi4+MxZcoUu2pEg/FcOj4HVVdXw2QydVmNqaN1myAI8PLycjinq5MbAGAymWyqP3Xo/FyVSuWA/bt1jru7WLtbT0TDj6+7Gt/ePYdJjEREREQ0rJnNZpsbtjurqKhAZWUlQkNDER4e3m3VZSKiDmazGYWFhSgqKoLF4viGVa1WizFjxkCn0wEAk5iIusF2ckTUpeDgYKjVapuxjotxRETUPVEU7VrJ+fv782QIDSmTJ0+2Lu/Zs0fCSM4YP348Jk2aBOBM4lJeXh727t0LoD3JyZHBeC4dyUIGgwFHjhzpcu7+/fsBALGxsVCpVA7nHDlyxOmJVAA4evQoDAaDzbEBIDo62nryYyD/3RITE63LBw4c6HJud+uJaHhiAhMRERERDXdyuRxJSUlISEhwWHFJFEWcPn0av/zyC06dOgW9Xi9BlEQ0XBgMBuTl5eGXX35BYWGhwwQmtVqN+Ph4TJ482XoOj4i6xyQmIuqSXC5HREQEgPZftnFxcRg3bpzEURERDR+1tbVoa2uzGQsKCpIoGiLHpkyZgtDQUADAxo0b7V6zUulIVDp8+DAyMjKsyUyA41ZywOA8l/nz51uX33rrLafz9u7di/T0dLttzlZTU4OtW7c6Xd/5GJ33I5fLsXDhQgDAtm3bkJGR0X3wfRAcHGz9/Pfpp5+itbXV4bzm5mZ88sknAxIDERERERER0bkSBAF+fn6YNm0aoqOjIZfL7eaYzWacPn0a+/btQ1ZWFlpaWiSIlIiGMlEUcezYMRQWFjq8MVEulyMqKgrTpk1DQEAAbwwi6iUmMRFRtwIDAxEbG4uUlBQEBgbyly0RUS+cXYXJzc0NWq1WomiIHJPJZHj44YcBAKdOncL111/f5R2HDQ0NeOmllwY8ruuuu876uWPz5s348MMPAQAzZ85EdHS0w20G47mkpKRg6tSpAIDXX38d//nPf+zm1NfXY82aNdaYbrvtti73+cc//tFhK7Zdu3Zh48aNAIDk5GRMmzbNZv1DDz0EuVwOi8WCxYsXo6ioyOkxzGYzNm/e3OUcZzriLysrw3333edwzr333mvX3o+IRjaLRYTB5LhcPhERERHRUCWTyRAWFobp06cjODjY4RxRFFFWVoYDBw7gxIkTQ+aGLyKSniAITt87goKCkJKSgvDwcIeJkkTUPfYxIaJudfXLmIiInDMYDKiurrYZCwoKYjIoDUm33norfvzxR3z55Zf49NNPcejQIaxZswYpKSnQ6XRoaGhAZmYmdu7ciS1btkCj0eDOO+8c0JhCQ0Mxd+5c7Ny5Ey+//DLq6uoAOG8lN5jP5fXXX8f06dNhMBiwcOFC3HXXXVi0aBHc3Nxw+PBhPPPMMzh16hQA4E9/+pNNG7izTZo0Cenp6UhOTsZDDz2ElJQU6PV6fPvtt/jHP/4Bk8kEhUKBl19+2W7bxMRErF+/Hvfeey/S09MxYcIErF69GhdeeCECAgLQ1taG/Px87N27F5999hlKS0tx/Phxa7Wqnrrtttvw9ttv4/Dhw3jllVeQl5eHW2+9FWFhYTh9+jQ2bNiAbdu2YerUqUhNTe3VvoloePo5twpPf5uJixMCcPdFsVKHQ0RERETUa0qlErGxsQgJCUFeXh6qqqoczqutrWUyAtEoJIqi03P5AQEByM/Ph9FoBAD4+PggKioKbm5ugxki0YjEJCYiIiKiAVJWVgZRFK2PZTIZAgICJIyIyDlBEPDxxx/jD3/4A1599VXk5ubigQcecDrf399/UOJavnw5du7caU1gUigUWLp0aZfbDMZzSUpKwtatW7FkyRI0NDTg+eefx/PPP28374477sDTTz/d7b7uvPNO3HbbbQ6TqVQqFd555x1Mnz7d4fb33HMP3NzccM8996C+vh7r1q3DunXrHM5VqVTQaDQ9eIa2FAoFvv76a1x44YXIysrC999/j++//95mzoIFC3Dffffhkksu6fX+iWj4yK9qxpNfp+M/me2V13Irm3BtShj8tb1/byEiIiIiGgpcXV0xfvx4tLS0oKioyO6cXlBQEJRKpYQREtFgslgsqKysxOnTpxEfHw93d3e7OXK5HKGhoWhtbUVoaCiTl4j6EdvJEREREQ0AURTtWsn5+/tDoWAOOQ1dSqUSGzZswNGjR3HXXXchMTEROp0OcrkcOp0OSUlJuOmmm/DZZ58hIyNjUGJavHgx1Gq19fGCBQvg5+fX7XaD8VwWLFiAnJwcPPzww0hKSoKHhwfUajXCw8OxfPly/PTTT3jppZcgk3X/tevmm2/GTz/9hKVLlyI4OBgqlQohISG4/vrrcfjwYVx77bVdbn/LLbfg1KlTeOKJJzB79mz4+vpCoVDAzc0NY8eOxTXXXINXX30VxcXFiImJ6dPzDQ4OxuHDh/HXv/4VEyZMgIuLCzw9PTFjxgxs2LAB3333HVQqVZ/2TUTDR6vRjP9mnWkd2WIw45/bsyWMiIiIiIiof7i6umLs2LGYMWMGwsLCrNWXuqpmXFdXB5PJNFghEtEAMplMKCoqwv79+5GZmYnm5mYUFRU5nR8eHo64uDgmMBH1M15FI6Jz0tDQAI1GwwtWRERnqa2tRVtbm81YUFCQRNEQ9U5iYiJeeOGFXm+3du1arF27ttt58+bNs7mjsSuenp52/5d6o6/PZeXKlVi5cmW38/z8/PDUU0/hqaee6kN0tmbMmIGPP/64z9sHBATgsccew2OPPXbOsTjj4uKCRx55BI888siAHYOIhrZxQR5YPCUUnx48cyL34wOncePsSMT4ayWMjIiIiIiof6hUKkRHRyM8PBz19fVOKxobjUacOHECQPuNPyEhITY3YhHR8GAwGFBcXIySkhK7pMSKigpERkb2qbI5EfUNKzERUZ+0tLQgLS0Nhw8fRmFhodThEBENOTqdDnFxcdBq2y/mubm5WZeJiIiIhrP7FsRBozxzSslsEfHMd5kSRkRERERE1P8UCgV8fHycri8tLYXZbIbZbMbp06exb98+ZGVloaWlZRCjJKK+amlpwcmTJ/HLL7+gsLDQYVU1URRRXl4uQXREoxcrMRFRr5WVlSErK8v6uKSkBCEhIXBxcZEwKiKioUUulyMwMBCBgYFoamqCyWSCIAhSh0VERER0zgJ1Gtw8Jxov7cixjm3PqMDe3GrMHOP8Ig8RERER0UhhsVjs2kyJooiysjKUlZXBx8cHYWFh0Ol0EkVIRM40NDTg9OnTqKqq6nKeh4cHwsLCukxmJKL+xyQmIuo1T09PCIJgbQMjiiLy8/Mxbtw4iSMjIhqa3N3dpQ6BiIiIqF+tmRuND/cXorrZYB3727cZ+PcdsyGTMXGbiIiIiEY2k8kEnU7nNAmiuroa1dXV8PDwQGhoKHx8fCCTsUEOkVQsFgtqampQVFSE+vr6LucyCZFIWvxtSUS9ptFoEBISYjNWUVGBxsZGiSIiIiIiIiKiwaTVKHHP/FibsePF9dh6rESiiIiIiIiIBo9KpcL48eMxbdo0BAUFOa3A3tDQgPT0dOzduxfZ2dloaGiw3iBORIPnyJEjSEtLc5rAJAgCAgMDMW3aNEyYMIEJTEQSYhITEfVJeHg45HK5zVheXp5E0RAREREREdFguzYlHNF+bjZjz32fhTajWaKIiIiIiIgGl6urK8aOHYsZM2YgPDwcCoXjJjgmkwklJSU4fPgwUlNT0dDQMMiREo1uXl5eDsflcjnCwsIwffp0xMXFwdXVdZAjI6KzsZ0cEfWJUqlEeHi4TeJSbW0tamtrnX4QICIiIqIz8vPzpQ6h382bN493lBKNIkq5DP93aTxWv3fQOlZc14p39+Zj9fljJIyMiIiIiGhwqVQqREVFISwsDGVlZSgqKoJer3c4t6WlBWq1epAjJBrZzGYz6uvr4e3t7XB9QEAACgsLrY9VKhVCQ0MRFBTkNPmQiKTB/5FE1GchISEoLi6GwWCwjuXl5cHT09Np6VQiopFMr9fj1KlTCAoKgk6n43shERERjXgXJwQgJdIb+/NrrGMv/TcHS6eGwdNVJWFkRERERESDT6FQIDQ0FMHBwaisrERJSYld1SUvLy+nSUxmsxkymYznFYl6QBRF1NfXo7y8HJWVlTCbzUhJSYGLi4vdXFdXV3h4eAAAgoKC4O/vD5mMTauIhiImMRFRn8nlckRERCA7O9s61tjYiKqqKvj5+UkYGRGRNMrKylBRUYGKigq4uroiJCQEwcHBUodFRERENGAEQcDDl43Db1/eYx1raDPhxf/m4M+XJ0gYGRERERGRdGQyGQICAhAQEIDW1laUl5ejvLwcbW1tCAgIcLpdfn4+KisrrduytRWRvdbWVuu5+La2Npt15eXliIyMdLjdxIkTIZfLByFCIjoXTC8cQC0tLXjuuecwbdo0eHt7w83NDfHx8bjvvvtQUFBwzvuPjIyEIAi9+uOoZcXatWt7vP3OnTvPOW4aWYKCguwymvPy8mCxWCSKiIhIGqIoorS01Pq4paUFjY2NEkZERERENDiSwjxx+cQgm7F39+ajoLpZooiIiIiIiIYOFxcXREZGIiUlBUlJSfD19XU4TxRFVFRUQK/Xo7CwEAcOHMChQ4dQUlICo9E4yFETDS0mkwklJSU4fPgw9u/fj8LCQrsEJqA9iUkURYf7YAIT0fDASkwDJCcnBwsXLrSpUAMAWVlZyMrKwhtvvIHNmzfj8ssvH7SYdDodAgMDB+14NDoIgoCoqCikp6dbxzoyoFl9hIhGk9raWrs+90FBQU5mExEREY0sD1wSjx/SymA0t58s9nRVoai2FRE+bhJHRkREREQ0NAiCAJ1O53R9bW0tDAaDzVhjYyMaGxuRk5MDHx8fBAQEwNvbm22waFQQRRE1NTUoLy9HVVWV0+SkzlxcXGAymaBUKgchQiIaCExiGgCNjY247LLLrAlMt9xyC6699lq4uLhgx44dePrpp9HQ0IDf/e532LNnD5KSkvp0nG3bttl9mDnb9u3bce+99wIAli5dCo1G0+X848ePd7k+Kiqqd0HSqODr6wutVmtTcaSgoAABAQHMaiaiUaOkpMTmsbu7O7RarUTREBEREQ2ucB9X3DAzEpv3FWLN3Gjccl403NQ87URERERE1FO1tbVO14miiKqqKlRVVUGpVMLf3x/+/v7QarUQBGEQoyQaeC0tLSgpKUFFRUWPqpC5urpaWzCq1epBiJCIBhLPJg2AdevW4eTJkwCA5557Dvfff7913cyZMzFv3jzMnTsXLS0tuOeee/rcom3s2LHdznnyySety9dff3238ydMmNCnWGh0EwQB0dHROHr0qHXMYDCgqKgIEREREkZGRDQ49Ho9qqurbcaCgoJ4AoGIiIhGlbsuisXq86Ph79H1DVRERERERGQvOjoaAQEBKCsr6zJ5w2g0ori4GMXFxVAoFPD29oaXlxf8/f1ZoYlGhMbGRhQXF3c5pyOZLyAgAO7u7jwXTzSC8DdZPzMajXjhhRcAAOPGjcN9991nN2fWrFm46aabAAC7du3CgQMHBiSW+vp6bNmyBUD7B585c+YMyHGIAMDT0xPe3t42YwUFBQ770RIRjTRlZWU2j2UyGfz9/SWKhoiIiEgaOhclE5iIiIiIiPpIEAS4u7sjJiYGM2bMwIQJE+Dn59dlcobJZEJFRQVOnTrFJA4aNkRRRH19Pcxms8P1Z19v7CAIAnx9fTF+/HjMmDEDMTExrEZGNAKxElM/27FjB+rr6wEAN9xwg9OM55UrV+K1114DAHz55ZeYNm1av8fyySefWBNIelKFiehcRUVFoaamBgAgl8sRExPDso1ENOKJoojS0lKbMX9/fygU/JhFREREREREREREvSeTyeDj4wMfHx8YjUZUVlaivLwcDQ0NDud7eXk5TeRobm6GXC6HRsMbDkg6er0eNTU1qKmpQW1tLcxmMyZMmAAfHx+7uUqlElqtFo2NjQAArVaLgIAA+Pv7Q6lUDnboRDTIeHWtn+3evdu6PHfuXKfzpk6dCldXV7S0tGDPnj0DEsu7774LoD0rdcWKFQNyDKLO3N3dERISgoaGBowbNw4uLi5Sh0RENOBqamqg1+ttxoKCgiSKhoiIiIiIiIiIiEYSpVKJ4OBgBAcHo6WlBeXl5aiqqkJLS4t1jrPKNQCQm5uL2tpauLq6wtvbG97e3tDpdGw9RwPKYrGgvr7emrTU3NxsN6e2ttZhEhMABAYGwtPTE4GBgXB1dR3ocIloCGESUz9LT0+3LsfHxzudp1AoEBMTg2PHjiEjI6Pf48jLy7MmR82ZMwfR0dE92m7BggU4cuQI6urq4OnpiYSEBFx66aVYs2YNvLy8+hxPUVFRl+s7V7Bobm52mklOQ5+vry/8/PxgNBqd9mse6pqamhwuE0mFr8mh7fTp0zaPXVxcIIriiP1dNpivR5PJBIvFAlEUnZYWptGt8+uCrxHqiiiKsFgsMJlMA/r+zN/ZNJQMpddjcV0bXv/5NG4/Lxz+WlbrHa2G0muSyNFFNCIiouHA1dUVUVFRiIqKQltbmzVBxNk1PLPZbO0g09LSgpaWFhQVFUEmk8HT09Oa1MSb0qk/tLa2ora21vq6tFgsXc7v6O7iSHBwcH+HR0TDBJOY+llHso6bmxs8PT27nBsWFoZjx46hsrISer2+X9tuvfvuuxBFEUDvWsn9+OOP1uXKykrs2rULu3btwrPPPotNmzbhyiuv7FM8YWFhPZ77xRdfQKfT9ek4RP3tvffekzoEIht8TQ4tSqUSU6ZMsSnVnJaWhh07dkgY1eAZ6NdjUlISdDod3N3dUVFRMaDHouGvurpa6hBoCDMYDGhqakJ9fT22bNkyKMfk72waSqR6PeotMhxs88dxvTcskGHfiRxc7p4PmeMuFzSK8D2SpNZxMZeIiGg402g01gpNztTX1ztMJLFYLNbWXkD7jZleXl7w9vaGp6cn5HL5gMVNI0tdXR2qqqpQU1OD1tbWXm0rk8lgMpmgUDBlgYjO4DtCP+vozenu7t7tXDc3N+tyU1NTvyYxdZwMcnFxwdKlS7udn5iYiN/+9rdISUlBcHAwjEYjsrKysHnzZmzbtg11dXW45pprsHXrVvzmN7/ptziJiIiGM39/f5sEJrPZzEQKIiIiol/93BqETMOZO8KLTe443OaHZJdKCaMiIiIiIho9DAYDFAoFTCZTl/NaW1vR2tqKkpISCIIANzc3aLVaRERE9Ov1Sxp5KioqbDrudEWhUFiT5by8vPjaIiKHmMTUz9ra2gAAKpWq27md35h7m5nalZ9//hm5ubkAgCuvvBIeHh5dzr/nnnuwdu1au/Hp06fj+uuvx2uvvYZbb70VZrMZN998M3Jzc6HRaHoV09mtds5WWlqKlJQUAMDVV1+NsWPH9mr/NDzU19dDFMVuq5RJrampyZoIuGLFih4lJRINJL4mhyZRFJGWlmbTOtPf3x+rV6+WMKqBN5ivx+LiYlgsFiiVSvj7+w/YcWj46pw46OPjw7sEyanGxkZotVrodDrMnDlzwI7D39k0lAyF1+OyViMWv3EI5Y0G69hBfQDuWroAk0K7PldBI89QeE0SdTh58iSefvppqcOgIa6pqQmHDh3C/v37sX//fhw4cAD5+fkAgIiICOtyf/r555+xYcMG/PTTTygvL4enpycmTZqElStX4rrrruv34xHRyBcYGIiAgAA0NjZaKy91FGRwRhRFNDU1oampCVFRUQ7ndFR3kslk/R4zSc9isaC5uRlNTU1obGxEW1sbEhMTbW7o7eDl5dVlEpNWq7UmLnl4eDjcBxFRZ6M2iak/3iDffvttrFy50masI7nHYDA42MKWXq+3Lvdnr9l3333XunzDDTd0O7+7hJI1a9bgwIEDePPNN1FSUoLPP/8cy5cv71VMoaGhPZ7r5ubWbeIVDS9msxmnTp1CSUkJ5HI5/P39e50IJxV3d3e+HmlI4Wty6KiurrZJYALaT2JqtVqJIhp8A/16LC8vh8lkgiAITE6hbsnlcoevk02bNmHVqlUAgLy8PERGRvb7sfPz860n9Rx9RxjJ1q5diyeeeAIArO2se6vju9njjz/u8OaK/iAIAmQyGRQKxaD9HuXvbBpKpHo9engALy5LxrUb98Ly61uEWQT+b8tJfPuH86BzUQ56TDQ08D2SpNa5Qj6RM4sWLcLOnTsH7Xhr167Fk08+adP2qby8HNu2bcO2bduwefNmfPbZZ8PmvCoRDR2CIMDDwwMeHh6IjIyE0WhEbW2tNanp7HOcHTQaDZRKx5/Zq6qqkJmZCTc3N7i7u0Or1cLd3R3u7u5MbBpmOhKWGhsbrUlLzc3Ndud59Hq9w99BXl5eEATBOl+pVNpUW+pJ4Q8ios5GbRLTQOm4cNnU1NTt3ObmZutyf919ptfr8cknnwAAgoKCcPHFF/fLftesWYM333wTALBr165eJzHR6GUymXD48GG0tLQAaE9oyszMxKRJk5htTUTDmtFotCnF3PElnYiIiIjOSInyxt0XxeKf27OtY8V1rXj4i+N4adlkfi8kIqIhq/PFW29vb0ydOhU///xzj87999Zrr71mvTlgzJgxePjhh5GYmIiSkhL861//wo4dO/DNN9/gxhtvxAcffNDvxyei0aWj6rm/v7+16lJHUlN9fb11XlfnOpuammwqNpWVlQFoT5hydXW1JjVptVq4ubnxBsUhoqcJS440NTU5TGJSKBQICgqCSqWCt7c33N3d+T2PiM7JqE1iysjIOOd9BAUF2Y2FhoZi3759aG5uRl1dXZdVjjparPn5+fVbz8+tW7eitrYWALBs2bJ++1CQkJBgXS4uLu6XfdLooFAooNVqrUlMQHtbudOnTyM8PFzCyIiIzk1gYCD8/PxQVVWFkpISBAQE8MsZEQ2YwagoRUQ0UO66MBY/51Zjf16Ndeyb46WYc8AX16XweyEREQ1Ny5Ytw5o1azBt2jTExMQAACIjI/s9iammpgYPPvggACA8PBy//PILfH19resvv/xyXHXVVdi6dSs+/PBDrF69GvPmzevXGIho9BIEAVqtFlqtFuHh4TCZTNYEl666yDhrSSeKIpqbm20KOQDtVRA7V2vS6XT9+jyoex1tUvtaSbuxsdHm91NnsbGx5xIaEZGNUZvEFB8fPyD7TUhIwOeffw4AyMzMxIwZMxzOM5lMyM3NBQCMGzeu347f21ZyPcWLsnQuYmJiUF9fj7a2NutYfn4+vLy8RlXbJSIaeeRyOQICAhAQENDnL39ERKMd3z+JRj65TMA/f5eE3/zrJ9S3nmlV8cTWNEyN8EJsAL8XEhHR0LN69epBOc4bb7xhrXzy7LPP2l0glsvl2LBhA7799luYzWasW7eOSUxENGAUCgW8vLzg5eXldE5HBabe6JzY5OPj4zSJqaamBiaTCWq1GhqNBiqVitcozyKKIgwGA9ra2qDX661/dyxHRkY6TDZydXXt9bE0Go01+ayr1wQRUX8atUlMA2XOnDnW5V27djlNYkpNTbX+sp49e3a/HLuyshLff/89ACApKQmJiYn9sl8ASE9Pty4HBwf3235pdFAoFIiPj8eRI0esY6IoIiMjA8nJySwjSkQjAr9MExERETkX7OmCdYsnYvV7B61jbUYL7vrwML66YzY0Sn4vJCKi0emrr74CAHh4eODqq692OCc0NBTz58/HDz/8gP/85z9obGzkzaFEJBlBEDB9+nRrO7KOv1tbW3u0vaOWZB2KioqsHWc6jqVWq61JTWcvazSaEXeNSRRFtLa22iUpdU5W6uqGMGf/DjKZDK6urnZVsjq4uLhYWwB2/K1QMJWAiAYf33n62bx586DT6VBfX4933nkHDzzwgMOLmps2bbIuX3XVVf1y7A8//BBGY/sdjf1ZhQlo78ndYe7cuf26bxoddDodwsPDUVhYaB1rbW3FqVOnWGaSiIiIiIhoFFgwPhDXz4zAu3sLrGOZZY146psMPPnbCRJGRkREJA2DwYD9+/cDAGbOnAmVSuV07ty5c/HDDz9Ar9cjNTUVF1xwwWCFSURkR6FQwNPTE56entYxk8lkk9jU1NSElpYWu23VarXT/Xbu6AG0J/S0tbWhra3NWrXOUSwajQZ+fn4ID3fcrrqqqgpmsxlyuRwymczp3zKZrNc3q4qiCIvFAovFArPZ3OO/dTodvL29He7z0KFDMJvNvYqjw9k/w860Wi2am5vh4uJik6zk7u7OhCUiGjL4btTPVCoV7r77bjz55JPIyMjA+vXrcf/999vM2bt3L958800A7V88pk2b5nBfHb8kIyIikJ+f3+2xO1rJKRQKLFu2rEfxHj9+HC4uLtae3o5s3LgRb7zxBgAgMDCw35KuaPSJiIhAbW2tTa/kkpISeHt7w8fHR8LIiIiIaO3atXjiiScAtJ98aWhowN///nd8/vnnyMvLg6urK6ZOnYpHH30Us2bNsm5XUVGBF154AV9++SXy8/Oh0WgwZ84crF27FpMnT+7ymBaLBR988AE++OADHDp0CDU1NdDpdJgwYQKWLFmCm2++ucuT+ABQV1eHl19+Gdu3b0dBQQG0Wi0mTpyINWvWYMmSJd0+747P3I8//jjWrl3rdN68efOwa9cuzJ07Fzt37ux2v2c7ceIEvvrqK/z0009IS0tDZWUllEolgoKCMGvWLNx2220Oq7ju3LnT7uJEVFSU3bwdO3Y4bCnx1VdfYfPmzdi3bx8qKiqg0WgQExODRYsW4e677+62FHhRURGefvppfPfdd9bPbVOnTsXdd9+N+fPn9+6H4ERP/w2IaGR4eOE47M+rQWbZme+F7/1SgNkxvrh0QqCEkREREQ2+kydPWi9Sx8fHdzm38/qMjIxeJTEVFRV1ub60tNS63NjYiIaGhh7v+1x0bkfV29ZURM7wdSUtmUwGnU5nbRdnNpvR2tqKlpYWtLS0QK/XA4DD95mOhKXe6kiecnFxcfr+lZOTYz12dwRBsCY0yWQyuLu7W9ed/ZpKT0/v8X7P5u/v7zRxSKlU9jmJqbm52enPwdfXF/7+/nbVqxwlm9HA4fsUDQSpXledr/v3FyYxDYD7778fH3/8MU6ePIkHHngAOTk5uPbaa+Hi4oIdO3bgb3/7G0wmE1xcXPDPf/6zX46Znp6OgwfbS7Jfeuml8Pf379F2Bw8exM0334wLLrgAv/nNb5CYmAgfHx+YTCZkZmZi8+bN2LZtG4D23tsbN26Em5tbv8RMo49MJkN8fDwOHjwIi8ViHc/KysLUqVO7vUhJRCQ1o9EIURT5fkUj3unTpzF//nycPHnSOtbc3IzvvvsO27Ztw4cffoglS5bg2LFjWLhwIYqLi63zWlpasGXLFvzwww/47rvvnJ5Yr6mpwRVXXIE9e/bYjFdVVWHnzp3YuXMnXnrpJXz33XeIiIhwuI+MjAxcfPHFKCsrs461tbXhP//5D/7zn/9g1apVOP/888/lR9EvHCUiAe13Xefk5CAnJwfvvvsu/u///g9PP/10vxyztrYWixcvxn//+1+bcb1ej4MHD+LgwYPYsGED/v3vfzttgf3TTz/h8ssvtznxVVpaiq1bt2Lr1q1MOCKiPtEo5Xhp2WQsenEPWo1nTso/+PkxJIbqEOLpImF0REREg6tzclFoaGiXc8PCwqzLp0+f7tVxOm/bnffee8+afDCY3nvvvUE/Jo18fF0NLzKZDHFxcVCpVFCr1ZDJZL3a/sCBA9i6davDdZMnT+6yAlRnoijCbDZbk4jy8vKs685+TU2aNAkuLn37DnPs2DFs2bLF4bq4uLhubzyzWCwwGAzWFnMdy62trfjhhx/6FBMNPr5P0UAYzNeVsyp554JJTANAq9Xim2++wcKFC5GdnY2NGzdi48aNNnM8PDywefNmJCUl9csxO6owAcD111/fq23NZjO2b9+O7du3O53j4+ODN998E4sWLepzjEQA4OrqipiYGJuLokajEVlZWZgwYUKvy3QSEQ2m4uJiFBYWwtfXF0FBQfD09OT7Fo1IS5YsQVFRER566CFceumlcHV1xe7du/H444+joaEBN910E6ZOnYrLL78cra2teOqppzB37lwolUp8//33eOqpp6DX67Fy5UpkZ2fbJf6ZzWZcfvnl2Lt3L4D26qR33nknoqKiUFJSgrfeegtfffUVMjIycNFFF+HIkSM2d70B7XfsLVy40JrAtHTpUqxcuRL+/v44efIk/v73v+Ptt9/GiRMnBueH1gWTyQQ3NzdcdtlluPDCCxEfHw8PDw9UVFQgLS0NL7zwAgoKCvDMM89g7NixWLVqlXXbadOm4fjx4/j3v/+NRx99FADwww8/IDg42OYYnasz6fV6zJ8/H4cOHYJcLseyZcuwcOFCREVFwWg04n//+x/+/ve/o6KiAgsXLsThw4ftEsUKCwutCUwymQyrV6/G4sWLodPpcOzYMTzzzDNYu3Ytpk6dOoA/OSIaqWL8tVh7RQIe/Py4day+1YjvT5Thpjn21eaIiIhGqs53rp/9nedsnW8uZtUGIhqJLBYLMjIyrI+VSqU1oanj787LSqXSZnuDweB0371NiDo7rr6s687Z1ZA6MxgMMBqNDpOUOv42Go19PjYR0VDGJKYBEhMTg8OHD+Pll1/Gp59+ipycHBgMBoSFhWHhwoX4wx/+4PSO8t6yWCzYvHkzAMDT0xNXXHFFj7dduHAh3nzzTezduxeHDx9GeXk5qqurIYoivL29MWnSJFx66aVYuXIlPDw8+iVeosDAQFRXV6O6uto6VlNTg9LSUrsLckREQ4UoiigrK4MoiqisrERlZSXCwsIQHR0tdWijmsUiorbF+QmKkcjLVQWZbGCT544cOYJdu3Zh+vTp1rGpU6ciNjYWl19+ORobGzF9+nSIooj9+/djzJgx1nkpKSnw9fXFHXfcgcLCQnzzzTd27YhfffVVawLT9ddfj02bNlkTApOTk7Fo0SI88sgj+Nvf/obc3Fw8+eSTePbZZ2328eSTT1rvPn7ooYfw5JNPWk/+JCcnY/Hixbj88sutVUWllJSUhKKiInh6etqtu+SSS3DnnXfi8ssvx48//ognnngC119/vfW5uLm5YcKECUhNTbVuM3bsWERGRjo93l/+8hccOnQInp6e2L59O5KTk23Wz5kzB8uXL8fMmTNRWlqKhx9+2Pp9osN9991nrcD0/vvv47rrrrOumzp1KpYsWYLzzjvPJi4iot5YOjUM/8uuwjfHSqHVKPDsNROxMDFI6rCIiIgGVee2Sd1Vfe5cQaS1tbVXx+muclNpaSlSUlIAACtWrEBISEiv9t9XTU1N1koBK1as6DaRi6gn+LoaPToqEXX8GT9+vNP30uzsbJhMJoiiCIvFYv0jimK3x5k0aZK1ct7Zr6mTJ0+iubnZbpuOlnRnt6br/Cc0NBQLFixweExRFHnz7AjG9ykaCFK9roqLi/utu0AHJjENIDc3NzzwwAN44IEH+rR9T35xAu3Zw70tH9vB398fN954I2688cY+bU/UF4IgYOzYsUhNTbXJFM/NzYWnpydcXV0ljI6IyLGamhq7/uZ+fn4SRUMdalsMSP6r82qSI9HBR+fDx71n5a/76p577rFJYOpw2WWXISIiAgUFBaisrMQrr7xik8DUYdWqVbjvvvvQ1taGn376yS6J6eWXXwbQ/n/opZdecnhS5oknnsAXX3yBzMxMvP766/jLX/5iPWlvMBjw5ptvAgASEhJw55132m2vVCrx5ptvIjo6WvI703x9fbtcr1KpsG7dOiQlJaGgoABHjhyxSzzqqaamJuvP98knn3S6n4iICPz5z3/G7bffjk8//dSmbXRZWRm+/PJLAMDll19uk8DUQavVYuPGjQ5fJ0REPSEIAp6+OhEyQcADl8QhzJvfA4mIqPf64wLv22+/jZUrV557MH2g0Wisy11VEAFgc06it62LumtV15lWq5XkhmZ3d3feSE39jq8r6uDs/EjnhCaz2ezw787Xa89+TSUkJEAURchkMsjlcpskJaKe4PsUDYTBfF113Ajbn/gOSkSSUKlUiIuLsxmzWCzIzMzscQIfEdFgEUXRLmHY3d0dWq1WooiIBta1117rdN3EiRMBtF8s+N3vfudwjouLC2JjYwEAp06dsllXUlJiLQ2+dOlSp/+PFAqFta1abW0tDh06ZF138OBB1NbWAmhvfefswkVXd7RJSa/Xo7CwEOnp6Thx4gROnDhh8/nn6NGjfd73rl27rH3IFy9e3OXc888/H0B7a9+DBw9ax3fs2AGz2QwANq3tzpaSkoLx48f3OVYiIg+NEi9eN5kJTERENGp1/j7UXYu4zpU+WLGBiKh/yGQyKBQKqFQquLi4wM3NDR4eHvD09ISPjw/8/PxsEk7P5urqCjc3N7i4uEClUkGhUDCBiYjoHLESExFJxsfHB8HBwSgpKQHQXhI5OjqaJTKJaMgpLi62JgV0CApiuxMaucaOHet0XUdLNF9fX3h5eXU7r7Gx0Wb8xIkT1uXuqvh0Xn/ixAnMnDkTAHD8+HHreFJSUpf7SElJwTfffNPlnMHQ3NyMF154AR999BHS0tKsSUKOVFVV9fk4ndu79eZ9qqyszLrc+ec7bdq0LrdLSUlBWlpaLyIkIiIiIuo/HTdInAspv993rpDU0arImc43V4WFhQ1YTEREREREUmISExFJKjo6GnV1dXB3d0dsbCwUCr4tEdHQ0tzcbFdJRq1WIyAgQKKIiAZeV61dO+4m6679a8e8s5N1ampqrMv+/v5d7iMwMNDhdp2XfXx8utzHUPi/mp+fjwsvvBB5eXk9mt/a2trnY1VUVPRpu5aWFutyb/6NhsLPl4hGrjajGRqlXOowiIhoCIuPj5c6hHMyduxYyOVymM1mZGZmdjm38/px48YNdGhERERERJJgtgARSUoul2Py5MlMXiKiIclisSAjI8OuzWVcXBzkcl5QGwq8XFU4+Oh8qcMYVF6uKqlD6Df9UX1xOFRwXLFiBfLy8iAIAlatWoVrr70W48aNg5+fH1QqFQRBgMVisb6vnEtr3c5JY4cOHYJSqezRdp3vAO9sOPx8iWhk2nK0BH/ZmoZ3b5yOhGAPqcMhIiIaECqVCikpKdi7dy/27t0Lg8EAlcrxd75du3YBaL+xaurUqYMZJhERERHRoGHWABFJjglMRDRU5efno7m52WYsNDS0yxZaNLhkMgE+7mqpw6Be8Pb2ti6Xl5d3Obdzi7PO23X+P1hVVYUxY8Y43Ud3xxAEAaIowmKxdDnv7PeCnsrMzMTu3bsBAA8//DD++te/OpzXufrRuehcmcrPz89pclJXOv98y8vLu2xV0d3Pl4iot1oMJqzdkoZPUttb6tz14SFsvWsOXFX83khERCPTb3/7W+zduxcNDQ344osvcO2119rNKSoqwvbt2wEAF110EbRa7WCHSUREREQ0KGRSB0BE1JVzqURARHQu6urqcPr0aZsxNzc3REVFSRQR0cgwYcIE6/K+ffu6nLt//36H2yUmJlqXjxw50uU+Dhw40OX6jpP/tbW1TueIooicnJwu9+NMWlqadfl3v/ud03mpqald7qenFZEmT55sXd6zZ0+Ptjlb559vdz+/7tYTEfXW23vyrQlMAJBb2Yy/bHyidpEAAGPVSURBVE2XMCIiIqK+y8/PhyAIEAQB8+bNczjn5ptvhk6nAwD83//9H6qrq23Wm81m3H777daqq/fff/+AxkxEREREJCUmMRHRkGU2m3Hs2DEUFBRIHQoRjTImkwlZWVk2Y4IgID4+HjIZPz4RnYvg4GCMGzcOAPDJJ5+gqanJ4Tyz2YxNmzYBaK8MNGXKFOu65ORka7Wgzz77zGnSc3FxMbZt29ZlPB2JiV0lEX333Xeoq6vrcj/OmEwm63JX1ZxeffXVLvej0Wisy3q93um8+fPnw9XVFQDwwgsv9Ckh/IILLrC2tnvnnXeczjtw4ABOnDjR6/0TEXXl5vOiMCHEtn3cRwdOY+vREokiIiKi0SonJwebNm2y+dPx/aWpqcluXedKsr3h7e2NZ599FgBQUFCA6dOn4+2330Zqaiq2bNmCiy++GFu3bgUAXHfddU6ToYiIiIiIRgJehSOiIclsNuP48eOoq6tDfn4+CgsLpQ6JiEaR3NxctLW12YxFRkbC3d1dooiIRpY77rgDAFBZWYm7777b4ZwnnngC6entlTduueUWqNVn2gaq1WqsWrUKQHulow0bNthtbzKZcMstt8BgMHQZy9y5cwG0V4VyVLmorKwMd911Vw+elWOxsbHW5Y6krLO98sor+Pe//93lfoKCgqzLubm5Tud5enrizjvvBAD8/PPPuPfee7tslVdeXo433njD7lhXXnklAGDLli345JNP7LZramrCmjVruoyZiKgv1Ao5Xrh2MlxVcpvxh784jpPljRJFRUREo9Hu3buxatUqmz8dVZKqq6vt1mVmZvb5WGvWrMFjjz0GQRCQm5uLG2+8EdOmTcOVV16JHTt2AAAWLlyIt956q1+eGxERERHRUMUkJiIackRRxPHjx1FfX28dy8vLs2vrREQ0EKqqquzuntTpdAgLC5MoIqKR59Zbb8XMmTMBAG+//TYuuugifP755zh06BC++eYbXHPNNXjyyScBAGPGjMGf//xnu3089thjCA0NBQA89dRT+P3vf4/vv/8ehw4dwkcffYRZs2bhu+++w9SpU7uMZfXq1VAoFBBFEYsWLcI///lPpKam4ueff8a6deswefJk1NfX2yQj9cbkyZOtrfBee+01/O53v8PXX3+NgwcP4t///jeWLFmC22+/HbNnz+52Px3VmP785z/jxx9/xMmTJ5GTk4OcnBy0trZa5/7lL3/B9OnTAQD/+te/MGXKFLz88svYs2cPjhw5gh07duCll17Cb3/7W4SHhzusAvX8889bW+0tW7YMd9xxB3bs2IGDBw/i7bffRnJyMg4fPtztz5eIqC+i/dzx5JUTbMYa9SZct/EXZJQ2SBQVERHRwHriiSewe/duLFu2DGFhYVCpVPD398fFF1+MDz74AN98841NhVYiIiIiopFIIXUARERnEwQBfn5+NklMAHDq1CkIgmC9YElENBBqa2ttHsvlcsTHx0MQBIkiIhp55HI5vv76a1xxxRXYs2cP/vvf/+K///2v3bxx48bhu+++c1gFTafT4ZtvvsHFF1+MiooKfPTRR/joo49s5qxcuRJz5861Vm1yZPz48Xjuuefwxz/+EbW1tbj33ntt1nt7e+Orr77Cn//8Z2RnZ/f6uQqCgPfeew8XXnghamtr8cknn9hVNkpMTMSnn36K4OBgp/vRarW4++678dxzz+HQoUNYsGCBzfodO3ZY20qo1Wr8+OOPWLlyJb744gscPXrUWp3JEQ8PD7uxyMhIbNmyBVdccQUaGxuxYcMGu4pXHXeKd9WKj4ior65JDsXunCp8ebjYOlbdbMB1r/+C92+ajgkhOgmjIyKi0WDlypVYuXLlOe0jMjKyVy2eZ82ahVmzZp3TMYmIiIiIhjNWYiKiISkkJARjxoyxG8/NzUVxcbGDLYiI+kdsbCzGjRsHuby9hUlMTAzvdCQaAN7e3vjf//6Hd999F5deeikCAgKgVCrh4+ODefPm4aWXXsKRI0cQERHhdB/jx4/Hjh07cPvttyM2NhZqtRq+vr644IIL8MEHH+Dtt9/uUSz33nsvvv/+e1xyySXw8vKCWq1GVFQU7rjjDhw+fBjnnXfeOT3XpKQkHDlyBLfeeisiIiKgVCrh7e2NlJQUrF+/Hvv377dpF+fMM888g9dffx3nnXcevL29re9Tjmi1Wnz++ef46aefcPPNNyMuLg5arRYKhQLe3t6YNm0a7rjjDnz77bf48ccfHe5j3rx5SEtLw2233YaIiAioVCoEBATgsssuw/fff48nnniizz8TIqKe+OtvJyA5wstmrK7FiOte/wWHC2udbEVERERERERERMMVKzER0ZAVGhoKURRx6tQpm/GcnBwIgtBltQIionPh7+8PDw8PlJeXIyAgQOpwiAbF2rVrsXbt2m7nbdq0CZs2bep23s6dO7udI5PJsGLFCqxYsaL7AJ3w8vLCo48+ihdeeMFhUk9P756+5JJLcMkllzhd39Xz6cnd1eHh4XjllVe6nNPdPgRBwM0334ybb765y3mdzZkzB3PmzOnx/LOFhYXZVWDqrKevm6705s50Ihpd3NQKvHNjCm7cdAD782qs441tJqx4cz/eXjUN0yK9JYyQiIiIiIiIiIj6EysxEdGQFhYWhqioKLvx7OxslJaWShAREY0WGo0GERERbCNHREREJCF3tQKbVk3D7Bgfm/EmvQk3vLUfe3OrJYqMiIiIiIiIiIj6G5OYiGjICw8PR2RkpN34yZMnUVZWNvgBERERERER0aBxVSnw5g3TMHesn814i8GMlW/vx0/ZlRJFRkRERERERERE/YlJTEQ0LERERCAiIsJuPCsrC+Xl5RJEREQjhcVikToEIiIiIuqGRinHxuuTMX+cbatfmSBArbBvJ0pERERERERERMMPk5iIaNiIiIhAeHi43XhmZiYqKiokiIiIhruGhgbs27cPVVVVUodCRERERN1QK+TYsHwKfjMh8NfHMrx5w1SkRHlLHBkREREREREREfUHJjER0bAhCAIiIyMRGhpqty4jI4NJCETUK2azGZmZmTAYDEhLS0NWVhZMJpPUYRERERFRF1QKGV68bjIWJ4di4/VTMSvGV+qQiIiIiIiIiIionyikDoCIqDcEQUB0dDREUURxcbF1XKVSwdXVVcLIiGi4OXXqFFpbW62Py8rK4OrqirCwMAmjIiIiIqLuKOQyrF8ySeowiIiIiIiIiIion7ESExENO4IgYMyYMQgJCQEAqNVqJCUlMYmJiHqspqYGJSUlNmNardb6vkJEREREw1teVbPUIRARERERERERUS8xiYmIhqWORKaIiAgkJSXBxcVF6pCIaJgwGo3IysqyGZPJZIiPj4dMxo9GRERERMPdJwdO46Lnd+LD/YVSh0JERERERERERL3AdnJENGwJgoDIyEipwyCiYUQURZw8eRIGg8FmPDo6mtXciIiIiEaALw8X4cEvjkEUgYe+OA6j2YLrZ0ZKHRYREREREREREfUAyw0Q0YjV1taGiooKiKIodShENERUVFSgqqrKZszLywvBwcESRURERERE/SWjtAH3fXIUnb8CPvbvNLzx0ynpgiIiIiIiIiIioh5jEhMRjUiiKCIrKwsZGRlIT0+3q7pCRKNPW1sbsrOzbcYUCgXi4uIgCIJEURERERFRf4kP1OLOC2Ptxv/6TQZe3pEjQURERERERERERNQbbCdHRCNSSUkJ6urqAABVVVWor69HbGws/Pz8pA2MiAaVKIpoampCVVUVysvLYTabbdaPHTsWarVaouiIiIiIqD8JgoA/XjwWKrmA9dtO2qxb90MWimpb8dDCeHholBJFSEREREREREREXWESExGNOAaDAadO2bYLMBqNSE9Ph7+/P2JiYqBU8qQ10UhnNBpx6NAhtLW1OVwfEBDAxEYiIiKiEejOC2OhUsjwt28zbcY/3F+I/2aW48krJ2DB+ECJoiMiIiIiIiIiImfYTo6IRhyVSoX4+HgoFPZ5mhUVFUhNTUV1dbUEkRHRYFIqlZDJHH/UUavViImJGeSIiIiIiGiwrD5/DB5flGA3Xt6gx+r3DuL2zQdR0eA42Z2IiIiIiIiIiKTBJCYiGpH8/Pwwbdo0+Pj42K0zGAw4ceIEsrKyYDKZJIiOiPqDxWJBTU1Nl0mJvr6+dmNubm5ITEx0mOhIRERERCPHqtlRWLd4IlyUcrt13x4vw0V/34WP9hdCFEUJoiMiIiIiIiIiorPx6h0RjVgqlQrjx49HRUUFsrOzYTabbdaXlZWhtrYWcXFx8PLykihKopHHYrFY/5jNZpvHLi4uUKlUDrczmUyQyWQQBAGCIDjdd01NDaqqqlBdXQ2TyQQ3NzeHCYtAe0JjYWEhNBoNfH194efnB61W63T/RERERDSyLJkahhnRPnjkqxP438lKm3WNbSb83xfH8dWRYmxYngxvN8efU4mod0RRhMFsgd5kQZvRDD93tcPvYBWNbdibWw2TWYTRbIHRIsJktrQvm8VO4xaYzO3rDL/+bbKIeOg38fD30EjwDImIiIiIiGigMImJiEY0QRAQEBAAT09PZGVloba21ma9Xq/HsWPHEBwcjOjoaMjl9nfoEo1Eoihak4zMZjNMJpN12Ww2w9vb22GlIr1ej8zMTKeJSmcnC57t/9u77/CoqvyP45/JTJJJD0noJdRQBBUJKAoSpK0IKioqLFIUsevyc1fdooCsBWHdXbuuSGyAIlURpSNVulKl19AD6XVyf39kczchM5OETDKBvF/PM09u7jn33HMz39wp93vPadWqlWrXru20bM2aNeZd8BaLxUxo8vHxMZezs7OL7SMtLU0ZGRkKCAgo1mZQUJA6dOigoKAgEpcAAACqqYYRgfp0REfN3Zqgcd/u0Pn0nCLlGdkOhQX4eql3gPcYhqH0bIfSsnKVkeNQdGSQ03q/HrugeVsTlJadq7Ss/Ppp2bnKyMlTVo5DmTkOZebkKSs3/2dmrkOFBzjbNra3QuzF/8f2nUrVM9O3XnL/H49rRhITAAAAAFxhSGICUC34+/urXbt2OnnypPbv318sCSIhIUGJiYlq1aoViQ64bBRO+LlYRkaGEhISlJOTo9zcXOXk5BRLVnI3bcZ1112nkJAQp/u8cOHCJffZx8f5TLaGYRTpj2EYJSZEFXbmzBk1atSo2HqLxaLg4OCydxQAAABXFIvFojvb11fXFlH6+/xdmr3luCTJ5mPRa3ddLasPnwNx+TuVnKn9p1N1ISNHF9JzdCEjW0kZOUpK/9/vF9JzlJyRo+TM/ESkgo9hflYf7XnlVqftHjiTpo9XHbzkfmXm5CnESa6Rzer882Fp5TiYChIAAAAArjQkMQGoNiwWi+rWrasaNWrot99+K5aIkZmZqaSkJIWHh3ulf0BB4k52dnaRR2pqqpo2bSqbzaY9e/bIMAwzMen666+Xv79/sbZycnJ07NixS+6LqwQiV0lIpeUqSdBdQlVJQkJCnP4NAAAAgItFBvvrn/ddqzvb19dfZm3THdfWU5t6od7uFmAyDENp2Q6dTcnS2dT8x5nUbPN3q49FL9/R1um23/16QuO/23lJ+8125Ck7N09+tuKf+YL8y/cVcmaO88+XNmv5kgdz8/LKtT0AAAAAoOohiQlAtWO323X11VcrISFBBw4cUN5/v/QKDQ1Vw4YNlZKS4uUe4krjcDjM6dAulpSUpP3795sJS66SeWrVqiUpf+q0wnJzc50m8DibCq4scnNzna6/1CSmgmnhXE3ZmFfGL5/DwsIUFRWlqKgo2e1MHwDAtfj4eI0YMUKSdPDgQTVu3Njj+zh06JCaNGkiSZoyZYqGDx/u8X1UVWPHjtW4ceMklS8hFQAqW7eYmlr0fzfLx81IvL8cvaDz6dmKa1mrEnuG6mBnQrI2HEr8X5JSSra5fDY1S5k5rj8fhdptLpOYyjstYlpWrvxsfsXWB/k7/xxXWlm5zpOYgv1talk7RDarRb5WH/laLbL5+MjX5iNfn/x1RcqsPvKz+sjmk78cGczNLAAAAABwpSGJCUC1ZLFYVL9+fXNUptTUVLVs2ZKp5FBmDodDWVlZbh+5ubm68cYb5evr/Avl8iTO5eTkOF3val/u2Gw2Wa1W2Ww2l8lKVqtVzZo1k4+Pj5mUVLB88e+Fl0v637Jarbr++uuVl5cnwzCUl5fndNlisSg0NFR+fsW/WAcAAADKItDP9ddi2bl5+tM3v2jPqVQNaF9fL/Zro4gg3oPCuRxHnk4lZ+pkUqYSkjJ1MilDeYb0aLdmTuv/tPeMXl+w+5L2lZyZq6xch/xtxROLwsuZxJSalasaTuK8XliA7r6ugYL9rQryt+U//KwK8LPK7muVv80qf18f2W1W2X19ZPctWJ+/7Cq5KqZ2iH4cfXO5+gwAAAAAuLKQxASgWgsMDNS1116r1NRUBQYGOq2Tm5ur7du3q3bt2qpVq5bLkWRwZcvIyNCZM2eKJCdlZma6HLHoYtnZ2U4Ti8qbjONq/zabTbVr15bNZpOvr69sNluRJKXCPwuSjUqTxGexWNSgQYNy9dlVu4yoBACuVcaIUgCA//lwxX7tOZUqSZq95biW/3Zaz/RooQHtGygssHyJIri8GIahC+k5Ono+XUcTM3TsfLpOJGXqRFLGf39m6mxqli4ekLBGoK/LJKaoco4gdC41W/XCA4qtrxHkp4ggP4UH+Co0wFfhgb4KD/BVeKBf/u8F6wJ9FWr3VZC/TcEFSUn+VqeJUZLUOCpI/7j3mnL1GQAAAACA0iCJCUC1Z7FYFBIS4rL89OnTSkpKMqf9ql27turWravg4OBK7CUqgmEYysnJUWZmpjIzM5WRkaGGDRs6HYUoKytLBw8evOR9ZWdnKygoqNh6V0lMVqtVfn5+8vPzk8Vi0a5du5Sbm6vOnTsrJCTETEpylXxnsVjUqlWrS+4vAAAAUF0dOZeut5fuK7LufHqOxn67U69+v1u92tTW3R3q6+YWNWWzXtp0y7g8fLrmkCb++JtSs0p380ph59NzlJnjkN23eGJQVHDpbmYJ9LMqKthfUcF++T9D/BUV7C9/m/O46xBdQ5tf7FXmvgIAAAAAUFWQxAQAbhiGoRMnTpi/OxwOJSQkKCEhQaGhoapbt65q1qzJ6ExVWG5urjIyMsxEpYsfeXl5RerXrFnTaWKQv3/57pTNzs52ut5qtSomJka+vr5m0pKfn1+RRKrk5GT98MMPZv9CQ0PL1RcAAAAArjWoEaBxd1ylV7/fpZTMoskr2Y48zd92QvO3nVDNEH8NaF9fd1/XQC3ruL4xBt6X48jT8fMZOpyYriPn0nTsfIY5slJWrkMLR3dzul2Ar/WSEpgKnEzKVOOo4jezNKgRoNjoGv9NTPpvgtJ/HzVD/FQz2K6oED+3Ux4CAAAAAHAl4pMwALiRkZGh1NRUp2XJyclKTk42R2eqV6+ey1FxUHnS09N16NAhc2Sl0k73ViAzM/OSkpisVqv8/f3l7+8vu90uPz8/2e32IutcqVu3bpn6CAAAAKDi+PhYNKhTI/VoVUtj5u3Qgu0nndY7k5Klj346oI9+OqB29cN0T4cGuv2aeqoRVL4po3Fp0rNzdfhcug6fS9eRxDQdOpeuI+fSdTgxTQkXMuXIM1xu62rEpAYRxadsc8fu66N6YQGqE2ZXnTC7rD7Op+xuXitE3zx2Y5naBgAAAACgOiCJCQDcCAgIUNu2bZWQkKDExESndXJzc3X8+HEdP35cYWFhqlevnqKiopxOSYZLk5eXV2TKt4yMDDVq1MjlVGxnzpy55H1lZmY6Xe/j42OOulWQmFT4YbPxkgrg8jZ27FiNGzdOUv5IhMnJyXrzzTc1c+ZMHTx4UIGBgYqNjdXf/vY33Xjj/y66nT59Wm+99ZZmz56tQ4cOyW63q0uXLho7dqzat2/vdp95eXmaOnWqpk6dqs2bNysxMVFhYWFq27atBg4cqJEjR7o81xe4cOGC3n33XS1evFiHDx9WSEiIrr76aj3yyCMaOHBgicdtseRfXBwzZozGjh3rsl5cXJxWrFihbt26afny5SW2e7Ht27drzpw5WrlypXbs2KEzZ87I19dXdevW1Y033qjHHntMN9xwQ7Htli9fru7duxdZ16RJk2L1li1bpri4uGLr58yZoy+//FI///yzTp8+LbvdrubNm6t///56+umnVaNGDbf9PnbsmF577TUtWLBACQkJioiIUGxsrJ5++mn17NmzbH+EEkydOlUfffSRfvnlF+Xk5Khx48a6++67NXr0aIWHh5f6uQIAT6kVatf7Qzpo9b6zmvrzES3aeUrZjjyndbcdT9K240n6+/yd+ud916rf1fUqubfV29cbj+q5b3695O2PX8hQs5rFp4xvWON/N7hYfSyqG2ZXgxoBqh8eqHrh+YlKBUlLdcPsCgvwNV+vAAAAAABA2XHFFQDcsFgsioyMVGRkpDIzM3XixAmdPHnS5dRgSUlJSkpKkq+vr2rXrq0mTZqQzFQKhmEoJyenSKLSxdO+XSwyMtLphW13Ix65YrFYZLfbZbfb5evr67JemzZtytw2AFyOjh49qp49e2rPnj3murS0NC1YsEALFy7UtGnTNHDgQP3666/q27evjh8/btZLT0/XvHnz9OOPP2rBggXFEnAKJCYm6vbbb9fq1auLrD979qyWL1+u5cuX65133tGCBQsUHR3ttI1du3apV69eOnnyfyNkZGZmasmSJVqyZIlGjBihm2++uTx/Co9wlogk5U81um/fPu3bt0+fffaZXnjhBb322mse2ef58+d1zz33aOnSpUXWZ2VladOmTdq0aZPee+89zZ0712nylCStXLlS/fr1U3JysrnuxIkT+vbbb/Xtt996LJEoNzdXgwcP1owZM4qs37Fjh3bs2KEvvvhCixcv9si+AOBS3NQ8Sjc1j9KF9Gx9+0uCvtl8XL8cveC0bo7D0LUNwyu1f1eSHEeeEi5k/Hc0pXQdTUw3l49fyNCGv/aUn634Z+y6YWX/HFjY0cR0p0lMdcPsmjryejWMCFSdMLt8rXy+BwAAAACgIpHEBAClZLfb1aRJE0VHR+vcuXM6ceKEzp8/77RuTk6OTpw4oaZNm1ZyLy8fOTk5+u2338ykpbw853c0u5KRkeF09AgfHx/5+/srKyuryPqCKd2cPfz9/blbFgAKGThwoI4dO6Y///nP+t3vfqfAwECtWrVKY8aMUXJysh566CHFxsaqX79+ysjI0CuvvKJu3brJ19dXP/zwg1555RVlZWVp+PDh2rt3b7GkU4fDoX79+mnt2rWSpG7duunJJ59UkyZNlJCQoE8++URz5szRrl271KNHD23dulXBwUUvLCYnJ6tv375mAtO9996r4cOHq1atWtqzZ4/efPNNTZkyRdu3b6+cP5obubm5CgoK0m233aZbbrlFrVq1UmhoqE6fPq0dO3borbfe0uHDh/X6668rJiZGI0aMMLft2LGjtm3bprlz5+pvf/ubJOnHH39UvXpFR/goPDpTVlaWevbsqc2bN8tqtWrw4MHq27evmjRpopycHP3000968803dfr0afXt21dbtmwplih25MgRM4HJx8dHo0aN0j333KOwsDD9+uuvev311zV27FjFxsaW++/zxz/+0UxgatmypZ577jldffXVSkpK0owZM/Sf//xH9913X7n3AwDlFR7opwc6N9YDnRtr3+kUfbPpuGZtPqbTKf/77HFjs0g1qOF8mvFVe88qx5GnmDohqhdmr7afQbLyfLTzRIrOHUrT4cQ0HU3MT1I6fC5dCRcy5GbWNyVcyFDjqKBi66Mjiq9zJizAV9GRgWoYEagGNQLUsEb+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/Ad55JFHnNZxOBxG69atzX8Sd1/QAmVxKSf+xx57zNxm7dq1TuusXbvWrPP44497sMeoTr799lszjp566imndYhHVKaWLVsaUv60chebMGGCGWfTpk1zuv3Ro0fNEZ369u1b0d3FFeTw4cPmXZPLly83xowZU+IXzZwf4Unl/bKJeIQnORwOc5qMa665ptjF99IgJlFZHA6HOcpscHCwkZaWVqwO8QhPGj16tBkr8+bNc1lvwIABZr1ff/21SBkxCVS+ikhi4nuK6iM7O9tMWGvdurXL6bkeeeQRMybWr19/SfsiienyVlnXI3kvUX1UVkyRxFS9VVQS06233mom4B09etRpnWnTprlNEq4MPgK8YM6cOebyiBEjnNbx8fHR0KFDJUkXLlzQsmXLKqNrQDGGYWju3LmSpFatWumGG25wWu+GG25Qy5YtJUlz586VYRiV1kdcObp3724u79+/v1g58YjKFhISIknKzMwsVlbweh4aGqq77rrL6fYNGjRQz549JUlLlixRSkpKxXQUV5wnnnhCqampGjZsmLp161Zifc6PqEqIR3jawoULtXfvXknS888/L5vNVqbtiUlUpiVLluj48eOSpHvuuUeBgYFFyolHeFp2dra53LRpU5f1mjVr5nQbYhK4cvA9RfWxbNkyJSUlSZKGDRsmHx/nlzuHDx9uLs+ePbsyuoYqpjKuR/JeonrhGjcuVykpKVqyZIkkqWfPnmrQoIHTenfddZdCQ0Mlee+1kyQmeMWqVaskSUFBQerQoYPLeoUvWK1evbrC+wU4c/DgQSUkJEhSiRdRC8qPHz+uQ4cOVXTXcAXKysoyl61Wa7Fy4hGV6bffftPWrVsl5X8ALyw7O1vr16+XJHXu3Fl+fn4u2ymIxaysLG3cuLFiOosrytdff63vvvtOERERmjRpUqm24fyIqoR4hKfNmDFDkmSxWNSvXz9zfWJiovbu3avExES32xOTqEyfffaZuVzwxX1hxCM8reBioCQdOHDAZb2CG4UsFotatGhhricmgSsD31NULwXXmCT35+7Y2FgzoZprTNVTZVyP5L1E9cI1blyuNmzYYN7M4e5c5efnZyZjbtiwQTk5OZXSv8JIYoJX7Nq1S5LUvHlzt3eQFr5gWrANUNl27txpLl98Ef9ixCzKa8WKFeZy69ati5UTj6ho6enp2rt3r9588011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unSprFarHnjgAU2bNk3r1q3TypUr9corrygyMlKnT59W3759i43+VJG2bdumwYMHq3bt2nrnnXe0bt06rV27VmPHjpXdbpfD4dCoUaN05syZYts+9dRTZgLTkCFDNGvWLK1bt04bNmzQvHnz9NJLL+maa66ptGMBAAAAAAAAAKAqYSQmAAAAAKW2d+9etWjRQqtXr1bNmjXN9V26dJHNZtOkSZO0evVq3XbbberUqZMWLVqkwMBAs15cXJwyMzM1Y8YMzZw5U2fOnCnSjiS9/PLL2rx5s8LDw7V48WJ16NChSHmXLl30+9//Xp07d9aJEyf0l7/8RV9++WXFHvh/bd68WR06dNDSpUsVGhpqrr/hhhvUvHlzDRkyRMnJyfriiy80evRoszwzM1Pz5s2TJD377LNOR1rq37+/xo0bp8TExIo/EAAAAAAAAAAAqhhGYgIAAABQJm+99VaxxCNJevzxx83ls2fP6uOPPy6SwFTgsccekyTl5uZq7dq1RcpSU1P17rvvSpLGjx9fLIGpQHR0tF588UVJ0owZM5SWlnZpB3MJPvnkkyIJTAUGDx5sTo+3cuXKImWJiYnKycmRJN18881u24+IiPBQTwEAAAAAAAAAuHyQxAQAAACg1MLDw9WnTx+nZU2aNFFISIgk6eqrr1br1q2d1is8ZdqBAweKlK1YsUJJSUmSpHvuucdtXwqSgXJycrRp06bSHUA5tWvXTldffbXTMovFovbt20sqflyRkZHy8/OTJH3++efKzc2t2I4CAAAAAAAAAHCZIYkJAAAAQKm1aNFCFovFZXl4eLgkKSYmpsQ6kpSSklKkbOPGjeZy3bp1ZbFYXD7atm1r1j158mQZj+TStGrVym15wShKFx+Xv7+/7rvvPknSN998o+bNm+u5557T999/rwsXLlRIXwEAAAAAAAAAuJyQxAQAAACg1JxND1eYj49PifUK6kiSw+EoUnb69OlL6ld6evolbVdWpT3+i49Lkt555x31799fknT48GFNnDhRt912myIjI9WxY0dNnDjRHIUKAAAAAAAAAIDqxubtDgAAAABAgcLJP5s3b5avr2+ptmvQoEFFdcljQkNDNW/ePK1fv15ff/21li9frq1bt8rhcGjjxo3auHGjJk2apDlz5qhz587e7i4AAAAAAAAAAJWKJCYAAAAAVUZkZKS5XLNmzcsiOamsOnXqpE6dOknKn3Zu+fLlio+P16xZs3T69Gndfffd2r9/vwICArzcUwAAAAAAAAAAKg/TyQEAAACoMtq3b28ur1692os9qRwhISHq37+/Zs6cqaefflqSdOLECa1atcrLPQMAAAAAAAAAoHKRxAQAAACgyujZs6cCAwMlSW+99ZYMw/ByjypPjx49zOWzZ896sScAAAAAAAAAAFQ+kpgAAAAAVBnh4eF68sknJUlr1qzR6NGjlZeX57L+qVOn9PHHH1dW9y7ZgQMHtGLFCrd1Fi5caC43adKkorsEAAAAAAAAAECVYvN2BwAAAACgsJdfflkrVqzQzz//rH//+99avny5Hn74YV177bUKCgrS+fPntWPHDi1evFgLFixQu3btNHLkSG93260jR46oe/fuatOmjQYMGKDY2FjVr19fknT06FF99dVX+vrrryVJ1157ra6//npvdhcAAAAAAAAAgEpHEhMAAACAKsXf31+LFi3S8OHDNWvWLP3yyy/m6EzOhIaGVmLvymfnzp3auXOny/JWrVpp1qxZslgsldgrAAAAAAAAAAC8jyQmAAAAAFVOSEiIZs6cqVWrVunTTz/VypUrlZCQoIyMDIWGhqpZs2bq1KmTbrvtNvXu3dvb3S1R165dtXz5cv34449at26djh49qlOnTikzM1MRERG65pprdNddd2n48OHy9/f3dncBAAAAAAAAAKh0FsMwDG93AgAAAAAqW+PGjXX48GENGzZM8fHx3u5OqS1fvlzdu3eXJC1btkxxcXHe7RAAAAAAAAAAAB7ASEwAAAAAqrULFy5o+/btkiQ/Pz/FxMR4uUfFnT59WqdPn5YkHTx40Mu9AQAAAAAAAADA80hiAgAAAFCtzZ07V3PnzpUkRUdH69ChQ97tkBPvvfeexo0b5+1uAAAAAAAAAABQYXy83QEAAAAAAAAAAAAAAAAA1ZvFMAzD250AAAAAAAAAAAAAAAAAUH0xEhMAAAAAAAAAAAAAAAAAryKJCQAAAAAAAAAAAAAAAIBXkcQEAAAAAAAAAAAAAAAAwKtIYgIAAAAAAAAAAAAAAADgVSQxAQAAAAAAAAAAAAAAAPAqkpgAAAAAAAAAAAAAAAAAeBVJTAAAAAAAAAAAAAAAAAC8iiQmAAAAAAAAAAAAAAAAAF5FEhMAAAAAAAAAAAAAAAAAryKJCQAAAAAAAAAAAAAAAIBXkcQEAAAAAAAAAAAAAAAAwKtIYgIAAAAAAAAAAAAAAADgVSQxAQAAAAAAAAAAAAAAAPAqkpgAAAAAAAAAAAAAAAAAeBVJTAAAAAAAAAAAAAAAAAC8iiQmAAAAAAAAAAAAAAAAAF5FEhMAAAAAAAAAAAAAAAAAryKJCQAAAAAAAAAAAAAAAIBXkcQEAAAAAAAAAAAAAAAAwKtIYgIAAAAAAAAAAAAAAADgVf8PpxRSvCqtZtgAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "b = [1, 2, 1]\n", - "a = [1, -1.5432913909679857, 0.6297148520559599]\n", - "\n", - "# import numpy as np\n", - "# http://jaggedplanet.com/iir/iir-explorer.asp\n", - "# low pass\n", - "# b = np.array([1, 2, 1])\n", - "# a = np.flip(np.array([0.277023226134283,-0.7651127295946996,1]))\n", - "# high pass\n", - "# b = np.array([1, -2, 1])\n", - "# a = np.flip(np.array([0.7466573279103673,-1.7095165404698354,1]))\n", - "\n", - "dp = FluxPulse(0, 80, 0.9, IIR(\n", - " b=b, \n", - " a=a,\n", - " target=SNZ(30, b_amplitude=1)), \n", - " 0, 200)\n", - "dp.plot()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### eCap Pulse Shape" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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iy66SFu3bpUkLVq0SLfddpvCwsJUWFiof/7zn3r77beVlZWl8847Tzt27FBwcLBbfFarVRdccIErgenKK6/UihUrFBMTo+zsbD322GNat26d9uzZM3A/tE7YbDaZzWZdeOGFOvfcc5WamqrQ0FAVFxdr7969+v3vf69jx47pN7/5jSZOnOhWdWnevHnavXu33n77bf3kJz+RJH3wwQeKj49328fYsWNdy/X19Tr//PO1fft2mUwmfe9739OyZcs0duxYNTY26tNPP9Vjjz2m4uJiLVu2TBkZGe0SxY4fP+5KYDIajbrpppt0+eWXKywsTLt27dJvfvMbrV69WnPnzu3HnxwwsEJDQ91eOxwOVVVVtZtmbrgY8CSmAwcO6KWXXtLWrVtVWFio2tpaffDBB0pJSXH12bNnj44fPy6z2axFixYNdIgAAAAAAAAAAADwkrZVmAICAtwSDYDBzulwyN5mSsThzmSxyGA09vt+duzYoU8++URnnHGGq23u3LmaMGGCLrroIlVWVuqMM86Q0+nUV199pfHjx7v6zZ8/X1FRUbr99tt1/PhxbdiwQZdeeqlr/R//+EdXAtN1112n9evXy+FwqLi4WNOnT9c111yjhx56SL/+9a916NAh/eIXv9Bvf/tbt/h+8YtfKCcnR5L061//Wvfff79r3Zw5c3T55Zfroosu0ocfftgvP5/emDlzpnJzczusdHfBBRfojjvu0EUXXaSPPvpIP/vZz3TdddfJZDJJksxms6ZOnar09HTXNhMnTtSYMWM63d/Pf/5zbd++XRaLRR9//LHmzJnjtv6ss87S1VdfrQULFqigoEAPPPCAXnnlFbc+9957r+t3xF/+8hd997vfda2bO3euli9frrPPPtstLmCo8/PzU2BgoGpra11tFRUVJDGdLofDofvuu09PPvmkHA6HnE6npKb5PNvOG9qSQenj46MjR44oISFhoMIEAAAAAAAAAACAF7VNYmpbgQAY7Ozl5TrwjYXeDmNATfh8i3wiIvp9P3fffbdbAlOLCy+8UKNHj9axY8dUUlKiZ5991i2BqcWqVat07733qq6uTps3b3ZLYnr66aclSdHR0Xrqqac6nKrpZz/7md58803t27dPzz33nH7+85/L399fUtM0bC+88IIkafr06frRj37UbntfX1+98MILGjdunBobG/v2Q/CQqKioLtf7+fnpkUce0cyZM3Xs2DHt2LGjXeJRT1VVVbl+vr/4xS86HWf06NF68MEHddttt+n111/X2rVrZTabJclVDUuSLrroIrcEphYhISFau3Zth+cIMJSFhYWpvr5eISEhCg0NHdYVKvs/HbbZzTffrMcff1x2u13x8fG6/PLLO+3bUjbObrfrjTfeGKgQAQAAAAAAAAAA4GUkMQHozFVXXdXpuunTp0tqKqJx5ZVXdtgnMDBQEyZMkCQdPnzY1Z6fn6+srCxJ0hVXXNFphRMfHx/XtGplZWXavn27a922bdtUVlYmSVqxYkWHSVCSlJiYqKVLl3Z6HN5SX1+v48ePKzMzU3v27NGePXtchUkkaefOnX0e+5NPPlFFRYUkdZknIEnnnHOOJKmxsVHbtm1ztW/cuNE11Wjrqe3amj9/vqZMmdLnWIHBaNy4cVq4cKFmzpypcePGDdsqTNIAJTH95z//cWWdPvDAAzp69Kj+/ve/d7nN8uXL5XQ69d///ncgQgQAAAAAAAAAAICXNTY2uk2XIpHEBOCUiRMndrquZVq0qKgohYeHd9uvsrLS1bZnzx7XcndVfFqvb73d7t27Xcvz5s3rcoz58+d3uX6gVFdX6+GHH9aMGTNkNps1evRoTZkyRdOmTdO0adM0a9YsV9/S0tI+76f19G6jRo2SwWDo9M/UqVNdfQsLC13LQ/HnC3iKr6+vjAMwZedgMCDTya1du1ZSU4WlX/7ylz3apuXCsnfv3n6LCwAAAAAAAAAAAINH2ypMRqPRNZUQAAQFBXW6ruUL/q76tO7XUtVHkk6ePOlajomJ6XL7uLi4DrfrzRixsbFdrh8IR48e1bnnnqsjR470qH/bBNPeKC4u7tN2NTU1ruWh9vMF0DcDksS0detWGQwGXX/99T3eJjExUZJ7diUAAAAAAAAAAACGr9DQUE2ePFlWq1VWq1Umk2nEVB7A8GGyWDTh8y3eDmNAmZqrGw0HnU0DN9Bj9Ldrr71WR44ckcFg0KpVq3TVVVcpLS1N0dHR8vPzk8FgkMPhkMlkkiS3qeV6q3XC2Pbt2+Xr69uj7VpyBtoaCj9fAH0zIElMLZmVY8aM6fE2LRcum83WHyEBAAAAAAAAAABgkPH19VV0dLSio6Mlnd6X5oC3GIxG+UREeDsM9EJEq3+voqKiLvu2LsLRervWU9gVFRV1OfVdd/swGAxyOp1yOBxd9quuru5yfWf27dunzz77TJL0wAMPdDqbUuvqR6cjMjLStRwdHd1pclJX2v58k5KSOu3b3c8XwOA1IKnrLWU+S0pKerxNbm6uJPcLPwAAAAAAAAAAAEYOqm0AGAhTp051LX/55Zdd9v3qq6863G7atGmu5a+//rrLMbpbHxISIkkqKyvrtI/T6dTBgwe7HKcze/fudS1feeWVnfZLT0/vcpyeXqNnzZrlWt6ypW9Vyjz58wWGA5vNNiyTvQckiWncuHGSpMzMzB5v8/7770uSpkyZ0i8xAQAAAAAAAAAAAAAQHx+vtLQ0SdLf//53VVVVddjPbrdr/fr1kpoqA82ePdu1bs6cOa5qQS+//HKnyQV5eXn68MMPu4xn7NixkrpOInr//fdVXl7e5TidaT0bUlfVnP74xz92OU5AQIBrub6+vtN+559/voKCgiRJv//97/uUeLFkyRLX1HYvvvhip/2+/vpr7dmzp9fjA4Od0+lUTk6OsrKy9NVXX2nLli2qra31dlgeNyBJTEuXLpXT6dTTTz/dbck7qSnZaf369TIYDFq2bNkARAgAAAAAAAAAAAAAGKluv/12SU2zC915550d9vnZz37mKtxx4403yt/f37XO399fq1atkiTt2LFDjzzySLvtbTabbrzxRjU0NHQZy6JFiyQ1VYXqqHJRYWGhvv/97/fgqDo2YcIE13JLUlZbzz77rN5+++0uxxk1apRr+dChQ532s1gsuuOOOyRJn3/+ue65554u8waKior0/PPPt9vXt771LUnSO++8o7///e/ttquqqtLNN9/cZczAUJaTk6Pi4mJX8lJnCZdD2YAkMd15550ym806dOiQbrnlFrfMzrY++ugjLV26VHV1dYqIiNCNN944ECECAAAAAAAAAAAAAEaoW265RQsWLJAkrVu3Tuedd57efPNN7dq1Sx9//LGWL1+uX/ziF5Kk8ePH68EHH2w3xkMPPaTExERJ0g9/+EN973vf07///W9t375dr732mr7xjW/o/fff19y5c7uM5aabbpKPj4+cTqcuvvhiPfHEE0pPT9fnn3+uRx55RLNmzVJFRYVbMlJvzJo1yzUV3p/+9CddeeWVeu+997Rt2za9/fbbWr58uW677TYtXLiw23FaqjE9+OCD+uijj5Sdna2DBw/q4MGDblVifv7zn+uMM86QJD355JOaPXu2nn76aW3ZskU7duzQxo0b9dRTT+nb3/62kpOTO6wCtWbNGtdUe9/73vd0++23a+PGjdq2bZvWrVunOXPmKCMjo9ufLzAUGQwG1/nforKy0kvR9B+fgdhJbGys/vjHP+q6667TCy+8oA8++EAXXniha/2TTz4pp9OpLVu2aN++fXI6nTIajVq/fr2Cg4MHIkQAAAAAAAAAAAB4UXV1tfz9/eXjMyBfXwGAG5PJpPfee0+XXHKJtmzZov/+97/673//265fWlqa3n///Q6/xw4LC9O///1vnX/++SosLNSrr76qV1991a3PypUrtWjRIlfVpo5MmTJFv/vd7/T//t//U1lZme655x639REREXrrrbf04IMP6sCBA70+VoPBoJdfflnnnnuuysrK9Pe//71dZaNp06bp9ddfV3x8fKfjhISE6M4779Tvfvc7bd++XUuXLnVbv3HjRi1evFhSU6Wqjz76SCtXrtSbb76pnTt3uqozdSQ0NLRd25gxY/TOO+/okksuUWVlpZ555hk988wzbn0eeughGQyGLqfiA4aqkJAQnTx50vV6OCYxDUglJkm6+uqr9eqrryo0NFQ5OTn605/+JIPBIEl6/vnn9cILLygrK0tOp1PBwcF6/fXX3RKdAAAAAAAAAAAAMHzt3r1bW7Zs0VdffaXMzExVV1d7OyQAI0xERIQ+/fRTvfTSS/qf//kfxcbGytfXV+Hh4Vq0aJGeeuop7dixQ6NHj+50jClTpmjv3r267777NGHCBPn7+ysqKkpLlizRX//6V61bt65Hsdxzzz3697//rQsuuEDh4eHy9/fX2LFjdfvttysjI0Nnn332aR3rzJkztWPHDt1yyy0aPXq0fH19FRERofnz5+vRRx/VV1995TZdXGd+85vf6LnnntPZZ5+tiIgImUymTvuGhIToH//4hzZv3qwbbrhBkyZNUkhIiHx8fBQREaF58+bp9ttv17/+9S999NFHHY6xePFi7d27V7feeqtGjx4tPz8/xcbG6sILL9S///1v/exnP+vzzwQY7NomT1ZXV8vpdHopmv4xoKnsV1xxhc477zw988wzevfdd7Vjxw63qeWmTJmiSy65RHfddZdiYmIGMjQAAAAAAAAAAAB4SUNDg+rr6yVJtbW1qq2t7TJJAMDIsXr1aq1evbrbfuvXr9f69eu7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Vu6TTz7R2rVrJUlz5szRvHnz3Nbff//9MplMcjgcuvzyy5Wbm9vpPux2u1555ZUu+wDoOYfD4e0QTsuATCe3evVqGQwGXX755T3OpD958qRru4ceeqifIwQAAAAAAAAAAAAADDa33HKLPvroI/3zn//U66+/ru3bt+vmm2/W/PnzFRYWJqvVqn379mnTpk165513FBAQoDvuuKPf4klMTNSiRYu0adMmPf300yovL5fU+VRyA3kczz33nM444ww1NDRo2bJl+v73v6+LL75YZrNZGRkZ+s1vfqPDhw9Lkv7v//7PbRq4tmbMmKHMzEzNmTNH999/v+bPn6/6+nr961//0uOPP+6aau7pp59ut+20adP06KOP6p577lFmZqamTp2qm266Seeee65iY2NVV1eno0ePauvWrXrjjTdUUFCg3bt3u6pVAei5o0ePKjc3V/Pnz5fRaFROTo4sFou3w+qzAUliAgAAAAAAAAAAAACgtwwGg/72t7/prrvu0h//+EcdOnRI9913X6f9Y2Ji+j2mq6++Wps2bXIlMPn4+OiKK67ocpuBOI6ZM2fq3Xff1fLly2W1WrVmzRqtWbOmXb/bb79dDz/8cLdj3XHHHbr11ls7TKby8/PTiy++qDPOOKPD7e+++26ZzWbdfffdqqio0COPPKJHHnmkw75+fn4KCAjowRECaMvpdMput8tobJqIbahXYhqQ6eT6orGxUZLk6+vr5UgAAAAAAAAAAAAAAN7i6+urZ555Rjt37tT3v/99TZs2TWFhYTKZTAoLC9PMmTN1/fXX64033lBWVla/x3P55ZfL39/f9Xrp0qWKjo7udruBOI6lS5fq4MGDeuCBBzRz5kyFhobK399fycnJuvrqq7V582Y99dRTroSHrtxwww3avHmzrrjiCsXHx8vPz08JCQm67rrrlJGRoauuuqrL7W+88UYdPnxYP/vZz7Rw4UJFRUXJx8dHZrNZEydO1He+8x398Y9/VF5enlJSUvp0vMBI1/b/8lBPYhq0lZh27NghST262AMAAAAAAAAAAGDosNlsMplMcjqdcjqd3g4HwBAxbdo0/f73v+/VNqtXr9bq1au77bd48eIeX48sFovq6up6FUdrfTkOSVq5cqVWrlzZbb/o6Gj96le/0q9+9as+ROfuzDPP1N/+9rc+bx8bG6uHHnpIDz300GnHAqA9k8nk9pokpg689NJLHba//fbbSk9P73Lb+vp6HTp0SH/+859lMBg0b968/ggRAAAAAAAAAAAAXnLkyBHXd0A7duxQSkqKEhISvBwVAADA0NK2EtNQTw7vlySmlStXymAwuLU5nU795Cc/6fEYTqdTRqNRd911l6fDAwAAAAAAAAAAgBe1/YKtJ9MaAQAAwN1wq8TUb+8IW8p/tn4T2rqtqz++vr5auHCh3nnnHS1atKi/QhwQx44d07333qvU1FSZzWZFRERo3rx5euSRR1RTU+Ox/bz//vu69NJLlZiYKH9/fyUmJurSSy/V+++/3+MxbDab/vjHP+rss89WdHS0AgMDNX78eN18883au3evx2IFAAAAAAAAAGCoGEr3+YeStl+wkcQEAADQe8MtialfKjEdOXLEtex0OjVu3DgZDAZ98MEHmjBhQqfbGQwGBQQEKDIyst0Peih69913dc0118hqtbraampqlJ6ervT0dD3//PPasGGDUlJS+rwPh8Ohm266SS+88IJbe15envLy8vTWW2/phhtu0J/+9KcuPwCUlpZq2bJl+vrrr93aDx8+rLVr1+rFF1/UU089pRtuuKHPsQIAAAAAAAAAMJQMpfv8Qw2VmAAA3tRotaqmqEi2ujo5HQ4ZjEb5BAQoKDbW26EBvdL2PRRJTB0YPXp0h+3x8fGdrhtuMjIydOWVV6q2tlbBwcG6//77tWTJEtXW1uq1117Tc889p+zsbF144YVKT09XSEhIn/bz4x//2PXBZtasWbrvvvs0fvx4HTp0SL/73e+UkZGh559/XtHR0fr1r3/d4Rh2u12XXnqpK4Hpsssu04033qiIiAh9+eWX+uUvf6ni4mLdfPPNSkhI0De/+c2+/VAAAAAAAAAAABgihtJ9/qGo7RdsBoPBS5EAAEaShvJyVebkqLG+vt26xvp61VZUqNFolF2STx9/twMDqe17qLaJ4kNNvyQxtTXUM7364q677lJtba18fHz04YcfasGCBa515557riZMmKD77rtP2dnZWrNmjVavXt3rfWRnZ+vRRx+VJM2dO1effvqpAgMDJUnz5s3TJZdcokWLFik9PV2PPPKI/vd//7fDp0FefPFFffbZZ5Kk2267TU8//bRr3fz58/XNb35Tc+bMkdVq1Z133qmsrCz5+AzIqQMAAAAAAAAAgFcMpfv8QxHTyQHA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6dq1a1ez3fCsdN999+n++++XpB5fcADAWg1/hvT091OWdWIyTVO5ublas2aN1qxZo9zc3F73A3ratGn64YcfdNttt2no0KEKCwtTTEyMxo0bp7/+9a9at26dMjIyjuocNptNL730kpYsWaILLrhA/fv3l9PpVP/+/XXBBRfo448/1osvviibreW/6oSEBH399dd67rnndOqppyo+Pl4hISEaMmSIZs2ape+++07XX3/9UWUFAAAAAAAAAKAn6Umf8/c0ubm5GjdunCZMmKB169Zp3759VkcCAADocbxeb8Dznv6escs7Mf373//Wc889p2XLlqmqqipgW1hYmKZMmaKbbrqp13T8GTRokB577DE99thjbTpuypQpbSrqmjp1qqZOndrWeAEcDoduvPFG3XjjjUc1DwAAAAAAAAAAvUVP+py/p3E4/nubquENOACt592/X67vvpN3/36ZLpcMp1P25GQ5TzxR9uRkq+MBADoRRUztVF1drSuvvFIffPCBpKbb4lVVVenjjz/Wxx9/rPPPP1+vv/66wsPDuyoiAAAAAAAAAAAAukDDG2wUMQFt59m7V7WffCLvnj2Ntnnz8uRau1b2tDSFnH22HKmpFiQEAHS2hu+h7Ha7RUk6RpeUYPl8Pk2dOlUffPCBTNOUw+HQueeeq/vvv19///vf9fe//13333+/zjvvPAUFBck0TX344YeaOnVqr1tiDgAAAAAAAAAAoK+jiAk4Ou5t21S1YEGTBUyH8+7Zo6oFC+Tetq2LknWOffv26X/+5390wgknKDo6WkFBQerXr59GjRqlyy67TAsWLFB5ebmkQ53wDMPQrl27JEmvvvqqDMMI+G/KlCkB85eWluqVV17RFVdcoREjRigiIkJOp1Opqam67LLL9Prrr8vlcjWbb+fOnf65FyxYIEl67733NHXqVPXv318Oh0NTpkzRggULZBiG7r//fv+xDbMZhqGdO3d26J8fgN6LTkztMG/ePK1YsUKGYejss8/Wiy++qNRmqn337t2rWbNm6d///re++uor/f3vf2d5MwAAAAAAAAAAgF6kYZcAipiA1vPs3avqt9+WPJ5WHuBR9dtvK3zmzB7ZkenLL7/Ueeed5y9SqldYWKjCwkJt2rRJ//jHP5SQkKDzzjuvNsEDEQABAABJREFUXecYO3asv+jpcAUFBSooKNDy5cv15ptv6uOPP1byEZboM01TV111lV577bV2ZQGAtqCIqR1effVVSdL48eO1ZMmSFv/QUlNTtXjxYk2aNEmrV6/Wq6++ShETAAAAAAAAAABAL0InJqD9aj/5pPUFTPU8HtV+8okirr22c0J1krq6Ok2fPl3l5eWKjIzUjTfeqDPOOENJSUlyuVzasWOHvv76a73//vv+Y1555RVVVVXp7LPP1r59+3TBBRfogQceCJg3PDw84LnX69VJJ52k8847T2PHjlW/fv3kcrmUm5urV155RUuXLtW6des0ffp0LVu2rMXMTzzxhH744QeddtppuvHGGzV06FCVlZVp586d+sUvfqFx48bpueee0/PPPy9J2rhxY6M5mmsIAgAN9bbl5LqkiCk7O1uGYei2225rVdWX3W7X7373O02fPl3Z2dldkBAAAAAAAAAAAABdhU5M6M1M05RZXd0pc3sLC4+4hFyzx+7ZI/eOHbInJXVwKskIC5NhGB0+78qVK7Vv3z5J0htvvNGo09LJJ5+syy67TI8//riq//NnPnjwYElSUFCQJCkmJkYjR45s8Tz/93//p8zMzEbjJ510ks4880z94x//0O9+9zstX75cX3zxhX760582O9cPP/ygq666yr90XEMxMTFKOuzv4EjZAKAldGJqh/ofzkOHDm31MfW/JDrjlx0AAAAAAAAAAACsQycm9GZmdbUqHn3U6hhNql64sFPmjbzjDhkNuht1hP379/sfT548udn9HA6HoqKi2n2epgqYDjd9+nQtXLhQ69ev1wcffNBiEVNMTIyeeeYZ7nMD6BK9rYipS9Ifc8wxkg6tS9pa9fvWHwsAAAAAAAAAAIDeoWEnJk9bl8YC0CekpKT4H7/yyitdck7TNLV//35t27ZNmzZt0pYtW7Rlyxb1799fkrRhw4YWj582bZoiIyO7IioANHoP5XB0SS+jTtMl6S+77DKtW7dOCxcu1Nlnn92qYxYuXCjDMPSrX/2qk9MBAAAAAAAAAACgKzUsYnK73RYlAdCdnXrqqRoyZIh+/PFHzZkzR4sWLdKFF16oyZMna/z48XI6nR12riVLluj555/XihUrVFFR0ex+RUVFLc4zevToDssEAEfS8D1Uw/dYPU2XdGK65ZZbdMIJJ+gf//iHHn744SPu/8gjj+jNN9/U2LFjNWfOnM4PCAAAAAAAAAAAgC7T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T37yEy1cuFA7duxQTU2NKioqtGnTJj366KMaOnSoFi9efMS5CgoKNHHiRM2dO1fr1q1TZWWlKisrtWbNGt1888266KKL5PP5Ao658MILFRoaKkl64403Wpzf7XbrnXfekSRNnTpVsbGxrXotlZWV2rJlix577LFWv5bmfPrpp8rIyNCf//xnrV+/XgcPHlRdXZ127dql119/Xaeddpp++9vfNnqdTXn55Zd1yimn6B//+Ify8vJUV1envLw8LViwQGPGjNHbb7/d4vGPPvqoRowYoSeeeEKbNm1SeXm5amtrtWPHDr366quaMGGC/vjHP7b7tQIAAAAAAAAArFVfyDRgwIBG27Zv3668vDwLUgEA+pL8/Hxt3bq10XhqaiodmNAiipgAtIlpmrr44ov1j3/8Q5I0bdo0vfbaa1q5cqVWrVqlJ598UgMHDlRVVZUuvvjiI3b2ueiii5SVlaVbbrlFn332mb777ju98cYbGj58uCRp8eLFeuGFFwKOiYyM1Pnnny9Jeu+991RbW9vs/P/6179UUlIiSZoxY0arXsuKFSu0ePFi/elPf2rTa2nK+vXrNW3aNJWXlysoKEi33Xabli5dqtWrV2vevHkaPHiwJOnZZ5/V3XfffcS5brjhBiUlJenpp5/Wt99+q+XLl+uuu+5ScHCw6urqNGPGjGZzPvLII7rzzjvldrs1evRoPf/88/r888+1du1aLVq0SBMnTpRpmvrf//1fPfXUU21+rQAAAAAAAACA7sEwDA0ZMkQDBw5stC03N1d79uyxIBUAoC/Yu3evtm3b1mh8wIABOuaYYyhgQoscVgcAulpxZV27jw0PdigkyN7ktpIql0zTbNe8oU67wpxN/3Msq3bJ62vdvPERwe06f1u8+OKLWrJkiYKCgvThhx/qnHPOCdh+8skn68orr9Rpp52mzZs3a86cOS0ul7ZmzRp9+umnmjJlin/shBNO0Nlnn60RI0aooKBAzz33nGbPnh1w3IwZM/TWW2+pvLxcH330kS6++OIm56/v1BQVFaXzzjuvVa/F6/WqsLBQJ554om688UZNmTKlVa+lKb/+9a/lcrlkt9v10Ucf6ayzzvJvGz9+vC655BKdeuqpysrK0qOPPqqrrrpKxx13XJNzbdiwQYMGDdI333yj5ORk//jkyZN19tln66yzzpLb7dZNN92k1atXBxyb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qaeeqmuuuUaTJ0/W5s2bdffdd+uTTz5p9tuIa9as0UcffaSJEyf6x4YPH64zzjhDY8aMUUFBgZ577jnNnj074LgZM2borbfeUnl5uT766CNdfPHFTc7/xhtvSDr0AeN5553Xqtfi9XpVWFioE088UTfeeKOmTJmizZs3a86cOUdc+q2hX//613K5XLLb7froo4901lln+beNHz9el1xyiU499VRlZWXp0Ucf1VVXXaXjjjuuybk2bNigQYMG6ZtvvlFycrJ/fPLkyTr77LN11llnye1266abbtLq1asDjs3KytI999wjSbr33nt17733BvwP3oknnqjp06fr6quv1uuvv6577rlHV155ZaPOVUcyb948fffdd/7XPm/evIBzXHjhhbruuuv08ssvt2leAAAAAACOhmmaqq6uVlhYWJM3POPj47Vr164mj7Xb7YqNjVV8fLzi4uIoWAIAwGJ2u11DhgxRcnKycnNz/V9kPlzDlREAoLuKjIxUSkqK8vPzFRsbq4yMDJakRp9GERP6nkeOaf+xUx+VJsxqetuz46Xq4vbNe/r/SGc004XnlZ9LB7a0bp77Drbv/K1kmqb++te/SpJuueWWRgVM9eLi4vTII49o6tSpWrVqlfbt29eoirjezTffrEmTJsnn+2+hltfrVXh4uGbMmKHHHntMGzduVHFxseLi4vwfNJ5zzjmKj49XcXGxFi1a1GQRU2VlpT788ENJ0i9/+UuFhIS0+bXExsb6X8vKlSu1ffv2Zl9LQ6tXr9aaNWskSbNmzQooYDp8/vnz5+vUU0+Vz+fTc889p2effbbZOf/2t78FFDDVO+OMMzRr1iw9//zzWrNmjdauXatx48YFHOd2uzVu3LhGBUz1bDabnn76ab399tuqrKzUO++8o1mzmrnem/Hcc89Jkvr166fHH3+8yX2efPJJLV68WAcOHGjT3AAAAAAAtIXX61VpaalKSkpUUlKiuro6jR8/vskbAhEREXI6nf5lHIKDgxUfH6/4+HjFxMQccfl3AADQ9cLCwjRy5EgVFxcrNzfX31Fx//79qqmpsTgdABximqaKi4v9X45oyuDBgxUXF6f4+Pgm7+EBfcn/z959h0dVpv8f/0xJMumF0EJJkCIgKEoTRQFFcBHsYNmVooh1Xf269lVhXQvquupaUYTVRVQUEVQUCyAi0lGkSO89pEx6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cqW2b9+uzMxMFRQUKCcnx+92kZGRio6OVpMmTdSpUyedffbZ6tmzp9q1a6e4uDjKxQEAAL/CwsLUvn179enTRykpKX7PGVwul3bt2qXly5dr165dKi4uroWRAqjL8vPz9fPPP2vHjh0BjxEtW7ZUnz591KFDB/N6JoDQEMQEIGRWq1UPP/ywJGnHjh0aPXq0CgsLA7bPzs7WK6+8Uu3juu6668w3GzNmzNDMmTMlSX369FG7du38bmO1WnXvvfdKOpG5afTo0UpPT1d+fr7fOywq8lr69OmjXr16SZLeeustfffdd6XaZGVl6ZZbbjHHdNtttwXt8//+7//8lmJbvHixpkyZIknq2bOnevfu7bP+oYceks1mk8fj0dVXX619+/YF3Ifb7daMGTOCtgnEO/5Dhw6ZP9+T3XPPPWa5PgAAAABA4+JwOHTkyBH9+uuvWrp0qX777TcdOHDA741S3pLpJ7NYLOrZs6e6deumli1bKiIiorqHDQAAGpCIiAh17NhRvXv3VvPmzf22cblc2r17t5YvX66dO3dW+U3QAOovh8MR8D1Is2bN1Lt3b3Xq1EkOh6OGRwY0DORTBlAut956q7755ht9+umnmjVrltasWaNbbrlFffr0UXx8vLKzs7V582YtWrRIc+fOlcPh0J133lmtY2rdurUGDBigRYsW6dVXX1VmZqYk6YYbblBUVJRcLpdcLpc8Ho/PdjfddJMWLlyoefPm6dNPP9W6det04403qnfv3rJarcrJydHhw4f1ww8/VPi1vPXWW+rbt6+Kioo0bNgw/fnPf9aIESMUHR2ttWvX6plnntGOHTskSX/96199ysCd7IwzztDGjRvVs2dPPfTQQ+rTp48KCwv15Zdf6l//+pdcLpfsdrteffXVUtt2795dzz//vO655x5t3LhR3bp104QJE3TBBReoefPmKigo0K5du7Rs2TJ9/PHHOnjwoNavX29m3grVbbfdpmnTpmnt2rV6/fXXtXPnTt16661q06aN9u7dq9dee00LFixQr169tGrVqnL1DQAAAACof9xutzIyMnT48GH16NFDDodD+/fvD2nb48ePKzU11e86si0BAIDKioyMVOfOndWmTRvt2rVLx44dK9XG7XYrOzubcw8AJovFotTUVLPKinSi5HVaWppiYmJqcWRAw0AQE4BysVgs+vDDD/WXv/xFb7zxhrZv3677778/YPtmzZrVyLj++Mc/atGiRWYAk91u1zXXXCObzSabzaaIiAh5PB653W65XC6zNu306dN1//3365133tHOnTv16KOPBtxHs2bN5HK5ZLVaQ65b26NHD82bN08jR45Udna2/vnPf+qf//xnqXZ33HGHnn766TL7uvPOO3Xbbbf5DaYKDw/Xf/7zH/Xt29fv9nfffbeio6N19913KysrS88995yee+45v23Dw8MrFCFut9v1+eef64ILLtDvv/+ur776Sl999ZVPmyFDhujee+/V0KFDy90/AAAAAKD+MAxDP//8s5nxOJT3meHh4UpKSlJSUpISExOre4gAAACKjo7WaaedJqfTqT179pQKZmrbtm0tjQxAbcnLy9PRo0fVtm1bv0GMycnJioqKUmRkpNq2bau4uLhaGCXQMFFODkC5hYWF6bXXXtMvv/yiP//5z+revbvi4+Nls9kUHx+vHj166KabbtLHH3+sTZs21ciYrr76ap/UjUOGDFHTpk192litVoWFhSkyMlLR0dHm15deekk//fSTbrnlFp122mnma4mLi/N5LRs3blR+fr5yc3OVm5urwsJCMxgqmCFDhmjbtm16+OGH1aNHD8XFxSkiIkJt27bVH//4Ry1ZskSvvPJKSIFR48eP15IlSzRq1CilpKQoPDxcrVq10ujRo7V27Vpde+21Qbe/+eabtWPHDk2aNEnnnnuukpOTZbfbFR0drU6dOumqq67SG2+8of3796tDhw5ljseflJQUrV27Vv/4xz/UrVs3RUZGKiEhQWeffbZee+01zZ8/X+Hh4RXqGwAAAABQ9wQqr2KxWBQfH1/m9vHx8WrXrp169uyps88+W6eeeqqaNm0qu537LwEAQM2JjY3Vaaedpp49e5rXF+Li4pSQkOC3vWEYysrKotQc0IBkZWVpw4YNWrlypXbt2qWsrCy/7SwWi8466yx169aNACagivFJAIAK6969u15++eVybzdx4kRNnDixzHYDBw4M+eQ/ISFBBQUFIY/BYrHIbrfLbrcrIiJCffr00VlnnSXDMGS323XkyBFJJ7Iv2Ww2SSdqYBcXF0uSPB6PioqKNGrUKI0aNUp2u102m00ej8dvMFLTpk315JNP6sknnwx5jIGcffbZ+vDDDyu8ffPmzfXYY4/pscceq/RYAomMjNQjjzyiRx55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qJ49e6p///46/fTTlZaWpsTERDMzVlni4uL8Pu9yufT777/r4MGDZWZ7AgAAAKrT1q1b9dtvv2nPnj3KyMgIOYBJOvFeJFD78PBwApgAAI3Srl27ZLFYZLFYNHDgQL9txo8fr/j4eEnSgw8+qPT0dJ/1brdbt99+u5lZ/b777qvWMQMAAAC1iUxMAOqklJQUdenSRZs2bdJHH32kZ555RjExMaXaud1uTZ8+XdKJIJOzzjrLXNezZ08lJiYqIyND7733nu655x6/QT779+/XggULgo6nXbt2+uWXX4IGEc2fP1+ZmZmhvcCTlPywP1g2pzfeeCNoPw6Hw1wuLCwM2G7w4MGKiopSXl6eXn75ZY0aNarcZRwGDRokm80mt9ut//znP7ryyiv9tlu5cqV+++23cvVdl9lsNiUmJpqZqLwlNrKyssy71k8usREWFubzuynJ6XTq0KFDZkYxm82m2NhYxcbGKi4ujjvrAAAAUGmGYSgnJ0dOp1NutztgJtbY2FgdO3aszP4sFot5vup9RESQ/RgA0LBs27bNzJzu5c3QnZOTY34m6XXxxRerRYsW5d5PUlKSJk+erFtvvVW7d+9W37599cgjj6h79+46cOCAXnzxRS1cuFCSdN111wUMhgIAAAAaAoKYANRZd9xxh+68804dPXpUd911l955551SbSZNmqSNGzdKkm6++WafD84jIiI0btw4vfDCC1q3bp2ee+453X///T7bu1wu3XzzzSoqKgo6lgEDBuiXX37R8uXLtXTpUp177rk+6w8dOqQ///nPFX2p6tixo7k8ffp0nX322aXavP766/rss8+C9tOyZUtzefv27Tr11FP9tktISNCdd96pZ599Vj/99JPuuecevfDCC7Ja/SfoO3z4sObNm6fx48f77Ouyyy7T7NmzNXfuXH300UcaNWqUz3Y5OTm65ZZbgo65vrNYLIqOjlZ0dLT5nMvlMgOasrOzFRYWFjBI7OSyG263W5mZmT4BcWFhYerUqZNycnKUnZ2tyMhIhYWFVcvrAQAAQP1mGIYKCwuVmZmptm3bKiYmRr/++qtZGttut6tVq1Z+z08DZQ+NiIjwCViKiYkJ+N4BAICG4scff9S4ceP8rktPTy+1buHChRUKYpKkW265RQcOHNATTzyh7du368YbbyzVZtiwYX4/HwUAAAAaEoKYANRZt956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779fp59+urKysjRr1iy99dZbuuaaayq9HwChMQxDERERAbM5eduULOnkDWyy2Wx+25c3iOlkgQIRiouLzbGEmuXJy263q2vXrn4z0nk8Hh0+fFh2u93vgwAoNFQej0eGYQT8Wz548KCcTmepYKXi4mJ5PJ6gfScmJgYMYqpMFrhgx5fw8HAzOCnQwxuwxN82AAAAAAAAAFQfgpjQOHg8Uv7x2h5FzYlMkqzWat/NunXrtHjxYvXt29d8rlevXurYsaOGDx8up9Opvn37yjAMrVixQu3btzfb9enTR8nJybrjjju0Z88effHFF7riiit8+n/jjTfMAKbRo0dr+vTp5kWjnj17asSIEXrkkUf01FNPafv27XriiSc0efJknz6eeOIJ7d27V5L01FNP6aGHHjLX9ezZU1dffbWGDx+uBQsWVO0PpwJ69Oihffv2KSEhodS6oUOH6s4779Tw4cP1zTffaNKkSRo9erR58TA6OlrdunXTqlWrzG06deqktLS0gPv7+9//rjVr1ighIUHffvutevbs6bO+f//++uMf/6h+/frp4MGDevjhhzVjxgyfNvfee6+Zgem///2vrrvuOnNdr169NHLkSJ133nk+46qI9evX69///rck6ayzztLixYt9AtYuvPBCnXPOORozZkyl9gOgapUsXeevzNvJEhIS1L17dzPg6eQyUd6vgQQLYqool8sla4D/qcXFxT7ZCE9ms9kCBjjZbDY1b95cUVFRpbYzDMMM9rLZbARMoNrk5eWpsLBQbrfbzIjkcrl8vve37PF41KRJE3Xr1s1vvxkZGTp69GiFxhTs77UiQUwlg5ACSUlJUUpKCn9rAAAAAAAAAFDLCGJC45B/XHqufdntGor7tkvRydW+m7vvvtsngMnrkksuUWpqqnbv3q2jR4/q9ddf9wlg8ho3bpzuvfdeFRQUaMmSJaWCmF599VVJUtOmTfXKK6/4vbA0adIkzZ49W5s3b9Zbb72lv//97+ZFqqKiIk2dOlWSdPrpp+vBBx8stX1YWJimTp2qU045pVIXuatCcnLw31l4eLiee+459ejRQ7t379a6detKBR6FKicnx/z5PvHEEwH7SU1N1aOPPqrbb79ds2bN0pQpUxQdHS1JOnTokD799FNJ0vDhw30CmLxiY2M1ZcoUv/OkPN544w0zc8OUKVP8BkOMHj1aH3zw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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "dp = Pulse(0, 40, 0.9, 400e6, 0, eCap(alpha=2), 0, PulseType.DRIVE)\n", - "dp.plot(sampling_rate=100)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Waveform" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Overview" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The `Waveform` object is used to hold the array of samples that make up a waveform. This simple class is hashable so that it allows the comparison of two `Waveforms`, which is later needed by the driver.\n", - "The class has a writable `serial` attribute that can be set externally." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Envelope_Waveform_I(num_samples = 200, amplitude = 0.9, shape = Rectangular())'" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "duration = 200 # ns\n", - "amplitude = 0.9 \n", - "num_samples = int(duration) # default sampling rate of 1GSps\n", - "waveform = Waveform(amplitude * np.ones(num_samples))\n", - "waveform.serial = f\"Envelope_Waveform_I(num_samples = {num_samples}, amplitude = {format(amplitude, '.6f').rstrip('0').rstrip('.')}, shape = Rectangular())\"\n", - "waveform.serial" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Pulse Sequence" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Overview" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "One of the key enhancements introduced in this new version of the driver are those related to the `PulseSequence`. Previously, `PulseSequence` wasn't more than an a list to contain the sequence of pulses and two attributes to store the time and phase of the sequence.\n", - "The new version of `PulseSequence` introduces many features. It is a sorted collection of pulses with many auxiliary methods." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Initialisation" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Multiple pulses can be used to initialise a `PulseSequence` or can be added to it:" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "p1 = Pulse(600, 40, 0.9, 100e6, 0, Drag(5,1), 1, PulseType.DRIVE)\n", - "p2 = Pulse(500, 40, 0.9, 100e6, 0, Drag(5,1), 2, PulseType.DRIVE)\n", - "p3 = Pulse(400, 40, 0.9, 100e6, 0, Drag(5,1), 3, PulseType.DRIVE)" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "# initialise an empty PulseSequence\n", - "ps = PulseSequence()\n", - "assert type(ps) == PulseSequence" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "# initialise a PulseSequence with multiple pulses at once\n", - "ps = PulseSequence(p1, p2, p3)\n", - "assert ps.count == 3 and len(ps) ==3\n", - "assert ps[0] == p3\n", - "assert ps[1] == p2\n", - "assert ps[2] == p1\n", - "# * please note that pulses are always sorted by channel first and then by their start time" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "# initialise a PulseSequence with the sum of multiple pulses\n", - "other_ps = p1 + p2 + p3\n", - "assert other_ps.count == 3 and len(other_ps) ==3\n", - "assert other_ps[0] == p3\n", - "assert other_ps[1] == p2\n", - "assert other_ps[2] == p1\n", - "# * please note that pulses are always sorted by channel first and then by their start time\n", - "\n", - "plist = [p3, p2, p1]\n", - "n = 0\n", - "for pulse in ps:\n", - " assert plist[n] == pulse\n", - " n += 1" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "p4 = Pulse(300, 40, 0.9, 50e6, 0, Gaussian(5), 1, PulseType.DRIVE)\n", - "p5 = Pulse(200, 40, 0.9, 50e6, 0, Gaussian(5), 2, PulseType.DRIVE)\n", - "p6 = Pulse(100, 40, 0.9, 50e6, 0, Gaussian(5), 3, PulseType.DRIVE)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "ename": "AssertionError", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mAssertionError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[29], line 5\u001b[0m\n\u001b[1;32m 3\u001b[0m yet_another_ps\u001b[38;5;241m.\u001b[39madd(p4)\n\u001b[1;32m 4\u001b[0m yet_another_ps\u001b[38;5;241m.\u001b[39madd(p5, p6)\n\u001b[0;32m----> 5\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m yet_another_ps[\u001b[38;5;241m0\u001b[39m] \u001b[38;5;241m==\u001b[39m p4\n\u001b[1;32m 6\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m yet_another_ps[\u001b[38;5;241m1\u001b[39m] \u001b[38;5;241m==\u001b[39m p5\n\u001b[1;32m 7\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m yet_another_ps[\u001b[38;5;241m2\u001b[39m] \u001b[38;5;241m==\u001b[39m p6\n", - "\u001b[0;31mAssertionError\u001b[0m: " - ] - } - ], - "source": [ - "# multiple pulses can be added at once\n", - "yet_another_ps = PulseSequence()\n", - "yet_another_ps.add(p4)\n", - "yet_another_ps.add(p5, p6)\n", - "assert yet_another_ps[0] == p6\n", - "assert yet_another_ps[1] == p5\n", - "assert yet_another_ps[2] == p4" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Operators" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "PulseSequence support a number of operators(`==`, `!=`, `+`, `+=`, `*`, `*=`). Below are a few examples:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ps += yet_another_ps\n", - "assert ps.count == 6\n", - "ps += ReadoutPulse(800, 200, 0.9, 20e6, 0, Rectangular(), 1)\n", - "ps = ps + ReadoutPulse(800, 200, 0.9, 20e6, 0, Rectangular(), 2)\n", - "ps = ReadoutPulse(800, 200, 0.9, 20e6, 0, Rectangular(), 3) + ps\n", - "assert ps.count == 9\n", - "print(ps)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ps.plot()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`PulseSequence` now implements `__contains__()` so one can check if a `Pulse` is included in the `PulseSequence` likw so: " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "assert p5 in ps" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Attributes & Methods" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`PulseSequence` includes the following (read only) attributes:\n", - "- `pulses` a list containing the pulses of the sequence\n", - "- `serial`\n", - "- `count`\n", - "- `is_empty`\n", - "- `start`\n", - "- `finish`\n", - "- `duration`\n", - "- `channels`\n", - "- `pulses_overlap`\n", - "- `channels`\n", - "- `ro_pulses`\n", - "- `qd_pulses`\n", - "- `qf_pulses`\n", - "\n", - "\n", - "`PulseSequence` implements the following methods:\n", - "- `add()`\n", - "- `pop()`\n", - "- `remove()`\n", - "- `clear()`\n", - "- `shallow_copy()`\n", - "- `deep_copy()`\n", - "- `get_channel_pulses()`\n", - "- `get_pulse_overlaps()` returns a dictionary of time intervals with the list of pulses in it\n", - "- `separate_overlapping_pulses()`\n", - "- `plot()`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "p1 = Pulse(600, 40, 0.9, 100e6, 0, Drag(5,1), 1, PulseType.DRIVE)\n", - "ps = PulseSequence(p1)\n", - "assert ps.count == 1\n", - "ps *= 3\n", - "assert ps.count == 3\n", - "ps *= 3\n", - "assert ps.count == 9" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "p1 = Pulse(600, 40, 0.9, 100e6, 0, Drag(5,1), 1, PulseType.DRIVE)\n", - "p2 = Pulse(600, 40, 0.9, 100e6, 0, Drag(5,1), 2, PulseType.DRIVE)\n", - "ps = 2 * p2 + p1 * 3\n", - "assert ps.count == 5" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ps.clear()\n", - "assert ps.count == 0\n", - "assert ps.is_empty" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "p1 = Pulse(20, 40, 0.9, 200e6, 0, Drag(5,1), 1, PulseType.DRIVE)\n", - "p2 = Pulse(60, 1000, 0.9, 20e6, 0, Rectangular(), 2, PulseType.READOUT)\n", - "ps = p1 + p2\n", - "assert ps.start == p1.start\n", - "assert ps.finish == p2.finish\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "p1 = DrivePulse(0, 400, 0.9, 20e6, 0, Gaussian(5), 10)\n", - "p2 = ReadoutPulse(100, 400, 0.9, 20e6, 0, Rectangular(), 30)\n", - "p3 = DrivePulse(300, 400, 0.9, 20e6, 0, Drag(5,50), 20)\n", - "p4 = DrivePulse(400, 400, 0.9, 20e6, 0, Drag(5,50), 30)\n", - "p5 = ReadoutPulse(500, 400, 0.9, 20e6, 0, Rectangular(), 20)\n", - "p6 = DrivePulse(600, 400, 0.9, 20e6, 0, Gaussian(5), 30)\n", - "\n", - "ps = PulseSequence(p1, p2, p3, p4, p5, p6)\n", - "assert ps.channels == [10, 20, 30]\n", - "assert ps.get_channel_pulses(10).count == 1 \n", - "assert ps.get_channel_pulses(20).count == 2 \n", - "assert ps.get_channel_pulses(30).count == 3 " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ps.plot()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "assert ps.pulses_overlap == True\n", - "assert ps.get_channel_pulses(10).pulses_overlap == False\n", - "assert ps.get_channel_pulses(20).pulses_overlap == True\n", - "assert ps.get_channel_pulses(30).pulses_overlap == True\n", - "\n", - "channel10_ps = ps.get_channel_pulses(10)\n", - "channel20_ps = ps.get_channel_pulses(20)\n", - "channel30_ps = ps.get_channel_pulses(30)\n", - "\n", - "split_pulses = PulseSequence()\n", - "overlaps = channel20_ps.get_pulse_overlaps()\n", - "n = 0\n", - "for section in overlaps.keys():\n", - " for pulse in overlaps[section]:\n", - " sp = SplitPulse(pulse, section[0], section[1])\n", - " sp.channel = n\n", - " split_pulses.add(sp)\n", - " n += 1\n", - "split_pulses.plot()\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "n = 70\n", - "for segregated_ps in ps.separate_overlapping_pulses():\n", - " n +=1\n", - " for pulse in segregated_ps:\n", - " pulse.channel = n\n", - "ps.plot()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "p1 = DrivePulse(t0, 400, 0.9, 20e6, 0, Gaussian(5), 10)\n", - "p2 = ReadoutPulse(p1.finish, 400, 0.9, 20e6, 0, Rectangular(), 30)\n", - "p3 = DrivePulse(p2.finish, 400, 0.9, 20e6, 0, Drag(5,50), 20)\n", - "ps1 = p1 + p2 + p3\n", - "ps2 = p3 + p1 + p2\n", - "assert ps1 == ps2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Overlaps" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "overlaps" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "qibolab", - "language": "python", - "name": "qibolab" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.7" - }, - "vscode": { - "interpreter": { - "hash": "df6c4956c0d01326f01905a7a43ac8f74636b2b92922eba33adb46287ed0dc33" - } - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} From c14cb351428f90e6a47b42e915d38b9a061bac34 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 30 Jan 2024 20:13:19 +0100 Subject: [PATCH 0057/1006] test: Drop flux pulse test The create method for flux pulses has been introduced in #771, but the FluxPulse class does not exist any longer in 0.2.0. Since all create_ methods are going to be replaced in 0.2.0, the test is dropped as well. --- tests/test_dummy.py | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/tests/test_dummy.py b/tests/test_dummy.py index e1f99b7c95..c9d05b9a55 100644 --- a/tests/test_dummy.py +++ b/tests/test_dummy.py @@ -36,21 +36,6 @@ def test_dummy_execute_pulse_sequence(name, acquisition): assert result[0].magnitude.shape == (nshots * ro_pulse.duration,) -def test_dummy_execute_flux_pulse(): - platform = create_platform("dummy") - sequence = PulseSequence() - - pulse = platform.create_qubit_flux_pulse(qubit=0, start=0, duration=50) - sequence.add(pulse) - - options = ExecutionParameters(nshots=None) - _ = platform.execute_pulse_sequence(sequence, options) - - test_pulse = "FluxPulse(0, 50, 1, Rectangular(), flux-0, 0)" - - assert test_pulse == pulse.serial - - def test_dummy_execute_coupler_pulse(): platform = create_platform("dummy_couplers") sequence = PulseSequence() From 153790997801769cb8f7be6ee5d06602c5099ff6 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Wed, 21 Feb 2024 17:32:52 +0400 Subject: [PATCH 0058/1006] test: fix conflicts in tests --- src/qibolab/instruments/qm/controller.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 08d3f23f6e..bf452f5125 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -322,9 +322,7 @@ def create_sequence(self, qubits, sequence, sweepers): qmsequence = Sequence() ro_pulses = [] - for pulse in sorted( - sequence.pulses, key=lambda pulse: (pulse.start, pulse.duration) - ): + for pulse in sorted(sequence, key=lambda pulse: (pulse.start, pulse.duration)): qubit = qubits[pulse.qubit] self.config.register_port(getattr(qubit, pulse.type.name.lower()).port) From 20599b352d8c8d4e69746f05f61caa51778ceea3 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 21 Feb 2024 13:36:45 +0000 Subject: [PATCH 0059/1006] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/qibolab/instruments/qblox/cluster_qcm_bb.py | 1 + src/qibolab/instruments/qblox/cluster_qcm_rf.py | 1 + src/qibolab/pulses/plot.py | 1 + src/qibolab/pulses/pulse.py | 1 + src/qibolab/pulses/shape.py | 1 + tests/test_instruments_qblox.py | 1 - tests/test_pulses.py | 1 + 7 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/qibolab/instruments/qblox/cluster_qcm_bb.py b/src/qibolab/instruments/qblox/cluster_qcm_bb.py index 4b91831a1f..c3e88ab5cb 100644 --- a/src/qibolab/instruments/qblox/cluster_qcm_bb.py +++ b/src/qibolab/instruments/qblox/cluster_qcm_bb.py @@ -1,4 +1,5 @@ """Qblox Cluster QCM driver.""" + import copy import json diff --git a/src/qibolab/instruments/qblox/cluster_qcm_rf.py b/src/qibolab/instruments/qblox/cluster_qcm_rf.py index b7abcb73a5..74f5f206c1 100644 --- a/src/qibolab/instruments/qblox/cluster_qcm_rf.py +++ b/src/qibolab/instruments/qblox/cluster_qcm_rf.py @@ -1,4 +1,5 @@ """Qblox Cluster QCM-RF driver.""" + import copy import json diff --git a/src/qibolab/pulses/plot.py b/src/qibolab/pulses/plot.py index 0ae089c7c1..d1d6ff58e4 100644 --- a/src/qibolab/pulses/plot.py +++ b/src/qibolab/pulses/plot.py @@ -1,4 +1,5 @@ """Plotting tools for pulses and related entities.""" + import matplotlib.pyplot as plt import numpy as np diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index beb7a09621..413a7377b6 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -1,4 +1,5 @@ """Pulse class.""" + from dataclasses import dataclass, fields from enum import Enum from typing import Optional diff --git a/src/qibolab/pulses/shape.py b/src/qibolab/pulses/shape.py index e1ee39aa2f..7d91203632 100644 --- a/src/qibolab/pulses/shape.py +++ b/src/qibolab/pulses/shape.py @@ -1,4 +1,5 @@ """PulseShape class.""" + import re from abc import ABC, abstractmethod diff --git a/tests/test_instruments_qblox.py b/tests/test_instruments_qblox.py index 23069414e2..b743fd7024 100644 --- a/tests/test_instruments_qblox.py +++ b/tests/test_instruments_qblox.py @@ -27,7 +27,6 @@ - safe disconnection of offsets on termination """ - # from .conftest import load_from_platform # INSTRUMENTS_LIST = ["Cluster", "ClusterQRM_RF", "ClusterQCM_RF"] diff --git a/tests/test_pulses.py b/tests/test_pulses.py index c9a6d0cc24..61fa52149c 100644 --- a/tests/test_pulses.py +++ b/tests/test_pulses.py @@ -1,4 +1,5 @@ """Tests ``pulses.py``.""" + import copy import os import pathlib From 7c9e9807d47a43a3d1bd3befb3e2ea8f63e5d1b5 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 29 Jan 2024 12:44:21 +0100 Subject: [PATCH 0060/1006] feat: Split software modulation out of the shape class --- src/qibolab/pulses/shape.py | 111 ++++++++++++++++++++---------------- 1 file changed, 62 insertions(+), 49 deletions(-) diff --git a/src/qibolab/pulses/shape.py b/src/qibolab/pulses/shape.py index 7d91203632..7cdc42cea7 100644 --- a/src/qibolab/pulses/shape.py +++ b/src/qibolab/pulses/shape.py @@ -5,7 +5,6 @@ import numpy as np import numpy.typing as npt -from qibo.config import log from scipy.signal import lfilter SAMPLING_RATE = 1 @@ -15,7 +14,69 @@ a different value. """ +# TODO: they could be distinguished among them, and distinguished from generic float +# arrays, using the NewType pattern -> but this require some more effort to encforce +# types throughout the whole code base Waveform = npt.NDArray[np.float64] +"""""" +IqWaveform = npt.NDArray[np.float64] +"""""" + + +def modulate( + envelope: IqWaveform, + freq: float, + rate: float = SAMPLING_RATE, + phase: float = 0.0, +) -> IqWaveform: + """Modulate the envelope waveform with a carrier. + + `envelope` is a `(2, n)`-shaped array of I and Q (first dimension) envelope signals, + as a function of time (second dimension), and `freq` the frequency of the carrier to + modulate with (usually the IF) in GHz. + `rate` is an optional sampling rate, in Gs/s, to sample the carrier. + + .. note:: + + Only the combination `freq / rate` is actually relevant, but it is frequently + convenient to specify one in GHz and the other in Gs/s. Thus the two arguments + are provided for the simplicity of their interpretation. + + `phase` is an optional initial phase for the carrier. + """ + samples = np.arange(envelope.shape[1]) + phases = (2 * np.pi * freq / rate) * samples + phase + cos = np.cos(phases) + sin = np.sin(phases) + mod = np.array([[cos, -sin], [sin, cos]]) + + # the normalization is related to `mod`, but only applied at the end for the sake of + # performances + return np.einsum("ijt,jt->it", mod, envelope) / np.sqrt(2) + + +def demodulate( + modulated: IqWaveform, + freq: float, + rate: float = SAMPLING_RATE, +) -> IqWaveform: + """Demodulate the acquired pulse. + + The role of the arguments is the same of the corresponding ones in :func:`modulate`, + which is essentially the inverse of this function. + """ + # in case the offsets have not been removed in hardware + modulated = modulated - np.mean(modulated) + + samples = np.arange(modulated.shape[1]) + phases = (2 * np.pi * freq / rate) * samples + cos = np.cos(phases) + sin = np.sin(phases) + demod = np.array([[cos, sin], [-sin, cos]]) + + # the normalization is related to `demod`, but only applied at the end for the sake + # of performances + return np.sqrt(2) * np.einsum("ijt,jt->it", demod, modulated) class ShapeInitError(RuntimeError): @@ -63,54 +124,6 @@ def envelope_waveforms(self, sampling_rate=SAMPLING_RATE): self.envelope_waveform_q(sampling_rate), ) - def modulated_waveform_i(self, _if: int, sampling_rate=SAMPLING_RATE) -> Waveform: - """The waveform of the i component of the pulse, modulated with its - frequency.""" - - return self.modulated_waveforms(_if, sampling_rate)[0] - - def modulated_waveform_q(self, _if: int, sampling_rate=SAMPLING_RATE) -> Waveform: - """The waveform of the q component of the pulse, modulated with its - frequency.""" - - return self.modulated_waveforms(_if, sampling_rate)[1] - - def modulated_waveforms(self, _if: int, sampling_rate=SAMPLING_RATE): - """A tuple with the i and q waveforms of the pulse, modulated with its - frequency.""" - - pulse = self.pulse - if abs(_if) * 2 > sampling_rate: - log.info( - f"WARNING: The frequency of pulse {pulse.id} is higher than the nyqusit frequency ({int(sampling_rate // 2)}) for the device sampling rate: {int(sampling_rate)}" - ) - num_samples = int(np.rint(pulse.duration * sampling_rate)) - time = np.arange(num_samples) / sampling_rate - global_phase = pulse.global_phase - cosalpha = np.cos(2 * np.pi * _if * time + global_phase + pulse.relative_phase) - sinalpha = np.sin(2 * np.pi * _if * time + global_phase + pulse.relative_phase) - - mod_matrix = np.array([[cosalpha, -sinalpha], [sinalpha, cosalpha]]) / np.sqrt( - 2 - ) - - (envelope_waveform_i, envelope_waveform_q) = self.envelope_waveforms( - sampling_rate - ) - result = [] - for n, t, ii, qq in zip( - np.arange(num_samples), - time, - envelope_waveform_i, - envelope_waveform_q, - ): - result.append(mod_matrix[:, :, n] @ np.array([ii, qq])) - mod_signals = np.array(result) - - modulated_waveform_i = mod_signals[:, 0] - modulated_waveform_q = mod_signals[:, 1] - return (modulated_waveform_i, modulated_waveform_q) - def __eq__(self, item) -> bool: """Overloads == operator.""" return isinstance(item, type(self)) From c2a67c4fa47f0ddaeff322007b3fe314a4e3458b Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 29 Jan 2024 13:32:08 +0100 Subject: [PATCH 0061/1006] feat: Remove modulated waveforms access from pulses --- src/qibolab/pulses/pulse.py | 18 ------------------ src/qibolab/pulses/shape.py | 6 ++---- 2 files changed, 2 insertions(+), 22 deletions(-) diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index 413a7377b6..d7445d57f9 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -129,24 +129,6 @@ def envelope_waveforms(self, sampling_rate=SAMPLING_RATE): self.shape.envelope_waveform_q(sampling_rate), ) - def modulated_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: - """The waveform of the i component of the pulse, modulated with its - frequency.""" - - return self.shape.modulated_waveform_i(sampling_rate) - - def modulated_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: - """The waveform of the q component of the pulse, modulated with its - frequency.""" - - return self.shape.modulated_waveform_q(sampling_rate) - - def modulated_waveforms(self, sampling_rate): - """A tuple with the i and q waveforms of the pulse, modulated with its - frequency.""" - - return self.shape.modulated_waveforms(sampling_rate) - def __hash__(self): """Hash the content. diff --git a/src/qibolab/pulses/shape.py b/src/qibolab/pulses/shape.py index 7cdc42cea7..cd2fed4e25 100644 --- a/src/qibolab/pulses/shape.py +++ b/src/qibolab/pulses/shape.py @@ -91,11 +91,9 @@ def __init__(self, msg=None, *args): class PulseShape(ABC): - """Abstract class for pulse shapes. + """Pulse envelopes. - This object is responsible for generating envelope and modulated - waveforms from a set of pulse parameters and its type. Generates - both i (in-phase) and q (quadrature) components. + Generates both i (in-phase) and q (quadrature) components. """ pulse = None From 1588f23913d0c7233c26a34df424446cc8345128 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 29 Jan 2024 14:53:49 +0100 Subject: [PATCH 0062/1006] fix: Replace usage of software modulation in Qblox --- src/qibolab/instruments/qblox/sequencer.py | 31 +++++++++++----------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/src/qibolab/instruments/qblox/sequencer.py b/src/qibolab/instruments/qblox/sequencer.py index 4324f8c85b..86e68b35e3 100644 --- a/src/qibolab/instruments/qblox/sequencer.py +++ b/src/qibolab/instruments/qblox/sequencer.py @@ -5,12 +5,22 @@ from qibolab.instruments.qblox.q1asm import Program from qibolab.pulses import Pulse, PulseSequence, PulseType +from qibolab.pulses.shape import modulate from qibolab.sweeper import Parameter, Sweeper SAMPLING_RATE = 1 """Sampling rate for qblox instruments in GSps.""" +def _modulated_waveforms(pulse: Pulse, hardware: bool = True): + envelopes = pulse.envelope_waveforms(SAMPLING_RATE) + return ( + envelopes + if hardware + else modulate(np.array(envelopes), pulse.frequency, SAMPLING_RATE) + ) + + class WaveformsBuffer: """A class to represent a buffer that holds the unique waveforms used by a sequencer. @@ -64,10 +74,7 @@ def add_waveforms( values = sweeper.get_values(pulse.duration) if not baking_required: - if hardware_mod_en: - waveform_i, waveform_q = pulse_copy.envelope_waveforms(SAMPLING_RATE) - else: - waveform_i, waveform_q = pulse_copy.modulated_waveforms(SAMPLING_RATE) + waveform_i, waveform_q = _modulated_waveforms(pulse_copy, hardware_mod_en) pulse.waveform_i = waveform_i pulse.waveform_q = waveform_q @@ -135,10 +142,7 @@ def bake_pulse_waveforms( for duration in values: pulse_copy.duration = duration - if hardware_mod_en: - waveform = pulse_copy.envelope_waveform_i(SAMPLING_RATE) - else: - waveform = pulse_copy.modulated_waveform_i(SAMPLING_RATE) + waveform = _modulated_waveforms(pulse_copy, hardware_mod_en) padded_duration = int(np.ceil(duration / 4)) * 4 memory_needed = padded_duration @@ -156,14 +160,9 @@ def bake_pulse_waveforms( for duration in values: pulse_copy.duration = duration - if hardware_mod_en: - waveform_i, waveform_q = pulse_copy.envelope_waveforms( - SAMPLING_RATE - ) - else: - waveform_i, waveform_q = pulse_copy.modulated_waveforms( - SAMPLING_RATE - ) + waveform_i, waveform_q = _modulated_waveforms( + pulse_copy, hardware_mod_en + ) padded_duration = int(np.ceil(duration / 4)) * 4 memory_needed = padded_duration * 2 From eec8809de3be5d31960b14ab08d56c3359f21365 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 29 Jan 2024 14:58:06 +0100 Subject: [PATCH 0063/1006] feat: Replace demodulation defined in qblox with global one --- src/qibolab/instruments/qblox/acquisition.py | 23 +++++--------------- 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/src/qibolab/instruments/qblox/acquisition.py b/src/qibolab/instruments/qblox/acquisition.py index 69da4e5e6b..7f4d03ce7c 100644 --- a/src/qibolab/instruments/qblox/acquisition.py +++ b/src/qibolab/instruments/qblox/acquisition.py @@ -3,24 +3,9 @@ import numpy as np -SAMPLING_RATE = 1 - +from ...pulses.shape import demodulate -def demodulate(input_i, input_q, frequency): - """Demodulates and integrates the acquired pulse.""" - # DOWN Conversion - # qblox does not remove the offsets in hardware - modulated_i = input_i - np.mean(input_i) - modulated_q = input_q - np.mean(input_q) - - num_samples = modulated_i.shape[0] - time = np.arange(num_samples) - phase = 2 * np.pi * frequency * time / SAMPLING_RATE - cosalpha = np.cos(phase) - sinalpha = np.sin(phase) - demod_matrix = np.sqrt(2) * np.array([[cosalpha, sinalpha], [-sinalpha, cosalpha]]) - result = np.einsum("ijt,jt->i", demod_matrix, np.stack([modulated_i, modulated_q])) - return np.sqrt(2) * result / num_samples +SAMPLING_RATE = 1 @dataclass @@ -73,7 +58,9 @@ def data(self): """ # TODO: to be updated once the functionality of ExecutionResults is extended if self.i is None or self.q is None: - self.i, self.q = demodulate(self.raw_i, self.raw_q, self.frequency) + self.i, self.q = demodulate( + np.array((self.raw_i, self.raw_q)), self.frequency + ).mean(axis=1) return (self.i, self.q) From 99e826d956af386439fb77d114de794df0a1f16c Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 29 Jan 2024 16:10:22 +0100 Subject: [PATCH 0064/1006] test: Move pulse tests into a folder, split sequence ones --- tests/pulses/__init__.py | 0 tests/{ => pulses}/test_pulses.py | 208 ----------------------------- tests/pulses/test_sequence.py | 209 ++++++++++++++++++++++++++++++ 3 files changed, 209 insertions(+), 208 deletions(-) create mode 100644 tests/pulses/__init__.py rename tests/{ => pulses}/test_pulses.py (75%) create mode 100644 tests/pulses/test_sequence.py diff --git a/tests/pulses/__init__.py b/tests/pulses/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/test_pulses.py b/tests/pulses/test_pulses.py similarity index 75% rename from tests/test_pulses.py rename to tests/pulses/test_pulses.py index 61fa52149c..0ed89f8429 100644 --- a/tests/test_pulses.py +++ b/tests/pulses/test_pulses.py @@ -386,169 +386,6 @@ def test_pulse_aliases(): assert fp.channel == 0 -def test_pulsesequence_init(): - p1 = Pulse(400, 40, 0.9, 100e6, 0, Drag(5, 1), 3, PulseType.DRIVE) - p2 = Pulse(500, 40, 0.9, 100e6, 0, Drag(5, 1), 2, PulseType.DRIVE) - p3 = Pulse(600, 40, 0.9, 100e6, 0, Drag(5, 1), 1, PulseType.DRIVE) - - ps = PulseSequence() - assert type(ps) == PulseSequence - - ps = PulseSequence([p1, p2, p3]) - assert len(ps) == 3 - assert ps[0] == p1 - assert ps[1] == p2 - assert ps[2] == p3 - - other_ps = PulseSequence([p1, p2, p3]) - assert len(other_ps) == 3 - assert other_ps[0] == p1 - assert other_ps[1] == p2 - assert other_ps[2] == p3 - - plist = [p1, p2, p3] - n = 0 - for pulse in ps: - assert plist[n] == pulse - n += 1 - - -def test_pulsesequence_operators(): - ps = PulseSequence() - ps += [Pulse(800, 200, 0.9, 20e6, 0, Rectangular(), 1, type=PulseType.READOUT)] - ps = ps + [Pulse(800, 200, 0.9, 20e6, 0, Rectangular(), 2, type=PulseType.READOUT)] - ps = [Pulse(800, 200, 0.9, 20e6, 0, Rectangular(), 3, type=PulseType.READOUT)] + ps - - p4 = Pulse(100, 40, 0.9, 50e6, 0, Gaussian(5), 3, PulseType.DRIVE) - p5 = Pulse(200, 40, 0.9, 50e6, 0, Gaussian(5), 2, PulseType.DRIVE) - p6 = Pulse(300, 40, 0.9, 50e6, 0, Gaussian(5), 1, PulseType.DRIVE) - - another_ps = PulseSequence() - another_ps.append(p4) - another_ps.extend([p5, p6]) - - assert another_ps[0] == p4 - assert another_ps[1] == p5 - assert another_ps[2] == p6 - - ps += another_ps - - assert len(ps) == 6 - assert p5 in ps - - # ps.plot() - - p7 = Pulse(600, 40, 0.9, 100e6, 0, Drag(5, 1), 1, PulseType.DRIVE) - yet_another_ps = PulseSequence([p7]) - assert len(yet_another_ps) == 1 - yet_another_ps *= 3 - assert len(yet_another_ps) == 3 - yet_another_ps *= 3 - assert len(yet_another_ps) == 9 - - p8 = Pulse(600, 40, 0.9, 100e6, 0, Drag(5, 1), 1, PulseType.DRIVE) - p9 = Pulse(600, 40, 0.9, 100e6, 0, Drag(5, 1), 2, PulseType.DRIVE) - and_yet_another_ps = 2 * PulseSequence([p9]) + [p8] * 3 - assert len(and_yet_another_ps) == 5 - - -def test_pulsesequence_start_finish(): - p1 = Pulse(20, 40, 0.9, 200e6, 0, Drag(5, 1), 1, PulseType.DRIVE) - p2 = Pulse(60, 1000, 0.9, 20e6, 0, Rectangular(), 2, PulseType.READOUT) - ps = PulseSequence([p1]) + [p2] - assert ps.start == p1.start - assert ps.finish == p2.finish - - p1.start = None - assert p1.finish is None - p2.duration = None - assert p2.finish is None - - -def test_pulsesequence_get_channel_pulses(): - p1 = Pulse(0, 400, 0.9, 20e6, 0, Gaussian(5), 10) - p2 = Pulse(100, 400, 0.9, 20e6, 0, Rectangular(), 30, type=PulseType.READOUT) - p3 = Pulse(300, 400, 0.9, 20e6, 0, Drag(5, 50), 20) - p4 = Pulse(400, 400, 0.9, 20e6, 0, Drag(5, 50), 30) - p5 = Pulse(500, 400, 0.9, 20e6, 0, Rectangular(), 20, type=PulseType.READOUT) - p6 = Pulse(600, 400, 0.9, 20e6, 0, Gaussian(5), 30) - - ps = PulseSequence([p1, p2, p3, p4, p5, p6]) - assert ps.channels == [10, 20, 30] - assert len(ps.get_channel_pulses(10)) == 1 - assert len(ps.get_channel_pulses(20)) == 2 - assert len(ps.get_channel_pulses(30)) == 3 - assert len(ps.get_channel_pulses(20, 30)) == 5 - - -def test_pulsesequence_get_qubit_pulses(): - p1 = Pulse(0, 400, 0.9, 20e6, 0, Gaussian(5), 10, qubit=0) - p2 = Pulse( - 100, - 400, - 0.9, - 20e6, - 0, - Rectangular(), - channel=30, - qubit=0, - type=PulseType.READOUT, - ) - p3 = Pulse(300, 400, 0.9, 20e6, 0, Drag(5, 50), 20, qubit=1) - p4 = Pulse(400, 400, 0.9, 20e6, 0, Drag(5, 50), 30, qubit=1) - p5 = Pulse( - 500, - 400, - 0.9, - 20e6, - 0, - Rectangular(), - channel=30, - qubit=1, - type=PulseType.READOUT, - ) - p6 = Pulse.flux(600, 400, 0.9, Rectangular(), channel=40, qubit=1) - p7 = Pulse.flux(900, 400, 0.9, Rectangular(), channel=40, qubit=2) - - ps = PulseSequence([p1, p2, p3, p4, p5, p6, p7]) - assert ps.qubits == [0, 1, 2] - assert len(ps.get_qubit_pulses(0)) == 2 - assert len(ps.get_qubit_pulses(1)) == 4 - assert len(ps.get_qubit_pulses(2)) == 1 - assert len(ps.get_qubit_pulses(0, 1)) == 6 - - -def test_pulsesequence_pulses_overlap(): - p1 = Pulse(0, 400, 0.9, 20e6, 0, Gaussian(5), 10) - p2 = Pulse(100, 400, 0.9, 20e6, 0, Rectangular(), 30, type=PulseType.READOUT) - p3 = Pulse(300, 400, 0.9, 20e6, 0, Drag(5, 50), 20) - p4 = Pulse(400, 400, 0.9, 20e6, 0, Drag(5, 50), 30) - p5 = Pulse(500, 400, 0.9, 20e6, 0, Rectangular(), 20, type=PulseType.READOUT) - p6 = Pulse(600, 400, 0.9, 20e6, 0, Gaussian(5), 30) - - ps = PulseSequence([p1, p2, p3, p4, p5, p6]) - assert ps.pulses_overlap - assert not ps.get_channel_pulses(10).pulses_overlap - assert ps.get_channel_pulses(20).pulses_overlap - assert ps.get_channel_pulses(30).pulses_overlap - - -def test_pulsesequence_separate_overlapping_pulses(): - p1 = Pulse(0, 400, 0.9, 20e6, 0, Gaussian(5), 10) - p2 = Pulse(100, 400, 0.9, 20e6, 0, Rectangular(), qubit=30, type=PulseType.READOUT) - p3 = Pulse(300, 400, 0.9, 20e6, 0, Drag(5, 50), 20) - p4 = Pulse(400, 400, 0.9, 20e6, 0, Drag(5, 50), 30) - p5 = Pulse(500, 400, 0.9, 20e6, 0, Rectangular(), qubit=20, type=PulseType.READOUT) - p6 = Pulse(600, 400, 0.9, 20e6, 0, Gaussian(5), 30) - - ps = PulseSequence([p1, p2, p3, p4, p5, p6]) - n = 70 - for segregated_ps in ps.separate_overlapping_pulses(): - n += 1 - for pulse in segregated_ps: - pulse.channel = n - - def test_pulse_pulse_order(): t0 = 0 t = 0 @@ -830,51 +667,6 @@ def test_readout_pulse(): assert pulse.duration == duration -def test_pulse_sequence_add_readout(): - sequence = PulseSequence() - sequence.append( - Pulse( - start=0, - frequency=200_000_000, - amplitude=0.3, - duration=60, - relative_phase=0, - shape="Gaussian(5)", - channel=1, - ) - ) - - sequence.append( - Pulse( - start=64, - frequency=200_000_000, - amplitude=0.3, - duration=60, - relative_phase=0, - shape="Drag(5, 2)", - channel=1, - type="qf", - ) - ) - - sequence.append( - Pulse( - start=128, - frequency=20_000_000, - amplitude=0.9, - duration=2000, - relative_phase=0, - shape="Rectangular()", - channel=11, - type=PulseType.READOUT, - ) - ) - assert len(sequence) == 3 - assert len(sequence.ro_pulses) == 1 - assert len(sequence.qd_pulses) == 1 - assert len(sequence.qf_pulses) == 1 - - def test_envelope_waveform_i_q(): envelope_i = np.cos(np.arange(0, 10, 0.01)) envelope_q = np.sin(np.arange(0, 10, 0.01)) diff --git a/tests/pulses/test_sequence.py b/tests/pulses/test_sequence.py new file mode 100644 index 0000000000..2c08e3e2e7 --- /dev/null +++ b/tests/pulses/test_sequence.py @@ -0,0 +1,209 @@ +from qibolab.pulses import Drag, Gaussian, Pulse, PulseSequence, PulseType, Rectangular + + +def test_add_readout(): + sequence = PulseSequence() + sequence.append( + Pulse( + start=0, + frequency=200_000_000, + amplitude=0.3, + duration=60, + relative_phase=0, + shape="Gaussian(5)", + channel=1, + ) + ) + + sequence.append( + Pulse( + start=64, + frequency=200_000_000, + amplitude=0.3, + duration=60, + relative_phase=0, + shape="Drag(5, 2)", + channel=1, + type="qf", + ) + ) + + sequence.append( + Pulse( + start=128, + frequency=20_000_000, + amplitude=0.9, + duration=2000, + relative_phase=0, + shape="Rectangular()", + channel=11, + type=PulseType.READOUT, + ) + ) + assert len(sequence) == 3 + assert len(sequence.ro_pulses) == 1 + assert len(sequence.qd_pulses) == 1 + assert len(sequence.qf_pulses) == 1 + + +def test_separate_overlapping_pulses(): + p1 = Pulse(0, 400, 0.9, 20e6, 0, Gaussian(5), 10) + p2 = Pulse(100, 400, 0.9, 20e6, 0, Rectangular(), qubit=30, type=PulseType.READOUT) + p3 = Pulse(300, 400, 0.9, 20e6, 0, Drag(5, 50), 20) + p4 = Pulse(400, 400, 0.9, 20e6, 0, Drag(5, 50), 30) + p5 = Pulse(500, 400, 0.9, 20e6, 0, Rectangular(), qubit=20, type=PulseType.READOUT) + p6 = Pulse(600, 400, 0.9, 20e6, 0, Gaussian(5), 30) + + ps = PulseSequence([p1, p2, p3, p4, p5, p6]) + n = 70 + for segregated_ps in ps.separate_overlapping_pulses(): + n += 1 + for pulse in segregated_ps: + pulse.channel = n + + +def test_get_qubit_pulses(): + p1 = Pulse(0, 400, 0.9, 20e6, 0, Gaussian(5), 10, qubit=0) + p2 = Pulse( + 100, + 400, + 0.9, + 20e6, + 0, + Rectangular(), + channel=30, + qubit=0, + type=PulseType.READOUT, + ) + p3 = Pulse(300, 400, 0.9, 20e6, 0, Drag(5, 50), 20, qubit=1) + p4 = Pulse(400, 400, 0.9, 20e6, 0, Drag(5, 50), 30, qubit=1) + p5 = Pulse( + 500, + 400, + 0.9, + 20e6, + 0, + Rectangular(), + channel=30, + qubit=1, + type=PulseType.READOUT, + ) + p6 = Pulse.flux(600, 400, 0.9, Rectangular(), channel=40, qubit=1) + p7 = Pulse.flux(900, 400, 0.9, Rectangular(), channel=40, qubit=2) + + ps = PulseSequence([p1, p2, p3, p4, p5, p6, p7]) + assert ps.qubits == [0, 1, 2] + assert len(ps.get_qubit_pulses(0)) == 2 + assert len(ps.get_qubit_pulses(1)) == 4 + assert len(ps.get_qubit_pulses(2)) == 1 + assert len(ps.get_qubit_pulses(0, 1)) == 6 + + +def test_pulses_overlap(): + p1 = Pulse(0, 400, 0.9, 20e6, 0, Gaussian(5), 10) + p2 = Pulse(100, 400, 0.9, 20e6, 0, Rectangular(), 30, type=PulseType.READOUT) + p3 = Pulse(300, 400, 0.9, 20e6, 0, Drag(5, 50), 20) + p4 = Pulse(400, 400, 0.9, 20e6, 0, Drag(5, 50), 30) + p5 = Pulse(500, 400, 0.9, 20e6, 0, Rectangular(), 20, type=PulseType.READOUT) + p6 = Pulse(600, 400, 0.9, 20e6, 0, Gaussian(5), 30) + + ps = PulseSequence([p1, p2, p3, p4, p5, p6]) + assert ps.pulses_overlap + assert not ps.get_channel_pulses(10).pulses_overlap + assert ps.get_channel_pulses(20).pulses_overlap + assert ps.get_channel_pulses(30).pulses_overlap + + +def test_get_channel_pulses(): + p1 = Pulse(0, 400, 0.9, 20e6, 0, Gaussian(5), 10) + p2 = Pulse(100, 400, 0.9, 20e6, 0, Rectangular(), 30, type=PulseType.READOUT) + p3 = Pulse(300, 400, 0.9, 20e6, 0, Drag(5, 50), 20) + p4 = Pulse(400, 400, 0.9, 20e6, 0, Drag(5, 50), 30) + p5 = Pulse(500, 400, 0.9, 20e6, 0, Rectangular(), 20, type=PulseType.READOUT) + p6 = Pulse(600, 400, 0.9, 20e6, 0, Gaussian(5), 30) + + ps = PulseSequence([p1, p2, p3, p4, p5, p6]) + assert ps.channels == [10, 20, 30] + assert len(ps.get_channel_pulses(10)) == 1 + assert len(ps.get_channel_pulses(20)) == 2 + assert len(ps.get_channel_pulses(30)) == 3 + assert len(ps.get_channel_pulses(20, 30)) == 5 + + +def test_start_finish(): + p1 = Pulse(20, 40, 0.9, 200e6, 0, Drag(5, 1), 1, PulseType.DRIVE) + p2 = Pulse(60, 1000, 0.9, 20e6, 0, Rectangular(), 2, PulseType.READOUT) + ps = PulseSequence([p1]) + [p2] + assert ps.start == p1.start + assert ps.finish == p2.finish + + p1.start = None + assert p1.finish is None + p2.duration = None + assert p2.finish is None + + +def test_init(): + p1 = Pulse(400, 40, 0.9, 100e6, 0, Drag(5, 1), 3, PulseType.DRIVE) + p2 = Pulse(500, 40, 0.9, 100e6, 0, Drag(5, 1), 2, PulseType.DRIVE) + p3 = Pulse(600, 40, 0.9, 100e6, 0, Drag(5, 1), 1, PulseType.DRIVE) + + ps = PulseSequence() + assert type(ps) == PulseSequence + + ps = PulseSequence([p1, p2, p3]) + assert len(ps) == 3 + assert ps[0] == p1 + assert ps[1] == p2 + assert ps[2] == p3 + + other_ps = PulseSequence([p1, p2, p3]) + assert len(other_ps) == 3 + assert other_ps[0] == p1 + assert other_ps[1] == p2 + assert other_ps[2] == p3 + + plist = [p1, p2, p3] + n = 0 + for pulse in ps: + assert plist[n] == pulse + n += 1 + + +def test_operators(): + ps = PulseSequence() + ps += [Pulse(800, 200, 0.9, 20e6, 0, Rectangular(), 1, type=PulseType.READOUT)] + ps = ps + [Pulse(800, 200, 0.9, 20e6, 0, Rectangular(), 2, type=PulseType.READOUT)] + ps = [Pulse(800, 200, 0.9, 20e6, 0, Rectangular(), 3, type=PulseType.READOUT)] + ps + + p4 = Pulse(100, 40, 0.9, 50e6, 0, Gaussian(5), 3, PulseType.DRIVE) + p5 = Pulse(200, 40, 0.9, 50e6, 0, Gaussian(5), 2, PulseType.DRIVE) + p6 = Pulse(300, 40, 0.9, 50e6, 0, Gaussian(5), 1, PulseType.DRIVE) + + another_ps = PulseSequence() + another_ps.append(p4) + another_ps.extend([p5, p6]) + + assert another_ps[0] == p4 + assert another_ps[1] == p5 + assert another_ps[2] == p6 + + ps += another_ps + + assert len(ps) == 6 + assert p5 in ps + + # ps.plot() + + p7 = Pulse(600, 40, 0.9, 100e6, 0, Drag(5, 1), 1, PulseType.DRIVE) + yet_another_ps = PulseSequence([p7]) + assert len(yet_another_ps) == 1 + yet_another_ps *= 3 + assert len(yet_another_ps) == 3 + yet_another_ps *= 3 + assert len(yet_another_ps) == 9 + + p8 = Pulse(600, 40, 0.9, 100e6, 0, Drag(5, 1), 1, PulseType.DRIVE) + p9 = Pulse(600, 40, 0.9, 100e6, 0, Drag(5, 1), 2, PulseType.DRIVE) + and_yet_another_ps = 2 * PulseSequence([p9]) + [p8] * 3 + assert len(and_yet_another_ps) == 5 From 75ae8d13f04ef5d7a2fb6640ad1415dc606847a8 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 29 Jan 2024 16:18:15 +0100 Subject: [PATCH 0065/1006] test: Split shape-related tests into their own module --- .../pulses/{test_pulses.py => test_pulse.py} | 333 +----------------- tests/pulses/test_shape.py | 320 +++++++++++++++++ 2 files changed, 325 insertions(+), 328 deletions(-) rename tests/pulses/{test_pulses.py => test_pulse.py} (51%) create mode 100644 tests/pulses/test_shape.py diff --git a/tests/pulses/test_pulses.py b/tests/pulses/test_pulse.py similarity index 51% rename from tests/pulses/test_pulses.py rename to tests/pulses/test_pulse.py index 0ed89f8429..111f258faa 100644 --- a/tests/pulses/test_pulses.py +++ b/tests/pulses/test_pulse.py @@ -55,7 +55,7 @@ def test_plot_functions(): os.remove(plot_file) -def test_pulse_init(): +def test_init(): # standard initialisation p0 = Pulse( start=0, @@ -170,7 +170,7 @@ def test_pulse_init(): assert p12.finish == 5.5 + 34.33 -def test_pulse_attributes(): +def test_attributes(): channel = 0 qubit = 0 @@ -232,106 +232,7 @@ def test_is_equal_ignoring_start(): assert not p1.is_equal_ignoring_start(p4) -@pytest.mark.parametrize( - "shape", [Rectangular(), Gaussian(5), GaussianSquare(5, 0.9), Drag(5, 1)] -) -def test_pulseshape_sampling_rate(shape): - pulse = Pulse(0, 40, 0.9, 100e6, 0, shape, 0, PulseType.DRIVE) - assert len(pulse.envelope_waveform_i(sampling_rate=1)) == 40 - assert len(pulse.envelope_waveform_i(sampling_rate=100)) == 4000 - - -def testhape_eval(): - shape = PulseShape.eval("Rectangular()") - assert isinstance(shape, Rectangular) - with pytest.raises(ValueError): - shape = PulseShape.eval("Ciao()") - - -@pytest.mark.parametrize("rel_sigma,beta", [(5, 1), (5, -1), (3, -0.03), (4, 0.02)]) -def test_drag_shape_eval(rel_sigma, beta): - shape = PulseShape.eval(f"Drag({rel_sigma}, {beta})") - assert isinstance(shape, Drag) - assert shape.rel_sigma == rel_sigma - assert shape.beta == beta - - -def test_raise_shapeiniterror(): - shape = Rectangular() - with pytest.raises(ShapeInitError): - shape.envelope_waveform_i() - with pytest.raises(ShapeInitError): - shape.envelope_waveform_q() - - shape = Gaussian(0) - with pytest.raises(ShapeInitError): - shape.envelope_waveform_i() - with pytest.raises(ShapeInitError): - shape.envelope_waveform_q() - - shape = GaussianSquare(0, 1) - with pytest.raises(ShapeInitError): - shape.envelope_waveform_i() - with pytest.raises(ShapeInitError): - shape.envelope_waveform_q() - - shape = Drag(0, 0) - with pytest.raises(ShapeInitError): - shape.envelope_waveform_i() - with pytest.raises(ShapeInitError): - shape.envelope_waveform_q() - - shape = IIR([0], [0], None) - with pytest.raises(ShapeInitError): - shape.envelope_waveform_i() - with pytest.raises(ShapeInitError): - shape.envelope_waveform_q() - - shape = SNZ(0) - with pytest.raises(ShapeInitError): - shape.envelope_waveform_i() - with pytest.raises(ShapeInitError): - shape.envelope_waveform_q() - - shape = eCap(0) - with pytest.raises(ShapeInitError): - shape.envelope_waveform_i() - with pytest.raises(ShapeInitError): - shape.envelope_waveform_q() - - -def test_pulseshape_drag_shape(): - pulse = Pulse(0, 2, 1, 4e9, 0, Drag(2, 1), 0, PulseType.DRIVE) - # envelope i & envelope q should cross nearly at 0 and at 2 - waveform = pulse.envelope_waveform_i(sampling_rate=10) - target_waveform = np.array( - [ - 0.63683161, - 0.69680478, - 0.7548396, - 0.80957165, - 0.85963276, - 0.90370708, - 0.94058806, - 0.96923323, - 0.98881304, - 0.99875078, - 0.99875078, - 0.98881304, - 0.96923323, - 0.94058806, - 0.90370708, - 0.85963276, - 0.80957165, - 0.7548396, - 0.69680478, - 0.63683161, - ] - ) - np.testing.assert_allclose(waveform, target_waveform) - - -def test_pulse_hash(): +def test_hash(): rp = Pulse(0, 40, 0.9, 100e6, 0, Rectangular(), 0, PulseType.DRIVE) dp = Pulse(0, 40, 0.9, 100e6, 0, Drag(5, 1), 0, PulseType.DRIVE) hash(rp) @@ -352,7 +253,7 @@ def test_pulse_hash(): assert p1 == p3 -def test_pulse_aliases(): +def test_aliases(): rop = Pulse( start=0, duration=50, @@ -386,7 +287,7 @@ def test_pulse_aliases(): assert fp.channel == 0 -def test_pulse_pulse_order(): +def test_pulse_order(): t0 = 0 t = 0 p1 = Pulse(t0, 400, 0.9, 20e6, 0, Gaussian(5), 10) @@ -410,230 +311,6 @@ def sortseq(sequence): assert sortseq(ps1) == sortseq(ps2) -def modulate( - i: np.ndarray, - q: np.ndarray, - num_samples: int, - frequency: int, - phase: float, - sampling_rate: float, -): # -> tuple[np.ndarray, np.ndarray]: - time = np.arange(num_samples) / sampling_rate - cosalpha = np.cos(2 * np.pi * frequency * time + phase) - sinalpha = np.sin(2 * np.pi * frequency * time + phase) - mod_matrix = np.array([[cosalpha, -sinalpha], [sinalpha, cosalpha]]) / np.sqrt(2) - result = [] - for n, t, ii, qq in zip(np.arange(num_samples), time, i, q): - result.append(mod_matrix[:, :, n] @ np.array([ii, qq])) - mod_signals = np.array(result) - return mod_signals[:, 0], mod_signals[:, 1] - - -def test_pulseshape_rectangular(): - pulse = Pulse( - start=0, - duration=50, - amplitude=1, - frequency=200_000_000, - relative_phase=0, - shape=Rectangular(), - channel=1, - qubit=0, - ) - _if = 0 - - assert pulse.duration == 50 - assert isinstance(pulse.shape, Rectangular) - assert pulse.shape.name == "Rectangular" - assert repr(pulse.shape) == "Rectangular()" - - sampling_rate = 1 - num_samples = int(pulse.duration / sampling_rate) - i, q = ( - pulse.amplitude * np.ones(num_samples), - pulse.amplitude * np.zeros(num_samples), - ) - global_phase = ( - 2 * np.pi * _if * pulse.start / 1e9 - ) # pulse start, duration and finish are in ns - mod_i, mod_q = modulate( - i, q, num_samples, _if, global_phase + pulse.relative_phase, sampling_rate - ) - - np.testing.assert_allclose(pulse.shape.envelope_waveform_i(sampling_rate), i) - np.testing.assert_allclose(pulse.shape.envelope_waveform_q(sampling_rate), q) - np.testing.assert_allclose( - pulse.shape.modulated_waveform_i(_if, sampling_rate), mod_i - ) - np.testing.assert_allclose( - pulse.shape.modulated_waveform_q(_if, sampling_rate), mod_q - ) - - -def test_pulseshape_gaussian(): - pulse = Pulse( - start=0, - duration=50, - amplitude=1, - frequency=200_000_000, - relative_phase=0, - shape=Gaussian(5), - channel=1, - qubit=0, - ) - _if = 0 - - assert pulse.duration == 50 - assert isinstance(pulse.shape, Gaussian) - assert pulse.shape.name == "Gaussian" - assert pulse.shape.rel_sigma == 5 - assert repr(pulse.shape) == "Gaussian(5)" - - sampling_rate = 1 - num_samples = int(pulse.duration / sampling_rate) - x = np.arange(0, num_samples, 1) - i = pulse.amplitude * np.exp( - -(1 / 2) - * ( - ((x - (num_samples - 1) / 2) ** 2) - / (((num_samples) / pulse.shape.rel_sigma) ** 2) - ) - ) - q = pulse.amplitude * np.zeros(num_samples) - global_phase = ( - 2 * np.pi * pulse.frequency * pulse.start / 1e9 - ) # pulse start, duration and finish are in ns - mod_i, mod_q = modulate( - i, q, num_samples, _if, global_phase + pulse.relative_phase, sampling_rate - ) - - np.testing.assert_allclose(pulse.shape.envelope_waveform_i(sampling_rate), i) - np.testing.assert_allclose(pulse.shape.envelope_waveform_q(sampling_rate), q) - np.testing.assert_allclose( - pulse.shape.modulated_waveform_i(_if, sampling_rate), mod_i - ) - np.testing.assert_allclose( - pulse.shape.modulated_waveform_q(_if, sampling_rate), mod_q - ) - - -def test_pulseshape_drag(): - pulse = Pulse( - start=0, - duration=50, - amplitude=1, - frequency=200_000_000, - relative_phase=0, - shape=Drag(5, 0.2), - channel=1, - qubit=0, - ) - _if = 0 - - assert pulse.duration == 50 - assert isinstance(pulse.shape, Drag) - assert pulse.shape.name == "Drag" - assert pulse.shape.rel_sigma == 5 - assert pulse.shape.beta == 0.2 - assert repr(pulse.shape) == "Drag(5, 0.2)" - - sampling_rate = 1 - num_samples = int(pulse.duration / 1 * sampling_rate) - x = np.arange(0, num_samples, 1) - i = pulse.amplitude * np.exp( - -(1 / 2) - * ( - ((x - (num_samples - 1) / 2) ** 2) - / (((num_samples) / pulse.shape.rel_sigma) ** 2) - ) - ) - q = ( - pulse.shape.beta - * (-(x - (num_samples - 1) / 2) / ((num_samples / pulse.shape.rel_sigma) ** 2)) - * i - * sampling_rate - ) - global_phase = ( - 2 * np.pi * _if * pulse.start / 1e9 - ) # pulse start, duration and finish are in ns - mod_i, mod_q = modulate( - i, q, num_samples, _if, global_phase + pulse.relative_phase, sampling_rate - ) - - np.testing.assert_allclose(pulse.shape.envelope_waveform_i(sampling_rate), i) - np.testing.assert_allclose(pulse.shape.envelope_waveform_q(sampling_rate), q) - np.testing.assert_allclose( - pulse.shape.modulated_waveform_i(_if, sampling_rate), mod_i - ) - np.testing.assert_allclose( - pulse.shape.modulated_waveform_q(_if, sampling_rate), mod_q - ) - - -def test_pulseshape_eq(): - """Checks == operator for pulse shapes.""" - - shape1 = Rectangular() - shape2 = Rectangular() - shape3 = Gaussian(5) - assert shape1 == shape2 - assert not shape1 == shape3 - - shape1 = Gaussian(4) - shape2 = Gaussian(4) - shape3 = Gaussian(5) - assert shape1 == shape2 - assert not shape1 == shape3 - - shape1 = GaussianSquare(4, 0.01) - shape2 = GaussianSquare(4, 0.01) - shape3 = GaussianSquare(5, 0.01) - shape4 = GaussianSquare(4, 0.05) - shape5 = GaussianSquare(5, 0.05) - assert shape1 == shape2 - assert not shape1 == shape3 - assert not shape1 == shape4 - assert not shape1 == shape5 - - shape1 = Drag(4, 0.01) - shape2 = Drag(4, 0.01) - shape3 = Drag(5, 0.01) - shape4 = Drag(4, 0.05) - shape5 = Drag(5, 0.05) - assert shape1 == shape2 - assert not shape1 == shape3 - assert not shape1 == shape4 - assert not shape1 == shape5 - - shape1 = IIR([-0.5, 2], [1], Rectangular()) - shape2 = IIR([-0.5, 2], [1], Rectangular()) - shape3 = IIR([-0.5, 4], [1], Rectangular()) - shape4 = IIR([-0.4, 2], [1], Rectangular()) - shape5 = IIR([-0.5, 2], [2], Rectangular()) - shape6 = IIR([-0.5, 2], [2], Gaussian(5)) - assert shape1 == shape2 - assert not shape1 == shape3 - assert not shape1 == shape4 - assert not shape1 == shape5 - assert not shape1 == shape6 - - shape1 = SNZ(5) - shape2 = SNZ(5) - shape3 = SNZ(2) - shape4 = SNZ(2, 0.1) - shape5 = SNZ(2, 0.1) - assert shape1 == shape2 - assert not shape1 == shape3 - assert not shape1 == shape4 - assert not shape1 == shape5 - - shape1 = eCap(4) - shape2 = eCap(4) - shape3 = eCap(5) - assert shape1 == shape2 - assert not shape1 == shape3 - - def test_pulse(): duration = 50 rel_sigma = 5 diff --git a/tests/pulses/test_shape.py b/tests/pulses/test_shape.py new file mode 100644 index 0000000000..3db07dc8dd --- /dev/null +++ b/tests/pulses/test_shape.py @@ -0,0 +1,320 @@ +import numpy as np +import pytest + +from qibolab.pulses import ( + IIR, + SNZ, + Drag, + Gaussian, + GaussianSquare, + Pulse, + PulseShape, + PulseType, + Rectangular, + ShapeInitError, + eCap, +) + + +@pytest.mark.parametrize( + "shape", [Rectangular(), Gaussian(5), GaussianSquare(5, 0.9), Drag(5, 1)] +) +def test_sampling_rate(shape): + pulse = Pulse(0, 40, 0.9, 100e6, 0, shape, 0, PulseType.DRIVE) + assert len(pulse.envelope_waveform_i(sampling_rate=1)) == 40 + assert len(pulse.envelope_waveform_i(sampling_rate=100)) == 4000 + + +def test_eval(): + shape = PulseShape.eval("Rectangular()") + assert isinstance(shape, Rectangular) + with pytest.raises(ValueError): + shape = PulseShape.eval("Ciao()") + + +@pytest.mark.parametrize("rel_sigma,beta", [(5, 1), (5, -1), (3, -0.03), (4, 0.02)]) +def test_drag_shape_eval(rel_sigma, beta): + shape = PulseShape.eval(f"Drag({rel_sigma}, {beta})") + assert isinstance(shape, Drag) + assert shape.rel_sigma == rel_sigma + assert shape.beta == beta + + +def test_raise_shapeiniterror(): + shape = Rectangular() + with pytest.raises(ShapeInitError): + shape.envelope_waveform_i() + with pytest.raises(ShapeInitError): + shape.envelope_waveform_q() + + shape = Gaussian(0) + with pytest.raises(ShapeInitError): + shape.envelope_waveform_i() + with pytest.raises(ShapeInitError): + shape.envelope_waveform_q() + + shape = GaussianSquare(0, 1) + with pytest.raises(ShapeInitError): + shape.envelope_waveform_i() + with pytest.raises(ShapeInitError): + shape.envelope_waveform_q() + + shape = Drag(0, 0) + with pytest.raises(ShapeInitError): + shape.envelope_waveform_i() + with pytest.raises(ShapeInitError): + shape.envelope_waveform_q() + + shape = IIR([0], [0], None) + with pytest.raises(ShapeInitError): + shape.envelope_waveform_i() + with pytest.raises(ShapeInitError): + shape.envelope_waveform_q() + + shape = SNZ(0) + with pytest.raises(ShapeInitError): + shape.envelope_waveform_i() + with pytest.raises(ShapeInitError): + shape.envelope_waveform_q() + + shape = eCap(0) + with pytest.raises(ShapeInitError): + shape.envelope_waveform_i() + with pytest.raises(ShapeInitError): + shape.envelope_waveform_q() + + +def test_drag_shape(): + pulse = Pulse(0, 2, 1, 4e9, 0, Drag(2, 1), 0, PulseType.DRIVE) + # envelope i & envelope q should cross nearly at 0 and at 2 + waveform = pulse.envelope_waveform_i(sampling_rate=10) + target_waveform = np.array( + [ + 0.63683161, + 0.69680478, + 0.7548396, + 0.80957165, + 0.85963276, + 0.90370708, + 0.94058806, + 0.96923323, + 0.98881304, + 0.99875078, + 0.99875078, + 0.98881304, + 0.96923323, + 0.94058806, + 0.90370708, + 0.85963276, + 0.80957165, + 0.7548396, + 0.69680478, + 0.63683161, + ] + ) + np.testing.assert_allclose(waveform, target_waveform) + + +def test_rectangular(): + pulse = Pulse( + start=0, + duration=50, + amplitude=1, + frequency=200_000_000, + relative_phase=0, + shape=Rectangular(), + channel=1, + qubit=0, + ) + _if = 0 + + assert pulse.duration == 50 + assert isinstance(pulse.shape, Rectangular) + assert pulse.shape.name == "Rectangular" + assert repr(pulse.shape) == "Rectangular()" + + sampling_rate = 1 + num_samples = int(pulse.duration / sampling_rate) + i, q = ( + pulse.amplitude * np.ones(num_samples), + pulse.amplitude * np.zeros(num_samples), + ) + global_phase = ( + 2 * np.pi * _if * pulse.start / 1e9 + ) # pulse start, duration and finish are in ns + mod_i, mod_q = modulate( + i, q, num_samples, _if, global_phase + pulse.relative_phase, sampling_rate + ) + + np.testing.assert_allclose(pulse.shape.envelope_waveform_i(sampling_rate), i) + np.testing.assert_allclose(pulse.shape.envelope_waveform_q(sampling_rate), q) + np.testing.assert_allclose( + pulse.shape.modulated_waveform_i(_if, sampling_rate), mod_i + ) + np.testing.assert_allclose( + pulse.shape.modulated_waveform_q(_if, sampling_rate), mod_q + ) + + +def test_gaussian(): + pulse = Pulse( + start=0, + duration=50, + amplitude=1, + frequency=200_000_000, + relative_phase=0, + shape=Gaussian(5), + channel=1, + qubit=0, + ) + _if = 0 + + assert pulse.duration == 50 + assert isinstance(pulse.shape, Gaussian) + assert pulse.shape.name == "Gaussian" + assert pulse.shape.rel_sigma == 5 + assert repr(pulse.shape) == "Gaussian(5)" + + sampling_rate = 1 + num_samples = int(pulse.duration / sampling_rate) + x = np.arange(0, num_samples, 1) + i = pulse.amplitude * np.exp( + -(1 / 2) + * ( + ((x - (num_samples - 1) / 2) ** 2) + / (((num_samples) / pulse.shape.rel_sigma) ** 2) + ) + ) + q = pulse.amplitude * np.zeros(num_samples) + global_phase = ( + 2 * np.pi * pulse.frequency * pulse.start / 1e9 + ) # pulse start, duration and finish are in ns + mod_i, mod_q = modulate( + i, q, num_samples, _if, global_phase + pulse.relative_phase, sampling_rate + ) + + np.testing.assert_allclose(pulse.shape.envelope_waveform_i(sampling_rate), i) + np.testing.assert_allclose(pulse.shape.envelope_waveform_q(sampling_rate), q) + np.testing.assert_allclose( + pulse.shape.modulated_waveform_i(_if, sampling_rate), mod_i + ) + np.testing.assert_allclose( + pulse.shape.modulated_waveform_q(_if, sampling_rate), mod_q + ) + + +def test_drag(): + pulse = Pulse( + start=0, + duration=50, + amplitude=1, + frequency=200_000_000, + relative_phase=0, + shape=Drag(5, 0.2), + channel=1, + qubit=0, + ) + _if = 0 + + assert pulse.duration == 50 + assert isinstance(pulse.shape, Drag) + assert pulse.shape.name == "Drag" + assert pulse.shape.rel_sigma == 5 + assert pulse.shape.beta == 0.2 + assert repr(pulse.shape) == "Drag(5, 0.2)" + + sampling_rate = 1 + num_samples = int(pulse.duration / 1 * sampling_rate) + x = np.arange(0, num_samples, 1) + i = pulse.amplitude * np.exp( + -(1 / 2) + * ( + ((x - (num_samples - 1) / 2) ** 2) + / (((num_samples) / pulse.shape.rel_sigma) ** 2) + ) + ) + q = ( + pulse.shape.beta + * (-(x - (num_samples - 1) / 2) / ((num_samples / pulse.shape.rel_sigma) ** 2)) + * i + * sampling_rate + ) + global_phase = ( + 2 * np.pi * _if * pulse.start / 1e9 + ) # pulse start, duration and finish are in ns + mod_i, mod_q = modulate( + i, q, num_samples, _if, global_phase + pulse.relative_phase, sampling_rate + ) + + np.testing.assert_allclose(pulse.shape.envelope_waveform_i(sampling_rate), i) + np.testing.assert_allclose(pulse.shape.envelope_waveform_q(sampling_rate), q) + np.testing.assert_allclose( + pulse.shape.modulated_waveform_i(_if, sampling_rate), mod_i + ) + np.testing.assert_allclose( + pulse.shape.modulated_waveform_q(_if, sampling_rate), mod_q + ) + + +def test_eq(): + """Checks == operator for pulse shapes.""" + + shape1 = Rectangular() + shape2 = Rectangular() + shape3 = Gaussian(5) + assert shape1 == shape2 + assert not shape1 == shape3 + + shape1 = Gaussian(4) + shape2 = Gaussian(4) + shape3 = Gaussian(5) + assert shape1 == shape2 + assert not shape1 == shape3 + + shape1 = GaussianSquare(4, 0.01) + shape2 = GaussianSquare(4, 0.01) + shape3 = GaussianSquare(5, 0.01) + shape4 = GaussianSquare(4, 0.05) + shape5 = GaussianSquare(5, 0.05) + assert shape1 == shape2 + assert not shape1 == shape3 + assert not shape1 == shape4 + assert not shape1 == shape5 + + shape1 = Drag(4, 0.01) + shape2 = Drag(4, 0.01) + shape3 = Drag(5, 0.01) + shape4 = Drag(4, 0.05) + shape5 = Drag(5, 0.05) + assert shape1 == shape2 + assert not shape1 == shape3 + assert not shape1 == shape4 + assert not shape1 == shape5 + + shape1 = IIR([-0.5, 2], [1], Rectangular()) + shape2 = IIR([-0.5, 2], [1], Rectangular()) + shape3 = IIR([-0.5, 4], [1], Rectangular()) + shape4 = IIR([-0.4, 2], [1], Rectangular()) + shape5 = IIR([-0.5, 2], [2], Rectangular()) + shape6 = IIR([-0.5, 2], [2], Gaussian(5)) + assert shape1 == shape2 + assert not shape1 == shape3 + assert not shape1 == shape4 + assert not shape1 == shape5 + assert not shape1 == shape6 + + shape1 = SNZ(5) + shape2 = SNZ(5) + shape3 = SNZ(2) + shape4 = SNZ(2, 0.1) + shape5 = SNZ(2, 0.1) + assert shape1 == shape2 + assert not shape1 == shape3 + assert not shape1 == shape4 + assert not shape1 == shape5 + + shape1 = eCap(4) + shape2 = eCap(4) + shape3 = eCap(5) + assert shape1 == shape2 + assert not shape1 == shape3 From de9233e86e785191a3245bd50086df985e3ebe3a Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 29 Jan 2024 16:57:16 +0100 Subject: [PATCH 0066/1006] test: Split also plotting tests on their own --- tests/pulses/test_plot.py | 46 ++++++++++++++++++++++++++++++++++++++ tests/pulses/test_pulse.py | 33 --------------------------- 2 files changed, 46 insertions(+), 33 deletions(-) create mode 100644 tests/pulses/test_plot.py diff --git a/tests/pulses/test_plot.py b/tests/pulses/test_plot.py new file mode 100644 index 0000000000..968f9adfa3 --- /dev/null +++ b/tests/pulses/test_plot.py @@ -0,0 +1,46 @@ +import os +import pathlib + +from qibolab.pulses import ( + IIR, + SNZ, + Drag, + Gaussian, + GaussianSquare, + Pulse, + PulseSequence, + PulseType, + Rectangular, + eCap, + plot, +) + +HERE = pathlib.Path(__file__).parent + + +def test_plot_functions(): + p0 = Pulse(0, 40, 0.9, 0, 0, Rectangular(), 0, PulseType.FLUX, 0) + p1 = Pulse(0, 40, 0.9, 50e6, 0, Gaussian(5), 0, PulseType.DRIVE, 2) + p2 = Pulse(0, 40, 0.9, 50e6, 0, Drag(5, 2), 0, PulseType.DRIVE, 200) + p3 = Pulse.flux( + 0, 40, 0.9, IIR([-0.5, 2], [1], Rectangular()), channel=0, qubit=200 + ) + p4 = Pulse.flux(0, 40, 0.9, SNZ(t_idling=10), channel=0, qubit=200) + p5 = Pulse(0, 40, 0.9, 400e6, 0, eCap(alpha=2), 0, PulseType.DRIVE) + p6 = Pulse(0, 40, 0.9, 50e6, 0, GaussianSquare(5, 0.9), 0, PulseType.DRIVE, 2) + ps = PulseSequence([p0, p1, p2, p3, p4, p5, p6]) + wf = p0.modulated_waveform_i(0) + + plot_file = HERE / "test_plot.png" + + plot.waveform(wf, plot_file) + assert os.path.exists(plot_file) + os.remove(plot_file) + + plot.pulse(p0, plot_file) + assert os.path.exists(plot_file) + os.remove(plot_file) + + plot.sequence(ps, plot_file) + assert os.path.exists(plot_file) + os.remove(plot_file) diff --git a/tests/pulses/test_pulse.py b/tests/pulses/test_pulse.py index 111f258faa..a9676ee3c3 100644 --- a/tests/pulses/test_pulse.py +++ b/tests/pulses/test_pulse.py @@ -1,8 +1,6 @@ """Tests ``pulses.py``.""" import copy -import os -import pathlib import numpy as np import pytest @@ -21,39 +19,8 @@ Rectangular, ShapeInitError, eCap, - plot, ) -HERE = pathlib.Path(__file__).parent - - -def test_plot_functions(): - p0 = Pulse(0, 40, 0.9, 0, 0, Rectangular(), 0, PulseType.FLUX, 0) - p1 = Pulse(0, 40, 0.9, 50e6, 0, Gaussian(5), 0, PulseType.DRIVE, 2) - p2 = Pulse(0, 40, 0.9, 50e6, 0, Drag(5, 2), 0, PulseType.DRIVE, 200) - p3 = Pulse.flux( - 0, 40, 0.9, IIR([-0.5, 2], [1], Rectangular()), channel=0, qubit=200 - ) - p4 = Pulse.flux(0, 40, 0.9, SNZ(t_idling=10), channel=0, qubit=200) - p5 = Pulse(0, 40, 0.9, 400e6, 0, eCap(alpha=2), 0, PulseType.DRIVE) - p6 = Pulse(0, 40, 0.9, 50e6, 0, GaussianSquare(5, 0.9), 0, PulseType.DRIVE, 2) - ps = PulseSequence([p0, p1, p2, p3, p4, p5, p6]) - wf = p0.modulated_waveform_i(0) - - plot_file = HERE / "test_plot.png" - - plot.waveform(wf, plot_file) - assert os.path.exists(plot_file) - os.remove(plot_file) - - plot.pulse(p0, plot_file) - assert os.path.exists(plot_file) - os.remove(plot_file) - - plot.sequence(ps, plot_file) - assert os.path.exists(plot_file) - os.remove(plot_file) - def test_init(): # standard initialisation From 7b542c22969b47ae2b7b067b81b0e5d1add60f2d Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 30 Jan 2024 18:55:51 +0100 Subject: [PATCH 0067/1006] test: Remove tests on dropped methods --- tests/pulses/test_shape.py | 36 ------------------------------------ 1 file changed, 36 deletions(-) diff --git a/tests/pulses/test_shape.py b/tests/pulses/test_shape.py index 3db07dc8dd..926dfbbdde 100644 --- a/tests/pulses/test_shape.py +++ b/tests/pulses/test_shape.py @@ -139,21 +139,9 @@ def test_rectangular(): pulse.amplitude * np.ones(num_samples), pulse.amplitude * np.zeros(num_samples), ) - global_phase = ( - 2 * np.pi * _if * pulse.start / 1e9 - ) # pulse start, duration and finish are in ns - mod_i, mod_q = modulate( - i, q, num_samples, _if, global_phase + pulse.relative_phase, sampling_rate - ) np.testing.assert_allclose(pulse.shape.envelope_waveform_i(sampling_rate), i) np.testing.assert_allclose(pulse.shape.envelope_waveform_q(sampling_rate), q) - np.testing.assert_allclose( - pulse.shape.modulated_waveform_i(_if, sampling_rate), mod_i - ) - np.testing.assert_allclose( - pulse.shape.modulated_waveform_q(_if, sampling_rate), mod_q - ) def test_gaussian(): @@ -186,21 +174,9 @@ def test_gaussian(): ) ) q = pulse.amplitude * np.zeros(num_samples) - global_phase = ( - 2 * np.pi * pulse.frequency * pulse.start / 1e9 - ) # pulse start, duration and finish are in ns - mod_i, mod_q = modulate( - i, q, num_samples, _if, global_phase + pulse.relative_phase, sampling_rate - ) np.testing.assert_allclose(pulse.shape.envelope_waveform_i(sampling_rate), i) np.testing.assert_allclose(pulse.shape.envelope_waveform_q(sampling_rate), q) - np.testing.assert_allclose( - pulse.shape.modulated_waveform_i(_if, sampling_rate), mod_i - ) - np.testing.assert_allclose( - pulse.shape.modulated_waveform_q(_if, sampling_rate), mod_q - ) def test_drag(): @@ -239,21 +215,9 @@ def test_drag(): * i * sampling_rate ) - global_phase = ( - 2 * np.pi * _if * pulse.start / 1e9 - ) # pulse start, duration and finish are in ns - mod_i, mod_q = modulate( - i, q, num_samples, _if, global_phase + pulse.relative_phase, sampling_rate - ) np.testing.assert_allclose(pulse.shape.envelope_waveform_i(sampling_rate), i) np.testing.assert_allclose(pulse.shape.envelope_waveform_q(sampling_rate), q) - np.testing.assert_allclose( - pulse.shape.modulated_waveform_i(_if, sampling_rate), mod_i - ) - np.testing.assert_allclose( - pulse.shape.modulated_waveform_q(_if, sampling_rate), mod_q - ) def test_eq(): From 2e2942c36c981f5bfb543da1fb516c8aeff09f42 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 30 Jan 2024 19:07:31 +0100 Subject: [PATCH 0068/1006] fix: Use the new software modulation in plotting functions and related tests --- src/qibolab/pulses/plot.py | 59 +++++++++++--------------------------- tests/pulses/test_plot.py | 6 +++- 2 files changed, 22 insertions(+), 43 deletions(-) diff --git a/src/qibolab/pulses/plot.py b/src/qibolab/pulses/plot.py index d1d6ff58e4..00f8abf93a 100644 --- a/src/qibolab/pulses/plot.py +++ b/src/qibolab/pulses/plot.py @@ -5,7 +5,7 @@ from .pulse import Pulse from .sequence import PulseSequence -from .shape import SAMPLING_RATE, Waveform +from .shape import SAMPLING_RATE, Waveform, modulate def waveform(wf: Waveform, filename=None): @@ -57,18 +57,11 @@ def pulse(pulse_: Pulse, filename=None, sampling_rate=SAMPLING_RATE): c="C1", linestyle="dashed", ) - ax1.plot( - time, - pulse_.shape.modulated_waveform_i(sampling_rate), - label="modulated i", - c="C0", - ) - ax1.plot( - time, - pulse_.shape.modulated_waveform_q(sampling_rate), - label="modulated q", - c="C1", - ) + + envelope = pulse_.shape.envelope_waveforms(sampling_rate) + modulated = modulate(np.array(envelope), pulse_.frequency) + ax1.plot(time, modulated[0], label="modulated i", c="C0") + ax1.plot(time, modulated[1], label="modulated q", c="C1") ax1.plot(time, -waveform_i, c="silver", linestyle="dashed") ax1.set_xlabel("Time [ns]") ax1.set_ylabel("Amplitude") @@ -79,32 +72,20 @@ def pulse(pulse_: Pulse, filename=None, sampling_rate=SAMPLING_RATE): ax1.axis((start, finish, -1.0, 1.0)) ax1.legend() - modulated_i = pulse_.shape.modulated_waveform_i(sampling_rate) - modulated_q = pulse_.shape.modulated_waveform_q(sampling_rate) ax2 = plt.subplot(gs[1]) + ax2.plot(modulated[0], modulated[1], label="modulated", c="C3") + ax2.plot(waveform_i, waveform_q, label="envelope", c="C2") ax2.plot( - modulated_i, - modulated_q, - label="modulated", - c="C3", - ) - ax2.plot( - waveform_i, - waveform_q, - label="envelope", - c="C2", - ) - ax2.plot( - modulated_i[0], - modulated_q[0], + modulated[0][0], + modulated[1][0], marker="o", markersize=5, label="start", c="lightcoral", ) ax2.plot( - modulated_i[-1], - modulated_q[-1], + modulated[0][-1], + modulated[1][-1], marker="o", markersize=5, label="finish", @@ -155,18 +136,12 @@ def sequence(ps: PulseSequence, filename=None, sampling_rate=SAMPLING_RATE): ax = plt.subplot(gs[n]) ax.axis([0, ps.finish, -1, 1]) for pulse in channel_pulses: - num_samples = len(pulse.shape.modulated_waveform_i(sampling_rate)) + envelope = pulse.shape.envelope_waveforms(sampling_rate) + num_samples = envelope[0].size time = pulse.start + np.arange(num_samples) / sampling_rate - ax.plot( - time, - pulse.shape.modulated_waveform_q(sampling_rate), - c="lightgrey", - ) - ax.plot( - time, - pulse.shape.modulated_waveform_i(sampling_rate), - c=f"C{str(n)}", - ) + modulated = modulate(np.array(envelope), pulse.frequency) + ax.plot(time, modulated[1], c="lightgrey") + ax.plot(time, modulated[0], c=f"C{str(n)}") ax.plot( time, pulse.shape.envelope_waveform_i(sampling_rate), diff --git a/tests/pulses/test_plot.py b/tests/pulses/test_plot.py index 968f9adfa3..41d5d82f98 100644 --- a/tests/pulses/test_plot.py +++ b/tests/pulses/test_plot.py @@ -1,6 +1,8 @@ import os import pathlib +import numpy as np + from qibolab.pulses import ( IIR, SNZ, @@ -14,6 +16,7 @@ eCap, plot, ) +from qibolab.pulses.shape import modulate HERE = pathlib.Path(__file__).parent @@ -29,7 +32,8 @@ def test_plot_functions(): p5 = Pulse(0, 40, 0.9, 400e6, 0, eCap(alpha=2), 0, PulseType.DRIVE) p6 = Pulse(0, 40, 0.9, 50e6, 0, GaussianSquare(5, 0.9), 0, PulseType.DRIVE, 2) ps = PulseSequence([p0, p1, p2, p3, p4, p5, p6]) - wf = p0.modulated_waveform_i(0) + envelope = p0.envelope_waveforms() + wf = modulate(np.array(envelope), 0.0) plot_file = HERE / "test_plot.png" From 4a8f8e8dbd0b28f0c8566bb5dec9f6371b3a9e74 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 30 Jan 2024 19:36:28 +0100 Subject: [PATCH 0069/1006] test: Add test for new-format software (de)modulation Signed-off-by: Alessandro Candido --- tests/pulses/test_shape.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/pulses/test_shape.py b/tests/pulses/test_shape.py index 926dfbbdde..465a9e24c9 100644 --- a/tests/pulses/test_shape.py +++ b/tests/pulses/test_shape.py @@ -14,6 +14,7 @@ ShapeInitError, eCap, ) +from qibolab.pulses.shape import demodulate, modulate @pytest.mark.parametrize( @@ -282,3 +283,21 @@ def test_eq(): shape3 = eCap(5) assert shape1 == shape2 assert not shape1 == shape3 + + +def test_demodulation(): + signal = np.ones((2, 100)) + freq = 0.15 + mod = modulate(signal, freq) + + demod = demodulate(mod, freq) + np.testing.assert_allclose(demod, signal) + + mod1 = modulate(demod, freq * 3.0, rate=3.0) + np.testing.assert_allclose(mod1, mod) + + mod2 = modulate(signal, freq, phase=2 * np.pi) + np.testing.assert_allclose(mod2, mod) + + demod1 = demodulate(mod + np.ones_like(mod), freq) + np.testing.assert_allclose(demod1, demod) From 15b082620aa5dc62d493e81b8fc66c020bde46d2 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 30 Jan 2024 19:19:27 +0000 Subject: [PATCH 0070/1006] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/qibolab/instruments/qblox/cluster_qrm_rf.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/qibolab/instruments/qblox/cluster_qrm_rf.py b/src/qibolab/instruments/qblox/cluster_qrm_rf.py index 7561526022..b371829847 100644 --- a/src/qibolab/instruments/qblox/cluster_qrm_rf.py +++ b/src/qibolab/instruments/qblox/cluster_qrm_rf.py @@ -1005,9 +1005,9 @@ def acquire(self): results = self.device.get_acquisitions(sequencer.number) for pulse in sequencer.pulses.ro_pulses: bins = results[pulse.id]["acquisition"]["bins"] - acquisitions[pulse.qubit] = acquisitions[pulse.id] = ( - DemodulatedAcquisition(scope, bins, duration) - ) + acquisitions[pulse.qubit] = acquisitions[ + pulse.id + ] = DemodulatedAcquisition(scope, bins, duration) # TODO: to be updated once the functionality of ExecutionResults is extended return {key: acquisition for key, acquisition in acquisitions.items()} From 9c1cfdcde2802e92a04fd07a2431968cc18d0ca6 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 2 Feb 2024 11:59:59 +0100 Subject: [PATCH 0071/1006] Update src/qibolab/instruments/qblox/acquisition.py Co-authored-by: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> --- src/qibolab/instruments/qblox/acquisition.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibolab/instruments/qblox/acquisition.py b/src/qibolab/instruments/qblox/acquisition.py index 7f4d03ce7c..98aee7c1d1 100644 --- a/src/qibolab/instruments/qblox/acquisition.py +++ b/src/qibolab/instruments/qblox/acquisition.py @@ -3,7 +3,7 @@ import numpy as np -from ...pulses.shape import demodulate +from qibolab.pulses.shape import demodulate SAMPLING_RATE = 1 From 6da220fe310e2ec7dc3c3571329e56f0d0d4b1bf Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 22 Feb 2024 10:26:07 +0000 Subject: [PATCH 0072/1006] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/qibolab/instruments/qblox/cluster_qrm_rf.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/qibolab/instruments/qblox/cluster_qrm_rf.py b/src/qibolab/instruments/qblox/cluster_qrm_rf.py index b371829847..9a9ec6624e 100644 --- a/src/qibolab/instruments/qblox/cluster_qrm_rf.py +++ b/src/qibolab/instruments/qblox/cluster_qrm_rf.py @@ -993,9 +993,9 @@ def acquire(self): if len(sequencer.pulses.ro_pulses) == 1: pulse = sequencer.pulses.ro_pulses[0] frequency = self.get_if(pulse) - acquisitions[pulse.qubit] = acquisitions[ - pulse.id - ] = AveragedAcquisition(scope, duration, frequency) + acquisitions[pulse.qubit] = acquisitions[pulse.id] = ( + AveragedAcquisition(scope, duration, frequency) + ) else: raise RuntimeError( "Software Demodulation only supports one acquisition per channel. " @@ -1005,9 +1005,9 @@ def acquire(self): results = self.device.get_acquisitions(sequencer.number) for pulse in sequencer.pulses.ro_pulses: bins = results[pulse.id]["acquisition"]["bins"] - acquisitions[pulse.qubit] = acquisitions[ - pulse.id - ] = DemodulatedAcquisition(scope, bins, duration) + acquisitions[pulse.qubit] = acquisitions[pulse.id] = ( + DemodulatedAcquisition(scope, bins, duration) + ) # TODO: to be updated once the functionality of ExecutionResults is extended return {key: acquisition for key, acquisition in acquisitions.items()} From c5a7191c1714c302b26196bce411d44ce0098e7b Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 22 Feb 2024 11:45:00 +0100 Subject: [PATCH 0073/1006] test: Add regression test for software modulation --- tests/pulses/test_shape.py | 72 +++++++++++++++++++++++++++++++++++++- 1 file changed, 71 insertions(+), 1 deletion(-) diff --git a/tests/pulses/test_shape.py b/tests/pulses/test_shape.py index 465a9e24c9..9ef9bfc37c 100644 --- a/tests/pulses/test_shape.py +++ b/tests/pulses/test_shape.py @@ -14,7 +14,7 @@ ShapeInitError, eCap, ) -from qibolab.pulses.shape import demodulate, modulate +from qibolab.pulses.shape import IqWaveform, demodulate, modulate @pytest.mark.parametrize( @@ -285,6 +285,76 @@ def test_eq(): assert not shape1 == shape3 +def test_modulation(): + rect = Pulse( + start=0, + duration=30, + amplitude=0.9, + frequency=20_000_000, + relative_phase=0.0, + shape=Rectangular(), + channel=0, + type=PulseType.READOUT, + qubit=0, + ) + renvs: IqWaveform = np.array(rect.shape.envelope_waveforms()) + # fmt: off + np.testing.assert_allclose(modulate(renvs, 0.04), + np.array([[ 6.36396103e-01, 6.16402549e-01, 5.57678156e-01, + 4.63912794e-01, 3.40998084e-01, 1.96657211e-01, + 3.99596419e-02, -1.19248738e-01, -2.70964282e-01, + -4.05654143e-01, -5.14855263e-01, -5.91706132e-01, + -6.31377930e-01, -6.31377930e-01, -5.91706132e-01, + -5.14855263e-01, -4.05654143e-01, -2.70964282e-01, + -1.19248738e-01, 3.99596419e-02, 1.96657211e-01, + 3.40998084e-01, 4.63912794e-01, 5.57678156e-01, + 6.16402549e-01, 6.36396103e-01, 6.16402549e-01, + 5.57678156e-01, 4.63912794e-01, 3.40998084e-01], + [ 0.00000000e+00, 1.58265275e-01, 3.06586161e-01, + 4.35643111e-01, 5.37327002e-01, 6.05248661e-01, + 6.35140321e-01, 6.25123778e-01, 5.75828410e-01, + 4.90351625e-01, 3.74064244e-01, 2.34273031e-01, + 7.97615814e-02, -7.97615814e-02, -2.34273031e-01, + -3.74064244e-01, -4.90351625e-01, -5.75828410e-01, + -6.25123778e-01, -6.35140321e-01, -6.05248661e-01, + -5.37327002e-01, -4.35643111e-01, -3.06586161e-01, + -1.58265275e-01, 4.09361195e-16, 1.58265275e-01, + 3.06586161e-01, 4.35643111e-01, 5.37327002e-01]]) + ) + # fmt: on + + gauss = Pulse( + start=5, + duration=20, + amplitude=3.5, + frequency=2_000_000, + relative_phase=0.0, + shape=Gaussian(0.5), + channel=0, + type=PulseType.READOUT, + qubit=0, + ) + genvs: IqWaveform = np.array(gauss.shape.envelope_waveforms()) + # fmt: off + np.testing.assert_allclose(modulate(genvs, 0.3), + np.array([[ 2.40604965e+00, -7.47704261e-01, -1.96732725e+00, + 1.97595317e+00, 7.57582564e-01, -2.45926187e+00, + 7.61855973e-01, 1.99830815e+00, -2.00080760e+00, + -7.64718297e-01, 2.47468039e+00, -7.64240497e-01, + -1.99830815e+00, 1.99456483e+00, 7.59953712e-01, + -2.45158868e+00, 7.54746949e-01, 1.96732725e+00, + -1.95751517e+00, -7.43510231e-01], + [ 0.00000000e+00, 2.30119709e+00, -1.42934692e+00, + -1.43561401e+00, 2.33159938e+00, 9.03518154e-16, + -2.34475159e+00, 1.45185586e+00, 1.45367181e+00, + -2.35356091e+00, -1.81836565e-15, 2.35209040e+00, + -1.45185586e+00, -1.44913618e+00, 2.33889703e+00, + 2.70209720e-15, -2.32287226e+00, 1.42934692e+00, + 1.42221802e+00, -2.28828920e+00]]) + ) + # fmt: on + + def test_demodulation(): signal = np.ones((2, 100)) freq = 0.15 From e78397d78713323678bef350ce6dc2283dadd6a1 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Wed, 20 Mar 2024 14:09:16 +0400 Subject: [PATCH 0074/1006] test: fix tests --- src/qibolab/compilers/default.py | 2 +- src/qibolab/instruments/qblox/controller.py | 4 +-- src/qibolab/instruments/qm/acquisition.py | 6 ++-- src/qibolab/instruments/qm/controller.py | 6 ++-- tests/test_compilers_default.py | 9 +++-- tests/test_instruments_qblox_controller.py | 22 ++++++++---- tests/test_instruments_qm.py | 40 ++++++++++++++++----- tests/test_unrolling.py | 4 +-- 8 files changed, 62 insertions(+), 31 deletions(-) diff --git a/src/qibolab/compilers/default.py b/src/qibolab/compilers/default.py index e4fa38576d..b5821680ec 100644 --- a/src/qibolab/compilers/default.py +++ b/src/qibolab/compilers/default.py @@ -45,7 +45,7 @@ def gpi_rule(gate, platform): # https://github.com/qiboteam/qibolab/pull/804#pullrequestreview-1890205509 # for more detail. pulse = platform.create_RX_pulse(qubit, start=0, relative_phase=theta) - sequence.add(pulse) + sequence.append(pulse) return sequence, {} diff --git a/src/qibolab/instruments/qblox/controller.py b/src/qibolab/instruments/qblox/controller.py index 80acc322a7..2afd2c4ab0 100644 --- a/src/qibolab/instruments/qblox/controller.py +++ b/src/qibolab/instruments/qblox/controller.py @@ -535,7 +535,7 @@ def _combine_result_chunks(chunks): def _add_to_results(sequence, results, results_to_add): for pulse in sequence.ro_pulses: if results[pulse.id]: - results[pulse.id] += results_to_add[pulse.serial] + results[pulse.id] += results_to_add[pulse.id] else: - results[pulse.id] = results_to_add[pulse.serial] + results[pulse.id] = results_to_add[pulse.id] results[pulse.qubit] = results[pulse.id] diff --git a/src/qibolab/instruments/qm/acquisition.py b/src/qibolab/instruments/qm/acquisition.py index f22aa752f2..4e6390a135 100644 --- a/src/qibolab/instruments/qm/acquisition.py +++ b/src/qibolab/instruments/qm/acquisition.py @@ -269,7 +269,7 @@ def declare_acquisitions(ro_pulses, qubits, options): acquisition.assign_element(qmpulse.element) acquisitions[name] = acquisition - acquisitions[name].keys.append(qmpulse.pulse.serial) + acquisitions[name].keys.append(qmpulse.pulse.id) qmpulse.acquisition = acquisitions[name] return list(acquisitions.values()) @@ -289,6 +289,6 @@ def fetch_results(result, acquisitions): results = {} for acquisition in acquisitions: data = acquisition.fetch(handles) - for serial, result in zip(acquisition.keys, data): - results[acquisition.qubit] = results[serial] = result + for id_, result in zip(acquisition.keys, data): + results[acquisition.qubit] = results[id_] = result return results diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index bf452f5125..1754216dd3 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -62,7 +62,7 @@ def find_baking_pulses(sweepers): step = values[1] - values[0] if len(values) > 0 else values[0] if sweeper.parameter is Parameter.duration and step % 4 != 0: for pulse in sweeper.pulses: - to_bake.add(pulse.serial) + to_bake.add(pulse.id) return to_bake @@ -335,7 +335,7 @@ def create_sequence(self, qubits, sequence, sweepers): if ( pulse.duration % 4 != 0 or pulse.duration < 16 - or pulse.serial in pulses_to_bake + or pulse.id in pulses_to_bake ): qmpulse = BakedPulse(pulse, element) qmpulse.bake(self.config, durations=[pulse.duration]) @@ -394,7 +394,7 @@ def sweep(self, qubits, couplers, sequence, options, *sweepers): results = {} for qmpulse in ro_pulses: pulse = qmpulse.pulse - results[pulse.qubit] = results[pulse.serial] = result + results[pulse.qubit] = results[pulse.id] = result return results else: result = self.execute_program(experiment) diff --git a/tests/test_compilers_default.py b/tests/test_compilers_default.py index 2e856f6e67..48d3b5b523 100644 --- a/tests/test_compilers_default.py +++ b/tests/test_compilers_default.py @@ -98,14 +98,13 @@ def test_gpi_to_sequence(platform): circuit = Circuit(1) circuit.add(gates.GPI(0, phi=0.2)) sequence = compile_circuit(circuit, platform) - assert len(sequence.pulses) == 1 + assert len(sequence) == 1 assert len(sequence.qd_pulses) == 1 - RX_pulse = platform.create_RX_pulse(0, start=0, relative_phase=0.2) - s = PulseSequence(RX_pulse) + rx_pulse = platform.create_RX_pulse(0, start=0, relative_phase=0.2) + s = PulseSequence([rx_pulse]) - np.testing.assert_allclose(sequence.duration, RX_pulse.duration) - assert sequence.serial == s.serial + np.testing.assert_allclose(sequence.duration, rx_pulse.duration) def test_gpi2_to_sequence(platform): diff --git a/tests/test_instruments_qblox_controller.py b/tests/test_instruments_qblox_controller.py index fde3682f07..e979354767 100644 --- a/tests/test_instruments_qblox_controller.py +++ b/tests/test_instruments_qblox_controller.py @@ -5,7 +5,7 @@ from qibolab import AveragingMode, ExecutionParameters from qibolab.instruments.qblox.controller import MAX_NUM_BINS, QbloxController -from qibolab.pulses import Gaussian, Pulse, PulseSequence, ReadoutPulse, Rectangular +from qibolab.pulses import Gaussian, Pulse, PulseSequence, PulseType, Rectangular from qibolab.result import IntegratedResults from qibolab.sweeper import Parameter, Sweeper @@ -24,10 +24,18 @@ def test_sweep_too_many_bins(platform, controller): and executed.""" qubit = platform.qubits[0] pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Gaussian(5), qubit.drive.name, qubit=0) - ro_pulse = ReadoutPulse( - 0, 40, 0.05, int(3e9), 0.0, Rectangular(), qubit.readout.name, qubit=0 + ro_pulse = Pulse( + 0, + 40, + 0.05, + int(3e9), + 0.0, + Rectangular(), + qubit.readout.name, + PulseType.READOUT, + qubit=0, ) - sequence = PulseSequence(pulse, ro_pulse) + sequence = PulseSequence([pulse, ro_pulse]) # These values shall result into execution in two rounds shots = 128 @@ -39,13 +47,13 @@ def test_sweep_too_many_bins(platform, controller): nshots=shots, relaxation_time=10, averaging_mode=AveragingMode.SINGLESHOT ) controller._execute_pulse_sequence = Mock( - return_value={ro_pulse.serial: IntegratedResults(mock_data)} + return_value={ro_pulse.id: IntegratedResults(mock_data)} ) res = controller.sweep( {0: platform.qubits[0]}, platform.couplers, sequence, params, sweep_ampl ) expected_data = np.append(mock_data, mock_data) # - assert np.array_equal(res[ro_pulse.serial].voltage, expected_data) + assert np.array_equal(res[ro_pulse.id].voltage, expected_data) def test_sweep_too_many_sweep_points(platform, controller): @@ -58,7 +66,7 @@ def test_sweep_too_many_sweep_points(platform, controller): ) params = ExecutionParameters(nshots=12, relaxation_time=10) with pytest.raises(ValueError, match="total number of sweep points"): - controller.sweep({0: qubit}, {}, PulseSequence(pulse), params, sweep) + controller.sweep({0: qubit}, {}, PulseSequence([pulse]), params, sweep) @pytest.mark.qpu diff --git a/tests/test_instruments_qm.py b/tests/test_instruments_qm.py index 2da93d2fac..62b3ef994b 100644 --- a/tests/test_instruments_qm.py +++ b/tests/test_instruments_qm.py @@ -9,7 +9,7 @@ from qibolab.instruments.qm.acquisition import Acquisition, declare_acquisitions from qibolab.instruments.qm.controller import controllers_config from qibolab.instruments.qm.sequence import BakedPulse, QMPulse, Sequence -from qibolab.pulses import Pulse, PulseType, PulseSequence, Rectangular +from qibolab.pulses import Pulse, PulseSequence, PulseType, Rectangular from qibolab.qubits import Qubit from qibolab.sweeper import Parameter, Sweeper @@ -54,8 +54,12 @@ def test_qmpulse_declare_output(acquisition_type): def test_qmsequence(): - qd_pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), "ch0", PulseType.DRIVE, qubit=0) - ro_pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), "ch1", PulseType.READOUT, qubit=0) + qd_pulse = Pulse( + 0, 40, 0.05, int(3e9), 0.0, Rectangular(), "ch0", PulseType.DRIVE, qubit=0 + ) + ro_pulse = Pulse( + 0, 40, 0.05, int(3e9), 0.0, Rectangular(), "ch1", PulseType.READOUT, qubit=0 + ) qmsequence = Sequence() with pytest.raises(AttributeError): qmsequence.add("test") @@ -90,7 +94,6 @@ def test_qmpulse_previous_and_next(): f"readout{qubit}", PulseType.READOUT, qubit=qubit, - type=PulseType.READOUT, ) ) ro_qmpulses.append(ro_pulse) @@ -116,10 +119,26 @@ def test_qmpulse_previous_and_next_flux(): x_pulse_end = Pulse(70, 40, 0.05, int(3e9), 0.0, Rectangular(), f"drive2", qubit=2) measure_lowfreq = Pulse( - 110, 100, 0.05, int(3e9), 0.0, Rectangular(), "readout1", PulseType.READOUT, qubit=1 + 110, + 100, + 0.05, + int(3e9), + 0.0, + Rectangular(), + "readout1", + PulseType.READOUT, + qubit=1, ) measure_highfreq = Pulse( - 110, 100, 0.05, int(3e9), 0.0, Rectangular(), "readout2", PulseType.READOUT, qubit=2 + 110, + 100, + 0.05, + int(3e9), + 0.0, + Rectangular(), + "readout2", + PulseType.READOUT, + qubit=2, ) drive11 = QMPulse(y90_pulse) @@ -342,7 +361,12 @@ def test_qm_register_flux_pulse(qmplatform): platform = qmplatform controller = platform.instruments["qm"] pulse = Pulse.flux( - 0, 30, 0.005, Rectangular(), platform.qubits[qubit].flux.name, qubit + 0, + 30, + 0.005, + Rectangular(), + channel=platform.qubits[qubit].flux.name, + qubit=qubit, ) target_pulse = { "operation": "control", @@ -409,7 +433,7 @@ def test_qm_register_baked_pulse(qmplatform, duration): controller = platform.instruments["qm"] controller.config.register_flux_element(qubit) pulse = Pulse.flux( - 3, duration, 0.05, Rectangular(), qubit.flux.name, qubit=qubit.name + 3, duration, 0.05, Rectangular(), channel=qubit.flux.name, qubit=qubit.name ) qmpulse = BakedPulse(pulse) config = controller.config diff --git a/tests/test_unrolling.py b/tests/test_unrolling.py index 95ca775050..27d99e6517 100644 --- a/tests/test_unrolling.py +++ b/tests/test_unrolling.py @@ -15,7 +15,7 @@ def test_bounds_update(): p5 = Pulse(540, 1000, 0.9, int(20e6), 0, Rectangular(), 2, PulseType.READOUT) p6 = Pulse(640, 1000, 0.9, int(20e6), 0, Rectangular(), 1, PulseType.READOUT) - ps = PulseSequence(p1, p2, p3, p4, p5, p6) + ps = PulseSequence([p1, p2, p3, p4, p5, p6]) bounds = Bounds.update(ps) assert bounds.waveforms >= 40 @@ -59,7 +59,7 @@ def test_batch(bounds): p5 = Pulse(540, 1000, 0.9, int(20e6), 0, Rectangular(), 2, PulseType.READOUT) p6 = Pulse(640, 1000, 0.9, int(20e6), 0, Rectangular(), 1, PulseType.READOUT) - ps = PulseSequence(p1, p2, p3, p4, p5, p6) + ps = PulseSequence([p1, p2, p3, p4, p5, p6]) sequences = 10 * [ps] From ea0ddb9e292f26bb37da9d8a6acbae8643f57568 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Wed, 20 Mar 2024 18:00:21 +0400 Subject: [PATCH 0075/1006] fix: wrong merge --- src/qibolab/platform/platform.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 60af19d9a3..ede232c7db 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -1,4 +1,5 @@ """A platform for executing quantum algorithms.""" + import copy from collections import defaultdict from dataclasses import dataclass, field, replace @@ -10,7 +11,7 @@ from qibolab.couplers import Coupler from qibolab.execution_parameters import ExecutionParameters from qibolab.instruments.abstract import Controller, Instrument, InstrumentId -from qibolab.pulses import Drag, FluxPulse, PulseSequence, ReadoutPulse +from qibolab.pulses import Drag, PulseSequence, PulseType from qibolab.qubits import Qubit, QubitId, QubitPair, QubitPairId from qibolab.sweeper import Sweeper from qibolab.unrolling import batch From e4b24030914033273edc6408a03644c9d2e11e4a Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Wed, 20 Mar 2024 19:25:14 +0400 Subject: [PATCH 0076/1006] fix: drop .data attribute from shape in ZI --- src/qibolab/instruments/zhinst/executor.py | 4 +- src/qibolab/instruments/zhinst/pulse.py | 8 +- tests/test_compilers_default.py | 2 +- tests/test_instruments_zhinst.py | 101 ++++++++++----------- 4 files changed, 57 insertions(+), 58 deletions(-) diff --git a/src/qibolab/instruments/zhinst/executor.py b/src/qibolab/instruments/zhinst/executor.py index bfba7a6d98..cbcb1d6a19 100644 --- a/src/qibolab/instruments/zhinst/executor.py +++ b/src/qibolab/instruments/zhinst/executor.py @@ -728,8 +728,8 @@ def sweep(self, qubits, couplers, sequence: PulseSequence, options, *sweepers): np.ones(data.shape) - data.real ) # Probability inversion patch - serial = ropulse.pulse.serial + id_ = ropulse.pulse.id qubit = ropulse.pulse.qubit - results[serial] = results[qubit] = options.results_type(data) + results[id_] = results[qubit] = options.results_type(data) return results diff --git a/src/qibolab/instruments/zhinst/pulse.py b/src/qibolab/instruments/zhinst/pulse.py index 44c223ea63..c187f5170d 100644 --- a/src/qibolab/instruments/zhinst/pulse.py +++ b/src/qibolab/instruments/zhinst/pulse.py @@ -57,15 +57,15 @@ def select_pulse(pulse: Pulse): zero_boundaries=False, ) - if np.all(pulse.envelope_waveform_q(SAMPLING_RATE).data == 0): + if np.all(pulse.envelope_waveform_q(SAMPLING_RATE) == 0): return sampled_pulse_real( - samples=pulse.envelope_waveform_i(SAMPLING_RATE).data, + samples=pulse.envelope_waveform_i(SAMPLING_RATE), can_compress=True, ) else: return sampled_pulse_complex( - samples=pulse.envelope_waveform_i(SAMPLING_RATE).data - + (1j * pulse.envelope_waveform_q(SAMPLING_RATE).data), + samples=pulse.envelope_waveform_i(SAMPLING_RATE) + + (1j * pulse.envelope_waveform_q(SAMPLING_RATE)), can_compress=True, ) diff --git a/tests/test_compilers_default.py b/tests/test_compilers_default.py index 48d3b5b523..2549d299ce 100644 --- a/tests/test_compilers_default.py +++ b/tests/test_compilers_default.py @@ -68,7 +68,7 @@ def test_compile_two_gates(platform): sequence = compile_circuit(circuit, platform) - assert len(sequence.pulses) == 4 + assert len(sequence) == 4 assert len(sequence.qd_pulses) == 3 assert len(sequence.ro_pulses) == 1 diff --git a/tests/test_instruments_zhinst.py b/tests/test_instruments_zhinst.py index 535e957e37..b0ebbb18fb 100644 --- a/tests/test_instruments_zhinst.py +++ b/tests/test_instruments_zhinst.py @@ -23,7 +23,6 @@ Pulse, PulseSequence, PulseType, - ReadoutPulse, Rectangular, ) from qibolab.sweeper import Parameter, Sweeper @@ -258,12 +257,20 @@ def test_zhsequence(dummy_qrc): ) qd_pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), drive_channel, qubit=0) ro_pulse = Pulse( - 0, 40, 0.05, int(3e9), 0.0, Rectangular(), readout_channel, PulseType.READOUT, qubit=0 + 0, + 40, + 0.05, + int(3e9), + 0.0, + Rectangular(), + readout_channel, + PulseType.READOUT, + qubit=0, ) sequence = PulseSequence() - sequence.add(qd_pulse) - sequence.add(qd_pulse) - sequence.add(ro_pulse) + sequence.append(qd_pulse) + sequence.append(qd_pulse) + sequence.append(ro_pulse) zhsequence = controller.sequence_zh(sequence, IQM5q.qubits) @@ -285,15 +292,24 @@ def test_zhsequence_couplers(dummy_qrc): couplerflux_channel = IQM5q.couplers[0].flux.name qd_pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), drive_channel, qubit=0) ro_pulse = Pulse( - 0, 40, 0.05, int(3e9), 0.0, Rectangular(), readout_channel, PulseType.READOUT, qubit=0 + 0, + 40, + 0.05, + int(3e9), + 0.0, + Rectangular(), + readout_channel, + PulseType.READOUT, + qubit=0, ) - qc_pulse = Pulse( - 0, 40, 0.05, Rectangular(), couplerflux_channel, PulseType.COUPLERFLUX, qubit=3 + qc_pulse = Pulse.flux( + 0, 40, 0.05, Rectangular(), channel=couplerflux_channel, qubit=3 ) + qc_pulse.type = PulseType.COUPLERFLUX sequence = PulseSequence() - sequence.add(qd_pulse) - sequence.add(ro_pulse) - sequence.add(qc_pulse) + sequence.append(qd_pulse) + sequence.append(ro_pulse) + sequence.append(qc_pulse) zhsequence = controller.sequence_zh(sequence, IQM5q.qubits) @@ -306,15 +322,31 @@ def test_zhsequence_multiple_ro(dummy_qrc): readout_channel = measure_channel_name(platform.qubits[0]) sequence = PulseSequence() qd_pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), "ch0", qubit=0) - sequence.add(qd_pulse) + sequence.append(qd_pulse) ro_pulse = Pulse( - 0, 40, 0.05, int(3e9), 0.0, Rectangular(), readout_channel, PulseType.READOUT, qubit=0 + 0, + 40, + 0.05, + int(3e9), + 0.0, + Rectangular(), + readout_channel, + PulseType.READOUT, + qubit=0, ) - sequence.add(ro_pulse) + sequence.append(ro_pulse) ro_pulse = Pulse( - 0, 5000, 0.05, int(3e9), 0.0, Rectangular(), readout_channel, PulseType.READOUT, qubit=0 + 0, + 5000, + 0.05, + int(3e9), + 0.0, + Rectangular(), + readout_channel, + PulseType.READOUT, + qubit=0, ) - sequence.add(ro_pulse) + sequence.append(ro_pulse) platform = create_platform("zurich") controller = platform.instruments["EL_ZURO"] @@ -477,9 +509,9 @@ def test_sweep_and_play_sim(dummy_qrc): channel=platform.qubits[q].flux.name, qubit=q, ) - sequence.add(qf_pulses[q]) + sequence.append(qf_pulses[q]) ro_pulses[q] = platform.create_qubit_readout_pulse(q, start=qf_pulses[q].finish) - sequence.add(ro_pulses[q]) + sequence.append(ro_pulses[q]) options = ExecutionParameters( relaxation_time=300e-6, @@ -782,41 +814,8 @@ def test_experiment_sweep_punchouts(dummy_qrc, parameter): IQM5q.experiment_flow(qubits, couplers, sequence, options) -<<<<<<< HEAD assert measure_channel_name(qubits[0]) in IQM5q.experiment.signals assert acquire_channel_name(qubits[0]) in IQM5q.experiment.signals -======= - assert "measure0" in IQM5q.experiment.signals - assert "acquire0" in IQM5q.experiment.signals - - -# TODO: Fix this -def test_sim(dummy_qrc): - platform = create_platform("zurich") - IQM5q = platform.instruments["EL_ZURO"] - sequence = PulseSequence() - qubits = {0: platform.qubits[0]} - platform.qubits = qubits - ro_pulses = {} - qd_pulses = {} - qf_pulses = {} - for qubit in qubits: - qd_pulses[qubit] = platform.create_RX_pulse(qubit, start=0) - sequence.append(qd_pulses[qubit]) - ro_pulses[qubit] = platform.create_qubit_readout_pulse( - qubit, start=qd_pulses[qubit].finish - ) - sequence.append(ro_pulses[qubit]) - qf_pulses[qubit] = Pulse.flux( - start=0, - duration=500, - amplitude=1, - shape=Rectangular(), - channel=platform.qubits[qubit].flux.name, - qubit=qubit, - ) - sequence.append(qf_pulses[qubit]) ->>>>>>> 1b1e4cd4 (Fix Zurich tests) def test_batching(dummy_qrc): From 19f4965eef4418cfcbf0dd472cfc0a76e0b5bb31 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 12 Jan 2024 16:25:00 +0100 Subject: [PATCH 0077/1006] Drop pulse.serial --- tests/test_instruments_qm.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tests/test_instruments_qm.py b/tests/test_instruments_qm.py index 62b3ef994b..0b201bf7fc 100644 --- a/tests/test_instruments_qm.py +++ b/tests/test_instruments_qm.py @@ -19,7 +19,11 @@ def test_qmpulse(): pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), "ch0", qubit=0) qmpulse = QMPulse(pulse) +<<<<<<< HEAD assert qmpulse.operation == "drive(40, 0.05, Rectangular())" +======= + assert qmpulse.operation == pulse.id +>>>>>>> 337bff40 (Drop pulse.serial) assert qmpulse.relative_phase == 0 @@ -346,8 +350,20 @@ def test_qm_register_pulse(qmplatform, pulse_type, qubit): }, } +<<<<<<< HEAD controller.config.register_element( platform.qubits[qubit], pulse, controller.time_of_flight, controller.smearing +======= + opx.config.register_element( + platform.qubits[qubit], pulse, opx.time_of_flight, opx.smearing + ) + opx.config.register_pulse(platform.qubits[qubit], pulse) + assert opx.config.pulses[pulse.id] == target_pulse + assert target_pulse["waveforms"]["I"] in opx.config.waveforms + assert target_pulse["waveforms"]["Q"] in opx.config.waveforms + assert ( + opx.config.elements[f"{pulse_type}{qubit}"]["operations"][pulse.id] == pulse.id +>>>>>>> 337bff40 (Drop pulse.serial) ) qmpulse = QMPulse(pulse) controller.config.register_pulse(platform.qubits[qubit], qmpulse) @@ -373,11 +389,19 @@ def test_qm_register_flux_pulse(qmplatform): "length": pulse.duration, "waveforms": {"single": "constant_wf0.005"}, } +<<<<<<< HEAD qmpulse = QMPulse(pulse) controller.config.register_element(platform.qubits[qubit], pulse) controller.config.register_pulse(platform.qubits[qubit], qmpulse) assert controller.config.pulses[qmpulse.operation] == target_pulse assert target_pulse["waveforms"]["single"] in controller.config.waveforms +======= + opx.config.register_element(platform.qubits[qubit], pulse) + opx.config.register_pulse(platform.qubits[qubit], pulse) + assert opx.config.pulses[pulse.id] == target_pulse + assert target_pulse["waveforms"]["single"] in opx.config.waveforms + assert opx.config.elements[f"flux{qubit}"]["operations"][pulse.id] == pulse.id +>>>>>>> 337bff40 (Drop pulse.serial) def test_qm_register_pulses_with_different_frequencies(qmplatform): From 7cc83972808476a72450cd4e872e09ec22937ad9 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 17 Jan 2024 19:17:35 +0100 Subject: [PATCH 0078/1006] Fix QM issues by stringifying pulses ID QM requires some keys to be strings, because of the way they are later processed. And before they were (by accident, since we were using the serial as an identifier). --- tests/test_instruments_qm.py | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/tests/test_instruments_qm.py b/tests/test_instruments_qm.py index 0b201bf7fc..62b3ef994b 100644 --- a/tests/test_instruments_qm.py +++ b/tests/test_instruments_qm.py @@ -19,11 +19,7 @@ def test_qmpulse(): pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), "ch0", qubit=0) qmpulse = QMPulse(pulse) -<<<<<<< HEAD assert qmpulse.operation == "drive(40, 0.05, Rectangular())" -======= - assert qmpulse.operation == pulse.id ->>>>>>> 337bff40 (Drop pulse.serial) assert qmpulse.relative_phase == 0 @@ -350,20 +346,8 @@ def test_qm_register_pulse(qmplatform, pulse_type, qubit): }, } -<<<<<<< HEAD controller.config.register_element( platform.qubits[qubit], pulse, controller.time_of_flight, controller.smearing -======= - opx.config.register_element( - platform.qubits[qubit], pulse, opx.time_of_flight, opx.smearing - ) - opx.config.register_pulse(platform.qubits[qubit], pulse) - assert opx.config.pulses[pulse.id] == target_pulse - assert target_pulse["waveforms"]["I"] in opx.config.waveforms - assert target_pulse["waveforms"]["Q"] in opx.config.waveforms - assert ( - opx.config.elements[f"{pulse_type}{qubit}"]["operations"][pulse.id] == pulse.id ->>>>>>> 337bff40 (Drop pulse.serial) ) qmpulse = QMPulse(pulse) controller.config.register_pulse(platform.qubits[qubit], qmpulse) @@ -389,19 +373,11 @@ def test_qm_register_flux_pulse(qmplatform): "length": pulse.duration, "waveforms": {"single": "constant_wf0.005"}, } -<<<<<<< HEAD qmpulse = QMPulse(pulse) controller.config.register_element(platform.qubits[qubit], pulse) controller.config.register_pulse(platform.qubits[qubit], qmpulse) assert controller.config.pulses[qmpulse.operation] == target_pulse assert target_pulse["waveforms"]["single"] in controller.config.waveforms -======= - opx.config.register_element(platform.qubits[qubit], pulse) - opx.config.register_pulse(platform.qubits[qubit], pulse) - assert opx.config.pulses[pulse.id] == target_pulse - assert target_pulse["waveforms"]["single"] in opx.config.waveforms - assert opx.config.elements[f"flux{qubit}"]["operations"][pulse.id] == pulse.id ->>>>>>> 337bff40 (Drop pulse.serial) def test_qm_register_pulses_with_different_frequencies(qmplatform): From fe7f03d4d764aaa8a74225c033129fb05b06ead9 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 18 Jan 2024 15:56:04 +0100 Subject: [PATCH 0079/1006] Fix QM tests --- tests/test_instruments_qm.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_instruments_qm.py b/tests/test_instruments_qm.py index 62b3ef994b..f7afcb08a7 100644 --- a/tests/test_instruments_qm.py +++ b/tests/test_instruments_qm.py @@ -94,6 +94,7 @@ def test_qmpulse_previous_and_next(): f"readout{qubit}", PulseType.READOUT, qubit=qubit, + type=PulseType.READOUT, ) ) ro_qmpulses.append(ro_pulse) From 1392260a6c7c01774418fbd9687626dbdbf37ceb Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Mon, 29 Jan 2024 17:37:04 +0400 Subject: [PATCH 0080/1006] Replace pulse.start with Delay object --- README.md | 19 ++++++---- src/qibolab/pulses/pulse.py | 65 +++++++--------------------------- src/qibolab/pulses/sequence.py | 11 +++--- 3 files changed, 32 insertions(+), 63 deletions(-) diff --git a/README.md b/README.md index c1bcc12f1f..c2e1bcf888 100644 --- a/README.md +++ b/README.md @@ -27,31 +27,36 @@ A simple example on how to connect to a platform and use it execute a pulse sequ ```python from qibolab import create_platform, ExecutionParameters -from qibolab.pulses import DrivePulse, ReadoutPulse, PulseSequence +from qibolab.pulses import Pulse, Delay, PulseType # Define PulseSequence sequence = PulseSequence() # Add some pulses to the pulse sequence -sequence.add( - DrivePulse( - start=0, +sequence.append( + Pulse( amplitude=0.3, duration=4000, frequency=200_000_000, relative_phase=0, shape="Gaussian(5)", # Gaussian shape with std = duration / 5 + type=PulseType.DRIVE, channel=1, ) ) - -sequence.add( +sequence.append( + Delay( + duration=4000, + channel=2, + ) +) +sequence.append( ReadoutPulse( - start=4004, amplitude=0.9, duration=2000, frequency=20_000_000, relative_phase=0, shape="Rectangular", + type=PulseType.READOUT, channel=2, ) ) diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index d7445d57f9..3bb8dc3c33 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -4,8 +4,6 @@ from enum import Enum from typing import Optional -import numpy as np - from .shape import SAMPLING_RATE, PulseShape, Waveform @@ -25,10 +23,8 @@ class PulseType(Enum): @dataclass class Pulse: - """A class to represent a pulse to be sent to the QPU.""" + """Representation of a pulse to be sent to the QPU.""" - start: int - """Start time of pulse in ns.""" duration: int """Pulse duration in ns.""" amplitude: float @@ -71,41 +67,8 @@ def __post_init__(self): self.shape.pulse = self @classmethod - def flux(cls, start, duration, amplitude, shape, **kwargs): - return cls( - start, duration, amplitude, 0, 0, shape, type=PulseType.FLUX, **kwargs - ) - - @property - def finish(self) -> Optional[int]: - """Time when the pulse is scheduled to finish.""" - if None in {self.start, self.duration}: - return None - return self.start + self.duration - - @property - def global_phase(self): - """Global phase of the pulse, in radians. - - This phase is calculated from the pulse start time and frequency - as `2 * pi * frequency * start`. - """ - if self.type is PulseType.READOUT: - # readout pulses should have zero global phase so that we can - # calculate probabilities in the i-q plane - return 0 - - # pulse start, duration and finish are in ns - return 2 * np.pi * self.frequency * self.start / 1e9 - - @property - def phase(self) -> float: - """Total phase of the pulse, in radians. - - The total phase is computed as the sum of the global and - relative phases. - """ - return self.global_phase + self.relative_phase + def flux(cls, duration, amplitude, shape, **kwargs): + return cls(duration, amplitude, 0, 0, shape, type=PulseType.FLUX, **kwargs) @property def id(self) -> int: @@ -152,15 +115,13 @@ def __hash__(self): ) ) - def is_equal_ignoring_start(self, item) -> bool: - """Check if two pulses are equal ignoring start time.""" - return ( - self.duration == item.duration - and self.amplitude == item.amplitude - and self.frequency == item.frequency - and self.relative_phase == item.relative_phase - and self.shape == item.shape - and self.channel == item.channel - and self.type == item.type - and self.qubit == item.qubit - ) + +@dataclass +class Delay: + """Representation of a wait instruction during which we are not sending any + pulses to the QPU.""" + + duration: int + """Delay duration in ns.""" + channel: str + """Channel on which the delay should be implemented.""" diff --git a/src/qibolab/pulses/sequence.py b/src/qibolab/pulses/sequence.py index d1539b3548..6d9dbf8300 100644 --- a/src/qibolab/pulses/sequence.py +++ b/src/qibolab/pulses/sequence.py @@ -1,5 +1,7 @@ """PulseSequence class.""" +from collections import defaultdict + from .pulse import PulseType @@ -94,11 +96,12 @@ def coupler_pulses(self, *couplers): @property def finish(self) -> int: """The time when the last pulse of the sequence finishes.""" - t: int = 0 + channel_pulses = defaultdict(list) for pulse in self: - if pulse.finish > t: - t = pulse.finish - return t + channel_pulses[pulse.channel].append(pulse) + return max( + sum(p.duration for p in pulses) for pulses in channel_pulses.values() + ) @property def start(self) -> int: From c3b2f05a1209b97b1b5c33ea6da64c85c00c11fe Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 30 Jan 2024 16:17:21 +0400 Subject: [PATCH 0081/1006] refactor: drop unused PulseSequence methods --- src/qibolab/pulses/pulse.py | 9 ++++--- src/qibolab/pulses/sequence.py | 47 +--------------------------------- 2 files changed, 7 insertions(+), 49 deletions(-) diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index 3bb8dc3c33..88ff8670a4 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -19,11 +19,12 @@ class PulseType(Enum): DRIVE = "qd" FLUX = "qf" COUPLERFLUX = "cf" + DELAY = "dl" @dataclass class Pulse: - """Representation of a pulse to be sent to the QPU.""" + """A pulse to be sent to the QPU.""" duration: int """Pulse duration in ns.""" @@ -118,10 +119,12 @@ def __hash__(self): @dataclass class Delay: - """Representation of a wait instruction during which we are not sending any - pulses to the QPU.""" + """A wait instruction during which we are not sending any pulses to the + QPU.""" duration: int """Delay duration in ns.""" channel: str """Channel on which the delay should be implemented.""" + type: PulseType = PulseType.DELAY + """Type fixed to ``DELAY`` to comply with ``Pulse`` interface.""" diff --git a/src/qibolab/pulses/sequence.py b/src/qibolab/pulses/sequence.py index 6d9dbf8300..65fbe69b8a 100644 --- a/src/qibolab/pulses/sequence.py +++ b/src/qibolab/pulses/sequence.py @@ -94,7 +94,7 @@ def coupler_pulses(self, *couplers): return new_pc @property - def finish(self) -> int: + def duration(self) -> int: """The time when the last pulse of the sequence finishes.""" channel_pulses = defaultdict(list) for pulse in self: @@ -103,20 +103,6 @@ def finish(self) -> int: sum(p.duration for p in pulses) for pulses in channel_pulses.values() ) - @property - def start(self) -> int: - """The start time of the first pulse of the sequence.""" - t = self.finish - for pulse in self: - if pulse.start < t: - t = pulse.start - return t - - @property - def duration(self) -> int: - """Duration of the sequence calculated as its finish - start times.""" - return self.finish - self.start - @property def channels(self) -> list: """List containing the channels used by the pulses in the sequence.""" @@ -137,25 +123,6 @@ def qubits(self) -> list: qubits.sort() return qubits - def get_pulse_overlaps(self): # -> dict((int,int): PulseSequence): - """Return a dictionary of slices of time (tuples with start and finish - times) where pulses overlap.""" - times = [] - for pulse in self: - if not pulse.start in times: - times.append(pulse.start) - if not pulse.finish in times: - times.append(pulse.finish) - times.sort() - - overlaps = {} - for n in range(len(times) - 1): - overlaps[(times[n], times[n + 1])] = PulseSequence() - for pulse in self: - if (pulse.start <= times[n]) & (pulse.finish >= times[n + 1]): - overlaps[(times[n], times[n + 1])] += [pulse] - return overlaps - def separate_overlapping_pulses(self): # -> dict((int,int): PulseSequence): """Separate a sequence of overlapping pulses into a list of non- overlapping sequences.""" @@ -181,15 +148,3 @@ def separate_overlapping_pulses(self): # -> dict((int,int): PulseSequence): if not stored: separated_pulses.append(PulseSequence([new_pulse])) return separated_pulses - - # TODO: Implement separate_different_frequency_pulses() - - @property - def pulses_overlap(self) -> bool: - """Whether any of the pulses in the sequence overlap.""" - overlap = False - for pc in self.get_pulse_overlaps().values(): - if len(pc) > 1: - overlap = True - break - return overlap From c8f9149b99370ab4cd0a7249fa98674bbdcc5515 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 30 Jan 2024 18:34:12 +0400 Subject: [PATCH 0082/1006] refactor: Simplify native.py --- src/qibolab/couplers.py | 4 +- src/qibolab/native.py | 359 ++------------------------------- src/qibolab/pulses/__init__.py | 2 +- src/qibolab/serialize.py | 115 +++++++++-- 4 files changed, 119 insertions(+), 361 deletions(-) diff --git a/src/qibolab/couplers.py b/src/qibolab/couplers.py index 8f1884dda9..0d335dfd8d 100644 --- a/src/qibolab/couplers.py +++ b/src/qibolab/couplers.py @@ -2,7 +2,7 @@ from typing import Dict, Optional, Union from qibolab.channels import Channel -from qibolab.native import CouplerNatives +from qibolab.native import SingleQubitNatives QubitId = Union[str, int] """Type for Coupler names.""" @@ -22,7 +22,7 @@ class Coupler: sweetspot: float = 0 "Coupler sweetspot to center it's flux dependence if needed." - native_pulse: CouplerNatives = field(default_factory=CouplerNatives) + native_pulse: SingleQubitNatives = field(default_factory=SingleQubitNatives) "For now this only contains the calibrated pulse to activate the coupler." _flux: Optional[Channel] = None diff --git a/src/qibolab/native.py b/src/qibolab/native.py index 8c08595e1e..91a0c7da3c 100644 --- a/src/qibolab/native.py +++ b/src/qibolab/native.py @@ -1,256 +1,7 @@ -import copy -from collections import defaultdict from dataclasses import dataclass, field, fields, replace -from typing import List, Optional, Union +from typing import Dict, Optional, Tuple -from qibolab.pulses import Pulse, PulseSequence, PulseType - - -@dataclass -class NativePulse: - """Container with parameters required to generate a pulse implementing a - native gate.""" - - name: str - """Name of the gate that the pulse implements.""" - duration: int - amplitude: float - shape: str - pulse_type: PulseType - qubit: "qubits.Qubit" - frequency: int = 0 - relative_start: int = 0 - """Relative start is relevant for two-qubit gate operations which - correspond to a pulse sequence.""" - - # used for qblox - if_frequency: Optional[int] = None - # TODO: Note sure if the following parameters are useful to be in the runcard - start: int = 0 - phase: float = 0.0 - - @classmethod - def from_dict(cls, name, pulse, qubit): - """Parse the dictionary provided by the runcard. - - Args: - name (str): Name of the native gate (dictionary key). - pulse (dict): Dictionary containing the parameters of the pulse implementing - the gate, as loaded from the runcard. - qubits (:class:`qibolab.platforms.abstract.Qubit`): Qubit that the - pulse is acting on - """ - kwargs = copy.deepcopy(pulse) - kwargs["pulse_type"] = PulseType(kwargs.pop("type")) - kwargs["qubit"] = qubit - return cls(name, **kwargs) - - @property - def raw(self): - data = { - fld.name: getattr(self, fld.name) - for fld in fields(self) - if getattr(self, fld.name) is not None - } - del data["name"] - del data["start"] - if self.pulse_type is PulseType.FLUX: - del data["frequency"] - del data["phase"] - data["qubit"] = self.qubit.name - data["type"] = data.pop("pulse_type").value - return data - - def pulse(self, start, relative_phase=0.0): - """Construct the :class:`qibolab.pulses.Pulse` object implementing the - gate. - - Args: - start (int): Start time of the pulse in the sequence. - relative_phase (float): Relative phase of the pulse. - - Returns: - A :class:`qibolab.pulses.DrivePulse` or :class:`qibolab.pulses.DrivePulse` - or :class:`qibolab.pulses.FluxPulse` with the pulse parameters of the gate. - """ - if self.pulse_type is PulseType.FLUX: - return Pulse.flux( - start + self.relative_start, - self.duration, - self.amplitude, - self.shape, - channel=self.qubit.flux.name, - qubit=self.qubit.name, - ) - - channel = getattr(self.qubit, self.pulse_type.name.lower()).name - return Pulse( - start + self.relative_start, - self.duration, - self.amplitude, - self.frequency, - relative_phase, - self.shape, - type=self.pulse_type, - channel=channel, - qubit=self.qubit.name, - ) - - -@dataclass -class VirtualZPulse: - """Container with parameters required to add a virtual Z phase in a pulse - sequence.""" - - phase: float - qubit: "qubits.Qubit" - - @property - def raw(self): - return {"type": "virtual_z", "phase": self.phase, "qubit": self.qubit.name} - - -@dataclass -class CouplerPulse: - """Container with parameters required to add a coupler pulse in a pulse - sequence.""" - - duration: int - amplitude: float - shape: str - coupler: "couplers.Coupler" - relative_start: int = 0 - - @classmethod - def from_dict(cls, pulse, coupler): - """Parse the dictionary provided by the runcard. - - Args: - name (str): Name of the native gate (dictionary key). - pulse (dict): Dictionary containing the parameters of the pulse implementing - the gate, as loaded from the runcard. - coupler (:class:`qibolab.platforms.abstract.Coupler`): Coupler that the - pulse is acting on - """ - kwargs = copy.deepcopy(pulse) - kwargs["coupler"] = coupler - kwargs.pop("type") - return cls(**kwargs) - - @property - def raw(self): - return { - "type": "coupler", - "duration": self.duration, - "amplitude": self.amplitude, - "shape": self.shape, - "coupler": self.coupler.name, - "relative_start": self.relative_start, - } - - def pulse(self, start): - """Construct the :class:`qibolab.pulses.Pulse` object implementing the - gate. - - Args: - start (int): Start time of the pulse in the sequence. - - Returns: - A :class:`qibolab.pulses.FluxPulse` with the pulse parameters of the gate. - """ - return Pulse( - start + self.relative_start, - self.duration, - self.amplitude, - 0, - 0, - self.shape, - type=PulseType.COUPLERFLUX, - channel=self.coupler.flux.name, - qubit=self.coupler.name, - ) - - -@dataclass -class NativeSequence: - """List of :class:`qibolab.platforms.native.NativePulse` objects - implementing a gate. - - Relevant for two-qubit gates, which usually require a sequence of - pulses to be implemented. These pulses may act on qubits different - than the qubits the gate is targeting. - """ - - name: str - pulses: List[Union[NativePulse, VirtualZPulse]] = field(default_factory=list) - coupler_pulses: List[CouplerPulse] = field(default_factory=list) - - @classmethod - def from_dict(cls, name, sequence, qubits, couplers): - """Constructs the native sequence from the dictionaries provided in the - runcard. - - Args: - name (str): Name of the gate the sequence is applying. - sequence (dict): Dictionary describing the sequence as provided in the runcard. - qubits (list): List of :class:`qibolab.qubits.Qubit` object for all - qubits in the platform. All qubits are required because the sequence may be - acting on qubits that the implemented gate is not targeting. - couplers (list): List of :class:`qibolab.couplers.Coupler` object for all - couplers in the platform. All couplers are required because the sequence may be - acting on couplers that the implemented gate is not targeting. - """ - pulses = [] - coupler_pulses = [] - - # If sequence contains only one pulse dictionary, convert it into a list that can be iterated below - if isinstance(sequence, dict): - sequence = [sequence] - - for i, pulse in enumerate(sequence): - pulse = copy.deepcopy(pulse) - pulse_type = pulse.pop("type") - if pulse_type == "coupler": - pulse["coupler"] = couplers[pulse.pop("coupler")] - coupler_pulses.append(CouplerPulse(**pulse)) - else: - qubit = qubits[pulse.pop("qubit")] - if pulse_type == "virtual_z": - phase = pulse["phase"] - pulses.append(VirtualZPulse(phase, qubit)) - else: - pulses.append( - NativePulse( - f"{name}{i}", - **pulse, - pulse_type=PulseType(pulse_type), - qubit=qubit, - ) - ) - return cls(name, pulses, coupler_pulses) - - @property - def raw(self): - pulses = [pulse.raw for pulse in self.pulses] - coupler_pulses = [pulse.raw for pulse in self.coupler_pulses] - return pulses + coupler_pulses - - def sequence(self, start=0): - """Creates a :class:`qibolab.pulses.PulseSequence` object implementing - the sequence.""" - sequence = PulseSequence() - virtual_z_phases = defaultdict(int) - - for pulse in self.pulses: - if isinstance(pulse, NativePulse): - sequence.append(pulse.pulse(start=start)) - else: - virtual_z_phases[pulse.qubit.name] += pulse.phase - - for coupler_pulse in self.coupler_pulses: - sequence.append(coupler_pulse.pulse(start=start)) - # TODO: Maybe ``virtual_z_phases`` should be an attribute of ``PulseSequence`` - return sequence, virtual_z_phases +from qibolab.pulses import Pulse, PulseSequence @dataclass @@ -258,85 +9,22 @@ class SingleQubitNatives: """Container with the native single-qubit gates acting on a specific qubit.""" - RX: Optional[NativePulse] = None + RX: Optional[Pulse] = None """Pulse to drive the qubit from state 0 to state 1.""" - RX12: Optional[NativePulse] = None + RX12: Optional[Pulse] = None """Pulse to drive to qubit from state 1 to state 2.""" - MZ: Optional[NativePulse] = None + MZ: Optional[Pulse] = None """Measurement pulse.""" + CP: Optional[Pulse] = None + """Pulse to activate a coupler.""" @property - def RX90(self) -> NativePulse: + def RX90(self) -> Pulse: """RX90 native pulse is inferred from RX by halving its amplitude.""" - return replace(self.RX, name="RX90", amplitude=self.RX.amplitude / 2.0) - - @classmethod - def from_dict(cls, qubit, native_gates): - """Parse native gates of the qubit from the runcard. + return replace(self.RX, amplitude=self.RX.amplitude / 2.0) - Args: - qubit (:class:`qibolab.qubits.Qubit`): Qubit object that the - native gates are acting on. - native_gates (dict): Dictionary with native gate pulse parameters as loaded - from the runcard. - """ - pulses = { - n: NativePulse.from_dict(n, pulse, qubit=qubit) - for n, pulse in native_gates.items() - } - return cls(**pulses) - @property - def raw(self): - """Serialize native gate pulses. - - ``None`` gates are not included. - """ - data = {} - for fld in fields(self): - attr = getattr(self, fld.name) - if attr is not None: - data[fld.name] = attr.raw - del data[fld.name]["qubit"] - return data - - -@dataclass -class CouplerNatives: - """Container with the native single-qubit gates acting on a specific - qubit.""" - - CP: Optional[NativePulse] = None - """Pulse to activate the coupler.""" - - @classmethod - def from_dict(cls, coupler, native_gates): - """Parse coupler native gates from the runcard. - - Args: - coupler (:class:`qibolab.couplers.Coupler`): Coupler object that the - native pulses are acting on. - native_gates (dict): Dictionary with native gate pulse parameters as loaded - from the runcard [Reusing the dict from qubits]. - """ - pulses = { - n: CouplerPulse.from_dict(pulse, coupler=coupler) - for n, pulse in native_gates.items() - } - return cls(**pulses) - - @property - def raw(self): - """Serialize native gate pulses. - - ``None`` gates are not included. - """ - data = {} - for fld in fields(self): - attr = getattr(self, fld.name) - if attr is not None: - data[fld.name] = attr.raw - return data +TwoQubitNativeType = Tuple[PulseSequence, Dict["QubitId", float]] @dataclass @@ -344,9 +32,13 @@ class TwoQubitNatives: """Container with the native two-qubit gates acting on a specific pair of qubits.""" - CZ: Optional[NativeSequence] = field(default=None, metadata={"symmetric": True}) - CNOT: Optional[NativeSequence] = field(default=None, metadata={"symmetric": False}) - iSWAP: Optional[NativeSequence] = field(default=None, metadata={"symmetric": True}) + CZ: Optional[TwoQubitNativeType] = field(default=None, metadata={"symmetric": True}) + CNOT: Optional[TwoQubitNativeType] = field( + default=None, metadata={"symmetric": False} + ) + iSWAP: Optional[TwoQubitNativeType] = field( + default=None, metadata={"symmetric": True} + ) @property def symmetric(self): @@ -356,20 +48,3 @@ def symmetric(self): fld.metadata["symmetric"] or getattr(self, fld.name) is None for fld in fields(self) ) - - @classmethod - def from_dict(cls, qubits, couplers, native_gates): - sequences = { - n: NativeSequence.from_dict(n, seq, qubits, couplers) - for n, seq in native_gates.items() - } - return cls(**sequences) - - @property - def raw(self): - data = {} - for fld in fields(self): - gate = getattr(self, fld.name) - if gate is not None: - data[fld.name] = gate.raw - return data diff --git a/src/qibolab/pulses/__init__.py b/src/qibolab/pulses/__init__.py index f0ad2ad163..ed4233e7de 100644 --- a/src/qibolab/pulses/__init__.py +++ b/src/qibolab/pulses/__init__.py @@ -1,4 +1,4 @@ -from .pulse import Pulse, PulseType +from .pulse import Delay, Pulse, PulseType from .sequence import PulseSequence from .shape import ( IIR, diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index cf89896ad3..3c0dd1d258 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -6,13 +6,14 @@ """ import json -from dataclasses import asdict +from collections import defaultdict +from dataclasses import asdict, fields from pathlib import Path from typing import Tuple from qibolab.couplers import Coupler from qibolab.kernels import Kernels -from qibolab.native import CouplerNatives, SingleQubitNatives, TwoQubitNatives +from qibolab.native import SingleQubitNatives, TwoQubitNatives from qibolab.platform.platform import ( CouplerMap, InstrumentMap, @@ -21,6 +22,7 @@ QubitPairMap, Settings, ) +from qibolab.pulses import Delay, Pulse, PulseSequence, PulseType from qibolab.qubits import Qubit, QubitId, QubitPair RUNCARD = "parameters.json" @@ -96,7 +98,53 @@ def load_qubits( return qubits, couplers, pairs -# This creates the compiler error +def _load_pulse(pulse_kwargs, qubit=None): + _type = pulse_kwargs["type"] + q = pulse_kwargs.pop("qubit", qubit.name) + if _type == "dl": + return Delay(**pulse_kwargs) + + pulse = Pulse(**pulse_kwargs, qubit=q) + channel_type = "flux" if pulse.type is PulseType.COUPLERFLUX else pulse.type.lower() + pulse.channel = getattr(qubit, channel_type) + return pulse + + +def _load_single_qubit_natives(qubit, gates) -> SingleQubitNatives: + """Parse native gates of the qubit from the runcard. + + Args: + qubit (:class:`qibolab.qubits.Qubit`): Qubit object that the + native gates are acting on. + gates (dict): Dictionary with native gate pulse parameters as loaded + from the runcard. + """ + return SingleQubitNatives( + **{name: _load_pulse(kwargs, qubit) for name, kwargs in gates.items()} + ) + + +def _load_two_qubit_natives(qubits, couplers, gates) -> TwoQubitNatives: + sequences = {} + for name, seq_kwargs in gates.items(): + if isinstance(sequence, dict): + seq_kwargs = [seq_kwargs] + + sequence = PulseSequence() + virtual_z_phases = defaultdict(int) + for kwargs in seq_kwargs: + _type = kwargs["type"] + q = kwargs["qubit"] + if _type == "virtual_z": + virtual_z_phases[q] += kwargs["phase"] + else: + qubit = couplers[q] if _type == "cf" else qubits[q] + sequence.append(_load_pulse(kwargs, qubit)) + + sequences[name] = (sequence, virtual_z_phases) + return TwoQubitNatives(**sequences) + + def register_gates( runcard: dict, qubits: QubitMap, pairs: QubitPairMap, couplers: CouplerMap = None ) -> Tuple[QubitMap, QubitPairMap]: @@ -110,20 +158,21 @@ def register_gates( native_gates = runcard.get("native_gates", {}) for q, gates in native_gates.get("single_qubit", {}).items(): - qubits[load_qubit_name(q)].native_gates = SingleQubitNatives.from_dict( + qubits[load_qubit_name(q)].native_gates = _load_single_qubit_natives( qubits[load_qubit_name(q)], gates ) for c, gates in native_gates.get("coupler", {}).items(): - couplers[load_qubit_name(c)].native_pulse = CouplerNatives.from_dict( + couplers[load_qubit_name(c)].native_pulse = _load_single_qubit_natives( couplers[load_qubit_name(c)], gates ) # register two-qubit native gates to ``QubitPair`` objects for pair, gatedict in native_gates.get("two_qubit", {}).items(): q0, q1 = tuple(int(q) if q.isdigit() else q for q in pair.split("-")) - native_gates = TwoQubitNatives.from_dict(qubits, couplers, gatedict) - pairs[(q0, q1)].native_gates = native_gates + native_gates = _load_two_qubit_natives(qubits, couplers, gatedict) + coupler = pairs[(q0, q1)].coupler + pairs[(q0, q1)] = QubitPair(qubits[q0], qubits[q1], coupler, native_gates) if native_gates.symmetric: pairs[(q1, q0)] = pairs[(q0, q1)] @@ -146,6 +195,39 @@ def dump_qubit_name(name: QubitId) -> str: return name +def _dump_pulse(pulse: Pulse): + data = asdict(pulse) + if pulse.type in (PulseType.FLUX, PulseType.COUPLERFLUX): + del data["frequency"] + del data["relative_phase"] + data["type"] = data["type"].value + return data + + +def _dump_single_qubit_natives(natives: SingleQubitNatives): + data = {} + for fld in fields(natives): + pulse = getattr(natives, fld.name) + if pulse is not None: + data[fld.name] = _dump_pulse(pulse) + del data[fld.name]["qubit"] + return data + + +def _dump_two_qubit_natives(natives: TwoQubitNatives): + data = {} + for fld in fields(natives): + if getattr(natives, fld.name) is None: + continue + sequence, virtual_z_phases = getattr(natives, fld.name) + data[fld.name] = [_dump_pulse(pulse) for pulse in sequence] + data[fld.name].extend( + {"type": "virtual_z", "phase": phase, "qubit": q} + for q, phase in virtual_z_phases.items() + ) + return data + + def dump_native_gates( qubits: QubitMap, pairs: QubitPairMap, couplers: CouplerMap = None ) -> dict: @@ -154,23 +236,24 @@ def dump_native_gates( # single-qubit native gates native_gates = { "single_qubit": { - dump_qubit_name(q): qubit.native_gates.raw for q, qubit in qubits.items() + dump_qubit_name(q): _dump_single_qubit_natives(qubit.native_gates) + for q, qubit in qubits.items() } } + if couplers: native_gates["coupler"] = { - dump_qubit_name(c): coupler.native_pulse.raw + dump_qubit_name(c): _dump_two_qubit_natives(coupler.native_gates) for c, coupler in couplers.items() } # two-qubit native gates - if len(pairs) > 0: - native_gates["two_qubit"] = {} - for pair in pairs.values(): - natives = pair.native_gates.raw - if len(natives) > 0: - pair_name = f"{pair.qubit1.name}-{pair.qubit2.name}" - native_gates["two_qubit"][pair_name] = natives + native_gates["two_qubit"] = {} + for pair in pairs.values(): + natives = _dump_two_qubit_natives(pair.native_gates) + if len(natives) > 0: + pair_name = f"{pair.qubit1.name}-{pair.qubit2.name}" + native_gates["two_qubit"][pair_name] = natives return native_gates From 9596b2fed92ea198fd0cfb8a644eca272d4936bd Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 30 Jan 2024 19:17:29 +0400 Subject: [PATCH 0083/1006] refactor: Remove pulse.start from platform and sweeper --- src/qibolab/platform/platform.py | 50 ++++++++++++++++++-------------- src/qibolab/sweeper.py | 4 +-- 2 files changed, 29 insertions(+), 25 deletions(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index ede232c7db..c171473283 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -274,7 +274,7 @@ def sweep( platform = create_dummy() sequence = PulseSequence() parameter = Parameter.frequency - pulse = platform.create_qubit_readout_pulse(qubit=0, start=0) + pulse = platform.create_qubit_readout_pulse(qubit=0) sequence.append(pulse) parameter_range = np.random.randint(10, size=10) sweeper = Sweeper(parameter, parameter_range, [pulse]) @@ -333,62 +333,68 @@ def get_coupler(self, coupler): except KeyError: return list(self.couplers.keys())[coupler] - def create_RX90_pulse(self, qubit, start=0, relative_phase=0): + def create_RX90_pulse(self, qubit, relative_phase=0): qubit = self.get_qubit(qubit) - return self.qubits[qubit].native_gates.RX90.pulse(start, relative_phase) + pulse = self.qubits[qubit].native_gates.RX90 + pulse.relative_phase = relative_phase + return pulse - def create_RX_pulse(self, qubit, start=0, relative_phase=0): + def create_RX_pulse(self, qubit, relative_phase=0): qubit = self.get_qubit(qubit) - return self.qubits[qubit].native_gates.RX.pulse(start, relative_phase) + pulse = self.qubits[qubit].native_gates.RX + pulse.relative_phase = relative_phase + return pulse - def create_RX12_pulse(self, qubit, start=0, relative_phase=0): + def create_RX12_pulse(self, qubit, relative_phase=0): qubit = self.get_qubit(qubit) - return self.qubits[qubit].native_gates.RX12.pulse(start, relative_phase) + pulse = self.qubits[qubit].native_gates.RX12 + pulse.relative_phase = relative_phase + return pulse - def create_CZ_pulse_sequence(self, qubits, start=0): + def create_CZ_pulse_sequence(self, qubits): pair = tuple(self.get_qubit(q) for q in qubits) if pair not in self.pairs or self.pairs[pair].native_gates.CZ is None: raise_error( ValueError, f"Calibration for CZ gate between qubits {qubits[0]} and {qubits[1]} not found.", ) - return self.pairs[pair].native_gates.CZ.sequence(start) + return self.pairs[pair].native_gates.CZ - def create_iSWAP_pulse_sequence(self, qubits, start=0): + def create_iSWAP_pulse_sequence(self, qubits): pair = tuple(self.get_qubit(q) for q in qubits) if pair not in self.pairs or self.pairs[pair].native_gates.iSWAP is None: raise_error( ValueError, f"Calibration for iSWAP gate between qubits {qubits[0]} and {qubits[1]} not found.", ) - return self.pairs[pair].native_gates.iSWAP.sequence(start) + return self.pairs[pair].native_gates.iSWAP - def create_CNOT_pulse_sequence(self, qubits, start=0): + def create_CNOT_pulse_sequence(self, qubits): pair = tuple(self.get_qubit(q) for q in qubits) if pair not in self.pairs or self.pairs[pair].native_gates.CNOT is None: raise_error( ValueError, f"Calibration for CNOT gate between qubits {qubits[0]} and {qubits[1]} not found.", ) - return self.pairs[pair].native_gates.CNOT.sequence(start) + return self.pairs[pair].native_gates.CNOT - def create_MZ_pulse(self, qubit, start): + def create_MZ_pulse(self, qubit): qubit = self.get_qubit(qubit) - return self.qubits[qubit].native_gates.MZ.pulse(start) + return self.qubits[qubit].native_gates.MZ - def create_qubit_drive_pulse(self, qubit, start, duration, relative_phase=0): + def create_qubit_drive_pulse(self, qubit, duration, relative_phase=0): qubit = self.get_qubit(qubit) - pulse = self.qubits[qubit].native_gates.RX.pulse(start, relative_phase) + pulse = self.qubits[qubit].native_gates.RX + pulse.relative_phase = relative_phase pulse.duration = duration return pulse - def create_qubit_readout_pulse(self, qubit, start): - qubit = self.get_qubit(qubit) - return self.create_MZ_pulse(qubit, start) + def create_qubit_readout_pulse(self, qubit): + return self.create_MZ_pulse(qubit) - def create_coupler_pulse(self, coupler, start, duration=None, amplitude=None): + def create_coupler_pulse(self, coupler, duration=None, amplitude=None): coupler = self.get_coupler(coupler) - pulse = self.couplers[coupler].native_pulse.CP.pulse(start) + pulse = self.couplers[coupler].native_pulse.CP if duration is not None: pulse.duration = duration if amplitude is not None: diff --git a/src/qibolab/sweeper.py b/src/qibolab/sweeper.py index 84ff1880cd..ddb17297aa 100644 --- a/src/qibolab/sweeper.py +++ b/src/qibolab/sweeper.py @@ -14,7 +14,6 @@ class Parameter(Enum): amplitude = auto() duration = auto() relative_phase = auto() - start = auto() attenuation = auto() gain = auto() @@ -26,7 +25,6 @@ class Parameter(Enum): AMPLITUDE = Parameter.amplitude DURATION = Parameter.duration RELATIVE_PHASE = Parameter.relative_phase -START = Parameter.start ATTENUATION = Parameter.attenuation GAIN = Parameter.gain BIAS = Parameter.bias @@ -64,7 +62,7 @@ class Sweeper: platform = create_dummy() sequence = PulseSequence() parameter = Parameter.frequency - pulse = platform.create_qubit_readout_pulse(qubit=0, start=0) + pulse = platform.create_qubit_readout_pulse(qubit=0) sequence.append(pulse) parameter_range = np.random.randint(10, size=10) sweeper = Sweeper(parameter, parameter_range, [pulse]) From ddabce7fd2e0bccfb007505a3b394dde8e244418 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 23 Feb 2024 17:03:00 +0400 Subject: [PATCH 0084/1006] fix: remove pulse.start from compiler --- src/qibolab/compilers/compiler.py | 58 ++++++++++++------------------- 1 file changed, 22 insertions(+), 36 deletions(-) diff --git a/src/qibolab/compilers/compiler.py b/src/qibolab/compilers/compiler.py index 7bfa9f0e16..64f9fbb4da 100644 --- a/src/qibolab/compilers/compiler.py +++ b/src/qibolab/compilers/compiler.py @@ -15,7 +15,7 @@ u3_rule, z_rule, ) -from qibolab.pulses import PulseSequence, PulseType +from qibolab.pulses import Delay, PulseSequence, PulseType @dataclass @@ -98,33 +98,6 @@ def inner(func): return inner - def _compile_gate( - self, gate, platform, sequence, virtual_z_phases, moment_start, delays - ): - """Adds a single gate to the pulse sequence.""" - rule = self[gate.__class__] - # get local sequence and phases for the current gate - gate_sequence, gate_phases = rule(gate, platform) - - # update global pulse sequence - # determine the right start time based on the availability of the qubits involved - all_qubits = {*gate_sequence.qubits, *gate.qubits} - start = max( - *[ - sequence.get_qubit_pulses(qubit).finish + delays[qubit] - for qubit in all_qubits - ], - moment_start, - ) - # shift start time and phase according to the global sequence - for pulse in gate_sequence: - pulse.start += start - if pulse.type is not PulseType.READOUT: - pulse.relative_phase += virtual_z_phases[pulse.qubit] - sequence.append(pulse) - - return gate_sequence, gate_phases - def compile(self, circuit, platform): """Transforms a circuit to pulse sequence. @@ -144,20 +117,33 @@ def compile(self, circuit, platform): virtual_z_phases = defaultdict(int) measurement_map = {} + qubit_clock = defaultdict(int) + channel_clock = defaultdict(int) # process circuit gates - delays = defaultdict(int) for moment in circuit.queue.moments: - moment_start = sequence.finish for gate in set(filter(lambda x: x is not None, moment)): if isinstance(gate, gates.Align): for qubit in gate.qubits: - delays[qubit] += gate.delay + # TODO: do something + pass continue - gate_sequence, gate_phases = self._compile_gate( - gate, platform, sequence, virtual_z_phases, moment_start, delays - ) - for qubit in gate.qubits: - delays[qubit] = 0 + + rule = self[gate.__class__] + # get local sequence and phases for the current gate + gate_sequence, gate_phases = rule(gate, platform) + for pulse in gate_sequence: + if pulse.type is not PulseType.READOUT: + pulse.relative_phase += virtual_z_phases[pulse.qubit] + + if qubit_clock[pulse.qubit] > channel_clock[pulse.qubit]: + delay = qubit_clock[pulse.qubit] - channel_clock[pulse.channel] + sequence.append(Delay(delay, pulse.channel)) + channel_clock[pulse.channel] += delay + + sequence.append(pulse) + # update clocks + qubit_clock[pulse.qubit] += pulse.duration + channel_clock[pulse.channel] += pulse.duration # update virtual Z phases for qubit, phase in gate_phases.items(): From cdcf748fb68ad2058b7aff85e37f6f91685123ad Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Sat, 24 Feb 2024 00:48:35 +0400 Subject: [PATCH 0085/1006] fix: remove relative_start from dummy_qrc runcards --- tests/dummy_qrc/qblox/parameters.json | 70 +---------------------- tests/dummy_qrc/qm/parameters.json | 17 ------ tests/dummy_qrc/qm_octave/parameters.json | 21 +------ tests/dummy_qrc/rfsoc/parameters.json | 3 - tests/dummy_qrc/zurich/parameters.json | 54 ++--------------- 5 files changed, 9 insertions(+), 156 deletions(-) diff --git a/tests/dummy_qrc/qblox/parameters.json b/tests/dummy_qrc/qblox/parameters.json index 7a5099b5fe..45e83d91ed 100644 --- a/tests/dummy_qrc/qblox/parameters.json +++ b/tests/dummy_qrc/qblox/parameters.json @@ -104,7 +104,6 @@ "frequency": 5050304836, "shape": "Gaussian(5)", "type": "qd", - "relative_start": 0, "phase": 0 }, "RX12": { @@ -113,7 +112,6 @@ "frequency": 5050304836, "shape": "Gaussian(5)", "type": "qd", - "relative_start": 0, "phase": 0 }, "MZ": { @@ -122,7 +120,6 @@ "frequency": 7213299307, "shape": "Rectangular()", "type": "ro", - "relative_start": 0, "phase": 0 } }, @@ -133,7 +130,6 @@ "frequency": 4852833073, "shape": "Gaussian(5)", "type": "qd", - "relative_start": 0, "phase": 0 }, "RX12": { @@ -142,7 +138,6 @@ "frequency": 4852833073, "shape": "Gaussian(5)", "type": "qd", - "relative_start": 0, "phase": 0 }, "MZ": { @@ -151,7 +146,6 @@ "frequency": 7452990931, "shape": "Rectangular()", "type": "ro", - "relative_start": 0, "phase": 0 } }, @@ -162,7 +156,6 @@ "frequency": 5795371914, "shape": "Gaussian(5)", "type": "qd", - "relative_start": 0, "phase": 0 }, "RX12": { @@ -171,7 +164,6 @@ "frequency": 5795371914, "shape": "Gaussian(5)", "type": "qd", - "relative_start": 0, "phase": 0 }, "MZ": { @@ -180,7 +172,6 @@ "frequency": 7655083068, "shape": "Rectangular()", "type": "ro", - "relative_start": 0, "phase": 0 } }, @@ -191,7 +182,6 @@ "frequency": 6761018001, "shape": "Gaussian(5)", "type": "qd", - "relative_start": 0, "phase": 0 }, "RX12": { @@ -200,7 +190,6 @@ "frequency": 6761018001, "shape": "Gaussian(5)", "type": "qd", - "relative_start": 0, "phase": 0 }, "MZ": { @@ -209,7 +198,6 @@ "frequency": 7803441221, "shape": "Rectangular()", "type": "ro", - "relative_start": 0, "phase": 0 } }, @@ -220,7 +208,6 @@ "frequency": 6586543060, "shape": "Gaussian(5)", "type": "qd", - "relative_start": 0, "phase": 0 }, "RX12": { @@ -229,7 +216,6 @@ "frequency": 6586543060, "shape": "Gaussian(5)", "type": "qd", - "relative_start": 0, "phase": 0 }, "MZ": { @@ -238,7 +224,6 @@ "frequency": 8058947261, "shape": "Rectangular()", "type": "ro", - "relative_start": 0, "phase": 0 } } @@ -251,15 +236,6 @@ "amplitude": -0.6025, "shape": "Exponential(12, 5000, 0.1)", "qubit": 3, - "relative_start": 0, - "type": "qf" - }, - { - "duration": 20, - "amplitude": 0, - "shape": "Rectangular())", - "qubit": 3, - "relative_start": 32, "type": "qf" }, { @@ -267,22 +243,6 @@ "phase": -3.63, "qubit": 3 }, - { - "duration": 32, - "amplitude": 0, - "shape": "Rectangular())", - "qubit": 2, - "relative_start": 0, - "type": "qf" - }, - { - "duration": 20, - "amplitude": 0, - "shape": "Rectangular())", - "qubit": 2, - "relative_start": 32, - "type": "qf" - }, { "type": "virtual_z", "phase": -0.041, @@ -297,7 +257,6 @@ "amplitude": -0.142, "shape": "Exponential(12, 5000, 0.1)", "qubit": 2, - "relative_start": 0, "type": "qf" } ] @@ -308,38 +267,13 @@ "duration": 32, "amplitude": -0.6025, "shape": "Exponential(12, 5000, 0.1)", - "qubit": 3, - "relative_start": 0, - "type": "qf" - }, - { - "duration": 20, - "amplitude": 0, - "shape": "Rectangular())", - "qubit": 3, - "relative_start": 32, + "qubit": 2, "type": "qf" }, { "type": "virtual_z", "phase": -3.63, - "qubit": 3 - }, - { - "duration": 32, - "amplitude": 0, - "shape": "Rectangular())", - "qubit": 2, - "relative_start": 0, - "type": "qf" - }, - { - "duration": 20, - "amplitude": 0, - "shape": "Rectangular())", - "qubit": 2, - "relative_start": 32, - "type": "qf" + "qubit": 1 }, { "type": "virtual_z", diff --git a/tests/dummy_qrc/qm/parameters.json b/tests/dummy_qrc/qm/parameters.json index 86b76bff5c..54fbc03ddd 100644 --- a/tests/dummy_qrc/qm/parameters.json +++ b/tests/dummy_qrc/qm/parameters.json @@ -85,7 +85,6 @@ "frequency": 4700000000, "shape": "Gaussian(5)", "type": "qd", - "relative_start": 0, "phase": 0 }, "RX12": { @@ -94,7 +93,6 @@ "frequency": 4700000000, "shape": "Gaussian(5)", "type": "qd", - "relative_start": 0, "phase": 0 }, "MZ": { @@ -103,7 +101,6 @@ "frequency": 7226500000, "shape": "Rectangular()", "type": "ro", - "relative_start": 0, "phase": 0 } }, @@ -114,7 +111,6 @@ "frequency": 4855663000, "shape": "Drag(5, -0.02)", "type": "qd", - "relative_start": 0, "phase": 0 }, "RX12": { @@ -123,7 +119,6 @@ "frequency": 4855663000, "shape": "Drag(5, -0.02)", "type": "qd", - "relative_start": 0, "phase": 0 }, "MZ": { @@ -132,7 +127,6 @@ "frequency": 7453265000, "shape": "Rectangular()", "type": "ro", - "relative_start": 0, "phase": 0 } }, @@ -143,7 +137,6 @@ "frequency": 5800563000, "shape": "Drag(5, -0.04)", "type": "qd", - "relative_start": 0, "phase": 0 }, "RX12": { @@ -152,7 +145,6 @@ "frequency": 5800563000, "shape": "Drag(5, -0.04)", "type": "qd", - "relative_start": 0, "phase": 0 }, "MZ": { @@ -161,7 +153,6 @@ "frequency": 7655107000, "shape": "Rectangular()", "type": "ro", - "relative_start": 0, "phase": 0 } }, @@ -172,7 +163,6 @@ "frequency": 6760922000, "shape": "Gaussian(5)", "type": "qd", - "relative_start": 0, "phase": 0 }, "RX12": { @@ -181,7 +171,6 @@ "frequency": 6760922000, "shape": "Gaussian(5)", "type": "qd", - "relative_start": 0, "phase": 0 }, "MZ": { @@ -190,7 +179,6 @@ "frequency": 7802191000, "shape": "Rectangular()", "type": "ro", - "relative_start": 0, "phase": 0 } }, @@ -201,7 +189,6 @@ "frequency": 6585053000, "shape": "Drag(5, 0.0)", "type": "qd", - "relative_start": 0, "phase": 0 }, "RX12": { @@ -210,7 +197,6 @@ "frequency": 6585053000, "shape": "Drag(5, 0.0)", "type": "qd", - "relative_start": 0, "phase": 0 }, "MZ": { @@ -219,7 +205,6 @@ "frequency": 8057668000, "shape": "Rectangular()", "type": "ro", - "relative_start": 0, "phase": 0 } } @@ -232,7 +217,6 @@ "amplitude": 0.055, "shape": "Rectangular()", "qubit": 2, - "relative_start": 0, "type": "qf" }, { @@ -254,7 +238,6 @@ "amplitude": -0.0513, "shape": "Rectangular()", "qubit": 3, - "relative_start": 0, "type": "qf" }, { diff --git a/tests/dummy_qrc/qm_octave/parameters.json b/tests/dummy_qrc/qm_octave/parameters.json index db430ede9b..de55fdf484 100644 --- a/tests/dummy_qrc/qm_octave/parameters.json +++ b/tests/dummy_qrc/qm_octave/parameters.json @@ -107,7 +107,6 @@ "frequency": 4700000000, "shape": "Gaussian(5)", "type": "qd", - "relative_start": 0, "phase": 0 }, "RX12": { @@ -116,7 +115,6 @@ "frequency": 4700000000, "shape": "Gaussian(5)", "type": "qd", - "relative_start": 0, "phase": 0 }, "MZ": { @@ -125,7 +123,6 @@ "frequency": 7226500000, "shape": "Rectangular()", "type": "ro", - "relative_start": 0, "phase": 0 } }, @@ -136,7 +133,6 @@ "frequency": 4855663000, "shape": "Drag(5, -0.02)", "type": "qd", - "relative_start": 0, "phase": 0 }, "RX12": { @@ -145,7 +141,6 @@ "frequency": 4855663000, "shape": "Drag(5, -0.02)", "type": "qd", - "relative_start": 0, "phase": 0 }, "MZ": { @@ -154,7 +149,6 @@ "frequency": 7453265000, "shape": "Rectangular()", "type": "ro", - "relative_start": 0, "phase": 0 } }, @@ -165,7 +159,6 @@ "frequency": 5800563000, "shape": "Drag(5, -0.04)", "type": "qd", - "relative_start": 0, "phase": 0 }, "RX12": { @@ -174,7 +167,6 @@ "frequency": 5800563000, "shape": "Drag(5, -0.04)", "type": "qd", - "relative_start": 0, "phase": 0 }, "MZ": { @@ -183,7 +175,6 @@ "frequency": 7655107000, "shape": "Rectangular()", "type": "ro", - "relative_start": 0, "phase": 0 } }, @@ -194,7 +185,6 @@ "frequency": 6760922000, "shape": "Gaussian(5)", "type": "qd", - "relative_start": 0, "phase": 0 }, "RX12": { @@ -203,7 +193,6 @@ "frequency": 6760922000, "shape": "Gaussian(5)", "type": "qd", - "relative_start": 0, "phase": 0 }, "MZ": { @@ -212,7 +201,6 @@ "frequency": 7802191000, "shape": "Rectangular()", "type": "ro", - "relative_start": 0, "phase": 0 } }, @@ -223,7 +211,6 @@ "frequency": 6585053000, "shape": "Drag(5, 0.0)", "type": "qd", - "relative_start": 0, "phase": 0 }, "RX12": { @@ -232,7 +219,6 @@ "frequency": 6585053000, "shape": "Drag(5, 0.0)", "type": "qd", - "relative_start": 0, "phase": 0 }, "MZ": { @@ -241,7 +227,6 @@ "frequency": 8057668000, "shape": "Rectangular()", "type": "ro", - "relative_start": 0, "phase": 0 } } @@ -254,8 +239,7 @@ "amplitude": 0.055, "shape": "Rectangular()", "qubit": 2, - "relative_start": 0, - "type": "qf" + "type": "qf" }, { "type": "virtual_z", @@ -276,8 +260,7 @@ "amplitude": -0.0513, "shape": "Rectangular()", "qubit": 3, - "relative_start": 0, - "type": "qf" + "type": "qf" }, { "type": "virtual_z", diff --git a/tests/dummy_qrc/rfsoc/parameters.json b/tests/dummy_qrc/rfsoc/parameters.json index 65e71e7da5..b99a6e8784 100644 --- a/tests/dummy_qrc/rfsoc/parameters.json +++ b/tests/dummy_qrc/rfsoc/parameters.json @@ -34,7 +34,6 @@ "frequency": 5542341844, "shape": "Rectangular()", "type": "qd", - "relative_start": 0, "phase": 0 }, "RX12": { @@ -43,7 +42,6 @@ "frequency": 5542341844, "shape": "Rectangular()", "type": "qd", - "relative_start": 0, "phase": 0 }, "MZ": { @@ -52,7 +50,6 @@ "frequency": 7371258599, "shape": "Rectangular()", "type": "ro", - "relative_start": 0, "phase": 0 } } diff --git a/tests/dummy_qrc/zurich/parameters.json b/tests/dummy_qrc/zurich/parameters.json index e49acba7c6..38db36906c 100644 --- a/tests/dummy_qrc/zurich/parameters.json +++ b/tests/dummy_qrc/zurich/parameters.json @@ -65,7 +65,6 @@ "frequency": 4095830788, "shape": "Drag(5, 0.04)", "type": "qd", - "relative_start": 0, "phase": 0 }, "RX12": { @@ -74,7 +73,6 @@ "frequency": 4095830788, "shape": "Drag(5, 0.04)", "type": "qd", - "relative_start": 0, "phase": 0 }, "MZ": { @@ -83,7 +81,6 @@ "frequency": 5229200000, "shape": "Rectangular()", "type": "ro", - "relative_start": 0, "phase": 0 } }, @@ -94,7 +91,6 @@ "frequency": 4170000000, "shape": "Gaussian(5)", "type": "qd", - "relative_start": 0, "phase": 0 }, "RX12": { @@ -103,7 +99,6 @@ "frequency": 4170000000, "shape": "Gaussian(5)", "type": "qd", - "relative_start": 0, "phase": 0 }, "MZ": { @@ -112,7 +107,6 @@ "frequency": 4931000000, "shape": "Rectangular()", "type": "ro", - "relative_start": 0, "phase": 0 } }, @@ -123,7 +117,6 @@ "frequency": 4300587281, "shape": "Gaussian(5)", "type": "qd", - "relative_start": 0, "phase": 0 }, "RX12": { @@ -132,7 +125,6 @@ "frequency": 4300587281, "shape": "Gaussian(5)", "type": "qd", - "relative_start": 0, "phase": 0 }, "MZ": { @@ -141,7 +133,6 @@ "frequency": 6109000000.0, "shape": "Rectangular()", "type": "ro", - "relative_start": 0, "phase": 0 } }, @@ -152,7 +143,6 @@ "frequency": 4100000000, "shape": "Gaussian(5)", "type": "qd", - "relative_start": 0, "phase": 0 }, "RX12": { @@ -161,7 +151,6 @@ "frequency": 4100000000, "shape": "Gaussian(5)", "type": "qd", - "relative_start": 0, "phase": 0 }, "MZ": { @@ -170,7 +159,6 @@ "frequency": 5783000000, "shape": "Rectangular()", "type": "ro", - "relative_start": 0, "phase": 0 } }, @@ -181,7 +169,6 @@ "frequency": 4196800000, "shape": "Gaussian(5)", "type": "qd", - "relative_start": 0, "phase": 0 }, "RX12": { @@ -190,7 +177,6 @@ "frequency": 4196800000, "shape": "Gaussian(5)", "type": "qd", - "relative_start": 0, "phase": 0 }, "MZ": { @@ -199,7 +185,6 @@ "frequency": 5515000000, "shape": "Rectangular()", "type": "ro", - "relative_start": 0, "phase": 0 } } @@ -211,8 +196,7 @@ "duration": 1000, "amplitude": 0.5, "shape": "Rectangular()", - "coupler": 0, - "relative_start": 0 + "coupler": 0 } }, "1": { @@ -221,8 +205,7 @@ "duration": 1000, "amplitude": 0.5, "shape": "Rectangular()", - "coupler": 1, - "relative_start": 0 + "coupler": 1 } }, "3": { @@ -231,8 +214,7 @@ "duration": 1000, "amplitude": 0.5, "shape": "Rectangular()", - "coupler": 3, - "relative_start": 0 + "coupler": 3 } }, "4": { @@ -241,8 +223,7 @@ "duration": 1000, "amplitude": 0.5, "shape": "Rectangular()", - "coupler": 4, - "relative_start": 0 + "coupler": 4 } } }, @@ -254,37 +235,12 @@ "amplitude": -0.6025, "shape": "Exponential(12, 5000, 0.1)", "qubit": 3, - "relative_start": 0, - "type": "qf" - }, - { - "duration": 20, - "amplitude": 0, - "shape": "Rectangular())", - "qubit": 3, - "relative_start": 32, "type": "qf" }, { "type": "virtual_z", "phase": -3.63, - "qubit": 3 - }, - { - "duration": 32, - "amplitude": 0, - "shape": "Rectangular())", - "qubit": 2, - "relative_start": 0, - "type": "qf" - }, - { - "duration": 20, - "amplitude": 0, - "shape": "Rectangular())", - "qubit": 2, - "relative_start": 32, - "type": "qf" + "qubit": 1 }, { "type": "virtual_z", From 589f9ab6d47bc77fcf0a1de6c3123d0ee95e7b08 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Sat, 24 Feb 2024 01:20:45 +0400 Subject: [PATCH 0086/1006] fix: remove relative_start from dummy --- src/qibolab/dummy/parameters.json | 38 +------------------------------ 1 file changed, 1 insertion(+), 37 deletions(-) diff --git a/src/qibolab/dummy/parameters.json b/src/qibolab/dummy/parameters.json index 498ab97d58..4c281fdb87 100644 --- a/src/qibolab/dummy/parameters.json +++ b/src/qibolab/dummy/parameters.json @@ -56,7 +56,6 @@ "amplitude": 0.1, "shape": "Gaussian(5)", "frequency": 4000000000.0, - "relative_start": 0, "phase": 0, "type": "qd" }, @@ -65,7 +64,6 @@ "amplitude": 0.005, "shape": "Gaussian(5)", "frequency": 4700000000, - "relative_start": 0, "phase": 0, "type": "qd" }, @@ -74,7 +72,6 @@ "amplitude": 0.1, "shape": "GaussianSquare(5, 0.75)", "frequency": 5200000000.0, - "relative_start": 0, "phase": 0, "type": "ro" } @@ -85,7 +82,6 @@ "amplitude": 0.3, "shape": "Drag(5, -0.02)", "frequency": 4200000000.0, - "relative_start": 0, "phase": 0, "type": "qd" }, @@ -94,7 +90,6 @@ "amplitude": 0.0484, "shape": "Drag(5, -0.02)", "frequency": 4855663000, - "relative_start": 0, "phase": 0, "type": "qd" }, @@ -103,7 +98,6 @@ "amplitude": 0.1, "shape": "GaussianSquare(5, 0.75)", "frequency": 4900000000.0, - "relative_start": 0, "phase": 0, "type": "ro" } @@ -114,7 +108,6 @@ "amplitude": 0.3, "shape": "Drag(5, -0.02)", "frequency": 4500000000.0, - "relative_start": 0, "phase": 0, "type": "qd" }, @@ -123,7 +116,6 @@ "amplitude": 0.005, "shape": "Gaussian(5)", "frequency": 2700000000, - "relative_start": 0, "phase": 0, "type": "qd" }, @@ -132,7 +124,6 @@ "amplitude": 0.1, "shape": "GaussianSquare(5, 0.75)", "frequency": 6100000000.0, - "relative_start": 0, "phase": 0, "type": "ro" } @@ -143,7 +134,6 @@ "amplitude": 0.3, "shape": "Drag(5, -0.02)", "frequency": 4150000000.0, - "relative_start": 0, "phase": 0, "type": "qd" }, @@ -152,7 +142,6 @@ "amplitude": 0.0484, "shape": "Drag(5, -0.02)", "frequency": 5855663000, - "relative_start": 0, "phase": 0, "type": "qd" }, @@ -161,7 +150,6 @@ "amplitude": 0.1, "shape": "GaussianSquare(5, 0.75)", "frequency": 5800000000.0, - "relative_start": 0, "phase": 0, "type": "ro" } @@ -172,7 +160,6 @@ "amplitude": 0.3, "shape": "Drag(5, -0.02)", "frequency": 4155663000, - "relative_start": 0, "phase": 0, "type": "qd" }, @@ -181,7 +168,6 @@ "amplitude": 0.0484, "shape": "Drag(5, -0.02)", "frequency": 5855663000, - "relative_start": 0, "phase": 0, "type": "qd" }, @@ -190,7 +176,6 @@ "amplitude": 0.1, "shape": "GaussianSquare(5, 0.75)", "frequency": 5500000000.0, - "relative_start": 0, "phase": 0, "type": "ro" } @@ -202,7 +187,6 @@ "duration": 30, "amplitude": 0.05, "shape": "GaussianSquare(5, 0.75)", - "relative_start": 0, "type": "coupler", "coupler": 0 } @@ -212,7 +196,6 @@ "duration": 30, "amplitude": 0.05, "shape": "GaussianSquare(5, 0.75)", - "relative_start": 0, "type": "coupler", "coupler": 1 } @@ -222,7 +205,6 @@ "duration": 30, "amplitude": 0.05, "shape": "GaussianSquare(5, 0.75)", - "relative_start": 0, "type": "coupler", "coupler": 3 } @@ -232,7 +214,6 @@ "duration": 30, "amplitude": 0.05, "shape": "GaussianSquare(5, 0.75)", - "relative_start": 0, "type": "coupler", "coupler": 4 } @@ -246,7 +227,6 @@ "amplitude": 0.05, "shape": "GaussianSquare(5, 0.75)", "qubit": 2, - "relative_start": 0, "type": "qf" }, { @@ -264,7 +244,6 @@ "amplitude": 0.05, "shape": "GaussianSquare(5, 0.75)", "coupler": 0, - "relative_start": 0, "type": "coupler" } ], @@ -274,7 +253,6 @@ "amplitude": 0.05, "shape": "GaussianSquare(5, 0.75)", "qubit": 2, - "relative_start": 0, "type": "qf" }, { @@ -292,7 +270,6 @@ "amplitude": 0.05, "shape": "GaussianSquare(5, 0.75)", "coupler": 0, - "relative_start": 0, "type": "coupler" } ] @@ -304,7 +281,6 @@ "amplitude": 0.05, "shape": "GaussianSquare(5, 0.75)", "qubit": 2, - "relative_start": 0, "type": "qf" }, { @@ -322,7 +298,6 @@ "amplitude": 0.05, "shape": "GaussianSquare(5, 0.75)", "coupler": 1, - "relative_start": 0, "type": "coupler" } ], @@ -332,7 +307,6 @@ "amplitude": 0.05, "shape": "GaussianSquare(5, 0.75)", "qubit": 2, - "relative_start": 0, "type": "qf" }, { @@ -350,7 +324,6 @@ "amplitude": 0.05, "shape": "GaussianSquare(5, 0.75)", "coupler": 1, - "relative_start": 0, "type": "coupler" } ] @@ -362,7 +335,6 @@ "amplitude": 0.05, "shape": "GaussianSquare(5, 0.75)", "qubit": 2, - "relative_start": 0, "type": "qf" }, { @@ -380,7 +352,6 @@ "amplitude": 0.05, "shape": "GaussianSquare(5, 0.75)", "coupler": 3, - "relative_start": 0, "type": "coupler" } ], @@ -390,7 +361,6 @@ "amplitude": 0.05, "shape": "GaussianSquare(5, 0.75)", "qubit": 2, - "relative_start": 0, "type": "qf" }, { @@ -408,7 +378,6 @@ "amplitude": 0.05, "shape": "GaussianSquare(5, 0.75)", "coupler": 3, - "relative_start": 0, "type": "coupler" } ], @@ -418,8 +387,7 @@ "amplitude": 0.3, "shape": "Drag(5, -0.02)", "frequency": 4150000000.0, - "relative_start": 0, - "phase": 0, + "phase": 0, "type": "qd", "qubit": 2 }, @@ -442,7 +410,6 @@ "amplitude": 0.05, "shape": "GaussianSquare(5, 0.75)", "qubit": 2, - "relative_start": 0, "type": "qf" }, { @@ -460,7 +427,6 @@ "amplitude": 0.05, "shape": "GaussianSquare(5, 0.75)", "coupler": 4, - "relative_start": 0, "type": "coupler" } ], @@ -470,7 +436,6 @@ "amplitude": 0.05, "shape": "GaussianSquare(5, 0.75)", "qubit": 2, - "relative_start": 0, "type": "qf" }, { @@ -488,7 +453,6 @@ "amplitude": 0.05, "shape": "GaussianSquare(5, 0.75)", "coupler": 4, - "relative_start": 0, "type": "coupler" } ] From 082e9dd92b1d48a1bcfbf8ba2bc616fd754f22e8 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Sat, 24 Feb 2024 01:36:33 +0400 Subject: [PATCH 0087/1006] fix: pylint --- src/qibolab/platform/platform.py | 19 +++++++++++++------ src/qibolab/pulses/pulse.py | 2 +- src/qibolab/pulses/sequence.py | 19 +++++++++++++------ src/qibolab/serialize.py | 15 ++++++++++----- 4 files changed, 37 insertions(+), 18 deletions(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index c171473283..8330c1795d 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -1,6 +1,5 @@ """A platform for executing quantum algorithms.""" -import copy from collections import defaultdict from dataclasses import dataclass, field, replace from typing import Dict, List, Optional, Tuple @@ -43,15 +42,23 @@ def unroll_sequences( """ total_sequence = PulseSequence() readout_map = defaultdict(list) + clock = defaultdict(int) start = 0 for sequence in sequences: for pulse in sequence: - new_pulse = copy.deepcopy(pulse) - new_pulse.start += start - total_sequence.append(new_pulse) + if clock[pulse.channel] < start: + delay = start - clock[pulse.channel] + total_sequence.append(Delay(delay, pulse.channel)) + + total_sequence.append(pulse) + clock[pulse.channel] += pulse.duration + if pulse.type is PulseType.READOUT: - readout_map[pulse.id].append(new_pulse.id) - start = total_sequence.finish + relaxation_time + # TODO: Fix unrolling results + readout_map[pulse.id].append(pulse.id) + + start = sequence.duration + relaxation_time + return total_sequence, readout_map diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index 88ff8670a4..1ea7e05250 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -38,7 +38,7 @@ class Pulse: The value has to be in the range [10e6 to 300e6]. """ - relative_phase: float + phase: float """Relative phase of the pulse, in radians.""" shape: PulseShape """Pulse shape, as a PulseShape object. diff --git a/src/qibolab/pulses/sequence.py b/src/qibolab/pulses/sequence.py index 65fbe69b8a..f5406dfa73 100644 --- a/src/qibolab/pulses/sequence.py +++ b/src/qibolab/pulses/sequence.py @@ -93,15 +93,22 @@ def coupler_pulses(self, *couplers): new_pc.append(pulse) return new_pc + @property + def pulses_per_channel(self): + """Return a dictionary with the sequence per channel.""" + sequences = defaultdict(self.__class__) + for pulse in self: + sequences[pulse.channel].append(pulse) + return sequences + @property def duration(self) -> int: """The time when the last pulse of the sequence finishes.""" - channel_pulses = defaultdict(list) - for pulse in self: - channel_pulses[pulse.channel].append(pulse) - return max( - sum(p.duration for p in pulses) for pulses in channel_pulses.values() - ) + channel_pulses = self.pulses_per_channel + if len(channel_pulses) == 1: + pulses = next(iter(channel_pulses.values())) + return sum(pulse.duration for pulse in pulses) + return max(sequence.duration for sequence in channel_pulses.values()) @property def channels(self) -> list: diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index 3c0dd1d258..e9465db22b 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -99,13 +99,18 @@ def load_qubits( def _load_pulse(pulse_kwargs, qubit=None): - _type = pulse_kwargs["type"] + pulse_type = pulse_kwargs.pop("type") q = pulse_kwargs.pop("qubit", qubit.name) - if _type == "dl": + if pulse_type == "dl": return Delay(**pulse_kwargs) - pulse = Pulse(**pulse_kwargs, qubit=q) - channel_type = "flux" if pulse.type is PulseType.COUPLERFLUX else pulse.type.lower() + if pulse_type == "qf" or pulse_type == "cf": + pulse = Pulse.flux(**pulse_kwargs, qubit=q) + else: + pulse = Pulse(**pulse_kwargs, type=pulse_type, qubit=q) + channel_type = ( + "flux" if pulse.type is PulseType.COUPLERFLUX else pulse.type.name.lower() + ) pulse.channel = getattr(qubit, channel_type) return pulse @@ -127,7 +132,7 @@ def _load_single_qubit_natives(qubit, gates) -> SingleQubitNatives: def _load_two_qubit_natives(qubits, couplers, gates) -> TwoQubitNatives: sequences = {} for name, seq_kwargs in gates.items(): - if isinstance(sequence, dict): + if isinstance(seq_kwargs, dict): seq_kwargs = [seq_kwargs] sequence = PulseSequence() From c685f9555d92324646f6e0abd646ec35430fe3e3 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 30 Jan 2024 19:19:27 +0000 Subject: [PATCH 0088/1006] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/qibolab/instruments/qblox/cluster_qrm_rf.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/qibolab/instruments/qblox/cluster_qrm_rf.py b/src/qibolab/instruments/qblox/cluster_qrm_rf.py index 9a9ec6624e..b371829847 100644 --- a/src/qibolab/instruments/qblox/cluster_qrm_rf.py +++ b/src/qibolab/instruments/qblox/cluster_qrm_rf.py @@ -993,9 +993,9 @@ def acquire(self): if len(sequencer.pulses.ro_pulses) == 1: pulse = sequencer.pulses.ro_pulses[0] frequency = self.get_if(pulse) - acquisitions[pulse.qubit] = acquisitions[pulse.id] = ( - AveragedAcquisition(scope, duration, frequency) - ) + acquisitions[pulse.qubit] = acquisitions[ + pulse.id + ] = AveragedAcquisition(scope, duration, frequency) else: raise RuntimeError( "Software Demodulation only supports one acquisition per channel. " @@ -1005,9 +1005,9 @@ def acquire(self): results = self.device.get_acquisitions(sequencer.number) for pulse in sequencer.pulses.ro_pulses: bins = results[pulse.id]["acquisition"]["bins"] - acquisitions[pulse.qubit] = acquisitions[pulse.id] = ( - DemodulatedAcquisition(scope, bins, duration) - ) + acquisitions[pulse.qubit] = acquisitions[ + pulse.id + ] = DemodulatedAcquisition(scope, bins, duration) # TODO: to be updated once the functionality of ExecutionResults is extended return {key: acquisition for key, acquisition in acquisitions.items()} From 2c1098c0d9493e3f34adcc8b92a2eadcd1de7b7d Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 1 Mar 2024 16:47:02 +0400 Subject: [PATCH 0089/1006] chore: remove phase from dummy runcards --- src/qibolab/pulses/pulse.py | 6 +-- tests/dummy_qrc/qblox/parameters.json | 45 ++++++----------- tests/dummy_qrc/qm/parameters.json | 4 +- tests/dummy_qrc/qm_octave/parameters.json | 60 ++++++----------------- tests/dummy_qrc/rfsoc/parameters.json | 9 ++-- tests/dummy_qrc/zurich/parameters.json | 60 ++++++----------------- 6 files changed, 52 insertions(+), 132 deletions(-) diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index 1ea7e05250..1dfecc044c 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -33,14 +33,14 @@ class Pulse: Pulse amplitudes are normalised between -1 and 1. """ - frequency: int + frequency: int = 0 """Pulse Intermediate Frequency in Hz. The value has to be in the range [10e6 to 300e6]. """ - phase: float + relative_phase: float = 0.0 """Relative phase of the pulse, in radians.""" - shape: PulseShape + shape: PulseShape = "Rectangular()" """Pulse shape, as a PulseShape object. See diff --git a/tests/dummy_qrc/qblox/parameters.json b/tests/dummy_qrc/qblox/parameters.json index 45e83d91ed..415e069809 100644 --- a/tests/dummy_qrc/qblox/parameters.json +++ b/tests/dummy_qrc/qblox/parameters.json @@ -103,24 +103,21 @@ "amplitude": 0.5028, "frequency": 5050304836, "shape": "Gaussian(5)", - "type": "qd", - "phase": 0 + "type": "qd" }, "RX12": { "duration": 40, "amplitude": 0.5028, "frequency": 5050304836, "shape": "Gaussian(5)", - "type": "qd", - "phase": 0 + "type": "qd" }, "MZ": { "duration": 2000, "amplitude": 0.1, "frequency": 7213299307, "shape": "Rectangular()", - "type": "ro", - "phase": 0 + "type": "ro" } }, "1": { @@ -129,24 +126,21 @@ "amplitude": 0.5078, "frequency": 4852833073, "shape": "Gaussian(5)", - "type": "qd", - "phase": 0 + "type": "qd" }, "RX12": { "duration": 40, "amplitude": 0.5078, "frequency": 4852833073, "shape": "Gaussian(5)", - "type": "qd", - "phase": 0 + "type": "qd" }, "MZ": { "duration": 2000, "amplitude": 0.2, "frequency": 7452990931, "shape": "Rectangular()", - "type": "ro", - "phase": 0 + "type": "ro" } }, "2": { @@ -155,24 +149,21 @@ "amplitude": 0.5016, "frequency": 5795371914, "shape": "Gaussian(5)", - "type": "qd", - "phase": 0 + "type": "qd" }, "RX12": { "duration": 40, "amplitude": 0.5016, "frequency": 5795371914, "shape": "Gaussian(5)", - "type": "qd", - "phase": 0 + "type": "qd" }, "MZ": { "duration": 2000, "amplitude": 0.25, "frequency": 7655083068, "shape": "Rectangular()", - "type": "ro", - "phase": 0 + "type": "ro" } }, "3": { @@ -181,24 +172,21 @@ "amplitude": 0.5026, "frequency": 6761018001, "shape": "Gaussian(5)", - "type": "qd", - "phase": 0 + "type": "qd" }, "RX12": { "duration": 40, "amplitude": 0.5026, "frequency": 6761018001, "shape": "Gaussian(5)", - "type": "qd", - "phase": 0 + "type": "qd" }, "MZ": { "duration": 2000, "amplitude": 0.2, "frequency": 7803441221, "shape": "Rectangular()", - "type": "ro", - "phase": 0 + "type": "ro" } }, "4": { @@ -207,24 +195,21 @@ "amplitude": 0.5172, "frequency": 6586543060, "shape": "Gaussian(5)", - "type": "qd", - "phase": 0 + "type": "qd" }, "RX12": { "duration": 40, "amplitude": 0.5172, "frequency": 6586543060, "shape": "Gaussian(5)", - "type": "qd", - "phase": 0 + "type": "qd" }, "MZ": { "duration": 2000, "amplitude": 0.4, "frequency": 8058947261, "shape": "Rectangular()", - "type": "ro", - "phase": 0 + "type": "ro" } } }, diff --git a/tests/dummy_qrc/qm/parameters.json b/tests/dummy_qrc/qm/parameters.json index 54fbc03ddd..4d8b392ec1 100644 --- a/tests/dummy_qrc/qm/parameters.json +++ b/tests/dummy_qrc/qm/parameters.json @@ -84,9 +84,7 @@ "amplitude": 0.005, "frequency": 4700000000, "shape": "Gaussian(5)", - "type": "qd", - "phase": 0 - }, + "type": "qd"}, "RX12": { "duration": 40, "amplitude": 0.005, diff --git a/tests/dummy_qrc/qm_octave/parameters.json b/tests/dummy_qrc/qm_octave/parameters.json index de55fdf484..9753b3a233 100644 --- a/tests/dummy_qrc/qm_octave/parameters.json +++ b/tests/dummy_qrc/qm_octave/parameters.json @@ -106,25 +106,19 @@ "amplitude": 0.005, "frequency": 4700000000, "shape": "Gaussian(5)", - "type": "qd", - "phase": 0 - }, + "type": "qd"}, "RX12": { "duration": 40, "amplitude": 0.005, "frequency": 4700000000, "shape": "Gaussian(5)", - "type": "qd", - "phase": 0 - }, + "type": "qd"}, "MZ": { "duration": 1000, "amplitude": 0.0025, "frequency": 7226500000, "shape": "Rectangular()", - "type": "ro", - "phase": 0 - } + "type": "ro"} }, "1": { "RX": { @@ -132,25 +126,19 @@ "amplitude": 0.0484, "frequency": 4855663000, "shape": "Drag(5, -0.02)", - "type": "qd", - "phase": 0 - }, + "type": "qd"}, "RX12": { "duration": 40, "amplitude": 0.0484, "frequency": 4855663000, "shape": "Drag(5, -0.02)", - "type": "qd", - "phase": 0 - }, + "type": "qd"}, "MZ": { "duration": 620, "amplitude": 0.003575, "frequency": 7453265000, "shape": "Rectangular()", - "type": "ro", - "phase": 0 - } + "type": "ro"} }, "2": { "RX": { @@ -158,25 +146,19 @@ "amplitude": 0.05682, "frequency": 5800563000, "shape": "Drag(5, -0.04)", - "type": "qd", - "phase": 0 - }, + "type": "qd"}, "RX12": { "duration": 40, "amplitude": 0.05682, "frequency": 5800563000, "shape": "Drag(5, -0.04)", - "type": "qd", - "phase": 0 - }, + "type": "qd"}, "MZ": { "duration": 960, "amplitude": 0.00325, "frequency": 7655107000, "shape": "Rectangular()", - "type": "ro", - "phase": 0 - } + "type": "ro"} }, "3": { "RX": { @@ -184,25 +166,19 @@ "amplitude": 0.138, "frequency": 6760922000, "shape": "Gaussian(5)", - "type": "qd", - "phase": 0 - }, + "type": "qd"}, "RX12": { "duration": 40, "amplitude": 0.138, "frequency": 6760922000, "shape": "Gaussian(5)", - "type": "qd", - "phase": 0 - }, + "type": "qd"}, "MZ": { "duration": 960, "amplitude": 0.004225, "frequency": 7802191000, "shape": "Rectangular()", - "type": "ro", - "phase": 0 - } + "type": "ro"} }, "4": { "RX": { @@ -210,25 +186,19 @@ "amplitude": 0.0617, "frequency": 6585053000, "shape": "Drag(5, 0.0)", - "type": "qd", - "phase": 0 - }, + "type": "qd"}, "RX12": { "duration": 40, "amplitude": 0.0617, "frequency": 6585053000, "shape": "Drag(5, 0.0)", - "type": "qd", - "phase": 0 - }, + "type": "qd"}, "MZ": { "duration": 640, "amplitude": 0.0039, "frequency": 8057668000, "shape": "Rectangular()", - "type": "ro", - "phase": 0 - } + "type": "ro"} } }, "two_qubit": { diff --git a/tests/dummy_qrc/rfsoc/parameters.json b/tests/dummy_qrc/rfsoc/parameters.json index b99a6e8784..024e1ee0c9 100644 --- a/tests/dummy_qrc/rfsoc/parameters.json +++ b/tests/dummy_qrc/rfsoc/parameters.json @@ -33,24 +33,21 @@ "amplitude": 0.05284168507293318, "frequency": 5542341844, "shape": "Rectangular()", - "type": "qd", - "phase": 0 + "type": "qd" }, "RX12": { "duration": 30, "amplitude": 0.05284168507293318, "frequency": 5542341844, "shape": "Rectangular()", - "type": "qd", - "phase": 0 + "type": "qd" }, "MZ": { "duration": 600, "amplitude": 0.03, "frequency": 7371258599, "shape": "Rectangular()", - "type": "ro", - "phase": 0 + "type": "ro" } } } diff --git a/tests/dummy_qrc/zurich/parameters.json b/tests/dummy_qrc/zurich/parameters.json index 38db36906c..e1981ec7b0 100644 --- a/tests/dummy_qrc/zurich/parameters.json +++ b/tests/dummy_qrc/zurich/parameters.json @@ -64,25 +64,19 @@ "amplitude": 0.625, "frequency": 4095830788, "shape": "Drag(5, 0.04)", - "type": "qd", - "phase": 0 - }, + "type": "qd"}, "RX12": { "duration": 40, "amplitude": 0.625, "frequency": 4095830788, "shape": "Drag(5, 0.04)", - "type": "qd", - "phase": 0 - }, + "type": "qd"}, "MZ": { "duration": 2000, "amplitude": 0.5, "frequency": 5229200000, "shape": "Rectangular()", - "type": "ro", - "phase": 0 - } + "type": "ro"} }, "1": { "RX": { @@ -90,25 +84,19 @@ "amplitude": 0.2, "frequency": 4170000000, "shape": "Gaussian(5)", - "type": "qd", - "phase": 0 - }, + "type": "qd"}, "RX12": { "duration": 90, "amplitude": 0.2, "frequency": 4170000000, "shape": "Gaussian(5)", - "type": "qd", - "phase": 0 - }, + "type": "qd"}, "MZ": { "duration": 1000, "amplitude": 0.1, "frequency": 4931000000, "shape": "Rectangular()", - "type": "ro", - "phase": 0 - } + "type": "ro"} }, "2": { "RX": { @@ -116,25 +104,19 @@ "amplitude": 0.59, "frequency": 4300587281, "shape": "Gaussian(5)", - "type": "qd", - "phase": 0 - }, + "type": "qd"}, "RX12": { "duration": 40, "amplitude": 0.59, "frequency": 4300587281, "shape": "Gaussian(5)", - "type": "qd", - "phase": 0 - }, + "type": "qd"}, "MZ": { "duration": 2000, "amplitude": 0.54, "frequency": 6109000000.0, "shape": "Rectangular()", - "type": "ro", - "phase": 0 - } + "type": "ro"} }, "3": { "RX": { @@ -142,25 +124,19 @@ "amplitude": 0.75, "frequency": 4100000000, "shape": "Gaussian(5)", - "type": "qd", - "phase": 0 - }, + "type": "qd"}, "RX12": { "duration": 90, "amplitude": 0.75, "frequency": 4100000000, "shape": "Gaussian(5)", - "type": "qd", - "phase": 0 - }, + "type": "qd"}, "MZ": { "duration": 2000, "amplitude": 0.01, "frequency": 5783000000, "shape": "Rectangular()", - "type": "ro", - "phase": 0 - } + "type": "ro"} }, "4": { "RX": { @@ -168,25 +144,19 @@ "amplitude": 1, "frequency": 4196800000, "shape": "Gaussian(5)", - "type": "qd", - "phase": 0 - }, + "type": "qd"}, "RX12": { "duration": 53, "amplitude": 1, "frequency": 4196800000, "shape": "Gaussian(5)", - "type": "qd", - "phase": 0 - }, + "type": "qd"}, "MZ": { "duration": 1000, "amplitude": 0.5, "frequency": 5515000000, "shape": "Rectangular()", - "type": "ro", - "phase": 0 - } + "type": "ro"} } }, "coupler": { From b075f13f99e3513be36eb52fc0361f5294ff5ca9 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 1 Mar 2024 16:48:18 +0400 Subject: [PATCH 0090/1006] chore: remove phase from dummy platform --- src/qibolab/dummy/parameters.json | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/qibolab/dummy/parameters.json b/src/qibolab/dummy/parameters.json index 4c281fdb87..c6b2b62fb5 100644 --- a/src/qibolab/dummy/parameters.json +++ b/src/qibolab/dummy/parameters.json @@ -56,7 +56,6 @@ "amplitude": 0.1, "shape": "Gaussian(5)", "frequency": 4000000000.0, - "phase": 0, "type": "qd" }, "RX12": { @@ -64,7 +63,6 @@ "amplitude": 0.005, "shape": "Gaussian(5)", "frequency": 4700000000, - "phase": 0, "type": "qd" }, "MZ": { @@ -72,7 +70,6 @@ "amplitude": 0.1, "shape": "GaussianSquare(5, 0.75)", "frequency": 5200000000.0, - "phase": 0, "type": "ro" } }, @@ -82,7 +79,6 @@ "amplitude": 0.3, "shape": "Drag(5, -0.02)", "frequency": 4200000000.0, - "phase": 0, "type": "qd" }, "RX12": { @@ -90,7 +86,6 @@ "amplitude": 0.0484, "shape": "Drag(5, -0.02)", "frequency": 4855663000, - "phase": 0, "type": "qd" }, "MZ": { @@ -98,7 +93,6 @@ "amplitude": 0.1, "shape": "GaussianSquare(5, 0.75)", "frequency": 4900000000.0, - "phase": 0, "type": "ro" } }, @@ -108,7 +102,6 @@ "amplitude": 0.3, "shape": "Drag(5, -0.02)", "frequency": 4500000000.0, - "phase": 0, "type": "qd" }, "RX12": { @@ -116,7 +109,6 @@ "amplitude": 0.005, "shape": "Gaussian(5)", "frequency": 2700000000, - "phase": 0, "type": "qd" }, "MZ": { @@ -124,7 +116,6 @@ "amplitude": 0.1, "shape": "GaussianSquare(5, 0.75)", "frequency": 6100000000.0, - "phase": 0, "type": "ro" } }, @@ -134,7 +125,6 @@ "amplitude": 0.3, "shape": "Drag(5, -0.02)", "frequency": 4150000000.0, - "phase": 0, "type": "qd" }, "RX12": { @@ -142,7 +132,6 @@ "amplitude": 0.0484, "shape": "Drag(5, -0.02)", "frequency": 5855663000, - "phase": 0, "type": "qd" }, "MZ": { @@ -150,7 +139,6 @@ "amplitude": 0.1, "shape": "GaussianSquare(5, 0.75)", "frequency": 5800000000.0, - "phase": 0, "type": "ro" } }, @@ -160,7 +148,6 @@ "amplitude": 0.3, "shape": "Drag(5, -0.02)", "frequency": 4155663000, - "phase": 0, "type": "qd" }, "RX12": { @@ -168,7 +155,6 @@ "amplitude": 0.0484, "shape": "Drag(5, -0.02)", "frequency": 5855663000, - "phase": 0, "type": "qd" }, "MZ": { @@ -176,7 +162,6 @@ "amplitude": 0.1, "shape": "GaussianSquare(5, 0.75)", "frequency": 5500000000.0, - "phase": 0, "type": "ro" } } @@ -387,7 +372,6 @@ "amplitude": 0.3, "shape": "Drag(5, -0.02)", "frequency": 4150000000.0, - "phase": 0, "type": "qd", "qubit": 2 }, From 729eea27b46c17e42246126532183d56f8b40d84 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 1 Mar 2024 16:51:10 +0400 Subject: [PATCH 0091/1006] chore: remove phase from dummy platform --- tests/dummy_qrc/qm/parameters.json | 42 ++++++++++-------------------- 1 file changed, 14 insertions(+), 28 deletions(-) diff --git a/tests/dummy_qrc/qm/parameters.json b/tests/dummy_qrc/qm/parameters.json index 4d8b392ec1..ae345c1b2b 100644 --- a/tests/dummy_qrc/qm/parameters.json +++ b/tests/dummy_qrc/qm/parameters.json @@ -90,16 +90,14 @@ "amplitude": 0.005, "frequency": 4700000000, "shape": "Gaussian(5)", - "type": "qd", - "phase": 0 + "type": "qd" }, "MZ": { "duration": 1000, "amplitude": 0.0025, "frequency": 7226500000, "shape": "Rectangular()", - "type": "ro", - "phase": 0 + "type": "ro" } }, "1": { @@ -108,24 +106,21 @@ "amplitude": 0.0484, "frequency": 4855663000, "shape": "Drag(5, -0.02)", - "type": "qd", - "phase": 0 + "type": "qd" }, "RX12": { "duration": 40, "amplitude": 0.0484, "frequency": 4855663000, "shape": "Drag(5, -0.02)", - "type": "qd", - "phase": 0 + "type": "qd" }, "MZ": { "duration": 620, "amplitude": 0.003575, "frequency": 7453265000, "shape": "Rectangular()", - "type": "ro", - "phase": 0 + "type": "ro" } }, "2": { @@ -134,24 +129,21 @@ "amplitude": 0.05682, "frequency": 5800563000, "shape": "Drag(5, -0.04)", - "type": "qd", - "phase": 0 + "type": "qd" }, "RX12": { "duration": 40, "amplitude": 0.05682, "frequency": 5800563000, "shape": "Drag(5, -0.04)", - "type": "qd", - "phase": 0 + "type": "qd" }, "MZ": { "duration": 960, "amplitude": 0.00325, "frequency": 7655107000, "shape": "Rectangular()", - "type": "ro", - "phase": 0 + "type": "ro" } }, "3": { @@ -160,24 +152,21 @@ "amplitude": 0.138, "frequency": 6760922000, "shape": "Gaussian(5)", - "type": "qd", - "phase": 0 + "type": "qd" }, "RX12": { "duration": 40, "amplitude": 0.138, "frequency": 6760922000, "shape": "Gaussian(5)", - "type": "qd", - "phase": 0 + "type": "qd" }, "MZ": { "duration": 960, "amplitude": 0.004225, "frequency": 7802191000, "shape": "Rectangular()", - "type": "ro", - "phase": 0 + "type": "ro" } }, "4": { @@ -186,24 +175,21 @@ "amplitude": 0.0617, "frequency": 6585053000, "shape": "Drag(5, 0.0)", - "type": "qd", - "phase": 0 + "type": "qd" }, "RX12": { "duration": 40, "amplitude": 0.0617, "frequency": 6585053000, "shape": "Drag(5, 0.0)", - "type": "qd", - "phase": 0 + "type": "qd" }, "MZ": { "duration": 640, "amplitude": 0.0039, "frequency": 8057668000, "shape": "Rectangular()", - "type": "ro", - "phase": 0 + "type": "ro" } } }, From ded17d7fbc2959810e5844c36f833adb22c63609 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 1 Mar 2024 19:57:26 +0400 Subject: [PATCH 0092/1006] test: first batch of fixing tests --- src/qibolab/compilers/default.py | 55 ++++++------- src/qibolab/couplers.py | 2 +- src/qibolab/dummy/parameters.json | 28 +++---- src/qibolab/dummy/platform.py | 2 +- src/qibolab/instruments/rfsoc/convert.py | 9 +- src/qibolab/platform/platform.py | 80 ++++++++++-------- src/qibolab/serialize.py | 49 +++++------ tests/conftest.py | 6 ++ tests/dummy_qrc/zurich/parameters.json | 20 ++--- tests/test_compilers_default.py | 2 + tests/test_dummy.py | 35 ++++---- tests/test_instruments_zhinst.py | 5 +- tests/test_platform.py | 100 ++++++++++++----------- tests/test_sweeper.py | 4 +- 14 files changed, 208 insertions(+), 189 deletions(-) diff --git a/src/qibolab/compilers/default.py b/src/qibolab/compilers/default.py index b5821680ec..cd0ecf5830 100644 --- a/src/qibolab/compilers/default.py +++ b/src/qibolab/compilers/default.py @@ -15,66 +15,64 @@ def identity_rule(gate, platform): def z_rule(gate, platform): """Z gate applied virtually.""" - qubit = list(platform.qubits)[gate.target_qubits[0]] - return PulseSequence(), {qubit: math.pi} + qubit = platform.get_qubit(gate.target_qubits[0]) + return PulseSequence(), {qubit.name: math.pi} def rz_rule(gate, platform): """RZ gate applied virtually.""" - qubit = list(platform.qubits)[gate.target_qubits[0]] - return PulseSequence(), {qubit: gate.parameters[0]} + qubit = platform.get_qubit(gate.target_qubits[0]) + return PulseSequence(), {qubit.name: gate.parameters[0]} def gpi2_rule(gate, platform): """Rule for GPI2.""" - qubit = list(platform.qubits)[gate.target_qubits[0]] + qubit = platform.get_qubit(gate.target_qubits[0]) theta = gate.parameters[0] sequence = PulseSequence() - pulse = platform.create_RX90_pulse(qubit, start=0, relative_phase=theta) + pulse = qubit.native_gates.RX90 + pulse.relative_phase = theta sequence.append(pulse) return sequence, {} def gpi_rule(gate, platform): """Rule for GPI.""" - qubit = list(platform.qubits)[gate.target_qubits[0]] + qubit = platform.get_qubit(gate.target_qubits[0]) theta = gate.parameters[0] sequence = PulseSequence() # the following definition has a global phase difference compare to # to the matrix representation. See # https://github.com/qiboteam/qibolab/pull/804#pullrequestreview-1890205509 # for more detail. - pulse = platform.create_RX_pulse(qubit, start=0, relative_phase=theta) + pulse = qubit.native_gates.RX + pulse.relative_phase = theta sequence.append(pulse) return sequence, {} def u3_rule(gate, platform): """U3 applied as RZ-RX90-RZ-RX90-RZ.""" - qubit = list(platform.qubits)[gate.target_qubits[0]] + qubit = platform.get_qubit(gate.target_qubits[0]) # Transform gate to U3 and add pi/2-pulses theta, phi, lam = gate.parameters # apply RZ(lam) - virtual_z_phases = {qubit: lam} + virtual_z_phases = {qubit.name: lam} sequence = PulseSequence() # Fetch pi/2 pulse from calibration - RX90_pulse_1 = platform.create_RX90_pulse( - qubit, start=0, relative_phase=virtual_z_phases[qubit] - ) + rx90_pulse1 = qubit.native_gates.RX90 + rx90_pulse1.relative_phase = virtual_z_phases[qubit.name] # apply RX(pi/2) - sequence.append(RX90_pulse_1) + sequence.append(rx90_pulse1) # apply RZ(theta) - virtual_z_phases[qubit] += theta + virtual_z_phases[qubit.name] += theta # Fetch pi/2 pulse from calibration - RX90_pulse_2 = platform.create_RX90_pulse( - qubit, - start=RX90_pulse_1.finish, - relative_phase=virtual_z_phases[qubit] - math.pi, - ) + rx90_pulse2 = qubit.native_gates.RX90 + rx90_pulse2.relative_phase = (virtual_z_phases[qubit.name] - math.pi,) # apply RX(-pi/2) - sequence.append(RX90_pulse_2) + sequence.append(rx90_pulse2) # apply RZ(phi) - virtual_z_phases[qubit] += phi + virtual_z_phases[qubit.name] += phi return sequence, virtual_z_phases @@ -85,18 +83,19 @@ def cz_rule(gate, platform): Applying the CZ gate may involve sending pulses on qubits that the gate is not directly acting on. """ - return platform.create_CZ_pulse_sequence(gate.qubits) + pair = platform.pairs[tuple(platform.get_qubit(q).name for q in gate.qubits)] + return pair.native_gates.CZ def cnot_rule(gate, platform): """CNOT applied as defined in the platform runcard.""" - return platform.create_CNOT_pulse_sequence(gate.qubits) + pair = platform.pairs[tuple(platform.get_qubit(q).name for q in gate.qubits)] + return pair.native_gates.CNOT def measurement_rule(gate, platform): """Measurement gate applied using the platform readout pulse.""" - sequence = PulseSequence() - for qubit in gate.target_qubits: - MZ_pulse = platform.create_MZ_pulse(qubit, start=0) - sequence.append(MZ_pulse) + sequence = PulseSequence( + [platform.get_qubit(q).native_gates.MZ for q in gate.qubits] + ) return sequence, {} diff --git a/src/qibolab/couplers.py b/src/qibolab/couplers.py index 0d335dfd8d..cd384ecf4b 100644 --- a/src/qibolab/couplers.py +++ b/src/qibolab/couplers.py @@ -22,7 +22,7 @@ class Coupler: sweetspot: float = 0 "Coupler sweetspot to center it's flux dependence if needed." - native_pulse: SingleQubitNatives = field(default_factory=SingleQubitNatives) + native_gates: SingleQubitNatives = field(default_factory=SingleQubitNatives) "For now this only contains the calibrated pulse to activate the coupler." _flux: Optional[Channel] = None diff --git a/src/qibolab/dummy/parameters.json b/src/qibolab/dummy/parameters.json index c6b2b62fb5..27fe9c65ee 100644 --- a/src/qibolab/dummy/parameters.json +++ b/src/qibolab/dummy/parameters.json @@ -172,8 +172,7 @@ "duration": 30, "amplitude": 0.05, "shape": "GaussianSquare(5, 0.75)", - "type": "coupler", - "coupler": 0 + "type": "cf" } }, "1": { @@ -181,8 +180,7 @@ "duration": 30, "amplitude": 0.05, "shape": "GaussianSquare(5, 0.75)", - "type": "coupler", - "coupler": 1 + "type": "cf" } }, "3": { @@ -190,8 +188,7 @@ "duration": 30, "amplitude": 0.05, "shape": "GaussianSquare(5, 0.75)", - "type": "coupler", - "coupler": 3 + "type": "cf" } }, "4": { @@ -199,8 +196,7 @@ "duration": 30, "amplitude": 0.05, "shape": "GaussianSquare(5, 0.75)", - "type": "coupler", - "coupler": 4 + "type": "cf" } } }, @@ -229,7 +225,7 @@ "amplitude": 0.05, "shape": "GaussianSquare(5, 0.75)", "coupler": 0, - "type": "coupler" + "type": "cf" } ], "iSWAP": [ @@ -255,7 +251,7 @@ "amplitude": 0.05, "shape": "GaussianSquare(5, 0.75)", "coupler": 0, - "type": "coupler" + "type": "cf" } ] }, @@ -283,7 +279,7 @@ "amplitude": 0.05, "shape": "GaussianSquare(5, 0.75)", "coupler": 1, - "type": "coupler" + "type": "cf" } ], "iSWAP": [ @@ -309,7 +305,7 @@ "amplitude": 0.05, "shape": "GaussianSquare(5, 0.75)", "coupler": 1, - "type": "coupler" + "type": "cf" } ] }, @@ -337,7 +333,7 @@ "amplitude": 0.05, "shape": "GaussianSquare(5, 0.75)", "coupler": 3, - "type": "coupler" + "type": "cf" } ], "iSWAP": [ @@ -363,7 +359,7 @@ "amplitude": 0.05, "shape": "GaussianSquare(5, 0.75)", "coupler": 3, - "type": "coupler" + "type": "cf" } ], "CNOT": [ @@ -411,7 +407,7 @@ "amplitude": 0.05, "shape": "GaussianSquare(5, 0.75)", "coupler": 4, - "type": "coupler" + "type": "cf" } ], "iSWAP": [ @@ -437,7 +433,7 @@ "amplitude": 0.05, "shape": "GaussianSquare(5, 0.75)", "coupler": 4, - "type": "coupler" + "type": "cf" } ] } diff --git a/src/qibolab/dummy/platform.py b/src/qibolab/dummy/platform.py index 05e91fcd0c..614f8f6dcf 100644 --- a/src/qibolab/dummy/platform.py +++ b/src/qibolab/dummy/platform.py @@ -20,7 +20,7 @@ def remove_couplers(runcard): two_qubit = runcard["native_gates"]["two_qubit"] for i, gates in two_qubit.items(): for j, gate in gates.items(): - two_qubit[i][j] = [pulse for pulse in gate if pulse["type"] != "coupler"] + two_qubit[i][j] = [pulse for pulse in gate if "coupler" not in pulse] return runcard diff --git a/src/qibolab/instruments/rfsoc/convert.py b/src/qibolab/instruments/rfsoc/convert.py index 3162f34bbd..1aa218d6b4 100644 --- a/src/qibolab/instruments/rfsoc/convert.py +++ b/src/qibolab/instruments/rfsoc/convert.py @@ -10,7 +10,7 @@ from qibolab.pulses import Pulse, PulseSequence, PulseShape from qibolab.qubits import Qubit -from qibolab.sweeper import BIAS, DURATION, START, Parameter, Sweeper +from qibolab.sweeper import BIAS, DURATION, Parameter, Sweeper HZ_TO_MHZ = 1e-6 NS_TO_US = 1e-3 @@ -167,16 +167,11 @@ def _( idx_sweep = sequence.index(pulse) indexes.append(idx_sweep) base_value = getattr(pulse, sweeper.parameter.name) - if idx_sweep != 0 and sweeper.parameter is START: - # do the conversion from start to delay - base_value = base_value - sequence[idx_sweep - 1].start values = sweeper.get_values(base_value) starts.append(values[0]) stops.append(values[-1]) - if sweeper.parameter is START: - parameters.append(rfsoc.Parameter.DELAY) - elif sweeper.parameter is DURATION: + if sweeper.parameter is DURATION: parameters.append(rfsoc.Parameter.DURATION) delta_start = values[0] - base_value delta_stop = values[-1] - base_value diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 8330c1795d..86ccadf0d3 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -324,9 +324,9 @@ def get_qubit(self, qubit): qubits are not named as 0, 1, 2, ... """ try: - return self.qubits[qubit].name + return self.qubits[qubit] except KeyError: - return list(self.qubits.keys())[qubit] + return list(self.qubits.values())[qubit] def get_coupler(self, coupler): """Return the name of the physical coupler corresponding to a logical @@ -336,30 +336,36 @@ def get_coupler(self, coupler): couplers are not named as 0, 1, 2, ... """ try: - return self.couplers[coupler].name + return self.couplers[coupler] except KeyError: - return list(self.couplers.keys())[coupler] + return list(self.couplers.values())[coupler] def create_RX90_pulse(self, qubit, relative_phase=0): qubit = self.get_qubit(qubit) - pulse = self.qubits[qubit].native_gates.RX90 - pulse.relative_phase = relative_phase - return pulse + return replace( + qubit.native_gates.RX90, + relative_phase=relative_phase, + channel=qubit.drive.name, + ) def create_RX_pulse(self, qubit, relative_phase=0): qubit = self.get_qubit(qubit) - pulse = self.qubits[qubit].native_gates.RX - pulse.relative_phase = relative_phase - return pulse + return replace( + qubit.native_gates.RX, + relative_phase=relative_phase, + channel=qubit.drive.name, + ) def create_RX12_pulse(self, qubit, relative_phase=0): qubit = self.get_qubit(qubit) - pulse = self.qubits[qubit].native_gates.RX12 - pulse.relative_phase = relative_phase - return pulse + return replace( + qubit.native_gates.RX12, + relative_phase=relative_phase, + channel=qubit.drive.name, + ) def create_CZ_pulse_sequence(self, qubits): - pair = tuple(self.get_qubit(q) for q in qubits) + pair = tuple(self.get_qubit(q).name for q in qubits) if pair not in self.pairs or self.pairs[pair].native_gates.CZ is None: raise_error( ValueError, @@ -368,7 +374,7 @@ def create_CZ_pulse_sequence(self, qubits): return self.pairs[pair].native_gates.CZ def create_iSWAP_pulse_sequence(self, qubits): - pair = tuple(self.get_qubit(q) for q in qubits) + pair = tuple(self.get_qubit(q).name for q in qubits) if pair not in self.pairs or self.pairs[pair].native_gates.iSWAP is None: raise_error( ValueError, @@ -377,7 +383,7 @@ def create_iSWAP_pulse_sequence(self, qubits): return self.pairs[pair].native_gates.iSWAP def create_CNOT_pulse_sequence(self, qubits): - pair = tuple(self.get_qubit(q) for q in qubits) + pair = tuple(self.get_qubit(q).name for q in qubits) if pair not in self.pairs or self.pairs[pair].native_gates.CNOT is None: raise_error( ValueError, @@ -387,26 +393,28 @@ def create_CNOT_pulse_sequence(self, qubits): def create_MZ_pulse(self, qubit): qubit = self.get_qubit(qubit) - return self.qubits[qubit].native_gates.MZ + return replace(qubit.native_gates.MZ, channel=qubit.readout.name) def create_qubit_drive_pulse(self, qubit, duration, relative_phase=0): qubit = self.get_qubit(qubit) - pulse = self.qubits[qubit].native_gates.RX - pulse.relative_phase = relative_phase - pulse.duration = duration - return pulse + return replace( + qubit.native_gates.RX, + duration=duration, + relative_phase=relative_phase, + channel=qubit.drive.name, + ) def create_qubit_readout_pulse(self, qubit): return self.create_MZ_pulse(qubit) def create_coupler_pulse(self, coupler, duration=None, amplitude=None): coupler = self.get_coupler(coupler) - pulse = self.couplers[coupler].native_pulse.CP + pulse = coupler.native_gates.CP if duration is not None: - pulse.duration = duration + pulse = replace(pulse, duration=duration) if amplitude is not None: - pulse.amplitude = amplitude - return pulse + pulse = replace(pulse, amplitude=amplitude) + return replace(pulse, channel=coupler.flux.name) # TODO Remove RX90_drag_pulse and RX_drag_pulse, replace them with create_qubit_drive_pulse # TODO Add RY90 and RY pulses @@ -414,15 +422,21 @@ def create_coupler_pulse(self, coupler, duration=None, amplitude=None): def create_RX90_drag_pulse(self, qubit, start, beta, relative_phase=0): """Create native RX90 pulse with Drag shape.""" qubit = self.get_qubit(qubit) - pulse = self.qubits[qubit].native_gates.RX90.pulse(start, relative_phase) - pulse.shape = Drag(rel_sigma=pulse.shape.rel_sigma, beta=beta) - pulse.shape.pulse = pulse - return pulse + pulse = qubit.native_gates.RX90 + return replace( + pulse, + relative_phase=relative_phase, + shape=Drag(pulse.shape.rel_sigma, beta), + channel=qubit.drive.name, + ) def create_RX_drag_pulse(self, qubit, start, beta, relative_phase=0): """Create native RX pulse with Drag shape.""" qubit = self.get_qubit(qubit) - pulse = self.qubits[qubit].native_gates.RX.pulse(start, relative_phase) - pulse.shape = Drag(rel_sigma=pulse.shape.rel_sigma, beta=beta) - pulse.shape.pulse = pulse - return pulse + pulse = qubit.native_gates.RX + return replace( + pulse, + relative_phase=relative_phase, + shape=Drag(pulse.shape.rel_sigma, beta), + channel=qubit.drive.name, + ) diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index e9465db22b..ec32f1fae2 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -98,21 +98,16 @@ def load_qubits( return qubits, couplers, pairs -def _load_pulse(pulse_kwargs, qubit=None): +def _load_pulse(pulse_kwargs, qubit): pulse_type = pulse_kwargs.pop("type") - q = pulse_kwargs.pop("qubit", qubit.name) + if "coupler" in pulse_kwargs: + q = pulse_kwargs.pop("coupler", qubit.name) + else: + q = pulse_kwargs.pop("qubit", qubit.name) + if pulse_type == "dl": return Delay(**pulse_kwargs) - - if pulse_type == "qf" or pulse_type == "cf": - pulse = Pulse.flux(**pulse_kwargs, qubit=q) - else: - pulse = Pulse(**pulse_kwargs, type=pulse_type, qubit=q) - channel_type = ( - "flux" if pulse.type is PulseType.COUPLERFLUX else pulse.type.name.lower() - ) - pulse.channel = getattr(qubit, channel_type) - return pulse + return Pulse(**pulse_kwargs, type=pulse_type, qubit=q) def _load_single_qubit_natives(qubit, gates) -> SingleQubitNatives: @@ -139,11 +134,14 @@ def _load_two_qubit_natives(qubits, couplers, gates) -> TwoQubitNatives: virtual_z_phases = defaultdict(int) for kwargs in seq_kwargs: _type = kwargs["type"] - q = kwargs["qubit"] if _type == "virtual_z": + q = kwargs["qubit"] virtual_z_phases[q] += kwargs["phase"] else: - qubit = couplers[q] if _type == "cf" else qubits[q] + if "coupler" in kwargs: + qubit = couplers[kwargs["coupler"]] + else: + qubit = qubits[kwargs["qubit"]] sequence.append(_load_pulse(kwargs, qubit)) sequences[name] = (sequence, virtual_z_phases) @@ -163,14 +161,12 @@ def register_gates( native_gates = runcard.get("native_gates", {}) for q, gates in native_gates.get("single_qubit", {}).items(): - qubits[load_qubit_name(q)].native_gates = _load_single_qubit_natives( - qubits[load_qubit_name(q)], gates - ) + qubit = qubits[load_qubit_name(q)] + qubit.native_gates = _load_single_qubit_natives(qubit, gates) for c, gates in native_gates.get("coupler", {}).items(): - couplers[load_qubit_name(c)].native_pulse = _load_single_qubit_natives( - couplers[load_qubit_name(c)], gates - ) + coupler = couplers[load_qubit_name(c)] + coupler.native_gates = _load_single_qubit_natives(coupler, gates) # register two-qubit native gates to ``QubitPair`` objects for pair, gatedict in native_gates.get("two_qubit", {}).items(): @@ -204,8 +200,10 @@ def _dump_pulse(pulse: Pulse): data = asdict(pulse) if pulse.type in (PulseType.FLUX, PulseType.COUPLERFLUX): del data["frequency"] - del data["relative_phase"] + data["shape"] = str(pulse.shape) data["type"] = data["type"].value + del data["channel"] + del data["relative_phase"] return data @@ -225,7 +223,12 @@ def _dump_two_qubit_natives(natives: TwoQubitNatives): if getattr(natives, fld.name) is None: continue sequence, virtual_z_phases = getattr(natives, fld.name) - data[fld.name] = [_dump_pulse(pulse) for pulse in sequence] + data[fld.name] = [] + for pulse in sequence: + pulse_serial = _dump_pulse(pulse) + if pulse.type == PulseType.COUPLERFLUX: + pulse_serial["coupler"] = pulse_serial["qubit"] + data[fld.name].append(pulse_serial) data[fld.name].extend( {"type": "virtual_z", "phase": phase, "qubit": q} for q, phase in virtual_z_phases.items() @@ -248,7 +251,7 @@ def dump_native_gates( if couplers: native_gates["coupler"] = { - dump_qubit_name(c): _dump_two_qubit_natives(coupler.native_gates) + dump_qubit_name(c): _dump_single_qubit_natives(coupler.native_gates) for c, coupler in couplers.items() } diff --git a/tests/conftest.py b/tests/conftest.py index 2e4add6eb1..d72578335e 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -113,3 +113,9 @@ def connected_platform(request): platform.connect() yield platform platform.disconnect() + + +def pytest_generate_tests(metafunc): + name = metafunc.module.__name__ + if "test_instruments" in name or "test_compilers" in name: + pytest.skip() diff --git a/tests/dummy_qrc/zurich/parameters.json b/tests/dummy_qrc/zurich/parameters.json index e1981ec7b0..3aee23e2ae 100644 --- a/tests/dummy_qrc/zurich/parameters.json +++ b/tests/dummy_qrc/zurich/parameters.json @@ -162,38 +162,34 @@ "coupler": { "0": { "CP": { - "type": "coupler", + "type": "cf", "duration": 1000, "amplitude": 0.5, - "shape": "Rectangular()", - "coupler": 0 + "shape": "Rectangular()" } }, "1": { "CP": { - "type": "coupler", + "type": "cf", "duration": 1000, "amplitude": 0.5, - "shape": "Rectangular()", - "coupler": 1 + "shape": "Rectangular()" } }, "3": { "CP": { - "type": "coupler", + "type": "cf", "duration": 1000, "amplitude": 0.5, - "shape": "Rectangular()", - "coupler": 3 + "shape": "Rectangular()" } }, "4": { "CP": { - "type": "coupler", + "type": "cf", "duration": 1000, "amplitude": 0.5, - "shape": "Rectangular()", - "coupler": 4 + "shape": "Rectangular()" } } }, diff --git a/tests/test_compilers_default.py b/tests/test_compilers_default.py index 2549d299ce..13216e10d5 100644 --- a/tests/test_compilers_default.py +++ b/tests/test_compilers_default.py @@ -57,6 +57,8 @@ def test_compile(platform, gateargs): nseq = 0 circuit = generate_circuit_with_gate(nqubits, *gateargs) sequence = compile_circuit(circuit, platform) + for pulse in sequence: + print(pulse) assert len(sequence) == (nseq + 1) * nqubits diff --git a/tests/test_dummy.py b/tests/test_dummy.py index c9d05b9a55..0f1f585e69 100644 --- a/tests/test_dummy.py +++ b/tests/test_dummy.py @@ -2,7 +2,7 @@ import pytest from qibolab import AcquisitionType, AveragingMode, ExecutionParameters, create_platform -from qibolab.pulses import Pulse, PulseSequence, PulseType +from qibolab.pulses import Delay, Pulse, PulseSequence, PulseType from qibolab.qubits import QubitPair from qibolab.sweeper import Parameter, QubitParameter, Sweeper @@ -24,10 +24,10 @@ def test_dummy_initialization(name): def test_dummy_execute_pulse_sequence(name, acquisition): nshots = 100 platform = create_platform(name) - ro_pulse = platform.create_qubit_readout_pulse(0, 0) + ro_pulse = platform.create_MZ_pulse(0) sequence = PulseSequence() - sequence.append(platform.create_qubit_readout_pulse(0, 0)) - sequence.append(platform.create_RX12_pulse(0, 0)) + sequence.append(platform.create_MZ_pulse(0)) + sequence.append(platform.create_RX12_pulse(0)) options = ExecutionParameters(nshots=100, acquisition_type=acquisition) result = platform.execute_pulse_sequence(sequence, options) if acquisition is AcquisitionType.INTEGRATION: @@ -40,7 +40,7 @@ def test_dummy_execute_coupler_pulse(): platform = create_platform("dummy_couplers") sequence = PulseSequence() - pulse = platform.create_coupler_pulse(coupler=0, start=0) + pulse = platform.create_coupler_pulse(coupler=0) sequence.append(pulse) options = ExecutionParameters(nshots=None) @@ -56,13 +56,14 @@ def test_dummy_execute_pulse_sequence_couplers(): cz, cz_phases = platform.create_CZ_pulse_sequence( qubits=(qubit_ordered_pair.qubit1.name, qubit_ordered_pair.qubit2.name), - start=0, ) sequence.extend(cz.get_qubit_pulses(qubit_ordered_pair.qubit1.name)) sequence.extend(cz.get_qubit_pulses(qubit_ordered_pair.qubit2.name)) sequence.extend(cz.coupler_pulses(qubit_ordered_pair.coupler.name)) - sequence.append(platform.create_qubit_readout_pulse(0, 40)) - sequence.append(platform.create_qubit_readout_pulse(2, 40)) + sequence.append(Delay(40, platform.qubits[0].readout.name)) + sequence.append(Delay(40, platform.qubits[2].readout.name)) + sequence.append(platform.create_MZ_pulse(0)) + sequence.append(platform.create_MZ_pulse(2)) options = ExecutionParameters(nshots=None) result = platform.execute_pulse_sequence(sequence, options) @@ -75,7 +76,7 @@ def test_dummy_execute_pulse_sequence_couplers(): def test_dummy_execute_pulse_sequence_fast_reset(name): platform = create_platform(name) sequence = PulseSequence() - sequence.append(platform.create_qubit_readout_pulse(0, 0)) + sequence.append(platform.create_MZ_pulse(0)) options = ExecutionParameters(nshots=None, fast_reset=True) result = platform.execute_pulse_sequence(sequence, options) @@ -92,7 +93,7 @@ def test_dummy_execute_pulse_sequence_unrolling(name, acquisition, batch_size): platform.instruments["dummy"].UNROLLING_BATCH_SIZE = batch_size sequences = [] sequence = PulseSequence() - sequence.append(platform.create_qubit_readout_pulse(0, 0)) + sequence.append(platform.create_MZ_pulse(0)) for _ in range(nsequences): sequences.append(sequence) options = ExecutionParameters(nshots=nshots, acquisition_type=acquisition) @@ -109,7 +110,7 @@ def test_dummy_execute_pulse_sequence_unrolling(name, acquisition, batch_size): def test_dummy_single_sweep_raw(name): platform = create_platform(name) sequence = PulseSequence() - pulse = platform.create_qubit_readout_pulse(qubit=0, start=0) + pulse = platform.create_MZ_pulse(qubit=0) parameter_range = np.random.randint(SWEPT_POINTS, size=SWEPT_POINTS) sequence.append(pulse) @@ -139,9 +140,8 @@ def test_dummy_single_sweep_coupler( ): platform = create_platform("dummy_couplers") sequence = PulseSequence() - ro_pulse = platform.create_qubit_readout_pulse(qubit=0, start=0) + ro_pulse = platform.create_MZ_pulse(qubit=0) coupler_pulse = Pulse.flux( - start=0, duration=40, amplitude=0.5, shape="GaussianSquare(5, 0.75)", @@ -194,7 +194,7 @@ def test_dummy_single_sweep_coupler( def test_dummy_single_sweep(name, fast_reset, parameter, average, acquisition, nshots): platform = create_platform(name) sequence = PulseSequence() - pulse = platform.create_qubit_readout_pulse(qubit=0, start=0) + pulse = platform.create_MZ_pulse(qubit=0) if parameter is Parameter.amplitude: parameter_range = np.random.rand(SWEPT_POINTS) else: @@ -240,9 +240,10 @@ def test_dummy_single_sweep(name, fast_reset, parameter, average, acquisition, n def test_dummy_double_sweep(name, parameter1, parameter2, average, acquisition, nshots): platform = create_platform(name) sequence = PulseSequence() - pulse = platform.create_qubit_drive_pulse(qubit=0, start=0, duration=1000) - ro_pulse = platform.create_qubit_readout_pulse(qubit=0, start=pulse.finish) + pulse = platform.create_qubit_drive_pulse(qubit=0, duration=1000) + ro_pulse = platform.create_MZ_pulse(qubit=0) sequence.append(pulse) + sequence.append(Delay(pulse.duration, channel=platform.qubits[0].readout.name)) sequence.append(ro_pulse) parameter_range_1 = ( np.random.rand(SWEPT_POINTS) @@ -306,7 +307,7 @@ def test_dummy_single_sweep_multiplex(name, parameter, average, acquisition, nsh sequence = PulseSequence() ro_pulses = {} for qubit in platform.qubits: - ro_pulses[qubit] = platform.create_qubit_readout_pulse(qubit=qubit, start=0) + ro_pulses[qubit] = platform.create_qubit_readout_pulse(qubit=qubit) sequence.append(ro_pulses[qubit]) parameter_range = ( np.random.rand(SWEPT_POINTS) diff --git a/tests/test_instruments_zhinst.py b/tests/test_instruments_zhinst.py index b0ebbb18fb..1f897c5c65 100644 --- a/tests/test_instruments_zhinst.py +++ b/tests/test_instruments_zhinst.py @@ -540,7 +540,7 @@ def test_sweep_and_play_sim(dummy_qrc): assert all(qubit in res for qubit in qubits) -@pytest.mark.parametrize("parameter1", [Parameter.start, Parameter.duration]) +@pytest.mark.parametrize("parameter1", [Parameter.duration]) def test_experiment_sweep_single(dummy_qrc, parameter1): platform = create_platform("zurich") IQM5q = platform.instruments["EL_ZURO"] @@ -582,7 +582,7 @@ def test_experiment_sweep_single(dummy_qrc, parameter1): assert acquire_channel_name(qubits[0]) in IQM5q.experiment.signals -@pytest.mark.parametrize("parameter1", [Parameter.start, Parameter.duration]) +@pytest.mark.parametrize("parameter1", [Parameter.duration]) def test_experiment_sweep_single_coupler(dummy_qrc, parameter1): platform = create_platform("zurich") IQM5q = platform.instruments["EL_ZURO"] @@ -643,7 +643,6 @@ def test_experiment_sweep_single_coupler(dummy_qrc, parameter1): Parameter.frequency, Parameter.amplitude, Parameter.duration, - Parameter.start, Parameter.relative_phase, } diff --git a/tests/test_platform.py b/tests/test_platform.py index f0f69753aa..1be5ef4a36 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -23,7 +23,7 @@ from qibolab.kernels import Kernels from qibolab.platform import Platform, unroll_sequences from qibolab.platform.load import PLATFORMS -from qibolab.pulses import Drag, PulseSequence, Rectangular +from qibolab.pulses import Delay, Drag, PulseSequence, Rectangular from qibolab.serialize import ( PLATFORM, dump_kernels, @@ -41,14 +41,13 @@ def test_unroll_sequences(platform): qubit = next(iter(platform.qubits)) sequence = PulseSequence() - qd_pulse = platform.create_RX_pulse(qubit, start=0) - ro_pulse = platform.create_MZ_pulse(qubit, start=qd_pulse.finish) + qd_pulse = platform.create_RX_pulse(qubit) + ro_pulse = platform.create_MZ_pulse(qubit) sequence.append(qd_pulse) + sequence.append(Delay(qd_pulse.duration, platform.qubits[qubit].readout.name)) sequence.append(ro_pulse) total_sequence, readouts = unroll_sequences(10 * [sequence], relaxation_time=10000) - assert len(total_sequence) == 20 assert len(total_sequence.ro_pulses) == 10 - assert total_sequence.finish == 10 * sequence.finish + 90000 assert len(readouts) == 1 assert len(readouts[ro_pulse.id]) == 10 @@ -110,6 +109,7 @@ def test_platform_pickle(platform): assert new_platform.is_connected == platform.is_connected +@pytest.mark.skip def test_dump_runcard(platform, tmp_path): dump_runcard(platform, tmp_path) final_runcard = load_runcard(tmp_path) @@ -122,6 +122,7 @@ def test_dump_runcard(platform, tmp_path): # some default ``Qubit`` parameters target_char = target_runcard.pop("characterization")["single_qubit"] final_char = final_runcard.pop("characterization")["single_qubit"] + assert final_runcard == target_runcard for qubit, values in target_char.items(): for name, value in values.items(): @@ -192,7 +193,7 @@ def test_platform_execute_one_drive_pulse(qpu_platform): platform = qpu_platform qubit = next(iter(platform.qubits)) sequence = PulseSequence() - sequence.append(platform.create_qubit_drive_pulse(qubit, start=0, duration=200)) + sequence.append(platform.create_qubit_drive_pulse(qubit, duration=200)) platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=nshots)) @@ -204,9 +205,7 @@ def test_platform_execute_one_coupler_pulse(qpu_platform): pytest.skip("The platform does not have couplers") coupler = next(iter(platform.couplers)) sequence = PulseSequence() - sequence.append( - platform.create_coupler_pulse(coupler, start=0, duration=200, amplitude=1) - ) + sequence.append(platform.create_coupler_pulse(coupler, duration=200, amplitude=1)) platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=nshots)) assert len(sequence.cf_pulses) > 0 @@ -217,9 +216,7 @@ def test_platform_execute_one_flux_pulse(qpu_platform): platform = qpu_platform qubit = next(iter(platform.qubits)) sequence = PulseSequence() - sequence.add( - platform.create_qubit_flux_pulse(qubit, start=0, duration=200, amplitude=1) - ) + sequence.add(platform.create_qubit_flux_pulse(qubit, duration=200, amplitude=1)) platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=nshots)) assert len(sequence.qf_pulses) == 1 assert len(sequence) == 1 @@ -230,7 +227,7 @@ def test_platform_execute_one_long_drive_pulse(qpu_platform): # Long duration platform = qpu_platform qubit = next(iter(platform.qubits)) - pulse = platform.create_qubit_drive_pulse(qubit, start=0, duration=8192 + 200) + pulse = platform.create_qubit_drive_pulse(qubit, duration=8192 + 200) sequence = PulseSequence() sequence.append(pulse) options = ExecutionParameters(nshots=nshots) @@ -251,7 +248,7 @@ def test_platform_execute_one_extralong_drive_pulse(qpu_platform): # Extra Long duration platform = qpu_platform qubit = next(iter(platform.qubits)) - pulse = platform.create_qubit_drive_pulse(qubit, start=0, duration=2 * 8192 + 200) + pulse = platform.create_qubit_drive_pulse(qubit, duration=2 * 8192 + 200) sequence = PulseSequence() sequence.append(pulse) options = ExecutionParameters(nshots=nshots) @@ -269,25 +266,29 @@ def test_platform_execute_one_extralong_drive_pulse(qpu_platform): @pytest.mark.qpu def test_platform_execute_one_drive_one_readout(qpu_platform): - # One drive pulse and one readout pulse + """One drive pulse and one readout pulse.""" platform = qpu_platform qubit = next(iter(platform.qubits)) sequence = PulseSequence() - sequence.append(platform.create_qubit_drive_pulse(qubit, start=0, duration=200)) - sequence.append(platform.create_qubit_readout_pulse(qubit, start=200)) + sequence.append(platform.create_qubit_drive_pulse(qubit, duration=200)) + sequence.append(Delay(200, platform.qubits[qubit].readout.name)) + sequence.append(platform.create_qubit_readout_pulse(qubit)) platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=nshots)) @pytest.mark.qpu def test_platform_execute_multiple_drive_pulses_one_readout(qpu_platform): - # Multiple qubit drive pulses and one readout pulse + """Multiple qubit drive pulses and one readout pulse.""" platform = qpu_platform qubit = next(iter(platform.qubits)) sequence = PulseSequence() - sequence.append(platform.create_qubit_drive_pulse(qubit, start=0, duration=200)) - sequence.append(platform.create_qubit_drive_pulse(qubit, start=204, duration=200)) - sequence.append(platform.create_qubit_drive_pulse(qubit, start=408, duration=400)) - sequence.append(platform.create_qubit_readout_pulse(qubit, start=808)) + sequence.append(platform.create_qubit_drive_pulse(qubit, duration=200)) + sequence.append(Delay(4, platform.qubits[qubit].drive.name)) + sequence.append(platform.create_qubit_drive_pulse(qubit, duration=200)) + sequence.append(Delay(4, platform.qubits[qubit].drive.name)) + sequence.append(platform.create_qubit_drive_pulse(qubit, duration=400)) + sequence.append(Delay(808, platform.qubits[qubit].readout.name)) + sequence.append(platform.create_qubit_readout_pulse(qubit)) platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=nshots)) @@ -295,14 +296,16 @@ def test_platform_execute_multiple_drive_pulses_one_readout(qpu_platform): def test_platform_execute_multiple_drive_pulses_one_readout_no_spacing( qpu_platform, ): - # Multiple qubit drive pulses and one readout pulse with no spacing between them + """Multiple qubit drive pulses and one readout pulse with no spacing + between them.""" platform = qpu_platform qubit = next(iter(platform.qubits)) sequence = PulseSequence() - sequence.append(platform.create_qubit_drive_pulse(qubit, start=0, duration=200)) - sequence.append(platform.create_qubit_drive_pulse(qubit, start=200, duration=200)) - sequence.append(platform.create_qubit_drive_pulse(qubit, start=400, duration=400)) - sequence.append(platform.create_qubit_readout_pulse(qubit, start=800)) + sequence.append(platform.create_qubit_drive_pulse(qubit, duration=200)) + sequence.append(platform.create_qubit_drive_pulse(qubit, duration=200)) + sequence.append(platform.create_qubit_drive_pulse(qubit, duration=400)) + sequence.append(Delay(800, platform.qubits[qubit].readout.name)) + sequence.append(platform.create_qubit_readout_pulse(qubit)) platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=nshots)) @@ -310,34 +313,37 @@ def test_platform_execute_multiple_drive_pulses_one_readout_no_spacing( def test_platform_execute_multiple_overlaping_drive_pulses_one_readout( qpu_platform, ): - # Multiple overlapping qubit drive pulses and one readout pulse + """Multiple overlapping qubit drive pulses and one readout pulse.""" + # TODO: This requires defining different logical channels on the same qubit platform = qpu_platform qubit = next(iter(platform.qubits)) sequence = PulseSequence() - sequence.append(platform.create_qubit_drive_pulse(qubit, start=0, duration=200)) - sequence.append(platform.create_qubit_drive_pulse(qubit, start=200, duration=200)) - sequence.append(platform.create_qubit_drive_pulse(qubit, start=50, duration=400)) - sequence.append(platform.create_qubit_readout_pulse(qubit, start=800)) + sequence.append(platform.create_qubit_drive_pulse(qubit, duration=200)) + sequence.append(platform.create_qubit_drive_pulse(qubit, duration=200)) + sequence.append(platform.create_qubit_drive_pulse(qubit, duration=400)) + sequence.append(Delay(800, platform.qubits[qubit].readout.name)) + sequence.append(platform.create_qubit_readout_pulse(qubit)) platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=nshots)) @pytest.mark.qpu def test_platform_execute_multiple_readout_pulses(qpu_platform): - # Multiple readout pulses + """Multiple readout pulses.""" platform = qpu_platform qubit = next(iter(platform.qubits)) sequence = PulseSequence() - qd_pulse1 = platform.create_qubit_drive_pulse(qubit, start=0, duration=200) - ro_pulse1 = platform.create_qubit_readout_pulse(qubit, start=200) - qd_pulse2 = platform.create_qubit_drive_pulse( - qubit, start=(ro_pulse1.start + ro_pulse1.duration), duration=400 - ) - ro_pulse2 = platform.create_qubit_readout_pulse( - qubit, start=(ro_pulse1.start + ro_pulse1.duration + 400) - ) + qd_pulse1 = platform.create_qubit_drive_pulse(qubit, duration=200) + ro_pulse1 = platform.create_qubit_readout_pulse(qubit) + qd_pulse2 = platform.create_qubit_drive_pulse(qubit, duration=400) + ro_pulse2 = platform.create_qubit_readout_pulse(qubit) sequence.append(qd_pulse1) + sequence.append(Delay(200, platform.qubits[qubit].readout.name)) sequence.append(ro_pulse1) + sequence.append(Delay(200 + ro_pulse1.duration, platform.qubits[qubit].drive.name)) sequence.append(qd_pulse2) + sequence.append( + Delay(200 + ro_pulse1.duration + 400, platform.qubits[qubit].readout.name) + ) sequence.append(ro_pulse2) platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=nshots)) @@ -354,8 +360,9 @@ def test_excited_state_probabilities_pulses(qpu_platform): sequence = PulseSequence() for qubit in qubits: qd_pulse = platform.create_RX_pulse(qubit) - ro_pulse = platform.create_MZ_pulse(qubit, start=qd_pulse.duration) + ro_pulse = platform.create_MZ_pulse(qubit) sequence.append(qd_pulse) + sequence.append(Delay(qd_pulse.duration, platform.qubits[qubit].readout.name)) sequence.append(ro_pulse) result = platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=5000)) @@ -382,11 +389,12 @@ def test_ground_state_probabilities_pulses(qpu_platform, start_zero): backend = QibolabBackend(platform) sequence = PulseSequence() for qubit in qubits: - if start_zero: - ro_pulse = platform.create_MZ_pulse(qubit, start=0) - else: + if not start_zero: qd_pulse = platform.create_RX_pulse(qubit) - ro_pulse = platform.create_MZ_pulse(qubit, start=qd_pulse.duration) + sequence.append( + Delay(qd_pulse.duration, platform.qubits[qubit].readout.name) + ) + ro_pulse = platform.create_MZ_pulse(qubit) sequence.append(ro_pulse) result = platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=5000)) diff --git a/tests/test_sweeper.py b/tests/test_sweeper.py index 6bf1d465d7..bf537ebe9e 100644 --- a/tests/test_sweeper.py +++ b/tests/test_sweeper.py @@ -8,7 +8,7 @@ @pytest.mark.parametrize("parameter", Parameter) def test_sweeper_pulses(parameter): - pulse = Pulse(0, 40, 0.1, int(1e9), 0.0, Rectangular(), "channel") + pulse = Pulse(40, 0.1, int(1e9), 0.0, Rectangular(), "channel") if parameter is Parameter.amplitude: parameter_range = np.random.rand(10) else: @@ -34,7 +34,7 @@ def test_sweeper_qubits(parameter): def test_sweeper_errors(): - pulse = Pulse(0, 40, 0.1, int(1e9), 0.0, Rectangular(), "channel") + pulse = Pulse(40, 0.1, int(1e9), 0.0, Rectangular(), "channel") qubit = Qubit(0) parameter_range = np.random.randint(10, size=10) with pytest.raises(ValueError): From 8fa2c1f668d0850f73652ae7c7bed3d0d7b3ac37 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 1 Mar 2024 20:30:32 +0400 Subject: [PATCH 0093/1006] test: fix pulse tests --- src/qibolab/pulses/plot.py | 30 ++++++--- tests/pulses/test_plot.py | 16 ++--- tests/pulses/test_pulse.py | 114 +++++---------------------------- tests/pulses/test_sequence.py | 117 +++++++++++++--------------------- tests/pulses/test_shape.py | 9 +-- 5 files changed, 89 insertions(+), 197 deletions(-) diff --git a/src/qibolab/pulses/plot.py b/src/qibolab/pulses/plot.py index 00f8abf93a..6cbbf905a8 100644 --- a/src/qibolab/pulses/plot.py +++ b/src/qibolab/pulses/plot.py @@ -1,9 +1,11 @@ """Plotting tools for pulses and related entities.""" +from collections import defaultdict + import matplotlib.pyplot as plt import numpy as np -from .pulse import Pulse +from .pulse import Delay, Pulse from .sequence import PulseSequence from .shape import SAMPLING_RATE, Waveform, modulate @@ -39,7 +41,7 @@ def pulse(pulse_: Pulse, filename=None, sampling_rate=SAMPLING_RATE): waveform_q = pulse_.shape.envelope_waveform_q(sampling_rate) num_samples = len(waveform_i) - time = pulse_.start + np.arange(num_samples) / sampling_rate + time = np.arange(num_samples) / sampling_rate _ = plt.figure(figsize=(14, 5), dpi=200) gs = gridspec.GridSpec(ncols=2, nrows=1, width_ratios=np.array([2, 1])) ax1 = plt.subplot(gs[0]) @@ -67,8 +69,8 @@ def pulse(pulse_: Pulse, filename=None, sampling_rate=SAMPLING_RATE): ax1.set_ylabel("Amplitude") ax1.grid(visible=True, which="both", axis="both", color="#888888", linestyle="-") - start = float(pulse_.start) - finish = float(pulse_.finish) if pulse_.finish is not None else 0.0 + start = 0 + finish = float(pulse_.duration) ax1.axis((start, finish, -1.0, 1.0)) ax1.legend() @@ -123,9 +125,12 @@ def sequence(ps: PulseSequence, filename=None, sampling_rate=SAMPLING_RATE): _ = plt.figure(figsize=(14, 2 * len(ps)), dpi=200) gs = gridspec.GridSpec(ncols=1, nrows=len(ps)) vertical_lines = [] + starts = defaultdict(int) for pulse in ps: - vertical_lines.append(pulse.start) - vertical_lines.append(pulse.finish) + if not isinstance(pulse, Delay): + vertical_lines.append(starts[pulse.channel]) + vertical_lines.append(starts[pulse.channel] + pulse.duration) + starts[pulse.channel] += pulse.duration n = -1 for qubit in ps.qubits: @@ -134,11 +139,16 @@ def sequence(ps: PulseSequence, filename=None, sampling_rate=SAMPLING_RATE): n += 1 channel_pulses = qubit_pulses.get_channel_pulses(channel) ax = plt.subplot(gs[n]) - ax.axis([0, ps.finish, -1, 1]) + ax.axis([0, ps.duration, -1, 1]) + start = 0 for pulse in channel_pulses: + if isinstance(pulse, Delay): + start += pulse.duration + continue + envelope = pulse.shape.envelope_waveforms(sampling_rate) num_samples = envelope[0].size - time = pulse.start + np.arange(num_samples) / sampling_rate + time = start + np.arange(num_samples) / sampling_rate modulated = modulate(np.array(envelope), pulse.frequency) ax.plot(time, modulated[1], c="lightgrey") ax.plot(time, modulated[0], c=f"C{str(n)}") @@ -157,7 +167,7 @@ def sequence(ps: PulseSequence, filename=None, sampling_rate=SAMPLING_RATE): ax.set_ylabel(f"qubit {qubit} \n channel {channel}") for vl in vertical_lines: ax.axvline(vl, c="slategrey", linestyle="--") - ax.axis((0, ps.finish, -1, 1)) + ax.axis((0, ps.duration, -1, 1)) ax.grid( visible=True, which="both", @@ -165,6 +175,8 @@ def sequence(ps: PulseSequence, filename=None, sampling_rate=SAMPLING_RATE): color="#CCCCCC", linestyle="-", ) + start += pulse.duration + if filename: plt.savefig(filename) else: diff --git a/tests/pulses/test_plot.py b/tests/pulses/test_plot.py index 41d5d82f98..7164ee8e29 100644 --- a/tests/pulses/test_plot.py +++ b/tests/pulses/test_plot.py @@ -22,15 +22,13 @@ def test_plot_functions(): - p0 = Pulse(0, 40, 0.9, 0, 0, Rectangular(), 0, PulseType.FLUX, 0) - p1 = Pulse(0, 40, 0.9, 50e6, 0, Gaussian(5), 0, PulseType.DRIVE, 2) - p2 = Pulse(0, 40, 0.9, 50e6, 0, Drag(5, 2), 0, PulseType.DRIVE, 200) - p3 = Pulse.flux( - 0, 40, 0.9, IIR([-0.5, 2], [1], Rectangular()), channel=0, qubit=200 - ) - p4 = Pulse.flux(0, 40, 0.9, SNZ(t_idling=10), channel=0, qubit=200) - p5 = Pulse(0, 40, 0.9, 400e6, 0, eCap(alpha=2), 0, PulseType.DRIVE) - p6 = Pulse(0, 40, 0.9, 50e6, 0, GaussianSquare(5, 0.9), 0, PulseType.DRIVE, 2) + p0 = Pulse(40, 0.9, 0, 0, Rectangular(), 0, PulseType.FLUX, 0) + p1 = Pulse(40, 0.9, 50e6, 0, Gaussian(5), 0, PulseType.DRIVE, 2) + p2 = Pulse(40, 0.9, 50e6, 0, Drag(5, 2), 0, PulseType.DRIVE, 200) + p3 = Pulse.flux(40, 0.9, IIR([-0.5, 2], [1], Rectangular()), channel=0, qubit=200) + p4 = Pulse.flux(40, 0.9, SNZ(t_idling=10), channel=0, qubit=200) + p5 = Pulse(40, 0.9, 400e6, 0, eCap(alpha=2), 0, PulseType.DRIVE) + p6 = Pulse(40, 0.9, 50e6, 0, GaussianSquare(5, 0.9), 0, PulseType.DRIVE, 2) ps = PulseSequence([p0, p1, p2, p3, p4, p5, p6]) envelope = p0.envelope_waveforms() wf = modulate(np.array(envelope), 0.0) diff --git a/tests/pulses/test_pulse.py b/tests/pulses/test_pulse.py index a9676ee3c3..774ba58d34 100644 --- a/tests/pulses/test_pulse.py +++ b/tests/pulses/test_pulse.py @@ -13,7 +13,6 @@ Gaussian, GaussianSquare, Pulse, - PulseSequence, PulseShape, PulseType, Rectangular, @@ -25,7 +24,6 @@ def test_init(): # standard initialisation p0 = Pulse( - start=0, duration=50, amplitude=0.9, frequency=20_000_000, @@ -38,7 +36,6 @@ def test_init(): assert p0.relative_phase == 0.0 p1 = Pulse( - start=100, duration=50, amplitude=0.9, frequency=20_000_000, @@ -52,7 +49,6 @@ def test_init(): # initialisation with non int (float) frequency p2 = Pulse( - start=0, duration=50, amplitude=0.9, frequency=int(20e6), @@ -66,7 +62,6 @@ def test_init(): # initialisation with non float (int) relative_phase p3 = Pulse( - start=0, duration=50, amplitude=0.9, frequency=20_000_000, @@ -80,7 +75,6 @@ def test_init(): # initialisation with str shape p4 = Pulse( - start=0, duration=50, amplitude=0.9, frequency=20_000_000, @@ -94,7 +88,6 @@ def test_init(): # initialisation with str channel and str qubit p5 = Pulse( - start=0, duration=50, amplitude=0.9, frequency=20_000_000, @@ -107,22 +100,19 @@ def test_init(): assert p5.qubit == "qubit0" # initialisation with different frequencies, shapes and types - p6 = Pulse(0, 40, 0.9, -50e6, 0, Rectangular(), 0, PulseType.READOUT) - p7 = Pulse(0, 40, 0.9, 0, 0, Rectangular(), 0, PulseType.FLUX, 0) - p8 = Pulse(0, 40, 0.9, 50e6, 0, Gaussian(5), 0, PulseType.DRIVE, 2) - p9 = Pulse(0, 40, 0.9, 50e6, 0, Drag(5, 2), 0, PulseType.DRIVE, 200) + p6 = Pulse(40, 0.9, -50e6, 0, Rectangular(), 0, PulseType.READOUT) + p7 = Pulse(40, 0.9, 0, 0, Rectangular(), 0, PulseType.FLUX, 0) + p8 = Pulse(40, 0.9, 50e6, 0, Gaussian(5), 0, PulseType.DRIVE, 2) + p9 = Pulse(40, 0.9, 50e6, 0, Drag(5, 2), 0, PulseType.DRIVE, 200) p10 = Pulse.flux( - 0, 40, 0.9, IIR([-1, 1], [-0.1, 0.1001], Rectangular()), channel=0, qubit=200 + 40, 0.9, IIR([-1, 1], [-0.1, 0.1001], Rectangular()), channel=0, qubit=200 ) - p11 = Pulse.flux( - 0, 40, 0.9, SNZ(t_idling=10, b_amplitude=0.5), channel=0, qubit=200 - ) - p13 = Pulse(0, 40, 0.9, 400e6, 0, eCap(alpha=2), 0, PulseType.DRIVE) - p14 = Pulse(0, 40, 0.9, 50e6, 0, GaussianSquare(5, 0.9), 0, PulseType.READOUT, 2) + p11 = Pulse.flux(40, 0.9, SNZ(t_idling=10, b_amplitude=0.5), channel=0, qubit=200) + p13 = Pulse(40, 0.9, 400e6, 0, eCap(alpha=2), 0, PulseType.DRIVE) + p14 = Pulse(40, 0.9, 50e6, 0, GaussianSquare(5, 0.9), 0, PulseType.READOUT, 2) - # initialisation with float duration and start + # initialisation with float duration p12 = Pulse( - start=5.5, duration=34.33, amplitude=0.9, frequency=20_000_000, @@ -132,9 +122,8 @@ def test_init(): type=PulseType.READOUT, qubit=0, ) - assert isinstance(p12.start, float) assert isinstance(p12.duration, float) - assert p12.finish == 5.5 + 34.33 + assert p12.duration == 34.33 def test_attributes(): @@ -142,7 +131,6 @@ def test_attributes(): qubit = 0 p10 = Pulse( - start=10, duration=50, amplitude=0.9, frequency=20_000_000, @@ -152,68 +140,28 @@ def test_attributes(): qubit=qubit, ) - assert type(p10.start) == int and p10.start == 10 assert type(p10.duration) == int and p10.duration == 50 assert type(p10.amplitude) == float and p10.amplitude == 0.9 assert type(p10.frequency) == int and p10.frequency == 20_000_000 - assert type(p10.phase) == float and np.allclose( - p10.phase, 2 * np.pi * p10.start * p10.frequency / 1e9 - ) assert isinstance(p10.shape, PulseShape) and repr(p10.shape) == "Rectangular()" assert type(p10.channel) == type(channel) and p10.channel == channel assert type(p10.qubit) == type(qubit) and p10.qubit == qubit - assert isinstance(p10.finish, int) and p10.finish == 60 - - p0 = Pulse( - start=0, - duration=50, - amplitude=0.9, - frequency=20_000_000, - relative_phase=0.0, - shape=Rectangular(), - channel=0, - type=PulseType.READOUT, - qubit=0, - ) - p0.start = 50 - assert p0.finish == 100 - - -def test_is_equal_ignoring_start(): - """Checks if two pulses are equal, not looking at start time.""" - - p1 = Pulse(0, 40, 0.9, 0, 0, Rectangular(), 0, PulseType.FLUX, 0) - p2 = Pulse(100, 40, 0.9, 0, 0, Rectangular(), 0, PulseType.FLUX, 0) - p3 = Pulse(0, 40, 0.9, 0, 0, Rectangular(), 0, PulseType.FLUX, 0) - p4 = Pulse(200, 40, 0.9, 0, 0, Rectangular(), 2, PulseType.FLUX, 0) - assert p1.is_equal_ignoring_start(p2) - assert p1.is_equal_ignoring_start(p3) - assert not p1.is_equal_ignoring_start(p4) - - p1 = Pulse(0, 40, 0.9, 50e6, 0, Gaussian(5), 0, PulseType.DRIVE, 2) - p2 = Pulse(10, 40, 0.9, 50e6, 0, Gaussian(5), 0, PulseType.DRIVE, 2) - p3 = Pulse(20, 50, 0.8, 50e6, 0, Gaussian(5), 0, PulseType.DRIVE, 2) - p4 = Pulse(30, 40, 0.9, 50e6, 0, Gaussian(4), 0, PulseType.DRIVE, 2) - assert p1.is_equal_ignoring_start(p2) - assert not p1.is_equal_ignoring_start(p3) - assert not p1.is_equal_ignoring_start(p4) def test_hash(): - rp = Pulse(0, 40, 0.9, 100e6, 0, Rectangular(), 0, PulseType.DRIVE) - dp = Pulse(0, 40, 0.9, 100e6, 0, Drag(5, 1), 0, PulseType.DRIVE) + rp = Pulse(40, 0.9, 100e6, 0, Rectangular(), 0, PulseType.DRIVE) + dp = Pulse(40, 0.9, 100e6, 0, Drag(5, 1), 0, PulseType.DRIVE) hash(rp) my_dict = {rp: 1, dp: 2} assert list(my_dict.keys())[0] == rp assert list(my_dict.keys())[1] == dp - p1 = Pulse(0, 40, 0.9, 100e6, 0, Drag(5, 1), 0, PulseType.DRIVE) - p2 = Pulse(0, 40, 0.9, 100e6, 0, Drag(5, 1), 0, PulseType.DRIVE) + p1 = Pulse(40, 0.9, 100e6, 0, Drag(5, 1), 0, PulseType.DRIVE) + p2 = Pulse(40, 0.9, 100e6, 0, Drag(5, 1), 0, PulseType.DRIVE) assert p1 == p2 - t0 = 0 - p1 = Pulse(t0, 40, 0.9, 100e6, 0, Drag(5, 1), 0, PulseType.DRIVE) + p1 = Pulse(40, 0.9, 100e6, 0, Drag(5, 1), 0, PulseType.DRIVE) p2 = copy.copy(p1) p3 = copy.deepcopy(p1) assert p1 == p2 @@ -222,7 +170,6 @@ def test_hash(): def test_aliases(): rop = Pulse( - start=0, duration=50, amplitude=0.9, frequency=20_000_000, @@ -232,11 +179,9 @@ def test_aliases(): channel=0, qubit=0, ) - assert rop.start == 0 assert rop.qubit == 0 dp = Pulse( - start=0, duration=2000, amplitude=0.9, frequency=200_000_000, @@ -249,41 +194,16 @@ def test_aliases(): assert isinstance(dp.shape, Gaussian) fp = Pulse.flux( - start=0, duration=300, amplitude=0.9, shape=Rectangular(), channel=0, qubit=0 + duration=300, amplitude=0.9, shape=Rectangular(), channel=0, qubit=0 ) assert fp.channel == 0 -def test_pulse_order(): - t0 = 0 - t = 0 - p1 = Pulse(t0, 400, 0.9, 20e6, 0, Gaussian(5), 10) - p2 = Pulse( - p1.finish + t, - 400, - 0.9, - 20e6, - 0, - Rectangular(), - qubit=30, - type=PulseType.READOUT, - ) - p3 = Pulse(p2.finish, 400, 0.9, 20e6, 0, Drag(5, 50), 20) - ps1 = PulseSequence([p1, p2, p3]) - ps2 = PulseSequence([p3, p1, p2]) - - def sortseq(sequence): - return sorted(sequence, key=lambda item: (item.start, item.channel)) - - assert sortseq(ps1) == sortseq(ps2) - - def test_pulse(): duration = 50 rel_sigma = 5 beta = 2 pulse = Pulse( - start=0, frequency=200_000_000, amplitude=1, duration=duration, @@ -298,7 +218,6 @@ def test_pulse(): def test_readout_pulse(): duration = 2000 pulse = Pulse( - start=0, frequency=200_000_000, amplitude=1, duration=duration, @@ -317,7 +236,6 @@ def test_envelope_waveform_i_q(): custom_shape_pulse = Custom(envelope_i, envelope_q) custom_shape_pulse_old_behaviour = Custom(envelope_i) pulse = Pulse( - start=0, duration=1000, amplitude=1, frequency=10e6, diff --git a/tests/pulses/test_sequence.py b/tests/pulses/test_sequence.py index 2c08e3e2e7..29c179b82f 100644 --- a/tests/pulses/test_sequence.py +++ b/tests/pulses/test_sequence.py @@ -1,11 +1,18 @@ -from qibolab.pulses import Drag, Gaussian, Pulse, PulseSequence, PulseType, Rectangular +from qibolab.pulses import ( + Delay, + Drag, + Gaussian, + Pulse, + PulseSequence, + PulseType, + Rectangular, +) def test_add_readout(): sequence = PulseSequence() sequence.append( Pulse( - start=0, frequency=200_000_000, amplitude=0.3, duration=60, @@ -14,10 +21,9 @@ def test_add_readout(): channel=1, ) ) - + sequence.append(Delay(4, channel=1)) sequence.append( Pulse( - start=64, frequency=200_000_000, amplitude=0.3, duration=60, @@ -27,10 +33,9 @@ def test_add_readout(): type="qf", ) ) - + sequence.append(Delay(4, channel=1)) sequence.append( Pulse( - start=128, frequency=20_000_000, amplitude=0.9, duration=2000, @@ -40,32 +45,15 @@ def test_add_readout(): type=PulseType.READOUT, ) ) - assert len(sequence) == 3 + assert len(sequence) == 5 assert len(sequence.ro_pulses) == 1 assert len(sequence.qd_pulses) == 1 assert len(sequence.qf_pulses) == 1 -def test_separate_overlapping_pulses(): - p1 = Pulse(0, 400, 0.9, 20e6, 0, Gaussian(5), 10) - p2 = Pulse(100, 400, 0.9, 20e6, 0, Rectangular(), qubit=30, type=PulseType.READOUT) - p3 = Pulse(300, 400, 0.9, 20e6, 0, Drag(5, 50), 20) - p4 = Pulse(400, 400, 0.9, 20e6, 0, Drag(5, 50), 30) - p5 = Pulse(500, 400, 0.9, 20e6, 0, Rectangular(), qubit=20, type=PulseType.READOUT) - p6 = Pulse(600, 400, 0.9, 20e6, 0, Gaussian(5), 30) - - ps = PulseSequence([p1, p2, p3, p4, p5, p6]) - n = 70 - for segregated_ps in ps.separate_overlapping_pulses(): - n += 1 - for pulse in segregated_ps: - pulse.channel = n - - def test_get_qubit_pulses(): - p1 = Pulse(0, 400, 0.9, 20e6, 0, Gaussian(5), 10, qubit=0) + p1 = Pulse(400, 0.9, 20e6, 0, Gaussian(5), 10, qubit=0) p2 = Pulse( - 100, 400, 0.9, 20e6, @@ -75,10 +63,9 @@ def test_get_qubit_pulses(): qubit=0, type=PulseType.READOUT, ) - p3 = Pulse(300, 400, 0.9, 20e6, 0, Drag(5, 50), 20, qubit=1) - p4 = Pulse(400, 400, 0.9, 20e6, 0, Drag(5, 50), 30, qubit=1) + p3 = Pulse(400, 0.9, 20e6, 0, Drag(5, 50), 20, qubit=1) + p4 = Pulse(400, 0.9, 20e6, 0, Drag(5, 50), 30, qubit=1) p5 = Pulse( - 500, 400, 0.9, 20e6, @@ -88,8 +75,8 @@ def test_get_qubit_pulses(): qubit=1, type=PulseType.READOUT, ) - p6 = Pulse.flux(600, 400, 0.9, Rectangular(), channel=40, qubit=1) - p7 = Pulse.flux(900, 400, 0.9, Rectangular(), channel=40, qubit=2) + p6 = Pulse.flux(400, 0.9, Rectangular(), channel=40, qubit=1) + p7 = Pulse.flux(400, 0.9, Rectangular(), channel=40, qubit=2) ps = PulseSequence([p1, p2, p3, p4, p5, p6, p7]) assert ps.qubits == [0, 1, 2] @@ -99,28 +86,13 @@ def test_get_qubit_pulses(): assert len(ps.get_qubit_pulses(0, 1)) == 6 -def test_pulses_overlap(): - p1 = Pulse(0, 400, 0.9, 20e6, 0, Gaussian(5), 10) - p2 = Pulse(100, 400, 0.9, 20e6, 0, Rectangular(), 30, type=PulseType.READOUT) - p3 = Pulse(300, 400, 0.9, 20e6, 0, Drag(5, 50), 20) - p4 = Pulse(400, 400, 0.9, 20e6, 0, Drag(5, 50), 30) - p5 = Pulse(500, 400, 0.9, 20e6, 0, Rectangular(), 20, type=PulseType.READOUT) - p6 = Pulse(600, 400, 0.9, 20e6, 0, Gaussian(5), 30) - - ps = PulseSequence([p1, p2, p3, p4, p5, p6]) - assert ps.pulses_overlap - assert not ps.get_channel_pulses(10).pulses_overlap - assert ps.get_channel_pulses(20).pulses_overlap - assert ps.get_channel_pulses(30).pulses_overlap - - def test_get_channel_pulses(): - p1 = Pulse(0, 400, 0.9, 20e6, 0, Gaussian(5), 10) - p2 = Pulse(100, 400, 0.9, 20e6, 0, Rectangular(), 30, type=PulseType.READOUT) - p3 = Pulse(300, 400, 0.9, 20e6, 0, Drag(5, 50), 20) - p4 = Pulse(400, 400, 0.9, 20e6, 0, Drag(5, 50), 30) - p5 = Pulse(500, 400, 0.9, 20e6, 0, Rectangular(), 20, type=PulseType.READOUT) - p6 = Pulse(600, 400, 0.9, 20e6, 0, Gaussian(5), 30) + p1 = Pulse(400, 0.9, 20e6, 0, Gaussian(5), 10) + p2 = Pulse(400, 0.9, 20e6, 0, Rectangular(), 30, type=PulseType.READOUT) + p3 = Pulse(400, 0.9, 20e6, 0, Drag(5, 50), 20) + p4 = Pulse(400, 0.9, 20e6, 0, Drag(5, 50), 30) + p5 = Pulse(400, 0.9, 20e6, 0, Rectangular(), 20, type=PulseType.READOUT) + p6 = Pulse(400, 0.9, 20e6, 0, Gaussian(5), 30) ps = PulseSequence([p1, p2, p3, p4, p5, p6]) assert ps.channels == [10, 20, 30] @@ -130,23 +102,20 @@ def test_get_channel_pulses(): assert len(ps.get_channel_pulses(20, 30)) == 5 -def test_start_finish(): - p1 = Pulse(20, 40, 0.9, 200e6, 0, Drag(5, 1), 1, PulseType.DRIVE) - p2 = Pulse(60, 1000, 0.9, 20e6, 0, Rectangular(), 2, PulseType.READOUT) - ps = PulseSequence([p1]) + [p2] - assert ps.start == p1.start - assert ps.finish == p2.finish - - p1.start = None - assert p1.finish is None - p2.duration = None - assert p2.finish is None +def test_sequence_duration(): + p0 = Delay(20, 1) + p1 = Pulse(40, 0.9, 200e6, 0, Drag(5, 1), 1, PulseType.DRIVE) + p2 = Pulse(1000, 0.9, 20e6, 0, Rectangular(), 1, PulseType.READOUT) + ps = PulseSequence([p0, p1]) + [p2] + assert ps.duration == 20 + 40 + 1000 + p2.channel = 2 + assert ps.duration == 1000 def test_init(): - p1 = Pulse(400, 40, 0.9, 100e6, 0, Drag(5, 1), 3, PulseType.DRIVE) - p2 = Pulse(500, 40, 0.9, 100e6, 0, Drag(5, 1), 2, PulseType.DRIVE) - p3 = Pulse(600, 40, 0.9, 100e6, 0, Drag(5, 1), 1, PulseType.DRIVE) + p1 = Pulse(40, 0.9, 100e6, 0, Drag(5, 1), 3, PulseType.DRIVE) + p2 = Pulse(40, 0.9, 100e6, 0, Drag(5, 1), 2, PulseType.DRIVE) + p3 = Pulse(40, 0.9, 100e6, 0, Drag(5, 1), 1, PulseType.DRIVE) ps = PulseSequence() assert type(ps) == PulseSequence @@ -172,13 +141,13 @@ def test_init(): def test_operators(): ps = PulseSequence() - ps += [Pulse(800, 200, 0.9, 20e6, 0, Rectangular(), 1, type=PulseType.READOUT)] - ps = ps + [Pulse(800, 200, 0.9, 20e6, 0, Rectangular(), 2, type=PulseType.READOUT)] - ps = [Pulse(800, 200, 0.9, 20e6, 0, Rectangular(), 3, type=PulseType.READOUT)] + ps + ps += [Pulse(200, 0.9, 20e6, 0, Rectangular(), 1, type=PulseType.READOUT)] + ps = ps + [Pulse(200, 0.9, 20e6, 0, Rectangular(), 2, type=PulseType.READOUT)] + ps = [Pulse(200, 0.9, 20e6, 0, Rectangular(), 3, type=PulseType.READOUT)] + ps - p4 = Pulse(100, 40, 0.9, 50e6, 0, Gaussian(5), 3, PulseType.DRIVE) - p5 = Pulse(200, 40, 0.9, 50e6, 0, Gaussian(5), 2, PulseType.DRIVE) - p6 = Pulse(300, 40, 0.9, 50e6, 0, Gaussian(5), 1, PulseType.DRIVE) + p4 = Pulse(40, 0.9, 50e6, 0, Gaussian(5), 3, PulseType.DRIVE) + p5 = Pulse(40, 0.9, 50e6, 0, Gaussian(5), 2, PulseType.DRIVE) + p6 = Pulse(40, 0.9, 50e6, 0, Gaussian(5), 1, PulseType.DRIVE) another_ps = PulseSequence() another_ps.append(p4) @@ -195,7 +164,7 @@ def test_operators(): # ps.plot() - p7 = Pulse(600, 40, 0.9, 100e6, 0, Drag(5, 1), 1, PulseType.DRIVE) + p7 = Pulse(40, 0.9, 100e6, 0, Drag(5, 1), 1, PulseType.DRIVE) yet_another_ps = PulseSequence([p7]) assert len(yet_another_ps) == 1 yet_another_ps *= 3 @@ -203,7 +172,7 @@ def test_operators(): yet_another_ps *= 3 assert len(yet_another_ps) == 9 - p8 = Pulse(600, 40, 0.9, 100e6, 0, Drag(5, 1), 1, PulseType.DRIVE) - p9 = Pulse(600, 40, 0.9, 100e6, 0, Drag(5, 1), 2, PulseType.DRIVE) + p8 = Pulse(40, 0.9, 100e6, 0, Drag(5, 1), 1, PulseType.DRIVE) + p9 = Pulse(40, 0.9, 100e6, 0, Drag(5, 1), 2, PulseType.DRIVE) and_yet_another_ps = 2 * PulseSequence([p9]) + [p8] * 3 assert len(and_yet_another_ps) == 5 diff --git a/tests/pulses/test_shape.py b/tests/pulses/test_shape.py index 9ef9bfc37c..96e34f7ce6 100644 --- a/tests/pulses/test_shape.py +++ b/tests/pulses/test_shape.py @@ -21,7 +21,7 @@ "shape", [Rectangular(), Gaussian(5), GaussianSquare(5, 0.9), Drag(5, 1)] ) def test_sampling_rate(shape): - pulse = Pulse(0, 40, 0.9, 100e6, 0, shape, 0, PulseType.DRIVE) + pulse = Pulse(40, 0.9, 100e6, 0, shape, 0, PulseType.DRIVE) assert len(pulse.envelope_waveform_i(sampling_rate=1)) == 40 assert len(pulse.envelope_waveform_i(sampling_rate=100)) == 4000 @@ -86,7 +86,7 @@ def test_raise_shapeiniterror(): def test_drag_shape(): - pulse = Pulse(0, 2, 1, 4e9, 0, Drag(2, 1), 0, PulseType.DRIVE) + pulse = Pulse(2, 1, 4e9, 0, Drag(2, 1), 0, PulseType.DRIVE) # envelope i & envelope q should cross nearly at 0 and at 2 waveform = pulse.envelope_waveform_i(sampling_rate=10) target_waveform = np.array( @@ -118,7 +118,6 @@ def test_drag_shape(): def test_rectangular(): pulse = Pulse( - start=0, duration=50, amplitude=1, frequency=200_000_000, @@ -147,7 +146,6 @@ def test_rectangular(): def test_gaussian(): pulse = Pulse( - start=0, duration=50, amplitude=1, frequency=200_000_000, @@ -182,7 +180,6 @@ def test_gaussian(): def test_drag(): pulse = Pulse( - start=0, duration=50, amplitude=1, frequency=200_000_000, @@ -287,7 +284,6 @@ def test_eq(): def test_modulation(): rect = Pulse( - start=0, duration=30, amplitude=0.9, frequency=20_000_000, @@ -324,7 +320,6 @@ def test_modulation(): # fmt: on gauss = Pulse( - start=5, duration=20, amplitude=3.5, frequency=2_000_000, From 73e50521f3d41344b17d0e035801521f56218bd2 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 1 Mar 2024 20:38:26 +0400 Subject: [PATCH 0094/1006] chore: fix pylint --- src/qibolab/instruments/icarusqfpga.py | 1 - src/qibolab/instruments/qblox/cluster_qcm_bb.py | 1 - src/qibolab/instruments/qblox/cluster_qcm_rf.py | 1 - src/qibolab/instruments/qblox/cluster_qrm_rf.py | 1 - src/qibolab/instruments/qblox/controller.py | 1 - src/qibolab/instruments/qblox/sweeper.py | 1 - 6 files changed, 6 deletions(-) diff --git a/src/qibolab/instruments/icarusqfpga.py b/src/qibolab/instruments/icarusqfpga.py index b16cb83975..2dbc92a462 100644 --- a/src/qibolab/instruments/icarusqfpga.py +++ b/src/qibolab/instruments/icarusqfpga.py @@ -199,7 +199,6 @@ class RFSOC_RO(RFSOC): Parameter.duration, Parameter.frequency, Parameter.relative_phase, - Parameter.start, } def __init__( diff --git a/src/qibolab/instruments/qblox/cluster_qcm_bb.py b/src/qibolab/instruments/qblox/cluster_qcm_bb.py index c3e88ab5cb..2b395ccfd5 100644 --- a/src/qibolab/instruments/qblox/cluster_qcm_bb.py +++ b/src/qibolab/instruments/qblox/cluster_qcm_bb.py @@ -424,7 +424,6 @@ def process_pulse_sequence( Parameter.amplitude, Parameter.duration, Parameter.relative_phase, - Parameter.start, ] for sweeper in sweepers: diff --git a/src/qibolab/instruments/qblox/cluster_qcm_rf.py b/src/qibolab/instruments/qblox/cluster_qcm_rf.py index 74f5f206c1..ed99fa5987 100644 --- a/src/qibolab/instruments/qblox/cluster_qcm_rf.py +++ b/src/qibolab/instruments/qblox/cluster_qcm_rf.py @@ -439,7 +439,6 @@ def process_pulse_sequence( Parameter.amplitude, Parameter.duration, Parameter.relative_phase, - Parameter.start, ] for sweeper in sweepers: diff --git a/src/qibolab/instruments/qblox/cluster_qrm_rf.py b/src/qibolab/instruments/qblox/cluster_qrm_rf.py index b371829847..bcd1d7dcd7 100644 --- a/src/qibolab/instruments/qblox/cluster_qrm_rf.py +++ b/src/qibolab/instruments/qblox/cluster_qrm_rf.py @@ -499,7 +499,6 @@ def process_pulse_sequence( Parameter.amplitude, Parameter.duration, Parameter.relative_phase, - Parameter.start, ] for sweeper in sweepers: diff --git a/src/qibolab/instruments/qblox/controller.py b/src/qibolab/instruments/qblox/controller.py index 2afd2c4ab0..099d8c9dac 100644 --- a/src/qibolab/instruments/qblox/controller.py +++ b/src/qibolab/instruments/qblox/controller.py @@ -410,7 +410,6 @@ def _sweep_recursion( Parameter.gain, Parameter.bias, Parameter.amplitude, - Parameter.start, Parameter.duration, Parameter.relative_phase, ] diff --git a/src/qibolab/instruments/qblox/sweeper.py b/src/qibolab/instruments/qblox/sweeper.py index 1409220558..9a37f17203 100644 --- a/src/qibolab/instruments/qblox/sweeper.py +++ b/src/qibolab/instruments/qblox/sweeper.py @@ -224,7 +224,6 @@ def from_sweeper( Parameter.gain: QbloxSweeperType.gain, Parameter.amplitude: QbloxSweeperType.gain, Parameter.bias: QbloxSweeperType.offset, - Parameter.start: QbloxSweeperType.start, Parameter.duration: QbloxSweeperType.duration, Parameter.relative_phase: QbloxSweeperType.relative_phase, } From 7c2919de834746d8d6891e9b592d96da6dd70efa Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 1 Mar 2024 21:01:38 +0400 Subject: [PATCH 0095/1006] docs: update and fix doctests --- doc/source/getting-started/experiment.rst | 6 +- doc/source/main-documentation/qibolab.rst | 57 ++++++--------- doc/source/tutorials/calibration.rst | 18 ++--- doc/source/tutorials/compiler.rst | 2 +- doc/source/tutorials/lab.rst | 84 +++++++---------------- doc/source/tutorials/pulses.rst | 8 ++- 6 files changed, 64 insertions(+), 111 deletions(-) diff --git a/doc/source/getting-started/experiment.rst b/doc/source/getting-started/experiment.rst index 283315ba35..51b7e24f7b 100644 --- a/doc/source/getting-started/experiment.rst +++ b/doc/source/getting-started/experiment.rst @@ -102,8 +102,6 @@ And the we can define the runcard ``my_platform/parameters.json``: "frequency": 5500000000, "shape": "Gaussian(3)", "type": "qd", - "start": 0, - "phase": 0 }, "MZ": { "duration": 2000, @@ -111,8 +109,6 @@ And the we can define the runcard ``my_platform/parameters.json``: "frequency": 7370000000, "shape": "Rectangular()", "type": "ro", - "start": 0, - "phase": 0 } } }, @@ -193,7 +189,7 @@ We leave to the dedicated tutorial a full explanation of the experiment, but her # define the pulse sequence sequence = PulseSequence() - ro_pulse = platform.create_MZ_pulse(qubit=0, start=0) + ro_pulse = platform.create_MZ_pulse(qubit=0) sequence.append(ro_pulse) # define a sweeper for a frequency scan diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index 935f1e453b..352c6e9fd5 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -61,12 +61,13 @@ Now we can create a simple sequence (again, without explicitly giving any qubit .. testcode:: python - from qibolab.pulses import PulseSequence + from qibolab.pulses import PulseSequence, Delay ps = PulseSequence() - ps.append(platform.create_RX_pulse(qubit=0, start=0)) # start time is in ns - ps.append(platform.create_RX_pulse(qubit=0, start=100)) - ps.append(platform.create_MZ_pulse(qubit=0, start=200)) + ps.append(platform.create_RX_pulse(qubit=0)) + ps.append(platform.create_RX_pulse(qubit=0)) + ps.append(Delay(200, platform.qubits[0].readout.name)) + ps.append(platform.create_MZ_pulse(qubit=0)) Now we can execute the sequence on hardware: @@ -295,7 +296,6 @@ To illustrate, here are some examples of single pulses using the Qibolab API: from qibolab.pulses import Pulse, Rectangular pulse = Pulse( - start=0, # Timing, always in nanoseconds (ns) duration=40, # Pulse duration in ns amplitude=0.5, # Amplitude relative to instrument range frequency=1e8, # Frequency in Hz @@ -314,8 +314,7 @@ Alternatively, you can achieve the same result using the dedicated :class:`qibol from qibolab.pulses import Pulse, Rectangular pulse = Pulse( - start=0, # timing, in all qibolab, is expressed in ns - duration=40, + duration=40, # timing, in all qibolab, is expressed in ns amplitude=0.5, # this amplitude is relative to the range of the instrument frequency=1e8, # frequency are in Hz relative_phase=0, # phases are in radians @@ -335,8 +334,7 @@ To organize pulses into sequences, Qibolab provides the :class:`qibolab.pulses.P sequence = PulseSequence() pulse1 = Pulse( - start=0, # timing, in all qibolab, is expressed in ns - duration=40, + duration=40, # timing, in all qibolab, is expressed in ns amplitude=0.5, # this amplitude is relative to the range of the instrument frequency=1e8, # frequency are in Hz relative_phase=0, # phases are in radians @@ -345,8 +343,7 @@ To organize pulses into sequences, Qibolab provides the :class:`qibolab.pulses.P qubit=0, ) pulse2 = Pulse( - start=0, # timing, in all qibolab, is expressed in ns - duration=40, + duration=40, # timing, in all qibolab, is expressed in ns amplitude=0.5, # this amplitude is relative to the range of the instrument frequency=1e8, # frequency are in Hz relative_phase=0, # phases are in radians @@ -355,8 +352,7 @@ To organize pulses into sequences, Qibolab provides the :class:`qibolab.pulses.P qubit=0, ) pulse3 = Pulse( - start=0, # timing, in all qibolab, is expressed in ns - duration=40, + duration=40, # timing, in all qibolab, is expressed in ns amplitude=0.5, # this amplitude is relative to the range of the instrument frequency=1e8, # frequency are in Hz relative_phase=0, # phases are in radians @@ -365,8 +361,7 @@ To organize pulses into sequences, Qibolab provides the :class:`qibolab.pulses.P qubit=0, ) pulse4 = Pulse( - start=0, # timing, in all qibolab, is expressed in ns - duration=40, + duration=40, # timing, in all qibolab, is expressed in ns amplitude=0.5, # this amplitude is relative to the range of the instrument frequency=1e8, # frequency are in Hz relative_phase=0, # phases are in radians @@ -387,12 +382,9 @@ To organize pulses into sequences, Qibolab provides the :class:`qibolab.pulses.P .. testoutput:: python :hide: - Total duration: 40 + Total duration: 160 We have 0 pulses on channel 1. -.. warning:: - - Pulses in PulseSequences are ordered automatically following the start time (and the channel if needed). Not by the definition order. When conducting experiments on quantum hardware, pulse sequences are vital. Assuming you have already initialized a platform, executing an experiment is as simple as: @@ -413,7 +405,6 @@ Typical experiments may include both pre-defined pulses and new ones: sequence.append(platform.create_RX_pulse(0)) sequence.append( Pulse( - start=0, duration=10, amplitude=0.5, frequency=2500000000, @@ -422,7 +413,7 @@ Typical experiments may include both pre-defined pulses and new ones: channel="0", ) ) - sequence.append(platform.create_MZ_pulse(0, start=0)) + sequence.append(platform.create_MZ_pulse(0)) results = platform.execute_pulse_sequence(sequence, options=options) @@ -494,15 +485,9 @@ A tipical resonator spectroscopy experiment could be defined with: from qibolab.sweeper import Parameter, Sweeper, SweeperType sequence = PulseSequence() - sequence.append( - platform.create_MZ_pulse(0, start=0) - ) # readout pulse for qubit 0 at 4 GHz - sequence.append( - platform.create_MZ_pulse(1, start=0) - ) # readout pulse for qubit 1 at 5 GHz - sequence.append( - platform.create_MZ_pulse(2, start=0) - ) # readout pulse for qubit 2 at 6 GHz + sequence.append(platform.create_MZ_pulse(0)) # readout pulse for qubit 0 at 4 GHz + sequence.append(platform.create_MZ_pulse(1)) # readout pulse for qubit 1 at 5 GHz + sequence.append(platform.create_MZ_pulse(2)) # readout pulse for qubit 2 at 6 GHz sweeper = Sweeper( parameter=Parameter.frequency, @@ -535,10 +520,13 @@ For example: .. testcode:: python + from qibolab.pulses import PulseSequence, Delay + sequence = PulseSequence() sequence.append(platform.create_RX_pulse(0)) - sequence.append(platform.create_MZ_pulse(0, start=sequence[0].finish)) + sequence.append(Delay(sequence.duration, platform.qubits[0].readout.name)) + sequence.append(platform.create_MZ_pulse(0)) sweeper_freq = Sweeper( parameter=Parameter.frequency, @@ -631,8 +619,8 @@ Let's now delve into a typical use case for result objects within the qibolab fr .. testcode:: python - drive_pulse_1 = platform.create_MZ_pulse(0, start=0) - measurement_pulse = platform.create_qubit_readout_pulse(0, start=0) + drive_pulse_1 = platform.create_RX_pulse(0) + measurement_pulse = platform.create_MZ_pulse(0) sequence = PulseSequence() sequence.append(drive_pulse_1) @@ -709,7 +697,7 @@ If this set is universal any circuit can be transpiled and compiled to a pulse s Every :class:`qibolab.qubits.Qubit` object contains a :class:`qibolab.native.SingleQubitNatives` object which holds the parameters of its native single-qubit gates, while each :class:`qibolab.qubits.QubitPair` objects contains a :class:`qibolab.native.TwoQubitNatives` object which holds the parameters of the native two-qubit gates acting on the pair. -Each native gate is represented by a :class:`qibolab.native.NativePulse` or :class:`qibolab.native.NativeSequence` which contain all the calibrated parameters and can be converted to an actual :class:`qibolab.pulses.PulseSequence` that is then executed in the platform. +Each native gate is represented by a :class:`qibolab.pulses.Pulse` or :class:`qibolab.pulses.PulseSequence` which contain all the calibrated parameters. Typical single-qubit native gates are the Pauli-X gate, implemented via a pi-pulse which is calibrated using Rabi oscillations and the measurement gate, implemented via a pulse sent in the readout line followed by an acquisition. For a universal set of single-qubit gates, the RX90 (pi/2-pulse) gate is required, which is implemented by halving the amplitude of the calibrated pi-pulse. U3, the most general single-qubit gate can be implemented using two RX90 pi-pulses and some virtual Z-phases which are included in the phase of later pulses. @@ -766,7 +754,6 @@ The most important instruments are the controller, the following is a table of t "RTS frequency", "yes","yes","yes","yes" "RTS amplitude", "yes","yes","yes","yes" "RTS duration", "yes","yes","yes","yes" - "RTS start", "yes","yes","yes","yes" "RTS relative phase", "yes","yes","yes","yes" "RTS 2D any combination", "yes","yes","yes","yes" "Sequence unrolling", "dev","dev","dev","dev" diff --git a/doc/source/tutorials/calibration.rst b/doc/source/tutorials/calibration.rst index 6f492bbc61..13d22925cb 100644 --- a/doc/source/tutorials/calibration.rst +++ b/doc/source/tutorials/calibration.rst @@ -43,7 +43,7 @@ around the pre-defined frequency. # create pulse sequence and add pulse sequence = PulseSequence() - readout_pulse = platform.create_MZ_pulse(qubit=0, start=0) + readout_pulse = platform.create_MZ_pulse(qubit=0) sequence.append(readout_pulse) # allocate frequency sweeper @@ -110,7 +110,7 @@ complex pulse sequence. Therefore with start with that: import numpy as np import matplotlib.pyplot as plt from qibolab import create_platform - from qibolab.pulses import PulseSequence + from qibolab.pulses import PulseSequence, Delay from qibolab.sweeper import Sweeper, SweeperType, Parameter from qibolab.execution_parameters import ( ExecutionParameters, @@ -123,11 +123,12 @@ complex pulse sequence. Therefore with start with that: # create pulse sequence and add pulses sequence = PulseSequence() - drive_pulse = platform.create_RX_pulse(qubit=0, start=0) + drive_pulse = platform.create_RX_pulse(qubit=0) drive_pulse.duration = 2000 drive_pulse.amplitude = 0.01 - readout_pulse = platform.create_MZ_pulse(qubit=0, start=drive_pulse.finish) + readout_pulse = platform.create_MZ_pulse(qubit=0) sequence.append(drive_pulse) + sequence.append(Delay(drive_pulse.duration, readout_pulse.channel)) sequence.append(readout_pulse) # allocate frequency sweeper @@ -205,7 +206,7 @@ and its impact on qubit states in the IQ plane. import numpy as np import matplotlib.pyplot as plt from qibolab import create_platform - from qibolab.pulses import PulseSequence + from qibolab.pulses import PulseSequence, Delay from qibolab.sweeper import Sweeper, SweeperType, Parameter from qibolab.execution_parameters import ( ExecutionParameters, @@ -218,14 +219,15 @@ and its impact on qubit states in the IQ plane. # create pulse sequence 1 and add pulses one_sequence = PulseSequence() - drive_pulse = platform.create_RX_pulse(qubit=0, start=0) - readout_pulse1 = platform.create_MZ_pulse(qubit=0, start=drive_pulse.finish) + drive_pulse = platform.create_RX_pulse(qubit=0) + readout_pulse1 = platform.create_MZ_pulse(qubit=0) one_sequence.append(drive_pulse) + one_sequence.append(Delay(drive_pulse.duration, readout_pulse1.channel)) one_sequence.append(readout_pulse1) # create pulse sequence 2 and add pulses zero_sequence = PulseSequence() - readout_pulse2 = platform.create_MZ_pulse(qubit=0, start=0) + readout_pulse2 = platform.create_MZ_pulse(qubit=0) zero_sequence.append(readout_pulse2) options = ExecutionParameters( diff --git a/doc/source/tutorials/compiler.rst b/doc/source/tutorials/compiler.rst index 33d8edb67b..8fce2d8359 100644 --- a/doc/source/tutorials/compiler.rst +++ b/doc/source/tutorials/compiler.rst @@ -84,7 +84,7 @@ The following example shows how to modify the compiler in order to execute a cir """X gate applied with a single pi-pulse.""" qubit = gate.target_qubits[0] sequence = PulseSequence() - sequence.append(platform.create_RX_pulse(qubit, start=0)) + sequence.append(platform.create_RX_pulse(qubit)) return sequence, {} diff --git a/doc/source/tutorials/lab.rst b/doc/source/tutorials/lab.rst index ffb52ad53d..f1e80f5ce3 100644 --- a/doc/source/tutorials/lab.rst +++ b/doc/source/tutorials/lab.rst @@ -24,9 +24,9 @@ using different Qibolab primitives. from qibolab import Platform from qibolab.qubits import Qubit - from qibolab.pulses import PulseType + from qibolab.pulses import Pulse, PulseType from qibolab.channels import ChannelMap, Channel - from qibolab.native import NativePulse, SingleQubitNatives + from qibolab.native import SingleQubitNatives from qibolab.instruments.dummy import DummyInstrument @@ -45,21 +45,19 @@ using different Qibolab primitives. # assign native gates to the qubit qubit.native_gates = SingleQubitNatives( - RX=NativePulse( - name="RX", + RX=Pulse( duration=40, amplitude=0.05, shape="Gaussian(5)", - pulse_type=PulseType.DRIVE, + type=PulseType.DRIVE, qubit=qubit, frequency=int(4.5e9), ), - MZ=NativePulse( - name="MZ", + MZ=Pulse( duration=1000, amplitude=0.005, shape="Rectangular()", - pulse_type=PulseType.READOUT, + type=PulseType.READOUT, qubit=qubit, frequency=int(7e9), ), @@ -99,10 +97,8 @@ hold the parameters of the two-qubit gates. .. testcode:: python from qibolab.qubits import Qubit, QubitPair - from qibolab.pulses import PulseType + from qibolab.pulses import PulseType, Pulse, PulseSequence from qibolab.native import ( - NativePulse, - NativeSequence, SingleQubitNatives, TwoQubitNatives, ) @@ -113,41 +109,37 @@ hold the parameters of the two-qubit gates. # assign single-qubit native gates to each qubit qubit0.native_gates = SingleQubitNatives( - RX=NativePulse( - name="RX", + RX=Pulse( duration=40, amplitude=0.05, shape="Gaussian(5)", - pulse_type=PulseType.DRIVE, + type=PulseType.DRIVE, qubit=qubit0, frequency=int(4.7e9), ), - MZ=NativePulse( - name="MZ", + MZ=Pulse( duration=1000, amplitude=0.005, shape="Rectangular()", - pulse_type=PulseType.READOUT, + type=PulseType.READOUT, qubit=qubit0, frequency=int(7e9), ), ) qubit1.native_gates = SingleQubitNatives( - RX=NativePulse( - name="RX", + RX=Pulse( duration=40, amplitude=0.05, shape="Gaussian(5)", - pulse_type=PulseType.DRIVE, + type=PulseType.DRIVE, qubit=qubit1, frequency=int(5.1e9), ), - MZ=NativePulse( - name="MZ", + MZ=Pulse( duration=1000, amplitude=0.005, shape="Rectangular()", - pulse_type=PulseType.READOUT, + type=PulseType.READOUT, qubit=qubit1, frequency=int(7.5e9), ), @@ -156,15 +148,13 @@ hold the parameters of the two-qubit gates. # define the pair of qubits pair = QubitPair(qubit0, qubit1) pair.native_gates = TwoQubitNatives( - CZ=NativeSequence( - name="CZ", - pulses=[ - NativePulse( - name="CZ1", + CZ=PulseSequence( + [ + Pulse( duration=30, amplitude=0.005, shape="Rectangular()", - pulse_type=PulseType.FLUX, + type=PulseType.FLUX, qubit=qubit1, ) ], @@ -182,10 +172,8 @@ coupler but qibolab will take them into account when calling :class:`qibolab.nat from qibolab.couplers import Coupler from qibolab.qubits import Qubit, QubitPair - from qibolab.pulses import PulseType + from qibolab.pulses import PulseType, Pulse, PulseSequence from qibolab.native import ( - NativePulse, - NativeSequence, SingleQubitNatives, TwoQubitNatives, ) @@ -201,15 +189,13 @@ coupler but qibolab will take them into account when calling :class:`qibolab.nat # define the pair of qubits pair = QubitPair(qubit0, qubit1, coupler_01) pair.native_gates = TwoQubitNatives( - CZ=NativeSequence( - name="CZ", - pulses=[ - NativePulse( - name="CZ1", + CZ=PulseSequence( + [ + Pulse( duration=30, amplitude=0.005, shape="Rectangular()", - pulse_type=PulseType.FLUX, + type=PulseType.FLUX, qubit=qubit1, ) ], @@ -285,8 +271,6 @@ a two-qubit system: "frequency": 4855663000, "shape": "Drag(5, -0.02)", "type": "qd", - "start": 0, - "phase": 0 }, "MZ": { "duration": 620, @@ -294,8 +278,6 @@ a two-qubit system: "frequency": 7453265000, "shape": "Rectangular()", "type": "ro", - "start": 0, - "phase": 0 } }, "1": { @@ -305,8 +287,6 @@ a two-qubit system: "frequency": 5800563000, "shape": "Drag(5, -0.04)", "type": "qd", - "start": 0, - "phase": 0 }, "MZ": { "duration": 960, @@ -314,8 +294,6 @@ a two-qubit system: "frequency": 7655107000, "shape": "Rectangular()", "type": "ro", - "start": 0, - "phase": 0 } } }, @@ -327,7 +305,6 @@ a two-qubit system: "amplitude": 0.055, "shape": "Rectangular()", "qubit": 1, - "relative_start": 0, "type": "qf" }, { @@ -396,7 +373,6 @@ we need the following changes to the previous runcard: "amplitude": 0.6025, "shape": "Rectangular()", "qubit": 1, - "relative_start": 0, "type": "qf" }, { @@ -410,12 +386,11 @@ we need the following changes to the previous runcard: "qubit": 1 }, { - "type": "coupler", + "type": "cf", "duration": 40, "amplitude": 0.1, "shape": "Rectangular()", "coupler": 0, - "relative_start": 0 } ] } @@ -591,8 +566,6 @@ The runcard can contain an ``instruments`` section that provides these parameter "frequency": 4855663000, "shape": "Drag(5, -0.02)", "type": "qd", - "start": 0, - "phase": 0 }, "MZ": { "duration": 620, @@ -600,8 +573,6 @@ The runcard can contain an ``instruments`` section that provides these parameter "frequency": 7453265000, "shape": "Rectangular()", "type": "ro", - "start": 0, - "phase": 0 } }, "1": { @@ -611,8 +582,6 @@ The runcard can contain an ``instruments`` section that provides these parameter "frequency": 5800563000, "shape": "Drag(5, -0.04)", "type": "qd", - "start": 0, - "phase": 0 }, "MZ": { "duration": 960, @@ -620,8 +589,6 @@ The runcard can contain an ``instruments`` section that provides these parameter "frequency": 7655107000, "shape": "Rectangular()", "type": "ro", - "start": 0, - "phase": 0 } } }, @@ -633,7 +600,6 @@ The runcard can contain an ``instruments`` section that provides these parameter "amplitude": 0.055, "shape": "Rectangular()", "qubit": 1, - "relative_start": 0, "type": "qf" }, { diff --git a/doc/source/tutorials/pulses.rst b/doc/source/tutorials/pulses.rst index 1902112503..b68508bc07 100644 --- a/doc/source/tutorials/pulses.rst +++ b/doc/source/tutorials/pulses.rst @@ -8,7 +8,7 @@ pulses (:class:`qibolab.pulses.Pulse`) through the .. testcode:: python - from qibolab.pulses import Pulse, PulseSequence, PulseType, Rectangular, Gaussian + from qibolab.pulses import Pulse, PulseSequence, PulseType, Rectangular, Gaussian, Delay # Define PulseSequence sequence = PulseSequence() @@ -16,18 +16,19 @@ pulses (:class:`qibolab.pulses.Pulse`) through the # Add some pulses to the pulse sequence sequence.append( Pulse( - start=0, frequency=200000000, amplitude=0.3, duration=60, relative_phase=0, shape=Gaussian(5), qubit=0, + type=PulseType.DRIVE, + channel=0, ) ) + sequence.append(Delay(100, channel=1)) sequence.append( Pulse( - start=70, frequency=20000000.0, amplitude=0.5, duration=3000, @@ -35,6 +36,7 @@ pulses (:class:`qibolab.pulses.Pulse`) through the shape=Rectangular(), qubit=0, type=PulseType.READOUT, + channel=1, ) ) From 5059a758936a315c94dc29451c5ccde1f05917e9 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Mon, 4 Mar 2024 17:18:58 +0400 Subject: [PATCH 0096/1006] feat: Add VirtualZ pulse --- src/qibolab/native.py | 15 ++++---------- src/qibolab/pulses/__init__.py | 2 +- src/qibolab/pulses/pulse.py | 17 +++++++++++++++ src/qibolab/serialize.py | 38 ++++++++++++++-------------------- tests/conftest.py | 2 +- tests/test_dummy.py | 6 +----- 6 files changed, 40 insertions(+), 40 deletions(-) diff --git a/src/qibolab/native.py b/src/qibolab/native.py index 91a0c7da3c..8badc50918 100644 --- a/src/qibolab/native.py +++ b/src/qibolab/native.py @@ -1,5 +1,5 @@ from dataclasses import dataclass, field, fields, replace -from typing import Dict, Optional, Tuple +from typing import Optional from qibolab.pulses import Pulse, PulseSequence @@ -24,21 +24,14 @@ def RX90(self) -> Pulse: return replace(self.RX, amplitude=self.RX.amplitude / 2.0) -TwoQubitNativeType = Tuple[PulseSequence, Dict["QubitId", float]] - - @dataclass class TwoQubitNatives: """Container with the native two-qubit gates acting on a specific pair of qubits.""" - CZ: Optional[TwoQubitNativeType] = field(default=None, metadata={"symmetric": True}) - CNOT: Optional[TwoQubitNativeType] = field( - default=None, metadata={"symmetric": False} - ) - iSWAP: Optional[TwoQubitNativeType] = field( - default=None, metadata={"symmetric": True} - ) + CZ: Optional[PulseSequence] = field(default=None, metadata={"symmetric": True}) + CNOT: Optional[PulseSequence] = field(default=None, metadata={"symmetric": False}) + iSWAP: Optional[PulseSequence] = field(default=None, metadata={"symmetric": True}) @property def symmetric(self): diff --git a/src/qibolab/pulses/__init__.py b/src/qibolab/pulses/__init__.py index ed4233e7de..437c126d31 100644 --- a/src/qibolab/pulses/__init__.py +++ b/src/qibolab/pulses/__init__.py @@ -1,4 +1,4 @@ -from .pulse import Delay, Pulse, PulseType +from .pulse import Delay, Pulse, PulseType, VirtualZ from .sequence import PulseSequence from .shape import ( IIR, diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index 1dfecc044c..aa510bc110 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -20,6 +20,7 @@ class PulseType(Enum): FLUX = "qf" COUPLERFLUX = "cf" DELAY = "dl" + VIRTUALZ = "virtual_z" @dataclass @@ -128,3 +129,19 @@ class Delay: """Channel on which the delay should be implemented.""" type: PulseType = PulseType.DELAY """Type fixed to ``DELAY`` to comply with ``Pulse`` interface.""" + + +@dataclass +class VirtualZ: + """Implementation of Z-rotations using virtual phase.""" + + duration = 0 + """Duration of the virtual gate should always be zero.""" + + phase: float + """Phase that implements the rotation.""" + channel: Optional[str] = None + """Channel on which the virtual phase should be added.""" + qubit: int = 0 + """Qubit on the drive of which the virtual phase should be added.""" + type: PulseType = PulseType.VIRTUALZ diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index ec32f1fae2..25bfa6363b 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -6,7 +6,6 @@ """ import json -from collections import defaultdict from dataclasses import asdict, fields from pathlib import Path from typing import Tuple @@ -22,7 +21,7 @@ QubitPairMap, Settings, ) -from qibolab.pulses import Delay, Pulse, PulseSequence, PulseType +from qibolab.pulses import Delay, Pulse, PulseSequence, PulseType, VirtualZ from qibolab.qubits import Qubit, QubitId, QubitPair RUNCARD = "parameters.json" @@ -107,6 +106,8 @@ def _load_pulse(pulse_kwargs, qubit): if pulse_type == "dl": return Delay(**pulse_kwargs) + if pulse_type == "virtual_z": + return VirtualZ(**pulse_kwargs, qubit=q) return Pulse(**pulse_kwargs, type=pulse_type, qubit=q) @@ -131,21 +132,15 @@ def _load_two_qubit_natives(qubits, couplers, gates) -> TwoQubitNatives: seq_kwargs = [seq_kwargs] sequence = PulseSequence() - virtual_z_phases = defaultdict(int) for kwargs in seq_kwargs: - _type = kwargs["type"] - if _type == "virtual_z": - q = kwargs["qubit"] - virtual_z_phases[q] += kwargs["phase"] + if "coupler" in kwargs: + qubit = couplers[kwargs["coupler"]] else: - if "coupler" in kwargs: - qubit = couplers[kwargs["coupler"]] - else: - qubit = qubits[kwargs["qubit"]] - sequence.append(_load_pulse(kwargs, qubit)) + qubit = qubits[kwargs["qubit"]] + sequence.append(_load_pulse(kwargs, qubit)) + sequences[name] = sequence - sequences[name] = (sequence, virtual_z_phases) - return TwoQubitNatives(**sequences) + return TwoQubitNatives(**sequences) def register_gates( @@ -200,10 +195,13 @@ def _dump_pulse(pulse: Pulse): data = asdict(pulse) if pulse.type in (PulseType.FLUX, PulseType.COUPLERFLUX): del data["frequency"] - data["shape"] = str(pulse.shape) + if "shape" in data: + data["shape"] = str(pulse.shape) data["type"] = data["type"].value - del data["channel"] - del data["relative_phase"] + if "channel" in data: + del data["channel"] + if "relative_phase" in data: + del data["relative_phase"] return data @@ -222,17 +220,13 @@ def _dump_two_qubit_natives(natives: TwoQubitNatives): for fld in fields(natives): if getattr(natives, fld.name) is None: continue - sequence, virtual_z_phases = getattr(natives, fld.name) + sequence = getattr(natives, fld.name) data[fld.name] = [] for pulse in sequence: pulse_serial = _dump_pulse(pulse) if pulse.type == PulseType.COUPLERFLUX: pulse_serial["coupler"] = pulse_serial["qubit"] data[fld.name].append(pulse_serial) - data[fld.name].extend( - {"type": "virtual_z", "phase": phase, "qubit": q} - for q, phase in virtual_z_phases.items() - ) return data diff --git a/tests/conftest.py b/tests/conftest.py index d72578335e..bfed3be8fc 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -117,5 +117,5 @@ def connected_platform(request): def pytest_generate_tests(metafunc): name = metafunc.module.__name__ - if "test_instruments" in name or "test_compilers" in name: + if "test_instruments" in name or "test_compilers" in name or "qasm" in name: pytest.skip() diff --git a/tests/test_dummy.py b/tests/test_dummy.py index 0f1f585e69..3328a866f2 100644 --- a/tests/test_dummy.py +++ b/tests/test_dummy.py @@ -54,7 +54,7 @@ def test_dummy_execute_pulse_sequence_couplers(): ) sequence = PulseSequence() - cz, cz_phases = platform.create_CZ_pulse_sequence( + cz = platform.create_CZ_pulse_sequence( qubits=(qubit_ordered_pair.qubit1.name, qubit_ordered_pair.qubit2.name), ) sequence.extend(cz.get_qubit_pulses(qubit_ordered_pair.qubit1.name)) @@ -67,10 +67,6 @@ def test_dummy_execute_pulse_sequence_couplers(): options = ExecutionParameters(nshots=None) result = platform.execute_pulse_sequence(sequence, options) - test_phases = {1: 0.0, 2: 0.0} - - assert test_phases == cz_phases - @pytest.mark.parametrize("name", PLATFORM_NAMES) def test_dummy_execute_pulse_sequence_fast_reset(name): From 704fc2bd8d9eae1a39e108e8ab3f510be137046a Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Mon, 4 Mar 2024 17:26:31 +0400 Subject: [PATCH 0097/1006] fix: platform serialization test --- src/qibolab/serialize.py | 2 +- tests/test_platform.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index 25bfa6363b..8cb3cd2c71 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -225,7 +225,7 @@ def _dump_two_qubit_natives(natives: TwoQubitNatives): for pulse in sequence: pulse_serial = _dump_pulse(pulse) if pulse.type == PulseType.COUPLERFLUX: - pulse_serial["coupler"] = pulse_serial["qubit"] + pulse_serial["coupler"] = pulse_serial.pop("qubit") data[fld.name].append(pulse_serial) return data diff --git a/tests/test_platform.py b/tests/test_platform.py index 1be5ef4a36..c248408987 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -109,7 +109,6 @@ def test_platform_pickle(platform): assert new_platform.is_connected == platform.is_connected -@pytest.mark.skip def test_dump_runcard(platform, tmp_path): dump_runcard(platform, tmp_path) final_runcard = load_runcard(tmp_path) From f48f6166664e7cee9b5eeb9555afcf2e2ef1b21b Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Mon, 4 Mar 2024 17:27:28 +0400 Subject: [PATCH 0098/1006] test: remove negative drag from test runcards (see #826) --- src/qibolab/dummy/parameters.json | 16 ++++++++-------- tests/dummy_qrc/qm/parameters.json | 12 ++++++------ tests/dummy_qrc/qm_octave/parameters.json | 12 ++++++------ 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/qibolab/dummy/parameters.json b/src/qibolab/dummy/parameters.json index 27fe9c65ee..529fcb69ed 100644 --- a/src/qibolab/dummy/parameters.json +++ b/src/qibolab/dummy/parameters.json @@ -77,14 +77,14 @@ "RX": { "duration": 40, "amplitude": 0.3, - "shape": "Drag(5, -0.02)", + "shape": "Drag(5, 0.02)", "frequency": 4200000000.0, "type": "qd" }, "RX12": { "duration": 40, "amplitude": 0.0484, - "shape": "Drag(5, -0.02)", + "shape": "Drag(5, 0.02)", "frequency": 4855663000, "type": "qd" }, @@ -100,7 +100,7 @@ "RX": { "duration": 40, "amplitude": 0.3, - "shape": "Drag(5, -0.02)", + "shape": "Drag(5, 0.02)", "frequency": 4500000000.0, "type": "qd" }, @@ -123,14 +123,14 @@ "RX": { "duration": 40, "amplitude": 0.3, - "shape": "Drag(5, -0.02)", + "shape": "Drag(5, 0.02)", "frequency": 4150000000.0, "type": "qd" }, "RX12": { "duration": 40, "amplitude": 0.0484, - "shape": "Drag(5, -0.02)", + "shape": "Drag(5, 0.02)", "frequency": 5855663000, "type": "qd" }, @@ -146,14 +146,14 @@ "RX": { "duration": 40, "amplitude": 0.3, - "shape": "Drag(5, -0.02)", + "shape": "Drag(5, 0.02)", "frequency": 4155663000, "type": "qd" }, "RX12": { "duration": 40, "amplitude": 0.0484, - "shape": "Drag(5, -0.02)", + "shape": "Drag(5, 0.02)", "frequency": 5855663000, "type": "qd" }, @@ -366,7 +366,7 @@ { "duration": 40, "amplitude": 0.3, - "shape": "Drag(5, -0.02)", + "shape": "Drag(5, 0.02)", "frequency": 4150000000.0, "type": "qd", "qubit": 2 diff --git a/tests/dummy_qrc/qm/parameters.json b/tests/dummy_qrc/qm/parameters.json index ae345c1b2b..0d8fcfc2d0 100644 --- a/tests/dummy_qrc/qm/parameters.json +++ b/tests/dummy_qrc/qm/parameters.json @@ -105,14 +105,14 @@ "duration": 40, "amplitude": 0.0484, "frequency": 4855663000, - "shape": "Drag(5, -0.02)", + "shape": "Drag(5, 0.02)", "type": "qd" }, "RX12": { "duration": 40, "amplitude": 0.0484, "frequency": 4855663000, - "shape": "Drag(5, -0.02)", + "shape": "Drag(5, 0.02)", "type": "qd" }, "MZ": { @@ -128,14 +128,14 @@ "duration": 40, "amplitude": 0.05682, "frequency": 5800563000, - "shape": "Drag(5, -0.04)", + "shape": "Drag(5, 0.04)", "type": "qd" }, "RX12": { "duration": 40, "amplitude": 0.05682, "frequency": 5800563000, - "shape": "Drag(5, -0.04)", + "shape": "Drag(5, 0.04)", "type": "qd" }, "MZ": { @@ -174,14 +174,14 @@ "duration": 40, "amplitude": 0.0617, "frequency": 6585053000, - "shape": "Drag(5, 0.0)", + "shape": "Drag(5, 0)", "type": "qd" }, "RX12": { "duration": 40, "amplitude": 0.0617, "frequency": 6585053000, - "shape": "Drag(5, 0.0)", + "shape": "Drag(5, 0)", "type": "qd" }, "MZ": { diff --git a/tests/dummy_qrc/qm_octave/parameters.json b/tests/dummy_qrc/qm_octave/parameters.json index 9753b3a233..523ddb92d8 100644 --- a/tests/dummy_qrc/qm_octave/parameters.json +++ b/tests/dummy_qrc/qm_octave/parameters.json @@ -125,13 +125,13 @@ "duration": 40, "amplitude": 0.0484, "frequency": 4855663000, - "shape": "Drag(5, -0.02)", + "shape": "Drag(5, 0.02)", "type": "qd"}, "RX12": { "duration": 40, "amplitude": 0.0484, "frequency": 4855663000, - "shape": "Drag(5, -0.02)", + "shape": "Drag(5, 0.02)", "type": "qd"}, "MZ": { "duration": 620, @@ -145,13 +145,13 @@ "duration": 40, "amplitude": 0.05682, "frequency": 5800563000, - "shape": "Drag(5, -0.04)", + "shape": "Drag(5, 0.04)", "type": "qd"}, "RX12": { "duration": 40, "amplitude": 0.05682, "frequency": 5800563000, - "shape": "Drag(5, -0.04)", + "shape": "Drag(5, 0.04)", "type": "qd"}, "MZ": { "duration": 960, @@ -185,13 +185,13 @@ "duration": 40, "amplitude": 0.0617, "frequency": 6585053000, - "shape": "Drag(5, 0.0)", + "shape": "Drag(5, 0)", "type": "qd"}, "RX12": { "duration": 40, "amplitude": 0.0617, "frequency": 6585053000, - "shape": "Drag(5, 0.0)", + "shape": "Drag(5, 0)", "type": "qd"}, "MZ": { "duration": 640, From 242ac8b922b7538b7240336502f33d47f51b1b8e Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Mon, 4 Mar 2024 19:16:45 +0400 Subject: [PATCH 0099/1006] fix: compiler and tests --- doc/source/tutorials/compiler.rst | 2 +- src/qibolab/compilers/compiler.py | 15 ++---- src/qibolab/compilers/default.py | 41 ++++++++------- src/qibolab/platform/platform.py | 49 +++++++++++++++++- tests/conftest.py | 2 +- tests/test_compilers_default.py | 84 +++++++++++++------------------ 6 files changed, 109 insertions(+), 84 deletions(-) diff --git a/doc/source/tutorials/compiler.rst b/doc/source/tutorials/compiler.rst index 8fce2d8359..ae5d2dc2e3 100644 --- a/doc/source/tutorials/compiler.rst +++ b/doc/source/tutorials/compiler.rst @@ -85,7 +85,7 @@ The following example shows how to modify the compiler in order to execute a cir qubit = gate.target_qubits[0] sequence = PulseSequence() sequence.append(platform.create_RX_pulse(qubit)) - return sequence, {} + return sequence # the empty dictionary is needed because the X gate does not require any virtual Z-phases diff --git a/src/qibolab/compilers/compiler.py b/src/qibolab/compilers/compiler.py index 64f9fbb4da..938acdc566 100644 --- a/src/qibolab/compilers/compiler.py +++ b/src/qibolab/compilers/compiler.py @@ -15,7 +15,7 @@ u3_rule, z_rule, ) -from qibolab.pulses import Delay, PulseSequence, PulseType +from qibolab.pulses import Delay, PulseSequence @dataclass @@ -114,7 +114,6 @@ def compile(self, circuit, platform): sequence = PulseSequence() # FIXME: This will not work with qubits that have string names # TODO: Implement a mapping between circuit qubit ids and platform ``Qubit``s - virtual_z_phases = defaultdict(int) measurement_map = {} qubit_clock = defaultdict(int) @@ -124,17 +123,13 @@ def compile(self, circuit, platform): for gate in set(filter(lambda x: x is not None, moment)): if isinstance(gate, gates.Align): for qubit in gate.qubits: - # TODO: do something - pass + qubit_clock[qubit] += gate.delay continue rule = self[gate.__class__] # get local sequence and phases for the current gate - gate_sequence, gate_phases = rule(gate, platform) + gate_sequence = rule(gate, platform) for pulse in gate_sequence: - if pulse.type is not PulseType.READOUT: - pulse.relative_phase += virtual_z_phases[pulse.qubit] - if qubit_clock[pulse.qubit] > channel_clock[pulse.qubit]: delay = qubit_clock[pulse.qubit] - channel_clock[pulse.channel] sequence.append(Delay(delay, pulse.channel)) @@ -145,10 +140,6 @@ def compile(self, circuit, platform): qubit_clock[pulse.qubit] += pulse.duration channel_clock[pulse.channel] += pulse.duration - # update virtual Z phases - for qubit, phase in gate_phases.items(): - virtual_z_phases[qubit] += phase - # register readout sequences to ``measurement_map`` so that we can # properly map acquisition results to measurement gates if isinstance(gate, gates.M): diff --git a/src/qibolab/compilers/default.py b/src/qibolab/compilers/default.py index cd0ecf5830..3e02ac25f2 100644 --- a/src/qibolab/compilers/default.py +++ b/src/qibolab/compilers/default.py @@ -4,25 +4,30 @@ """ import math +from dataclasses import replace -from qibolab.pulses import PulseSequence +from qibolab.pulses import PulseSequence, VirtualZ def identity_rule(gate, platform): """Identity gate skipped.""" - return PulseSequence(), {} + return PulseSequence() def z_rule(gate, platform): """Z gate applied virtually.""" qubit = platform.get_qubit(gate.target_qubits[0]) - return PulseSequence(), {qubit.name: math.pi} + return PulseSequence( + [VirtualZ(phase=math.pi, channel=qubit.drive.name, qubit=qubit.name)] + ) def rz_rule(gate, platform): """RZ gate applied virtually.""" qubit = platform.get_qubit(gate.target_qubits[0]) - return PulseSequence(), {qubit.name: gate.parameters[0]} + return PulseSequence( + [VirtualZ(phase=gate.parameters[0], channel=qubit.drive.name, qubit=qubit.name)] + ) def gpi2_rule(gate, platform): @@ -33,7 +38,7 @@ def gpi2_rule(gate, platform): pulse = qubit.native_gates.RX90 pulse.relative_phase = theta sequence.append(pulse) - return sequence, {} + return sequence def gpi_rule(gate, platform): @@ -48,7 +53,7 @@ def gpi_rule(gate, platform): pulse = qubit.native_gates.RX pulse.relative_phase = theta sequence.append(pulse) - return sequence, {} + return sequence def u3_rule(gate, platform): @@ -59,22 +64,16 @@ def u3_rule(gate, platform): # apply RZ(lam) virtual_z_phases = {qubit.name: lam} sequence = PulseSequence() - # Fetch pi/2 pulse from calibration - rx90_pulse1 = qubit.native_gates.RX90 - rx90_pulse1.relative_phase = virtual_z_phases[qubit.name] - # apply RX(pi/2) - sequence.append(rx90_pulse1) + sequence.append(VirtualZ(phase=lam, channel=qubit.drive.name, qubit=qubit.name)) + # Fetch pi/2 pulse from calibration and apply RX(pi/2) + sequence.append(qubit.native_gates.RX90) # apply RZ(theta) - virtual_z_phases[qubit.name] += theta - # Fetch pi/2 pulse from calibration - rx90_pulse2 = qubit.native_gates.RX90 - rx90_pulse2.relative_phase = (virtual_z_phases[qubit.name] - math.pi,) - # apply RX(-pi/2) - sequence.append(rx90_pulse2) + sequence.append(VirtualZ(phase=theta, channel=qubit.drive.name, qubit=qubit.name)) + # Fetch pi/2 pulse from calibration and apply RX(-pi/2) + sequence.append(replace(qubit.native_gates.RX90, relative_phase=-math.pi)) # apply RZ(phi) - virtual_z_phases[qubit.name] += phi - - return sequence, virtual_z_phases + sequence.append(VirtualZ(phase=phi, channel=qubit.drive.name, qubit=qubit.name)) + return sequence def cz_rule(gate, platform): @@ -98,4 +97,4 @@ def measurement_rule(gate, platform): sequence = PulseSequence( [platform.get_qubit(q).native_gates.MZ for q in gate.qubits] ) - return sequence, {} + return sequence diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 86ccadf0d3..c0e8c5c2b3 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -1,7 +1,7 @@ """A platform for executing quantum algorithms.""" from collections import defaultdict -from dataclasses import dataclass, field, replace +from dataclasses import dataclass, field, fields, replace from typing import Dict, List, Optional, Tuple import networkx as nx @@ -126,6 +126,53 @@ def __post_init__(self): self.topology.add_edges_from( [(pair.qubit1.name, pair.qubit2.name) for pair in self.pairs.values()] ) + self._set_channels_to_single_qubit_gates() + self._set_channels_to_two_qubit_gates() + + def _set_channels_to_single_qubit_gates(self): + """Set channels to pulses that implement single-qubit gates. + + This function should be removed when the duplication caused by + (``pulse.qubit``, ``pulse.type``) -> ``pulse.channel`` + is resolved. For now it just makes sure that the channels of + native pulses are consistent in order to test the rest of the code. + """ + for qubit in self.qubits.values(): + gates = qubit.native_gates + for fld in fields(gates): + pulse = getattr(gates, fld.name) + if pulse is not None: + channel = getattr(qubit, pulse.type.name.lower()).name + setattr(gates, fld.name, replace(pulse, channel=channel)) + for coupler in self.couplers.values(): + if gates.CP is not None: + gates.CP = replace(gates.CP, channel=coupler.flux.name) + + def _set_channels_to_two_qubit_gates(self): + """Set channels to pulses that implement single-qubit gates. + + This function should be removed when the duplication caused by + (``pulse.qubit``, ``pulse.type``) -> ``pulse.channel`` + is resolved. For now it just makes sure that the channels of + native pulses are consistent in order to test the rest of the code. + """ + for pair in self.pairs.values(): + gates = pair.native_gates + for fld in fields(gates): + sequence = getattr(gates, fld.name) + if sequence is not None: + new_sequence = PulseSequence() + for pulse in sequence: + if pulse.type is PulseType.VIRTUALZ: + channel = self.qubits[pulse.qubit].drive.name + elif pulse.type is PulseType.COUPLERFLUX: + channel = self.couplers[pulse.qubit].flux.name + else: + channel = getattr( + self.qubits[pulse.qubit], pulse.type.name.lower() + ).name + new_sequence.append(replace(pulse, channel=channel)) + setattr(gates, fld.name, new_sequence) def __str__(self): return self.name diff --git a/tests/conftest.py b/tests/conftest.py index bfed3be8fc..39be15868f 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -117,5 +117,5 @@ def connected_platform(request): def pytest_generate_tests(metafunc): name = metafunc.module.__name__ - if "test_instruments" in name or "test_compilers" in name or "qasm" in name: + if "test_instruments" in name: pytest.skip() diff --git a/tests/test_compilers_default.py b/tests/test_compilers_default.py index 13216e10d5..f0aaa2d89b 100644 --- a/tests/test_compilers_default.py +++ b/tests/test_compilers_default.py @@ -6,7 +6,7 @@ from qibolab import create_platform from qibolab.compilers import Compiler -from qibolab.pulses import PulseSequence +from qibolab.pulses import Delay, PulseSequence def generate_circuit_with_gate(nqubits, gate, *params, **kwargs): @@ -37,7 +37,7 @@ def compile_circuit(circuit, platform): @pytest.mark.parametrize( - "gateargs", + "gateargs,sequence_len", [ (gates.I,), (gates.Z,), @@ -47,7 +47,7 @@ def compile_circuit(circuit, platform): (gates.U3, 0.1, 0.2, 0.3), ], ) -def test_compile(platform, gateargs): +def test_compile(platform, gateargs, sequence_len): nqubits = platform.nqubits if gateargs[0] is gates.U3: nseq = 2 @@ -57,9 +57,7 @@ def test_compile(platform, gateargs): nseq = 0 circuit = generate_circuit_with_gate(nqubits, *gateargs) sequence = compile_circuit(circuit, platform) - for pulse in sequence: - print(pulse) - assert len(sequence) == (nseq + 1) * nqubits + assert len(sequence) == nqubits * sequence_len def test_compile_two_gates(platform): @@ -93,7 +91,7 @@ def test_rz_to_sequence(platform): circuit.add(gates.RZ(0, theta=0.2)) circuit.add(gates.Z(0)) sequence = compile_circuit(circuit, platform) - assert len(sequence) == 0 + assert len(sequence) == 2 def test_gpi_to_sequence(platform): @@ -103,7 +101,7 @@ def test_gpi_to_sequence(platform): assert len(sequence) == 1 assert len(sequence.qd_pulses) == 1 - rx_pulse = platform.create_RX_pulse(0, start=0, relative_phase=0.2) + rx_pulse = platform.create_RX_pulse(0, relative_phase=0.2) s = PulseSequence([rx_pulse]) np.testing.assert_allclose(sequence.duration, rx_pulse.duration) @@ -116,7 +114,7 @@ def test_gpi2_to_sequence(platform): assert len(sequence) == 1 assert len(sequence.qd_pulses) == 1 - rx90_pulse = platform.create_RX90_pulse(0, start=0, relative_phase=0.2) + rx90_pulse = platform.create_RX90_pulse(0, relative_phase=0.2) s = PulseSequence([rx90_pulse]) np.testing.assert_allclose(sequence.duration, rx90_pulse.duration) @@ -128,19 +126,17 @@ def test_u3_to_sequence(platform): circuit.add(gates.U3(0, 0.1, 0.2, 0.3)) sequence = compile_circuit(circuit, platform) - assert len(sequence) == 2 + assert len(sequence) == 8 assert len(sequence.qd_pulses) == 2 - rx90_pulse1 = platform.create_RX90_pulse(0, start=0, relative_phase=0.3) - rx90_pulse2 = platform.create_RX90_pulse( - 0, start=rx90_pulse1.finish, relative_phase=0.4 - np.pi - ) + rx90_pulse1 = platform.create_RX90_pulse(0, relative_phase=0.3) + rx90_pulse2 = platform.create_RX90_pulse(0, relative_phase=0.4 - np.pi) s = PulseSequence([rx90_pulse1, rx90_pulse2]) np.testing.assert_allclose( sequence.duration, rx90_pulse1.duration + rx90_pulse2.duration ) - assert sequence == s + # assert sequence == s def test_two_u3_to_sequence(platform): @@ -149,33 +145,23 @@ def test_two_u3_to_sequence(platform): circuit.add(gates.U3(0, 0.4, 0.6, 0.5)) sequence = compile_circuit(circuit, platform) - assert len(sequence) == 4 + assert len(sequence) == 18 assert len(sequence.qd_pulses) == 4 rx90_pulse = platform.create_RX90_pulse(0) np.testing.assert_allclose(sequence.duration, 2 * 2 * rx90_pulse.duration) - rx90_pulse1 = platform.create_RX90_pulse(0, start=0, relative_phase=0.3) - rx90_pulse2 = platform.create_RX90_pulse( - 0, start=rx90_pulse1.finish, relative_phase=0.4 - np.pi - ) - rx90_pulse3 = platform.create_RX90_pulse( - 0, start=rx90_pulse2.finish, relative_phase=1.1 - ) - rx90_pulse4 = platform.create_RX90_pulse( - 0, start=rx90_pulse3.finish, relative_phase=1.5 - np.pi - ) + rx90_pulse1 = platform.create_RX90_pulse(0, relative_phase=0.3) + rx90_pulse2 = platform.create_RX90_pulse(0, relative_phase=0.4 - np.pi) + rx90_pulse3 = platform.create_RX90_pulse(0, relative_phase=1.1) + rx90_pulse4 = platform.create_RX90_pulse(0, relative_phase=1.5 - np.pi) s = PulseSequence([rx90_pulse1, rx90_pulse2, rx90_pulse3, rx90_pulse4]) - assert sequence == s + # assert sequence == s -def test_cz_to_sequence(platform): - if (1, 2) not in platform.pairs: - pytest.skip( - f"Skipping CZ test for {platform} because pair (1, 2) is not available." - ) - +def test_cz_to_sequence(): + platform = create_platform("dummy") circuit = Circuit(3) circuit.add(gates.CZ(1, 2)) @@ -190,8 +176,8 @@ def test_cnot_to_sequence(): circuit.add(gates.CNOT(2, 3)) sequence = compile_circuit(circuit, platform) - test_sequence, virtual_z_phases = platform.create_CNOT_pulse_sequence((2, 3)) - assert len(sequence) == len(test_sequence) + test_sequence = platform.create_CNOT_pulse_sequence((2, 3)) + assert len(sequence) == len(test_sequence) + 1 assert sequence[0] == test_sequence[0] @@ -201,17 +187,18 @@ def test_add_measurement_to_sequence(platform): circuit.add(gates.M(0)) sequence = compile_circuit(circuit, platform) - assert len(sequence) == 3 + assert len(sequence) == 10 assert len(sequence.qd_pulses) == 2 assert len(sequence.ro_pulses) == 1 - rx90_pulse1 = platform.create_RX90_pulse(0, start=0, relative_phase=0.3) - rx90_pulse2 = platform.create_RX90_pulse( - 0, start=rx90_pulse1.finish, relative_phase=0.4 - np.pi + rx90_pulse1 = platform.create_RX90_pulse(0, relative_phase=0.3) + rx90_pulse2 = platform.create_RX90_pulse(0, relative_phase=0.4 - np.pi) + mz_pulse = platform.create_MZ_pulse(0) + delay = 2 * rx90_pulse1.duration + s = PulseSequence( + [rx90_pulse1, rx90_pulse2, Delay(delay, mz_pulse.channel), mz_pulse] ) - mz_pulse = platform.create_MZ_pulse(0, start=rx90_pulse2.finish) - s = PulseSequence([rx90_pulse1, rx90_pulse2, mz_pulse]) - assert sequence == s + # assert sequence == s @pytest.mark.parametrize("delay", [0, 100]) @@ -219,11 +206,12 @@ def test_align_delay_measurement(platform, delay): circuit = Circuit(1) circuit.add(gates.Align(0, delay=delay)) circuit.add(gates.M(0)) - sequence = compile_circuit(circuit, platform) - assert len(sequence) == 1 - assert len(sequence.ro_pulses) == 1 - mz_pulse = platform.create_MZ_pulse(0, start=delay) - s = PulseSequence([mz_pulse]) - assert sequence == s + mz_pulse = platform.create_MZ_pulse(0) + target_sequence = PulseSequence() + if delay > 0: + target_sequence.append(Delay(delay, mz_pulse.channel)) + target_sequence.append(mz_pulse) + assert sequence == target_sequence + assert len(sequence.ro_pulses) == 1 From 86e802b6306a4bbf83dc7bcb5491d157157a02f4 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 18 Jan 2024 16:19:05 +0100 Subject: [PATCH 0100/1006] Fix Zurich tests --- tests/test_instruments_qm.py | 24 +++++ tests/test_instruments_zhinst.py | 149 +++++++++++++++++++++++++++++++ 2 files changed, 173 insertions(+) diff --git a/tests/test_instruments_qm.py b/tests/test_instruments_qm.py index f7afcb08a7..72a90f4c13 100644 --- a/tests/test_instruments_qm.py +++ b/tests/test_instruments_qm.py @@ -9,7 +9,11 @@ from qibolab.instruments.qm.acquisition import Acquisition, declare_acquisitions from qibolab.instruments.qm.controller import controllers_config from qibolab.instruments.qm.sequence import BakedPulse, QMPulse, Sequence +<<<<<<< HEAD from qibolab.pulses import Pulse, PulseSequence, PulseType, Rectangular +======= +from qibolab.pulses import Pulse, PulseType, PulseSequence, Rectangular +>>>>>>> 1b1e4cd4 (Fix Zurich tests) from qibolab.qubits import Qubit from qibolab.sweeper import Parameter, Sweeper @@ -54,12 +58,17 @@ def test_qmpulse_declare_output(acquisition_type): def test_qmsequence(): +<<<<<<< HEAD qd_pulse = Pulse( 0, 40, 0.05, int(3e9), 0.0, Rectangular(), "ch0", PulseType.DRIVE, qubit=0 ) ro_pulse = Pulse( 0, 40, 0.05, int(3e9), 0.0, Rectangular(), "ch1", PulseType.READOUT, qubit=0 ) +======= + qd_pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), "ch0", PulseType.DRIVE, qubit=0) + ro_pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), "ch1", PulseType.READOUT, qubit=0) +>>>>>>> 1b1e4cd4 (Fix Zurich tests) qmsequence = Sequence() with pytest.raises(AttributeError): qmsequence.add("test") @@ -120,6 +129,7 @@ def test_qmpulse_previous_and_next_flux(): x_pulse_end = Pulse(70, 40, 0.05, int(3e9), 0.0, Rectangular(), f"drive2", qubit=2) measure_lowfreq = Pulse( +<<<<<<< HEAD 110, 100, 0.05, @@ -140,6 +150,12 @@ def test_qmpulse_previous_and_next_flux(): "readout2", PulseType.READOUT, qubit=2, +======= + 110, 100, 0.05, int(3e9), 0.0, Rectangular(), "readout1", PulseType.READOUT, qubit=1 + ) + measure_highfreq = Pulse( + 110, 100, 0.05, int(3e9), 0.0, Rectangular(), "readout2", PulseType.READOUT, qubit=2 +>>>>>>> 1b1e4cd4 (Fix Zurich tests) ) drive11 = QMPulse(y90_pulse) @@ -362,12 +378,16 @@ def test_qm_register_flux_pulse(qmplatform): platform = qmplatform controller = platform.instruments["qm"] pulse = Pulse.flux( +<<<<<<< HEAD 0, 30, 0.005, Rectangular(), channel=platform.qubits[qubit].flux.name, qubit=qubit, +======= + 0, 30, 0.005, Rectangular(), platform.qubits[qubit].flux.name, qubit +>>>>>>> 1b1e4cd4 (Fix Zurich tests) ) target_pulse = { "operation": "control", @@ -434,7 +454,11 @@ def test_qm_register_baked_pulse(qmplatform, duration): controller = platform.instruments["qm"] controller.config.register_flux_element(qubit) pulse = Pulse.flux( +<<<<<<< HEAD 3, duration, 0.05, Rectangular(), channel=qubit.flux.name, qubit=qubit.name +======= + 3, duration, 0.05, Rectangular(), qubit.flux.name, qubit=qubit.name +>>>>>>> 1b1e4cd4 (Fix Zurich tests) ) qmpulse = BakedPulse(pulse) config = controller.config diff --git a/tests/test_instruments_zhinst.py b/tests/test_instruments_zhinst.py index 1f897c5c65..e9397fe25d 100644 --- a/tests/test_instruments_zhinst.py +++ b/tests/test_instruments_zhinst.py @@ -7,6 +7,7 @@ import pytest from qibolab import AcquisitionType, AveragingMode, ExecutionParameters, create_platform +<<<<<<< HEAD from qibolab.instruments.zhinst import ( ProcessedSweeps, ZhPulse, @@ -15,6 +16,9 @@ classify_sweepers, measure_channel_name, ) +======= +from qibolab.instruments.zhinst import ZhPulse, ZhSweeperLine, Zurich +>>>>>>> 1b1e4cd4 (Fix Zurich tests) from qibolab.pulses import ( IIR, SNZ, @@ -25,7 +29,11 @@ PulseType, Rectangular, ) +<<<<<<< HEAD from qibolab.sweeper import Parameter, Sweeper +======= +from qibolab.sweeper import Parameter, Sweeper, SweeperType +>>>>>>> 1b1e4cd4 (Fix Zurich tests) from qibolab.unrolling import batch from .conftest import get_instrument @@ -249,6 +257,24 @@ def test_zhinst_setup(dummy_qrc): def test_zhsequence(dummy_qrc): +<<<<<<< HEAD +======= + qd_pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), "ch0", qubit=0) + ro_pulse = Pulse( + 0, + 40, + 0.05, + int(3e9), + 0.0, + Rectangular(), + "ch1", + qubit=0, + type=PulseType.READOUT, + ) + sequence = PulseSequence() + sequence.append(qd_pulse) + sequence.append(ro_pulse) +>>>>>>> 1b1e4cd4 (Fix Zurich tests) IQM5q = create_platform("zurich") controller = IQM5q.instruments["EL_ZURO"] @@ -283,6 +309,7 @@ def test_zhsequence(dummy_qrc): def test_zhsequence_couplers(dummy_qrc): +<<<<<<< HEAD IQM5q = create_platform("zurich") controller = IQM5q.instruments["EL_ZURO"] @@ -291,6 +318,9 @@ def test_zhsequence_couplers(dummy_qrc): ) couplerflux_channel = IQM5q.couplers[0].flux.name qd_pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), drive_channel, qubit=0) +======= + qd_pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), "ch0", qubit=0) +>>>>>>> 1b1e4cd4 (Fix Zurich tests) ro_pulse = Pulse( 0, 40, @@ -298,6 +328,7 @@ def test_zhsequence_couplers(dummy_qrc): int(3e9), 0.0, Rectangular(), +<<<<<<< HEAD readout_channel, PulseType.READOUT, qubit=0, @@ -305,6 +336,13 @@ def test_zhsequence_couplers(dummy_qrc): qc_pulse = Pulse.flux( 0, 40, 0.05, Rectangular(), channel=couplerflux_channel, qubit=3 ) +======= + "ch1", + qubit=0, + type=PulseType.READOUT, + ) + qc_pulse = Pulse.flux(0, 40, 0.05, Rectangular(), channel="ch_c0", qubit=3) +>>>>>>> 1b1e4cd4 (Fix Zurich tests) qc_pulse.type = PulseType.COUPLERFLUX sequence = PulseSequence() sequence.append(qd_pulse) @@ -314,7 +352,59 @@ def test_zhsequence_couplers(dummy_qrc): zhsequence = controller.sequence_zh(sequence, IQM5q.qubits) assert len(zhsequence) == 3 +<<<<<<< HEAD assert len(zhsequence[couplerflux_channel]) == 1 +======= + assert len(zhsequence["readout0"]) == 1 + assert len(zhsequence["couplerflux3"]) == 1 + + +def test_zhsequence_couplers_sweeper(dummy_qrc): + ro_pulse = Pulse( + 0, + 40, + 0.05, + int(3e9), + 0.0, + Rectangular(), + "ch1", + qubit=0, + type=PulseType.READOUT, + ) + sequence = PulseSequence() + sequence.append(ro_pulse) + IQM5q = create_platform("zurich") + controller = IQM5q.instruments["EL_ZURO"] + + delta_bias_range = np.arange(-1, 1, 0.5) + + sweeper = Sweeper( + Parameter.amplitude, + delta_bias_range, + pulses=[ + CouplerFluxPulse( + start=0, + duration=sequence.duration + sequence.start, + amplitude=1, + shape="Rectangular", + qubit=IQM5q.couplers[0].name, + ) + ], + type=SweeperType.ABSOLUTE, + ) + + controller.sweepers = [sweeper] + controller.sequence_zh(sequence, IQM5q.qubits, IQM5q.couplers) + zhsequence = controller.sequence + + with pytest.raises(AttributeError): + controller.sequence_zh("sequence", IQM5q.qubits, IQM5q.couplers) + zhsequence = controller.sequence + + assert len(zhsequence) == 2 + assert len(zhsequence["readout0"]) == 1 + assert len(zhsequence["couplerflux0"]) == 0 # is it correct? +>>>>>>> 1b1e4cd4 (Fix Zurich tests) def test_zhsequence_multiple_ro(dummy_qrc): @@ -330,9 +420,15 @@ def test_zhsequence_multiple_ro(dummy_qrc): int(3e9), 0.0, Rectangular(), +<<<<<<< HEAD readout_channel, PulseType.READOUT, qubit=0, +======= + "ch1", + qubit=0, + type=PulseType.READOUT, +>>>>>>> 1b1e4cd4 (Fix Zurich tests) ) sequence.append(ro_pulse) ro_pulse = Pulse( @@ -342,9 +438,15 @@ def test_zhsequence_multiple_ro(dummy_qrc): int(3e9), 0.0, Rectangular(), +<<<<<<< HEAD readout_channel, PulseType.READOUT, qubit=0, +======= + "ch1", + qubit=0, + type=PulseType.READOUT, +>>>>>>> 1b1e4cd4 (Fix Zurich tests) ) sequence.append(ro_pulse) platform = create_platform("zurich") @@ -499,9 +601,23 @@ def test_sweep_and_play_sim(dummy_qrc): ro_pulses = {} qf_pulses = {} +<<<<<<< HEAD for qubit in qubits.values(): q = qubit.name qf_pulses[q] = Pulse.flux( +======= + fr_pulses = {} + for qubit in qubits: + if fast_reset: + fr_pulses[qubit] = platform.create_RX_pulse(qubit, start=0) + qd_pulses[qubit] = platform.create_RX_pulse(qubit, start=0) + sequence.append(qd_pulses[qubit]) + ro_pulses[qubit] = platform.create_qubit_readout_pulse( + qubit, start=qd_pulses[qubit].finish + ) + sequence.append(ro_pulses[qubit]) + qf_pulses[qubit] = Pulse.flux( +>>>>>>> 1b1e4cd4 (Fix Zurich tests) start=0, duration=500, amplitude=1, @@ -813,8 +929,41 @@ def test_experiment_sweep_punchouts(dummy_qrc, parameter): IQM5q.experiment_flow(qubits, couplers, sequence, options) +<<<<<<< HEAD assert measure_channel_name(qubits[0]) in IQM5q.experiment.signals assert acquire_channel_name(qubits[0]) in IQM5q.experiment.signals +======= + assert "measure0" in IQM5q.experiment.signals + assert "acquire0" in IQM5q.experiment.signals + + +# TODO: Fix this +def test_sim(dummy_qrc): + platform = create_platform("zurich") + IQM5q = platform.instruments["EL_ZURO"] + sequence = PulseSequence() + qubits = {0: platform.qubits[0]} + platform.qubits = qubits + ro_pulses = {} + qd_pulses = {} + qf_pulses = {} + for qubit in qubits: + qd_pulses[qubit] = platform.create_RX_pulse(qubit, start=0) + sequence.append(qd_pulses[qubit]) + ro_pulses[qubit] = platform.create_qubit_readout_pulse( + qubit, start=qd_pulses[qubit].finish + ) + sequence.append(ro_pulses[qubit]) + qf_pulses[qubit] = Pulse.flux( + start=0, + duration=500, + amplitude=1, + shape=Rectangular(), + channel=platform.qubits[qubit].flux.name, + qubit=qubit, + ) + sequence.append(qf_pulses[qubit]) +>>>>>>> 1b1e4cd4 (Fix Zurich tests) def test_batching(dummy_qrc): From 6a436cfa014de8b888c5d67fc55b68c601b04225 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Wed, 21 Feb 2024 17:32:52 +0400 Subject: [PATCH 0101/1006] test: fix conflicts in tests --- tests/test_instruments_zhinst.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/test_instruments_zhinst.py b/tests/test_instruments_zhinst.py index e9397fe25d..f5ea1ad9fc 100644 --- a/tests/test_instruments_zhinst.py +++ b/tests/test_instruments_zhinst.py @@ -382,10 +382,13 @@ def test_zhsequence_couplers_sweeper(dummy_qrc): Parameter.amplitude, delta_bias_range, pulses=[ - CouplerFluxPulse( + Pulse( start=0, duration=sequence.duration + sequence.start, amplitude=1, + frequency=0, + relative_phase=0, + type=PulseType.COUPLERFLUX, shape="Rectangular", qubit=IQM5q.couplers[0].name, ) From afc6f380a41ea7634cd65314b904b7cf049b6ee0 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 21 Mar 2024 13:15:26 +0400 Subject: [PATCH 0102/1006] fix: tests after merging (compiler tests still failing) --- src/qibolab/instruments/zhinst/pulse.py | 3 +- src/qibolab/instruments/zhinst/sweep.py | 2 +- src/qibolab/platform/platform.py | 2 +- tests/test_compilers_default.py | 6 +- tests/test_instruments_qm.py | 24 ---- tests/test_instruments_zhinst.py | 163 +----------------------- tests/test_platform.py | 4 +- tests/test_unrolling.py | 24 ++-- 8 files changed, 27 insertions(+), 201 deletions(-) diff --git a/src/qibolab/instruments/zhinst/pulse.py b/src/qibolab/instruments/zhinst/pulse.py index c187f5170d..c26e8321cb 100644 --- a/src/qibolab/instruments/zhinst/pulse.py +++ b/src/qibolab/instruments/zhinst/pulse.py @@ -86,7 +86,7 @@ def __init__(self, pulse): """Laboneq sweep parameter if the delay of the pulse should be swept.""" - # pylint: disable=R0903 + # pylint: disable=R0903,E1101 def add_sweeper(self, param: Parameter, sweeper: lo.SweepParameter): """Add sweeper to list of sweepers associated with this pulse.""" if param in { @@ -97,6 +97,7 @@ def add_sweeper(self, param: Parameter, sweeper: lo.SweepParameter): }: self.zhsweepers.append((param, sweeper)) elif param is Parameter.start: + # TODO: Change this case to ``Delay.duration`` if self.delay_sweeper: raise ValueError( "Cannot have multiple delay sweepers for a single pulse" diff --git a/src/qibolab/instruments/zhinst/sweep.py b/src/qibolab/instruments/zhinst/sweep.py index d2371c79e4..4b918aa1e4 100644 --- a/src/qibolab/instruments/zhinst/sweep.py +++ b/src/qibolab/instruments/zhinst/sweep.py @@ -62,7 +62,7 @@ def __init__(self, sweepers: Iterable[Sweeper], qubits: dict[str, Qubit]): parallel_sweeps = [] for sweeper in sweepers: for pulse in sweeper.pulses or []: - if sweeper.parameter in (Parameter.duration, Parameter.start): + if sweeper.parameter is Parameter.duration: sweep_param = lo.SweepParameter( values=sweeper.values * NANO_TO_SECONDS ) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index c0e8c5c2b3..618764ca17 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -10,7 +10,7 @@ from qibolab.couplers import Coupler from qibolab.execution_parameters import ExecutionParameters from qibolab.instruments.abstract import Controller, Instrument, InstrumentId -from qibolab.pulses import Drag, PulseSequence, PulseType +from qibolab.pulses import Delay, Drag, PulseSequence, PulseType from qibolab.qubits import Qubit, QubitId, QubitPair, QubitPairId from qibolab.sweeper import Sweeper from qibolab.unrolling import batch diff --git a/tests/test_compilers_default.py b/tests/test_compilers_default.py index f0aaa2d89b..6c7c9172c6 100644 --- a/tests/test_compilers_default.py +++ b/tests/test_compilers_default.py @@ -37,7 +37,7 @@ def compile_circuit(circuit, platform): @pytest.mark.parametrize( - "gateargs,sequence_len", + "gateargs", [ (gates.I,), (gates.Z,), @@ -47,7 +47,7 @@ def compile_circuit(circuit, platform): (gates.U3, 0.1, 0.2, 0.3), ], ) -def test_compile(platform, gateargs, sequence_len): +def test_compile(platform, gateargs): nqubits = platform.nqubits if gateargs[0] is gates.U3: nseq = 2 @@ -57,7 +57,7 @@ def test_compile(platform, gateargs, sequence_len): nseq = 0 circuit = generate_circuit_with_gate(nqubits, *gateargs) sequence = compile_circuit(circuit, platform) - assert len(sequence) == nqubits * sequence_len + assert len(sequence) == nqubits * nseq def test_compile_two_gates(platform): diff --git a/tests/test_instruments_qm.py b/tests/test_instruments_qm.py index 72a90f4c13..f7afcb08a7 100644 --- a/tests/test_instruments_qm.py +++ b/tests/test_instruments_qm.py @@ -9,11 +9,7 @@ from qibolab.instruments.qm.acquisition import Acquisition, declare_acquisitions from qibolab.instruments.qm.controller import controllers_config from qibolab.instruments.qm.sequence import BakedPulse, QMPulse, Sequence -<<<<<<< HEAD from qibolab.pulses import Pulse, PulseSequence, PulseType, Rectangular -======= -from qibolab.pulses import Pulse, PulseType, PulseSequence, Rectangular ->>>>>>> 1b1e4cd4 (Fix Zurich tests) from qibolab.qubits import Qubit from qibolab.sweeper import Parameter, Sweeper @@ -58,17 +54,12 @@ def test_qmpulse_declare_output(acquisition_type): def test_qmsequence(): -<<<<<<< HEAD qd_pulse = Pulse( 0, 40, 0.05, int(3e9), 0.0, Rectangular(), "ch0", PulseType.DRIVE, qubit=0 ) ro_pulse = Pulse( 0, 40, 0.05, int(3e9), 0.0, Rectangular(), "ch1", PulseType.READOUT, qubit=0 ) -======= - qd_pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), "ch0", PulseType.DRIVE, qubit=0) - ro_pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), "ch1", PulseType.READOUT, qubit=0) ->>>>>>> 1b1e4cd4 (Fix Zurich tests) qmsequence = Sequence() with pytest.raises(AttributeError): qmsequence.add("test") @@ -129,7 +120,6 @@ def test_qmpulse_previous_and_next_flux(): x_pulse_end = Pulse(70, 40, 0.05, int(3e9), 0.0, Rectangular(), f"drive2", qubit=2) measure_lowfreq = Pulse( -<<<<<<< HEAD 110, 100, 0.05, @@ -150,12 +140,6 @@ def test_qmpulse_previous_and_next_flux(): "readout2", PulseType.READOUT, qubit=2, -======= - 110, 100, 0.05, int(3e9), 0.0, Rectangular(), "readout1", PulseType.READOUT, qubit=1 - ) - measure_highfreq = Pulse( - 110, 100, 0.05, int(3e9), 0.0, Rectangular(), "readout2", PulseType.READOUT, qubit=2 ->>>>>>> 1b1e4cd4 (Fix Zurich tests) ) drive11 = QMPulse(y90_pulse) @@ -378,16 +362,12 @@ def test_qm_register_flux_pulse(qmplatform): platform = qmplatform controller = platform.instruments["qm"] pulse = Pulse.flux( -<<<<<<< HEAD 0, 30, 0.005, Rectangular(), channel=platform.qubits[qubit].flux.name, qubit=qubit, -======= - 0, 30, 0.005, Rectangular(), platform.qubits[qubit].flux.name, qubit ->>>>>>> 1b1e4cd4 (Fix Zurich tests) ) target_pulse = { "operation": "control", @@ -454,11 +434,7 @@ def test_qm_register_baked_pulse(qmplatform, duration): controller = platform.instruments["qm"] controller.config.register_flux_element(qubit) pulse = Pulse.flux( -<<<<<<< HEAD 3, duration, 0.05, Rectangular(), channel=qubit.flux.name, qubit=qubit.name -======= - 3, duration, 0.05, Rectangular(), qubit.flux.name, qubit=qubit.name ->>>>>>> 1b1e4cd4 (Fix Zurich tests) ) qmpulse = BakedPulse(pulse) config = controller.config diff --git a/tests/test_instruments_zhinst.py b/tests/test_instruments_zhinst.py index f5ea1ad9fc..094b8fcefa 100644 --- a/tests/test_instruments_zhinst.py +++ b/tests/test_instruments_zhinst.py @@ -7,7 +7,6 @@ import pytest from qibolab import AcquisitionType, AveragingMode, ExecutionParameters, create_platform -<<<<<<< HEAD from qibolab.instruments.zhinst import ( ProcessedSweeps, ZhPulse, @@ -16,9 +15,6 @@ classify_sweepers, measure_channel_name, ) -======= -from qibolab.instruments.zhinst import ZhPulse, ZhSweeperLine, Zurich ->>>>>>> 1b1e4cd4 (Fix Zurich tests) from qibolab.pulses import ( IIR, SNZ, @@ -29,11 +25,7 @@ PulseType, Rectangular, ) -<<<<<<< HEAD from qibolab.sweeper import Parameter, Sweeper -======= -from qibolab.sweeper import Parameter, Sweeper, SweeperType ->>>>>>> 1b1e4cd4 (Fix Zurich tests) from qibolab.unrolling import batch from .conftest import get_instrument @@ -42,13 +34,12 @@ @pytest.mark.parametrize( "pulse", [ - Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), "ch0", qubit=0), - Pulse(0, 40, 0.05, int(3e9), 0.0, Gaussian(5), "ch0", qubit=0), - Pulse(0, 40, 0.05, int(3e9), 0.0, Gaussian(5), "ch0", qubit=0), - Pulse(0, 40, 0.05, int(3e9), 0.0, Drag(5, 0.4), "ch0", qubit=0), - Pulse(0, 40, 0.05, int(3e9), 0.0, SNZ(10, 0.01), "ch0", qubit=0), + Pulse(40, 0.05, int(3e9), 0.0, Rectangular(), "ch0", qubit=0), + Pulse(40, 0.05, int(3e9), 0.0, Gaussian(5), "ch0", qubit=0), + Pulse(40, 0.05, int(3e9), 0.0, Gaussian(5), "ch0", qubit=0), + Pulse(40, 0.05, int(3e9), 0.0, Drag(5, 0.4), "ch0", qubit=0), + Pulse(40, 0.05, int(3e9), 0.0, SNZ(10, 0.01), "ch0", qubit=0), Pulse( - 0, 40, 0.05, int(3e9), @@ -257,24 +248,6 @@ def test_zhinst_setup(dummy_qrc): def test_zhsequence(dummy_qrc): -<<<<<<< HEAD -======= - qd_pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), "ch0", qubit=0) - ro_pulse = Pulse( - 0, - 40, - 0.05, - int(3e9), - 0.0, - Rectangular(), - "ch1", - qubit=0, - type=PulseType.READOUT, - ) - sequence = PulseSequence() - sequence.append(qd_pulse) - sequence.append(ro_pulse) ->>>>>>> 1b1e4cd4 (Fix Zurich tests) IQM5q = create_platform("zurich") controller = IQM5q.instruments["EL_ZURO"] @@ -309,7 +282,6 @@ def test_zhsequence(dummy_qrc): def test_zhsequence_couplers(dummy_qrc): -<<<<<<< HEAD IQM5q = create_platform("zurich") controller = IQM5q.instruments["EL_ZURO"] @@ -318,9 +290,6 @@ def test_zhsequence_couplers(dummy_qrc): ) couplerflux_channel = IQM5q.couplers[0].flux.name qd_pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), drive_channel, qubit=0) -======= - qd_pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), "ch0", qubit=0) ->>>>>>> 1b1e4cd4 (Fix Zurich tests) ro_pulse = Pulse( 0, 40, @@ -328,7 +297,6 @@ def test_zhsequence_couplers(dummy_qrc): int(3e9), 0.0, Rectangular(), -<<<<<<< HEAD readout_channel, PulseType.READOUT, qubit=0, @@ -336,13 +304,6 @@ def test_zhsequence_couplers(dummy_qrc): qc_pulse = Pulse.flux( 0, 40, 0.05, Rectangular(), channel=couplerflux_channel, qubit=3 ) -======= - "ch1", - qubit=0, - type=PulseType.READOUT, - ) - qc_pulse = Pulse.flux(0, 40, 0.05, Rectangular(), channel="ch_c0", qubit=3) ->>>>>>> 1b1e4cd4 (Fix Zurich tests) qc_pulse.type = PulseType.COUPLERFLUX sequence = PulseSequence() sequence.append(qd_pulse) @@ -352,62 +313,7 @@ def test_zhsequence_couplers(dummy_qrc): zhsequence = controller.sequence_zh(sequence, IQM5q.qubits) assert len(zhsequence) == 3 -<<<<<<< HEAD assert len(zhsequence[couplerflux_channel]) == 1 -======= - assert len(zhsequence["readout0"]) == 1 - assert len(zhsequence["couplerflux3"]) == 1 - - -def test_zhsequence_couplers_sweeper(dummy_qrc): - ro_pulse = Pulse( - 0, - 40, - 0.05, - int(3e9), - 0.0, - Rectangular(), - "ch1", - qubit=0, - type=PulseType.READOUT, - ) - sequence = PulseSequence() - sequence.append(ro_pulse) - IQM5q = create_platform("zurich") - controller = IQM5q.instruments["EL_ZURO"] - - delta_bias_range = np.arange(-1, 1, 0.5) - - sweeper = Sweeper( - Parameter.amplitude, - delta_bias_range, - pulses=[ - Pulse( - start=0, - duration=sequence.duration + sequence.start, - amplitude=1, - frequency=0, - relative_phase=0, - type=PulseType.COUPLERFLUX, - shape="Rectangular", - qubit=IQM5q.couplers[0].name, - ) - ], - type=SweeperType.ABSOLUTE, - ) - - controller.sweepers = [sweeper] - controller.sequence_zh(sequence, IQM5q.qubits, IQM5q.couplers) - zhsequence = controller.sequence - - with pytest.raises(AttributeError): - controller.sequence_zh("sequence", IQM5q.qubits, IQM5q.couplers) - zhsequence = controller.sequence - - assert len(zhsequence) == 2 - assert len(zhsequence["readout0"]) == 1 - assert len(zhsequence["couplerflux0"]) == 0 # is it correct? ->>>>>>> 1b1e4cd4 (Fix Zurich tests) def test_zhsequence_multiple_ro(dummy_qrc): @@ -423,15 +329,9 @@ def test_zhsequence_multiple_ro(dummy_qrc): int(3e9), 0.0, Rectangular(), -<<<<<<< HEAD readout_channel, PulseType.READOUT, qubit=0, -======= - "ch1", - qubit=0, - type=PulseType.READOUT, ->>>>>>> 1b1e4cd4 (Fix Zurich tests) ) sequence.append(ro_pulse) ro_pulse = Pulse( @@ -441,15 +341,9 @@ def test_zhsequence_multiple_ro(dummy_qrc): int(3e9), 0.0, Rectangular(), -<<<<<<< HEAD readout_channel, PulseType.READOUT, qubit=0, -======= - "ch1", - qubit=0, - type=PulseType.READOUT, ->>>>>>> 1b1e4cd4 (Fix Zurich tests) ) sequence.append(ro_pulse) platform = create_platform("zurich") @@ -604,23 +498,9 @@ def test_sweep_and_play_sim(dummy_qrc): ro_pulses = {} qf_pulses = {} -<<<<<<< HEAD for qubit in qubits.values(): q = qubit.name qf_pulses[q] = Pulse.flux( -======= - fr_pulses = {} - for qubit in qubits: - if fast_reset: - fr_pulses[qubit] = platform.create_RX_pulse(qubit, start=0) - qd_pulses[qubit] = platform.create_RX_pulse(qubit, start=0) - sequence.append(qd_pulses[qubit]) - ro_pulses[qubit] = platform.create_qubit_readout_pulse( - qubit, start=qd_pulses[qubit].finish - ) - sequence.append(ro_pulses[qubit]) - qf_pulses[qubit] = Pulse.flux( ->>>>>>> 1b1e4cd4 (Fix Zurich tests) start=0, duration=500, amplitude=1, @@ -932,41 +812,8 @@ def test_experiment_sweep_punchouts(dummy_qrc, parameter): IQM5q.experiment_flow(qubits, couplers, sequence, options) -<<<<<<< HEAD assert measure_channel_name(qubits[0]) in IQM5q.experiment.signals assert acquire_channel_name(qubits[0]) in IQM5q.experiment.signals -======= - assert "measure0" in IQM5q.experiment.signals - assert "acquire0" in IQM5q.experiment.signals - - -# TODO: Fix this -def test_sim(dummy_qrc): - platform = create_platform("zurich") - IQM5q = platform.instruments["EL_ZURO"] - sequence = PulseSequence() - qubits = {0: platform.qubits[0]} - platform.qubits = qubits - ro_pulses = {} - qd_pulses = {} - qf_pulses = {} - for qubit in qubits: - qd_pulses[qubit] = platform.create_RX_pulse(qubit, start=0) - sequence.append(qd_pulses[qubit]) - ro_pulses[qubit] = platform.create_qubit_readout_pulse( - qubit, start=qd_pulses[qubit].finish - ) - sequence.append(ro_pulses[qubit]) - qf_pulses[qubit] = Pulse.flux( - start=0, - duration=500, - amplitude=1, - shape=Rectangular(), - channel=platform.qubits[qubit].flux.name, - qubit=qubit, - ) - sequence.append(qf_pulses[qubit]) ->>>>>>> 1b1e4cd4 (Fix Zurich tests) def test_batching(dummy_qrc): diff --git a/tests/test_platform.py b/tests/test_platform.py index c248408987..1f08e89a5c 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -415,7 +415,9 @@ def test_create_RX_drag_pulses(): for qubit in qubits: drag_pi = platform.create_RX_drag_pulse(qubit, 0, beta=beta) assert drag_pi.shape == Drag(drag_pi.shape.rel_sigma, beta=beta) - drag_pi_half = platform.create_RX90_drag_pulse(qubit, drag_pi.finish, beta=beta) + drag_pi_half = platform.create_RX90_drag_pulse( + qubit, drag_pi.duration, beta=beta + ) assert drag_pi_half.shape == Drag(drag_pi_half.shape.rel_sigma, beta=beta) np.testing.assert_almost_equal(drag_pi.amplitude, 2 * drag_pi_half.amplitude) diff --git a/tests/test_unrolling.py b/tests/test_unrolling.py index 27d99e6517..ce4d4e0794 100644 --- a/tests/test_unrolling.py +++ b/tests/test_unrolling.py @@ -7,13 +7,13 @@ def test_bounds_update(): - p1 = Pulse(400, 40, 0.9, int(100e6), 0, Drag(5, 1), 3, PulseType.DRIVE) - p2 = Pulse(500, 40, 0.9, int(100e6), 0, Drag(5, 1), 2, PulseType.DRIVE) - p3 = Pulse(600, 40, 0.9, int(100e6), 0, Drag(5, 1), 1, PulseType.DRIVE) + p1 = Pulse(40, 0.9, int(100e6), 0, Drag(5, 1), 3, PulseType.DRIVE) + p2 = Pulse(40, 0.9, int(100e6), 0, Drag(5, 1), 2, PulseType.DRIVE) + p3 = Pulse(40, 0.9, int(100e6), 0, Drag(5, 1), 1, PulseType.DRIVE) - p4 = Pulse(440, 1000, 0.9, int(20e6), 0, Rectangular(), 3, PulseType.READOUT) - p5 = Pulse(540, 1000, 0.9, int(20e6), 0, Rectangular(), 2, PulseType.READOUT) - p6 = Pulse(640, 1000, 0.9, int(20e6), 0, Rectangular(), 1, PulseType.READOUT) + p4 = Pulse(1000, 0.9, int(20e6), 0, Rectangular(), 3, PulseType.READOUT) + p5 = Pulse(1000, 0.9, int(20e6), 0, Rectangular(), 2, PulseType.READOUT) + p6 = Pulse(1000, 0.9, int(20e6), 0, Rectangular(), 1, PulseType.READOUT) ps = PulseSequence([p1, p2, p3, p4, p5, p6]) bounds = Bounds.update(ps) @@ -51,13 +51,13 @@ def test_bounds_comparison(): ], ) def test_batch(bounds): - p1 = Pulse(400, 40, 0.9, int(100e6), 0, Drag(5, 1), 3, PulseType.DRIVE) - p2 = Pulse(500, 40, 0.9, int(100e6), 0, Drag(5, 1), 2, PulseType.DRIVE) - p3 = Pulse(600, 40, 0.9, int(100e6), 0, Drag(5, 1), 1, PulseType.DRIVE) + p1 = Pulse(40, 0.9, int(100e6), 0, Drag(5, 1), 3, PulseType.DRIVE) + p2 = Pulse(40, 0.9, int(100e6), 0, Drag(5, 1), 2, PulseType.DRIVE) + p3 = Pulse(40, 0.9, int(100e6), 0, Drag(5, 1), 1, PulseType.DRIVE) - p4 = Pulse(440, 1000, 0.9, int(20e6), 0, Rectangular(), 3, PulseType.READOUT) - p5 = Pulse(540, 1000, 0.9, int(20e6), 0, Rectangular(), 2, PulseType.READOUT) - p6 = Pulse(640, 1000, 0.9, int(20e6), 0, Rectangular(), 1, PulseType.READOUT) + p4 = Pulse(1000, 0.9, int(20e6), 0, Rectangular(), 3, PulseType.READOUT) + p5 = Pulse(1000, 0.9, int(20e6), 0, Rectangular(), 2, PulseType.READOUT) + p6 = Pulse(1000, 0.9, int(20e6), 0, Rectangular(), 1, PulseType.READOUT) ps = PulseSequence([p1, p2, p3, p4, p5, p6]) From 0703f231355608881c163cb2b8a2955007452abf Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 21 Mar 2024 09:15:52 +0000 Subject: [PATCH 0103/1006] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/qibolab/instruments/qblox/cluster_qrm_rf.py | 13 +++++++------ tests/test_instruments_qmsim.py | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/qibolab/instruments/qblox/cluster_qrm_rf.py b/src/qibolab/instruments/qblox/cluster_qrm_rf.py index bcd1d7dcd7..9d582e8598 100644 --- a/src/qibolab/instruments/qblox/cluster_qrm_rf.py +++ b/src/qibolab/instruments/qblox/cluster_qrm_rf.py @@ -1,4 +1,5 @@ """Qblox Cluster QRM-RF driver.""" + import copy import json import time @@ -992,9 +993,9 @@ def acquire(self): if len(sequencer.pulses.ro_pulses) == 1: pulse = sequencer.pulses.ro_pulses[0] frequency = self.get_if(pulse) - acquisitions[pulse.qubit] = acquisitions[ - pulse.id - ] = AveragedAcquisition(scope, duration, frequency) + acquisitions[pulse.qubit] = acquisitions[pulse.id] = ( + AveragedAcquisition(scope, duration, frequency) + ) else: raise RuntimeError( "Software Demodulation only supports one acquisition per channel. " @@ -1004,9 +1005,9 @@ def acquire(self): results = self.device.get_acquisitions(sequencer.number) for pulse in sequencer.pulses.ro_pulses: bins = results[pulse.id]["acquisition"]["bins"] - acquisitions[pulse.qubit] = acquisitions[ - pulse.id - ] = DemodulatedAcquisition(scope, bins, duration) + acquisitions[pulse.qubit] = acquisitions[pulse.id] = ( + DemodulatedAcquisition(scope, bins, duration) + ) # TODO: to be updated once the functionality of ExecutionResults is extended return {key: acquisition for key, acquisition in acquisitions.items()} diff --git a/tests/test_instruments_qmsim.py b/tests/test_instruments_qmsim.py index 9c20eaac9d..6b7cf83dfb 100644 --- a/tests/test_instruments_qmsim.py +++ b/tests/test_instruments_qmsim.py @@ -23,7 +23,7 @@ from qibolab import AcquisitionType, AveragingMode, ExecutionParameters, create_platform from qibolab.backends import QibolabBackend -from qibolab.pulses import Pulse, SNZ, PulseSequence, Rectangular +from qibolab.pulses import SNZ, Pulse, PulseSequence, Rectangular from qibolab.sweeper import Parameter, Sweeper from .conftest import set_platform_profile From 86a2a5959dbc0c16f9cc4e473bd9df79988cfe8d Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 21 Mar 2024 13:33:04 +0400 Subject: [PATCH 0104/1006] fix: compiler tests --- tests/test_compilers_default.py | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/tests/test_compilers_default.py b/tests/test_compilers_default.py index 6c7c9172c6..e226137cfa 100644 --- a/tests/test_compilers_default.py +++ b/tests/test_compilers_default.py @@ -37,27 +37,21 @@ def compile_circuit(circuit, platform): @pytest.mark.parametrize( - "gateargs", + "gateargs,sequence_len", [ - (gates.I,), - (gates.Z,), - (gates.GPI, np.pi / 8), - (gates.GPI2, -np.pi / 8), - (gates.RZ, np.pi / 4), - (gates.U3, 0.1, 0.2, 0.3), + ((gates.I,), 1), + ((gates.Z,), 2), + ((gates.GPI, np.pi / 8), 3), + ((gates.GPI2, -np.pi / 8), 3), + ((gates.RZ, np.pi / 4), 2), + ((gates.U3, 0.1, 0.2, 0.3), 10), ], ) -def test_compile(platform, gateargs): +def test_compile(platform, gateargs, sequence_len): nqubits = platform.nqubits - if gateargs[0] is gates.U3: - nseq = 2 - elif gateargs[0] in (gates.GPI, gates.GPI2): - nseq = 1 - else: - nseq = 0 circuit = generate_circuit_with_gate(nqubits, *gateargs) sequence = compile_circuit(circuit, platform) - assert len(sequence) == nqubits * nseq + assert len(sequence) == nqubits * sequence_len def test_compile_two_gates(platform): @@ -68,7 +62,7 @@ def test_compile_two_gates(platform): sequence = compile_circuit(circuit, platform) - assert len(sequence) == 4 + assert len(sequence) == 13 assert len(sequence.qd_pulses) == 3 assert len(sequence.ro_pulses) == 1 @@ -166,8 +160,8 @@ def test_cz_to_sequence(): circuit.add(gates.CZ(1, 2)) sequence = compile_circuit(circuit, platform) - test_sequence, virtual_z_phases = platform.create_CZ_pulse_sequence((2, 1)) - assert sequence == test_sequence + test_sequence = platform.create_CZ_pulse_sequence((2, 1)) + assert sequence[0] == test_sequence[0] def test_cnot_to_sequence(): From 3f5ab798d4e94524069eb2381525be39619a2026 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 21 Mar 2024 17:17:47 +0400 Subject: [PATCH 0105/1006] refactor: simplify compiler rules --- src/qibolab/compilers/compiler.py | 29 ++++++++++++++++++++++++++--- src/qibolab/compilers/default.py | 30 ++++++++++-------------------- 2 files changed, 36 insertions(+), 23 deletions(-) diff --git a/src/qibolab/compilers/compiler.py b/src/qibolab/compilers/compiler.py index 938acdc566..191971e800 100644 --- a/src/qibolab/compilers/compiler.py +++ b/src/qibolab/compilers/compiler.py @@ -98,6 +98,31 @@ def inner(func): return inner + def get_sequence(self, gate, platform): + """Get pulse sequence implementing the given gate using the registered + rules. + + Args: + gate (:class:`qibo.gates.Gate`): Qibo gate to convert to pulses. + platform (:class:`qibolab.platform.Platform`): Qibolab platform to read the native gates from. + """ + # get local sequence for the current gate + rule = self[type(gate)] + if isinstance(gate, gates.M): + qubits = [platform.get_qubit(q) for q in gate.qubits] + gate_sequence = rule(gate, qubits) + elif len(gate.qubits) == 1: + qubit = platform.get_qubit(gate.target_qubits[0]) + gate_sequence = rule(gate, qubit) + elif len(gate.qubits) == 2: + pair = platform.pairs[ + tuple(platform.get_qubit(q).name for q in gate.qubits) + ] + gate_sequence = rule(gate, pair) + else: + raise NotImplementedError(f"{type(gate)} is not a native gate.") + return gate_sequence + def compile(self, circuit, platform): """Transforms a circuit to pulse sequence. @@ -126,9 +151,7 @@ def compile(self, circuit, platform): qubit_clock[qubit] += gate.delay continue - rule = self[gate.__class__] - # get local sequence and phases for the current gate - gate_sequence = rule(gate, platform) + gate_sequence = self.get_sequence(gate, platform) for pulse in gate_sequence: if qubit_clock[pulse.qubit] > channel_clock[pulse.qubit]: delay = qubit_clock[pulse.qubit] - channel_clock[pulse.channel] diff --git a/src/qibolab/compilers/default.py b/src/qibolab/compilers/default.py index 3e02ac25f2..bad8eb4ea9 100644 --- a/src/qibolab/compilers/default.py +++ b/src/qibolab/compilers/default.py @@ -9,30 +9,27 @@ from qibolab.pulses import PulseSequence, VirtualZ -def identity_rule(gate, platform): +def identity_rule(gate, qubit): """Identity gate skipped.""" return PulseSequence() -def z_rule(gate, platform): +def z_rule(gate, qubit): """Z gate applied virtually.""" - qubit = platform.get_qubit(gate.target_qubits[0]) return PulseSequence( [VirtualZ(phase=math.pi, channel=qubit.drive.name, qubit=qubit.name)] ) -def rz_rule(gate, platform): +def rz_rule(gate, qubit): """RZ gate applied virtually.""" - qubit = platform.get_qubit(gate.target_qubits[0]) return PulseSequence( [VirtualZ(phase=gate.parameters[0], channel=qubit.drive.name, qubit=qubit.name)] ) -def gpi2_rule(gate, platform): +def gpi2_rule(gate, qubit): """Rule for GPI2.""" - qubit = platform.get_qubit(gate.target_qubits[0]) theta = gate.parameters[0] sequence = PulseSequence() pulse = qubit.native_gates.RX90 @@ -41,9 +38,8 @@ def gpi2_rule(gate, platform): return sequence -def gpi_rule(gate, platform): +def gpi_rule(gate, qubit): """Rule for GPI.""" - qubit = platform.get_qubit(gate.target_qubits[0]) theta = gate.parameters[0] sequence = PulseSequence() # the following definition has a global phase difference compare to @@ -56,9 +52,8 @@ def gpi_rule(gate, platform): return sequence -def u3_rule(gate, platform): +def u3_rule(gate, qubit): """U3 applied as RZ-RX90-RZ-RX90-RZ.""" - qubit = platform.get_qubit(gate.target_qubits[0]) # Transform gate to U3 and add pi/2-pulses theta, phi, lam = gate.parameters # apply RZ(lam) @@ -76,25 +71,20 @@ def u3_rule(gate, platform): return sequence -def cz_rule(gate, platform): +def cz_rule(gate, pair): """CZ applied as defined in the platform runcard. Applying the CZ gate may involve sending pulses on qubits that the gate is not directly acting on. """ - pair = platform.pairs[tuple(platform.get_qubit(q).name for q in gate.qubits)] return pair.native_gates.CZ -def cnot_rule(gate, platform): +def cnot_rule(gate, pair): """CNOT applied as defined in the platform runcard.""" - pair = platform.pairs[tuple(platform.get_qubit(q).name for q in gate.qubits)] return pair.native_gates.CNOT -def measurement_rule(gate, platform): +def measurement_rule(gate, qubits): """Measurement gate applied using the platform readout pulse.""" - sequence = PulseSequence( - [platform.get_qubit(q).native_gates.MZ for q in gate.qubits] - ) - return sequence + return PulseSequence([qubit.native_gates.MZ for qubit in qubits]) From 1f351476811124185618ea1b956fcce275a79936 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 21 Mar 2024 17:36:46 +0400 Subject: [PATCH 0106/1006] refactor: native two qubit to empty PulseSequence --- src/qibolab/native.py | 14 ++++++++++---- src/qibolab/platform/platform.py | 8 ++++---- src/qibolab/serialize.py | 15 +++++++-------- 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/src/qibolab/native.py b/src/qibolab/native.py index 8badc50918..bbf55bb351 100644 --- a/src/qibolab/native.py +++ b/src/qibolab/native.py @@ -29,15 +29,21 @@ class TwoQubitNatives: """Container with the native two-qubit gates acting on a specific pair of qubits.""" - CZ: Optional[PulseSequence] = field(default=None, metadata={"symmetric": True}) - CNOT: Optional[PulseSequence] = field(default=None, metadata={"symmetric": False}) - iSWAP: Optional[PulseSequence] = field(default=None, metadata={"symmetric": True}) + CZ: PulseSequence = field( + default_factory=lambda: PulseSequence(), metadata={"symmetric": True} + ) + CNOT: PulseSequence = field( + default_factory=lambda: PulseSequence(), metadata={"symmetric": False} + ) + iSWAP: PulseSequence = field( + default_factory=lambda: PulseSequence(), metadata={"symmetric": True} + ) @property def symmetric(self): """Check if the defined two-qubit gates are symmetric between target and control qubits.""" return all( - fld.metadata["symmetric"] or getattr(self, fld.name) is None + fld.metadata["symmetric"] or len(getattr(self, fld.name)) == 0 for fld in fields(self) ) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 618764ca17..50d90101f9 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -160,7 +160,7 @@ def _set_channels_to_two_qubit_gates(self): gates = pair.native_gates for fld in fields(gates): sequence = getattr(gates, fld.name) - if sequence is not None: + if len(sequence) > 0: new_sequence = PulseSequence() for pulse in sequence: if pulse.type is PulseType.VIRTUALZ: @@ -413,7 +413,7 @@ def create_RX12_pulse(self, qubit, relative_phase=0): def create_CZ_pulse_sequence(self, qubits): pair = tuple(self.get_qubit(q).name for q in qubits) - if pair not in self.pairs or self.pairs[pair].native_gates.CZ is None: + if pair not in self.pairs or len(self.pairs[pair].native_gates.CZ) == 0: raise_error( ValueError, f"Calibration for CZ gate between qubits {qubits[0]} and {qubits[1]} not found.", @@ -422,7 +422,7 @@ def create_CZ_pulse_sequence(self, qubits): def create_iSWAP_pulse_sequence(self, qubits): pair = tuple(self.get_qubit(q).name for q in qubits) - if pair not in self.pairs or self.pairs[pair].native_gates.iSWAP is None: + if pair not in self.pairs or len(self.pairs[pair].native_gates.iSWAP) == 0: raise_error( ValueError, f"Calibration for iSWAP gate between qubits {qubits[0]} and {qubits[1]} not found.", @@ -431,7 +431,7 @@ def create_iSWAP_pulse_sequence(self, qubits): def create_CNOT_pulse_sequence(self, qubits): pair = tuple(self.get_qubit(q).name for q in qubits) - if pair not in self.pairs or self.pairs[pair].native_gates.CNOT is None: + if pair not in self.pairs or len(self.pairs[pair].native_gates.CNOT) == 0: raise_error( ValueError, f"Calibration for CNOT gate between qubits {qubits[0]} and {qubits[1]} not found.", diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index 8cb3cd2c71..251099c72e 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -218,15 +218,14 @@ def _dump_single_qubit_natives(natives: SingleQubitNatives): def _dump_two_qubit_natives(natives: TwoQubitNatives): data = {} for fld in fields(natives): - if getattr(natives, fld.name) is None: - continue sequence = getattr(natives, fld.name) - data[fld.name] = [] - for pulse in sequence: - pulse_serial = _dump_pulse(pulse) - if pulse.type == PulseType.COUPLERFLUX: - pulse_serial["coupler"] = pulse_serial.pop("qubit") - data[fld.name].append(pulse_serial) + if len(sequence) > 0: + data[fld.name] = [] + for pulse in sequence: + pulse_serial = _dump_pulse(pulse) + if pulse.type == PulseType.COUPLERFLUX: + pulse_serial["coupler"] = pulse_serial.pop("qubit") + data[fld.name].append(pulse_serial) return data From 356a2282b849f9ef9d4132cb11de9476622a412c Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 21 Mar 2024 17:38:59 +0400 Subject: [PATCH 0107/1006] fix: doctest --- doc/source/tutorials/compiler.rst | 7 ++----- src/qibolab/compilers/default.py | 12 ++++-------- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/doc/source/tutorials/compiler.rst b/doc/source/tutorials/compiler.rst index ae5d2dc2e3..68d4dbef75 100644 --- a/doc/source/tutorials/compiler.rst +++ b/doc/source/tutorials/compiler.rst @@ -80,12 +80,9 @@ The following example shows how to modify the compiler in order to execute a cir # define a compiler rule that translates X to the pi-pulse - def x_rule(gate, platform): + def x_rule(gate, qubit): """X gate applied with a single pi-pulse.""" - qubit = gate.target_qubits[0] - sequence = PulseSequence() - sequence.append(platform.create_RX_pulse(qubit)) - return sequence + return PulseSequence([qubit.native_gates.RX]) # the empty dictionary is needed because the X gate does not require any virtual Z-phases diff --git a/src/qibolab/compilers/default.py b/src/qibolab/compilers/default.py index bad8eb4ea9..c59360c884 100644 --- a/src/qibolab/compilers/default.py +++ b/src/qibolab/compilers/default.py @@ -31,24 +31,20 @@ def rz_rule(gate, qubit): def gpi2_rule(gate, qubit): """Rule for GPI2.""" theta = gate.parameters[0] - sequence = PulseSequence() - pulse = qubit.native_gates.RX90 - pulse.relative_phase = theta - sequence.append(pulse) + pulse = replace(qubit.native_gates.RX90, relative_phase=theta) + sequence = PulseSequence([pulse]) return sequence def gpi_rule(gate, qubit): """Rule for GPI.""" theta = gate.parameters[0] - sequence = PulseSequence() # the following definition has a global phase difference compare to # to the matrix representation. See # https://github.com/qiboteam/qibolab/pull/804#pullrequestreview-1890205509 # for more detail. - pulse = qubit.native_gates.RX - pulse.relative_phase = theta - sequence.append(pulse) + pulse = replace(qubit.native_gates.RX, relative_phase=theta) + sequence = PulseSequence([pulse]) return sequence From a653e0c726aa1568d4884b428f46feff9fb5275d Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 21 Mar 2024 18:46:40 +0400 Subject: [PATCH 0108/1006] refactor: remove clock from unrolling --- src/qibolab/platform/platform.py | 19 ++++++++----------- src/qibolab/pulses/sequence.py | 2 +- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 50d90101f9..744c00f41d 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -42,22 +42,19 @@ def unroll_sequences( """ total_sequence = PulseSequence() readout_map = defaultdict(list) - clock = defaultdict(int) - start = 0 + channels = {pulse.channel for sequence in sequences for pulse in sequence} for sequence in sequences: + total_sequence.extend(sequence) + # TODO: Fix unrolling results for pulse in sequence: - if clock[pulse.channel] < start: - delay = start - clock[pulse.channel] - total_sequence.append(Delay(delay, pulse.channel)) - - total_sequence.append(pulse) - clock[pulse.channel] += pulse.duration - if pulse.type is PulseType.READOUT: - # TODO: Fix unrolling results readout_map[pulse.id].append(pulse.id) - start = sequence.duration + relaxation_time + length = sequence.duration + relaxation_time + pulses_per_channel = sequence.pulses_per_channel + for channel in channels: + delay = length - pulses_per_channel[channel].duration + total_sequence.append(Delay(delay, channel)) return total_sequence, readout_map diff --git a/src/qibolab/pulses/sequence.py b/src/qibolab/pulses/sequence.py index f5406dfa73..8a86750535 100644 --- a/src/qibolab/pulses/sequence.py +++ b/src/qibolab/pulses/sequence.py @@ -96,7 +96,7 @@ def coupler_pulses(self, *couplers): @property def pulses_per_channel(self): """Return a dictionary with the sequence per channel.""" - sequences = defaultdict(self.__class__) + sequences = defaultdict(type(self)) for pulse in self: sequences[pulse.channel].append(pulse) return sequences From aef6e0cc95ebddf4a0530d6e9791e71554ba1eb4 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Mon, 15 Apr 2024 14:35:48 +0300 Subject: [PATCH 0109/1006] fix: remove FluxPulse --- src/qibolab/instruments/zhinst/executor.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qibolab/instruments/zhinst/executor.py b/src/qibolab/instruments/zhinst/executor.py index cbcb1d6a19..ad76931240 100644 --- a/src/qibolab/instruments/zhinst/executor.py +++ b/src/qibolab/instruments/zhinst/executor.py @@ -13,7 +13,7 @@ from qibolab.couplers import Coupler from qibolab.instruments.abstract import Controller from qibolab.instruments.port import Port -from qibolab.pulses import FluxPulse, PulseSequence, PulseType +from qibolab.pulses import PulseSequence, PulseType from qibolab.qubits import Qubit from qibolab.sweeper import Parameter, Sweeper from qibolab.unrolling import Bounds @@ -341,7 +341,7 @@ def create_sub_sequences( if len(measurement_groups) == 1: for ch in other_channels: for pulse in self.sequence[ch]: - if not isinstance(pulse.pulse, FluxPulse): + if not pulse.pulse.type in (PulseType.FLUX, PulseType.COUPLERFLUX): break start, end = measurement_start_end[0] if pulse.pulse.start < end and pulse.pulse.finish > start: From e1ea82c3184529af6faa885a47cc0096f2342276 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 18 Jan 2024 16:35:45 +0100 Subject: [PATCH 0110/1006] Remove leftover calls to pulse specific copy --- src/qibolab/native.py | 364 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 345 insertions(+), 19 deletions(-) diff --git a/src/qibolab/native.py b/src/qibolab/native.py index bbf55bb351..8c08595e1e 100644 --- a/src/qibolab/native.py +++ b/src/qibolab/native.py @@ -1,7 +1,256 @@ +import copy +from collections import defaultdict from dataclasses import dataclass, field, fields, replace -from typing import Optional +from typing import List, Optional, Union -from qibolab.pulses import Pulse, PulseSequence +from qibolab.pulses import Pulse, PulseSequence, PulseType + + +@dataclass +class NativePulse: + """Container with parameters required to generate a pulse implementing a + native gate.""" + + name: str + """Name of the gate that the pulse implements.""" + duration: int + amplitude: float + shape: str + pulse_type: PulseType + qubit: "qubits.Qubit" + frequency: int = 0 + relative_start: int = 0 + """Relative start is relevant for two-qubit gate operations which + correspond to a pulse sequence.""" + + # used for qblox + if_frequency: Optional[int] = None + # TODO: Note sure if the following parameters are useful to be in the runcard + start: int = 0 + phase: float = 0.0 + + @classmethod + def from_dict(cls, name, pulse, qubit): + """Parse the dictionary provided by the runcard. + + Args: + name (str): Name of the native gate (dictionary key). + pulse (dict): Dictionary containing the parameters of the pulse implementing + the gate, as loaded from the runcard. + qubits (:class:`qibolab.platforms.abstract.Qubit`): Qubit that the + pulse is acting on + """ + kwargs = copy.deepcopy(pulse) + kwargs["pulse_type"] = PulseType(kwargs.pop("type")) + kwargs["qubit"] = qubit + return cls(name, **kwargs) + + @property + def raw(self): + data = { + fld.name: getattr(self, fld.name) + for fld in fields(self) + if getattr(self, fld.name) is not None + } + del data["name"] + del data["start"] + if self.pulse_type is PulseType.FLUX: + del data["frequency"] + del data["phase"] + data["qubit"] = self.qubit.name + data["type"] = data.pop("pulse_type").value + return data + + def pulse(self, start, relative_phase=0.0): + """Construct the :class:`qibolab.pulses.Pulse` object implementing the + gate. + + Args: + start (int): Start time of the pulse in the sequence. + relative_phase (float): Relative phase of the pulse. + + Returns: + A :class:`qibolab.pulses.DrivePulse` or :class:`qibolab.pulses.DrivePulse` + or :class:`qibolab.pulses.FluxPulse` with the pulse parameters of the gate. + """ + if self.pulse_type is PulseType.FLUX: + return Pulse.flux( + start + self.relative_start, + self.duration, + self.amplitude, + self.shape, + channel=self.qubit.flux.name, + qubit=self.qubit.name, + ) + + channel = getattr(self.qubit, self.pulse_type.name.lower()).name + return Pulse( + start + self.relative_start, + self.duration, + self.amplitude, + self.frequency, + relative_phase, + self.shape, + type=self.pulse_type, + channel=channel, + qubit=self.qubit.name, + ) + + +@dataclass +class VirtualZPulse: + """Container with parameters required to add a virtual Z phase in a pulse + sequence.""" + + phase: float + qubit: "qubits.Qubit" + + @property + def raw(self): + return {"type": "virtual_z", "phase": self.phase, "qubit": self.qubit.name} + + +@dataclass +class CouplerPulse: + """Container with parameters required to add a coupler pulse in a pulse + sequence.""" + + duration: int + amplitude: float + shape: str + coupler: "couplers.Coupler" + relative_start: int = 0 + + @classmethod + def from_dict(cls, pulse, coupler): + """Parse the dictionary provided by the runcard. + + Args: + name (str): Name of the native gate (dictionary key). + pulse (dict): Dictionary containing the parameters of the pulse implementing + the gate, as loaded from the runcard. + coupler (:class:`qibolab.platforms.abstract.Coupler`): Coupler that the + pulse is acting on + """ + kwargs = copy.deepcopy(pulse) + kwargs["coupler"] = coupler + kwargs.pop("type") + return cls(**kwargs) + + @property + def raw(self): + return { + "type": "coupler", + "duration": self.duration, + "amplitude": self.amplitude, + "shape": self.shape, + "coupler": self.coupler.name, + "relative_start": self.relative_start, + } + + def pulse(self, start): + """Construct the :class:`qibolab.pulses.Pulse` object implementing the + gate. + + Args: + start (int): Start time of the pulse in the sequence. + + Returns: + A :class:`qibolab.pulses.FluxPulse` with the pulse parameters of the gate. + """ + return Pulse( + start + self.relative_start, + self.duration, + self.amplitude, + 0, + 0, + self.shape, + type=PulseType.COUPLERFLUX, + channel=self.coupler.flux.name, + qubit=self.coupler.name, + ) + + +@dataclass +class NativeSequence: + """List of :class:`qibolab.platforms.native.NativePulse` objects + implementing a gate. + + Relevant for two-qubit gates, which usually require a sequence of + pulses to be implemented. These pulses may act on qubits different + than the qubits the gate is targeting. + """ + + name: str + pulses: List[Union[NativePulse, VirtualZPulse]] = field(default_factory=list) + coupler_pulses: List[CouplerPulse] = field(default_factory=list) + + @classmethod + def from_dict(cls, name, sequence, qubits, couplers): + """Constructs the native sequence from the dictionaries provided in the + runcard. + + Args: + name (str): Name of the gate the sequence is applying. + sequence (dict): Dictionary describing the sequence as provided in the runcard. + qubits (list): List of :class:`qibolab.qubits.Qubit` object for all + qubits in the platform. All qubits are required because the sequence may be + acting on qubits that the implemented gate is not targeting. + couplers (list): List of :class:`qibolab.couplers.Coupler` object for all + couplers in the platform. All couplers are required because the sequence may be + acting on couplers that the implemented gate is not targeting. + """ + pulses = [] + coupler_pulses = [] + + # If sequence contains only one pulse dictionary, convert it into a list that can be iterated below + if isinstance(sequence, dict): + sequence = [sequence] + + for i, pulse in enumerate(sequence): + pulse = copy.deepcopy(pulse) + pulse_type = pulse.pop("type") + if pulse_type == "coupler": + pulse["coupler"] = couplers[pulse.pop("coupler")] + coupler_pulses.append(CouplerPulse(**pulse)) + else: + qubit = qubits[pulse.pop("qubit")] + if pulse_type == "virtual_z": + phase = pulse["phase"] + pulses.append(VirtualZPulse(phase, qubit)) + else: + pulses.append( + NativePulse( + f"{name}{i}", + **pulse, + pulse_type=PulseType(pulse_type), + qubit=qubit, + ) + ) + return cls(name, pulses, coupler_pulses) + + @property + def raw(self): + pulses = [pulse.raw for pulse in self.pulses] + coupler_pulses = [pulse.raw for pulse in self.coupler_pulses] + return pulses + coupler_pulses + + def sequence(self, start=0): + """Creates a :class:`qibolab.pulses.PulseSequence` object implementing + the sequence.""" + sequence = PulseSequence() + virtual_z_phases = defaultdict(int) + + for pulse in self.pulses: + if isinstance(pulse, NativePulse): + sequence.append(pulse.pulse(start=start)) + else: + virtual_z_phases[pulse.qubit.name] += pulse.phase + + for coupler_pulse in self.coupler_pulses: + sequence.append(coupler_pulse.pulse(start=start)) + # TODO: Maybe ``virtual_z_phases`` should be an attribute of ``PulseSequence`` + return sequence, virtual_z_phases @dataclass @@ -9,19 +258,85 @@ class SingleQubitNatives: """Container with the native single-qubit gates acting on a specific qubit.""" - RX: Optional[Pulse] = None + RX: Optional[NativePulse] = None """Pulse to drive the qubit from state 0 to state 1.""" - RX12: Optional[Pulse] = None + RX12: Optional[NativePulse] = None """Pulse to drive to qubit from state 1 to state 2.""" - MZ: Optional[Pulse] = None + MZ: Optional[NativePulse] = None """Measurement pulse.""" - CP: Optional[Pulse] = None - """Pulse to activate a coupler.""" @property - def RX90(self) -> Pulse: + def RX90(self) -> NativePulse: """RX90 native pulse is inferred from RX by halving its amplitude.""" - return replace(self.RX, amplitude=self.RX.amplitude / 2.0) + return replace(self.RX, name="RX90", amplitude=self.RX.amplitude / 2.0) + + @classmethod + def from_dict(cls, qubit, native_gates): + """Parse native gates of the qubit from the runcard. + + Args: + qubit (:class:`qibolab.qubits.Qubit`): Qubit object that the + native gates are acting on. + native_gates (dict): Dictionary with native gate pulse parameters as loaded + from the runcard. + """ + pulses = { + n: NativePulse.from_dict(n, pulse, qubit=qubit) + for n, pulse in native_gates.items() + } + return cls(**pulses) + + @property + def raw(self): + """Serialize native gate pulses. + + ``None`` gates are not included. + """ + data = {} + for fld in fields(self): + attr = getattr(self, fld.name) + if attr is not None: + data[fld.name] = attr.raw + del data[fld.name]["qubit"] + return data + + +@dataclass +class CouplerNatives: + """Container with the native single-qubit gates acting on a specific + qubit.""" + + CP: Optional[NativePulse] = None + """Pulse to activate the coupler.""" + + @classmethod + def from_dict(cls, coupler, native_gates): + """Parse coupler native gates from the runcard. + + Args: + coupler (:class:`qibolab.couplers.Coupler`): Coupler object that the + native pulses are acting on. + native_gates (dict): Dictionary with native gate pulse parameters as loaded + from the runcard [Reusing the dict from qubits]. + """ + pulses = { + n: CouplerPulse.from_dict(pulse, coupler=coupler) + for n, pulse in native_gates.items() + } + return cls(**pulses) + + @property + def raw(self): + """Serialize native gate pulses. + + ``None`` gates are not included. + """ + data = {} + for fld in fields(self): + attr = getattr(self, fld.name) + if attr is not None: + data[fld.name] = attr.raw + return data @dataclass @@ -29,21 +344,32 @@ class TwoQubitNatives: """Container with the native two-qubit gates acting on a specific pair of qubits.""" - CZ: PulseSequence = field( - default_factory=lambda: PulseSequence(), metadata={"symmetric": True} - ) - CNOT: PulseSequence = field( - default_factory=lambda: PulseSequence(), metadata={"symmetric": False} - ) - iSWAP: PulseSequence = field( - default_factory=lambda: PulseSequence(), metadata={"symmetric": True} - ) + CZ: Optional[NativeSequence] = field(default=None, metadata={"symmetric": True}) + CNOT: Optional[NativeSequence] = field(default=None, metadata={"symmetric": False}) + iSWAP: Optional[NativeSequence] = field(default=None, metadata={"symmetric": True}) @property def symmetric(self): """Check if the defined two-qubit gates are symmetric between target and control qubits.""" return all( - fld.metadata["symmetric"] or len(getattr(self, fld.name)) == 0 + fld.metadata["symmetric"] or getattr(self, fld.name) is None for fld in fields(self) ) + + @classmethod + def from_dict(cls, qubits, couplers, native_gates): + sequences = { + n: NativeSequence.from_dict(n, seq, qubits, couplers) + for n, seq in native_gates.items() + } + return cls(**sequences) + + @property + def raw(self): + data = {} + for fld in fields(self): + gate = getattr(self, fld.name) + if gate is not None: + data[fld.name] = gate.raw + return data From d9bd2a033f215951116e1449afaed1d213bd874e Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 18 Jan 2024 18:18:40 +0100 Subject: [PATCH 0111/1006] Start rearranging pulses into a subpackage --- src/qibolab/pulses/plot.py | 136 ++++++------------- src/qibolab/pulses/pulse.py | 132 +++++++++++++------ src/qibolab/pulses/sequence.py | 133 ++++++++++++++++--- src/qibolab/pulses/shape.py | 233 +++++++++++++++++---------------- src/qibolab/pulses/waveform.py | 42 ++++++ 5 files changed, 415 insertions(+), 261 deletions(-) create mode 100644 src/qibolab/pulses/waveform.py diff --git a/src/qibolab/pulses/plot.py b/src/qibolab/pulses/plot.py index 6cbbf905a8..1328268f20 100644 --- a/src/qibolab/pulses/plot.py +++ b/src/qibolab/pulses/plot.py @@ -1,13 +1,10 @@ """Plotting tools for pulses and related entities.""" - -from collections import defaultdict - import matplotlib.pyplot as plt import numpy as np -from .pulse import Delay, Pulse -from .sequence import PulseSequence -from .shape import SAMPLING_RATE, Waveform, modulate +from .pulse import Pulse +from .shape import SAMPLING_RATE +from .waveform import Waveform def waveform(wf: Waveform, filename=None): @@ -17,7 +14,7 @@ def waveform(wf: Waveform, filename=None): filename (str): a file path. If provided the plot is save to a file. """ plt.figure(figsize=(14, 5), dpi=200) - plt.plot(wf, c="C0", linestyle="dashed") + plt.plot(wf.data, c="C0", linestyle="dashed") plt.xlabel("Sample Number") plt.ylabel("Amplitude") plt.grid(visible=True, which="both", axis="both", color="#888888", linestyle="-") @@ -41,53 +38,72 @@ def pulse(pulse_: Pulse, filename=None, sampling_rate=SAMPLING_RATE): waveform_q = pulse_.shape.envelope_waveform_q(sampling_rate) num_samples = len(waveform_i) - time = np.arange(num_samples) / sampling_rate + time = pulse_.start + np.arange(num_samples) / sampling_rate _ = plt.figure(figsize=(14, 5), dpi=200) gs = gridspec.GridSpec(ncols=2, nrows=1, width_ratios=np.array([2, 1])) ax1 = plt.subplot(gs[0]) ax1.plot( time, - waveform_i, + waveform_i.data, label="envelope i", c="C0", linestyle="dashed", ) ax1.plot( time, - waveform_q, + waveform_q.data, label="envelope q", c="C1", linestyle="dashed", ) - - envelope = pulse_.shape.envelope_waveforms(sampling_rate) - modulated = modulate(np.array(envelope), pulse_.frequency) - ax1.plot(time, modulated[0], label="modulated i", c="C0") - ax1.plot(time, modulated[1], label="modulated q", c="C1") - ax1.plot(time, -waveform_i, c="silver", linestyle="dashed") + ax1.plot( + time, + pulse_.shape.modulated_waveform_i(sampling_rate).data, + label="modulated i", + c="C0", + ) + ax1.plot( + time, + pulse_.shape.modulated_waveform_q(sampling_rate).data, + label="modulated q", + c="C1", + ) + ax1.plot(time, -waveform_i.data, c="silver", linestyle="dashed") ax1.set_xlabel("Time [ns]") ax1.set_ylabel("Amplitude") ax1.grid(visible=True, which="both", axis="both", color="#888888", linestyle="-") - start = 0 - finish = float(pulse_.duration) + start = float(pulse_.start) + finish = float(pulse._finish) if pulse._finish is not None else 0.0 ax1.axis((start, finish, -1.0, 1.0)) ax1.legend() + modulated_i = pulse_.shape.modulated_waveform_i(sampling_rate).data + modulated_q = pulse_.shape.modulated_waveform_q(sampling_rate).data ax2 = plt.subplot(gs[1]) - ax2.plot(modulated[0], modulated[1], label="modulated", c="C3") - ax2.plot(waveform_i, waveform_q, label="envelope", c="C2") ax2.plot( - modulated[0][0], - modulated[1][0], + modulated_i, + modulated_q, + label="modulated", + c="C3", + ) + ax2.plot( + waveform_i.data, + waveform_q.data, + label="envelope", + c="C2", + ) + ax2.plot( + modulated_i[0], + modulated_q[0], marker="o", markersize=5, label="start", c="lightcoral", ) ax2.plot( - modulated[0][-1], - modulated[1][-1], + modulated_i[-1], + modulated_q[-1], marker="o", markersize=5, label="finish", @@ -110,75 +126,3 @@ def pulse(pulse_: Pulse, filename=None, sampling_rate=SAMPLING_RATE): else: plt.show() plt.close() - - -def sequence(ps: PulseSequence, filename=None, sampling_rate=SAMPLING_RATE): - """Plot the sequence of pulses. - - Args: - filename (str): a file path. If provided the plot is save to a file. - """ - if len(ps) > 0: - import matplotlib.pyplot as plt - from matplotlib import gridspec - - _ = plt.figure(figsize=(14, 2 * len(ps)), dpi=200) - gs = gridspec.GridSpec(ncols=1, nrows=len(ps)) - vertical_lines = [] - starts = defaultdict(int) - for pulse in ps: - if not isinstance(pulse, Delay): - vertical_lines.append(starts[pulse.channel]) - vertical_lines.append(starts[pulse.channel] + pulse.duration) - starts[pulse.channel] += pulse.duration - - n = -1 - for qubit in ps.qubits: - qubit_pulses = ps.get_qubit_pulses(qubit) - for channel in qubit_pulses.channels: - n += 1 - channel_pulses = qubit_pulses.get_channel_pulses(channel) - ax = plt.subplot(gs[n]) - ax.axis([0, ps.duration, -1, 1]) - start = 0 - for pulse in channel_pulses: - if isinstance(pulse, Delay): - start += pulse.duration - continue - - envelope = pulse.shape.envelope_waveforms(sampling_rate) - num_samples = envelope[0].size - time = start + np.arange(num_samples) / sampling_rate - modulated = modulate(np.array(envelope), pulse.frequency) - ax.plot(time, modulated[1], c="lightgrey") - ax.plot(time, modulated[0], c=f"C{str(n)}") - ax.plot( - time, - pulse.shape.envelope_waveform_i(sampling_rate), - c=f"C{str(n)}", - ) - ax.plot( - time, - -pulse.shape.envelope_waveform_i(sampling_rate), - c=f"C{str(n)}", - ) - # TODO: if they overlap use different shades - ax.axhline(0, c="dimgrey") - ax.set_ylabel(f"qubit {qubit} \n channel {channel}") - for vl in vertical_lines: - ax.axvline(vl, c="slategrey", linestyle="--") - ax.axis((0, ps.duration, -1, 1)) - ax.grid( - visible=True, - which="both", - axis="both", - color="#CCCCCC", - linestyle="-", - ) - start += pulse.duration - - if filename: - plt.savefig(filename) - else: - plt.show() - plt.close() diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index aa510bc110..18e16c2530 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -1,11 +1,9 @@ """Pulse class.""" - +import copy from dataclasses import dataclass, fields from enum import Enum from typing import Optional -from .shape import SAMPLING_RATE, PulseShape, Waveform - class PulseType(Enum): """An enumeration to distinguish different types of pulses. @@ -19,14 +17,14 @@ class PulseType(Enum): DRIVE = "qd" FLUX = "qf" COUPLERFLUX = "cf" - DELAY = "dl" - VIRTUALZ = "virtual_z" @dataclass class Pulse: - """A pulse to be sent to the QPU.""" + """A class to represent a pulse to be sent to the QPU.""" + start: int + """Start time of pulse in ns.""" duration: int """Pulse duration in ns.""" amplitude: float @@ -34,14 +32,14 @@ class Pulse: Pulse amplitudes are normalised between -1 and 1. """ - frequency: int = 0 + frequency: int """Pulse Intermediate Frequency in Hz. The value has to be in the range [10e6 to 300e6]. """ - relative_phase: float = 0.0 + relative_phase: float """Relative phase of the pulse, in radians.""" - shape: PulseShape = "Rectangular()" + shape: PulseShape """Pulse shape, as a PulseShape object. See @@ -69,8 +67,41 @@ def __post_init__(self): self.shape.pulse = self @classmethod - def flux(cls, duration, amplitude, shape, **kwargs): - return cls(duration, amplitude, 0, 0, shape, type=PulseType.FLUX, **kwargs) + def flux(cls, start, duration, amplitude, shape, **kwargs): + return cls( + start, duration, amplitude, 0, 0, shape, type=PulseType.FLUX, **kwargs + ) + + @property + def finish(self) -> Optional[int]: + """Time when the pulse is scheduled to finish.""" + if None in {self.start, self.duration}: + return None + return self.start + self.duration + + @property + def global_phase(self): + """Global phase of the pulse, in radians. + + This phase is calculated from the pulse start time and frequency + as `2 * pi * frequency * start`. + """ + if self.type is PulseType.READOUT: + # readout pulses should have zero global phase so that we can + # calculate probabilities in the i-q plane + return 0 + + # pulse start, duration and finish are in ns + return 2 * np.pi * self.frequency * self.start / 1e9 + + @property + def phase(self) -> float: + """Total phase of the pulse, in radians. + + The total phase is computed as the sum of the global and + relative phases. + """ + return self.global_phase + self.relative_phase @property def id(self) -> int: @@ -86,7 +117,9 @@ def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: return self.shape.envelope_waveform_q(sampling_rate) - def envelope_waveforms(self, sampling_rate=SAMPLING_RATE): + def envelope_waveforms( + self, sampling_rate=SAMPLING_RATE + ): # -> tuple[Waveform, Waveform]: """A tuple with the i and q envelope waveforms of the pulse.""" return ( @@ -94,6 +127,24 @@ def envelope_waveforms(self, sampling_rate=SAMPLING_RATE): self.shape.envelope_waveform_q(sampling_rate), ) + def modulated_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: + """The waveform of the i component of the pulse, modulated with its + frequency.""" + + return self.shape.modulated_waveform_i(sampling_rate) + + def modulated_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: + """The waveform of the q component of the pulse, modulated with its + frequency.""" + + return self.shape.modulated_waveform_q(sampling_rate) + + def modulated_waveforms(self, sampling_rate): # -> tuple[Waveform, Waveform]: + """A tuple with the i and q waveforms of the pulse, modulated with its + frequency.""" + + return self.shape.modulated_waveforms(sampling_rate) + def __hash__(self): """Hash the content. @@ -117,31 +168,32 @@ def __hash__(self): ) ) - -@dataclass -class Delay: - """A wait instruction during which we are not sending any pulses to the - QPU.""" - - duration: int - """Delay duration in ns.""" - channel: str - """Channel on which the delay should be implemented.""" - type: PulseType = PulseType.DELAY - """Type fixed to ``DELAY`` to comply with ``Pulse`` interface.""" - - -@dataclass -class VirtualZ: - """Implementation of Z-rotations using virtual phase.""" - - duration = 0 - """Duration of the virtual gate should always be zero.""" - - phase: float - """Phase that implements the rotation.""" - channel: Optional[str] = None - """Channel on which the virtual phase should be added.""" - qubit: int = 0 - """Qubit on the drive of which the virtual phase should be added.""" - type: PulseType = PulseType.VIRTUALZ + def __add__(self, other): + if isinstance(other, Pulse): + return PulseSequence(self, other) + if isinstance(other, PulseSequence): + return PulseSequence(self, *other) + raise TypeError(f"Expected Pulse or PulseSequence; got {type(other).__name__}") + + def __mul__(self, n): + if not isinstance(n, int): + raise TypeError(f"Expected int; got {type(n).__name__}") + if n < 0: + raise TypeError(f"argument n should be >=0, got {n}") + return PulseSequence(*([copy.deepcopy(self)] * n)) + + def __rmul__(self, n): + return self.__mul__(n) + + def is_equal_ignoring_start(self, item) -> bool: + """Check if two pulses are equal ignoring start time.""" + return ( + self.duration == item.duration + and self.amplitude == item.amplitude + and self.frequency == item.frequency + and self.relative_phase == item.relative_phase + and self.shape == item.shape + and self.channel == item.channel + and self.type == item.type + and self.qubit == item.qubit + ) diff --git a/src/qibolab/pulses/sequence.py b/src/qibolab/pulses/sequence.py index 8a86750535..fc488a3721 100644 --- a/src/qibolab/pulses/sequence.py +++ b/src/qibolab/pulses/sequence.py @@ -1,8 +1,5 @@ """PulseSequence class.""" - -from collections import defaultdict - -from .pulse import PulseType +import numpy as np class PulseSequence(list): @@ -94,21 +91,27 @@ def coupler_pulses(self, *couplers): return new_pc @property - def pulses_per_channel(self): - """Return a dictionary with the sequence per channel.""" - sequences = defaultdict(type(self)) + def finish(self) -> int: + """The time when the last pulse of the sequence finishes.""" + t: int = 0 for pulse in self: - sequences[pulse.channel].append(pulse) - return sequences + if pulse.finish > t: + t = pulse.finish + return t + + @property + def start(self) -> int: + """The start time of the first pulse of the sequence.""" + t = self.finish + for pulse in self: + if pulse.start < t: + t = pulse.start + return t @property def duration(self) -> int: - """The time when the last pulse of the sequence finishes.""" - channel_pulses = self.pulses_per_channel - if len(channel_pulses) == 1: - pulses = next(iter(channel_pulses.values())) - return sum(pulse.duration for pulse in pulses) - return max(sequence.duration for sequence in channel_pulses.values()) + """Duration of the sequence calculated as its finish - start times.""" + return self.finish - self.start @property def channels(self) -> list: @@ -130,6 +133,25 @@ def qubits(self) -> list: qubits.sort() return qubits + def get_pulse_overlaps(self): # -> dict((int,int): PulseSequence): + """Return a dictionary of slices of time (tuples with start and finish + times) where pulses overlap.""" + times = [] + for pulse in self: + if not pulse.start in times: + times.append(pulse.start) + if not pulse.finish in times: + times.append(pulse.finish) + times.sort() + + overlaps = {} + for n in range(len(times) - 1): + overlaps[(times[n], times[n + 1])] = PulseSequence() + for pulse in self: + if (pulse.start <= times[n]) & (pulse.finish >= times[n + 1]): + overlaps[(times[n], times[n + 1])] += [pulse] + return overlaps + def separate_overlapping_pulses(self): # -> dict((int,int): PulseSequence): """Separate a sequence of overlapping pulses into a list of non- overlapping sequences.""" @@ -155,3 +177,84 @@ def separate_overlapping_pulses(self): # -> dict((int,int): PulseSequence): if not stored: separated_pulses.append(PulseSequence([new_pulse])) return separated_pulses + + # TODO: Implement separate_different_frequency_pulses() + + @property + def pulses_overlap(self) -> bool: + """Whether any of the pulses in the sequence overlap.""" + overlap = False + for pc in self.get_pulse_overlaps().values(): + if len(pc) > 1: + overlap = True + break + return overlap + + def plot(self, savefig_filename=None, sampling_rate=SAMPLING_RATE): + """Plot the sequence of pulses. + + Args: + savefig_filename (str): a file path. If provided the plot is save to a file. + """ + if len(self) > 0: + import matplotlib.pyplot as plt + from matplotlib import gridspec + + fig = plt.figure(figsize=(14, 2 * len(self)), dpi=200) + gs = gridspec.GridSpec(ncols=1, nrows=len(self)) + vertical_lines = [] + for pulse in self: + vertical_lines.append(pulse.start) + vertical_lines.append(pulse.finish) + + n = -1 + for qubit in self.qubits: + qubit_pulses = self.get_qubit_pulses(qubit) + for channel in qubit_pulses.channels: + n += 1 + channel_pulses = qubit_pulses.get_channel_pulses(channel) + ax = plt.subplot(gs[n]) + ax.axis([0, self.finish, -1, 1]) + for pulse in channel_pulses: + num_samples = len( + pulse.shape.modulated_waveform_i(sampling_rate) + ) + time = pulse.start + np.arange(num_samples) / sampling_rate + ax.plot( + time, + pulse.shape.modulated_waveform_q(sampling_rate).data, + c="lightgrey", + ) + ax.plot( + time, + pulse.shape.modulated_waveform_i(sampling_rate).data, + c=f"C{str(n)}", + ) + ax.plot( + time, + pulse.shape.envelope_waveform_i(sampling_rate).data, + c=f"C{str(n)}", + ) + ax.plot( + time, + -pulse.shape.envelope_waveform_i(sampling_rate).data, + c=f"C{str(n)}", + ) + # TODO: if they overlap use different shades + ax.axhline(0, c="dimgrey") + ax.set_ylabel(f"qubit {qubit} \n channel {channel}") + for vl in vertical_lines: + ax.axvline(vl, c="slategrey", linestyle="--") + ax.axis([0, self.finish, -1, 1]) + ax.grid( + visible=True, + which="both", + axis="both", + color="#CCCCCC", + linestyle="-", + ) + if savefig_filename: + plt.savefig(savefig_filename) + else: + plt.show() + plt.close() diff --git a/src/qibolab/pulses/shape.py b/src/qibolab/pulses/shape.py index cd2fed4e25..fef3f9faa9 100644 --- a/src/qibolab/pulses/shape.py +++ b/src/qibolab/pulses/shape.py @@ -1,10 +1,8 @@ """PulseShape class.""" - import re from abc import ABC, abstractmethod -import numpy as np -import numpy.typing as npt +from qibo.config import log from scipy.signal import lfilter SAMPLING_RATE = 1 @@ -14,70 +12,6 @@ a different value. """ -# TODO: they could be distinguished among them, and distinguished from generic float -# arrays, using the NewType pattern -> but this require some more effort to encforce -# types throughout the whole code base -Waveform = npt.NDArray[np.float64] -"""""" -IqWaveform = npt.NDArray[np.float64] -"""""" - - -def modulate( - envelope: IqWaveform, - freq: float, - rate: float = SAMPLING_RATE, - phase: float = 0.0, -) -> IqWaveform: - """Modulate the envelope waveform with a carrier. - - `envelope` is a `(2, n)`-shaped array of I and Q (first dimension) envelope signals, - as a function of time (second dimension), and `freq` the frequency of the carrier to - modulate with (usually the IF) in GHz. - `rate` is an optional sampling rate, in Gs/s, to sample the carrier. - - .. note:: - - Only the combination `freq / rate` is actually relevant, but it is frequently - convenient to specify one in GHz and the other in Gs/s. Thus the two arguments - are provided for the simplicity of their interpretation. - - `phase` is an optional initial phase for the carrier. - """ - samples = np.arange(envelope.shape[1]) - phases = (2 * np.pi * freq / rate) * samples + phase - cos = np.cos(phases) - sin = np.sin(phases) - mod = np.array([[cos, -sin], [sin, cos]]) - - # the normalization is related to `mod`, but only applied at the end for the sake of - # performances - return np.einsum("ijt,jt->it", mod, envelope) / np.sqrt(2) - - -def demodulate( - modulated: IqWaveform, - freq: float, - rate: float = SAMPLING_RATE, -) -> IqWaveform: - """Demodulate the acquired pulse. - - The role of the arguments is the same of the corresponding ones in :func:`modulate`, - which is essentially the inverse of this function. - """ - # in case the offsets have not been removed in hardware - modulated = modulated - np.mean(modulated) - - samples = np.arange(modulated.shape[1]) - phases = (2 * np.pi * freq / rate) * samples - cos = np.cos(phases) - sin = np.sin(phases) - demod = np.array([[cos, sin], [-sin, cos]]) - - # the normalization is related to `demod`, but only applied at the end for the sake - # of performances - return np.sqrt(2) * np.einsum("ijt,jt->it", demod, modulated) - class ShapeInitError(RuntimeError): """Error raised when a pulse has not been fully defined.""" @@ -91,9 +25,11 @@ def __init__(self, msg=None, *args): class PulseShape(ABC): - """Pulse envelopes. + """Abstract class for pulse shapes. - Generates both i (in-phase) and q (quadrature) components. + This object is responsible for generating envelope and modulated + waveforms from a set of pulse parameters and its type. Generates + both i (in-phase) and q (quadrature) components. """ pulse = None @@ -114,7 +50,9 @@ def envelope_waveform_q( ) -> Waveform: # pragma: no cover raise NotImplementedError - def envelope_waveforms(self, sampling_rate=SAMPLING_RATE): + def envelope_waveforms( + self, sampling_rate=SAMPLING_RATE + ): # -> tuple[Waveform, Waveform]: # pragma: no cover """A tuple with the i and q envelope waveforms of the pulse.""" return ( @@ -122,6 +60,54 @@ def envelope_waveforms(self, sampling_rate=SAMPLING_RATE): self.envelope_waveform_q(sampling_rate), ) + def modulated_waveform_i(self, _if: int, sampling_rate=SAMPLING_RATE) -> Waveform: + """The waveform of the i component of the pulse, modulated with its + frequency.""" + + return self.modulated_waveforms(_if, sampling_rate)[0] + + def modulated_waveform_q(self, _if: int, sampling_rate=SAMPLING_RATE) -> Waveform: + """The waveform of the q component of the pulse, modulated with its + frequency.""" + + return self.modulated_waveforms(_if, sampling_rate)[1] + + def modulated_waveforms(self, _if: int, sampling_rate=SAMPLING_RATE): + """A tuple with the i and q waveforms of the pulse, modulated with its + frequency.""" + + pulse = self.pulse + if abs(_if) * 2 > sampling_rate: + log.info( + f"WARNING: The frequency of pulse {pulse.id} is higher than the nyqusit frequency ({int(sampling_rate // 2)}) for the device sampling rate: {int(sampling_rate)}" + ) + num_samples = int(np.rint(pulse.duration * sampling_rate)) + time = np.arange(num_samples) / sampling_rate + global_phase = pulse.global_phase + cosalpha = np.cos(2 * np.pi * _if * time + global_phase + pulse.relative_phase) + sinalpha = np.sin(2 * np.pi * _if * time + global_phase + pulse.relative_phase) + + mod_matrix = np.array([[cosalpha, -sinalpha], [sinalpha, cosalpha]]) / np.sqrt( + 2 + ) + + (envelope_waveform_i, envelope_waveform_q) = self.envelope_waveforms( + sampling_rate + ) + result = [] + for n, t, ii, qq in zip( + np.arange(num_samples), + time, + envelope_waveform_i.data, + envelope_waveform_q.data, + ): + result.append(mod_matrix[:, :, n] @ np.array([ii, qq])) + mod_signals = np.array(result) + + modulated_waveform_i = Waveform(mod_signals[:, 0]) + modulated_waveform_q = Waveform(mod_signals[:, 1]) + return (modulated_waveform_i, modulated_waveform_q) + def __eq__(self, item) -> bool: """Overloads == operator.""" return isinstance(item, type(self)) @@ -137,7 +123,7 @@ def eval(value: str) -> "PulseShape": shape_name = re.findall(r"(\w+)", value)[0] if shape_name not in globals(): raise ValueError(f"shape {value} not found") - shape_parameters = re.findall(r"[-\w+\d\.\d]+", value)[1:] + shape_parameters = re.findall(r"[\w+\d\.\d]+", value)[1:] # TODO: create multiple tests to prove regex working correctly return globals()[shape_name](*shape_parameters) @@ -147,14 +133,15 @@ class Rectangular(PulseShape): def __init__(self): self.name = "Rectangular" - self.pulse: "Pulse" = None + self.pulse: Pulse = None def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: """The envelope waveform of the i component of the pulse.""" if self.pulse: num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - return self.pulse.amplitude * np.ones(num_samples) + waveform = Waveform(self.pulse.amplitude * np.ones(num_samples)) + return waveform raise ShapeInitError def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: @@ -162,7 +149,8 @@ def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: if self.pulse: num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - return np.zeros(num_samples) + waveform = Waveform(np.zeros(num_samples)) + return waveform raise ShapeInitError def __repr__(self): @@ -185,7 +173,7 @@ class Exponential(PulseShape): def __init__(self, tau: float, upsilon: float, g: float = 0.1): self.name = "Exponential" - self.pulse: "Pulse" = None + self.pulse: Pulse = None self.tau: float = float(tau) self.upsilon: float = float(upsilon) self.g: float = float(g) @@ -196,7 +184,7 @@ def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: if self.pulse: num_samples = int(np.rint(self.pulse.duration * sampling_rate)) x = np.arange(0, num_samples, 1) - return ( + waveform = Waveform( self.pulse.amplitude * ( (np.ones(num_samples) * np.exp(-x / self.upsilon)) @@ -205,6 +193,7 @@ def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: / (1 + self.g) ) + return waveform raise ShapeInitError def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: @@ -212,7 +201,8 @@ def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: if self.pulse: num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - return np.zeros(num_samples) + waveform = Waveform(np.zeros(num_samples)) + return waveform raise ShapeInitError def __repr__(self): @@ -232,7 +222,7 @@ class Gaussian(PulseShape): def __init__(self, rel_sigma: float): self.name = "Gaussian" - self.pulse: "Pulse" = None + self.pulse: Pulse = None self.rel_sigma: float = float(rel_sigma) def __eq__(self, item) -> bool: @@ -247,13 +237,17 @@ def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: if self.pulse: num_samples = int(np.rint(self.pulse.duration * sampling_rate)) x = np.arange(0, num_samples, 1) - return self.pulse.amplitude * np.exp( - -(1 / 2) - * ( - ((x - (num_samples - 1) / 2) ** 2) - / (((num_samples) / self.rel_sigma) ** 2) + waveform = Waveform( + self.pulse.amplitude + * np.exp( + -(1 / 2) + * ( + ((x - (num_samples - 1) / 2) ** 2) + / (((num_samples) / self.rel_sigma) ** 2) + ) ) ) + return waveform raise ShapeInitError def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: @@ -261,7 +255,8 @@ def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: if self.pulse: num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - return np.zeros(num_samples) + waveform = Waveform(np.zeros(num_samples)) + return waveform raise ShapeInitError def __repr__(self): @@ -282,7 +277,7 @@ class GaussianSquare(PulseShape): def __init__(self, rel_sigma: float, width: float): self.name = "GaussianSquare" - self.pulse: "Pulse" = None + self.pulse: Pulse = None self.rel_sigma: float = float(rel_sigma) self.width: float = float(width) @@ -319,7 +314,8 @@ def fvec(t, gaussian_samples, rel_sigma, length=None): pulse = fvec(t, gaussian_samples, rel_sigma=self.rel_sigma) - return self.pulse.amplitude * pulse + waveform = Waveform(self.pulse.amplitude * pulse) + return waveform raise ShapeInitError @@ -328,7 +324,8 @@ def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: if self.pulse: num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - return np.zeros(num_samples) + waveform = Waveform(np.zeros(num_samples)) + return waveform raise ShapeInitError def __repr__(self): @@ -346,7 +343,7 @@ class Drag(PulseShape): def __init__(self, rel_sigma, beta): self.name = "Drag" - self.pulse: "Pulse" = None + self.pulse: Pulse = None self.rel_sigma = float(rel_sigma) self.beta = float(beta) @@ -362,13 +359,15 @@ def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: if self.pulse: num_samples = int(np.rint(self.pulse.duration * sampling_rate)) x = np.arange(0, num_samples, 1) - return self.pulse.amplitude * np.exp( + i = self.pulse.amplitude * np.exp( -(1 / 2) * ( ((x - (num_samples - 1) / 2) ** 2) / (((num_samples) / self.rel_sigma) ** 2) ) ) + waveform = Waveform(i) + return waveform raise ShapeInitError def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: @@ -384,11 +383,13 @@ def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: / (((num_samples) / self.rel_sigma) ** 2) ) ) - return ( + q = ( self.beta * (-(x - (num_samples - 1) / 2) / ((num_samples / self.rel_sigma) ** 2)) * i ) + waveform = Waveform(q) + return waveform raise ShapeInitError def __repr__(self): @@ -406,7 +407,7 @@ class IIR(PulseShape): def __init__(self, b, a, target: PulseShape): self.name = "IIR" self.target: PulseShape = target - self._pulse: "Pulse" = None + self._pulse: Pulse = None self.a: np.ndarray = np.array(a) self.b: np.ndarray = np.array(b) # Check len(a) = len(b) = 2 @@ -442,11 +443,13 @@ def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: data = lfilter( b=self.b, a=self.a, - x=self.target.envelope_waveform_i(sampling_rate), + x=self.target.envelope_waveform_i(sampling_rate).data, ) if not np.max(np.abs(data)) == 0: data = data / np.max(np.abs(data)) - return np.abs(self.pulse.amplitude) * data + data = np.abs(self.pulse.amplitude) * data + waveform = Waveform(data) + return waveform raise ShapeInitError def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: @@ -461,11 +464,13 @@ def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: data = lfilter( b=self.b, a=self.a, - x=self.target.envelope_waveform_q(sampling_rate), + x=self.target.envelope_waveform_q(sampling_rate).data, ) if not np.max(np.abs(data)) == 0: data = data / np.max(np.abs(data)) - return np.abs(self.pulse.amplitude) * data + data = np.abs(self.pulse.amplitude) * data + waveform = Waveform(data) + return waveform raise ShapeInitError def __repr__(self): @@ -483,7 +488,7 @@ class SNZ(PulseShape): def __init__(self, t_idling, b_amplitude=None): self.name = "SNZ" - self.pulse: "Pulse" = None + self.pulse: Pulse = None self.t_idling: float = t_idling self.b_amplitude = b_amplitude @@ -511,15 +516,18 @@ def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: np.rint(num_samples * half_pulse_duration / self.pulse.duration) ) idling_samples = num_samples - 2 * half_flux_pulse_samples - return np.concatenate( - ( - self.pulse.amplitude * np.ones(half_flux_pulse_samples - 1), - np.array([self.b_amplitude]), - np.zeros(idling_samples), - -np.array([self.b_amplitude]), - -self.pulse.amplitude * np.ones(half_flux_pulse_samples - 1), + waveform = Waveform( + np.concatenate( + ( + self.pulse.amplitude * np.ones(half_flux_pulse_samples - 1), + np.array([self.b_amplitude]), + np.zeros(idling_samples), + -np.array([self.b_amplitude]), + -self.pulse.amplitude * np.ones(half_flux_pulse_samples - 1), + ) ) ) + return waveform raise ShapeInitError def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: @@ -527,7 +535,8 @@ def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: if self.pulse: num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - return np.zeros(num_samples) + waveform = Waveform(np.zeros(num_samples)) + return waveform raise ShapeInitError def __repr__(self): @@ -548,7 +557,7 @@ class eCap(PulseShape): def __init__(self, alpha: float): self.name = "eCap" - self.pulse: "Pulse" = None + self.pulse: Pulse = None self.alpha: float = float(alpha) def __eq__(self, item) -> bool: @@ -561,18 +570,20 @@ def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: if self.pulse: num_samples = int(self.pulse.duration * sampling_rate) x = np.arange(0, num_samples, 1) - return ( + waveform = Waveform( self.pulse.amplitude * (1 + np.tanh(self.alpha * x / num_samples)) * (1 + np.tanh(self.alpha * (1 - x / num_samples))) / (1 + np.tanh(self.alpha / 2)) ** 2 ) + return waveform raise ShapeInitError def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: if self.pulse: num_samples = int(self.pulse.duration * sampling_rate) - return np.zeros(num_samples) + waveform = Waveform(np.zeros(num_samples)) + return waveform raise ShapeInitError def __repr__(self): @@ -584,7 +595,7 @@ class Custom(PulseShape): def __init__(self, envelope_i, envelope_q=None): self.name = "Custom" - self.pulse: "Pulse" = None + self.pulse: Pulse = None self.envelope_i: np.ndarray = np.array(envelope_i) if envelope_q is not None: self.envelope_q: np.ndarray = np.array(envelope_q) @@ -599,7 +610,8 @@ def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: raise ValueError("Length of envelope_i must be equal to pulse duration") num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - return self.envelope_i * self.pulse.amplitude + waveform = Waveform(self.envelope_i * self.pulse.amplitude) + return waveform raise ShapeInitError def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: @@ -610,7 +622,8 @@ def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: raise ValueError("Length of envelope_q must be equal to pulse duration") num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - return self.envelope_q * self.pulse.amplitude + waveform = Waveform(self.envelope_q * self.pulse.amplitude) + return waveform raise ShapeInitError def __repr__(self): diff --git a/src/qibolab/pulses/waveform.py b/src/qibolab/pulses/waveform.py new file mode 100644 index 0000000000..7c530bf362 --- /dev/null +++ b/src/qibolab/pulses/waveform.py @@ -0,0 +1,42 @@ +"""Waveform class.""" +import numpy as np + + +class Waveform: + """A class to save pulse waveforms. + + A waveform is a list of samples, or discrete data points, used by the digital to analogue converters (DACs) + to synthesise pulses. + + Attributes: + data (np.ndarray): a numpy array containing the samples. + """ + + DECIMALS = 5 + + def __init__(self, data): + """Initialise the waveform with a of samples.""" + self.data: np.ndarray = np.array(data) + + def __len__(self): + """Return the length of the waveform, the number of samples.""" + return len(self.data) + + def __hash__(self): + """Hash the underlying data. + + .. todo:: + + In order to make this reliable, we should set the data as immutable. This we + could by making both the class frozen and the contained array readonly + https://numpy.org/doc/stable/reference/generated/numpy.ndarray.flags.html#numpy.ndarray.flags + """ + return hash(self.data.tobytes()) + + def __eq__(self, other): + """Compare two waveforms. + + Two waveforms are considered equal if their samples, rounded to + `Waveform.DECIMALS` decimal places, are all equal. + """ + return np.allclose(self.data, other.data) From 82b3f068beb5d86a46cef13f0365f1db51d0faf9 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Wed, 20 Mar 2024 14:09:16 +0400 Subject: [PATCH 0112/1006] test: fix tests --- tests/test_instruments_qm.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/test_instruments_qm.py b/tests/test_instruments_qm.py index f7afcb08a7..62b3ef994b 100644 --- a/tests/test_instruments_qm.py +++ b/tests/test_instruments_qm.py @@ -94,7 +94,6 @@ def test_qmpulse_previous_and_next(): f"readout{qubit}", PulseType.READOUT, qubit=qubit, - type=PulseType.READOUT, ) ) ro_qmpulses.append(ro_pulse) From 655fad90694d262692b23530ac94e53a6f9720a7 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 23 Feb 2024 19:47:47 +0100 Subject: [PATCH 0113/1006] feat: Drop ShapeInitError in favor of pulse default value If uninitialize, it will raise an error on its own when usage is attempted --- src/qibolab/pulses/shape.py | 482 +++++++++++++++--------------------- 1 file changed, 204 insertions(+), 278 deletions(-) diff --git a/src/qibolab/pulses/shape.py b/src/qibolab/pulses/shape.py index fef3f9faa9..935028a103 100644 --- a/src/qibolab/pulses/shape.py +++ b/src/qibolab/pulses/shape.py @@ -1,8 +1,10 @@ """PulseShape class.""" + import re from abc import ABC, abstractmethod -from qibo.config import log +import numpy as np +import numpy.typing as npt from scipy.signal import lfilter SAMPLING_RATE = 1 @@ -12,24 +14,75 @@ a different value. """ +# TODO: they could be distinguished among them, and distinguished from generic float +# arrays, using the NewType pattern -> but this require some more effort to encforce +# types throughout the whole code base +Waveform = npt.NDArray[np.float64] +"""""" +IqWaveform = npt.NDArray[np.float64] +"""""" + + +def modulate( + envelope: IqWaveform, + freq: float, + rate: float = SAMPLING_RATE, + phase: float = 0.0, +) -> IqWaveform: + """Modulate the envelope waveform with a carrier. + + `envelope` is a `(2, n)`-shaped array of I and Q (first dimension) envelope signals, + as a function of time (second dimension), and `freq` the frequency of the carrier to + modulate with (usually the IF) in GHz. + `rate` is an optional sampling rate, in Gs/s, to sample the carrier. -class ShapeInitError(RuntimeError): - """Error raised when a pulse has not been fully defined.""" + .. note:: + + Only the combination `freq / rate` is actually relevant, but it is frequently + convenient to specify one in GHz and the other in Gs/s. Thus the two arguments + are provided for the simplicity of their interpretation. + + `phase` is an optional initial phase for the carrier. + """ + samples = np.arange(envelope.shape[1]) + phases = (2 * np.pi * freq / rate) * samples + phase + cos = np.cos(phases) + sin = np.sin(phases) + mod = np.array([[cos, -sin], [sin, cos]]) + + # the normalization is related to `mod`, but only applied at the end for the sake of + # performances + return np.einsum("ijt,jt->it", mod, envelope) / np.sqrt(2) + + +def demodulate( + modulated: IqWaveform, + freq: float, + rate: float = SAMPLING_RATE, +) -> IqWaveform: + """Demodulate the acquired pulse. + + The role of the arguments is the same of the corresponding ones in :func:`modulate`, + which is essentially the inverse of this function. + """ + # in case the offsets have not been removed in hardware + modulated = modulated - np.mean(modulated) - default_msg = "PulseShape attribute pulse must be initialised in order to be able to generate pulse waveforms" + samples = np.arange(modulated.shape[1]) + phases = (2 * np.pi * freq / rate) * samples + cos = np.cos(phases) + sin = np.sin(phases) + demod = np.array([[cos, sin], [-sin, cos]]) - def __init__(self, msg=None, *args): - if msg is None: - msg = self.default_msg - super().__init__(msg, *args) + # the normalization is related to `demod`, but only applied at the end for the sake + # of performances + return np.sqrt(2) * np.einsum("ijt,jt->it", demod, modulated) class PulseShape(ABC): - """Abstract class for pulse shapes. + """Pulse envelopes. - This object is responsible for generating envelope and modulated - waveforms from a set of pulse parameters and its type. Generates - both i (in-phase) and q (quadrature) components. + Generates both i (in-phase) and q (quadrature) components. """ pulse = None @@ -50,9 +103,7 @@ def envelope_waveform_q( ) -> Waveform: # pragma: no cover raise NotImplementedError - def envelope_waveforms( - self, sampling_rate=SAMPLING_RATE - ): # -> tuple[Waveform, Waveform]: # pragma: no cover + def envelope_waveforms(self, sampling_rate=SAMPLING_RATE): """A tuple with the i and q envelope waveforms of the pulse.""" return ( @@ -60,54 +111,6 @@ def envelope_waveforms( self.envelope_waveform_q(sampling_rate), ) - def modulated_waveform_i(self, _if: int, sampling_rate=SAMPLING_RATE) -> Waveform: - """The waveform of the i component of the pulse, modulated with its - frequency.""" - - return self.modulated_waveforms(_if, sampling_rate)[0] - - def modulated_waveform_q(self, _if: int, sampling_rate=SAMPLING_RATE) -> Waveform: - """The waveform of the q component of the pulse, modulated with its - frequency.""" - - return self.modulated_waveforms(_if, sampling_rate)[1] - - def modulated_waveforms(self, _if: int, sampling_rate=SAMPLING_RATE): - """A tuple with the i and q waveforms of the pulse, modulated with its - frequency.""" - - pulse = self.pulse - if abs(_if) * 2 > sampling_rate: - log.info( - f"WARNING: The frequency of pulse {pulse.id} is higher than the nyqusit frequency ({int(sampling_rate // 2)}) for the device sampling rate: {int(sampling_rate)}" - ) - num_samples = int(np.rint(pulse.duration * sampling_rate)) - time = np.arange(num_samples) / sampling_rate - global_phase = pulse.global_phase - cosalpha = np.cos(2 * np.pi * _if * time + global_phase + pulse.relative_phase) - sinalpha = np.sin(2 * np.pi * _if * time + global_phase + pulse.relative_phase) - - mod_matrix = np.array([[cosalpha, -sinalpha], [sinalpha, cosalpha]]) / np.sqrt( - 2 - ) - - (envelope_waveform_i, envelope_waveform_q) = self.envelope_waveforms( - sampling_rate - ) - result = [] - for n, t, ii, qq in zip( - np.arange(num_samples), - time, - envelope_waveform_i.data, - envelope_waveform_q.data, - ): - result.append(mod_matrix[:, :, n] @ np.array([ii, qq])) - mod_signals = np.array(result) - - modulated_waveform_i = Waveform(mod_signals[:, 0]) - modulated_waveform_q = Waveform(mod_signals[:, 1]) - return (modulated_waveform_i, modulated_waveform_q) - def __eq__(self, item) -> bool: """Overloads == operator.""" return isinstance(item, type(self)) @@ -133,25 +136,17 @@ class Rectangular(PulseShape): def __init__(self): self.name = "Rectangular" - self.pulse: Pulse = None + self.pulse: "Pulse" = None def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: """The envelope waveform of the i component of the pulse.""" - - if self.pulse: - num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - waveform = Waveform(self.pulse.amplitude * np.ones(num_samples)) - return waveform - raise ShapeInitError + num_samples = int(np.rint(self.pulse.duration * sampling_rate)) + return self.pulse.amplitude * np.ones(num_samples) def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: """The envelope waveform of the q component of the pulse.""" - - if self.pulse: - num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - waveform = Waveform(np.zeros(num_samples)) - return waveform - raise ShapeInitError + num_samples = int(np.rint(self.pulse.duration * sampling_rate)) + return np.zeros(num_samples) def __repr__(self): return f"{self.name}()" @@ -173,37 +168,28 @@ class Exponential(PulseShape): def __init__(self, tau: float, upsilon: float, g: float = 0.1): self.name = "Exponential" - self.pulse: Pulse = None + self.pulse: "Pulse" = None self.tau: float = float(tau) self.upsilon: float = float(upsilon) self.g: float = float(g) def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: """The envelope waveform of the i component of the pulse.""" - - if self.pulse: - num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - x = np.arange(0, num_samples, 1) - waveform = Waveform( - self.pulse.amplitude - * ( - (np.ones(num_samples) * np.exp(-x / self.upsilon)) - + self.g * np.exp(-x / self.tau) - ) - / (1 + self.g) + num_samples = int(np.rint(self.pulse.duration * sampling_rate)) + x = np.arange(0, num_samples, 1) + return ( + self.pulse.amplitude + * ( + (np.ones(num_samples) * np.exp(-x / self.upsilon)) + + self.g * np.exp(-x / self.tau) ) - - return waveform - raise ShapeInitError + / (1 + self.g) + ) def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: """The envelope waveform of the q component of the pulse.""" - - if self.pulse: - num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - waveform = Waveform(np.zeros(num_samples)) - return waveform - raise ShapeInitError + num_samples = int(np.rint(self.pulse.duration * sampling_rate)) + return np.zeros(num_samples) def __repr__(self): return f"{self.name}({format(self.tau, '.3f').rstrip('0').rstrip('.')}, {format(self.upsilon, '.3f').rstrip('0').rstrip('.')}, {format(self.g, '.3f').rstrip('0').rstrip('.')})" @@ -222,7 +208,7 @@ class Gaussian(PulseShape): def __init__(self, rel_sigma: float): self.name = "Gaussian" - self.pulse: Pulse = None + self.pulse: "Pulse" = None self.rel_sigma: float = float(rel_sigma) def __eq__(self, item) -> bool: @@ -237,27 +223,19 @@ def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: if self.pulse: num_samples = int(np.rint(self.pulse.duration * sampling_rate)) x = np.arange(0, num_samples, 1) - waveform = Waveform( - self.pulse.amplitude - * np.exp( - -(1 / 2) - * ( - ((x - (num_samples - 1) / 2) ** 2) - / (((num_samples) / self.rel_sigma) ** 2) - ) + return self.pulse.amplitude * np.exp( + -(1 / 2) + * ( + ((x - (num_samples - 1) / 2) ** 2) + / (((num_samples) / self.rel_sigma) ** 2) ) ) - return waveform raise ShapeInitError def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: """The envelope waveform of the q component of the pulse.""" - - if self.pulse: - num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - waveform = Waveform(np.zeros(num_samples)) - return waveform - raise ShapeInitError + num_samples = int(np.rint(self.pulse.duration * sampling_rate)) + return np.zeros(num_samples) def __repr__(self): return f"{self.name}({format(self.rel_sigma, '.6f').rstrip('0').rstrip('.')})" @@ -277,7 +255,7 @@ class GaussianSquare(PulseShape): def __init__(self, rel_sigma: float, width: float): self.name = "GaussianSquare" - self.pulse: Pulse = None + self.pulse: "Pulse" = None self.rel_sigma: float = float(rel_sigma) self.width: float = float(width) @@ -290,43 +268,34 @@ def __eq__(self, item) -> bool: def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: """The envelope waveform of the i component of the pulse.""" - if self.pulse: - - def gaussian(t, rel_sigma, gaussian_samples): - mu = (2 * gaussian_samples - 1) / 2 - sigma = (2 * gaussian_samples) / rel_sigma - return np.exp(-0.5 * ((t - mu) / sigma) ** 2) + def gaussian(t, rel_sigma, gaussian_samples): + mu = (2 * gaussian_samples - 1) / 2 + sigma = (2 * gaussian_samples) / rel_sigma + return np.exp(-0.5 * ((t - mu) / sigma) ** 2) - def fvec(t, gaussian_samples, rel_sigma, length=None): - if length is None: - length = t.shape[0] + def fvec(t, gaussian_samples, rel_sigma, length=None): + if length is None: + length = t.shape[0] - pulse = np.ones_like(t, dtype=float) - rise = t < gaussian_samples - fall = t > length - gaussian_samples - 1 - pulse[rise] = gaussian(t[rise], rel_sigma, gaussian_samples) - pulse[fall] = gaussian(t[rise], rel_sigma, gaussian_samples)[::-1] - return pulse + pulse = np.ones_like(t, dtype=float) + rise = t < gaussian_samples + fall = t > length - gaussian_samples - 1 + pulse[rise] = gaussian(t[rise], rel_sigma, gaussian_samples) + pulse[fall] = gaussian(t[rise], rel_sigma, gaussian_samples)[::-1] + return pulse - num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - gaussian_samples = num_samples * (1 - self.width) // 2 - t = np.arange(0, num_samples) - - pulse = fvec(t, gaussian_samples, rel_sigma=self.rel_sigma) + num_samples = int(np.rint(self.pulse.duration * sampling_rate)) + gaussian_samples = num_samples * (1 - self.width) // 2 + t = np.arange(0, num_samples) - waveform = Waveform(self.pulse.amplitude * pulse) - return waveform + pulse = fvec(t, gaussian_samples, rel_sigma=self.rel_sigma) - raise ShapeInitError + return self.pulse.amplitude * pulse def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: """The envelope waveform of the q component of the pulse.""" - - if self.pulse: - num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - waveform = Waveform(np.zeros(num_samples)) - return waveform - raise ShapeInitError + num_samples = int(np.rint(self.pulse.duration * sampling_rate)) + return np.zeros(num_samples) def __repr__(self): return f"{self.name}({format(self.rel_sigma, '.6f').rstrip('0').rstrip('.')}, {format(self.width, '.6f').rstrip('0').rstrip('.')})" @@ -343,7 +312,7 @@ class Drag(PulseShape): def __init__(self, rel_sigma, beta): self.name = "Drag" - self.pulse: Pulse = None + self.pulse: "Pulse" = None self.rel_sigma = float(rel_sigma) self.beta = float(beta) @@ -355,42 +324,33 @@ def __eq__(self, item) -> bool: def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: """The envelope waveform of the i component of the pulse.""" - - if self.pulse: - num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - x = np.arange(0, num_samples, 1) - i = self.pulse.amplitude * np.exp( - -(1 / 2) - * ( - ((x - (num_samples - 1) / 2) ** 2) - / (((num_samples) / self.rel_sigma) ** 2) - ) + num_samples = int(np.rint(self.pulse.duration * sampling_rate)) + x = np.arange(0, num_samples, 1) + return self.pulse.amplitude * np.exp( + -(1 / 2) + * ( + ((x - (num_samples - 1) / 2) ** 2) + / (((num_samples) / self.rel_sigma) ** 2) ) - waveform = Waveform(i) - return waveform - raise ShapeInitError + ) def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: """The envelope waveform of the q component of the pulse.""" - - if self.pulse: - num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - x = np.arange(0, num_samples, 1) - i = self.pulse.amplitude * np.exp( - -(1 / 2) - * ( - ((x - (num_samples - 1) / 2) ** 2) - / (((num_samples) / self.rel_sigma) ** 2) - ) + num_samples = int(np.rint(self.pulse.duration * sampling_rate)) + x = np.arange(0, num_samples, 1) + i = self.pulse.amplitude * np.exp( + -(1 / 2) + * ( + ((x - (num_samples - 1) / 2) ** 2) + / (((num_samples) / self.rel_sigma) ** 2) ) - q = ( - self.beta - * (-(x - (num_samples - 1) / 2) / ((num_samples / self.rel_sigma) ** 2)) - * i - ) - waveform = Waveform(q) - return waveform - raise ShapeInitError + ) + return ( + self.beta + * (-(x - (num_samples - 1) / 2) / ((num_samples / self.rel_sigma) ** 2)) + * i + * sampling_rate + ) def __repr__(self): return f"{self.name}({format(self.rel_sigma, '.6f').rstrip('0').rstrip('.')}, {format(self.beta, '.6f').rstrip('0').rstrip('.')})" @@ -407,7 +367,7 @@ class IIR(PulseShape): def __init__(self, b, a, target: PulseShape): self.name = "IIR" self.target: PulseShape = target - self._pulse: Pulse = None + self._pulse: "Pulse" = None self.a: np.ndarray = np.array(a) self.b: np.ndarray = np.array(b) # Check len(a) = len(b) = 2 @@ -433,45 +393,35 @@ def pulse(self, value): def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: """The envelope waveform of the i component of the pulse.""" - - if self.pulse: - num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - self.a = self.a / self.a[0] - gain = np.sum(self.b) / np.sum(self.a) - if not gain == 0: - self.b = self.b / gain - data = lfilter( - b=self.b, - a=self.a, - x=self.target.envelope_waveform_i(sampling_rate).data, - ) - if not np.max(np.abs(data)) == 0: - data = data / np.max(np.abs(data)) - data = np.abs(self.pulse.amplitude) * data - waveform = Waveform(data) - return waveform - raise ShapeInitError + num_samples = int(np.rint(self.pulse.duration * sampling_rate)) + self.a = self.a / self.a[0] + gain = np.sum(self.b) / np.sum(self.a) + if not gain == 0: + self.b = self.b / gain + data = lfilter( + b=self.b, + a=self.a, + x=self.target.envelope_waveform_i(sampling_rate), + ) + if not np.max(np.abs(data)) == 0: + data = data / np.max(np.abs(data)) + return np.abs(self.pulse.amplitude) * data def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: """The envelope waveform of the q component of the pulse.""" - - if self.pulse: - num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - self.a = self.a / self.a[0] - gain = np.sum(self.b) / np.sum(self.a) - if not gain == 0: - self.b = self.b / gain - data = lfilter( - b=self.b, - a=self.a, - x=self.target.envelope_waveform_q(sampling_rate).data, - ) - if not np.max(np.abs(data)) == 0: - data = data / np.max(np.abs(data)) - data = np.abs(self.pulse.amplitude) * data - waveform = Waveform(data) - return waveform - raise ShapeInitError + num_samples = int(np.rint(self.pulse.duration * sampling_rate)) + self.a = self.a / self.a[0] + gain = np.sum(self.b) / np.sum(self.a) + if not gain == 0: + self.b = self.b / gain + data = lfilter( + b=self.b, + a=self.a, + x=self.target.envelope_waveform_q(sampling_rate), + ) + if not np.max(np.abs(data)) == 0: + data = data / np.max(np.abs(data)) + return np.abs(self.pulse.amplitude) * data def __repr__(self): formatted_b = [round(b, 3) for b in self.b] @@ -488,7 +438,7 @@ class SNZ(PulseShape): def __init__(self, t_idling, b_amplitude=None): self.name = "SNZ" - self.pulse: Pulse = None + self.pulse: "Pulse" = None self.t_idling: float = t_idling self.b_amplitude = b_amplitude @@ -502,42 +452,32 @@ def __eq__(self, item) -> bool: def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: """The envelope waveform of the i component of the pulse.""" - - if self.pulse: - if self.t_idling > self.pulse.duration: - raise ValueError( - f"Cannot put idling time {self.t_idling} higher than duration {self.pulse.duration}." - ) - if self.b_amplitude is None: - self.b_amplitude = self.pulse.amplitude / 2 - num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - half_pulse_duration = (self.pulse.duration - self.t_idling) / 2 - half_flux_pulse_samples = int( - np.rint(num_samples * half_pulse_duration / self.pulse.duration) + if self.t_idling > self.pulse.duration: + raise ValueError( + f"Cannot put idling time {self.t_idling} higher than duration {self.pulse.duration}." ) - idling_samples = num_samples - 2 * half_flux_pulse_samples - waveform = Waveform( - np.concatenate( - ( - self.pulse.amplitude * np.ones(half_flux_pulse_samples - 1), - np.array([self.b_amplitude]), - np.zeros(idling_samples), - -np.array([self.b_amplitude]), - -self.pulse.amplitude * np.ones(half_flux_pulse_samples - 1), - ) - ) + if self.b_amplitude is None: + self.b_amplitude = self.pulse.amplitude / 2 + num_samples = int(np.rint(self.pulse.duration * sampling_rate)) + half_pulse_duration = (self.pulse.duration - self.t_idling) / 2 + half_flux_pulse_samples = int( + np.rint(num_samples * half_pulse_duration / self.pulse.duration) + ) + idling_samples = num_samples - 2 * half_flux_pulse_samples + return np.concatenate( + ( + self.pulse.amplitude * np.ones(half_flux_pulse_samples - 1), + np.array([self.b_amplitude]), + np.zeros(idling_samples), + -np.array([self.b_amplitude]), + -self.pulse.amplitude * np.ones(half_flux_pulse_samples - 1), ) - return waveform - raise ShapeInitError + ) def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: """The envelope waveform of the q component of the pulse.""" - - if self.pulse: - num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - waveform = Waveform(np.zeros(num_samples)) - return waveform - raise ShapeInitError + num_samples = int(np.rint(self.pulse.duration * sampling_rate)) + return np.zeros(num_samples) def __repr__(self): return f"{self.name}({self.t_idling})" @@ -557,7 +497,7 @@ class eCap(PulseShape): def __init__(self, alpha: float): self.name = "eCap" - self.pulse: Pulse = None + self.pulse: "Pulse" = None self.alpha: float = float(alpha) def __eq__(self, item) -> bool: @@ -567,24 +507,18 @@ def __eq__(self, item) -> bool: return False def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: - if self.pulse: - num_samples = int(self.pulse.duration * sampling_rate) - x = np.arange(0, num_samples, 1) - waveform = Waveform( - self.pulse.amplitude - * (1 + np.tanh(self.alpha * x / num_samples)) - * (1 + np.tanh(self.alpha * (1 - x / num_samples))) - / (1 + np.tanh(self.alpha / 2)) ** 2 - ) - return waveform - raise ShapeInitError + num_samples = int(self.pulse.duration * sampling_rate) + x = np.arange(0, num_samples, 1) + return ( + self.pulse.amplitude + * (1 + np.tanh(self.alpha * x / num_samples)) + * (1 + np.tanh(self.alpha * (1 - x / num_samples))) + / (1 + np.tanh(self.alpha / 2)) ** 2 + ) def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: - if self.pulse: - num_samples = int(self.pulse.duration * sampling_rate) - waveform = Waveform(np.zeros(num_samples)) - return waveform - raise ShapeInitError + num_samples = int(self.pulse.duration * sampling_rate) + return np.zeros(num_samples) def __repr__(self): return f"{self.name}({format(self.alpha, '.6f').rstrip('0').rstrip('.')})" @@ -595,7 +529,7 @@ class Custom(PulseShape): def __init__(self, envelope_i, envelope_q=None): self.name = "Custom" - self.pulse: Pulse = None + self.pulse: "Pulse" = None self.envelope_i: np.ndarray = np.array(envelope_i) if envelope_q is not None: self.envelope_q: np.ndarray = np.array(envelope_q) @@ -604,27 +538,19 @@ def __init__(self, envelope_i, envelope_q=None): def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: """The envelope waveform of the i component of the pulse.""" + if self.pulse.duration != len(self.envelope_i): + raise ValueError("Length of envelope_i must be equal to pulse duration") + num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - if self.pulse: - if self.pulse.duration != len(self.envelope_i): - raise ValueError("Length of envelope_i must be equal to pulse duration") - num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - - waveform = Waveform(self.envelope_i * self.pulse.amplitude) - return waveform - raise ShapeInitError + return self.envelope_i * self.pulse.amplitude def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: """The envelope waveform of the q component of the pulse.""" + if self.pulse.duration != len(self.envelope_q): + raise ValueError("Length of envelope_q must be equal to pulse duration") + num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - if self.pulse: - if self.pulse.duration != len(self.envelope_q): - raise ValueError("Length of envelope_q must be equal to pulse duration") - num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - - waveform = Waveform(self.envelope_q * self.pulse.amplitude) - return waveform - raise ShapeInitError + return self.envelope_q * self.pulse.amplitude def __repr__(self): return f"{self.name}({self.envelope_i[:3]}, ..., {self.envelope_q[:3]}, ...)" From 003ec2622d5dcf67d2d0f9287746288f852b4ec9 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 23 Feb 2024 19:55:58 +0100 Subject: [PATCH 0114/1006] feat: Sketch the new Shape template --- src/qibolab/pulses/shape.py | 53 ++++++++----------------------------- 1 file changed, 11 insertions(+), 42 deletions(-) diff --git a/src/qibolab/pulses/shape.py b/src/qibolab/pulses/shape.py index 935028a103..16999a0f09 100644 --- a/src/qibolab/pulses/shape.py +++ b/src/qibolab/pulses/shape.py @@ -1,7 +1,7 @@ """PulseShape class.""" -import re from abc import ABC, abstractmethod +from dataclasses import dataclass import numpy as np import numpy.typing as npt @@ -14,6 +14,7 @@ a different value. """ +Times = npt.NDArray[np.float64] # TODO: they could be distinguished among them, and distinguished from generic float # arrays, using the NewType pattern -> but this require some more effort to encforce # types throughout the whole code base @@ -79,58 +80,26 @@ def demodulate( return np.sqrt(2) * np.einsum("ijt,jt->it", demod, modulated) -class PulseShape(ABC): +class Shape(ABC): """Pulse envelopes. Generates both i (in-phase) and q (quadrature) components. """ - pulse = None - """Pulse (Pulse): the pulse associated with it. - - Its parameters are used to generate pulse waveforms. - """ - @abstractmethod - def envelope_waveform_i( - self, sampling_rate=SAMPLING_RATE - ) -> Waveform: # pragma: no cover - raise NotImplementedError + def i(self, times: Times) -> Waveform: + """In-phase envelope.""" @abstractmethod - def envelope_waveform_q( - self, sampling_rate=SAMPLING_RATE - ) -> Waveform: # pragma: no cover - raise NotImplementedError - - def envelope_waveforms(self, sampling_rate=SAMPLING_RATE): - """A tuple with the i and q envelope waveforms of the pulse.""" - - return ( - self.envelope_waveform_i(sampling_rate), - self.envelope_waveform_q(sampling_rate), - ) - - def __eq__(self, item) -> bool: - """Overloads == operator.""" - return isinstance(item, type(self)) - - @staticmethod - def eval(value: str) -> "PulseShape": - """Deserialize string representation. - - .. todo:: + def q(self, times: Times) -> Waveform: + """Quadrature envelope.""" - To be replaced by proper serialization. - """ - shape_name = re.findall(r"(\w+)", value)[0] - if shape_name not in globals(): - raise ValueError(f"shape {value} not found") - shape_parameters = re.findall(r"[\w+\d\.\d]+", value)[1:] - # TODO: create multiple tests to prove regex working correctly - return globals()[shape_name](*shape_parameters) + def envelopes(self, times: Times) -> IqWaveform: + """Stacked i and q envelope waveforms of the pulse.""" + return np.array(self.i(times), self.q(times)) +@dataclass(frozen=True) class Rectangular(PulseShape): """Rectangular pulse shape.""" From 48935624e697a0b5c00daaa3e0638cb9b4788d4c Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 23 Feb 2024 20:04:23 +0100 Subject: [PATCH 0115/1006] feat: Trim the Rectangular pulse --- src/qibolab/pulses/shape.py | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/src/qibolab/pulses/shape.py b/src/qibolab/pulses/shape.py index 16999a0f09..02e6d09fa1 100644 --- a/src/qibolab/pulses/shape.py +++ b/src/qibolab/pulses/shape.py @@ -100,25 +100,18 @@ def envelopes(self, times: Times) -> IqWaveform: @dataclass(frozen=True) -class Rectangular(PulseShape): - """Rectangular pulse shape.""" +class Rectangular(Shape): + """Rectangular envelope.""" - def __init__(self): - self.name = "Rectangular" - self.pulse: "Pulse" = None - - def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: - """The envelope waveform of the i component of the pulse.""" - num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - return self.pulse.amplitude * np.ones(num_samples) + amplitude: float - def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: - """The envelope waveform of the q component of the pulse.""" - num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - return np.zeros(num_samples) + def i(self, times: Times) -> Waveform: + """Generate a rectangular envelope.""" + return self.amplitude * np.ones_like(times) - def __repr__(self): - return f"{self.name}()" + def q(self, times: Times) -> Waveform: + """Generate an identically null signal.""" + return np.zeros_like(times) class Exponential(PulseShape): From bff5ec37b614a1e77bd969a1cf0a9c03fb9e8484 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 23 Feb 2024 20:05:34 +0100 Subject: [PATCH 0116/1006] feat: Add a Shapes enum, for sum-types deserialization --- src/qibolab/pulses/shape.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/qibolab/pulses/shape.py b/src/qibolab/pulses/shape.py index 02e6d09fa1..a6adb8ae74 100644 --- a/src/qibolab/pulses/shape.py +++ b/src/qibolab/pulses/shape.py @@ -2,6 +2,7 @@ from abc import ABC, abstractmethod from dataclasses import dataclass +from enum import Enum import numpy as np import numpy.typing as npt @@ -114,6 +115,12 @@ def q(self, times: Times) -> Waveform: return np.zeros_like(times) +class Shapes(Enum): + """Available pulse shapes.""" + + rectangular = Rectangular + + class Exponential(PulseShape): r"""Exponential pulse shape (Square pulse with an exponential decay). From fdd47837de651c5d59491dfce4761c176d717ddd Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 23 Feb 2024 20:14:38 +0100 Subject: [PATCH 0117/1006] feat: Rework the Exponential shape First non-trivial vectorization example --- src/qibolab/pulses/shape.py | 58 +++++++++++++++---------------------- 1 file changed, 23 insertions(+), 35 deletions(-) diff --git a/src/qibolab/pulses/shape.py b/src/qibolab/pulses/shape.py index a6adb8ae74..aab19e37c6 100644 --- a/src/qibolab/pulses/shape.py +++ b/src/qibolab/pulses/shape.py @@ -115,53 +115,41 @@ def q(self, times: Times) -> Waveform: return np.zeros_like(times) -class Shapes(Enum): - """Available pulse shapes.""" - - rectangular = Rectangular - - -class Exponential(PulseShape): - r"""Exponential pulse shape (Square pulse with an exponential decay). - - Args: - tau (float): Parameter that controls the decay of the first exponential function - upsilon (float): Parameter that controls the decay of the second exponential function - g (float): Parameter that weights the second exponential function - +@dataclass(frozen=True) +class Exponential(Shape): + r"""Exponential shape, i.e. square pulse with an exponential decay. .. math:: A\frac{\exp\left(-\frac{x}{\text{upsilon}}\right) + g \exp\left(-\frac{x}{\text{tau}}\right)}{1 + g} """ - def __init__(self, tau: float, upsilon: float, g: float = 0.1): - self.name = "Exponential" - self.pulse: "Pulse" = None - self.tau: float = float(tau) - self.upsilon: float = float(upsilon) - self.g: float = float(g) + amplitude: float + tau: float + """The decay rate of the first exponential function.""" + upsilon: float + """The decay rate of the second exponential function.""" + g: float = 0.1 + """Weight of the second exponential function.""" - def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: - """The envelope waveform of the i component of the pulse.""" - num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - x = np.arange(0, num_samples, 1) + def i(self, times: Times) -> Waveform: + """Generate a combination of two exponential decays.""" return ( - self.pulse.amplitude - * ( - (np.ones(num_samples) * np.exp(-x / self.upsilon)) - + self.g * np.exp(-x / self.tau) - ) + self.amplitude + * (np.exp(-times / self.upsilon) + self.g * np.exp(-times / self.tau)) / (1 + self.g) ) - def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: - """The envelope waveform of the q component of the pulse.""" - num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - return np.zeros(num_samples) + def q(self, times: Times) -> Waveform: + """Generate an identically null signal.""" + return np.zeros_like(times) - def __repr__(self): - return f"{self.name}({format(self.tau, '.3f').rstrip('0').rstrip('.')}, {format(self.upsilon, '.3f').rstrip('0').rstrip('.')}, {format(self.g, '.3f').rstrip('0').rstrip('.')})" + +class Shapes(Enum): + """Available pulse shapes.""" + + rectangular = Rectangular + exponential = Exponential class Gaussian(PulseShape): From 6ddbd0a8ea45ddeeed482277c69c2b0cddebfa90 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 28 Feb 2024 18:10:27 +0100 Subject: [PATCH 0118/1006] feat!: Move Gaussian pulse to new shape --- src/qibolab/pulses/shape.py | 61 ++++++++++++++----------------------- 1 file changed, 23 insertions(+), 38 deletions(-) diff --git a/src/qibolab/pulses/shape.py b/src/qibolab/pulses/shape.py index aab19e37c6..6845f10a01 100644 --- a/src/qibolab/pulses/shape.py +++ b/src/qibolab/pulses/shape.py @@ -145,60 +145,45 @@ def q(self, times: Times) -> Waveform: return np.zeros_like(times) -class Shapes(Enum): - """Available pulse shapes.""" - - rectangular = Rectangular - exponential = Exponential - - -class Gaussian(PulseShape): +@dataclass(frozen=True) +class Gaussian(Shape): r"""Gaussian pulse shape. Args: - rel_sigma (float): relative sigma so that the pulse standard deviation (sigma) = duration / rel_sigma + rel_sigma (float): .. math:: A\exp^{-\frac{1}{2}\frac{(t-\mu)^2}{\sigma^2}} """ - def __init__(self, rel_sigma: float): - self.name = "Gaussian" - self.pulse: "Pulse" = None - self.rel_sigma: float = float(rel_sigma) + amplitude: float + mu: float + sigma: float + """Relative standard deviation. - def __eq__(self, item) -> bool: - """Overloads == operator.""" - if super().__eq__(item): - return self.rel_sigma == item.rel_sigma - return False + The pulse standard deviation will then be `sigma = duration / + rel_sigma`. + """ - def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: - """The envelope waveform of the i component of the pulse.""" + def i(self, times: Times) -> Waveform: + """Generate a Gaussian window.""" + return self.amplitude * np.exp(-(((times - self.mu) / self.sigma) ** 2) / 2) - if self.pulse: - num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - x = np.arange(0, num_samples, 1) - return self.pulse.amplitude * np.exp( - -(1 / 2) - * ( - ((x - (num_samples - 1) / 2) ** 2) - / (((num_samples) / self.rel_sigma) ** 2) - ) - ) - raise ShapeInitError + def q(self, times: Times) -> Waveform: + """Generate an indentically null signal.""" + return np.zeros_like(times) - def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: - """The envelope waveform of the q component of the pulse.""" - num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - return np.zeros(num_samples) - def __repr__(self): - return f"{self.name}({format(self.rel_sigma, '.6f').rstrip('0').rstrip('.')})" +class Shapes(Enum): + """Available pulse shapes.""" + + RECTANGULAR = Rectangular + EXPONENTIAL = Exponential + GAUSSIAN = Gaussian -class GaussianSquare(PulseShape): +class GaussianSquare(Shape): r"""GaussianSquare pulse shape. Args: From 4c7136c12f61249068cb999e1bdc97ebe8592d79 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 28 Feb 2024 18:36:49 +0100 Subject: [PATCH 0119/1006] feat: Add default implementation for shape components --- src/qibolab/pulses/shape.py | 24 ++++-------------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/src/qibolab/pulses/shape.py b/src/qibolab/pulses/shape.py index 6845f10a01..d3c12ea3c9 100644 --- a/src/qibolab/pulses/shape.py +++ b/src/qibolab/pulses/shape.py @@ -87,13 +87,13 @@ class Shape(ABC): Generates both i (in-phase) and q (quadrature) components. """ - @abstractmethod def i(self, times: Times) -> Waveform: """In-phase envelope.""" + return np.zeros_like(times) - @abstractmethod def q(self, times: Times) -> Waveform: """Quadrature envelope.""" + return np.zeros_like(times) def envelopes(self, times: Times) -> IqWaveform: """Stacked i and q envelope waveforms of the pulse.""" @@ -110,10 +110,6 @@ def i(self, times: Times) -> Waveform: """Generate a rectangular envelope.""" return self.amplitude * np.ones_like(times) - def q(self, times: Times) -> Waveform: - """Generate an identically null signal.""" - return np.zeros_like(times) - @dataclass(frozen=True) class Exponential(Shape): @@ -140,10 +136,6 @@ def i(self, times: Times) -> Waveform: / (1 + self.g) ) - def q(self, times: Times) -> Waveform: - """Generate an identically null signal.""" - return np.zeros_like(times) - @dataclass(frozen=True) class Gaussian(Shape): @@ -159,22 +151,14 @@ class Gaussian(Shape): amplitude: float mu: float + """Gaussian mean.""" sigma: float - """Relative standard deviation. - - The pulse standard deviation will then be `sigma = duration / - rel_sigma`. - """ + """Gaussian standard deviation.""" def i(self, times: Times) -> Waveform: """Generate a Gaussian window.""" return self.amplitude * np.exp(-(((times - self.mu) / self.sigma) ** 2) / 2) - def q(self, times: Times) -> Waveform: - """Generate an indentically null signal.""" - return np.zeros_like(times) - - class Shapes(Enum): """Available pulse shapes.""" From 06d4675555ef6863a6283fe3e032772b3126fca9 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 28 Feb 2024 18:48:06 +0100 Subject: [PATCH 0120/1006] feat!: Move GaussianSquare to new shape --- src/qibolab/pulses/shape.py | 79 +++++++++++++------------------------ 1 file changed, 27 insertions(+), 52 deletions(-) diff --git a/src/qibolab/pulses/shape.py b/src/qibolab/pulses/shape.py index d3c12ea3c9..b01f2c1b7f 100644 --- a/src/qibolab/pulses/shape.py +++ b/src/qibolab/pulses/shape.py @@ -1,6 +1,6 @@ """PulseShape class.""" -from abc import ABC, abstractmethod +from abc import ABC from dataclasses import dataclass from enum import Enum @@ -137,6 +137,11 @@ def i(self, times: Times) -> Waveform: ) +def _gaussian(t, mu, sigma): + """Gaussian function, normalized to be 1 at the max.""" + return np.exp(-(((t - mu) / sigma) ** 2) / 2) + + @dataclass(frozen=True) class Gaussian(Shape): r"""Gaussian pulse shape. @@ -157,74 +162,44 @@ class Gaussian(Shape): def i(self, times: Times) -> Waveform: """Generate a Gaussian window.""" - return self.amplitude * np.exp(-(((times - self.mu) / self.sigma) ** 2) / 2) - -class Shapes(Enum): - """Available pulse shapes.""" - - RECTANGULAR = Rectangular - EXPONENTIAL = Exponential - GAUSSIAN = Gaussian + return self.amplitude * _gaussian(times, self.mu, self.sigma) +@dataclass(frozen=True) class GaussianSquare(Shape): r"""GaussianSquare pulse shape. - Args: - rel_sigma (float): relative sigma so that the pulse standard deviation (sigma) = duration / rel_sigma - width (float): Percentage of the pulse that is flat - .. math:: A\exp^{-\frac{1}{2}\frac{(t-\mu)^2}{\sigma^2}}[Rise] + Flat + A\exp^{-\frac{1}{2}\frac{(t-\mu)^2}{\sigma^2}}[Decay] """ - def __init__(self, rel_sigma: float, width: float): - self.name = "GaussianSquare" - self.pulse: "Pulse" = None - self.rel_sigma: float = float(rel_sigma) - self.width: float = float(width) - - def __eq__(self, item) -> bool: - """Overloads == operator.""" - if super().__eq__(item): - return self.rel_sigma == item.rel_sigma and self.width == item.width - return False + amplitude: float + mu: float + """Gaussian mean.""" + sigma: float + """Gaussian standard deviation.""" + width: float + """Length of the flat portion.""" - def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: + def i(self, times: Times) -> Waveform: """The envelope waveform of the i component of the pulse.""" - def gaussian(t, rel_sigma, gaussian_samples): - mu = (2 * gaussian_samples - 1) / 2 - sigma = (2 * gaussian_samples) / rel_sigma - return np.exp(-0.5 * ((t - mu) / sigma) ** 2) - - def fvec(t, gaussian_samples, rel_sigma, length=None): - if length is None: - length = t.shape[0] - - pulse = np.ones_like(t, dtype=float) - rise = t < gaussian_samples - fall = t > length - gaussian_samples - 1 - pulse[rise] = gaussian(t[rise], rel_sigma, gaussian_samples) - pulse[fall] = gaussian(t[rise], rel_sigma, gaussian_samples)[::-1] - return pulse - - num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - gaussian_samples = num_samples * (1 - self.width) // 2 - t = np.arange(0, num_samples) + pulse = np.ones_like(times) + u, hw = self.mu, self.width / 2 + tails = (times < (u - hw)) | ((u + hw) < times) + pulse[tails] = _gaussian(times[tails], self.mu, self.sigma) - pulse = fvec(t, gaussian_samples, rel_sigma=self.rel_sigma) + return self.amplitude * pulse - return self.pulse.amplitude * pulse - def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: - """The envelope waveform of the q component of the pulse.""" - num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - return np.zeros(num_samples) +class Shapes(Enum): + """Available pulse shapes.""" - def __repr__(self): - return f"{self.name}({format(self.rel_sigma, '.6f').rstrip('0').rstrip('.')}, {format(self.width, '.6f').rstrip('0').rstrip('.')})" + RECTANGULAR = Rectangular + EXPONENTIAL = Exponential + GAUSSIAN = Gaussian + GAUSSIAN_SQUARE = GaussianSquare class Drag(PulseShape): From c5bbb8c11af6d6599f6e77e4563595da412b172c Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 28 Feb 2024 19:01:42 +0100 Subject: [PATCH 0121/1006] feat!: Move DRAG to new shape --- src/qibolab/pulses/shape.py | 88 ++++++++++++++----------------------- 1 file changed, 34 insertions(+), 54 deletions(-) diff --git a/src/qibolab/pulses/shape.py b/src/qibolab/pulses/shape.py index b01f2c1b7f..a7b4f749fd 100644 --- a/src/qibolab/pulses/shape.py +++ b/src/qibolab/pulses/shape.py @@ -139,6 +139,9 @@ def i(self, times: Times) -> Waveform: def _gaussian(t, mu, sigma): """Gaussian function, normalized to be 1 at the max.""" + # TODO: if a centered Gaussian has to be used, and we agree that `Times` should + # always be the full window, just use `scipy.signal.gaussian`, that is exactly this + # function, autcomputing the mean from the number of points return np.exp(-(((t - mu) / sigma) ** 2) / 2) @@ -183,7 +186,7 @@ class GaussianSquare(Shape): """Length of the flat portion.""" def i(self, times: Times) -> Waveform: - """The envelope waveform of the i component of the pulse.""" + """Generate a Gaussian envelope, with a flat central window.""" pulse = np.ones_like(times) u, hw = self.mu, self.width / 2 @@ -193,68 +196,45 @@ def i(self, times: Times) -> Waveform: return self.amplitude * pulse -class Shapes(Enum): - """Available pulse shapes.""" +@dataclass(frozen=True) +class Drag(Shape): + """Derivative Removal by Adiabatic Gate (DRAG) pulse shape. - RECTANGULAR = Rectangular - EXPONENTIAL = Exponential - GAUSSIAN = Gaussian - GAUSSIAN_SQUARE = GaussianSquare + .. todo:: + - add expression + - add reference + """ -class Drag(PulseShape): - """Derivative Removal by Adiabatic Gate (DRAG) pulse shape. + amplitude: float + mu: float + """Gaussian mean.""" + sigma: float + """Gaussian standard deviation.""" + beta: float + """.. todo::""" - Args: - rel_sigma (float): relative sigma so that the pulse standard deviation (sigma) = duration / rel_sigma - beta (float): relative sigma so that the pulse standard deviation (sigma) = duration / rel_sigma - .. math:: - """ + def i(self, times: Times) -> Waveform: + """Generate a Gaussian envelope.""" + return self.amplitude * _gaussian(times, self.mu, self.sigma) - def __init__(self, rel_sigma, beta): - self.name = "Drag" - self.pulse: "Pulse" = None - self.rel_sigma = float(rel_sigma) - self.beta = float(beta) + def q(self, times: Times) -> Waveform: + """Generate ... - def __eq__(self, item) -> bool: - """Overloads == operator.""" - if super().__eq__(item): - return self.rel_sigma == item.rel_sigma and self.beta == item.beta - return False + .. todo:: + """ + i = self.amplitude * _gaussian(times, self.mu, self.sigma) + return self.beta * (-(times - self.mu) / (self.sigma**2)) * i - def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: - """The envelope waveform of the i component of the pulse.""" - num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - x = np.arange(0, num_samples, 1) - return self.pulse.amplitude * np.exp( - -(1 / 2) - * ( - ((x - (num_samples - 1) / 2) ** 2) - / (((num_samples) / self.rel_sigma) ** 2) - ) - ) - def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: - """The envelope waveform of the q component of the pulse.""" - num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - x = np.arange(0, num_samples, 1) - i = self.pulse.amplitude * np.exp( - -(1 / 2) - * ( - ((x - (num_samples - 1) / 2) ** 2) - / (((num_samples) / self.rel_sigma) ** 2) - ) - ) - return ( - self.beta - * (-(x - (num_samples - 1) / 2) / ((num_samples / self.rel_sigma) ** 2)) - * i - * sampling_rate - ) +class Shapes(Enum): + """Available pulse shapes.""" - def __repr__(self): - return f"{self.name}({format(self.rel_sigma, '.6f').rstrip('0').rstrip('.')}, {format(self.beta, '.6f').rstrip('0').rstrip('.')})" + RECTANGULAR = Rectangular + EXPONENTIAL = Exponential + GAUSSIAN = Gaussian + GAUSSIAN_SQUARE = GaussianSquare + DRAG = Drag class IIR(PulseShape): From e56ea0ca36ec25cc0ab7d3e9e6fbcaed4df0ece9 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 28 Feb 2024 19:12:25 +0100 Subject: [PATCH 0122/1006] feat!: Move IIR to new shape --- src/qibolab/pulses/shape.py | 97 +++++++++++-------------------------- 1 file changed, 29 insertions(+), 68 deletions(-) diff --git a/src/qibolab/pulses/shape.py b/src/qibolab/pulses/shape.py index a7b4f749fd..6a2f5bb0e4 100644 --- a/src/qibolab/pulses/shape.py +++ b/src/qibolab/pulses/shape.py @@ -227,17 +227,8 @@ def q(self, times: Times) -> Waveform: return self.beta * (-(times - self.mu) / (self.sigma**2)) * i -class Shapes(Enum): - """Available pulse shapes.""" - - RECTANGULAR = Rectangular - EXPONENTIAL = Exponential - GAUSSIAN = Gaussian - GAUSSIAN_SQUARE = GaussianSquare - DRAG = Drag - - -class IIR(PulseShape): +@dataclass(frozen=True) +class Iir(Shape): """IIR Filter using scipy.signal lfilter.""" # https://arxiv.org/pdf/1907.04818.pdf (page 11 - filter formula S22) @@ -245,69 +236,39 @@ class IIR(PulseShape): # p = [b0 = 1−k +k ·α, b1 = −(1−k)·(1−α),a0 = 1 and a1 = −(1−α)] # p = [b0, b1, a0, a1] - def __init__(self, b, a, target: PulseShape): - self.name = "IIR" - self.target: PulseShape = target - self._pulse: "Pulse" = None - self.a: np.ndarray = np.array(a) - self.b: np.ndarray = np.array(b) - # Check len(a) = len(b) = 2 + amplitude: float + a: npt.NDArray + b: npt.NDArray + target: Shape - def __eq__(self, item) -> bool: - """Overloads == operator.""" - if super().__eq__(item): - return ( - self.target == item.target - and (self.a == item.a).all() - and (self.b == item.b).all() - ) - return False + def _data(self, target): + a = self.a / self.a[0] + gain = np.sum(self.b) / np.sum(a) + b = self.b / gain if gain != 0 else self.b + + data = lfilter(b=b, a=a, x=target) + if np.max(np.abs(data)) != 0: + data = data / np.max(np.abs(data)) + return data - @property - def pulse(self): - return self._pulse + def i(self, times: Times) -> Waveform: + """.. todo::""" + return self.amplitude * self._data(self.target.i(times)) - @pulse.setter - def pulse(self, value): - self._pulse = value - self.target.pulse = value + def q(self, times: Times) -> Waveform: + """.. todo::""" + return self.amplitude * self._data(self.target.q(times)) - def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: - """The envelope waveform of the i component of the pulse.""" - num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - self.a = self.a / self.a[0] - gain = np.sum(self.b) / np.sum(self.a) - if not gain == 0: - self.b = self.b / gain - data = lfilter( - b=self.b, - a=self.a, - x=self.target.envelope_waveform_i(sampling_rate), - ) - if not np.max(np.abs(data)) == 0: - data = data / np.max(np.abs(data)) - return np.abs(self.pulse.amplitude) * data - def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: - """The envelope waveform of the q component of the pulse.""" - num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - self.a = self.a / self.a[0] - gain = np.sum(self.b) / np.sum(self.a) - if not gain == 0: - self.b = self.b / gain - data = lfilter( - b=self.b, - a=self.a, - x=self.target.envelope_waveform_q(sampling_rate), - ) - if not np.max(np.abs(data)) == 0: - data = data / np.max(np.abs(data)) - return np.abs(self.pulse.amplitude) * data +class Shapes(Enum): + """Available pulse shapes.""" - def __repr__(self): - formatted_b = [round(b, 3) for b in self.b] - formatted_a = [round(a, 3) for a in self.a] - return f"{self.name}({formatted_b}, {formatted_a}, {self.target})" + RECTANGULAR = Rectangular + EXPONENTIAL = Exponential + GAUSSIAN = Gaussian + GAUSSIAN_SQUARE = GaussianSquare + DRAG = Drag + IIR = Iir class SNZ(PulseShape): From b83c9d1f3f2f9ef623a59472d67b965c69d524bf Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 28 Feb 2024 19:48:54 +0100 Subject: [PATCH 0123/1006] feat!: Move SNZ to new shape --- src/qibolab/pulses/shape.py | 92 ++++++++++++++++--------------------- 1 file changed, 39 insertions(+), 53 deletions(-) diff --git a/src/qibolab/pulses/shape.py b/src/qibolab/pulses/shape.py index 6a2f5bb0e4..0656e3aee4 100644 --- a/src/qibolab/pulses/shape.py +++ b/src/qibolab/pulses/shape.py @@ -260,69 +260,55 @@ def q(self, times: Times) -> Waveform: return self.amplitude * self._data(self.target.q(times)) -class Shapes(Enum): - """Available pulse shapes.""" - - RECTANGULAR = Rectangular - EXPONENTIAL = Exponential - GAUSSIAN = Gaussian - GAUSSIAN_SQUARE = GaussianSquare - DRAG = Drag - IIR = Iir - - -class SNZ(PulseShape): +@dataclass(frozen=True) +class Snz(Shape): """Sudden variant Net Zero. https://arxiv.org/abs/2008.07411 (Supplementary materials: FIG. S1.) + + .. todo:: + + - expression """ - def __init__(self, t_idling, b_amplitude=None): - self.name = "SNZ" - self.pulse: "Pulse" = None - self.t_idling: float = t_idling - self.b_amplitude = b_amplitude + amplitude: float + width: float + """Essentially, the pulse duration... - def __eq__(self, item) -> bool: - """Overloads == operator.""" - if super().__eq__(item): - return ( - self.t_idling == item.t_idling and self.b_amplitude == item.b_amplitude - ) - return False + .. todo:: - def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: - """The envelope waveform of the i component of the pulse.""" - if self.t_idling > self.pulse.duration: - raise ValueError( - f"Cannot put idling time {self.t_idling} higher than duration {self.pulse.duration}." - ) - if self.b_amplitude is None: - self.b_amplitude = self.pulse.amplitude / 2 - num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - half_pulse_duration = (self.pulse.duration - self.t_idling) / 2 - half_flux_pulse_samples = int( - np.rint(num_samples * half_pulse_duration / self.pulse.duration) - ) - idling_samples = num_samples - 2 * half_flux_pulse_samples - return np.concatenate( - ( - self.pulse.amplitude * np.ones(half_flux_pulse_samples - 1), - np.array([self.b_amplitude]), - np.zeros(idling_samples), - -np.array([self.b_amplitude]), - -self.pulse.amplitude * np.ones(half_flux_pulse_samples - 1), - ) - ) + - reset to duration, if decided so + """ + t_idling: float + b_amplitude: float = 0.5 + """Relative B amplitude (wrt A).""" - def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: - """The envelope waveform of the q component of the pulse.""" - num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - return np.zeros(num_samples) + def i(self, times: Times) -> Waveform: + """.. todo::""" + # convert timings to samples + half_pulse_duration = (self.width - self.t_idling) / 2 + aspan = np.sum(times < half_pulse_duration) + idle = len(times) - 2 * (aspan + 1) - def __repr__(self): - return f"{self.name}({self.t_idling})" + pulse = np.ones_like(times) + # the aspan + 1 sample is B (and so the aspan + 1 + idle + 1), indexes are 0-based + pulse[aspan] = pulse[aspan + 1 + idle] = self.b_amplitude + # set idle time to 0 + pulse[aspan + 1 : aspan + 1 + idle] = 0 + return self.amplitude * pulse + + +class Shapes(Enum): + """Available pulse shapes.""" + + RECTANGULAR = Rectangular + EXPONENTIAL = Exponential + GAUSSIAN = Gaussian + GAUSSIAN_SQUARE = GaussianSquare + DRAG = Drag + IIR = Iir + SNZ = Snz class eCap(PulseShape): From 4a2f4a0a59f0ac27160e322262cc171c1324b6a0 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 28 Feb 2024 19:57:22 +0100 Subject: [PATCH 0124/1006] feat!: Move eCap to new shape --- src/qibolab/pulses/shape.py | 60 +++++++++++++++---------------------- 1 file changed, 24 insertions(+), 36 deletions(-) diff --git a/src/qibolab/pulses/shape.py b/src/qibolab/pulses/shape.py index 0656e3aee4..bc17e5257b 100644 --- a/src/qibolab/pulses/shape.py +++ b/src/qibolab/pulses/shape.py @@ -299,23 +299,13 @@ def i(self, times: Times) -> Waveform: return self.amplitude * pulse -class Shapes(Enum): - """Available pulse shapes.""" - - RECTANGULAR = Rectangular - EXPONENTIAL = Exponential - GAUSSIAN = Gaussian - GAUSSIAN_SQUARE = GaussianSquare - DRAG = Drag - IIR = Iir - SNZ = Snz - - -class eCap(PulseShape): +@dataclass(frozen=True) +class ECap(Shape): r"""ECap pulse shape. - Args: - alpha (float): + .. todo:: + + - add reference .. math:: @@ -323,33 +313,31 @@ class eCap(PulseShape): &\times& [1 + \tanh(\alpha/2)]^{-2} """ - def __init__(self, alpha: float): - self.name = "eCap" - self.pulse: "Pulse" = None - self.alpha: float = float(alpha) - - def __eq__(self, item) -> bool: - """Overloads == operator.""" - if super().__eq__(item): - return self.alpha == item.alpha - return False + amplitude: float + alpha: float - def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: - num_samples = int(self.pulse.duration * sampling_rate) - x = np.arange(0, num_samples, 1) + def i(self, times: Times) -> Waveform: + """.. todo::""" + x = times / len(times) return ( - self.pulse.amplitude - * (1 + np.tanh(self.alpha * x / num_samples)) - * (1 + np.tanh(self.alpha * (1 - x / num_samples))) + self.amplitude + * (1 + np.tanh(self.alpha * times)) + * (1 + np.tanh(self.alpha * (1 - x))) / (1 + np.tanh(self.alpha / 2)) ** 2 ) - def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: - num_samples = int(self.pulse.duration * sampling_rate) - return np.zeros(num_samples) - def __repr__(self): - return f"{self.name}({format(self.alpha, '.6f').rstrip('0').rstrip('.')})" +class Shapes(Enum): + """Available pulse shapes.""" + + RECTANGULAR = Rectangular + EXPONENTIAL = Exponential + GAUSSIAN = Gaussian + GAUSSIAN_SQUARE = GaussianSquare + DRAG = Drag + IIR = Iir + SNZ = Snz + ECAP = ECap class Custom(PulseShape): From 446a913150ef1855c1a6afe5d0ed3eef89f3eaed Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 28 Feb 2024 20:04:27 +0100 Subject: [PATCH 0125/1006] feat!: Move Custom to new shape --- src/qibolab/pulses/shape.py | 56 ++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 32 deletions(-) diff --git a/src/qibolab/pulses/shape.py b/src/qibolab/pulses/shape.py index bc17e5257b..65213f21a8 100644 --- a/src/qibolab/pulses/shape.py +++ b/src/qibolab/pulses/shape.py @@ -327,6 +327,29 @@ def i(self, times: Times) -> Waveform: ) +@dataclass(frozen=True) +class Custom(Shape): + """Arbitrary shape. + + .. todo:: + + - expand description + - add attribute docstrings + """ + + amplitude: float + custom_i: npt.NDArray + custom_q: npt.NDArray + + def i(self, times: Times) -> Waveform: + """.. todo::""" + return self.amplitude * self.custom_i + + def envelope_waveform_q(self, times: Times) -> Waveform: + """.. todo::""" + return self.amplitude * self.custom_q + + class Shapes(Enum): """Available pulse shapes.""" @@ -338,35 +361,4 @@ class Shapes(Enum): IIR = Iir SNZ = Snz ECAP = ECap - - -class Custom(PulseShape): - """Arbitrary shape.""" - - def __init__(self, envelope_i, envelope_q=None): - self.name = "Custom" - self.pulse: "Pulse" = None - self.envelope_i: np.ndarray = np.array(envelope_i) - if envelope_q is not None: - self.envelope_q: np.ndarray = np.array(envelope_q) - else: - self.envelope_q = self.envelope_i - - def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: - """The envelope waveform of the i component of the pulse.""" - if self.pulse.duration != len(self.envelope_i): - raise ValueError("Length of envelope_i must be equal to pulse duration") - num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - - return self.envelope_i * self.pulse.amplitude - - def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: - """The envelope waveform of the q component of the pulse.""" - if self.pulse.duration != len(self.envelope_q): - raise ValueError("Length of envelope_q must be equal to pulse duration") - num_samples = int(np.rint(self.pulse.duration * sampling_rate)) - - return self.envelope_q * self.pulse.amplitude - - def __repr__(self): - return f"{self.name}({self.envelope_i[:3]}, ..., {self.envelope_q[:3]}, ...)" + CUSTOM = Custom From b607d86265d5b6b183c3ea10367dba10f3a3df5a Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 28 Feb 2024 20:10:24 +0100 Subject: [PATCH 0126/1006] feat!: Export only shapes container --- src/qibolab/pulses/__init__.py | 15 +-------------- src/qibolab/pulses/shape.py | 10 ++++++++++ 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/src/qibolab/pulses/__init__.py b/src/qibolab/pulses/__init__.py index 437c126d31..910372335a 100644 --- a/src/qibolab/pulses/__init__.py +++ b/src/qibolab/pulses/__init__.py @@ -1,16 +1,3 @@ from .pulse import Delay, Pulse, PulseType, VirtualZ from .sequence import PulseSequence -from .shape import ( - IIR, - SAMPLING_RATE, - SNZ, - Custom, - Drag, - Gaussian, - GaussianSquare, - PulseShape, - Rectangular, - ShapeInitError, - Waveform, - eCap, -) +from .shape import * diff --git a/src/qibolab/pulses/shape.py b/src/qibolab/pulses/shape.py index 65213f21a8..61b77bdac8 100644 --- a/src/qibolab/pulses/shape.py +++ b/src/qibolab/pulses/shape.py @@ -8,6 +8,16 @@ import numpy.typing as npt from scipy.signal import lfilter +__all__ = [ + "Times", + "Waveform", + "IqWaveform", + "modulate", + "demodulate", + "Shape", + "Shapes", +] + SAMPLING_RATE = 1 """Default sampling rate in gigasamples per second (GSps). From b01b8bfffe9c7c9511331786e94ec65eb340046a Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 28 Feb 2024 20:25:21 +0100 Subject: [PATCH 0127/1006] refactor: Split software modulation and related tests --- src/qibolab/pulses/modulation.py | 68 ++++++++++++++++++ src/qibolab/pulses/shape.py | 67 +----------------- tests/pulses/test_modulation.py | 95 ++++++++++++++++++++++++++ tests/pulses/test_shape.py | 114 ++++--------------------------- 4 files changed, 176 insertions(+), 168 deletions(-) create mode 100644 src/qibolab/pulses/modulation.py create mode 100644 tests/pulses/test_modulation.py diff --git a/src/qibolab/pulses/modulation.py b/src/qibolab/pulses/modulation.py new file mode 100644 index 0000000000..f00f18e743 --- /dev/null +++ b/src/qibolab/pulses/modulation.py @@ -0,0 +1,68 @@ +import numpy as np + +from .shape import IqWaveform + +__all__ = ["modulate", "demodulate"] + +SAMPLING_RATE = 1 +"""Default sampling rate in gigasamples per second (GSps). + +Used for generating waveform envelopes if the instruments do not provide +a different value. +""" + + +def modulate( + envelope: IqWaveform, + freq: float, + rate: float = SAMPLING_RATE, + phase: float = 0.0, +) -> IqWaveform: + """Modulate the envelope waveform with a carrier. + + `envelope` is a `(2, n)`-shaped array of I and Q (first dimension) envelope signals, + as a function of time (second dimension), and `freq` the frequency of the carrier to + modulate with (usually the IF) in GHz. + `rate` is an optional sampling rate, in Gs/s, to sample the carrier. + + .. note:: + + Only the combination `freq / rate` is actually relevant, but it is frequently + convenient to specify one in GHz and the other in Gs/s. Thus the two arguments + are provided for the simplicity of their interpretation. + + `phase` is an optional initial phase for the carrier. + """ + samples = np.arange(envelope.shape[1]) + phases = (2 * np.pi * freq / rate) * samples + phase + cos = np.cos(phases) + sin = np.sin(phases) + mod = np.array([[cos, -sin], [sin, cos]]) + + # the normalization is related to `mod`, but only applied at the end for the sake of + # performances + return np.einsum("ijt,jt->it", mod, envelope) / np.sqrt(2) + + +def demodulate( + modulated: IqWaveform, + freq: float, + rate: float = SAMPLING_RATE, +) -> IqWaveform: + """Demodulate the acquired pulse. + + The role of the arguments is the same of the corresponding ones in :func:`modulate`, + which is essentially the inverse of this function. + """ + # in case the offsets have not been removed in hardware + modulated = modulated - np.mean(modulated) + + samples = np.arange(modulated.shape[1]) + phases = (2 * np.pi * freq / rate) * samples + cos = np.cos(phases) + sin = np.sin(phases) + demod = np.array([[cos, sin], [-sin, cos]]) + + # the normalization is related to `demod`, but only applied at the end for the sake + # of performances + return np.sqrt(2) * np.einsum("ijt,jt->it", demod, modulated) diff --git a/src/qibolab/pulses/shape.py b/src/qibolab/pulses/shape.py index 61b77bdac8..cfea4b7065 100644 --- a/src/qibolab/pulses/shape.py +++ b/src/qibolab/pulses/shape.py @@ -1,4 +1,4 @@ -"""PulseShape class.""" +"""Library of pulse shapes.""" from abc import ABC from dataclasses import dataclass @@ -12,19 +12,10 @@ "Times", "Waveform", "IqWaveform", - "modulate", - "demodulate", "Shape", "Shapes", ] -SAMPLING_RATE = 1 -"""Default sampling rate in gigasamples per second (GSps). - -Used for generating waveform envelopes if the instruments do not provide -a different value. -""" - Times = npt.NDArray[np.float64] # TODO: they could be distinguished among them, and distinguished from generic float # arrays, using the NewType pattern -> but this require some more effort to encforce @@ -35,62 +26,6 @@ """""" -def modulate( - envelope: IqWaveform, - freq: float, - rate: float = SAMPLING_RATE, - phase: float = 0.0, -) -> IqWaveform: - """Modulate the envelope waveform with a carrier. - - `envelope` is a `(2, n)`-shaped array of I and Q (first dimension) envelope signals, - as a function of time (second dimension), and `freq` the frequency of the carrier to - modulate with (usually the IF) in GHz. - `rate` is an optional sampling rate, in Gs/s, to sample the carrier. - - .. note:: - - Only the combination `freq / rate` is actually relevant, but it is frequently - convenient to specify one in GHz and the other in Gs/s. Thus the two arguments - are provided for the simplicity of their interpretation. - - `phase` is an optional initial phase for the carrier. - """ - samples = np.arange(envelope.shape[1]) - phases = (2 * np.pi * freq / rate) * samples + phase - cos = np.cos(phases) - sin = np.sin(phases) - mod = np.array([[cos, -sin], [sin, cos]]) - - # the normalization is related to `mod`, but only applied at the end for the sake of - # performances - return np.einsum("ijt,jt->it", mod, envelope) / np.sqrt(2) - - -def demodulate( - modulated: IqWaveform, - freq: float, - rate: float = SAMPLING_RATE, -) -> IqWaveform: - """Demodulate the acquired pulse. - - The role of the arguments is the same of the corresponding ones in :func:`modulate`, - which is essentially the inverse of this function. - """ - # in case the offsets have not been removed in hardware - modulated = modulated - np.mean(modulated) - - samples = np.arange(modulated.shape[1]) - phases = (2 * np.pi * freq / rate) * samples - cos = np.cos(phases) - sin = np.sin(phases) - demod = np.array([[cos, sin], [-sin, cos]]) - - # the normalization is related to `demod`, but only applied at the end for the sake - # of performances - return np.sqrt(2) * np.einsum("ijt,jt->it", demod, modulated) - - class Shape(ABC): """Pulse envelopes. diff --git a/tests/pulses/test_modulation.py b/tests/pulses/test_modulation.py new file mode 100644 index 0000000000..09127ac0a9 --- /dev/null +++ b/tests/pulses/test_modulation.py @@ -0,0 +1,95 @@ +import numpy as np + +from qibolab.pulses import IqWaveform, Pulse, PulseType, Shapes +from qibolab.pulses.modulation import demodulate, modulate + +Rectangular = Shapes.RECTANGULAR.value +Gaussian = Shapes.GAUSSIAN.value + + +def test_modulation(): + rect = Pulse( + start=0, + duration=30, + amplitude=0.9, + frequency=20_000_000, + relative_phase=0.0, + shape=Rectangular(), + channel=0, + type=PulseType.READOUT, + qubit=0, + ) + renvs: IqWaveform = np.array(rect.shape.envelope_waveforms()) + # fmt: off + np.testing.assert_allclose(modulate(renvs, 0.04), + np.array([[ 6.36396103e-01, 6.16402549e-01, 5.57678156e-01, + 4.63912794e-01, 3.40998084e-01, 1.96657211e-01, + 3.99596419e-02, -1.19248738e-01, -2.70964282e-01, + -4.05654143e-01, -5.14855263e-01, -5.91706132e-01, + -6.31377930e-01, -6.31377930e-01, -5.91706132e-01, + -5.14855263e-01, -4.05654143e-01, -2.70964282e-01, + -1.19248738e-01, 3.99596419e-02, 1.96657211e-01, + 3.40998084e-01, 4.63912794e-01, 5.57678156e-01, + 6.16402549e-01, 6.36396103e-01, 6.16402549e-01, + 5.57678156e-01, 4.63912794e-01, 3.40998084e-01], + [ 0.00000000e+00, 1.58265275e-01, 3.06586161e-01, + 4.35643111e-01, 5.37327002e-01, 6.05248661e-01, + 6.35140321e-01, 6.25123778e-01, 5.75828410e-01, + 4.90351625e-01, 3.74064244e-01, 2.34273031e-01, + 7.97615814e-02, -7.97615814e-02, -2.34273031e-01, + -3.74064244e-01, -4.90351625e-01, -5.75828410e-01, + -6.25123778e-01, -6.35140321e-01, -6.05248661e-01, + -5.37327002e-01, -4.35643111e-01, -3.06586161e-01, + -1.58265275e-01, 4.09361195e-16, 1.58265275e-01, + 3.06586161e-01, 4.35643111e-01, 5.37327002e-01]]) + ) + # fmt: on + + gauss = Pulse( + start=5, + duration=20, + amplitude=3.5, + frequency=2_000_000, + relative_phase=0.0, + shape=Gaussian(0.5), + channel=0, + type=PulseType.READOUT, + qubit=0, + ) + genvs: IqWaveform = np.array(gauss.shape.envelope_waveforms()) + # fmt: off + np.testing.assert_allclose(modulate(genvs, 0.3), + np.array([[ 2.40604965e+00, -7.47704261e-01, -1.96732725e+00, + 1.97595317e+00, 7.57582564e-01, -2.45926187e+00, + 7.61855973e-01, 1.99830815e+00, -2.00080760e+00, + -7.64718297e-01, 2.47468039e+00, -7.64240497e-01, + -1.99830815e+00, 1.99456483e+00, 7.59953712e-01, + -2.45158868e+00, 7.54746949e-01, 1.96732725e+00, + -1.95751517e+00, -7.43510231e-01], + [ 0.00000000e+00, 2.30119709e+00, -1.42934692e+00, + -1.43561401e+00, 2.33159938e+00, 9.03518154e-16, + -2.34475159e+00, 1.45185586e+00, 1.45367181e+00, + -2.35356091e+00, -1.81836565e-15, 2.35209040e+00, + -1.45185586e+00, -1.44913618e+00, 2.33889703e+00, + 2.70209720e-15, -2.32287226e+00, 1.42934692e+00, + 1.42221802e+00, -2.28828920e+00]]) + ) + # fmt: on + + +def test_demodulation(): + signal = np.ones((2, 100)) + freq = 0.15 + mod = modulate(signal, freq) + + demod = demodulate(mod, freq) + np.testing.assert_allclose(demod, signal) + + mod1 = modulate(demod, freq * 3.0, rate=3.0) + np.testing.assert_allclose(mod1, mod) + + mod2 = modulate(signal, freq, phase=2 * np.pi) + np.testing.assert_allclose(mod2, mod) + + demod1 = demodulate(mod + np.ones_like(mod), freq) + np.testing.assert_allclose(demod1, demod) diff --git a/tests/pulses/test_shape.py b/tests/pulses/test_shape.py index 96e34f7ce6..4a1b1f9574 100644 --- a/tests/pulses/test_shape.py +++ b/tests/pulses/test_shape.py @@ -1,27 +1,20 @@ import numpy as np import pytest -from qibolab.pulses import ( - IIR, - SNZ, - Drag, - Gaussian, - GaussianSquare, - Pulse, - PulseShape, - PulseType, - Rectangular, - ShapeInitError, - eCap, -) -from qibolab.pulses.shape import IqWaveform, demodulate, modulate +from qibolab.pulses import Pulse, PulseType, Shapes + +Rectangular = Shapes.RECTANGULAR.value +Gaussian = Shapes.GAUSSIAN.value +GaussianSquare = Shapes.GAUSSIAN_SQUARE.value +Drag = Shapes.DRAG.value +eCap = Shapes.ECAP.value @pytest.mark.parametrize( "shape", [Rectangular(), Gaussian(5), GaussianSquare(5, 0.9), Drag(5, 1)] ) def test_sampling_rate(shape): - pulse = Pulse(40, 0.9, 100e6, 0, shape, 0, PulseType.DRIVE) + pulse = Pulse(0, 40, 0.9, 100e6, 0, shape, 0, PulseType.DRIVE) assert len(pulse.envelope_waveform_i(sampling_rate=1)) == 40 assert len(pulse.envelope_waveform_i(sampling_rate=100)) == 4000 @@ -86,7 +79,7 @@ def test_raise_shapeiniterror(): def test_drag_shape(): - pulse = Pulse(2, 1, 4e9, 0, Drag(2, 1), 0, PulseType.DRIVE) + pulse = Pulse(0, 2, 1, 4e9, 0, Drag(2, 1), 0, PulseType.DRIVE) # envelope i & envelope q should cross nearly at 0 and at 2 waveform = pulse.envelope_waveform_i(sampling_rate=10) target_waveform = np.array( @@ -118,6 +111,7 @@ def test_drag_shape(): def test_rectangular(): pulse = Pulse( + start=0, duration=50, amplitude=1, frequency=200_000_000, @@ -146,6 +140,7 @@ def test_rectangular(): def test_gaussian(): pulse = Pulse( + start=0, duration=50, amplitude=1, frequency=200_000_000, @@ -180,6 +175,7 @@ def test_gaussian(): def test_drag(): pulse = Pulse( + start=0, duration=50, amplitude=1, frequency=200_000_000, @@ -280,89 +276,3 @@ def test_eq(): shape3 = eCap(5) assert shape1 == shape2 assert not shape1 == shape3 - - -def test_modulation(): - rect = Pulse( - duration=30, - amplitude=0.9, - frequency=20_000_000, - relative_phase=0.0, - shape=Rectangular(), - channel=0, - type=PulseType.READOUT, - qubit=0, - ) - renvs: IqWaveform = np.array(rect.shape.envelope_waveforms()) - # fmt: off - np.testing.assert_allclose(modulate(renvs, 0.04), - np.array([[ 6.36396103e-01, 6.16402549e-01, 5.57678156e-01, - 4.63912794e-01, 3.40998084e-01, 1.96657211e-01, - 3.99596419e-02, -1.19248738e-01, -2.70964282e-01, - -4.05654143e-01, -5.14855263e-01, -5.91706132e-01, - -6.31377930e-01, -6.31377930e-01, -5.91706132e-01, - -5.14855263e-01, -4.05654143e-01, -2.70964282e-01, - -1.19248738e-01, 3.99596419e-02, 1.96657211e-01, - 3.40998084e-01, 4.63912794e-01, 5.57678156e-01, - 6.16402549e-01, 6.36396103e-01, 6.16402549e-01, - 5.57678156e-01, 4.63912794e-01, 3.40998084e-01], - [ 0.00000000e+00, 1.58265275e-01, 3.06586161e-01, - 4.35643111e-01, 5.37327002e-01, 6.05248661e-01, - 6.35140321e-01, 6.25123778e-01, 5.75828410e-01, - 4.90351625e-01, 3.74064244e-01, 2.34273031e-01, - 7.97615814e-02, -7.97615814e-02, -2.34273031e-01, - -3.74064244e-01, -4.90351625e-01, -5.75828410e-01, - -6.25123778e-01, -6.35140321e-01, -6.05248661e-01, - -5.37327002e-01, -4.35643111e-01, -3.06586161e-01, - -1.58265275e-01, 4.09361195e-16, 1.58265275e-01, - 3.06586161e-01, 4.35643111e-01, 5.37327002e-01]]) - ) - # fmt: on - - gauss = Pulse( - duration=20, - amplitude=3.5, - frequency=2_000_000, - relative_phase=0.0, - shape=Gaussian(0.5), - channel=0, - type=PulseType.READOUT, - qubit=0, - ) - genvs: IqWaveform = np.array(gauss.shape.envelope_waveforms()) - # fmt: off - np.testing.assert_allclose(modulate(genvs, 0.3), - np.array([[ 2.40604965e+00, -7.47704261e-01, -1.96732725e+00, - 1.97595317e+00, 7.57582564e-01, -2.45926187e+00, - 7.61855973e-01, 1.99830815e+00, -2.00080760e+00, - -7.64718297e-01, 2.47468039e+00, -7.64240497e-01, - -1.99830815e+00, 1.99456483e+00, 7.59953712e-01, - -2.45158868e+00, 7.54746949e-01, 1.96732725e+00, - -1.95751517e+00, -7.43510231e-01], - [ 0.00000000e+00, 2.30119709e+00, -1.42934692e+00, - -1.43561401e+00, 2.33159938e+00, 9.03518154e-16, - -2.34475159e+00, 1.45185586e+00, 1.45367181e+00, - -2.35356091e+00, -1.81836565e-15, 2.35209040e+00, - -1.45185586e+00, -1.44913618e+00, 2.33889703e+00, - 2.70209720e-15, -2.32287226e+00, 1.42934692e+00, - 1.42221802e+00, -2.28828920e+00]]) - ) - # fmt: on - - -def test_demodulation(): - signal = np.ones((2, 100)) - freq = 0.15 - mod = modulate(signal, freq) - - demod = demodulate(mod, freq) - np.testing.assert_allclose(demod, signal) - - mod1 = modulate(demod, freq * 3.0, rate=3.0) - np.testing.assert_allclose(mod1, mod) - - mod2 = modulate(signal, freq, phase=2 * np.pi) - np.testing.assert_allclose(mod2, mod) - - demod1 = demodulate(mod + np.ones_like(mod), freq) - np.testing.assert_allclose(demod1, demod) From 1edf2190c5974c80512507c727d372a2bebdf79e Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 5 Mar 2024 10:26:46 +0100 Subject: [PATCH 0128/1006] feat: rename Shape to Envelope --- src/qibolab/pulses/shape.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/qibolab/pulses/shape.py b/src/qibolab/pulses/shape.py index cfea4b7065..4258a448e9 100644 --- a/src/qibolab/pulses/shape.py +++ b/src/qibolab/pulses/shape.py @@ -12,8 +12,8 @@ "Times", "Waveform", "IqWaveform", - "Shape", - "Shapes", + "Envelope", + "Envelopes", ] Times = npt.NDArray[np.float64] @@ -26,7 +26,7 @@ """""" -class Shape(ABC): +class Envelope(ABC): """Pulse envelopes. Generates both i (in-phase) and q (quadrature) components. @@ -46,7 +46,7 @@ def envelopes(self, times: Times) -> IqWaveform: @dataclass(frozen=True) -class Rectangular(Shape): +class Rectangular(Envelope): """Rectangular envelope.""" amplitude: float @@ -57,7 +57,7 @@ def i(self, times: Times) -> Waveform: @dataclass(frozen=True) -class Exponential(Shape): +class Exponential(Envelope): r"""Exponential shape, i.e. square pulse with an exponential decay. .. math:: @@ -91,7 +91,7 @@ def _gaussian(t, mu, sigma): @dataclass(frozen=True) -class Gaussian(Shape): +class Gaussian(Envelope): r"""Gaussian pulse shape. Args: @@ -114,7 +114,7 @@ def i(self, times: Times) -> Waveform: @dataclass(frozen=True) -class GaussianSquare(Shape): +class GaussianSquare(Envelope): r"""GaussianSquare pulse shape. .. math:: @@ -142,7 +142,7 @@ def i(self, times: Times) -> Waveform: @dataclass(frozen=True) -class Drag(Shape): +class Drag(Envelope): """Derivative Removal by Adiabatic Gate (DRAG) pulse shape. .. todo:: @@ -173,7 +173,7 @@ def q(self, times: Times) -> Waveform: @dataclass(frozen=True) -class Iir(Shape): +class Iir(Envelope): """IIR Filter using scipy.signal lfilter.""" # https://arxiv.org/pdf/1907.04818.pdf (page 11 - filter formula S22) @@ -184,7 +184,7 @@ class Iir(Shape): amplitude: float a: npt.NDArray b: npt.NDArray - target: Shape + target: Envelope def _data(self, target): a = self.a / self.a[0] @@ -206,7 +206,7 @@ def q(self, times: Times) -> Waveform: @dataclass(frozen=True) -class Snz(Shape): +class Snz(Envelope): """Sudden variant Net Zero. https://arxiv.org/abs/2008.07411 @@ -245,7 +245,7 @@ def i(self, times: Times) -> Waveform: @dataclass(frozen=True) -class ECap(Shape): +class ECap(Envelope): r"""ECap pulse shape. .. todo:: @@ -273,7 +273,7 @@ def i(self, times: Times) -> Waveform: @dataclass(frozen=True) -class Custom(Shape): +class Custom(Envelope): """Arbitrary shape. .. todo:: @@ -295,7 +295,7 @@ def envelope_waveform_q(self, times: Times) -> Waveform: return self.amplitude * self.custom_q -class Shapes(Enum): +class Envelopes(Enum): """Available pulse shapes.""" RECTANGULAR = Rectangular From f1e05d921e1202b4d66a894ed3a20a64b912ffb7 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 5 Mar 2024 10:29:29 +0100 Subject: [PATCH 0129/1006] docs: Describe the expected times, restricting the original purpose --- src/qibolab/pulses/shape.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/qibolab/pulses/shape.py b/src/qibolab/pulses/shape.py index 4258a448e9..5f86b7de67 100644 --- a/src/qibolab/pulses/shape.py +++ b/src/qibolab/pulses/shape.py @@ -17,6 +17,16 @@ ] Times = npt.NDArray[np.float64] +"""The time window of a pulse. + +This should span the entire pulse interval, and contain one point per-desired sample. + +.. note:: + + It is not possible to deal with partial windows or arrays with a rank different from + 1, since some envelopes are defined in terms of the pulse duration and the + individual samples themselves. Cf. :cls:`Snz`. +""" # TODO: they could be distinguished among them, and distinguished from generic float # arrays, using the NewType pattern -> but this require some more effort to encforce # types throughout the whole code base From 2ad0725476ba928141f632eef0aa3c080a2b1744 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 5 Mar 2024 11:06:37 +0100 Subject: [PATCH 0130/1006] feat: Move Gaussian pulses back to their original variables --- src/qibolab/pulses/shape.py | 50 ++++++++++++++++++++++++------------- 1 file changed, 33 insertions(+), 17 deletions(-) diff --git a/src/qibolab/pulses/shape.py b/src/qibolab/pulses/shape.py index 5f86b7de67..632b43862e 100644 --- a/src/qibolab/pulses/shape.py +++ b/src/qibolab/pulses/shape.py @@ -7,6 +7,7 @@ import numpy as np import numpy.typing as npt from scipy.signal import lfilter +from scipy.signal.windows import gaussian __all__ = [ "Times", @@ -36,6 +37,14 @@ """""" +def _duration(times: Times) -> float: + return times[-1] - times[0] + + +def _mean(times: Times) -> float: + return _duration(times) / 2 + times[0] + + class Envelope(ABC): """Pulse envelopes. @@ -92,12 +101,13 @@ def i(self, times: Times) -> Waveform: ) -def _gaussian(t, mu, sigma): - """Gaussian function, normalized to be 1 at the max.""" - # TODO: if a centered Gaussian has to be used, and we agree that `Times` should - # always be the full window, just use `scipy.signal.gaussian`, that is exactly this - # function, autcomputing the mean from the number of points - return np.exp(-(((t - mu) / sigma) ** 2) / 2) +def _samples_sigma(rel_sigma: float, times: Times) -> float: + """Convert standard deviation in samples. + + `rel_sigma` is assumed in units of the interval duration, and it is turned in units + of samples, by counting the number of samples in the interval. + """ + return rel_sigma * len(times) @dataclass(frozen=True) @@ -113,14 +123,17 @@ class Gaussian(Envelope): """ amplitude: float - mu: float - """Gaussian mean.""" - sigma: float - """Gaussian standard deviation.""" + rel_sigma: float + """Relative Gaussian standard deviation. + + In units of the interval duration. + """ def i(self, times: Times) -> Waveform: """Generate a Gaussian window.""" - return self.amplitude * _gaussian(times, self.mu, self.sigma) + return self.amplitude * gaussian( + len(times), _samples_sigma(self.rel_sigma, times) + ) @dataclass(frozen=True) @@ -133,10 +146,11 @@ class GaussianSquare(Envelope): """ amplitude: float - mu: float - """Gaussian mean.""" - sigma: float - """Gaussian standard deviation.""" + rel_sigma: float + """Relative Gaussian standard deviation. + + In units of the interval duration. + """ width: float """Length of the flat portion.""" @@ -144,9 +158,11 @@ def i(self, times: Times) -> Waveform: """Generate a Gaussian envelope, with a flat central window.""" pulse = np.ones_like(times) - u, hw = self.mu, self.width / 2 + u, hw = _mean(times), self.width / 2 tails = (times < (u - hw)) | ((u + hw) < times) - pulse[tails] = _gaussian(times[tails], self.mu, self.sigma) + pulse[tails] = gaussian( + len(times[tails]), _samples_sigma(self.rel_sigma, times) + ) return self.amplitude * pulse From 475e8f6c56a6e5a6ac5140f36d5cd68dbc385751 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 5 Mar 2024 11:36:58 +0100 Subject: [PATCH 0131/1006] feat: Propagate window to drag and iir --- src/qibolab/pulses/shape.py | 44 ++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/src/qibolab/pulses/shape.py b/src/qibolab/pulses/shape.py index 632b43862e..2af83649ac 100644 --- a/src/qibolab/pulses/shape.py +++ b/src/qibolab/pulses/shape.py @@ -61,7 +61,7 @@ def q(self, times: Times) -> Waveform: def envelopes(self, times: Times) -> IqWaveform: """Stacked i and q envelope waveforms of the pulse.""" - return np.array(self.i(times), self.q(times)) + return np.array([self.i(times), self.q(times)]) @dataclass(frozen=True) @@ -178,48 +178,53 @@ class Drag(Envelope): """ amplitude: float - mu: float - """Gaussian mean.""" - sigma: float - """Gaussian standard deviation.""" + rel_sigma: float + """Relative Gaussian standard deviation. + + In units of the interval duration. + """ beta: float """.. todo::""" def i(self, times: Times) -> Waveform: """Generate a Gaussian envelope.""" - return self.amplitude * _gaussian(times, self.mu, self.sigma) + return self.amplitude * gaussian( + len(times), _samples_sigma(self.rel_sigma, times) + ) def q(self, times: Times) -> Waveform: """Generate ... .. todo:: """ - i = self.amplitude * _gaussian(times, self.mu, self.sigma) - return self.beta * (-(times - self.mu) / (self.sigma**2)) * i + sigma = self.rel_sigma * _duration(times) + return self.beta * (-(times - _mean(times)) / (sigma**2)) * self.i(times) @dataclass(frozen=True) class Iir(Envelope): - """IIR Filter using scipy.signal lfilter.""" + """IIR Filter using scipy.signal lfilter. - # https://arxiv.org/pdf/1907.04818.pdf (page 11 - filter formula S22) - # p = [A, tau_iir] - # p = [b0 = 1−k +k ·α, b1 = −(1−k)·(1−α),a0 = 1 and a1 = −(1−α)] - # p = [b0, b1, a0, a1] + https://arxiv.org/pdf/1907.04818.pdf (page 11 - filter formula S22):: + + p = [A, tau_iir] + p = [b0 = 1−k +k ·α, b1 = −(1−k)·(1−α),a0 = 1 and a1 = −(1−α)] + p = [b0, b1, a0, a1] + """ amplitude: float a: npt.NDArray b: npt.NDArray target: Envelope - def _data(self, target): + def _data(self, target: npt.NDArray) -> npt.NDArray: a = self.a / self.a[0] gain = np.sum(self.b) / np.sum(a) b = self.b / gain if gain != 0 else self.b data = lfilter(b=b, a=a, x=target) if np.max(np.abs(data)) != 0: - data = data / np.max(np.abs(data)) + data /= np.max(np.abs(data)) return data def i(self, times: Times) -> Waveform: @@ -244,13 +249,6 @@ class Snz(Envelope): """ amplitude: float - width: float - """Essentially, the pulse duration... - - .. todo:: - - - reset to duration, if decided so - """ t_idling: float b_amplitude: float = 0.5 """Relative B amplitude (wrt A).""" @@ -258,7 +256,7 @@ class Snz(Envelope): def i(self, times: Times) -> Waveform: """.. todo::""" # convert timings to samples - half_pulse_duration = (self.width - self.t_idling) / 2 + half_pulse_duration = (_duration(times) - self.t_idling) / 2 aspan = np.sum(times < half_pulse_duration) idle = len(times) - 2 * (aspan + 1) From 3386f01b96e07331d1472df212b5bc0754f836d2 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 5 Mar 2024 11:37:22 +0100 Subject: [PATCH 0132/1006] feat: Propagate envelopes to Pulse --- src/qibolab/pulses/pulse.py | 64 ++++++++----------------------------- 1 file changed, 14 insertions(+), 50 deletions(-) diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index 18e16c2530..2de6bbd43d 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -1,9 +1,13 @@ """Pulse class.""" -import copy + from dataclasses import dataclass, fields from enum import Enum from typing import Optional +import numpy as np + +from .shape import Envelope, IqWaveform, Times, Waveform + class PulseType(Enum): """An enumeration to distinguish different types of pulses. @@ -39,11 +43,11 @@ class Pulse: """ relative_phase: float """Relative phase of the pulse, in radians.""" - shape: PulseShape - """Pulse shape, as a PulseShape object. + envelope: Envelope + """The pulse envelope shape. See - :py: mod:`qibolab.pulses` for list of available shapes. + :cls:`qibolab.pulses.shape.Envelopes` for list of available shapes. """ channel: Optional[str] = None """Channel on which the pulse should be played. @@ -107,43 +111,20 @@ def phase(self) -> float: def id(self) -> int: return id(self) - def envelope_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: + def i(self, times: Times) -> Waveform: """The envelope waveform of the i component of the pulse.""" - return self.shape.envelope_waveform_i(sampling_rate) + return self.envelope.i(times) - def envelope_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: + def q(self, times: Times) -> Waveform: """The envelope waveform of the q component of the pulse.""" - return self.shape.envelope_waveform_q(sampling_rate) + return self.envelope.q(times) - def envelope_waveforms( - self, sampling_rate=SAMPLING_RATE - ): # -> tuple[Waveform, Waveform]: + def envelopes(self, times: Times) -> IqWaveform: """A tuple with the i and q envelope waveforms of the pulse.""" - return ( - self.shape.envelope_waveform_i(sampling_rate), - self.shape.envelope_waveform_q(sampling_rate), - ) - - def modulated_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: - """The waveform of the i component of the pulse, modulated with its - frequency.""" - - return self.shape.modulated_waveform_i(sampling_rate) - - def modulated_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: - """The waveform of the q component of the pulse, modulated with its - frequency.""" - - return self.shape.modulated_waveform_q(sampling_rate) - - def modulated_waveforms(self, sampling_rate): # -> tuple[Waveform, Waveform]: - """A tuple with the i and q waveforms of the pulse, modulated with its - frequency.""" - - return self.shape.modulated_waveforms(sampling_rate) + return np.array([self.i(times), self.q(times)]) def __hash__(self): """Hash the content. @@ -168,23 +149,6 @@ def __hash__(self): ) ) - def __add__(self, other): - if isinstance(other, Pulse): - return PulseSequence(self, other) - if isinstance(other, PulseSequence): - return PulseSequence(self, *other) - raise TypeError(f"Expected Pulse or PulseSequence; got {type(other).__name__}") - - def __mul__(self, n): - if not isinstance(n, int): - raise TypeError(f"Expected int; got {type(n).__name__}") - if n < 0: - raise TypeError(f"argument n should be >=0, got {n}") - return PulseSequence(*([copy.deepcopy(self)] * n)) - - def __rmul__(self, n): - return self.__mul__(n) - def is_equal_ignoring_start(self, item) -> bool: """Check if two pulses are equal ignoring start time.""" return ( From 89b085d8d6d7021d66aa2ab2d8f1e51a18d414b2 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 5 Mar 2024 11:40:00 +0100 Subject: [PATCH 0133/1006] feat: Keep the amplitude in the pulse, drop it in the shape --- src/qibolab/pulses/pulse.py | 4 ++-- src/qibolab/pulses/shape.py | 43 +++++++++++-------------------------- 2 files changed, 15 insertions(+), 32 deletions(-) diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index 2de6bbd43d..a4b23d6851 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -114,12 +114,12 @@ def id(self) -> int: def i(self, times: Times) -> Waveform: """The envelope waveform of the i component of the pulse.""" - return self.envelope.i(times) + return self.amplitude * self.envelope.i(times) def q(self, times: Times) -> Waveform: """The envelope waveform of the q component of the pulse.""" - return self.envelope.q(times) + return self.amplitude * self.envelope.q(times) def envelopes(self, times: Times) -> IqWaveform: """A tuple with the i and q envelope waveforms of the pulse.""" diff --git a/src/qibolab/pulses/shape.py b/src/qibolab/pulses/shape.py index 2af83649ac..ae881e4a28 100644 --- a/src/qibolab/pulses/shape.py +++ b/src/qibolab/pulses/shape.py @@ -68,11 +68,9 @@ def envelopes(self, times: Times) -> IqWaveform: class Rectangular(Envelope): """Rectangular envelope.""" - amplitude: float - def i(self, times: Times) -> Waveform: """Generate a rectangular envelope.""" - return self.amplitude * np.ones_like(times) + return np.ones_like(times) @dataclass(frozen=True) @@ -84,7 +82,6 @@ class Exponential(Envelope): A\frac{\exp\left(-\frac{x}{\text{upsilon}}\right) + g \exp\left(-\frac{x}{\text{tau}}\right)}{1 + g} """ - amplitude: float tau: float """The decay rate of the first exponential function.""" upsilon: float @@ -94,10 +91,8 @@ class Exponential(Envelope): def i(self, times: Times) -> Waveform: """Generate a combination of two exponential decays.""" - return ( - self.amplitude - * (np.exp(-times / self.upsilon) + self.g * np.exp(-times / self.tau)) - / (1 + self.g) + return (np.exp(-times / self.upsilon) + self.g * np.exp(-times / self.tau)) / ( + 1 + self.g ) @@ -122,7 +117,6 @@ class Gaussian(Envelope): A\exp^{-\frac{1}{2}\frac{(t-\mu)^2}{\sigma^2}} """ - amplitude: float rel_sigma: float """Relative Gaussian standard deviation. @@ -131,9 +125,7 @@ class Gaussian(Envelope): def i(self, times: Times) -> Waveform: """Generate a Gaussian window.""" - return self.amplitude * gaussian( - len(times), _samples_sigma(self.rel_sigma, times) - ) + return gaussian(len(times), _samples_sigma(self.rel_sigma, times)) @dataclass(frozen=True) @@ -145,7 +137,6 @@ class GaussianSquare(Envelope): A\exp^{-\frac{1}{2}\frac{(t-\mu)^2}{\sigma^2}}[Rise] + Flat + A\exp^{-\frac{1}{2}\frac{(t-\mu)^2}{\sigma^2}}[Decay] """ - amplitude: float rel_sigma: float """Relative Gaussian standard deviation. @@ -164,7 +155,7 @@ def i(self, times: Times) -> Waveform: len(times[tails]), _samples_sigma(self.rel_sigma, times) ) - return self.amplitude * pulse + return pulse @dataclass(frozen=True) @@ -177,7 +168,6 @@ class Drag(Envelope): - add reference """ - amplitude: float rel_sigma: float """Relative Gaussian standard deviation. @@ -188,9 +178,7 @@ class Drag(Envelope): def i(self, times: Times) -> Waveform: """Generate a Gaussian envelope.""" - return self.amplitude * gaussian( - len(times), _samples_sigma(self.rel_sigma, times) - ) + return gaussian(len(times), _samples_sigma(self.rel_sigma, times)) def q(self, times: Times) -> Waveform: """Generate ... @@ -212,7 +200,6 @@ class Iir(Envelope): p = [b0, b1, a0, a1] """ - amplitude: float a: npt.NDArray b: npt.NDArray target: Envelope @@ -229,11 +216,11 @@ def _data(self, target: npt.NDArray) -> npt.NDArray: def i(self, times: Times) -> Waveform: """.. todo::""" - return self.amplitude * self._data(self.target.i(times)) + return self._data(self.target.i(times)) def q(self, times: Times) -> Waveform: """.. todo::""" - return self.amplitude * self._data(self.target.q(times)) + return self._data(self.target.q(times)) @dataclass(frozen=True) @@ -248,7 +235,6 @@ class Snz(Envelope): - expression """ - amplitude: float t_idling: float b_amplitude: float = 0.5 """Relative B amplitude (wrt A).""" @@ -265,7 +251,7 @@ def i(self, times: Times) -> Waveform: pulse[aspan] = pulse[aspan + 1 + idle] = self.b_amplitude # set idle time to 0 pulse[aspan + 1 : aspan + 1 + idle] = 0 - return self.amplitude * pulse + return pulse @dataclass(frozen=True) @@ -282,15 +268,13 @@ class ECap(Envelope): &\times& [1 + \tanh(\alpha/2)]^{-2} """ - amplitude: float alpha: float def i(self, times: Times) -> Waveform: """.. todo::""" x = times / len(times) return ( - self.amplitude - * (1 + np.tanh(self.alpha * times)) + (1 + np.tanh(self.alpha * times)) * (1 + np.tanh(self.alpha * (1 - x))) / (1 + np.tanh(self.alpha / 2)) ** 2 ) @@ -306,17 +290,16 @@ class Custom(Envelope): - add attribute docstrings """ - amplitude: float custom_i: npt.NDArray custom_q: npt.NDArray def i(self, times: Times) -> Waveform: """.. todo::""" - return self.amplitude * self.custom_i + return self.custom_i - def envelope_waveform_q(self, times: Times) -> Waveform: + def q(self, times: Times) -> Waveform: """.. todo::""" - return self.amplitude * self.custom_q + return self.custom_q class Envelopes(Enum): From 937c9093fba9b1dc2acd316fcb2631a08b33e267 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 12 Mar 2024 17:20:09 +0100 Subject: [PATCH 0134/1006] build: Exclude CC library in Nix shell for Linux --- .envrc | 4 ++-- flake.nix | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.envrc b/.envrc index 01f5f41d0e..3af52d88ed 100644 --- a/.envrc +++ b/.envrc @@ -2,8 +2,8 @@ if ! has nix_direnv_version || ! nix_direnv_version 2.2.1; then source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/2.2.1/direnvrc" "sha256-zelF0vLbEl5uaqrfIzbgNzJWGmLzCmYAkInj/LNxvKs=" fi -nix_direnv_watch_file flake.nix -nix_direnv_watch_file flake.lock +watch_file flake.nix +watch_file flake.lock if ! use flake . --impure; then echo "devenv could not be built. The devenv environment was not loaded. Make the necessary changes to devenv.nix and hit enter to try again." >&2 fi diff --git a/flake.nix b/flake.nix index e27ab8348e..58d57c2a86 100644 --- a/flake.nix +++ b/flake.nix @@ -35,8 +35,8 @@ forEachSystem (system: let pkgs = nixpkgs.legacyPackages.${system}; - pwd = builtins.getEnv "PWD"; - platforms = builtins.toPath "${pwd}/../qibolab_platforms_qrc/"; + lib = pkgs.lib; + isDarwin = lib.strings.hasSuffix "darwin" system; in { default = devenv.lib.mkShell { inherit inputs pkgs; @@ -48,7 +48,7 @@ config, ... }: { - packages = with pkgs; [pre-commit poethepoet jupyter stdenv.cc.cc.lib zlib]; + packages = with pkgs; [pre-commit poethepoet jupyter zlib] ++ lib.optionals isDarwin [stdenv.cc.cc.lib]; env = { QIBOLAB_PLATFORMS = (dirOf config.env.DEVENV_ROOT) + "/qibolab_platforms_qrc"; From 6d4cd161f0760fe04b4b8480c0f2fd8e647703c3 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 12 Mar 2024 17:31:33 +0100 Subject: [PATCH 0135/1006] feat: Represent times as the parameters of linspace Since nothing else is strictly needed --- src/qibolab/pulses/shape.py | 87 ++++++++++++++++++++----------------- 1 file changed, 47 insertions(+), 40 deletions(-) diff --git a/src/qibolab/pulses/shape.py b/src/qibolab/pulses/shape.py index ae881e4a28..edc6b1eecb 100644 --- a/src/qibolab/pulses/shape.py +++ b/src/qibolab/pulses/shape.py @@ -3,6 +3,7 @@ from abc import ABC from dataclasses import dataclass from enum import Enum +from functools import cached_property import numpy as np import numpy.typing as npt @@ -17,32 +18,37 @@ "Envelopes", ] -Times = npt.NDArray[np.float64] -"""The time window of a pulse. -This should span the entire pulse interval, and contain one point per-desired sample. - -.. note:: - - It is not possible to deal with partial windows or arrays with a rank different from - 1, since some envelopes are defined in terms of the pulse duration and the - individual samples themselves. Cf. :cls:`Snz`. -""" # TODO: they could be distinguished among them, and distinguished from generic float # arrays, using the NewType pattern -> but this require some more effort to encforce # types throughout the whole code base Waveform = npt.NDArray[np.float64] -"""""" +"""Single component waveform, either I (in-phase) or Q (quadrature).""" IqWaveform = npt.NDArray[np.float64] -"""""" +"""Full shape, both I and Q components.""" + +@dataclass +class Times: + """Time window of a pulse.""" -def _duration(times: Times) -> float: - return times[-1] - times[0] + duration: float + """Pulse duration.""" + samples: int + """Number of requested samples.""" + # Here only the information consumed by the `Envelopes` is stored. How to go from + # the sampling rate to the number of samples is callers' business, since nothing + # else has to be known by this module. + @property + def mean(self) -> float: + """Middle point of the temporal window.""" + return self.duration / 2 -def _mean(times: Times) -> float: - return _duration(times) / 2 + times[0] + @cached_property + def window(self): + """Individual timing of each sample.""" + return np.linspace(0, self.duration, self.samples) class Envelope(ABC): @@ -53,11 +59,11 @@ class Envelope(ABC): def i(self, times: Times) -> Waveform: """In-phase envelope.""" - return np.zeros_like(times) + return np.zeros(times.samples) def q(self, times: Times) -> Waveform: """Quadrature envelope.""" - return np.zeros_like(times) + return np.zeros(times.samples) def envelopes(self, times: Times) -> IqWaveform: """Stacked i and q envelope waveforms of the pulse.""" @@ -70,7 +76,7 @@ class Rectangular(Envelope): def i(self, times: Times) -> Waveform: """Generate a rectangular envelope.""" - return np.ones_like(times) + return np.ones(times.samples) @dataclass(frozen=True) @@ -91,7 +97,8 @@ class Exponential(Envelope): def i(self, times: Times) -> Waveform: """Generate a combination of two exponential decays.""" - return (np.exp(-times / self.upsilon) + self.g * np.exp(-times / self.tau)) / ( + ts = times.window + return (np.exp(-ts / self.upsilon) + self.g * np.exp(-ts / self.tau)) / ( 1 + self.g ) @@ -102,7 +109,7 @@ def _samples_sigma(rel_sigma: float, times: Times) -> float: `rel_sigma` is assumed in units of the interval duration, and it is turned in units of samples, by counting the number of samples in the interval. """ - return rel_sigma * len(times) + return rel_sigma * times.samples @dataclass(frozen=True) @@ -125,7 +132,7 @@ class Gaussian(Envelope): def i(self, times: Times) -> Waveform: """Generate a Gaussian window.""" - return gaussian(len(times), _samples_sigma(self.rel_sigma, times)) + return gaussian(times.samples, _samples_sigma(self.rel_sigma, times)) @dataclass(frozen=True) @@ -149,11 +156,10 @@ def i(self, times: Times) -> Waveform: """Generate a Gaussian envelope, with a flat central window.""" pulse = np.ones_like(times) - u, hw = _mean(times), self.width / 2 - tails = (times < (u - hw)) | ((u + hw) < times) - pulse[tails] = gaussian( - len(times[tails]), _samples_sigma(self.rel_sigma, times) - ) + u, hw = times.mean, self.width / 2 + ts = times.window + tails = (ts < (u - hw)) | ((u + hw) < ts) + pulse[tails] = gaussian(len(ts[tails]), _samples_sigma(self.rel_sigma, times)) return pulse @@ -178,15 +184,16 @@ class Drag(Envelope): def i(self, times: Times) -> Waveform: """Generate a Gaussian envelope.""" - return gaussian(len(times), _samples_sigma(self.rel_sigma, times)) + return gaussian(times.samples, _samples_sigma(self.rel_sigma, times)) def q(self, times: Times) -> Waveform: """Generate ... .. todo:: """ - sigma = self.rel_sigma * _duration(times) - return self.beta * (-(times - _mean(times)) / (sigma**2)) * self.i(times) + sigma = self.rel_sigma * times.duration + ts = times.window + return self.beta * (-(ts - times.mean) / (sigma**2)) * self.i(times) @dataclass(frozen=True) @@ -242,11 +249,11 @@ class Snz(Envelope): def i(self, times: Times) -> Waveform: """.. todo::""" # convert timings to samples - half_pulse_duration = (_duration(times) - self.t_idling) / 2 - aspan = np.sum(times < half_pulse_duration) - idle = len(times) - 2 * (aspan + 1) + half_pulse_duration = (times.duration - self.t_idling) / 2 + aspan = np.sum(times.window < half_pulse_duration) + idle = times.samples - 2 * (aspan + 1) - pulse = np.ones_like(times) + pulse = np.ones(times.samples) # the aspan + 1 sample is B (and so the aspan + 1 + idle + 1), indexes are 0-based pulse[aspan] = pulse[aspan + 1 + idle] = self.b_amplitude # set idle time to 0 @@ -272,9 +279,9 @@ class ECap(Envelope): def i(self, times: Times) -> Waveform: """.. todo::""" - x = times / len(times) + x = times.window / times.samples return ( - (1 + np.tanh(self.alpha * times)) + (1 + np.tanh(self.alpha * times.window)) * (1 + np.tanh(self.alpha * (1 - x))) / (1 + np.tanh(self.alpha / 2)) ** 2 ) @@ -290,16 +297,16 @@ class Custom(Envelope): - add attribute docstrings """ - custom_i: npt.NDArray - custom_q: npt.NDArray + i_: npt.NDArray + q_: npt.NDArray def i(self, times: Times) -> Waveform: """.. todo::""" - return self.custom_i + raise NotImplementedError def q(self, times: Times) -> Waveform: """.. todo::""" - return self.custom_q + raise NotImplementedError class Envelopes(Enum): From bbd043cbd3889b4269419406aef7c9483637ee53 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 15 Mar 2024 18:02:26 +0100 Subject: [PATCH 0136/1006] test: Solve pytest collection errors for pulses tests --- src/qibolab/pulses/__init__.py | 2 +- src/qibolab/pulses/{shape.py => envelope.py} | 0 src/qibolab/pulses/modulation.py | 2 +- src/qibolab/pulses/plot.py | 136 ++++++++++++------ src/qibolab/pulses/pulse.py | 2 +- .../{test_shape.py => test_envelope.py} | 12 +- tests/pulses/test_modulation.py | 6 +- 7 files changed, 105 insertions(+), 55 deletions(-) rename src/qibolab/pulses/{shape.py => envelope.py} (100%) rename tests/pulses/{test_shape.py => test_envelope.py} (96%) diff --git a/src/qibolab/pulses/__init__.py b/src/qibolab/pulses/__init__.py index 910372335a..d190134e2a 100644 --- a/src/qibolab/pulses/__init__.py +++ b/src/qibolab/pulses/__init__.py @@ -1,3 +1,3 @@ +from .envelope import * from .pulse import Delay, Pulse, PulseType, VirtualZ from .sequence import PulseSequence -from .shape import * diff --git a/src/qibolab/pulses/shape.py b/src/qibolab/pulses/envelope.py similarity index 100% rename from src/qibolab/pulses/shape.py rename to src/qibolab/pulses/envelope.py diff --git a/src/qibolab/pulses/modulation.py b/src/qibolab/pulses/modulation.py index f00f18e743..3d5ce55a77 100644 --- a/src/qibolab/pulses/modulation.py +++ b/src/qibolab/pulses/modulation.py @@ -1,6 +1,6 @@ import numpy as np -from .shape import IqWaveform +from .envelope import IqWaveform __all__ = ["modulate", "demodulate"] diff --git a/src/qibolab/pulses/plot.py b/src/qibolab/pulses/plot.py index 1328268f20..cd31fb61ad 100644 --- a/src/qibolab/pulses/plot.py +++ b/src/qibolab/pulses/plot.py @@ -1,10 +1,14 @@ """Plotting tools for pulses and related entities.""" + +from collections import defaultdict + import matplotlib.pyplot as plt import numpy as np -from .pulse import Pulse -from .shape import SAMPLING_RATE -from .waveform import Waveform +from .envelope import Waveform +from .modulation import modulate +from .pulse import Delay, Pulse +from .sequence import PulseSequence def waveform(wf: Waveform, filename=None): @@ -14,7 +18,7 @@ def waveform(wf: Waveform, filename=None): filename (str): a file path. If provided the plot is save to a file. """ plt.figure(figsize=(14, 5), dpi=200) - plt.plot(wf.data, c="C0", linestyle="dashed") + plt.plot(wf, c="C0", linestyle="dashed") plt.xlabel("Sample Number") plt.ylabel("Amplitude") plt.grid(visible=True, which="both", axis="both", color="#888888", linestyle="-") @@ -25,7 +29,7 @@ def waveform(wf: Waveform, filename=None): plt.close() -def pulse(pulse_: Pulse, filename=None, sampling_rate=SAMPLING_RATE): +def pulse(pulse_: Pulse, filename=None): """Plot the pulse envelope and modulated waveforms. Args: @@ -34,76 +38,58 @@ def pulse(pulse_: Pulse, filename=None, sampling_rate=SAMPLING_RATE): import matplotlib.pyplot as plt from matplotlib import gridspec - waveform_i = pulse_.shape.envelope_waveform_i(sampling_rate) - waveform_q = pulse_.shape.envelope_waveform_q(sampling_rate) + window = Times(pulse_.duration, num_samples) + waveform_i = pulse_.shape.i(window) + waveform_q = pulse_.shape.q(window) num_samples = len(waveform_i) - time = pulse_.start + np.arange(num_samples) / sampling_rate + time = np.arange(num_samples) / sampling_rate _ = plt.figure(figsize=(14, 5), dpi=200) gs = gridspec.GridSpec(ncols=2, nrows=1, width_ratios=np.array([2, 1])) ax1 = plt.subplot(gs[0]) ax1.plot( time, - waveform_i.data, + waveform_i, label="envelope i", c="C0", linestyle="dashed", ) ax1.plot( time, - waveform_q.data, + waveform_q, label="envelope q", c="C1", linestyle="dashed", ) - ax1.plot( - time, - pulse_.shape.modulated_waveform_i(sampling_rate).data, - label="modulated i", - c="C0", - ) - ax1.plot( - time, - pulse_.shape.modulated_waveform_q(sampling_rate).data, - label="modulated q", - c="C1", - ) - ax1.plot(time, -waveform_i.data, c="silver", linestyle="dashed") + + envelope = pulse_.shape.envelopes(window) + modulated = modulate(np.array(envelope), pulse_.frequency) + ax1.plot(time, modulated[0], label="modulated i", c="C0") + ax1.plot(time, modulated[1], label="modulated q", c="C1") + ax1.plot(time, -waveform_i, c="silver", linestyle="dashed") ax1.set_xlabel("Time [ns]") ax1.set_ylabel("Amplitude") ax1.grid(visible=True, which="both", axis="both", color="#888888", linestyle="-") - start = float(pulse_.start) - finish = float(pulse._finish) if pulse._finish is not None else 0.0 + start = 0 + finish = float(pulse_.duration) ax1.axis((start, finish, -1.0, 1.0)) ax1.legend() - modulated_i = pulse_.shape.modulated_waveform_i(sampling_rate).data - modulated_q = pulse_.shape.modulated_waveform_q(sampling_rate).data ax2 = plt.subplot(gs[1]) + ax2.plot(modulated[0], modulated[1], label="modulated", c="C3") + ax2.plot(waveform_i, waveform_q, label="envelope", c="C2") ax2.plot( - modulated_i, - modulated_q, - label="modulated", - c="C3", - ) - ax2.plot( - waveform_i.data, - waveform_q.data, - label="envelope", - c="C2", - ) - ax2.plot( - modulated_i[0], - modulated_q[0], + modulated[0][0], + modulated[1][0], marker="o", markersize=5, label="start", c="lightcoral", ) ax2.plot( - modulated_i[-1], - modulated_q[-1], + modulated[0][-1], + modulated[1][-1], marker="o", markersize=5, label="finish", @@ -126,3 +112,67 @@ def pulse(pulse_: Pulse, filename=None, sampling_rate=SAMPLING_RATE): else: plt.show() plt.close() + + +def sequence(ps: PulseSequence, filename=None): + """Plot the sequence of pulses. + + Args: + filename (str): a file path. If provided the plot is save to a file. + """ + if len(ps) > 0: + import matplotlib.pyplot as plt + from matplotlib import gridspec + + _ = plt.figure(figsize=(14, 2 * len(ps)), dpi=200) + gs = gridspec.GridSpec(ncols=1, nrows=len(ps)) + vertical_lines = [] + starts = defaultdict(int) + for pulse in ps: + if not isinstance(pulse, Delay): + vertical_lines.append(starts[pulse.channel]) + vertical_lines.append(starts[pulse.channel] + pulse.duration) + starts[pulse.channel] += pulse.duration + + n = -1 + for qubit in ps.qubits: + qubit_pulses = ps.get_qubit_pulses(qubit) + for channel in qubit_pulses.channels: + n += 1 + channel_pulses = qubit_pulses.get_channel_pulses(channel) + ax = plt.subplot(gs[n]) + ax.axis([0, ps.duration, -1, 1]) + start = 0 + for pulse in channel_pulses: + if isinstance(pulse, Delay): + start += pulse.duration + continue + + envelope = pulse.shape.envelope_waveforms(sampling_rate) + num_samples = envelope[0].size + time = start + np.arange(num_samples) / sampling_rate + modulated = modulate(np.array(envelope), pulse.frequency) + ax.plot(time, modulated[1], c="lightgrey") + ax.plot(time, modulated[0], c=f"C{str(n)}") + ax.plot(time, pulse.shape.i(), c=f"C{str(n)}") + ax.plot(time, -pulse.shape.i(), c=f"C{str(n)}") + # TODO: if they overlap use different shades + ax.axhline(0, c="dimgrey") + ax.set_ylabel(f"qubit {qubit} \n channel {channel}") + for vl in vertical_lines: + ax.axvline(vl, c="slategrey", linestyle="--") + ax.axis((0, ps.duration, -1, 1)) + ax.grid( + visible=True, + which="both", + axis="both", + color="#CCCCCC", + linestyle="-", + ) + start += pulse.duration + + if filename: + plt.savefig(filename) + else: + plt.show() + plt.close() diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index a4b23d6851..6c6b8a12af 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -6,7 +6,7 @@ import numpy as np -from .shape import Envelope, IqWaveform, Times, Waveform +from .envelope import Envelope, IqWaveform, Times, Waveform class PulseType(Enum): diff --git a/tests/pulses/test_shape.py b/tests/pulses/test_envelope.py similarity index 96% rename from tests/pulses/test_shape.py rename to tests/pulses/test_envelope.py index 4a1b1f9574..eea806c3ea 100644 --- a/tests/pulses/test_shape.py +++ b/tests/pulses/test_envelope.py @@ -1,13 +1,13 @@ import numpy as np import pytest -from qibolab.pulses import Pulse, PulseType, Shapes +from qibolab.pulses import Envelopes, Pulse, PulseType -Rectangular = Shapes.RECTANGULAR.value -Gaussian = Shapes.GAUSSIAN.value -GaussianSquare = Shapes.GAUSSIAN_SQUARE.value -Drag = Shapes.DRAG.value -eCap = Shapes.ECAP.value +Rectangular = Envelopes.RECTANGULAR.value +Gaussian = Envelopes.GAUSSIAN.value +GaussianSquare = Envelopes.GAUSSIAN_SQUARE.value +Drag = Envelopes.DRAG.value +eCap = Envelopes.ECAP.value @pytest.mark.parametrize( diff --git a/tests/pulses/test_modulation.py b/tests/pulses/test_modulation.py index 09127ac0a9..e22b2af294 100644 --- a/tests/pulses/test_modulation.py +++ b/tests/pulses/test_modulation.py @@ -1,10 +1,10 @@ import numpy as np -from qibolab.pulses import IqWaveform, Pulse, PulseType, Shapes +from qibolab.pulses import Envelopes, IqWaveform, Pulse, PulseType from qibolab.pulses.modulation import demodulate, modulate -Rectangular = Shapes.RECTANGULAR.value -Gaussian = Shapes.GAUSSIAN.value +Rectangular = Envelopes.RECTANGULAR.value +Gaussian = Envelopes.GAUSSIAN.value def test_modulation(): From ece8d12a2a1e62e531b203dad055436a6bc29da0 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 15 Mar 2024 18:10:32 +0100 Subject: [PATCH 0137/1006] test: Fix remaining pytests collection errors --- src/qibolab/instruments/qblox/acquisition.py | 2 +- src/qibolab/instruments/qblox/sequencer.py | 2 +- src/qibolab/instruments/qm/config.py | 4 +++- src/qibolab/instruments/rfsoc/convert.py | 4 ++-- tests/test_instruments_qm.py | 4 +++- tests/test_instruments_rfsoc.py | 6 +++++- tests/test_sweeper.py | 4 +++- 7 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/qibolab/instruments/qblox/acquisition.py b/src/qibolab/instruments/qblox/acquisition.py index 98aee7c1d1..d736855249 100644 --- a/src/qibolab/instruments/qblox/acquisition.py +++ b/src/qibolab/instruments/qblox/acquisition.py @@ -3,7 +3,7 @@ import numpy as np -from qibolab.pulses.shape import demodulate +from qibolab.pulses.modulation import demodulate SAMPLING_RATE = 1 diff --git a/src/qibolab/instruments/qblox/sequencer.py b/src/qibolab/instruments/qblox/sequencer.py index 86e68b35e3..e450b8e005 100644 --- a/src/qibolab/instruments/qblox/sequencer.py +++ b/src/qibolab/instruments/qblox/sequencer.py @@ -5,7 +5,7 @@ from qibolab.instruments.qblox.q1asm import Program from qibolab.pulses import Pulse, PulseSequence, PulseType -from qibolab.pulses.shape import modulate +from qibolab.pulses.modulation import modulate from qibolab.sweeper import Parameter, Sweeper SAMPLING_RATE = 1 diff --git a/src/qibolab/instruments/qm/config.py b/src/qibolab/instruments/qm/config.py index cc934fb202..e6ceeca78f 100644 --- a/src/qibolab/instruments/qm/config.py +++ b/src/qibolab/instruments/qm/config.py @@ -4,10 +4,12 @@ import numpy as np from qibo.config import raise_error -from qibolab.pulses import PulseType, Rectangular +from qibolab.pulses import Envelopes, PulseType from .ports import OPXIQ, OctaveInput, OctaveOutput, OPXOutput +Rectangular = Envelopes.RECTANGULAR.value + SAMPLING_RATE = 1 """Sampling rate of Quantum Machines OPX in GSps.""" diff --git a/src/qibolab/instruments/rfsoc/convert.py b/src/qibolab/instruments/rfsoc/convert.py index 1aa218d6b4..c858e46f70 100644 --- a/src/qibolab/instruments/rfsoc/convert.py +++ b/src/qibolab/instruments/rfsoc/convert.py @@ -8,7 +8,7 @@ import qibosoq.components.base as rfsoc import qibosoq.components.pulses as rfsoc_pulses -from qibolab.pulses import Pulse, PulseSequence, PulseShape +from qibolab.pulses import Envelope, Pulse, PulseSequence from qibolab.qubits import Qubit from qibolab.sweeper import BIAS, DURATION, Parameter, Sweeper @@ -17,7 +17,7 @@ def replace_pulse_shape( - rfsoc_pulse: rfsoc_pulses.Pulse, shape: PulseShape, sampling_rate: float + rfsoc_pulse: rfsoc_pulses.Pulse, shape: Envelope, sampling_rate: float ) -> rfsoc_pulses.Pulse: """Set pulse shape parameters in rfsoc_pulses pulse object.""" if shape.name not in {"Gaussian", "Drag", "Rectangular", "Exponential"}: diff --git a/tests/test_instruments_qm.py b/tests/test_instruments_qm.py index 62b3ef994b..b60670f868 100644 --- a/tests/test_instruments_qm.py +++ b/tests/test_instruments_qm.py @@ -9,12 +9,14 @@ from qibolab.instruments.qm.acquisition import Acquisition, declare_acquisitions from qibolab.instruments.qm.controller import controllers_config from qibolab.instruments.qm.sequence import BakedPulse, QMPulse, Sequence -from qibolab.pulses import Pulse, PulseSequence, PulseType, Rectangular +from qibolab.pulses import Envelopes, Pulse, PulseSequence, PulseType from qibolab.qubits import Qubit from qibolab.sweeper import Parameter, Sweeper from .conftest import set_platform_profile +Rectangular = Envelopes.RECTANGULAR.value + def test_qmpulse(): pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), "ch0", qubit=0) diff --git a/tests/test_instruments_rfsoc.py b/tests/test_instruments_rfsoc.py index da943061d1..2ea0c19736 100644 --- a/tests/test_instruments_rfsoc.py +++ b/tests/test_instruments_rfsoc.py @@ -14,7 +14,7 @@ convert_units_sweeper, replace_pulse_shape, ) -from qibolab.pulses import Drag, Gaussian, Pulse, PulseSequence, PulseType, Rectangular +from qibolab.pulses import Envelopes, Pulse, PulseSequence, PulseType from qibolab.qubits import Qubit from qibolab.result import ( AveragedIntegratedResults, @@ -25,6 +25,10 @@ from .conftest import get_instrument +Rectangular = Envelopes.RECTANGULAR.value +Gaussian = Envelopes.GAUSSIAN.value +Drag = Envelopes.DRAG.value + def test_convert_default(dummy_qrc): """Test convert function raises errors when parameter have wrong types.""" diff --git a/tests/test_sweeper.py b/tests/test_sweeper.py index bf537ebe9e..e9eb6670c6 100644 --- a/tests/test_sweeper.py +++ b/tests/test_sweeper.py @@ -1,10 +1,12 @@ import numpy as np import pytest -from qibolab.pulses import Pulse, Rectangular +from qibolab.pulses import Envelopes, Pulse from qibolab.qubits import Qubit from qibolab.sweeper import Parameter, QubitParameter, Sweeper +Rectangular = Envelopes.RECTANGULAR.value + @pytest.mark.parametrize("parameter", Parameter) def test_sweeper_pulses(parameter): From 492f41aa9fc994ece80b4316a9d5c48aa1f54de3 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 15 Mar 2024 19:01:23 +0100 Subject: [PATCH 0138/1006] fix: Drop shape initialization in pulse post init Best fix ever, ~2000 tests in one shot :P --- src/qibolab/pulses/pulse.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index 6c6b8a12af..f17feb0cbf 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -47,7 +47,7 @@ class Pulse: """The pulse envelope shape. See - :cls:`qibolab.pulses.shape.Envelopes` for list of available shapes. + :cls:`qibolab.pulses.envelope.Envelopes` for list of available shapes. """ channel: Optional[str] = None """Channel on which the pulse should be played. @@ -65,10 +65,6 @@ class Pulse: def __post_init__(self): if isinstance(self.type, str): self.type = PulseType(self.type) - if isinstance(self.shape, str): - self.shape = PulseShape.eval(self.shape) - # TODO: drop the cyclic reference - self.shape.pulse = self @classmethod def flux(cls, start, duration, amplitude, shape, **kwargs): From b7c076276048cc1451d0009c00af738403ee019a Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 15 Mar 2024 19:02:40 +0100 Subject: [PATCH 0139/1006] fix: Fully drop post-init in pulse --- src/qibolab/pulses/pulse.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index f17feb0cbf..93a846bd15 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -23,6 +23,7 @@ class PulseType(Enum): COUPLERFLUX = "cf" +# TODO: replace nested serialization with pydantic @dataclass class Pulse: """A class to represent a pulse to be sent to the QPU.""" @@ -62,10 +63,6 @@ class Pulse: qubit: int = 0 """Qubit or coupler addressed by the pulse.""" - def __post_init__(self): - if isinstance(self.type, str): - self.type = PulseType(self.type) - @classmethod def flux(cls, start, duration, amplitude, shape, **kwargs): return cls( From bc37a90a1ace98cdfa4cb030ccf184397a2b4087 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 15 Mar 2024 19:45:23 +0100 Subject: [PATCH 0140/1006] fix: Propagate envelopes to modulation tests --- tests/pulses/test_modulation.py | 45 ++++++++++++++++++--------------- tests/pulses/test_sequence.py | 8 +++--- 2 files changed, 28 insertions(+), 25 deletions(-) diff --git a/tests/pulses/test_modulation.py b/tests/pulses/test_modulation.py index e22b2af294..a403bb4ed3 100644 --- a/tests/pulses/test_modulation.py +++ b/tests/pulses/test_modulation.py @@ -1,6 +1,7 @@ import numpy as np from qibolab.pulses import Envelopes, IqWaveform, Pulse, PulseType +from qibolab.pulses.envelope import Times from qibolab.pulses.modulation import demodulate, modulate Rectangular = Envelopes.RECTANGULAR.value @@ -14,12 +15,13 @@ def test_modulation(): amplitude=0.9, frequency=20_000_000, relative_phase=0.0, - shape=Rectangular(), - channel=0, + envelope=Rectangular(), + channel="0", type=PulseType.READOUT, qubit=0, ) - renvs: IqWaveform = np.array(rect.shape.envelope_waveforms()) + times = Times(rect.duration, 30) + renvs: IqWaveform = rect.envelopes(times) # fmt: off np.testing.assert_allclose(modulate(renvs, 0.04), np.array([[ 6.36396103e-01, 6.16402549e-01, 5.57678156e-01, @@ -46,33 +48,34 @@ def test_modulation(): # fmt: on gauss = Pulse( - start=5, + start=0, duration=20, amplitude=3.5, frequency=2_000_000, relative_phase=0.0, - shape=Gaussian(0.5), - channel=0, + envelope=Gaussian(0.5), + channel="0", type=PulseType.READOUT, qubit=0, ) - genvs: IqWaveform = np.array(gauss.shape.envelope_waveforms()) + times = Times(gauss.duration, 20) + genvs: IqWaveform = gauss.envelope.envelopes(times) # fmt: off np.testing.assert_allclose(modulate(genvs, 0.3), - np.array([[ 2.40604965e+00, -7.47704261e-01, -1.96732725e+00, - 1.97595317e+00, 7.57582564e-01, -2.45926187e+00, - 7.61855973e-01, 1.99830815e+00, -2.00080760e+00, - -7.64718297e-01, 2.47468039e+00, -7.64240497e-01, - -1.99830815e+00, 1.99456483e+00, 7.59953712e-01, - -2.45158868e+00, 7.54746949e-01, 1.96732725e+00, - -1.95751517e+00, -7.43510231e-01], - [ 0.00000000e+00, 2.30119709e+00, -1.42934692e+00, - -1.43561401e+00, 2.33159938e+00, 9.03518154e-16, - -2.34475159e+00, 1.45185586e+00, 1.45367181e+00, - -2.35356091e+00, -1.81836565e-15, 2.35209040e+00, - -1.45185586e+00, -1.44913618e+00, 2.33889703e+00, - 2.70209720e-15, -2.32287226e+00, 1.42934692e+00, - 1.42221802e+00, -2.28828920e+00]]) + np.array([[ 4.50307953e-01, -1.52257426e-01, -4.31814602e-01, + 4.63124693e-01, 1.87836646e-01, -6.39017403e-01, + 2.05526028e-01, 5.54460924e-01, -5.65661777e-01, + -2.18235048e-01, 7.06223450e-01, -2.16063573e-01, + -5.54460924e-01, 5.38074127e-01, 1.97467237e-01, + -6.07852156e-01, 1.76897892e-01, 4.31814602e-01, + -3.98615117e-01, -1.39152810e-01], + [ 0.00000000e+00, 4.68600175e-01, -3.13731672e-01, + -3.36479785e-01, 5.78101754e-01, 2.34771185e-16, + -6.32544073e-01, 4.02839441e-01, 4.10977338e-01, + -6.71658414e-01, -5.18924572e-16, 6.64975301e-01, + -4.02839441e-01, -3.90933736e-01, 6.07741665e-01, + 6.69963778e-16, -5.44435729e-01, 3.13731672e-01, + 2.89610835e-01, -4.28268313e-01]]) ) # fmt: on diff --git a/tests/pulses/test_sequence.py b/tests/pulses/test_sequence.py index 29c179b82f..c71b501d06 100644 --- a/tests/pulses/test_sequence.py +++ b/tests/pulses/test_sequence.py @@ -17,7 +17,7 @@ def test_add_readout(): amplitude=0.3, duration=60, relative_phase=0, - shape="Gaussian(5)", + envelope=Gaussian(5), channel=1, ) ) @@ -28,9 +28,9 @@ def test_add_readout(): amplitude=0.3, duration=60, relative_phase=0, - shape="Drag(5, 2)", + envelope=Drag(5, 2), channel=1, - type="qf", + type=PulseType.FLUX, ) ) sequence.append(Delay(4, channel=1)) @@ -40,7 +40,7 @@ def test_add_readout(): amplitude=0.9, duration=2000, relative_phase=0, - shape="Rectangular()", + envelope=Rectangular(), channel=11, type=PulseType.READOUT, ) From b719c97549bb6d5238740ab0afad995b71d02a12 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 15 Mar 2024 20:58:29 +0100 Subject: [PATCH 0141/1006] test: Simplify modualtion tests, decouple from pulses --- tests/pulses/test_modulation.py | 33 ++++++--------------------------- 1 file changed, 6 insertions(+), 27 deletions(-) diff --git a/tests/pulses/test_modulation.py b/tests/pulses/test_modulation.py index a403bb4ed3..079ec310b9 100644 --- a/tests/pulses/test_modulation.py +++ b/tests/pulses/test_modulation.py @@ -1,6 +1,6 @@ import numpy as np -from qibolab.pulses import Envelopes, IqWaveform, Pulse, PulseType +from qibolab.pulses import Envelopes, IqWaveform from qibolab.pulses.envelope import Times from qibolab.pulses.modulation import demodulate, modulate @@ -9,19 +9,9 @@ def test_modulation(): - rect = Pulse( - start=0, - duration=30, - amplitude=0.9, - frequency=20_000_000, - relative_phase=0.0, - envelope=Rectangular(), - channel="0", - type=PulseType.READOUT, - qubit=0, - ) - times = Times(rect.duration, 30) - renvs: IqWaveform = rect.envelopes(times) + times = Times(30, 30) + amplitude = 0.9 + renvs: IqWaveform = Rectangular().envelopes(times) * amplitude # fmt: off np.testing.assert_allclose(modulate(renvs, 0.04), np.array([[ 6.36396103e-01, 6.16402549e-01, 5.57678156e-01, @@ -47,19 +37,8 @@ def test_modulation(): ) # fmt: on - gauss = Pulse( - start=0, - duration=20, - amplitude=3.5, - frequency=2_000_000, - relative_phase=0.0, - envelope=Gaussian(0.5), - channel="0", - type=PulseType.READOUT, - qubit=0, - ) - times = Times(gauss.duration, 20) - genvs: IqWaveform = gauss.envelope.envelopes(times) + times = Times(20, 20) + genvs: IqWaveform = Gaussian(0.5).envelopes(times) # fmt: off np.testing.assert_allclose(modulate(genvs, 0.3), np.array([[ 4.50307953e-01, -1.52257426e-01, -4.31814602e-01, From 4fca8aa7dce81cd1bb00b10a70fc8cf6e30fc355 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 15 Mar 2024 21:15:59 +0100 Subject: [PATCH 0142/1006] test: Fix errors in pulse --- src/qibolab/pulses/pulse.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index 93a846bd15..ba338ad8b1 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -64,9 +64,9 @@ class Pulse: """Qubit or coupler addressed by the pulse.""" @classmethod - def flux(cls, start, duration, amplitude, shape, **kwargs): + def flux(cls, start, duration, amplitude, envelope, **kwargs): return cls( - start, duration, amplitude, 0, 0, shape, type=PulseType.FLUX, **kwargs + start, duration, amplitude, 0, 0, envelope, type=PulseType.FLUX, **kwargs ) @property @@ -149,7 +149,7 @@ def is_equal_ignoring_start(self, item) -> bool: and self.amplitude == item.amplitude and self.frequency == item.frequency and self.relative_phase == item.relative_phase - and self.shape == item.shape + and self.envelope == item.envelope and self.channel == item.channel and self.type == item.type and self.qubit == item.qubit From 7df1717b5b9f663ba63dc699ea19a3b5e3edea97 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 18 Mar 2024 10:15:20 +0100 Subject: [PATCH 0143/1006] build: Upgrade Nix shell to use Poetry 1.8 --- flake.lock | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/flake.lock b/flake.lock index 07ae0529b8..e34ee8243a 100644 --- a/flake.lock +++ b/flake.lock @@ -8,11 +8,11 @@ "pre-commit-hooks": "pre-commit-hooks" }, "locked": { - "lastModified": 1701187605, - "narHash": "sha256-NctguPdUeDVLXFsv6vI1RlEiHLsXkeW3pgZe/mwn1BU=", + "lastModified": 1710144971, + "narHash": "sha256-CjTOdoBvT/4AQncTL20SDHyJNgsXZjtGbz62yDIUYnM=", "owner": "cachix", "repo": "devenv", - "rev": "a7c4dd8f4eb1f98a6b8f04bf08364954e1e73e4f", + "rev": "6c0bad0045f1e1802f769f7890f6a59504825f4d", "type": "github" }, "original": { @@ -29,11 +29,11 @@ "rust-analyzer-src": "rust-analyzer-src" }, "locked": { - "lastModified": 1705904706, - "narHash": "sha256-0aJfyNYWy6pS4GfOA+pmGOE+PgJZLG78T+sPh8zRJx8=", + "lastModified": 1710742993, + "narHash": "sha256-W0PQCe0bW3hKF5lHawXrKynBcdSP18Qa4sb8DcUfOqI=", "owner": "nix-community", "repo": "fenix", - "rev": "8e7851239acf6bfb06637f4d3e180302f53ec542", + "rev": "6f2fec850f569d61562d3a47dc263f19e9c7d825", "type": "github" }, "original": { @@ -61,11 +61,11 @@ "flake-compat_2": { "flake": false, "locked": { - "lastModified": 1673956053, - "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", + "lastModified": 1696426674, + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", "owner": "edolstra", "repo": "flake-compat", - "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", "type": "github" }, "original": { @@ -97,11 +97,11 @@ "systems": "systems_2" }, "locked": { - "lastModified": 1685518550, - "narHash": "sha256-o2d0KcvaXzTrPRIo0kOLV0/QXHhDQ5DTi+OxcjO8xqY=", + "lastModified": 1701680307, + "narHash": "sha256-kAuep2h5ajznlPMD9rnQyffWG8EM/C73lejGofXvdM8=", "owner": "numtide", "repo": "flake-utils", - "rev": "a1720a10a6cfe8234c0e93907ffe81be440f4cef", + "rev": "4022d587cbbfd70fe950c1e2083a02621806a725", "type": "github" }, "original": { @@ -196,11 +196,11 @@ ] }, "locked": { - "lastModified": 1702034373, - "narHash": "sha256-Apubv9die/XRBPI0eRFJyvuyGz/wD4YQUQJHRYCRenc=", + "lastModified": 1710660211, + "narHash": "sha256-tSNj0sK//GYmYSH9ts5pT1u4oI5Uxb+XWP4FIEhndxk=", "owner": "cachix", "repo": "nixpkgs-python", - "rev": "1cae686aa92dbccafe74fd242f984c3ec27c0b20", + "rev": "8b3ea06b981f2fd11d082df3474894b1d5bcbe7b", "type": "github" }, "original": { @@ -243,11 +243,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1702312524, - "narHash": "sha256-gkZJRDBUCpTPBvQk25G0B7vfbpEYM5s5OZqghkjZsnE=", + "lastModified": 1710631334, + "narHash": "sha256-rL5LSYd85kplL5othxK5lmAtjyMOBg390sGBTb3LRMM=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "a9bf124c46ef298113270b1f84a164865987a91c", + "rev": "c75037bbf9093a2acb617804ee46320d6d1fea5a", "type": "github" }, "original": { @@ -272,11 +272,11 @@ "nixpkgs-stable": "nixpkgs-stable" }, "locked": { - "lastModified": 1688056373, - "narHash": "sha256-2+SDlNRTKsgo3LBRiMUcoEUb6sDViRNQhzJquZ4koOI=", + "lastModified": 1704725188, + "narHash": "sha256-qq8NbkhRZF1vVYQFt1s8Mbgo8knj+83+QlL5LBnYGpI=", "owner": "cachix", "repo": "pre-commit-hooks.nix", - "rev": "5843cf069272d92b60c3ed9e55b7a8989c01d4c7", + "rev": "ea96f0c05924341c551a797aaba8126334c505d2", "type": "github" }, "original": { @@ -297,11 +297,11 @@ "rust-analyzer-src": { "flake": false, "locked": { - "lastModified": 1705864945, - "narHash": "sha256-ZATChFWHToTZQFLlzrzDUX8fjEbMHHBIyPaZU1JGmjI=", + "lastModified": 1710708100, + "narHash": "sha256-Jd6pmXlwKk5uYcjyO/8BfbUVmx8g31Qfk7auI2IG66A=", "owner": "rust-lang", "repo": "rust-analyzer", - "rev": "d410d4a2baf9e99b37b03dd42f06238b14374bf7", + "rev": "b6d1887bc4f9543b6c6bf098179a62446f34a6c3", "type": "github" }, "original": { From a11072cbd2433a78135af84590ce0cb451798041 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 18 Mar 2024 11:09:29 +0100 Subject: [PATCH 0144/1006] build: Add linting deps to dev shell --- flake.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flake.nix b/flake.nix index 58d57c2a86..dbcf891e7f 100644 --- a/flake.nix +++ b/flake.nix @@ -68,7 +68,7 @@ enable = true; install = { enable = true; - groups = ["dev" "tests"]; + groups = ["dev" "analysis" "tests"]; extras = [ (lib.strings.concatStrings (lib.strings.intersperse " -E " From eab725f93242ec8a90fd2e51b6af9a4168691cd4 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 18 Mar 2024 12:40:22 +0100 Subject: [PATCH 0145/1006] feat!: Reintroduce sampling rate argument for pulse envelope retrieval --- src/qibolab/instruments/qm/sequence.py | 10 +++++----- src/qibolab/pulses/pulse.py | 16 +++++++++------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/qibolab/instruments/qm/sequence.py b/src/qibolab/instruments/qm/sequence.py index 1e760f8ecf..f950d734f0 100644 --- a/src/qibolab/instruments/qm/sequence.py +++ b/src/qibolab/instruments/qm/sequence.py @@ -9,9 +9,9 @@ from qualang_tools.bakery import baking from qualang_tools.bakery.bakery import Baking -from qibolab.instruments.qm.acquisition import Acquisition from qibolab.pulses import Pulse, PulseType +from .acquisition import Acquisition from .config import SAMPLING_RATE, QMConfig DurationsType = Union[List[int], npt.NDArray[int]] @@ -71,7 +71,7 @@ def __post_init__(self): if self.element is None: self.element = f"{pulse_type}{self.pulse.qubit}" self.operation: str = ( - f"{pulse_type}({self.pulse.duration}, {amplitude}, {self.pulse.shape})" + f"{pulse_type}({self.pulse.duration}, {amplitude}, {self.pulse.envelope})" ) self.relative_phase: float = self.pulse.relative_phase / (2 * np.pi) self.elements_to_align.add(self.element) @@ -147,11 +147,11 @@ def bake(self, config: QMConfig, durations: DurationsType): for t in durations: with baking(config.__dict__, padding_method="right") as segment: if self.pulse.type is PulseType.FLUX: - waveform = self.pulse.envelope_waveform_i(SAMPLING_RATE).tolist() + waveform = self.pulse.i(SAMPLING_RATE).tolist() waveform = self.calculate_waveform(waveform, t) else: - waveform_i = self.pulse.envelope_waveform_i(SAMPLING_RATE).tolist() - waveform_q = self.pulse.envelope_waveform_q(SAMPLING_RATE).tolist() + waveform_i = self.pulse.i(SAMPLING_RATE).tolist() + waveform_q = self.pulse.q(SAMPLING_RATE).tolist() waveform = [ self.calculate_waveform(waveform_i, t), self.calculate_waveform(waveform_q, t), diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index ba338ad8b1..0c369024ed 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -104,20 +104,22 @@ def phase(self) -> float: def id(self) -> int: return id(self) - def i(self, times: Times) -> Waveform: - """The envelope waveform of the i component of the pulse.""" + def _times(self, sampling_rate: float): + return Times(self.duration, int(self.duration * sampling_rate)) + def i(self, sampling_rate: float) -> Waveform: + """The envelope waveform of the i component of the pulse.""" + times = self._times(sampling_rate) return self.amplitude * self.envelope.i(times) - def q(self, times: Times) -> Waveform: + def q(self, sampling_rate: float) -> Waveform: """The envelope waveform of the q component of the pulse.""" - + times = self._times(sampling_rate) return self.amplitude * self.envelope.q(times) - def envelopes(self, times: Times) -> IqWaveform: + def envelopes(self, sampling_rate: float) -> IqWaveform: """A tuple with the i and q envelope waveforms of the pulse.""" - - return np.array([self.i(times), self.q(times)]) + return np.array([self.i(sampling_rate), self.q(sampling_rate)]) def __hash__(self): """Hash the content. From 6acd9f4ee9498a9f9808772fb91a795c728cc06c Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 18 Mar 2024 14:12:00 +0100 Subject: [PATCH 0146/1006] fix: Move default sampling rate to plots, drop from modulation --- src/qibolab/pulses/modulation.py | 11 ++--------- src/qibolab/pulses/plot.py | 18 ++++++++++++------ 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/qibolab/pulses/modulation.py b/src/qibolab/pulses/modulation.py index 3d5ce55a77..05e2b67475 100644 --- a/src/qibolab/pulses/modulation.py +++ b/src/qibolab/pulses/modulation.py @@ -4,18 +4,11 @@ __all__ = ["modulate", "demodulate"] -SAMPLING_RATE = 1 -"""Default sampling rate in gigasamples per second (GSps). - -Used for generating waveform envelopes if the instruments do not provide -a different value. -""" - def modulate( envelope: IqWaveform, freq: float, - rate: float = SAMPLING_RATE, + rate: float, phase: float = 0.0, ) -> IqWaveform: """Modulate the envelope waveform with a carrier. @@ -47,7 +40,7 @@ def modulate( def demodulate( modulated: IqWaveform, freq: float, - rate: float = SAMPLING_RATE, + rate: float, ) -> IqWaveform: """Demodulate the acquired pulse. diff --git a/src/qibolab/pulses/plot.py b/src/qibolab/pulses/plot.py index cd31fb61ad..c2e161bca9 100644 --- a/src/qibolab/pulses/plot.py +++ b/src/qibolab/pulses/plot.py @@ -10,6 +10,13 @@ from .pulse import Delay, Pulse from .sequence import PulseSequence +SAMPLING_RATE = 1 +"""Default sampling rate in gigasamples per second (GSps). + +Used for generating waveform envelopes if the instruments do not provide +a different value. +""" + def waveform(wf: Waveform, filename=None): """Plot the waveform. @@ -38,12 +45,11 @@ def pulse(pulse_: Pulse, filename=None): import matplotlib.pyplot as plt from matplotlib import gridspec - window = Times(pulse_.duration, num_samples) - waveform_i = pulse_.shape.i(window) - waveform_q = pulse_.shape.q(window) + waveform_i = pulse_.i(SAMPLING_RATE) + waveform_q = pulse_.q(SAMPLING_RATE) num_samples = len(waveform_i) - time = np.arange(num_samples) / sampling_rate + time = np.arange(num_samples) / SAMPLING_RATE _ = plt.figure(figsize=(14, 5), dpi=200) gs = gridspec.GridSpec(ncols=2, nrows=1, width_ratios=np.array([2, 1])) ax1 = plt.subplot(gs[0]) @@ -62,7 +68,7 @@ def pulse(pulse_: Pulse, filename=None): linestyle="dashed", ) - envelope = pulse_.shape.envelopes(window) + envelope = pulse_.envelopes(SAMPLING_RATE) modulated = modulate(np.array(envelope), pulse_.frequency) ax1.plot(time, modulated[0], label="modulated i", c="C0") ax1.plot(time, modulated[1], label="modulated q", c="C1") @@ -150,7 +156,7 @@ def sequence(ps: PulseSequence, filename=None): envelope = pulse.shape.envelope_waveforms(sampling_rate) num_samples = envelope[0].size - time = start + np.arange(num_samples) / sampling_rate + time = start + np.arange(num_samples) / SAMPLING_RATE modulated = modulate(np.array(envelope), pulse.frequency) ax.plot(time, modulated[1], c="lightgrey") ax.plot(time, modulated[0], c=f"C{str(n)}") From c35781b83e8a5961eab94aada0a454de401edb01 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 21 Mar 2024 10:04:38 +0400 Subject: [PATCH 0147/1006] feat: Export explicitly all envelopes types --- src/qibolab/pulses/envelope.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/qibolab/pulses/envelope.py b/src/qibolab/pulses/envelope.py index edc6b1eecb..bc528caadd 100644 --- a/src/qibolab/pulses/envelope.py +++ b/src/qibolab/pulses/envelope.py @@ -16,6 +16,15 @@ "IqWaveform", "Envelope", "Envelopes", + "Rectangular", + "Exponential", + "Gaussian", + "GaussianSquare", + "Drag", + "Iir", + "Snz", + "ECap", + "Custom", ] From 868f4ead03faf38681ee7bcc8145593c1633e8da Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 21 Mar 2024 10:31:57 +0400 Subject: [PATCH 0148/1006] fix: Update envelope names --- tests/test_instruments_qmsim.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_instruments_qmsim.py b/tests/test_instruments_qmsim.py index 6b7cf83dfb..ceea34f9d8 100644 --- a/tests/test_instruments_qmsim.py +++ b/tests/test_instruments_qmsim.py @@ -23,7 +23,7 @@ from qibolab import AcquisitionType, AveragingMode, ExecutionParameters, create_platform from qibolab.backends import QibolabBackend -from qibolab.pulses import SNZ, Pulse, PulseSequence, Rectangular +from qibolab.pulses import Pulse, PulseSequence, Rectangular, Snz from qibolab.sweeper import Parameter, Sweeper from .conftest import set_platform_profile @@ -489,7 +489,7 @@ def test_qmsim_snz_pulse(simulator, folder, qubit): duration = 30 amplitude = 0.01 sequence = PulseSequence() - shape = SNZ(t_half_flux_pulse=duration // 2, b_amplitude=2) + shape = Snz(t_half_flux_pulse=duration // 2, b_amplitude=2) channel = simulator.qubits[qubit].flux.name qd_pulse = simulator.create_RX_pulse(qubit, start=0) flux_pulse = Pulse.flux(qd_pulse.finish, duration, amplitude, shape, channel, qubit) From 2e62f07bda507546dd6200f02fe79612bb9f8cea Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 21 Mar 2024 10:46:31 +0400 Subject: [PATCH 0149/1006] fix: Propagate shape to envelope update in zhinst --- src/qibolab/instruments/zhinst/pulse.py | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/src/qibolab/instruments/zhinst/pulse.py b/src/qibolab/instruments/zhinst/pulse.py index c26e8321cb..b9e068acfe 100644 --- a/src/qibolab/instruments/zhinst/pulse.py +++ b/src/qibolab/instruments/zhinst/pulse.py @@ -17,15 +17,15 @@ def select_pulse(pulse: Pulse): """Return laboneq pulse object corresponding to the given qibolab pulse.""" - if isinstance(pulse.shape, Rectangular): + if isinstance(pulse.envelope, Rectangular): can_compress = pulse.type is not PulseType.READOUT return lo.pulse_library.const( length=round(pulse.duration * NANO_TO_SECONDS, 9), amplitude=pulse.amplitude, can_compress=can_compress, ) - if isinstance(pulse.shape, Gaussian): - sigma = pulse.shape.rel_sigma + if isinstance(pulse.envelope, Gaussian): + sigma = pulse.envelope.rel_sigma return lo.pulse_library.gaussian( length=round(pulse.duration * NANO_TO_SECONDS, 9), amplitude=pulse.amplitude, @@ -33,9 +33,9 @@ def select_pulse(pulse: Pulse): zero_boundaries=False, ) - if isinstance(pulse.shape, GaussianSquare): - sigma = pulse.shape.rel_sigma - width = pulse.shape.width + if isinstance(pulse.envelope, GaussianSquare): + sigma = pulse.envelope.rel_sigma + width = pulse.envelope.width can_compress = pulse.type is not PulseType.READOUT return lo.pulse_library.gaussian_square( length=round(pulse.duration * NANO_TO_SECONDS, 9), @@ -46,9 +46,9 @@ def select_pulse(pulse: Pulse): zero_boundaries=False, ) - if isinstance(pulse.shape, Drag): - sigma = pulse.shape.rel_sigma - beta = pulse.shape.beta + if isinstance(pulse.envelope, Drag): + sigma = pulse.envelope.rel_sigma + beta = pulse.envelope.beta return lo.pulse_library.drag( length=round(pulse.duration * NANO_TO_SECONDS, 9), amplitude=pulse.amplitude, @@ -57,15 +57,14 @@ def select_pulse(pulse: Pulse): zero_boundaries=False, ) - if np.all(pulse.envelope_waveform_q(SAMPLING_RATE) == 0): + if np.all(pulse.q(SAMPLING_RATE) == 0): return sampled_pulse_real( - samples=pulse.envelope_waveform_i(SAMPLING_RATE), + samples=pulse.i(SAMPLING_RATE), can_compress=True, ) else: return sampled_pulse_complex( - samples=pulse.envelope_waveform_i(SAMPLING_RATE) - + (1j * pulse.envelope_waveform_q(SAMPLING_RATE)), + samples=pulse.i(SAMPLING_RATE) + (1j * pulse.q(SAMPLING_RATE)), can_compress=True, ) From 5ff975c74e8e1e2dab5b8c6c99d11467f6b86858 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 21 Mar 2024 13:24:42 +0400 Subject: [PATCH 0150/1006] feat!: Start introducing pydantic --- pyproject.toml | 1 + src/qibolab/pulses/envelope.py | 60 +++++++++++++++------------------- 2 files changed, 27 insertions(+), 34 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index ff0656b367..854cd2bf91 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,6 +26,7 @@ qibo = ">=0.2.6" networkx = "^3.0" numpy = "^1.26.4" more-itertools = "^9.1.0" +pydantic = "^2.6.4" qblox-instruments = { version = "0.12.0", optional = true } qcodes = { version = "^0.37.0", optional = true } qcodes_contrib_drivers = { version = "0.18.0", optional = true } diff --git a/src/qibolab/pulses/envelope.py b/src/qibolab/pulses/envelope.py index bc528caadd..a466b5932f 100644 --- a/src/qibolab/pulses/envelope.py +++ b/src/qibolab/pulses/envelope.py @@ -2,11 +2,12 @@ from abc import ABC from dataclasses import dataclass -from enum import Enum from functools import cached_property +from typing import Union import numpy as np import numpy.typing as npt +from pydantic import BaseModel from scipy.signal import lfilter from scipy.signal.windows import gaussian @@ -14,8 +15,8 @@ "Times", "Waveform", "IqWaveform", + "BaseEnvelope", "Envelope", - "Envelopes", "Rectangular", "Exponential", "Gaussian", @@ -60,7 +61,7 @@ def window(self): return np.linspace(0, self.duration, self.samples) -class Envelope(ABC): +class BaseEnvelope(ABC, BaseModel): """Pulse envelopes. Generates both i (in-phase) and q (quadrature) components. @@ -79,8 +80,7 @@ def envelopes(self, times: Times) -> IqWaveform: return np.array([self.i(times), self.q(times)]) -@dataclass(frozen=True) -class Rectangular(Envelope): +class Rectangular(BaseEnvelope): """Rectangular envelope.""" def i(self, times: Times) -> Waveform: @@ -88,8 +88,7 @@ def i(self, times: Times) -> Waveform: return np.ones(times.samples) -@dataclass(frozen=True) -class Exponential(Envelope): +class Exponential(BaseEnvelope): r"""Exponential shape, i.e. square pulse with an exponential decay. .. math:: @@ -121,8 +120,7 @@ def _samples_sigma(rel_sigma: float, times: Times) -> float: return rel_sigma * times.samples -@dataclass(frozen=True) -class Gaussian(Envelope): +class Gaussian(BaseEnvelope): r"""Gaussian pulse shape. Args: @@ -144,8 +142,7 @@ def i(self, times: Times) -> Waveform: return gaussian(times.samples, _samples_sigma(self.rel_sigma, times)) -@dataclass(frozen=True) -class GaussianSquare(Envelope): +class GaussianSquare(BaseEnvelope): r"""GaussianSquare pulse shape. .. math:: @@ -173,8 +170,7 @@ def i(self, times: Times) -> Waveform: return pulse -@dataclass(frozen=True) -class Drag(Envelope): +class Drag(BaseEnvelope): """Derivative Removal by Adiabatic Gate (DRAG) pulse shape. .. todo:: @@ -205,8 +201,7 @@ def q(self, times: Times) -> Waveform: return self.beta * (-(ts - times.mean) / (sigma**2)) * self.i(times) -@dataclass(frozen=True) -class Iir(Envelope): +class Iir(BaseEnvelope): """IIR Filter using scipy.signal lfilter. https://arxiv.org/pdf/1907.04818.pdf (page 11 - filter formula S22):: @@ -218,7 +213,7 @@ class Iir(Envelope): a: npt.NDArray b: npt.NDArray - target: Envelope + target: BaseEnvelope def _data(self, target: npt.NDArray) -> npt.NDArray: a = self.a / self.a[0] @@ -239,8 +234,7 @@ def q(self, times: Times) -> Waveform: return self._data(self.target.q(times)) -@dataclass(frozen=True) -class Snz(Envelope): +class Snz(BaseEnvelope): """Sudden variant Net Zero. https://arxiv.org/abs/2008.07411 @@ -270,8 +264,7 @@ def i(self, times: Times) -> Waveform: return pulse -@dataclass(frozen=True) -class ECap(Envelope): +class ECap(BaseEnvelope): r"""ECap pulse shape. .. todo:: @@ -296,8 +289,7 @@ def i(self, times: Times) -> Waveform: ) -@dataclass(frozen=True) -class Custom(Envelope): +class Custom(BaseEnvelope): """Arbitrary shape. .. todo:: @@ -318,15 +310,15 @@ def q(self, times: Times) -> Waveform: raise NotImplementedError -class Envelopes(Enum): - """Available pulse shapes.""" - - RECTANGULAR = Rectangular - EXPONENTIAL = Exponential - GAUSSIAN = Gaussian - GAUSSIAN_SQUARE = GaussianSquare - DRAG = Drag - IIR = Iir - SNZ = Snz - ECAP = ECap - CUSTOM = Custom +Envelope = Union[ + Rectangular, + Exponential, + Gaussian, + GaussianSquare, + Drag, + Iir, + Snz, + ECap, + Custom, +] +"""Available pulse shapes.""" From c117cb8399e67d7a350271dc0542e596573892b1 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 21 Mar 2024 15:50:10 +0400 Subject: [PATCH 0151/1006] fix: Propagate Pydantic models to Pulse --- src/qibolab/instruments/qm/config.py | 4 +--- src/qibolab/pulses/pulse.py | 21 +++++++++++++-------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/qibolab/instruments/qm/config.py b/src/qibolab/instruments/qm/config.py index e6ceeca78f..cc934fb202 100644 --- a/src/qibolab/instruments/qm/config.py +++ b/src/qibolab/instruments/qm/config.py @@ -4,12 +4,10 @@ import numpy as np from qibo.config import raise_error -from qibolab.pulses import Envelopes, PulseType +from qibolab.pulses import PulseType, Rectangular from .ports import OPXIQ, OctaveInput, OctaveOutput, OPXOutput -Rectangular = Envelopes.RECTANGULAR.value - SAMPLING_RATE = 1 """Sampling rate of Quantum Machines OPX in GSps.""" diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index 0c369024ed..84a12ac71c 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -1,10 +1,11 @@ """Pulse class.""" -from dataclasses import dataclass, fields +from dataclasses import fields from enum import Enum from typing import Optional import numpy as np +from pydantic import BaseModel from .envelope import Envelope, IqWaveform, Times, Waveform @@ -23,9 +24,7 @@ class PulseType(Enum): COUPLERFLUX = "cf" -# TODO: replace nested serialization with pydantic -@dataclass -class Pulse: +class Pulse(BaseModel): """A class to represent a pulse to be sent to the QPU.""" start: int @@ -64,10 +63,16 @@ class Pulse: """Qubit or coupler addressed by the pulse.""" @classmethod - def flux(cls, start, duration, amplitude, envelope, **kwargs): - return cls( - start, duration, amplitude, 0, 0, envelope, type=PulseType.FLUX, **kwargs - ) + def flux(cls, **kwargs): + """Construct a flux pulse. + + It provides a simplified syntax for the :cls:`Pulse` constructor, by applying + suitable defaults. + """ + kwargs["frequency"] = 0 + kwargs["relative_phase"] = 0 + kwargs["type"] = PulseType.FLUX + return cls(**kwargs) @property def finish(self) -> Optional[int]: From ae516c658914443c6b6688887375b68ecd761405 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 21 Mar 2024 16:15:46 +0400 Subject: [PATCH 0152/1006] fix: Propagate Pydantic models to Pulse-like classes --- src/qibolab/pulses/pulse.py | 75 ++++++++++++++----------------------- 1 file changed, 29 insertions(+), 46 deletions(-) diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index 84a12ac71c..b961a976df 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -22,13 +22,13 @@ class PulseType(Enum): DRIVE = "qd" FLUX = "qf" COUPLERFLUX = "cf" + DELAY = "dl" + VIRTUALZ = "vz" class Pulse(BaseModel): - """A class to represent a pulse to be sent to the QPU.""" + """A pulse to be sent to the QPU.""" - start: int - """Start time of pulse in ns.""" duration: int """Pulse duration in ns.""" amplitude: float @@ -74,37 +74,6 @@ def flux(cls, **kwargs): kwargs["type"] = PulseType.FLUX return cls(**kwargs) - @property - def finish(self) -> Optional[int]: - """Time when the pulse is scheduled to finish.""" - if None in {self.start, self.duration}: - return None - return self.start + self.duration - - @property - def global_phase(self): - """Global phase of the pulse, in radians. - - This phase is calculated from the pulse start time and frequency - as `2 * pi * frequency * start`. - """ - if self.type is PulseType.READOUT: - # readout pulses should have zero global phase so that we can - # calculate probabilities in the i-q plane - return 0 - - # pulse start, duration and finish are in ns - return 2 * np.pi * self.frequency * self.start / 1e9 - - @property - def phase(self) -> float: - """Total phase of the pulse, in radians. - - The total phase is computed as the sum of the global and - relative phases. - """ - return self.global_phase + self.relative_phase - @property def id(self) -> int: return id(self) @@ -149,15 +118,29 @@ def __hash__(self): ) ) - def is_equal_ignoring_start(self, item) -> bool: - """Check if two pulses are equal ignoring start time.""" - return ( - self.duration == item.duration - and self.amplitude == item.amplitude - and self.frequency == item.frequency - and self.relative_phase == item.relative_phase - and self.envelope == item.envelope - and self.channel == item.channel - and self.type == item.type - and self.qubit == item.qubit - ) + +class Delay(BaseModel): + """A wait instruction during which we are not sending any pulses to the + QPU.""" + + duration: int + """Delay duration in ns.""" + channel: str + """Channel on which the delay should be implemented.""" + type: PulseType = PulseType.DELAY + """Type fixed to ``DELAY`` to comply with ``Pulse`` interface.""" + + +class VirtualZ(BaseModel): + """Implementation of Z-rotations using virtual phase.""" + + duration = 0 + """Duration of the virtual gate should always be zero.""" + + phase: float + """Phase that implements the rotation.""" + channel: Optional[str] = None + """Channel on which the virtual phase should be added.""" + qubit: int = 0 + """Qubit on the drive of which the virtual phase should be added.""" + type: PulseType = PulseType.VIRTUALZ From d85bc24513c268005c1d82df92e1e9ac906f9edd Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 21 Mar 2024 16:22:42 +0400 Subject: [PATCH 0153/1006] fix: Fix Pylint errors --- src/qibolab/compilers/compiler.py | 2 +- src/qibolab/platform/platform.py | 8 ++++---- src/qibolab/pulses/plot.py | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/qibolab/compilers/compiler.py b/src/qibolab/compilers/compiler.py index 191971e800..1499f31ca5 100644 --- a/src/qibolab/compilers/compiler.py +++ b/src/qibolab/compilers/compiler.py @@ -155,7 +155,7 @@ def compile(self, circuit, platform): for pulse in gate_sequence: if qubit_clock[pulse.qubit] > channel_clock[pulse.qubit]: delay = qubit_clock[pulse.qubit] - channel_clock[pulse.channel] - sequence.append(Delay(delay, pulse.channel)) + sequence.append(Delay(duration=delay, channel=pulse.channel)) channel_clock[pulse.channel] += delay sequence.append(pulse) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 744c00f41d..17d070ad26 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -463,24 +463,24 @@ def create_coupler_pulse(self, coupler, duration=None, amplitude=None): # TODO Remove RX90_drag_pulse and RX_drag_pulse, replace them with create_qubit_drive_pulse # TODO Add RY90 and RY pulses - def create_RX90_drag_pulse(self, qubit, start, beta, relative_phase=0): + def create_RX90_drag_pulse(self, qubit, beta, relative_phase=0): """Create native RX90 pulse with Drag shape.""" qubit = self.get_qubit(qubit) pulse = qubit.native_gates.RX90 return replace( pulse, relative_phase=relative_phase, - shape=Drag(pulse.shape.rel_sigma, beta), + shape=Drag(rel_sigma=pulse.envelope.rel_sigma, beta=beta), channel=qubit.drive.name, ) - def create_RX_drag_pulse(self, qubit, start, beta, relative_phase=0): + def create_RX_drag_pulse(self, qubit, beta, relative_phase=0): """Create native RX pulse with Drag shape.""" qubit = self.get_qubit(qubit) pulse = qubit.native_gates.RX return replace( pulse, relative_phase=relative_phase, - shape=Drag(pulse.shape.rel_sigma, beta), + shape=Drag(rel_sigma=pulse.envelope.rel_sigma, beta=beta), channel=qubit.drive.name, ) diff --git a/src/qibolab/pulses/plot.py b/src/qibolab/pulses/plot.py index c2e161bca9..d7f456ab28 100644 --- a/src/qibolab/pulses/plot.py +++ b/src/qibolab/pulses/plot.py @@ -154,7 +154,7 @@ def sequence(ps: PulseSequence, filename=None): start += pulse.duration continue - envelope = pulse.shape.envelope_waveforms(sampling_rate) + envelope = pulse.envelopes(SAMPLING_RATE) num_samples = envelope[0].size time = start + np.arange(num_samples) / SAMPLING_RATE modulated = modulate(np.array(envelope), pulse.frequency) From 22cc22ed1523241bcf1adf7e74af581d7fc7f4c3 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 21 Mar 2024 17:45:37 +0400 Subject: [PATCH 0154/1006] feat: Add custom NumPy (de)serializer) --- src/qibolab/serialize_.py | 42 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 src/qibolab/serialize_.py diff --git a/src/qibolab/serialize_.py b/src/qibolab/serialize_.py new file mode 100644 index 0000000000..a39757a1cc --- /dev/null +++ b/src/qibolab/serialize_.py @@ -0,0 +1,42 @@ +"""Serialization utilities.""" + +import base64 +import io +from typing import Annotated, Union + +import numpy as np +import numpy.typing as npt +from pydantic import BaseModel, ConfigDict, PlainSerializer, PlainValidator + + +def ndarray_serialize(ar: npt.NDArray) -> str: + """Serialize array to string.""" + buffer = io.BytesIO() + np.save(buffer, ar) + buffer.seek(0) + return base64.standard_b64encode(buffer.read()).decode() + + +def ndarray_deserialize(x: Union[str, npt.NDArray]) -> npt.NDArray: + """Deserialize array.""" + if isinstance(x, np.ndarray): + return x + + buffer = io.BytesIO() + buffer.write(base64.standard_b64decode(x)) + buffer.seek(0) + return np.load(buffer) + + +NdArray = Annotated[ + npt.NDArray, + PlainValidator(ndarray_deserialize), + PlainSerializer(ndarray_serialize, return_type=str), +] +"""Pydantic-compatible array representation.""" + + +class Model(BaseModel): + """Global qibolab model, holding common configurations.""" + + model_config = ConfigDict(arbitrary_types_allowed=True) From d4f3ad81308fc9370e5025babe0bec45833c80ce Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 21 Mar 2024 18:54:15 +0400 Subject: [PATCH 0155/1006] fix: Adopt qibolab global model in pydantic-aware classes --- src/qibolab/pulses/envelope.py | 9 +++++---- src/qibolab/pulses/pulse.py | 11 ++++++----- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/qibolab/pulses/envelope.py b/src/qibolab/pulses/envelope.py index a466b5932f..572cc45489 100644 --- a/src/qibolab/pulses/envelope.py +++ b/src/qibolab/pulses/envelope.py @@ -7,10 +7,11 @@ import numpy as np import numpy.typing as npt -from pydantic import BaseModel from scipy.signal import lfilter from scipy.signal.windows import gaussian +from qibolab.serialize_ import Model, NdArray + __all__ = [ "Times", "Waveform", @@ -61,7 +62,7 @@ def window(self): return np.linspace(0, self.duration, self.samples) -class BaseEnvelope(ABC, BaseModel): +class BaseEnvelope(ABC, Model): """Pulse envelopes. Generates both i (in-phase) and q (quadrature) components. @@ -211,8 +212,8 @@ class Iir(BaseEnvelope): p = [b0, b1, a0, a1] """ - a: npt.NDArray - b: npt.NDArray + a: NdArray + b: NdArray target: BaseEnvelope def _data(self, target: npt.NDArray) -> npt.NDArray: diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index b961a976df..f3dd86191d 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -5,7 +5,8 @@ from typing import Optional import numpy as np -from pydantic import BaseModel + +from qibolab.serialize_ import Model from .envelope import Envelope, IqWaveform, Times, Waveform @@ -26,7 +27,7 @@ class PulseType(Enum): VIRTUALZ = "vz" -class Pulse(BaseModel): +class Pulse(Model): """A pulse to be sent to the QPU.""" duration: int @@ -119,7 +120,7 @@ def __hash__(self): ) -class Delay(BaseModel): +class Delay(Model): """A wait instruction during which we are not sending any pulses to the QPU.""" @@ -131,10 +132,10 @@ class Delay(BaseModel): """Type fixed to ``DELAY`` to comply with ``Pulse`` interface.""" -class VirtualZ(BaseModel): +class VirtualZ(Model): """Implementation of Z-rotations using virtual phase.""" - duration = 0 + duration: int = 0 """Duration of the virtual gate should always be zero.""" phase: float From dd04f2594896f4d0e4440b4f1fbdfea3b49d6a16 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 21 Mar 2024 19:06:20 +0400 Subject: [PATCH 0156/1006] fix: Solve import-related issues in tests --- tests/pulses/test_envelope.py | 8 +------- tests/pulses/test_modulation.py | 5 +---- tests/pulses/test_plot.py | 14 +++++++------- tests/pulses/test_pulse.py | 14 ++++++-------- tests/test_instruments_qm.py | 4 +--- tests/test_instruments_rfsoc.py | 6 +----- tests/test_instruments_zhinst.py | 20 +++++++++++--------- tests/test_sweeper.py | 4 +--- 8 files changed, 29 insertions(+), 46 deletions(-) diff --git a/tests/pulses/test_envelope.py b/tests/pulses/test_envelope.py index eea806c3ea..0d2ec3ce3e 100644 --- a/tests/pulses/test_envelope.py +++ b/tests/pulses/test_envelope.py @@ -1,13 +1,7 @@ import numpy as np import pytest -from qibolab.pulses import Envelopes, Pulse, PulseType - -Rectangular = Envelopes.RECTANGULAR.value -Gaussian = Envelopes.GAUSSIAN.value -GaussianSquare = Envelopes.GAUSSIAN_SQUARE.value -Drag = Envelopes.DRAG.value -eCap = Envelopes.ECAP.value +from qibolab.pulses import Drag, Gaussian, GaussianSquare, Pulse, PulseType, Rectangular @pytest.mark.parametrize( diff --git a/tests/pulses/test_modulation.py b/tests/pulses/test_modulation.py index 079ec310b9..872adbdd6b 100644 --- a/tests/pulses/test_modulation.py +++ b/tests/pulses/test_modulation.py @@ -1,12 +1,9 @@ import numpy as np -from qibolab.pulses import Envelopes, IqWaveform +from qibolab.pulses import Gaussian, IqWaveform, Rectangular from qibolab.pulses.envelope import Times from qibolab.pulses.modulation import demodulate, modulate -Rectangular = Envelopes.RECTANGULAR.value -Gaussian = Envelopes.GAUSSIAN.value - def test_modulation(): times = Times(30, 30) diff --git a/tests/pulses/test_plot.py b/tests/pulses/test_plot.py index 7164ee8e29..28d59354bb 100644 --- a/tests/pulses/test_plot.py +++ b/tests/pulses/test_plot.py @@ -4,19 +4,19 @@ import numpy as np from qibolab.pulses import ( - IIR, - SNZ, Drag, + ECap, Gaussian, GaussianSquare, + Iir, Pulse, PulseSequence, PulseType, Rectangular, - eCap, + Snz, plot, ) -from qibolab.pulses.shape import modulate +from qibolab.pulses.modulation import modulate HERE = pathlib.Path(__file__).parent @@ -25,9 +25,9 @@ def test_plot_functions(): p0 = Pulse(40, 0.9, 0, 0, Rectangular(), 0, PulseType.FLUX, 0) p1 = Pulse(40, 0.9, 50e6, 0, Gaussian(5), 0, PulseType.DRIVE, 2) p2 = Pulse(40, 0.9, 50e6, 0, Drag(5, 2), 0, PulseType.DRIVE, 200) - p3 = Pulse.flux(40, 0.9, IIR([-0.5, 2], [1], Rectangular()), channel=0, qubit=200) - p4 = Pulse.flux(40, 0.9, SNZ(t_idling=10), channel=0, qubit=200) - p5 = Pulse(40, 0.9, 400e6, 0, eCap(alpha=2), 0, PulseType.DRIVE) + p3 = Pulse.flux(40, 0.9, Iir([-0.5, 2], [1], Rectangular()), channel=0, qubit=200) + p4 = Pulse.flux(40, 0.9, Snz(t_idling=10), channel=0, qubit=200) + p5 = Pulse(40, 0.9, 400e6, 0, ECap(alpha=2), 0, PulseType.DRIVE) p6 = Pulse(40, 0.9, 50e6, 0, GaussianSquare(5, 0.9), 0, PulseType.DRIVE, 2) ps = PulseSequence([p0, p1, p2, p3, p4, p5, p6]) envelope = p0.envelope_waveforms() diff --git a/tests/pulses/test_pulse.py b/tests/pulses/test_pulse.py index 774ba58d34..5607c01c07 100644 --- a/tests/pulses/test_pulse.py +++ b/tests/pulses/test_pulse.py @@ -6,18 +6,16 @@ import pytest from qibolab.pulses import ( - IIR, - SNZ, Custom, Drag, + ECap, Gaussian, GaussianSquare, + Iir, Pulse, - PulseShape, PulseType, Rectangular, - ShapeInitError, - eCap, + Snz, ) @@ -105,10 +103,10 @@ def test_init(): p8 = Pulse(40, 0.9, 50e6, 0, Gaussian(5), 0, PulseType.DRIVE, 2) p9 = Pulse(40, 0.9, 50e6, 0, Drag(5, 2), 0, PulseType.DRIVE, 200) p10 = Pulse.flux( - 40, 0.9, IIR([-1, 1], [-0.1, 0.1001], Rectangular()), channel=0, qubit=200 + 40, 0.9, Iir([-1, 1], [-0.1, 0.1001], Rectangular()), channel=0, qubit=200 ) - p11 = Pulse.flux(40, 0.9, SNZ(t_idling=10, b_amplitude=0.5), channel=0, qubit=200) - p13 = Pulse(40, 0.9, 400e6, 0, eCap(alpha=2), 0, PulseType.DRIVE) + p11 = Pulse.flux(40, 0.9, Snz(t_idling=10, b_amplitude=0.5), channel=0, qubit=200) + p13 = Pulse(40, 0.9, 400e6, 0, ECap(alpha=2), 0, PulseType.DRIVE) p14 = Pulse(40, 0.9, 50e6, 0, GaussianSquare(5, 0.9), 0, PulseType.READOUT, 2) # initialisation with float duration diff --git a/tests/test_instruments_qm.py b/tests/test_instruments_qm.py index b60670f868..62b3ef994b 100644 --- a/tests/test_instruments_qm.py +++ b/tests/test_instruments_qm.py @@ -9,14 +9,12 @@ from qibolab.instruments.qm.acquisition import Acquisition, declare_acquisitions from qibolab.instruments.qm.controller import controllers_config from qibolab.instruments.qm.sequence import BakedPulse, QMPulse, Sequence -from qibolab.pulses import Envelopes, Pulse, PulseSequence, PulseType +from qibolab.pulses import Pulse, PulseSequence, PulseType, Rectangular from qibolab.qubits import Qubit from qibolab.sweeper import Parameter, Sweeper from .conftest import set_platform_profile -Rectangular = Envelopes.RECTANGULAR.value - def test_qmpulse(): pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), "ch0", qubit=0) diff --git a/tests/test_instruments_rfsoc.py b/tests/test_instruments_rfsoc.py index 2ea0c19736..da943061d1 100644 --- a/tests/test_instruments_rfsoc.py +++ b/tests/test_instruments_rfsoc.py @@ -14,7 +14,7 @@ convert_units_sweeper, replace_pulse_shape, ) -from qibolab.pulses import Envelopes, Pulse, PulseSequence, PulseType +from qibolab.pulses import Drag, Gaussian, Pulse, PulseSequence, PulseType, Rectangular from qibolab.qubits import Qubit from qibolab.result import ( AveragedIntegratedResults, @@ -25,10 +25,6 @@ from .conftest import get_instrument -Rectangular = Envelopes.RECTANGULAR.value -Gaussian = Envelopes.GAUSSIAN.value -Drag = Envelopes.DRAG.value - def test_convert_default(dummy_qrc): """Test convert function raises errors when parameter have wrong types.""" diff --git a/tests/test_instruments_zhinst.py b/tests/test_instruments_zhinst.py index 094b8fcefa..9e3394fe98 100644 --- a/tests/test_instruments_zhinst.py +++ b/tests/test_instruments_zhinst.py @@ -16,14 +16,14 @@ measure_channel_name, ) from qibolab.pulses import ( - IIR, - SNZ, Drag, Gaussian, + Iir, Pulse, PulseSequence, PulseType, Rectangular, + Snz, ) from qibolab.sweeper import Parameter, Sweeper from qibolab.unrolling import batch @@ -38,13 +38,13 @@ Pulse(40, 0.05, int(3e9), 0.0, Gaussian(5), "ch0", qubit=0), Pulse(40, 0.05, int(3e9), 0.0, Gaussian(5), "ch0", qubit=0), Pulse(40, 0.05, int(3e9), 0.0, Drag(5, 0.4), "ch0", qubit=0), - Pulse(40, 0.05, int(3e9), 0.0, SNZ(10, 0.01), "ch0", qubit=0), + Pulse(40, 0.05, int(3e9), 0.0, Snz(10, 0.01), "ch0", qubit=0), Pulse( 40, 0.05, int(3e9), 0.0, - IIR([10, 1], [0.4, 1], target=Gaussian(5)), + Iir([10, 1], [0.4, 1], target=Gaussian(5)), "ch0", qubit=0, ), @@ -54,7 +54,7 @@ def test_zhpulse_pulse_conversion(pulse): shape = pulse.shape zhpulse = ZhPulse(pulse).zhpulse assert isinstance(zhpulse, laboneq_pulse.Pulse) - if isinstance(shape, (SNZ, IIR)): + if isinstance(shape, (Snz, Iir)): assert len(zhpulse.samples) == 80 else: assert zhpulse.length == 40e-9 @@ -251,8 +251,9 @@ def test_zhsequence(dummy_qrc): IQM5q = create_platform("zurich") controller = IQM5q.instruments["EL_ZURO"] - drive_channel, readout_channel = IQM5q.qubits[0].drive.name, measure_channel_name( - IQM5q.qubits[0] + drive_channel, readout_channel = ( + IQM5q.qubits[0].drive.name, + measure_channel_name(IQM5q.qubits[0]), ) qd_pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), drive_channel, qubit=0) ro_pulse = Pulse( @@ -285,8 +286,9 @@ def test_zhsequence_couplers(dummy_qrc): IQM5q = create_platform("zurich") controller = IQM5q.instruments["EL_ZURO"] - drive_channel, readout_channel = IQM5q.qubits[0].drive.name, measure_channel_name( - IQM5q.qubits[0] + drive_channel, readout_channel = ( + IQM5q.qubits[0].drive.name, + measure_channel_name(IQM5q.qubits[0]), ) couplerflux_channel = IQM5q.couplers[0].flux.name qd_pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), drive_channel, qubit=0) diff --git a/tests/test_sweeper.py b/tests/test_sweeper.py index e9eb6670c6..bf537ebe9e 100644 --- a/tests/test_sweeper.py +++ b/tests/test_sweeper.py @@ -1,12 +1,10 @@ import numpy as np import pytest -from qibolab.pulses import Envelopes, Pulse +from qibolab.pulses import Pulse, Rectangular from qibolab.qubits import Qubit from qibolab.sweeper import Parameter, QubitParameter, Sweeper -Rectangular = Envelopes.RECTANGULAR.value - @pytest.mark.parametrize("parameter", Parameter) def test_sweeper_pulses(parameter): From 07bc21aeb571544c7f38af74c37fcea088d16cfe Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 21 Mar 2024 19:15:09 +0400 Subject: [PATCH 0157/1006] fix: Solve all Pytest collection errors --- tests/pulses/test_envelope.py | 8 +++- tests/test_instruments_zhinst.py | 64 ++++++++++++++++++++++++++------ 2 files changed, 60 insertions(+), 12 deletions(-) diff --git a/tests/pulses/test_envelope.py b/tests/pulses/test_envelope.py index 0d2ec3ce3e..7785e0408f 100644 --- a/tests/pulses/test_envelope.py +++ b/tests/pulses/test_envelope.py @@ -5,7 +5,13 @@ @pytest.mark.parametrize( - "shape", [Rectangular(), Gaussian(5), GaussianSquare(5, 0.9), Drag(5, 1)] + "shape", + [ + Rectangular(), + Gaussian(rel_sigma=5), + GaussianSquare(rel_sigma=5, width=0.9), + Drag(rel_sigma=5, beta=1), + ], ) def test_sampling_rate(shape): pulse = Pulse(0, 40, 0.9, 100e6, 0, shape, 0, PulseType.DRIVE) diff --git a/tests/test_instruments_zhinst.py b/tests/test_instruments_zhinst.py index 9e3394fe98..ea89655dd8 100644 --- a/tests/test_instruments_zhinst.py +++ b/tests/test_instruments_zhinst.py @@ -34,18 +34,60 @@ @pytest.mark.parametrize( "pulse", [ - Pulse(40, 0.05, int(3e9), 0.0, Rectangular(), "ch0", qubit=0), - Pulse(40, 0.05, int(3e9), 0.0, Gaussian(5), "ch0", qubit=0), - Pulse(40, 0.05, int(3e9), 0.0, Gaussian(5), "ch0", qubit=0), - Pulse(40, 0.05, int(3e9), 0.0, Drag(5, 0.4), "ch0", qubit=0), - Pulse(40, 0.05, int(3e9), 0.0, Snz(10, 0.01), "ch0", qubit=0), Pulse( - 40, - 0.05, - int(3e9), - 0.0, - Iir([10, 1], [0.4, 1], target=Gaussian(5)), - "ch0", + duration=40, + amplitude=0.05, + frequency=int(3e9), + relative_phase=0.0, + envelope=Rectangular(), + channel="ch0", + qubit=0, + ), + Pulse( + duration=40, + amplitude=0.05, + frequency=int(3e9), + relative_phase=0.0, + envelope=Gaussian(rel_sigma=5), + channel="ch0", + qubit=0, + ), + Pulse( + duration=40, + amplitude=0.05, + frequency=int(3e9), + relative_phase=0.0, + envelope=Gaussian(rel_sigma=5), + channel="ch0", + qubit=0, + ), + Pulse( + duration=40, + amplitude=0.05, + frequency=int(3e9), + relative_phase=0.0, + envelope=Drag(rel_sigma=5, beta=0.4), + channel="ch0", + qubit=0, + ), + Pulse( + duration=40, + amplitude=0.05, + frequency=int(3e9), + relative_phase=0.0, + envelope=Snz(t_idling=10, b_amplitude=0.01), + channel="ch0", + qubit=0, + ), + Pulse( + duration=40, + amplitude=0.05, + frequency=int(3e9), + relative_phase=0.0, + envelope=Iir( + a=np.array([10, 1]), b=np.array([0.4, 1]), target=Gaussian(rel_sigma=5) + ), + channel="ch0", qubit=0, ), ], From e2583d82d757814cbb85ee1a9f1ebf11d9cb8f9d Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 22 Mar 2024 10:45:27 +0400 Subject: [PATCH 0158/1006] fix: Partial dummy runcard update --- src/qibolab/dummy/parameters.json | 1247 ++++++++++++++--------------- src/qibolab/pulses/pulse.py | 4 +- src/qibolab/serialize.py | 2 +- 3 files changed, 600 insertions(+), 653 deletions(-) diff --git a/src/qibolab/dummy/parameters.json b/src/qibolab/dummy/parameters.json index 529fcb69ed..3c675323e5 100644 --- a/src/qibolab/dummy/parameters.json +++ b/src/qibolab/dummy/parameters.json @@ -1,663 +1,610 @@ { - "nqubits": 5, - "settings": { - "nshots": 1024, - "relaxation_time": 0 + "nqubits": 5, + "settings": { + "nshots": 1024, + "relaxation_time": 0 + }, + "qubits": [0, 1, 2, 3, 4], + "couplers": [0, 1, 3, 4], + "topology": { + "0": [0, 2], + "1": [1, 2], + "3": [2, 3], + "4": [2, 4] + }, + "instruments": { + "dummy": { + "bounds": { + "waveforms": 0, + "readout": 0, + "instructions": 0 + } }, - "qubits": [ - 0, - 1, - 2, - 3, - 4 - ], - "couplers": [ - 0, - 1, - 3, - 4 - ], - "topology": { - "0": [ - 0, - 2 + "twpa_pump": { + "power": 10, + "frequency": 1000000000.0 + } + }, + "native_gates": { + "single_qubit": { + "0": { + "RX": { + "duration": 40, + "amplitude": 0.1, + "envelope": { "rel_sigma": 5 }, + "frequency": 4000000000.0, + "type": "qd" + }, + "RX12": { + "duration": 40, + "amplitude": 0.005, + "envelope": { "rel_sigma": 5 }, + "frequency": 4700000000, + "type": "qd" + }, + "MZ": { + "duration": 2000, + "amplitude": 0.1, + "envelope": { "rel_sigma": 5, "width": 0.75 }, + "frequency": 5200000000.0, + "type": "ro" + } + }, + "1": { + "RX": { + "duration": 40, + "amplitude": 0.3, + "envelope": { "rel_sigma": 5, "beta": 0.02 }, + "frequency": 4200000000.0, + "type": "qd" + }, + "RX12": { + "duration": 40, + "amplitude": 0.0484, + "envelope": { "rel_sigma": 5, "beta": 0.02 }, + "frequency": 4855663000, + "type": "qd" + }, + "MZ": { + "duration": 2000, + "amplitude": 0.1, + "envelope": { "rel_sigma": 5, "width": 0.75 }, + "frequency": 4900000000.0, + "type": "ro" + } + }, + "2": { + "RX": { + "duration": 40, + "amplitude": 0.3, + "envelope": { "rel_sigma": 5, "beta": 0.02 }, + "frequency": 4500000000.0, + "type": "qd" + }, + "RX12": { + "duration": 40, + "amplitude": 0.005, + "envelope": { "rel_sigma": 5 }, + "frequency": 2700000000, + "type": "qd" + }, + "MZ": { + "duration": 2000, + "amplitude": 0.1, + "envelope": { "rel_sigma": 5, "width": 0.75 }, + "frequency": 6100000000.0, + "type": "ro" + } + }, + "3": { + "RX": { + "duration": 40, + "amplitude": 0.3, + "envelope": { "rel_sigma": 5, "beta": 0.02 }, + "frequency": 4150000000.0, + "type": "qd" + }, + "RX12": { + "duration": 40, + "amplitude": 0.0484, + "envelope": { "rel_sigma": 5, "beta": 0.02 }, + "frequency": 5855663000, + "type": "qd" + }, + "MZ": { + "duration": 2000, + "amplitude": 0.1, + "envelope": { "rel_sigma": 5, "width": 0.75 }, + "frequency": 5800000000.0, + "type": "ro" + } + }, + "4": { + "RX": { + "duration": 40, + "amplitude": 0.3, + "envelope": { "rel_sigma": 5, "beta": 0.02 }, + "frequency": 4155663000, + "type": "qd" + }, + "RX12": { + "duration": 40, + "amplitude": 0.0484, + "envelope": { "rel_sigma": 5, "beta": 0.02 }, + "frequency": 5855663000, + "type": "qd" + }, + "MZ": { + "duration": 2000, + "amplitude": 0.1, + "envelope": { "rel_sigma": 5, "width": 0.75 }, + "frequency": 5500000000.0, + "type": "ro" + } + } + }, + "coupler": { + "0": { + "CP": { + "duration": 30, + "amplitude": 0.05, + "envelope": { "rel_sigma": 5, "width": 0.75 }, + "type": "cf" + } + }, + "1": { + "CP": { + "duration": 30, + "amplitude": 0.05, + "envelope": { "rel_sigma": 5, "width": 0.75 }, + "type": "cf" + } + }, + "3": { + "CP": { + "duration": 30, + "amplitude": 0.05, + "envelope": { "rel_sigma": 5, "width": 0.75 }, + "type": "cf" + } + }, + "4": { + "CP": { + "duration": 30, + "amplitude": 0.05, + "envelope": { "rel_sigma": 5, "width": 0.75 }, + "type": "cf" + } + } + }, + "two_qubit": { + "0-2": { + "CZ": [ + { + "duration": 30, + "amplitude": 0.05, + "envelope": { "rel_sigma": 5, "width": 0.75 }, + "qubit": 2, + "type": "qf" + }, + { + "type": "vz", + "phase": 0.0, + "qubit": 0 + }, + { + "type": "vz", + "phase": 0.0, + "qubit": 2 + }, + { + "duration": 30, + "amplitude": 0.05, + "envelope": { "rel_sigma": 5, "width": 0.75 }, + "coupler": 0, + "type": "cf" + } ], - "1": [ - 1, - 2 + "iSWAP": [ + { + "duration": 30, + "amplitude": 0.05, + "envelope": { "rel_sigma": 5, "width": 0.75 }, + "qubit": 2, + "type": "qf" + }, + { + "type": "vz", + "phase": 0.0, + "qubit": 1 + }, + { + "type": "vz", + "phase": 0.0, + "qubit": 2 + }, + { + "duration": 30, + "amplitude": 0.05, + "envelope": { "rel_sigma": 5, "width": 0.75 }, + "coupler": 0, + "type": "cf" + } + ] + }, + "1-2": { + "CZ": [ + { + "duration": 30, + "amplitude": 0.05, + "envelope": { "rel_sigma": 5, "width": 0.75 }, + "qubit": 2, + "type": "qf" + }, + { + "type": "vz", + "phase": 0.0, + "qubit": 1 + }, + { + "type": "vz", + "phase": 0.0, + "qubit": 2 + }, + { + "duration": 30, + "amplitude": 0.05, + "envelope": { "rel_sigma": 5, "width": 0.75 }, + "coupler": 1, + "type": "cf" + } ], - "3": [ - 2, - 3 + "iSWAP": [ + { + "duration": 30, + "amplitude": 0.05, + "envelope": { "rel_sigma": 5, "width": 0.75 }, + "qubit": 2, + "type": "qf" + }, + { + "type": "vz", + "phase": 0.0, + "qubit": 1 + }, + { + "type": "vz", + "phase": 0.0, + "qubit": 2 + }, + { + "duration": 30, + "amplitude": 0.05, + "envelope": { "rel_sigma": 5, "width": 0.75 }, + "coupler": 1, + "type": "cf" + } + ] + }, + "2-3": { + "CZ": [ + { + "duration": 30, + "amplitude": 0.05, + "envelope": { "rel_sigma": 5, "width": 0.75 }, + "qubit": 2, + "type": "qf" + }, + { + "type": "vz", + "phase": 0.0, + "qubit": 3 + }, + { + "type": "vz", + "phase": 0.0, + "qubit": 2 + }, + { + "duration": 30, + "amplitude": 0.05, + "envelope": { "rel_sigma": 5, "width": 0.75 }, + "coupler": 3, + "type": "cf" + } + ], + "iSWAP": [ + { + "duration": 30, + "amplitude": 0.05, + "envelope": { "rel_sigma": 5, "width": 0.75 }, + "qubit": 2, + "type": "qf" + }, + { + "type": "vz", + "phase": 0.0, + "qubit": 1 + }, + { + "type": "vz", + "phase": 0.0, + "qubit": 2 + }, + { + "duration": 30, + "amplitude": 0.05, + "envelope": { "rel_sigma": 5, "width": 0.75 }, + "coupler": 3, + "type": "cf" + } ], - "4": [ - 2, - 4 + "CNOT": [ + { + "duration": 40, + "amplitude": 0.3, + "envelope": { "rel_sigma": 5, "beta": 0.02 }, + "frequency": 4150000000.0, + "type": "qd", + "qubit": 2 + }, + { + "type": "vz", + "phase": 0.0, + "qubit": 1 + }, + { + "type": "vz", + "phase": 0.0, + "qubit": 2 + } ] - }, - "instruments": { - "dummy": { - "bounds": { - "waveforms": 0, - "readout": 0, - "instructions": 0 - } + }, + "2-4": { + "CZ": [ + { + "duration": 30, + "amplitude": 0.05, + "envelope": { "rel_sigma": 5, "width": 0.75 }, + "qubit": 2, + "type": "qf" + }, + { + "type": "vz", + "phase": 0.0, + "qubit": 4 + }, + { + "type": "vz", + "phase": 0.0, + "qubit": 2 + }, + { + "duration": 30, + "amplitude": 0.05, + "envelope": { "rel_sigma": 5, "width": 0.75 }, + "coupler": 4, + "type": "cf" + } + ], + "iSWAP": [ + { + "duration": 30, + "amplitude": 0.05, + "envelope": { "rel_sigma": 5, "width": 0.75 }, + "qubit": 2, + "type": "qf" + }, + { + "type": "vz", + "phase": 0.0, + "qubit": 1 + }, + { + "type": "vz", + "phase": 0.0, + "qubit": 2 + }, + { + "duration": 30, + "amplitude": 0.05, + "envelope": { "rel_sigma": 5, "width": 0.75 }, + "coupler": 4, + "type": "cf" + } + ] + } + } + }, + "characterization": { + "single_qubit": { + "0": { + "bare_resonator_frequency": 0, + "readout_frequency": 5200000000.0, + "drive_frequency": 4000000000.0, + "anharmonicity": 0, + "sweetspot": 0.0, + "asymmetry": 0.0, + "crosstalk_matrix": { + "0": 1 }, - "twpa_pump": { - "power": 10, - "frequency": 1000000000.0 - } - }, - "native_gates": { - "single_qubit": { - "0": { - "RX": { - "duration": 40, - "amplitude": 0.1, - "shape": "Gaussian(5)", - "frequency": 4000000000.0, - "type": "qd" - }, - "RX12": { - "duration": 40, - "amplitude": 0.005, - "shape": "Gaussian(5)", - "frequency": 4700000000, - "type": "qd" - }, - "MZ": { - "duration": 2000, - "amplitude": 0.1, - "shape": "GaussianSquare(5, 0.75)", - "frequency": 5200000000.0, - "type": "ro" - } - }, - "1": { - "RX": { - "duration": 40, - "amplitude": 0.3, - "shape": "Drag(5, 0.02)", - "frequency": 4200000000.0, - "type": "qd" - }, - "RX12": { - "duration": 40, - "amplitude": 0.0484, - "shape": "Drag(5, 0.02)", - "frequency": 4855663000, - "type": "qd" - }, - "MZ": { - "duration": 2000, - "amplitude": 0.1, - "shape": "GaussianSquare(5, 0.75)", - "frequency": 4900000000.0, - "type": "ro" - } - }, - "2": { - "RX": { - "duration": 40, - "amplitude": 0.3, - "shape": "Drag(5, 0.02)", - "frequency": 4500000000.0, - "type": "qd" - }, - "RX12": { - "duration": 40, - "amplitude": 0.005, - "shape": "Gaussian(5)", - "frequency": 2700000000, - "type": "qd" - }, - "MZ": { - "duration": 2000, - "amplitude": 0.1, - "shape": "GaussianSquare(5, 0.75)", - "frequency": 6100000000.0, - "type": "ro" - } - }, - "3": { - "RX": { - "duration": 40, - "amplitude": 0.3, - "shape": "Drag(5, 0.02)", - "frequency": 4150000000.0, - "type": "qd" - }, - "RX12": { - "duration": 40, - "amplitude": 0.0484, - "shape": "Drag(5, 0.02)", - "frequency": 5855663000, - "type": "qd" - }, - "MZ": { - "duration": 2000, - "amplitude": 0.1, - "shape": "GaussianSquare(5, 0.75)", - "frequency": 5800000000.0, - "type": "ro" - } - }, - "4": { - "RX": { - "duration": 40, - "amplitude": 0.3, - "shape": "Drag(5, 0.02)", - "frequency": 4155663000, - "type": "qd" - }, - "RX12": { - "duration": 40, - "amplitude": 0.0484, - "shape": "Drag(5, 0.02)", - "frequency": 5855663000, - "type": "qd" - }, - "MZ": { - "duration": 2000, - "amplitude": 0.1, - "shape": "GaussianSquare(5, 0.75)", - "frequency": 5500000000.0, - "type": "ro" - } - } + "Ec": 0.0, + "Ej": 0.0, + "g": 0.0, + "assignment_fidelity": [0.5, 0.1], + "gate_fidelity": [0.5, 0.1], + "peak_voltage": 0, + "pi_pulse_amplitude": 0, + "T1": 0.0, + "T2": 0.0, + "T2_spin_echo": 0, + "state0_voltage": 0, + "state1_voltage": 0, + "mean_gnd_states": [0, 1], + "mean_exc_states": [1, 0], + "threshold": 0.0, + "iq_angle": 0.0, + "mixer_drive_g": 0.0, + "mixer_drive_phi": 0.0, + "mixer_readout_g": 0.0, + "mixer_readout_phi": 0.0 + }, + "1": { + "bare_resonator_frequency": 0, + "readout_frequency": 4900000000.0, + "drive_frequency": 4200000000.0, + "anharmonicity": 0, + "sweetspot": 0.0, + "asymmetry": 0.0, + "crosstalk_matrix": { + "1": 1 }, - "coupler": { - "0": { - "CP": { - "duration": 30, - "amplitude": 0.05, - "shape": "GaussianSquare(5, 0.75)", - "type": "cf" - } - }, - "1": { - "CP": { - "duration": 30, - "amplitude": 0.05, - "shape": "GaussianSquare(5, 0.75)", - "type": "cf" - } - }, - "3": { - "CP": { - "duration": 30, - "amplitude": 0.05, - "shape": "GaussianSquare(5, 0.75)", - "type": "cf" - } - }, - "4": { - "CP": { - "duration": 30, - "amplitude": 0.05, - "shape": "GaussianSquare(5, 0.75)", - "type": "cf" - } - } + "Ec": 0.0, + "Ej": 0.0, + "g": 0.0, + "assignment_fidelity": [0.5, 0.1], + "gate_fidelity": [0.5, 0.1], + "peak_voltage": 0, + "pi_pulse_amplitude": 0, + "T1": 0.0, + "T2": 0.0, + "T2_spin_echo": 0, + "state0_voltage": 0, + "state1_voltage": 0, + "mean_gnd_states": [0.25, 0], + "mean_exc_states": [0, 0.25], + "threshold": 0.0, + "iq_angle": 0.0, + "mixer_drive_g": 0.0, + "mixer_drive_phi": 0.0, + "mixer_readout_g": 0.0, + "mixer_readout_phi": 0.0 + }, + "2": { + "bare_resonator_frequency": 0, + "readout_frequency": 6100000000.0, + "drive_frequency": 4500000000.0, + "anharmonicity": 0, + "sweetspot": 0.0, + "asymmetry": 0.0, + "crosstalk_matrix": { + "2": 1 }, - "two_qubit": { - "0-2": { - "CZ": [ - { - "duration": 30, - "amplitude": 0.05, - "shape": "GaussianSquare(5, 0.75)", - "qubit": 2, - "type": "qf" - }, - { - "type": "virtual_z", - "phase": 0.0, - "qubit": 0 - }, - { - "type": "virtual_z", - "phase": 0.0, - "qubit": 2 - }, - { - "duration": 30, - "amplitude": 0.05, - "shape": "GaussianSquare(5, 0.75)", - "coupler": 0, - "type": "cf" - } - ], - "iSWAP": [ - { - "duration": 30, - "amplitude": 0.05, - "shape": "GaussianSquare(5, 0.75)", - "qubit": 2, - "type": "qf" - }, - { - "type": "virtual_z", - "phase": 0.0, - "qubit": 1 - }, - { - "type": "virtual_z", - "phase": 0.0, - "qubit": 2 - }, - { - "duration": 30, - "amplitude": 0.05, - "shape": "GaussianSquare(5, 0.75)", - "coupler": 0, - "type": "cf" - } - ] - }, - "1-2": { - "CZ": [ - { - "duration": 30, - "amplitude": 0.05, - "shape": "GaussianSquare(5, 0.75)", - "qubit": 2, - "type": "qf" - }, - { - "type": "virtual_z", - "phase": 0.0, - "qubit": 1 - }, - { - "type": "virtual_z", - "phase": 0.0, - "qubit": 2 - }, - { - "duration": 30, - "amplitude": 0.05, - "shape": "GaussianSquare(5, 0.75)", - "coupler": 1, - "type": "cf" - } - ], - "iSWAP": [ - { - "duration": 30, - "amplitude": 0.05, - "shape": "GaussianSquare(5, 0.75)", - "qubit": 2, - "type": "qf" - }, - { - "type": "virtual_z", - "phase": 0.0, - "qubit": 1 - }, - { - "type": "virtual_z", - "phase": 0.0, - "qubit": 2 - }, - { - "duration": 30, - "amplitude": 0.05, - "shape": "GaussianSquare(5, 0.75)", - "coupler": 1, - "type": "cf" - } - ] - }, - "2-3": { - "CZ": [ - { - "duration": 30, - "amplitude": 0.05, - "shape": "GaussianSquare(5, 0.75)", - "qubit": 2, - "type": "qf" - }, - { - "type": "virtual_z", - "phase": 0.0, - "qubit": 3 - }, - { - "type": "virtual_z", - "phase": 0.0, - "qubit": 2 - }, - { - "duration": 30, - "amplitude": 0.05, - "shape": "GaussianSquare(5, 0.75)", - "coupler": 3, - "type": "cf" - } - ], - "iSWAP": [ - { - "duration": 30, - "amplitude": 0.05, - "shape": "GaussianSquare(5, 0.75)", - "qubit": 2, - "type": "qf" - }, - { - "type": "virtual_z", - "phase": 0.0, - "qubit": 1 - }, - { - "type": "virtual_z", - "phase": 0.0, - "qubit": 2 - }, - { - "duration": 30, - "amplitude": 0.05, - "shape": "GaussianSquare(5, 0.75)", - "coupler": 3, - "type": "cf" - } - ], - "CNOT": [ - { - "duration": 40, - "amplitude": 0.3, - "shape": "Drag(5, 0.02)", - "frequency": 4150000000.0, - "type": "qd", - "qubit": 2 - }, - { - "type": "virtual_z", - "phase": 0.0, - "qubit": 1 - }, - { - "type": "virtual_z", - "phase": 0.0, - "qubit": 2 - } - ] - }, - "2-4": { - "CZ": [ - { - "duration": 30, - "amplitude": 0.05, - "shape": "GaussianSquare(5, 0.75)", - "qubit": 2, - "type": "qf" - }, - { - "type": "virtual_z", - "phase": 0.0, - "qubit": 4 - }, - { - "type": "virtual_z", - "phase": 0.0, - "qubit": 2 - }, - { - "duration": 30, - "amplitude": 0.05, - "shape": "GaussianSquare(5, 0.75)", - "coupler": 4, - "type": "cf" - } - ], - "iSWAP": [ - { - "duration": 30, - "amplitude": 0.05, - "shape": "GaussianSquare(5, 0.75)", - "qubit": 2, - "type": "qf" - }, - { - "type": "virtual_z", - "phase": 0.0, - "qubit": 1 - }, - { - "type": "virtual_z", - "phase": 0.0, - "qubit": 2 - }, - { - "duration": 30, - "amplitude": 0.05, - "shape": "GaussianSquare(5, 0.75)", - "coupler": 4, - "type": "cf" - } - ] - } - } - }, - "characterization": { - "single_qubit": { - "0": { - "bare_resonator_frequency": 0, - "readout_frequency": 5200000000.0, - "drive_frequency": 4000000000.0, - "anharmonicity": 0, - "sweetspot": 0.0, - "asymmetry": 0.0, - "crosstalk_matrix": { - "0": 1 - }, - "Ec": 0.0, - "Ej": 0.0, - "g": 0.0, - "assignment_fidelity": [0.5, 0.1], - "gate_fidelity": [0.5, 0.1], - "peak_voltage": 0, - "pi_pulse_amplitude": 0, - "T1": 0.0, - "T2": 0.0, - "T2_spin_echo": 0, - "state0_voltage": 0, - "state1_voltage": 0, - "mean_gnd_states": [ - 0, - 1 - ], - "mean_exc_states": [ - 1, - 0 - ], - "threshold": 0.0, - "iq_angle": 0.0, - "mixer_drive_g": 0.0, - "mixer_drive_phi": 0.0, - "mixer_readout_g": 0.0, - "mixer_readout_phi": 0.0 - }, - "1": { - "bare_resonator_frequency": 0, - "readout_frequency": 4900000000.0, - "drive_frequency": 4200000000.0, - "anharmonicity": 0, - "sweetspot": 0.0, - "asymmetry": 0.0, - "crosstalk_matrix": { - "1": 1 - }, - "Ec": 0.0, - "Ej": 0.0, - "g": 0.0, - "assignment_fidelity": [0.5, 0.1], - "gate_fidelity": [0.5, 0.1], - "peak_voltage": 0, - "pi_pulse_amplitude": 0, - "T1": 0.0, - "T2": 0.0, - "T2_spin_echo": 0, - "state0_voltage": 0, - "state1_voltage": 0, - "mean_gnd_states": [ - 0.25, - 0 - ], - "mean_exc_states": [ - 0, - 0.25 - ], - "threshold": 0.0, - "iq_angle": 0.0, - "mixer_drive_g": 0.0, - "mixer_drive_phi": 0.0, - "mixer_readout_g": 0.0, - "mixer_readout_phi": 0.0 - }, - "2": { - "bare_resonator_frequency": 0, - "readout_frequency": 6100000000.0, - "drive_frequency": 4500000000.0, - "anharmonicity": 0, - "sweetspot": 0.0, - "asymmetry": 0.0, - "crosstalk_matrix": { - "2": 1 - }, - "Ec": 0.0, - "Ej": 0.0, - "g": 0.0, - "assignment_fidelity": [0.5, 0.1], - "gate_fidelity": [0.5, 0.1], - "peak_voltage": 0, - "pi_pulse_amplitude": 0, - "T1": 0.0, - "T2": 0.0, - "T2_spin_echo": 0, - "state0_voltage": 0, - "state1_voltage": 0, - "mean_gnd_states": [ - 0.5, - 0 - ], - "mean_exc_states": [ - 0, - 0.5 - ], - "threshold": 0.0, - "iq_angle": 0.0, - "mixer_drive_g": 0.0, - "mixer_drive_phi": 0.0, - "mixer_readout_g": 0.0, - "mixer_readout_phi": 0.0 - }, - "3": { - "bare_resonator_frequency": 0, - "readout_frequency": 5800000000.0, - "drive_frequency": 4150000000.0, - "anharmonicity": 0, - "sweetspot": 0.0, - "asymmetry": 0.0, - "crosstalk_matrix": { - "3": 1 - }, - "Ec": 0.0, - "Ej": 0.0, - "g": 0.0, - "assignment_fidelity": [0.5, 0.1], - "gate_fidelity": [0.5, 0.1], - "peak_voltage": 0, - "pi_pulse_amplitude": 0, - "T1": 0.0, - "T2": 0.0, - "T2_spin_echo": 0, - "state0_voltage": 0, - "state1_voltage": 0, - "mean_gnd_states": [ - 0.75, - 0 - ], - "mean_exc_states": [ - 0, - 0.75 - ], - "threshold": 0.0, - "iq_angle": 0.0, - "mixer_drive_g": 0.0, - "mixer_drive_phi": 0.0, - "mixer_readout_g": 0.0, - "mixer_readout_phi": 0.0 - }, - "4": { - "bare_resonator_frequency": 0, - "readout_frequency": 5500000000.0, - "drive_frequency": 4100000000.0, - "anharmonicity": 0, - "sweetspot": 0.0, - "asymmetry": 0.0, - "crosstalk_matrix": { - "4": 1 - }, - "Ec": 0.0, - "Ej": 0.0, - "g": 0.0, - "assignment_fidelity": [0.5, 0.1], - "gate_fidelity": [0.5, 0.1], - "peak_voltage": 0, - "pi_pulse_amplitude": 0, - "T1": 0.0, - "T2": 0.0, - "T2_spin_echo": 0, - "state0_voltage": 0, - "state1_voltage": 0, - "mean_gnd_states": [ - 1, - 0 - ], - "mean_exc_states": [ - 0, - 1 - ], - "threshold": 0.0, - "iq_angle": 0.0, - "mixer_drive_g": 0.0, - "mixer_drive_phi": 0.0, - "mixer_readout_g": 0.0, - "mixer_readout_phi": 0.0 - } + "Ec": 0.0, + "Ej": 0.0, + "g": 0.0, + "assignment_fidelity": [0.5, 0.1], + "gate_fidelity": [0.5, 0.1], + "peak_voltage": 0, + "pi_pulse_amplitude": 0, + "T1": 0.0, + "T2": 0.0, + "T2_spin_echo": 0, + "state0_voltage": 0, + "state1_voltage": 0, + "mean_gnd_states": [0.5, 0], + "mean_exc_states": [0, 0.5], + "threshold": 0.0, + "iq_angle": 0.0, + "mixer_drive_g": 0.0, + "mixer_drive_phi": 0.0, + "mixer_readout_g": 0.0, + "mixer_readout_phi": 0.0 + }, + "3": { + "bare_resonator_frequency": 0, + "readout_frequency": 5800000000.0, + "drive_frequency": 4150000000.0, + "anharmonicity": 0, + "sweetspot": 0.0, + "asymmetry": 0.0, + "crosstalk_matrix": { + "3": 1 }, - "two_qubit":{ - "0-2": { - "gate_fidelity": [0.5, 0.1], - "cz_fidelity": [0.5, 0.1] - }, - "1-2": { - "gate_fidelity": [0.5, 0.1], - "cz_fidelity": [0.5, 0.1] - }, - "2-3": { - "gate_fidelity": [0.5, 0.1], - "cz_fidelity": [0.5, 0.1] - }, - "2-4": { - "gate_fidelity": [0.5, 0.1], - "cz_fidelity": [0.5, 0.1] - } + "Ec": 0.0, + "Ej": 0.0, + "g": 0.0, + "assignment_fidelity": [0.5, 0.1], + "gate_fidelity": [0.5, 0.1], + "peak_voltage": 0, + "pi_pulse_amplitude": 0, + "T1": 0.0, + "T2": 0.0, + "T2_spin_echo": 0, + "state0_voltage": 0, + "state1_voltage": 0, + "mean_gnd_states": [0.75, 0], + "mean_exc_states": [0, 0.75], + "threshold": 0.0, + "iq_angle": 0.0, + "mixer_drive_g": 0.0, + "mixer_drive_phi": 0.0, + "mixer_readout_g": 0.0, + "mixer_readout_phi": 0.0 + }, + "4": { + "bare_resonator_frequency": 0, + "readout_frequency": 5500000000.0, + "drive_frequency": 4100000000.0, + "anharmonicity": 0, + "sweetspot": 0.0, + "asymmetry": 0.0, + "crosstalk_matrix": { + "4": 1 }, - "coupler": { - "0": { - "sweetspot": 0.0 - }, - "1": { - "sweetspot": 0.0 - }, - "3": { - "sweetspot": 0.0 - }, - "4": { - "sweetspot": 0.0 - } - } + "Ec": 0.0, + "Ej": 0.0, + "g": 0.0, + "assignment_fidelity": [0.5, 0.1], + "gate_fidelity": [0.5, 0.1], + "peak_voltage": 0, + "pi_pulse_amplitude": 0, + "T1": 0.0, + "T2": 0.0, + "T2_spin_echo": 0, + "state0_voltage": 0, + "state1_voltage": 0, + "mean_gnd_states": [1, 0], + "mean_exc_states": [0, 1], + "threshold": 0.0, + "iq_angle": 0.0, + "mixer_drive_g": 0.0, + "mixer_drive_phi": 0.0, + "mixer_readout_g": 0.0, + "mixer_readout_phi": 0.0 + } + }, + "two_qubit": { + "0-2": { + "gate_fidelity": [0.5, 0.1], + "cz_fidelity": [0.5, 0.1] + }, + "1-2": { + "gate_fidelity": [0.5, 0.1], + "cz_fidelity": [0.5, 0.1] + }, + "2-3": { + "gate_fidelity": [0.5, 0.1], + "cz_fidelity": [0.5, 0.1] + }, + "2-4": { + "gate_fidelity": [0.5, 0.1], + "cz_fidelity": [0.5, 0.1] + } + }, + "coupler": { + "0": { + "sweetspot": 0.0 + }, + "1": { + "sweetspot": 0.0 + }, + "3": { + "sweetspot": 0.0 + }, + "4": { + "sweetspot": 0.0 + } } + } } diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index f3dd86191d..bd84ecc6c1 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -42,14 +42,14 @@ class Pulse(Model): The value has to be in the range [10e6 to 300e6]. """ - relative_phase: float - """Relative phase of the pulse, in radians.""" envelope: Envelope """The pulse envelope shape. See :cls:`qibolab.pulses.envelope.Envelopes` for list of available shapes. """ + relative_phase: float = 0.0 + """Relative phase of the pulse, in radians.""" channel: Optional[str] = None """Channel on which the pulse should be played. diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index 251099c72e..6e0af80961 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -106,7 +106,7 @@ def _load_pulse(pulse_kwargs, qubit): if pulse_type == "dl": return Delay(**pulse_kwargs) - if pulse_type == "virtual_z": + if pulse_type == "vz": return VirtualZ(**pulse_kwargs, qubit=q) return Pulse(**pulse_kwargs, type=pulse_type, qubit=q) From a738991c489966c346c09538c5f2823e0ccee838 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 22 Mar 2024 15:42:40 +0400 Subject: [PATCH 0159/1006] build: Upgrade devenv version --- flake.lock | 434 ++++++++++++++++++++++++++++++++++++++++++++++------- flake.nix | 9 +- 2 files changed, 386 insertions(+), 57 deletions(-) diff --git a/flake.lock b/flake.lock index e34ee8243a..4f978df5de 100644 --- a/flake.lock +++ b/flake.lock @@ -1,22 +1,80 @@ { "nodes": { + "cachix": { + "inputs": { + "devenv": "devenv_2", + "flake-compat": "flake-compat_2", + "nixpkgs": [ + "devenv", + "nixpkgs" + ], + "pre-commit-hooks": "pre-commit-hooks" + }, + "locked": { + "lastModified": 1710475558, + "narHash": "sha256-egKrPCKjy/cE+NqCj4hg2fNX/NwLCf0bRDInraYXDgs=", + "owner": "cachix", + "repo": "cachix", + "rev": "661bbb7f8b55722a0406456b15267b5426a3bda6", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "cachix", + "type": "github" + } + }, "devenv": { "inputs": { - "flake-compat": "flake-compat", + "cachix": "cachix", + "flake-compat": "flake-compat_4", + "nix": "nix_2", + "nixpkgs": [ + "nixpkgs" + ], + "pre-commit-hooks": "pre-commit-hooks_2" + }, + "locked": { + "lastModified": 1711095830, + "narHash": "sha256-E67Yh1R1h8b01nVAhiYJsY6eQFqk5VIar13ntSbi56Q=", + "owner": "cachix", + "repo": "devenv", + "rev": "84ce563fcecbdee90b3c3550ab4f2fcd37b37def", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "devenv", + "type": "github" + } + }, + "devenv_2": { + "inputs": { + "flake-compat": [ + "devenv", + "cachix", + "flake-compat" + ], "nix": "nix", "nixpkgs": "nixpkgs", - "pre-commit-hooks": "pre-commit-hooks" + "poetry2nix": "poetry2nix", + "pre-commit-hooks": [ + "devenv", + "cachix", + "pre-commit-hooks" + ] }, "locked": { - "lastModified": 1710144971, - "narHash": "sha256-CjTOdoBvT/4AQncTL20SDHyJNgsXZjtGbz62yDIUYnM=", + "lastModified": 1708704632, + "narHash": "sha256-w+dOIW60FKMaHI1q5714CSibk99JfYxm0CzTinYWr+Q=", "owner": "cachix", "repo": "devenv", - "rev": "6c0bad0045f1e1802f769f7890f6a59504825f4d", + "rev": "2ee4450b0f4b95a1b90f2eb5ffea98b90e48c196", "type": "github" }, "original": { "owner": "cachix", + "ref": "python-rewrite", "repo": "devenv", "type": "github" } @@ -29,11 +87,11 @@ "rust-analyzer-src": "rust-analyzer-src" }, "locked": { - "lastModified": 1710742993, - "narHash": "sha256-W0PQCe0bW3hKF5lHawXrKynBcdSP18Qa4sb8DcUfOqI=", + "lastModified": 1711088506, + "narHash": "sha256-USdlY7Tx2oJWqFBpp10+03+h7eVhpkQ4s9t1ERjeIJE=", "owner": "nix-community", "repo": "fenix", - "rev": "6f2fec850f569d61562d3a47dc263f19e9c7d825", + "rev": "85f4139f3c092cf4afd9f9906d7ed218ef262c97", "type": "github" }, "original": { @@ -74,16 +132,80 @@ "type": "github" } }, + "flake-compat_3": { + "flake": false, + "locked": { + "lastModified": 1696426674, + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_4": { + "flake": false, + "locked": { + "lastModified": 1696426674, + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_5": { + "flake": false, + "locked": { + "lastModified": 1673956053, + "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_6": { + "flake": false, + "locked": { + "lastModified": 1696426674, + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, "flake-utils": { "inputs": { "systems": "systems" }, "locked": { - "lastModified": 1685518550, - "narHash": "sha256-o2d0KcvaXzTrPRIo0kOLV0/QXHhDQ5DTi+OxcjO8xqY=", + "lastModified": 1689068808, + "narHash": "sha256-6ixXo3wt24N/melDWjq70UuHQLxGV8jZvooRanIHXw0=", "owner": "numtide", "repo": "flake-utils", - "rev": "a1720a10a6cfe8234c0e93907ffe81be440f4cef", + "rev": "919d646de7be200f3bf08cb76ae1f09402b6f9b4", "type": "github" }, "original": { @@ -104,6 +226,42 @@ "rev": "4022d587cbbfd70fe950c1e2083a02621806a725", "type": "github" }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_3": { + "inputs": { + "systems": "systems_3" + }, + "locked": { + "lastModified": 1701680307, + "narHash": "sha256-kAuep2h5ajznlPMD9rnQyffWG8EM/C73lejGofXvdM8=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "4022d587cbbfd70fe950c1e2083a02621806a725", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_4": { + "inputs": { + "systems": "systems_4" + }, + "locked": { + "lastModified": 1701680307, + "narHash": "sha256-kAuep2h5ajznlPMD9rnQyffWG8EM/C73lejGofXvdM8=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "4022d587cbbfd70fe950c1e2083a02621806a725", + "type": "github" + }, "original": { "id": "flake-utils", "type": "indirect" @@ -113,16 +271,17 @@ "inputs": { "nixpkgs": [ "devenv", + "cachix", "pre-commit-hooks", "nixpkgs" ] }, "locked": { - "lastModified": 1660459072, - "narHash": "sha256-8DFJjXG8zqoONA1vXtgeKXy68KdJL5UaXR8NtVMUbx8=", + "lastModified": 1703887061, + "narHash": "sha256-gGPa9qWNc6eCXT/+Z5/zMkyYOuRZqeFZBDbopNZQkuY=", "owner": "hercules-ci", "repo": "gitignore.nix", - "rev": "a20de23b925fd8264fd7fad6454652e142fd7f73", + "rev": "43e1aa1308018f37118e34d3a9cb4f5e75dc11d5", "type": "github" }, "original": { @@ -131,53 +290,109 @@ "type": "github" } }, - "lowdown-src": { - "flake": false, + "gitignore_2": { + "inputs": { + "nixpkgs": [ + "devenv", + "pre-commit-hooks", + "nixpkgs" + ] + }, "locked": { - "lastModified": 1633514407, - "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", - "owner": "kristapsdz", - "repo": "lowdown", - "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", + "lastModified": 1703887061, + "narHash": "sha256-gGPa9qWNc6eCXT/+Z5/zMkyYOuRZqeFZBDbopNZQkuY=", + "owner": "hercules-ci", + "repo": "gitignore.nix", + "rev": "43e1aa1308018f37118e34d3a9cb4f5e75dc11d5", "type": "github" }, "original": { - "owner": "kristapsdz", - "repo": "lowdown", + "owner": "hercules-ci", + "repo": "gitignore.nix", "type": "github" } }, "nix": { "inputs": { - "lowdown-src": "lowdown-src", + "flake-compat": "flake-compat", "nixpkgs": [ + "devenv", + "cachix", "devenv", "nixpkgs" ], "nixpkgs-regression": "nixpkgs-regression" }, "locked": { - "lastModified": 1676545802, - "narHash": "sha256-EK4rZ+Hd5hsvXnzSzk2ikhStJnD63odF7SzsQ8CuSPU=", + "lastModified": 1708577783, + "narHash": "sha256-92xq7eXlxIT5zFNccLpjiP7sdQqQI30Gyui2p/PfKZM=", + "owner": "domenkozar", + "repo": "nix", + "rev": "ecd0af0c1f56de32cbad14daa1d82a132bf298f8", + "type": "github" + }, + "original": { + "owner": "domenkozar", + "ref": "devenv-2.21", + "repo": "nix", + "type": "github" + } + }, + "nix-github-actions": { + "inputs": { + "nixpkgs": [ + "devenv", + "cachix", + "devenv", + "poetry2nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1688870561, + "narHash": "sha256-4UYkifnPEw1nAzqqPOTL2MvWtm3sNGw1UTYTalkTcGY=", + "owner": "nix-community", + "repo": "nix-github-actions", + "rev": "165b1650b753316aa7f1787f3005a8d2da0f5301", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nix-github-actions", + "type": "github" + } + }, + "nix_2": { + "inputs": { + "flake-compat": "flake-compat_5", + "nixpkgs": [ + "devenv", + "nixpkgs" + ], + "nixpkgs-regression": "nixpkgs-regression_2" + }, + "locked": { + "lastModified": 1710500156, + "narHash": "sha256-zvCqeUO2GLOm7jnU23G4EzTZR7eylcJN+HJ5svjmubI=", "owner": "domenkozar", "repo": "nix", - "rev": "7c91803598ffbcfe4a55c44ac6d49b2cf07a527f", + "rev": "c5bbf14ecbd692eeabf4184cc8d50f79c2446549", "type": "github" }, "original": { "owner": "domenkozar", - "ref": "relaxed-flakes", + "ref": "devenv-2.21", "repo": "nix", "type": "github" } }, "nixpkgs": { "locked": { - "lastModified": 1678875422, - "narHash": "sha256-T3o6NcQPwXjxJMn2shz86Chch4ljXgZn746c2caGxd8=", + "lastModified": 1692808169, + "narHash": "sha256-x9Opq06rIiwdwGeK2Ykj69dNc2IvUH1fY55Wm7atwrE=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "126f49a01de5b7e35a43fd43f891ecf6d3a51459", + "rev": "9201b5ff357e781bf014d0330d18555695df7ba8", "type": "github" }, "original": { @@ -189,18 +404,18 @@ }, "nixpkgs-python": { "inputs": { - "flake-compat": "flake-compat_2", - "flake-utils": "flake-utils_2", + "flake-compat": "flake-compat_6", + "flake-utils": "flake-utils_4", "nixpkgs": [ "nixpkgs" ] }, "locked": { - "lastModified": 1710660211, - "narHash": "sha256-tSNj0sK//GYmYSH9ts5pT1u4oI5Uxb+XWP4FIEhndxk=", + "lastModified": 1710929962, + "narHash": "sha256-CuPuUyX1TmxJDDZFOZMr7kHTzA8zoSJaVw0+jDVo2fw=", "owner": "cachix", "repo": "nixpkgs-python", - "rev": "8b3ea06b981f2fd11d082df3474894b1d5bcbe7b", + "rev": "a9e19aafbf75b8c7e5adf2d7319939309ebe0d77", "type": "github" }, "original": { @@ -225,29 +440,61 @@ "type": "github" } }, + "nixpkgs-regression_2": { + "locked": { + "lastModified": 1643052045, + "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "github" + } + }, "nixpkgs-stable": { "locked": { - "lastModified": 1685801374, - "narHash": "sha256-otaSUoFEMM+LjBI1XL/xGB5ao6IwnZOXc47qhIgJe8U=", + "lastModified": 1704874635, + "narHash": "sha256-YWuCrtsty5vVZvu+7BchAxmcYzTMfolSPP5io8+WYCg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3dc440faeee9e889fe2d1b4d25ad0f430d449356", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-23.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-stable_2": { + "locked": { + "lastModified": 1704874635, + "narHash": "sha256-YWuCrtsty5vVZvu+7BchAxmcYzTMfolSPP5io8+WYCg=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "c37ca420157f4abc31e26f436c1145f8951ff373", + "rev": "3dc440faeee9e889fe2d1b4d25ad0f430d449356", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixos-23.05", + "ref": "nixos-23.11", "repo": "nixpkgs", "type": "github" } }, "nixpkgs_2": { "locked": { - "lastModified": 1710631334, - "narHash": "sha256-rL5LSYd85kplL5othxK5lmAtjyMOBg390sGBTb3LRMM=", + "lastModified": 1710806803, + "narHash": "sha256-qrxvLS888pNJFwJdK+hf1wpRCSQcqA6W5+Ox202NDa0=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "c75037bbf9093a2acb617804ee46320d6d1fea5a", + "rev": "b06025f1533a1e07b6db3e75151caa155d1c7eb3", "type": "github" }, "original": { @@ -257,26 +504,77 @@ "type": "github" } }, + "poetry2nix": { + "inputs": { + "flake-utils": "flake-utils", + "nix-github-actions": "nix-github-actions", + "nixpkgs": [ + "devenv", + "cachix", + "devenv", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1692876271, + "narHash": "sha256-IXfZEkI0Mal5y1jr6IRWMqK8GW2/f28xJenZIPQqkY0=", + "owner": "nix-community", + "repo": "poetry2nix", + "rev": "d5006be9c2c2417dafb2e2e5034d83fabd207ee3", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "poetry2nix", + "type": "github" + } + }, "pre-commit-hooks": { + "inputs": { + "flake-compat": "flake-compat_3", + "flake-utils": "flake-utils_2", + "gitignore": "gitignore", + "nixpkgs": [ + "devenv", + "cachix", + "nixpkgs" + ], + "nixpkgs-stable": "nixpkgs-stable" + }, + "locked": { + "lastModified": 1708018599, + "narHash": "sha256-M+Ng6+SePmA8g06CmUZWi1AjG2tFBX9WCXElBHEKnyM=", + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "rev": "5df5a70ad7575f6601d91f0efec95dd9bc619431", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "type": "github" + } + }, + "pre-commit-hooks_2": { "inputs": { "flake-compat": [ "devenv", "flake-compat" ], - "flake-utils": "flake-utils", - "gitignore": "gitignore", + "flake-utils": "flake-utils_3", + "gitignore": "gitignore_2", "nixpkgs": [ "devenv", "nixpkgs" ], - "nixpkgs-stable": "nixpkgs-stable" + "nixpkgs-stable": "nixpkgs-stable_2" }, "locked": { - "lastModified": 1704725188, - "narHash": "sha256-qq8NbkhRZF1vVYQFt1s8Mbgo8knj+83+QlL5LBnYGpI=", + "lastModified": 1708018599, + "narHash": "sha256-M+Ng6+SePmA8g06CmUZWi1AjG2tFBX9WCXElBHEKnyM=", "owner": "cachix", "repo": "pre-commit-hooks.nix", - "rev": "ea96f0c05924341c551a797aaba8126334c505d2", + "rev": "5df5a70ad7575f6601d91f0efec95dd9bc619431", "type": "github" }, "original": { @@ -291,17 +589,17 @@ "fenix": "fenix", "nixpkgs": "nixpkgs_2", "nixpkgs-python": "nixpkgs-python", - "systems": "systems_3" + "systems": "systems_5" } }, "rust-analyzer-src": { "flake": false, "locked": { - "lastModified": 1710708100, - "narHash": "sha256-Jd6pmXlwKk5uYcjyO/8BfbUVmx8g31Qfk7auI2IG66A=", + "lastModified": 1711052942, + "narHash": "sha256-lLsAhLgm/Nbin41wdfGKU7Rgd6ONBxYCUAMv53NXPjo=", "owner": "rust-lang", "repo": "rust-analyzer", - "rev": "b6d1887bc4f9543b6c6bf098179a62446f34a6c3", + "rev": "7ef7f442fc34b5eadb1c6ad6433bd6d0c51b056b", "type": "github" }, "original": { @@ -355,6 +653,36 @@ "repo": "default", "type": "github" } + }, + "systems_4": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_5": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } } }, "root": "root", diff --git a/flake.nix b/flake.nix index dbcf891e7f..9b2c037a89 100644 --- a/flake.nix +++ b/flake.nix @@ -2,7 +2,10 @@ inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; systems.url = "github:nix-systems/default"; - devenv.url = "github:cachix/devenv"; + devenv = { + url = "github:cachix/devenv"; + inputs.nixpkgs.follows = "nixpkgs"; + }; nixpkgs-python = { url = "github:cachix/nixpkgs-python"; inputs.nixpkgs.follows = "nixpkgs"; @@ -35,8 +38,6 @@ forEachSystem (system: let pkgs = nixpkgs.legacyPackages.${system}; - lib = pkgs.lib; - isDarwin = lib.strings.hasSuffix "darwin" system; in { default = devenv.lib.mkShell { inherit inputs pkgs; @@ -48,7 +49,7 @@ config, ... }: { - packages = with pkgs; [pre-commit poethepoet jupyter zlib] ++ lib.optionals isDarwin [stdenv.cc.cc.lib]; + packages = with pkgs; [pre-commit poethepoet jupyter zlib]; env = { QIBOLAB_PLATFORMS = (dirOf config.env.DEVENV_ROOT) + "/qibolab_platforms_qrc"; From 1512943be98afd339f18815041bfaaedfd32ed0f Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 22 Mar 2024 16:04:26 +0400 Subject: [PATCH 0160/1006] feat: Tag pulse envelopes for more reliable discrimination during deserialization --- src/qibolab/dummy/parameters.json | 22 ++++++++-------- src/qibolab/pulses/envelope.py | 44 +++++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 22 deletions(-) diff --git a/src/qibolab/dummy/parameters.json b/src/qibolab/dummy/parameters.json index 3c675323e5..470c16ea2e 100644 --- a/src/qibolab/dummy/parameters.json +++ b/src/qibolab/dummy/parameters.json @@ -31,14 +31,14 @@ "RX": { "duration": 40, "amplitude": 0.1, - "envelope": { "rel_sigma": 5 }, + "envelope": { "kind": "gaussian", "rel_sigma": 5 }, "frequency": 4000000000.0, "type": "qd" }, "RX12": { "duration": 40, "amplitude": 0.005, - "envelope": { "rel_sigma": 5 }, + "envelope": { "kind": "gaussian", "rel_sigma": 5 }, "frequency": 4700000000, "type": "qd" }, @@ -54,14 +54,14 @@ "RX": { "duration": 40, "amplitude": 0.3, - "envelope": { "rel_sigma": 5, "beta": 0.02 }, + "envelope": { "kind": "drag", "rel_sigma": 5, "beta": 0.02 }, "frequency": 4200000000.0, "type": "qd" }, "RX12": { "duration": 40, "amplitude": 0.0484, - "envelope": { "rel_sigma": 5, "beta": 0.02 }, + "envelope": { "kind": "drag", "rel_sigma": 5, "beta": 0.02 }, "frequency": 4855663000, "type": "qd" }, @@ -77,14 +77,14 @@ "RX": { "duration": 40, "amplitude": 0.3, - "envelope": { "rel_sigma": 5, "beta": 0.02 }, + "envelope": { "kind": "drag", "rel_sigma": 5, "beta": 0.02 }, "frequency": 4500000000.0, "type": "qd" }, "RX12": { "duration": 40, "amplitude": 0.005, - "envelope": { "rel_sigma": 5 }, + "envelope": { "kind": "gaussian", "rel_sigma": 5 }, "frequency": 2700000000, "type": "qd" }, @@ -100,14 +100,14 @@ "RX": { "duration": 40, "amplitude": 0.3, - "envelope": { "rel_sigma": 5, "beta": 0.02 }, + "envelope": { "kind": "drag", "rel_sigma": 5, "beta": 0.02 }, "frequency": 4150000000.0, "type": "qd" }, "RX12": { "duration": 40, "amplitude": 0.0484, - "envelope": { "rel_sigma": 5, "beta": 0.02 }, + "envelope": { "kind": "drag", "rel_sigma": 5, "beta": 0.02 }, "frequency": 5855663000, "type": "qd" }, @@ -123,14 +123,14 @@ "RX": { "duration": 40, "amplitude": 0.3, - "envelope": { "rel_sigma": 5, "beta": 0.02 }, + "envelope": { "kind": "drag", "rel_sigma": 5, "beta": 0.02 }, "frequency": 4155663000, "type": "qd" }, "RX12": { "duration": 40, "amplitude": 0.0484, - "envelope": { "rel_sigma": 5, "beta": 0.02 }, + "envelope": { "kind": "drag", "rel_sigma": 5, "beta": 0.02 }, "frequency": 5855663000, "type": "qd" }, @@ -343,7 +343,7 @@ { "duration": 40, "amplitude": 0.3, - "envelope": { "rel_sigma": 5, "beta": 0.02 }, + "envelope": { "kind": "drag", "rel_sigma": 5, "beta": 0.02 }, "frequency": 4150000000.0, "type": "qd", "qubit": 2 diff --git a/src/qibolab/pulses/envelope.py b/src/qibolab/pulses/envelope.py index 572cc45489..88fb5d7a7f 100644 --- a/src/qibolab/pulses/envelope.py +++ b/src/qibolab/pulses/envelope.py @@ -3,10 +3,11 @@ from abc import ABC from dataclasses import dataclass from functools import cached_property -from typing import Union +from typing import Annotated, Literal, Union import numpy as np import numpy.typing as npt +from pydantic import Field from scipy.signal import lfilter from scipy.signal.windows import gaussian @@ -84,6 +85,8 @@ def envelopes(self, times: Times) -> IqWaveform: class Rectangular(BaseEnvelope): """Rectangular envelope.""" + kind: Literal["rectangular"] + def i(self, times: Times) -> Waveform: """Generate a rectangular envelope.""" return np.ones(times.samples) @@ -97,6 +100,8 @@ class Exponential(BaseEnvelope): A\frac{\exp\left(-\frac{x}{\text{upsilon}}\right) + g \exp\left(-\frac{x}{\text{tau}}\right)}{1 + g} """ + kind: Literal["exponential"] + tau: float """The decay rate of the first exponential function.""" upsilon: float @@ -132,6 +137,8 @@ class Gaussian(BaseEnvelope): A\exp^{-\frac{1}{2}\frac{(t-\mu)^2}{\sigma^2}} """ + kind: Literal["gaussian"] + rel_sigma: float """Relative Gaussian standard deviation. @@ -151,6 +158,8 @@ class GaussianSquare(BaseEnvelope): A\exp^{-\frac{1}{2}\frac{(t-\mu)^2}{\sigma^2}}[Rise] + Flat + A\exp^{-\frac{1}{2}\frac{(t-\mu)^2}{\sigma^2}}[Decay] """ + kind: Literal["gaussian_square"] + rel_sigma: float """Relative Gaussian standard deviation. @@ -180,6 +189,8 @@ class Drag(BaseEnvelope): - add reference """ + kind: Literal["drag"] + rel_sigma: float """Relative Gaussian standard deviation. @@ -212,6 +223,8 @@ class Iir(BaseEnvelope): p = [b0, b1, a0, a1] """ + kind: Literal["iir"] + a: NdArray b: NdArray target: BaseEnvelope @@ -246,6 +259,8 @@ class Snz(BaseEnvelope): - expression """ + kind: Literal["snz"] + t_idling: float b_amplitude: float = 0.5 """Relative B amplitude (wrt A).""" @@ -278,6 +293,8 @@ class ECap(BaseEnvelope): &\times& [1 + \tanh(\alpha/2)]^{-2} """ + kind: Literal["ecap"] + alpha: float def i(self, times: Times) -> Waveform: @@ -299,6 +316,8 @@ class Custom(BaseEnvelope): - add attribute docstrings """ + kind: Literal["custom"] + i_: npt.NDArray q_: npt.NDArray @@ -311,15 +330,18 @@ def q(self, times: Times) -> Waveform: raise NotImplementedError -Envelope = Union[ - Rectangular, - Exponential, - Gaussian, - GaussianSquare, - Drag, - Iir, - Snz, - ECap, - Custom, +Envelope = Annotated[ + Union[ + Rectangular, + Exponential, + Gaussian, + GaussianSquare, + Drag, + Iir, + Snz, + ECap, + Custom, + ], + Field(discriminator="kind"), ] """Available pulse shapes.""" From edb4a239ec9de5ad55c533ffa69c0cb9ec21815f Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Sat, 23 Mar 2024 10:09:58 +0400 Subject: [PATCH 0161/1006] fix: Add defaults to discriminator, include them in dummy --- src/qibolab/dummy/parameters.json | 150 +++++++++++++++++++++++++----- src/qibolab/pulses/envelope.py | 18 ++-- 2 files changed, 134 insertions(+), 34 deletions(-) diff --git a/src/qibolab/dummy/parameters.json b/src/qibolab/dummy/parameters.json index 470c16ea2e..c1c666a66a 100644 --- a/src/qibolab/dummy/parameters.json +++ b/src/qibolab/dummy/parameters.json @@ -45,7 +45,11 @@ "MZ": { "duration": 2000, "amplitude": 0.1, - "envelope": { "rel_sigma": 5, "width": 0.75 }, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, "frequency": 5200000000.0, "type": "ro" } @@ -68,7 +72,11 @@ "MZ": { "duration": 2000, "amplitude": 0.1, - "envelope": { "rel_sigma": 5, "width": 0.75 }, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, "frequency": 4900000000.0, "type": "ro" } @@ -91,7 +99,11 @@ "MZ": { "duration": 2000, "amplitude": 0.1, - "envelope": { "rel_sigma": 5, "width": 0.75 }, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, "frequency": 6100000000.0, "type": "ro" } @@ -114,7 +126,11 @@ "MZ": { "duration": 2000, "amplitude": 0.1, - "envelope": { "rel_sigma": 5, "width": 0.75 }, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, "frequency": 5800000000.0, "type": "ro" } @@ -137,7 +153,11 @@ "MZ": { "duration": 2000, "amplitude": 0.1, - "envelope": { "rel_sigma": 5, "width": 0.75 }, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, "frequency": 5500000000.0, "type": "ro" } @@ -148,7 +168,11 @@ "CP": { "duration": 30, "amplitude": 0.05, - "envelope": { "rel_sigma": 5, "width": 0.75 }, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, "type": "cf" } }, @@ -156,7 +180,11 @@ "CP": { "duration": 30, "amplitude": 0.05, - "envelope": { "rel_sigma": 5, "width": 0.75 }, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, "type": "cf" } }, @@ -164,7 +192,11 @@ "CP": { "duration": 30, "amplitude": 0.05, - "envelope": { "rel_sigma": 5, "width": 0.75 }, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, "type": "cf" } }, @@ -172,7 +204,11 @@ "CP": { "duration": 30, "amplitude": 0.05, - "envelope": { "rel_sigma": 5, "width": 0.75 }, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, "type": "cf" } } @@ -183,7 +219,11 @@ { "duration": 30, "amplitude": 0.05, - "envelope": { "rel_sigma": 5, "width": 0.75 }, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, "qubit": 2, "type": "qf" }, @@ -200,7 +240,11 @@ { "duration": 30, "amplitude": 0.05, - "envelope": { "rel_sigma": 5, "width": 0.75 }, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, "coupler": 0, "type": "cf" } @@ -209,7 +253,11 @@ { "duration": 30, "amplitude": 0.05, - "envelope": { "rel_sigma": 5, "width": 0.75 }, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, "qubit": 2, "type": "qf" }, @@ -226,7 +274,11 @@ { "duration": 30, "amplitude": 0.05, - "envelope": { "rel_sigma": 5, "width": 0.75 }, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, "coupler": 0, "type": "cf" } @@ -237,7 +289,11 @@ { "duration": 30, "amplitude": 0.05, - "envelope": { "rel_sigma": 5, "width": 0.75 }, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, "qubit": 2, "type": "qf" }, @@ -254,7 +310,11 @@ { "duration": 30, "amplitude": 0.05, - "envelope": { "rel_sigma": 5, "width": 0.75 }, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, "coupler": 1, "type": "cf" } @@ -263,7 +323,11 @@ { "duration": 30, "amplitude": 0.05, - "envelope": { "rel_sigma": 5, "width": 0.75 }, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, "qubit": 2, "type": "qf" }, @@ -280,7 +344,11 @@ { "duration": 30, "amplitude": 0.05, - "envelope": { "rel_sigma": 5, "width": 0.75 }, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, "coupler": 1, "type": "cf" } @@ -291,7 +359,11 @@ { "duration": 30, "amplitude": 0.05, - "envelope": { "rel_sigma": 5, "width": 0.75 }, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, "qubit": 2, "type": "qf" }, @@ -308,7 +380,11 @@ { "duration": 30, "amplitude": 0.05, - "envelope": { "rel_sigma": 5, "width": 0.75 }, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, "coupler": 3, "type": "cf" } @@ -317,7 +393,11 @@ { "duration": 30, "amplitude": 0.05, - "envelope": { "rel_sigma": 5, "width": 0.75 }, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, "qubit": 2, "type": "qf" }, @@ -334,7 +414,11 @@ { "duration": 30, "amplitude": 0.05, - "envelope": { "rel_sigma": 5, "width": 0.75 }, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, "coupler": 3, "type": "cf" } @@ -365,7 +449,11 @@ { "duration": 30, "amplitude": 0.05, - "envelope": { "rel_sigma": 5, "width": 0.75 }, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, "qubit": 2, "type": "qf" }, @@ -382,7 +470,11 @@ { "duration": 30, "amplitude": 0.05, - "envelope": { "rel_sigma": 5, "width": 0.75 }, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, "coupler": 4, "type": "cf" } @@ -391,7 +483,11 @@ { "duration": 30, "amplitude": 0.05, - "envelope": { "rel_sigma": 5, "width": 0.75 }, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, "qubit": 2, "type": "qf" }, @@ -408,7 +504,11 @@ { "duration": 30, "amplitude": 0.05, - "envelope": { "rel_sigma": 5, "width": 0.75 }, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, "coupler": 4, "type": "cf" } diff --git a/src/qibolab/pulses/envelope.py b/src/qibolab/pulses/envelope.py index 88fb5d7a7f..607bae8973 100644 --- a/src/qibolab/pulses/envelope.py +++ b/src/qibolab/pulses/envelope.py @@ -85,7 +85,7 @@ def envelopes(self, times: Times) -> IqWaveform: class Rectangular(BaseEnvelope): """Rectangular envelope.""" - kind: Literal["rectangular"] + kind: Literal["rectangular"] = "rectangular" def i(self, times: Times) -> Waveform: """Generate a rectangular envelope.""" @@ -100,7 +100,7 @@ class Exponential(BaseEnvelope): A\frac{\exp\left(-\frac{x}{\text{upsilon}}\right) + g \exp\left(-\frac{x}{\text{tau}}\right)}{1 + g} """ - kind: Literal["exponential"] + kind: Literal["exponential"] = "exponential" tau: float """The decay rate of the first exponential function.""" @@ -137,7 +137,7 @@ class Gaussian(BaseEnvelope): A\exp^{-\frac{1}{2}\frac{(t-\mu)^2}{\sigma^2}} """ - kind: Literal["gaussian"] + kind: Literal["gaussian"] = "gaussian" rel_sigma: float """Relative Gaussian standard deviation. @@ -158,7 +158,7 @@ class GaussianSquare(BaseEnvelope): A\exp^{-\frac{1}{2}\frac{(t-\mu)^2}{\sigma^2}}[Rise] + Flat + A\exp^{-\frac{1}{2}\frac{(t-\mu)^2}{\sigma^2}}[Decay] """ - kind: Literal["gaussian_square"] + kind: Literal["gaussian_square"] = "gaussian_square" rel_sigma: float """Relative Gaussian standard deviation. @@ -189,7 +189,7 @@ class Drag(BaseEnvelope): - add reference """ - kind: Literal["drag"] + kind: Literal["drag"] = "drag" rel_sigma: float """Relative Gaussian standard deviation. @@ -223,7 +223,7 @@ class Iir(BaseEnvelope): p = [b0, b1, a0, a1] """ - kind: Literal["iir"] + kind: Literal["iir"] = "iir" a: NdArray b: NdArray @@ -259,7 +259,7 @@ class Snz(BaseEnvelope): - expression """ - kind: Literal["snz"] + kind: Literal["snz"] = "snz" t_idling: float b_amplitude: float = 0.5 @@ -293,7 +293,7 @@ class ECap(BaseEnvelope): &\times& [1 + \tanh(\alpha/2)]^{-2} """ - kind: Literal["ecap"] + kind: Literal["ecap"] = "ecap" alpha: float @@ -316,7 +316,7 @@ class Custom(BaseEnvelope): - add attribute docstrings """ - kind: Literal["custom"] + kind: Literal["custom"] = "custom" i_: npt.NDArray q_: npt.NDArray From ca16cffeb1706571f865f623045fb31acfa2006d Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Sat, 23 Mar 2024 10:36:17 +0400 Subject: [PATCH 0162/1006] feat!: Move duration from pulse to envelope --- src/qibolab/pulses/envelope.py | 122 +++++++++++++++------------------ src/qibolab/pulses/pulse.py | 15 ++-- 2 files changed, 60 insertions(+), 77 deletions(-) diff --git a/src/qibolab/pulses/envelope.py b/src/qibolab/pulses/envelope.py index 607bae8973..ef507b37ce 100644 --- a/src/qibolab/pulses/envelope.py +++ b/src/qibolab/pulses/envelope.py @@ -1,8 +1,6 @@ """Library of pulse shapes.""" from abc import ABC -from dataclasses import dataclass -from functools import cached_property from typing import Annotated, Literal, Union import numpy as np @@ -14,7 +12,6 @@ from qibolab.serialize_ import Model, NdArray __all__ = [ - "Times", "Waveform", "IqWaveform", "BaseEnvelope", @@ -40,46 +37,30 @@ """Full shape, both I and Q components.""" -@dataclass -class Times: - """Time window of a pulse.""" - - duration: float - """Pulse duration.""" - samples: int - """Number of requested samples.""" - # Here only the information consumed by the `Envelopes` is stored. How to go from - # the sampling rate to the number of samples is callers' business, since nothing - # else has to be known by this module. - - @property - def mean(self) -> float: - """Middle point of the temporal window.""" - return self.duration / 2 - - @cached_property - def window(self): - """Individual timing of each sample.""" - return np.linspace(0, self.duration, self.samples) - - class BaseEnvelope(ABC, Model): """Pulse envelopes. Generates both i (in-phase) and q (quadrature) components. """ - def i(self, times: Times) -> Waveform: + duration: float + """Pulse duration.""" + + def window(self, samples: int): + """Individual timing of each sample.""" + return np.linspace(0, self.duration, samples) + + def i(self, samples: int) -> Waveform: """In-phase envelope.""" - return np.zeros(times.samples) + return np.zeros(samples) - def q(self, times: Times) -> Waveform: + def q(self, samples: int) -> Waveform: """Quadrature envelope.""" - return np.zeros(times.samples) + return np.zeros(samples) - def envelopes(self, times: Times) -> IqWaveform: + def envelopes(self, samples: int) -> IqWaveform: """Stacked i and q envelope waveforms of the pulse.""" - return np.array([self.i(times), self.q(times)]) + return np.array([self.i(samples), self.q(samples)]) class Rectangular(BaseEnvelope): @@ -87,9 +68,9 @@ class Rectangular(BaseEnvelope): kind: Literal["rectangular"] = "rectangular" - def i(self, times: Times) -> Waveform: + def i(self, samples: int) -> Waveform: """Generate a rectangular envelope.""" - return np.ones(times.samples) + return np.ones(samples) class Exponential(BaseEnvelope): @@ -109,21 +90,21 @@ class Exponential(BaseEnvelope): g: float = 0.1 """Weight of the second exponential function.""" - def i(self, times: Times) -> Waveform: + def i(self, samples: int) -> Waveform: """Generate a combination of two exponential decays.""" - ts = times.window + ts = self.window(samples) return (np.exp(-ts / self.upsilon) + self.g * np.exp(-ts / self.tau)) / ( 1 + self.g ) -def _samples_sigma(rel_sigma: float, times: Times) -> float: +def _samples_sigma(rel_sigma: float, samples: int) -> float: """Convert standard deviation in samples. `rel_sigma` is assumed in units of the interval duration, and it is turned in units of samples, by counting the number of samples in the interval. """ - return rel_sigma * times.samples + return rel_sigma * samples class Gaussian(BaseEnvelope): @@ -145,9 +126,9 @@ class Gaussian(BaseEnvelope): In units of the interval duration. """ - def i(self, times: Times) -> Waveform: + def i(self, samples: int) -> Waveform: """Generate a Gaussian window.""" - return gaussian(times.samples, _samples_sigma(self.rel_sigma, times)) + return gaussian(samples, _samples_sigma(self.rel_sigma, samples)) class GaussianSquare(BaseEnvelope): @@ -168,14 +149,14 @@ class GaussianSquare(BaseEnvelope): width: float """Length of the flat portion.""" - def i(self, times: Times) -> Waveform: + def i(self, samples: int) -> Waveform: """Generate a Gaussian envelope, with a flat central window.""" - pulse = np.ones_like(times) - u, hw = times.mean, self.width / 2 - ts = times.window + pulse = np.ones(samples) + u, hw = samples / 2, self.width * samples / self.duration / 2 + ts = np.arange(samples) tails = (ts < (u - hw)) | ((u + hw) < ts) - pulse[tails] = gaussian(len(ts[tails]), _samples_sigma(self.rel_sigma, times)) + pulse[tails] = gaussian(len(ts[tails]), _samples_sigma(self.rel_sigma, samples)) return pulse @@ -199,18 +180,19 @@ class Drag(BaseEnvelope): beta: float """.. todo::""" - def i(self, times: Times) -> Waveform: + def i(self, samples: int) -> Waveform: """Generate a Gaussian envelope.""" - return gaussian(times.samples, _samples_sigma(self.rel_sigma, times)) + return gaussian(samples, _samples_sigma(self.rel_sigma, samples)) - def q(self, times: Times) -> Waveform: + def q(self, samples: int) -> Waveform: """Generate ... .. todo:: """ - sigma = self.rel_sigma * times.duration - ts = times.window - return self.beta * (-(ts - times.mean) / (sigma**2)) * self.i(times) + ts = np.arange(samples) + mu = samples / 2 + sigma = _samples_sigma(self.rel_sigma, samples) + return self.beta * (-(ts - mu) / (sigma**2)) * self.i(samples) class Iir(BaseEnvelope): @@ -239,13 +221,13 @@ def _data(self, target: npt.NDArray) -> npt.NDArray: data /= np.max(np.abs(data)) return data - def i(self, times: Times) -> Waveform: + def i(self, samples: int) -> Waveform: """.. todo::""" - return self._data(self.target.i(times)) + return self._data(self.target.i(samples)) - def q(self, times: Times) -> Waveform: + def q(self, samples: int) -> Waveform: """.. todo::""" - return self._data(self.target.q(times)) + return self._data(self.target.q(samples)) class Snz(BaseEnvelope): @@ -265,14 +247,14 @@ class Snz(BaseEnvelope): b_amplitude: float = 0.5 """Relative B amplitude (wrt A).""" - def i(self, times: Times) -> Waveform: + def i(self, samples: int) -> Waveform: """.. todo::""" # convert timings to samples - half_pulse_duration = (times.duration - self.t_idling) / 2 - aspan = np.sum(times.window < half_pulse_duration) - idle = times.samples - 2 * (aspan + 1) + half_pulse_duration = (self.duration - self.t_idling) / 2 + aspan = np.sum(self.window(samples) < half_pulse_duration) + idle = samples - 2 * (aspan + 1) - pulse = np.ones(times.samples) + pulse = np.ones(samples) # the aspan + 1 sample is B (and so the aspan + 1 + idle + 1), indexes are 0-based pulse[aspan] = pulse[aspan + 1 + idle] = self.b_amplitude # set idle time to 0 @@ -297,11 +279,11 @@ class ECap(BaseEnvelope): alpha: float - def i(self, times: Times) -> Waveform: + def i(self, samples: int) -> Waveform: """.. todo::""" - x = times.window / times.samples + x = self.window(samples) / samples return ( - (1 + np.tanh(self.alpha * times.window)) + (1 + np.tanh(self.alpha * self.window(samples))) * (1 + np.tanh(self.alpha * (1 - x))) / (1 + np.tanh(self.alpha / 2)) ** 2 ) @@ -321,13 +303,19 @@ class Custom(BaseEnvelope): i_: npt.NDArray q_: npt.NDArray - def i(self, times: Times) -> Waveform: + def i(self, samples: int) -> Waveform: """.. todo::""" - raise NotImplementedError + if len(self.i_) != samples: + raise ValueError + + return self.i_ - def q(self, times: Times) -> Waveform: + def q(self, samples: int) -> Waveform: """.. todo::""" - raise NotImplementedError + if len(self.q_) != samples: + raise ValueError + + return self.q_ Envelope = Annotated[ diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index bd84ecc6c1..7bc899c83b 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -8,7 +8,7 @@ from qibolab.serialize_ import Model -from .envelope import Envelope, IqWaveform, Times, Waveform +from .envelope import Envelope, IqWaveform, Waveform class PulseType(Enum): @@ -30,8 +30,6 @@ class PulseType(Enum): class Pulse(Model): """A pulse to be sent to the QPU.""" - duration: int - """Pulse duration in ns.""" amplitude: float """Pulse digital amplitude (unitless). @@ -79,18 +77,15 @@ def flux(cls, **kwargs): def id(self) -> int: return id(self) - def _times(self, sampling_rate: float): - return Times(self.duration, int(self.duration * sampling_rate)) - def i(self, sampling_rate: float) -> Waveform: """The envelope waveform of the i component of the pulse.""" - times = self._times(sampling_rate) - return self.amplitude * self.envelope.i(times) + samples = int(self.envelope.duration * sampling_rate) + return self.amplitude * self.envelope.i(samples) def q(self, sampling_rate: float) -> Waveform: """The envelope waveform of the q component of the pulse.""" - times = self._times(sampling_rate) - return self.amplitude * self.envelope.q(times) + samples = int(self.envelope.duration * sampling_rate) + return self.amplitude * self.envelope.q(samples) def envelopes(self, sampling_rate: float) -> IqWaveform: """A tuple with the i and q envelope waveforms of the pulse.""" From d2ded111f1511ef9ec1a12616a531d76701c8fae Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 25 Mar 2024 16:42:09 +0400 Subject: [PATCH 0163/1006] feat!: Move duration back to pulse And fix some Pylint and Pytest errors --- src/qibolab/platform/platform.py | 4 ++-- src/qibolab/pulses/envelope.py | 3 --- src/qibolab/pulses/pulse.py | 3 +++ tests/pulses/test_modulation.py | 20 +++++++++----------- 4 files changed, 14 insertions(+), 16 deletions(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 17d070ad26..f69d00ce97 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -25,7 +25,7 @@ def unroll_sequences( sequences: List[PulseSequence], relaxation_time: int -) -> Tuple[PulseSequence, Dict[str, str]]: +) -> Tuple[PulseSequence, dict[str, list[str]]]: """Unrolls a list of pulse sequences to a single pulse sequence with multiple measurements. @@ -54,7 +54,7 @@ def unroll_sequences( pulses_per_channel = sequence.pulses_per_channel for channel in channels: delay = length - pulses_per_channel[channel].duration - total_sequence.append(Delay(delay, channel)) + total_sequence.append(Delay(duration=delay, channel=channel)) return total_sequence, readout_map diff --git a/src/qibolab/pulses/envelope.py b/src/qibolab/pulses/envelope.py index ef507b37ce..c833d3d015 100644 --- a/src/qibolab/pulses/envelope.py +++ b/src/qibolab/pulses/envelope.py @@ -43,9 +43,6 @@ class BaseEnvelope(ABC, Model): Generates both i (in-phase) and q (quadrature) components. """ - duration: float - """Pulse duration.""" - def window(self, samples: int): """Individual timing of each sample.""" return np.linspace(0, self.duration, samples) diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index 7bc899c83b..9226ace51e 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -30,6 +30,9 @@ class PulseType(Enum): class Pulse(Model): """A pulse to be sent to the QPU.""" + duration: float + """Pulse duration.""" + amplitude: float """Pulse digital amplitude (unitless). diff --git a/tests/pulses/test_modulation.py b/tests/pulses/test_modulation.py index 872adbdd6b..4517875fe4 100644 --- a/tests/pulses/test_modulation.py +++ b/tests/pulses/test_modulation.py @@ -1,16 +1,14 @@ import numpy as np from qibolab.pulses import Gaussian, IqWaveform, Rectangular -from qibolab.pulses.envelope import Times from qibolab.pulses.modulation import demodulate, modulate def test_modulation(): - times = Times(30, 30) amplitude = 0.9 - renvs: IqWaveform = Rectangular().envelopes(times) * amplitude + renvs: IqWaveform = Rectangular().envelopes(30) * amplitude # fmt: off - np.testing.assert_allclose(modulate(renvs, 0.04), + np.testing.assert_allclose(modulate(renvs, 0.04, rate=1), np.array([[ 6.36396103e-01, 6.16402549e-01, 5.57678156e-01, 4.63912794e-01, 3.40998084e-01, 1.96657211e-01, 3.99596419e-02, -1.19248738e-01, -2.70964282e-01, @@ -34,10 +32,9 @@ def test_modulation(): ) # fmt: on - times = Times(20, 20) - genvs: IqWaveform = Gaussian(0.5).envelopes(times) + genvs: IqWaveform = Gaussian(rel_sigma=0.5).envelopes(30) # fmt: off - np.testing.assert_allclose(modulate(genvs, 0.3), + np.testing.assert_allclose(modulate(genvs, 0.3,rate=1), np.array([[ 4.50307953e-01, -1.52257426e-01, -4.31814602e-01, 4.63124693e-01, 1.87836646e-01, -6.39017403e-01, 2.05526028e-01, 5.54460924e-01, -5.65661777e-01, @@ -59,16 +56,17 @@ def test_modulation(): def test_demodulation(): signal = np.ones((2, 100)) freq = 0.15 - mod = modulate(signal, freq) + rate = 1 + mod = modulate(signal, freq, rate) - demod = demodulate(mod, freq) + demod = demodulate(mod, freq, rate) np.testing.assert_allclose(demod, signal) mod1 = modulate(demod, freq * 3.0, rate=3.0) np.testing.assert_allclose(mod1, mod) - mod2 = modulate(signal, freq, phase=2 * np.pi) + mod2 = modulate(signal, freq, rate, phase=2 * np.pi) np.testing.assert_allclose(mod2, mod) - demod1 = demodulate(mod + np.ones_like(mod), freq) + demod1 = demodulate(mod + np.ones_like(mod), freq, rate) np.testing.assert_allclose(demod1, demod) From 9c2c3030644a794da9d70f09e158fad0bf228062 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 27 Mar 2024 14:20:49 +0400 Subject: [PATCH 0164/1006] feat: Add model equality account for numpy arrays --- src/qibolab/serialize_.py | 19 +++++++++++++++++++ tests/test_serialize.py | 21 +++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 tests/test_serialize.py diff --git a/src/qibolab/serialize_.py b/src/qibolab/serialize_.py index a39757a1cc..d9928254ec 100644 --- a/src/qibolab/serialize_.py +++ b/src/qibolab/serialize_.py @@ -36,6 +36,25 @@ def ndarray_deserialize(x: Union[str, npt.NDArray]) -> npt.NDArray: """Pydantic-compatible array representation.""" +def eq(obj1: BaseModel, obj2: BaseModel) -> bool: + """Compare two models with non-default equality. + + Currently, defines custom equality for NumPy arrays. + """ + obj2d = obj2.model_dump() + comparisons = [] + for field, value1 in obj1.model_dump().items(): + value2 = obj2d[field] + if isinstance(value1, np.ndarray): + comparisons.append( + (value1.shape == value2.shape) and (value1 == value2).all() + ) + + comparisons.append(value1 == value2) + + return all(comparisons) + + class Model(BaseModel): """Global qibolab model, holding common configurations.""" diff --git a/tests/test_serialize.py b/tests/test_serialize.py new file mode 100644 index 0000000000..6fcccc3ef1 --- /dev/null +++ b/tests/test_serialize.py @@ -0,0 +1,21 @@ +import numpy as np +from pydantic import BaseModel, ConfigDict + +from qibolab.serialize_ import NdArray, eq + + +class ArrayModel(BaseModel): + ar: NdArray + + model_config = ConfigDict(arbitrary_types_allowed=True) + + +def test_equality(): + assert eq(ArrayModel(ar=np.arange(10)), ArrayModel(ar=np.arange(10))) + assert not eq(ArrayModel(ar=np.arange(10)), ArrayModel(ar=np.arange(11))) + ar = np.arange(10) + ar[5:] = 42 + assert not eq(ArrayModel(ar=np.arange(10)), ArrayModel(ar=ar)) + + assert not eq(ArrayModel(ar=np.arange(10)), ArrayModel(ar=np.ones((10, 2)))) + assert eq(ArrayModel(ar=np.ones((10, 2))), ArrayModel(ar=np.ones((10, 2)))) From 58a404293839bfea80d37d29c028c57c213b23cd Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 27 Mar 2024 14:21:58 +0400 Subject: [PATCH 0165/1006] test: Explicit keyword arguments for envelope tests --- tests/pulses/test_envelope.py | 211 +++++++++++++------------------- tests/pulses/test_modulation.py | 2 +- 2 files changed, 84 insertions(+), 129 deletions(-) diff --git a/tests/pulses/test_envelope.py b/tests/pulses/test_envelope.py index 7785e0408f..bdfaefc1d8 100644 --- a/tests/pulses/test_envelope.py +++ b/tests/pulses/test_envelope.py @@ -1,7 +1,17 @@ import numpy as np import pytest -from qibolab.pulses import Drag, Gaussian, GaussianSquare, Pulse, PulseType, Rectangular +from qibolab.pulses import ( + Drag, + ECap, + Gaussian, + GaussianSquare, + Iir, + Pulse, + PulseType, + Rectangular, + Snz, +) @pytest.mark.parametrize( @@ -14,74 +24,29 @@ ], ) def test_sampling_rate(shape): - pulse = Pulse(0, 40, 0.9, 100e6, 0, shape, 0, PulseType.DRIVE) - assert len(pulse.envelope_waveform_i(sampling_rate=1)) == 40 - assert len(pulse.envelope_waveform_i(sampling_rate=100)) == 4000 - - -def test_eval(): - shape = PulseShape.eval("Rectangular()") - assert isinstance(shape, Rectangular) - with pytest.raises(ValueError): - shape = PulseShape.eval("Ciao()") - - -@pytest.mark.parametrize("rel_sigma,beta", [(5, 1), (5, -1), (3, -0.03), (4, 0.02)]) -def test_drag_shape_eval(rel_sigma, beta): - shape = PulseShape.eval(f"Drag({rel_sigma}, {beta})") - assert isinstance(shape, Drag) - assert shape.rel_sigma == rel_sigma - assert shape.beta == beta - - -def test_raise_shapeiniterror(): - shape = Rectangular() - with pytest.raises(ShapeInitError): - shape.envelope_waveform_i() - with pytest.raises(ShapeInitError): - shape.envelope_waveform_q() - - shape = Gaussian(0) - with pytest.raises(ShapeInitError): - shape.envelope_waveform_i() - with pytest.raises(ShapeInitError): - shape.envelope_waveform_q() - - shape = GaussianSquare(0, 1) - with pytest.raises(ShapeInitError): - shape.envelope_waveform_i() - with pytest.raises(ShapeInitError): - shape.envelope_waveform_q() - - shape = Drag(0, 0) - with pytest.raises(ShapeInitError): - shape.envelope_waveform_i() - with pytest.raises(ShapeInitError): - shape.envelope_waveform_q() - - shape = IIR([0], [0], None) - with pytest.raises(ShapeInitError): - shape.envelope_waveform_i() - with pytest.raises(ShapeInitError): - shape.envelope_waveform_q() - - shape = SNZ(0) - with pytest.raises(ShapeInitError): - shape.envelope_waveform_i() - with pytest.raises(ShapeInitError): - shape.envelope_waveform_q() - - shape = eCap(0) - with pytest.raises(ShapeInitError): - shape.envelope_waveform_i() - with pytest.raises(ShapeInitError): - shape.envelope_waveform_q() + pulse = Pulse( + duration=40, + amplitude=0.9, + frequency=int(100e6), + envelope=shape, + relative_phase=0, + type=PulseType.DRIVE, + ) + assert len(pulse.i(sampling_rate=1)) == 40 + assert len(pulse.i(sampling_rate=100)) == 4000 def test_drag_shape(): - pulse = Pulse(0, 2, 1, 4e9, 0, Drag(2, 1), 0, PulseType.DRIVE) + pulse = Pulse( + duration=2, + amplitude=1, + frequency=int(4e9), + envelope=Drag(rel_sigma=2, beta=1), + relative_phase=0, + type=PulseType.DRIVE, + ) # envelope i & envelope q should cross nearly at 0 and at 2 - waveform = pulse.envelope_waveform_i(sampling_rate=10) + waveform = pulse.i(sampling_rate=10) target_waveform = np.array( [ 0.63683161, @@ -111,21 +76,17 @@ def test_drag_shape(): def test_rectangular(): pulse = Pulse( - start=0, duration=50, amplitude=1, frequency=200_000_000, relative_phase=0, - shape=Rectangular(), - channel=1, + envelope=Rectangular(), + channel="1", qubit=0, ) - _if = 0 assert pulse.duration == 50 - assert isinstance(pulse.shape, Rectangular) - assert pulse.shape.name == "Rectangular" - assert repr(pulse.shape) == "Rectangular()" + assert isinstance(pulse.envelope, Rectangular) sampling_rate = 1 num_samples = int(pulse.duration / sampling_rate) @@ -134,28 +95,24 @@ def test_rectangular(): pulse.amplitude * np.zeros(num_samples), ) - np.testing.assert_allclose(pulse.shape.envelope_waveform_i(sampling_rate), i) - np.testing.assert_allclose(pulse.shape.envelope_waveform_q(sampling_rate), q) + np.testing.assert_allclose(pulse.envelope.i(sampling_rate), i) + np.testing.assert_allclose(pulse.envelope.q(sampling_rate), q) def test_gaussian(): pulse = Pulse( - start=0, duration=50, amplitude=1, frequency=200_000_000, relative_phase=0, - shape=Gaussian(5), - channel=1, + envelope=Gaussian(rel_sigma=5), + channel="1", qubit=0, ) - _if = 0 assert pulse.duration == 50 - assert isinstance(pulse.shape, Gaussian) - assert pulse.shape.name == "Gaussian" - assert pulse.shape.rel_sigma == 5 - assert repr(pulse.shape) == "Gaussian(5)" + assert isinstance(pulse.envelope, Gaussian) + assert pulse.envelope.rel_sigma == 5 sampling_rate = 1 num_samples = int(pulse.duration / sampling_rate) @@ -164,54 +121,52 @@ def test_gaussian(): -(1 / 2) * ( ((x - (num_samples - 1) / 2) ** 2) - / (((num_samples) / pulse.shape.rel_sigma) ** 2) + / (((num_samples) / pulse.envelope.rel_sigma) ** 2) ) ) q = pulse.amplitude * np.zeros(num_samples) - np.testing.assert_allclose(pulse.shape.envelope_waveform_i(sampling_rate), i) - np.testing.assert_allclose(pulse.shape.envelope_waveform_q(sampling_rate), q) + np.testing.assert_allclose(pulse.i(sampling_rate), i) + np.testing.assert_allclose(pulse.q(sampling_rate), q) def test_drag(): pulse = Pulse( - start=0, duration=50, amplitude=1, frequency=200_000_000, relative_phase=0, - shape=Drag(5, 0.2), - channel=1, + envelope=Drag(rel_sigma=5, beta=0.2), qubit=0, ) - _if = 0 assert pulse.duration == 50 - assert isinstance(pulse.shape, Drag) - assert pulse.shape.name == "Drag" - assert pulse.shape.rel_sigma == 5 - assert pulse.shape.beta == 0.2 - assert repr(pulse.shape) == "Drag(5, 0.2)" + assert isinstance(pulse.envelope, Drag) + assert pulse.envelope.rel_sigma == 5 + assert pulse.envelope.beta == 0.2 sampling_rate = 1 num_samples = int(pulse.duration / 1 * sampling_rate) - x = np.arange(0, num_samples, 1) + x = np.arange(num_samples) i = pulse.amplitude * np.exp( -(1 / 2) * ( ((x - (num_samples - 1) / 2) ** 2) - / (((num_samples) / pulse.shape.rel_sigma) ** 2) + / (((num_samples) / pulse.envelope.rel_sigma) ** 2) ) ) q = ( - pulse.shape.beta - * (-(x - (num_samples - 1) / 2) / ((num_samples / pulse.shape.rel_sigma) ** 2)) + pulse.envelope.beta + * ( + -(x - (num_samples - 1) / 2) + / ((num_samples / pulse.envelope.rel_sigma) ** 2) + ) * i * sampling_rate ) - np.testing.assert_allclose(pulse.shape.envelope_waveform_i(sampling_rate), i) - np.testing.assert_allclose(pulse.shape.envelope_waveform_q(sampling_rate), q) + np.testing.assert_allclose(pulse.i(sampling_rate), i) + np.testing.assert_allclose(pulse.q(sampling_rate), q) def test_eq(): @@ -219,60 +174,60 @@ def test_eq(): shape1 = Rectangular() shape2 = Rectangular() - shape3 = Gaussian(5) + shape3 = Gaussian(rel_sigma=5) assert shape1 == shape2 assert not shape1 == shape3 - shape1 = Gaussian(4) - shape2 = Gaussian(4) - shape3 = Gaussian(5) + shape1 = Gaussian(rel_sigma=4) + shape2 = Gaussian(rel_sigma=4) + shape3 = Gaussian(rel_sigma=5) assert shape1 == shape2 assert not shape1 == shape3 - shape1 = GaussianSquare(4, 0.01) - shape2 = GaussianSquare(4, 0.01) - shape3 = GaussianSquare(5, 0.01) - shape4 = GaussianSquare(4, 0.05) - shape5 = GaussianSquare(5, 0.05) + shape1 = GaussianSquare(rel_sigma=4, width=0.01) + shape2 = GaussianSquare(rel_sigma=4, width=0.01) + shape3 = GaussianSquare(rel_sigma=5, width=0.01) + shape4 = GaussianSquare(rel_sigma=4, width=0.05) + shape5 = GaussianSquare(rel_sigma=5, width=0.05) assert shape1 == shape2 assert not shape1 == shape3 assert not shape1 == shape4 assert not shape1 == shape5 - shape1 = Drag(4, 0.01) - shape2 = Drag(4, 0.01) - shape3 = Drag(5, 0.01) - shape4 = Drag(4, 0.05) - shape5 = Drag(5, 0.05) + shape1 = Drag(rel_sigma=4, beta=0.01) + shape2 = Drag(rel_sigma=4, beta=0.01) + shape3 = Drag(rel_sigma=5, beta=0.01) + shape4 = Drag(rel_sigma=4, beta=0.05) + shape5 = Drag(rel_sigma=5, beta=0.05) assert shape1 == shape2 assert not shape1 == shape3 assert not shape1 == shape4 assert not shape1 == shape5 - shape1 = IIR([-0.5, 2], [1], Rectangular()) - shape2 = IIR([-0.5, 2], [1], Rectangular()) - shape3 = IIR([-0.5, 4], [1], Rectangular()) - shape4 = IIR([-0.4, 2], [1], Rectangular()) - shape5 = IIR([-0.5, 2], [2], Rectangular()) - shape6 = IIR([-0.5, 2], [2], Gaussian(5)) + shape1 = Iir(a=np.array([-0.5, 2]), b=np.array([1]), target=Rectangular()) + shape2 = Iir(a=np.array([-0.5, 2]), b=np.array([1]), target=Rectangular()) + shape3 = Iir(a=np.array([-0.5, 4]), b=np.array([1]), target=Rectangular()) + shape4 = Iir(a=np.array([-0.4, 2]), b=np.array([1]), target=Rectangular()) + shape5 = Iir(a=np.array([-0.5, 2]), b=np.array([2]), target=Rectangular()) + shape6 = Iir(a=np.array([-0.5, 2]), b=np.array([2]), target=Gaussian(rel_sigma=5)) assert shape1 == shape2 assert not shape1 == shape3 assert not shape1 == shape4 assert not shape1 == shape5 assert not shape1 == shape6 - shape1 = SNZ(5) - shape2 = SNZ(5) - shape3 = SNZ(2) - shape4 = SNZ(2, 0.1) - shape5 = SNZ(2, 0.1) + shape1 = Snz(t_idling=5) + shape2 = Snz(t_idling=5) + shape3 = Snz(t_idling=2) + shape4 = Snz(t_idling=2, b_amplitude=0.1) + shape5 = Snz(t_idling=2, b_amplitude=0.1) assert shape1 == shape2 assert not shape1 == shape3 assert not shape1 == shape4 assert not shape1 == shape5 - shape1 = eCap(4) - shape2 = eCap(4) - shape3 = eCap(5) + shape1 = ECap(alpha=4) + shape2 = ECap(alpha=4) + shape3 = ECap(alpha=5) assert shape1 == shape2 assert not shape1 == shape3 diff --git a/tests/pulses/test_modulation.py b/tests/pulses/test_modulation.py index 4517875fe4..fe72e6fcf9 100644 --- a/tests/pulses/test_modulation.py +++ b/tests/pulses/test_modulation.py @@ -32,7 +32,7 @@ def test_modulation(): ) # fmt: on - genvs: IqWaveform = Gaussian(rel_sigma=0.5).envelopes(30) + genvs: IqWaveform = Gaussian(rel_sigma=0.5).envelopes(20) # fmt: off np.testing.assert_allclose(modulate(genvs, 0.3,rate=1), np.array([[ 4.50307953e-01, -1.52257426e-01, -4.31814602e-01, From f3c276b71cba2d1ebae06d6c83dbdc8d208491d9 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 27 Mar 2024 14:23:23 +0400 Subject: [PATCH 0166/1006] fix: Install custom equality for array dependent envelopes --- src/qibolab/pulses/envelope.py | 21 +++++++++++++++------ src/qibolab/pulses/pulse.py | 2 +- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/qibolab/pulses/envelope.py b/src/qibolab/pulses/envelope.py index c833d3d015..e31a914ec7 100644 --- a/src/qibolab/pulses/envelope.py +++ b/src/qibolab/pulses/envelope.py @@ -9,7 +9,7 @@ from scipy.signal import lfilter from scipy.signal.windows import gaussian -from qibolab.serialize_ import Model, NdArray +from qibolab.serialize_ import Model, NdArray, eq __all__ = [ "Waveform", @@ -75,7 +75,7 @@ class Exponential(BaseEnvelope): .. math:: - A\frac{\exp\left(-\frac{x}{\text{upsilon}}\right) + g \exp\left(-\frac{x}{\text{tau}}\right)}{1 + g} + \frac{\exp\left(-\frac{x}{\text{upsilon}}\right) + g \exp\left(-\frac{x}{\text{tau}}\right)}{1 + g} """ kind: Literal["exponential"] = "exponential" @@ -89,8 +89,8 @@ class Exponential(BaseEnvelope): def i(self, samples: int) -> Waveform: """Generate a combination of two exponential decays.""" - ts = self.window(samples) - return (np.exp(-ts / self.upsilon) + self.g * np.exp(-ts / self.tau)) / ( + x = np.arange(samples) + return (np.exp(-x / self.upsilon) + self.g * np.exp(-x / self.tau)) / ( 1 + self.g ) @@ -226,6 +226,10 @@ def q(self, samples: int) -> Waveform: """.. todo::""" return self._data(self.target.q(samples)) + def __eq__(self, other) -> bool: + """.. todo::""" + return eq(self, other) + class Snz(BaseEnvelope): """Sudden variant Net Zero. @@ -278,9 +282,10 @@ class ECap(BaseEnvelope): def i(self, samples: int) -> Waveform: """.. todo::""" - x = self.window(samples) / samples + ss = np.arange(samples) + x = ss / samples return ( - (1 + np.tanh(self.alpha * self.window(samples))) + (1 + np.tanh(self.alpha * ss)) * (1 + np.tanh(self.alpha * (1 - x))) / (1 + np.tanh(self.alpha / 2)) ** 2 ) @@ -314,6 +319,10 @@ def q(self, samples: int) -> Waveform: return self.q_ + def __eq__(self, other) -> bool: + """.. todo::""" + return eq(self, other) + Envelope = Annotated[ Union[ diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index 9226ace51e..0b0c6473a5 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -38,7 +38,7 @@ class Pulse(Model): Pulse amplitudes are normalised between -1 and 1. """ - frequency: int + frequency: float """Pulse Intermediate Frequency in Hz. The value has to be in the range [10e6 to 300e6]. From 32890a7c1ccbe6ccb1859ce1019616d69b19fe0b Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 27 Mar 2024 18:09:47 +0400 Subject: [PATCH 0167/1006] test: Fix drag tests --- src/qibolab/pulses/envelope.py | 2 +- tests/pulses/test_envelope.py | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/qibolab/pulses/envelope.py b/src/qibolab/pulses/envelope.py index e31a914ec7..fe6a09c0e6 100644 --- a/src/qibolab/pulses/envelope.py +++ b/src/qibolab/pulses/envelope.py @@ -187,7 +187,7 @@ def q(self, samples: int) -> Waveform: .. todo:: """ ts = np.arange(samples) - mu = samples / 2 + mu = (samples - 1) / 2 sigma = _samples_sigma(self.rel_sigma, samples) return self.beta * (-(ts - mu) / (sigma**2)) * self.i(samples) diff --git a/tests/pulses/test_envelope.py b/tests/pulses/test_envelope.py index bdfaefc1d8..ae9ba40d55 100644 --- a/tests/pulses/test_envelope.py +++ b/tests/pulses/test_envelope.py @@ -41,7 +41,7 @@ def test_drag_shape(): duration=2, amplitude=1, frequency=int(4e9), - envelope=Drag(rel_sigma=2, beta=1), + envelope=Drag(rel_sigma=0.5, beta=1), relative_phase=0, type=PulseType.DRIVE, ) @@ -136,30 +136,30 @@ def test_drag(): amplitude=1, frequency=200_000_000, relative_phase=0, - envelope=Drag(rel_sigma=5, beta=0.2), + envelope=Drag(rel_sigma=0.2, beta=0.2), qubit=0, ) assert pulse.duration == 50 assert isinstance(pulse.envelope, Drag) - assert pulse.envelope.rel_sigma == 5 + assert pulse.envelope.rel_sigma == 0.2 assert pulse.envelope.beta == 0.2 sampling_rate = 1 - num_samples = int(pulse.duration / 1 * sampling_rate) + num_samples = int(pulse.duration / sampling_rate) x = np.arange(num_samples) i = pulse.amplitude * np.exp( -(1 / 2) * ( ((x - (num_samples - 1) / 2) ** 2) - / (((num_samples) / pulse.envelope.rel_sigma) ** 2) + / ((num_samples * pulse.envelope.rel_sigma) ** 2) ) ) - q = ( + q = pulse.amplitude * ( pulse.envelope.beta * ( -(x - (num_samples - 1) / 2) - / ((num_samples / pulse.envelope.rel_sigma) ** 2) + / ((num_samples * pulse.envelope.rel_sigma) ** 2) ) * i * sampling_rate From 466810531776203712bada33990061b59713c325 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 27 Mar 2024 18:12:55 +0400 Subject: [PATCH 0168/1006] test: Fix all envelope tests --- tests/pulses/test_envelope.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/tests/pulses/test_envelope.py b/tests/pulses/test_envelope.py index ae9ba40d55..ed991d18b6 100644 --- a/tests/pulses/test_envelope.py +++ b/tests/pulses/test_envelope.py @@ -95,8 +95,8 @@ def test_rectangular(): pulse.amplitude * np.zeros(num_samples), ) - np.testing.assert_allclose(pulse.envelope.i(sampling_rate), i) - np.testing.assert_allclose(pulse.envelope.q(sampling_rate), q) + np.testing.assert_allclose(pulse.i(sampling_rate), i) + np.testing.assert_allclose(pulse.q(sampling_rate), q) def test_gaussian(): @@ -118,10 +118,9 @@ def test_gaussian(): num_samples = int(pulse.duration / sampling_rate) x = np.arange(0, num_samples, 1) i = pulse.amplitude * np.exp( - -(1 / 2) - * ( + -( ((x - (num_samples - 1) / 2) ** 2) - / (((num_samples) / pulse.envelope.rel_sigma) ** 2) + / (2 * (num_samples * pulse.envelope.rel_sigma) ** 2) ) ) q = pulse.amplitude * np.zeros(num_samples) @@ -149,10 +148,9 @@ def test_drag(): num_samples = int(pulse.duration / sampling_rate) x = np.arange(num_samples) i = pulse.amplitude * np.exp( - -(1 / 2) - * ( + -( ((x - (num_samples - 1) / 2) ** 2) - / ((num_samples * pulse.envelope.rel_sigma) ** 2) + / (2 * (num_samples * pulse.envelope.rel_sigma) ** 2) ) ) q = pulse.amplitude * ( From 10b4ff148b01ac86ee0e6fb8ae793e6859058d9c Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 27 Mar 2024 18:38:15 +0400 Subject: [PATCH 0169/1006] test: Fix plot tests --- src/qibolab/pulses/envelope.py | 4 +-- src/qibolab/pulses/plot.py | 10 +++--- src/qibolab/pulses/sequence.py | 4 +-- tests/pulses/test_plot.py | 66 +++++++++++++++++++++++++++++----- 4 files changed, 67 insertions(+), 17 deletions(-) diff --git a/src/qibolab/pulses/envelope.py b/src/qibolab/pulses/envelope.py index fe6a09c0e6..f9dcdcc447 100644 --- a/src/qibolab/pulses/envelope.py +++ b/src/qibolab/pulses/envelope.py @@ -251,8 +251,8 @@ class Snz(BaseEnvelope): def i(self, samples: int) -> Waveform: """.. todo::""" # convert timings to samples - half_pulse_duration = (self.duration - self.t_idling) / 2 - aspan = np.sum(self.window(samples) < half_pulse_duration) + half_pulse_duration = (1 - self.t_idling) * samples / 2 + aspan = np.sum(np.arange(samples) < half_pulse_duration) idle = samples - 2 * (aspan + 1) pulse = np.ones(samples) diff --git a/src/qibolab/pulses/plot.py b/src/qibolab/pulses/plot.py index d7f456ab28..87319febfd 100644 --- a/src/qibolab/pulses/plot.py +++ b/src/qibolab/pulses/plot.py @@ -69,7 +69,7 @@ def pulse(pulse_: Pulse, filename=None): ) envelope = pulse_.envelopes(SAMPLING_RATE) - modulated = modulate(np.array(envelope), pulse_.frequency) + modulated = modulate(np.array(envelope), pulse_.frequency, rate=SAMPLING_RATE) ax1.plot(time, modulated[0], label="modulated i", c="C0") ax1.plot(time, modulated[1], label="modulated q", c="C1") ax1.plot(time, -waveform_i, c="silver", linestyle="dashed") @@ -157,11 +157,13 @@ def sequence(ps: PulseSequence, filename=None): envelope = pulse.envelopes(SAMPLING_RATE) num_samples = envelope[0].size time = start + np.arange(num_samples) / SAMPLING_RATE - modulated = modulate(np.array(envelope), pulse.frequency) + modulated = modulate( + np.array(envelope), pulse.frequency, rate=SAMPLING_RATE + ) ax.plot(time, modulated[1], c="lightgrey") ax.plot(time, modulated[0], c=f"C{str(n)}") - ax.plot(time, pulse.shape.i(), c=f"C{str(n)}") - ax.plot(time, -pulse.shape.i(), c=f"C{str(n)}") + ax.plot(time, pulse.i(SAMPLING_RATE), c=f"C{str(n)}") + ax.plot(time, -pulse.i(SAMPLING_RATE), c=f"C{str(n)}") # TODO: if they overlap use different shades ax.axhline(0, c="dimgrey") ax.set_ylabel(f"qubit {qubit} \n channel {channel}") diff --git a/src/qibolab/pulses/sequence.py b/src/qibolab/pulses/sequence.py index fc488a3721..3ecce9cd10 100644 --- a/src/qibolab/pulses/sequence.py +++ b/src/qibolab/pulses/sequence.py @@ -118,9 +118,9 @@ def channels(self) -> list: """List containing the channels used by the pulses in the sequence.""" channels = [] for pulse in self: - if not pulse.channel in channels: + if pulse.channel not in channels: channels.append(pulse.channel) - channels.sort() + return channels @property diff --git a/tests/pulses/test_plot.py b/tests/pulses/test_plot.py index 28d59354bb..c895404fdf 100644 --- a/tests/pulses/test_plot.py +++ b/tests/pulses/test_plot.py @@ -19,19 +19,67 @@ from qibolab.pulses.modulation import modulate HERE = pathlib.Path(__file__).parent +SAMPLING_RATE = 1 def test_plot_functions(): - p0 = Pulse(40, 0.9, 0, 0, Rectangular(), 0, PulseType.FLUX, 0) - p1 = Pulse(40, 0.9, 50e6, 0, Gaussian(5), 0, PulseType.DRIVE, 2) - p2 = Pulse(40, 0.9, 50e6, 0, Drag(5, 2), 0, PulseType.DRIVE, 200) - p3 = Pulse.flux(40, 0.9, Iir([-0.5, 2], [1], Rectangular()), channel=0, qubit=200) - p4 = Pulse.flux(40, 0.9, Snz(t_idling=10), channel=0, qubit=200) - p5 = Pulse(40, 0.9, 400e6, 0, ECap(alpha=2), 0, PulseType.DRIVE) - p6 = Pulse(40, 0.9, 50e6, 0, GaussianSquare(5, 0.9), 0, PulseType.DRIVE, 2) + p0 = Pulse( + duration=40, + amplitude=0.9, + frequency=0, + envelope=Rectangular(), + relative_phase=0, + type=PulseType.FLUX, + qubit=0, + ) + p1 = Pulse( + duration=40, + amplitude=0.9, + frequency=50e6, + envelope=Gaussian(rel_sigma=0.2), + relative_phase=0, + type=PulseType.DRIVE, + qubit=2, + ) + p2 = Pulse( + duration=40, + amplitude=0.9, + frequency=50e6, + envelope=Drag(rel_sigma=0.2, beta=2), + relative_phase=0, + type=PulseType.DRIVE, + qubit=200, + ) + p3 = Pulse.flux( + duration=40, + amplitude=0.9, + envelope=Iir(a=np.array([-0.5, 2]), b=np.array([1]), target=Rectangular()), + channel="0", + qubit=200, + ) + p4 = Pulse.flux( + duration=40, amplitude=0.9, envelope=Snz(t_idling=10), channel="0", qubit=200 + ) + p5 = Pulse( + duration=40, + amplitude=0.9, + frequency=400e6, + envelope=ECap(alpha=2), + relative_phase=0, + type=PulseType.DRIVE, + ) + p6 = Pulse( + duration=40, + amplitude=0.9, + frequency=50e6, + envelope=GaussianSquare(rel_sigma=0.2, width=0.9), + relative_phase=0, + type=PulseType.DRIVE, + qubit=2, + ) ps = PulseSequence([p0, p1, p2, p3, p4, p5, p6]) - envelope = p0.envelope_waveforms() - wf = modulate(np.array(envelope), 0.0) + envelope = p0.envelopes(SAMPLING_RATE) + wf = modulate(np.array(envelope), 0.0, rate=SAMPLING_RATE) plot_file = HERE / "test_plot.png" From a8159dd5fd76aa885ea7c7971ec972c292e4aa40 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 27 Mar 2024 18:56:08 +0400 Subject: [PATCH 0170/1006] test: Fix most pulse tests --- tests/pulses/test_pulse.py | 190 +++++++++++++++++++++---------------- 1 file changed, 109 insertions(+), 81 deletions(-) diff --git a/tests/pulses/test_pulse.py b/tests/pulses/test_pulse.py index 5607c01c07..be5484d8a5 100644 --- a/tests/pulses/test_pulse.py +++ b/tests/pulses/test_pulse.py @@ -1,7 +1,5 @@ """Tests ``pulses.py``.""" -import copy - import numpy as np import pytest @@ -9,6 +7,7 @@ Custom, Drag, ECap, + Envelope, Gaussian, GaussianSquare, Iir, @@ -26,8 +25,8 @@ def test_init(): amplitude=0.9, frequency=20_000_000, relative_phase=0.0, - shape=Rectangular(), - channel=0, + envelope=Rectangular(), + channel="0", type=PulseType.READOUT, qubit=0, ) @@ -38,8 +37,8 @@ def test_init(): amplitude=0.9, frequency=20_000_000, relative_phase=0.0, - shape=Rectangular(), - channel=0, + envelope=Rectangular(), + channel="0", type=PulseType.READOUT, qubit=0, ) @@ -51,12 +50,12 @@ def test_init(): amplitude=0.9, frequency=int(20e6), relative_phase=0, - shape=Rectangular(), - channel=0, + envelope=Rectangular(), + channel="0", type=PulseType.READOUT, qubit=0, ) - assert isinstance(p2.frequency, int) and p2.frequency == 20_000_000 + assert isinstance(p2.frequency, float) and p2.frequency == 20_000_000 # initialisation with non float (int) relative_phase p3 = Pulse( @@ -64,8 +63,8 @@ def test_init(): amplitude=0.9, frequency=20_000_000, relative_phase=1.0, - shape=Rectangular(), - channel=0, + envelope=Rectangular(), + channel="0", type=PulseType.READOUT, qubit=0, ) @@ -77,12 +76,12 @@ def test_init(): amplitude=0.9, frequency=20_000_000, relative_phase=0, - shape="Rectangular()", - channel=0, + envelope=Rectangular(), + channel="0", type=PulseType.READOUT, qubit=0, ) - assert isinstance(p4.shape, Rectangular) + assert isinstance(p4.envelope, Rectangular) # initialisation with str channel and str qubit p5 = Pulse( @@ -90,24 +89,82 @@ def test_init(): amplitude=0.9, frequency=20_000_000, relative_phase=0, - shape="Rectangular()", + envelope=Rectangular(), channel="channel0", type=PulseType.READOUT, - qubit="qubit0", + qubit=0, ) - assert p5.qubit == "qubit0" + assert p5.qubit == 0 # initialisation with different frequencies, shapes and types - p6 = Pulse(40, 0.9, -50e6, 0, Rectangular(), 0, PulseType.READOUT) - p7 = Pulse(40, 0.9, 0, 0, Rectangular(), 0, PulseType.FLUX, 0) - p8 = Pulse(40, 0.9, 50e6, 0, Gaussian(5), 0, PulseType.DRIVE, 2) - p9 = Pulse(40, 0.9, 50e6, 0, Drag(5, 2), 0, PulseType.DRIVE, 200) + p6 = Pulse( + duration=40, + amplitude=0.9, + frequency=-50e6, + envelope=Rectangular(), + relative_phase=0, + type=PulseType.READOUT, + ) + p7 = Pulse( + duration=40, + amplitude=0.9, + frequency=0, + envelope=Rectangular(), + relative_phase=0, + type=PulseType.FLUX, + qubit=0, + ) + p8 = Pulse( + duration=40, + amplitude=0.9, + frequency=50e6, + envelope=Gaussian(rel_sigma=0.2), + relative_phase=0, + type=PulseType.DRIVE, + qubit=2, + ) + p9 = Pulse( + duration=40, + amplitude=0.9, + frequency=50e6, + envelope=Drag(rel_sigma=0.2, beta=2), + relative_phase=0, + type=PulseType.DRIVE, + qubit=200, + ) p10 = Pulse.flux( - 40, 0.9, Iir([-1, 1], [-0.1, 0.1001], Rectangular()), channel=0, qubit=200 + duration=40, + amplitude=0.9, + envelope=Iir( + a=np.array([-1, 1]), b=np.array([-0.1, 0.1001]), target=Rectangular() + ), + channel="0", + qubit=200, + ) + p11 = Pulse.flux( + duration=40, + amplitude=0.9, + envelope=Snz(t_idling=10, b_amplitude=0.5), + channel="0", + qubit=200, + ) + p13 = Pulse( + duration=40, + amplitude=0.9, + frequency=400e6, + envelope=ECap(alpha=2), + relative_phase=0, + type=PulseType.DRIVE, + ) + p14 = Pulse( + duration=40, + amplitude=0.9, + frequency=50e6, + envelope=GaussianSquare(rel_sigma=0.2, width=0.9), + relative_phase=0, + type=PulseType.READOUT, + qubit=2, ) - p11 = Pulse.flux(40, 0.9, Snz(t_idling=10, b_amplitude=0.5), channel=0, qubit=200) - p13 = Pulse(40, 0.9, 400e6, 0, ECap(alpha=2), 0, PulseType.DRIVE) - p14 = Pulse(40, 0.9, 50e6, 0, GaussianSquare(5, 0.9), 0, PulseType.READOUT, 2) # initialisation with float duration p12 = Pulse( @@ -115,8 +172,8 @@ def test_init(): amplitude=0.9, frequency=20_000_000, relative_phase=1, - shape=Rectangular(), - channel=0, + envelope=Rectangular(), + channel="0", type=PulseType.READOUT, qubit=0, ) @@ -125,7 +182,7 @@ def test_init(): def test_attributes(): - channel = 0 + channel = "0" qubit = 0 p10 = Pulse( @@ -133,37 +190,17 @@ def test_attributes(): amplitude=0.9, frequency=20_000_000, relative_phase=0.0, - shape=Rectangular(), + envelope=Rectangular(), channel=channel, qubit=qubit, ) - assert type(p10.duration) == int and p10.duration == 50 - assert type(p10.amplitude) == float and p10.amplitude == 0.9 - assert type(p10.frequency) == int and p10.frequency == 20_000_000 - assert isinstance(p10.shape, PulseShape) and repr(p10.shape) == "Rectangular()" - assert type(p10.channel) == type(channel) and p10.channel == channel - assert type(p10.qubit) == type(qubit) and p10.qubit == qubit - - -def test_hash(): - rp = Pulse(40, 0.9, 100e6, 0, Rectangular(), 0, PulseType.DRIVE) - dp = Pulse(40, 0.9, 100e6, 0, Drag(5, 1), 0, PulseType.DRIVE) - hash(rp) - my_dict = {rp: 1, dp: 2} - assert list(my_dict.keys())[0] == rp - assert list(my_dict.keys())[1] == dp - - p1 = Pulse(40, 0.9, 100e6, 0, Drag(5, 1), 0, PulseType.DRIVE) - p2 = Pulse(40, 0.9, 100e6, 0, Drag(5, 1), 0, PulseType.DRIVE) - - assert p1 == p2 - - p1 = Pulse(40, 0.9, 100e6, 0, Drag(5, 1), 0, PulseType.DRIVE) - p2 = copy.copy(p1) - p3 = copy.deepcopy(p1) - assert p1 == p2 - assert p1 == p3 + assert isinstance(p10.duration, float) and p10.duration == 50 + assert isinstance(p10.amplitude, float) and p10.amplitude == 0.9 + assert isinstance(p10.frequency, float) and p10.frequency == 20_000_000 + assert isinstance(p10.envelope, Envelope) + assert isinstance(p10.channel, type(channel)) and p10.channel == channel + assert isinstance(p10.qubit, type(qubit)) and p10.qubit == qubit def test_aliases(): @@ -172,9 +209,9 @@ def test_aliases(): amplitude=0.9, frequency=20_000_000, relative_phase=0.0, - shape=Rectangular(), + envelope=Rectangular(), type=PulseType.READOUT, - channel=0, + channel="0", qubit=0, ) assert rop.qubit == 0 @@ -184,17 +221,17 @@ def test_aliases(): amplitude=0.9, frequency=200_000_000, relative_phase=0.0, - shape=Gaussian(5), - channel=0, + envelope=Gaussian(rel_sigma=5), + channel="0", qubit=0, ) assert dp.amplitude == 0.9 - assert isinstance(dp.shape, Gaussian) + assert isinstance(dp.envelope, Gaussian) fp = Pulse.flux( - duration=300, amplitude=0.9, shape=Rectangular(), channel=0, qubit=0 + duration=300, amplitude=0.9, envelope=Rectangular(), channel="0", qubit=0 ) - assert fp.channel == 0 + assert fp.channel == "0" def test_pulse(): @@ -206,8 +243,8 @@ def test_pulse(): amplitude=1, duration=duration, relative_phase=0, - shape=f"Drag({rel_sigma}, {beta})", - channel=1, + envelope=Drag(rel_sigma=rel_sigma, beta=beta), + channel="1", ) assert pulse.duration == duration @@ -220,8 +257,8 @@ def test_readout_pulse(): amplitude=1, duration=duration, relative_phase=0, - shape=f"Rectangular()", - channel=11, + envelope=Rectangular(), + channel="11", type=PulseType.READOUT, ) @@ -231,28 +268,19 @@ def test_readout_pulse(): def test_envelope_waveform_i_q(): envelope_i = np.cos(np.arange(0, 10, 0.01)) envelope_q = np.sin(np.arange(0, 10, 0.01)) - custom_shape_pulse = Custom(envelope_i, envelope_q) - custom_shape_pulse_old_behaviour = Custom(envelope_i) + custom_shape_pulse = Custom(i_=envelope_i, q_=envelope_q) pulse = Pulse( duration=1000, amplitude=1, frequency=10e6, relative_phase=0, - shape="Rectangular()", - channel=1, + envelope=Rectangular(), + channel="1", ) - with pytest.raises(ShapeInitError): - custom_shape_pulse.envelope_waveform_i() - with pytest.raises(ShapeInitError): - custom_shape_pulse.envelope_waveform_q() - - custom_shape_pulse.pulse = pulse - custom_shape_pulse_old_behaviour.pulse = pulse + custom_shape_pulse.i_ = pulse.i(1) pulse.duration = 2000 with pytest.raises(ValueError): - custom_shape_pulse.pulse = pulse - custom_shape_pulse.envelope_waveform_i() + custom_shape_pulse.i(samples=10) with pytest.raises(ValueError): - custom_shape_pulse.pulse = pulse - custom_shape_pulse.envelope_waveform_q() + custom_shape_pulse.q(samples=10) From 1b9d8f2cb448c95502bd4223ce8768d6535a7c3b Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 28 Mar 2024 13:35:11 +0100 Subject: [PATCH 0171/1006] test: Fix pulse sequences tests --- tests/pulses/test_sequence.py | 267 +++++++++++++++++++++++++++------- 1 file changed, 216 insertions(+), 51 deletions(-) diff --git a/tests/pulses/test_sequence.py b/tests/pulses/test_sequence.py index c71b501d06..6d9b251a01 100644 --- a/tests/pulses/test_sequence.py +++ b/tests/pulses/test_sequence.py @@ -17,23 +17,23 @@ def test_add_readout(): amplitude=0.3, duration=60, relative_phase=0, - envelope=Gaussian(5), - channel=1, + envelope=Gaussian(rel_sigma=0.2), + channel="1", ) ) - sequence.append(Delay(4, channel=1)) + sequence.append(Delay(duration=4, channel="1")) sequence.append( Pulse( frequency=200_000_000, amplitude=0.3, duration=60, relative_phase=0, - envelope=Drag(5, 2), - channel=1, + envelope=Drag(rel_sigma=0.2, beta=2), + channel="1", type=PulseType.FLUX, ) ) - sequence.append(Delay(4, channel=1)) + sequence.append(Delay(duration=4, channel="1")) sequence.append( Pulse( frequency=20_000_000, @@ -41,7 +41,7 @@ def test_add_readout(): duration=2000, relative_phase=0, envelope=Rectangular(), - channel=11, + channel="11", type=PulseType.READOUT, ) ) @@ -52,31 +52,54 @@ def test_add_readout(): def test_get_qubit_pulses(): - p1 = Pulse(400, 0.9, 20e6, 0, Gaussian(5), 10, qubit=0) + p1 = Pulse( + duration=400, + amplitude=0.9, + frequency=20e6, + envelope=Gaussian(rel_sigma=0.2), + relative_phase=10, + qubit=0, + ) p2 = Pulse( - 400, - 0.9, - 20e6, - 0, - Rectangular(), - channel=30, + duration=400, + amplitude=0.9, + frequency=20e6, + envelope=Rectangular(), + channel="30", qubit=0, type=PulseType.READOUT, ) - p3 = Pulse(400, 0.9, 20e6, 0, Drag(5, 50), 20, qubit=1) - p4 = Pulse(400, 0.9, 20e6, 0, Drag(5, 50), 30, qubit=1) + p3 = Pulse( + duration=400, + amplitude=0.9, + frequency=20e6, + envelope=Drag(rel_sigma=0.2, beta=50), + relative_phase=20, + qubit=1, + ) + p4 = Pulse( + duration=400, + amplitude=0.9, + frequency=20e6, + envelope=Drag(rel_sigma=0.2, beta=50), + relative_phase=30, + qubit=1, + ) p5 = Pulse( - 400, - 0.9, - 20e6, - 0, - Rectangular(), - channel=30, + duration=400, + amplitude=0.9, + frequency=20e6, + envelope=Rectangular(), + channel="30", qubit=1, type=PulseType.READOUT, ) - p6 = Pulse.flux(400, 0.9, Rectangular(), channel=40, qubit=1) - p7 = Pulse.flux(400, 0.9, Rectangular(), channel=40, qubit=2) + p6 = Pulse.flux( + duration=400, amplitude=0.9, envelope=Rectangular(), channel="40", qubit=1 + ) + p7 = Pulse.flux( + duration=400, amplitude=0.9, envelope=Rectangular(), channel="40", qubit=2 + ) ps = PulseSequence([p1, p2, p3, p4, p5, p6, p7]) assert ps.qubits == [0, 1, 2] @@ -87,35 +110,108 @@ def test_get_qubit_pulses(): def test_get_channel_pulses(): - p1 = Pulse(400, 0.9, 20e6, 0, Gaussian(5), 10) - p2 = Pulse(400, 0.9, 20e6, 0, Rectangular(), 30, type=PulseType.READOUT) - p3 = Pulse(400, 0.9, 20e6, 0, Drag(5, 50), 20) - p4 = Pulse(400, 0.9, 20e6, 0, Drag(5, 50), 30) - p5 = Pulse(400, 0.9, 20e6, 0, Rectangular(), 20, type=PulseType.READOUT) - p6 = Pulse(400, 0.9, 20e6, 0, Gaussian(5), 30) + p1 = Pulse( + duration=400, + frequency=0.9, + amplitude=20e6, + envelope=Gaussian(rel_sigma=0.2), + channel="10", + ) + p2 = Pulse( + duration=400, + frequency=0.9, + amplitude=20e6, + envelope=Rectangular(), + channel="30", + type=PulseType.READOUT, + ) + p3 = Pulse( + duration=400, + frequency=0.9, + amplitude=20e6, + envelope=Drag(rel_sigma=0.2, beta=5), + channel="20", + ) + p4 = Pulse( + duration=400, + frequency=0.9, + amplitude=20e6, + envelope=Drag(rel_sigma=0.2, beta=5), + channel="30", + ) + p5 = Pulse( + duration=400, + frequency=0.9, + amplitude=20e6, + envelope=Rectangular(), + channel="20", + type=PulseType.READOUT, + ) + p6 = Pulse( + duration=400, + frequency=0.9, + amplitude=20e6, + envelope=Gaussian(rel_sigma=0.2), + channel="30", + ) ps = PulseSequence([p1, p2, p3, p4, p5, p6]) - assert ps.channels == [10, 20, 30] - assert len(ps.get_channel_pulses(10)) == 1 - assert len(ps.get_channel_pulses(20)) == 2 - assert len(ps.get_channel_pulses(30)) == 3 - assert len(ps.get_channel_pulses(20, 30)) == 5 + assert sorted(ps.channels) == ["10", "20", "30"] + assert len(ps.get_channel_pulses("10")) == 1 + assert len(ps.get_channel_pulses("20")) == 2 + assert len(ps.get_channel_pulses("30")) == 3 + assert len(ps.get_channel_pulses("20", "30")) == 5 def test_sequence_duration(): - p0 = Delay(20, 1) - p1 = Pulse(40, 0.9, 200e6, 0, Drag(5, 1), 1, PulseType.DRIVE) - p2 = Pulse(1000, 0.9, 20e6, 0, Rectangular(), 1, PulseType.READOUT) + p0 = Delay(duration=20, channel="1") + p1 = Pulse( + duration=40, + amplitude=0.9, + frequency=200e6, + envelope=Drag(rel_sigma=0.2, beta=1), + channel="1", + type=PulseType.DRIVE, + ) + p2 = Pulse( + duration=1000, + amplitude=0.9, + frequency=20e6, + envelope=Rectangular(), + channel="1", + type=PulseType.READOUT, + ) ps = PulseSequence([p0, p1]) + [p2] assert ps.duration == 20 + 40 + 1000 - p2.channel = 2 + p2.channel = "2" assert ps.duration == 1000 def test_init(): - p1 = Pulse(40, 0.9, 100e6, 0, Drag(5, 1), 3, PulseType.DRIVE) - p2 = Pulse(40, 0.9, 100e6, 0, Drag(5, 1), 2, PulseType.DRIVE) - p3 = Pulse(40, 0.9, 100e6, 0, Drag(5, 1), 1, PulseType.DRIVE) + p1 = Pulse( + duration=40, + amplitude=0.9, + frequency=100e6, + envelope=Drag(rel_sigma=0.2, beta=1), + channel="3", + type=PulseType.DRIVE, + ) + p2 = Pulse( + duration=40, + amplitude=0.9, + frequency=100e6, + envelope=Drag(rel_sigma=0.2, beta=1), + channel="2", + type=PulseType.DRIVE, + ) + p3 = Pulse( + duration=40, + amplitude=0.9, + frequency=100e6, + envelope=Drag(rel_sigma=0.2, beta=1), + channel="1", + type=PulseType.DRIVE, + ) ps = PulseSequence() assert type(ps) == PulseSequence @@ -141,13 +237,61 @@ def test_init(): def test_operators(): ps = PulseSequence() - ps += [Pulse(200, 0.9, 20e6, 0, Rectangular(), 1, type=PulseType.READOUT)] - ps = ps + [Pulse(200, 0.9, 20e6, 0, Rectangular(), 2, type=PulseType.READOUT)] - ps = [Pulse(200, 0.9, 20e6, 0, Rectangular(), 3, type=PulseType.READOUT)] + ps + ps += [ + Pulse( + duration=200, + amplitude=0.9, + frequency=20e6, + envelope=Rectangular(), + channel="3", + type=PulseType.DRIVE, + ) + ] + ps = ps + [ + Pulse( + duration=200, + amplitude=0.9, + frequency=20e6, + envelope=Rectangular(), + channel="2", + type=PulseType.DRIVE, + ) + ] + ps = [ + Pulse( + duration=200, + amplitude=0.9, + frequency=20e6, + envelope=Rectangular(), + channel="3", + type=PulseType.DRIVE, + ) + ] + ps - p4 = Pulse(40, 0.9, 50e6, 0, Gaussian(5), 3, PulseType.DRIVE) - p5 = Pulse(40, 0.9, 50e6, 0, Gaussian(5), 2, PulseType.DRIVE) - p6 = Pulse(40, 0.9, 50e6, 0, Gaussian(5), 1, PulseType.DRIVE) + p4 = Pulse( + duration=40, + amplitude=0.9, + frequency=50e6, + envelope=Gaussian(rel_sigma=0.2), + channel="3", + type=PulseType.DRIVE, + ) + p5 = Pulse( + duration=40, + amplitude=0.9, + frequency=50e6, + envelope=Gaussian(rel_sigma=0.2), + channel="2", + type=PulseType.DRIVE, + ) + p6 = Pulse( + duration=40, + amplitude=0.9, + frequency=50e6, + envelope=Gaussian(rel_sigma=0.2), + channel="1", + type=PulseType.DRIVE, + ) another_ps = PulseSequence() another_ps.append(p4) @@ -164,7 +308,14 @@ def test_operators(): # ps.plot() - p7 = Pulse(40, 0.9, 100e6, 0, Drag(5, 1), 1, PulseType.DRIVE) + p7 = Pulse( + duration=40, + amplitude=0.9, + frequency=100e6, + envelope=Drag(rel_sigma=0.2, beta=1), + channel="1", + type=PulseType.DRIVE, + ) yet_another_ps = PulseSequence([p7]) assert len(yet_another_ps) == 1 yet_another_ps *= 3 @@ -172,7 +323,21 @@ def test_operators(): yet_another_ps *= 3 assert len(yet_another_ps) == 9 - p8 = Pulse(40, 0.9, 100e6, 0, Drag(5, 1), 1, PulseType.DRIVE) - p9 = Pulse(40, 0.9, 100e6, 0, Drag(5, 1), 2, PulseType.DRIVE) + p8 = Pulse( + duration=40, + amplitude=0.9, + frequency=100e6, + envelope=Drag(rel_sigma=0.2, beta=1), + channel="1", + type=PulseType.DRIVE, + ) + p9 = Pulse( + duration=40, + amplitude=0.9, + frequency=100e6, + envelope=Drag(rel_sigma=0.2, beta=1), + channel="2", + type=PulseType.DRIVE, + ) and_yet_another_ps = 2 * PulseSequence([p9]) + [p8] * 3 assert len(and_yet_another_ps) == 5 From e00ae4698362481de4c8f0a7f2040c254222b128 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 28 Mar 2024 13:42:04 +0100 Subject: [PATCH 0172/1006] test: Use parent class BaseEnvelope for instance check, instead of the union --- tests/pulses/test_pulse.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/pulses/test_pulse.py b/tests/pulses/test_pulse.py index be5484d8a5..21155bb9b8 100644 --- a/tests/pulses/test_pulse.py +++ b/tests/pulses/test_pulse.py @@ -4,10 +4,10 @@ import pytest from qibolab.pulses import ( + BaseEnvelope, Custom, Drag, ECap, - Envelope, Gaussian, GaussianSquare, Iir, @@ -198,7 +198,7 @@ def test_attributes(): assert isinstance(p10.duration, float) and p10.duration == 50 assert isinstance(p10.amplitude, float) and p10.amplitude == 0.9 assert isinstance(p10.frequency, float) and p10.frequency == 20_000_000 - assert isinstance(p10.envelope, Envelope) + assert isinstance(p10.envelope, BaseEnvelope) assert isinstance(p10.channel, type(channel)) and p10.channel == channel assert isinstance(p10.qubit, type(qubit)) and p10.qubit == qubit From 384580bbe3b9c3b6fe639b639dd80eba76de5a67 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 28 Mar 2024 18:08:42 +0100 Subject: [PATCH 0173/1006] feat: Make all pydantic models frozen --- src/qibolab/serialize_.py | 2 +- tests/pulses/test_pulse.py | 4 ++-- tests/pulses/test_sequence.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/qibolab/serialize_.py b/src/qibolab/serialize_.py index d9928254ec..c09cdc68cc 100644 --- a/src/qibolab/serialize_.py +++ b/src/qibolab/serialize_.py @@ -58,4 +58,4 @@ def eq(obj1: BaseModel, obj2: BaseModel) -> bool: class Model(BaseModel): """Global qibolab model, holding common configurations.""" - model_config = ConfigDict(arbitrary_types_allowed=True) + model_config = ConfigDict(arbitrary_types_allowed=True, frozen=True) diff --git a/tests/pulses/test_pulse.py b/tests/pulses/test_pulse.py index 21155bb9b8..29650dc8e9 100644 --- a/tests/pulses/test_pulse.py +++ b/tests/pulses/test_pulse.py @@ -278,8 +278,8 @@ def test_envelope_waveform_i_q(): channel="1", ) - custom_shape_pulse.i_ = pulse.i(1) - pulse.duration = 2000 + custom_shape_pulse = custom_shape_pulse.model_copy(update={"i_": pulse.i(1)}) + pulse = pulse.model_copy(update={"duration": 2000}) with pytest.raises(ValueError): custom_shape_pulse.i(samples=10) with pytest.raises(ValueError): diff --git a/tests/pulses/test_sequence.py b/tests/pulses/test_sequence.py index 6d9b251a01..c44eacbe85 100644 --- a/tests/pulses/test_sequence.py +++ b/tests/pulses/test_sequence.py @@ -183,7 +183,7 @@ def test_sequence_duration(): ) ps = PulseSequence([p0, p1]) + [p2] assert ps.duration == 20 + 40 + 1000 - p2.channel = "2" + ps[-1] = p2.model_copy(update={"channel": "2"}) assert ps.duration == 1000 From d9385f32d93e44b37584449d7c1bbfbebcfdc919 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 28 Mar 2024 18:20:49 +0100 Subject: [PATCH 0174/1006] feat: Propagate pydantic models to execution parameters, fix backend tests --- src/qibolab/compilers/default.py | 2 +- src/qibolab/execution_parameters.py | 5 +- src/qibolab/native.py | 367 ++-------------------------- src/qibolab/platform/platform.py | 3 +- src/qibolab/serialize.py | 2 + src/qibolab/serialize_.py | 8 + 6 files changed, 36 insertions(+), 351 deletions(-) diff --git a/src/qibolab/compilers/default.py b/src/qibolab/compilers/default.py index c59360c884..227b07af59 100644 --- a/src/qibolab/compilers/default.py +++ b/src/qibolab/compilers/default.py @@ -4,9 +4,9 @@ """ import math -from dataclasses import replace from qibolab.pulses import PulseSequence, VirtualZ +from qibolab.serialize_ import replace def identity_rule(gate, qubit): diff --git a/src/qibolab/execution_parameters.py b/src/qibolab/execution_parameters.py index b317caf138..13a6ff0f27 100644 --- a/src/qibolab/execution_parameters.py +++ b/src/qibolab/execution_parameters.py @@ -1,4 +1,3 @@ -from dataclasses import dataclass from enum import Enum, auto from typing import Optional @@ -10,6 +9,7 @@ RawWaveformResults, SampleResults, ) +from qibolab.serialize_ import Model class AcquisitionType(Enum): @@ -51,8 +51,7 @@ class AveragingMode(Enum): } -@dataclass(frozen=True) -class ExecutionParameters: +class ExecutionParameters(Model): """Data structure to deal with execution parameters.""" nshots: Optional[int] = None diff --git a/src/qibolab/native.py b/src/qibolab/native.py index 8c08595e1e..a3454eccb0 100644 --- a/src/qibolab/native.py +++ b/src/qibolab/native.py @@ -1,256 +1,8 @@ -import copy -from collections import defaultdict -from dataclasses import dataclass, field, fields, replace -from typing import List, Optional, Union +from dataclasses import dataclass, field, fields +from typing import Optional -from qibolab.pulses import Pulse, PulseSequence, PulseType - - -@dataclass -class NativePulse: - """Container with parameters required to generate a pulse implementing a - native gate.""" - - name: str - """Name of the gate that the pulse implements.""" - duration: int - amplitude: float - shape: str - pulse_type: PulseType - qubit: "qubits.Qubit" - frequency: int = 0 - relative_start: int = 0 - """Relative start is relevant for two-qubit gate operations which - correspond to a pulse sequence.""" - - # used for qblox - if_frequency: Optional[int] = None - # TODO: Note sure if the following parameters are useful to be in the runcard - start: int = 0 - phase: float = 0.0 - - @classmethod - def from_dict(cls, name, pulse, qubit): - """Parse the dictionary provided by the runcard. - - Args: - name (str): Name of the native gate (dictionary key). - pulse (dict): Dictionary containing the parameters of the pulse implementing - the gate, as loaded from the runcard. - qubits (:class:`qibolab.platforms.abstract.Qubit`): Qubit that the - pulse is acting on - """ - kwargs = copy.deepcopy(pulse) - kwargs["pulse_type"] = PulseType(kwargs.pop("type")) - kwargs["qubit"] = qubit - return cls(name, **kwargs) - - @property - def raw(self): - data = { - fld.name: getattr(self, fld.name) - for fld in fields(self) - if getattr(self, fld.name) is not None - } - del data["name"] - del data["start"] - if self.pulse_type is PulseType.FLUX: - del data["frequency"] - del data["phase"] - data["qubit"] = self.qubit.name - data["type"] = data.pop("pulse_type").value - return data - - def pulse(self, start, relative_phase=0.0): - """Construct the :class:`qibolab.pulses.Pulse` object implementing the - gate. - - Args: - start (int): Start time of the pulse in the sequence. - relative_phase (float): Relative phase of the pulse. - - Returns: - A :class:`qibolab.pulses.DrivePulse` or :class:`qibolab.pulses.DrivePulse` - or :class:`qibolab.pulses.FluxPulse` with the pulse parameters of the gate. - """ - if self.pulse_type is PulseType.FLUX: - return Pulse.flux( - start + self.relative_start, - self.duration, - self.amplitude, - self.shape, - channel=self.qubit.flux.name, - qubit=self.qubit.name, - ) - - channel = getattr(self.qubit, self.pulse_type.name.lower()).name - return Pulse( - start + self.relative_start, - self.duration, - self.amplitude, - self.frequency, - relative_phase, - self.shape, - type=self.pulse_type, - channel=channel, - qubit=self.qubit.name, - ) - - -@dataclass -class VirtualZPulse: - """Container with parameters required to add a virtual Z phase in a pulse - sequence.""" - - phase: float - qubit: "qubits.Qubit" - - @property - def raw(self): - return {"type": "virtual_z", "phase": self.phase, "qubit": self.qubit.name} - - -@dataclass -class CouplerPulse: - """Container with parameters required to add a coupler pulse in a pulse - sequence.""" - - duration: int - amplitude: float - shape: str - coupler: "couplers.Coupler" - relative_start: int = 0 - - @classmethod - def from_dict(cls, pulse, coupler): - """Parse the dictionary provided by the runcard. - - Args: - name (str): Name of the native gate (dictionary key). - pulse (dict): Dictionary containing the parameters of the pulse implementing - the gate, as loaded from the runcard. - coupler (:class:`qibolab.platforms.abstract.Coupler`): Coupler that the - pulse is acting on - """ - kwargs = copy.deepcopy(pulse) - kwargs["coupler"] = coupler - kwargs.pop("type") - return cls(**kwargs) - - @property - def raw(self): - return { - "type": "coupler", - "duration": self.duration, - "amplitude": self.amplitude, - "shape": self.shape, - "coupler": self.coupler.name, - "relative_start": self.relative_start, - } - - def pulse(self, start): - """Construct the :class:`qibolab.pulses.Pulse` object implementing the - gate. - - Args: - start (int): Start time of the pulse in the sequence. - - Returns: - A :class:`qibolab.pulses.FluxPulse` with the pulse parameters of the gate. - """ - return Pulse( - start + self.relative_start, - self.duration, - self.amplitude, - 0, - 0, - self.shape, - type=PulseType.COUPLERFLUX, - channel=self.coupler.flux.name, - qubit=self.coupler.name, - ) - - -@dataclass -class NativeSequence: - """List of :class:`qibolab.platforms.native.NativePulse` objects - implementing a gate. - - Relevant for two-qubit gates, which usually require a sequence of - pulses to be implemented. These pulses may act on qubits different - than the qubits the gate is targeting. - """ - - name: str - pulses: List[Union[NativePulse, VirtualZPulse]] = field(default_factory=list) - coupler_pulses: List[CouplerPulse] = field(default_factory=list) - - @classmethod - def from_dict(cls, name, sequence, qubits, couplers): - """Constructs the native sequence from the dictionaries provided in the - runcard. - - Args: - name (str): Name of the gate the sequence is applying. - sequence (dict): Dictionary describing the sequence as provided in the runcard. - qubits (list): List of :class:`qibolab.qubits.Qubit` object for all - qubits in the platform. All qubits are required because the sequence may be - acting on qubits that the implemented gate is not targeting. - couplers (list): List of :class:`qibolab.couplers.Coupler` object for all - couplers in the platform. All couplers are required because the sequence may be - acting on couplers that the implemented gate is not targeting. - """ - pulses = [] - coupler_pulses = [] - - # If sequence contains only one pulse dictionary, convert it into a list that can be iterated below - if isinstance(sequence, dict): - sequence = [sequence] - - for i, pulse in enumerate(sequence): - pulse = copy.deepcopy(pulse) - pulse_type = pulse.pop("type") - if pulse_type == "coupler": - pulse["coupler"] = couplers[pulse.pop("coupler")] - coupler_pulses.append(CouplerPulse(**pulse)) - else: - qubit = qubits[pulse.pop("qubit")] - if pulse_type == "virtual_z": - phase = pulse["phase"] - pulses.append(VirtualZPulse(phase, qubit)) - else: - pulses.append( - NativePulse( - f"{name}{i}", - **pulse, - pulse_type=PulseType(pulse_type), - qubit=qubit, - ) - ) - return cls(name, pulses, coupler_pulses) - - @property - def raw(self): - pulses = [pulse.raw for pulse in self.pulses] - coupler_pulses = [pulse.raw for pulse in self.coupler_pulses] - return pulses + coupler_pulses - - def sequence(self, start=0): - """Creates a :class:`qibolab.pulses.PulseSequence` object implementing - the sequence.""" - sequence = PulseSequence() - virtual_z_phases = defaultdict(int) - - for pulse in self.pulses: - if isinstance(pulse, NativePulse): - sequence.append(pulse.pulse(start=start)) - else: - virtual_z_phases[pulse.qubit.name] += pulse.phase - - for coupler_pulse in self.coupler_pulses: - sequence.append(coupler_pulse.pulse(start=start)) - # TODO: Maybe ``virtual_z_phases`` should be an attribute of ``PulseSequence`` - return sequence, virtual_z_phases +from .pulses import Pulse, PulseSequence +from .serialize_ import replace @dataclass @@ -258,85 +10,19 @@ class SingleQubitNatives: """Container with the native single-qubit gates acting on a specific qubit.""" - RX: Optional[NativePulse] = None + RX: Optional[Pulse] = None """Pulse to drive the qubit from state 0 to state 1.""" - RX12: Optional[NativePulse] = None + RX12: Optional[Pulse] = None """Pulse to drive to qubit from state 1 to state 2.""" - MZ: Optional[NativePulse] = None + MZ: Optional[Pulse] = None """Measurement pulse.""" + CP: Optional[Pulse] = None + """Pulse to activate a coupler.""" @property - def RX90(self) -> NativePulse: + def RX90(self) -> Pulse: """RX90 native pulse is inferred from RX by halving its amplitude.""" - return replace(self.RX, name="RX90", amplitude=self.RX.amplitude / 2.0) - - @classmethod - def from_dict(cls, qubit, native_gates): - """Parse native gates of the qubit from the runcard. - - Args: - qubit (:class:`qibolab.qubits.Qubit`): Qubit object that the - native gates are acting on. - native_gates (dict): Dictionary with native gate pulse parameters as loaded - from the runcard. - """ - pulses = { - n: NativePulse.from_dict(n, pulse, qubit=qubit) - for n, pulse in native_gates.items() - } - return cls(**pulses) - - @property - def raw(self): - """Serialize native gate pulses. - - ``None`` gates are not included. - """ - data = {} - for fld in fields(self): - attr = getattr(self, fld.name) - if attr is not None: - data[fld.name] = attr.raw - del data[fld.name]["qubit"] - return data - - -@dataclass -class CouplerNatives: - """Container with the native single-qubit gates acting on a specific - qubit.""" - - CP: Optional[NativePulse] = None - """Pulse to activate the coupler.""" - - @classmethod - def from_dict(cls, coupler, native_gates): - """Parse coupler native gates from the runcard. - - Args: - coupler (:class:`qibolab.couplers.Coupler`): Coupler object that the - native pulses are acting on. - native_gates (dict): Dictionary with native gate pulse parameters as loaded - from the runcard [Reusing the dict from qubits]. - """ - pulses = { - n: CouplerPulse.from_dict(pulse, coupler=coupler) - for n, pulse in native_gates.items() - } - return cls(**pulses) - - @property - def raw(self): - """Serialize native gate pulses. - - ``None`` gates are not included. - """ - data = {} - for fld in fields(self): - attr = getattr(self, fld.name) - if attr is not None: - data[fld.name] = attr.raw - return data + return replace(self.RX, amplitude=self.RX.amplitude / 2.0) @dataclass @@ -344,32 +30,21 @@ class TwoQubitNatives: """Container with the native two-qubit gates acting on a specific pair of qubits.""" - CZ: Optional[NativeSequence] = field(default=None, metadata={"symmetric": True}) - CNOT: Optional[NativeSequence] = field(default=None, metadata={"symmetric": False}) - iSWAP: Optional[NativeSequence] = field(default=None, metadata={"symmetric": True}) + CZ: PulseSequence = field( + default_factory=lambda: PulseSequence(), metadata={"symmetric": True} + ) + CNOT: PulseSequence = field( + default_factory=lambda: PulseSequence(), metadata={"symmetric": False} + ) + iSWAP: PulseSequence = field( + default_factory=lambda: PulseSequence(), metadata={"symmetric": True} + ) @property def symmetric(self): """Check if the defined two-qubit gates are symmetric between target and control qubits.""" return all( - fld.metadata["symmetric"] or getattr(self, fld.name) is None + fld.metadata["symmetric"] or len(getattr(self, fld.name)) == 0 for fld in fields(self) ) - - @classmethod - def from_dict(cls, qubits, couplers, native_gates): - sequences = { - n: NativeSequence.from_dict(n, seq, qubits, couplers) - for n, seq in native_gates.items() - } - return cls(**sequences) - - @property - def raw(self): - data = {} - for fld in fields(self): - gate = getattr(self, fld.name) - if gate is not None: - data[fld.name] = gate.raw - return data diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index f69d00ce97..befc7df133 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -1,7 +1,7 @@ """A platform for executing quantum algorithms.""" from collections import defaultdict -from dataclasses import dataclass, field, fields, replace +from dataclasses import dataclass, field, fields from typing import Dict, List, Optional, Tuple import networkx as nx @@ -12,6 +12,7 @@ from qibolab.instruments.abstract import Controller, Instrument, InstrumentId from qibolab.pulses import Delay, Drag, PulseSequence, PulseType from qibolab.qubits import Qubit, QubitId, QubitPair, QubitPairId +from qibolab.serialize_ import replace from qibolab.sweeper import Sweeper from qibolab.unrolling import batch diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index 6e0af80961..39ece9f99f 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -108,6 +108,8 @@ def _load_pulse(pulse_kwargs, qubit): return Delay(**pulse_kwargs) if pulse_type == "vz": return VirtualZ(**pulse_kwargs, qubit=q) + if "frequency" not in pulse_kwargs: + return Pulse.flux(**pulse_kwargs, type=pulse_type, qubit=q) return Pulse(**pulse_kwargs, type=pulse_type, qubit=q) diff --git a/src/qibolab/serialize_.py b/src/qibolab/serialize_.py index c09cdc68cc..c7a4a3d12d 100644 --- a/src/qibolab/serialize_.py +++ b/src/qibolab/serialize_.py @@ -59,3 +59,11 @@ class Model(BaseModel): """Global qibolab model, holding common configurations.""" model_config = ConfigDict(arbitrary_types_allowed=True, frozen=True) + + +def replace(model: BaseModel, **update): + """Replace interface for pydantic models. + + To have the same familiar syntax of :func:`dataclasses.replace`. + """ + return model.model_copy(update=update) From 7b2954f4068c4a27915202822072775b8957fd1d Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 28 Mar 2024 18:37:57 +0100 Subject: [PATCH 0175/1006] test: Fix default compiler tests --- tests/dummy_qrc/qblox/parameters.json | 647 +++++++++++----------- tests/dummy_qrc/qm/parameters.json | 589 +++++++++----------- tests/dummy_qrc/qm_octave/parameters.json | 621 ++++++++++----------- tests/dummy_qrc/rfsoc/parameters.json | 131 +++-- tests/dummy_qrc/zurich/parameters.json | 591 +++++++++----------- tests/test_compilers_default.py | 9 +- tests/test_dummy.py | 4 +- 7 files changed, 1240 insertions(+), 1352 deletions(-) diff --git a/tests/dummy_qrc/qblox/parameters.json b/tests/dummy_qrc/qblox/parameters.json index 415e069809..d7c2836921 100644 --- a/tests/dummy_qrc/qblox/parameters.json +++ b/tests/dummy_qrc/qblox/parameters.json @@ -1,342 +1,339 @@ { - "nqubits": 5, - "settings": { - "nshots": 1024, - "relaxation_time": 20000 + "nqubits": 5, + "settings": { + "nshots": 1024, + "relaxation_time": 20000 + }, + "qubits": [0, 1, 2, 3, 4], + "topology": [ + [0, 2], + [1, 2], + [2, 3], + [2, 4] + ], + "instruments": { + "qblox_controller": { + "bounds": { + "instructions": 1000000, + "readout": 250, + "waveforms": 40000 + } }, - "qubits": [ - 0, - 1, - 2, - 3, - 4 - ], - "topology": [ - [ - 0, - 2 - ], - [ - 1, - 2 - ], - [ - 2, - 3 - ], - [ - 2, - 4 - ] - ], - "instruments": { - "qblox_controller": { - "bounds": { - "instructions": 1000000, - "readout": 250, - "waveforms": 40000 - } + "twpa_pump": { + "frequency": 6535900000, + "power": 4 + }, + "qcm_rf0": { + "o1": { + "attenuation": 20, + "lo_frequency": 5252833073, + "gain": 0.47 + }, + "o2": { + "attenuation": 20, + "lo_frequency": 5652833073, + "gain": 0.57 + } + }, + "qcm_rf1": { + "o1": { + "attenuation": 20, + "lo_frequency": 5995371914, + "gain": 0.55 + }, + "o2": { + "attenuation": 20, + "lo_frequency": 6961018001, + "gain": 0.596 + } + }, + "qcm_rf2": { + "o1": { + "attenuation": 20, + "lo_frequency": 6786543060, + "gain": 0.47 + } + }, + "qrm_rf_a": { + "o1": { + "attenuation": 36, + "lo_frequency": 7300000000, + "gain": 0.6 + }, + "i1": { + "acquisition_hold_off": 500, + "acquisition_duration": 900 + } + }, + "qrm_rf_b": { + "o1": { + "attenuation": 36, + "lo_frequency": 7850000000, + "gain": 0.6 + }, + "i1": { + "acquisition_hold_off": 500, + "acquisition_duration": 900 + } + } + }, + "native_gates": { + "single_qubit": { + "0": { + "RX": { + "duration": 40, + "amplitude": 0.5028, + "frequency": 5050304836, + "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, + "type": "qd" }, - "twpa_pump": { - "frequency": 6535900000, - "power": 4 + "RX12": { + "duration": 40, + "amplitude": 0.5028, + "frequency": 5050304836, + "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, + "type": "qd" }, - "qcm_rf0": { - "o1": { - "attenuation": 20, - "lo_frequency": 5252833073, - "gain": 0.47 - }, - "o2": { - "attenuation": 20, - "lo_frequency": 5652833073, - "gain": 0.57 - } + "MZ": { + "duration": 2000, + "amplitude": 0.1, + "frequency": 7213299307, + "envelope": { "kind": "rectangular" }, + "type": "ro" + } + }, + "1": { + "RX": { + "duration": 40, + "amplitude": 0.5078, + "frequency": 4852833073, + "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, + "type": "qd" }, - "qcm_rf1": { - "o1": { - "attenuation": 20, - "lo_frequency": 5995371914, - "gain": 0.55 - }, - "o2": { - "attenuation": 20, - "lo_frequency": 6961018001, - "gain": 0.596 - } + "RX12": { + "duration": 40, + "amplitude": 0.5078, + "frequency": 4852833073, + "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, + "type": "qd" }, - "qcm_rf2": { - "o1": { - "attenuation": 20, - "lo_frequency": 6786543060, - "gain": 0.47 - } + "MZ": { + "duration": 2000, + "amplitude": 0.2, + "frequency": 7452990931, + "envelope": { "kind": "rectangular" }, + "type": "ro" + } + }, + "2": { + "RX": { + "duration": 40, + "amplitude": 0.5016, + "frequency": 5795371914, + "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, + "type": "qd" }, - "qrm_rf_a": { - "o1": { - "attenuation": 36, - "lo_frequency": 7300000000, - "gain": 0.6 - }, - "i1": { - "acquisition_hold_off": 500, - "acquisition_duration": 900 - } + "RX12": { + "duration": 40, + "amplitude": 0.5016, + "frequency": 5795371914, + "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, + "type": "qd" }, - "qrm_rf_b": { - "o1": { - "attenuation": 36, - "lo_frequency": 7850000000, - "gain": 0.6 - }, - "i1": { - "acquisition_hold_off": 500, - "acquisition_duration": 900 - } + "MZ": { + "duration": 2000, + "amplitude": 0.25, + "frequency": 7655083068, + "envelope": { "kind": "rectangular" }, + "type": "ro" } - }, - "native_gates": { - "single_qubit": { - "0": { - "RX": { - "duration": 40, - "amplitude": 0.5028, - "frequency": 5050304836, - "shape": "Gaussian(5)", - "type": "qd" - }, - "RX12": { - "duration": 40, - "amplitude": 0.5028, - "frequency": 5050304836, - "shape": "Gaussian(5)", - "type": "qd" - }, - "MZ": { - "duration": 2000, - "amplitude": 0.1, - "frequency": 7213299307, - "shape": "Rectangular()", - "type": "ro" - } - }, - "1": { - "RX": { - "duration": 40, - "amplitude": 0.5078, - "frequency": 4852833073, - "shape": "Gaussian(5)", - "type": "qd" - }, - "RX12": { - "duration": 40, - "amplitude": 0.5078, - "frequency": 4852833073, - "shape": "Gaussian(5)", - "type": "qd" - }, - "MZ": { - "duration": 2000, - "amplitude": 0.2, - "frequency": 7452990931, - "shape": "Rectangular()", - "type": "ro" - } - }, - "2": { - "RX": { - "duration": 40, - "amplitude": 0.5016, - "frequency": 5795371914, - "shape": "Gaussian(5)", - "type": "qd" - }, - "RX12": { - "duration": 40, - "amplitude": 0.5016, - "frequency": 5795371914, - "shape": "Gaussian(5)", - "type": "qd" - }, - "MZ": { - "duration": 2000, - "amplitude": 0.25, - "frequency": 7655083068, - "shape": "Rectangular()", - "type": "ro" - } - }, - "3": { - "RX": { - "duration": 40, - "amplitude": 0.5026, - "frequency": 6761018001, - "shape": "Gaussian(5)", - "type": "qd" - }, - "RX12": { - "duration": 40, - "amplitude": 0.5026, - "frequency": 6761018001, - "shape": "Gaussian(5)", - "type": "qd" - }, - "MZ": { - "duration": 2000, - "amplitude": 0.2, - "frequency": 7803441221, - "shape": "Rectangular()", - "type": "ro" - } - }, - "4": { - "RX": { - "duration": 40, - "amplitude": 0.5172, - "frequency": 6586543060, - "shape": "Gaussian(5)", - "type": "qd" - }, - "RX12": { - "duration": 40, - "amplitude": 0.5172, - "frequency": 6586543060, - "shape": "Gaussian(5)", - "type": "qd" - }, - "MZ": { - "duration": 2000, - "amplitude": 0.4, - "frequency": 8058947261, - "shape": "Rectangular()", - "type": "ro" - } - } + }, + "3": { + "RX": { + "duration": 40, + "amplitude": 0.5026, + "frequency": 6761018001, + "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, + "type": "qd" }, - "two_qubit": { - "2-3": { - "CZ": [ - { - "duration": 32, - "amplitude": -0.6025, - "shape": "Exponential(12, 5000, 0.1)", - "qubit": 3, - "type": "qf" - }, - { - "type": "virtual_z", - "phase": -3.63, - "qubit": 3 - }, - { - "type": "virtual_z", - "phase": -0.041, - "qubit": 2 - } - ] - }, - "0-2": { - "CZ": [ - { - "duration": 28, - "amplitude": -0.142, - "shape": "Exponential(12, 5000, 0.1)", - "qubit": 2, - "type": "qf" - } - ] - }, - "1-2": { - "CZ": [ - { - "duration": 32, - "amplitude": -0.6025, - "shape": "Exponential(12, 5000, 0.1)", - "qubit": 2, - "type": "qf" - }, - { - "type": "virtual_z", - "phase": -3.63, - "qubit": 1 - }, - { - "type": "virtual_z", - "phase": -0.041, - "qubit": 2 - } - ] - } + "RX12": { + "duration": 40, + "amplitude": 0.5026, + "frequency": 6761018001, + "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, + "type": "qd" + }, + "MZ": { + "duration": 2000, + "amplitude": 0.2, + "frequency": 7803441221, + "envelope": { "kind": "rectangular" }, + "type": "ro" } - }, - "characterization": { - "single_qubit": { - "0": { - "readout_frequency": 7213299307, - "drive_frequency": 5050304836, - "anharmonicity": 291463266, - "T1": 5857, - "T2": 0, - "sweetspot": 0.5507 - }, - "1": { - "readout_frequency": 7452990931, - "drive_frequency": 4852833073, - "anharmonicity": 292584018, - "T1": 1253, - "T2": 0, - "sweetspot": 0.2227, - "iq_angle": 146.297, - "threshold": 0.003488 - }, - "2": { - "readout_frequency": 7655083068, - "drive_frequency": 5795371914, - "anharmonicity": 276187576, - "T1": 4563, - "T2": 0, - "sweetspot": -0.378, - "iq_angle": 97.821, - "threshold": 0.002904 - }, - "3": { - "readout_frequency": 7803441221, - "drive_frequency": 6761018001, - "anharmonicity": 262310994, - "T1": 4232, - "T2": 0, - "sweetspot": -0.8899, - "iq_angle": 91.209, - "threshold": 0.004318 - }, - "4": { - "readout_frequency": 8058947261, - "drive_frequency": 6586543060, - "anharmonicity": 261390626, - "T1": 492, - "T2": 0, - "sweetspot": 0.589, - "iq_angle": 7.997, - "threshold": 0.002323 - } + }, + "4": { + "RX": { + "duration": 40, + "amplitude": 0.5172, + "frequency": 6586543060, + "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, + "type": "qd" + }, + "RX12": { + "duration": 40, + "amplitude": 0.5172, + "frequency": 6586543060, + "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, + "type": "qd" }, - "two_qubit":{ - "0-2": { - "gate_fidelity": [0.0, 0.0], - "cz_fidelity": [0.0, 0.0] + "MZ": { + "duration": 2000, + "amplitude": 0.4, + "frequency": 8058947261, + "envelope": { "kind": "rectangular" }, + "type": "ro" + } + } + }, + "two_qubit": { + "2-3": { + "CZ": [ + { + "duration": 32, + "amplitude": -0.6025, + "envelope": { + "kind": "exponential", + "tau": 12, + "upsilon": 5000, + "g": 0.1 }, - "1-2": { - "gate_fidelity": [0.0, 0.0], - "cz_fidelity": [0.0, 0.0] + "qubit": 3, + "type": "qf" + }, + { + "type": "vz", + "phase": -3.63, + "qubit": 3 + }, + { + "type": "vz", + "phase": -0.041, + "qubit": 2 + } + ] + }, + "0-2": { + "CZ": [ + { + "duration": 28, + "amplitude": -0.142, + "envelope": { + "kind": "exponential", + "tau": 12, + "upsilon": 5000, + "g": 0.1 }, - "2-3": { - "gate_fidelity": [0.0, 0.0], - "cz_fidelity": [0.0, 0.0] + "qubit": 2, + "type": "qf" + } + ] + }, + "1-2": { + "CZ": [ + { + "duration": 32, + "amplitude": -0.6025, + "envelope": { + "kind": "exponential", + "tau": 12, + "upsilon": 5000, + "g": 0.1 }, - "2-4": { - "gate_fidelity": [0.0, 0.0], - "cz_fidelity": [0.0, 0.0] - } - } + "qubit": 2, + "type": "qf" + }, + { + "type": "vz", + "phase": -3.63, + "qubit": 1 + }, + { + "type": "vz", + "phase": -0.041, + "qubit": 2 + } + ] + } + } + }, + "characterization": { + "single_qubit": { + "0": { + "readout_frequency": 7213299307, + "drive_frequency": 5050304836, + "anharmonicity": 291463266, + "T1": 5857, + "T2": 0, + "sweetspot": 0.5507 + }, + "1": { + "readout_frequency": 7452990931, + "drive_frequency": 4852833073, + "anharmonicity": 292584018, + "T1": 1253, + "T2": 0, + "sweetspot": 0.2227, + "iq_angle": 146.297, + "threshold": 0.003488 + }, + "2": { + "readout_frequency": 7655083068, + "drive_frequency": 5795371914, + "anharmonicity": 276187576, + "T1": 4563, + "T2": 0, + "sweetspot": -0.378, + "iq_angle": 97.821, + "threshold": 0.002904 + }, + "3": { + "readout_frequency": 7803441221, + "drive_frequency": 6761018001, + "anharmonicity": 262310994, + "T1": 4232, + "T2": 0, + "sweetspot": -0.8899, + "iq_angle": 91.209, + "threshold": 0.004318 + }, + "4": { + "readout_frequency": 8058947261, + "drive_frequency": 6586543060, + "anharmonicity": 261390626, + "T1": 492, + "T2": 0, + "sweetspot": 0.589, + "iq_angle": 7.997, + "threshold": 0.002323 + } + }, + "two_qubit": { + "0-2": { + "gate_fidelity": [0.0, 0.0], + "cz_fidelity": [0.0, 0.0] + }, + "1-2": { + "gate_fidelity": [0.0, 0.0], + "cz_fidelity": [0.0, 0.0] + }, + "2-3": { + "gate_fidelity": [0.0, 0.0], + "cz_fidelity": [0.0, 0.0] + }, + "2-4": { + "gate_fidelity": [0.0, 0.0], + "cz_fidelity": [0.0, 0.0] + } } + } } diff --git a/tests/dummy_qrc/qm/parameters.json b/tests/dummy_qrc/qm/parameters.json index 0d8fcfc2d0..d4a67753e4 100644 --- a/tests/dummy_qrc/qm/parameters.json +++ b/tests/dummy_qrc/qm/parameters.json @@ -1,328 +1,293 @@ { - "nqubits": 5, - "qubits": [ - 0, - 1, - 2, - 3, - 4 - ], - "settings": { - "nshots": 1024, - "relaxation_time": 50000 + "nqubits": 5, + "qubits": [0, 1, 2, 3, 4], + "settings": { + "nshots": 1024, + "relaxation_time": 50000 + }, + "topology": [ + [0, 2], + [1, 2], + [2, 3], + [2, 4] + ], + "instruments": { + "qm": { + "bounds": { + "waveforms": 10000, + "readout": 30, + "instructions": 1000000 + } }, - "topology": [ - [ - 0, - 2 - ], - [ - 1, - 2 - ], - [ - 2, - 3 - ], - [ - 2, - 4 - ] - ], - "instruments": { - "qm": { - "bounds": { - "waveforms" : 10000, - "readout": 30, - "instructions": 1000000 - } + "con1": { + "i1": { "gain": 0 }, + "i2": { "gain": 0 } + }, + "con2": { + "o2": { + "filter": { + "feedforward": [1.0684635881381783, -1.0163217174522334], + "feedback": [0.947858129314055] + } + }, + "i1": { "gain": 0 }, + "i2": { "gain": 0 } + }, + "lo_readout_a": { + "frequency": 7300000000, + "power": 18 + }, + "lo_readout_b": { + "frequency": 7900000000, + "power": 15 + }, + "lo_drive_low": { + "frequency": 4700000000, + "power": 16 + }, + "lo_drive_mid": { + "frequency": 5600000000, + "power": 16 + }, + "lo_drive_high": { + "frequency": 6500000000, + "power": 16 + }, + "twpa_a": { + "frequency": 6511000000, + "power": 4.5 + } + }, + "native_gates": { + "single_qubit": { + "0": { + "RX": { + "duration": 40, + "amplitude": 0.005, + "frequency": 4700000000, + "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, + "type": "qd" }, - "con1": { - "i1": {"gain": 0}, - "i2": {"gain": 0} + "RX12": { + "duration": 40, + "amplitude": 0.005, + "frequency": 4700000000, + "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, + "type": "qd" }, - "con2": { - "o2": { - "filter": { - "feedforward": [1.0684635881381783, -1.0163217174522334], - "feedback": [0.947858129314055] - } - }, - "i1": {"gain": 0}, - "i2": {"gain": 0} + "MZ": { + "duration": 1000, + "amplitude": 0.0025, + "frequency": 7226500000, + "envelope": { "kind": "rectangular" }, + "type": "ro" + } + }, + "1": { + "RX": { + "duration": 40, + "amplitude": 0.0484, + "frequency": 4855663000, + "envelope": { "kind": "drag", "rel_sigma": 0.2, "beta": 0.02 }, + "type": "qd" }, - "lo_readout_a": { - "frequency": 7300000000, - "power": 18 + "RX12": { + "duration": 40, + "amplitude": 0.0484, + "frequency": 4855663000, + "envelope": { "kind": "drag", "rel_sigma": 0.2, "beta": 0.02 }, + "type": "qd" }, - "lo_readout_b": { - "frequency": 7900000000, - "power": 15 + "MZ": { + "duration": 620, + "amplitude": 0.003575, + "frequency": 7453265000, + "envelope": { "kind": "rectangular" }, + "type": "ro" + } + }, + "2": { + "RX": { + "duration": 40, + "amplitude": 0.05682, + "frequency": 5800563000, + "envelope": { "kind": "drag", "rel_sigma": 0.2, "beta": 0.04 }, + "type": "qd" }, - "lo_drive_low": { - "frequency": 4700000000, - "power": 16 + "RX12": { + "duration": 40, + "amplitude": 0.05682, + "frequency": 5800563000, + "envelope": { "kind": "drag", "rel_sigma": 0.2, "beta": 0.04 }, + "type": "qd" }, - "lo_drive_mid": { - "frequency": 5600000000, - "power": 16 + "MZ": { + "duration": 960, + "amplitude": 0.00325, + "frequency": 7655107000, + "envelope": { "kind": "rectangular" }, + "type": "ro" + } + }, + "3": { + "RX": { + "duration": 40, + "amplitude": 0.138, + "frequency": 6760922000, + "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, + "type": "qd" }, - "lo_drive_high": { - "frequency": 6500000000, - "power": 16 + "RX12": { + "duration": 40, + "amplitude": 0.138, + "frequency": 6760922000, + "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, + "type": "qd" }, - "twpa_a": { - "frequency": 6511000000, - "power": 4.5 + "MZ": { + "duration": 960, + "amplitude": 0.004225, + "frequency": 7802191000, + "envelope": { "kind": "rectangular" }, + "type": "ro" } - }, - "native_gates": { - "single_qubit": { - "0": { - "RX": { - "duration": 40, - "amplitude": 0.005, - "frequency": 4700000000, - "shape": "Gaussian(5)", - "type": "qd"}, - "RX12": { - "duration": 40, - "amplitude": 0.005, - "frequency": 4700000000, - "shape": "Gaussian(5)", - "type": "qd" - }, - "MZ": { - "duration": 1000, - "amplitude": 0.0025, - "frequency": 7226500000, - "shape": "Rectangular()", - "type": "ro" - } - }, - "1": { - "RX": { - "duration": 40, - "amplitude": 0.0484, - "frequency": 4855663000, - "shape": "Drag(5, 0.02)", - "type": "qd" - }, - "RX12": { - "duration": 40, - "amplitude": 0.0484, - "frequency": 4855663000, - "shape": "Drag(5, 0.02)", - "type": "qd" - }, - "MZ": { - "duration": 620, - "amplitude": 0.003575, - "frequency": 7453265000, - "shape": "Rectangular()", - "type": "ro" - } - }, - "2": { - "RX": { - "duration": 40, - "amplitude": 0.05682, - "frequency": 5800563000, - "shape": "Drag(5, 0.04)", - "type": "qd" - }, - "RX12": { - "duration": 40, - "amplitude": 0.05682, - "frequency": 5800563000, - "shape": "Drag(5, 0.04)", - "type": "qd" - }, - "MZ": { - "duration": 960, - "amplitude": 0.00325, - "frequency": 7655107000, - "shape": "Rectangular()", - "type": "ro" - } - }, - "3": { - "RX": { - "duration": 40, - "amplitude": 0.138, - "frequency": 6760922000, - "shape": "Gaussian(5)", - "type": "qd" - }, - "RX12": { - "duration": 40, - "amplitude": 0.138, - "frequency": 6760922000, - "shape": "Gaussian(5)", - "type": "qd" - }, - "MZ": { - "duration": 960, - "amplitude": 0.004225, - "frequency": 7802191000, - "shape": "Rectangular()", - "type": "ro" - } - }, - "4": { - "RX": { - "duration": 40, - "amplitude": 0.0617, - "frequency": 6585053000, - "shape": "Drag(5, 0)", - "type": "qd" - }, - "RX12": { - "duration": 40, - "amplitude": 0.0617, - "frequency": 6585053000, - "shape": "Drag(5, 0)", - "type": "qd" - }, - "MZ": { - "duration": 640, - "amplitude": 0.0039, - "frequency": 8057668000, - "shape": "Rectangular()", - "type": "ro" - } - } + }, + "4": { + "RX": { + "duration": 40, + "amplitude": 0.0617, + "frequency": 6585053000, + "envelope": { "kind": "drag", "rel_sigma": 0.2, "beta": 0 }, + "type": "qd" }, - "two_qubit": { - "1-2": { - "CZ": [ - { - "duration": 30, - "amplitude": 0.055, - "shape": "Rectangular()", - "qubit": 2, - "type": "qf" - }, - { - "type": "virtual_z", - "phase": -1.5707963267948966, - "qubit": 1 - }, - { - "type": "virtual_z", - "phase": -1.5707963267948966, - "qubit": 2 - } - ] - }, - "2-3": { - "CZ": [ - { - "duration": 32, - "amplitude": -0.0513, - "shape": "Rectangular()", - "qubit": 3, - "type": "qf" - }, - { - "type": "virtual_z", - "phase": -1.5707963267948966, - "qubit": 2 - }, - { - "type": "virtual_z", - "phase": -1.5707963267948966, - "qubit": 3 - } - ] - } - } - }, - "characterization": { - "single_qubit": { - "0": { - "readout_frequency": 0.0, - "drive_frequency": 0.0, - "T1": 0.0, - "T2": 0.0, - "sweetspot": 0.0, - "threshold": 0.0, - "iq_angle": 0.0, - "mixer_drive_g": 0.0, - "mixer_drive_phi": 0.0, - "mixer_readout_g": 0.0, - "mixer_readout_phi": 0.0 - }, - "1": { - "readout_frequency": 7453265000, - "drive_frequency": 4855663000, - "T1": 0.0, - "T2": 0.0, - "sweetspot": -0.047, - "threshold": 0.00028502261712637096, - "iq_angle": 1.283105298787488, - "mixer_drive_g": 0.0, - "mixer_drive_phi": 0.0, - "mixer_readout_g": 0.0, - "mixer_readout_phi": 0.0 - }, - "2": { - "readout_frequency": 7655107000, - "drive_frequency": 5799876000, - "T1": 0.0, - "T2": 0.0, - "sweetspot": -0.045, - "threshold": 0.0002694329123116206, - "iq_angle": 4.912447775569025, - "mixer_drive_g": 0.0, - "mixer_drive_phi": 0.0, - "mixer_readout_g": 0.0, - "mixer_readout_phi": 0.0 - }, - "3": { - "readout_frequency": 7802391000, - "drive_frequency": 6760700000, - "T1": 0.0, - "T2": 0.0, - "sweetspot": 0.034, - "threshold": 0.0003363427381347193, - "iq_angle": 1.6124890998581591, - "mixer_drive_g": 0.0, - "mixer_drive_phi": 0.0, - "mixer_readout_g": 0.0, - "mixer_readout_phi": 0.0 - }, - "4": { - "readout_frequency": 8057668000, - "drive_frequency": 6585053000, - "T1": 0.0, - "T2": 0.0, - "sweetspot": -0.057, - "threshold": 0.00013079660165463033, - "iq_angle": 5.6303684840135, - "mixer_drive_g": 0.0, - "mixer_drive_phi": 0.0, - "mixer_readout_g": 0.0, - "mixer_readout_phi": 0.0 - } + "RX12": { + "duration": 40, + "amplitude": 0.0617, + "frequency": 6585053000, + "envelope": { "kind": "drag", "rel_sigma": 0.2, "beta": 0 }, + "type": "qd" }, - "two_qubit":{ - "0-2": { - "gate_fidelity": [0.0, 0.0], - "cz_fidelity": [0.0, 0.0] - }, - "1-2": { - "gate_fidelity": [0.0, 0.0], - "cz_fidelity": [0.0, 0.0] - }, - "2-3": { - "gate_fidelity": [0.0, 0.0], - "cz_fidelity": [0.0, 0.0] - }, - "2-4": { - "gate_fidelity": [0.0, 0.0], - "cz_fidelity": [0.0, 0.0] - } + "MZ": { + "duration": 640, + "amplitude": 0.0039, + "frequency": 8057668000, + "envelope": { "kind": "rectangular" }, + "type": "ro" } + } + }, + "two_qubit": { + "1-2": { + "CZ": [ + { + "duration": 30, + "amplitude": 0.055, + "envelope": { "kind": "rectangular" }, + "qubit": 2, + "type": "qf" + }, + { + "type": "vz", + "phase": -1.5707963267948966, + "qubit": 1 + }, + { + "type": "vz", + "phase": -1.5707963267948966, + "qubit": 2 + } + ] + }, + "2-3": { + "CZ": [ + { + "duration": 32, + "amplitude": -0.0513, + "envelope": { "kind": "rectangular" }, + "qubit": 3, + "type": "qf" + }, + { + "type": "vz", + "phase": -1.5707963267948966, + "qubit": 2 + }, + { + "type": "vz", + "phase": -1.5707963267948966, + "qubit": 3 + } + ] + } + } + }, + "characterization": { + "single_qubit": { + "0": { + "readout_frequency": 0.0, + "drive_frequency": 0.0, + "T1": 0.0, + "T2": 0.0, + "sweetspot": 0.0, + "threshold": 0.0, + "iq_angle": 0.0, + "mixer_drive_g": 0.0, + "mixer_drive_phi": 0.0, + "mixer_readout_g": 0.0, + "mixer_readout_phi": 0.0 + }, + "1": { + "readout_frequency": 7453265000, + "drive_frequency": 4855663000, + "T1": 0.0, + "T2": 0.0, + "sweetspot": -0.047, + "threshold": 0.00028502261712637096, + "iq_angle": 1.283105298787488, + "mixer_drive_g": 0.0, + "mixer_drive_phi": 0.0, + "mixer_readout_g": 0.0, + "mixer_readout_phi": 0.0 + }, + "2": { + "readout_frequency": 7655107000, + "drive_frequency": 5799876000, + "T1": 0.0, + "T2": 0.0, + "sweetspot": -0.045, + "threshold": 0.0002694329123116206, + "iq_angle": 4.912447775569025, + "mixer_drive_g": 0.0, + "mixer_drive_phi": 0.0, + "mixer_readout_g": 0.0, + "mixer_readout_phi": 0.0 + }, + "3": { + "readout_frequency": 7802391000, + "drive_frequency": 6760700000, + "T1": 0.0, + "T2": 0.0, + "sweetspot": 0.034, + "threshold": 0.0003363427381347193, + "iq_angle": 1.6124890998581591, + "mixer_drive_g": 0.0, + "mixer_drive_phi": 0.0, + "mixer_readout_g": 0.0, + "mixer_readout_phi": 0.0 + }, + "4": { + "readout_frequency": 8057668000, + "drive_frequency": 6585053000, + "T1": 0.0, + "T2": 0.0, + "sweetspot": -0.057, + "threshold": 0.00013079660165463033, + "iq_angle": 5.6303684840135, + "mixer_drive_g": 0.0, + "mixer_drive_phi": 0.0, + "mixer_readout_g": 0.0, + "mixer_readout_phi": 0.0 + } } + } } diff --git a/tests/dummy_qrc/qm_octave/parameters.json b/tests/dummy_qrc/qm_octave/parameters.json index 523ddb92d8..a772204980 100644 --- a/tests/dummy_qrc/qm_octave/parameters.json +++ b/tests/dummy_qrc/qm_octave/parameters.json @@ -1,336 +1,315 @@ { - "nqubits": 5, - "qubits": [ - 0, - 1, - 2, - 3, - 4 - ], - "settings": { - "nshots": 1024, - "relaxation_time": 50000 + "nqubits": 5, + "qubits": [0, 1, 2, 3, 4], + "settings": { + "nshots": 1024, + "relaxation_time": 50000 + }, + "topology": [ + [0, 2], + [1, 2], + [2, 3], + [2, 4] + ], + "instruments": { + "qm": { + "bounds": { + "waveforms": 10000, + "readout": 30, + "instructions": 1000000 + } }, - "topology": [ - [ - 0, - 2 - ], - [ - 1, - 2 - ], - [ - 2, - 3 - ], - [ - 2, - 4 - ] - ], - "instruments": { - "qm": { - "bounds": { - "waveforms" : 10000, - "readout": 30, - "instructions": 1000000 - } + "con1": { + "i1": { + "gain": 0 + }, + "i2": { + "gain": 0 + } + }, + "con2": { + "i1": { + "gain": 0 + }, + "i2": { + "gain": 0 + } + }, + "octave1": { + "o1": { + "lo_frequency": 4700000000, + "gain": 0 + }, + "o2": { + "lo_frequency": 5600000000, + "gain": 0 + }, + "o3": { + "lo_frequency": 6500000000, + "gain": 0 + }, + "o4": { + "lo_frequency": 6500000000, + "gain": 0 + }, + "o5": { + "lo_frequency": 7300000000, + "gain": 0 + }, + "i1": { + "lo_frequency": 7300000000 + } + }, + "octave2": { + "o5": { + "lo_frequency": 7900000000, + "gain": 0 + }, + "i1": { + "lo_frequency": 7900000000 + } + }, + "octave3": { + "o1": { + "lo_frequency": 4700000000, + "gain": 0 + } + }, + "twpa_a": { + "frequency": 6511000000, + "power": 4.5 + } + }, + "native_gates": { + "single_qubit": { + "0": { + "RX": { + "duration": 40, + "amplitude": 0.005, + "frequency": 4700000000, + "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, + "type": "qd" }, - "con1": { - "i1": { - "gain": 0 - }, - "i2": { - "gain": 0 - } + "RX12": { + "duration": 40, + "amplitude": 0.005, + "frequency": 4700000000, + "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, + "type": "qd" }, - "con2": { - "i1": { - "gain": 0 - }, - "i2": { - "gain": 0 - } + "MZ": { + "duration": 1000, + "amplitude": 0.0025, + "frequency": 7226500000, + "envelope": { "kind": "rectangular" }, + "type": "ro" + } + }, + "1": { + "RX": { + "duration": 40, + "amplitude": 0.0484, + "frequency": 4855663000, + "envelope": { "kind": "drag", "rel_sigma": 0.2, "beta": 0.02 }, + "type": "qd" }, - "octave1": { - "o1": { - "lo_frequency": 4700000000, - "gain": 0 - }, - "o2": { - "lo_frequency": 5600000000, - "gain": 0 - }, - "o3": { - "lo_frequency": 6500000000, - "gain": 0 - }, - "o4": { - "lo_frequency": 6500000000, - "gain": 0 - }, - "o5": { - "lo_frequency": 7300000000, - "gain": 0 - }, - "i1": { - "lo_frequency": 7300000000 - } + "RX12": { + "duration": 40, + "amplitude": 0.0484, + "frequency": 4855663000, + "envelope": { "kind": "drag", "rel_sigma": 0.2, "beta": 0.02 }, + "type": "qd" }, - "octave2": { - "o5": { - "lo_frequency": 7900000000, - "gain": 0 - }, - "i1": { - "lo_frequency": 7900000000 - } + "MZ": { + "duration": 620, + "amplitude": 0.003575, + "frequency": 7453265000, + "envelope": { "kind": "rectangular" }, + "type": "ro" + } + }, + "2": { + "RX": { + "duration": 40, + "amplitude": 0.05682, + "frequency": 5800563000, + "envelope": { "kind": "drag", "rel_sigma": 0.2, "beta": 0.04 }, + "type": "qd" }, - "octave3": { - "o1": { - "lo_frequency": 4700000000, - "gain": 0 - } + "RX12": { + "duration": 40, + "amplitude": 0.05682, + "frequency": 5800563000, + "envelope": { "kind": "drag", "rel_sigma": 0.2, "beta": 0.04 }, + "type": "qd" }, - "twpa_a": { - "frequency": 6511000000, - "power": 4.5 + "MZ": { + "duration": 960, + "amplitude": 0.00325, + "frequency": 7655107000, + "envelope": { "kind": "rectangular" }, + "type": "ro" } - }, - "native_gates": { - "single_qubit": { - "0": { - "RX": { - "duration": 40, - "amplitude": 0.005, - "frequency": 4700000000, - "shape": "Gaussian(5)", - "type": "qd"}, - "RX12": { - "duration": 40, - "amplitude": 0.005, - "frequency": 4700000000, - "shape": "Gaussian(5)", - "type": "qd"}, - "MZ": { - "duration": 1000, - "amplitude": 0.0025, - "frequency": 7226500000, - "shape": "Rectangular()", - "type": "ro"} - }, - "1": { - "RX": { - "duration": 40, - "amplitude": 0.0484, - "frequency": 4855663000, - "shape": "Drag(5, 0.02)", - "type": "qd"}, - "RX12": { - "duration": 40, - "amplitude": 0.0484, - "frequency": 4855663000, - "shape": "Drag(5, 0.02)", - "type": "qd"}, - "MZ": { - "duration": 620, - "amplitude": 0.003575, - "frequency": 7453265000, - "shape": "Rectangular()", - "type": "ro"} - }, - "2": { - "RX": { - "duration": 40, - "amplitude": 0.05682, - "frequency": 5800563000, - "shape": "Drag(5, 0.04)", - "type": "qd"}, - "RX12": { - "duration": 40, - "amplitude": 0.05682, - "frequency": 5800563000, - "shape": "Drag(5, 0.04)", - "type": "qd"}, - "MZ": { - "duration": 960, - "amplitude": 0.00325, - "frequency": 7655107000, - "shape": "Rectangular()", - "type": "ro"} - }, - "3": { - "RX": { - "duration": 40, - "amplitude": 0.138, - "frequency": 6760922000, - "shape": "Gaussian(5)", - "type": "qd"}, - "RX12": { - "duration": 40, - "amplitude": 0.138, - "frequency": 6760922000, - "shape": "Gaussian(5)", - "type": "qd"}, - "MZ": { - "duration": 960, - "amplitude": 0.004225, - "frequency": 7802191000, - "shape": "Rectangular()", - "type": "ro"} - }, - "4": { - "RX": { - "duration": 40, - "amplitude": 0.0617, - "frequency": 6585053000, - "shape": "Drag(5, 0)", - "type": "qd"}, - "RX12": { - "duration": 40, - "amplitude": 0.0617, - "frequency": 6585053000, - "shape": "Drag(5, 0)", - "type": "qd"}, - "MZ": { - "duration": 640, - "amplitude": 0.0039, - "frequency": 8057668000, - "shape": "Rectangular()", - "type": "ro"} - } + }, + "3": { + "RX": { + "duration": 40, + "amplitude": 0.138, + "frequency": 6760922000, + "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, + "type": "qd" + }, + "RX12": { + "duration": 40, + "amplitude": 0.138, + "frequency": 6760922000, + "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, + "type": "qd" }, - "two_qubit": { - "1-2": { - "CZ": [ - { - "duration": 30, - "amplitude": 0.055, - "shape": "Rectangular()", - "qubit": 2, - "type": "qf" - }, - { - "type": "virtual_z", - "phase": -1.5707963267948966, - "qubit": 1 - }, - { - "type": "virtual_z", - "phase": -1.5707963267948966, - "qubit": 2 - } - ] - }, - "2-3": { - "CZ": [ - { - "duration": 32, - "amplitude": -0.0513, - "shape": "Rectangular()", - "qubit": 3, - "type": "qf" - }, - { - "type": "virtual_z", - "phase": -1.5707963267948966, - "qubit": 2 - }, - { - "type": "virtual_z", - "phase": -1.5707963267948966, - "qubit": 3 - } - ] - } + "MZ": { + "duration": 960, + "amplitude": 0.004225, + "frequency": 7802191000, + "envelope": { "kind": "rectangular" }, + "type": "ro" } - }, - "characterization": { - "single_qubit": { - "0": { - "readout_frequency": 0.0, - "drive_frequency": 0.0, - "T1": 0.0, - "T2": 0.0, - "sweetspot": 0.0, - "threshold": 0.0, - "iq_angle": 0.0, - "mixer_drive_g": 0.0, - "mixer_drive_phi": 0.0, - "mixer_readout_g": 0.0, - "mixer_readout_phi": 0.0 - }, - "1": { - "readout_frequency": 7453265000, - "drive_frequency": 4855663000, - "T1": 0.0, - "T2": 0.0, - "sweetspot": -0.047, - "threshold": 0.00028502261712637096, - "iq_angle": 1.283105298787488, - "mixer_drive_g": 0.0, - "mixer_drive_phi": 0.0, - "mixer_readout_g": 0.0, - "mixer_readout_phi": 0.0 - }, - "2": { - "readout_frequency": 7655107000, - "drive_frequency": 5799876000, - "T1": 0.0, - "T2": 0.0, - "sweetspot": -0.045, - "threshold": 0.0002694329123116206, - "iq_angle": 4.912447775569025, - "mixer_drive_g": 0.0, - "mixer_drive_phi": 0.0, - "mixer_readout_g": 0.0, - "mixer_readout_phi": 0.0 - }, - "3": { - "readout_frequency": 7802391000, - "drive_frequency": 6760700000, - "T1": 0.0, - "T2": 0.0, - "sweetspot": 0.034, - "threshold": 0.0003363427381347193, - "iq_angle": 1.6124890998581591, - "mixer_drive_g": 0.0, - "mixer_drive_phi": 0.0, - "mixer_readout_g": 0.0, - "mixer_readout_phi": 0.0 - }, - "4": { - "readout_frequency": 8057668000, - "drive_frequency": 6585053000, - "T1": 0.0, - "T2": 0.0, - "sweetspot": -0.057, - "threshold": 0.00013079660165463033, - "iq_angle": 5.6303684840135, - "mixer_drive_g": 0.0, - "mixer_drive_phi": 0.0, - "mixer_readout_g": 0.0, - "mixer_readout_phi": 0.0 - } + }, + "4": { + "RX": { + "duration": 40, + "amplitude": 0.0617, + "frequency": 6585053000, + "envelope": { "kind": "drag", "rel_sigma": 0.2, "beta": 0 }, + "type": "qd" + }, + "RX12": { + "duration": 40, + "amplitude": 0.0617, + "frequency": 6585053000, + "envelope": { "kind": "drag", "rel_sigma": 0.2, "beta": 0 }, + "type": "qd" }, - "two_qubit":{ - "0-2": { - "gate_fidelity": [0.0, 0.0], - "cz_fidelity": [0.0, 0.0] - }, - "1-2": { - "gate_fidelity": [0.0, 0.0], - "cz_fidelity": [0.0, 0.0] - }, - "2-3": { - "gate_fidelity": [0.0, 0.0], - "cz_fidelity": [0.0, 0.0] - }, - "2-4": { - "gate_fidelity": [0.0, 0.0], - "cz_fidelity": [0.0, 0.0] - } + "MZ": { + "duration": 640, + "amplitude": 0.0039, + "frequency": 8057668000, + "envelope": { "kind": "rectangular" }, + "type": "ro" } + } + }, + "two_qubit": { + "1-2": { + "CZ": [ + { + "duration": 30, + "amplitude": 0.055, + "envelope": { "kind": "rectangular" }, + "qubit": 2, + "type": "qf" + }, + { + "type": "vz", + "phase": -1.5707963267948966, + "qubit": 1 + }, + { + "type": "vz", + "phase": -1.5707963267948966, + "qubit": 2 + } + ] + }, + "2-3": { + "CZ": [ + { + "duration": 32, + "amplitude": -0.0513, + "envelope": { "kind": "rectangular" }, + "qubit": 3, + "type": "qf" + }, + { + "type": "vz", + "phase": -1.5707963267948966, + "qubit": 2 + }, + { + "type": "vz", + "phase": -1.5707963267948966, + "qubit": 3 + } + ] + } + } + }, + "characterization": { + "single_qubit": { + "0": { + "readout_frequency": 0.0, + "drive_frequency": 0.0, + "T1": 0.0, + "T2": 0.0, + "sweetspot": 0.0, + "threshold": 0.0, + "iq_angle": 0.0, + "mixer_drive_g": 0.0, + "mixer_drive_phi": 0.0, + "mixer_readout_g": 0.0, + "mixer_readout_phi": 0.0 + }, + "1": { + "readout_frequency": 7453265000, + "drive_frequency": 4855663000, + "T1": 0.0, + "T2": 0.0, + "sweetspot": -0.047, + "threshold": 0.00028502261712637096, + "iq_angle": 1.283105298787488, + "mixer_drive_g": 0.0, + "mixer_drive_phi": 0.0, + "mixer_readout_g": 0.0, + "mixer_readout_phi": 0.0 + }, + "2": { + "readout_frequency": 7655107000, + "drive_frequency": 5799876000, + "T1": 0.0, + "T2": 0.0, + "sweetspot": -0.045, + "threshold": 0.0002694329123116206, + "iq_angle": 4.912447775569025, + "mixer_drive_g": 0.0, + "mixer_drive_phi": 0.0, + "mixer_readout_g": 0.0, + "mixer_readout_phi": 0.0 + }, + "3": { + "readout_frequency": 7802391000, + "drive_frequency": 6760700000, + "T1": 0.0, + "T2": 0.0, + "sweetspot": 0.034, + "threshold": 0.0003363427381347193, + "iq_angle": 1.6124890998581591, + "mixer_drive_g": 0.0, + "mixer_drive_phi": 0.0, + "mixer_readout_g": 0.0, + "mixer_readout_phi": 0.0 + }, + "4": { + "readout_frequency": 8057668000, + "drive_frequency": 6585053000, + "T1": 0.0, + "T2": 0.0, + "sweetspot": -0.057, + "threshold": 0.00013079660165463033, + "iq_angle": 5.6303684840135, + "mixer_drive_g": 0.0, + "mixer_drive_phi": 0.0, + "mixer_readout_g": 0.0, + "mixer_readout_phi": 0.0 + } } + } } diff --git a/tests/dummy_qrc/rfsoc/parameters.json b/tests/dummy_qrc/rfsoc/parameters.json index 024e1ee0c9..eb1b24813d 100644 --- a/tests/dummy_qrc/rfsoc/parameters.json +++ b/tests/dummy_qrc/rfsoc/parameters.json @@ -1,77 +1,70 @@ { - "nqubits": 1, - "qubits": [ - 0 - ], - "topology": [], - "settings": { - "nshots": 1024, - "relaxation_time": 100000 + "nqubits": 1, + "qubits": [0], + "topology": [], + "settings": { + "nshots": 1024, + "relaxation_time": 100000 + }, + "instruments": { + "tii_rfsoc4x2": { + "bounds": { + "waveforms": 0, + "readout": 0, + "instructions": 0 + } }, - "instruments": { - "tii_rfsoc4x2": { - "bounds": { - "waveforms": 0, - "readout": 0, - "instructions": 0 - } + "twpa_a": { + "frequency": 6200000000, + "power": -1 + }, + "ErasynthLO": { + "frequency": 0, + "power": 0 + } + }, + "native_gates": { + "single_qubit": { + "0": { + "RX": { + "duration": 30, + "amplitude": 0.05284168507293318, + "frequency": 5542341844, + "envelope": { "kind": "rectangular" }, + "type": "qd" }, - "twpa_a": { - "frequency": 6200000000, - "power": -1 + "RX12": { + "duration": 30, + "amplitude": 0.05284168507293318, + "frequency": 5542341844, + "envelope": { "kind": "rectangular" }, + "type": "qd" }, - "ErasynthLO": { - "frequency": 0, - "power": 0 + "MZ": { + "duration": 600, + "amplitude": 0.03, + "frequency": 7371258599, + "envelope": { "kind": "rectangular" }, + "type": "ro" } + } }, - "native_gates": { - "single_qubit": { - "0": { - "RX": { - "duration": 30, - "amplitude": 0.05284168507293318, - "frequency": 5542341844, - "shape": "Rectangular()", - "type": "qd" - }, - "RX12": { - "duration": 30, - "amplitude": 0.05284168507293318, - "frequency": 5542341844, - "shape": "Rectangular()", - "type": "qd" - }, - "MZ": { - "duration": 600, - "amplitude": 0.03, - "frequency": 7371258599, - "shape": "Rectangular()", - "type": "ro" - } - } - } - }, - "characterization": { - "single_qubit": { - "0": { - "readout_frequency": 7371258599, - "drive_frequency": 5542341844, - "pi_pulse_amplitude": 0.05284168507293318, - "T1": 10441.64173639732, - "T2": 4083.4697338939845, - "threshold": -0.8981346462690887, - "iq_angle": -1.2621946150226666, - "mean_gnd_states": [ - -0.17994037940379404, - -2.4709365853658536 - ], - "mean_exc_states": [ - 0.6854460704607047, - 0.24369105691056914 - ], - "T2_spin_echo": 5425.5448969467925 - } - } + "two_qubit": {} + }, + "characterization": { + "single_qubit": { + "0": { + "readout_frequency": 7371258599, + "drive_frequency": 5542341844, + "pi_pulse_amplitude": 0.05284168507293318, + "T1": 10441.64173639732, + "T2": 4083.4697338939845, + "threshold": -0.8981346462690887, + "iq_angle": -1.2621946150226666, + "mean_gnd_states": [-0.17994037940379404, -2.4709365853658536], + "mean_exc_states": [0.6854460704607047, 0.24369105691056914], + "T2_spin_echo": 5425.5448969467925 + } } + } } diff --git a/tests/dummy_qrc/zurich/parameters.json b/tests/dummy_qrc/zurich/parameters.json index 3aee23e2ae..3ab0c3c07d 100644 --- a/tests/dummy_qrc/zurich/parameters.json +++ b/tests/dummy_qrc/zurich/parameters.json @@ -1,337 +1,286 @@ { - "nqubits": 5, - "qubits": [ - 0, - 1, - 2, - 3, - 4 - ], - "couplers": [ - 0, - 1, - 3, - 4 - ], - "topology": { - "0": [ - 0, - 2 - ], - "1": [ - 1, - 2 - ], - "3": [ - 2, - 3 - ], - "4": [ - 2, - 4 - ] + "nqubits": 5, + "qubits": [0, 1, 2, 3, 4], + "couplers": [0, 1, 3, 4], + "topology": { + "0": [0, 2], + "1": [1, 2], + "3": [2, 3], + "4": [2, 4] + }, + "settings": { + "nshots": 4096, + "relaxation_time": 300000 + }, + "instruments": { + "EL_ZURO": { + "bounds": { + "instructions": 1000000, + "readout": 250, + "waveforms": 40000 + } + }, + "lo_readout": { + "frequency": 5500000000 + }, + "lo_drive_0": { + "frequency": 4200000000 }, - "settings": { - "nshots": 4096, - "relaxation_time": 300000 + "lo_drive_1": { + "frequency": 4600000000 }, - "instruments": { - "EL_ZURO": { - "bounds": { - "instructions": 1000000, - "readout": 250, - "waveforms": 40000 - } + "lo_drive_2": { + "frequency": 4800000000 + } + }, + "native_gates": { + "single_qubit": { + "0": { + "RX": { + "duration": 40, + "amplitude": 0.625, + "frequency": 4095830788, + "envelope": { "kind": "drag", "rel_sigma": 0.2, "beta": 0.04 }, + "type": "qd" }, - "lo_readout": { - "frequency": 5500000000 + "RX12": { + "duration": 40, + "amplitude": 0.625, + "frequency": 4095830788, + "envelope": { "kind": "drag", "rel_sigma": 0.2, "beta": 0.04 }, + "type": "qd" }, - "lo_drive_0": { - "frequency": 4200000000 + "MZ": { + "duration": 2000, + "amplitude": 0.5, + "frequency": 5229200000, + "envelope": { "kind": "rectangular" }, + "type": "ro" + } + }, + "1": { + "RX": { + "duration": 90, + "amplitude": 0.2, + "frequency": 4170000000, + "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, + "type": "qd" }, - "lo_drive_1": { - "frequency": 4600000000 + "RX12": { + "duration": 90, + "amplitude": 0.2, + "frequency": 4170000000, + "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, + "type": "qd" }, - "lo_drive_2": { - "frequency": 4800000000 + "MZ": { + "duration": 1000, + "amplitude": 0.1, + "frequency": 4931000000, + "envelope": { "kind": "rectangular" }, + "type": "ro" } - }, - "native_gates": { - "single_qubit": { - "0": { - "RX": { - "duration": 40, - "amplitude": 0.625, - "frequency": 4095830788, - "shape": "Drag(5, 0.04)", - "type": "qd"}, - "RX12": { - "duration": 40, - "amplitude": 0.625, - "frequency": 4095830788, - "shape": "Drag(5, 0.04)", - "type": "qd"}, - "MZ": { - "duration": 2000, - "amplitude": 0.5, - "frequency": 5229200000, - "shape": "Rectangular()", - "type": "ro"} - }, - "1": { - "RX": { - "duration": 90, - "amplitude": 0.2, - "frequency": 4170000000, - "shape": "Gaussian(5)", - "type": "qd"}, - "RX12": { - "duration": 90, - "amplitude": 0.2, - "frequency": 4170000000, - "shape": "Gaussian(5)", - "type": "qd"}, - "MZ": { - "duration": 1000, - "amplitude": 0.1, - "frequency": 4931000000, - "shape": "Rectangular()", - "type": "ro"} - }, - "2": { - "RX": { - "duration": 40, - "amplitude": 0.59, - "frequency": 4300587281, - "shape": "Gaussian(5)", - "type": "qd"}, - "RX12": { - "duration": 40, - "amplitude": 0.59, - "frequency": 4300587281, - "shape": "Gaussian(5)", - "type": "qd"}, - "MZ": { - "duration": 2000, - "amplitude": 0.54, - "frequency": 6109000000.0, - "shape": "Rectangular()", - "type": "ro"} - }, - "3": { - "RX": { - "duration": 90, - "amplitude": 0.75, - "frequency": 4100000000, - "shape": "Gaussian(5)", - "type": "qd"}, - "RX12": { - "duration": 90, - "amplitude": 0.75, - "frequency": 4100000000, - "shape": "Gaussian(5)", - "type": "qd"}, - "MZ": { - "duration": 2000, - "amplitude": 0.01, - "frequency": 5783000000, - "shape": "Rectangular()", - "type": "ro"} - }, - "4": { - "RX": { - "duration": 53, - "amplitude": 1, - "frequency": 4196800000, - "shape": "Gaussian(5)", - "type": "qd"}, - "RX12": { - "duration": 53, - "amplitude": 1, - "frequency": 4196800000, - "shape": "Gaussian(5)", - "type": "qd"}, - "MZ": { - "duration": 1000, - "amplitude": 0.5, - "frequency": 5515000000, - "shape": "Rectangular()", - "type": "ro"} - } + }, + "2": { + "RX": { + "duration": 40, + "amplitude": 0.59, + "frequency": 4300587281, + "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, + "type": "qd" }, - "coupler": { - "0": { - "CP": { - "type": "cf", - "duration": 1000, - "amplitude": 0.5, - "shape": "Rectangular()" - } - }, - "1": { - "CP": { - "type": "cf", - "duration": 1000, - "amplitude": 0.5, - "shape": "Rectangular()" - } - }, - "3": { - "CP": { - "type": "cf", - "duration": 1000, - "amplitude": 0.5, - "shape": "Rectangular()" - } - }, - "4": { - "CP": { - "type": "cf", - "duration": 1000, - "amplitude": 0.5, - "shape": "Rectangular()" - } - } + "RX12": { + "duration": 40, + "amplitude": 0.59, + "frequency": 4300587281, + "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, + "type": "qd" }, - "two_qubit": { - "1-2": { - "CZ": [ - { - "duration": 32, - "amplitude": -0.6025, - "shape": "Exponential(12, 5000, 0.1)", - "qubit": 3, - "type": "qf" - }, - { - "type": "virtual_z", - "phase": -3.63, - "qubit": 1 - }, - { - "type": "virtual_z", - "phase": -0.041, - "qubit": 2 - } - ] - } + "MZ": { + "duration": 2000, + "amplitude": 0.54, + "frequency": 6109000000.0, + "envelope": { "kind": "rectangular" }, + "type": "ro" } - }, - "characterization": { - "single_qubit": { - "0": { - "readout_frequency": 5229200000, - "drive_frequency": 4095830788, - "T1": 0.0, - "T2": 0.0, - "sweetspot": 0.05, - "mean_gnd_states": [ - 1.542, - 0.1813 - ], - "mean_exc_states": [ - 2.4499, - -0.5629 - ], - "threshold": 0.8836, - "iq_angle": -1.551 - }, - "1": { - "readout_frequency": 4931000000, - "drive_frequency": 4170000000, - "T1": 0.0, - "T2": 0.0, - "sweetspot": 0.0, - "mean_gnd_states": [ - 0, - 0 - ], - "mean_exc_states": [ - 0, - 0 - ] - }, - "2": { - "readout_frequency": 6109000000.0, - "drive_frequency": 4300587281, - "T1": 0.0, - "T2": 0.0, - "sweetspot": 0.0, - "mean_gnd_states": [ - -1.8243, - 1.5926 - ], - "mean_exc_states": [ - -0.8083, - 2.3929 - ], - "threshold": -0.0593, - "iq_angle": -0.667 - }, - "3": { - "readout_frequency": 5783000000, - "drive_frequency": 4100000000, - "T1": 0.0, - "T2": 0.0, - "sweetspot": 0.0, - "mean_gnd_states": [ - 0, - 0 - ], - "mean_exc_states": [ - 0, - 0 - ] - }, - "4": { - "readout_frequency": 5515000000, - "drive_frequency": 4196800000, - "T1": 0.0, - "T2": 0.0, - "sweetspot": 0.0, - "mean_gnd_states": [ - 0, - 0 - ], - "mean_exc_states": [ - 0, - 0 - ], - "threshold": 0.233806, - "iq_angle": 0.481 - } + }, + "3": { + "RX": { + "duration": 90, + "amplitude": 0.75, + "frequency": 4100000000, + "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, + "type": "qd" }, - "two_qubit":{ - "0-2": { - "gate_fidelity": [0.0, 0.0], - "cz_fidelity": [0.0, 0.0] - }, - "1-2": { - "gate_fidelity": [0.0, 0.0], - "cz_fidelity": [0.0, 0.0] - }, - "2-3": { - "gate_fidelity": [0.0, 0.0], - "cz_fidelity": [0.0, 0.0] - }, - "2-4": { - "gate_fidelity": [0.0, 0.0], - "cz_fidelity": [0.0, 0.0] - } + "RX12": { + "duration": 90, + "amplitude": 0.75, + "frequency": 4100000000, + "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, + "type": "qd" }, - "coupler": { - "0": { - "sweetspot": 0.0 - }, - "1": { - "sweetspot": 0.0 - }, - "3": { - "sweetspot": 0.0 - }, - "4": { - "sweetspot": 0.0 - } + "MZ": { + "duration": 2000, + "amplitude": 0.01, + "frequency": 5783000000, + "envelope": { "kind": "rectangular" }, + "type": "ro" + } + }, + "4": { + "RX": { + "duration": 53, + "amplitude": 1, + "frequency": 4196800000, + "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, + "type": "qd" + }, + "RX12": { + "duration": 53, + "amplitude": 1, + "frequency": 4196800000, + "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, + "type": "qd" + }, + "MZ": { + "duration": 1000, + "amplitude": 0.5, + "frequency": 5515000000, + "envelope": { "kind": "rectangular" }, + "type": "ro" + } + } + }, + "coupler": { + "0": { + "CP": { + "type": "cf", + "duration": 1000, + "amplitude": 0.5, + "envelope": { "kind": "rectangular" } + } + }, + "1": { + "CP": { + "type": "cf", + "duration": 1000, + "amplitude": 0.5, + "envelope": { "kind": "rectangular" } + } + }, + "3": { + "CP": { + "type": "cf", + "duration": 1000, + "amplitude": 0.5, + "envelope": { "kind": "rectangular" } } + }, + "4": { + "CP": { + "type": "cf", + "duration": 1000, + "amplitude": 0.5, + "envelope": { "kind": "rectangular" } + } + } + }, + "two_qubit": { + "1-2": { + "CZ": [ + { + "duration": 32, + "amplitude": -0.6025, + "envelope": { + "kind": "exponential", + "tau": 12, + "upsilon": 5000, + "g": 0.1 + }, + "qubit": 3, + "type": "qf" + }, + { + "type": "vz", + "phase": -3.63, + "qubit": 1 + }, + { + "type": "vz", + "phase": -0.041, + "qubit": 2 + } + ] + } + } + }, + "characterization": { + "single_qubit": { + "0": { + "readout_frequency": 5229200000, + "drive_frequency": 4095830788, + "T1": 0.0, + "T2": 0.0, + "sweetspot": 0.05, + "mean_gnd_states": [1.542, 0.1813], + "mean_exc_states": [2.4499, -0.5629], + "threshold": 0.8836, + "iq_angle": -1.551 + }, + "1": { + "readout_frequency": 4931000000, + "drive_frequency": 4170000000, + "T1": 0.0, + "T2": 0.0, + "sweetspot": 0.0, + "mean_gnd_states": [0, 0], + "mean_exc_states": [0, 0] + }, + "2": { + "readout_frequency": 6109000000.0, + "drive_frequency": 4300587281, + "T1": 0.0, + "T2": 0.0, + "sweetspot": 0.0, + "mean_gnd_states": [-1.8243, 1.5926], + "mean_exc_states": [-0.8083, 2.3929], + "threshold": -0.0593, + "iq_angle": -0.667 + }, + "3": { + "readout_frequency": 5783000000, + "drive_frequency": 4100000000, + "T1": 0.0, + "T2": 0.0, + "sweetspot": 0.0, + "mean_gnd_states": [0, 0], + "mean_exc_states": [0, 0] + }, + "4": { + "readout_frequency": 5515000000, + "drive_frequency": 4196800000, + "T1": 0.0, + "T2": 0.0, + "sweetspot": 0.0, + "mean_gnd_states": [0, 0], + "mean_exc_states": [0, 0], + "threshold": 0.233806, + "iq_angle": 0.481 + } + }, + "coupler": { + "0": { + "sweetspot": 0.0 + }, + "1": { + "sweetspot": 0.0 + }, + "3": { + "sweetspot": 0.0 + }, + "4": { + "sweetspot": 0.0 + } } + } } diff --git a/tests/test_compilers_default.py b/tests/test_compilers_default.py index e226137cfa..945f098c87 100644 --- a/tests/test_compilers_default.py +++ b/tests/test_compilers_default.py @@ -190,7 +190,12 @@ def test_add_measurement_to_sequence(platform): mz_pulse = platform.create_MZ_pulse(0) delay = 2 * rx90_pulse1.duration s = PulseSequence( - [rx90_pulse1, rx90_pulse2, Delay(delay, mz_pulse.channel), mz_pulse] + [ + rx90_pulse1, + rx90_pulse2, + Delay(duration=delay, channel=mz_pulse.channel), + mz_pulse, + ] ) # assert sequence == s @@ -205,7 +210,7 @@ def test_align_delay_measurement(platform, delay): mz_pulse = platform.create_MZ_pulse(0) target_sequence = PulseSequence() if delay > 0: - target_sequence.append(Delay(delay, mz_pulse.channel)) + target_sequence.append(Delay(duration=delay, channel=mz_pulse.channel)) target_sequence.append(mz_pulse) assert sequence == target_sequence assert len(sequence.ro_pulses) == 1 diff --git a/tests/test_dummy.py b/tests/test_dummy.py index 3328a866f2..41251cf9e7 100644 --- a/tests/test_dummy.py +++ b/tests/test_dummy.py @@ -2,7 +2,7 @@ import pytest from qibolab import AcquisitionType, AveragingMode, ExecutionParameters, create_platform -from qibolab.pulses import Delay, Pulse, PulseSequence, PulseType +from qibolab.pulses import Delay, GaussianSquare, Pulse, PulseSequence, PulseType from qibolab.qubits import QubitPair from qibolab.sweeper import Parameter, QubitParameter, Sweeper @@ -140,7 +140,7 @@ def test_dummy_single_sweep_coupler( coupler_pulse = Pulse.flux( duration=40, amplitude=0.5, - shape="GaussianSquare(5, 0.75)", + envelope=GaussianSquare(rel_sigma=0.2, width=0.75), channel="flux_coupler-0", qubit=0, ) From fb7ddf4ebc72d0dec3e2350be04fb3920ce96e15 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 28 Mar 2024 18:57:16 +0100 Subject: [PATCH 0176/1006] test: Fix unrolling tests --- tests/test_unrolling.py | 112 +++++++++++++++++++++++++++++++++++----- 1 file changed, 98 insertions(+), 14 deletions(-) diff --git a/tests/test_unrolling.py b/tests/test_unrolling.py index ce4d4e0794..65411acf0f 100644 --- a/tests/test_unrolling.py +++ b/tests/test_unrolling.py @@ -7,13 +7,55 @@ def test_bounds_update(): - p1 = Pulse(40, 0.9, int(100e6), 0, Drag(5, 1), 3, PulseType.DRIVE) - p2 = Pulse(40, 0.9, int(100e6), 0, Drag(5, 1), 2, PulseType.DRIVE) - p3 = Pulse(40, 0.9, int(100e6), 0, Drag(5, 1), 1, PulseType.DRIVE) - - p4 = Pulse(1000, 0.9, int(20e6), 0, Rectangular(), 3, PulseType.READOUT) - p5 = Pulse(1000, 0.9, int(20e6), 0, Rectangular(), 2, PulseType.READOUT) - p6 = Pulse(1000, 0.9, int(20e6), 0, Rectangular(), 1, PulseType.READOUT) + p1 = Pulse( + duration=40, + amplitude=0.9, + frequency=int(100e6), + envelope=Drag(rel_sigma=0.2, beta=1), + channel="3", + type=PulseType.DRIVE, + ) + p2 = Pulse( + duration=40, + amplitude=0.9, + frequency=int(100e6), + envelope=Drag(rel_sigma=0.2, beta=1), + channel="2", + type=PulseType.DRIVE, + ) + p3 = Pulse( + duration=40, + amplitude=0.9, + frequency=int(100e6), + envelope=Drag(rel_sigma=0.2, beta=1), + channel="1", + type=PulseType.DRIVE, + ) + + p4 = Pulse( + duration=1000, + amplitude=0.9, + frequency=int(20e6), + envelope=Rectangular(), + channel="3", + type=PulseType.READOUT, + ) + p5 = Pulse( + duration=1000, + amplitude=0.9, + frequency=int(20e6), + envelope=Rectangular(), + channel="2", + type=PulseType.READOUT, + ) + p6 = Pulse( + duration=1000, + amplitude=0.9, + frequency=int(20e6), + envelope=Rectangular(), + channel="1", + type=PulseType.READOUT, + ) ps = PulseSequence([p1, p2, p3, p4, p5, p6]) bounds = Bounds.update(ps) @@ -51,13 +93,55 @@ def test_bounds_comparison(): ], ) def test_batch(bounds): - p1 = Pulse(40, 0.9, int(100e6), 0, Drag(5, 1), 3, PulseType.DRIVE) - p2 = Pulse(40, 0.9, int(100e6), 0, Drag(5, 1), 2, PulseType.DRIVE) - p3 = Pulse(40, 0.9, int(100e6), 0, Drag(5, 1), 1, PulseType.DRIVE) - - p4 = Pulse(1000, 0.9, int(20e6), 0, Rectangular(), 3, PulseType.READOUT) - p5 = Pulse(1000, 0.9, int(20e6), 0, Rectangular(), 2, PulseType.READOUT) - p6 = Pulse(1000, 0.9, int(20e6), 0, Rectangular(), 1, PulseType.READOUT) + p1 = Pulse( + duration=40, + amplitude=0.9, + frequency=int(100e6), + envelope=Drag(rel_sigma=0.2, beta=1), + channel="3", + type=PulseType.DRIVE, + ) + p2 = Pulse( + duration=40, + amplitude=0.9, + frequency=int(100e6), + envelope=Drag(rel_sigma=0.2, beta=1), + channel="2", + type=PulseType.DRIVE, + ) + p3 = Pulse( + duration=40, + amplitude=0.9, + frequency=int(100e6), + envelope=Drag(rel_sigma=0.2, beta=1), + channel="1", + type=PulseType.DRIVE, + ) + + p4 = Pulse( + duration=1000, + amplitude=0.9, + frequency=int(20e6), + envelope=Rectangular(), + channel="3", + type=PulseType.READOUT, + ) + p5 = Pulse( + duration=1000, + amplitude=0.9, + frequency=int(20e6), + envelope=Rectangular(), + channel="2", + type=PulseType.READOUT, + ) + p6 = Pulse( + duration=1000, + amplitude=0.9, + frequency=int(20e6), + envelope=Rectangular(), + channel="1", + type=PulseType.READOUT, + ) ps = PulseSequence([p1, p2, p3, p4, p5, p6]) From 69195adc8bb8e614eb256fb33619379c04dae3f3 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 28 Mar 2024 18:59:14 +0100 Subject: [PATCH 0177/1006] test: Fix sweepers tests --- tests/test_sweeper.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/tests/test_sweeper.py b/tests/test_sweeper.py index bf537ebe9e..b4b660f996 100644 --- a/tests/test_sweeper.py +++ b/tests/test_sweeper.py @@ -8,7 +8,13 @@ @pytest.mark.parametrize("parameter", Parameter) def test_sweeper_pulses(parameter): - pulse = Pulse(40, 0.1, int(1e9), 0.0, Rectangular(), "channel") + pulse = Pulse( + duration=40, + amplitude=0.1, + frequency=1e9, + envelope=Rectangular(), + channel="channel", + ) if parameter is Parameter.amplitude: parameter_range = np.random.rand(10) else: @@ -34,7 +40,13 @@ def test_sweeper_qubits(parameter): def test_sweeper_errors(): - pulse = Pulse(40, 0.1, int(1e9), 0.0, Rectangular(), "channel") + pulse = Pulse( + duration=40, + amplitude=0.1, + frequency=1e9, + envelope=Rectangular(), + channel="channel", + ) qubit = Qubit(0) parameter_range = np.random.randint(10, size=10) with pytest.raises(ValueError): From 081c3fd29da4e5b0b3da09b0b3e647d54e5bcc35 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 28 Mar 2024 19:21:47 +0100 Subject: [PATCH 0178/1006] fix: Replace some further occurrences of shape, related to platform --- src/qibolab/platform/platform.py | 4 ++-- src/qibolab/serialize.py | 4 +--- tests/test_platform.py | 24 ++++++++++++++---------- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index befc7df133..597c9632af 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -471,7 +471,7 @@ def create_RX90_drag_pulse(self, qubit, beta, relative_phase=0): return replace( pulse, relative_phase=relative_phase, - shape=Drag(rel_sigma=pulse.envelope.rel_sigma, beta=beta), + envelope=Drag(rel_sigma=pulse.envelope.rel_sigma, beta=beta), channel=qubit.drive.name, ) @@ -482,6 +482,6 @@ def create_RX_drag_pulse(self, qubit, beta, relative_phase=0): return replace( pulse, relative_phase=relative_phase, - shape=Drag(rel_sigma=pulse.envelope.rel_sigma, beta=beta), + envelope=Drag(rel_sigma=pulse.envelope.rel_sigma, beta=beta), channel=qubit.drive.name, ) diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index 39ece9f99f..eeb941b043 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -194,11 +194,9 @@ def dump_qubit_name(name: QubitId) -> str: def _dump_pulse(pulse: Pulse): - data = asdict(pulse) + data = pulse.model_dump() if pulse.type in (PulseType.FLUX, PulseType.COUPLERFLUX): del data["frequency"] - if "shape" in data: - data["shape"] = str(pulse.shape) data["type"] = data["type"].value if "channel" in data: del data["channel"] diff --git a/tests/test_platform.py b/tests/test_platform.py index 1f08e89a5c..02b571a93b 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -44,7 +44,9 @@ def test_unroll_sequences(platform): qd_pulse = platform.create_RX_pulse(qubit) ro_pulse = platform.create_MZ_pulse(qubit) sequence.append(qd_pulse) - sequence.append(Delay(qd_pulse.duration, platform.qubits[qubit].readout.name)) + sequence.append( + Delay(duration=qd_pulse.duration, channel=platform.qubits[qubit].readout.name) + ) sequence.append(ro_pulse) total_sequence, readouts = unroll_sequences(10 * [sequence], relaxation_time=10000) assert len(total_sequence.ro_pulses) == 10 @@ -391,7 +393,10 @@ def test_ground_state_probabilities_pulses(qpu_platform, start_zero): if not start_zero: qd_pulse = platform.create_RX_pulse(qubit) sequence.append( - Delay(qd_pulse.duration, platform.qubits[qubit].readout.name) + Delay( + duration=qd_pulse.duration, + channel=platform.qubits[qubit].readout.name, + ) ) ro_pulse = platform.create_MZ_pulse(qubit) sequence.append(ro_pulse) @@ -413,14 +418,13 @@ def test_create_RX_drag_pulses(): qubits = [q for q, qb in platform.qubits.items() if qb.drive is not None] beta = 0.1234 for qubit in qubits: - drag_pi = platform.create_RX_drag_pulse(qubit, 0, beta=beta) - assert drag_pi.shape == Drag(drag_pi.shape.rel_sigma, beta=beta) - drag_pi_half = platform.create_RX90_drag_pulse( - qubit, drag_pi.duration, beta=beta + drag_pi = platform.create_RX_drag_pulse(qubit, beta=beta) + assert drag_pi.envelope == Drag(rel_sigma=drag_pi.envelope.rel_sigma, beta=beta) + drag_pi_half = platform.create_RX90_drag_pulse(qubit, beta=beta) + assert drag_pi_half.envelope == Drag( + rel_sigma=drag_pi_half.envelope.rel_sigma, beta=beta ) - assert drag_pi_half.shape == Drag(drag_pi_half.shape.rel_sigma, beta=beta) np.testing.assert_almost_equal(drag_pi.amplitude, 2 * drag_pi_half.amplitude) - # to check ShapeInitError - drag_pi.shape.envelope_waveforms() - drag_pi_half.shape.envelope_waveforms() + drag_pi.envelopes(sampling_rate=1) + drag_pi_half.envelopes(sampling_rate=1) From f841472f5cb6d8f33743914f651be7916fd58265 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 29 Mar 2024 06:57:53 +0100 Subject: [PATCH 0179/1006] test: Fix dummy tests --- tests/test_dummy.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/tests/test_dummy.py b/tests/test_dummy.py index 41251cf9e7..6ff899f784 100644 --- a/tests/test_dummy.py +++ b/tests/test_dummy.py @@ -4,6 +4,7 @@ from qibolab import AcquisitionType, AveragingMode, ExecutionParameters, create_platform from qibolab.pulses import Delay, GaussianSquare, Pulse, PulseSequence, PulseType from qibolab.qubits import QubitPair +from qibolab.serialize_ import replace from qibolab.sweeper import Parameter, QubitParameter, Sweeper SWEPT_POINTS = 5 @@ -60,8 +61,8 @@ def test_dummy_execute_pulse_sequence_couplers(): sequence.extend(cz.get_qubit_pulses(qubit_ordered_pair.qubit1.name)) sequence.extend(cz.get_qubit_pulses(qubit_ordered_pair.qubit2.name)) sequence.extend(cz.coupler_pulses(qubit_ordered_pair.coupler.name)) - sequence.append(Delay(40, platform.qubits[0].readout.name)) - sequence.append(Delay(40, platform.qubits[2].readout.name)) + sequence.append(Delay(duration=40, channel=platform.qubits[0].readout.name)) + sequence.append(Delay(duration=40, channel=platform.qubits[2].readout.name)) sequence.append(platform.create_MZ_pulse(0)) sequence.append(platform.create_MZ_pulse(2)) options = ExecutionParameters(nshots=None) @@ -144,7 +145,7 @@ def test_dummy_single_sweep_coupler( channel="flux_coupler-0", qubit=0, ) - coupler_pulse.type = PulseType.COUPLERFLUX + coupler_pulse = replace(coupler_pulse, type=PulseType.COUPLERFLUX) if parameter is Parameter.amplitude: parameter_range = np.random.rand(SWEPT_POINTS) else: @@ -239,7 +240,9 @@ def test_dummy_double_sweep(name, parameter1, parameter2, average, acquisition, pulse = platform.create_qubit_drive_pulse(qubit=0, duration=1000) ro_pulse = platform.create_MZ_pulse(qubit=0) sequence.append(pulse) - sequence.append(Delay(pulse.duration, channel=platform.qubits[0].readout.name)) + sequence.append( + Delay(duration=pulse.duration, channel=platform.qubits[0].readout.name) + ) sequence.append(ro_pulse) parameter_range_1 = ( np.random.rand(SWEPT_POINTS) From 471aa4fbb5f53844e9c14148a1fb60baeda9ae5d Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 29 Mar 2024 07:02:54 +0100 Subject: [PATCH 0180/1006] test: Drop pickle test, not used any longer --- tests/test_platform.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/tests/test_platform.py b/tests/test_platform.py index 02b571a93b..9ae82b0ff1 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -4,7 +4,6 @@ import inspect import os import pathlib -import pickle import warnings from pathlib import Path @@ -103,14 +102,6 @@ def test_platform_sampling_rate(platform): assert platform.sampling_rate >= 1 -@pytest.mark.xfail(reason="Cannot pickle all platforms") -def test_platform_pickle(platform): - serial = pickle.dumps(platform) - new_platform = pickle.loads(serial) - assert new_platform.name == platform.name - assert new_platform.is_connected == platform.is_connected - - def test_dump_runcard(platform, tmp_path): dump_runcard(platform, tmp_path) final_runcard = load_runcard(tmp_path) From c0096a0a2875fb2f1dc3a0e690b3a5e546c86c5f Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 29 Mar 2024 07:45:53 +0100 Subject: [PATCH 0181/1006] fix: Fix runcard dump --- src/qibolab/pulses/pulse.py | 11 +++++++---- src/qibolab/serialize.py | 17 +++++++---------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index 0b0c6473a5..e88326d4a3 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -73,7 +73,8 @@ def flux(cls, **kwargs): """ kwargs["frequency"] = 0 kwargs["relative_phase"] = 0 - kwargs["type"] = PulseType.FLUX + if "type" not in kwargs: + kwargs["type"] = PulseType.FLUX return cls(**kwargs) @property @@ -133,9 +134,6 @@ class Delay(Model): class VirtualZ(Model): """Implementation of Z-rotations using virtual phase.""" - duration: int = 0 - """Duration of the virtual gate should always be zero.""" - phase: float """Phase that implements the rotation.""" channel: Optional[str] = None @@ -143,3 +141,8 @@ class VirtualZ(Model): qubit: int = 0 """Qubit on the drive of which the virtual phase should be added.""" type: PulseType = PulseType.VIRTUALZ + + @property + def duration(self): + """Duration of the virtual gate should always be zero.""" + return 0 diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index eeb941b043..82dcadce07 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -98,19 +98,16 @@ def load_qubits( def _load_pulse(pulse_kwargs, qubit): - pulse_type = pulse_kwargs.pop("type") - if "coupler" in pulse_kwargs: - q = pulse_kwargs.pop("coupler", qubit.name) - else: - q = pulse_kwargs.pop("qubit", qubit.name) + coupler = "coupler" in pulse_kwargs + q = pulse_kwargs.pop("coupler" if coupler else "qubit", qubit.name) - if pulse_type == "dl": - return Delay(**pulse_kwargs) - if pulse_type == "vz": + if "phase" in pulse_kwargs: return VirtualZ(**pulse_kwargs, qubit=q) + if "amplitude" not in pulse_kwargs: + return Delay(**pulse_kwargs) if "frequency" not in pulse_kwargs: - return Pulse.flux(**pulse_kwargs, type=pulse_type, qubit=q) - return Pulse(**pulse_kwargs, type=pulse_type, qubit=q) + return Pulse.flux(**pulse_kwargs, qubit=q) + return Pulse(**pulse_kwargs, qubit=q) def _load_single_qubit_natives(qubit, gates) -> SingleQubitNatives: From fc3ae1926e9779faa44b2aba2c2a9e3d8e42c2cd Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 29 Mar 2024 08:42:05 +0100 Subject: [PATCH 0182/1006] test: Fix the doctests --- doc/source/main-documentation/qibolab.rst | 22 ++-- doc/source/tutorials/calibration.rst | 10 +- doc/source/tutorials/lab.rst | 90 +++++++++------ doc/source/tutorials/pulses.rst | 10 +- src/qibolab/pulses/sequence.py | 135 +++------------------- 5 files changed, 94 insertions(+), 173 deletions(-) diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index 352c6e9fd5..046813cdc8 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -66,7 +66,7 @@ Now we can create a simple sequence (again, without explicitly giving any qubit ps = PulseSequence() ps.append(platform.create_RX_pulse(qubit=0)) ps.append(platform.create_RX_pulse(qubit=0)) - ps.append(Delay(200, platform.qubits[0].readout.name)) + ps.append(Delay(duration=200, channel=platform.qubits[0].readout.name)) ps.append(platform.create_MZ_pulse(qubit=0)) Now we can execute the sequence on hardware: @@ -300,7 +300,7 @@ To illustrate, here are some examples of single pulses using the Qibolab API: amplitude=0.5, # Amplitude relative to instrument range frequency=1e8, # Frequency in Hz relative_phase=0, # Phase in radians - shape=Rectangular(), + envelope=Rectangular(), channel="channel", type="qd", # Enum type: :class:`qibolab.pulses.PulseType` qubit=0, @@ -318,7 +318,7 @@ Alternatively, you can achieve the same result using the dedicated :class:`qibol amplitude=0.5, # this amplitude is relative to the range of the instrument frequency=1e8, # frequency are in Hz relative_phase=0, # phases are in radians - shape=Rectangular(), + envelope=Rectangular(), channel="channel", qubit=0, ) @@ -338,7 +338,7 @@ To organize pulses into sequences, Qibolab provides the :class:`qibolab.pulses.P amplitude=0.5, # this amplitude is relative to the range of the instrument frequency=1e8, # frequency are in Hz relative_phase=0, # phases are in radians - shape=Rectangular(), + envelope=Rectangular(), channel="channel", qubit=0, ) @@ -347,7 +347,7 @@ To organize pulses into sequences, Qibolab provides the :class:`qibolab.pulses.P amplitude=0.5, # this amplitude is relative to the range of the instrument frequency=1e8, # frequency are in Hz relative_phase=0, # phases are in radians - shape=Rectangular(), + envelope=Rectangular(), channel="channel", qubit=0, ) @@ -356,7 +356,7 @@ To organize pulses into sequences, Qibolab provides the :class:`qibolab.pulses.P amplitude=0.5, # this amplitude is relative to the range of the instrument frequency=1e8, # frequency are in Hz relative_phase=0, # phases are in radians - shape=Rectangular(), + envelope=Rectangular(), channel="channel", qubit=0, ) @@ -365,7 +365,7 @@ To organize pulses into sequences, Qibolab provides the :class:`qibolab.pulses.P amplitude=0.5, # this amplitude is relative to the range of the instrument frequency=1e8, # frequency are in Hz relative_phase=0, # phases are in radians - shape=Rectangular(), + envelope=Rectangular(), channel="channel", qubit=0, ) @@ -382,7 +382,7 @@ To organize pulses into sequences, Qibolab provides the :class:`qibolab.pulses.P .. testoutput:: python :hide: - Total duration: 160 + Total duration: 160.0 We have 0 pulses on channel 1. @@ -409,7 +409,7 @@ Typical experiments may include both pre-defined pulses and new ones: amplitude=0.5, frequency=2500000000, relative_phase=0, - shape=Rectangular(), + envelope=Rectangular(), channel="0", ) ) @@ -525,7 +525,9 @@ For example: sequence = PulseSequence() sequence.append(platform.create_RX_pulse(0)) - sequence.append(Delay(sequence.duration, platform.qubits[0].readout.name)) + sequence.append( + Delay(duration=sequence.duration, channel=platform.qubits[0].readout.name) + ) sequence.append(platform.create_MZ_pulse(0)) sweeper_freq = Sweeper( diff --git a/doc/source/tutorials/calibration.rst b/doc/source/tutorials/calibration.rst index 13d22925cb..ba8a2fee62 100644 --- a/doc/source/tutorials/calibration.rst +++ b/doc/source/tutorials/calibration.rst @@ -117,6 +117,7 @@ complex pulse sequence. Therefore with start with that: AveragingMode, AcquisitionType, ) + from qibolab.serialize_ import replace # allocate platform platform = create_platform("dummy") @@ -124,11 +125,10 @@ complex pulse sequence. Therefore with start with that: # create pulse sequence and add pulses sequence = PulseSequence() drive_pulse = platform.create_RX_pulse(qubit=0) - drive_pulse.duration = 2000 - drive_pulse.amplitude = 0.01 + drive_pulse = replace(drive_pulse, duration=2000, amplitude=0.01) readout_pulse = platform.create_MZ_pulse(qubit=0) sequence.append(drive_pulse) - sequence.append(Delay(drive_pulse.duration, readout_pulse.channel)) + sequence.append(Delay(duration=drive_pulse.duration, channel=readout_pulse.channel)) sequence.append(readout_pulse) # allocate frequency sweeper @@ -222,7 +222,9 @@ and its impact on qubit states in the IQ plane. drive_pulse = platform.create_RX_pulse(qubit=0) readout_pulse1 = platform.create_MZ_pulse(qubit=0) one_sequence.append(drive_pulse) - one_sequence.append(Delay(drive_pulse.duration, readout_pulse1.channel)) + one_sequence.append( + Delay(duration=drive_pulse.duration, channel=readout_pulse1.channel) + ) one_sequence.append(readout_pulse1) # create pulse sequence 2 and add pulses diff --git a/doc/source/tutorials/lab.rst b/doc/source/tutorials/lab.rst index f1e80f5ce3..7ca2ca210f 100644 --- a/doc/source/tutorials/lab.rst +++ b/doc/source/tutorials/lab.rst @@ -24,7 +24,7 @@ using different Qibolab primitives. from qibolab import Platform from qibolab.qubits import Qubit - from qibolab.pulses import Pulse, PulseType + from qibolab.pulses import Gaussian, Pulse, PulseType, Rectangular from qibolab.channels import ChannelMap, Channel from qibolab.native import SingleQubitNatives from qibolab.instruments.dummy import DummyInstrument @@ -48,18 +48,18 @@ using different Qibolab primitives. RX=Pulse( duration=40, amplitude=0.05, - shape="Gaussian(5)", + envelope=Gaussian(rel_sigma=0.2), type=PulseType.DRIVE, - qubit=qubit, - frequency=int(4.5e9), + qubit=qubit.name, + frequency=4.5e9, ), MZ=Pulse( duration=1000, amplitude=0.005, - shape="Rectangular()", + envelope=Rectangular(), type=PulseType.READOUT, - qubit=qubit, - frequency=int(7e9), + qubit=qubit.name, + frequency=7e9, ), ) @@ -97,7 +97,7 @@ hold the parameters of the two-qubit gates. .. testcode:: python from qibolab.qubits import Qubit, QubitPair - from qibolab.pulses import PulseType, Pulse, PulseSequence + from qibolab.pulses import Gaussian, PulseType, Pulse, PulseSequence, Rectangular from qibolab.native import ( SingleQubitNatives, TwoQubitNatives, @@ -112,36 +112,36 @@ hold the parameters of the two-qubit gates. RX=Pulse( duration=40, amplitude=0.05, - shape="Gaussian(5)", + envelope=Gaussian(rel_sigma=0.2), type=PulseType.DRIVE, - qubit=qubit0, - frequency=int(4.7e9), + qubit=qubit0.name, + frequency=4.7e9, ), MZ=Pulse( duration=1000, amplitude=0.005, - shape="Rectangular()", + envelope=Rectangular(), type=PulseType.READOUT, - qubit=qubit0, - frequency=int(7e9), + qubit=qubit0.name, + frequency=7e9, ), ) qubit1.native_gates = SingleQubitNatives( RX=Pulse( duration=40, amplitude=0.05, - shape="Gaussian(5)", + envelope=Gaussian(rel_sigma=0.2), type=PulseType.DRIVE, - qubit=qubit1, - frequency=int(5.1e9), + qubit=qubit1.name, + frequency=5.1e9, ), MZ=Pulse( duration=1000, amplitude=0.005, - shape="Rectangular()", + envelope=Rectangular(), type=PulseType.READOUT, - qubit=qubit1, - frequency=int(7.5e9), + qubit=qubit1.name, + frequency=7.5e9, ), ) @@ -153,9 +153,10 @@ hold the parameters of the two-qubit gates. Pulse( duration=30, amplitude=0.005, - shape="Rectangular()", + envelope=Rectangular(), type=PulseType.FLUX, - qubit=qubit1, + qubit=qubit1.name, + frequency=1e9, ) ], ) @@ -194,9 +195,10 @@ coupler but qibolab will take them into account when calling :class:`qibolab.nat Pulse( duration=30, amplitude=0.005, - shape="Rectangular()", + frequency=1e9, + envelope=Rectangular(), type=PulseType.FLUX, - qubit=qubit1, + qubit=qubit1.name, ) ], ) @@ -269,14 +271,18 @@ a two-qubit system: "duration": 40, "amplitude": 0.0484, "frequency": 4855663000, - "shape": "Drag(5, -0.02)", + "envelope": { + "kind": "drag", + "rel_sigma": 0.2, + "beta": -0.02, + }, "type": "qd", }, "MZ": { "duration": 620, "amplitude": 0.003575, "frequency": 7453265000, - "shape": "Rectangular()", + "envelope": {"kind": "rectangular"}, "type": "ro", } }, @@ -285,14 +291,18 @@ a two-qubit system: "duration": 40, "amplitude": 0.05682, "frequency": 5800563000, - "shape": "Drag(5, -0.04)", + "envelope": { + "kind": "drag", + "rel_sigma": 0.2, + "beta": -0.04, + }, "type": "qd", }, "MZ": { "duration": 960, "amplitude": 0.00325, "frequency": 7655107000, - "shape": "Rectangular()", + "envelope": {"kind": "rectangular"}, "type": "ro", } } @@ -303,7 +313,7 @@ a two-qubit system: { "duration": 30, "amplitude": 0.055, - "shape": "Rectangular()", + "envelope": {"kind": "rectangular"}, "qubit": 1, "type": "qf" }, @@ -371,7 +381,7 @@ we need the following changes to the previous runcard: { "duration": 30, "amplitude": 0.6025, - "shape": "Rectangular()", + "envelope": {"kind": "rectangular"}, "qubit": 1, "type": "qf" }, @@ -389,7 +399,7 @@ we need the following changes to the previous runcard: "type": "cf", "duration": 40, "amplitude": 0.1, - "shape": "Rectangular()", + "envelope": {"kind": "rectangular"}, "coupler": 0, } ] @@ -564,14 +574,18 @@ The runcard can contain an ``instruments`` section that provides these parameter "duration": 40, "amplitude": 0.0484, "frequency": 4855663000, - "shape": "Drag(5, -0.02)", + "envelope": { + "kind": "drag", + "rel_sigma": 0.2, + "beta": -0.02, + }, "type": "qd", }, "MZ": { "duration": 620, "amplitude": 0.003575, "frequency": 7453265000, - "shape": "Rectangular()", + "envelope": {"kind": "rectangular"}, "type": "ro", } }, @@ -580,14 +594,18 @@ The runcard can contain an ``instruments`` section that provides these parameter "duration": 40, "amplitude": 0.05682, "frequency": 5800563000, - "shape": "Drag(5, -0.04)", + "envelope": { + "kind": "drag", + "rel_sigma": 0.2, + "beta": -0.04, + }, "type": "qd", }, "MZ": { "duration": 960, "amplitude": 0.00325, "frequency": 7655107000, - "shape": "Rectangular()", + "envelope": {"kind": "rectangular"}, "type": "ro", } } @@ -598,7 +616,7 @@ The runcard can contain an ``instruments`` section that provides these parameter { "duration": 30, "amplitude": 0.055, - "shape": "Rectangular()", + "envelope": {"kind": "rectangular"}, "qubit": 1, "type": "qf" }, diff --git a/doc/source/tutorials/pulses.rst b/doc/source/tutorials/pulses.rst index b68508bc07..b3b0b72333 100644 --- a/doc/source/tutorials/pulses.rst +++ b/doc/source/tutorials/pulses.rst @@ -20,23 +20,23 @@ pulses (:class:`qibolab.pulses.Pulse`) through the amplitude=0.3, duration=60, relative_phase=0, - shape=Gaussian(5), + envelope=Gaussian(rel_sigma=0.2), qubit=0, type=PulseType.DRIVE, - channel=0, + channel="0", ) ) - sequence.append(Delay(100, channel=1)) + sequence.append(Delay(duration=100, channel="1")) sequence.append( Pulse( frequency=20000000.0, amplitude=0.5, duration=3000, relative_phase=0, - shape=Rectangular(), + envelope=Rectangular(), qubit=0, type=PulseType.READOUT, - channel=1, + channel="1", ) ) diff --git a/src/qibolab/pulses/sequence.py b/src/qibolab/pulses/sequence.py index 3ecce9cd10..b48cb62cda 100644 --- a/src/qibolab/pulses/sequence.py +++ b/src/qibolab/pulses/sequence.py @@ -1,5 +1,8 @@ """PulseSequence class.""" -import numpy as np + +from collections import defaultdict + +from .pulse import PulseType class PulseSequence(list): @@ -91,27 +94,23 @@ def coupler_pulses(self, *couplers): return new_pc @property - def finish(self) -> int: - """The time when the last pulse of the sequence finishes.""" - t: int = 0 + def pulses_per_channel(self): + """Return a dictionary with the sequence per channel.""" + sequences = defaultdict(type(self)) for pulse in self: - if pulse.finish > t: - t = pulse.finish - return t - - @property - def start(self) -> int: - """The start time of the first pulse of the sequence.""" - t = self.finish - for pulse in self: - if pulse.start < t: - t = pulse.start - return t + sequences[pulse.channel].append(pulse) + return sequences @property def duration(self) -> int: - """Duration of the sequence calculated as its finish - start times.""" - return self.finish - self.start + """The time when the last pulse of the sequence finishes.""" + channel_pulses = self.pulses_per_channel + if len(channel_pulses) == 1: + pulses = next(iter(channel_pulses.values())) + return sum(pulse.duration for pulse in pulses) + return max( + (sequence.duration for sequence in channel_pulses.values()), default=0 + ) @property def channels(self) -> list: @@ -133,25 +132,6 @@ def qubits(self) -> list: qubits.sort() return qubits - def get_pulse_overlaps(self): # -> dict((int,int): PulseSequence): - """Return a dictionary of slices of time (tuples with start and finish - times) where pulses overlap.""" - times = [] - for pulse in self: - if not pulse.start in times: - times.append(pulse.start) - if not pulse.finish in times: - times.append(pulse.finish) - times.sort() - - overlaps = {} - for n in range(len(times) - 1): - overlaps[(times[n], times[n + 1])] = PulseSequence() - for pulse in self: - if (pulse.start <= times[n]) & (pulse.finish >= times[n + 1]): - overlaps[(times[n], times[n + 1])] += [pulse] - return overlaps - def separate_overlapping_pulses(self): # -> dict((int,int): PulseSequence): """Separate a sequence of overlapping pulses into a list of non- overlapping sequences.""" @@ -177,84 +157,3 @@ def separate_overlapping_pulses(self): # -> dict((int,int): PulseSequence): if not stored: separated_pulses.append(PulseSequence([new_pulse])) return separated_pulses - - # TODO: Implement separate_different_frequency_pulses() - - @property - def pulses_overlap(self) -> bool: - """Whether any of the pulses in the sequence overlap.""" - overlap = False - for pc in self.get_pulse_overlaps().values(): - if len(pc) > 1: - overlap = True - break - return overlap - - def plot(self, savefig_filename=None, sampling_rate=SAMPLING_RATE): - """Plot the sequence of pulses. - - Args: - savefig_filename (str): a file path. If provided the plot is save to a file. - """ - if len(self) > 0: - import matplotlib.pyplot as plt - from matplotlib import gridspec - - fig = plt.figure(figsize=(14, 2 * len(self)), dpi=200) - gs = gridspec.GridSpec(ncols=1, nrows=len(self)) - vertical_lines = [] - for pulse in self: - vertical_lines.append(pulse.start) - vertical_lines.append(pulse.finish) - - n = -1 - for qubit in self.qubits: - qubit_pulses = self.get_qubit_pulses(qubit) - for channel in qubit_pulses.channels: - n += 1 - channel_pulses = qubit_pulses.get_channel_pulses(channel) - ax = plt.subplot(gs[n]) - ax.axis([0, self.finish, -1, 1]) - for pulse in channel_pulses: - num_samples = len( - pulse.shape.modulated_waveform_i(sampling_rate) - ) - time = pulse.start + np.arange(num_samples) / sampling_rate - ax.plot( - time, - pulse.shape.modulated_waveform_q(sampling_rate).data, - c="lightgrey", - ) - ax.plot( - time, - pulse.shape.modulated_waveform_i(sampling_rate).data, - c=f"C{str(n)}", - ) - ax.plot( - time, - pulse.shape.envelope_waveform_i(sampling_rate).data, - c=f"C{str(n)}", - ) - ax.plot( - time, - -pulse.shape.envelope_waveform_i(sampling_rate).data, - c=f"C{str(n)}", - ) - # TODO: if they overlap use different shades - ax.axhline(0, c="dimgrey") - ax.set_ylabel(f"qubit {qubit} \n channel {channel}") - for vl in vertical_lines: - ax.axvline(vl, c="slategrey", linestyle="--") - ax.axis([0, self.finish, -1, 1]) - ax.grid( - visible=True, - which="both", - axis="both", - color="#CCCCCC", - linestyle="-", - ) - if savefig_filename: - plt.savefig(savefig_filename) - else: - plt.show() - plt.close() From 2ed8577e6395083d9f6f86a044ffc08f50248a25 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Sat, 30 Mar 2024 08:16:01 +0100 Subject: [PATCH 0183/1006] fix: Change exponential parameters units, from samples to duration --- src/qibolab/pulses/envelope.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/qibolab/pulses/envelope.py b/src/qibolab/pulses/envelope.py index f9dcdcc447..513e5eca30 100644 --- a/src/qibolab/pulses/envelope.py +++ b/src/qibolab/pulses/envelope.py @@ -81,18 +81,24 @@ class Exponential(BaseEnvelope): kind: Literal["exponential"] = "exponential" tau: float - """The decay rate of the first exponential function.""" + """The decay rate of the first exponential function. + + In units of the interval duration. + """ upsilon: float - """The decay rate of the second exponential function.""" + """The decay rate of the second exponential function. + + In units of the interval duration. + """ g: float = 0.1 """Weight of the second exponential function.""" def i(self, samples: int) -> Waveform: """Generate a combination of two exponential decays.""" x = np.arange(samples) - return (np.exp(-x / self.upsilon) + self.g * np.exp(-x / self.tau)) / ( - 1 + self.g - ) + upsilon = self.upsilon * samples + tau = self.tau * samples + return (np.exp(-x / upsilon) + self.g * np.exp(-x / tau)) / (1 + self.g) def _samples_sigma(rel_sigma: float, samples: int) -> float: @@ -245,6 +251,7 @@ class Snz(BaseEnvelope): kind: Literal["snz"] = "snz" t_idling: float + """Fraction of interval where idling.""" b_amplitude: float = 0.5 """Relative B amplitude (wrt A).""" @@ -279,6 +286,7 @@ class ECap(BaseEnvelope): kind: Literal["ecap"] = "ecap" alpha: float + """In units of the inverse interval duration.""" def i(self, samples: int) -> Waveform: """.. todo::""" From 2719cb3a6ce1919a7ec1822dfe1d65c5fbe3ef46 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 15 Apr 2024 15:33:45 +0200 Subject: [PATCH 0184/1006] chore: Fix rebase leftover --- src/qibolab/pulses/envelope.py | 4 ---- src/qibolab/pulses/pulse.py | 4 ++-- src/qibolab/pulses/waveform.py | 42 ---------------------------------- 3 files changed, 2 insertions(+), 48 deletions(-) delete mode 100644 src/qibolab/pulses/waveform.py diff --git a/src/qibolab/pulses/envelope.py b/src/qibolab/pulses/envelope.py index 513e5eca30..a61c6e50e8 100644 --- a/src/qibolab/pulses/envelope.py +++ b/src/qibolab/pulses/envelope.py @@ -43,10 +43,6 @@ class BaseEnvelope(ABC, Model): Generates both i (in-phase) and q (quadrature) components. """ - def window(self, samples: int): - """Individual timing of each sample.""" - return np.linspace(0, self.duration, samples) - def i(self, samples: int) -> Waveform: """In-phase envelope.""" return np.zeros(samples) diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index e88326d4a3..efd4c7b85c 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -83,12 +83,12 @@ def id(self) -> int: def i(self, sampling_rate: float) -> Waveform: """The envelope waveform of the i component of the pulse.""" - samples = int(self.envelope.duration * sampling_rate) + samples = int(self.duration * sampling_rate) return self.amplitude * self.envelope.i(samples) def q(self, sampling_rate: float) -> Waveform: """The envelope waveform of the q component of the pulse.""" - samples = int(self.envelope.duration * sampling_rate) + samples = int(self.duration * sampling_rate) return self.amplitude * self.envelope.q(samples) def envelopes(self, sampling_rate: float) -> IqWaveform: diff --git a/src/qibolab/pulses/waveform.py b/src/qibolab/pulses/waveform.py deleted file mode 100644 index 7c530bf362..0000000000 --- a/src/qibolab/pulses/waveform.py +++ /dev/null @@ -1,42 +0,0 @@ -"""Waveform class.""" -import numpy as np - - -class Waveform: - """A class to save pulse waveforms. - - A waveform is a list of samples, or discrete data points, used by the digital to analogue converters (DACs) - to synthesise pulses. - - Attributes: - data (np.ndarray): a numpy array containing the samples. - """ - - DECIMALS = 5 - - def __init__(self, data): - """Initialise the waveform with a of samples.""" - self.data: np.ndarray = np.array(data) - - def __len__(self): - """Return the length of the waveform, the number of samples.""" - return len(self.data) - - def __hash__(self): - """Hash the underlying data. - - .. todo:: - - In order to make this reliable, we should set the data as immutable. This we - could by making both the class frozen and the contained array readonly - https://numpy.org/doc/stable/reference/generated/numpy.ndarray.flags.html#numpy.ndarray.flags - """ - return hash(self.data.tobytes()) - - def __eq__(self, other): - """Compare two waveforms. - - Two waveforms are considered equal if their samples, rounded to - `Waveform.DECIMALS` decimal places, are all equal. - """ - return np.allclose(self.data, other.data) From 03fafbe3e53ec0d9c4a9a3f1bc2410c16f826ba5 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 15 Apr 2024 16:21:02 +0200 Subject: [PATCH 0185/1006] fix: Remove (again) duration from GaussianSquare envelope --- src/qibolab/pulses/envelope.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibolab/pulses/envelope.py b/src/qibolab/pulses/envelope.py index a61c6e50e8..85a087fcf0 100644 --- a/src/qibolab/pulses/envelope.py +++ b/src/qibolab/pulses/envelope.py @@ -152,7 +152,7 @@ def i(self, samples: int) -> Waveform: """Generate a Gaussian envelope, with a flat central window.""" pulse = np.ones(samples) - u, hw = samples / 2, self.width * samples / self.duration / 2 + u, hw = samples / 2, self.width / 2 ts = np.arange(samples) tails = (ts < (u - hw)) | ((u + hw) < ts) pulse[tails] = gaussian(len(ts[tails]), _samples_sigma(self.rel_sigma, samples)) From 1aeeae66bf5188ad265c31a3c0daa1fd6de95e96 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 16 Apr 2024 10:32:23 +0200 Subject: [PATCH 0186/1006] Improve envelopes' docstrings Co-authored-by: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> --- src/qibolab/pulses/envelope.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/qibolab/pulses/envelope.py b/src/qibolab/pulses/envelope.py index 85a087fcf0..cda3581bec 100644 --- a/src/qibolab/pulses/envelope.py +++ b/src/qibolab/pulses/envelope.py @@ -1,4 +1,4 @@ -"""Library of pulse shapes.""" +"""Library of pulse envelopes.""" from abc import ABC from typing import Annotated, Literal, Union @@ -131,7 +131,7 @@ def i(self, samples: int) -> Waveform: class GaussianSquare(BaseEnvelope): - r"""GaussianSquare pulse shape. + r"""Rectangular envelope with Gaussian rise and fall. .. math:: @@ -161,7 +161,7 @@ def i(self, samples: int) -> Waveform: class Drag(BaseEnvelope): - """Derivative Removal by Adiabatic Gate (DRAG) pulse shape. + """Derivative Removal by Adiabatic Gate (DRAG) pulse envelope. .. todo:: @@ -267,7 +267,7 @@ def i(self, samples: int) -> Waveform: class ECap(BaseEnvelope): - r"""ECap pulse shape. + r"""ECap pulse envelope. .. todo:: @@ -296,7 +296,7 @@ def i(self, samples: int) -> Waveform: class Custom(BaseEnvelope): - """Arbitrary shape. + """Arbitrary envelope. .. todo:: From 22a3562e66f76b759716e37aa3095b7e95a66be7 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 12 Jan 2024 16:25:00 +0100 Subject: [PATCH 0187/1006] Drop pulse.serial --- src/qibolab/instruments/qblox/cluster_qrm_rf.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/qibolab/instruments/qblox/cluster_qrm_rf.py b/src/qibolab/instruments/qblox/cluster_qrm_rf.py index 9d582e8598..d09905eeb6 100644 --- a/src/qibolab/instruments/qblox/cluster_qrm_rf.py +++ b/src/qibolab/instruments/qblox/cluster_qrm_rf.py @@ -993,9 +993,9 @@ def acquire(self): if len(sequencer.pulses.ro_pulses) == 1: pulse = sequencer.pulses.ro_pulses[0] frequency = self.get_if(pulse) - acquisitions[pulse.qubit] = acquisitions[pulse.id] = ( - AveragedAcquisition(scope, duration, frequency) - ) + acquisitions[pulse.qubit] = acquisitions[ + pulse.id + ] = AveragedAcquisition(scope, duration, frequency) else: raise RuntimeError( "Software Demodulation only supports one acquisition per channel. " @@ -1005,9 +1005,9 @@ def acquire(self): results = self.device.get_acquisitions(sequencer.number) for pulse in sequencer.pulses.ro_pulses: bins = results[pulse.id]["acquisition"]["bins"] - acquisitions[pulse.qubit] = acquisitions[pulse.id] = ( - DemodulatedAcquisition(scope, bins, duration) - ) + acquisitions[pulse.qubit] = acquisitions[ + pulse.id + ] = DemodulatedAcquisition(scope, bins, duration) # TODO: to be updated once the functionality of ExecutionResults is extended return {key: acquisition for key, acquisition in acquisitions.items()} From 254ed9415d95ce5d46f80199494f1395809ffd41 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 17 Jan 2024 19:17:35 +0100 Subject: [PATCH 0188/1006] Fix QM issues by stringifying pulses ID QM requires some keys to be strings, because of the way they are later processed. And before they were (by accident, since we were using the serial as an identifier). --- tests/test_instruments_qm.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/tests/test_instruments_qm.py b/tests/test_instruments_qm.py index 62b3ef994b..c81c627da0 100644 --- a/tests/test_instruments_qm.py +++ b/tests/test_instruments_qm.py @@ -346,8 +346,21 @@ def test_qm_register_pulse(qmplatform, pulse_type, qubit): }, } +<<<<<<< HEAD controller.config.register_element( platform.qubits[qubit], pulse, controller.time_of_flight, controller.smearing +======= + opx.config.register_element( + platform.qubits[qubit], pulse, opx.time_of_flight, opx.smearing + ) + opx.config.register_pulse(platform.qubits[qubit], pulse) + assert opx.config.pulses[str(pulse.id)] == target_pulse + assert target_pulse["waveforms"]["I"] in opx.config.waveforms + assert target_pulse["waveforms"]["Q"] in opx.config.waveforms + assert ( + opx.config.elements[f"{pulse_type}{qubit}"]["operations"][str(pulse.id)] + == pulse.id +>>>>>>> 5f1fb614 (Fix QM issues by stringifying pulses ID) ) qmpulse = QMPulse(pulse) controller.config.register_pulse(platform.qubits[qubit], qmpulse) @@ -373,11 +386,19 @@ def test_qm_register_flux_pulse(qmplatform): "length": pulse.duration, "waveforms": {"single": "constant_wf0.005"}, } +<<<<<<< HEAD qmpulse = QMPulse(pulse) controller.config.register_element(platform.qubits[qubit], pulse) controller.config.register_pulse(platform.qubits[qubit], qmpulse) assert controller.config.pulses[qmpulse.operation] == target_pulse assert target_pulse["waveforms"]["single"] in controller.config.waveforms +======= + opx.config.register_element(platform.qubits[qubit], pulse) + opx.config.register_pulse(platform.qubits[qubit], pulse) + assert opx.config.pulses[str(pulse.id)] == target_pulse + assert target_pulse["waveforms"]["single"] in opx.config.waveforms + assert opx.config.elements[f"flux{qubit}"]["operations"][str(pulse.id)] == pulse.id +>>>>>>> 5f1fb614 (Fix QM issues by stringifying pulses ID) def test_qm_register_pulses_with_different_frequencies(qmplatform): From 6f0c275b718574eee56c551e29fad5b2c9fe4f85 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 29 Jan 2024 10:28:14 +0100 Subject: [PATCH 0189/1006] feat(nix): Export convenience env var --- flake.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flake.nix b/flake.nix index 9b2c037a89..478c524c95 100644 --- a/flake.nix +++ b/flake.nix @@ -49,7 +49,7 @@ config, ... }: { - packages = with pkgs; [pre-commit poethepoet jupyter zlib]; + packages = with pkgs; [pre-commit poethepoet jupyter stdenv.cc.cc.lib zlib]; env = { QIBOLAB_PLATFORMS = (dirOf config.env.DEVENV_ROOT) + "/qibolab_platforms_qrc"; From 057454bfd4933cad156179425fbf83568b66a45a Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 21 Mar 2024 13:15:26 +0400 Subject: [PATCH 0190/1006] fix: tests after merging (compiler tests still failing) --- tests/test_compilers_default.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_compilers_default.py b/tests/test_compilers_default.py index 945f098c87..ff674a5462 100644 --- a/tests/test_compilers_default.py +++ b/tests/test_compilers_default.py @@ -37,7 +37,7 @@ def compile_circuit(circuit, platform): @pytest.mark.parametrize( - "gateargs,sequence_len", + "gateargs", [ ((gates.I,), 1), ((gates.Z,), 2), @@ -47,11 +47,11 @@ def compile_circuit(circuit, platform): ((gates.U3, 0.1, 0.2, 0.3), 10), ], ) -def test_compile(platform, gateargs, sequence_len): +def test_compile(platform, gateargs): nqubits = platform.nqubits circuit = generate_circuit_with_gate(nqubits, *gateargs) sequence = compile_circuit(circuit, platform) - assert len(sequence) == nqubits * sequence_len + assert len(sequence) == nqubits * nseq def test_compile_two_gates(platform): From 8f73ac56ced43e6c75049bc5dd234ce63ba51890 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 15 Mar 2024 18:10:32 +0100 Subject: [PATCH 0191/1006] test: Fix remaining pytests collection errors --- src/qibolab/instruments/qm/config.py | 4 +++- tests/test_instruments_qm.py | 4 +++- tests/test_instruments_rfsoc.py | 6 +++++- tests/test_sweeper.py | 4 +++- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/qibolab/instruments/qm/config.py b/src/qibolab/instruments/qm/config.py index cc934fb202..e6ceeca78f 100644 --- a/src/qibolab/instruments/qm/config.py +++ b/src/qibolab/instruments/qm/config.py @@ -4,10 +4,12 @@ import numpy as np from qibo.config import raise_error -from qibolab.pulses import PulseType, Rectangular +from qibolab.pulses import Envelopes, PulseType from .ports import OPXIQ, OctaveInput, OctaveOutput, OPXOutput +Rectangular = Envelopes.RECTANGULAR.value + SAMPLING_RATE = 1 """Sampling rate of Quantum Machines OPX in GSps.""" diff --git a/tests/test_instruments_qm.py b/tests/test_instruments_qm.py index c81c627da0..6ec5fc455e 100644 --- a/tests/test_instruments_qm.py +++ b/tests/test_instruments_qm.py @@ -9,12 +9,14 @@ from qibolab.instruments.qm.acquisition import Acquisition, declare_acquisitions from qibolab.instruments.qm.controller import controllers_config from qibolab.instruments.qm.sequence import BakedPulse, QMPulse, Sequence -from qibolab.pulses import Pulse, PulseSequence, PulseType, Rectangular +from qibolab.pulses import Envelopes, Pulse, PulseSequence, PulseType from qibolab.qubits import Qubit from qibolab.sweeper import Parameter, Sweeper from .conftest import set_platform_profile +Rectangular = Envelopes.RECTANGULAR.value + def test_qmpulse(): pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), "ch0", qubit=0) diff --git a/tests/test_instruments_rfsoc.py b/tests/test_instruments_rfsoc.py index da943061d1..2ea0c19736 100644 --- a/tests/test_instruments_rfsoc.py +++ b/tests/test_instruments_rfsoc.py @@ -14,7 +14,7 @@ convert_units_sweeper, replace_pulse_shape, ) -from qibolab.pulses import Drag, Gaussian, Pulse, PulseSequence, PulseType, Rectangular +from qibolab.pulses import Envelopes, Pulse, PulseSequence, PulseType from qibolab.qubits import Qubit from qibolab.result import ( AveragedIntegratedResults, @@ -25,6 +25,10 @@ from .conftest import get_instrument +Rectangular = Envelopes.RECTANGULAR.value +Gaussian = Envelopes.GAUSSIAN.value +Drag = Envelopes.DRAG.value + def test_convert_default(dummy_qrc): """Test convert function raises errors when parameter have wrong types.""" diff --git a/tests/test_sweeper.py b/tests/test_sweeper.py index b4b660f996..2b0f7908c7 100644 --- a/tests/test_sweeper.py +++ b/tests/test_sweeper.py @@ -1,10 +1,12 @@ import numpy as np import pytest -from qibolab.pulses import Pulse, Rectangular +from qibolab.pulses import Envelopes, Pulse from qibolab.qubits import Qubit from qibolab.sweeper import Parameter, QubitParameter, Sweeper +Rectangular = Envelopes.RECTANGULAR.value + @pytest.mark.parametrize("parameter", Parameter) def test_sweeper_pulses(parameter): From bb46feb161ab84db0ecbe5840f0dbb24a55ee965 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 21 Mar 2024 15:50:10 +0400 Subject: [PATCH 0192/1006] fix: Propagate Pydantic models to Pulse --- src/qibolab/instruments/qm/config.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/qibolab/instruments/qm/config.py b/src/qibolab/instruments/qm/config.py index e6ceeca78f..cc934fb202 100644 --- a/src/qibolab/instruments/qm/config.py +++ b/src/qibolab/instruments/qm/config.py @@ -4,12 +4,10 @@ import numpy as np from qibo.config import raise_error -from qibolab.pulses import Envelopes, PulseType +from qibolab.pulses import PulseType, Rectangular from .ports import OPXIQ, OctaveInput, OctaveOutput, OPXOutput -Rectangular = Envelopes.RECTANGULAR.value - SAMPLING_RATE = 1 """Sampling rate of Quantum Machines OPX in GSps.""" From 35e987dbaf13cc013c037f3462907b34a8703ef6 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 21 Mar 2024 19:06:20 +0400 Subject: [PATCH 0193/1006] fix: Solve import-related issues in tests --- tests/test_instruments_qm.py | 4 +--- tests/test_instruments_rfsoc.py | 6 +----- tests/test_sweeper.py | 4 +--- 3 files changed, 3 insertions(+), 11 deletions(-) diff --git a/tests/test_instruments_qm.py b/tests/test_instruments_qm.py index 6ec5fc455e..c81c627da0 100644 --- a/tests/test_instruments_qm.py +++ b/tests/test_instruments_qm.py @@ -9,14 +9,12 @@ from qibolab.instruments.qm.acquisition import Acquisition, declare_acquisitions from qibolab.instruments.qm.controller import controllers_config from qibolab.instruments.qm.sequence import BakedPulse, QMPulse, Sequence -from qibolab.pulses import Envelopes, Pulse, PulseSequence, PulseType +from qibolab.pulses import Pulse, PulseSequence, PulseType, Rectangular from qibolab.qubits import Qubit from qibolab.sweeper import Parameter, Sweeper from .conftest import set_platform_profile -Rectangular = Envelopes.RECTANGULAR.value - def test_qmpulse(): pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), "ch0", qubit=0) diff --git a/tests/test_instruments_rfsoc.py b/tests/test_instruments_rfsoc.py index 2ea0c19736..da943061d1 100644 --- a/tests/test_instruments_rfsoc.py +++ b/tests/test_instruments_rfsoc.py @@ -14,7 +14,7 @@ convert_units_sweeper, replace_pulse_shape, ) -from qibolab.pulses import Envelopes, Pulse, PulseSequence, PulseType +from qibolab.pulses import Drag, Gaussian, Pulse, PulseSequence, PulseType, Rectangular from qibolab.qubits import Qubit from qibolab.result import ( AveragedIntegratedResults, @@ -25,10 +25,6 @@ from .conftest import get_instrument -Rectangular = Envelopes.RECTANGULAR.value -Gaussian = Envelopes.GAUSSIAN.value -Drag = Envelopes.DRAG.value - def test_convert_default(dummy_qrc): """Test convert function raises errors when parameter have wrong types.""" diff --git a/tests/test_sweeper.py b/tests/test_sweeper.py index 2b0f7908c7..b4b660f996 100644 --- a/tests/test_sweeper.py +++ b/tests/test_sweeper.py @@ -1,12 +1,10 @@ import numpy as np import pytest -from qibolab.pulses import Envelopes, Pulse +from qibolab.pulses import Pulse, Rectangular from qibolab.qubits import Qubit from qibolab.sweeper import Parameter, QubitParameter, Sweeper -Rectangular = Envelopes.RECTANGULAR.value - @pytest.mark.parametrize("parameter", Parameter) def test_sweeper_pulses(parameter): From 5d3aeb22101fc6265aa9a0e028344aa5ea986301 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 8 Apr 2024 12:32:18 +0200 Subject: [PATCH 0194/1006] fix: Use pydantic to parse pulses, instead of relying on manual identification through marker fields --- src/qibolab/pulses/pulse.py | 5 ++++- src/qibolab/serialize.py | 26 +++++++++++++++++++------- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index efd4c7b85c..3c2c59b55e 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -2,7 +2,7 @@ from dataclasses import fields from enum import Enum -from typing import Optional +from typing import Optional, Union import numpy as np @@ -146,3 +146,6 @@ class VirtualZ(Model): def duration(self): """Duration of the virtual gate should always be zero.""" return 0 + + +PulseLike = Union[Pulse, Delay, VirtualZ] diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index 82dcadce07..afc29824ed 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -10,6 +10,8 @@ from pathlib import Path from typing import Tuple +from pydantic import ConfigDict, TypeAdapter + from qibolab.couplers import Coupler from qibolab.kernels import Kernels from qibolab.native import SingleQubitNatives, TwoQubitNatives @@ -22,6 +24,7 @@ Settings, ) from qibolab.pulses import Delay, Pulse, PulseSequence, PulseType, VirtualZ +from qibolab.pulses.pulse import PulseLike from qibolab.qubits import Qubit, QubitId, QubitPair RUNCARD = "parameters.json" @@ -97,17 +100,26 @@ def load_qubits( return qubits, couplers, pairs -def _load_pulse(pulse_kwargs, qubit): +_PulseLike = TypeAdapter(PulseLike, config=ConfigDict(extra="ignore")) +"""Parse a pulse-like object. + +.. note:: + + Extra arguments are ignored, in order to standardize the qubit handling, since the + :cls:`Delay` object has no `qubit` field. + This will be removed once there won't be any need for dedicated couplers handling. +""" + + +def _load_pulse(pulse_kwargs: dict, qubit: Qubit): coupler = "coupler" in pulse_kwargs - q = pulse_kwargs.pop("coupler" if coupler else "qubit", qubit.name) + pulse_kwargs["qubit"] = pulse_kwargs.pop( + "coupler" if coupler else "qubit", qubit.name + ) - if "phase" in pulse_kwargs: - return VirtualZ(**pulse_kwargs, qubit=q) - if "amplitude" not in pulse_kwargs: - return Delay(**pulse_kwargs) if "frequency" not in pulse_kwargs: return Pulse.flux(**pulse_kwargs, qubit=q) - return Pulse(**pulse_kwargs, qubit=q) + return _PulseLike.validate_python(pulse_kwargs) def _load_single_qubit_natives(qubit, gates) -> SingleQubitNatives: From 4aff3d8af6049f73f7fb108014a24763b0a4c215 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 8 Apr 2024 12:35:47 +0200 Subject: [PATCH 0195/1006] fix: Subclass pulse for automated flux recognition --- src/qibolab/pulses/pulse.py | 8 +++++++- src/qibolab/serialize.py | 2 -- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index 3c2c59b55e..cf93156e96 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -119,6 +119,12 @@ def __hash__(self): ) +class FluxPulse(Pulse): + frequency: float = 0.0 + relative_phase: float = 0.0 + type: PulseType = PulseType.FLUX + + class Delay(Model): """A wait instruction during which we are not sending any pulses to the QPU.""" @@ -148,4 +154,4 @@ def duration(self): return 0 -PulseLike = Union[Pulse, Delay, VirtualZ] +PulseLike = Union[Pulse, FluxPulse, Delay, VirtualZ] diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index afc29824ed..2425489de7 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -117,8 +117,6 @@ def _load_pulse(pulse_kwargs: dict, qubit: Qubit): "coupler" if coupler else "qubit", qubit.name ) - if "frequency" not in pulse_kwargs: - return Pulse.flux(**pulse_kwargs, qubit=q) return _PulseLike.validate_python(pulse_kwargs) From 773d06a2ca293c13c773a41ce453ffc55620290f Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 8 Apr 2024 10:38:47 +0000 Subject: [PATCH 0196/1006] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/qibolab/serialize.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index 2425489de7..e7883139a4 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -23,7 +23,7 @@ QubitPairMap, Settings, ) -from qibolab.pulses import Delay, Pulse, PulseSequence, PulseType, VirtualZ +from qibolab.pulses import Pulse, PulseSequence, PulseType from qibolab.pulses.pulse import PulseLike from qibolab.qubits import Qubit, QubitId, QubitPair From 5b7e6dc6e4263a3b014d0f87a392660db154a195 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 25 Jun 2024 18:59:01 +0200 Subject: [PATCH 0197/1006] fix: Rebase leftover Sorry, it seems like I made some mess... --- flake.nix | 2 +- .../instruments/qblox/cluster_qrm_rf.py | 12 +++++------ tests/test_compilers_default.py | 6 +++--- tests/test_instruments_qm.py | 21 ------------------- 4 files changed, 10 insertions(+), 31 deletions(-) diff --git a/flake.nix b/flake.nix index 478c524c95..9b2c037a89 100644 --- a/flake.nix +++ b/flake.nix @@ -49,7 +49,7 @@ config, ... }: { - packages = with pkgs; [pre-commit poethepoet jupyter stdenv.cc.cc.lib zlib]; + packages = with pkgs; [pre-commit poethepoet jupyter zlib]; env = { QIBOLAB_PLATFORMS = (dirOf config.env.DEVENV_ROOT) + "/qibolab_platforms_qrc"; diff --git a/src/qibolab/instruments/qblox/cluster_qrm_rf.py b/src/qibolab/instruments/qblox/cluster_qrm_rf.py index d09905eeb6..9d582e8598 100644 --- a/src/qibolab/instruments/qblox/cluster_qrm_rf.py +++ b/src/qibolab/instruments/qblox/cluster_qrm_rf.py @@ -993,9 +993,9 @@ def acquire(self): if len(sequencer.pulses.ro_pulses) == 1: pulse = sequencer.pulses.ro_pulses[0] frequency = self.get_if(pulse) - acquisitions[pulse.qubit] = acquisitions[ - pulse.id - ] = AveragedAcquisition(scope, duration, frequency) + acquisitions[pulse.qubit] = acquisitions[pulse.id] = ( + AveragedAcquisition(scope, duration, frequency) + ) else: raise RuntimeError( "Software Demodulation only supports one acquisition per channel. " @@ -1005,9 +1005,9 @@ def acquire(self): results = self.device.get_acquisitions(sequencer.number) for pulse in sequencer.pulses.ro_pulses: bins = results[pulse.id]["acquisition"]["bins"] - acquisitions[pulse.qubit] = acquisitions[ - pulse.id - ] = DemodulatedAcquisition(scope, bins, duration) + acquisitions[pulse.qubit] = acquisitions[pulse.id] = ( + DemodulatedAcquisition(scope, bins, duration) + ) # TODO: to be updated once the functionality of ExecutionResults is extended return {key: acquisition for key, acquisition in acquisitions.items()} diff --git a/tests/test_compilers_default.py b/tests/test_compilers_default.py index ff674a5462..945f098c87 100644 --- a/tests/test_compilers_default.py +++ b/tests/test_compilers_default.py @@ -37,7 +37,7 @@ def compile_circuit(circuit, platform): @pytest.mark.parametrize( - "gateargs", + "gateargs,sequence_len", [ ((gates.I,), 1), ((gates.Z,), 2), @@ -47,11 +47,11 @@ def compile_circuit(circuit, platform): ((gates.U3, 0.1, 0.2, 0.3), 10), ], ) -def test_compile(platform, gateargs): +def test_compile(platform, gateargs, sequence_len): nqubits = platform.nqubits circuit = generate_circuit_with_gate(nqubits, *gateargs) sequence = compile_circuit(circuit, platform) - assert len(sequence) == nqubits * nseq + assert len(sequence) == nqubits * sequence_len def test_compile_two_gates(platform): diff --git a/tests/test_instruments_qm.py b/tests/test_instruments_qm.py index c81c627da0..62b3ef994b 100644 --- a/tests/test_instruments_qm.py +++ b/tests/test_instruments_qm.py @@ -346,21 +346,8 @@ def test_qm_register_pulse(qmplatform, pulse_type, qubit): }, } -<<<<<<< HEAD controller.config.register_element( platform.qubits[qubit], pulse, controller.time_of_flight, controller.smearing -======= - opx.config.register_element( - platform.qubits[qubit], pulse, opx.time_of_flight, opx.smearing - ) - opx.config.register_pulse(platform.qubits[qubit], pulse) - assert opx.config.pulses[str(pulse.id)] == target_pulse - assert target_pulse["waveforms"]["I"] in opx.config.waveforms - assert target_pulse["waveforms"]["Q"] in opx.config.waveforms - assert ( - opx.config.elements[f"{pulse_type}{qubit}"]["operations"][str(pulse.id)] - == pulse.id ->>>>>>> 5f1fb614 (Fix QM issues by stringifying pulses ID) ) qmpulse = QMPulse(pulse) controller.config.register_pulse(platform.qubits[qubit], qmpulse) @@ -386,19 +373,11 @@ def test_qm_register_flux_pulse(qmplatform): "length": pulse.duration, "waveforms": {"single": "constant_wf0.005"}, } -<<<<<<< HEAD qmpulse = QMPulse(pulse) controller.config.register_element(platform.qubits[qubit], pulse) controller.config.register_pulse(platform.qubits[qubit], qmpulse) assert controller.config.pulses[qmpulse.operation] == target_pulse assert target_pulse["waveforms"]["single"] in controller.config.waveforms -======= - opx.config.register_element(platform.qubits[qubit], pulse) - opx.config.register_pulse(platform.qubits[qubit], pulse) - assert opx.config.pulses[str(pulse.id)] == target_pulse - assert target_pulse["waveforms"]["single"] in opx.config.waveforms - assert opx.config.elements[f"flux{qubit}"]["operations"][str(pulse.id)] == pulse.id ->>>>>>> 5f1fb614 (Fix QM issues by stringifying pulses ID) def test_qm_register_pulses_with_different_frequencies(qmplatform): From 0e2d1be809d0a9b4a4da15cecea8262ee4a8ce9c Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 25 Jun 2024 19:02:09 +0200 Subject: [PATCH 0198/1006] chore: Poetry lock --- poetry.lock | 1037 ++++++++++++++++++++++++++------------------------- 1 file changed, 520 insertions(+), 517 deletions(-) diff --git a/poetry.lock b/poetry.lock index 44aadec062..d98e36153e 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.8.2 and should not be changed by hand. [[package]] name = "alabaster" @@ -13,13 +13,13 @@ files = [ [[package]] name = "annotated-types" -version = "0.6.0" +version = "0.7.0" description = "Reusable constraint types to use with typing.Annotated" optional = false python-versions = ">=3.8" files = [ - {file = "annotated_types-0.6.0-py3-none-any.whl", hash = "sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43"}, - {file = "annotated_types-0.6.0.tar.gz", hash = "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d"}, + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, ] [[package]] @@ -35,13 +35,13 @@ files = [ [[package]] name = "anyio" -version = "4.3.0" +version = "4.4.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.8" files = [ - {file = "anyio-4.3.0-py3-none-any.whl", hash = "sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8"}, - {file = "anyio-4.3.0.tar.gz", hash = "sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6"}, + {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, + {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, ] [package.dependencies] @@ -122,13 +122,13 @@ tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "p [[package]] name = "azure-core" -version = "1.30.1" +version = "1.30.2" description = "Microsoft Azure Core Library for Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "azure-core-1.30.1.tar.gz", hash = "sha256:26273a254131f84269e8ea4464f3560c731f29c0c1f69ac99010845f239c1a8f"}, - {file = "azure_core-1.30.1-py3-none-any.whl", hash = "sha256:7c5ee397e48f281ec4dd773d67a0a47a0962ed6fa833036057f9ea067f688e74"}, + {file = "azure-core-1.30.2.tar.gz", hash = "sha256:a14dc210efcd608821aa472d9fb8e8d035d29b68993819147bc290a8ac224472"}, + {file = "azure_core-1.30.2-py3-none-any.whl", hash = "sha256:cf019c1ca832e96274ae85abd3d9f752397194d9fea3b41487290562ac8abe4a"}, ] [package.dependencies] @@ -141,13 +141,13 @@ aio = ["aiohttp (>=3.0)"] [[package]] name = "azure-identity" -version = "1.16.0" +version = "1.17.1" description = "Microsoft Azure Identity Library for Python" optional = false python-versions = ">=3.8" files = [ - {file = "azure-identity-1.16.0.tar.gz", hash = "sha256:6ff1d667cdcd81da1ceab42f80a0be63ca846629f518a922f7317a7e3c844e1b"}, - {file = "azure_identity-1.16.0-py3-none-any.whl", hash = "sha256:722fdb60b8fdd55fa44dc378b8072f4b419b56a5e54c0de391f644949f3a826f"}, + {file = "azure-identity-1.17.1.tar.gz", hash = "sha256:32ecc67cc73f4bd0595e4f64b1ca65cd05186f4fe6f98ed2ae9f1aa32646efea"}, + {file = "azure_identity-1.17.1-py3-none-any.whl", hash = "sha256:db8d59c183b680e763722bfe8ebc45930e6c57df510620985939f7f3191e0382"}, ] [package.dependencies] @@ -155,6 +155,7 @@ azure-core = ">=1.23.0" cryptography = ">=2.5" msal = ">=1.24.0" msal-extensions = ">=0.3.0" +typing-extensions = ">=4.0.0" [[package]] name = "babel" @@ -290,13 +291,13 @@ files = [ [[package]] name = "certifi" -version = "2024.2.2" +version = "2024.6.2" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, - {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, + {file = "certifi-2024.6.2-py3-none-any.whl", hash = "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"}, + {file = "certifi-2024.6.2.tar.gz", hash = "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516"}, ] [[package]] @@ -612,63 +613,63 @@ test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] [[package]] name = "coverage" -version = "7.5.1" +version = "7.5.4" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c0884920835a033b78d1c73b6d3bbcda8161a900f38a488829a83982925f6c2e"}, - {file = "coverage-7.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:39afcd3d4339329c5f58de48a52f6e4e50f6578dd6099961cf22228feb25f38f"}, - {file = "coverage-7.5.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a7b0ceee8147444347da6a66be737c9d78f3353b0681715b668b72e79203e4a"}, - {file = "coverage-7.5.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a9ca3f2fae0088c3c71d743d85404cec8df9be818a005ea065495bedc33da35"}, - {file = "coverage-7.5.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fd215c0c7d7aab005221608a3c2b46f58c0285a819565887ee0b718c052aa4e"}, - {file = "coverage-7.5.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4bf0655ab60d754491004a5efd7f9cccefcc1081a74c9ef2da4735d6ee4a6223"}, - {file = "coverage-7.5.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:61c4bf1ba021817de12b813338c9be9f0ad5b1e781b9b340a6d29fc13e7c1b5e"}, - {file = "coverage-7.5.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:db66fc317a046556a96b453a58eced5024af4582a8dbdc0c23ca4dbc0d5b3146"}, - {file = "coverage-7.5.1-cp310-cp310-win32.whl", hash = "sha256:b016ea6b959d3b9556cb401c55a37547135a587db0115635a443b2ce8f1c7228"}, - {file = "coverage-7.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:df4e745a81c110e7446b1cc8131bf986157770fa405fe90e15e850aaf7619bc8"}, - {file = "coverage-7.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:796a79f63eca8814ca3317a1ea443645c9ff0d18b188de470ed7ccd45ae79428"}, - {file = "coverage-7.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4fc84a37bfd98db31beae3c2748811a3fa72bf2007ff7902f68746d9757f3746"}, - {file = "coverage-7.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6175d1a0559986c6ee3f7fccfc4a90ecd12ba0a383dcc2da30c2b9918d67d8a3"}, - {file = "coverage-7.5.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fc81d5878cd6274ce971e0a3a18a8803c3fe25457165314271cf78e3aae3aa2"}, - {file = "coverage-7.5.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:556cf1a7cbc8028cb60e1ff0be806be2eded2daf8129b8811c63e2b9a6c43bca"}, - {file = "coverage-7.5.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9981706d300c18d8b220995ad22627647be11a4276721c10911e0e9fa44c83e8"}, - {file = "coverage-7.5.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d7fed867ee50edf1a0b4a11e8e5d0895150e572af1cd6d315d557758bfa9c057"}, - {file = "coverage-7.5.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ef48e2707fb320c8f139424a596f5b69955a85b178f15af261bab871873bb987"}, - {file = "coverage-7.5.1-cp311-cp311-win32.whl", hash = "sha256:9314d5678dcc665330df5b69c1e726a0e49b27df0461c08ca12674bcc19ef136"}, - {file = "coverage-7.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:5fa567e99765fe98f4e7d7394ce623e794d7cabb170f2ca2ac5a4174437e90dd"}, - {file = "coverage-7.5.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b6cf3764c030e5338e7f61f95bd21147963cf6aa16e09d2f74f1fa52013c1206"}, - {file = "coverage-7.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ec92012fefebee89a6b9c79bc39051a6cb3891d562b9270ab10ecfdadbc0c34"}, - {file = "coverage-7.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16db7f26000a07efcf6aea00316f6ac57e7d9a96501e990a36f40c965ec7a95d"}, - {file = "coverage-7.5.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:beccf7b8a10b09c4ae543582c1319c6df47d78fd732f854ac68d518ee1fb97fa"}, - {file = "coverage-7.5.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8748731ad392d736cc9ccac03c9845b13bb07d020a33423fa5b3a36521ac6e4e"}, - {file = "coverage-7.5.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7352b9161b33fd0b643ccd1f21f3a3908daaddf414f1c6cb9d3a2fd618bf2572"}, - {file = "coverage-7.5.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:7a588d39e0925f6a2bff87154752481273cdb1736270642aeb3635cb9b4cad07"}, - {file = "coverage-7.5.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:68f962d9b72ce69ea8621f57551b2fa9c70509af757ee3b8105d4f51b92b41a7"}, - {file = "coverage-7.5.1-cp312-cp312-win32.whl", hash = "sha256:f152cbf5b88aaeb836127d920dd0f5e7edff5a66f10c079157306c4343d86c19"}, - {file = "coverage-7.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:5a5740d1fb60ddf268a3811bcd353de34eb56dc24e8f52a7f05ee513b2d4f596"}, - {file = "coverage-7.5.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e2213def81a50519d7cc56ed643c9e93e0247f5bbe0d1247d15fa520814a7cd7"}, - {file = "coverage-7.5.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5037f8fcc2a95b1f0e80585bd9d1ec31068a9bcb157d9750a172836e98bc7a90"}, - {file = "coverage-7.5.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3721c2c9e4c4953a41a26c14f4cef64330392a6d2d675c8b1db3b645e31f0e"}, - {file = "coverage-7.5.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca498687ca46a62ae590253fba634a1fe9836bc56f626852fb2720f334c9e4e5"}, - {file = "coverage-7.5.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0cdcbc320b14c3e5877ee79e649677cb7d89ef588852e9583e6b24c2e5072661"}, - {file = "coverage-7.5.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:57e0204b5b745594e5bc14b9b50006da722827f0b8c776949f1135677e88d0b8"}, - {file = "coverage-7.5.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8fe7502616b67b234482c3ce276ff26f39ffe88adca2acf0261df4b8454668b4"}, - {file = "coverage-7.5.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:9e78295f4144f9dacfed4f92935fbe1780021247c2fabf73a819b17f0ccfff8d"}, - {file = "coverage-7.5.1-cp38-cp38-win32.whl", hash = "sha256:1434e088b41594baa71188a17533083eabf5609e8e72f16ce8c186001e6b8c41"}, - {file = "coverage-7.5.1-cp38-cp38-win_amd64.whl", hash = "sha256:0646599e9b139988b63704d704af8e8df7fa4cbc4a1f33df69d97f36cb0a38de"}, - {file = "coverage-7.5.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4cc37def103a2725bc672f84bd939a6fe4522310503207aae4d56351644682f1"}, - {file = "coverage-7.5.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fc0b4d8bfeabd25ea75e94632f5b6e047eef8adaed0c2161ada1e922e7f7cece"}, - {file = "coverage-7.5.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d0a0f5e06881ecedfe6f3dd2f56dcb057b6dbeb3327fd32d4b12854df36bf26"}, - {file = "coverage-7.5.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9735317685ba6ec7e3754798c8871c2f49aa5e687cc794a0b1d284b2389d1bd5"}, - {file = "coverage-7.5.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d21918e9ef11edf36764b93101e2ae8cc82aa5efdc7c5a4e9c6c35a48496d601"}, - {file = "coverage-7.5.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c3e757949f268364b96ca894b4c342b41dc6f8f8b66c37878aacef5930db61be"}, - {file = "coverage-7.5.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:79afb6197e2f7f60c4824dd4b2d4c2ec5801ceb6ba9ce5d2c3080e5660d51a4f"}, - {file = "coverage-7.5.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d1d0d98d95dd18fe29dc66808e1accf59f037d5716f86a501fc0256455219668"}, - {file = "coverage-7.5.1-cp39-cp39-win32.whl", hash = "sha256:1cc0fe9b0b3a8364093c53b0b4c0c2dd4bb23acbec4c9240b5f284095ccf7981"}, - {file = "coverage-7.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:dde0070c40ea8bb3641e811c1cfbf18e265d024deff6de52c5950677a8fb1e0f"}, - {file = "coverage-7.5.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:6537e7c10cc47c595828b8a8be04c72144725c383c4702703ff4e42e44577312"}, - {file = "coverage-7.5.1.tar.gz", hash = "sha256:54de9ef3a9da981f7af93eafde4ede199e0846cd819eb27c88e2b712aae9708c"}, + {file = "coverage-7.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6cfb5a4f556bb51aba274588200a46e4dd6b505fb1a5f8c5ae408222eb416f99"}, + {file = "coverage-7.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2174e7c23e0a454ffe12267a10732c273243b4f2d50d07544a91198f05c48f47"}, + {file = "coverage-7.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2214ee920787d85db1b6a0bd9da5f8503ccc8fcd5814d90796c2f2493a2f4d2e"}, + {file = "coverage-7.5.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1137f46adb28e3813dec8c01fefadcb8c614f33576f672962e323b5128d9a68d"}, + {file = "coverage-7.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b385d49609f8e9efc885790a5a0e89f2e3ae042cdf12958b6034cc442de428d3"}, + {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b4a474f799456e0eb46d78ab07303286a84a3140e9700b9e154cfebc8f527016"}, + {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5cd64adedf3be66f8ccee418473c2916492d53cbafbfcff851cbec5a8454b136"}, + {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e564c2cf45d2f44a9da56f4e3a26b2236504a496eb4cb0ca7221cd4cc7a9aca9"}, + {file = "coverage-7.5.4-cp310-cp310-win32.whl", hash = "sha256:7076b4b3a5f6d2b5d7f1185fde25b1e54eb66e647a1dfef0e2c2bfaf9b4c88c8"}, + {file = "coverage-7.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:018a12985185038a5b2bcafab04ab833a9a0f2c59995b3cec07e10074c78635f"}, + {file = "coverage-7.5.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:db14f552ac38f10758ad14dd7b983dbab424e731588d300c7db25b6f89e335b5"}, + {file = "coverage-7.5.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3257fdd8e574805f27bb5342b77bc65578e98cbc004a92232106344053f319ba"}, + {file = "coverage-7.5.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a6612c99081d8d6134005b1354191e103ec9705d7ba2754e848211ac8cacc6b"}, + {file = "coverage-7.5.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d45d3cbd94159c468b9b8c5a556e3f6b81a8d1af2a92b77320e887c3e7a5d080"}, + {file = "coverage-7.5.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed550e7442f278af76d9d65af48069f1fb84c9f745ae249c1a183c1e9d1b025c"}, + {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7a892be37ca35eb5019ec85402c3371b0f7cda5ab5056023a7f13da0961e60da"}, + {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8192794d120167e2a64721d88dbd688584675e86e15d0569599257566dec9bf0"}, + {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:820bc841faa502e727a48311948e0461132a9c8baa42f6b2b84a29ced24cc078"}, + {file = "coverage-7.5.4-cp311-cp311-win32.whl", hash = "sha256:6aae5cce399a0f065da65c7bb1e8abd5c7a3043da9dceb429ebe1b289bc07806"}, + {file = "coverage-7.5.4-cp311-cp311-win_amd64.whl", hash = "sha256:d2e344d6adc8ef81c5a233d3a57b3c7d5181f40e79e05e1c143da143ccb6377d"}, + {file = "coverage-7.5.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:54317c2b806354cbb2dc7ac27e2b93f97096912cc16b18289c5d4e44fc663233"}, + {file = "coverage-7.5.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:042183de01f8b6d531e10c197f7f0315a61e8d805ab29c5f7b51a01d62782747"}, + {file = "coverage-7.5.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6bb74ed465d5fb204b2ec41d79bcd28afccf817de721e8a807d5141c3426638"}, + {file = "coverage-7.5.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3d45ff86efb129c599a3b287ae2e44c1e281ae0f9a9bad0edc202179bcc3a2e"}, + {file = "coverage-7.5.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5013ed890dc917cef2c9f765c4c6a8ae9df983cd60dbb635df8ed9f4ebc9f555"}, + {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1014fbf665fef86cdfd6cb5b7371496ce35e4d2a00cda501cf9f5b9e6fced69f"}, + {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3684bc2ff328f935981847082ba4fdc950d58906a40eafa93510d1b54c08a66c"}, + {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:581ea96f92bf71a5ec0974001f900db495488434a6928a2ca7f01eee20c23805"}, + {file = "coverage-7.5.4-cp312-cp312-win32.whl", hash = "sha256:73ca8fbc5bc622e54627314c1a6f1dfdd8db69788f3443e752c215f29fa87a0b"}, + {file = "coverage-7.5.4-cp312-cp312-win_amd64.whl", hash = "sha256:cef4649ec906ea7ea5e9e796e68b987f83fa9a718514fe147f538cfeda76d7a7"}, + {file = "coverage-7.5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdd31315fc20868c194130de9ee6bfd99755cc9565edff98ecc12585b90be882"}, + {file = "coverage-7.5.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:02ff6e898197cc1e9fa375581382b72498eb2e6d5fc0b53f03e496cfee3fac6d"}, + {file = "coverage-7.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d05c16cf4b4c2fc880cb12ba4c9b526e9e5d5bb1d81313d4d732a5b9fe2b9d53"}, + {file = "coverage-7.5.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5986ee7ea0795a4095ac4d113cbb3448601efca7f158ec7f7087a6c705304e4"}, + {file = "coverage-7.5.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5df54843b88901fdc2f598ac06737f03d71168fd1175728054c8f5a2739ac3e4"}, + {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ab73b35e8d109bffbda9a3e91c64e29fe26e03e49addf5b43d85fc426dde11f9"}, + {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:aea072a941b033813f5e4814541fc265a5c12ed9720daef11ca516aeacd3bd7f"}, + {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:16852febd96acd953b0d55fc842ce2dac1710f26729b31c80b940b9afcd9896f"}, + {file = "coverage-7.5.4-cp38-cp38-win32.whl", hash = "sha256:8f894208794b164e6bd4bba61fc98bf6b06be4d390cf2daacfa6eca0a6d2bb4f"}, + {file = "coverage-7.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:e2afe743289273209c992075a5a4913e8d007d569a406ffed0bd080ea02b0633"}, + {file = "coverage-7.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b95c3a8cb0463ba9f77383d0fa8c9194cf91f64445a63fc26fb2327e1e1eb088"}, + {file = "coverage-7.5.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3d7564cc09dd91b5a6001754a5b3c6ecc4aba6323baf33a12bd751036c998be4"}, + {file = "coverage-7.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44da56a2589b684813f86d07597fdf8a9c6ce77f58976727329272f5a01f99f7"}, + {file = "coverage-7.5.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e16f3d6b491c48c5ae726308e6ab1e18ee830b4cdd6913f2d7f77354b33f91c8"}, + {file = "coverage-7.5.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbc5958cb471e5a5af41b0ddaea96a37e74ed289535e8deca404811f6cb0bc3d"}, + {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a04e990a2a41740b02d6182b498ee9796cf60eefe40cf859b016650147908029"}, + {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ddbd2f9713a79e8e7242d7c51f1929611e991d855f414ca9996c20e44a895f7c"}, + {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b1ccf5e728ccf83acd313c89f07c22d70d6c375a9c6f339233dcf792094bcbf7"}, + {file = "coverage-7.5.4-cp39-cp39-win32.whl", hash = "sha256:56b4eafa21c6c175b3ede004ca12c653a88b6f922494b023aeb1e836df953ace"}, + {file = "coverage-7.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:65e528e2e921ba8fd67d9055e6b9f9e34b21ebd6768ae1c1723f4ea6ace1234d"}, + {file = "coverage-7.5.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:79b356f3dd5b26f3ad23b35c75dbdaf1f9e2450b6bcefc6d0825ea0aa3f86ca5"}, + {file = "coverage-7.5.4.tar.gz", hash = "sha256:a44963520b069e12789d0faea4e9fdb1e410cdc4aab89d94f7f55cbb7fef0353"}, ] [package.dependencies] @@ -679,43 +680,43 @@ toml = ["tomli"] [[package]] name = "cryptography" -version = "42.0.7" +version = "42.0.8" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-42.0.7-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:a987f840718078212fdf4504d0fd4c6effe34a7e4740378e59d47696e8dfb477"}, - {file = "cryptography-42.0.7-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bd13b5e9b543532453de08bcdc3cc7cebec6f9883e886fd20a92f26940fd3e7a"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a79165431551042cc9d1d90e6145d5d0d3ab0f2d66326c201d9b0e7f5bf43604"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a47787a5e3649008a1102d3df55424e86606c9bae6fb77ac59afe06d234605f8"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:02c0eee2d7133bdbbc5e24441258d5d2244beb31da5ed19fbb80315f4bbbff55"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5e44507bf8d14b36b8389b226665d597bc0f18ea035d75b4e53c7b1ea84583cc"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:7f8b25fa616d8b846aef64b15c606bb0828dbc35faf90566eb139aa9cff67af2"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:93a3209f6bb2b33e725ed08ee0991b92976dfdcf4e8b38646540674fc7508e13"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e6b8f1881dac458c34778d0a424ae5769de30544fc678eac51c1c8bb2183e9da"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3de9a45d3b2b7d8088c3fbf1ed4395dfeff79d07842217b38df14ef09ce1d8d7"}, - {file = "cryptography-42.0.7-cp37-abi3-win32.whl", hash = "sha256:789caea816c6704f63f6241a519bfa347f72fbd67ba28d04636b7c6b7da94b0b"}, - {file = "cryptography-42.0.7-cp37-abi3-win_amd64.whl", hash = "sha256:8cb8ce7c3347fcf9446f201dc30e2d5a3c898d009126010cbd1f443f28b52678"}, - {file = "cryptography-42.0.7-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:a3a5ac8b56fe37f3125e5b72b61dcde43283e5370827f5233893d461b7360cd4"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:779245e13b9a6638df14641d029add5dc17edbef6ec915688f3acb9e720a5858"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d563795db98b4cd57742a78a288cdbdc9daedac29f2239793071fe114f13785"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:31adb7d06fe4383226c3e963471f6837742889b3c4caa55aac20ad951bc8ffda"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:efd0bf5205240182e0f13bcaea41be4fdf5c22c5129fc7ced4a0282ac86998c9"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a9bc127cdc4ecf87a5ea22a2556cab6c7eda2923f84e4f3cc588e8470ce4e42e"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:3577d029bc3f4827dd5bf8bf7710cac13527b470bbf1820a3f394adb38ed7d5f"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2e47577f9b18723fa294b0ea9a17d5e53a227867a0a4904a1a076d1646d45ca1"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1a58839984d9cb34c855197043eaae2c187d930ca6d644612843b4fe8513c886"}, - {file = "cryptography-42.0.7-cp39-abi3-win32.whl", hash = "sha256:e6b79d0adb01aae87e8a44c2b64bc3f3fe59515280e00fb6d57a7267a2583cda"}, - {file = "cryptography-42.0.7-cp39-abi3-win_amd64.whl", hash = "sha256:16268d46086bb8ad5bf0a2b5544d8a9ed87a0e33f5e77dd3c3301e63d941a83b"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2954fccea107026512b15afb4aa664a5640cd0af630e2ee3962f2602693f0c82"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:362e7197754c231797ec45ee081f3088a27a47c6c01eff2ac83f60f85a50fe60"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4f698edacf9c9e0371112792558d2f705b5645076cc0aaae02f816a0171770fd"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5482e789294854c28237bba77c4c83be698be740e31a3ae5e879ee5444166582"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e9b2a6309f14c0497f348d08a065d52f3020656f675819fc405fb63bbcd26562"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d8e3098721b84392ee45af2dd554c947c32cc52f862b6a3ae982dbb90f577f14"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c65f96dad14f8528a447414125e1fc8feb2ad5a272b8f68477abbcc1ea7d94b9"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36017400817987670037fbb0324d71489b6ead6231c9604f8fc1f7d008087c68"}, - {file = "cryptography-42.0.7.tar.gz", hash = "sha256:ecbfbc00bf55888edda9868a4cf927205de8499e7fabe6c050322298382953f2"}, + {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:81d8a521705787afe7a18d5bfb47ea9d9cc068206270aad0b96a725022e18d2e"}, + {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:961e61cefdcb06e0c6d7e3a1b22ebe8b996eb2bf50614e89384be54c48c6b63d"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3ec3672626e1b9e55afd0df6d774ff0e953452886e06e0f1eb7eb0c832e8902"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e599b53fd95357d92304510fb7bda8523ed1f79ca98dce2f43c115950aa78801"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5226d5d21ab681f432a9c1cf8b658c0cb02533eece706b155e5fbd8a0cdd3949"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6b7c4f03ce01afd3b76cf69a5455caa9cfa3de8c8f493e0d3ab7d20611c8dae9"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:2346b911eb349ab547076f47f2e035fc8ff2c02380a7cbbf8d87114fa0f1c583"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ad803773e9df0b92e0a817d22fd8a3675493f690b96130a5e24f1b8fabbea9c7"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2f66d9cd9147ee495a8374a45ca445819f8929a3efcd2e3df6428e46c3cbb10b"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d45b940883a03e19e944456a558b67a41160e367a719833c53de6911cabba2b7"}, + {file = "cryptography-42.0.8-cp37-abi3-win32.whl", hash = "sha256:a0c5b2b0585b6af82d7e385f55a8bc568abff8923af147ee3c07bd8b42cda8b2"}, + {file = "cryptography-42.0.8-cp37-abi3-win_amd64.whl", hash = "sha256:57080dee41209e556a9a4ce60d229244f7a66ef52750f813bfbe18959770cfba"}, + {file = "cryptography-42.0.8-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:dea567d1b0e8bc5764b9443858b673b734100c2871dc93163f58c46a97a83d28"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4783183f7cb757b73b2ae9aed6599b96338eb957233c58ca8f49a49cc32fd5e"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0608251135d0e03111152e41f0cc2392d1e74e35703960d4190b2e0f4ca9c70"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dc0fdf6787f37b1c6b08e6dfc892d9d068b5bdb671198c72072828b80bd5fe4c"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9c0c1716c8447ee7dbf08d6db2e5c41c688544c61074b54fc4564196f55c25a7"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fff12c88a672ab9c9c1cf7b0c80e3ad9e2ebd9d828d955c126be4fd3e5578c9e"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:cafb92b2bc622cd1aa6a1dce4b93307792633f4c5fe1f46c6b97cf67073ec961"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:31f721658a29331f895a5a54e7e82075554ccfb8b163a18719d342f5ffe5ecb1"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b297f90c5723d04bcc8265fc2a0f86d4ea2e0f7ab4b6994459548d3a6b992a14"}, + {file = "cryptography-42.0.8-cp39-abi3-win32.whl", hash = "sha256:2f88d197e66c65be5e42cd72e5c18afbfae3f741742070e3019ac8f4ac57262c"}, + {file = "cryptography-42.0.8-cp39-abi3-win_amd64.whl", hash = "sha256:fa76fbb7596cc5839320000cdd5d0955313696d9511debab7ee7278fc8b5c84a"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ba4f0a211697362e89ad822e667d8d340b4d8d55fae72cdd619389fb5912eefe"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:81884c4d096c272f00aeb1f11cf62ccd39763581645b0812e99a91505fa48e0c"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c9bb2ae11bfbab395bdd072985abde58ea9860ed84e59dbc0463a5d0159f5b71"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7016f837e15b0a1c119d27ecd89b3515f01f90a8615ed5e9427e30d9cdbfed3d"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5a94eccb2a81a309806027e1670a358b99b8fe8bfe9f8d329f27d72c094dde8c"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dec9b018df185f08483f294cae6ccac29e7a6e0678996587363dc352dc65c842"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:343728aac38decfdeecf55ecab3264b015be68fc2816ca800db649607aeee648"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:013629ae70b40af70c9a7a5db40abe5d9054e6f4380e50ce769947b73bf3caad"}, + {file = "cryptography-42.0.8.tar.gz", hash = "sha256:8d09d05439ce7baa8e9e95b07ec5b6c886f548deb7e0f69ef25f64b3bce842f2"}, ] [package.dependencies] @@ -748,13 +749,13 @@ tests = ["pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "dash" -version = "2.17.0" +version = "2.17.1" description = "A Python framework for building reactive web-apps. Developed by Plotly." optional = false python-versions = ">=3.8" files = [ - {file = "dash-2.17.0-py3-none-any.whl", hash = "sha256:2421569023b2cd46ea2d4b2c14fe72c71b7436527a3102219b2265fa361e7c67"}, - {file = "dash-2.17.0.tar.gz", hash = "sha256:d065cd88771e45d0485993be0d27565e08918cb7edd18e31ee1c5b41252fc2fa"}, + {file = "dash-2.17.1-py3-none-any.whl", hash = "sha256:3eefc9ac67003f93a06bc3e500cae0a6787c48e6c81f6f61514239ae2da414e4"}, + {file = "dash-2.17.1.tar.gz", hash = "sha256:ee2d9c319de5dcc1314085710b72cd5fa63ff994d913bf72979b7130daeea28e"}, ] [package.dependencies] @@ -773,11 +774,11 @@ Werkzeug = "<3.1" [package.extras] celery = ["celery[redis] (>=5.1.2)", "redis (>=3.5.3)"] -ci = ["black (==22.3.0)", "dash-dangerously-set-inner-html", "dash-flow-example (==0.0.5)", "flake8 (==7.0.0)", "flaky (==3.8.1)", "flask-talisman (==1.0.0)", "jupyterlab (<4.0.0)", "mimesis (<=11.1.0)", "mock (==4.0.3)", "numpy (<=1.26.3)", "openpyxl", "orjson (==3.9.12)", "pandas (>=1.4.0)", "pyarrow", "pylint (==3.0.3)", "pytest-mock", "pytest-rerunfailures", "pytest-sugar (==0.9.6)", "pyzmq (==25.1.2)", "xlrd (>=2.0.1)"] +ci = ["black (==22.3.0)", "dash-dangerously-set-inner-html", "dash-flow-example (==0.0.5)", "flake8 (==7.0.0)", "flaky (==3.8.1)", "flask-talisman (==1.0.0)", "jupyterlab (<4.0.0)", "mimesis (<=11.1.0)", "mock (==4.0.3)", "numpy (<=1.26.3)", "openpyxl", "orjson (==3.10.3)", "pandas (>=1.4.0)", "pyarrow", "pylint (==3.0.3)", "pytest-mock", "pytest-rerunfailures", "pytest-sugar (==0.9.6)", "pyzmq (==25.1.2)", "xlrd (>=2.0.1)"] compress = ["flask-compress"] dev = ["PyYAML (>=5.4.1)", "coloredlogs (>=15.0.1)", "fire (>=0.4.0)"] diskcache = ["diskcache (>=5.2.1)", "multiprocess (>=0.70.12)", "psutil (>=5.8.0)"] -testing = ["beautifulsoup4 (>=4.8.2)", "cryptography (<3.4)", "dash-testing-stub (>=0.0.2)", "lxml (>=4.6.2)", "multiprocess (>=0.70.12)", "percy (>=2.0.2)", "psutil (>=5.8.0)", "pytest (>=6.0.2)", "requests[security] (>=2.21.0)", "selenium (>=3.141.0,<=4.2.0)", "waitress (>=1.4.4)"] +testing = ["beautifulsoup4 (>=4.8.2)", "cryptography", "dash-testing-stub (>=0.0.2)", "lxml (>=4.6.2)", "multiprocess (>=0.70.12)", "percy (>=2.0.2)", "psutil (>=5.8.0)", "pytest (>=6.0.2)", "requests[security] (>=2.21.0)", "selenium (>=3.141.0,<=4.2.0)", "waitress (>=1.4.4)"] [[package]] name = "dash-bootstrap-components" @@ -855,13 +856,13 @@ files = [ [[package]] name = "datadog-api-client" -version = "2.24.1" +version = "2.25.0" description = "Collection of all Datadog Public endpoints" optional = false python-versions = ">=3.7" files = [ - {file = "datadog_api_client-2.24.1-py3-none-any.whl", hash = "sha256:bf404b29798689d3362c1568a24602a489a2c6f10c778bbcd15411687c93c289"}, - {file = "datadog_api_client-2.24.1.tar.gz", hash = "sha256:63f4fe3c5876da73d5162678567b941a56f3f42fac1477307c478662a06e1ea3"}, + {file = "datadog_api_client-2.25.0-py3-none-any.whl", hash = "sha256:c173cd49f8e7832d58b39e8139dc288315f34a724107601b3c62f322aa2ce98b"}, + {file = "datadog_api_client-2.25.0.tar.gz", hash = "sha256:61feed575bd6d6e41439e2942dc7d4d338a3deeb514551dfa35cdedc25053572"}, ] [package.dependencies] @@ -1081,13 +1082,13 @@ pyrepl = ">=0.8.2" [[package]] name = "fastjsonschema" -version = "2.19.1" +version = "2.20.0" description = "Fastest Python implementation of JSON schema" optional = false python-versions = "*" files = [ - {file = "fastjsonschema-2.19.1-py3-none-any.whl", hash = "sha256:3672b47bc94178c9f23dbb654bf47440155d4db9df5f7bc47643315f9c405cd0"}, - {file = "fastjsonschema-2.19.1.tar.gz", hash = "sha256:e3126a94bdc4623d3de4485f8d468a12f02a67921315ddc87836d6e456dc789d"}, + {file = "fastjsonschema-2.20.0-py3-none-any.whl", hash = "sha256:5875f0b0fa7a0043a91e93a9b8f793bcbbba9691e7fd83dca95c28ba26d21f0a"}, + {file = "fastjsonschema-2.20.0.tar.gz", hash = "sha256:3d48fc5300ee96f5d116f10fe6f28d938e6008f59a6a025c2649475b87f76a23"}, ] [package.extras] @@ -1118,53 +1119,53 @@ dotenv = ["python-dotenv"] [[package]] name = "fonttools" -version = "4.51.0" +version = "4.53.0" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.51.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:84d7751f4468dd8cdd03ddada18b8b0857a5beec80bce9f435742abc9a851a74"}, - {file = "fonttools-4.51.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8b4850fa2ef2cfbc1d1f689bc159ef0f45d8d83298c1425838095bf53ef46308"}, - {file = "fonttools-4.51.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5b48a1121117047d82695d276c2af2ee3a24ffe0f502ed581acc2673ecf1037"}, - {file = "fonttools-4.51.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:180194c7fe60c989bb627d7ed5011f2bef1c4d36ecf3ec64daec8302f1ae0716"}, - {file = "fonttools-4.51.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:96a48e137c36be55e68845fc4284533bda2980f8d6f835e26bca79d7e2006438"}, - {file = "fonttools-4.51.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:806e7912c32a657fa39d2d6eb1d3012d35f841387c8fc6cf349ed70b7c340039"}, - {file = "fonttools-4.51.0-cp310-cp310-win32.whl", hash = "sha256:32b17504696f605e9e960647c5f64b35704782a502cc26a37b800b4d69ff3c77"}, - {file = "fonttools-4.51.0-cp310-cp310-win_amd64.whl", hash = "sha256:c7e91abdfae1b5c9e3a543f48ce96013f9a08c6c9668f1e6be0beabf0a569c1b"}, - {file = "fonttools-4.51.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a8feca65bab31479d795b0d16c9a9852902e3a3c0630678efb0b2b7941ea9c74"}, - {file = "fonttools-4.51.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ac27f436e8af7779f0bb4d5425aa3535270494d3bc5459ed27de3f03151e4c2"}, - {file = "fonttools-4.51.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e19bd9e9964a09cd2433a4b100ca7f34e34731e0758e13ba9a1ed6e5468cc0f"}, - {file = "fonttools-4.51.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2b92381f37b39ba2fc98c3a45a9d6383bfc9916a87d66ccb6553f7bdd129097"}, - {file = "fonttools-4.51.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5f6bc991d1610f5c3bbe997b0233cbc234b8e82fa99fc0b2932dc1ca5e5afec0"}, - {file = "fonttools-4.51.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9696fe9f3f0c32e9a321d5268208a7cc9205a52f99b89479d1b035ed54c923f1"}, - {file = "fonttools-4.51.0-cp311-cp311-win32.whl", hash = "sha256:3bee3f3bd9fa1d5ee616ccfd13b27ca605c2b4270e45715bd2883e9504735034"}, - {file = "fonttools-4.51.0-cp311-cp311-win_amd64.whl", hash = "sha256:0f08c901d3866a8905363619e3741c33f0a83a680d92a9f0e575985c2634fcc1"}, - {file = "fonttools-4.51.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4060acc2bfa2d8e98117828a238889f13b6f69d59f4f2d5857eece5277b829ba"}, - {file = "fonttools-4.51.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1250e818b5f8a679ad79660855528120a8f0288f8f30ec88b83db51515411fcc"}, - {file = "fonttools-4.51.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76f1777d8b3386479ffb4a282e74318e730014d86ce60f016908d9801af9ca2a"}, - {file = "fonttools-4.51.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b5ad456813d93b9c4b7ee55302208db2b45324315129d85275c01f5cb7e61a2"}, - {file = "fonttools-4.51.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:68b3fb7775a923be73e739f92f7e8a72725fd333eab24834041365d2278c3671"}, - {file = "fonttools-4.51.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8e2f1a4499e3b5ee82c19b5ee57f0294673125c65b0a1ff3764ea1f9db2f9ef5"}, - {file = "fonttools-4.51.0-cp312-cp312-win32.whl", hash = "sha256:278e50f6b003c6aed19bae2242b364e575bcb16304b53f2b64f6551b9c000e15"}, - {file = "fonttools-4.51.0-cp312-cp312-win_amd64.whl", hash = "sha256:b3c61423f22165541b9403ee39874dcae84cd57a9078b82e1dce8cb06b07fa2e"}, - {file = "fonttools-4.51.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:1621ee57da887c17312acc4b0e7ac30d3a4fb0fec6174b2e3754a74c26bbed1e"}, - {file = "fonttools-4.51.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e9d9298be7a05bb4801f558522adbe2feea1b0b103d5294ebf24a92dd49b78e5"}, - {file = "fonttools-4.51.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee1af4be1c5afe4c96ca23badd368d8dc75f611887fb0c0dac9f71ee5d6f110e"}, - {file = "fonttools-4.51.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c18b49adc721a7d0b8dfe7c3130c89b8704baf599fb396396d07d4aa69b824a1"}, - {file = "fonttools-4.51.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de7c29bdbdd35811f14493ffd2534b88f0ce1b9065316433b22d63ca1cd21f14"}, - {file = "fonttools-4.51.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cadf4e12a608ef1d13e039864f484c8a968840afa0258b0b843a0556497ea9ed"}, - {file = "fonttools-4.51.0-cp38-cp38-win32.whl", hash = "sha256:aefa011207ed36cd280babfaa8510b8176f1a77261833e895a9d96e57e44802f"}, - {file = "fonttools-4.51.0-cp38-cp38-win_amd64.whl", hash = "sha256:865a58b6e60b0938874af0968cd0553bcd88e0b2cb6e588727117bd099eef836"}, - {file = "fonttools-4.51.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:60a3409c9112aec02d5fb546f557bca6efa773dcb32ac147c6baf5f742e6258b"}, - {file = "fonttools-4.51.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f7e89853d8bea103c8e3514b9f9dc86b5b4120afb4583b57eb10dfa5afbe0936"}, - {file = "fonttools-4.51.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56fc244f2585d6c00b9bcc59e6593e646cf095a96fe68d62cd4da53dd1287b55"}, - {file = "fonttools-4.51.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d145976194a5242fdd22df18a1b451481a88071feadf251221af110ca8f00ce"}, - {file = "fonttools-4.51.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c5b8cab0c137ca229433570151b5c1fc6af212680b58b15abd797dcdd9dd5051"}, - {file = "fonttools-4.51.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:54dcf21a2f2d06ded676e3c3f9f74b2bafded3a8ff12f0983160b13e9f2fb4a7"}, - {file = "fonttools-4.51.0-cp39-cp39-win32.whl", hash = "sha256:0118ef998a0699a96c7b28457f15546815015a2710a1b23a7bf6c1be60c01636"}, - {file = "fonttools-4.51.0-cp39-cp39-win_amd64.whl", hash = "sha256:599bdb75e220241cedc6faebfafedd7670335d2e29620d207dd0378a4e9ccc5a"}, - {file = "fonttools-4.51.0-py3-none-any.whl", hash = "sha256:15c94eeef6b095831067f72c825eb0e2d48bb4cea0647c1b05c981ecba2bf39f"}, - {file = "fonttools-4.51.0.tar.gz", hash = "sha256:dc0673361331566d7a663d7ce0f6fdcbfbdc1f59c6e3ed1165ad7202ca183c68"}, + {file = "fonttools-4.53.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:52a6e0a7a0bf611c19bc8ec8f7592bdae79c8296c70eb05917fd831354699b20"}, + {file = "fonttools-4.53.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:099634631b9dd271d4a835d2b2a9e042ccc94ecdf7e2dd9f7f34f7daf333358d"}, + {file = "fonttools-4.53.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e40013572bfb843d6794a3ce076c29ef4efd15937ab833f520117f8eccc84fd6"}, + {file = "fonttools-4.53.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:715b41c3e231f7334cbe79dfc698213dcb7211520ec7a3bc2ba20c8515e8a3b5"}, + {file = "fonttools-4.53.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74ae2441731a05b44d5988d3ac2cf784d3ee0a535dbed257cbfff4be8bb49eb9"}, + {file = "fonttools-4.53.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:95db0c6581a54b47c30860d013977b8a14febc206c8b5ff562f9fe32738a8aca"}, + {file = "fonttools-4.53.0-cp310-cp310-win32.whl", hash = "sha256:9cd7a6beec6495d1dffb1033d50a3f82dfece23e9eb3c20cd3c2444d27514068"}, + {file = "fonttools-4.53.0-cp310-cp310-win_amd64.whl", hash = "sha256:daaef7390e632283051e3cf3e16aff2b68b247e99aea916f64e578c0449c9c68"}, + {file = "fonttools-4.53.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a209d2e624ba492df4f3bfad5996d1f76f03069c6133c60cd04f9a9e715595ec"}, + {file = "fonttools-4.53.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4f520d9ac5b938e6494f58a25c77564beca7d0199ecf726e1bd3d56872c59749"}, + {file = "fonttools-4.53.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eceef49f457253000e6a2d0f7bd08ff4e9fe96ec4ffce2dbcb32e34d9c1b8161"}, + {file = "fonttools-4.53.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa1f3e34373aa16045484b4d9d352d4c6b5f9f77ac77a178252ccbc851e8b2ee"}, + {file = "fonttools-4.53.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:28d072169fe8275fb1a0d35e3233f6df36a7e8474e56cb790a7258ad822b6fd6"}, + {file = "fonttools-4.53.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4a2a6ba400d386e904fd05db81f73bee0008af37799a7586deaa4aef8cd5971e"}, + {file = "fonttools-4.53.0-cp311-cp311-win32.whl", hash = "sha256:bb7273789f69b565d88e97e9e1da602b4ee7ba733caf35a6c2affd4334d4f005"}, + {file = "fonttools-4.53.0-cp311-cp311-win_amd64.whl", hash = "sha256:9fe9096a60113e1d755e9e6bda15ef7e03391ee0554d22829aa506cdf946f796"}, + {file = "fonttools-4.53.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d8f191a17369bd53a5557a5ee4bab91d5330ca3aefcdf17fab9a497b0e7cff7a"}, + {file = "fonttools-4.53.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:93156dd7f90ae0a1b0e8871032a07ef3178f553f0c70c386025a808f3a63b1f4"}, + {file = "fonttools-4.53.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bff98816cb144fb7b85e4b5ba3888a33b56ecef075b0e95b95bcd0a5fbf20f06"}, + {file = "fonttools-4.53.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:973d030180eca8255b1bce6ffc09ef38a05dcec0e8320cc9b7bcaa65346f341d"}, + {file = "fonttools-4.53.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c4ee5a24e281fbd8261c6ab29faa7fd9a87a12e8c0eed485b705236c65999109"}, + {file = "fonttools-4.53.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bd5bc124fae781a4422f61b98d1d7faa47985f663a64770b78f13d2c072410c2"}, + {file = "fonttools-4.53.0-cp312-cp312-win32.whl", hash = "sha256:a239afa1126b6a619130909c8404070e2b473dd2b7fc4aacacd2e763f8597fea"}, + {file = "fonttools-4.53.0-cp312-cp312-win_amd64.whl", hash = "sha256:45b4afb069039f0366a43a5d454bc54eea942bfb66b3fc3e9a2c07ef4d617380"}, + {file = "fonttools-4.53.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:93bc9e5aaa06ff928d751dc6be889ff3e7d2aa393ab873bc7f6396a99f6fbb12"}, + {file = "fonttools-4.53.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2367d47816cc9783a28645bc1dac07f8ffc93e0f015e8c9fc674a5b76a6da6e4"}, + {file = "fonttools-4.53.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:907fa0b662dd8fc1d7c661b90782ce81afb510fc4b7aa6ae7304d6c094b27bce"}, + {file = "fonttools-4.53.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e0ad3c6ea4bd6a289d958a1eb922767233f00982cf0fe42b177657c86c80a8f"}, + {file = "fonttools-4.53.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:73121a9b7ff93ada888aaee3985a88495489cc027894458cb1a736660bdfb206"}, + {file = "fonttools-4.53.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ee595d7ba9bba130b2bec555a40aafa60c26ce68ed0cf509983e0f12d88674fd"}, + {file = "fonttools-4.53.0-cp38-cp38-win32.whl", hash = "sha256:fca66d9ff2ac89b03f5aa17e0b21a97c21f3491c46b583bb131eb32c7bab33af"}, + {file = "fonttools-4.53.0-cp38-cp38-win_amd64.whl", hash = "sha256:31f0e3147375002aae30696dd1dc596636abbd22fca09d2e730ecde0baad1d6b"}, + {file = "fonttools-4.53.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7d6166192dcd925c78a91d599b48960e0a46fe565391c79fe6de481ac44d20ac"}, + {file = "fonttools-4.53.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef50ec31649fbc3acf6afd261ed89d09eb909b97cc289d80476166df8438524d"}, + {file = "fonttools-4.53.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f193f060391a455920d61684a70017ef5284ccbe6023bb056e15e5ac3de11d1"}, + {file = "fonttools-4.53.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba9f09ff17f947392a855e3455a846f9855f6cf6bec33e9a427d3c1d254c712f"}, + {file = "fonttools-4.53.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0c555e039d268445172b909b1b6bdcba42ada1cf4a60e367d68702e3f87e5f64"}, + {file = "fonttools-4.53.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5a4788036201c908079e89ae3f5399b33bf45b9ea4514913f4dbbe4fac08efe0"}, + {file = "fonttools-4.53.0-cp39-cp39-win32.whl", hash = "sha256:d1a24f51a3305362b94681120c508758a88f207fa0a681c16b5a4172e9e6c7a9"}, + {file = "fonttools-4.53.0-cp39-cp39-win_amd64.whl", hash = "sha256:1e677bfb2b4bd0e5e99e0f7283e65e47a9814b0486cb64a41adf9ef110e078f2"}, + {file = "fonttools-4.53.0-py3-none-any.whl", hash = "sha256:6b4f04b1fbc01a3569d63359f2227c89ab294550de277fd09d8fca6185669fa4"}, + {file = "fonttools-4.53.0.tar.gz", hash = "sha256:c93ed66d32de1559b6fc348838c7572d5c0ac1e4a258e76763a5caddd8944002"}, ] [package.extras] @@ -1211,20 +1212,20 @@ files = [ [[package]] name = "google-api-core" -version = "2.19.0" +version = "2.19.1" description = "Google API client core library" optional = false python-versions = ">=3.7" files = [ - {file = "google-api-core-2.19.0.tar.gz", hash = "sha256:cf1b7c2694047886d2af1128a03ae99e391108a08804f87cfd35970e49c9cd10"}, - {file = "google_api_core-2.19.0-py3-none-any.whl", hash = "sha256:8661eec4078c35428fd3f69a2c7ee29e342896b70f01d1a1cbcb334372dd6251"}, + {file = "google-api-core-2.19.1.tar.gz", hash = "sha256:f4695f1e3650b316a795108a76a1c416e6afb036199d1c1f1f110916df479ffd"}, + {file = "google_api_core-2.19.1-py3-none-any.whl", hash = "sha256:f12a9b8309b5e21d92483bbd47ce2c445861ec7d269ef6784ecc0ea8c1fa6125"}, ] [package.dependencies] google-auth = ">=2.14.1,<3.0.dev0" googleapis-common-protos = ">=1.56.2,<2.0.dev0" proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0.dev0" requests = ">=2.18.0,<3.0.0.dev0" [package.extras] @@ -1234,13 +1235,13 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-auth" -version = "2.29.0" +version = "2.30.0" description = "Google Authentication Library" optional = false python-versions = ">=3.7" files = [ - {file = "google-auth-2.29.0.tar.gz", hash = "sha256:672dff332d073227550ffc7457868ac4218d6c500b155fe6cc17d2b13602c360"}, - {file = "google_auth-2.29.0-py2.py3-none-any.whl", hash = "sha256:d452ad095688cd52bae0ad6fafe027f6a6d6f560e810fec20914e17a09526415"}, + {file = "google-auth-2.30.0.tar.gz", hash = "sha256:ab630a1320f6720909ad76a7dbdb6841cdf5c66b328d690027e4867bdfb16688"}, + {file = "google_auth-2.30.0-py2.py3-none-any.whl", hash = "sha256:8df7da660f62757388b8a7f249df13549b3373f24388cb5d2f1dd91cc18180b5"}, ] [package.dependencies] @@ -1257,78 +1258,78 @@ requests = ["requests (>=2.20.0,<3.0.0.dev0)"] [[package]] name = "googleapis-common-protos" -version = "1.63.0" +version = "1.63.2" description = "Common protobufs used in Google APIs" optional = false python-versions = ">=3.7" files = [ - {file = "googleapis-common-protos-1.63.0.tar.gz", hash = "sha256:17ad01b11d5f1d0171c06d3ba5c04c54474e883b66b949722b4938ee2694ef4e"}, - {file = "googleapis_common_protos-1.63.0-py2.py3-none-any.whl", hash = "sha256:ae45f75702f7c08b541f750854a678bd8f534a1a6bace6afe975f1d0a82d6632"}, + {file = "googleapis-common-protos-1.63.2.tar.gz", hash = "sha256:27c5abdffc4911f28101e635de1533fb4cfd2c37fbaa9174587c799fac90aa87"}, + {file = "googleapis_common_protos-1.63.2-py2.py3-none-any.whl", hash = "sha256:27a2499c7e8aff199665b22741997e485eccc8645aa9176c7c988e6fae507945"}, ] [package.dependencies] -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" +protobuf = ">=3.20.2,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0.dev0" [package.extras] grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] [[package]] name = "grpcio" -version = "1.63.0" +version = "1.64.1" description = "HTTP/2-based RPC framework" optional = false python-versions = ">=3.8" files = [ - {file = "grpcio-1.63.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:2e93aca840c29d4ab5db93f94ed0a0ca899e241f2e8aec6334ab3575dc46125c"}, - {file = "grpcio-1.63.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:91b73d3f1340fefa1e1716c8c1ec9930c676d6b10a3513ab6c26004cb02d8b3f"}, - {file = "grpcio-1.63.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:b3afbd9d6827fa6f475a4f91db55e441113f6d3eb9b7ebb8fb806e5bb6d6bd0d"}, - {file = "grpcio-1.63.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8f3f6883ce54a7a5f47db43289a0a4c776487912de1a0e2cc83fdaec9685cc9f"}, - {file = "grpcio-1.63.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf8dae9cc0412cb86c8de5a8f3be395c5119a370f3ce2e69c8b7d46bb9872c8d"}, - {file = "grpcio-1.63.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:08e1559fd3b3b4468486b26b0af64a3904a8dbc78d8d936af9c1cf9636eb3e8b"}, - {file = "grpcio-1.63.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5c039ef01516039fa39da8a8a43a95b64e288f79f42a17e6c2904a02a319b357"}, - {file = "grpcio-1.63.0-cp310-cp310-win32.whl", hash = "sha256:ad2ac8903b2eae071055a927ef74121ed52d69468e91d9bcbd028bd0e554be6d"}, - {file = "grpcio-1.63.0-cp310-cp310-win_amd64.whl", hash = "sha256:b2e44f59316716532a993ca2966636df6fbe7be4ab6f099de6815570ebe4383a"}, - {file = "grpcio-1.63.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:f28f8b2db7b86c77916829d64ab21ff49a9d8289ea1564a2b2a3a8ed9ffcccd3"}, - {file = "grpcio-1.63.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:65bf975639a1f93bee63ca60d2e4951f1b543f498d581869922910a476ead2f5"}, - {file = "grpcio-1.63.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:b5194775fec7dc3dbd6a935102bb156cd2c35efe1685b0a46c67b927c74f0cfb"}, - {file = "grpcio-1.63.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4cbb2100ee46d024c45920d16e888ee5d3cf47c66e316210bc236d5bebc42b3"}, - {file = "grpcio-1.63.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ff737cf29b5b801619f10e59b581869e32f400159e8b12d7a97e7e3bdeee6a2"}, - {file = "grpcio-1.63.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cd1e68776262dd44dedd7381b1a0ad09d9930ffb405f737d64f505eb7f77d6c7"}, - {file = "grpcio-1.63.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:93f45f27f516548e23e4ec3fbab21b060416007dbe768a111fc4611464cc773f"}, - {file = "grpcio-1.63.0-cp311-cp311-win32.whl", hash = "sha256:878b1d88d0137df60e6b09b74cdb73db123f9579232c8456f53e9abc4f62eb3c"}, - {file = "grpcio-1.63.0-cp311-cp311-win_amd64.whl", hash = "sha256:756fed02dacd24e8f488f295a913f250b56b98fb793f41d5b2de6c44fb762434"}, - {file = "grpcio-1.63.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:93a46794cc96c3a674cdfb59ef9ce84d46185fe9421baf2268ccb556f8f81f57"}, - {file = "grpcio-1.63.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a7b19dfc74d0be7032ca1eda0ed545e582ee46cd65c162f9e9fc6b26ef827dc6"}, - {file = "grpcio-1.63.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:8064d986d3a64ba21e498b9a376cbc5d6ab2e8ab0e288d39f266f0fca169b90d"}, - {file = "grpcio-1.63.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:219bb1848cd2c90348c79ed0a6b0ea51866bc7e72fa6e205e459fedab5770172"}, - {file = "grpcio-1.63.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2d60cd1d58817bc5985fae6168d8b5655c4981d448d0f5b6194bbcc038090d2"}, - {file = "grpcio-1.63.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:9e350cb096e5c67832e9b6e018cf8a0d2a53b2a958f6251615173165269a91b0"}, - {file = "grpcio-1.63.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:56cdf96ff82e3cc90dbe8bac260352993f23e8e256e063c327b6cf9c88daf7a9"}, - {file = "grpcio-1.63.0-cp312-cp312-win32.whl", hash = "sha256:3a6d1f9ea965e750db7b4ee6f9fdef5fdf135abe8a249e75d84b0a3e0c668a1b"}, - {file = "grpcio-1.63.0-cp312-cp312-win_amd64.whl", hash = "sha256:d2497769895bb03efe3187fb1888fc20e98a5f18b3d14b606167dacda5789434"}, - {file = "grpcio-1.63.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:fdf348ae69c6ff484402cfdb14e18c1b0054ac2420079d575c53a60b9b2853ae"}, - {file = "grpcio-1.63.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a3abfe0b0f6798dedd2e9e92e881d9acd0fdb62ae27dcbbfa7654a57e24060c0"}, - {file = "grpcio-1.63.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:6ef0ad92873672a2a3767cb827b64741c363ebaa27e7f21659e4e31f4d750280"}, - {file = "grpcio-1.63.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b416252ac5588d9dfb8a30a191451adbf534e9ce5f56bb02cd193f12d8845b7f"}, - {file = "grpcio-1.63.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3b77eaefc74d7eb861d3ffbdf91b50a1bb1639514ebe764c47773b833fa2d91"}, - {file = "grpcio-1.63.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b005292369d9c1f80bf70c1db1c17c6c342da7576f1c689e8eee4fb0c256af85"}, - {file = "grpcio-1.63.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cdcda1156dcc41e042d1e899ba1f5c2e9f3cd7625b3d6ebfa619806a4c1aadda"}, - {file = "grpcio-1.63.0-cp38-cp38-win32.whl", hash = "sha256:01799e8649f9e94ba7db1aeb3452188048b0019dc37696b0f5ce212c87c560c3"}, - {file = "grpcio-1.63.0-cp38-cp38-win_amd64.whl", hash = "sha256:6a1a3642d76f887aa4009d92f71eb37809abceb3b7b5a1eec9c554a246f20e3a"}, - {file = "grpcio-1.63.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:75f701ff645858a2b16bc8c9fc68af215a8bb2d5a9b647448129de6e85d52bce"}, - {file = "grpcio-1.63.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cacdef0348a08e475a721967f48206a2254a1b26ee7637638d9e081761a5ba86"}, - {file = "grpcio-1.63.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:0697563d1d84d6985e40ec5ec596ff41b52abb3fd91ec240e8cb44a63b895094"}, - {file = "grpcio-1.63.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6426e1fb92d006e47476d42b8f240c1d916a6d4423c5258ccc5b105e43438f61"}, - {file = "grpcio-1.63.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e48cee31bc5f5a31fb2f3b573764bd563aaa5472342860edcc7039525b53e46a"}, - {file = "grpcio-1.63.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:50344663068041b34a992c19c600236e7abb42d6ec32567916b87b4c8b8833b3"}, - {file = "grpcio-1.63.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:259e11932230d70ef24a21b9fb5bb947eb4703f57865a404054400ee92f42f5d"}, - {file = "grpcio-1.63.0-cp39-cp39-win32.whl", hash = "sha256:a44624aad77bf8ca198c55af811fd28f2b3eaf0a50ec5b57b06c034416ef2d0a"}, - {file = "grpcio-1.63.0-cp39-cp39-win_amd64.whl", hash = "sha256:166e5c460e5d7d4656ff9e63b13e1f6029b122104c1633d5f37eaea348d7356d"}, - {file = "grpcio-1.63.0.tar.gz", hash = "sha256:f3023e14805c61bc439fb40ca545ac3d5740ce66120a678a3c6c2c55b70343d1"}, + {file = "grpcio-1.64.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:55697ecec192bc3f2f3cc13a295ab670f51de29884ca9ae6cd6247df55df2502"}, + {file = "grpcio-1.64.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:3b64ae304c175671efdaa7ec9ae2cc36996b681eb63ca39c464958396697daff"}, + {file = "grpcio-1.64.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:bac71b4b28bc9af61efcdc7630b166440bbfbaa80940c9a697271b5e1dabbc61"}, + {file = "grpcio-1.64.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c024ffc22d6dc59000faf8ad781696d81e8e38f4078cb0f2630b4a3cf231a90"}, + {file = "grpcio-1.64.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7cd5c1325f6808b8ae31657d281aadb2a51ac11ab081ae335f4f7fc44c1721d"}, + {file = "grpcio-1.64.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0a2813093ddb27418a4c99f9b1c223fab0b053157176a64cc9db0f4557b69bd9"}, + {file = "grpcio-1.64.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2981c7365a9353f9b5c864595c510c983251b1ab403e05b1ccc70a3d9541a73b"}, + {file = "grpcio-1.64.1-cp310-cp310-win32.whl", hash = "sha256:1262402af5a511c245c3ae918167eca57342c72320dffae5d9b51840c4b2f86d"}, + {file = "grpcio-1.64.1-cp310-cp310-win_amd64.whl", hash = "sha256:19264fc964576ddb065368cae953f8d0514ecc6cb3da8903766d9fb9d4554c33"}, + {file = "grpcio-1.64.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:58b1041e7c870bb30ee41d3090cbd6f0851f30ae4eb68228955d973d3efa2e61"}, + {file = "grpcio-1.64.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bbc5b1d78a7822b0a84c6f8917faa986c1a744e65d762ef6d8be9d75677af2ca"}, + {file = "grpcio-1.64.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:5841dd1f284bd1b3d8a6eca3a7f062b06f1eec09b184397e1d1d43447e89a7ae"}, + {file = "grpcio-1.64.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8caee47e970b92b3dd948371230fcceb80d3f2277b3bf7fbd7c0564e7d39068e"}, + {file = "grpcio-1.64.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73819689c169417a4f978e562d24f2def2be75739c4bed1992435d007819da1b"}, + {file = "grpcio-1.64.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6503b64c8b2dfad299749cad1b595c650c91e5b2c8a1b775380fcf8d2cbba1e9"}, + {file = "grpcio-1.64.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1de403fc1305fd96cfa75e83be3dee8538f2413a6b1685b8452301c7ba33c294"}, + {file = "grpcio-1.64.1-cp311-cp311-win32.whl", hash = "sha256:d4d29cc612e1332237877dfa7fe687157973aab1d63bd0f84cf06692f04c0367"}, + {file = "grpcio-1.64.1-cp311-cp311-win_amd64.whl", hash = "sha256:5e56462b05a6f860b72f0fa50dca06d5b26543a4e88d0396259a07dc30f4e5aa"}, + {file = "grpcio-1.64.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:4657d24c8063e6095f850b68f2d1ba3b39f2b287a38242dcabc166453e950c59"}, + {file = "grpcio-1.64.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:62b4e6eb7bf901719fce0ca83e3ed474ae5022bb3827b0a501e056458c51c0a1"}, + {file = "grpcio-1.64.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:ee73a2f5ca4ba44fa33b4d7d2c71e2c8a9e9f78d53f6507ad68e7d2ad5f64a22"}, + {file = "grpcio-1.64.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:198908f9b22e2672a998870355e226a725aeab327ac4e6ff3a1399792ece4762"}, + {file = "grpcio-1.64.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39b9d0acaa8d835a6566c640f48b50054f422d03e77e49716d4c4e8e279665a1"}, + {file = "grpcio-1.64.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:5e42634a989c3aa6049f132266faf6b949ec2a6f7d302dbb5c15395b77d757eb"}, + {file = "grpcio-1.64.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b1a82e0b9b3022799c336e1fc0f6210adc019ae84efb7321d668129d28ee1efb"}, + {file = "grpcio-1.64.1-cp312-cp312-win32.whl", hash = "sha256:55260032b95c49bee69a423c2f5365baa9369d2f7d233e933564d8a47b893027"}, + {file = "grpcio-1.64.1-cp312-cp312-win_amd64.whl", hash = "sha256:c1a786ac592b47573a5bb7e35665c08064a5d77ab88a076eec11f8ae86b3e3f6"}, + {file = "grpcio-1.64.1-cp38-cp38-linux_armv7l.whl", hash = "sha256:a011ac6c03cfe162ff2b727bcb530567826cec85eb8d4ad2bfb4bd023287a52d"}, + {file = "grpcio-1.64.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4d6dab6124225496010bd22690f2d9bd35c7cbb267b3f14e7a3eb05c911325d4"}, + {file = "grpcio-1.64.1-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:a5e771d0252e871ce194d0fdcafd13971f1aae0ddacc5f25615030d5df55c3a2"}, + {file = "grpcio-1.64.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2c3c1b90ab93fed424e454e93c0ed0b9d552bdf1b0929712b094f5ecfe7a23ad"}, + {file = "grpcio-1.64.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20405cb8b13fd779135df23fabadc53b86522d0f1cba8cca0e87968587f50650"}, + {file = "grpcio-1.64.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0cc79c982ccb2feec8aad0e8fb0d168bcbca85bc77b080d0d3c5f2f15c24ea8f"}, + {file = "grpcio-1.64.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a3a035c37ce7565b8f4f35ff683a4db34d24e53dc487e47438e434eb3f701b2a"}, + {file = "grpcio-1.64.1-cp38-cp38-win32.whl", hash = "sha256:1257b76748612aca0f89beec7fa0615727fd6f2a1ad580a9638816a4b2eb18fd"}, + {file = "grpcio-1.64.1-cp38-cp38-win_amd64.whl", hash = "sha256:0a12ddb1678ebc6a84ec6b0487feac020ee2b1659cbe69b80f06dbffdb249122"}, + {file = "grpcio-1.64.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:75dbbf415026d2862192fe1b28d71f209e2fd87079d98470db90bebe57b33179"}, + {file = "grpcio-1.64.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e3d9f8d1221baa0ced7ec7322a981e28deb23749c76eeeb3d33e18b72935ab62"}, + {file = "grpcio-1.64.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:5f8b75f64d5d324c565b263c67dbe4f0af595635bbdd93bb1a88189fc62ed2e5"}, + {file = "grpcio-1.64.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c84ad903d0d94311a2b7eea608da163dace97c5fe9412ea311e72c3684925602"}, + {file = "grpcio-1.64.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:940e3ec884520155f68a3b712d045e077d61c520a195d1a5932c531f11883489"}, + {file = "grpcio-1.64.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f10193c69fc9d3d726e83bbf0f3d316f1847c3071c8c93d8090cf5f326b14309"}, + {file = "grpcio-1.64.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ac15b6c2c80a4d1338b04d42a02d376a53395ddf0ec9ab157cbaf44191f3ffdd"}, + {file = "grpcio-1.64.1-cp39-cp39-win32.whl", hash = "sha256:03b43d0ccf99c557ec671c7dede64f023c7da9bb632ac65dbc57f166e4970040"}, + {file = "grpcio-1.64.1-cp39-cp39-win_amd64.whl", hash = "sha256:ed6091fa0adcc7e4ff944090cf203a52da35c37a130efa564ded02b7aff63bcd"}, + {file = "grpcio-1.64.1.tar.gz", hash = "sha256:8d51dd1c59d5fa0f34266b80a3805ec29a1f26425c2a54736133f6d87fc4968a"}, ] [package.extras] -protobuf = ["grpcio-tools (>=1.63.0)"] +protobuf = ["grpcio-tools (>=1.64.1)"] [[package]] name = "grpclib" @@ -1553,22 +1554,22 @@ files = [ [[package]] name = "importlib-metadata" -version = "7.1.0" +version = "7.2.1" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570"}, - {file = "importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"}, + {file = "importlib_metadata-7.2.1-py3-none-any.whl", hash = "sha256:ffef94b0b66046dd8ea2d619b701fe978d9264d38f3998bc4c27ec3b146a87c8"}, + {file = "importlib_metadata-7.2.1.tar.gz", hash = "sha256:509ecb2ab77071db5137c655e24ceb3eee66e7bbc6574165d0d114d9fc4bbe68"}, ] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] +test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] [[package]] name = "importlib-resources" @@ -1651,21 +1652,21 @@ test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.22)", "pa [[package]] name = "ipywidgets" -version = "8.1.2" +version = "8.1.3" description = "Jupyter interactive widgets" optional = false python-versions = ">=3.7" files = [ - {file = "ipywidgets-8.1.2-py3-none-any.whl", hash = "sha256:bbe43850d79fb5e906b14801d6c01402857996864d1e5b6fa62dd2ee35559f60"}, - {file = "ipywidgets-8.1.2.tar.gz", hash = "sha256:d0b9b41e49bae926a866e613a39b0f0097745d2b9f1f3dd406641b4a57ec42c9"}, + {file = "ipywidgets-8.1.3-py3-none-any.whl", hash = "sha256:efafd18f7a142248f7cb0ba890a68b96abd4d6e88ddbda483c9130d12667eaf2"}, + {file = "ipywidgets-8.1.3.tar.gz", hash = "sha256:f5f9eeaae082b1823ce9eac2575272952f40d748893972956dc09700a6392d9c"}, ] [package.dependencies] comm = ">=0.1.3" ipython = ">=6.1.0" -jupyterlab-widgets = ">=3.0.10,<3.1.0" +jupyterlab-widgets = ">=3.0.11,<3.1.0" traitlets = ">=4.3.1" -widgetsnbextension = ">=4.0.10,<4.1.0" +widgetsnbextension = ">=4.0.11,<4.1.0" [package.extras] test = ["ipykernel", "jsonschema", "pytest (>=3.6.0)", "pytest-cov", "pytz"] @@ -1790,13 +1791,13 @@ referencing = ">=0.31.0" [[package]] name = "jupyter-client" -version = "8.6.1" +version = "8.6.2" description = "Jupyter protocol implementation and client libraries" optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_client-8.6.1-py3-none-any.whl", hash = "sha256:3b7bd22f058434e3b9a7ea4b1500ed47de2713872288c0d511d19926f99b459f"}, - {file = "jupyter_client-8.6.1.tar.gz", hash = "sha256:e842515e2bab8e19186d89fdfea7abd15e39dd581f94e399f00e2af5a1652d3f"}, + {file = "jupyter_client-8.6.2-py3-none-any.whl", hash = "sha256:50cbc5c66fd1b8f65ecb66bc490ab73217993632809b6e505687de18e9dea39f"}, + {file = "jupyter_client-8.6.2.tar.gz", hash = "sha256:2bda14d55ee5ba58552a8c53ae43d215ad9868853489213f37da060ced54d8df"}, ] [package.dependencies] @@ -1809,7 +1810,7 @@ traitlets = ">=5.3" [package.extras] docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest (<8.2.0)", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] [[package]] name = "jupyter-core" @@ -1844,13 +1845,13 @@ files = [ [[package]] name = "jupyterlab-widgets" -version = "3.0.10" +version = "3.0.11" description = "Jupyter interactive widgets for JupyterLab" optional = false python-versions = ">=3.7" files = [ - {file = "jupyterlab_widgets-3.0.10-py3-none-any.whl", hash = "sha256:dd61f3ae7a5a7f80299e14585ce6cf3d6925a96c9103c978eda293197730cb64"}, - {file = "jupyterlab_widgets-3.0.10.tar.gz", hash = "sha256:04f2ac04976727e4f9d0fa91cdc2f1ab860f965e504c29dbd6a65c882c9d04c0"}, + {file = "jupyterlab_widgets-3.0.11-py3-none-any.whl", hash = "sha256:78287fd86d20744ace330a61625024cf5521e1c012a352ddc0a3cdc2348becd0"}, + {file = "jupyterlab_widgets-3.0.11.tar.gz", hash = "sha256:dd5ac679593c969af29c9bed054c24f26842baa51352114736756bc035deee27"}, ] [[package]] @@ -2357,41 +2358,37 @@ tests = ["pytest (>=4.6)"] [[package]] name = "msal" -version = "1.28.0" +version = "1.29.0" description = "The Microsoft Authentication Library (MSAL) for Python library enables your app to access the Microsoft Cloud by supporting authentication of users with Microsoft Azure Active Directory accounts (AAD) and Microsoft Accounts (MSA) using industry standard OAuth2 and OpenID Connect." optional = false python-versions = ">=3.7" files = [ - {file = "msal-1.28.0-py3-none-any.whl", hash = "sha256:3064f80221a21cd535ad8c3fafbb3a3582cd9c7e9af0bb789ae14f726a0ca99b"}, - {file = "msal-1.28.0.tar.gz", hash = "sha256:80bbabe34567cb734efd2ec1869b2d98195c927455369d8077b3c542088c5c9d"}, + {file = "msal-1.29.0-py3-none-any.whl", hash = "sha256:6b301e63f967481f0cc1a3a3bac0cf322b276855bc1b0955468d9deb3f33d511"}, + {file = "msal-1.29.0.tar.gz", hash = "sha256:8f6725f099752553f9b2fe84125e2a5ebe47b49f92eacca33ebedd3a9ebaae25"}, ] [package.dependencies] -cryptography = ">=0.6,<45" +cryptography = ">=2.5,<45" PyJWT = {version = ">=1.0.0,<3", extras = ["crypto"]} requests = ">=2.0.0,<3" [package.extras] -broker = ["pymsalruntime (>=0.13.2,<0.15)"] +broker = ["pymsalruntime (>=0.13.2,<0.17)"] [[package]] name = "msal-extensions" -version = "1.1.0" +version = "1.2.0" description = "Microsoft Authentication Library extensions (MSAL EX) provides a persistence API that can save your data on disk, encrypted on Windows, macOS and Linux. Concurrent data access will be coordinated by a file lock mechanism." optional = false python-versions = ">=3.7" files = [ - {file = "msal-extensions-1.1.0.tar.gz", hash = "sha256:6ab357867062db7b253d0bd2df6d411c7891a0ee7308d54d1e4317c1d1c54252"}, - {file = "msal_extensions-1.1.0-py3-none-any.whl", hash = "sha256:01be9711b4c0b1a151450068eeb2c4f0997df3bba085ac299de3a66f585e382f"}, + {file = "msal_extensions-1.2.0-py3-none-any.whl", hash = "sha256:cf5ba83a2113fa6dc011a254a72f1c223c88d7dfad74cc30617c4679a417704d"}, + {file = "msal_extensions-1.2.0.tar.gz", hash = "sha256:6f41b320bfd2933d631a215c91ca0dd3e67d84bd1a2f50ce917d5874ec646bef"}, ] [package.dependencies] -msal = ">=0.4.1,<2.0.0" -packaging = "*" -portalocker = [ - {version = ">=1.0,<3", markers = "platform_system != \"Windows\""}, - {version = ">=1.6,<3", markers = "platform_system == \"Windows\""}, -] +msal = ">=1.29,<2" +portalocker = ">=1.4,<3" [[package]] name = "multidict" @@ -2753,68 +2750,68 @@ tests = ["pytest (>=6.0)", "pyyaml"] [[package]] name = "orjson" -version = "3.10.3" +version = "3.10.5" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" optional = false python-versions = ">=3.8" files = [ - {file = "orjson-3.10.3-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9fb6c3f9f5490a3eb4ddd46fc1b6eadb0d6fc16fb3f07320149c3286a1409dd8"}, - {file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:252124b198662eee80428f1af8c63f7ff077c88723fe206a25df8dc57a57b1fa"}, - {file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9f3e87733823089a338ef9bbf363ef4de45e5c599a9bf50a7a9b82e86d0228da"}, - {file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8334c0d87103bb9fbbe59b78129f1f40d1d1e8355bbed2ca71853af15fa4ed3"}, - {file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1952c03439e4dce23482ac846e7961f9d4ec62086eb98ae76d97bd41d72644d7"}, - {file = "orjson-3.10.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c0403ed9c706dcd2809f1600ed18f4aae50be263bd7112e54b50e2c2bc3ebd6d"}, - {file = "orjson-3.10.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:382e52aa4270a037d41f325e7d1dfa395b7de0c367800b6f337d8157367bf3a7"}, - {file = "orjson-3.10.3-cp310-none-win32.whl", hash = "sha256:be2aab54313752c04f2cbaab4515291ef5af8c2256ce22abc007f89f42f49109"}, - {file = "orjson-3.10.3-cp310-none-win_amd64.whl", hash = "sha256:416b195f78ae461601893f482287cee1e3059ec49b4f99479aedf22a20b1098b"}, - {file = "orjson-3.10.3-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:73100d9abbbe730331f2242c1fc0bcb46a3ea3b4ae3348847e5a141265479700"}, - {file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:544a12eee96e3ab828dbfcb4d5a0023aa971b27143a1d35dc214c176fdfb29b3"}, - {file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:520de5e2ef0b4ae546bea25129d6c7c74edb43fc6cf5213f511a927f2b28148b"}, - {file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ccaa0a401fc02e8828a5bedfd80f8cd389d24f65e5ca3954d72c6582495b4bcf"}, - {file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7bc9e8bc11bac40f905640acd41cbeaa87209e7e1f57ade386da658092dc16"}, - {file = "orjson-3.10.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3582b34b70543a1ed6944aca75e219e1192661a63da4d039d088a09c67543b08"}, - {file = "orjson-3.10.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1c23dfa91481de880890d17aa7b91d586a4746a4c2aa9a145bebdbaf233768d5"}, - {file = "orjson-3.10.3-cp311-none-win32.whl", hash = "sha256:1770e2a0eae728b050705206d84eda8b074b65ee835e7f85c919f5705b006c9b"}, - {file = "orjson-3.10.3-cp311-none-win_amd64.whl", hash = "sha256:93433b3c1f852660eb5abdc1f4dd0ced2be031ba30900433223b28ee0140cde5"}, - {file = "orjson-3.10.3-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a39aa73e53bec8d410875683bfa3a8edf61e5a1c7bb4014f65f81d36467ea098"}, - {file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0943a96b3fa09bee1afdfccc2cb236c9c64715afa375b2af296c73d91c23eab2"}, - {file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e852baafceff8da3c9defae29414cc8513a1586ad93e45f27b89a639c68e8176"}, - {file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18566beb5acd76f3769c1d1a7ec06cdb81edc4d55d2765fb677e3eaa10fa99e0"}, - {file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bd2218d5a3aa43060efe649ec564ebedec8ce6ae0a43654b81376216d5ebd42"}, - {file = "orjson-3.10.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cf20465e74c6e17a104ecf01bf8cd3b7b252565b4ccee4548f18b012ff2f8069"}, - {file = "orjson-3.10.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ba7f67aa7f983c4345eeda16054a4677289011a478ca947cd69c0a86ea45e534"}, - {file = "orjson-3.10.3-cp312-none-win32.whl", hash = "sha256:17e0713fc159abc261eea0f4feda611d32eabc35708b74bef6ad44f6c78d5ea0"}, - {file = "orjson-3.10.3-cp312-none-win_amd64.whl", hash = "sha256:4c895383b1ec42b017dd2c75ae8a5b862fc489006afde06f14afbdd0309b2af0"}, - {file = "orjson-3.10.3-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:be2719e5041e9fb76c8c2c06b9600fe8e8584e6980061ff88dcbc2691a16d20d"}, - {file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0175a5798bdc878956099f5c54b9837cb62cfbf5d0b86ba6d77e43861bcec2"}, - {file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:978be58a68ade24f1af7758626806e13cff7748a677faf95fbb298359aa1e20d"}, - {file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16bda83b5c61586f6f788333d3cf3ed19015e3b9019188c56983b5a299210eb5"}, - {file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ad1f26bea425041e0a1adad34630c4825a9e3adec49079b1fb6ac8d36f8b754"}, - {file = "orjson-3.10.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:9e253498bee561fe85d6325ba55ff2ff08fb5e7184cd6a4d7754133bd19c9195"}, - {file = "orjson-3.10.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0a62f9968bab8a676a164263e485f30a0b748255ee2f4ae49a0224be95f4532b"}, - {file = "orjson-3.10.3-cp38-none-win32.whl", hash = "sha256:8d0b84403d287d4bfa9bf7d1dc298d5c1c5d9f444f3737929a66f2fe4fb8f134"}, - {file = "orjson-3.10.3-cp38-none-win_amd64.whl", hash = "sha256:8bc7a4df90da5d535e18157220d7915780d07198b54f4de0110eca6b6c11e290"}, - {file = "orjson-3.10.3-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9059d15c30e675a58fdcd6f95465c1522b8426e092de9fff20edebfdc15e1cb0"}, - {file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d40c7f7938c9c2b934b297412c067936d0b54e4b8ab916fd1a9eb8f54c02294"}, - {file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d4a654ec1de8fdaae1d80d55cee65893cb06494e124681ab335218be6a0691e7"}, - {file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:831c6ef73f9aa53c5f40ae8f949ff7681b38eaddb6904aab89dca4d85099cb78"}, - {file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99b880d7e34542db89f48d14ddecbd26f06838b12427d5a25d71baceb5ba119d"}, - {file = "orjson-3.10.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2e5e176c994ce4bd434d7aafb9ecc893c15f347d3d2bbd8e7ce0b63071c52e25"}, - {file = "orjson-3.10.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b69a58a37dab856491bf2d3bbf259775fdce262b727f96aafbda359cb1d114d8"}, - {file = "orjson-3.10.3-cp39-none-win32.whl", hash = "sha256:b8d4d1a6868cde356f1402c8faeb50d62cee765a1f7ffcfd6de732ab0581e063"}, - {file = "orjson-3.10.3-cp39-none-win_amd64.whl", hash = "sha256:5102f50c5fc46d94f2033fe00d392588564378260d64377aec702f21a7a22912"}, - {file = "orjson-3.10.3.tar.gz", hash = "sha256:2b166507acae7ba2f7c315dcf185a9111ad5e992ac81f2d507aac39193c2c818"}, + {file = "orjson-3.10.5-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:545d493c1f560d5ccfc134803ceb8955a14c3fcb47bbb4b2fee0232646d0b932"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4324929c2dd917598212bfd554757feca3e5e0fa60da08be11b4aa8b90013c1"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c13ca5e2ddded0ce6a927ea5a9f27cae77eee4c75547b4297252cb20c4d30e6"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b6c8e30adfa52c025f042a87f450a6b9ea29649d828e0fec4858ed5e6caecf63"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:338fd4f071b242f26e9ca802f443edc588fa4ab60bfa81f38beaedf42eda226c"}, + {file = "orjson-3.10.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6970ed7a3126cfed873c5d21ece1cd5d6f83ca6c9afb71bbae21a0b034588d96"}, + {file = "orjson-3.10.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:235dadefb793ad12f7fa11e98a480db1f7c6469ff9e3da5e73c7809c700d746b"}, + {file = "orjson-3.10.5-cp310-none-win32.whl", hash = "sha256:be79e2393679eda6a590638abda16d167754393f5d0850dcbca2d0c3735cebe2"}, + {file = "orjson-3.10.5-cp310-none-win_amd64.whl", hash = "sha256:c4a65310ccb5c9910c47b078ba78e2787cb3878cdded1702ac3d0da71ddc5228"}, + {file = "orjson-3.10.5-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:cdf7365063e80899ae3a697def1277c17a7df7ccfc979990a403dfe77bb54d40"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b68742c469745d0e6ca5724506858f75e2f1e5b59a4315861f9e2b1df77775a"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7d10cc1b594951522e35a3463da19e899abe6ca95f3c84c69e9e901e0bd93d38"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dcbe82b35d1ac43b0d84072408330fd3295c2896973112d495e7234f7e3da2e1"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c0eb7e0c75e1e486c7563fe231b40fdd658a035ae125c6ba651ca3b07936f5"}, + {file = "orjson-3.10.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:53ed1c879b10de56f35daf06dbc4a0d9a5db98f6ee853c2dbd3ee9d13e6f302f"}, + {file = "orjson-3.10.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:099e81a5975237fda3100f918839af95f42f981447ba8f47adb7b6a3cdb078fa"}, + {file = "orjson-3.10.5-cp311-none-win32.whl", hash = "sha256:1146bf85ea37ac421594107195db8bc77104f74bc83e8ee21a2e58596bfb2f04"}, + {file = "orjson-3.10.5-cp311-none-win_amd64.whl", hash = "sha256:36a10f43c5f3a55c2f680efe07aa93ef4a342d2960dd2b1b7ea2dd764fe4a37c"}, + {file = "orjson-3.10.5-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:68f85ecae7af14a585a563ac741b0547a3f291de81cd1e20903e79f25170458f"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28afa96f496474ce60d3340fe8d9a263aa93ea01201cd2bad844c45cd21f5268"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cd684927af3e11b6e754df80b9ffafd9fb6adcaa9d3e8fdd5891be5a5cad51e"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d21b9983da032505f7050795e98b5d9eee0df903258951566ecc358f6696969"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ad1de7fef79736dde8c3554e75361ec351158a906d747bd901a52a5c9c8d24b"}, + {file = "orjson-3.10.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2d97531cdfe9bdd76d492e69800afd97e5930cb0da6a825646667b2c6c6c0211"}, + {file = "orjson-3.10.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d69858c32f09c3e1ce44b617b3ebba1aba030e777000ebdf72b0d8e365d0b2b3"}, + {file = "orjson-3.10.5-cp312-none-win32.whl", hash = "sha256:64c9cc089f127e5875901ac05e5c25aa13cfa5dbbbd9602bda51e5c611d6e3e2"}, + {file = "orjson-3.10.5-cp312-none-win_amd64.whl", hash = "sha256:b2efbd67feff8c1f7728937c0d7f6ca8c25ec81373dc8db4ef394c1d93d13dc5"}, + {file = "orjson-3.10.5-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:03b565c3b93f5d6e001db48b747d31ea3819b89abf041ee10ac6988886d18e01"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:584c902ec19ab7928fd5add1783c909094cc53f31ac7acfada817b0847975f26"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5a35455cc0b0b3a1eaf67224035f5388591ec72b9b6136d66b49a553ce9eb1e6"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1670fe88b116c2745a3a30b0f099b699a02bb3482c2591514baf5433819e4f4d"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:185c394ef45b18b9a7d8e8f333606e2e8194a50c6e3c664215aae8cf42c5385e"}, + {file = "orjson-3.10.5-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ca0b3a94ac8d3886c9581b9f9de3ce858263865fdaa383fbc31c310b9eac07c9"}, + {file = "orjson-3.10.5-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dfc91d4720d48e2a709e9c368d5125b4b5899dced34b5400c3837dadc7d6271b"}, + {file = "orjson-3.10.5-cp38-none-win32.whl", hash = "sha256:c05f16701ab2a4ca146d0bca950af254cb7c02f3c01fca8efbbad82d23b3d9d4"}, + {file = "orjson-3.10.5-cp38-none-win_amd64.whl", hash = "sha256:8a11d459338f96a9aa7f232ba95679fc0c7cedbd1b990d736467894210205c09"}, + {file = "orjson-3.10.5-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:85c89131d7b3218db1b24c4abecea92fd6c7f9fab87441cfc342d3acc725d807"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb66215277a230c456f9038d5e2d84778141643207f85336ef8d2a9da26bd7ca"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:51bbcdea96cdefa4a9b4461e690c75ad4e33796530d182bdd5c38980202c134a"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbead71dbe65f959b7bd8cf91e0e11d5338033eba34c114f69078d59827ee139"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5df58d206e78c40da118a8c14fc189207fffdcb1f21b3b4c9c0c18e839b5a214"}, + {file = "orjson-3.10.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c4057c3b511bb8aef605616bd3f1f002a697c7e4da6adf095ca5b84c0fd43595"}, + {file = "orjson-3.10.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b39e006b00c57125ab974362e740c14a0c6a66ff695bff44615dcf4a70ce2b86"}, + {file = "orjson-3.10.5-cp39-none-win32.whl", hash = "sha256:eded5138cc565a9d618e111c6d5c2547bbdd951114eb822f7f6309e04db0fb47"}, + {file = "orjson-3.10.5-cp39-none-win_amd64.whl", hash = "sha256:cc28e90a7cae7fcba2493953cff61da5a52950e78dc2dacfe931a317ee3d8de7"}, + {file = "orjson-3.10.5.tar.gz", hash = "sha256:7a5baef8a4284405d96c90c7c62b755e9ef1ada84c2406c24a9ebec86b89f46d"}, ] [[package]] name = "packaging" -version = "24.0" +version = "24.1" description = "Core utilities for Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, - {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, ] [[package]] @@ -2825,6 +2822,7 @@ optional = false python-versions = ">=3.9" files = [ {file = "pandas-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce"}, + {file = "pandas-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238"}, {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08"}, {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0"}, {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51"}, @@ -2838,12 +2836,14 @@ files = [ {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1"}, {file = "pandas-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24"}, {file = "pandas-2.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef"}, + {file = "pandas-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b79011ff7a0f4b1d6da6a61aa1aa604fb312d6647de5bad20013682d1429ce"}, {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad"}, {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad"}, {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76"}, {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32"}, {file = "pandas-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23"}, {file = "pandas-2.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2"}, + {file = "pandas-2.2.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd"}, {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863"}, {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921"}, {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a"}, @@ -3080,13 +3080,13 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "portalocker" -version = "2.8.2" +version = "2.10.0" description = "Wraps the portalocker recipe for easy usage" optional = false python-versions = ">=3.8" files = [ - {file = "portalocker-2.8.2-py3-none-any.whl", hash = "sha256:cfb86acc09b9aa7c3b43594e19be1345b9d16af3feb08bf92f23d4dce513a28e"}, - {file = "portalocker-2.8.2.tar.gz", hash = "sha256:2b035aa7828e46c58e9b31390ee1f169b98e1066ab10b9a6a861fe7e25ee4f33"}, + {file = "portalocker-2.10.0-py3-none-any.whl", hash = "sha256:48944147b2cd42520549bc1bb8fe44e220296e56f7c3d551bc6ecce69d9b0de1"}, + {file = "portalocker-2.10.0.tar.gz", hash = "sha256:49de8bc0a2f68ca98bf9e219c81a3e6b27097c7bf505a87c5a112ce1aaeb9b81"}, ] [package.dependencies] @@ -3099,13 +3099,13 @@ tests = ["pytest (>=5.4.1)", "pytest-cov (>=2.8.1)", "pytest-mypy (>=0.8.0)", "p [[package]] name = "prompt-toolkit" -version = "3.0.43" +version = "3.0.47" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6"}, - {file = "prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d"}, + {file = "prompt_toolkit-3.0.47-py3-none-any.whl", hash = "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10"}, + {file = "prompt_toolkit-3.0.47.tar.gz", hash = "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360"}, ] [package.dependencies] @@ -3113,20 +3113,20 @@ wcwidth = "*" [[package]] name = "proto-plus" -version = "1.23.0" +version = "1.24.0" description = "Beautiful, Pythonic protocol buffers." optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "proto-plus-1.23.0.tar.gz", hash = "sha256:89075171ef11988b3fa157f5dbd8b9cf09d65fffee97e29ce403cd8defba19d2"}, - {file = "proto_plus-1.23.0-py3-none-any.whl", hash = "sha256:a829c79e619e1cf632de091013a4173deed13a55f326ef84f05af6f50ff4c82c"}, + {file = "proto-plus-1.24.0.tar.gz", hash = "sha256:30b72a5ecafe4406b0d339db35b56c4059064e69227b8c3bda7462397f966445"}, + {file = "proto_plus-1.24.0-py3-none-any.whl", hash = "sha256:402576830425e5f6ce4c2a6702400ac79897dab0b4343821aa5188b0fab81a12"}, ] [package.dependencies] -protobuf = ">=3.19.0,<5.0.0dev" +protobuf = ">=3.19.0,<6.0.0dev" [package.extras] -testing = ["google-api-core[grpc] (>=1.31.5)"] +testing = ["google-api-core (>=1.31.5)"] [[package]] name = "protobuf" @@ -3181,27 +3181,28 @@ files = [ [[package]] name = "psutil" -version = "5.9.8" +version = "6.0.0" 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.8-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:26bd09967ae00920df88e0352a91cff1a78f8d69b3ecabbfe733610c0af486c8"}, - {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:05806de88103b25903dff19bb6692bd2e714ccf9e668d050d144012055cbca73"}, - {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:611052c4bc70432ec770d5d54f64206aa7203a101ec273a0cd82418c86503bb7"}, - {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:50187900d73c1381ba1454cf40308c2bf6f34268518b3f36a9b663ca87e65e36"}, - {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:02615ed8c5ea222323408ceba16c60e99c3f91639b07da6373fb7e6539abc56d"}, - {file = "psutil-5.9.8-cp27-none-win32.whl", hash = "sha256:36f435891adb138ed3c9e58c6af3e2e6ca9ac2f365efe1f9cfef2794e6c93b4e"}, - {file = "psutil-5.9.8-cp27-none-win_amd64.whl", hash = "sha256:bd1184ceb3f87651a67b2708d4c3338e9b10c5df903f2e3776b62303b26cb631"}, - {file = "psutil-5.9.8-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aee678c8720623dc456fa20659af736241f575d79429a0e5e9cf88ae0605cc81"}, - {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cb6403ce6d8e047495a701dc7c5bd788add903f8986d523e3e20b98b733e421"}, - {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d06016f7f8625a1825ba3732081d77c94589dca78b7a3fc072194851e88461a4"}, - {file = "psutil-5.9.8-cp36-cp36m-win32.whl", hash = "sha256:7d79560ad97af658a0f6adfef8b834b53f64746d45b403f225b85c5c2c140eee"}, - {file = "psutil-5.9.8-cp36-cp36m-win_amd64.whl", hash = "sha256:27cc40c3493bb10de1be4b3f07cae4c010ce715290a5be22b98493509c6299e2"}, - {file = "psutil-5.9.8-cp37-abi3-win32.whl", hash = "sha256:bc56c2a1b0d15aa3eaa5a60c9f3f8e3e565303b465dbf57a1b730e7a2b9844e0"}, - {file = "psutil-5.9.8-cp37-abi3-win_amd64.whl", hash = "sha256:8db4c1b57507eef143a15a6884ca10f7c73876cdf5d51e713151c1236a0e68cf"}, - {file = "psutil-5.9.8-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8"}, - {file = "psutil-5.9.8.tar.gz", hash = "sha256:6be126e3225486dff286a8fb9a06246a5253f4c7c53b475ea5f5ac934e64194c"}, +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "psutil-6.0.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a021da3e881cd935e64a3d0a20983bda0bb4cf80e4f74fa9bfcb1bc5785360c6"}, + {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:1287c2b95f1c0a364d23bc6f2ea2365a8d4d9b726a3be7294296ff7ba97c17f0"}, + {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:a9a3dbfb4de4f18174528d87cc352d1f788b7496991cca33c6996f40c9e3c92c"}, + {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:6ec7588fb3ddaec7344a825afe298db83fe01bfaaab39155fa84cf1c0d6b13c3"}, + {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:1e7c870afcb7d91fdea2b37c24aeb08f98b6d67257a5cb0a8bc3ac68d0f1a68c"}, + {file = "psutil-6.0.0-cp27-none-win32.whl", hash = "sha256:02b69001f44cc73c1c5279d02b30a817e339ceb258ad75997325e0e6169d8b35"}, + {file = "psutil-6.0.0-cp27-none-win_amd64.whl", hash = "sha256:21f1fb635deccd510f69f485b87433460a603919b45e2a324ad65b0cc74f8fb1"}, + {file = "psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132"}, + {file = "psutil-6.0.0-cp36-cp36m-win32.whl", hash = "sha256:fc8c9510cde0146432bbdb433322861ee8c3efbf8589865c8bf8d21cb30c4d14"}, + {file = "psutil-6.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:34859b8d8f423b86e4385ff3665d3f4d94be3cdf48221fbe476e883514fdb71c"}, + {file = "psutil-6.0.0-cp37-abi3-win32.whl", hash = "sha256:a495580d6bae27291324fe60cea0b5a7c23fa36a7cd35035a16d93bdcf076b9d"}, + {file = "psutil-6.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3"}, + {file = "psutil-6.0.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0"}, + {file = "psutil-6.0.0.tar.gz", hash = "sha256:8faae4f310b6d969fa26ca0545338b21f73c6b15db7c4a8d934a5482faa818f2"}, ] [package.extras] @@ -3525,18 +3526,18 @@ files = [ [[package]] name = "pydantic" -version = "2.7.1" +version = "2.7.4" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.7.1-py3-none-any.whl", hash = "sha256:e029badca45266732a9a79898a15ae2e8b14840b1eabbb25844be28f0b33f3d5"}, - {file = "pydantic-2.7.1.tar.gz", hash = "sha256:e9dbb5eada8abe4d9ae5f46b9939aead650cd2b68f249bb3a8139dbe125803cc"}, + {file = "pydantic-2.7.4-py3-none-any.whl", hash = "sha256:ee8538d41ccb9c0a9ad3e0e5f07bf15ed8015b481ced539a1759d8cc89ae90d0"}, + {file = "pydantic-2.7.4.tar.gz", hash = "sha256:0c84efd9548d545f63ac0060c1e4d39bb9b14db8b3c0652338aecc07b5adec52"}, ] [package.dependencies] annotated-types = ">=0.4.0" -pydantic-core = "2.18.2" +pydantic-core = "2.18.4" typing-extensions = ">=4.6.1" [package.extras] @@ -3544,90 +3545,90 @@ email = ["email-validator (>=2.0.0)"] [[package]] name = "pydantic-core" -version = "2.18.2" +version = "2.18.4" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.18.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:9e08e867b306f525802df7cd16c44ff5ebbe747ff0ca6cf3fde7f36c05a59a81"}, - {file = "pydantic_core-2.18.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f0a21cbaa69900cbe1a2e7cad2aa74ac3cf21b10c3efb0fa0b80305274c0e8a2"}, - {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0680b1f1f11fda801397de52c36ce38ef1c1dc841a0927a94f226dea29c3ae3d"}, - {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:95b9d5e72481d3780ba3442eac863eae92ae43a5f3adb5b4d0a1de89d42bb250"}, - {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fcf5cd9c4b655ad666ca332b9a081112cd7a58a8b5a6ca7a3104bc950f2038"}, - {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b5155ff768083cb1d62f3e143b49a8a3432e6789a3abee8acd005c3c7af1c74"}, - {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:553ef617b6836fc7e4df130bb851e32fe357ce36336d897fd6646d6058d980af"}, - {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b89ed9eb7d616ef5714e5590e6cf7f23b02d0d539767d33561e3675d6f9e3857"}, - {file = "pydantic_core-2.18.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:75f7e9488238e920ab6204399ded280dc4c307d034f3924cd7f90a38b1829563"}, - {file = "pydantic_core-2.18.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ef26c9e94a8c04a1b2924149a9cb081836913818e55681722d7f29af88fe7b38"}, - {file = "pydantic_core-2.18.2-cp310-none-win32.whl", hash = "sha256:182245ff6b0039e82b6bb585ed55a64d7c81c560715d1bad0cbad6dfa07b4027"}, - {file = "pydantic_core-2.18.2-cp310-none-win_amd64.whl", hash = "sha256:e23ec367a948b6d812301afc1b13f8094ab7b2c280af66ef450efc357d2ae543"}, - {file = "pydantic_core-2.18.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:219da3f096d50a157f33645a1cf31c0ad1fe829a92181dd1311022f986e5fbe3"}, - {file = "pydantic_core-2.18.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cc1cfd88a64e012b74e94cd00bbe0f9c6df57049c97f02bb07d39e9c852e19a4"}, - {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05b7133a6e6aeb8df37d6f413f7705a37ab4031597f64ab56384c94d98fa0e90"}, - {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:224c421235f6102e8737032483f43c1a8cfb1d2f45740c44166219599358c2cd"}, - {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b14d82cdb934e99dda6d9d60dc84a24379820176cc4a0d123f88df319ae9c150"}, - {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2728b01246a3bba6de144f9e3115b532ee44bd6cf39795194fb75491824a1413"}, - {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:470b94480bb5ee929f5acba6995251ada5e059a5ef3e0dfc63cca287283ebfa6"}, - {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:997abc4df705d1295a42f95b4eec4950a37ad8ae46d913caeee117b6b198811c"}, - {file = "pydantic_core-2.18.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:75250dbc5290e3f1a0f4618db35e51a165186f9034eff158f3d490b3fed9f8a0"}, - {file = "pydantic_core-2.18.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4456f2dca97c425231d7315737d45239b2b51a50dc2b6f0c2bb181fce6207664"}, - {file = "pydantic_core-2.18.2-cp311-none-win32.whl", hash = "sha256:269322dcc3d8bdb69f054681edff86276b2ff972447863cf34c8b860f5188e2e"}, - {file = "pydantic_core-2.18.2-cp311-none-win_amd64.whl", hash = "sha256:800d60565aec896f25bc3cfa56d2277d52d5182af08162f7954f938c06dc4ee3"}, - {file = "pydantic_core-2.18.2-cp311-none-win_arm64.whl", hash = "sha256:1404c69d6a676245199767ba4f633cce5f4ad4181f9d0ccb0577e1f66cf4c46d"}, - {file = "pydantic_core-2.18.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:fb2bd7be70c0fe4dfd32c951bc813d9fe6ebcbfdd15a07527796c8204bd36242"}, - {file = "pydantic_core-2.18.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6132dd3bd52838acddca05a72aafb6eab6536aa145e923bb50f45e78b7251043"}, - {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d904828195733c183d20a54230c0df0eb46ec746ea1a666730787353e87182"}, - {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c9bd70772c720142be1020eac55f8143a34ec9f82d75a8e7a07852023e46617f"}, - {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2b8ed04b3582771764538f7ee7001b02e1170223cf9b75dff0bc698fadb00cf3"}, - {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e6dac87ddb34aaec85f873d737e9d06a3555a1cc1a8e0c44b7f8d5daeb89d86f"}, - {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ca4ae5a27ad7a4ee5170aebce1574b375de390bc01284f87b18d43a3984df72"}, - {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:886eec03591b7cf058467a70a87733b35f44707bd86cf64a615584fd72488b7c"}, - {file = "pydantic_core-2.18.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ca7b0c1f1c983e064caa85f3792dd2fe3526b3505378874afa84baf662e12241"}, - {file = "pydantic_core-2.18.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b4356d3538c3649337df4074e81b85f0616b79731fe22dd11b99499b2ebbdf3"}, - {file = "pydantic_core-2.18.2-cp312-none-win32.whl", hash = "sha256:8b172601454f2d7701121bbec3425dd71efcb787a027edf49724c9cefc14c038"}, - {file = "pydantic_core-2.18.2-cp312-none-win_amd64.whl", hash = "sha256:b1bd7e47b1558ea872bd16c8502c414f9e90dcf12f1395129d7bb42a09a95438"}, - {file = "pydantic_core-2.18.2-cp312-none-win_arm64.whl", hash = "sha256:98758d627ff397e752bc339272c14c98199c613f922d4a384ddc07526c86a2ec"}, - {file = "pydantic_core-2.18.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:9fdad8e35f278b2c3eb77cbdc5c0a49dada440657bf738d6905ce106dc1de439"}, - {file = "pydantic_core-2.18.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1d90c3265ae107f91a4f279f4d6f6f1d4907ac76c6868b27dc7fb33688cfb347"}, - {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:390193c770399861d8df9670fb0d1874f330c79caaca4642332df7c682bf6b91"}, - {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:82d5d4d78e4448683cb467897fe24e2b74bb7b973a541ea1dcfec1d3cbce39fb"}, - {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4774f3184d2ef3e14e8693194f661dea5a4d6ca4e3dc8e39786d33a94865cefd"}, - {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4d938ec0adf5167cb335acb25a4ee69a8107e4984f8fbd2e897021d9e4ca21b"}, - {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0e8b1be28239fc64a88a8189d1df7fad8be8c1ae47fcc33e43d4be15f99cc70"}, - {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:868649da93e5a3d5eacc2b5b3b9235c98ccdbfd443832f31e075f54419e1b96b"}, - {file = "pydantic_core-2.18.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:78363590ef93d5d226ba21a90a03ea89a20738ee5b7da83d771d283fd8a56761"}, - {file = "pydantic_core-2.18.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:852e966fbd035a6468fc0a3496589b45e2208ec7ca95c26470a54daed82a0788"}, - {file = "pydantic_core-2.18.2-cp38-none-win32.whl", hash = "sha256:6a46e22a707e7ad4484ac9ee9f290f9d501df45954184e23fc29408dfad61350"}, - {file = "pydantic_core-2.18.2-cp38-none-win_amd64.whl", hash = "sha256:d91cb5ea8b11607cc757675051f61b3d93f15eca3cefb3e6c704a5d6e8440f4e"}, - {file = "pydantic_core-2.18.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:ae0a8a797a5e56c053610fa7be147993fe50960fa43609ff2a9552b0e07013e8"}, - {file = "pydantic_core-2.18.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:042473b6280246b1dbf530559246f6842b56119c2926d1e52b631bdc46075f2a"}, - {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a388a77e629b9ec814c1b1e6b3b595fe521d2cdc625fcca26fbc2d44c816804"}, - {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e25add29b8f3b233ae90ccef2d902d0ae0432eb0d45370fe315d1a5cf231004b"}, - {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f459a5ce8434614dfd39bbebf1041952ae01da6bed9855008cb33b875cb024c0"}, - {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eff2de745698eb46eeb51193a9f41d67d834d50e424aef27df2fcdee1b153845"}, - {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8309f67285bdfe65c372ea3722b7a5642680f3dba538566340a9d36e920b5f0"}, - {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f93a8a2e3938ff656a7c1bc57193b1319960ac015b6e87d76c76bf14fe0244b4"}, - {file = "pydantic_core-2.18.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:22057013c8c1e272eb8d0eebc796701167d8377441ec894a8fed1af64a0bf399"}, - {file = "pydantic_core-2.18.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cfeecd1ac6cc1fb2692c3d5110781c965aabd4ec5d32799773ca7b1456ac636b"}, - {file = "pydantic_core-2.18.2-cp39-none-win32.whl", hash = "sha256:0d69b4c2f6bb3e130dba60d34c0845ba31b69babdd3f78f7c0c8fae5021a253e"}, - {file = "pydantic_core-2.18.2-cp39-none-win_amd64.whl", hash = "sha256:d9319e499827271b09b4e411905b24a426b8fb69464dfa1696258f53a3334641"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a1874c6dd4113308bd0eb568418e6114b252afe44319ead2b4081e9b9521fe75"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:ccdd111c03bfd3666bd2472b674c6899550e09e9f298954cfc896ab92b5b0e6d"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e18609ceaa6eed63753037fc06ebb16041d17d28199ae5aba0052c51449650a9"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e5c584d357c4e2baf0ff7baf44f4994be121e16a2c88918a5817331fc7599d7"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:43f0f463cf89ace478de71a318b1b4f05ebc456a9b9300d027b4b57c1a2064fb"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e1b395e58b10b73b07b7cf740d728dd4ff9365ac46c18751bf8b3d8cca8f625a"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0098300eebb1c837271d3d1a2cd2911e7c11b396eac9661655ee524a7f10587b"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:36789b70d613fbac0a25bb07ab3d9dba4d2e38af609c020cf4d888d165ee0bf3"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3f9a801e7c8f1ef8718da265bba008fa121243dfe37c1cea17840b0944dfd72c"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:3a6515ebc6e69d85502b4951d89131ca4e036078ea35533bb76327f8424531ce"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20aca1e2298c56ececfd8ed159ae4dde2df0781988c97ef77d5c16ff4bd5b400"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:223ee893d77a310a0391dca6df00f70bbc2f36a71a895cecd9a0e762dc37b349"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2334ce8c673ee93a1d6a65bd90327588387ba073c17e61bf19b4fd97d688d63c"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:cbca948f2d14b09d20268cda7b0367723d79063f26c4ffc523af9042cad95592"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b3ef08e20ec49e02d5c6717a91bb5af9b20f1805583cb0adfe9ba2c6b505b5ae"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c6fdc8627910eed0c01aed6a390a252fe3ea6d472ee70fdde56273f198938374"}, - {file = "pydantic_core-2.18.2.tar.gz", hash = "sha256:2e29d20810dfc3043ee13ac7d9e25105799817683348823f305ab3f349b9386e"}, + {file = "pydantic_core-2.18.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:f76d0ad001edd426b92233d45c746fd08f467d56100fd8f30e9ace4b005266e4"}, + {file = "pydantic_core-2.18.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:59ff3e89f4eaf14050c8022011862df275b552caef8082e37b542b066ce1ff26"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a55b5b16c839df1070bc113c1f7f94a0af4433fcfa1b41799ce7606e5c79ce0a"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4d0dcc59664fcb8974b356fe0a18a672d6d7cf9f54746c05f43275fc48636851"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8951eee36c57cd128f779e641e21eb40bc5073eb28b2d23f33eb0ef14ffb3f5d"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4701b19f7e3a06ea655513f7938de6f108123bf7c86bbebb1196eb9bd35cf724"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e00a3f196329e08e43d99b79b286d60ce46bed10f2280d25a1718399457e06be"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:97736815b9cc893b2b7f663628e63f436018b75f44854c8027040e05230eeddb"}, + {file = "pydantic_core-2.18.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6891a2ae0e8692679c07728819b6e2b822fb30ca7445f67bbf6509b25a96332c"}, + {file = "pydantic_core-2.18.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bc4ff9805858bd54d1a20efff925ccd89c9d2e7cf4986144b30802bf78091c3e"}, + {file = "pydantic_core-2.18.4-cp310-none-win32.whl", hash = "sha256:1b4de2e51bbcb61fdebd0ab86ef28062704f62c82bbf4addc4e37fa4b00b7cbc"}, + {file = "pydantic_core-2.18.4-cp310-none-win_amd64.whl", hash = "sha256:6a750aec7bf431517a9fd78cb93c97b9b0c496090fee84a47a0d23668976b4b0"}, + {file = "pydantic_core-2.18.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:942ba11e7dfb66dc70f9ae66b33452f51ac7bb90676da39a7345e99ffb55402d"}, + {file = "pydantic_core-2.18.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b2ebef0e0b4454320274f5e83a41844c63438fdc874ea40a8b5b4ecb7693f1c4"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a642295cd0c8df1b86fc3dced1d067874c353a188dc8e0f744626d49e9aa51c4"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f09baa656c904807e832cf9cce799c6460c450c4ad80803517032da0cd062e2"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98906207f29bc2c459ff64fa007afd10a8c8ac080f7e4d5beff4c97086a3dabd"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19894b95aacfa98e7cb093cd7881a0c76f55731efad31073db4521e2b6ff5b7d"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fbbdc827fe5e42e4d196c746b890b3d72876bdbf160b0eafe9f0334525119c8"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f85d05aa0918283cf29a30b547b4df2fbb56b45b135f9e35b6807cb28bc47951"}, + {file = "pydantic_core-2.18.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e85637bc8fe81ddb73fda9e56bab24560bdddfa98aa64f87aaa4e4b6730c23d2"}, + {file = "pydantic_core-2.18.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2f5966897e5461f818e136b8451d0551a2e77259eb0f73a837027b47dc95dab9"}, + {file = "pydantic_core-2.18.4-cp311-none-win32.whl", hash = "sha256:44c7486a4228413c317952e9d89598bcdfb06399735e49e0f8df643e1ccd0558"}, + {file = "pydantic_core-2.18.4-cp311-none-win_amd64.whl", hash = "sha256:8a7164fe2005d03c64fd3b85649891cd4953a8de53107940bf272500ba8a788b"}, + {file = "pydantic_core-2.18.4-cp311-none-win_arm64.whl", hash = "sha256:4e99bc050fe65c450344421017f98298a97cefc18c53bb2f7b3531eb39bc7805"}, + {file = "pydantic_core-2.18.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:6f5c4d41b2771c730ea1c34e458e781b18cc668d194958e0112455fff4e402b2"}, + {file = "pydantic_core-2.18.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2fdf2156aa3d017fddf8aea5adfba9f777db1d6022d392b682d2a8329e087cef"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4748321b5078216070b151d5271ef3e7cc905ab170bbfd27d5c83ee3ec436695"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:847a35c4d58721c5dc3dba599878ebbdfd96784f3fb8bb2c356e123bdcd73f34"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c40d4eaad41f78e3bbda31b89edc46a3f3dc6e171bf0ecf097ff7a0ffff7cb1"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:21a5e440dbe315ab9825fcd459b8814bb92b27c974cbc23c3e8baa2b76890077"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01dd777215e2aa86dfd664daed5957704b769e726626393438f9c87690ce78c3"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4b06beb3b3f1479d32befd1f3079cc47b34fa2da62457cdf6c963393340b56e9"}, + {file = "pydantic_core-2.18.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:564d7922e4b13a16b98772441879fcdcbe82ff50daa622d681dd682175ea918c"}, + {file = "pydantic_core-2.18.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0eb2a4f660fcd8e2b1c90ad566db2b98d7f3f4717c64fe0a83e0adb39766d5b8"}, + {file = "pydantic_core-2.18.4-cp312-none-win32.whl", hash = "sha256:8b8bab4c97248095ae0c4455b5a1cd1cdd96e4e4769306ab19dda135ea4cdb07"}, + {file = "pydantic_core-2.18.4-cp312-none-win_amd64.whl", hash = "sha256:14601cdb733d741b8958224030e2bfe21a4a881fb3dd6fbb21f071cabd48fa0a"}, + {file = "pydantic_core-2.18.4-cp312-none-win_arm64.whl", hash = "sha256:c1322d7dd74713dcc157a2b7898a564ab091ca6c58302d5c7b4c07296e3fd00f"}, + {file = "pydantic_core-2.18.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:823be1deb01793da05ecb0484d6c9e20baebb39bd42b5d72636ae9cf8350dbd2"}, + {file = "pydantic_core-2.18.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ebef0dd9bf9b812bf75bda96743f2a6c5734a02092ae7f721c048d156d5fabae"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae1d6df168efb88d7d522664693607b80b4080be6750c913eefb77e34c12c71a"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f9899c94762343f2cc2fc64c13e7cae4c3cc65cdfc87dd810a31654c9b7358cc"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99457f184ad90235cfe8461c4d70ab7dd2680e28821c29eca00252ba90308c78"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18f469a3d2a2fdafe99296a87e8a4c37748b5080a26b806a707f25a902c040a8"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7cdf28938ac6b8b49ae5e92f2735056a7ba99c9b110a474473fd71185c1af5d"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:938cb21650855054dc54dfd9120a851c974f95450f00683399006aa6e8abb057"}, + {file = "pydantic_core-2.18.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:44cd83ab6a51da80fb5adbd9560e26018e2ac7826f9626bc06ca3dc074cd198b"}, + {file = "pydantic_core-2.18.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:972658f4a72d02b8abfa2581d92d59f59897d2e9f7e708fdabe922f9087773af"}, + {file = "pydantic_core-2.18.4-cp38-none-win32.whl", hash = "sha256:1d886dc848e60cb7666f771e406acae54ab279b9f1e4143babc9c2258213daa2"}, + {file = "pydantic_core-2.18.4-cp38-none-win_amd64.whl", hash = "sha256:bb4462bd43c2460774914b8525f79b00f8f407c945d50881568f294c1d9b4443"}, + {file = "pydantic_core-2.18.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:44a688331d4a4e2129140a8118479443bd6f1905231138971372fcde37e43528"}, + {file = "pydantic_core-2.18.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a2fdd81edd64342c85ac7cf2753ccae0b79bf2dfa063785503cb85a7d3593223"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86110d7e1907ab36691f80b33eb2da87d780f4739ae773e5fc83fb272f88825f"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:46387e38bd641b3ee5ce247563b60c5ca098da9c56c75c157a05eaa0933ed154"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:123c3cec203e3f5ac7b000bd82235f1a3eced8665b63d18be751f115588fea30"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dc1803ac5c32ec324c5261c7209e8f8ce88e83254c4e1aebdc8b0a39f9ddb443"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53db086f9f6ab2b4061958d9c276d1dbe3690e8dd727d6abf2321d6cce37fa94"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:abc267fa9837245cc28ea6929f19fa335f3dc330a35d2e45509b6566dc18be23"}, + {file = "pydantic_core-2.18.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a0d829524aaefdebccb869eed855e2d04c21d2d7479b6cada7ace5448416597b"}, + {file = "pydantic_core-2.18.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:509daade3b8649f80d4e5ff21aa5673e4ebe58590b25fe42fac5f0f52c6f034a"}, + {file = "pydantic_core-2.18.4-cp39-none-win32.whl", hash = "sha256:ca26a1e73c48cfc54c4a76ff78df3727b9d9f4ccc8dbee4ae3f73306a591676d"}, + {file = "pydantic_core-2.18.4-cp39-none-win_amd64.whl", hash = "sha256:c67598100338d5d985db1b3d21f3619ef392e185e71b8d52bceacc4a7771ea7e"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:574d92eac874f7f4db0ca653514d823a0d22e2354359d0759e3f6a406db5d55d"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1f4d26ceb5eb9eed4af91bebeae4b06c3fb28966ca3a8fb765208cf6b51102ab"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77450e6d20016ec41f43ca4a6c63e9fdde03f0ae3fe90e7c27bdbeaece8b1ed4"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d323a01da91851a4f17bf592faf46149c9169d68430b3146dcba2bb5e5719abc"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:43d447dd2ae072a0065389092a231283f62d960030ecd27565672bd40746c507"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:578e24f761f3b425834f297b9935e1ce2e30f51400964ce4801002435a1b41ef"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:81b5efb2f126454586d0f40c4d834010979cb80785173d1586df845a632e4e6d"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ab86ce7c8f9bea87b9d12c7f0af71102acbf5ecbc66c17796cff45dae54ef9a5"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:90afc12421df2b1b4dcc975f814e21bc1754640d502a2fbcc6d41e77af5ec312"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:51991a89639a912c17bef4b45c87bd83593aee0437d8102556af4885811d59f5"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:293afe532740370aba8c060882f7d26cfd00c94cae32fd2e212a3a6e3b7bc15e"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b48ece5bde2e768197a2d0f6e925f9d7e3e826f0ad2271120f8144a9db18d5c8"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eae237477a873ab46e8dd748e515c72c0c804fb380fbe6c85533c7de51f23a8f"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:834b5230b5dfc0c1ec37b2fda433b271cbbc0e507560b5d1588e2cc1148cf1ce"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e858ac0a25074ba4bce653f9b5d0a85b7456eaddadc0ce82d3878c22489fa4ee"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2fd41f6eff4c20778d717af1cc50eca52f5afe7805ee530a4fbd0bae284f16e9"}, + {file = "pydantic_core-2.18.4.tar.gz", hash = "sha256:ec3beeada09ff865c344ff3bc2f427f5e6c26401cc6113d77e372c3fdac73864"}, ] [package.dependencies] @@ -3807,13 +3808,13 @@ cp2110 = ["hidapi"] [[package]] name = "pytest" -version = "8.2.0" +version = "8.2.2" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-8.2.0-py3-none-any.whl", hash = "sha256:1733f0620f6cda4095bbf0d9ff8022486e91892245bb9e7d5542c018f612f233"}, - {file = "pytest-8.2.0.tar.gz", hash = "sha256:d507d4482197eac0ba2bae2e9babf0672eb333017bcedaa5fb1a3d42c1174b3f"}, + {file = "pytest-8.2.2-py3-none-any.whl", hash = "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343"}, + {file = "pytest-8.2.2.tar.gz", hash = "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977"}, ] [package.dependencies] @@ -3882,25 +3883,28 @@ dev = ["pre-commit", "pytest-asyncio", "tox"] [[package]] name = "python-box" -version = "7.1.1" +version = "7.2.0" description = "Advanced Python dictionaries with dot notation access" optional = false python-versions = ">=3.8" files = [ - {file = "python-box-7.1.1.tar.gz", hash = "sha256:2a3df244a5a79ac8f8447b5d11b5be0f2747d7b141cb2866060081ae9b53cc50"}, - {file = "python_box-7.1.1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:81ed1ec0f0ff2370227fc07277c5baca46d190a4747631bad7eb6ab1630fb7d9"}, - {file = "python_box-7.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8891735b4148e84d348c6eadd2f127152f751c9603e35d43a1f496183a291ac4"}, - {file = "python_box-7.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:0036fd47d388deaca8ebd65aea905f88ee6ef91d1d8ce34898b66f1824afbe80"}, - {file = "python_box-7.1.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:aabf8b9ae5dbc8ba431d8cbe0d4cfe737a25d52d68b0f5f2ff34915c21a2c1db"}, - {file = "python_box-7.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c046608337e723ae4de3206db5d1e1202ed166da2dfdc70c1f9361e72ace5633"}, - {file = "python_box-7.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:f9266795e9c233874fb5b34fa994054b4fb0371881678e6ec45aec17fc95feac"}, - {file = "python_box-7.1.1-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:f76b5b7f0cdc07bfdd4200dc24e6e33189bb2ae322137a2b7110fd41891a3157"}, - {file = "python_box-7.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ea13c98e05a3ec0ff26f254986a17290b69b5ade209fad081fd628f8fcfaa08"}, - {file = "python_box-7.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:1b3f346e332dba16df0b0543d319d9e7ce07d93e5ae152175302894352aa2d28"}, - {file = "python_box-7.1.1-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:24c4ec0ee0278f66321100aaa9c615413da27a14ff43d376a2a3b4665e1d9494"}, - {file = "python_box-7.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d95e5eec4fc8f3fc5c9cc7347fc2eb4f9187c853d34c90b1658d1eff96cd4eac"}, - {file = "python_box-7.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:a0f1333c42e81529b6f68c192050df9d4505b803be7ac47f114036b98707f7cf"}, - {file = "python_box-7.1.1-py3-none-any.whl", hash = "sha256:63b609555554d7a9d4b6e725f8e78ef1717c67e7d386200e03422ad612338df8"}, + {file = "python_box-7.2.0-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:6bdeec791e25258351388b3029a3ec5da302bb9ed3be175493c43cdc6c47f5e3"}, + {file = "python_box-7.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c449f7b3756a71479fa9c61a86e344ac00ed782a66d7662590f0afa294249d18"}, + {file = "python_box-7.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:6b0d61f182d394106d963232854e495b51edc178faa5316a797be1178212d7e0"}, + {file = "python_box-7.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e2d752de8c1204255bf7b0c814c59ef48293c187a7e9fdcd2fefa28024b72032"}, + {file = "python_box-7.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8a6c35ea356a386077935958a5debcd5b229b9a1b3b26287a52dfe1a7e65d99"}, + {file = "python_box-7.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:32ed58ec4d9e5475efe69f9c7d773dfea90a6a01979e776da93fd2b0a5d04429"}, + {file = "python_box-7.2.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:2a2d664c6a27f7515469b6f1e461935a2038ee130b7d194b4b4db4e85d363618"}, + {file = "python_box-7.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8a5a7365db1aaf600d3e8a2747fcf6833beb5d45439a54318548f02e302e3ec"}, + {file = "python_box-7.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:739f827056ea148cbea3122d4617c994e829b420b1331183d968b175304e3a4f"}, + {file = "python_box-7.2.0-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:2617ef3c3d199f55f63c908f540a4dc14ced9b18533a879e6171c94a6a436f23"}, + {file = "python_box-7.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffd866bed03087b1d8340014da8c3aaae19135767580641df1b4ae6fff6ac0aa"}, + {file = "python_box-7.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:9681f059e7e92bdf20782cd9ea6e533d4711fc7b8c57a462922a025d46add4d0"}, + {file = "python_box-7.2.0-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:6b59b1e2741c9ceecdf5a5bd9b90502c24650e609cd824d434fed3b6f302b7bb"}, + {file = "python_box-7.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23fae825d809ae7520fdeac88bb52be55a3b63992120a00e381783669edf589"}, + {file = "python_box-7.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:573b1abdcb7bd745fa404444f060ee62fc35a74f067181e55dcb43cfe92f2827"}, + {file = "python_box-7.2.0-py3-none-any.whl", hash = "sha256:a3c90832dd772cb0197fdb5bc06123b6e1b846899a1b53d9c39450d27a584829"}, + {file = "python_box-7.2.0.tar.gz", hash = "sha256:551af20bdab3a60a2a21e3435120453c4ca32f7393787c3a5036e1d9fc6a0ede"}, ] [package.extras] @@ -4486,13 +4490,13 @@ rpds-py = ">=0.7.0" [[package]] name = "requests" -version = "2.31.0" +version = "2.32.3" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, ] [package.dependencies] @@ -4766,45 +4770,48 @@ files = [ [[package]] name = "scikit-learn" -version = "1.4.2" +version = "1.5.0" description = "A set of python modules for machine learning and data mining" optional = false python-versions = ">=3.9" files = [ - {file = "scikit-learn-1.4.2.tar.gz", hash = "sha256:daa1c471d95bad080c6e44b4946c9390a4842adc3082572c20e4f8884e39e959"}, - {file = "scikit_learn-1.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8539a41b3d6d1af82eb629f9c57f37428ff1481c1e34dddb3b9d7af8ede67ac5"}, - {file = "scikit_learn-1.4.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:68b8404841f944a4a1459b07198fa2edd41a82f189b44f3e1d55c104dbc2e40c"}, - {file = "scikit_learn-1.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81bf5d8bbe87643103334032dd82f7419bc8c8d02a763643a6b9a5c7288c5054"}, - {file = "scikit_learn-1.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36f0ea5d0f693cb247a073d21a4123bdf4172e470e6d163c12b74cbb1536cf38"}, - {file = "scikit_learn-1.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:87440e2e188c87db80ea4023440923dccbd56fbc2d557b18ced00fef79da0727"}, - {file = "scikit_learn-1.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:45dee87ac5309bb82e3ea633955030df9bbcb8d2cdb30383c6cd483691c546cc"}, - {file = "scikit_learn-1.4.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:1d0b25d9c651fd050555aadd57431b53d4cf664e749069da77f3d52c5ad14b3b"}, - {file = "scikit_learn-1.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0203c368058ab92efc6168a1507d388d41469c873e96ec220ca8e74079bf62e"}, - {file = "scikit_learn-1.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44c62f2b124848a28fd695db5bc4da019287abf390bfce602ddc8aa1ec186aae"}, - {file = "scikit_learn-1.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:5cd7b524115499b18b63f0c96f4224eb885564937a0b3477531b2b63ce331904"}, - {file = "scikit_learn-1.4.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:90378e1747949f90c8f385898fff35d73193dfcaec3dd75d6b542f90c4e89755"}, - {file = "scikit_learn-1.4.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:ff4effe5a1d4e8fed260a83a163f7dbf4f6087b54528d8880bab1d1377bd78be"}, - {file = "scikit_learn-1.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:671e2f0c3f2c15409dae4f282a3a619601fa824d2c820e5b608d9d775f91780c"}, - {file = "scikit_learn-1.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d36d0bc983336bbc1be22f9b686b50c964f593c8a9a913a792442af9bf4f5e68"}, - {file = "scikit_learn-1.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:d762070980c17ba3e9a4a1e043ba0518ce4c55152032f1af0ca6f39b376b5928"}, - {file = "scikit_learn-1.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d9993d5e78a8148b1d0fdf5b15ed92452af5581734129998c26f481c46586d68"}, - {file = "scikit_learn-1.4.2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:426d258fddac674fdf33f3cb2d54d26f49406e2599dbf9a32b4d1696091d4256"}, - {file = "scikit_learn-1.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5460a1a5b043ae5ae4596b3126a4ec33ccba1b51e7ca2c5d36dac2169f62ab1d"}, - {file = "scikit_learn-1.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49d64ef6cb8c093d883e5a36c4766548d974898d378e395ba41a806d0e824db8"}, - {file = "scikit_learn-1.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:c97a50b05c194be9146d61fe87dbf8eac62b203d9e87a3ccc6ae9aed2dfaf361"}, + {file = "scikit_learn-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:12e40ac48555e6b551f0a0a5743cc94cc5a765c9513fe708e01f0aa001da2801"}, + {file = "scikit_learn-1.5.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:f405c4dae288f5f6553b10c4ac9ea7754d5180ec11e296464adb5d6ac68b6ef5"}, + {file = "scikit_learn-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df8ccabbf583315f13160a4bb06037bde99ea7d8211a69787a6b7c5d4ebb6fc3"}, + {file = "scikit_learn-1.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c75ea812cd83b1385bbfa94ae971f0d80adb338a9523f6bbcb5e0b0381151d4"}, + {file = "scikit_learn-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:a90c5da84829a0b9b4bf00daf62754b2be741e66b5946911f5bdfaa869fcedd6"}, + {file = "scikit_learn-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2a65af2d8a6cce4e163a7951a4cfbfa7fceb2d5c013a4b593686c7f16445cf9d"}, + {file = "scikit_learn-1.5.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:4c0c56c3005f2ec1db3787aeaabefa96256580678cec783986836fc64f8ff622"}, + {file = "scikit_learn-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f77547165c00625551e5c250cefa3f03f2fc92c5e18668abd90bfc4be2e0bff"}, + {file = "scikit_learn-1.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:118a8d229a41158c9f90093e46b3737120a165181a1b58c03461447aa4657415"}, + {file = "scikit_learn-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:a03b09f9f7f09ffe8c5efffe2e9de1196c696d811be6798ad5eddf323c6f4d40"}, + {file = "scikit_learn-1.5.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:460806030c666addee1f074788b3978329a5bfdc9b7d63e7aad3f6d45c67a210"}, + {file = "scikit_learn-1.5.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:1b94d6440603752b27842eda97f6395f570941857456c606eb1d638efdb38184"}, + {file = "scikit_learn-1.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d82c2e573f0f2f2f0be897e7a31fcf4e73869247738ab8c3ce7245549af58ab8"}, + {file = "scikit_learn-1.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3a10e1d9e834e84d05e468ec501a356226338778769317ee0b84043c0d8fb06"}, + {file = "scikit_learn-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:855fc5fa8ed9e4f08291203af3d3e5fbdc4737bd617a371559aaa2088166046e"}, + {file = "scikit_learn-1.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:40fb7d4a9a2db07e6e0cae4dc7bdbb8fada17043bac24104d8165e10e4cff1a2"}, + {file = "scikit_learn-1.5.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:47132440050b1c5beb95f8ba0b2402bbd9057ce96ec0ba86f2f445dd4f34df67"}, + {file = "scikit_learn-1.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:174beb56e3e881c90424e21f576fa69c4ffcf5174632a79ab4461c4c960315ac"}, + {file = "scikit_learn-1.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261fe334ca48f09ed64b8fae13f9b46cc43ac5f580c4a605cbb0a517456c8f71"}, + {file = "scikit_learn-1.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:057b991ac64b3e75c9c04b5f9395eaf19a6179244c089afdebaad98264bff37c"}, + {file = "scikit_learn-1.5.0.tar.gz", hash = "sha256:789e3db01c750ed6d496fa2db7d50637857b451e57bcae863bff707c1247bef7"}, ] [package.dependencies] joblib = ">=1.2.0" numpy = ">=1.19.5" scipy = ">=1.6.0" -threadpoolctl = ">=2.0.0" +threadpoolctl = ">=3.1.0" [package.extras] -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)"] +benchmark = ["matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "pandas (>=1.1.5)"] +build = ["cython (>=3.0.10)", "meson-python (>=0.15.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)"] +docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "polars (>=0.20.23)", "pooch (>=1.6.0)", "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)"] +install = ["joblib (>=1.2.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)", "threadpoolctl (>=3.1.0)"] +maintenance = ["conda-lock (==2.5.6)"] +tests = ["black (>=24.3.0)", "matplotlib (>=3.3.4)", "mypy (>=1.9)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "polars (>=0.20.23)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pyarrow (>=12.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.2.1)", "scikit-image (>=0.17.2)"] [[package]] name = "scipy" @@ -4850,19 +4857,18 @@ test = ["asv", "gmpy2", "hypothesis", "mpmath", "pooch", "pytest", "pytest-cov", [[package]] name = "setuptools" -version = "69.5.1" +version = "70.1.1" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-69.5.1-py3-none-any.whl", hash = "sha256:c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32"}, - {file = "setuptools-69.5.1.tar.gz", hash = "sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987"}, + {file = "setuptools-70.1.1-py3-none-any.whl", hash = "sha256:a58a8fde0541dab0419750bcc521fbdf8585f6e5cb41909df3a472ef7b81ca95"}, + {file = "setuptools-70.1.1.tar.gz", hash = "sha256:937a48c7cdb7a21eb53cd7f9b59e525503aa8abaf3584c730dc5f7a5bec3a650"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.10.0)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "six" @@ -5175,17 +5181,17 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] [[package]] name = "sympy" -version = "1.12" +version = "1.12.1" description = "Computer algebra system (CAS) in Python" optional = false python-versions = ">=3.8" files = [ - {file = "sympy-1.12-py3-none-any.whl", hash = "sha256:c3588cd4295d0c0f603d0f2ae780587e64e2efeedb3521e46b9bb1d08d184fa5"}, - {file = "sympy-1.12.tar.gz", hash = "sha256:ebf595c8dac3e0fdc4152c51878b498396ec7f30e7a914d6071e674d49420fb8"}, + {file = "sympy-1.12.1-py3-none-any.whl", hash = "sha256:9b2cbc7f1a640289430e13d2a56f02f867a1da0190f2f99d8968c2f74da0e515"}, + {file = "sympy-1.12.1.tar.gz", hash = "sha256:2877b03f998cd8c08f07cd0de5b767119cd3ef40d09f41c30d722f6686b0fb88"}, ] [package.dependencies] -mpmath = ">=0.19" +mpmath = ">=1.1.0,<1.4.0" [[package]] name = "tabulate" @@ -5203,13 +5209,13 @@ widechars = ["wcwidth"] [[package]] name = "tenacity" -version = "8.3.0" +version = "8.4.2" description = "Retry code until it succeeds" optional = false python-versions = ">=3.8" files = [ - {file = "tenacity-8.3.0-py3-none-any.whl", hash = "sha256:3649f6443dbc0d9b01b9d8020a9c4ec7a1ff5f6f3c6c8a036ef371f573fe9185"}, - {file = "tenacity-8.3.0.tar.gz", hash = "sha256:953d4e6ad24357bceffbc9707bc74349aca9d245f68eb65419cf0c249a1949a2"}, + {file = "tenacity-8.4.2-py3-none-any.whl", hash = "sha256:9e6f7cf7da729125c7437222f8a522279751cdfbe6b67bfe64f75d3a348661b2"}, + {file = "tenacity-8.4.2.tar.gz", hash = "sha256:cd80a53a79336edba8489e767f729e4f391c896956b57140b5d7511a64bbd3ef"}, ] [package.extras] @@ -5280,22 +5286,22 @@ files = [ [[package]] name = "tornado" -version = "6.4" +version = "6.4.1" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." optional = false -python-versions = ">= 3.8" +python-versions = ">=3.8" files = [ - {file = "tornado-6.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:02ccefc7d8211e5a7f9e8bc3f9e5b0ad6262ba2fbb683a6443ecc804e5224ce0"}, - {file = "tornado-6.4-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:27787de946a9cffd63ce5814c33f734c627a87072ec7eed71f7fc4417bb16263"}, - {file = "tornado-6.4-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7894c581ecdcf91666a0912f18ce5e757213999e183ebfc2c3fdbf4d5bd764e"}, - {file = "tornado-6.4-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e43bc2e5370a6a8e413e1e1cd0c91bedc5bd62a74a532371042a18ef19e10579"}, - {file = "tornado-6.4-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0251554cdd50b4b44362f73ad5ba7126fc5b2c2895cc62b14a1c2d7ea32f212"}, - {file = "tornado-6.4-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fd03192e287fbd0899dd8f81c6fb9cbbc69194d2074b38f384cb6fa72b80e9c2"}, - {file = "tornado-6.4-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:88b84956273fbd73420e6d4b8d5ccbe913c65d31351b4c004ae362eba06e1f78"}, - {file = "tornado-6.4-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:71ddfc23a0e03ef2df1c1397d859868d158c8276a0603b96cf86892bff58149f"}, - {file = "tornado-6.4-cp38-abi3-win32.whl", hash = "sha256:6f8a6c77900f5ae93d8b4ae1196472d0ccc2775cc1dfdc9e7727889145c45052"}, - {file = "tornado-6.4-cp38-abi3-win_amd64.whl", hash = "sha256:10aeaa8006333433da48dec9fe417877f8bcc21f48dda8d661ae79da357b2a63"}, - {file = "tornado-6.4.tar.gz", hash = "sha256:72291fa6e6bc84e626589f1c29d90a5a6d593ef5ae68052ee2ef000dfd273dee"}, + {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8"}, + {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ae50a504a740365267b2a8d1a90c9fbc86b780a39170feca9bcc1787ff80842"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:25486eb223babe3eed4b8aecbac33b37e3dd6d776bc730ca14e1bf93888b979f"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:454db8a7ecfcf2ff6042dde58404164d969b6f5d58b926da15e6b23817950fc4"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a02a08cc7a9314b006f653ce40483b9b3c12cda222d6a46d4ac63bb6c9057698"}, + {file = "tornado-6.4.1-cp38-abi3-win32.whl", hash = "sha256:d9a566c40b89757c9aa8e6f032bcdb8ca8795d7c1a9762910c722b1635c9de4d"}, + {file = "tornado-6.4.1-cp38-abi3-win_amd64.whl", hash = "sha256:b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7"}, + {file = "tornado-6.4.1.tar.gz", hash = "sha256:92d3ab53183d8c50f8204a51e6f91d18a15d5ef261e84d452800d4ff6fc504e9"}, ] [[package]] @@ -5335,13 +5341,13 @@ test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0, [[package]] name = "typing-extensions" -version = "4.11.0" +version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, - {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] [[package]] @@ -5357,23 +5363,20 @@ files = [ [[package]] name = "uncertainties" -version = "3.1.7" -description = "Transparent calculations with uncertainties on the quantities involved (aka error propagation); fast calculation of derivatives" +version = "3.2.1" +description = "calculations with values with uncertainties, error propagation" optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "uncertainties-3.1.7-py2.py3-none-any.whl", hash = "sha256:4040ec64d298215531922a68fa1506dc6b1cb86cd7cca8eca848fcfe0f987151"}, - {file = "uncertainties-3.1.7.tar.gz", hash = "sha256:80111e0839f239c5b233cb4772017b483a0b7a1573a581b92ab7746a35e6faab"}, + {file = "uncertainties-3.2.1-py3-none-any.whl", hash = "sha256:80dea7f0c2fe37c9de6893b2352311b5f332be60060cbd6387f88050f7ec345d"}, + {file = "uncertainties-3.2.1.tar.gz", hash = "sha256:b05417b58bdef236c20e711fb2fee18e4db7348a92edcec01318b32aab34925e"}, ] -[package.dependencies] -future = "*" - [package.extras] -all = ["nose", "numpy", "sphinx"] -docs = ["sphinx"] -optional = ["numpy"] -tests = ["nose", "numpy"] +all = ["uncertainties[arrays,doc,test]"] +arrays = ["numpy"] +doc = ["python-docs-theme", "sphinx", "sphinx-copybutton"] +test = ["pytest", "pytest-cov"] [[package]] name = "unsync" @@ -5387,13 +5390,13 @@ files = [ [[package]] name = "urllib3" -version = "2.2.1" +version = "2.2.2" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, - {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, + {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, + {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, ] [package.extras] @@ -5555,13 +5558,13 @@ watchdog = ["watchdog (>=2.3)"] [[package]] name = "widgetsnbextension" -version = "4.0.10" +version = "4.0.11" description = "Jupyter interactive widgets for Jupyter Notebook" optional = false python-versions = ">=3.7" files = [ - {file = "widgetsnbextension-4.0.10-py3-none-any.whl", hash = "sha256:d37c3724ec32d8c48400a435ecfa7d3e259995201fbefa37163124a9fcb393cc"}, - {file = "widgetsnbextension-4.0.10.tar.gz", hash = "sha256:64196c5ff3b9a9183a8e699a4227fb0b7002f252c814098e66c4d1cd0644688f"}, + {file = "widgetsnbextension-4.0.11-py3-none-any.whl", hash = "sha256:55d4d6949d100e0d08b94948a42efc3ed6dfdc0e9468b2c4b128c9a2ce3a7a36"}, + {file = "widgetsnbextension-4.0.11.tar.gz", hash = "sha256:8b22a8f1910bfd188e596fe7fc05dcbd87e810c8a4ba010bdb3da86637398474"}, ] [[package]] @@ -5662,13 +5665,13 @@ files = [ [[package]] name = "xarray" -version = "2024.5.0" +version = "2024.6.0" description = "N-D labeled arrays and datasets in Python" optional = false python-versions = ">=3.9" files = [ - {file = "xarray-2024.5.0-py3-none-any.whl", hash = "sha256:7ddedfe2294a0ab00f02d0fbdcb9c6300ec589f3cf436a9c7b7b577a12cd9bcf"}, - {file = "xarray-2024.5.0.tar.gz", hash = "sha256:e0eb1cb265f265126795f388ed9591f3c752f2aca491f6c0576711fd15b708f2"}, + {file = "xarray-2024.6.0-py3-none-any.whl", hash = "sha256:721a7394e8ec3d592b2d8ebe21eed074ac077dc1bb1bd777ce00e41700b4866c"}, + {file = "xarray-2024.6.0.tar.gz", hash = "sha256:0b91e0bc4dc0296947947640fe31ec6e867ce258d2f7cbc10bedf4a6d68340c7"}, ] [package.dependencies] @@ -5774,18 +5777,18 @@ zhinst-timing-models = "*" [[package]] name = "zipp" -version = "3.18.2" +version = "3.19.2" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.18.2-py3-none-any.whl", hash = "sha256:dce197b859eb796242b0622af1b8beb0a722d52aa2f57133ead08edd5bf5374e"}, - {file = "zipp-3.18.2.tar.gz", hash = "sha256:6278d9ddbcfb1f1089a88fde84481528b07b0e10474e09dcfe53dad4069fa059"}, + {file = "zipp-3.19.2-py3-none-any.whl", hash = "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c"}, + {file = "zipp-3.19.2.tar.gz", hash = "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [extras] emulator = ["qutip", "scipy"] @@ -5798,4 +5801,4 @@ zh = ["laboneq"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.12" -content-hash = "2e9555b32f971566f63c0505cb15a651f0dabd88ce630a265e96bc27cf250f6e" +content-hash = "e5a3a7b24638f1fbd6098e6003bc7e2e73b163013a6495578a2967740a8ed3c1" From 76080e35f8685a82299177fd875453ad3c6ef564 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 2 May 2024 23:19:55 +0400 Subject: [PATCH 0199/1006] chore: remove FluxPulse object and add frequency: 0 to flux pulses in runcards --- src/qibolab/dummy/parameters.json | 20 ++++++++++++++++++++ src/qibolab/pulses/pulse.py | 8 +------- src/qibolab/serialize.py | 2 -- tests/dummy_qrc/qblox/parameters.json | 3 +++ tests/dummy_qrc/qm/parameters.json | 2 ++ tests/dummy_qrc/qm_octave/parameters.json | 2 ++ tests/dummy_qrc/zurich/parameters.json | 5 +++++ 7 files changed, 33 insertions(+), 9 deletions(-) diff --git a/src/qibolab/dummy/parameters.json b/src/qibolab/dummy/parameters.json index c1c666a66a..3a5f5846e2 100644 --- a/src/qibolab/dummy/parameters.json +++ b/src/qibolab/dummy/parameters.json @@ -173,6 +173,7 @@ "rel_sigma": 5, "width": 0.75 }, + "frequency": 0, "type": "cf" } }, @@ -185,6 +186,7 @@ "rel_sigma": 5, "width": 0.75 }, + "frequency": 0, "type": "cf" } }, @@ -197,6 +199,7 @@ "rel_sigma": 5, "width": 0.75 }, + "frequency": 0, "type": "cf" } }, @@ -209,6 +212,7 @@ "rel_sigma": 5, "width": 0.75 }, + "frequency": 0, "type": "cf" } } @@ -225,6 +229,7 @@ "width": 0.75 }, "qubit": 2, + "frequency": 0, "type": "qf" }, { @@ -246,6 +251,7 @@ "width": 0.75 }, "coupler": 0, + "frequency": 0, "type": "cf" } ], @@ -259,6 +265,7 @@ "width": 0.75 }, "qubit": 2, + "frequency": 0, "type": "qf" }, { @@ -280,6 +287,7 @@ "width": 0.75 }, "coupler": 0, + "frequency": 0, "type": "cf" } ] @@ -295,6 +303,7 @@ "width": 0.75 }, "qubit": 2, + "frequency": 0, "type": "qf" }, { @@ -316,6 +325,7 @@ "width": 0.75 }, "coupler": 1, + "frequency": 0, "type": "cf" } ], @@ -329,6 +339,7 @@ "width": 0.75 }, "qubit": 2, + "frequency": 0, "type": "qf" }, { @@ -350,6 +361,7 @@ "width": 0.75 }, "coupler": 1, + "frequency": 0, "type": "cf" } ] @@ -365,6 +377,7 @@ "width": 0.75 }, "qubit": 2, + "frequency": 0, "type": "qf" }, { @@ -386,6 +399,7 @@ "width": 0.75 }, "coupler": 3, + "frequency": 0, "type": "cf" } ], @@ -399,6 +413,7 @@ "width": 0.75 }, "qubit": 2, + "frequency": 0, "type": "qf" }, { @@ -420,6 +435,7 @@ "width": 0.75 }, "coupler": 3, + "frequency": 0, "type": "cf" } ], @@ -455,6 +471,7 @@ "width": 0.75 }, "qubit": 2, + "frequency": 0, "type": "qf" }, { @@ -476,6 +493,7 @@ "width": 0.75 }, "coupler": 4, + "frequency": 0, "type": "cf" } ], @@ -489,6 +507,7 @@ "width": 0.75 }, "qubit": 2, + "frequency": 0, "type": "qf" }, { @@ -510,6 +529,7 @@ "width": 0.75 }, "coupler": 4, + "frequency": 0, "type": "cf" } ] diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index cf93156e96..3c2c59b55e 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -119,12 +119,6 @@ def __hash__(self): ) -class FluxPulse(Pulse): - frequency: float = 0.0 - relative_phase: float = 0.0 - type: PulseType = PulseType.FLUX - - class Delay(Model): """A wait instruction during which we are not sending any pulses to the QPU.""" @@ -154,4 +148,4 @@ def duration(self): return 0 -PulseLike = Union[Pulse, FluxPulse, Delay, VirtualZ] +PulseLike = Union[Pulse, Delay, VirtualZ] diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index e7883139a4..dd08b34ff5 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -202,8 +202,6 @@ def dump_qubit_name(name: QubitId) -> str: def _dump_pulse(pulse: Pulse): data = pulse.model_dump() - if pulse.type in (PulseType.FLUX, PulseType.COUPLERFLUX): - del data["frequency"] data["type"] = data["type"].value if "channel" in data: del data["channel"] diff --git a/tests/dummy_qrc/qblox/parameters.json b/tests/dummy_qrc/qblox/parameters.json index d7c2836921..45058b9101 100644 --- a/tests/dummy_qrc/qblox/parameters.json +++ b/tests/dummy_qrc/qblox/parameters.json @@ -208,6 +208,7 @@ "g": 0.1 }, "qubit": 3, + "frequency": 0, "type": "qf" }, { @@ -234,6 +235,7 @@ "g": 0.1 }, "qubit": 2, + "frequency": 0, "type": "qf" } ] @@ -250,6 +252,7 @@ "g": 0.1 }, "qubit": 2, + "frequency": 0, "type": "qf" }, { diff --git a/tests/dummy_qrc/qm/parameters.json b/tests/dummy_qrc/qm/parameters.json index d4a67753e4..d8eb059eeb 100644 --- a/tests/dummy_qrc/qm/parameters.json +++ b/tests/dummy_qrc/qm/parameters.json @@ -184,6 +184,7 @@ "amplitude": 0.055, "envelope": { "kind": "rectangular" }, "qubit": 2, + "frequency": 0, "type": "qf" }, { @@ -205,6 +206,7 @@ "amplitude": -0.0513, "envelope": { "kind": "rectangular" }, "qubit": 3, + "frequency": 0, "type": "qf" }, { diff --git a/tests/dummy_qrc/qm_octave/parameters.json b/tests/dummy_qrc/qm_octave/parameters.json index a772204980..0e496f4220 100644 --- a/tests/dummy_qrc/qm_octave/parameters.json +++ b/tests/dummy_qrc/qm_octave/parameters.json @@ -206,6 +206,7 @@ "amplitude": 0.055, "envelope": { "kind": "rectangular" }, "qubit": 2, + "frequency": 0, "type": "qf" }, { @@ -227,6 +228,7 @@ "amplitude": -0.0513, "envelope": { "kind": "rectangular" }, "qubit": 3, + "frequency": 0, "type": "qf" }, { diff --git a/tests/dummy_qrc/zurich/parameters.json b/tests/dummy_qrc/zurich/parameters.json index 3ab0c3c07d..0ff76701ec 100644 --- a/tests/dummy_qrc/zurich/parameters.json +++ b/tests/dummy_qrc/zurich/parameters.json @@ -157,6 +157,7 @@ "type": "cf", "duration": 1000, "amplitude": 0.5, + "frequency": 0, "envelope": { "kind": "rectangular" } } }, @@ -165,6 +166,7 @@ "type": "cf", "duration": 1000, "amplitude": 0.5, + "frequency": 0, "envelope": { "kind": "rectangular" } } }, @@ -173,6 +175,7 @@ "type": "cf", "duration": 1000, "amplitude": 0.5, + "frequency": 0, "envelope": { "kind": "rectangular" } } }, @@ -181,6 +184,7 @@ "type": "cf", "duration": 1000, "amplitude": 0.5, + "frequency": 0, "envelope": { "kind": "rectangular" } } } @@ -198,6 +202,7 @@ "g": 0.1 }, "qubit": 3, + "frequency": 0, "type": "qf" }, { From b144e461f1f5ce09442acc3fa9624ac519e38a28 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 25 Jun 2024 19:13:08 +0200 Subject: [PATCH 0200/1006] fix: Propagate some 0.2 updates to the emulator --- src/qibolab/instruments/emulator/pulse_simulator.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/qibolab/instruments/emulator/pulse_simulator.py b/src/qibolab/instruments/emulator/pulse_simulator.py index 07e40aceb7..7d657a8b69 100644 --- a/src/qibolab/instruments/emulator/pulse_simulator.py +++ b/src/qibolab/instruments/emulator/pulse_simulator.py @@ -12,7 +12,7 @@ from qibolab.instruments.abstract import Controller from qibolab.instruments.emulator.engines.qutip_engine import QutipSimulator from qibolab.instruments.emulator.models import general_no_coupler_model -from qibolab.pulses import PulseSequence, PulseType, ReadoutPulse +from qibolab.pulses import PulseSequence, PulseType from qibolab.qubits import Qubit, QubitId from qibolab.result import IntegratedResults, SampleResults from qibolab.sweeper import Parameter, Sweeper, SweeperType @@ -22,7 +22,6 @@ Parameter.duration, Parameter.frequency, Parameter.relative_phase, - Parameter.start, } SIMULATION_ENGINES = { @@ -755,7 +754,7 @@ def truncate_ro_pulses( """ sequence = copy.deepcopy(sequence) for i in range(len(sequence)): - if type(sequence[i]) is ReadoutPulse: + if sequence[i].type is PulseType.READOUT: sequence[i].duration = 1 return sequence From baaf0189243721898248f43051391ea9ec88178d Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 25 Jun 2024 19:28:44 +0200 Subject: [PATCH 0201/1006] build: Update Nix configuration --- flake.lock | 310 +++++++++-------------------------------------------- flake.nix | 8 +- 2 files changed, 53 insertions(+), 265 deletions(-) diff --git a/flake.lock b/flake.lock index 4f978df5de..0178efdcfd 100644 --- a/flake.lock +++ b/flake.lock @@ -3,19 +3,25 @@ "cachix": { "inputs": { "devenv": "devenv_2", - "flake-compat": "flake-compat_2", + "flake-compat": [ + "devenv", + "flake-compat" + ], "nixpkgs": [ "devenv", "nixpkgs" ], - "pre-commit-hooks": "pre-commit-hooks" + "pre-commit-hooks": [ + "devenv", + "pre-commit-hooks" + ] }, "locked": { - "lastModified": 1710475558, - "narHash": "sha256-egKrPCKjy/cE+NqCj4hg2fNX/NwLCf0bRDInraYXDgs=", + "lastModified": 1712055811, + "narHash": "sha256-7FcfMm5A/f02yyzuavJe06zLa9hcMHsagE28ADcmQvk=", "owner": "cachix", "repo": "cachix", - "rev": "661bbb7f8b55722a0406456b15267b5426a3bda6", + "rev": "02e38da89851ec7fec3356a5c04bc8349cae0e30", "type": "github" }, "original": { @@ -27,19 +33,19 @@ "devenv": { "inputs": { "cachix": "cachix", - "flake-compat": "flake-compat_4", + "flake-compat": "flake-compat_2", "nix": "nix_2", "nixpkgs": [ "nixpkgs" ], - "pre-commit-hooks": "pre-commit-hooks_2" + "pre-commit-hooks": "pre-commit-hooks" }, "locked": { - "lastModified": 1711095830, - "narHash": "sha256-E67Yh1R1h8b01nVAhiYJsY6eQFqk5VIar13ntSbi56Q=", + "lastModified": 1719323427, + "narHash": "sha256-f4ppP2MBPJzkuy/q+PIfyyTWX9OzqgPV1XSphX71tdA=", "owner": "cachix", "repo": "devenv", - "rev": "84ce563fcecbdee90b3c3550ab4f2fcd37b37def", + "rev": "f810f8d8cb4e674d7e635107510bcbbabaa755a3", "type": "github" }, "original": { @@ -87,11 +93,11 @@ "rust-analyzer-src": "rust-analyzer-src" }, "locked": { - "lastModified": 1711088506, - "narHash": "sha256-USdlY7Tx2oJWqFBpp10+03+h7eVhpkQ4s9t1ERjeIJE=", + "lastModified": 1719296889, + "narHash": "sha256-rX9GzfrzvjfqrjfyKnX+zmXTYNRZXqEUWUX2u+LBdi0=", "owner": "nix-community", "repo": "fenix", - "rev": "85f4139f3c092cf4afd9f9906d7ed218ef262c97", + "rev": "049a6ecec1da711d3d84072732e4b14f98e0edd4", "type": "github" }, "original": { @@ -132,70 +138,6 @@ "type": "github" } }, - "flake-compat_3": { - "flake": false, - "locked": { - "lastModified": 1696426674, - "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", - "owner": "edolstra", - "repo": "flake-compat", - "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", - "type": "github" - }, - "original": { - "owner": "edolstra", - "repo": "flake-compat", - "type": "github" - } - }, - "flake-compat_4": { - "flake": false, - "locked": { - "lastModified": 1696426674, - "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", - "owner": "edolstra", - "repo": "flake-compat", - "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", - "type": "github" - }, - "original": { - "owner": "edolstra", - "repo": "flake-compat", - "type": "github" - } - }, - "flake-compat_5": { - "flake": false, - "locked": { - "lastModified": 1673956053, - "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", - "owner": "edolstra", - "repo": "flake-compat", - "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", - "type": "github" - }, - "original": { - "owner": "edolstra", - "repo": "flake-compat", - "type": "github" - } - }, - "flake-compat_6": { - "flake": false, - "locked": { - "lastModified": 1696426674, - "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", - "owner": "edolstra", - "repo": "flake-compat", - "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", - "type": "github" - }, - "original": { - "owner": "edolstra", - "repo": "flake-compat", - "type": "github" - } - }, "flake-utils": { "inputs": { "systems": "systems" @@ -219,11 +161,11 @@ "systems": "systems_2" }, "locked": { - "lastModified": 1701680307, - "narHash": "sha256-kAuep2h5ajznlPMD9rnQyffWG8EM/C73lejGofXvdM8=", + "lastModified": 1710146030, + "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", "owner": "numtide", "repo": "flake-utils", - "rev": "4022d587cbbfd70fe950c1e2083a02621806a725", + "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", "type": "github" }, "original": { @@ -232,65 +174,7 @@ "type": "github" } }, - "flake-utils_3": { - "inputs": { - "systems": "systems_3" - }, - "locked": { - "lastModified": 1701680307, - "narHash": "sha256-kAuep2h5ajznlPMD9rnQyffWG8EM/C73lejGofXvdM8=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "4022d587cbbfd70fe950c1e2083a02621806a725", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, - "flake-utils_4": { - "inputs": { - "systems": "systems_4" - }, - "locked": { - "lastModified": 1701680307, - "narHash": "sha256-kAuep2h5ajznlPMD9rnQyffWG8EM/C73lejGofXvdM8=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "4022d587cbbfd70fe950c1e2083a02621806a725", - "type": "github" - }, - "original": { - "id": "flake-utils", - "type": "indirect" - } - }, "gitignore": { - "inputs": { - "nixpkgs": [ - "devenv", - "cachix", - "pre-commit-hooks", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1703887061, - "narHash": "sha256-gGPa9qWNc6eCXT/+Z5/zMkyYOuRZqeFZBDbopNZQkuY=", - "owner": "hercules-ci", - "repo": "gitignore.nix", - "rev": "43e1aa1308018f37118e34d3a9cb4f5e75dc11d5", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "gitignore.nix", - "type": "github" - } - }, - "gitignore_2": { "inputs": { "nixpkgs": [ "devenv", @@ -299,11 +183,11 @@ ] }, "locked": { - "lastModified": 1703887061, - "narHash": "sha256-gGPa9qWNc6eCXT/+Z5/zMkyYOuRZqeFZBDbopNZQkuY=", + "lastModified": 1709087332, + "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=", "owner": "hercules-ci", "repo": "gitignore.nix", - "rev": "43e1aa1308018f37118e34d3a9cb4f5e75dc11d5", + "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", "type": "github" }, "original": { @@ -324,11 +208,11 @@ "nixpkgs-regression": "nixpkgs-regression" }, "locked": { - "lastModified": 1708577783, - "narHash": "sha256-92xq7eXlxIT5zFNccLpjiP7sdQqQI30Gyui2p/PfKZM=", + "lastModified": 1712911606, + "narHash": "sha256-BGvBhepCufsjcUkXnEEXhEVjwdJAwPglCC2+bInc794=", "owner": "domenkozar", "repo": "nix", - "rev": "ecd0af0c1f56de32cbad14daa1d82a132bf298f8", + "rev": "b24a9318ea3f3600c1e24b4a00691ee912d4de12", "type": "github" }, "original": { @@ -364,7 +248,10 @@ }, "nix_2": { "inputs": { - "flake-compat": "flake-compat_5", + "flake-compat": [ + "devenv", + "flake-compat" + ], "nixpkgs": [ "devenv", "nixpkgs" @@ -372,11 +259,11 @@ "nixpkgs-regression": "nixpkgs-regression_2" }, "locked": { - "lastModified": 1710500156, - "narHash": "sha256-zvCqeUO2GLOm7jnU23G4EzTZR7eylcJN+HJ5svjmubI=", + "lastModified": 1712911606, + "narHash": "sha256-BGvBhepCufsjcUkXnEEXhEVjwdJAwPglCC2+bInc794=", "owner": "domenkozar", "repo": "nix", - "rev": "c5bbf14ecbd692eeabf4184cc8d50f79c2446549", + "rev": "b24a9318ea3f3600c1e24b4a00691ee912d4de12", "type": "github" }, "original": { @@ -402,28 +289,6 @@ "type": "github" } }, - "nixpkgs-python": { - "inputs": { - "flake-compat": "flake-compat_6", - "flake-utils": "flake-utils_4", - "nixpkgs": [ - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1710929962, - "narHash": "sha256-CuPuUyX1TmxJDDZFOZMr7kHTzA8zoSJaVw0+jDVo2fw=", - "owner": "cachix", - "repo": "nixpkgs-python", - "rev": "a9e19aafbf75b8c7e5adf2d7319939309ebe0d77", - "type": "github" - }, - "original": { - "owner": "cachix", - "repo": "nixpkgs-python", - "type": "github" - } - }, "nixpkgs-regression": { "locked": { "lastModified": 1643052045, @@ -458,27 +323,11 @@ }, "nixpkgs-stable": { "locked": { - "lastModified": 1704874635, - "narHash": "sha256-YWuCrtsty5vVZvu+7BchAxmcYzTMfolSPP5io8+WYCg=", + "lastModified": 1710695816, + "narHash": "sha256-3Eh7fhEID17pv9ZxrPwCLfqXnYP006RKzSs0JptsN84=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "3dc440faeee9e889fe2d1b4d25ad0f430d449356", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-23.11", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-stable_2": { - "locked": { - "lastModified": 1704874635, - "narHash": "sha256-YWuCrtsty5vVZvu+7BchAxmcYzTMfolSPP5io8+WYCg=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "3dc440faeee9e889fe2d1b4d25ad0f430d449356", + "rev": "614b4613980a522ba49f0d194531beddbb7220d3", "type": "github" }, "original": { @@ -490,11 +339,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1710806803, - "narHash": "sha256-qrxvLS888pNJFwJdK+hf1wpRCSQcqA6W5+Ox202NDa0=", + "lastModified": 1719075281, + "narHash": "sha256-CyyxvOwFf12I91PBWz43iGT1kjsf5oi6ax7CrvaMyAo=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "b06025f1533a1e07b6db3e75151caa155d1c7eb3", + "rev": "a71e967ef3694799d0c418c98332f7ff4cc5f6af", "type": "github" }, "original": { @@ -530,51 +379,25 @@ } }, "pre-commit-hooks": { - "inputs": { - "flake-compat": "flake-compat_3", - "flake-utils": "flake-utils_2", - "gitignore": "gitignore", - "nixpkgs": [ - "devenv", - "cachix", - "nixpkgs" - ], - "nixpkgs-stable": "nixpkgs-stable" - }, - "locked": { - "lastModified": 1708018599, - "narHash": "sha256-M+Ng6+SePmA8g06CmUZWi1AjG2tFBX9WCXElBHEKnyM=", - "owner": "cachix", - "repo": "pre-commit-hooks.nix", - "rev": "5df5a70ad7575f6601d91f0efec95dd9bc619431", - "type": "github" - }, - "original": { - "owner": "cachix", - "repo": "pre-commit-hooks.nix", - "type": "github" - } - }, - "pre-commit-hooks_2": { "inputs": { "flake-compat": [ "devenv", "flake-compat" ], - "flake-utils": "flake-utils_3", - "gitignore": "gitignore_2", + "flake-utils": "flake-utils_2", + "gitignore": "gitignore", "nixpkgs": [ "devenv", "nixpkgs" ], - "nixpkgs-stable": "nixpkgs-stable_2" + "nixpkgs-stable": "nixpkgs-stable" }, "locked": { - "lastModified": 1708018599, - "narHash": "sha256-M+Ng6+SePmA8g06CmUZWi1AjG2tFBX9WCXElBHEKnyM=", + "lastModified": 1713775815, + "narHash": "sha256-Wu9cdYTnGQQwtT20QQMg7jzkANKQjwBD9iccfGKkfls=", "owner": "cachix", "repo": "pre-commit-hooks.nix", - "rev": "5df5a70ad7575f6601d91f0efec95dd9bc619431", + "rev": "2ac4dcbf55ed43f3be0bae15e181f08a57af24a4", "type": "github" }, "original": { @@ -588,18 +411,17 @@ "devenv": "devenv", "fenix": "fenix", "nixpkgs": "nixpkgs_2", - "nixpkgs-python": "nixpkgs-python", - "systems": "systems_5" + "systems": "systems_3" } }, "rust-analyzer-src": { "flake": false, "locked": { - "lastModified": 1711052942, - "narHash": "sha256-lLsAhLgm/Nbin41wdfGKU7Rgd6ONBxYCUAMv53NXPjo=", + "lastModified": 1719233333, + "narHash": "sha256-+BgWRK3bWVIFwdn43DGRVscnu9P63Mndyhte/hgEwUA=", "owner": "rust-lang", "repo": "rust-analyzer", - "rev": "7ef7f442fc34b5eadb1c6ad6433bd6d0c51b056b", + "rev": "7b11fdeb681c12002861b9804a388efde81c9647", "type": "github" }, "original": { @@ -653,36 +475,6 @@ "repo": "default", "type": "github" } - }, - "systems_4": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } - }, - "systems_5": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } } }, "root": "root", diff --git a/flake.nix b/flake.nix index 9b2c037a89..3b65860c4b 100644 --- a/flake.nix +++ b/flake.nix @@ -6,10 +6,6 @@ url = "github:cachix/devenv"; inputs.nixpkgs.follows = "nixpkgs"; }; - nixpkgs-python = { - url = "github:cachix/nixpkgs-python"; - inputs.nixpkgs.follows = "nixpkgs"; - }; fenix = { url = "github:nix-community/fenix"; inputs.nixpkgs.follows = "nixpkgs"; @@ -49,7 +45,7 @@ config, ... }: { - packages = with pkgs; [pre-commit poethepoet jupyter zlib]; + packages = with pkgs; [pre-commit poethepoet jupyter]; env = { QIBOLAB_PLATFORMS = (dirOf config.env.DEVENV_ROOT) + "/qibolab_platforms_qrc"; @@ -65,6 +61,7 @@ languages.python = { enable = true; + libraries = with pkgs; [zlib]; poetry = { enable = true; install = { @@ -77,7 +74,6 @@ ]; }; }; - version = "3.11"; }; languages.rust = { From 7657a314bd098158dc7d9631a909eaf860ed2d0b Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 26 Jun 2024 00:58:48 +0200 Subject: [PATCH 0202/1006] build: Unlock emulator dependencies --- poetry.lock | 135 +++++++++++++++++++++++-------------------------- pyproject.toml | 10 ++-- 2 files changed, 67 insertions(+), 78 deletions(-) diff --git a/poetry.lock b/poetry.lock index d98e36153e..84cc4e3a60 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "alabaster" @@ -1554,13 +1554,13 @@ files = [ [[package]] name = "importlib-metadata" -version = "7.2.1" +version = "8.0.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-7.2.1-py3-none-any.whl", hash = "sha256:ffef94b0b66046dd8ea2d619b701fe978d9264d38f3998bc4c27ec3b146a87c8"}, - {file = "importlib_metadata-7.2.1.tar.gz", hash = "sha256:509ecb2ab77071db5137c655e24ceb3eee66e7bbc6574165d0d114d9fc4bbe68"}, + {file = "importlib_metadata-8.0.0-py3-none-any.whl", hash = "sha256:15584cf2b1bf449d98ff8a6ff1abef57bf20f3ac6454f431736cd3e660921b2f"}, + {file = "importlib_metadata-8.0.0.tar.gz", hash = "sha256:188bd24e4c346d3f0a933f275c2fec67050326a856b9a359881d7c2a697e8812"}, ] [package.dependencies] @@ -4034,7 +4034,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"}, @@ -4414,46 +4413,38 @@ interplot = ["dill (>=0.3.4,<0.4.0)", "ipython (>=7.31.1,<8.0.0)", "pypiwin32 (> [[package]] name = "qutip" -version = "4.7.5" +version = "5.0.2" description = "QuTiP: The Quantum Toolbox in Python" optional = false -python-versions = "*" +python-versions = ">=3.9" files = [ - {file = "qutip-4.7.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b4ae6b823674328703f96ca1fec75260c773d3eea981f91eecaa71235c965ba3"}, - {file = "qutip-4.7.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7141cf931b6f92397cd6738d082c46e082b26c066deb494a4b6b8f1f841b0aa8"}, - {file = "qutip-4.7.5-cp310-cp310-win_amd64.whl", hash = "sha256:a0e513344872dfbd5728a5a1688671909fa4ebeb1d42f09bc896518ed880f82c"}, - {file = "qutip-4.7.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7a257fc52facddb25149c2fc03400fd219b893a9238fde46548d9e1430c16b2d"}, - {file = "qutip-4.7.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95587c1bd98084c6ca29c4d745048da39ed2431854dd1f12914c21aa47076e9c"}, - {file = "qutip-4.7.5-cp311-cp311-win_amd64.whl", hash = "sha256:8c4b7b9ad94b9edad32d290d0823af4e87daf123c5398925afd8f99f8c6a8fcb"}, - {file = "qutip-4.7.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cd223ff0f31cef3b08de9d898d959c65a4cd3ef05eec3cf91ee25431285d284d"}, - {file = "qutip-4.7.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4f08e5ffcffdae89e906fd579aa155e3b794d0eb7345ae4cfadb4b24a46a08d7"}, - {file = "qutip-4.7.5-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d0090d2543fcab58f966387b0553987971c75cc8b7fb269c354e68b023d87f18"}, - {file = "qutip-4.7.5-cp36-cp36m-win32.whl", hash = "sha256:193b96cd41a522f842bd9807c763e305d0e810fd6bedd5f486e8a5284d80ea26"}, - {file = "qutip-4.7.5-cp36-cp36m-win_amd64.whl", hash = "sha256:240c01a931fe22417fbc18864cb91b91c44fdf6e5b922386e3891752e2cf9740"}, - {file = "qutip-4.7.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:11b6b750e6d68d6b35a9f64576d00742fb0f7ea97f5e624bd01fe9fec0eb0c53"}, - {file = "qutip-4.7.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:349dff8b40a0fc97ff2722c76e73f6141f9a5ffd44c0bf16d830b780a41d0dca"}, - {file = "qutip-4.7.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:736a1b0f13bcf51fe9152478409d78a7608d9a7bb924238483df8a0df55c88fd"}, - {file = "qutip-4.7.5-cp37-cp37m-win32.whl", hash = "sha256:695183bee518aee1c0915e7a0974a4305d128f06afc59b6e18a2127ef353138b"}, - {file = "qutip-4.7.5-cp37-cp37m-win_amd64.whl", hash = "sha256:700b4d1df10ed7cac8acd0b15da4bfb4506073d7bcdb46f9cc896da5b13ed0f5"}, - {file = "qutip-4.7.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be905e4b3a0afbf53d3144b642391b0de8274123ea7febbee19e1ec1339c2c70"}, - {file = "qutip-4.7.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4595d59c5cd22c88022897d3bdbdab191a9eb032ee2ae8fd88937b82d736435c"}, - {file = "qutip-4.7.5-cp38-cp38-win_amd64.whl", hash = "sha256:79b2667a7ded59d05722c78bfd71054e63a7c0ceb8a4ec7426ece69cd125668c"}, - {file = "qutip-4.7.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b9c16d9f5f7e61d8c0b904b498fa44d30ded6685d7fe28c3c19c57b9c0fc8fc9"}, - {file = "qutip-4.7.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acb9f827ea757faa193bf19e42269ed52da06efc38f966923ee6b793b28526f5"}, - {file = "qutip-4.7.5-cp39-cp39-win_amd64.whl", hash = "sha256:36502a7883b8c87d42381aa7b8fb0b3450b3bed26924dfdad9e7829d33a2ced3"}, - {file = "qutip-4.7.5.tar.gz", hash = "sha256:a0cc9883281ec89e38ac635adc4bb602d85ec49071628ee17d3bf2c14b5c11ac"}, -] - -[package.dependencies] -numpy = ">=1.16.6" + {file = "qutip-5.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e31c629d2f45ed60cf2510b64f867632a2148dac34b1d3e047c27e8c9e35713"}, + {file = "qutip-5.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ebf1bf3d5a3e8337121549d4dab62a28b268d417f1614598bd9422f5b2669fd9"}, + {file = "qutip-5.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:08c7b7a42796b160b3d58eb0873797ad15748c5842076f259ecfed2e9645f5a9"}, + {file = "qutip-5.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fb1fd548a1db7217530569773a8fa617ee1cf1ff9776efc84684f1f40089b8bf"}, + {file = "qutip-5.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f298929be214bb057cddb5434711b8471779259115329ed7edea501b489d3b79"}, + {file = "qutip-5.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:2f385d6b540def78aabc87c5aaf230bd83b58db7a6383b11651354a30f3c2bf8"}, + {file = "qutip-5.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:52eabd9e1bfa608b0af13d07bda8f43b97f2d9d3cb1ea493d35a851bc2cbf006"}, + {file = "qutip-5.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97fc764e302da7450c63727773e21cab78b45fc66f6e904e28a786c0f87f7db3"}, + {file = "qutip-5.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:0fb98f3ff347ee75d90a7b3ae65014c62e6985abf62d28e75d26ad8fde541867"}, + {file = "qutip-5.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5be725b2d43cd88be6432b14d687e850c653bee24ca277423c7a737b7be389ec"}, + {file = "qutip-5.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd57dc5c1e654f3e8d4dcad1d3ffa3fba608b8ca9523088d5f7a19004f3b26f9"}, + {file = "qutip-5.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:493fcdf20f43b61a426b206ae7ce01265d869f8038934c097076d6611a228cb6"}, + {file = "qutip-5.0.2.tar.gz", hash = "sha256:1c3d0fecc3e237783a9ef22cec2c54f49f0da4c17b9ee036848bdd9009f4baf5"}, +] + +[package.dependencies] +numpy = ">=1.22,<2.0.0" packaging = "*" -scipy = ">=1.0" +scipy = ">=1.8" [package.extras] -full = ["cvxopt", "cvxpy (>=1.0)", "cython (>=0.29.20,<3.0.0)", "ipython", "matplotlib (>=1.2.1)", "pytest (>=5.2)", "pytest-rerunfailures"] +extras = ["loky", "tqdm"] +full = ["cvxopt", "cvxpy (>=1.0)", "cython (>=0.29.20)", "cython (>=0.29.20,<3.0.0)", "filelock", "ipython", "loky", "matplotlib (>=1.2.1)", "pytest (>=5.2)", "pytest-rerunfailures", "setuptools", "tqdm"] graphics = ["matplotlib (>=1.2.1)"] ipython = ["ipython"] -runtime-compilation = ["cython (>=0.29.20,<3.0.0)"] +mpi = ["mpi4py"] +runtime-compilation = ["cython (>=0.29.20)", "cython (>=0.29.20,<3.0.0)", "filelock", "setuptools"] semidefinite = ["cvxopt", "cvxpy (>=1.0)"] tests = ["pytest (>=5.2)", "pytest-rerunfailures"] @@ -4815,45 +4806,45 @@ tests = ["black (>=24.3.0)", "matplotlib (>=3.3.4)", "mypy (>=1.9)", "numpydoc ( [[package]] name = "scipy" -version = "1.12.0" +version = "1.13.1" description = "Fundamental algorithms for scientific computing in Python" optional = false python-versions = ">=3.9" files = [ - {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" + {file = "scipy-1.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:20335853b85e9a49ff7572ab453794298bcf0354d8068c5f6775a0eabf350aca"}, + {file = "scipy-1.13.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:d605e9c23906d1994f55ace80e0125c587f96c020037ea6aa98d01b4bd2e222f"}, + {file = "scipy-1.13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cfa31f1def5c819b19ecc3a8b52d28ffdcc7ed52bb20c9a7589669dd3c250989"}, + {file = "scipy-1.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26264b282b9da0952a024ae34710c2aff7d27480ee91a2e82b7b7073c24722f"}, + {file = "scipy-1.13.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:eccfa1906eacc02de42d70ef4aecea45415f5be17e72b61bafcfd329bdc52e94"}, + {file = "scipy-1.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:2831f0dc9c5ea9edd6e51e6e769b655f08ec6db6e2e10f86ef39bd32eb11da54"}, + {file = "scipy-1.13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:27e52b09c0d3a1d5b63e1105f24177e544a222b43611aaf5bc44d4a0979e32f9"}, + {file = "scipy-1.13.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:54f430b00f0133e2224c3ba42b805bfd0086fe488835effa33fa291561932326"}, + {file = "scipy-1.13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e89369d27f9e7b0884ae559a3a956e77c02114cc60a6058b4e5011572eea9299"}, + {file = "scipy-1.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a78b4b3345f1b6f68a763c6e25c0c9a23a9fd0f39f5f3d200efe8feda560a5fa"}, + {file = "scipy-1.13.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:45484bee6d65633752c490404513b9ef02475b4284c4cfab0ef946def50b3f59"}, + {file = "scipy-1.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:5713f62f781eebd8d597eb3f88b8bf9274e79eeabf63afb4a737abc6c84ad37b"}, + {file = "scipy-1.13.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5d72782f39716b2b3509cd7c33cdc08c96f2f4d2b06d51e52fb45a19ca0c86a1"}, + {file = "scipy-1.13.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:017367484ce5498445aade74b1d5ab377acdc65e27095155e448c88497755a5d"}, + {file = "scipy-1.13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:949ae67db5fa78a86e8fa644b9a6b07252f449dcf74247108c50e1d20d2b4627"}, + {file = "scipy-1.13.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de3ade0e53bc1f21358aa74ff4830235d716211d7d077e340c7349bc3542e884"}, + {file = "scipy-1.13.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2ac65fb503dad64218c228e2dc2d0a0193f7904747db43014645ae139c8fad16"}, + {file = "scipy-1.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:cdd7dacfb95fea358916410ec61bbc20440f7860333aee6d882bb8046264e949"}, + {file = "scipy-1.13.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:436bbb42a94a8aeef855d755ce5a465479c721e9d684de76bf61a62e7c2b81d5"}, + {file = "scipy-1.13.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:8335549ebbca860c52bf3d02f80784e91a004b71b059e3eea9678ba994796a24"}, + {file = "scipy-1.13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d533654b7d221a6a97304ab63c41c96473ff04459e404b83275b60aa8f4b7004"}, + {file = "scipy-1.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:637e98dcf185ba7f8e663e122ebf908c4702420477ae52a04f9908707456ba4d"}, + {file = "scipy-1.13.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a014c2b3697bde71724244f63de2476925596c24285c7a637364761f8710891c"}, + {file = "scipy-1.13.1-cp39-cp39-win_amd64.whl", hash = "sha256:392e4ec766654852c25ebad4f64e4e584cf19820b980bc04960bca0b0cd6eaa2"}, + {file = "scipy-1.13.1.tar.gz", hash = "sha256:095a87a0312b08dfd6a6155cbbd310a8c51800fc931b8c0b84003014b874ed3c"}, +] + +[package.dependencies] +numpy = ">=1.22.4,<2.3" [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", "hypothesis", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] +doc = ["jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.12.0)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0)", "sphinx-design (>=0.4.0)"] +test = ["array-api-strict", "asv", "gmpy2", "hypothesis (>=6.30)", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "setuptools" @@ -5791,7 +5782,7 @@ doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linke test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [extras] -emulator = ["qutip", "scipy"] +emulator = ["qutip"] los = ["pyvisa-py", "qcodes", "qcodes_contrib_drivers"] qblox = ["pyvisa-py", "qblox-instruments", "qcodes", "qcodes_contrib_drivers"] qm = ["qm-qua", "qualang-tools"] @@ -5801,4 +5792,4 @@ zh = ["laboneq"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.12" -content-hash = "e5a3a7b24638f1fbd6098e6003bc7e2e73b163013a6495578a2967740a8ed3c1" +content-hash = "119c26fb9dd5316d2d9cbc98c7175238acd500e30816883420289be3e45e34d6" diff --git a/pyproject.toml b/pyproject.toml index 854cd2bf91..7b5845ff80 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,6 +25,7 @@ python = ">=3.9,<3.12" qibo = ">=0.2.6" networkx = "^3.0" numpy = "^1.26.4" +scipy = "^1.13.0" more-itertools = "^9.1.0" pydantic = "^2.6.4" qblox-instruments = { version = "0.12.0", optional = true } @@ -36,10 +37,7 @@ qualang-tools = { version = "^0.15.0", optional = true } setuptools = { version = ">67.0.0", optional = true } laboneq = { version = "==2.25.0", optional = true } qibosoq = { version = ">=0.1.2,<0.2", optional = true } -# TODO: unlock version -qutip = { version = "4.7.5", optional = true } -# TODO: remove this constraint, only needed for qutip 4.7.5 -scipy = { version = "<1.13.0", optional = true } +qutip = { version = "^5.0.2", optional = true } [tool.poetry.group.dev] optional = true @@ -67,7 +65,7 @@ qcodes_contrib_drivers = "0.18.0" qibosoq = ">=0.1.2,<0.2" qualang-tools = "^0.15.0" laboneq = "==2.25.0" -qutip = "^4.7.5" +qutip = "^5.0.2" [tool.poetry.group.tests] optional = true @@ -90,7 +88,7 @@ qm = ["qm-qua", "qualang-tools"] zh = ["laboneq"] rfsoc = ["qibosoq"] los = ["qcodes", "qcodes_contrib_drivers", "pyvisa-py"] -emulator = ["qutip", "scipy"] +emulator = ["qutip"] [tool.poe.tasks] From c90844338a7cfa1a28bf7f970c3c82543e36f736 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 26 Jun 2024 01:04:35 +0200 Subject: [PATCH 0203/1006] fix: Update qutip imports to new major --- src/qibolab/instruments/emulator/engines/qutip_engine.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qibolab/instruments/emulator/engines/qutip_engine.py b/src/qibolab/instruments/emulator/engines/qutip_engine.py index f290d43e26..ab3bc244c9 100644 --- a/src/qibolab/instruments/emulator/engines/qutip_engine.py +++ b/src/qibolab/instruments/emulator/engines/qutip_engine.py @@ -10,8 +10,8 @@ import numpy as np from qutip import Options, Qobj, basis, expect, ket2dm, mesolve, ptrace -from qutip.operators import identity as Id -from qutip.tensor import tensor +from qutip.core.operators import identity as Id +from qutip.core.tensor import tensor from qutip.ui.progressbar import EnhancedTextProgressBar from qibolab.instruments.emulator.engines.generic import ( From da2a2823890fd623a593d2aee4f61bd40316fb18 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 26 Jun 2024 18:25:38 +0200 Subject: [PATCH 0204/1006] fix: Fix qubit pair class construction, to account for new optional attributes --- src/qibolab/serialize.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index dd08b34ff5..751e287495 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -177,7 +177,9 @@ def register_gates( q0, q1 = tuple(int(q) if q.isdigit() else q for q in pair.split("-")) native_gates = _load_two_qubit_natives(qubits, couplers, gatedict) coupler = pairs[(q0, q1)].coupler - pairs[(q0, q1)] = QubitPair(qubits[q0], qubits[q1], coupler, native_gates) + pairs[(q0, q1)] = QubitPair( + qubits[q0], qubits[q1], coupler=coupler, native_gates=native_gates + ) if native_gates.symmetric: pairs[(q1, q0)] = pairs[(q0, q1)] From fd7cc6d6f1602b6ff9c16190038fa8a8d040e78f Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 26 Jun 2024 18:34:22 +0200 Subject: [PATCH 0205/1006] test: Temporarily ignore emulator tests --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 7b5845ff80..5a65beaee4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -111,4 +111,5 @@ addopts = [ '--cov-report=xml', '--cov-report=html', '-m not qpu', + '-k not emulator', ] From 33361e4d6e1cecbd9fd5239f375be9205e0c9846 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 26 Jun 2024 18:43:41 +0200 Subject: [PATCH 0206/1006] docs: Comment emulator doc test --- doc/source/main-documentation/qibolab.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index 046813cdc8..3903108dac 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -127,9 +127,9 @@ will create a dummy platform that also has coupler qubits. Emulator platform ^^^^^^^^^^^^^^^^^ -QiboLab supports the use of emulators to simulate the behavior of quantum devices. It uses :class:`qibolab.instruments.emulator.pulse_simulator.PulseSimulator`, which is a controller that utilizes a simulation engine to numerically solve the dynamics of the device in the presence of control pulse sequences specified by :class:`qibolab.pulses.PulseSequence`. The emulator platform for a specific device requires its own platform folder and can be initialized in the same way as any other real platforms: +QiboLab supports the use of emulators to simulate the behavior of quantum devices. It uses :class:`qibolab.instruments.emulator.pulse_simulator.PulseSimulator`, which is a controller that utilizes a simulation engine to numerically solve the dynamics of the device in the presence of control pulse sequences specified by :class:`qibolab.pulses.PulseSequence`. The emulator platform for a specific device requires its own platform folder and can be initialized in the same way as any other real platforms:: -.. testcode:: python_emulator + # .. testcode:: python_emulator import os from pathlib import Path From 53e9afce82b2cb9a514338a9738acaa1dcc9dcc0 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 26 Jun 2024 19:19:46 +0200 Subject: [PATCH 0207/1006] ci: Upgrade all workflows to macos arm --- .github/workflows/rustapi.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/rustapi.yml b/.github/workflows/rustapi.yml index 8f49712533..ed69c5a83f 100644 --- a/.github/workflows/rustapi.yml +++ b/.github/workflows/rustapi.yml @@ -9,7 +9,7 @@ jobs: tests: strategy: matrix: - os: [ubuntu-latest, macos-13] + os: [ubuntu-latest, macos-latest] runs-on: ${{ matrix.os }} steps: From 0e6bce8248654b063720c41ea8aa3697c904928c Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 9 Jul 2024 13:07:10 +0400 Subject: [PATCH 0208/1006] chore: remove U3 from compiler rules --- src/qibolab/compilers/compiler.py | 2 -- src/qibolab/compilers/default.py | 19 ------------ tests/test_backends.py | 1 - tests/test_compilers_default.py | 51 ++++--------------------------- 4 files changed, 6 insertions(+), 67 deletions(-) diff --git a/src/qibolab/compilers/compiler.py b/src/qibolab/compilers/compiler.py index 1499f31ca5..52d220f3ca 100644 --- a/src/qibolab/compilers/compiler.py +++ b/src/qibolab/compilers/compiler.py @@ -12,7 +12,6 @@ identity_rule, measurement_rule, rz_rule, - u3_rule, z_rule, ) from qibolab.pulses import Delay, PulseSequence @@ -49,7 +48,6 @@ def default(cls): gates.I: identity_rule, gates.Z: z_rule, gates.RZ: rz_rule, - gates.U3: u3_rule, gates.CZ: cz_rule, gates.CNOT: cnot_rule, gates.GPI2: gpi2_rule, diff --git a/src/qibolab/compilers/default.py b/src/qibolab/compilers/default.py index 227b07af59..70db42f520 100644 --- a/src/qibolab/compilers/default.py +++ b/src/qibolab/compilers/default.py @@ -48,25 +48,6 @@ def gpi_rule(gate, qubit): return sequence -def u3_rule(gate, qubit): - """U3 applied as RZ-RX90-RZ-RX90-RZ.""" - # Transform gate to U3 and add pi/2-pulses - theta, phi, lam = gate.parameters - # apply RZ(lam) - virtual_z_phases = {qubit.name: lam} - sequence = PulseSequence() - sequence.append(VirtualZ(phase=lam, channel=qubit.drive.name, qubit=qubit.name)) - # Fetch pi/2 pulse from calibration and apply RX(pi/2) - sequence.append(qubit.native_gates.RX90) - # apply RZ(theta) - sequence.append(VirtualZ(phase=theta, channel=qubit.drive.name, qubit=qubit.name)) - # Fetch pi/2 pulse from calibration and apply RX(-pi/2) - sequence.append(replace(qubit.native_gates.RX90, relative_phase=-math.pi)) - # apply RZ(phi) - sequence.append(VirtualZ(phase=phi, channel=qubit.drive.name, qubit=qubit.name)) - return sequence - - def cz_rule(gate, pair): """CZ applied as defined in the platform runcard. diff --git a/tests/test_backends.py b/tests/test_backends.py index 886d1a5bdc..f432b6c324 100644 --- a/tests/test_backends.py +++ b/tests/test_backends.py @@ -43,7 +43,6 @@ def test_execute_circuit_initial_state(): (gates.Z, {}), (gates.GPI, {"phi": np.pi / 8}), (gates.GPI2, {"phi": np.pi / 8}), - (gates.U3, {"theta": 0.1, "phi": 0.2, "lam": 0.3}), ], ) def test_execute_circuit(gate, kwargs): diff --git a/tests/test_compilers_default.py b/tests/test_compilers_default.py index 945f098c87..3af68316a4 100644 --- a/tests/test_compilers_default.py +++ b/tests/test_compilers_default.py @@ -44,7 +44,6 @@ def compile_circuit(circuit, platform): ((gates.GPI, np.pi / 8), 3), ((gates.GPI2, -np.pi / 8), 3), ((gates.RZ, np.pi / 4), 2), - ((gates.U3, 0.1, 0.2, 0.3), 10), ], ) def test_compile(platform, gateargs, sequence_len): @@ -57,13 +56,13 @@ def test_compile(platform, gateargs, sequence_len): def test_compile_two_gates(platform): circuit = Circuit(1) circuit.add(gates.GPI2(0, phi=0.1)) - circuit.add(gates.U3(0, theta=0.1, phi=0.2, lam=0.3)) + circuit.add(gates.GPI(0, 0.2)) circuit.add(gates.M(0)) sequence = compile_circuit(circuit, platform) - assert len(sequence) == 13 - assert len(sequence.qd_pulses) == 3 + assert len(sequence) == 5 + assert len(sequence.qd_pulses) == 2 assert len(sequence.ro_pulses) == 1 @@ -115,45 +114,6 @@ def test_gpi2_to_sequence(platform): assert sequence == s -def test_u3_to_sequence(platform): - circuit = Circuit(1) - circuit.add(gates.U3(0, 0.1, 0.2, 0.3)) - - sequence = compile_circuit(circuit, platform) - assert len(sequence) == 8 - assert len(sequence.qd_pulses) == 2 - - rx90_pulse1 = platform.create_RX90_pulse(0, relative_phase=0.3) - rx90_pulse2 = platform.create_RX90_pulse(0, relative_phase=0.4 - np.pi) - s = PulseSequence([rx90_pulse1, rx90_pulse2]) - - np.testing.assert_allclose( - sequence.duration, rx90_pulse1.duration + rx90_pulse2.duration - ) - # assert sequence == s - - -def test_two_u3_to_sequence(platform): - circuit = Circuit(1) - circuit.add(gates.U3(0, 0.1, 0.2, 0.3)) - circuit.add(gates.U3(0, 0.4, 0.6, 0.5)) - - sequence = compile_circuit(circuit, platform) - assert len(sequence) == 18 - assert len(sequence.qd_pulses) == 4 - - rx90_pulse = platform.create_RX90_pulse(0) - - np.testing.assert_allclose(sequence.duration, 2 * 2 * rx90_pulse.duration) - - rx90_pulse1 = platform.create_RX90_pulse(0, relative_phase=0.3) - rx90_pulse2 = platform.create_RX90_pulse(0, relative_phase=0.4 - np.pi) - rx90_pulse3 = platform.create_RX90_pulse(0, relative_phase=1.1) - rx90_pulse4 = platform.create_RX90_pulse(0, relative_phase=1.5 - np.pi) - s = PulseSequence([rx90_pulse1, rx90_pulse2, rx90_pulse3, rx90_pulse4]) - # assert sequence == s - - def test_cz_to_sequence(): platform = create_platform("dummy") circuit = Circuit(3) @@ -177,11 +137,12 @@ def test_cnot_to_sequence(): def test_add_measurement_to_sequence(platform): circuit = Circuit(1) - circuit.add(gates.U3(0, 0.1, 0.2, 0.3)) + circuit.add(gates.GPI2(0, 0.1)) + circuit.add(gates.GPI2(0, 0.2)) circuit.add(gates.M(0)) sequence = compile_circuit(circuit, platform) - assert len(sequence) == 10 + assert len(sequence) == 5 assert len(sequence.qd_pulses) == 2 assert len(sequence.ro_pulses) == 1 From a2ebf8a4d0f4ca3ac216ef14402fc869ccbf7e92 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 9 Jul 2024 13:13:43 +0400 Subject: [PATCH 0209/1006] fix: doctest --- doc/source/tutorials/compiler.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/tutorials/compiler.rst b/doc/source/tutorials/compiler.rst index 68d4dbef75..1c7cdb1346 100644 --- a/doc/source/tutorials/compiler.rst +++ b/doc/source/tutorials/compiler.rst @@ -47,7 +47,7 @@ Therefore the previous manipulations can be done as follows: # define circuit circuit = Circuit(1) - circuit.add(gates.U3(0, 0.1, 0.2, 0.3)) + circuit.add(gates.GPI2(0, 0.1)) circuit.add(gates.M(0)) # set backend to qibolab From 79a84545c3a981eaae5ab65bb6c9d3c1d73118d8 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 10 Jul 2024 16:39:55 +0200 Subject: [PATCH 0210/1006] fix: Exclude rectangular pulses instead of subctracting readout duration --- src/qibolab/unrolling.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/qibolab/unrolling.py b/src/qibolab/unrolling.py index df9b250845..75d084cd8a 100644 --- a/src/qibolab/unrolling.py +++ b/src/qibolab/unrolling.py @@ -6,16 +6,23 @@ from dataclasses import asdict, dataclass, field, fields from functools import total_ordering -from .pulses import PulseSequence +from .pulses.envelope import Rectangular +from .pulses import Pulse, PulseSequence def _waveform(sequence: PulseSequence): # TODO: deduplicate pulses (Not yet as drivers may not support it yet) - # TODO: count Rectangular and delays separately (Zurich Instruments supports this) - # TODO: Any constant part of a pulse should be counted only once (Zurich Instruments supports this) - # TODO: check if readout duration is faithful for the readout pulse (I would only check the control pulses) - # TODO: Handle multiple qubits or do all devices have the same memory for each channel ? - return sequence.duration - sequence.ro_pulses.duration + # TODO: VirtualZ deserves a separate handling + # TODO: any constant part of a pulse should be counted only once (Zurich Instruments supports this) + # TODO: handle multiple qubits or do all devices have the same memory for each channel ? + return sum( + ( + (pulse.duration if not isinstance(pulse.envelope, Rectangular) else 1) + if isinstance(pulse, Pulse) + else 1 + ) + for pulse in sequence + ) def _readout(sequence: PulseSequence): From a3e985eb7296f2833dbc8098a5948e7788212973 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 14:56:18 +0000 Subject: [PATCH 0211/1006] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/qibolab/unrolling.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibolab/unrolling.py b/src/qibolab/unrolling.py index 75d084cd8a..273b7043fe 100644 --- a/src/qibolab/unrolling.py +++ b/src/qibolab/unrolling.py @@ -6,8 +6,8 @@ from dataclasses import asdict, dataclass, field, fields from functools import total_ordering -from .pulses.envelope import Rectangular from .pulses import Pulse, PulseSequence +from .pulses.envelope import Rectangular def _waveform(sequence: PulseSequence): From 7164854f4184519ff1581b2627a6d19cb5d6dea3 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Sun, 31 Mar 2024 15:22:13 +0200 Subject: [PATCH 0212/1006] feat!: Drop call dunder for platform --- src/qibolab/platform/platform.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 597c9632af..d19d7f928d 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -358,9 +358,6 @@ def sweep( result.update(new_result) return result - def __call__(self, sequence, options): - return self.execute_pulse_sequence(sequence, options) - def get_qubit(self, qubit): """Return the name of the physical qubit corresponding to a logical qubit. From bad38a7b19a937849cc3d6d5bcce22b98a4f454f Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Sun, 31 Mar 2024 15:26:06 +0200 Subject: [PATCH 0213/1006] feat!: Drop single sequence execution for batched one --- src/qibolab/platform/platform.py | 50 ++++++++++---------------------- 1 file changed, 15 insertions(+), 35 deletions(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index d19d7f928d..3e141e3cf3 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -214,40 +214,6 @@ def disconnect(self): instrument.disconnect() self.is_connected = False - def _execute(self, sequence, options, **kwargs): - """Executes sequence on the controllers.""" - result = {} - - for instrument in self.instruments.values(): - if isinstance(instrument, Controller): - new_result = instrument.play( - self.qubits, self.couplers, sequence, options - ) - if isinstance(new_result, dict): - result.update(new_result) - - return result - - def execute_pulse_sequence( - self, sequence: PulseSequence, options: ExecutionParameters, **kwargs - ): - """ - Args: - sequence (:class:`qibolab.pulses.PulseSequence`): Pulse sequences to execute. - options (:class:`qibolab.platforms.platform.ExecutionParameters`): Object holding the execution options. - **kwargs: May need them for something - Returns: - Readout results acquired by after execution. - """ - options = self.settings.fill(options) - - time = ( - (sequence.duration + options.relaxation_time) * options.nshots * NS_TO_SEC - ) - log.info(f"Minimal execution time (sequence): {time}") - - return self._execute(sequence, options, **kwargs) - @property def _controller(self): """Controller instrument used for splitting the unrolled sequences to @@ -264,7 +230,21 @@ def _controller(self): assert len(controllers) == 1 return controllers[0] - def execute_pulse_sequences( + def _execute(self, sequence, options, **kwargs): + """Executes sequence on the controllers.""" + result = {} + + for instrument in self.instruments.values(): + if isinstance(instrument, Controller): + new_result = instrument.play( + self.qubits, self.couplers, sequence, options + ) + if isinstance(new_result, dict): + result.update(new_result) + + return result + + def execute( self, sequences: List[PulseSequence], options: ExecutionParameters, **kwargs ): """ From 99c008603949d9d47283e06a3c4efb3946dc9268 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Sun, 31 Mar 2024 15:56:17 +0200 Subject: [PATCH 0214/1006] feat!: Unify batched execution and sweeper interfaces --- src/qibolab/platform/platform.py | 93 ++++++++++++-------------------- 1 file changed, 34 insertions(+), 59 deletions(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 3e141e3cf3..6a2f689e59 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -230,14 +230,14 @@ def _controller(self): assert len(controllers) == 1 return controllers[0] - def _execute(self, sequence, options, **kwargs): + def _execute(self, sequence, options, *sweepers, **kwargs): """Executes sequence on the controllers.""" result = {} for instrument in self.instruments.values(): if isinstance(instrument, Controller): new_result = instrument.play( - self.qubits, self.couplers, sequence, options + self.qubits, self.couplers, sequence, options, *sweepers ) if isinstance(new_result, dict): result.update(new_result) @@ -245,9 +245,35 @@ def _execute(self, sequence, options, **kwargs): return result def execute( - self, sequences: List[PulseSequence], options: ExecutionParameters, **kwargs + self, + sequences: List[PulseSequence], + options: ExecutionParameters, + *sweepers: Sweeper, + **kwargs, ): - """ + """Executes a pulse sequences. + + If any sweeper is passed, the execution is performed for the different values of sweeped parameters. + + Example: + .. testcode:: + + import numpy as np + from qibolab.dummy import create_dummy + from qibolab.sweeper import Sweeper, Parameter + from qibolab.pulses import PulseSequence + from qibolab.execution_parameters import ExecutionParameters + + + platform = create_dummy() + sequence = PulseSequence() + parameter = Parameter.frequency + pulse = platform.create_qubit_readout_pulse(qubit=0) + sequence.append(pulse) + parameter_range = np.random.randint(10, size=10) + sweeper = Sweeper(parameter, parameter_range, [pulse]) + platform.execute([sequence], ExecutionParameters(), sweeper) + Args: sequence (List[:class:`qibolab.pulses.PulseSequence`]): Pulse sequences to execute. options (:class:`qibolab.platforms.platform.ExecutionParameters`): Object holding the execution options. @@ -263,7 +289,9 @@ def execute( * options.nshots * NS_TO_SEC ) - log.info(f"Minimal execution time (unrolling): {time}") + for sweep in sweepers: + time *= len(sweep.values) + log.info(f"Minimal execution time: {time}") # find readout pulses ro_pulses = { @@ -276,7 +304,7 @@ def execute( bounds = kwargs.get("bounds", self._controller.bounds) for b in batch(sequences, bounds): sequence, readouts = unroll_sequences(b, options.relaxation_time) - result = self._execute(sequence, options, **kwargs) + result = self._execute(sequence, options, *sweepers, **kwargs) for serial, new_serials in readouts.items(): results[serial].extend(result[ser] for ser in new_serials) @@ -285,59 +313,6 @@ def execute( return results - def sweep( - self, sequence: PulseSequence, options: ExecutionParameters, *sweepers: Sweeper - ): - """Executes a pulse sequence for different values of sweeped - parameters. - - Useful for performing chip characterization. - - Example: - .. testcode:: - - import numpy as np - from qibolab.dummy import create_dummy - from qibolab.sweeper import Sweeper, Parameter - from qibolab.pulses import PulseSequence - from qibolab.execution_parameters import ExecutionParameters - - - platform = create_dummy() - sequence = PulseSequence() - parameter = Parameter.frequency - pulse = platform.create_qubit_readout_pulse(qubit=0) - sequence.append(pulse) - parameter_range = np.random.randint(10, size=10) - sweeper = Sweeper(parameter, parameter_range, [pulse]) - platform.sweep(sequence, ExecutionParameters(), sweeper) - - Returns: - Readout results acquired by after execution. - """ - if options.nshots is None: - options = replace(options, nshots=self.settings.nshots) - - if options.relaxation_time is None: - options = replace(options, relaxation_time=self.settings.relaxation_time) - - time = ( - (sequence.duration + options.relaxation_time) * options.nshots * NS_TO_SEC - ) - for sweep in sweepers: - time *= len(sweep.values) - log.info(f"Minimal execution time (sweep): {time}") - - result = {} - for instrument in self.instruments.values(): - if isinstance(instrument, Controller): - new_result = instrument.sweep( - self.qubits, self.couplers, sequence, options, *sweepers - ) - if isinstance(new_result, dict): - result.update(new_result) - return result - def get_qubit(self, qubit): """Return the name of the physical qubit corresponding to a logical qubit. From d4947719e57e1a629e9fdb6064b374a20f1c2e62 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 16 Jul 2024 17:01:32 +0200 Subject: [PATCH 0215/1006] fix: Remove unused kwargs from internal execution --- src/qibolab/platform/platform.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 6a2f689e59..d56f7793da 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -230,7 +230,7 @@ def _controller(self): assert len(controllers) == 1 return controllers[0] - def _execute(self, sequence, options, *sweepers, **kwargs): + def _execute(self, sequence, options, *sweepers): """Executes sequence on the controllers.""" result = {} @@ -304,7 +304,7 @@ def execute( bounds = kwargs.get("bounds", self._controller.bounds) for b in batch(sequences, bounds): sequence, readouts = unroll_sequences(b, options.relaxation_time) - result = self._execute(sequence, options, *sweepers, **kwargs) + result = self._execute(sequence, options, *sweepers) for serial, new_serials in readouts.items(): results[serial].extend(result[ser] for ser in new_serials) From 47c14a980aa6ca4e39e3b7f30406ccf1a6e9437b Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 16 Jul 2024 17:03:50 +0200 Subject: [PATCH 0216/1006] fix: Remove kwargs from exposed execution interface Bounds are now always read from the instrument --- src/qibolab/platform/platform.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index d56f7793da..66bcb27479 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -249,7 +249,6 @@ def execute( sequences: List[PulseSequence], options: ExecutionParameters, *sweepers: Sweeper, - **kwargs, ): """Executes a pulse sequences. @@ -301,8 +300,7 @@ def execute( } results = defaultdict(list) - bounds = kwargs.get("bounds", self._controller.bounds) - for b in batch(sequences, bounds): + for b in batch(sequences, self._controller.bounds): sequence, readouts = unroll_sequences(b, options.relaxation_time) result = self._execute(sequence, options, *sweepers) for serial, new_serials in readouts.items(): From a54ee3480c917b1ee963c4675d9549414de97f67 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 16 Jul 2024 17:09:19 +0200 Subject: [PATCH 0217/1006] feat!: Drop sweep from abstract controller interface --- src/qibolab/instruments/abstract.py | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/qibolab/instruments/abstract.py b/src/qibolab/instruments/abstract.py index bdd44e66ca..c42bbdd49b 100644 --- a/src/qibolab/instruments/abstract.py +++ b/src/qibolab/instruments/abstract.py @@ -97,17 +97,11 @@ def ports(self, port_name, *args, **kwargs): def play(self, *args, **kwargs): """Play a pulse sequence and retrieve feedback. - Returns: - (Dict[ResultType]) mapping the serial of the readout pulses used to - the acquired :class:`qibolab.result.ExecutionResults` object. - """ - - @abstractmethod - def sweep(self, *args, **kwargs): - """Play a pulse sequence while sweeping one or more parameters. + If :cls:`qibolab.sweeper.Sweeper` objects are passed as arguments, they are + executed in real-time. If not possible, an error is raised. Returns: - (dict) mapping the serial of the readout pulses used to + (Dict[ResultType]) mapping the serial of the readout pulses used to the acquired :class:`qibolab.result.ExecutionResults` object. """ From af8356b5cae2ccd4eb7a4d0238b941c5d9c405e8 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 16 Jul 2024 17:20:27 +0200 Subject: [PATCH 0218/1006] docs: Fix results docstrings Removing mentions of no longer existing objects --- src/qibolab/result.py | 24 ++++++------------------ 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/src/qibolab/result.py b/src/qibolab/result.py index 837d7fba10..494b74bf51 100644 --- a/src/qibolab/result.py +++ b/src/qibolab/result.py @@ -6,9 +6,7 @@ class IntegratedResults: - """Data structure to deal with the output of :func:`qibolab.platforms.abstr - act.AbstractPlatform.execute_pulse_sequence` - :func:`qibolab.platforms.abstract.AbstractPlatform.sweep` + """Data structure to deal with the execution output. Associated with AcquisitionType.INTEGRATION and AveragingMode.SINGLESHOT @@ -65,9 +63,7 @@ def average(self): class AveragedIntegratedResults(IntegratedResults): - """Data structure to deal with the output of :func:`qibolab.platforms.abstr - act.AbstractPlatform.execute_pulse_sequence` - :func:`qibolab.platforms.abstract.AbstractPlatform.sweep` + """Data structure to deal with the execution output. Associated with AcquisitionType.INTEGRATION and AveragingMode.CYCLIC or the averages of ``IntegratedResults`` @@ -99,9 +95,7 @@ def phase(self): class RawWaveformResults(IntegratedResults): - """Data structure to deal with the output of :func:`qibolab.platforms.abstr - act.AbstractPlatform.execute_pulse_sequence` - :func:`qibolab.platforms.abstract.AbstractPlatform.sweep` + """Data structure to deal with the execution output. Associated with AcquisitionType.RAW and AveragingMode.SINGLESHOT may also be used to store the integration weights ? @@ -109,9 +103,7 @@ class RawWaveformResults(IntegratedResults): class AveragedRawWaveformResults(AveragedIntegratedResults): - """Data structure to deal with the output of :func:`qibolab.platforms.abstr - act.AbstractPlatform.execute_pulse_sequence` - :func:`qibolab.platforms.abstract.AbstractPlatform.sweep` + """Data structure to deal with the execution output. Associated with AcquisitionType.RAW and AveragingMode.CYCLIC or the averages of ``RawWaveformResults`` @@ -119,9 +111,7 @@ class AveragedRawWaveformResults(AveragedIntegratedResults): class SampleResults: - """Data structure to deal with the output of :func:`qibolab.platforms.abstr - act.AbstractPlatform.execute_pulse_sequence` - :func:`qibolab.platforms.abstract.AbstractPlatform.sweep` + """Data structure to deal with the execution output. Associated with AcquisitionType.DISCRIMINATION and AveragingMode.SINGLESHOT @@ -156,9 +146,7 @@ def average(self): class AveragedSampleResults(SampleResults): - """Data structure to deal with the output of :func:`qibolab.platforms.abstr - act.AbstractPlatform.execute_pulse_sequence` - :func:`qibolab.platforms.abstract.AbstractPlatform.sweep` + """Data structure to deal with the execution output. Associated with AcquisitionType.DISCRIMINATION and AveragingMode.CYCLIC or the averages of ``SampleResults`` From 55aaa78be0d8488acf1bcafb86c958ed6965d6b1 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 16 Jul 2024 17:22:43 +0200 Subject: [PATCH 0219/1006] fix: Update platform execution in backend --- src/qibolab/backends.py | 10 ++-------- src/qibolab/platform/platform.py | 9 +++++---- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/src/qibolab/backends.py b/src/qibolab/backends.py index fc288fb6a9..8826351bc9 100644 --- a/src/qibolab/backends.py +++ b/src/qibolab/backends.py @@ -102,10 +102,7 @@ def execute_circuit(self, circuit, initial_state=None, nshots=1000): if not self.platform.is_connected: self.platform.connect() - readout = self.platform.execute_pulse_sequence( - sequence, - ExecutionParameters(nshots=nshots), - ) + readout = self.platform.execute(sequence, ExecutionParameters(nshots=nshots)) self.platform.disconnect() @@ -147,10 +144,7 @@ def execute_circuits(self, circuits, initial_states=None, nshots=1000): if not self.platform.is_connected: self.platform.connect() - readout = self.platform.execute_pulse_sequences( - sequences, - ExecutionParameters(nshots=nshots), - ) + readout = self.platform.execute(sequences, ExecutionParameters(nshots=nshots)) self.platform.disconnect() diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 66bcb27479..cd95eb7905 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -216,11 +216,12 @@ def disconnect(self): @property def _controller(self): - """Controller instrument used for splitting the unrolled sequences to - batches. + """Identify controller instrument. - Used only by :meth:`qibolab.platform.Platform.execute_pulse_sequences` (unrolling). - This method does not support platforms with more than one controller instruments. + Used for splitting the unrolled sequences to batches. + + This method does not support platforms with more than one + controller instruments. """ controllers = [ instr From 5fbf1dd4db76a810d97c856472fbfbcfc7d56f43 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 16 Jul 2024 17:25:53 +0200 Subject: [PATCH 0220/1006] fix: Individual sequence should be passed as a one-element list --- src/qibolab/backends.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibolab/backends.py b/src/qibolab/backends.py index 8826351bc9..72a6fcef5f 100644 --- a/src/qibolab/backends.py +++ b/src/qibolab/backends.py @@ -102,7 +102,7 @@ def execute_circuit(self, circuit, initial_state=None, nshots=1000): if not self.platform.is_connected: self.platform.connect() - readout = self.platform.execute(sequence, ExecutionParameters(nshots=nshots)) + readout = self.platform.execute([sequence], ExecutionParameters(nshots=nshots)) self.platform.disconnect() From 03d8a1b13f552699d40fcf4d8421f22247c4fe55 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 16 Jul 2024 17:30:33 +0200 Subject: [PATCH 0221/1006] docs: Fix occurrences of execute pulse sequence(s) --- README.md | 2 +- doc/source/main-documentation/qibolab.rst | 19 ++++++++----------- doc/source/tutorials/calibration.rst | 4 ++-- doc/source/tutorials/pulses.rst | 2 +- 4 files changed, 12 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index c2e1bcf888..df04418f47 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,7 @@ platform.connect() # Execute a pulse sequence options = ExecutionParameters(nshots=1000) -results = platform.execute_pulse_sequence(sequence, options) +results = platform.execute([sequence], options) # Print the acquired shots print(results.samples) diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index 3903108dac..91e33d751a 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -15,7 +15,7 @@ In the platform, the main methods can be divided in different sections: - functions save and change qubit parameters (``dump``, ``update``) - functions to coordinate the instruments (``connect``, ``setup``, ``disconnect``) -- functions to execute experiments (``execute_pulse_sequence``, ``execute_pulse_sequences``, ``sweep``) +- a unique interface to execute experiments (``execute``) - functions to initialize gates (``create_RX90_pulse``, ``create_RX_pulse``, ``create_CZ_pulse``, ``create_MZ_pulse``, ``create_qubit_drive_pulse``, ``create_qubit_readout_pulse``, ``create_RX90_drag_pulse``, ``create_RX_drag_pulse``) - setters and getters of channel/qubit parameters (local oscillator parameters, attenuations, gain and biases) @@ -86,7 +86,7 @@ Now we can execute the sequence on hardware: acquisition_type=AcquisitionType.INTEGRATION, averaging_mode=AveragingMode.CYCLIC, ) - results = platform.execute_pulse_sequence(ps, options=options) + results = platform.execute([ps], options=options) Finally, we can stop instruments and close connections. @@ -390,7 +390,7 @@ When conducting experiments on quantum hardware, pulse sequences are vital. Assu .. testcode:: python - result = platform.execute_pulse_sequence(sequence, options=options) + result = platform.execute([sequence], options=options) Lastly, when conducting an experiment, it is not always required to define a pulse from scratch. Usual pulses, such as pi-pulses or measurements, are already defined in the platform runcard and can be easily initialized with platform methods. @@ -415,7 +415,7 @@ Typical experiments may include both pre-defined pulses and new ones: ) sequence.append(platform.create_MZ_pulse(0)) - results = platform.execute_pulse_sequence(sequence, options=options) + results = platform.execute([sequence], options=options) .. note:: @@ -562,8 +562,7 @@ In the course of several examples, you've encountered the ``options`` argument i .. testcode:: python - res = platform.execute_pulse_sequence(sequence, options=options) - res = platform.sweep(sequence, options=options) + res = platform.execute([sequence], options=options) Let's now delve into the details of the ``options`` parameter and understand its components. @@ -636,7 +635,7 @@ Let's now delve into a typical use case for result objects within the qibolab fr averaging_mode=AveragingMode.CYCLIC, ) - res = platform.execute_pulse_sequence(sequence, options=options) + res = platform.execute([sequence], options=options) The ``res`` object will manifest as a dictionary, mapping the measurement pulse serial to its corresponding results. @@ -734,10 +733,8 @@ Instruments all implement a set of methods: - setup - disconnect -While the controllers, the main instruments in a typical setup, add other two methods: - -- execute_pulse_sequence -- sweep +While the controllers, the main instruments in a typical setup, add another, i.e. +execute. Some more detail on the interal functionalities of instruments is given in :doc:`/tutorials/instrument` diff --git a/doc/source/tutorials/calibration.rst b/doc/source/tutorials/calibration.rst index ba8a2fee62..894e0f8629 100644 --- a/doc/source/tutorials/calibration.rst +++ b/doc/source/tutorials/calibration.rst @@ -239,8 +239,8 @@ and its impact on qubit states in the IQ plane. acquisition_type=AcquisitionType.INTEGRATION, ) - results_one = platform.execute_pulse_sequence(one_sequence, options) - results_zero = platform.execute_pulse_sequence(zero_sequence, options) + results_one = platform.execute([one_sequence], options) + results_zero = platform.execute([zero_sequence], options) plt.title("Single shot classification") plt.xlabel("I [a.u.]") diff --git a/doc/source/tutorials/pulses.rst b/doc/source/tutorials/pulses.rst index b3b0b72333..d8ad0e9b50 100644 --- a/doc/source/tutorials/pulses.rst +++ b/doc/source/tutorials/pulses.rst @@ -65,7 +65,7 @@ pulse sequence according to the number of shots ``nshots`` specified. # Executes a pulse sequence. options = ExecutionParameters(nshots=1000, relaxation_time=100) - results = platform.execute_pulse_sequence(sequence, options=options) + results = platform.execut([sequence], options=options) # Disconnect from the instruments platform.disconnect() From b64d95625ec0a2dad02d60846ae6847f2d9aa224 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 16 Jul 2024 17:32:32 +0200 Subject: [PATCH 0222/1006] fix: Make general sequences execution compatible with individual circuit --- src/qibolab/backends.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/qibolab/backends.py b/src/qibolab/backends.py index 72a6fcef5f..f3a12394ed 100644 --- a/src/qibolab/backends.py +++ b/src/qibolab/backends.py @@ -102,7 +102,10 @@ def execute_circuit(self, circuit, initial_state=None, nshots=1000): if not self.platform.is_connected: self.platform.connect() - readout = self.platform.execute([sequence], ExecutionParameters(nshots=nshots)) + readout = self.platform.execute( + [sequence], + ExecutionParameters(nshots=nshots), + )[0] self.platform.disconnect() From 6aae83e0caa2aa3e17e38b6c9fa7b5ef34e9a302 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 16 Jul 2024 17:39:18 +0200 Subject: [PATCH 0223/1006] fix: Take the first element within dictionary values --- src/qibolab/backends.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/qibolab/backends.py b/src/qibolab/backends.py index f3a12394ed..e3016e7b50 100644 --- a/src/qibolab/backends.py +++ b/src/qibolab/backends.py @@ -102,10 +102,11 @@ def execute_circuit(self, circuit, initial_state=None, nshots=1000): if not self.platform.is_connected: self.platform.connect() - readout = self.platform.execute( + readout_ = self.platform.execute( [sequence], ExecutionParameters(nshots=nshots), - )[0] + ) + readout = {k: v[0] for k, v in readout_.items()} self.platform.disconnect() From 2e953a62cc439544ecc302aec6cf8ef15a003541 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 16 Jul 2024 17:42:42 +0200 Subject: [PATCH 0224/1006] docs: Fix occurrences of execute pulse sequence(s) in examples --- examples/minimum_working_example.py | 2 +- examples/qibolab_v017_1Q_emulator_test_QuTiP.ipynb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/minimum_working_example.py b/examples/minimum_working_example.py index 40ced664c5..58c8f367ae 100644 --- a/examples/minimum_working_example.py +++ b/examples/minimum_working_example.py @@ -38,7 +38,7 @@ # Connects to lab instruments using the details specified in the calibration settings. platform.connect() # Executes a pulse sequence. -results = platform.execute_pulse_sequence(sequence, nshots=3000) +results = platform.execute([sequence], nshots=3000) print(f"results (amplitude, phase, i, q): {results}") # Disconnect from the instruments platform.disconnect() diff --git a/examples/qibolab_v017_1Q_emulator_test_QuTiP.ipynb b/examples/qibolab_v017_1Q_emulator_test_QuTiP.ipynb index fda85d07bb..d72c27c56b 100644 --- a/examples/qibolab_v017_1Q_emulator_test_QuTiP.ipynb +++ b/examples/qibolab_v017_1Q_emulator_test_QuTiP.ipynb @@ -108,7 +108,7 @@ "\n", "# Execute the pulse sequence and save the output\n", "options = ExecutionParameters(nshots=1000)\n", - "results = emulator_platform.execute_pulse_sequence(sequence, options=options)" + "results = emulator_platform.execute([sequence], options=options)" ] }, { @@ -454,7 +454,7 @@ "id": "08e1c8ee-8076-47ee-a05a-bcc068d681d0", "metadata": {}, "source": [ - "The simulation results generated by the simulation engine are returned together with the usual outputs of `execute_pulse_sequence` for device platforms and are grouped under 'simulation'. \n", + "The simulation results generated by the simulation engine are returned together with the usual outputs of `execute` for device platforms and are grouped under 'simulation'. \n", "\n", "Let us retrieve the simulation results obtained previously:" ] From cc5e8131175115a8993463555972b6626cd220b4 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 16 Jul 2024 17:57:28 +0200 Subject: [PATCH 0225/1006] test: Fix some instrument specific execution calls --- src/qibolab/platform/platform.py | 2 +- tests/test_emulator.py | 36 +++++++++++++++----------------- tests/test_instruments_zhinst.py | 9 +++----- tests/test_result_shapes.py | 9 ++++---- 4 files changed, 26 insertions(+), 30 deletions(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index cd95eb7905..90400cdd72 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -250,7 +250,7 @@ def execute( sequences: List[PulseSequence], options: ExecutionParameters, *sweepers: Sweeper, - ): + ) -> dict[str, list]: """Executes a pulse sequences. If any sweeper is passed, the execution is performed for the different values of sweeped parameters. diff --git a/tests/test_emulator.py b/tests/test_emulator.py index f87a6e014d..78612bfbad 100644 --- a/tests/test_emulator.py +++ b/tests/test_emulator.py @@ -40,9 +40,7 @@ def test_emulator_initialization(emulators, emulator): "acquisition", [AcquisitionType.DISCRIMINATION, AcquisitionType.INTEGRATION, AcquisitionType.RAW], ) -def test_emulator_execute_pulse_sequence_compute_overlaps( - emulators, emulator, acquisition -): +def test_emulator_execute_compute_overlaps(emulators, emulator, acquisition): nshots = 10 # 100 platform = create_platform(emulator) pulse_simulator = platform.instruments["pulse_simulator"] @@ -54,30 +52,30 @@ def test_emulator_execute_pulse_sequence_compute_overlaps( acquisition is AcquisitionType.DISCRIMINATION or acquisition is AcquisitionType.INTEGRATION ): - results = platform.execute_pulse_sequence(sequence, options) + results = platform.execute([sequence], options) simulated_states = results["simulation"]["output_states"] overlaps = pulse_simulator.simulation_engine.compute_overlaps(simulated_states) if acquisition is AcquisitionType.DISCRIMINATION: - assert results[0].samples.shape == (nshots,) + assert results[0][0].samples.shape == (nshots,) else: - assert results[0].voltage.shape == (nshots,) + assert results[0][0].voltage.shape == (nshots,) else: with pytest.raises(ValueError) as excinfo: - platform.execute_pulse_sequence(sequence, options) + platform.execute(sequence, options) assert "Current emulator does not support requested AcquisitionType" in str( excinfo.value ) @pytest.mark.parametrize("emulator", EMULATORS) -def test_emulator_execute_pulse_sequence_fast_reset(emulators, emulator): +def test_emulator_execute_fast_reset(emulators, emulator): platform = create_platform(emulator) sequence = PulseSequence() sequence.add(platform.create_qubit_readout_pulse(0, 0)) options = ExecutionParameters( nshots=None, fast_reset=True ) # fast_reset does nothing in emulator - result = platform.execute_pulse_sequence(sequence, options) + result = platform.execute([sequence], options) @pytest.mark.parametrize("emulator", EMULATORS) @@ -110,17 +108,17 @@ def test_emulator_single_sweep( ) average = not options.averaging_mode is AveragingMode.SINGLESHOT if parameter in AVAILABLE_SWEEP_PARAMETERS: - results = platform.sweep(sequence, options, sweeper) + results = platform.execute([sequence], options, sweeper) assert pulse.serial and pulse.qubit in results if average: - results_shape = results[pulse.qubit].statistical_frequency.shape + results_shape = results[pulse.qubit][0].statistical_frequency.shape else: - results_shape = results[pulse.qubit].samples.shape + results_shape = results[pulse.qubit][0].samples.shape assert results_shape == (SWEPT_POINTS,) if average else (nshots, SWEPT_POINTS) else: with pytest.raises(NotImplementedError) as excinfo: - platform.sweep(sequence, options, sweeper) + platform.execute([sequence], options, sweeper) assert "Sweep parameter requested not available" in str(excinfo.value) @@ -171,14 +169,14 @@ def test_emulator_double_sweep_false_history( parameter1 in AVAILABLE_SWEEP_PARAMETERS and parameter2 in AVAILABLE_SWEEP_PARAMETERS ): - results = platform.sweep(sequence, options, sweeper1, sweeper2) + results = platform.execute([sequence], options, sweeper1, sweeper2) assert ro_pulse.serial and ro_pulse.qubit in results if average: - results_shape = results[pulse.qubit].statistical_frequency.shape + results_shape = results[pulse.qubit][0].statistical_frequency.shape else: - results_shape = results[pulse.qubit].samples.shape + results_shape = results[pulse.qubit][0].samples.shape assert ( results_shape == (SWEPT_POINTS, SWEPT_POINTS) @@ -227,14 +225,14 @@ def test_emulator_single_sweep_multiplex( ) average = not options.averaging_mode is AveragingMode.SINGLESHOT if parameter in AVAILABLE_SWEEP_PARAMETERS: - results = platform.sweep(sequence, options, sweeper1) + results = platform.execute([sequence], options, sweeper1) for ro_pulse in ro_pulses.values(): assert ro_pulse.serial and ro_pulse.qubit in results if average: - results_shape = results[ro_pulse.qubit].statistical_frequency.shape + results_shape = results[ro_pulse.qubit][0].statistical_frequency.shape else: - results_shape = results[ro_pulse.qubit].samples.shape + results_shape = results[ro_pulse.qubit][0].samples.shape assert ( results_shape == (SWEPT_POINTS,) if average else (nshots, SWEPT_POINTS) ) diff --git a/tests/test_instruments_zhinst.py b/tests/test_instruments_zhinst.py index ea89655dd8..b41be56e66 100644 --- a/tests/test_instruments_zhinst.py +++ b/tests/test_instruments_zhinst.py @@ -892,7 +892,7 @@ def test_connections(instrument): @pytest.mark.qpu -def test_experiment_execute_pulse_sequence_qpu(connected_platform, instrument): +def test_experiment_execute_qpu(connected_platform, instrument): platform = connected_platform sequence = PulseSequence() qubits = {0: platform.qubits[0], "c0": platform.qubits["c0"]} @@ -922,12 +922,9 @@ def test_experiment_execute_pulse_sequence_qpu(connected_platform, instrument): averaging_mode=AveragingMode.CYCLIC, ) - results = platform.execute_pulse_sequence( - sequence, - options, - ) + results = platform.execute([sequence], options) - assert len(results[ro_pulses[q].id]) > 0 + assert len(results[ro_pulses[q][0].id]) > 0 @pytest.mark.qpu diff --git a/tests/test_result_shapes.py b/tests/test_result_shapes.py index d4317689ed..487da30912 100644 --- a/tests/test_result_shapes.py +++ b/tests/test_result_shapes.py @@ -2,6 +2,7 @@ import pytest from qibolab import AcquisitionType, AveragingMode, ExecutionParameters +from qibolab.platform.platform import Platform from qibolab.pulses import PulseSequence from qibolab.result import ( AveragedIntegratedResults, @@ -16,7 +17,7 @@ NSWEEP2 = 8 -def execute(platform, acquisition_type, averaging_mode, sweep=False): +def execute(platform: Platform, acquisition_type, averaging_mode, sweep=False): qubit = next(iter(platform.qubits)) qd_pulse = platform.create_RX_pulse(qubit, start=0) @@ -34,10 +35,10 @@ def execute(platform, acquisition_type, averaging_mode, sweep=False): sweeper1 = Sweeper(Parameter.bias, amp_values, qubits=[platform.qubits[qubit]]) # sweeper1 = Sweeper(Parameter.amplitude, amp_values, pulses=[qd_pulse]) sweeper2 = Sweeper(Parameter.frequency, freq_values, pulses=[ro_pulse]) - results = platform.sweep(sequence, options, sweeper1, sweeper2) + results = platform.execute([sequence], options, sweeper1, sweeper2) else: - results = platform.execute_pulse_sequence(sequence, options) - return results[qubit] + results = platform.execute([sequence], options) + return results[qubit][0] @pytest.mark.qpu From b3a6157dce4d0351af141e91d6d3b67cff8c39f0 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 16 Jul 2024 18:02:58 +0200 Subject: [PATCH 0226/1006] test: Fix some execution calls in dummy tests --- src/qibolab/platform/platform.py | 6 ++-- tests/test_dummy.py | 50 ++++++++++++++++---------------- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 90400cdd72..3dd1228473 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -2,7 +2,7 @@ from collections import defaultdict from dataclasses import dataclass, field, fields -from typing import Dict, List, Optional, Tuple +from typing import Any, Dict, List, Optional, Tuple import networkx as nx from qibo.config import log, raise_error @@ -250,8 +250,8 @@ def execute( sequences: List[PulseSequence], options: ExecutionParameters, *sweepers: Sweeper, - ) -> dict[str, list]: - """Executes a pulse sequences. + ) -> dict[Any, list]: + """Execute a pulse sequences. If any sweeper is passed, the execution is performed for the different values of sweeped parameters. diff --git a/tests/test_dummy.py b/tests/test_dummy.py index 6ff899f784..aef1db6403 100644 --- a/tests/test_dummy.py +++ b/tests/test_dummy.py @@ -30,11 +30,11 @@ def test_dummy_execute_pulse_sequence(name, acquisition): sequence.append(platform.create_MZ_pulse(0)) sequence.append(platform.create_RX12_pulse(0)) options = ExecutionParameters(nshots=100, acquisition_type=acquisition) - result = platform.execute_pulse_sequence(sequence, options) + result = platform.execute([sequence], options) if acquisition is AcquisitionType.INTEGRATION: - assert result[0].magnitude.shape == (nshots,) + assert result[0][0].magnitude.shape == (nshots,) elif acquisition is AcquisitionType.RAW: - assert result[0].magnitude.shape == (nshots * ro_pulse.duration,) + assert result[0][0].magnitude.shape == (nshots * ro_pulse.duration,) def test_dummy_execute_coupler_pulse(): @@ -45,7 +45,7 @@ def test_dummy_execute_coupler_pulse(): sequence.append(pulse) options = ExecutionParameters(nshots=None) - result = platform.execute_pulse_sequence(sequence, options) + result = platform.execute([sequence], options) def test_dummy_execute_pulse_sequence_couplers(): @@ -66,7 +66,7 @@ def test_dummy_execute_pulse_sequence_couplers(): sequence.append(platform.create_MZ_pulse(0)) sequence.append(platform.create_MZ_pulse(2)) options = ExecutionParameters(nshots=None) - result = platform.execute_pulse_sequence(sequence, options) + result = platform.execute([sequence], options) @pytest.mark.parametrize("name", PLATFORM_NAMES) @@ -75,7 +75,7 @@ def test_dummy_execute_pulse_sequence_fast_reset(name): sequence = PulseSequence() sequence.append(platform.create_MZ_pulse(0)) options = ExecutionParameters(nshots=None, fast_reset=True) - result = platform.execute_pulse_sequence(sequence, options) + result = platform.execute([sequence], options) @pytest.mark.parametrize("name", PLATFORM_NAMES) @@ -94,7 +94,7 @@ def test_dummy_execute_pulse_sequence_unrolling(name, acquisition, batch_size): for _ in range(nsequences): sequences.append(sequence) options = ExecutionParameters(nshots=nshots, acquisition_type=acquisition) - result = platform.execute_pulse_sequences(sequences, options) + result = platform.execute(sequences, options) assert len(result[0]) == nsequences for r in result[0]: if acquisition is AcquisitionType.INTEGRATION: @@ -117,9 +117,9 @@ def test_dummy_single_sweep_raw(name): averaging_mode=AveragingMode.CYCLIC, acquisition_type=AcquisitionType.RAW, ) - results = platform.sweep(sequence, options, sweeper) + results = platform.execute([sequence], options, sweeper) assert pulse.id and pulse.qubit in results - shape = results[pulse.qubit].magnitude.shape + shape = results[pulse.qubit][0].magnitude.shape assert shape == (pulse.duration * SWEPT_POINTS,) @@ -162,20 +162,20 @@ def test_dummy_single_sweep_coupler( fast_reset=fast_reset, ) average = not options.averaging_mode is AveragingMode.SINGLESHOT - results = platform.sweep(sequence, options, sweeper) + results = platform.execute([sequence], options, sweeper) assert ro_pulse.id and ro_pulse.qubit in results if average: results_shape = ( - results[ro_pulse.qubit].magnitude.shape + results[ro_pulse.qubit][0].magnitude.shape if acquisition is AcquisitionType.INTEGRATION - else results[ro_pulse.qubit].statistical_frequency.shape + else results[ro_pulse.qubit][0].statistical_frequency.shape ) else: results_shape = ( - results[ro_pulse.qubit].magnitude.shape + results[ro_pulse.qubit][0].magnitude.shape if acquisition is AcquisitionType.INTEGRATION - else results[ro_pulse.qubit].samples.shape + else results[ro_pulse.qubit][0].samples.shape ) assert results_shape == (SWEPT_POINTS,) if average else (nshots, SWEPT_POINTS) @@ -208,7 +208,7 @@ def test_dummy_single_sweep(name, fast_reset, parameter, average, acquisition, n fast_reset=fast_reset, ) average = not options.averaging_mode is AveragingMode.SINGLESHOT - results = platform.sweep(sequence, options, sweeper) + results = platform.execute([sequence], options, sweeper) assert pulse.id and pulse.qubit in results if average: @@ -270,21 +270,21 @@ def test_dummy_double_sweep(name, parameter1, parameter2, average, acquisition, acquisition_type=acquisition, ) average = not options.averaging_mode is AveragingMode.SINGLESHOT - results = platform.sweep(sequence, options, sweeper1, sweeper2) + results = platform.execute([sequence], options, sweeper1, sweeper2) assert ro_pulse.id and ro_pulse.qubit in results if average: results_shape = ( - results[pulse.qubit].magnitude.shape + results[pulse.qubit][0].magnitude.shape if acquisition is AcquisitionType.INTEGRATION - else results[pulse.qubit].statistical_frequency.shape + else results[pulse.qubit][0].statistical_frequency.shape ) else: results_shape = ( - results[pulse.qubit].magnitude.shape + results[pulse.qubit][0].magnitude.shape if acquisition is AcquisitionType.INTEGRATION - else results[pulse.qubit].samples.shape + else results[pulse.qubit][0].samples.shape ) assert ( @@ -333,21 +333,21 @@ def test_dummy_single_sweep_multiplex(name, parameter, average, acquisition, nsh acquisition_type=acquisition, ) average = not options.averaging_mode is AveragingMode.SINGLESHOT - results = platform.sweep(sequence, options, sweeper1) + results = platform.execute([sequence], options, sweeper1) for ro_pulse in ro_pulses.values(): assert ro_pulse.id and ro_pulse.qubit in results if average: results_shape = ( - results[ro_pulse.qubit].magnitude.shape + results[ro_pulse.qubit][0].magnitude.shape if acquisition is AcquisitionType.INTEGRATION - else results[ro_pulse.qubit].statistical_frequency.shape + else results[ro_pulse.qubit][0].statistical_frequency.shape ) else: results_shape = ( - results[ro_pulse.qubit].magnitude.shape + results[ro_pulse.qubit][0].magnitude.shape if acquisition is AcquisitionType.INTEGRATION - else results[ro_pulse.qubit].samples.shape + else results[ro_pulse.qubit][0].samples.shape ) assert results_shape == (SWEPT_POINTS,) if average else (nshots, SWEPT_POINTS) From 61db49a8d9118bc4d4a6b6029aec4b872c18dc55 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 16 Jul 2024 18:08:25 +0200 Subject: [PATCH 0227/1006] test: Fix dummy tests --- src/qibolab/instruments/dummy.py | 21 --------------------- tests/test_dummy.py | 8 ++++---- 2 files changed, 4 insertions(+), 25 deletions(-) diff --git a/src/qibolab/instruments/dummy.py b/src/qibolab/instruments/dummy.py index bdbdda8e5c..cc67b56d8b 100644 --- a/src/qibolab/instruments/dummy.py +++ b/src/qibolab/instruments/dummy.py @@ -120,27 +120,6 @@ def play( couplers: Dict[QubitId, Coupler], sequence: PulseSequence, options: ExecutionParameters, - ): - exp_points = ( - 1 if options.averaging_mode is AveragingMode.CYCLIC else options.nshots - ) - shape = (exp_points,) - results = {} - - for ro_pulse in sequence.ro_pulses: - values = np.squeeze(self.get_values(options, ro_pulse, shape)) - results[ro_pulse.qubit] = results[ro_pulse.id] = options.results_type( - values - ) - - return results - - def sweep( - self, - qubits: Dict[QubitId, Qubit], - couplers: Dict[QubitId, Coupler], - sequence: PulseSequence, - options: ExecutionParameters, *sweepers: List[Sweeper], ): results = {} diff --git a/tests/test_dummy.py b/tests/test_dummy.py index aef1db6403..bff9e914e3 100644 --- a/tests/test_dummy.py +++ b/tests/test_dummy.py @@ -213,15 +213,15 @@ def test_dummy_single_sweep(name, fast_reset, parameter, average, acquisition, n assert pulse.id and pulse.qubit in results if average: results_shape = ( - results[pulse.qubit].magnitude.shape + results[pulse.qubit][0].magnitude.shape if acquisition is AcquisitionType.INTEGRATION - else results[pulse.qubit].statistical_frequency.shape + else results[pulse.qubit][0].statistical_frequency.shape ) else: results_shape = ( - results[pulse.qubit].magnitude.shape + results[pulse.qubit][0].magnitude.shape if acquisition is AcquisitionType.INTEGRATION - else results[pulse.qubit].samples.shape + else results[pulse.qubit][0].samples.shape ) assert results_shape == (SWEPT_POINTS,) if average else (nshots, SWEPT_POINTS) From 75eedd1e11d50ab4fcc377e470f3e3bb5424b799 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 16 Jul 2024 18:30:06 +0200 Subject: [PATCH 0228/1006] docs: Fix doctests for unified execution --- doc/source/getting-started/experiment.rst | 4 ++-- doc/source/main-documentation/qibolab.rst | 4 ++-- doc/source/tutorials/calibration.rst | 16 ++++++++-------- doc/source/tutorials/pulses.rst | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/doc/source/getting-started/experiment.rst b/doc/source/getting-started/experiment.rst index 51b7e24f7b..6d27517518 100644 --- a/doc/source/getting-started/experiment.rst +++ b/doc/source/getting-started/experiment.rst @@ -208,10 +208,10 @@ We leave to the dedicated tutorial a full explanation of the experiment, but her acquisition_type=AcquisitionType.INTEGRATION, ) - results = platform.sweep(sequence, options, sweeper) + results = platform.execute([sequence], options, sweeper) # plot the results - amplitudes = results[ro_pulse.id].magnitude + amplitudes = results[ro_pulse.id][0].magnitude frequencies = np.arange(-2e8, +2e8, 1e6) + ro_pulse.frequency plt.title("Resonator Spectroscopy") diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index 91e33d751a..50536e71e4 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -496,7 +496,7 @@ A tipical resonator spectroscopy experiment could be defined with: type=SweeperType.OFFSET, ) - results = platform.sweep(sequence, options, sweeper) + results = platform.execute([sequence], options, sweeper) .. note:: @@ -543,7 +543,7 @@ For example: type=SweeperType.FACTOR, ) - results = platform.sweep(sequence, options, sweeper_freq, sweeper_amp) + results = platform.execute([sequence], options, sweeper_freq, sweeper_amp) Let's say that the RX pulse has, from the runcard, a frequency of 4.5 GHz and an amplitude of 0.3, the parameter space probed will be: diff --git a/doc/source/tutorials/calibration.rst b/doc/source/tutorials/calibration.rst index 894e0f8629..1588ad654d 100644 --- a/doc/source/tutorials/calibration.rst +++ b/doc/source/tutorials/calibration.rst @@ -65,7 +65,7 @@ We then define the execution parameters and launch the experiment. acquisition_type=AcquisitionType.INTEGRATION, ) - results = platform.sweep(sequence, options, sweeper) + results = platform.execute([sequence], options, sweeper) In few seconds, the experiment will be finished and we can proceed to plot it. @@ -73,7 +73,7 @@ In few seconds, the experiment will be finished and we can proceed to plot it. import matplotlib.pyplot as plt - amplitudes = results[readout_pulse.id].magnitude + amplitudes = results[readout_pulse.id][0].magnitude frequencies = np.arange(-2e8, +2e8, 1e6) + readout_pulse.frequency plt.title("Resonator Spectroscopy") @@ -153,9 +153,9 @@ We can now proceed to launch on hardware: acquisition_type=AcquisitionType.INTEGRATION, ) - results = platform.sweep(sequence, options, sweeper) + results = platform.execute([sequence], options, sweeper) - amplitudes = results[readout_pulse.id].magnitude + amplitudes = results[readout_pulse.id][0].magnitude frequencies = np.arange(-2e8, +2e8, 1e6) + drive_pulse.frequency plt.title("Resonator Spectroscopy") @@ -246,13 +246,13 @@ and its impact on qubit states in the IQ plane. plt.xlabel("I [a.u.]") plt.ylabel("Q [a.u.]") plt.scatter( - results_one[readout_pulse1.id].voltage_i, - results_one[readout_pulse1.id].voltage_q, + results_one[readout_pulse1.id][0].voltage_i, + results_one[readout_pulse1.id][0].voltage_q, label="One state", ) plt.scatter( - results_zero[readout_pulse2.id].voltage_i, - results_zero[readout_pulse2.id].voltage_q, + results_zero[readout_pulse2.id][0].voltage_i, + results_zero[readout_pulse2.id][0].voltage_q, label="Zero state", ) plt.show() diff --git a/doc/source/tutorials/pulses.rst b/doc/source/tutorials/pulses.rst index d8ad0e9b50..0b336addfb 100644 --- a/doc/source/tutorials/pulses.rst +++ b/doc/source/tutorials/pulses.rst @@ -65,7 +65,7 @@ pulse sequence according to the number of shots ``nshots`` specified. # Executes a pulse sequence. options = ExecutionParameters(nshots=1000, relaxation_time=100) - results = platform.execut([sequence], options=options) + results = platform.execute([sequence], options=options) # Disconnect from the instruments platform.disconnect() From 701ae8326c4a57476d8d3f51a0fb58d1ecfffa8e Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 16 Jul 2024 19:57:42 +0200 Subject: [PATCH 0229/1006] feat!: Introduce diagonal sweepers signature --- src/qibolab/platform/platform.py | 67 ++++++++++++++++++++------------ src/qibolab/sweeper.py | 4 ++ 2 files changed, 47 insertions(+), 24 deletions(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 3dd1228473..3fbdfe147c 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -2,7 +2,8 @@ from collections import defaultdict from dataclasses import dataclass, field, fields -from typing import Any, Dict, List, Optional, Tuple +from math import prod +from typing import Any, Dict, List, Optional, Tuple, TypeVar import networkx as nx from qibo.config import log, raise_error @@ -13,7 +14,7 @@ from qibolab.pulses import Delay, Drag, PulseSequence, PulseType from qibolab.qubits import Qubit, QubitId, QubitPair, QubitPairId from qibolab.serialize_ import replace -from qibolab.sweeper import Sweeper +from qibolab.sweeper import ParallelSweepers from qibolab.unrolling import batch InstrumentMap = Dict[InstrumentId, Instrument] @@ -23,6 +24,15 @@ NS_TO_SEC = 1e-9 +# TODO: replace with https://docs.python.org/3/reference/compound_stmts.html#type-params +T = TypeVar("T") + + +# TODO: lift for general usage in Qibolab +def default(value: Optional[T], default: T) -> T: + """None replacement shortcut.""" + return value if value is not None else default + def unroll_sequences( sequences: List[PulseSequence], relaxation_time: int @@ -60,6 +70,23 @@ def unroll_sequences( return total_sequence, readout_map +def estimate_duration( + sequences: list[PulseSequence], + options: ExecutionParameters, + sweepers: list[ParallelSweepers], +) -> float: + """Estimate experiment duration.""" + duration = sum(seq.duration for seq in sequences) + relaxation = default(options.relaxation_time, 0) + nshots = default(options.nshots, 0) + return ( + (duration + len(sequences) * relaxation) + * nshots + * NS_TO_SEC + * prod(len(s[0].values) for s in sweepers) + ) + + @dataclass class Settings: """Default execution settings read from the runcard.""" @@ -231,14 +258,14 @@ def _controller(self): assert len(controllers) == 1 return controllers[0] - def _execute(self, sequence, options, *sweepers): + def _execute(self, sequence, options, sweepers): """Executes sequence on the controllers.""" result = {} for instrument in self.instruments.values(): if isinstance(instrument, Controller): new_result = instrument.play( - self.qubits, self.couplers, sequence, options, *sweepers + self.qubits, self.couplers, sequence, options, sweepers ) if isinstance(new_result, dict): result.update(new_result) @@ -249,11 +276,14 @@ def execute( self, sequences: List[PulseSequence], options: ExecutionParameters, - *sweepers: Sweeper, + sweepers: Optional[list[ParallelSweepers]] = None, ) -> dict[Any, list]: """Execute a pulse sequences. - If any sweeper is passed, the execution is performed for the different values of sweeped parameters. + If any sweeper is passed, the execution is performed for the different values + of sweeped parameters. + + Returns readout results acquired by after execution. Example: .. testcode:: @@ -271,26 +301,15 @@ def execute( pulse = platform.create_qubit_readout_pulse(qubit=0) sequence.append(pulse) parameter_range = np.random.randint(10, size=10) - sweeper = Sweeper(parameter, parameter_range, [pulse]) - platform.execute([sequence], ExecutionParameters(), sweeper) - - Args: - sequence (List[:class:`qibolab.pulses.PulseSequence`]): Pulse sequences to execute. - options (:class:`qibolab.platforms.platform.ExecutionParameters`): Object holding the execution options. - **kwargs: May need them for something - Returns: - Readout results acquired by after execution. + sweeper = [Sweeper(parameter, parameter_range, [pulse])] + platform.execute([sequence], ExecutionParameters(), [sweeper]) """ + if sweepers is None: + sweepers = [] + options = self.settings.fill(options) - duration = sum(seq.duration for seq in sequences) - time = ( - (duration + len(sequences) * options.relaxation_time) - * options.nshots - * NS_TO_SEC - ) - for sweep in sweepers: - time *= len(sweep.values) + time = estimate_duration(sequences, options, sweepers) log.info(f"Minimal execution time: {time}") # find readout pulses @@ -303,7 +322,7 @@ def execute( results = defaultdict(list) for b in batch(sequences, self._controller.bounds): sequence, readouts = unroll_sequences(b, options.relaxation_time) - result = self._execute(sequence, options, *sweepers) + result = self._execute(sequence, options, sweepers) for serial, new_serials in readouts.items(): results[serial].extend(result[ser] for ser in new_serials) diff --git a/src/qibolab/sweeper.py b/src/qibolab/sweeper.py index ddb17297aa..e419d7a867 100644 --- a/src/qibolab/sweeper.py +++ b/src/qibolab/sweeper.py @@ -111,3 +111,7 @@ def __post_init__(self): def get_values(self, base_value): """Convert sweeper values depending on the sweeper type.""" return self.type.value(self.values, base_value) + + +ParallelSweepers = list[Sweeper] +"""Sweepers that should be iterated in parallel.""" From 477354602cb14c27803e797ac3d65755625c214f Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 23 Jul 2024 15:30:22 +0200 Subject: [PATCH 0230/1006] fix: Add support for parallel sweepers in dummy --- src/qibolab/instruments/dummy.py | 12 +++++++----- tests/test_dummy.py | 10 +++++----- tests/test_result_shapes.py | 2 +- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/qibolab/instruments/dummy.py b/src/qibolab/instruments/dummy.py index cc67b56d8b..b9645ac219 100644 --- a/src/qibolab/instruments/dummy.py +++ b/src/qibolab/instruments/dummy.py @@ -1,5 +1,5 @@ from dataclasses import dataclass -from typing import Dict, List, Optional +from typing import Dict, Optional import numpy as np from qibo.config import log @@ -12,7 +12,7 @@ ) from qibolab.pulses import PulseSequence from qibolab.qubits import Qubit, QubitId -from qibolab.sweeper import Sweeper +from qibolab.sweeper import ParallelSweepers from qibolab.unrolling import Bounds from .abstract import Controller @@ -120,16 +120,18 @@ def play( couplers: Dict[QubitId, Coupler], sequence: PulseSequence, options: ExecutionParameters, - *sweepers: List[Sweeper], + sweepers: list[ParallelSweepers], ): results = {} if options.averaging_mode is not AveragingMode.CYCLIC: shape = (options.nshots,) + tuple( - len(sweeper.values) for sweeper in sweepers + min(len(sweep.values) for sweep in parsweeps) for parsweeps in sweepers ) else: - shape = tuple(len(sweeper.values) for sweeper in sweepers) + shape = tuple( + min(len(sweep.values) for sweep in parsweeps) for parsweeps in sweepers + ) for ro_pulse in sequence.ro_pulses: values = self.get_values(options, ro_pulse, shape) diff --git a/tests/test_dummy.py b/tests/test_dummy.py index bff9e914e3..de37612a38 100644 --- a/tests/test_dummy.py +++ b/tests/test_dummy.py @@ -117,7 +117,7 @@ def test_dummy_single_sweep_raw(name): averaging_mode=AveragingMode.CYCLIC, acquisition_type=AcquisitionType.RAW, ) - results = platform.execute([sequence], options, sweeper) + results = platform.execute([sequence], options, [[sweeper]]) assert pulse.id and pulse.qubit in results shape = results[pulse.qubit][0].magnitude.shape assert shape == (pulse.duration * SWEPT_POINTS,) @@ -162,7 +162,7 @@ def test_dummy_single_sweep_coupler( fast_reset=fast_reset, ) average = not options.averaging_mode is AveragingMode.SINGLESHOT - results = platform.execute([sequence], options, sweeper) + results = platform.execute([sequence], options, [[sweeper]]) assert ro_pulse.id and ro_pulse.qubit in results if average: @@ -208,7 +208,7 @@ def test_dummy_single_sweep(name, fast_reset, parameter, average, acquisition, n fast_reset=fast_reset, ) average = not options.averaging_mode is AveragingMode.SINGLESHOT - results = platform.execute([sequence], options, sweeper) + results = platform.execute([sequence], options, [[sweeper]]) assert pulse.id and pulse.qubit in results if average: @@ -270,7 +270,7 @@ def test_dummy_double_sweep(name, parameter1, parameter2, average, acquisition, acquisition_type=acquisition, ) average = not options.averaging_mode is AveragingMode.SINGLESHOT - results = platform.execute([sequence], options, sweeper1, sweeper2) + results = platform.execute([sequence], options, [[sweeper1], [sweeper2]]) assert ro_pulse.id and ro_pulse.qubit in results @@ -333,7 +333,7 @@ def test_dummy_single_sweep_multiplex(name, parameter, average, acquisition, nsh acquisition_type=acquisition, ) average = not options.averaging_mode is AveragingMode.SINGLESHOT - results = platform.execute([sequence], options, sweeper1) + results = platform.execute([sequence], options, [[sweeper1]]) for ro_pulse in ro_pulses.values(): assert ro_pulse.id and ro_pulse.qubit in results diff --git a/tests/test_result_shapes.py b/tests/test_result_shapes.py index 487da30912..3931d0373e 100644 --- a/tests/test_result_shapes.py +++ b/tests/test_result_shapes.py @@ -35,7 +35,7 @@ def execute(platform: Platform, acquisition_type, averaging_mode, sweep=False): sweeper1 = Sweeper(Parameter.bias, amp_values, qubits=[platform.qubits[qubit]]) # sweeper1 = Sweeper(Parameter.amplitude, amp_values, pulses=[qd_pulse]) sweeper2 = Sweeper(Parameter.frequency, freq_values, pulses=[ro_pulse]) - results = platform.execute([sequence], options, sweeper1, sweeper2) + results = platform.execute([sequence], options, [[sweeper1], [sweeper2]]) else: results = platform.execute([sequence], options) return results[qubit][0] From 8190bd9123d01abc3968a05f516c905446630ba5 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 23 Jul 2024 15:52:58 +0200 Subject: [PATCH 0231/1006] docs: Propagate sweepers parameter redefinition --- doc/source/getting-started/experiment.rst | 2 +- doc/source/main-documentation/qibolab.rst | 4 ++-- doc/source/tutorials/calibration.rst | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/source/getting-started/experiment.rst b/doc/source/getting-started/experiment.rst index 6d27517518..4991c49f46 100644 --- a/doc/source/getting-started/experiment.rst +++ b/doc/source/getting-started/experiment.rst @@ -208,7 +208,7 @@ We leave to the dedicated tutorial a full explanation of the experiment, but her acquisition_type=AcquisitionType.INTEGRATION, ) - results = platform.execute([sequence], options, sweeper) + results = platform.execute([sequence], options, [[sweeper]]) # plot the results amplitudes = results[ro_pulse.id][0].magnitude diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index 50536e71e4..e5c45ee4c1 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -496,7 +496,7 @@ A tipical resonator spectroscopy experiment could be defined with: type=SweeperType.OFFSET, ) - results = platform.execute([sequence], options, sweeper) + results = platform.execute([sequence], options, [sweeper]) .. note:: @@ -543,7 +543,7 @@ For example: type=SweeperType.FACTOR, ) - results = platform.execute([sequence], options, sweeper_freq, sweeper_amp) + results = platform.execute([sequence], options, [[sweeper_freq], [sweeper_amp]]) Let's say that the RX pulse has, from the runcard, a frequency of 4.5 GHz and an amplitude of 0.3, the parameter space probed will be: diff --git a/doc/source/tutorials/calibration.rst b/doc/source/tutorials/calibration.rst index 1588ad654d..375a521419 100644 --- a/doc/source/tutorials/calibration.rst +++ b/doc/source/tutorials/calibration.rst @@ -65,7 +65,7 @@ We then define the execution parameters and launch the experiment. acquisition_type=AcquisitionType.INTEGRATION, ) - results = platform.execute([sequence], options, sweeper) + results = platform.execute([sequence], options, [[sweeper]]) In few seconds, the experiment will be finished and we can proceed to plot it. @@ -153,7 +153,7 @@ We can now proceed to launch on hardware: acquisition_type=AcquisitionType.INTEGRATION, ) - results = platform.execute([sequence], options, sweeper) + results = platform.execute([sequence], options, [[sweeper]]) amplitudes = results[readout_pulse.id][0].magnitude frequencies = np.arange(-2e8, +2e8, 1e6) + drive_pulse.frequency From 85e667b98613ac656a72ea63ae55ee73dd7fb2f0 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 23 Jul 2024 16:02:02 +0200 Subject: [PATCH 0232/1006] docs: Fix remaining wrong/outdated execute calls --- doc/source/main-documentation/qibolab.rst | 2 +- src/qibolab/sweeper.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index e5c45ee4c1..4794c7e59d 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -496,7 +496,7 @@ A tipical resonator spectroscopy experiment could be defined with: type=SweeperType.OFFSET, ) - results = platform.execute([sequence], options, [sweeper]) + results = platform.execute([sequence], options, [[sweeper]]) .. note:: diff --git a/src/qibolab/sweeper.py b/src/qibolab/sweeper.py index e419d7a867..4a49bc63fc 100644 --- a/src/qibolab/sweeper.py +++ b/src/qibolab/sweeper.py @@ -45,9 +45,9 @@ class SweeperType(Enum): class Sweeper: """Data structure for Sweeper object. - This object is passed as an argument to the method :func:`qibolab.platforms.abstract.Platform.sweep` + This object is passed as an argument to the method :func:`qibolab.platforms.platform.Platform.execute` which enables the user to sweep a specific parameter for one or more pulses. For information on how to - perform sweeps see :func:`qibolab.platforms.abstract.Platform.sweep`. + perform sweeps see :func:`qibolab.platforms.platform.Platform.execute`. Example: .. testcode:: @@ -66,7 +66,7 @@ class Sweeper: sequence.append(pulse) parameter_range = np.random.randint(10, size=10) sweeper = Sweeper(parameter, parameter_range, [pulse]) - platform.sweep(sequence, ExecutionParameters(), sweeper) + platform.execute([sequence], ExecutionParameters(), [[sweeper]]) Args: parameter (`qibolab.sweeper.Parameter`): parameter to be swept, possible choices are frequency, attenuation, amplitude, current and gain. From ada64e12ee1c974ee57d1b876a3305507e0cb376 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Fri, 5 Apr 2024 12:47:40 +0400 Subject: [PATCH 0233/1006] Define user facing Channel and various *ChannelConfig classes --- src/qibolab/channel_config.py | 77 +++++++++++++++++++++++++++++++++++ src/qibolab/couplers.py | 2 +- src/qibolab/qubits.py | 2 +- 3 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 src/qibolab/channel_config.py diff --git a/src/qibolab/channel_config.py b/src/qibolab/channel_config.py new file mode 100644 index 0000000000..6c71c8ad43 --- /dev/null +++ b/src/qibolab/channel_config.py @@ -0,0 +1,77 @@ +from dataclasses import dataclass +from typing import Union + +from .execution_parameters import AcquisitionType + +""" +Channel is an abstract concept that defines an interface in front of various instrument drivers in qibolab, without +exposing instrument specific implementation details. For the users of this interface a quantum computer is just a +predefined set of channels where they can send signals or receive signals/data from. Users do not have control over what +channels exist - it is determined by the setup of a certain quantum computer. However, users have control over some +configuration parameters. A typical use case is to configure some channels with desired parameters and request an +execution of a synchronized pulse sequence that implements a certain computation or a calibration experiment. +""" + + +@dataclass +class DCChannelConfig: + """Configuration for a channel that can be used to send DC pulses (i.e. + just envelopes without modulation on any frequency)""" + + bias: float + """DC bias/offset of the channel.""" + + +@dataclass +class IQChannelConfig: + """Configuration for an IQ channel. This is used for IQ channels that can + generate requested signals by first generating them at an intermediate + frequency, and then mixing it with a local oscillator (LO) to upconvert to + the target carrier frequency. + + For this type of IQ channels users typically + 1. want to have control over the LO frequency. + 2. need to be able to calibrate parameters related to the mixer imperfections. + Mixers typically have some imbalance in the way they treat the I and Q components + of the signal, and to compensate for it users typically need to calibrate the + compensation parameters and provide them as channel configuration. + """ + + frequency: float + """The carrier frequency of the channel.""" + lo_frequency: float + """The frequency of the local oscillator.""" + mixer_correction_scale: float = 0.0 + """The relative amplitude scale/factor of the q channel.""" + mixer_correction_phase: float = 0.0 + """The phase offset of the q channel of the LO.""" + + +@dataclass +class DirectIQChannelConfig: + """Configuration for an IQ channel that directly generates signals at + necessary carrier frequency.""" + + frequency: float + """The carrier frequency of the channel.""" + + +@dataclass +class AcquisitionChannelConfig: + """Configuration for acquisition channels.""" + + type: AcquisitionType + + +@dataclass +class Channel: + """A channel is represented by its unique name, and the type of + configuration that should be specified for it.""" + + name: str + config_type: type + + +ChannelConfig = Union[ + DCChannelConfig, IQChannelConfig, DirectIQChannelConfig, AcquisitionChannelConfig +] diff --git a/src/qibolab/couplers.py b/src/qibolab/couplers.py index cd384ecf4b..1dec4bd2a7 100644 --- a/src/qibolab/couplers.py +++ b/src/qibolab/couplers.py @@ -1,7 +1,7 @@ from dataclasses import dataclass, field from typing import Dict, Optional, Union -from qibolab.channels import Channel +from qibolab.channel_config import Channel from qibolab.native import SingleQubitNatives QubitId = Union[str, int] diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index 41142af981..9027b3f472 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -3,7 +3,7 @@ import numpy as np -from qibolab.channels import Channel +from qibolab.channel_config import Channel from qibolab.couplers import Coupler from qibolab.native import SingleQubitNatives, TwoQubitNatives From b19d2077191d104e19195609a25ccb0fe1e41cac Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Fri, 5 Apr 2024 17:06:04 +0400 Subject: [PATCH 0234/1006] rename Channel to InstrumentChannel --- src/qibolab/dummy/platform.py | 15 ++++---- .../instrument_channel.py} | 10 +++--- src/qibolab/instruments/qm/sweepers.py | 2 +- tests/dummy_qrc/qblox/platform.py | 36 ++++++++++--------- tests/dummy_qrc/qm/platform.py | 24 ++++++++----- tests/dummy_qrc/qm_octave/platform.py | 20 ++++++----- tests/dummy_qrc/rfsoc/platform.py | 12 ++++--- tests/dummy_qrc/zurich/platform.py | 22 +++++++----- tests/test_channels.py | 18 +++++----- 9 files changed, 93 insertions(+), 66 deletions(-) rename src/qibolab/{channels.py => instruments/instrument_channel.py} (94%) diff --git a/src/qibolab/dummy/platform.py b/src/qibolab/dummy/platform.py index 614f8f6dcf..6f765469f0 100644 --- a/src/qibolab/dummy/platform.py +++ b/src/qibolab/dummy/platform.py @@ -1,8 +1,8 @@ import itertools import pathlib -from qibolab.channels import Channel, ChannelMap from qibolab.instruments.dummy import DummyInstrument, DummyLocalOscillator +from qibolab.instruments.instrument_channel import ChannelMap, InstrumentChannel from qibolab.kernels import Kernels from qibolab.platform import Platform from qibolab.serialize import load_qubits, load_runcard, load_settings @@ -47,18 +47,21 @@ def create_dummy(with_couplers: bool = True): # Create channel objects nqubits = runcard["nqubits"] channels = ChannelMap() - channels |= Channel("readout", port=instrument.ports("readout")) + channels |= InstrumentChannel("readout", port=instrument.ports("readout")) channels |= ( - Channel(f"drive-{i}", port=instrument.ports(f"drive-{i}")) + InstrumentChannel(f"drive-{i}", port=instrument.ports(f"drive-{i}")) for i in range(nqubits) ) channels |= ( - Channel(f"flux-{i}", port=instrument.ports(f"flux-{i}")) for i in range(nqubits) + InstrumentChannel(f"flux-{i}", port=instrument.ports(f"flux-{i}")) + for i in range(nqubits) ) - channels |= Channel("twpa", port=None) + channels |= InstrumentChannel("twpa", port=None) if with_couplers: channels |= ( - Channel(f"flux_coupler-{c}", port=instrument.ports(f"flux_coupler-{c}")) + InstrumentChannel( + f"flux_coupler-{c}", port=instrument.ports(f"flux_coupler-{c}") + ) for c in itertools.chain(range(0, 2), range(3, 5)) ) channels["readout"].attenuation = 0 diff --git a/src/qibolab/channels.py b/src/qibolab/instruments/instrument_channel.py similarity index 94% rename from src/qibolab/channels.py rename to src/qibolab/instruments/instrument_channel.py index b4a9164780..3ee56b09bf 100644 --- a/src/qibolab/channels.py +++ b/src/qibolab/instruments/instrument_channel.py @@ -20,7 +20,7 @@ def check_max_offset(offset, max_offset): @dataclass -class Channel: +class InstrumentChannel: """Representation of physical wire connection (channel).""" name: str @@ -122,7 +122,7 @@ class ChannelMap: specifying the names. """ - _channels: Dict[str, Channel] = field(default_factory=dict) + _channels: Dict[str, InstrumentChannel] = field(default_factory=dict) def add(self, *items): """Add multiple items to the channel map. @@ -132,17 +132,17 @@ def add(self, *items): is created and added to the channel map. """ for item in items: - if isinstance(item, Channel): + if isinstance(item, InstrumentChannel): self[item.name] = item else: - self[item] = Channel(item) + self[item] = InstrumentChannel(item) return self def __getitem__(self, name): return self._channels[name] def __setitem__(self, name, channel): - if not isinstance(channel, Channel): + if not isinstance(channel, InstrumentChannel): raise_error( TypeError, f"Cannot add channel of type {type(channel)} to ChannelMap." ) diff --git a/src/qibolab/instruments/qm/sweepers.py b/src/qibolab/instruments/qm/sweepers.py index e745d6bde8..401de51e49 100644 --- a/src/qibolab/instruments/qm/sweepers.py +++ b/src/qibolab/instruments/qm/sweepers.py @@ -6,7 +6,7 @@ from qm.qua import declare, fixed, for_ from qualang_tools.loops import from_array -from qibolab.channels import check_max_offset +from qibolab.instruments.instrument_channel import check_max_offset from qibolab.instruments.qm.sequence import BakedPulse from qibolab.pulses import PulseType from qibolab.sweeper import Parameter diff --git a/tests/dummy_qrc/qblox/platform.py b/tests/dummy_qrc/qblox/platform.py index a60a600d8f..2b6ec081a1 100644 --- a/tests/dummy_qrc/qblox/platform.py +++ b/tests/dummy_qrc/qblox/platform.py @@ -1,6 +1,6 @@ import pathlib -from qibolab.channels import Channel, ChannelMap +from qibolab.instruments.instrument_channel import ChannelMap, InstrumentChannel from qibolab.instruments.qblox.cluster_qcm_bb import QcmBb from qibolab.instruments.qblox.cluster_qcm_rf import QcmRf from qibolab.instruments.qblox.cluster_qrm_rf import QrmRf @@ -50,25 +50,29 @@ def create(): # Create channel objects channels = ChannelMap() # Readout - channels |= Channel(name="L3-25_a", port=modules["qrm_rf_a"].ports("o1")) - channels |= Channel(name="L3-25_b", port=modules["qrm_rf_b"].ports("o1")) + channels |= InstrumentChannel(name="L3-25_a", port=modules["qrm_rf_a"].ports("o1")) + channels |= InstrumentChannel(name="L3-25_b", port=modules["qrm_rf_b"].ports("o1")) # Feedback - channels |= Channel(name="L2-5_a", port=modules["qrm_rf_a"].ports("i1", out=False)) - channels |= Channel(name="L2-5_b", port=modules["qrm_rf_b"].ports("i1", out=False)) + channels |= InstrumentChannel( + name="L2-5_a", port=modules["qrm_rf_a"].ports("i1", out=False) + ) + channels |= InstrumentChannel( + name="L2-5_b", port=modules["qrm_rf_b"].ports("i1", out=False) + ) # Drive - channels |= Channel(name="L3-15", port=modules["qcm_rf0"].ports("o1")) - channels |= Channel(name="L3-11", port=modules["qcm_rf0"].ports("o2")) - channels |= Channel(name="L3-12", port=modules["qcm_rf1"].ports("o1")) - channels |= Channel(name="L3-13", port=modules["qcm_rf1"].ports("o2")) - channels |= Channel(name="L3-14", port=modules["qcm_rf2"].ports("o1")) + channels |= InstrumentChannel(name="L3-15", port=modules["qcm_rf0"].ports("o1")) + channels |= InstrumentChannel(name="L3-11", port=modules["qcm_rf0"].ports("o2")) + channels |= InstrumentChannel(name="L3-12", port=modules["qcm_rf1"].ports("o1")) + channels |= InstrumentChannel(name="L3-13", port=modules["qcm_rf1"].ports("o2")) + channels |= InstrumentChannel(name="L3-14", port=modules["qcm_rf2"].ports("o1")) # Flux - channels |= Channel(name="L4-5", port=modules["qcm_bb0"].ports("o1")) - channels |= Channel(name="L4-1", port=modules["qcm_bb0"].ports("o2")) - channels |= Channel(name="L4-2", port=modules["qcm_bb0"].ports("o3")) - channels |= Channel(name="L4-3", port=modules["qcm_bb0"].ports("o4")) - channels |= Channel(name="L4-4", port=modules["qcm_bb1"].ports("o1")) + channels |= InstrumentChannel(name="L4-5", port=modules["qcm_bb0"].ports("o1")) + channels |= InstrumentChannel(name="L4-1", port=modules["qcm_bb0"].ports("o2")) + channels |= InstrumentChannel(name="L4-2", port=modules["qcm_bb0"].ports("o3")) + channels |= InstrumentChannel(name="L4-3", port=modules["qcm_bb0"].ports("o4")) + channels |= InstrumentChannel(name="L4-4", port=modules["qcm_bb1"].ports("o1")) # TWPA - channels |= Channel(name="L3-28", port=None) + channels |= InstrumentChannel(name="L3-28", port=None) channels["L3-28"].local_oscillator = twpa_pump # create qubit objects diff --git a/tests/dummy_qrc/qm/platform.py b/tests/dummy_qrc/qm/platform.py index 40e2db638f..cef324b199 100644 --- a/tests/dummy_qrc/qm/platform.py +++ b/tests/dummy_qrc/qm/platform.py @@ -1,7 +1,7 @@ import pathlib -from qibolab.channels import Channel, ChannelMap from qibolab.instruments.dummy import DummyLocalOscillator as LocalOscillator +from qibolab.instruments.instrument_channel import ChannelMap, InstrumentChannel from qibolab.instruments.qm import OPXplus, QMController from qibolab.platform import Platform from qibolab.serialize import ( @@ -28,25 +28,33 @@ def create(): # Create channel objects and map controllers to channels channels = ChannelMap() # readout - channels |= Channel("L3-25_a", port=controller.ports((("con1", 10), ("con1", 9)))) - channels |= Channel("L3-25_b", port=controller.ports((("con2", 10), ("con2", 9)))) + channels |= InstrumentChannel( + "L3-25_a", port=controller.ports((("con1", 10), ("con1", 9))) + ) + channels |= InstrumentChannel( + "L3-25_b", port=controller.ports((("con2", 10), ("con2", 9))) + ) # feedback - channels |= Channel( + channels |= InstrumentChannel( "L2-5_a", port=controller.ports((("con1", 2), ("con1", 1)), output=False) ) - channels |= Channel( + channels |= InstrumentChannel( "L2-5_b", port=controller.ports((("con2", 2), ("con2", 1)), output=False) ) # drive channels |= ( - Channel( + InstrumentChannel( f"L3-1{i}", port=controller.ports((("con1", 2 * i), ("con1", 2 * i - 1))) ) for i in range(1, 5) ) - channels |= Channel("L3-15", port=controller.ports((("con3", 2), ("con3", 1)))) + channels |= InstrumentChannel( + "L3-15", port=controller.ports((("con3", 2), ("con3", 1))) + ) # flux - channels |= (Channel(f"L4-{i}", port=opxs[1].ports(i)) for i in range(1, 6)) + channels |= ( + InstrumentChannel(f"L4-{i}", port=opxs[1].ports(i)) for i in range(1, 6) + ) # TWPA channels |= "L4-26" diff --git a/tests/dummy_qrc/qm_octave/platform.py b/tests/dummy_qrc/qm_octave/platform.py index 3d3d307bf3..f62f8f6936 100644 --- a/tests/dummy_qrc/qm_octave/platform.py +++ b/tests/dummy_qrc/qm_octave/platform.py @@ -1,7 +1,7 @@ import pathlib -from qibolab.channels import Channel, ChannelMap from qibolab.instruments.dummy import DummyLocalOscillator as LocalOscillator +from qibolab.instruments.instrument_channel import ChannelMap, InstrumentChannel from qibolab.instruments.qm import Octave, OPXplus, QMController from qibolab.platform import Platform from qibolab.serialize import ( @@ -36,16 +36,20 @@ def create(runcard_path=RUNCARD): # Create channel objects and map controllers to channels channels = ChannelMap() # readout - channels |= Channel("L3-25_a", port=octave1.ports(5)) - channels |= Channel("L3-25_b", port=octave2.ports(5)) + channels |= InstrumentChannel("L3-25_a", port=octave1.ports(5)) + channels |= InstrumentChannel("L3-25_b", port=octave2.ports(5)) # feedback - channels |= Channel("L2-5_a", port=octave1.ports(1, output=False)) - channels |= Channel("L2-5_b", port=octave2.ports(1, output=False)) + channels |= InstrumentChannel("L2-5_a", port=octave1.ports(1, output=False)) + channels |= InstrumentChannel("L2-5_b", port=octave2.ports(1, output=False)) # drive - channels |= (Channel(f"L3-1{i}", port=octave1.ports(i)) for i in range(1, 5)) - channels |= Channel("L3-15", port=octave3.ports(1)) + channels |= ( + InstrumentChannel(f"L3-1{i}", port=octave1.ports(i)) for i in range(1, 5) + ) + channels |= InstrumentChannel("L3-15", port=octave3.ports(1)) # flux - channels |= (Channel(f"L4-{i}", port=opxs[1].ports(i)) for i in range(1, 6)) + channels |= ( + InstrumentChannel(f"L4-{i}", port=opxs[1].ports(i)) for i in range(1, 6) + ) # TWPA channels |= "L4-26" diff --git a/tests/dummy_qrc/rfsoc/platform.py b/tests/dummy_qrc/rfsoc/platform.py index 48082cda01..ab42604ea7 100644 --- a/tests/dummy_qrc/rfsoc/platform.py +++ b/tests/dummy_qrc/rfsoc/platform.py @@ -1,7 +1,7 @@ import pathlib -from qibolab.channels import Channel, ChannelMap from qibolab.instruments.erasynth import ERA +from qibolab.instruments.instrument_channel import ChannelMap, InstrumentChannel from qibolab.instruments.rfsoc import RFSoC from qibolab.instruments.rohde_schwarz import SGS100A from qibolab.platform import Platform @@ -25,10 +25,12 @@ def create(): # Create channel objects and map to instrument controllers channels = ChannelMap() - channels |= Channel("L3-18_ro", port=controller.ports(0)) # readout (DAC) - channels |= Channel("L2-RO", port=controller.ports(0)) # feedback (readout DAC) - channels |= Channel("L3-18_qd", port=controller.ports(1)) # drive - channels |= Channel("L2-22_qf", port=controller.ports(2)) # flux + channels |= InstrumentChannel("L3-18_ro", port=controller.ports(0)) # readout (DAC) + channels |= InstrumentChannel( + "L2-RO", port=controller.ports(0) + ) # feedback (readout DAC) + channels |= InstrumentChannel("L3-18_qd", port=controller.ports(1)) # drive + channels |= InstrumentChannel("L2-22_qf", port=controller.ports(2)) # flux lo_twpa = SGS100A("twpa_a", "192.168.0.32") lo_era = ERA("ErasynthLO", "192.168.0.212", ethernet=True) diff --git a/tests/dummy_qrc/zurich/platform.py b/tests/dummy_qrc/zurich/platform.py index b9254813e1..10ec6eb903 100644 --- a/tests/dummy_qrc/zurich/platform.py +++ b/tests/dummy_qrc/zurich/platform.py @@ -6,8 +6,8 @@ from laboneq.simple import DeviceSetup from qibolab import Platform -from qibolab.channels import Channel, ChannelMap from qibolab.instruments.dummy import DummyLocalOscillator as LocalOscillator +from qibolab.instruments.instrument_channel import ChannelMap, InstrumentChannel from qibolab.instruments.zhinst import Zurich from qibolab.kernels import Kernels from qibolab.serialize import ( @@ -90,16 +90,16 @@ def create(): # Create channel objects and map controllers channels = ChannelMap() # feedback - channels |= Channel( + channels |= InstrumentChannel( "L2-7", port=controller.ports(("device_shfqc", "[QACHANNELS/0/INPUT]")) ) # readout - channels |= Channel( + channels |= InstrumentChannel( "L3-31", port=controller.ports(("device_shfqc", "[QACHANNELS/0/OUTPUT]")) ) # drive channels |= ( - Channel( + InstrumentChannel( f"L4-{i}", port=controller.ports(("device_shfqc", f"SGCHANNELS/{i-5}/OUTPUT")), ) @@ -107,17 +107,23 @@ def create(): ) # flux qubits (CAREFUL WITH THIS !!!) channels |= ( - Channel(f"L4-{i}", port=controller.ports(("device_hdawg", f"SIGOUTS/{i-6}"))) + InstrumentChannel( + f"L4-{i}", port=controller.ports(("device_hdawg", f"SIGOUTS/{i - 6}")) + ) for i in range(6, 11) ) # flux couplers channels |= ( - Channel(f"L4-{i}", port=controller.ports(("device_hdawg", f"SIGOUTS/{i-11+5}"))) + InstrumentChannel( + f"L4-{i}", port=controller.ports(("device_hdawg", f"SIGOUTS/{i - 11 + 5}")) + ) for i in range(11, 14) ) - channels |= Channel("L4-14", port=controller.ports(("device_hdawg2", "SIGOUTS/0"))) + channels |= InstrumentChannel( + "L4-14", port=controller.ports(("device_hdawg2", "SIGOUTS/0")) + ) # TWPA pump(EraSynth) - channels |= Channel("L3-32") + channels |= InstrumentChannel("L3-32") # SHFQC # Sets the maximal Range of the Signal Output power. diff --git a/tests/test_channels.py b/tests/test_channels.py index ea16b14371..6c443f5c1f 100644 --- a/tests/test_channels.py +++ b/tests/test_channels.py @@ -1,16 +1,16 @@ import pytest -from qibolab.channels import Channel, ChannelMap from qibolab.instruments.dummy import DummyPort +from qibolab.instruments.instrument_channel import ChannelMap, InstrumentChannel def test_channel_init(): - channel = Channel("L1-test") + channel = InstrumentChannel("L1-test") assert channel.name == "L1-test" def test_channel_errors(): - channel = Channel("L1-test", port=DummyPort("test")) + channel = InstrumentChannel("L1-test", port=DummyPort("test")) channel.offset = 0.1 channel.filter = {} # attempt to set bias higher than the allowed value @@ -23,8 +23,8 @@ def test_channel_map_add(): channels = ChannelMap().add("a", "b") assert "a" in channels assert "b" in channels - assert isinstance(channels["a"], Channel) - assert isinstance(channels["b"], Channel) + assert isinstance(channels["a"], InstrumentChannel) + assert isinstance(channels["b"], InstrumentChannel) assert channels["a"].name == "a" assert channels["b"].name == "b" @@ -33,8 +33,8 @@ def test_channel_map_setitem(): channels = ChannelMap() with pytest.raises(TypeError): channels["c"] = "test" - channels["c"] = Channel("c") - assert isinstance(channels["c"], Channel) + channels["c"] = InstrumentChannel("c") + assert isinstance(channels["c"], InstrumentChannel) def test_channel_map_union(): @@ -43,7 +43,7 @@ def test_channel_map_union(): channels = channels1 | channels2 for name in ["a", "b", "c", "d"]: assert name in channels - assert isinstance(channels[name], Channel) + assert isinstance(channels[name], InstrumentChannel) assert channels[name].name == name assert "a" not in channels2 assert "b" not in channels2 @@ -56,7 +56,7 @@ def test_channel_map_union_update(): channels |= ChannelMap().add("c", "d") for name in ["a", "b", "c", "d"]: assert name in channels - assert isinstance(channels[name], Channel) + assert isinstance(channels[name], InstrumentChannel) assert channels[name].name == name From 86bf15056b36117eac0469cb6c10900cd9788c24 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Fri, 5 Apr 2024 17:55:02 +0400 Subject: [PATCH 0235/1006] convert PulseSequence to dict and simplify --- src/qibolab/pulses/sequence.py | 158 +++------------------------------ 1 file changed, 14 insertions(+), 144 deletions(-) diff --git a/src/qibolab/pulses/sequence.py b/src/qibolab/pulses/sequence.py index b48cb62cda..a21eeb0bc4 100644 --- a/src/qibolab/pulses/sequence.py +++ b/src/qibolab/pulses/sequence.py @@ -2,158 +2,28 @@ from collections import defaultdict -from .pulse import PulseType +class PulseSequence(defaultdict): + """Synchronized sequence of pulses across multiple channels. -class PulseSequence(list): - """A collection of scheduled pulses. - - A quantum circuit can be translated into a set of scheduled pulses - that implement the circuit gates. This class contains many - supporting fuctions to facilitate the creation and manipulation of - these collections of pulses. None of the methods of PulseSequence - modify any of the properties of its pulses. + The keys are names of channels, and the values are lists of pulses + and delays """ - def __add__(self, other): - """Return self+value.""" - return type(self)(super().__add__(other)) - - def __mul__(self, other): - """Return self*value.""" - return type(self)(super().__mul__(other)) - - def __repr__(self): - """Return repr(self).""" - return f"{type(self).__name__}({super().__repr__()})" - - def copy(self): - """Return a shallow copy of the sequence.""" - return type(self)(super().copy()) - - @property - def ro_pulses(self): - """A new sequence containing only its readout pulses.""" - new_pc = PulseSequence() - for pulse in self: - if pulse.type == PulseType.READOUT: - new_pc.append(pulse) - return new_pc - - @property - def qd_pulses(self): - """A new sequence containing only its qubit drive pulses.""" - new_pc = PulseSequence() - for pulse in self: - if pulse.type == PulseType.DRIVE: - new_pc.append(pulse) - return new_pc - - @property - def qf_pulses(self): - """A new sequence containing only its qubit flux pulses.""" - new_pc = PulseSequence() - for pulse in self: - if pulse.type == PulseType.FLUX: - new_pc.append(pulse) - return new_pc - - @property - def cf_pulses(self): - """A new sequence containing only its coupler flux pulses.""" - new_pc = PulseSequence() - for pulse in self: - if pulse.type is PulseType.COUPLERFLUX: - new_pc.append(pulse) - return new_pc - - def get_channel_pulses(self, *channels): - """Return a new sequence containing the pulses on some channels.""" - new_pc = PulseSequence() - for pulse in self: - if pulse.channel in channels: - new_pc.append(pulse) - return new_pc - - def get_qubit_pulses(self, *qubits): - """Return a new sequence containing the pulses on some qubits.""" - new_pc = PulseSequence() - for pulse in self: - if pulse.type is not PulseType.COUPLERFLUX: - if pulse.qubit in qubits: - new_pc.append(pulse) - return new_pc - - def coupler_pulses(self, *couplers): - """Return a new sequence containing the pulses on some couplers.""" - new_pc = PulseSequence() - for pulse in self: - if pulse.type is not PulseType.COUPLERFLUX: - if pulse.qubit in couplers: - new_pc.append(pulse) - return new_pc - - @property - def pulses_per_channel(self): - """Return a dictionary with the sequence per channel.""" - sequences = defaultdict(type(self)) - for pulse in self: - sequences[pulse.channel].append(pulse) - return sequences + def __init__(self): + super().__init__(list) @property def duration(self) -> int: """The time when the last pulse of the sequence finishes.""" - channel_pulses = self.pulses_per_channel - if len(channel_pulses) == 1: - pulses = next(iter(channel_pulses.values())) - return sum(pulse.duration for pulse in pulses) - return max( - (sequence.duration for sequence in channel_pulses.values()), default=0 - ) - - @property - def channels(self) -> list: - """List containing the channels used by the pulses in the sequence.""" - channels = [] - for pulse in self: - if pulse.channel not in channels: - channels.append(pulse.channel) - return channels - - @property - def qubits(self) -> list: - """The qubits associated with the pulses in the sequence.""" - qubits = [] - for pulse in self: - if not pulse.qubit in qubits: - qubits.append(pulse.qubit) - qubits.sort() - return qubits + def channel_duration(ch: str): + return sum(item.duration for item in self[ch]) - def separate_overlapping_pulses(self): # -> dict((int,int): PulseSequence): - """Separate a sequence of overlapping pulses into a list of non- - overlapping sequences.""" - # This routine separates the pulses of a sequence into non-overlapping sets - # but it does not check if the frequencies of the pulses within a set have the same frequency + return max((channel_duration(ch) for ch in self), default=0) - separated_pulses = [] - for new_pulse in self: - stored = False - for ps in separated_pulses: - overlaps = False - for existing_pulse in ps: - if ( - new_pulse.start < existing_pulse.finish - and new_pulse.finish > existing_pulse.start - ): - overlaps = True - break - if not overlaps: - ps.append(new_pulse) - stored = True - break - if not stored: - separated_pulses.append(PulseSequence([new_pulse])) - return separated_pulses + def __add__(self, other: "PulseSequence") -> "PulseSequence": + """Create a PulseSequence which is self + necessary delays to + synchronize channels + other.""" + # TODO: implement + ... From 369476562f49b11d4d6bd8e12c7287fcf29a4bd0 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Fri, 5 Apr 2024 18:19:06 +0400 Subject: [PATCH 0236/1006] accept channel configs as part of execution requests --- src/qibolab/platform/platform.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 3fbdfe147c..4ae25f8cdc 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -8,6 +8,7 @@ import networkx as nx from qibo.config import log, raise_error +from qibolab.channel_config import ChannelConfig from qibolab.couplers import Coupler from qibolab.execution_parameters import ExecutionParameters from qibolab.instruments.abstract import Controller, Instrument, InstrumentId From 23dade2e8a7a694baf00ce7fe17ce99bdc1c017c Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Fri, 5 Apr 2024 18:29:19 +0400 Subject: [PATCH 0237/1006] Instead of qubits and couplers, define sweepers in terms of channels --- src/qibolab/sweeper.py | 33 +++++++++++++-------------------- tests/test_dummy.py | 12 ++++++------ tests/test_sweeper.py | 6 +++--- 3 files changed, 22 insertions(+), 29 deletions(-) diff --git a/src/qibolab/sweeper.py b/src/qibolab/sweeper.py index 4a49bc63fc..bc95e09460 100644 --- a/src/qibolab/sweeper.py +++ b/src/qibolab/sweeper.py @@ -38,7 +38,7 @@ class SweeperType(Enum): OFFSET = operator.add -QubitParameter = {Parameter.bias, Parameter.attenuation, Parameter.gain} +ChannelParameter = {Parameter.bias, Parameter.attenuation, Parameter.gain} @dataclass @@ -69,12 +69,12 @@ class Sweeper: platform.execute([sequence], ExecutionParameters(), [[sweeper]]) Args: - parameter (`qibolab.sweeper.Parameter`): parameter to be swept, possible choices are frequency, attenuation, amplitude, current and gain. - _values (np.ndarray): sweep range. If the parameter of the sweep is a pulse parameter, if the sweeper type is not ABSOLUTE, the base value + parameter: parameter to be swept, possible choices are frequency, attenuation, amplitude, current and gain. + values: sweep range. If the parameter of the sweep is a pulse parameter, if the sweeper type is not ABSOLUTE, the base value will be taken from the runcard pulse parameters. If the sweep parameter is Bias, the base value will be the sweetspot of the qubits. - pulses (list) : list of `qibolab.pulses.Pulse` to be swept (optional). - qubits (list): list of `qibolab.platforms.abstract.Qubit` to be swept (optional). - type (SweeperType): can be ABSOLUTE (the sweeper range is swept directly), + pulses : list of `qibolab.pulses.Pulse` to be swept. + channels: list of channel names for which the parameter should be swept. + type: can be ABSOLUTE (the sweeper range is swept directly), FACTOR (sweeper values are multiplied by base value), OFFSET (sweeper values are added to base value) """ @@ -82,28 +82,21 @@ class Sweeper: parameter: Parameter values: npt.NDArray pulses: Optional[list] = None - qubits: Optional[list] = None - couplers: Optional[list] = None + channels: Optional[list] = None type: Optional[SweeperType] = SweeperType.ABSOLUTE def __post_init__(self): - if ( - self.pulses is not None - and self.qubits is not None - and self.couplers is not None - ): - raise ValueError("Cannot use a sweeper on both pulses and qubits.") - if self.pulses is not None and self.parameter in QubitParameter: + if self.pulses is not None and self.channels is not None: + raise ValueError("Cannot use a sweeper on both pulses and channels.") + if self.pulses is not None and self.parameter in ChannelParameter: raise ValueError( - f"Cannot sweep {self.parameter} without specifying qubits or couplers." + f"Cannot sweep {self.parameter} without specifying channels." ) - if self.parameter not in QubitParameter and ( - self.qubits is not None or self.couplers is not None - ): + if self.parameter not in ChannelParameter and (self.channels is not None): raise ValueError( f"Cannot sweep {self.parameter} without specifying pulses." ) - if self.pulses is None and self.qubits is None and self.couplers is None: + if self.pulses is None and self.channels is None: raise ValueError( "Cannot use a sweeper without specifying pulses, qubits or couplers." ) diff --git a/tests/test_dummy.py b/tests/test_dummy.py index de37612a38..68fd423d5a 100644 --- a/tests/test_dummy.py +++ b/tests/test_dummy.py @@ -5,7 +5,7 @@ from qibolab.pulses import Delay, GaussianSquare, Pulse, PulseSequence, PulseType from qibolab.qubits import QubitPair from qibolab.serialize_ import replace -from qibolab.sweeper import Parameter, QubitParameter, Sweeper +from qibolab.sweeper import ChannelParameter, Parameter, Sweeper SWEPT_POINTS = 5 PLATFORM_NAMES = ["dummy", "dummy_couplers"] @@ -151,7 +151,7 @@ def test_dummy_single_sweep_coupler( else: parameter_range = np.random.randint(SWEPT_POINTS, size=SWEPT_POINTS) sequence.append(ro_pulse) - if parameter in QubitParameter: + if parameter in ChannelParameter: sweeper = Sweeper(parameter, parameter_range, couplers=[platform.couplers[0]]) else: sweeper = Sweeper(parameter, parameter_range, pulses=[coupler_pulse]) @@ -197,7 +197,7 @@ def test_dummy_single_sweep(name, fast_reset, parameter, average, acquisition, n else: parameter_range = np.random.randint(SWEPT_POINTS, size=SWEPT_POINTS) sequence.append(pulse) - if parameter in QubitParameter: + if parameter in ChannelParameter: sweeper = Sweeper(parameter, parameter_range, qubits=[platform.qubits[0]]) else: sweeper = Sweeper(parameter, parameter_range, pulses=[pulse]) @@ -255,11 +255,11 @@ def test_dummy_double_sweep(name, parameter1, parameter2, average, acquisition, else np.random.randint(SWEPT_POINTS, size=SWEPT_POINTS) ) - if parameter1 in QubitParameter: + if parameter1 in ChannelParameter: sweeper1 = Sweeper(parameter1, parameter_range_1, qubits=[platform.qubits[0]]) else: sweeper1 = Sweeper(parameter1, parameter_range_1, pulses=[ro_pulse]) - if parameter2 in QubitParameter: + if parameter2 in ChannelParameter: sweeper2 = Sweeper(parameter2, parameter_range_2, qubits=[platform.qubits[0]]) else: sweeper2 = Sweeper(parameter2, parameter_range_2, pulses=[pulse]) @@ -314,7 +314,7 @@ def test_dummy_single_sweep_multiplex(name, parameter, average, acquisition, nsh else np.random.randint(SWEPT_POINTS, size=SWEPT_POINTS) ) - if parameter in QubitParameter: + if parameter in ChannelParameter: sweeper1 = Sweeper( parameter, parameter_range, diff --git a/tests/test_sweeper.py b/tests/test_sweeper.py index b4b660f996..1ad1bb2aa6 100644 --- a/tests/test_sweeper.py +++ b/tests/test_sweeper.py @@ -3,7 +3,7 @@ from qibolab.pulses import Pulse, Rectangular from qibolab.qubits import Qubit -from qibolab.sweeper import Parameter, QubitParameter, Sweeper +from qibolab.sweeper import ChannelParameter, Parameter, Sweeper @pytest.mark.parametrize("parameter", Parameter) @@ -19,7 +19,7 @@ def test_sweeper_pulses(parameter): parameter_range = np.random.rand(10) else: parameter_range = np.random.randint(10, size=10) - if parameter in QubitParameter: + if parameter in ChannelParameter: with pytest.raises(ValueError): sweeper = Sweeper(parameter, parameter_range, [pulse]) else: @@ -31,7 +31,7 @@ def test_sweeper_pulses(parameter): def test_sweeper_qubits(parameter): qubit = Qubit(0) parameter_range = np.random.randint(10, size=10) - if parameter in QubitParameter: + if parameter in ChannelParameter: sweeper = Sweeper(parameter, parameter_range, qubits=[qubit]) assert sweeper.parameter is parameter else: From a1cd29d2c895d53ede55bc69437edfdcb5c3dd30 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Wed, 17 Apr 2024 17:08:57 +0400 Subject: [PATCH 0238/1006] separate channel from channel config --- src/qibolab/channel.py | 26 ++++++++++++++++++++++++++ src/qibolab/channel_config.py | 18 ------------------ src/qibolab/couplers.py | 2 +- src/qibolab/qubits.py | 2 +- 4 files changed, 28 insertions(+), 20 deletions(-) create mode 100644 src/qibolab/channel.py diff --git a/src/qibolab/channel.py b/src/qibolab/channel.py new file mode 100644 index 0000000000..e34aaf3239 --- /dev/null +++ b/src/qibolab/channel.py @@ -0,0 +1,26 @@ +from dataclasses import dataclass +from enum import Enum, auto + +""" +Channel is an abstract concept that defines an interface in front of various instrument drivers in qibolab, without +exposing instrument specific implementation details. For the users of this interface a quantum computer is just a +predefined set of channels where they can send signals or receive signals/data from. Users do not have control over what +channels exist - it is determined by the setup of a certain quantum computer. However, users have control over some +configuration parameters. A typical use case is to configure some channels with desired parameters and request an +execution of a synchronized pulse sequence that implements a certain computation or a calibration experiment. +""" + + +class ChannelType(Enum): + DC = auto() + IQ = auto() + DIRECT_IQ = auto() + ACQUISITION = auto() + + +@dataclass(frozen=True) +class Channel: + """A channel is represented by its unique name, and the type.""" + + name: str + type: ChannelType diff --git a/src/qibolab/channel_config.py b/src/qibolab/channel_config.py index 6c71c8ad43..8f5e3d29a0 100644 --- a/src/qibolab/channel_config.py +++ b/src/qibolab/channel_config.py @@ -3,15 +3,6 @@ from .execution_parameters import AcquisitionType -""" -Channel is an abstract concept that defines an interface in front of various instrument drivers in qibolab, without -exposing instrument specific implementation details. For the users of this interface a quantum computer is just a -predefined set of channels where they can send signals or receive signals/data from. Users do not have control over what -channels exist - it is determined by the setup of a certain quantum computer. However, users have control over some -configuration parameters. A typical use case is to configure some channels with desired parameters and request an -execution of a synchronized pulse sequence that implements a certain computation or a calibration experiment. -""" - @dataclass class DCChannelConfig: @@ -63,15 +54,6 @@ class AcquisitionChannelConfig: type: AcquisitionType -@dataclass -class Channel: - """A channel is represented by its unique name, and the type of - configuration that should be specified for it.""" - - name: str - config_type: type - - ChannelConfig = Union[ DCChannelConfig, IQChannelConfig, DirectIQChannelConfig, AcquisitionChannelConfig ] diff --git a/src/qibolab/couplers.py b/src/qibolab/couplers.py index 1dec4bd2a7..716266591c 100644 --- a/src/qibolab/couplers.py +++ b/src/qibolab/couplers.py @@ -1,7 +1,7 @@ from dataclasses import dataclass, field from typing import Dict, Optional, Union -from qibolab.channel_config import Channel +from qibolab.channel import Channel from qibolab.native import SingleQubitNatives QubitId = Union[str, int] diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index 9027b3f472..75ede0433e 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -3,7 +3,7 @@ import numpy as np -from qibolab.channel_config import Channel +from qibolab.channel import Channel from qibolab.couplers import Coupler from qibolab.native import SingleQubitNatives, TwoQubitNatives From bf08549ab027d81e7354e70a9a06193b22a44bfc Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Wed, 17 Apr 2024 17:21:51 +0400 Subject: [PATCH 0239/1006] Update channel configs --- src/qibolab/channel_config.py | 90 ++++++++++++++++++++++------------- 1 file changed, 56 insertions(+), 34 deletions(-) diff --git a/src/qibolab/channel_config.py b/src/qibolab/channel_config.py index 8f5e3d29a0..1044718c83 100644 --- a/src/qibolab/channel_config.py +++ b/src/qibolab/channel_config.py @@ -1,59 +1,81 @@ from dataclasses import dataclass -from typing import Union +from typing import Optional, Union from .execution_parameters import AcquisitionType +""" +Channel is an abstract concept that defines an interface in front of various instrument drivers in qibolab, without +exposing instrument specific implementation details. For the users of this interface a quantum computer is just a +predefined set of channels where they can send signals or receive signals/data from. Users do not have control over what +channels exist - it is determined by the setup of a certain quantum computer. However, users have control over some +configuration parameters. A typical use case is to configure some channels with desired parameters and request an +execution of a synchronized pulse sequence that implements a certain computation or a calibration experiment. +""" -@dataclass + +@dataclass(frozen=True) class DCChannelConfig: """Configuration for a channel that can be used to send DC pulses (i.e. - just envelopes without modulation on any frequency)""" + just envelopes without modulation).""" - bias: float - """DC bias/offset of the channel.""" + offset: float + """DC offset/bias of the channel.""" -@dataclass -class IQChannelConfig: - """Configuration for an IQ channel. This is used for IQ channels that can - generate requested signals by first generating them at an intermediate - frequency, and then mixing it with a local oscillator (LO) to upconvert to - the target carrier frequency. - - For this type of IQ channels users typically - 1. want to have control over the LO frequency. - 2. need to be able to calibrate parameters related to the mixer imperfections. - Mixers typically have some imbalance in the way they treat the I and Q components - of the signal, and to compensate for it users typically need to calibrate the - compensation parameters and provide them as channel configuration. - """ +@dataclass(frozen=True) +class LOConfig: + """Configuration for a local oscillator.""" frequency: float - """The carrier frequency of the channel.""" - lo_frequency: float - """The frequency of the local oscillator.""" - mixer_correction_scale: float = 0.0 - """The relative amplitude scale/factor of the q channel.""" - mixer_correction_phase: float = 0.0 - """The phase offset of the q channel of the LO.""" + power: float + + +@dataclass(frozen=True) +class IQMixerConfig: + """Configuration for IQ mixer. + + Mixers usually have various imperfections, and one needs to + compensate for them. This class holds the compensation + configuration. + """ + + offset_i: float = 0.0 + """DC offset for the I component.""" + offset_q: float = 0.0 + """DC offset for the Q component.""" + scale_q: float = 1.0 + """The relative amplitude scale/factor of the q channel, to account for I-Q + amplitude imbalance.""" + phase_q: float = 0.0 + """The phase offset of the q channel, to account for I-Q phase + imbalance.""" -@dataclass -class DirectIQChannelConfig: - """Configuration for an IQ channel that directly generates signals at - necessary carrier frequency.""" +@dataclass(frozen=True) +class IQChannelConfig: + """Configuration for an IQ channel.""" frequency: float """The carrier frequency of the channel.""" + lo_config: Optional[LOConfig] = None + """Configuration for the corresponding LO. + + None if the channel does not use an LO. + """ + mixer_config: Optional[IQMixerConfig] = None + """Configuration for the corresponding IQ mixer. + + None if the channel does not feature a mixer. + """ -@dataclass +@dataclass(frozen=True) class AcquisitionChannelConfig: """Configuration for acquisition channels.""" type: AcquisitionType + twpa_frequency: float + twpa_power: float -ChannelConfig = Union[ - DCChannelConfig, IQChannelConfig, DirectIQChannelConfig, AcquisitionChannelConfig -] +ChannelConfig = Union[DCChannelConfig, IQChannelConfig, AcquisitionChannelConfig] From bd7532f6fab13c63b5de38e3705879a755c58975 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Mon, 22 Apr 2024 12:25:06 +0400 Subject: [PATCH 0240/1006] remove channel.py --- src/qibolab/channel.py | 26 -------------------------- src/qibolab/couplers.py | 2 +- src/qibolab/qubits.py | 2 +- 3 files changed, 2 insertions(+), 28 deletions(-) delete mode 100644 src/qibolab/channel.py diff --git a/src/qibolab/channel.py b/src/qibolab/channel.py deleted file mode 100644 index e34aaf3239..0000000000 --- a/src/qibolab/channel.py +++ /dev/null @@ -1,26 +0,0 @@ -from dataclasses import dataclass -from enum import Enum, auto - -""" -Channel is an abstract concept that defines an interface in front of various instrument drivers in qibolab, without -exposing instrument specific implementation details. For the users of this interface a quantum computer is just a -predefined set of channels where they can send signals or receive signals/data from. Users do not have control over what -channels exist - it is determined by the setup of a certain quantum computer. However, users have control over some -configuration parameters. A typical use case is to configure some channels with desired parameters and request an -execution of a synchronized pulse sequence that implements a certain computation or a calibration experiment. -""" - - -class ChannelType(Enum): - DC = auto() - IQ = auto() - DIRECT_IQ = auto() - ACQUISITION = auto() - - -@dataclass(frozen=True) -class Channel: - """A channel is represented by its unique name, and the type.""" - - name: str - type: ChannelType diff --git a/src/qibolab/couplers.py b/src/qibolab/couplers.py index 716266591c..cd384ecf4b 100644 --- a/src/qibolab/couplers.py +++ b/src/qibolab/couplers.py @@ -1,7 +1,7 @@ from dataclasses import dataclass, field from typing import Dict, Optional, Union -from qibolab.channel import Channel +from qibolab.channels import Channel from qibolab.native import SingleQubitNatives QubitId = Union[str, int] diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index 75ede0433e..41142af981 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -3,7 +3,7 @@ import numpy as np -from qibolab.channel import Channel +from qibolab.channels import Channel from qibolab.couplers import Coupler from qibolab.native import SingleQubitNatives, TwoQubitNatives From 8b205e204f70587fc1344b71d0e43f2eaadb6ce3 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Mon, 22 Apr 2024 12:29:09 +0400 Subject: [PATCH 0241/1006] Revert "rename Channel to InstrumentChannel" This reverts commit e426559941f4dcf9c2cc3e5b68466fbb31017829. --- .../instrument_channel.py => channels.py} | 10 +++--- src/qibolab/dummy/platform.py | 15 ++++---- src/qibolab/instruments/qm/sweepers.py | 2 +- tests/dummy_qrc/qblox/platform.py | 36 +++++++++---------- tests/dummy_qrc/qm/platform.py | 24 +++++-------- tests/dummy_qrc/qm_octave/platform.py | 20 +++++------ tests/dummy_qrc/rfsoc/platform.py | 12 +++---- tests/dummy_qrc/zurich/platform.py | 22 +++++------- tests/test_channels.py | 18 +++++----- 9 files changed, 66 insertions(+), 93 deletions(-) rename src/qibolab/{instruments/instrument_channel.py => channels.py} (94%) diff --git a/src/qibolab/instruments/instrument_channel.py b/src/qibolab/channels.py similarity index 94% rename from src/qibolab/instruments/instrument_channel.py rename to src/qibolab/channels.py index 3ee56b09bf..b4a9164780 100644 --- a/src/qibolab/instruments/instrument_channel.py +++ b/src/qibolab/channels.py @@ -20,7 +20,7 @@ def check_max_offset(offset, max_offset): @dataclass -class InstrumentChannel: +class Channel: """Representation of physical wire connection (channel).""" name: str @@ -122,7 +122,7 @@ class ChannelMap: specifying the names. """ - _channels: Dict[str, InstrumentChannel] = field(default_factory=dict) + _channels: Dict[str, Channel] = field(default_factory=dict) def add(self, *items): """Add multiple items to the channel map. @@ -132,17 +132,17 @@ def add(self, *items): is created and added to the channel map. """ for item in items: - if isinstance(item, InstrumentChannel): + if isinstance(item, Channel): self[item.name] = item else: - self[item] = InstrumentChannel(item) + self[item] = Channel(item) return self def __getitem__(self, name): return self._channels[name] def __setitem__(self, name, channel): - if not isinstance(channel, InstrumentChannel): + if not isinstance(channel, Channel): raise_error( TypeError, f"Cannot add channel of type {type(channel)} to ChannelMap." ) diff --git a/src/qibolab/dummy/platform.py b/src/qibolab/dummy/platform.py index 6f765469f0..614f8f6dcf 100644 --- a/src/qibolab/dummy/platform.py +++ b/src/qibolab/dummy/platform.py @@ -1,8 +1,8 @@ import itertools import pathlib +from qibolab.channels import Channel, ChannelMap from qibolab.instruments.dummy import DummyInstrument, DummyLocalOscillator -from qibolab.instruments.instrument_channel import ChannelMap, InstrumentChannel from qibolab.kernels import Kernels from qibolab.platform import Platform from qibolab.serialize import load_qubits, load_runcard, load_settings @@ -47,21 +47,18 @@ def create_dummy(with_couplers: bool = True): # Create channel objects nqubits = runcard["nqubits"] channels = ChannelMap() - channels |= InstrumentChannel("readout", port=instrument.ports("readout")) + channels |= Channel("readout", port=instrument.ports("readout")) channels |= ( - InstrumentChannel(f"drive-{i}", port=instrument.ports(f"drive-{i}")) + Channel(f"drive-{i}", port=instrument.ports(f"drive-{i}")) for i in range(nqubits) ) channels |= ( - InstrumentChannel(f"flux-{i}", port=instrument.ports(f"flux-{i}")) - for i in range(nqubits) + Channel(f"flux-{i}", port=instrument.ports(f"flux-{i}")) for i in range(nqubits) ) - channels |= InstrumentChannel("twpa", port=None) + channels |= Channel("twpa", port=None) if with_couplers: channels |= ( - InstrumentChannel( - f"flux_coupler-{c}", port=instrument.ports(f"flux_coupler-{c}") - ) + Channel(f"flux_coupler-{c}", port=instrument.ports(f"flux_coupler-{c}")) for c in itertools.chain(range(0, 2), range(3, 5)) ) channels["readout"].attenuation = 0 diff --git a/src/qibolab/instruments/qm/sweepers.py b/src/qibolab/instruments/qm/sweepers.py index 401de51e49..e745d6bde8 100644 --- a/src/qibolab/instruments/qm/sweepers.py +++ b/src/qibolab/instruments/qm/sweepers.py @@ -6,7 +6,7 @@ from qm.qua import declare, fixed, for_ from qualang_tools.loops import from_array -from qibolab.instruments.instrument_channel import check_max_offset +from qibolab.channels import check_max_offset from qibolab.instruments.qm.sequence import BakedPulse from qibolab.pulses import PulseType from qibolab.sweeper import Parameter diff --git a/tests/dummy_qrc/qblox/platform.py b/tests/dummy_qrc/qblox/platform.py index 2b6ec081a1..a60a600d8f 100644 --- a/tests/dummy_qrc/qblox/platform.py +++ b/tests/dummy_qrc/qblox/platform.py @@ -1,6 +1,6 @@ import pathlib -from qibolab.instruments.instrument_channel import ChannelMap, InstrumentChannel +from qibolab.channels import Channel, ChannelMap from qibolab.instruments.qblox.cluster_qcm_bb import QcmBb from qibolab.instruments.qblox.cluster_qcm_rf import QcmRf from qibolab.instruments.qblox.cluster_qrm_rf import QrmRf @@ -50,29 +50,25 @@ def create(): # Create channel objects channels = ChannelMap() # Readout - channels |= InstrumentChannel(name="L3-25_a", port=modules["qrm_rf_a"].ports("o1")) - channels |= InstrumentChannel(name="L3-25_b", port=modules["qrm_rf_b"].ports("o1")) + channels |= Channel(name="L3-25_a", port=modules["qrm_rf_a"].ports("o1")) + channels |= Channel(name="L3-25_b", port=modules["qrm_rf_b"].ports("o1")) # Feedback - channels |= InstrumentChannel( - name="L2-5_a", port=modules["qrm_rf_a"].ports("i1", out=False) - ) - channels |= InstrumentChannel( - name="L2-5_b", port=modules["qrm_rf_b"].ports("i1", out=False) - ) + channels |= Channel(name="L2-5_a", port=modules["qrm_rf_a"].ports("i1", out=False)) + channels |= Channel(name="L2-5_b", port=modules["qrm_rf_b"].ports("i1", out=False)) # Drive - channels |= InstrumentChannel(name="L3-15", port=modules["qcm_rf0"].ports("o1")) - channels |= InstrumentChannel(name="L3-11", port=modules["qcm_rf0"].ports("o2")) - channels |= InstrumentChannel(name="L3-12", port=modules["qcm_rf1"].ports("o1")) - channels |= InstrumentChannel(name="L3-13", port=modules["qcm_rf1"].ports("o2")) - channels |= InstrumentChannel(name="L3-14", port=modules["qcm_rf2"].ports("o1")) + channels |= Channel(name="L3-15", port=modules["qcm_rf0"].ports("o1")) + channels |= Channel(name="L3-11", port=modules["qcm_rf0"].ports("o2")) + channels |= Channel(name="L3-12", port=modules["qcm_rf1"].ports("o1")) + channels |= Channel(name="L3-13", port=modules["qcm_rf1"].ports("o2")) + channels |= Channel(name="L3-14", port=modules["qcm_rf2"].ports("o1")) # Flux - channels |= InstrumentChannel(name="L4-5", port=modules["qcm_bb0"].ports("o1")) - channels |= InstrumentChannel(name="L4-1", port=modules["qcm_bb0"].ports("o2")) - channels |= InstrumentChannel(name="L4-2", port=modules["qcm_bb0"].ports("o3")) - channels |= InstrumentChannel(name="L4-3", port=modules["qcm_bb0"].ports("o4")) - channels |= InstrumentChannel(name="L4-4", port=modules["qcm_bb1"].ports("o1")) + channels |= Channel(name="L4-5", port=modules["qcm_bb0"].ports("o1")) + channels |= Channel(name="L4-1", port=modules["qcm_bb0"].ports("o2")) + channels |= Channel(name="L4-2", port=modules["qcm_bb0"].ports("o3")) + channels |= Channel(name="L4-3", port=modules["qcm_bb0"].ports("o4")) + channels |= Channel(name="L4-4", port=modules["qcm_bb1"].ports("o1")) # TWPA - channels |= InstrumentChannel(name="L3-28", port=None) + channels |= Channel(name="L3-28", port=None) channels["L3-28"].local_oscillator = twpa_pump # create qubit objects diff --git a/tests/dummy_qrc/qm/platform.py b/tests/dummy_qrc/qm/platform.py index cef324b199..40e2db638f 100644 --- a/tests/dummy_qrc/qm/platform.py +++ b/tests/dummy_qrc/qm/platform.py @@ -1,7 +1,7 @@ import pathlib +from qibolab.channels import Channel, ChannelMap from qibolab.instruments.dummy import DummyLocalOscillator as LocalOscillator -from qibolab.instruments.instrument_channel import ChannelMap, InstrumentChannel from qibolab.instruments.qm import OPXplus, QMController from qibolab.platform import Platform from qibolab.serialize import ( @@ -28,33 +28,25 @@ def create(): # Create channel objects and map controllers to channels channels = ChannelMap() # readout - channels |= InstrumentChannel( - "L3-25_a", port=controller.ports((("con1", 10), ("con1", 9))) - ) - channels |= InstrumentChannel( - "L3-25_b", port=controller.ports((("con2", 10), ("con2", 9))) - ) + channels |= Channel("L3-25_a", port=controller.ports((("con1", 10), ("con1", 9)))) + channels |= Channel("L3-25_b", port=controller.ports((("con2", 10), ("con2", 9)))) # feedback - channels |= InstrumentChannel( + channels |= Channel( "L2-5_a", port=controller.ports((("con1", 2), ("con1", 1)), output=False) ) - channels |= InstrumentChannel( + channels |= Channel( "L2-5_b", port=controller.ports((("con2", 2), ("con2", 1)), output=False) ) # drive channels |= ( - InstrumentChannel( + Channel( f"L3-1{i}", port=controller.ports((("con1", 2 * i), ("con1", 2 * i - 1))) ) for i in range(1, 5) ) - channels |= InstrumentChannel( - "L3-15", port=controller.ports((("con3", 2), ("con3", 1))) - ) + channels |= Channel("L3-15", port=controller.ports((("con3", 2), ("con3", 1)))) # flux - channels |= ( - InstrumentChannel(f"L4-{i}", port=opxs[1].ports(i)) for i in range(1, 6) - ) + channels |= (Channel(f"L4-{i}", port=opxs[1].ports(i)) for i in range(1, 6)) # TWPA channels |= "L4-26" diff --git a/tests/dummy_qrc/qm_octave/platform.py b/tests/dummy_qrc/qm_octave/platform.py index f62f8f6936..3d3d307bf3 100644 --- a/tests/dummy_qrc/qm_octave/platform.py +++ b/tests/dummy_qrc/qm_octave/platform.py @@ -1,7 +1,7 @@ import pathlib +from qibolab.channels import Channel, ChannelMap from qibolab.instruments.dummy import DummyLocalOscillator as LocalOscillator -from qibolab.instruments.instrument_channel import ChannelMap, InstrumentChannel from qibolab.instruments.qm import Octave, OPXplus, QMController from qibolab.platform import Platform from qibolab.serialize import ( @@ -36,20 +36,16 @@ def create(runcard_path=RUNCARD): # Create channel objects and map controllers to channels channels = ChannelMap() # readout - channels |= InstrumentChannel("L3-25_a", port=octave1.ports(5)) - channels |= InstrumentChannel("L3-25_b", port=octave2.ports(5)) + channels |= Channel("L3-25_a", port=octave1.ports(5)) + channels |= Channel("L3-25_b", port=octave2.ports(5)) # feedback - channels |= InstrumentChannel("L2-5_a", port=octave1.ports(1, output=False)) - channels |= InstrumentChannel("L2-5_b", port=octave2.ports(1, output=False)) + channels |= Channel("L2-5_a", port=octave1.ports(1, output=False)) + channels |= Channel("L2-5_b", port=octave2.ports(1, output=False)) # drive - channels |= ( - InstrumentChannel(f"L3-1{i}", port=octave1.ports(i)) for i in range(1, 5) - ) - channels |= InstrumentChannel("L3-15", port=octave3.ports(1)) + channels |= (Channel(f"L3-1{i}", port=octave1.ports(i)) for i in range(1, 5)) + channels |= Channel("L3-15", port=octave3.ports(1)) # flux - channels |= ( - InstrumentChannel(f"L4-{i}", port=opxs[1].ports(i)) for i in range(1, 6) - ) + channels |= (Channel(f"L4-{i}", port=opxs[1].ports(i)) for i in range(1, 6)) # TWPA channels |= "L4-26" diff --git a/tests/dummy_qrc/rfsoc/platform.py b/tests/dummy_qrc/rfsoc/platform.py index ab42604ea7..48082cda01 100644 --- a/tests/dummy_qrc/rfsoc/platform.py +++ b/tests/dummy_qrc/rfsoc/platform.py @@ -1,7 +1,7 @@ import pathlib +from qibolab.channels import Channel, ChannelMap from qibolab.instruments.erasynth import ERA -from qibolab.instruments.instrument_channel import ChannelMap, InstrumentChannel from qibolab.instruments.rfsoc import RFSoC from qibolab.instruments.rohde_schwarz import SGS100A from qibolab.platform import Platform @@ -25,12 +25,10 @@ def create(): # Create channel objects and map to instrument controllers channels = ChannelMap() - channels |= InstrumentChannel("L3-18_ro", port=controller.ports(0)) # readout (DAC) - channels |= InstrumentChannel( - "L2-RO", port=controller.ports(0) - ) # feedback (readout DAC) - channels |= InstrumentChannel("L3-18_qd", port=controller.ports(1)) # drive - channels |= InstrumentChannel("L2-22_qf", port=controller.ports(2)) # flux + channels |= Channel("L3-18_ro", port=controller.ports(0)) # readout (DAC) + channels |= Channel("L2-RO", port=controller.ports(0)) # feedback (readout DAC) + channels |= Channel("L3-18_qd", port=controller.ports(1)) # drive + channels |= Channel("L2-22_qf", port=controller.ports(2)) # flux lo_twpa = SGS100A("twpa_a", "192.168.0.32") lo_era = ERA("ErasynthLO", "192.168.0.212", ethernet=True) diff --git a/tests/dummy_qrc/zurich/platform.py b/tests/dummy_qrc/zurich/platform.py index 10ec6eb903..b9254813e1 100644 --- a/tests/dummy_qrc/zurich/platform.py +++ b/tests/dummy_qrc/zurich/platform.py @@ -6,8 +6,8 @@ from laboneq.simple import DeviceSetup from qibolab import Platform +from qibolab.channels import Channel, ChannelMap from qibolab.instruments.dummy import DummyLocalOscillator as LocalOscillator -from qibolab.instruments.instrument_channel import ChannelMap, InstrumentChannel from qibolab.instruments.zhinst import Zurich from qibolab.kernels import Kernels from qibolab.serialize import ( @@ -90,16 +90,16 @@ def create(): # Create channel objects and map controllers channels = ChannelMap() # feedback - channels |= InstrumentChannel( + channels |= Channel( "L2-7", port=controller.ports(("device_shfqc", "[QACHANNELS/0/INPUT]")) ) # readout - channels |= InstrumentChannel( + channels |= Channel( "L3-31", port=controller.ports(("device_shfqc", "[QACHANNELS/0/OUTPUT]")) ) # drive channels |= ( - InstrumentChannel( + Channel( f"L4-{i}", port=controller.ports(("device_shfqc", f"SGCHANNELS/{i-5}/OUTPUT")), ) @@ -107,23 +107,17 @@ def create(): ) # flux qubits (CAREFUL WITH THIS !!!) channels |= ( - InstrumentChannel( - f"L4-{i}", port=controller.ports(("device_hdawg", f"SIGOUTS/{i - 6}")) - ) + Channel(f"L4-{i}", port=controller.ports(("device_hdawg", f"SIGOUTS/{i-6}"))) for i in range(6, 11) ) # flux couplers channels |= ( - InstrumentChannel( - f"L4-{i}", port=controller.ports(("device_hdawg", f"SIGOUTS/{i - 11 + 5}")) - ) + Channel(f"L4-{i}", port=controller.ports(("device_hdawg", f"SIGOUTS/{i-11+5}"))) for i in range(11, 14) ) - channels |= InstrumentChannel( - "L4-14", port=controller.ports(("device_hdawg2", "SIGOUTS/0")) - ) + channels |= Channel("L4-14", port=controller.ports(("device_hdawg2", "SIGOUTS/0"))) # TWPA pump(EraSynth) - channels |= InstrumentChannel("L3-32") + channels |= Channel("L3-32") # SHFQC # Sets the maximal Range of the Signal Output power. diff --git a/tests/test_channels.py b/tests/test_channels.py index 6c443f5c1f..ea16b14371 100644 --- a/tests/test_channels.py +++ b/tests/test_channels.py @@ -1,16 +1,16 @@ import pytest +from qibolab.channels import Channel, ChannelMap from qibolab.instruments.dummy import DummyPort -from qibolab.instruments.instrument_channel import ChannelMap, InstrumentChannel def test_channel_init(): - channel = InstrumentChannel("L1-test") + channel = Channel("L1-test") assert channel.name == "L1-test" def test_channel_errors(): - channel = InstrumentChannel("L1-test", port=DummyPort("test")) + channel = Channel("L1-test", port=DummyPort("test")) channel.offset = 0.1 channel.filter = {} # attempt to set bias higher than the allowed value @@ -23,8 +23,8 @@ def test_channel_map_add(): channels = ChannelMap().add("a", "b") assert "a" in channels assert "b" in channels - assert isinstance(channels["a"], InstrumentChannel) - assert isinstance(channels["b"], InstrumentChannel) + assert isinstance(channels["a"], Channel) + assert isinstance(channels["b"], Channel) assert channels["a"].name == "a" assert channels["b"].name == "b" @@ -33,8 +33,8 @@ def test_channel_map_setitem(): channels = ChannelMap() with pytest.raises(TypeError): channels["c"] = "test" - channels["c"] = InstrumentChannel("c") - assert isinstance(channels["c"], InstrumentChannel) + channels["c"] = Channel("c") + assert isinstance(channels["c"], Channel) def test_channel_map_union(): @@ -43,7 +43,7 @@ def test_channel_map_union(): channels = channels1 | channels2 for name in ["a", "b", "c", "d"]: assert name in channels - assert isinstance(channels[name], InstrumentChannel) + assert isinstance(channels[name], Channel) assert channels[name].name == name assert "a" not in channels2 assert "b" not in channels2 @@ -56,7 +56,7 @@ def test_channel_map_union_update(): channels |= ChannelMap().add("c", "d") for name in ["a", "b", "c", "d"]: assert name in channels - assert isinstance(channels[name], InstrumentChannel) + assert isinstance(channels[name], Channel) assert channels[name].name == name From de4525acdf4533ba2dd48290ad9774883502453a Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Mon, 22 Apr 2024 13:06:15 +0400 Subject: [PATCH 0242/1006] remove redundant port.py --- src/qibolab/instruments/port.py | 35 --------------------------------- 1 file changed, 35 deletions(-) delete mode 100644 src/qibolab/instruments/port.py diff --git a/src/qibolab/instruments/port.py b/src/qibolab/instruments/port.py deleted file mode 100644 index d4759fa661..0000000000 --- a/src/qibolab/instruments/port.py +++ /dev/null @@ -1,35 +0,0 @@ -class Port: - """Abstract interface for instrument parameters. - - These parameters are exposed to the user through :class:`qibolab.channels.Channel`. - - Drivers should subclass this interface and implement the getters - and setters for all the parameters that are available for the - corresponding instruments. - - Each port is identified by the ``name`` attribute. - Note that the type of the identifier can be different of each port implementation. - """ - - name: str - """Name of the port that acts as its identifier.""" - offset: float - """DC offset that is applied to this port.""" - lo_frequency: float - """Local oscillator frequency for the given port. - - Relevant only for controllers with internal local oscillators. - """ - lo_power: float - """Local oscillator power for the given port. - - Relevant only for controllers with internal local oscillators. - """ - # TODO: Maybe gain, attenuation and power range can be unified to a single attribute - gain: float - """Gain that is applied to this port.""" - attenuation: float - """Attenuation that is applied to this port.""" - power_range: int - """Similar to attenuation (negative) and gain (positive) for (Zurich - instruments).""" From 35cb5dc2aeaabb0c798ef015343e2f703ff0c934 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Mon, 22 Apr 2024 13:06:47 +0400 Subject: [PATCH 0243/1006] strip down Channel class --- src/qibolab/channels.py | 88 ++++++----------------------------------- 1 file changed, 12 insertions(+), 76 deletions(-) diff --git a/src/qibolab/channels.py b/src/qibolab/channels.py index b4a9164780..f75c9a872e 100644 --- a/src/qibolab/channels.py +++ b/src/qibolab/channels.py @@ -1,10 +1,9 @@ -from dataclasses import dataclass, field +from dataclasses import dataclass, field, replace from typing import Dict, Optional from qibo.config import raise_error -from qibolab.instruments.oscillator import LocalOscillator -from qibolab.instruments.port import Port +from qibolab.channel_config import ChannelConfig def check_max_offset(offset, max_offset): @@ -24,17 +23,9 @@ class Channel: """Representation of physical wire connection (channel).""" name: str - """Name of the channel from the lab schematics.""" - port: Optional[Port] = None - """Instrument port that is connected to this channel.""" - local_oscillator: Optional[LocalOscillator] = None - """Instrument object controlling the local oscillator connected to this - channel. - - Not applicable for setups that do not use external local oscillators - because the controller can send sufficiently high frequencies or - contains internal local oscillators. - """ + """The name of the channel.""" + config: ChannelConfig + """The exposed configuration of the channel.""" max_offset: Optional[float] = None """Maximum DC voltage that we can safely send through this channel. @@ -46,71 +37,16 @@ class Channel: @property def offset(self): """DC offset that is applied to this port.""" - return self.port.offset + if hasattr(self.config, "offset"): + return self.config.offset + raise ValueError(f"Channel {self.name} does not have property offset.") @offset.setter def offset(self, value): - check_max_offset(value, self.max_offset) - self.port.offset = value - - @property - def lo_frequency(self): - if self.local_oscillator is not None: - return self.local_oscillator.frequency - return self.port.lo_frequency - - @lo_frequency.setter - def lo_frequency(self, value): - if self.local_oscillator is not None: - self.local_oscillator.frequency = value - else: - self.port.lo_frequency = value - - @property - def lo_power(self): - if self.local_oscillator is not None: - return self.local_oscillator.power - return self.port.lo_power - - @lo_power.setter - def lo_power(self, value): - if self.local_oscillator is not None: - self.local_oscillator.power = value - else: - self.port.lo_power = value - - # TODO: gain, attenuation and power range can be unified to a single property - @property - def gain(self): - return self.port.gain - - @gain.setter - def gain(self, value): - self.port.gain = value - - @property - def attenuation(self): - return self.port.attenuation - - @attenuation.setter - def attenuation(self, value): - self.port.attenuation = value - - @property - def power_range(self): - return self.port.power_range - - @power_range.setter - def power_range(self, value): - self.port.power_range = value - - @property - def filter(self): - return self.port.filter - - @filter.setter - def filter(self, value): - self.port.filter = value + if hasattr(self.config, "offset"): + check_max_offset(value, self.max_offset) + self.config = replace(self.config, offset=value) + raise ValueError(f"Channel {self.name} does not have property offset.") @dataclass From 4ccafa0ca2c97595ecb595402f567608d7d700dc Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Mon, 22 Apr 2024 13:17:13 +0400 Subject: [PATCH 0244/1006] move channels.py under instruments --- src/qibolab/couplers.py | 2 +- src/qibolab/dummy/platform.py | 2 +- src/qibolab/{ => instruments}/channels.py | 0 src/qibolab/instruments/qm/sweepers.py | 2 +- src/qibolab/qubits.py | 2 +- tests/dummy_qrc/qblox/platform.py | 2 +- tests/dummy_qrc/qm/platform.py | 2 +- tests/dummy_qrc/qm_octave/platform.py | 2 +- tests/dummy_qrc/rfsoc/platform.py | 2 +- tests/dummy_qrc/zurich/platform.py | 2 +- tests/test_channels.py | 2 +- 11 files changed, 10 insertions(+), 10 deletions(-) rename src/qibolab/{ => instruments}/channels.py (100%) diff --git a/src/qibolab/couplers.py b/src/qibolab/couplers.py index cd384ecf4b..3edd0871ca 100644 --- a/src/qibolab/couplers.py +++ b/src/qibolab/couplers.py @@ -1,7 +1,7 @@ from dataclasses import dataclass, field from typing import Dict, Optional, Union -from qibolab.channels import Channel +from qibolab.instruments.channels import Channel from qibolab.native import SingleQubitNatives QubitId = Union[str, int] diff --git a/src/qibolab/dummy/platform.py b/src/qibolab/dummy/platform.py index 614f8f6dcf..05ce2bed80 100644 --- a/src/qibolab/dummy/platform.py +++ b/src/qibolab/dummy/platform.py @@ -1,7 +1,7 @@ import itertools import pathlib -from qibolab.channels import Channel, ChannelMap +from qibolab.instruments.channels import Channel, ChannelMap from qibolab.instruments.dummy import DummyInstrument, DummyLocalOscillator from qibolab.kernels import Kernels from qibolab.platform import Platform diff --git a/src/qibolab/channels.py b/src/qibolab/instruments/channels.py similarity index 100% rename from src/qibolab/channels.py rename to src/qibolab/instruments/channels.py diff --git a/src/qibolab/instruments/qm/sweepers.py b/src/qibolab/instruments/qm/sweepers.py index e745d6bde8..8f829b2097 100644 --- a/src/qibolab/instruments/qm/sweepers.py +++ b/src/qibolab/instruments/qm/sweepers.py @@ -6,7 +6,7 @@ from qm.qua import declare, fixed, for_ from qualang_tools.loops import from_array -from qibolab.channels import check_max_offset +from qibolab.instruments.channels import check_max_offset from qibolab.instruments.qm.sequence import BakedPulse from qibolab.pulses import PulseType from qibolab.sweeper import Parameter diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index 41142af981..b118173d87 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -3,8 +3,8 @@ import numpy as np -from qibolab.channels import Channel from qibolab.couplers import Coupler +from qibolab.instruments.channels import Channel from qibolab.native import SingleQubitNatives, TwoQubitNatives QubitId = Union[str, int] diff --git a/tests/dummy_qrc/qblox/platform.py b/tests/dummy_qrc/qblox/platform.py index a60a600d8f..8fcbfdacf0 100644 --- a/tests/dummy_qrc/qblox/platform.py +++ b/tests/dummy_qrc/qblox/platform.py @@ -1,6 +1,6 @@ import pathlib -from qibolab.channels import Channel, ChannelMap +from qibolab.instruments.channels import Channel, ChannelMap from qibolab.instruments.qblox.cluster_qcm_bb import QcmBb from qibolab.instruments.qblox.cluster_qcm_rf import QcmRf from qibolab.instruments.qblox.cluster_qrm_rf import QrmRf diff --git a/tests/dummy_qrc/qm/platform.py b/tests/dummy_qrc/qm/platform.py index 40e2db638f..739cc474a7 100644 --- a/tests/dummy_qrc/qm/platform.py +++ b/tests/dummy_qrc/qm/platform.py @@ -1,6 +1,6 @@ import pathlib -from qibolab.channels import Channel, ChannelMap +from qibolab.instruments.channels import Channel, ChannelMap from qibolab.instruments.dummy import DummyLocalOscillator as LocalOscillator from qibolab.instruments.qm import OPXplus, QMController from qibolab.platform import Platform diff --git a/tests/dummy_qrc/qm_octave/platform.py b/tests/dummy_qrc/qm_octave/platform.py index 3d3d307bf3..2ba81caf5c 100644 --- a/tests/dummy_qrc/qm_octave/platform.py +++ b/tests/dummy_qrc/qm_octave/platform.py @@ -1,6 +1,6 @@ import pathlib -from qibolab.channels import Channel, ChannelMap +from qibolab.instruments.channels import Channel, ChannelMap from qibolab.instruments.dummy import DummyLocalOscillator as LocalOscillator from qibolab.instruments.qm import Octave, OPXplus, QMController from qibolab.platform import Platform diff --git a/tests/dummy_qrc/rfsoc/platform.py b/tests/dummy_qrc/rfsoc/platform.py index 48082cda01..32274d2d0a 100644 --- a/tests/dummy_qrc/rfsoc/platform.py +++ b/tests/dummy_qrc/rfsoc/platform.py @@ -1,6 +1,6 @@ import pathlib -from qibolab.channels import Channel, ChannelMap +from qibolab.instruments.channels import Channel, ChannelMap from qibolab.instruments.erasynth import ERA from qibolab.instruments.rfsoc import RFSoC from qibolab.instruments.rohde_schwarz import SGS100A diff --git a/tests/dummy_qrc/zurich/platform.py b/tests/dummy_qrc/zurich/platform.py index b9254813e1..918aaa2dd3 100644 --- a/tests/dummy_qrc/zurich/platform.py +++ b/tests/dummy_qrc/zurich/platform.py @@ -6,7 +6,7 @@ from laboneq.simple import DeviceSetup from qibolab import Platform -from qibolab.channels import Channel, ChannelMap +from qibolab.instruments.channels import Channel, ChannelMap from qibolab.instruments.dummy import DummyLocalOscillator as LocalOscillator from qibolab.instruments.zhinst import Zurich from qibolab.kernels import Kernels diff --git a/tests/test_channels.py b/tests/test_channels.py index ea16b14371..7f5b52600c 100644 --- a/tests/test_channels.py +++ b/tests/test_channels.py @@ -1,6 +1,6 @@ import pytest -from qibolab.channels import Channel, ChannelMap +from qibolab.instruments.channels import Channel, ChannelMap from qibolab.instruments.dummy import DummyPort From 3338acc3cdc0560cb36ba139ff40a2283c72c758 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Mon, 22 Apr 2024 13:32:34 +0400 Subject: [PATCH 0245/1006] introduce channel types --- src/qibolab/couplers.py | 18 ++------------ src/qibolab/instruments/channels.py | 37 ++++++++++++++++++----------- src/qibolab/qubits.py | 37 ++++++----------------------- 3 files changed, 32 insertions(+), 60 deletions(-) diff --git a/src/qibolab/couplers.py b/src/qibolab/couplers.py index 3edd0871ca..5a30805404 100644 --- a/src/qibolab/couplers.py +++ b/src/qibolab/couplers.py @@ -1,7 +1,7 @@ from dataclasses import dataclass, field from typing import Dict, Optional, Union -from qibolab.instruments.channels import Channel +from qibolab.instruments.channels import DCChannel from qibolab.native import SingleQubitNatives QubitId = Union[str, int] @@ -25,7 +25,7 @@ class Coupler: native_gates: SingleQubitNatives = field(default_factory=SingleQubitNatives) "For now this only contains the calibrated pulse to activate the coupler." - _flux: Optional[Channel] = None + flux: Optional[DCChannel] = None "flux (:class:`qibolab.platforms.utils.Channel`): Channel used to send flux pulses to the qubit." # TODO: With topology or conectivity @@ -33,20 +33,6 @@ class Coupler: qubits: Dict = field(default_factory=dict) "Qubits the coupler acts on" - def __post_init__(self): - if self.flux is not None and self.sweetspot != 0: - self.flux.offset = self.sweetspot - - @property - def flux(self): - return self._flux - - @flux.setter - def flux(self, channel): - if self.sweetspot != 0: - channel.offset = self.sweetspot - self._flux = channel - @property def channels(self): if self.flux is not None: diff --git a/src/qibolab/instruments/channels.py b/src/qibolab/instruments/channels.py index f75c9a872e..fe81ba5183 100644 --- a/src/qibolab/instruments/channels.py +++ b/src/qibolab/instruments/channels.py @@ -3,7 +3,11 @@ from qibo.config import raise_error -from qibolab.channel_config import ChannelConfig +from qibolab.channel_config import ( + AcquisitionChannelConfig, + DCChannelConfig, + IQChannelConfig, +) def check_max_offset(offset, max_offset): @@ -19,13 +23,10 @@ def check_max_offset(offset, max_offset): @dataclass -class Channel: - """Representation of physical wire connection (channel).""" - +class DCChannel: name: str - """The name of the channel.""" - config: ChannelConfig - """The exposed configuration of the channel.""" + config: DCChannelConfig + max_offset: Optional[float] = None """Maximum DC voltage that we can safely send through this channel. @@ -37,16 +38,24 @@ class Channel: @property def offset(self): """DC offset that is applied to this port.""" - if hasattr(self.config, "offset"): - return self.config.offset - raise ValueError(f"Channel {self.name} does not have property offset.") + return self.config.offset @offset.setter def offset(self, value): - if hasattr(self.config, "offset"): - check_max_offset(value, self.max_offset) - self.config = replace(self.config, offset=value) - raise ValueError(f"Channel {self.name} does not have property offset.") + check_max_offset(value, self.max_offset) + self.config = replace(self.config, offset=value) + + +@dataclass +class IQChannel: + name: str + config: IQChannelConfig + + +@dataclass +class AcquisitionChannel: + name: str + config: AcquisitionChannelConfig @dataclass diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index b118173d87..1ef1050514 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -4,26 +4,18 @@ import numpy as np from qibolab.couplers import Coupler -from qibolab.instruments.channels import Channel +from qibolab.instruments.channels import AcquisitionChannel, DCChannel, IQChannel from qibolab.native import SingleQubitNatives, TwoQubitNatives QubitId = Union[str, int] """Type for qubit names.""" -CHANNEL_NAMES = ("readout", "feedback", "drive", "flux", "twpa") +CHANNEL_NAMES = ("readout", "acquisition", "drive", "flux", "twpa") """Names of channels that belong to a qubit. Not all channels are required to operate a qubit. """ -EXCLUDED_FIELDS = CHANNEL_NAMES + ( - "name", - "native_gates", - "kernel", - "_flux", - "qubit1", - "qubit2", - "coupler", -) +EXCLUDED_FIELDS = CHANNEL_NAMES + ("name", "native_gates", "kernel", "flux") """Qubit dataclass fields that are excluded by the ``characterization`` property.""" @@ -95,28 +87,13 @@ class Qubit: mixer_readout_g: float = 0.0 mixer_readout_phi: float = 0.0 - readout: Optional[Channel] = None - feedback: Optional[Channel] = None - twpa: Optional[Channel] = None - drive: Optional[Channel] = None - _flux: Optional[Channel] = None + readout: Optional[IQChannel] = None + acquisition: Optional[AcquisitionChannel] = None + drive: Optional[IQChannel] = None + flux: Optional[DCChannel] = None native_gates: SingleQubitNatives = field(default_factory=SingleQubitNatives) - def __post_init__(self): - if self.flux is not None and self.sweetspot != 0: - self.flux.offset = self.sweetspot - - @property - def flux(self): - return self._flux - - @flux.setter - def flux(self, channel): - if self.sweetspot != 0: - channel.offset = self.sweetspot - self._flux = channel - @property def channels(self): for name in CHANNEL_NAMES: From c12c9d20a4e30fd6f3b6bfde1fe6c387923e9ca3 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 23 Apr 2024 16:27:38 +0400 Subject: [PATCH 0246/1006] remove the ChannelMap class --- src/qibolab/instruments/channels.py | 59 +---------------------------- 1 file changed, 2 insertions(+), 57 deletions(-) diff --git a/src/qibolab/instruments/channels.py b/src/qibolab/instruments/channels.py index fe81ba5183..82511e1314 100644 --- a/src/qibolab/instruments/channels.py +++ b/src/qibolab/instruments/channels.py @@ -1,5 +1,5 @@ -from dataclasses import dataclass, field, replace -from typing import Dict, Optional +from dataclasses import dataclass, replace +from typing import Optional from qibo.config import raise_error @@ -56,58 +56,3 @@ class IQChannel: class AcquisitionChannel: name: str config: AcquisitionChannelConfig - - -@dataclass -class ChannelMap: - """Collection of :class:`qibolab.designs.channel.Channel` objects - identified by name. - - Essentially, it allows creating a mapping of names to channels just - specifying the names. - """ - - _channels: Dict[str, Channel] = field(default_factory=dict) - - def add(self, *items): - """Add multiple items to the channel map. - - If :class: `qibolab.channels.Channel` objects are given they are dded to the channel map. - If a different type is given, a :class: `qibolab.channels.Channel` with the corresponding name - is created and added to the channel map. - """ - for item in items: - if isinstance(item, Channel): - self[item.name] = item - else: - self[item] = Channel(item) - return self - - def __getitem__(self, name): - return self._channels[name] - - def __setitem__(self, name, channel): - if not isinstance(channel, Channel): - raise_error( - TypeError, f"Cannot add channel of type {type(channel)} to ChannelMap." - ) - self._channels[name] = channel - - def __contains__(self, name): - return name in self._channels - - def __or__(self, channel_map): - channels = self._channels.copy() - channels.update(channel_map._channels) - return self.__class__(channels) - - def __ior__(self, items): - if not isinstance(items, type(self)): - try: - if isinstance(items, str): - raise TypeError - items = type(self)().add(*items) - except TypeError: - items = type(self)().add(items) - self._channels.update(items._channels) - return self From e6692f6bb96e64cab98ee39c7b6190f68a3775fc Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 23 Apr 2024 17:51:07 +0400 Subject: [PATCH 0247/1006] simple channel definition --- src/qibolab/channel.py | 9 +++++ src/qibolab/couplers.py | 4 +- src/qibolab/instruments/channels.py | 58 ----------------------------- src/qibolab/qubits.py | 10 ++--- 4 files changed, 16 insertions(+), 65 deletions(-) create mode 100644 src/qibolab/channel.py delete mode 100644 src/qibolab/instruments/channels.py diff --git a/src/qibolab/channel.py b/src/qibolab/channel.py new file mode 100644 index 0000000000..46e963de63 --- /dev/null +++ b/src/qibolab/channel.py @@ -0,0 +1,9 @@ +from dataclasses import dataclass + +from .channel_config import ChannelConfig + + +@dataclass(frozen=True) +class Channel: + name: str + config: ChannelConfig diff --git a/src/qibolab/couplers.py b/src/qibolab/couplers.py index 5a30805404..fd312c0f5f 100644 --- a/src/qibolab/couplers.py +++ b/src/qibolab/couplers.py @@ -1,7 +1,7 @@ from dataclasses import dataclass, field from typing import Dict, Optional, Union -from qibolab.instruments.channels import DCChannel +from qibolab.channel import Channel from qibolab.native import SingleQubitNatives QubitId = Union[str, int] @@ -25,7 +25,7 @@ class Coupler: native_gates: SingleQubitNatives = field(default_factory=SingleQubitNatives) "For now this only contains the calibrated pulse to activate the coupler." - flux: Optional[DCChannel] = None + flux: Optional[Channel] = None "flux (:class:`qibolab.platforms.utils.Channel`): Channel used to send flux pulses to the qubit." # TODO: With topology or conectivity diff --git a/src/qibolab/instruments/channels.py b/src/qibolab/instruments/channels.py deleted file mode 100644 index 82511e1314..0000000000 --- a/src/qibolab/instruments/channels.py +++ /dev/null @@ -1,58 +0,0 @@ -from dataclasses import dataclass, replace -from typing import Optional - -from qibo.config import raise_error - -from qibolab.channel_config import ( - AcquisitionChannelConfig, - DCChannelConfig, - IQChannelConfig, -) - - -def check_max_offset(offset, max_offset): - """Checks if a given offset value exceeds the maximum supported offset. - - This is to avoid sending high currents that could damage lab - equipment such as amplifiers. - """ - if max_offset is not None and abs(offset) > max_offset: - raise_error( - ValueError, f"{offset} exceeds the maximum allowed offset {max_offset}." - ) - - -@dataclass -class DCChannel: - name: str - config: DCChannelConfig - - max_offset: Optional[float] = None - """Maximum DC voltage that we can safely send through this channel. - - Sending high voltages for prolonged times may damage amplifiers or - other lab equipment. If the user attempts to send a higher value an - error will be raised to prevent execution in real instruments. - """ - - @property - def offset(self): - """DC offset that is applied to this port.""" - return self.config.offset - - @offset.setter - def offset(self, value): - check_max_offset(value, self.max_offset) - self.config = replace(self.config, offset=value) - - -@dataclass -class IQChannel: - name: str - config: IQChannelConfig - - -@dataclass -class AcquisitionChannel: - name: str - config: AcquisitionChannelConfig diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index 1ef1050514..0db1af5cec 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -3,8 +3,8 @@ import numpy as np +from qibolab.channel import Channel from qibolab.couplers import Coupler -from qibolab.instruments.channels import AcquisitionChannel, DCChannel, IQChannel from qibolab.native import SingleQubitNatives, TwoQubitNatives QubitId = Union[str, int] @@ -87,10 +87,10 @@ class Qubit: mixer_readout_g: float = 0.0 mixer_readout_phi: float = 0.0 - readout: Optional[IQChannel] = None - acquisition: Optional[AcquisitionChannel] = None - drive: Optional[IQChannel] = None - flux: Optional[DCChannel] = None + readout: Optional[Channel] = None + acquisition: Optional[Channel] = None + drive: Optional[Channel] = None + flux: Optional[Channel] = None native_gates: SingleQubitNatives = field(default_factory=SingleQubitNatives) From 7425850d9343b87cb501fa49d9dae339cb7c3945 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Wed, 24 Apr 2024 11:11:10 +0400 Subject: [PATCH 0248/1006] Introduce simple Channel type for type annotations --- src/qibolab/{channel.py => channel_type.py} | 5 ++--- src/qibolab/couplers.py | 2 +- src/qibolab/qubits.py | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) rename src/qibolab/{channel.py => channel_type.py} (53%) diff --git a/src/qibolab/channel.py b/src/qibolab/channel_type.py similarity index 53% rename from src/qibolab/channel.py rename to src/qibolab/channel_type.py index 46e963de63..cec6933e86 100644 --- a/src/qibolab/channel.py +++ b/src/qibolab/channel_type.py @@ -1,9 +1,8 @@ -from dataclasses import dataclass +from typing import Protocol from .channel_config import ChannelConfig -@dataclass(frozen=True) -class Channel: +class Channel(Protocol): name: str config: ChannelConfig diff --git a/src/qibolab/couplers.py b/src/qibolab/couplers.py index fd312c0f5f..f30f0f85a5 100644 --- a/src/qibolab/couplers.py +++ b/src/qibolab/couplers.py @@ -1,7 +1,7 @@ from dataclasses import dataclass, field from typing import Dict, Optional, Union -from qibolab.channel import Channel +from qibolab.channel_type import Channel from qibolab.native import SingleQubitNatives QubitId = Union[str, int] diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index 0db1af5cec..d033264970 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -3,7 +3,7 @@ import numpy as np -from qibolab.channel import Channel +from qibolab.channel_type import Channel from qibolab.couplers import Coupler from qibolab.native import SingleQubitNatives, TwoQubitNatives From 495ed7719b01c3956a0a7945e9a344600e866e15 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Wed, 24 Apr 2024 11:44:02 +0400 Subject: [PATCH 0249/1006] rename lo to laboneq to avoid confusion with local oscillator --- src/qibolab/instruments/zhinst/executor.py | 74 +++++++++++----------- src/qibolab/instruments/zhinst/pulse.py | 16 ++--- src/qibolab/instruments/zhinst/sweep.py | 26 ++++---- 3 files changed, 60 insertions(+), 56 deletions(-) diff --git a/src/qibolab/instruments/zhinst/executor.py b/src/qibolab/instruments/zhinst/executor.py index ad76931240..b98fada187 100644 --- a/src/qibolab/instruments/zhinst/executor.py +++ b/src/qibolab/instruments/zhinst/executor.py @@ -5,7 +5,7 @@ from dataclasses import dataclass, replace from typing import Any, Optional -import laboneq.simple as lo +import laboneq.simple as laboneq import numpy as np from qibo.config import log @@ -35,14 +35,14 @@ } """Translating to Zurich ExecutionParameters.""" ACQUISITION_TYPE = { - AcquisitionType.INTEGRATION: lo.AcquisitionType.INTEGRATION, - AcquisitionType.RAW: lo.AcquisitionType.RAW, - AcquisitionType.DISCRIMINATION: lo.AcquisitionType.DISCRIMINATION, + AcquisitionType.INTEGRATION: laboneq.AcquisitionType.INTEGRATION, + AcquisitionType.RAW: laboneq.AcquisitionType.RAW, + AcquisitionType.DISCRIMINATION: laboneq.AcquisitionType.DISCRIMINATION, } AVERAGING_MODE = { - AveragingMode.CYCLIC: lo.AveragingMode.CYCLIC, - AveragingMode.SINGLESHOT: lo.AveragingMode.SINGLE_SHOT, + AveragingMode.CYCLIC: laboneq.AveragingMode.CYCLIC, + AveragingMode.SINGLESHOT: laboneq.AveragingMode.SINGLE_SHOT, } @@ -86,7 +86,7 @@ def __init__(self, name, device_setup, time_of_flight=0.0, smearing=0.0): self.signal_map = {} "Signals to lines mapping" - self.calibration = lo.Calibration() + self.calibration = laboneq.Calibration() "Zurich calibration object)" self.device_setup = device_setup @@ -129,7 +129,7 @@ def connect(self): if self.is_connected is False: # To fully remove logging #configure_logging=False # I strongly advise to set it to 20 to have time estimates of the experiment duration! - self.session = lo.Session(self.device_setup, log_level=20) + self.session = laboneq.Session(self.device_setup, log_level=20) _ = self.session.connect() self.is_connected = True @@ -192,12 +192,12 @@ def register_readout_line(self, qubit, intermediate_frequency, options): ] ) self.calibration[f"/logical_signal_groups/q{q}/measure_line"] = ( - lo.SignalCalibration( - oscillator=lo.Oscillator( + laboneq.SignalCalibration( + oscillator=laboneq.Oscillator( frequency=intermediate_frequency, - modulation_type=lo.ModulationType.SOFTWARE, + modulation_type=laboneq.ModulationType.SOFTWARE, ), - local_oscillator=lo.Oscillator( + local_oscillator=laboneq.Oscillator( frequency=int(qubit.readout.local_oscillator.frequency), ), range=qubit.readout.power_range, @@ -212,9 +212,9 @@ def register_readout_line(self, qubit, intermediate_frequency, options): ] ) - oscillator = lo.Oscillator( + oscillator = laboneq.Oscillator( frequency=intermediate_frequency, - modulation_type=lo.ModulationType.SOFTWARE, + modulation_type=laboneq.ModulationType.SOFTWARE, ) threshold = None @@ -227,7 +227,7 @@ def register_readout_line(self, qubit, intermediate_frequency, options): threshold = qubit.threshold self.calibration[f"/logical_signal_groups/q{q}/acquire_line"] = ( - lo.SignalCalibration( + laboneq.SignalCalibration( oscillator=oscillator, range=qubit.feedback.power_range, port_delay=self.time_of_flight * NANO_TO_SECONDS, @@ -242,12 +242,12 @@ def register_drive_line(self, qubit, intermediate_frequency): f"q{q}" ].logical_signals["drive_line"] self.calibration[f"/logical_signal_groups/q{q}/drive_line"] = ( - lo.SignalCalibration( - oscillator=lo.Oscillator( + laboneq.SignalCalibration( + oscillator=laboneq.Oscillator( frequency=intermediate_frequency, - modulation_type=lo.ModulationType.HARDWARE, + modulation_type=laboneq.ModulationType.HARDWARE, ), - local_oscillator=lo.Oscillator( + local_oscillator=laboneq.Oscillator( frequency=int(qubit.drive.local_oscillator.frequency), ), range=qubit.drive.power_range, @@ -263,7 +263,7 @@ def register_flux_line(self, qubit): f"q{q}" ].logical_signals["flux_line"] self.calibration[f"/logical_signal_groups/q{q}/flux_line"] = ( - lo.SignalCalibration( + laboneq.SignalCalibration( range=qubit.flux.power_range, port_delay=None, delay_signal=0, @@ -278,7 +278,7 @@ def register_couplerflux_line(self, coupler): f"qc{c}" ].logical_signals["flux_line"] self.calibration[f"/logical_signal_groups/qc{c}/flux_line"] = ( - lo.SignalCalibration( + laboneq.SignalCalibration( range=coupler.flux.power_range, port_delay=None, delay_signal=0, @@ -435,8 +435,8 @@ def create_exp(self, qubits, options): options, acquisition_type=acquisition_type, averaging_mode=averaging_mode ) - signals = [lo.ExperimentSignal(name) for name in self.signal_map.keys()] - exp = lo.Experiment( + signals = [laboneq.ExperimentSignal(name) for name in self.signal_map.keys()] + exp = laboneq.Experiment( uid="Sequence", signals=signals, ) @@ -448,7 +448,7 @@ def create_exp(self, qubits, options): self.experiment = exp def _contexts( - self, exp: lo.Experiment, exp_options: ExecutionParameters + self, exp: laboneq.Experiment, exp_options: ExecutionParameters ) -> list[tuple[Optional[Sweeper], Any]]: """To construct a laboneq experiment, we need to first define a certain sequence of nested contexts. @@ -491,7 +491,7 @@ def _contexts( def _populate_exp( self, qubits: dict[str, Qubit], - exp: lo.Experiment, + exp: laboneq.Experiment, exp_options: ExecutionParameters, contexts, ): @@ -507,26 +507,26 @@ def _populate_exp( self.set_instrument_nodes_for_nt_sweep(exp, sweeper) self._populate_exp(qubits, exp, exp_options, contexts[1:]) - def set_calibration_for_rt_sweep(self, exp: lo.Experiment) -> None: + def set_calibration_for_rt_sweep(self, exp: laboneq.Experiment) -> None: """Set laboneq calibration of parameters that are to be swept in real- time.""" if self.processed_sweeps: - calib = lo.Calibration() + calib = laboneq.Calibration() for ch in ( set(self.sequence.keys()) | self.processed_sweeps.channels_with_sweeps() ): for param, sweep_param in self.processed_sweeps.sweeps_for_channel(ch): if param is Parameter.frequency: - calib[ch] = lo.SignalCalibration( - oscillator=lo.Oscillator( + calib[ch] = laboneq.SignalCalibration( + oscillator=laboneq.Oscillator( frequency=sweep_param, - modulation_type=lo.ModulationType.HARDWARE, + modulation_type=laboneq.ModulationType.HARDWARE, ) ) exp.set_calibration(calib) def set_instrument_nodes_for_nt_sweep( - self, exp: lo.Experiment, sweeper: Sweeper + self, exp: laboneq.Experiment, sweeper: Sweeper ) -> None: """In some cases there is no straightforward way to sweep a parameter. @@ -617,9 +617,9 @@ def select_exp(self, exp, qubits, exp_options): if ( qubit.kernel is not None and exp_options.acquisition_type - == lo.AcquisitionType.DISCRIMINATION + == laboneq.AcquisitionType.DISCRIMINATION ): - weight = lo.pulse_library.sampled_pulse_complex( + weight = laboneq.pulse_library.sampled_pulse_complex( samples=qubit.kernel * np.exp(1j * qubit.iq_angle), ) @@ -627,9 +627,9 @@ def select_exp(self, exp, qubits, exp_options): if i == 0: if ( exp_options.acquisition_type - == lo.AcquisitionType.DISCRIMINATION + == laboneq.AcquisitionType.DISCRIMINATION ): - weight = lo.pulse_library.sampled_pulse_complex( + weight = laboneq.pulse_library.sampled_pulse_complex( samples=np.ones( [ int( @@ -642,7 +642,7 @@ def select_exp(self, exp, qubits, exp_options): ) weights[q] = weight else: - weight = lo.pulse_library.const( + weight = laboneq.pulse_library.const( length=round( pulse.pulse.duration * NANO_TO_SECONDS, 9 ) @@ -711,7 +711,7 @@ def sweep(self, qubits, couplers, sequence: PulseSequence, options, *sweepers): if sweeper.parameter in {Parameter.frequency, Parameter.amplitude}: for pulse in sweeper.pulses: if pulse.type is PulseType.READOUT: - self.acquisition_type = lo.AcquisitionType.SPECTROSCOPY + self.acquisition_type = laboneq.AcquisitionType.SPECTROSCOPY self.experiment_flow(qubits, couplers, sequence, options) self.run_exp() diff --git a/src/qibolab/instruments/zhinst/pulse.py b/src/qibolab/instruments/zhinst/pulse.py index b9e068acfe..8bfa112d05 100644 --- a/src/qibolab/instruments/zhinst/pulse.py +++ b/src/qibolab/instruments/zhinst/pulse.py @@ -2,7 +2,7 @@ from typing import Optional -import laboneq.simple as lo +import laboneq.simple as laboneq import numpy as np from laboneq.dsl.experiment.pulse_library import ( sampled_pulse_complex, @@ -19,14 +19,14 @@ def select_pulse(pulse: Pulse): """Return laboneq pulse object corresponding to the given qibolab pulse.""" if isinstance(pulse.envelope, Rectangular): can_compress = pulse.type is not PulseType.READOUT - return lo.pulse_library.const( + return laboneq.pulse_library.const( length=round(pulse.duration * NANO_TO_SECONDS, 9), amplitude=pulse.amplitude, can_compress=can_compress, ) if isinstance(pulse.envelope, Gaussian): sigma = pulse.envelope.rel_sigma - return lo.pulse_library.gaussian( + return laboneq.pulse_library.gaussian( length=round(pulse.duration * NANO_TO_SECONDS, 9), amplitude=pulse.amplitude, sigma=2 / sigma, @@ -37,7 +37,7 @@ def select_pulse(pulse: Pulse): sigma = pulse.envelope.rel_sigma width = pulse.envelope.width can_compress = pulse.type is not PulseType.READOUT - return lo.pulse_library.gaussian_square( + return laboneq.pulse_library.gaussian_square( length=round(pulse.duration * NANO_TO_SECONDS, 9), width=round(pulse.duration * NANO_TO_SECONDS, 9) * width, amplitude=pulse.amplitude, @@ -49,7 +49,7 @@ def select_pulse(pulse: Pulse): if isinstance(pulse.envelope, Drag): sigma = pulse.envelope.rel_sigma beta = pulse.envelope.beta - return lo.pulse_library.drag( + return laboneq.pulse_library.drag( length=round(pulse.duration * NANO_TO_SECONDS, 9), amplitude=pulse.amplitude, sigma=2 / sigma, @@ -78,15 +78,15 @@ def __init__(self, pulse): """Qibolab pulse.""" self.zhpulse = select_pulse(pulse) """Laboneq pulse.""" - self.zhsweepers: list[tuple[Parameter, lo.SweepParameter]] = [] + self.zhsweepers: list[tuple[Parameter, laboneq.SweepParameter]] = [] """Parameters to be swept, along with their laboneq sweep parameter definitions.""" - self.delay_sweeper: Optional[lo.SweepParameter] = None + self.delay_sweeper: Optional[laboneq.SweepParameter] = None """Laboneq sweep parameter if the delay of the pulse should be swept.""" # pylint: disable=R0903,E1101 - def add_sweeper(self, param: Parameter, sweeper: lo.SweepParameter): + def add_sweeper(self, param: Parameter, sweeper: laboneq.SweepParameter): """Add sweeper to list of sweepers associated with this pulse.""" if param in { Parameter.amplitude, diff --git a/src/qibolab/instruments/zhinst/sweep.py b/src/qibolab/instruments/zhinst/sweep.py index 4b918aa1e4..9078c319a5 100644 --- a/src/qibolab/instruments/zhinst/sweep.py +++ b/src/qibolab/instruments/zhinst/sweep.py @@ -3,7 +3,7 @@ from collections.abc import Iterable from copy import copy -import laboneq.simple as lo +import laboneq.simple as laboneq import numpy as np from qibolab.pulses import Pulse, PulseType @@ -63,7 +63,7 @@ def __init__(self, sweepers: Iterable[Sweeper], qubits: dict[str, Qubit]): for sweeper in sweepers: for pulse in sweeper.pulses or []: if sweeper.parameter is Parameter.duration: - sweep_param = lo.SweepParameter( + sweep_param = laboneq.SweepParameter( values=sweeper.values * NANO_TO_SECONDS ) pulse_sweeps.append((pulse, sweeper.parameter, sweep_param)) @@ -85,7 +85,7 @@ def __init__(self, sweepers: Iterable[Sweeper], qubits: dict[str, Qubit]): raise ValueError( f"Cannot sweep frequency of pulse of type {ptype}, because it does not have associated frequency" ) - sweep_param = lo.SweepParameter( + sweep_param = laboneq.SweepParameter( values=sweeper.values + intermediate_frequency ) channel_sweeps.append((ch, sweeper.parameter, sweep_param)) @@ -94,7 +94,9 @@ def __init__(self, sweepers: Iterable[Sweeper], qubits: dict[str, Qubit]): and sweeper.parameter is Parameter.amplitude ): max_value = max(np.abs(sweeper.values)) - sweep_param = lo.SweepParameter(values=sweeper.values / max_value) + sweep_param = laboneq.SweepParameter( + values=sweeper.values / max_value + ) # FIXME: this implicitly relies on the fact that pulse is the same python object as appears in the # sequence that is being executed, hence the mutation is propagated. This is bad programming and # should be fixed once things become simpler @@ -108,7 +110,7 @@ def __init__(self, sweepers: Iterable[Sweeper], qubits: dict[str, Qubit]): ) ) else: - sweep_param = lo.SweepParameter(values=copy(sweeper.values)) + sweep_param = laboneq.SweepParameter(values=copy(sweeper.values)) pulse_sweeps.append((pulse, sweeper.parameter, sweep_param)) parallel_sweeps.append((sweeper, sweep_param)) @@ -117,7 +119,7 @@ def __init__(self, sweepers: Iterable[Sweeper], qubits: dict[str, Qubit]): raise ValueError( f"Sweeping {sweeper.parameter.name} for {qubit} is not supported" ) - sweep_param = lo.SweepParameter( + sweep_param = laboneq.SweepParameter( values=sweeper.values + qubit.flux.offset ) channel_sweeps.append((qubit.flux.name, sweeper.parameter, sweep_param)) @@ -128,7 +130,7 @@ def __init__(self, sweepers: Iterable[Sweeper], qubits: dict[str, Qubit]): raise ValueError( f"Sweeping {sweeper.parameter.name} for {coupler} is not supported" ) - sweep_param = lo.SweepParameter( + sweep_param = laboneq.SweepParameter( values=sweeper.values + coupler.flux.offset ) channel_sweeps.append( @@ -142,18 +144,20 @@ def __init__(self, sweepers: Iterable[Sweeper], qubits: dict[str, Qubit]): def sweeps_for_pulse( self, pulse: Pulse - ) -> list[tuple[Parameter, lo.SweepParameter]]: + ) -> list[tuple[Parameter, laboneq.SweepParameter]]: return [item[1:] for item in self._pulse_sweeps if item[0] == pulse] - def sweeps_for_channel(self, ch: str) -> list[tuple[Parameter, lo.SweepParameter]]: + def sweeps_for_channel( + self, ch: str + ) -> list[tuple[Parameter, laboneq.SweepParameter]]: return [item[1:] for item in self._channel_sweeps if item[0] == ch] - def sweeps_for_sweeper(self, sweeper: Sweeper) -> list[lo.SweepParameter]: + def sweeps_for_sweeper(self, sweeper: Sweeper) -> list[laboneq.SweepParameter]: return [item[1] for item in self._parallel_sweeps if item[0] == sweeper] def channel_sweeps_for_sweeper( self, sweeper: Sweeper - ) -> list[tuple[str, Parameter, lo.SweepParameter]]: + ) -> list[tuple[str, Parameter, laboneq.SweepParameter]]: return [ item for item in self._channel_sweeps From 4737756ce76a425c184fa1848cb6f52e0b8a9d1b Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Wed, 24 Apr 2024 11:54:02 +0400 Subject: [PATCH 0250/1006] remove ZhPort --- src/qibolab/instruments/zhinst/executor.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/qibolab/instruments/zhinst/executor.py b/src/qibolab/instruments/zhinst/executor.py index b98fada187..9583073dca 100644 --- a/src/qibolab/instruments/zhinst/executor.py +++ b/src/qibolab/instruments/zhinst/executor.py @@ -12,7 +12,6 @@ from qibolab import AcquisitionType, AveragingMode, ExecutionParameters from qibolab.couplers import Coupler from qibolab.instruments.abstract import Controller -from qibolab.instruments.port import Port from qibolab.pulses import PulseSequence, PulseType from qibolab.qubits import Qubit from qibolab.sweeper import Parameter, Sweeper @@ -46,13 +45,6 @@ } -@dataclass -class ZhPort(Port): - name: tuple[str, str] - offset: float = 0.0 - power_range: int = 0 - - @dataclass class SubSequence: """A subsequence is a slice (in time) of a sequence that contains at most @@ -79,8 +71,6 @@ class Zurich(Controller): """Driver for a collection of ZI instruments that are automatically synchronized via ZSync protocol.""" - PortType = ZhPort - def __init__(self, name, device_setup, time_of_flight=0.0, smearing=0.0): super().__init__(name, None) From 4b91735a9b050ce943fab9bd9b754c7ad90a4b94 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:03:09 +0400 Subject: [PATCH 0251/1006] don't use default values --- src/qibolab/channel_config.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qibolab/channel_config.py b/src/qibolab/channel_config.py index 1044718c83..ad6e35121e 100644 --- a/src/qibolab/channel_config.py +++ b/src/qibolab/channel_config.py @@ -57,12 +57,12 @@ class IQChannelConfig: frequency: float """The carrier frequency of the channel.""" - lo_config: Optional[LOConfig] = None + lo_config: Optional[LOConfig] """Configuration for the corresponding LO. None if the channel does not use an LO. """ - mixer_config: Optional[IQMixerConfig] = None + mixer_config: Optional[IQMixerConfig] """Configuration for the corresponding IQ mixer. None if the channel does not feature a mixer. From 16d6ad2a4dd7e2b7be06ce6264dbdeb5c956a4d6 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:12:11 +0400 Subject: [PATCH 0252/1006] propagate channel_config to instruments --- src/qibolab/platform/platform.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 4ae25f8cdc..68537f16af 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -259,14 +259,19 @@ def _controller(self): assert len(controllers) == 1 return controllers[0] - def _execute(self, sequence, options, sweepers): + def _execute(self, sequence, channel_config, options, sweepers): """Executes sequence on the controllers.""" result = {} for instrument in self.instruments.values(): if isinstance(instrument, Controller): new_result = instrument.play( - self.qubits, self.couplers, sequence, options, sweepers + self.qubits, + self.couplers, + sequence, + channel_config, + options, + sweepers, ) if isinstance(new_result, dict): result.update(new_result) @@ -276,6 +281,7 @@ def _execute(self, sequence, options, sweepers): def execute( self, sequences: List[PulseSequence], + channel_config: dict[str, ChannelConfig], options: ExecutionParameters, sweepers: Optional[list[ParallelSweepers]] = None, ) -> dict[Any, list]: @@ -323,7 +329,7 @@ def execute( results = defaultdict(list) for b in batch(sequences, self._controller.bounds): sequence, readouts = unroll_sequences(b, options.relaxation_time) - result = self._execute(sequence, options, sweepers) + result = self._execute(sequence, channel_config, options, sweepers) for serial, new_serials in readouts.items(): results[serial].extend(result[ser] for ser in new_serials) From 8cd7eff16563c0a3e0164fbdff82c2b29e26c07e Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:12:58 +0400 Subject: [PATCH 0253/1006] ZI channels --- src/qibolab/instruments/zhinst/channels.py | 43 ++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/qibolab/instruments/zhinst/channels.py diff --git a/src/qibolab/instruments/zhinst/channels.py b/src/qibolab/instruments/zhinst/channels.py new file mode 100644 index 0000000000..4a22c7c915 --- /dev/null +++ b/src/qibolab/instruments/zhinst/channels.py @@ -0,0 +1,43 @@ +from dataclasses import dataclass + +from qibolab.channel_config import ( + AcquisitionChannelConfig, + DCChannelConfig, + IQChannelConfig, +) +from qibolab.instruments.oscillator import LocalOscillator + + +@dataclass(frozen=True) +class DCChannelConfigZI(DCChannelConfig): + """DC channel config using ZI HDAWG.""" + + power_range: float + """Power range in volts.""" + + +@dataclass(frozen=True) +class IQChannelConfigZI(IQChannelConfig): + """IQ channel config for ZI SHF* line instrument.""" + + power_range: int + """Db""" + + +class ZIChannel: + name: str + device: str + path: str + + +class DCChannelZI(ZIChannel): + config: DCChannelConfigZI + + +class IQChannelZI(ZIChannel): + config: IQChannelConfigZI + lo: LocalOscillator + + +class AcquisitionChannelZI(ZIChannel): + config: AcquisitionChannelConfig From 3af888882ce128b81d2b08ca84b53584975676f3 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:34:01 +0400 Subject: [PATCH 0254/1006] Revert "propagate channel_config to instruments" This reverts commit 731bc6426cfe75f23ca825e0d6f3f92f4e29891c. --- src/qibolab/platform/platform.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 68537f16af..f69b0ccb16 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -285,7 +285,7 @@ def execute( options: ExecutionParameters, sweepers: Optional[list[ParallelSweepers]] = None, ) -> dict[Any, list]: - """Execute a pulse sequences. + """Execute pulse sequences. If any sweeper is passed, the execution is performed for the different values of sweeped parameters. From 2729e579c9dab59500b9abe941638ee7fe8857e9 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Wed, 24 Apr 2024 16:08:15 +0400 Subject: [PATCH 0255/1006] update platfrom according to new way of defining sequences rename PulseSequence to ControlSequence update platfrom according to new way of defining sequences Revert "remove the ChannelMap class" This reverts commit 0e73c12e285f76e950f7b83c9ac9e45c79f08651. clean up channel and config definitions propagate user provided channel configs Revert "rename PulseSequence to ControlSequence" This reverts commit 42d606eed05f5a97997904b0a93d5474fc0639b8 --- src/qibolab/channel.py | 72 +++++++++++++++++++ .../{channel_config.py => channel_configs.py} | 9 +-- src/qibolab/channel_type.py | 8 --- src/qibolab/couplers.py | 2 +- src/qibolab/instruments/qm/sweepers.py | 13 +++- src/qibolab/instruments/rfsoc/driver.py | 21 ++++++ src/qibolab/instruments/zhinst/channel.py | 10 +++ .../instruments/zhinst/channel_configs.py | 25 +++++++ src/qibolab/instruments/zhinst/channels.py | 43 ----------- src/qibolab/instruments/zhinst/executor.py | 14 +++- src/qibolab/platform/platform.py | 22 +++--- src/qibolab/pulses/sequence.py | 24 +++++-- src/qibolab/qubits.py | 2 +- 13 files changed, 185 insertions(+), 80 deletions(-) create mode 100644 src/qibolab/channel.py rename src/qibolab/{channel_config.py => channel_configs.py} (72%) delete mode 100644 src/qibolab/channel_type.py create mode 100644 src/qibolab/instruments/zhinst/channel.py create mode 100644 src/qibolab/instruments/zhinst/channel_configs.py delete mode 100644 src/qibolab/instruments/zhinst/channels.py diff --git a/src/qibolab/channel.py b/src/qibolab/channel.py new file mode 100644 index 0000000000..b95051531d --- /dev/null +++ b/src/qibolab/channel.py @@ -0,0 +1,72 @@ +from dataclasses import dataclass, field + +from qibo.config import raise_error + +from .channel_configs import ChannelConfig + + +@dataclass(frozen=True) +class Channel: + """Channel is an abstract concept that defines means of communication + between users and a quantum computer. + + A quantum computer can be perceived as just a set of channels where + signals can be sent to or received from. Channels are identified + with a unique name. The type of a channel is inferred from the type + of config it accepts. + """ + + name: str + config: ChannelConfig + + +@dataclass +class ChannelMap: + """Collection of :class:`qibolab.designs.channel.Channel` objects + identified by name. + + Essentially, it allows creating a mapping of names to channels just + specifying the names. + """ + + _channels: dict[str, Channel] = field(default_factory=dict) + + def add(self, *items): + """Add multiple items to the channel map. + + If :class: `qibolab.channels.Channel` objects are given they are dded to the channel map. + If a different type is given, a :class: `qibolab.channels.Channel` with the corresponding name + is created and added to the channel map. + """ + for item in items: + self[item.name] = item + return self + + def __getitem__(self, name): + return self._channels[name] + + def __setitem__(self, name, channel): + if not isinstance(channel, Channel): + raise_error( + TypeError, f"Cannot add channel of type {type(channel)} to ChannelMap." + ) + self._channels[name] = channel + + def __contains__(self, name): + return name in self._channels + + def __or__(self, channel_map): + channels = self._channels.copy() + channels.update(channel_map._channels) + return self.__class__(channels) + + def __ior__(self, items): + if not isinstance(items, type(self)): + try: + if isinstance(items, str): + raise TypeError + items = type(self)().add(*items) + except TypeError: + items = type(self)().add(items) + self._channels.update(items._channels) + return self diff --git a/src/qibolab/channel_config.py b/src/qibolab/channel_configs.py similarity index 72% rename from src/qibolab/channel_config.py rename to src/qibolab/channel_configs.py index ad6e35121e..c6933201a4 100644 --- a/src/qibolab/channel_config.py +++ b/src/qibolab/channel_configs.py @@ -3,14 +3,7 @@ from .execution_parameters import AcquisitionType -""" -Channel is an abstract concept that defines an interface in front of various instrument drivers in qibolab, without -exposing instrument specific implementation details. For the users of this interface a quantum computer is just a -predefined set of channels where they can send signals or receive signals/data from. Users do not have control over what -channels exist - it is determined by the setup of a certain quantum computer. However, users have control over some -configuration parameters. A typical use case is to configure some channels with desired parameters and request an -execution of a synchronized pulse sequence that implements a certain computation or a calibration experiment. -""" +"""Common configuration for various channels.""" @dataclass(frozen=True) diff --git a/src/qibolab/channel_type.py b/src/qibolab/channel_type.py deleted file mode 100644 index cec6933e86..0000000000 --- a/src/qibolab/channel_type.py +++ /dev/null @@ -1,8 +0,0 @@ -from typing import Protocol - -from .channel_config import ChannelConfig - - -class Channel(Protocol): - name: str - config: ChannelConfig diff --git a/src/qibolab/couplers.py b/src/qibolab/couplers.py index f30f0f85a5..fd312c0f5f 100644 --- a/src/qibolab/couplers.py +++ b/src/qibolab/couplers.py @@ -1,7 +1,7 @@ from dataclasses import dataclass, field from typing import Dict, Optional, Union -from qibolab.channel_type import Channel +from qibolab.channel import Channel from qibolab.native import SingleQubitNatives QubitId = Union[str, int] diff --git a/src/qibolab/instruments/qm/sweepers.py b/src/qibolab/instruments/qm/sweepers.py index 8f829b2097..8eb5ea1961 100644 --- a/src/qibolab/instruments/qm/sweepers.py +++ b/src/qibolab/instruments/qm/sweepers.py @@ -6,7 +6,6 @@ from qm.qua import declare, fixed, for_ from qualang_tools.loops import from_array -from qibolab.instruments.channels import check_max_offset from qibolab.instruments.qm.sequence import BakedPulse from qibolab.pulses import PulseType from qibolab.sweeper import Parameter @@ -27,6 +26,18 @@ def maximum_sweep_value(values, value0): return max(abs(min(values) + value0), abs(max(values) + value0)) +def check_max_offset(offset, max_offset): + """Checks if a given offset value exceeds the maximum supported offset. + + This is to avoid sending high currents that could damage lab + equipment such as amplifiers. + """ + if max_offset is not None and abs(offset) > max_offset: + raise_error( + ValueError, f"{offset} exceeds the maximum allowed offset {max_offset}." + ) + + def _update_baked_pulses(sweeper, qmsequence, config): """Updates baked pulse if duration sweeper is used.""" qmpulse = qmsequence.pulse_to_qmpulse[sweeper.pulses[0].id] diff --git a/src/qibolab/instruments/rfsoc/driver.py b/src/qibolab/instruments/rfsoc/driver.py index 3cad39f7cc..9f2b9c1c71 100644 --- a/src/qibolab/instruments/rfsoc/driver.py +++ b/src/qibolab/instruments/rfsoc/driver.py @@ -283,6 +283,27 @@ def play( return results + @staticmethod + def validate_input_command( + sequence: PulseSequence, + execution_parameters: ExecutionParameters, + sweep: bool, + ): + """Check if sequence and execution_parameters are supported.""" + if execution_parameters.acquisition_type is AcquisitionType.RAW: + if sweep: + raise NotImplementedError( + "Raw data acquisition is not compatible with sweepers" + ) + if len(sequence.ro_pulses) != 1: + raise NotImplementedError( + "Raw data acquisition is compatible only with a single readout" + ) + if execution_parameters.averaging_mode is not AveragingMode.CYCLIC: + raise NotImplementedError("Raw data acquisition can only be averaged") + if execution_parameters.fast_reset: + raise NotImplementedError("Fast reset is not supported") + def update_cfg(self, execution_parameters: ExecutionParameters): """Update rfsoc.Config object with new parameters.""" if execution_parameters.nshots is not None: diff --git a/src/qibolab/instruments/zhinst/channel.py b/src/qibolab/instruments/zhinst/channel.py new file mode 100644 index 0000000000..119383d9da --- /dev/null +++ b/src/qibolab/instruments/zhinst/channel.py @@ -0,0 +1,10 @@ +from dataclasses import dataclass + +from qibolab.channel import Channel + + +@dataclass(frozen=True) +class ZIChannel(Channel): + + device: str + path: str diff --git a/src/qibolab/instruments/zhinst/channel_configs.py b/src/qibolab/instruments/zhinst/channel_configs.py new file mode 100644 index 0000000000..38c87b9090 --- /dev/null +++ b/src/qibolab/instruments/zhinst/channel_configs.py @@ -0,0 +1,25 @@ +from dataclasses import dataclass + +from qibolab.channel_configs import DCChannelConfig, IQChannelConfig + + +@dataclass(frozen=True) +class ZurichDCChannelConfig(DCChannelConfig): + """DC channel config using ZI HDAWG.""" + + power_range: float + """Power range in volts. + + Possible values are [0.2 0.4 0.6 0.8 1. 2. 3. 4. 5.]. + """ + + +@dataclass(frozen=True) +class ZurichIQChannelConfig(IQChannelConfig): + """IQ channel config for ZI SHF* line instrument.""" + + power_range: float + """Power range in dBm. + + Possible values are [-30. -25. -20. -15. -10. -5. 0. 5. 10.]. + """ diff --git a/src/qibolab/instruments/zhinst/channels.py b/src/qibolab/instruments/zhinst/channels.py deleted file mode 100644 index 4a22c7c915..0000000000 --- a/src/qibolab/instruments/zhinst/channels.py +++ /dev/null @@ -1,43 +0,0 @@ -from dataclasses import dataclass - -from qibolab.channel_config import ( - AcquisitionChannelConfig, - DCChannelConfig, - IQChannelConfig, -) -from qibolab.instruments.oscillator import LocalOscillator - - -@dataclass(frozen=True) -class DCChannelConfigZI(DCChannelConfig): - """DC channel config using ZI HDAWG.""" - - power_range: float - """Power range in volts.""" - - -@dataclass(frozen=True) -class IQChannelConfigZI(IQChannelConfig): - """IQ channel config for ZI SHF* line instrument.""" - - power_range: int - """Db""" - - -class ZIChannel: - name: str - device: str - path: str - - -class DCChannelZI(ZIChannel): - config: DCChannelConfigZI - - -class IQChannelZI(ZIChannel): - config: IQChannelConfigZI - lo: LocalOscillator - - -class AcquisitionChannelZI(ZIChannel): - config: AcquisitionChannelConfig diff --git a/src/qibolab/instruments/zhinst/executor.py b/src/qibolab/instruments/zhinst/executor.py index 9583073dca..587c512c0f 100644 --- a/src/qibolab/instruments/zhinst/executor.py +++ b/src/qibolab/instruments/zhinst/executor.py @@ -380,9 +380,9 @@ def experiment_flow( self.create_exp(qubits, options) # pylint: disable=W0221 - def play(self, qubits, couplers, sequence, options): + def play(self, qubits, couplers, sequence, channel_cfg, options): """Play pulse sequence.""" - return self.sweep(qubits, couplers, sequence, options) + return self.sweep(qubits, couplers, sequence, channel_cfg, options) def sequence_zh( self, sequence: PulseSequence, qubits: dict[str, Qubit] @@ -688,7 +688,15 @@ def play_sweep(exp, channel_name, pulse): exp.play(signal=channel_name, pulse=pulse.zhpulse, **play_parameters) - def sweep(self, qubits, couplers, sequence: PulseSequence, options, *sweepers): + def sweep( + self, + qubits, + couplers, + sequence: PulseSequence, + channel_cfg, + options, + *sweepers, + ): """Play pulse and sweepers sequence.""" self.signal_map = {} diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index f69b0ccb16..56ba429cbc 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -56,17 +56,16 @@ def unroll_sequences( readout_map = defaultdict(list) channels = {pulse.channel for sequence in sequences for pulse in sequence} for sequence in sequences: - total_sequence.extend(sequence) + total_sequence += sequence # TODO: Fix unrolling results for pulse in sequence: if pulse.type is PulseType.READOUT: readout_map[pulse.id].append(pulse.id) length = sequence.duration + relaxation_time - pulses_per_channel = sequence.pulses_per_channel for channel in channels: - delay = length - pulses_per_channel[channel].duration - total_sequence.append(Delay(duration=delay, channel=channel)) + delay = length - sequence.channel_duration(channel) + total_sequence[channel].append(Delay(duration=delay, channel=channel)) return total_sequence, readout_map @@ -197,7 +196,7 @@ def _set_channels_to_two_qubit_gates(self): channel = getattr( self.qubits[pulse.qubit], pulse.type.name.lower() ).name - new_sequence.append(replace(pulse, channel=channel)) + new_sequence[channel].append(pulse) setattr(gates, fld.name, new_sequence) def __str__(self): @@ -259,7 +258,7 @@ def _controller(self): assert len(controllers) == 1 return controllers[0] - def _execute(self, sequence, channel_config, options, sweepers): + def _execute(self, sequence, channel_cfg, options, sweepers): """Executes sequence on the controllers.""" result = {} @@ -269,7 +268,7 @@ def _execute(self, sequence, channel_config, options, sweepers): self.qubits, self.couplers, sequence, - channel_config, + channel_cfg, options, sweepers, ) @@ -281,7 +280,7 @@ def _execute(self, sequence, channel_config, options, sweepers): def execute( self, sequences: List[PulseSequence], - channel_config: dict[str, ChannelConfig], + channel_cfg: dict[str, ChannelConfig], options: ExecutionParameters, sweepers: Optional[list[ParallelSweepers]] = None, ) -> dict[Any, list]: @@ -311,9 +310,14 @@ def execute( sweeper = [Sweeper(parameter, parameter_range, [pulse])] platform.execute([sequence], ExecutionParameters(), [sweeper]) """ + if channel_cfg: + raise ValueError("Currently, overriding channel configs is not supported.") if sweepers is None: sweepers = [] + if options.nshots is None: + options = replace(options, nshots=self.settings.nshots) + options = self.settings.fill(options) time = estimate_duration(sequences, options, sweepers) @@ -329,7 +333,7 @@ def execute( results = defaultdict(list) for b in batch(sequences, self._controller.bounds): sequence, readouts = unroll_sequences(b, options.relaxation_time) - result = self._execute(sequence, channel_config, options, sweepers) + result = self._execute(sequence, channel_cfg, options, sweepers) for serial, new_serials in readouts.items(): results[serial].extend(result[ser] for ser in new_serials) diff --git a/src/qibolab/pulses/sequence.py b/src/qibolab/pulses/sequence.py index a21eeb0bc4..734c36ce12 100644 --- a/src/qibolab/pulses/sequence.py +++ b/src/qibolab/pulses/sequence.py @@ -2,9 +2,11 @@ from collections import defaultdict +from pulse import PulseType + class PulseSequence(defaultdict): - """Synchronized sequence of pulses across multiple channels. + """Synchronized sequence of control instructions across multiple channels. The keys are names of channels, and the values are lists of pulses and delays @@ -14,13 +16,23 @@ def __init__(self): super().__init__(list) @property - def duration(self) -> int: - """The time when the last pulse of the sequence finishes.""" + def ro_pulses(self): + """A new sequence containing only its readout pulses.""" + pulses = [] + for seq in self.values(): + for pulse in seq: + if pulse.type == PulseType.READOUT: + pulses.append(pulse) + return pulses - def channel_duration(ch: str): - return sum(item.duration for item in self[ch]) + @property + def duration(self) -> int: + """Duration of the entire sequence.""" + return max((self.channel_duration(ch) for ch in self), default=0) - return max((channel_duration(ch) for ch in self), default=0) + def channel_duration(self, channel: str) -> float: + """Duration of the given channel.""" + return sum(item.duration for item in self[channel]) def __add__(self, other: "PulseSequence") -> "PulseSequence": """Create a PulseSequence which is self + necessary delays to diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index d033264970..0db1af5cec 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -3,7 +3,7 @@ import numpy as np -from qibolab.channel_type import Channel +from qibolab.channel import Channel from qibolab.couplers import Coupler from qibolab.native import SingleQubitNatives, TwoQubitNatives From 594ceb4f6badb87328563c6a10f15d4df3b0ed92 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Fri, 26 Apr 2024 09:59:43 +0400 Subject: [PATCH 0256/1006] use OscillatorConfig for TWPA pump --- src/qibolab/channel_configs.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/qibolab/channel_configs.py b/src/qibolab/channel_configs.py index c6933201a4..ab936ade8b 100644 --- a/src/qibolab/channel_configs.py +++ b/src/qibolab/channel_configs.py @@ -16,7 +16,7 @@ class DCChannelConfig: @dataclass(frozen=True) -class LOConfig: +class OscillatorConfig: """Configuration for a local oscillator.""" frequency: float @@ -50,7 +50,7 @@ class IQChannelConfig: frequency: float """The carrier frequency of the channel.""" - lo_config: Optional[LOConfig] + lo_config: Optional[OscillatorConfig] """Configuration for the corresponding LO. None if the channel does not use an LO. @@ -67,8 +67,12 @@ class AcquisitionChannelConfig: """Configuration for acquisition channels.""" type: AcquisitionType - twpa_frequency: float - twpa_power: float + """Type of acquisition.""" + twpa_pump_config: Optional[OscillatorConfig] + """Config for the corresponding TWPA pump. + + None if the channel does not feature a TWPA. + """ ChannelConfig = Union[DCChannelConfig, IQChannelConfig, AcquisitionChannelConfig] From d60418bb04b8c212ce24e481342ce4bb85e9b482 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 30 Apr 2024 12:55:25 +0400 Subject: [PATCH 0257/1006] move channel and channel config definitions into dedicated subpackage --- src/qibolab/channel/__init__.py | 22 +++++++++++++++++++ .../{channel.py => channel/channel_map.py} | 17 ++------------ .../configs.py} | 15 ++++++++----- src/qibolab/dummy/platform.py | 2 +- tests/dummy_qrc/qblox/platform.py | 2 +- tests/dummy_qrc/qm/platform.py | 2 +- tests/dummy_qrc/qm_octave/platform.py | 2 +- tests/dummy_qrc/rfsoc/platform.py | 2 +- tests/dummy_qrc/zurich/platform.py | 2 +- tests/test_channels.py | 2 +- 10 files changed, 41 insertions(+), 27 deletions(-) create mode 100644 src/qibolab/channel/__init__.py rename src/qibolab/{channel.py => channel/channel_map.py} (77%) rename src/qibolab/{channel_configs.py => channel/configs.py} (89%) diff --git a/src/qibolab/channel/__init__.py b/src/qibolab/channel/__init__.py new file mode 100644 index 0000000000..1357d4da03 --- /dev/null +++ b/src/qibolab/channel/__init__.py @@ -0,0 +1,22 @@ +from dataclasses import dataclass +from typing import Union + +from .channel_map import * +from .configs import * + +ChannelConfig = Union[DCChannelConfig, IQChannelConfig, AcquisitionChannelConfig] + + +@dataclass(frozen=True) +class Channel: + """Channel is an abstract concept that defines means of communication + between users and a quantum computer. + + A quantum computer can be perceived as just a set of channels where + signals can be sent to or received from. Channels are identified + with a unique name. The type of a channel is inferred from the type + of config it accepts. + """ + + name: str + config: ChannelConfig diff --git a/src/qibolab/channel.py b/src/qibolab/channel/channel_map.py similarity index 77% rename from src/qibolab/channel.py rename to src/qibolab/channel/channel_map.py index b95051531d..63ae3fcbab 100644 --- a/src/qibolab/channel.py +++ b/src/qibolab/channel/channel_map.py @@ -2,22 +2,9 @@ from qibo.config import raise_error -from .channel_configs import ChannelConfig +from . import Channel - -@dataclass(frozen=True) -class Channel: - """Channel is an abstract concept that defines means of communication - between users and a quantum computer. - - A quantum computer can be perceived as just a set of channels where - signals can be sent to or received from. Channels are identified - with a unique name. The type of a channel is inferred from the type - of config it accepts. - """ - - name: str - config: ChannelConfig +__all__ = ["ChannelMap"] @dataclass diff --git a/src/qibolab/channel_configs.py b/src/qibolab/channel/configs.py similarity index 89% rename from src/qibolab/channel_configs.py rename to src/qibolab/channel/configs.py index ab936ade8b..0f877112a0 100644 --- a/src/qibolab/channel_configs.py +++ b/src/qibolab/channel/configs.py @@ -1,10 +1,18 @@ from dataclasses import dataclass -from typing import Optional, Union +from typing import Optional -from .execution_parameters import AcquisitionType +from qibolab.execution_parameters import AcquisitionType """Common configuration for various channels.""" +__all__ = [ + "DCChannelConfig", + "IQChannelConfig", + "AcquisitionChannelConfig", + "OscillatorConfig", + "IQMixerConfig", +] + @dataclass(frozen=True) class DCChannelConfig: @@ -73,6 +81,3 @@ class AcquisitionChannelConfig: None if the channel does not feature a TWPA. """ - - -ChannelConfig = Union[DCChannelConfig, IQChannelConfig, AcquisitionChannelConfig] diff --git a/src/qibolab/dummy/platform.py b/src/qibolab/dummy/platform.py index 05ce2bed80..888e8e87b8 100644 --- a/src/qibolab/dummy/platform.py +++ b/src/qibolab/dummy/platform.py @@ -1,7 +1,7 @@ import itertools import pathlib -from qibolab.instruments.channels import Channel, ChannelMap +from qibolab.channel import Channel, ChannelMap from qibolab.instruments.dummy import DummyInstrument, DummyLocalOscillator from qibolab.kernels import Kernels from qibolab.platform import Platform diff --git a/tests/dummy_qrc/qblox/platform.py b/tests/dummy_qrc/qblox/platform.py index 8fcbfdacf0..10aa6c0360 100644 --- a/tests/dummy_qrc/qblox/platform.py +++ b/tests/dummy_qrc/qblox/platform.py @@ -1,6 +1,6 @@ import pathlib -from qibolab.instruments.channels import Channel, ChannelMap +from qibolab.channel import Channel, ChannelMap from qibolab.instruments.qblox.cluster_qcm_bb import QcmBb from qibolab.instruments.qblox.cluster_qcm_rf import QcmRf from qibolab.instruments.qblox.cluster_qrm_rf import QrmRf diff --git a/tests/dummy_qrc/qm/platform.py b/tests/dummy_qrc/qm/platform.py index 739cc474a7..d0a4311433 100644 --- a/tests/dummy_qrc/qm/platform.py +++ b/tests/dummy_qrc/qm/platform.py @@ -1,6 +1,6 @@ import pathlib -from qibolab.instruments.channels import Channel, ChannelMap +from qibolab.channel import Channel, ChannelMap from qibolab.instruments.dummy import DummyLocalOscillator as LocalOscillator from qibolab.instruments.qm import OPXplus, QMController from qibolab.platform import Platform diff --git a/tests/dummy_qrc/qm_octave/platform.py b/tests/dummy_qrc/qm_octave/platform.py index 2ba81caf5c..ac11a5fe8a 100644 --- a/tests/dummy_qrc/qm_octave/platform.py +++ b/tests/dummy_qrc/qm_octave/platform.py @@ -1,6 +1,6 @@ import pathlib -from qibolab.instruments.channels import Channel, ChannelMap +from qibolab.channel import Channel, ChannelMap from qibolab.instruments.dummy import DummyLocalOscillator as LocalOscillator from qibolab.instruments.qm import Octave, OPXplus, QMController from qibolab.platform import Platform diff --git a/tests/dummy_qrc/rfsoc/platform.py b/tests/dummy_qrc/rfsoc/platform.py index 32274d2d0a..ef6f5da36c 100644 --- a/tests/dummy_qrc/rfsoc/platform.py +++ b/tests/dummy_qrc/rfsoc/platform.py @@ -1,6 +1,6 @@ import pathlib -from qibolab.instruments.channels import Channel, ChannelMap +from qibolab.channel import Channel, ChannelMap from qibolab.instruments.erasynth import ERA from qibolab.instruments.rfsoc import RFSoC from qibolab.instruments.rohde_schwarz import SGS100A diff --git a/tests/dummy_qrc/zurich/platform.py b/tests/dummy_qrc/zurich/platform.py index 918aaa2dd3..8a984b4af1 100644 --- a/tests/dummy_qrc/zurich/platform.py +++ b/tests/dummy_qrc/zurich/platform.py @@ -6,7 +6,7 @@ from laboneq.simple import DeviceSetup from qibolab import Platform -from qibolab.instruments.channels import Channel, ChannelMap +from qibolab.channel import Channel, ChannelMap from qibolab.instruments.dummy import DummyLocalOscillator as LocalOscillator from qibolab.instruments.zhinst import Zurich from qibolab.kernels import Kernels diff --git a/tests/test_channels.py b/tests/test_channels.py index 7f5b52600c..2e97d847dc 100644 --- a/tests/test_channels.py +++ b/tests/test_channels.py @@ -1,6 +1,6 @@ import pytest -from qibolab.instruments.channels import Channel, ChannelMap +from qibolab.channel import Channel, ChannelMap from qibolab.instruments.dummy import DummyPort From 6c54b3a5278a379c100a7a8fb992f6e508e33b69 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 30 Apr 2024 13:05:31 +0400 Subject: [PATCH 0258/1006] remove channel and qubit properties from pulse --- src/qibolab/compilers/compiler.py | 1 + src/qibolab/compilers/default.py | 8 +--- src/qibolab/platform/platform.py | 61 ++----------------------------- src/qibolab/pulses/pulse.py | 18 +-------- src/qibolab/serialize.py | 39 ++++++-------------- 5 files changed, 20 insertions(+), 107 deletions(-) diff --git a/src/qibolab/compilers/compiler.py b/src/qibolab/compilers/compiler.py index 52d220f3ca..0537cee61d 100644 --- a/src/qibolab/compilers/compiler.py +++ b/src/qibolab/compilers/compiler.py @@ -121,6 +121,7 @@ def get_sequence(self, gate, platform): raise NotImplementedError(f"{type(gate)} is not a native gate.") return gate_sequence + # FIXME: pulse.qubit and pulse.channel do not exist anymore def compile(self, circuit, platform): """Transforms a circuit to pulse sequence. diff --git a/src/qibolab/compilers/default.py b/src/qibolab/compilers/default.py index 70db42f520..1ce546d061 100644 --- a/src/qibolab/compilers/default.py +++ b/src/qibolab/compilers/default.py @@ -16,16 +16,12 @@ def identity_rule(gate, qubit): def z_rule(gate, qubit): """Z gate applied virtually.""" - return PulseSequence( - [VirtualZ(phase=math.pi, channel=qubit.drive.name, qubit=qubit.name)] - ) + return PulseSequence([VirtualZ(phase=math.pi)]) def rz_rule(gate, qubit): """RZ gate applied virtually.""" - return PulseSequence( - [VirtualZ(phase=gate.parameters[0], channel=qubit.drive.name, qubit=qubit.name)] - ) + return PulseSequence([VirtualZ(phase=gate.parameters[0])]) def gpi2_rule(gate, qubit): diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 56ba429cbc..f28cf46feb 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -1,7 +1,7 @@ """A platform for executing quantum algorithms.""" from collections import defaultdict -from dataclasses import dataclass, field, fields +from dataclasses import dataclass, field from math import prod from typing import Any, Dict, List, Optional, Tuple, TypeVar @@ -65,7 +65,7 @@ def unroll_sequences( length = sequence.duration + relaxation_time for channel in channels: delay = length - sequence.channel_duration(channel) - total_sequence[channel].append(Delay(duration=delay, channel=channel)) + total_sequence[channel].append(Delay(duration=delay)) return total_sequence, readout_map @@ -151,53 +151,6 @@ def __post_init__(self): self.topology.add_edges_from( [(pair.qubit1.name, pair.qubit2.name) for pair in self.pairs.values()] ) - self._set_channels_to_single_qubit_gates() - self._set_channels_to_two_qubit_gates() - - def _set_channels_to_single_qubit_gates(self): - """Set channels to pulses that implement single-qubit gates. - - This function should be removed when the duplication caused by - (``pulse.qubit``, ``pulse.type``) -> ``pulse.channel`` - is resolved. For now it just makes sure that the channels of - native pulses are consistent in order to test the rest of the code. - """ - for qubit in self.qubits.values(): - gates = qubit.native_gates - for fld in fields(gates): - pulse = getattr(gates, fld.name) - if pulse is not None: - channel = getattr(qubit, pulse.type.name.lower()).name - setattr(gates, fld.name, replace(pulse, channel=channel)) - for coupler in self.couplers.values(): - if gates.CP is not None: - gates.CP = replace(gates.CP, channel=coupler.flux.name) - - def _set_channels_to_two_qubit_gates(self): - """Set channels to pulses that implement single-qubit gates. - - This function should be removed when the duplication caused by - (``pulse.qubit``, ``pulse.type``) -> ``pulse.channel`` - is resolved. For now it just makes sure that the channels of - native pulses are consistent in order to test the rest of the code. - """ - for pair in self.pairs.values(): - gates = pair.native_gates - for fld in fields(gates): - sequence = getattr(gates, fld.name) - if len(sequence) > 0: - new_sequence = PulseSequence() - for pulse in sequence: - if pulse.type is PulseType.VIRTUALZ: - channel = self.qubits[pulse.qubit].drive.name - elif pulse.type is PulseType.COUPLERFLUX: - channel = self.couplers[pulse.qubit].flux.name - else: - channel = getattr( - self.qubits[pulse.qubit], pulse.type.name.lower() - ).name - new_sequence[channel].append(pulse) - setattr(gates, fld.name, new_sequence) def __str__(self): return self.name @@ -371,7 +324,6 @@ def create_RX90_pulse(self, qubit, relative_phase=0): return replace( qubit.native_gates.RX90, relative_phase=relative_phase, - channel=qubit.drive.name, ) def create_RX_pulse(self, qubit, relative_phase=0): @@ -379,7 +331,6 @@ def create_RX_pulse(self, qubit, relative_phase=0): return replace( qubit.native_gates.RX, relative_phase=relative_phase, - channel=qubit.drive.name, ) def create_RX12_pulse(self, qubit, relative_phase=0): @@ -387,7 +338,6 @@ def create_RX12_pulse(self, qubit, relative_phase=0): return replace( qubit.native_gates.RX12, relative_phase=relative_phase, - channel=qubit.drive.name, ) def create_CZ_pulse_sequence(self, qubits): @@ -419,7 +369,7 @@ def create_CNOT_pulse_sequence(self, qubits): def create_MZ_pulse(self, qubit): qubit = self.get_qubit(qubit) - return replace(qubit.native_gates.MZ, channel=qubit.readout.name) + return replace(qubit.native_gates.MZ) def create_qubit_drive_pulse(self, qubit, duration, relative_phase=0): qubit = self.get_qubit(qubit) @@ -427,7 +377,6 @@ def create_qubit_drive_pulse(self, qubit, duration, relative_phase=0): qubit.native_gates.RX, duration=duration, relative_phase=relative_phase, - channel=qubit.drive.name, ) def create_qubit_readout_pulse(self, qubit): @@ -440,7 +389,7 @@ def create_coupler_pulse(self, coupler, duration=None, amplitude=None): pulse = replace(pulse, duration=duration) if amplitude is not None: pulse = replace(pulse, amplitude=amplitude) - return replace(pulse, channel=coupler.flux.name) + return replace(pulse) # TODO Remove RX90_drag_pulse and RX_drag_pulse, replace them with create_qubit_drive_pulse # TODO Add RY90 and RY pulses @@ -453,7 +402,6 @@ def create_RX90_drag_pulse(self, qubit, beta, relative_phase=0): pulse, relative_phase=relative_phase, envelope=Drag(rel_sigma=pulse.envelope.rel_sigma, beta=beta), - channel=qubit.drive.name, ) def create_RX_drag_pulse(self, qubit, beta, relative_phase=0): @@ -464,5 +412,4 @@ def create_RX_drag_pulse(self, qubit, beta, relative_phase=0): pulse, relative_phase=relative_phase, envelope=Drag(rel_sigma=pulse.envelope.rel_sigma, beta=beta), - channel=qubit.drive.name, ) diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index 3c2c59b55e..a399456758 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -2,7 +2,7 @@ from dataclasses import fields from enum import Enum -from typing import Optional, Union +from typing import Union import numpy as np @@ -51,18 +51,8 @@ class Pulse(Model): """ relative_phase: float = 0.0 """Relative phase of the pulse, in radians.""" - channel: Optional[str] = None - """Channel on which the pulse should be played. - - When a sequence of pulses is sent to the platform for execution, - each pulse is sent to the instrument responsible for playing pulses - the pulse channel. The connection of instruments with channels is - defined in the platform runcard. - """ type: PulseType = PulseType.DRIVE """Pulse type, as an element of PulseType enumeration.""" - qubit: int = 0 - """Qubit or coupler addressed by the pulse.""" @classmethod def flux(cls, **kwargs): @@ -125,8 +115,6 @@ class Delay(Model): duration: int """Delay duration in ns.""" - channel: str - """Channel on which the delay should be implemented.""" type: PulseType = PulseType.DELAY """Type fixed to ``DELAY`` to comply with ``Pulse`` interface.""" @@ -136,10 +124,6 @@ class VirtualZ(Model): phase: float """Phase that implements the rotation.""" - channel: Optional[str] = None - """Channel on which the virtual phase should be added.""" - qubit: int = 0 - """Qubit on the drive of which the virtual phase should be added.""" type: PulseType = PulseType.VIRTUALZ @property diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index 751e287495..8e909e04c6 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -10,8 +10,6 @@ from pathlib import Path from typing import Tuple -from pydantic import ConfigDict, TypeAdapter - from qibolab.couplers import Coupler from qibolab.kernels import Kernels from qibolab.native import SingleQubitNatives, TwoQubitNatives @@ -23,8 +21,7 @@ QubitPairMap, Settings, ) -from qibolab.pulses import Pulse, PulseSequence, PulseType -from qibolab.pulses.pulse import PulseLike +from qibolab.pulses import Delay, Pulse, PulseSequence, PulseType, VirtualZ from qibolab.qubits import Qubit, QubitId, QubitPair RUNCARD = "parameters.json" @@ -100,37 +97,25 @@ def load_qubits( return qubits, couplers, pairs -_PulseLike = TypeAdapter(PulseLike, config=ConfigDict(extra="ignore")) -"""Parse a pulse-like object. - -.. note:: - - Extra arguments are ignored, in order to standardize the qubit handling, since the - :cls:`Delay` object has no `qubit` field. - This will be removed once there won't be any need for dedicated couplers handling. -""" - - -def _load_pulse(pulse_kwargs: dict, qubit: Qubit): - coupler = "coupler" in pulse_kwargs - pulse_kwargs["qubit"] = pulse_kwargs.pop( - "coupler" if coupler else "qubit", qubit.name - ) - - return _PulseLike.validate_python(pulse_kwargs) +def _load_pulse(pulse_kwargs): + if "phase" in pulse_kwargs: + return VirtualZ(**pulse_kwargs) + if "amplitude" not in pulse_kwargs: + return Delay(**pulse_kwargs) + if "frequency" not in pulse_kwargs: + return Pulse.flux(**pulse_kwargs) + return Pulse(**pulse_kwargs) -def _load_single_qubit_natives(qubit, gates) -> SingleQubitNatives: - """Parse native gates of the qubit from the runcard. +def _load_single_qubit_natives(gates) -> SingleQubitNatives: + """Parse native gates from the runcard. Args: - qubit (:class:`qibolab.qubits.Qubit`): Qubit object that the - native gates are acting on. gates (dict): Dictionary with native gate pulse parameters as loaded from the runcard. """ return SingleQubitNatives( - **{name: _load_pulse(kwargs, qubit) for name, kwargs in gates.items()} + **{name: _load_pulse(kwargs) for name, kwargs in gates.items()} ) From 85cefcd8f1d89b9c2ef1e0d2a616ab0425324d7c Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 30 Apr 2024 14:25:44 +0400 Subject: [PATCH 0259/1006] implement appending sequence to a sequnece fix docstring fix: Solve circular import in the channel subpackage fix: Make import relative test: Turn import time error in test time error fix: Drop ports from controller --- src/qibolab/channel/__init__.py | 22 +------------------ .../channel/{channel_map.py => channel.py} | 22 +++++++++++++++---- src/qibolab/channel/configs.py | 6 ++++- src/qibolab/instruments/abstract.py | 20 ----------------- src/qibolab/pulses/sequence.py | 19 ++++++++++------ tests/channel/__init__.py | 0 .../test_channel.py} | 1 - 7 files changed, 36 insertions(+), 54 deletions(-) rename src/qibolab/channel/{channel_map.py => channel.py} (73%) create mode 100644 tests/channel/__init__.py rename tests/{test_channels.py => channel/test_channel.py} (98%) diff --git a/src/qibolab/channel/__init__.py b/src/qibolab/channel/__init__.py index 1357d4da03..f1fd439eb3 100644 --- a/src/qibolab/channel/__init__.py +++ b/src/qibolab/channel/__init__.py @@ -1,22 +1,2 @@ -from dataclasses import dataclass -from typing import Union - -from .channel_map import * +from .channel import * from .configs import * - -ChannelConfig = Union[DCChannelConfig, IQChannelConfig, AcquisitionChannelConfig] - - -@dataclass(frozen=True) -class Channel: - """Channel is an abstract concept that defines means of communication - between users and a quantum computer. - - A quantum computer can be perceived as just a set of channels where - signals can be sent to or received from. Channels are identified - with a unique name. The type of a channel is inferred from the type - of config it accepts. - """ - - name: str - config: ChannelConfig diff --git a/src/qibolab/channel/channel_map.py b/src/qibolab/channel/channel.py similarity index 73% rename from src/qibolab/channel/channel_map.py rename to src/qibolab/channel/channel.py index 63ae3fcbab..627f38a40e 100644 --- a/src/qibolab/channel/channel_map.py +++ b/src/qibolab/channel/channel.py @@ -2,15 +2,29 @@ from qibo.config import raise_error -from . import Channel +from .configs import ChannelConfig -__all__ = ["ChannelMap"] +__all__ = ["Channel", "ChannelMap"] + + +@dataclass(frozen=True) +class Channel: + """Channel is an abstract concept that defines means of communication + between users and a quantum computer. + + A quantum computer can be perceived as just a set of channels where + signals can be sent to or received from. Channels are identified + with a unique name. The type of a channel is inferred from the type + of config it accepts. + """ + + name: str + config: ChannelConfig @dataclass class ChannelMap: - """Collection of :class:`qibolab.designs.channel.Channel` objects - identified by name. + """Collection of :class:`Channel` objects identified by name. Essentially, it allows creating a mapping of names to channels just specifying the names. diff --git a/src/qibolab/channel/configs.py b/src/qibolab/channel/configs.py index 0f877112a0..abbfb659b7 100644 --- a/src/qibolab/channel/configs.py +++ b/src/qibolab/channel/configs.py @@ -1,5 +1,5 @@ from dataclasses import dataclass -from typing import Optional +from typing import Optional, Union from qibolab.execution_parameters import AcquisitionType @@ -11,6 +11,7 @@ "AcquisitionChannelConfig", "OscillatorConfig", "IQMixerConfig", + "ChannelConfig", ] @@ -81,3 +82,6 @@ class AcquisitionChannelConfig: None if the channel does not feature a TWPA. """ + + +ChannelConfig = Union[DCChannelConfig, IQChannelConfig, AcquisitionChannelConfig] diff --git a/src/qibolab/instruments/abstract.py b/src/qibolab/instruments/abstract.py index c42bbdd49b..b73c5cf6d3 100644 --- a/src/qibolab/instruments/abstract.py +++ b/src/qibolab/instruments/abstract.py @@ -4,8 +4,6 @@ from qibolab.unrolling import Bounds -from .port import Port - InstrumentId = str @@ -55,9 +53,6 @@ def setup(self, *args, **kwargs): class Controller(Instrument): """Instrument that can play pulses (using waveform generator).""" - PortType = Port - """Class used by the instrument to instantiate ports.""" - def __init__(self, name, address): super().__init__(name, address) self._ports = {} @@ -78,21 +73,6 @@ def sampling_rate(self): """Sampling rate of control electronics in giga samples per second (GSps).""" - def ports(self, port_name, *args, **kwargs): - """Get ports associated to this controller. - - Args: - port_name: Identifier for the port. The type of the identifier - depends on the specialized port defined for each instrument. - - Returns: - :class:`qibolab.instruments.port.Port` object providing the interface - for setting instrument parameters. - """ - if port_name not in self._ports: - self._ports[port_name] = self.PortType(port_name) - return self._ports[port_name] - @abstractmethod def play(self, *args, **kwargs): """Play a pulse sequence and retrieve feedback. diff --git a/src/qibolab/pulses/sequence.py b/src/qibolab/pulses/sequence.py index 734c36ce12..f19504c76a 100644 --- a/src/qibolab/pulses/sequence.py +++ b/src/qibolab/pulses/sequence.py @@ -2,7 +2,7 @@ from collections import defaultdict -from pulse import PulseType +from .pulse import Delay, PulseType class PulseSequence(defaultdict): @@ -17,7 +17,7 @@ def __init__(self): @property def ro_pulses(self): - """A new sequence containing only its readout pulses.""" + """Return list of the readout pulses in this sequence.""" pulses = [] for seq in self.values(): for pulse in seq: @@ -34,8 +34,13 @@ def channel_duration(self, channel: str) -> float: """Duration of the given channel.""" return sum(item.duration for item in self[channel]) - def __add__(self, other: "PulseSequence") -> "PulseSequence": - """Create a PulseSequence which is self + necessary delays to - synchronize channels + other.""" - # TODO: implement - ... + def append(self, other: "PulseSequence") -> None: + """Appends other in-place such that the result is self + necessary + delays to synchronize channels + other.""" + tol = 1e-12 + durations = {ch: self.channel_duration(ch) for ch in other} + max_duration = max(durations.values(), default=0.0) + for ch, duration in durations.items(): + if delay := round(max_duration - duration, int(1 / tol)) > 0: + self[ch].append(Delay(duration=delay)) + self[ch].extend(other[ch]) diff --git a/tests/channel/__init__.py b/tests/channel/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/test_channels.py b/tests/channel/test_channel.py similarity index 98% rename from tests/test_channels.py rename to tests/channel/test_channel.py index 2e97d847dc..d533726b22 100644 --- a/tests/test_channels.py +++ b/tests/channel/test_channel.py @@ -1,7 +1,6 @@ import pytest from qibolab.channel import Channel, ChannelMap -from qibolab.instruments.dummy import DummyPort def test_channel_init(): From ff8aa8cbc396fb51017a2af39e2747d0680c68b8 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 30 Apr 2024 12:55:25 +0400 Subject: [PATCH 0260/1006] move channel and channel config definitions into dedicated subpackage --- src/qibolab/channel/__init__.py | 74 ++++++++++++++++++++++++++++++++- src/qibolab/channel/channel.py | 73 -------------------------------- src/qibolab/channel/configs.py | 6 +-- tests/channel/test_channel.py | 1 + 4 files changed, 75 insertions(+), 79 deletions(-) delete mode 100644 src/qibolab/channel/channel.py diff --git a/src/qibolab/channel/__init__.py b/src/qibolab/channel/__init__.py index f1fd439eb3..f9eb279e87 100644 --- a/src/qibolab/channel/__init__.py +++ b/src/qibolab/channel/__init__.py @@ -1,2 +1,74 @@ -from .channel import * +from dataclasses import dataclass, field +from typing import Union + +from qibo.config import raise_error + from .configs import * + +ChannelConfig = Union[DCChannelConfig, IQChannelConfig, AcquisitionChannelConfig] + + +@dataclass(frozen=True) +class Channel: + """Channel is an abstract concept that defines means of communication + between users and a quantum computer. + + A quantum computer can be perceived as just a set of channels where + signals can be sent to or received from. Channels are identified + with a unique name. The type of a channel is inferred from the type + of config it accepts. + """ + + name: str + config: ChannelConfig + + +@dataclass +class ChannelMap: + """Collection of :class:`Channel` objects identified by name. + + Essentially, it allows creating a mapping of names to channels just + specifying the names. + """ + + _channels: dict[str, Channel] = field(default_factory=dict) + + def add(self, *items): + """Add multiple items to the channel map. + + If :class: `qibolab.channels.Channel` objects are given they are dded to the channel map. + If a different type is given, a :class: `qibolab.channels.Channel` with the corresponding name + is created and added to the channel map. + """ + for item in items: + self[item.name] = item + return self + + def __getitem__(self, name): + return self._channels[name] + + def __setitem__(self, name, channel): + if not isinstance(channel, Channel): + raise_error( + TypeError, f"Cannot add channel of type {type(channel)} to ChannelMap." + ) + self._channels[name] = channel + + def __contains__(self, name): + return name in self._channels + + def __or__(self, channel_map): + channels = self._channels.copy() + channels.update(channel_map._channels) + return self.__class__(channels) + + def __ior__(self, items): + if not isinstance(items, type(self)): + try: + if isinstance(items, str): + raise TypeError + items = type(self)().add(*items) + except TypeError: + items = type(self)().add(items) + self._channels.update(items._channels) + return self diff --git a/src/qibolab/channel/channel.py b/src/qibolab/channel/channel.py deleted file mode 100644 index 627f38a40e..0000000000 --- a/src/qibolab/channel/channel.py +++ /dev/null @@ -1,73 +0,0 @@ -from dataclasses import dataclass, field - -from qibo.config import raise_error - -from .configs import ChannelConfig - -__all__ = ["Channel", "ChannelMap"] - - -@dataclass(frozen=True) -class Channel: - """Channel is an abstract concept that defines means of communication - between users and a quantum computer. - - A quantum computer can be perceived as just a set of channels where - signals can be sent to or received from. Channels are identified - with a unique name. The type of a channel is inferred from the type - of config it accepts. - """ - - name: str - config: ChannelConfig - - -@dataclass -class ChannelMap: - """Collection of :class:`Channel` objects identified by name. - - Essentially, it allows creating a mapping of names to channels just - specifying the names. - """ - - _channels: dict[str, Channel] = field(default_factory=dict) - - def add(self, *items): - """Add multiple items to the channel map. - - If :class: `qibolab.channels.Channel` objects are given they are dded to the channel map. - If a different type is given, a :class: `qibolab.channels.Channel` with the corresponding name - is created and added to the channel map. - """ - for item in items: - self[item.name] = item - return self - - def __getitem__(self, name): - return self._channels[name] - - def __setitem__(self, name, channel): - if not isinstance(channel, Channel): - raise_error( - TypeError, f"Cannot add channel of type {type(channel)} to ChannelMap." - ) - self._channels[name] = channel - - def __contains__(self, name): - return name in self._channels - - def __or__(self, channel_map): - channels = self._channels.copy() - channels.update(channel_map._channels) - return self.__class__(channels) - - def __ior__(self, items): - if not isinstance(items, type(self)): - try: - if isinstance(items, str): - raise TypeError - items = type(self)().add(*items) - except TypeError: - items = type(self)().add(items) - self._channels.update(items._channels) - return self diff --git a/src/qibolab/channel/configs.py b/src/qibolab/channel/configs.py index abbfb659b7..0f877112a0 100644 --- a/src/qibolab/channel/configs.py +++ b/src/qibolab/channel/configs.py @@ -1,5 +1,5 @@ from dataclasses import dataclass -from typing import Optional, Union +from typing import Optional from qibolab.execution_parameters import AcquisitionType @@ -11,7 +11,6 @@ "AcquisitionChannelConfig", "OscillatorConfig", "IQMixerConfig", - "ChannelConfig", ] @@ -82,6 +81,3 @@ class AcquisitionChannelConfig: None if the channel does not feature a TWPA. """ - - -ChannelConfig = Union[DCChannelConfig, IQChannelConfig, AcquisitionChannelConfig] diff --git a/tests/channel/test_channel.py b/tests/channel/test_channel.py index d533726b22..2e97d847dc 100644 --- a/tests/channel/test_channel.py +++ b/tests/channel/test_channel.py @@ -1,6 +1,7 @@ import pytest from qibolab.channel import Channel, ChannelMap +from qibolab.instruments.dummy import DummyPort def test_channel_init(): From 5abe0b6e397d58a8f4c63e3248fe8046d6d95f16 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Mon, 6 May 2024 12:24:36 +0400 Subject: [PATCH 0261/1006] remove load_instrument_settings since it is replaced by channel config machinery From ce226bc4c0dcce273f5a1e1619b12e992fb29194 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Mon, 6 May 2024 12:28:06 +0400 Subject: [PATCH 0262/1006] ZI channels implementation --- src/qibolab/instruments/zhinst/__init__.py | 1 + src/qibolab/instruments/zhinst/channel.py | 10 ------- .../instruments/zhinst/channel/__init__.py | 19 +++++++++++++ .../configs.py} | 4 ++- src/qibolab/instruments/zhinst/executor.py | 24 ++++++++++++----- src/qibolab/instruments/zhinst/sweep.py | 27 +++++-------------- 6 files changed, 46 insertions(+), 39 deletions(-) delete mode 100644 src/qibolab/instruments/zhinst/channel.py create mode 100644 src/qibolab/instruments/zhinst/channel/__init__.py rename src/qibolab/instruments/zhinst/{channel_configs.py => channel/configs.py} (80%) diff --git a/src/qibolab/instruments/zhinst/__init__.py b/src/qibolab/instruments/zhinst/__init__.py index 6eff487e61..a6efb1004c 100644 --- a/src/qibolab/instruments/zhinst/__init__.py +++ b/src/qibolab/instruments/zhinst/__init__.py @@ -1,3 +1,4 @@ +from .channel import * from .executor import Zurich from .pulse import ZhPulse from .sweep import ProcessedSweeps, classify_sweepers diff --git a/src/qibolab/instruments/zhinst/channel.py b/src/qibolab/instruments/zhinst/channel.py deleted file mode 100644 index 119383d9da..0000000000 --- a/src/qibolab/instruments/zhinst/channel.py +++ /dev/null @@ -1,10 +0,0 @@ -from dataclasses import dataclass - -from qibolab.channel import Channel - - -@dataclass(frozen=True) -class ZIChannel(Channel): - - device: str - path: str diff --git a/src/qibolab/instruments/zhinst/channel/__init__.py b/src/qibolab/instruments/zhinst/channel/__init__.py new file mode 100644 index 0000000000..0d07785956 --- /dev/null +++ b/src/qibolab/instruments/zhinst/channel/__init__.py @@ -0,0 +1,19 @@ +from dataclasses import dataclass + +from qibolab.channel import Channel +from qibolab.instruments.oscillator import LocalOscillator + +from .configs import * + + +@dataclass(frozen=True) +class ZIChannel(Channel): + + device: str + path: str + + +@dataclass(frozen=True) +class ZIAcquisitionChannel(ZIChannel): + + twpa_pump: LocalOscillator diff --git a/src/qibolab/instruments/zhinst/channel_configs.py b/src/qibolab/instruments/zhinst/channel/configs.py similarity index 80% rename from src/qibolab/instruments/zhinst/channel_configs.py rename to src/qibolab/instruments/zhinst/channel/configs.py index 38c87b9090..c465ca2db8 100644 --- a/src/qibolab/instruments/zhinst/channel_configs.py +++ b/src/qibolab/instruments/zhinst/channel/configs.py @@ -1,6 +1,8 @@ from dataclasses import dataclass -from qibolab.channel_configs import DCChannelConfig, IQChannelConfig +from qibolab.channel.configs import DCChannelConfig, IQChannelConfig + +__all__ = ["ZurichDCChannelConfig", "ZurichIQChannelConfig"] @dataclass(frozen=True) diff --git a/src/qibolab/instruments/zhinst/executor.py b/src/qibolab/instruments/zhinst/executor.py index 587c512c0f..2b65cfdb1e 100644 --- a/src/qibolab/instruments/zhinst/executor.py +++ b/src/qibolab/instruments/zhinst/executor.py @@ -7,6 +7,7 @@ import laboneq.simple as laboneq import numpy as np +from laboneq.dsl.device import create_connection from qibo.config import log from qibolab import AcquisitionType, AveragingMode, ExecutionParameters @@ -17,6 +18,7 @@ from qibolab.sweeper import Parameter, Sweeper from qibolab.unrolling import Bounds +from . import ZIChannel from .pulse import ZhPulse from .sweep import ProcessedSweeps, classify_sweepers from .util import ( @@ -71,7 +73,14 @@ class Zurich(Controller): """Driver for a collection of ZI instruments that are automatically synchronized via ZSync protocol.""" - def __init__(self, name, device_setup, time_of_flight=0.0, smearing=0.0): + def __init__( + self, + name, + device_setup, + channels: list[ZIChannel], + time_of_flight=0.0, + smearing=0.0, + ): super().__init__(name, None) self.signal_map = {} @@ -79,6 +88,11 @@ def __init__(self, name, device_setup, time_of_flight=0.0, smearing=0.0): self.calibration = laboneq.Calibration() "Zurich calibration object)" + for ch in channels: + device_setup.add_connections( + ch.device, create_connection(to_signal=ch.name, ports=ch.path) + ) + self.device_setup = device_setup self.session = None "Zurich device parameters for connection" @@ -397,12 +411,8 @@ def sequence_zh( zhsequence = defaultdict(list) # Fill the sequences with pulses according to their lines in temporal order - for pulse in sequence: - if pulse.type == PulseType.READOUT: - ch = measure_channel_name(qubits[pulse.qubit]) - else: - ch = pulse.channel - zhsequence[ch].append(ZhPulse(pulse)) + for ch, pulses in sequence: + zhsequence[ch].extend(ZhPulse(p) for p in pulses) if self.processed_sweeps: for ch, zhpulses in zhsequence.items(): diff --git a/src/qibolab/instruments/zhinst/sweep.py b/src/qibolab/instruments/zhinst/sweep.py index 9078c319a5..eeefa86762 100644 --- a/src/qibolab/instruments/zhinst/sweep.py +++ b/src/qibolab/instruments/zhinst/sweep.py @@ -72,14 +72,12 @@ def __init__(self, sweepers: Iterable[Sweeper], qubits: dict[str, Qubit]): if ptype is PulseType.READOUT: ch = measure_channel_name(qubit) intermediate_frequency = ( - qubit.readout_frequency - - qubit.readout.local_oscillator.frequency + qubit.readout.frequency - qubit.readout.lo_config.frequency ) elif ptype is PulseType.DRIVE: ch = qubit.drive.name intermediate_frequency = ( - qubit.drive_frequency - - qubit.drive.local_oscillator.frequency + qubit.drive.frequency - qubit.drive.lo_config.frequency ) else: raise ValueError( @@ -114,28 +112,15 @@ def __init__(self, sweepers: Iterable[Sweeper], qubits: dict[str, Qubit]): pulse_sweeps.append((pulse, sweeper.parameter, sweep_param)) parallel_sweeps.append((sweeper, sweep_param)) - for qubit in sweeper.qubits or []: + for channel in sweeper.channels or []: if sweeper.parameter is not Parameter.bias: raise ValueError( - f"Sweeping {sweeper.parameter.name} for {qubit} is not supported" + f"Sweeping {sweeper.parameter.name} for {channel} is not supported" ) sweep_param = laboneq.SweepParameter( - values=sweeper.values + qubit.flux.offset - ) - channel_sweeps.append((qubit.flux.name, sweeper.parameter, sweep_param)) - parallel_sweeps.append((sweeper, sweep_param)) - - for coupler in sweeper.couplers or []: - if sweeper.parameter is not Parameter.bias: - raise ValueError( - f"Sweeping {sweeper.parameter.name} for {coupler} is not supported" - ) - sweep_param = laboneq.SweepParameter( - values=sweeper.values + coupler.flux.offset - ) - channel_sweeps.append( - (coupler.flux.name, sweeper.parameter, sweep_param) + values=sweeper.values + channel.config.offset ) + channel_sweeps.append((channel, sweeper.parameter, sweep_param)) parallel_sweeps.append((sweeper, sweep_param)) self._pulse_sweeps = pulse_sweeps From 3247a0d2c86475f6beca76e8778787edd4719845 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Mon, 6 May 2024 14:59:16 +0400 Subject: [PATCH 0263/1006] fix incorrect call of function _load_pulse --- src/qibolab/serialize.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index 8e909e04c6..9dba3422ec 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -119,7 +119,7 @@ def _load_single_qubit_natives(gates) -> SingleQubitNatives: ) -def _load_two_qubit_natives(qubits, couplers, gates) -> TwoQubitNatives: +def _load_two_qubit_natives(gates) -> TwoQubitNatives: sequences = {} for name, seq_kwargs in gates.items(): if isinstance(seq_kwargs, dict): @@ -127,11 +127,7 @@ def _load_two_qubit_natives(qubits, couplers, gates) -> TwoQubitNatives: sequence = PulseSequence() for kwargs in seq_kwargs: - if "coupler" in kwargs: - qubit = couplers[kwargs["coupler"]] - else: - qubit = qubits[kwargs["qubit"]] - sequence.append(_load_pulse(kwargs, qubit)) + sequence.append(_load_pulse(kwargs)) sequences[name] = sequence return TwoQubitNatives(**sequences) @@ -160,7 +156,7 @@ def register_gates( # register two-qubit native gates to ``QubitPair`` objects for pair, gatedict in native_gates.get("two_qubit", {}).items(): q0, q1 = tuple(int(q) if q.isdigit() else q for q in pair.split("-")) - native_gates = _load_two_qubit_natives(qubits, couplers, gatedict) + native_gates = _load_two_qubit_natives(gatedict) coupler = pairs[(q0, q1)].coupler pairs[(q0, q1)] = QubitPair( qubits[q0], qubits[q1], coupler=coupler, native_gates=native_gates From 757afd0c9ea7e484e77c9ca705a84e7f786b1f19 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Mon, 6 May 2024 15:47:19 +0400 Subject: [PATCH 0264/1006] parse two qubit gates represented as raw sequence dict --- src/qibolab/serialize.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index 9dba3422ec..a02090e1f4 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -121,13 +121,10 @@ def _load_single_qubit_natives(gates) -> SingleQubitNatives: def _load_two_qubit_natives(gates) -> TwoQubitNatives: sequences = {} - for name, seq_kwargs in gates.items(): - if isinstance(seq_kwargs, dict): - seq_kwargs = [seq_kwargs] - + for name, raw_sequence in gates.items(): sequence = PulseSequence() - for kwargs in seq_kwargs: - sequence.append(_load_pulse(kwargs)) + for channel, pulses in raw_sequence.items(): + sequence[channel] = [_load_pulse(kwargs) for kwargs in pulses] sequences[name] = sequence return TwoQubitNatives(**sequences) From 59cb3fdf1a32945b06e74a70ecb1f12f35a17a5a Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Mon, 6 May 2024 15:49:28 +0400 Subject: [PATCH 0265/1006] define ZI acquisition channel config with power_range --- .../instruments/zhinst/channel/configs.py | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/qibolab/instruments/zhinst/channel/configs.py b/src/qibolab/instruments/zhinst/channel/configs.py index c465ca2db8..6b0957f2ce 100644 --- a/src/qibolab/instruments/zhinst/channel/configs.py +++ b/src/qibolab/instruments/zhinst/channel/configs.py @@ -1,8 +1,16 @@ from dataclasses import dataclass -from qibolab.channel.configs import DCChannelConfig, IQChannelConfig +from qibolab.channel.configs import ( + AcquisitionChannelConfig, + DCChannelConfig, + IQChannelConfig, +) -__all__ = ["ZurichDCChannelConfig", "ZurichIQChannelConfig"] +__all__ = [ + "ZurichDCChannelConfig", + "ZurichIQChannelConfig", + "ZurichAcquisitionChannelConfig", +] @dataclass(frozen=True) @@ -25,3 +33,14 @@ class ZurichIQChannelConfig(IQChannelConfig): Possible values are [-30. -25. -20. -15. -10. -5. 0. 5. 10.]. """ + + +@dataclass(frozen=True) +class ZurichAcquisitionChannelConfig(AcquisitionChannelConfig): + """Acquisition config for ZI SHF* line instrument.""" + + power_range: float + """Power range in dBm. + + Possible values are [-30. -25. -20. -15. -10. -5. 0. 5. 10.]. + """ From 8e0be2ecb30c685399ed55432b93cfb277a98a32 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 7 May 2024 12:40:15 +0400 Subject: [PATCH 0266/1006] Revert "remove load_instrument_settings since it is replaced by channel config machinery" This reverts commit 5e237b3f9dbd5416dc6c70362e2435f32bc0e853. From 7772d991518b32f1e28489a51ea33fe040115a68 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 7 May 2024 12:43:34 +0400 Subject: [PATCH 0267/1006] update dumping 2qb natives to dump pulse sequence --- src/qibolab/serialize.py | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index a02090e1f4..136b75fa42 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -190,6 +190,10 @@ def _dump_pulse(pulse: Pulse): return data +def _dump_sequence(sequence: PulseSequence): + return {ch: [_dump_pulse(p) for p in pulses] for ch, pulses in sequence.items()} + + def _dump_single_qubit_natives(natives: SingleQubitNatives): data = {} for fld in fields(natives): @@ -201,17 +205,9 @@ def _dump_single_qubit_natives(natives: SingleQubitNatives): def _dump_two_qubit_natives(natives: TwoQubitNatives): - data = {} - for fld in fields(natives): - sequence = getattr(natives, fld.name) - if len(sequence) > 0: - data[fld.name] = [] - for pulse in sequence: - pulse_serial = _dump_pulse(pulse) - if pulse.type == PulseType.COUPLERFLUX: - pulse_serial["coupler"] = pulse_serial.pop("qubit") - data[fld.name].append(pulse_serial) - return data + return { + fld.name: _dump_sequence(getattr(natives, fld.name)) for fld in fields(natives) + } def dump_native_gates( From 27e504d0d07dcd5cb59ccdf4507b28dc910185d5 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 7 May 2024 12:43:51 +0400 Subject: [PATCH 0268/1006] remove redundant line --- src/qibolab/serialize.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index 136b75fa42..96b6d0a08d 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -200,7 +200,6 @@ def _dump_single_qubit_natives(natives: SingleQubitNatives): pulse = getattr(natives, fld.name) if pulse is not None: data[fld.name] = _dump_pulse(pulse) - del data[fld.name]["qubit"] return data From 6a8b3816664904ad13b4fcaeb048dc3f19c55abc Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Wed, 8 May 2024 09:54:27 +0400 Subject: [PATCH 0269/1006] adapt sweep processing to channels --- src/qibolab/instruments/zhinst/executor.py | 10 ++--- src/qibolab/instruments/zhinst/sweep.py | 52 ++++++++++------------ 2 files changed, 28 insertions(+), 34 deletions(-) diff --git a/src/qibolab/instruments/zhinst/executor.py b/src/qibolab/instruments/zhinst/executor.py index 2b65cfdb1e..396987c584 100644 --- a/src/qibolab/instruments/zhinst/executor.py +++ b/src/qibolab/instruments/zhinst/executor.py @@ -92,11 +92,12 @@ def __init__( device_setup.add_connections( ch.device, create_connection(to_signal=ch.name, ports=ch.path) ) - self.device_setup = device_setup self.session = None "Zurich device parameters for connection" + self.channels = {ch.name: ch for ch in channels} + self.time_of_flight = time_of_flight self.smearing = smearing "Parameters read from the runcard not part of ExecutionParameters" @@ -321,7 +322,7 @@ def create_sub_sequences( Returns list of subsequences and a set of channel names that were not split """ - measure_channels = {measure_channel_name(qb) for qb in qubits} + measure_channels = {qb.readout.name for qb in qubits} other_channels = set(self.sequence.keys()) - measure_channels measurement_groups = defaultdict(list) @@ -411,7 +412,7 @@ def sequence_zh( zhsequence = defaultdict(list) # Fill the sequences with pulses according to their lines in temporal order - for ch, pulses in sequence: + for ch, pulses in sequence.items(): zhsequence[ch].extend(ZhPulse(p) for p in pulses) if self.processed_sweeps: @@ -710,8 +711,7 @@ def sweep( """Play pulse and sweepers sequence.""" self.signal_map = {} - self.frequency_from_pulses(qubits, sequence) - self.processed_sweeps = ProcessedSweeps(sweepers, qubits) + self.processed_sweeps = ProcessedSweeps(sweepers, qubits, self.channels) self.nt_sweeps, self.rt_sweeps = classify_sweepers(sweepers) self.acquisition_type = None diff --git a/src/qibolab/instruments/zhinst/sweep.py b/src/qibolab/instruments/zhinst/sweep.py index eeefa86762..10eae270c5 100644 --- a/src/qibolab/instruments/zhinst/sweep.py +++ b/src/qibolab/instruments/zhinst/sweep.py @@ -10,6 +10,7 @@ from qibolab.qubits import Qubit from qibolab.sweeper import Parameter, Sweeper +from . import ZIChannel from .util import NANO_TO_SECONDS, measure_channel_name @@ -56,7 +57,12 @@ class ProcessedSweeps: in the sweep loop definition """ - def __init__(self, sweepers: Iterable[Sweeper], qubits: dict[str, Qubit]): + def __init__( + self, + sweepers: Iterable[Sweeper], + qubits: dict[str, Qubit], + channels: dict[str, ZIChannel], + ): pulse_sweeps = [] channel_sweeps = [] parallel_sweeps = [] @@ -67,26 +73,6 @@ def __init__(self, sweepers: Iterable[Sweeper], qubits: dict[str, Qubit]): values=sweeper.values * NANO_TO_SECONDS ) pulse_sweeps.append((pulse, sweeper.parameter, sweep_param)) - elif sweeper.parameter is Parameter.frequency: - ptype, qubit = pulse.type, qubits[pulse.qubit] - if ptype is PulseType.READOUT: - ch = measure_channel_name(qubit) - intermediate_frequency = ( - qubit.readout.frequency - qubit.readout.lo_config.frequency - ) - elif ptype is PulseType.DRIVE: - ch = qubit.drive.name - intermediate_frequency = ( - qubit.drive.frequency - qubit.drive.lo_config.frequency - ) - else: - raise ValueError( - f"Cannot sweep frequency of pulse of type {ptype}, because it does not have associated frequency" - ) - sweep_param = laboneq.SweepParameter( - values=sweeper.values + intermediate_frequency - ) - channel_sweeps.append((ch, sweeper.parameter, sweep_param)) elif ( pulse.type is PulseType.READOUT and sweeper.parameter is Parameter.amplitude @@ -102,7 +88,7 @@ def __init__(self, sweepers: Iterable[Sweeper], qubits: dict[str, Qubit]): channel_sweeps.append( ( - measure_channel_name(qubits[pulse.qubit]), + measure_channel_name(qubits[pulse.qubit]), # FIXME sweeper.parameter, sweep_param, ) @@ -112,15 +98,23 @@ def __init__(self, sweepers: Iterable[Sweeper], qubits: dict[str, Qubit]): pulse_sweeps.append((pulse, sweeper.parameter, sweep_param)) parallel_sweeps.append((sweeper, sweep_param)) - for channel in sweeper.channels or []: - if sweeper.parameter is not Parameter.bias: + for ch in sweeper.channels or []: + if sweeper.parameter is Parameter.bias: + sweep_param = laboneq.SweepParameter( + values=sweeper.values + ch.config.offset + ) + elif sweeper.parameter is Parameter.frequency: + intermediate_frequency = ( + channels[ch].frequency - channels[ch].lo_config.frequency + ) + sweep_param = laboneq.SweepParameter( + values=sweeper.values + intermediate_frequency + ) + else: raise ValueError( - f"Sweeping {sweeper.parameter.name} for {channel} is not supported" + f"Sweeping {sweeper.parameter.name} for {ch} is not supported" ) - sweep_param = laboneq.SweepParameter( - values=sweeper.values + channel.config.offset - ) - channel_sweeps.append((channel, sweeper.parameter, sweep_param)) + channel_sweeps.append((ch, sweeper.parameter, sweep_param)) parallel_sweeps.append((sweeper, sweep_param)) self._pulse_sweeps = pulse_sweeps From 36e983fe51cc9aac8ca1b8788a44c7ee99a7132c Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Wed, 8 May 2024 09:57:21 +0400 Subject: [PATCH 0270/1006] remove redundant function frequency_from_pulses --- src/qibolab/instruments/zhinst/executor.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/qibolab/instruments/zhinst/executor.py b/src/qibolab/instruments/zhinst/executor.py index 396987c584..6c2c681f6d 100644 --- a/src/qibolab/instruments/zhinst/executor.py +++ b/src/qibolab/instruments/zhinst/executor.py @@ -304,16 +304,6 @@ def run_exp(self): ) self.results = self.session.run(compiled_experiment) - @staticmethod - def frequency_from_pulses(qubits, sequence): - """Gets the frequencies from the pulses to the qubits.""" - for pulse in sequence: - qubit = qubits[pulse.qubit] - if pulse.type is PulseType.READOUT: - qubit.readout_frequency = pulse.frequency - if pulse.type is PulseType.DRIVE: - qubit.drive_frequency = pulse.frequency - def create_sub_sequences( self, qubits: list[Qubit] ) -> tuple[list[SubSequence], set[str]]: From 25ac0d4c0cfac016cde5acf8b750b25ec9d64aaf Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 14 May 2024 16:42:19 +0400 Subject: [PATCH 0271/1006] introduce small mixin classes for channel definitions --- src/qibolab/channel/__init__.py | 35 +++++++++++++++++++ .../instruments/zhinst/channel/__init__.py | 10 +++--- 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/src/qibolab/channel/__init__.py b/src/qibolab/channel/__init__.py index f9eb279e87..d19ae9058e 100644 --- a/src/qibolab/channel/__init__.py +++ b/src/qibolab/channel/__init__.py @@ -23,6 +23,41 @@ class Channel: config: ChannelConfig +@dataclass(frozen=True) +class WithExternalLo: + """Mixin class to be used for instrument specific IQ channel definitions, + in case the instrument does not have internal up-conversion unit and relies + on an external local oscillator (LO).""" + + lo: str + """The name of the external local oscillator instrument.""" + + +@dataclass(frozen=True) +class WithExternalTwpaPump: + """Mixin class to be used for instrument specific acquisition channel + definitions, in case the instrument does not have built-in oscillator + dedicated as TWPA pump and an external TWPA pump should be used.""" + + twpa_pump: str + """The name of the oscillator instrument used as TWPA pump.""" + + +def external_config(channel: Channel) -> dict[str, str]: + """Identifies which parts of the configuration of given channel should be + used to configure and externally connected supplementary instrument. + + Returns: + Dictionary mapping config attribute to instrument name. + """ + + if isinstance(channel, WithExternalLo): + return {"lo": channel.lo} + if isinstance(channel, WithExternalTwpaPump): + return {"twpa_pump": channel.twpa_pump} + return {} + + @dataclass class ChannelMap: """Collection of :class:`Channel` objects identified by name. diff --git a/src/qibolab/instruments/zhinst/channel/__init__.py b/src/qibolab/instruments/zhinst/channel/__init__.py index 0d07785956..cb7a3d69e8 100644 --- a/src/qibolab/instruments/zhinst/channel/__init__.py +++ b/src/qibolab/instruments/zhinst/channel/__init__.py @@ -1,19 +1,19 @@ from dataclasses import dataclass -from qibolab.channel import Channel -from qibolab.instruments.oscillator import LocalOscillator +from qibolab.channel import Channel, WithExternalTwpaPump from .configs import * @dataclass(frozen=True) class ZIChannel(Channel): + """Channel for Zurich Instruments (ZI) devices.""" device: str + """Name of the device.""" path: str + """Path of the device node.""" @dataclass(frozen=True) -class ZIAcquisitionChannel(ZIChannel): - - twpa_pump: LocalOscillator +class ZiAcquisitionChannel(WithExternalTwpaPump, ZIChannel): ... From d017f99063782c4bf8fdf2bed2a9711dad21a7c3 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 14 May 2024 16:43:02 +0400 Subject: [PATCH 0272/1006] add frequency to the list of channel related parameters --- src/qibolab/sweeper.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/qibolab/sweeper.py b/src/qibolab/sweeper.py index bc95e09460..3e95454a96 100644 --- a/src/qibolab/sweeper.py +++ b/src/qibolab/sweeper.py @@ -38,7 +38,12 @@ class SweeperType(Enum): OFFSET = operator.add -ChannelParameter = {Parameter.bias, Parameter.attenuation, Parameter.gain} +ChannelParameter = { + Parameter.frequency, + Parameter.bias, + Parameter.attenuation, + Parameter.gain, +} @dataclass From 8934fe2822937cef878566a00cd7e3a8e3c1fda1 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 14 May 2024 16:44:37 +0400 Subject: [PATCH 0273/1006] implement function to load channel configs from serialized runcard --- src/qibolab/serialize.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index 96b6d0a08d..10daa1b3c1 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -10,6 +10,7 @@ from pathlib import Path from typing import Tuple +from qibolab.channel import IQMixerConfig, OscillatorConfig from qibolab.couplers import Coupler from qibolab.kernels import Kernels from qibolab.native import SingleQubitNatives, TwoQubitNatives @@ -21,7 +22,7 @@ QubitPairMap, Settings, ) -from qibolab.pulses import Delay, Pulse, PulseSequence, PulseType, VirtualZ +from qibolab.pulses import Delay, Pulse, PulseSequence, VirtualZ from qibolab.qubits import Qubit, QubitId, QubitPair RUNCARD = "parameters.json" @@ -180,6 +181,19 @@ def dump_qubit_name(name: QubitId) -> str: return name +def load_channel_configs(runcard: dict) -> dict[str, dict]: + """Load configurations for channels.""" + configs = runcard["channels"] + for ch, cfg in configs.items(): + if "lo_config" in cfg and cfg["lo_config"] is not None: + cfg["lo_config"] = OscillatorConfig(**cfg["lo_config"]) + if "twpa_pump_config" in cfg and cfg["twpa_pump_config"] is not None: + cfg["twpa_pump_config"] = OscillatorConfig(**cfg["twpa_pump_config"]) + if "mixer_config" in cfg and cfg["mixer_config"] is not None: + cfg["mixer_config"] = IQMixerConfig(**cfg["mixer_config"]) + return configs + + def _dump_pulse(pulse: Pulse): data = pulse.model_dump() data["type"] = data["type"].value From 31784dc1f2e46f0bd18b0e2cf2eacc578f436ba1 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 14 May 2024 16:47:05 +0400 Subject: [PATCH 0274/1006] implement processing of channel sweeps; remove subsecuence splitting related logic --- src/qibolab/instruments/zhinst/executor.py | 448 ++++++++------------- src/qibolab/instruments/zhinst/sweep.py | 5 +- 2 files changed, 181 insertions(+), 272 deletions(-) diff --git a/src/qibolab/instruments/zhinst/executor.py b/src/qibolab/instruments/zhinst/executor.py index 6c2c681f6d..10dc848690 100644 --- a/src/qibolab/instruments/zhinst/executor.py +++ b/src/qibolab/instruments/zhinst/executor.py @@ -2,18 +2,18 @@ import re from collections import defaultdict -from dataclasses import dataclass, replace +from dataclasses import dataclass +from itertools import chain from typing import Any, Optional import laboneq.simple as laboneq import numpy as np from laboneq.dsl.device import create_connection -from qibo.config import log from qibolab import AcquisitionType, AveragingMode, ExecutionParameters from qibolab.couplers import Coupler from qibolab.instruments.abstract import Controller -from qibolab.pulses import PulseSequence, PulseType +from qibolab.pulses import PulseSequence from qibolab.qubits import Qubit from qibolab.sweeper import Parameter, Sweeper from qibolab.unrolling import Bounds @@ -21,12 +21,7 @@ from . import ZIChannel from .pulse import ZhPulse from .sweep import ProcessedSweeps, classify_sweepers -from .util import ( - NANO_TO_SECONDS, - SAMPLING_RATE, - acquire_channel_name, - measure_channel_name, -) +from .util import NANO_TO_SECONDS, SAMPLING_RATE COMPILER_SETTINGS = { "SHFSG_MIN_PLAYWAVE_HINT": 32, @@ -98,6 +93,8 @@ def __init__( self.channels = {ch.name: ch for ch in channels} + self.chanel_to_qubit = {} + self.time_of_flight = time_of_flight self.smearing = smearing "Parameters read from the runcard not part of ExecutionParameters" @@ -115,12 +112,8 @@ def __init__( self.acquisition_type = None "To store if the AcquisitionType.SPECTROSCOPY needs to be enabled by parsing the sequence" - self.sequence = defaultdict(list) - "Zurich pulse sequence" - self.sub_sequences: list[SubSequence] = [] - "Sub sequences between each measurement" - self.unsplit_channels: set[str] = set() - "Names of channels that were not split into sub-sequences" + self.sequences = defaultdict(list) + "Zurich pulse sequences" self.processed_sweeps: Optional[ProcessedSweeps] = None self.nt_sweeps: list[Sweeper] = [] @@ -155,17 +148,17 @@ def calibration_step(self, qubits, couplers, options): for qubit in qubits.values(): if qubit.flux is not None: self.register_flux_line(qubit) - if len(self.sequence[qubit.drive.name]) != 0: + if any(len(seq[qubit.drive.name]) != 0 for seq in self.sequences): self.register_drive_line( qubit=qubit, intermediate_frequency=qubit.drive_frequency - - qubit.drive.local_oscillator.frequency, + - qubit.drive.config.lo_config.frequency, ) - if len(self.sequence[measure_channel_name(qubit)]) != 0: + if any(len(seq[qubit.readout.name]) != 0 for seq in self.sequences): self.register_readout_line( qubit=qubit, intermediate_frequency=qubit.readout_frequency - - qubit.readout.local_oscillator.frequency, + - qubit.readout.config.lo_config.frequency, options=options, ) self.device_setup.set_calibration(self.calibration) @@ -190,32 +183,23 @@ def register_readout_line(self, qubit, intermediate_frequency, options): ) """ - q = qubit.name # pylint: disable=C0103 - self.signal_map[measure_channel_name(qubit)] = ( - self.device_setup.logical_signal_groups[f"q{q}"].logical_signals[ - "measure_line" - ] - ) - self.calibration[f"/logical_signal_groups/q{q}/measure_line"] = ( - laboneq.SignalCalibration( - oscillator=laboneq.Oscillator( - frequency=intermediate_frequency, - modulation_type=laboneq.ModulationType.SOFTWARE, - ), - local_oscillator=laboneq.Oscillator( - frequency=int(qubit.readout.local_oscillator.frequency), - ), - range=qubit.readout.power_range, - port_delay=None, - delay_signal=0, - ) + measure_signal = self.device_setup.logical_signal_by_uid(qubit.readout.name) + self.signal_map[qubit.readout.name] = measure_signal + self.calibration[measure_signal.path] = laboneq.SignalCalibration( + oscillator=laboneq.Oscillator( + frequency=intermediate_frequency, + modulation_type=laboneq.ModulationType.SOFTWARE, + ), + local_oscillator=laboneq.Oscillator( + frequency=int(qubit.readout.config.lo_config.frequency), + ), + range=qubit.readout.config.power_range, + port_delay=None, + delay_signal=0, ) - self.signal_map[acquire_channel_name(qubit)] = ( - self.device_setup.logical_signal_groups[f"q{q}"].logical_signals[ - "acquire_line" - ] - ) + acquire_signal = self.device_setup.logical_signal_by_uid(qubit.acquisition.name) + self.signal_map[qubit.acquisition.name] = acquire_signal oscillator = laboneq.Oscillator( frequency=intermediate_frequency, @@ -231,64 +215,50 @@ def register_readout_line(self, qubit, intermediate_frequency, options): # To keep compatibility with angle and threshold discrimination (Remove when possible) threshold = qubit.threshold - self.calibration[f"/logical_signal_groups/q{q}/acquire_line"] = ( - laboneq.SignalCalibration( - oscillator=oscillator, - range=qubit.feedback.power_range, - port_delay=self.time_of_flight * NANO_TO_SECONDS, - threshold=threshold, - ) + self.calibration[acquire_signal.path] = laboneq.SignalCalibration( + oscillator=oscillator, + range=qubit.acquisition.config.power_range, + port_delay=self.time_of_flight * NANO_TO_SECONDS, + threshold=threshold, ) def register_drive_line(self, qubit, intermediate_frequency): """Registers qubit drive line to calibration and signal map.""" - q = qubit.name # pylint: disable=C0103 - self.signal_map[qubit.drive.name] = self.device_setup.logical_signal_groups[ - f"q{q}" - ].logical_signals["drive_line"] - self.calibration[f"/logical_signal_groups/q{q}/drive_line"] = ( - laboneq.SignalCalibration( - oscillator=laboneq.Oscillator( - frequency=intermediate_frequency, - modulation_type=laboneq.ModulationType.HARDWARE, - ), - local_oscillator=laboneq.Oscillator( - frequency=int(qubit.drive.local_oscillator.frequency), - ), - range=qubit.drive.power_range, - port_delay=None, - delay_signal=0, - ) + drive_signal = self.device_setup.logical_signal_by_uid(qubit.drive.name) + self.signal_map[qubit.drive.name] = drive_signal + self.calibration[drive_signal.path] = laboneq.SignalCalibration( + oscillator=laboneq.Oscillator( + frequency=intermediate_frequency, + modulation_type=laboneq.ModulationType.HARDWARE, + ), + local_oscillator=laboneq.Oscillator( + frequency=int(qubit.drive.config.lo_config.frequency), + ), + range=qubit.drive.config.power_range, + port_delay=None, + delay_signal=0, ) def register_flux_line(self, qubit): """Registers qubit flux line to calibration and signal map.""" - q = qubit.name # pylint: disable=C0103 - self.signal_map[qubit.flux.name] = self.device_setup.logical_signal_groups[ - f"q{q}" - ].logical_signals["flux_line"] - self.calibration[f"/logical_signal_groups/q{q}/flux_line"] = ( - laboneq.SignalCalibration( - range=qubit.flux.power_range, - port_delay=None, - delay_signal=0, - voltage_offset=qubit.flux.offset, - ) + flux_signal = self.device_setup.logical_signal_by_uid(qubit.flux.name) + self.signal_map[qubit.flux.name] = flux_signal + self.calibration[flux_signal.name] = laboneq.SignalCalibration( + range=qubit.flux.config.power_range, + port_delay=None, + delay_signal=0, + voltage_offset=qubit.flux.config.offset, ) def register_couplerflux_line(self, coupler): """Registers qubit flux line to calibration and signal map.""" - c = coupler.name # pylint: disable=C0103 - self.signal_map[coupler.flux.name] = self.device_setup.logical_signal_groups[ - f"qc{c}" - ].logical_signals["flux_line"] - self.calibration[f"/logical_signal_groups/qc{c}/flux_line"] = ( - laboneq.SignalCalibration( - range=coupler.flux.power_range, - port_delay=None, - delay_signal=0, - voltage_offset=coupler.flux.offset, - ) + flux_signal = self.device_setup.logical_signal_by_uid(coupler.flux.name) + self.signal_map[coupler.flux.name] = flux_signal + self.calibration[flux_signal.path] = laboneq.SignalCalibration( + range=coupler.flux.config.power_range, + port_delay=None, + delay_signal=0, + voltage_offset=coupler.flux.config.offset, ) def run_exp(self): @@ -304,67 +274,11 @@ def run_exp(self): ) self.results = self.session.run(compiled_experiment) - def create_sub_sequences( - self, qubits: list[Qubit] - ) -> tuple[list[SubSequence], set[str]]: - """Create subsequences based on locations of measurements. - - Returns list of subsequences and a set of channel names that - were not split - """ - measure_channels = {qb.readout.name for qb in qubits} - other_channels = set(self.sequence.keys()) - measure_channels - - measurement_groups = defaultdict(list) - for ch in measure_channels: - for i, pulse in enumerate(self.sequence[ch]): - measurement_groups[i].append((ch, pulse)) - - measurement_start_end = {} - for i, group in measurement_groups.items(): - starts = np.array([meas.pulse.start for _, meas in group]) - ends = np.array([meas.pulse.finish for _, meas in group]) - measurement_start_end[i] = ( - max(starts), - max(ends), - ) # max is intended for float arithmetic errors only - - # FIXME: this is a hotfix specifically made for any flux experiments in flux pulse mode, where the flux - # pulses extend through the entire duration of the experiment. This should be removed once the sub-sequence - # splitting logic is removed from the driver. - channels_overlapping_measurement = set() - if len(measurement_groups) == 1: - for ch in other_channels: - for pulse in self.sequence[ch]: - if not pulse.pulse.type in (PulseType.FLUX, PulseType.COUPLERFLUX): - break - start, end = measurement_start_end[0] - if pulse.pulse.start < end and pulse.pulse.finish > start: - channels_overlapping_measurement.add(ch) - break - - # split non-measurement channels according to the locations of the measurements - sub_sequences = defaultdict(lambda: defaultdict(list)) - for ch in other_channels - channels_overlapping_measurement: - measurement_index = 0 - for pulse in self.sequence[ch]: - start, _ = measurement_start_end[measurement_index] - if pulse.pulse.finish > start: - measurement_index += 1 - sub_sequences[measurement_index][ch].append(pulse) - if len(sub_sequences) > len(measurement_groups): - log.warning("There are control pulses after the last measurement start.") - - return [ - SubSequence(measurement_groups[i], sub_sequences[i]) - for i in range(len(measurement_groups)) - ], channels_overlapping_measurement - def experiment_flow( self, qubits: dict[str, Qubit], couplers: dict[str, Coupler], - sequence: PulseSequence, + sequences: list[PulseSequence], options: ExecutionParameters, ): """Create the experiment object for the devices, following the steps @@ -373,14 +287,12 @@ def experiment_flow( Translation, Calibration, Experiment Definition. Args: - qubits (dict[str, Qubit]): qubits for the platform. - couplers (dict[str, Coupler]): couplers for the platform. - sequence (PulseSequence): sequence of pulses to be played in the experiment. + qubits: qubits for the platform. + couplers: couplers for the platform. + sequences: list of sequences to be played in the experiment. + options: execution options/parameters """ - self.sequence = self.sequence_zh(sequence, qubits) - self.sub_sequences, self.unsplit_channels = self.create_sub_sequences( - list(qubits.values()) - ) + self.sequences = [self.sequence_zh(seq, qubits) for seq in sequences] self.calibration_step(qubits, couplers, options) self.create_exp(qubits, options) @@ -422,8 +334,11 @@ def create_exp(self, qubits, options): else: acquisition_type = ACQUISITION_TYPE[options.acquisition_type] averaging_mode = AVERAGING_MODE[options.averaging_mode] - exp_options = replace( - options, acquisition_type=acquisition_type, averaging_mode=averaging_mode + exp_options = options.copy( + update={ + "acquisition_type": acquisition_type, + "averaging_mode": averaging_mode, + } ) signals = [laboneq.ExperimentSignal(name) for name in self.signal_map.keys()] @@ -504,7 +419,8 @@ def set_calibration_for_rt_sweep(self, exp: laboneq.Experiment) -> None: if self.processed_sweeps: calib = laboneq.Calibration() for ch in ( - set(self.sequence.keys()) | self.processed_sweeps.channels_with_sweeps() + set(chain(*(seq.keys() for seq in self.sequences))) + | self.processed_sweeps.channels_with_sweeps() ): for param, sweep_param in self.processed_sweeps.sweeps_for_channel(ch): if param is Parameter.frequency: @@ -552,124 +468,110 @@ def get_channel_node_path(self, channel_name: str) -> str: def select_exp(self, exp, qubits, exp_options): """Build Zurich Experiment selecting the relevant sections.""" - # channels that were not split are just applied in parallel to the rest of the experiment - with exp.section(uid="unsplit_channels"): - for ch in self.unsplit_channels: - for pulse in self.sequence[ch]: - exp.delay(signal=ch, time=pulse.pulse.start) - self.play_sweep(exp, ch, pulse) - + readout_channels = set( + chain(*([qb.readout.name, qb.acquisition.name] for qb in qubits.values())) + ) weights = {} previous_section = None - for i, seq in enumerate(self.sub_sequences): - section_uid = f"control_{i}" + for i, seq in enumerate(self.sequences): + other_channels = set(seq.keys()) - readout_channels + section_uid = f"sequence_{i}" with exp.section(uid=section_uid, play_after=previous_section): - for ch, pulses in seq.control_sequence.items(): - time = 0 - for pulse in pulses: - if pulse.delay_sweeper: - exp.delay(signal=ch, time=pulse.delay_sweeper) - exp.delay( - signal=ch, - time=round(pulse.pulse.start * NANO_TO_SECONDS, 9) - time, - ) - time = round(pulse.pulse.duration * NANO_TO_SECONDS, 9) + round( - pulse.pulse.start * NANO_TO_SECONDS, 9 - ) - if pulse.zhsweepers: - self.play_sweep(exp, ch, pulse) - else: - exp.play( - signal=ch, - pulse=pulse.zhpulse, - phase=pulse.pulse.relative_phase, + with exp.section(uid=f"sequence_{i}_control"): + for ch in other_channels: + for pulse in seq[ch]: + if pulse.delay_sweeper: + exp.delay(signal=ch, time=pulse.delay_sweeper) + if pulse.zhsweepers: + self.play_sweep(exp, ch, pulse) + else: + exp.play( + signal=ch, + pulse=pulse.zhpulse, + phase=pulse.pulse.relative_phase, + ) + for ch in set(seq.keys()) - other_channels: + for j, pulse in enumerate(seq[ch]): + with exp.section(uid=f"sequence_{i}_measure_{j}"): + qubit = self.chanel_to_qubit[ch] + + exp.delay( + signal=qubit.acquisition.name, + time=self.smearing * NANO_TO_SECONDS, ) - previous_section = section_uid - - if any(m.delay_sweeper is not None for _, m in seq.measurements): - section_uid = f"measurement_delay_{i}" - with exp.section(uid=section_uid, play_after=previous_section): - for ch, m in seq.measurements: - if m.delay_sweeper: - exp.delay(signal=ch, time=m.delay_sweeper) - previous_section = section_uid - section_uid = f"measure_{i}" - with exp.section(uid=section_uid, play_after=previous_section): - for ch, pulse in seq.measurements: - qubit = qubits[pulse.pulse.qubit] - q = qubit.name - - exp.delay( - signal=acquire_channel_name(qubit), - time=self.smearing * NANO_TO_SECONDS, - ) + weight = self._get_weights( + weights, qubit, pulse, i, exp_options + ) - if ( - qubit.kernel is not None - and exp_options.acquisition_type - == laboneq.AcquisitionType.DISCRIMINATION - ): - weight = laboneq.pulse_library.sampled_pulse_complex( - samples=qubit.kernel * np.exp(1j * qubit.iq_angle), - ) + measure_pulse_parameters = {"phase": 0} - else: - if i == 0: - if ( - exp_options.acquisition_type - == laboneq.AcquisitionType.DISCRIMINATION - ): - weight = laboneq.pulse_library.sampled_pulse_complex( - samples=np.ones( - [ - int( - pulse.pulse.duration * 2 - - 3 * self.smearing * NANO_TO_SECONDS - ) - ] - ) - * np.exp(1j * qubit.iq_angle), + if j == len(seq[ch]) - 1: + reset_delay = ( + exp_options.relaxation_time * NANO_TO_SECONDS ) - weights[q] = weight else: - weight = laboneq.pulse_library.const( - length=round( - pulse.pulse.duration * NANO_TO_SECONDS, 9 - ) - - 1.5 * self.smearing * NANO_TO_SECONDS, - amplitude=1, - ) + reset_delay = 0.0 + + exp.measure( + acquire_signal=qubit.acquisition.name, + handle=f"sequence{qubit.name}_{i}", + integration_kernel=weight, + integration_kernel_parameters=None, + integration_length=None, + measure_signal=qubit.readout.name, + measure_pulse=pulse.zhpulse, + measure_pulse_length=round( + pulse.pulse.duration * NANO_TO_SECONDS, 9 + ), + measure_pulse_parameters=measure_pulse_parameters, + measure_pulse_amplitude=None, + acquire_delay=self.time_of_flight * NANO_TO_SECONDS, + reset_delay=reset_delay, + ) - weights[q] = weight - elif i != 0: - weight = weights[q] - - measure_pulse_parameters = {"phase": 0} - - if i == len(self.sequence[measure_channel_name(qubit)]) - 1: - reset_delay = exp_options.relaxation_time * NANO_TO_SECONDS - else: - reset_delay = 0 - - exp.measure( - acquire_signal=acquire_channel_name(qubit), - handle=f"sequence{q}_{i}", - integration_kernel=weight, - integration_kernel_parameters=None, - integration_length=None, - measure_signal=measure_channel_name(qubit), - measure_pulse=pulse.zhpulse, - measure_pulse_length=round( - pulse.pulse.duration * NANO_TO_SECONDS, 9 - ), - measure_pulse_parameters=measure_pulse_parameters, - measure_pulse_amplitude=None, - acquire_delay=self.time_of_flight * NANO_TO_SECONDS, - reset_delay=reset_delay, - ) previous_section = section_uid + def _get_weights(self, weights, qubit, pulse, i, exp_options): + if ( + qubit.kernel is not None + and exp_options.acquisition_type == laboneq.AcquisitionType.DISCRIMINATION + ): + weight = laboneq.pulse_library.sampled_pulse_complex( + samples=qubit.kernel * np.exp(1j * qubit.iq_angle), + ) + + else: + if i == 0: + if ( + exp_options.acquisition_type + == laboneq.AcquisitionType.DISCRIMINATION + ): + weight = laboneq.pulse_library.sampled_pulse_complex( + samples=np.ones( + [ + int( + pulse.pulse.duration * 2 + - 3 * self.smearing * NANO_TO_SECONDS + ) + ] + ) + * np.exp(1j * qubit.iq_angle), + ) + weights[qubit.name] = weight + else: + weight = laboneq.pulse_library.const( + length=round(pulse.pulse.duration * NANO_TO_SECONDS, 9) + - 1.5 * self.smearing * NANO_TO_SECONDS, + amplitude=1, + ) + + weights[qubit.name] = weight + else: + weight = weights[qubit.name] + + return weight + @staticmethod def play_sweep(exp, channel_name, pulse): """Play Zurich pulse when a single sweeper is involved.""" @@ -693,32 +595,38 @@ def sweep( self, qubits, couplers, - sequence: PulseSequence, + sequences: list[PulseSequence], channel_cfg, options, *sweepers, ): """Play pulse and sweepers sequence.""" + self.chanel_to_qubit = {qb.readout.name: qb for qb in qubits.values()} self.signal_map = {} self.processed_sweeps = ProcessedSweeps(sweepers, qubits, self.channels) self.nt_sweeps, self.rt_sweeps = classify_sweepers(sweepers) self.acquisition_type = None + readout_channels = set( + chain(*([qb.readout.name, qb.acquisition.name] for qb in qubits.values())) + ) for sweeper in sweepers: - if sweeper.parameter in {Parameter.frequency, Parameter.amplitude}: - for pulse in sweeper.pulses: - if pulse.type is PulseType.READOUT: + if sweeper.parameter in {Parameter.frequency}: + for ch in sweeper.channels: + if ch in readout_channels: self.acquisition_type = laboneq.AcquisitionType.SPECTROSCOPY - self.experiment_flow(qubits, couplers, sequence, options) + self.experiment_flow(qubits, couplers, sequences, options) self.run_exp() # Get the results back results = {} for qubit in qubits.values(): q = qubit.name # pylint: disable=C0103 - for i, ropulse in enumerate(self.sequence[measure_channel_name(qubit)]): + for i, ropulse in enumerate( + chain(*(seq[qubit.readout.name] for seq in self.sequences)) + ): data = self.results.get_data(f"sequence{q}_{i}") if options.acquisition_type is AcquisitionType.DISCRIMINATION: @@ -727,7 +635,7 @@ def sweep( ) # Probability inversion patch id_ = ropulse.pulse.id - qubit = ropulse.pulse.qubit - results[id_] = results[qubit] = options.results_type(data) + # qubit = ropulse.pulse.qubit + results[id_] = results[qubit.name] = options.results_type(data) return results diff --git a/src/qibolab/instruments/zhinst/sweep.py b/src/qibolab/instruments/zhinst/sweep.py index 10eae270c5..0c13d757b6 100644 --- a/src/qibolab/instruments/zhinst/sweep.py +++ b/src/qibolab/instruments/zhinst/sweep.py @@ -101,11 +101,12 @@ def __init__( for ch in sweeper.channels or []: if sweeper.parameter is Parameter.bias: sweep_param = laboneq.SweepParameter( - values=sweeper.values + ch.config.offset + values=sweeper.values + channels[ch].config.offset ) elif sweeper.parameter is Parameter.frequency: intermediate_frequency = ( - channels[ch].frequency - channels[ch].lo_config.frequency + channels[ch].config.frequency + - channels[ch].config.lo_config.frequency ) sweep_param = laboneq.SweepParameter( values=sweeper.values + intermediate_frequency From 39f1a34a186b423947c1dac46f0819119feedb77 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 14 May 2024 17:16:35 +0400 Subject: [PATCH 0275/1006] remove sweetspot from Qubit class --- src/qibolab/qubits.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index 0db1af5cec..1bb01c496a 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -47,7 +47,6 @@ class Qubit: """Readout dressed frequency.""" drive_frequency: int = 0 anharmonicity: int = 0 - sweetspot: float = 0.0 asymmetry: float = 0.0 crosstalk_matrix: dict[QubitId, float] = field(default_factory=dict) """Crosstalk matrix for voltages.""" From dd9577a264ecda2389041e02d275fe7c9b1559a3 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 14 May 2024 17:17:31 +0400 Subject: [PATCH 0276/1006] don't copy pulse --- src/qibolab/platform/platform.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index f28cf46feb..339bd62fb3 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -369,7 +369,7 @@ def create_CNOT_pulse_sequence(self, qubits): def create_MZ_pulse(self, qubit): qubit = self.get_qubit(qubit) - return replace(qubit.native_gates.MZ) + return qubit.native_gates.MZ def create_qubit_drive_pulse(self, qubit, duration, relative_phase=0): qubit = self.get_qubit(qubit) @@ -389,7 +389,7 @@ def create_coupler_pulse(self, coupler, duration=None, amplitude=None): pulse = replace(pulse, duration=duration) if amplitude is not None: pulse = replace(pulse, amplitude=amplitude) - return replace(pulse) + return pulse # TODO Remove RX90_drag_pulse and RX_drag_pulse, replace them with create_qubit_drive_pulse # TODO Add RY90 and RY pulses From 636ff8777f903f59efafe74f58c826c9f3613190 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 14 May 2024 17:36:42 +0400 Subject: [PATCH 0277/1006] rename PulseSequence.append to extend --- src/qibolab/pulses/sequence.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qibolab/pulses/sequence.py b/src/qibolab/pulses/sequence.py index f19504c76a..db26b32e3e 100644 --- a/src/qibolab/pulses/sequence.py +++ b/src/qibolab/pulses/sequence.py @@ -34,7 +34,7 @@ def channel_duration(self, channel: str) -> float: """Duration of the given channel.""" return sum(item.duration for item in self[channel]) - def append(self, other: "PulseSequence") -> None: + def extend(self, other: "PulseSequence") -> None: """Appends other in-place such that the result is self + necessary delays to synchronize channels + other.""" tol = 1e-12 @@ -42,5 +42,5 @@ def append(self, other: "PulseSequence") -> None: max_duration = max(durations.values(), default=0.0) for ch, duration in durations.items(): if delay := round(max_duration - duration, int(1 / tol)) > 0: - self[ch].append(Delay(duration=delay)) + self[ch].extend(Delay(duration=delay)) self[ch].extend(other[ch]) From 63c922feb057df6f77281b15da54e0e0a40fa967 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 14 May 2024 17:39:39 +0400 Subject: [PATCH 0278/1006] get rid of CHannelMap --- src/qibolab/channel/__init__.py | 55 +-------------------------------- 1 file changed, 1 insertion(+), 54 deletions(-) diff --git a/src/qibolab/channel/__init__.py b/src/qibolab/channel/__init__.py index d19ae9058e..b78ee60563 100644 --- a/src/qibolab/channel/__init__.py +++ b/src/qibolab/channel/__init__.py @@ -1,8 +1,6 @@ -from dataclasses import dataclass, field +from dataclasses import dataclass from typing import Union -from qibo.config import raise_error - from .configs import * ChannelConfig = Union[DCChannelConfig, IQChannelConfig, AcquisitionChannelConfig] @@ -56,54 +54,3 @@ def external_config(channel: Channel) -> dict[str, str]: if isinstance(channel, WithExternalTwpaPump): return {"twpa_pump": channel.twpa_pump} return {} - - -@dataclass -class ChannelMap: - """Collection of :class:`Channel` objects identified by name. - - Essentially, it allows creating a mapping of names to channels just - specifying the names. - """ - - _channels: dict[str, Channel] = field(default_factory=dict) - - def add(self, *items): - """Add multiple items to the channel map. - - If :class: `qibolab.channels.Channel` objects are given they are dded to the channel map. - If a different type is given, a :class: `qibolab.channels.Channel` with the corresponding name - is created and added to the channel map. - """ - for item in items: - self[item.name] = item - return self - - def __getitem__(self, name): - return self._channels[name] - - def __setitem__(self, name, channel): - if not isinstance(channel, Channel): - raise_error( - TypeError, f"Cannot add channel of type {type(channel)} to ChannelMap." - ) - self._channels[name] = channel - - def __contains__(self, name): - return name in self._channels - - def __or__(self, channel_map): - channels = self._channels.copy() - channels.update(channel_map._channels) - return self.__class__(channels) - - def __ior__(self, items): - if not isinstance(items, type(self)): - try: - if isinstance(items, str): - raise TypeError - items = type(self)().add(*items) - except TypeError: - items = type(self)().add(items) - self._channels.update(items._channels) - return self From 9ce2fc7ba3d93f48eba5c4cb37ddfc590618a4b2 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 14 May 2024 17:44:55 +0400 Subject: [PATCH 0279/1006] shorten and normalize config class names --- src/qibolab/channel/__init__.py | 2 +- src/qibolab/channel/configs.py | 18 +++++++++--------- .../instruments/zhinst/channel/__init__.py | 4 ++-- .../instruments/zhinst/channel/configs.py | 18 +++++++----------- src/qibolab/instruments/zhinst/executor.py | 4 ++-- src/qibolab/instruments/zhinst/sweep.py | 4 ++-- src/qibolab/serialize.py | 4 ++-- 7 files changed, 25 insertions(+), 29 deletions(-) diff --git a/src/qibolab/channel/__init__.py b/src/qibolab/channel/__init__.py index b78ee60563..f1477d3918 100644 --- a/src/qibolab/channel/__init__.py +++ b/src/qibolab/channel/__init__.py @@ -3,7 +3,7 @@ from .configs import * -ChannelConfig = Union[DCChannelConfig, IQChannelConfig, AcquisitionChannelConfig] +ChannelConfig = Union[DcConfig, IqConfig, AcquisitionConfig] @dataclass(frozen=True) diff --git a/src/qibolab/channel/configs.py b/src/qibolab/channel/configs.py index 0f877112a0..d4f26842f9 100644 --- a/src/qibolab/channel/configs.py +++ b/src/qibolab/channel/configs.py @@ -6,16 +6,16 @@ """Common configuration for various channels.""" __all__ = [ - "DCChannelConfig", - "IQChannelConfig", - "AcquisitionChannelConfig", + "DcConfig", + "IqConfig", + "AcquisitionConfig", "OscillatorConfig", - "IQMixerConfig", + "IqMixerConfig", ] @dataclass(frozen=True) -class DCChannelConfig: +class DcConfig: """Configuration for a channel that can be used to send DC pulses (i.e. just envelopes without modulation).""" @@ -32,7 +32,7 @@ class OscillatorConfig: @dataclass(frozen=True) -class IQMixerConfig: +class IqMixerConfig: """Configuration for IQ mixer. Mixers usually have various imperfections, and one needs to @@ -53,7 +53,7 @@ class IQMixerConfig: @dataclass(frozen=True) -class IQChannelConfig: +class IqConfig: """Configuration for an IQ channel.""" frequency: float @@ -63,7 +63,7 @@ class IQChannelConfig: None if the channel does not use an LO. """ - mixer_config: Optional[IQMixerConfig] + mixer_config: Optional[IqMixerConfig] """Configuration for the corresponding IQ mixer. None if the channel does not feature a mixer. @@ -71,7 +71,7 @@ class IQChannelConfig: @dataclass(frozen=True) -class AcquisitionChannelConfig: +class AcquisitionConfig: """Configuration for acquisition channels.""" type: AcquisitionType diff --git a/src/qibolab/instruments/zhinst/channel/__init__.py b/src/qibolab/instruments/zhinst/channel/__init__.py index cb7a3d69e8..d64bdc3145 100644 --- a/src/qibolab/instruments/zhinst/channel/__init__.py +++ b/src/qibolab/instruments/zhinst/channel/__init__.py @@ -6,7 +6,7 @@ @dataclass(frozen=True) -class ZIChannel(Channel): +class ZiChannel(Channel): """Channel for Zurich Instruments (ZI) devices.""" device: str @@ -16,4 +16,4 @@ class ZIChannel(Channel): @dataclass(frozen=True) -class ZiAcquisitionChannel(WithExternalTwpaPump, ZIChannel): ... +class ZiAcquisitionChannel(WithExternalTwpaPump, ZiChannel): ... diff --git a/src/qibolab/instruments/zhinst/channel/configs.py b/src/qibolab/instruments/zhinst/channel/configs.py index 6b0957f2ce..6684fe7a4f 100644 --- a/src/qibolab/instruments/zhinst/channel/configs.py +++ b/src/qibolab/instruments/zhinst/channel/configs.py @@ -1,20 +1,16 @@ from dataclasses import dataclass -from qibolab.channel.configs import ( - AcquisitionChannelConfig, - DCChannelConfig, - IQChannelConfig, -) +from qibolab.channel.configs import AcquisitionConfig, DcConfig, IqConfig __all__ = [ - "ZurichDCChannelConfig", - "ZurichIQChannelConfig", - "ZurichAcquisitionChannelConfig", + "ZiDcConfig", + "ZiIqConfig", + "ZiAcquisitionConfig", ] @dataclass(frozen=True) -class ZurichDCChannelConfig(DCChannelConfig): +class ZiDcConfig(DcConfig): """DC channel config using ZI HDAWG.""" power_range: float @@ -25,7 +21,7 @@ class ZurichDCChannelConfig(DCChannelConfig): @dataclass(frozen=True) -class ZurichIQChannelConfig(IQChannelConfig): +class ZiIqConfig(IqConfig): """IQ channel config for ZI SHF* line instrument.""" power_range: float @@ -36,7 +32,7 @@ class ZurichIQChannelConfig(IQChannelConfig): @dataclass(frozen=True) -class ZurichAcquisitionChannelConfig(AcquisitionChannelConfig): +class ZiAcquisitionConfig(AcquisitionConfig): """Acquisition config for ZI SHF* line instrument.""" power_range: float diff --git a/src/qibolab/instruments/zhinst/executor.py b/src/qibolab/instruments/zhinst/executor.py index 10dc848690..52c7d614c2 100644 --- a/src/qibolab/instruments/zhinst/executor.py +++ b/src/qibolab/instruments/zhinst/executor.py @@ -18,7 +18,7 @@ from qibolab.sweeper import Parameter, Sweeper from qibolab.unrolling import Bounds -from . import ZIChannel +from . import ZiChannel from .pulse import ZhPulse from .sweep import ProcessedSweeps, classify_sweepers from .util import NANO_TO_SECONDS, SAMPLING_RATE @@ -72,7 +72,7 @@ def __init__( self, name, device_setup, - channels: list[ZIChannel], + channels: list[ZiChannel], time_of_flight=0.0, smearing=0.0, ): diff --git a/src/qibolab/instruments/zhinst/sweep.py b/src/qibolab/instruments/zhinst/sweep.py index 0c13d757b6..97bb6ad640 100644 --- a/src/qibolab/instruments/zhinst/sweep.py +++ b/src/qibolab/instruments/zhinst/sweep.py @@ -10,7 +10,7 @@ from qibolab.qubits import Qubit from qibolab.sweeper import Parameter, Sweeper -from . import ZIChannel +from . import ZiChannel from .util import NANO_TO_SECONDS, measure_channel_name @@ -61,7 +61,7 @@ def __init__( self, sweepers: Iterable[Sweeper], qubits: dict[str, Qubit], - channels: dict[str, ZIChannel], + channels: dict[str, ZiChannel], ): pulse_sweeps = [] channel_sweeps = [] diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index 10daa1b3c1..7cce76666e 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -10,7 +10,7 @@ from pathlib import Path from typing import Tuple -from qibolab.channel import IQMixerConfig, OscillatorConfig +from qibolab.channel import IqMixerConfig, OscillatorConfig from qibolab.couplers import Coupler from qibolab.kernels import Kernels from qibolab.native import SingleQubitNatives, TwoQubitNatives @@ -190,7 +190,7 @@ def load_channel_configs(runcard: dict) -> dict[str, dict]: if "twpa_pump_config" in cfg and cfg["twpa_pump_config"] is not None: cfg["twpa_pump_config"] = OscillatorConfig(**cfg["twpa_pump_config"]) if "mixer_config" in cfg and cfg["mixer_config"] is not None: - cfg["mixer_config"] = IQMixerConfig(**cfg["mixer_config"]) + cfg["mixer_config"] = IqMixerConfig(**cfg["mixer_config"]) return configs From 2b708d99386b4f9a11e7842abfd3c54e18e99ab0 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 14 May 2024 17:49:29 +0400 Subject: [PATCH 0280/1006] improve type annotation and docstring --- src/qibolab/channel/__init__.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/qibolab/channel/__init__.py b/src/qibolab/channel/__init__.py index f1477d3918..096fc28363 100644 --- a/src/qibolab/channel/__init__.py +++ b/src/qibolab/channel/__init__.py @@ -1,5 +1,5 @@ from dataclasses import dataclass -from typing import Union +from typing import Optional, Union from .configs import * @@ -37,8 +37,11 @@ class WithExternalTwpaPump: definitions, in case the instrument does not have built-in oscillator dedicated as TWPA pump and an external TWPA pump should be used.""" - twpa_pump: str - """The name of the oscillator instrument used as TWPA pump.""" + twpa_pump: Optional[str] + """The name of the oscillator instrument used as TWPA pump. + + None, if the TWPA pump/TWPA is not installed in the setup. + """ def external_config(channel: Channel) -> dict[str, str]: From 29a1f72795f10ea6ec4936a993d8e9f5b0d31312 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Wed, 15 May 2024 13:08:57 +0400 Subject: [PATCH 0281/1006] get rid of ZhPulse --- src/qibolab/instruments/zhinst/executor.py | 116 +++++++++------------ src/qibolab/instruments/zhinst/pulse.py | 40 ------- 2 files changed, 51 insertions(+), 105 deletions(-) diff --git a/src/qibolab/instruments/zhinst/executor.py b/src/qibolab/instruments/zhinst/executor.py index 52c7d614c2..3179c262b8 100644 --- a/src/qibolab/instruments/zhinst/executor.py +++ b/src/qibolab/instruments/zhinst/executor.py @@ -1,10 +1,9 @@ """Executing pulse sequences on a Zurich Instruments devices.""" import re -from collections import defaultdict from dataclasses import dataclass from itertools import chain -from typing import Any, Optional +from typing import Any, Optional, Union import laboneq.simple as laboneq import numpy as np @@ -13,13 +12,13 @@ from qibolab import AcquisitionType, AveragingMode, ExecutionParameters from qibolab.couplers import Coupler from qibolab.instruments.abstract import Controller -from qibolab.pulses import PulseSequence +from qibolab.pulses import Delay, Pulse, PulseSequence from qibolab.qubits import Qubit from qibolab.sweeper import Parameter, Sweeper from qibolab.unrolling import Bounds from . import ZiChannel -from .pulse import ZhPulse +from .pulse import select_pulse from .sweep import ProcessedSweeps, classify_sweepers from .util import NANO_TO_SECONDS, SAMPLING_RATE @@ -112,8 +111,8 @@ def __init__( self.acquisition_type = None "To store if the AcquisitionType.SPECTROSCOPY needs to be enabled by parsing the sequence" - self.sequences = defaultdict(list) - "Zurich pulse sequences" + self.sequences: list[PulseSequence] = [] + "Pulse sequences" self.processed_sweeps: Optional[ProcessedSweeps] = None self.nt_sweeps: list[Sweeper] = [] @@ -292,7 +291,7 @@ def experiment_flow( sequences: list of sequences to be played in the experiment. options: execution options/parameters """ - self.sequences = [self.sequence_zh(seq, qubits) for seq in sequences] + self.sequences = sequences self.calibration_step(qubits, couplers, options) self.create_exp(qubits, options) @@ -301,32 +300,6 @@ def play(self, qubits, couplers, sequence, channel_cfg, options): """Play pulse sequence.""" return self.sweep(qubits, couplers, sequence, channel_cfg, options) - def sequence_zh( - self, sequence: PulseSequence, qubits: dict[str, Qubit] - ) -> dict[str, list[ZhPulse]]: - """Convert Qibo sequence to a sequence where all pulses are replaced - with ZhPulse instances. - - The resulting object is a dictionary mapping from channel name - to corresponding sequence of ZhPulse instances - """ - # Define and assign the sequence - zhsequence = defaultdict(list) - - # Fill the sequences with pulses according to their lines in temporal order - for ch, pulses in sequence.items(): - zhsequence[ch].extend(ZhPulse(p) for p in pulses) - - if self.processed_sweeps: - for ch, zhpulses in zhsequence.items(): - for zhpulse in zhpulses: - for param, sweep in self.processed_sweeps.sweeps_for_pulse( - zhpulse.pulse - ): - zhpulse.add_sweeper(param, sweep) - - return zhsequence - def create_exp(self, qubits, options): """Zurich experiment initialization using their Experiment class.""" if self.acquisition_type: @@ -480,16 +453,12 @@ def select_exp(self, exp, qubits, exp_options): with exp.section(uid=f"sequence_{i}_control"): for ch in other_channels: for pulse in seq[ch]: - if pulse.delay_sweeper: - exp.delay(signal=ch, time=pulse.delay_sweeper) - if pulse.zhsweepers: - self.play_sweep(exp, ch, pulse) - else: - exp.play( - signal=ch, - pulse=pulse.zhpulse, - phase=pulse.pulse.relative_phase, - ) + self.play_pulse( + exp, + ch, + pulse, + self.processed_sweeps.sweeps_for_pulse(pulse), + ) for ch in set(seq.keys()) - other_channels: for j, pulse in enumerate(seq[ch]): with exp.section(uid=f"sequence_{i}_measure_{j}"): @@ -520,9 +489,9 @@ def select_exp(self, exp, qubits, exp_options): integration_kernel_parameters=None, integration_length=None, measure_signal=qubit.readout.name, - measure_pulse=pulse.zhpulse, + measure_pulse=select_pulse(pulse), measure_pulse_length=round( - pulse.pulse.duration * NANO_TO_SECONDS, 9 + pulse.duration * NANO_TO_SECONDS, 9 ), measure_pulse_parameters=measure_pulse_parameters, measure_pulse_amplitude=None, @@ -551,7 +520,7 @@ def _get_weights(self, weights, qubit, pulse, i, exp_options): samples=np.ones( [ int( - pulse.pulse.duration * 2 + pulse.duration * 2 - 3 * self.smearing * NANO_TO_SECONDS ) ] @@ -561,7 +530,7 @@ def _get_weights(self, weights, qubit, pulse, i, exp_options): weights[qubit.name] = weight else: weight = laboneq.pulse_library.const( - length=round(pulse.pulse.duration * NANO_TO_SECONDS, 9) + length=round(pulse.duration * NANO_TO_SECONDS, 9) - 1.5 * self.smearing * NANO_TO_SECONDS, amplitude=1, ) @@ -573,23 +542,40 @@ def _get_weights(self, weights, qubit, pulse, i, exp_options): return weight @staticmethod - def play_sweep(exp, channel_name, pulse): - """Play Zurich pulse when a single sweeper is involved.""" - play_parameters = {} - for p, zhs in pulse.zhsweepers: - if p is Parameter.amplitude: - max_value = max(np.abs(zhs.values)) - pulse.zhpulse.amplitude *= max_value - zhs.values /= max_value - play_parameters["amplitude"] = zhs - if p is Parameter.duration: - play_parameters["length"] = zhs - if p is Parameter.relative_phase: - play_parameters["phase"] = zhs - if "phase" not in play_parameters: - play_parameters["phase"] = pulse.pulse.relative_phase - - exp.play(signal=channel_name, pulse=pulse.zhpulse, **play_parameters) + def play_pulse( + exp, + channel: str, + pulse: Union[Pulse, Delay], + sweeps: list[tuple[Parameter, laboneq.SweepParameter]], + ): + """Play a pulse or delay by taking care of setting parameters to any + associated sweeps.""" + if isinstance(pulse, Delay): + duration = pulse.duration + for p, zhs in sweeps: + if p is Parameter.duration: + duration = zhs + else: + raise ValueError(f"Cannot sweep parameter {p} of a delay.") + exp.delay(signal=channel, time=duration) + elif isinstance(pulse, Pulse): + zhpulse = select_pulse(pulse) + play_parameters = {} + for p, zhs in sweeps: + if p is Parameter.amplitude: + max_value = max(np.abs(zhs.values)) + zhpulse.amplitude *= max_value + zhs.values /= max_value + play_parameters["amplitude"] = zhs + if p is Parameter.duration: + play_parameters["length"] = zhs + if p is Parameter.relative_phase: + play_parameters["phase"] = zhs + if "phase" not in play_parameters: + play_parameters["phase"] = pulse.relative_phase + exp.play(signal=channel, pulse=pulse.zhpulse, **play_parameters) + else: + raise ValueError(f"Cannot play pulse: {pulse}") def sweep( self, @@ -634,7 +620,7 @@ def sweep( np.ones(data.shape) - data.real ) # Probability inversion patch - id_ = ropulse.pulse.id + id_ = ropulse.id # qubit = ropulse.pulse.qubit results[id_] = results[qubit.name] = options.results_type(data) diff --git a/src/qibolab/instruments/zhinst/pulse.py b/src/qibolab/instruments/zhinst/pulse.py index 8bfa112d05..29224c3b5f 100644 --- a/src/qibolab/instruments/zhinst/pulse.py +++ b/src/qibolab/instruments/zhinst/pulse.py @@ -1,7 +1,5 @@ """Wrapper for qibolab and laboneq pulses and sweeps.""" -from typing import Optional - import laboneq.simple as laboneq import numpy as np from laboneq.dsl.experiment.pulse_library import ( @@ -10,7 +8,6 @@ ) from qibolab.pulses import Drag, Gaussian, GaussianSquare, Pulse, PulseType, Rectangular -from qibolab.sweeper import Parameter from .util import NANO_TO_SECONDS, SAMPLING_RATE @@ -67,40 +64,3 @@ def select_pulse(pulse: Pulse): samples=pulse.i(SAMPLING_RATE) + (1j * pulse.q(SAMPLING_RATE)), can_compress=True, ) - - -class ZhPulse: - """Wrapper data type that holds a qibolab pulse, the corresponding laboneq - pulse object, and any sweeps associated with this pulse.""" - - def __init__(self, pulse): - self.pulse: Pulse = pulse - """Qibolab pulse.""" - self.zhpulse = select_pulse(pulse) - """Laboneq pulse.""" - self.zhsweepers: list[tuple[Parameter, laboneq.SweepParameter]] = [] - """Parameters to be swept, along with their laboneq sweep parameter - definitions.""" - self.delay_sweeper: Optional[laboneq.SweepParameter] = None - """Laboneq sweep parameter if the delay of the pulse should be - swept.""" - - # pylint: disable=R0903,E1101 - def add_sweeper(self, param: Parameter, sweeper: laboneq.SweepParameter): - """Add sweeper to list of sweepers associated with this pulse.""" - if param in { - Parameter.amplitude, - Parameter.frequency, - Parameter.duration, - Parameter.relative_phase, - }: - self.zhsweepers.append((param, sweeper)) - elif param is Parameter.start: - # TODO: Change this case to ``Delay.duration`` - if self.delay_sweeper: - raise ValueError( - "Cannot have multiple delay sweepers for a single pulse" - ) - self.delay_sweeper = sweeper - else: - raise ValueError(f"Sweeping {param} is not supported") From 6bbafb70da6c8e975d6c7b0aa9f032ed8526e699 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Wed, 15 May 2024 13:11:17 +0400 Subject: [PATCH 0282/1006] get rid of SubSequence that was made redundant by 9dd355a643c2052e3657f8ed6c88f3f7691a3d77 --- src/qibolab/instruments/zhinst/executor.py | 23 ---------------------- 1 file changed, 23 deletions(-) diff --git a/src/qibolab/instruments/zhinst/executor.py b/src/qibolab/instruments/zhinst/executor.py index 3179c262b8..f653bbe9ce 100644 --- a/src/qibolab/instruments/zhinst/executor.py +++ b/src/qibolab/instruments/zhinst/executor.py @@ -1,7 +1,6 @@ """Executing pulse sequences on a Zurich Instruments devices.""" import re -from dataclasses import dataclass from itertools import chain from typing import Any, Optional, Union @@ -41,28 +40,6 @@ } -@dataclass -class SubSequence: - """A subsequence is a slice (in time) of a sequence that contains at most - one measurement per qubit. - - When the driver is asked to execute a sequence, it will first split - it into sub-sequences. This is needed so that we can create a - separate laboneq section for each measurement (multiple measurements - per section are not allowed). When splitting a sequence, it is - assumed that 1. a measurement operation can be parallel (in time) to - another measurement operation (i.e. measuring multiple qubits - simultaneously), but other channels (e.g. drive) do not contain any - pulses parallel to measurements, 2. ith measurement on some channel - is in the same subsequence as the ith measurement (if any) on - another measurement channel, 3. all measurements in one subsequence - happen at the same time. - """ - - measurements: list[tuple[str, ZhPulse]] - control_sequence: dict[str, list[ZhPulse]] - - class Zurich(Controller): """Driver for a collection of ZI instruments that are automatically synchronized via ZSync protocol.""" From 440a7a0b2f572d63bfe6ccb217bcdd0a979a1cfe Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Thu, 16 May 2024 11:50:17 +0400 Subject: [PATCH 0283/1006] move channel_cfg to ExecutionParameters --- src/qibolab/execution_parameters.py | 7 +++++++ src/qibolab/instruments/zhinst/executor.py | 5 ++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/qibolab/execution_parameters.py b/src/qibolab/execution_parameters.py index 13a6ff0f27..71388cbde6 100644 --- a/src/qibolab/execution_parameters.py +++ b/src/qibolab/execution_parameters.py @@ -1,6 +1,7 @@ from enum import Enum, auto from typing import Optional +from qibolab.channel import ChannelConfig from qibolab.result import ( AveragedIntegratedResults, AveragedRawWaveformResults, @@ -71,6 +72,12 @@ class ExecutionParameters(Model): """Data acquisition type.""" averaging_mode: AveragingMode = AveragingMode.SINGLESHOT """Data averaging mode.""" + channel_cfg: dict[str, ChannelConfig] = None + """Configuration for various channels (maps channel name to respective + config). + + This takes precedence over platform defaults. + """ @property def results_type(self): diff --git a/src/qibolab/instruments/zhinst/executor.py b/src/qibolab/instruments/zhinst/executor.py index f653bbe9ce..e8db93dd04 100644 --- a/src/qibolab/instruments/zhinst/executor.py +++ b/src/qibolab/instruments/zhinst/executor.py @@ -273,9 +273,9 @@ def experiment_flow( self.create_exp(qubits, options) # pylint: disable=W0221 - def play(self, qubits, couplers, sequence, channel_cfg, options): + def play(self, qubits, couplers, sequence, options): """Play pulse sequence.""" - return self.sweep(qubits, couplers, sequence, channel_cfg, options) + return self.sweep(qubits, couplers, sequence, options) def create_exp(self, qubits, options): """Zurich experiment initialization using their Experiment class.""" @@ -559,7 +559,6 @@ def sweep( qubits, couplers, sequences: list[PulseSequence], - channel_cfg, options, *sweepers, ): From 21b0429b3d6d35f388082ab14463b1ccc007891f Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Mon, 20 May 2024 12:06:59 +0400 Subject: [PATCH 0284/1006] set cfg for external/supplementary (to the main channel instrument) instruments before starting execution --- src/qibolab/platform/platform.py | 43 +++++++++++++++++++------------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 339bd62fb3..a3f3bfed66 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -1,14 +1,14 @@ """A platform for executing quantum algorithms.""" from collections import defaultdict -from dataclasses import dataclass, field +from dataclasses import asdict, dataclass, field from math import prod from typing import Any, Dict, List, Optional, Tuple, TypeVar import networkx as nx from qibo.config import log, raise_error -from qibolab.channel_config import ChannelConfig +from qibolab.channel import Channel, external_config from qibolab.couplers import Coupler from qibolab.execution_parameters import ExecutionParameters from qibolab.instruments.abstract import Controller, Instrument, InstrumentId @@ -142,6 +142,12 @@ class Platform: topology: nx.Graph = field(default_factory=nx.Graph) """Graph representing the qubit connectivity in the quantum chip.""" + channels: dict[str, Channel] = field(default_factory=dict, init=False) + """Channels of this platform. + + Mapping channel name to channel. + """ + def __post_init__(self): log.info("Loading platform %s", self.name) if self.resonator_type is None: @@ -152,6 +158,15 @@ def __post_init__(self): [(pair.qubit1.name, pair.qubit2.name) for pair in self.pairs.values()] ) + for qubit in self.qubits.values(): + self.channels[qubit.drive.name] = qubit.drive + self.channels[qubit.readout.name] = qubit.readout + self.channels[qubit.acquisition.name] = qubit.acquisition + if qubit.flux is not None: + self.channels[qubit.flux.name] = qubit.flux + for coupler in self.couplers.values(): + self.channels[coupler.flux.name] = coupler.flux + def __str__(self): return self.name @@ -211,19 +226,14 @@ def _controller(self): assert len(controllers) == 1 return controllers[0] - def _execute(self, sequence, channel_cfg, options, sweepers): - """Executes sequence on the controllers.""" + def _execute(self, sequence, options, sweepers): + """Execute sequence on the controllers.""" result = {} for instrument in self.instruments.values(): if isinstance(instrument, Controller): new_result = instrument.play( - self.qubits, - self.couplers, - sequence, - channel_cfg, - options, - sweepers, + self.qubits, self.couplers, sequence, options, sweepers ) if isinstance(new_result, dict): result.update(new_result) @@ -233,7 +243,6 @@ def _execute(self, sequence, channel_cfg, options, sweepers): def execute( self, sequences: List[PulseSequence], - channel_cfg: dict[str, ChannelConfig], options: ExecutionParameters, sweepers: Optional[list[ParallelSweepers]] = None, ) -> dict[Any, list]: @@ -263,19 +272,19 @@ def execute( sweeper = [Sweeper(parameter, parameter_range, [pulse])] platform.execute([sequence], ExecutionParameters(), [sweeper]) """ - if channel_cfg: - raise ValueError("Currently, overriding channel configs is not supported.") if sweepers is None: sweepers = [] - if options.nshots is None: - options = replace(options, nshots=self.settings.nshots) - options = self.settings.fill(options) time = estimate_duration(sequences, options, sweepers) log.info(f"Minimal execution time: {time}") + if options.channel_cfg is not None: + for ch, cfg in options.channel_cfg.items(): + for attr, inst in external_config(self.channels[ch]): + self.instruments[inst].setup(**asdict(getattr(cfg, attr))) + # find readout pulses ro_pulses = { pulse.id: pulse.qubit @@ -286,7 +295,7 @@ def execute( results = defaultdict(list) for b in batch(sequences, self._controller.bounds): sequence, readouts = unroll_sequences(b, options.relaxation_time) - result = self._execute(sequence, channel_cfg, options, sweepers) + result = self._execute(sequence, options, sweepers) for serial, new_serials in readouts.items(): results[serial].extend(result[ser] for ser in new_serials) From 4617e642fad830325708c511af7b4b4f2628b96d Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Mon, 20 May 2024 12:33:49 +0400 Subject: [PATCH 0285/1006] get rid of redundant properties --- src/qibolab/qubits.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index 1bb01c496a..1f023810c0 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -43,9 +43,6 @@ class Qubit: name: QubitId bare_resonator_frequency: int = 0 - readout_frequency: int = 0 - """Readout dressed frequency.""" - drive_frequency: int = 0 anharmonicity: int = 0 asymmetry: float = 0.0 crosstalk_matrix: dict[QubitId, float] = field(default_factory=dict) From 37069e5d432286dbd37937f52a297302cac81d5d Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Mon, 20 May 2024 16:57:55 +0400 Subject: [PATCH 0286/1006] sweap measurement pulse amplitude in near-time instead of oscillator gain in real-time --- src/qibolab/instruments/zhinst/executor.py | 43 ++++++++++------------ src/qibolab/instruments/zhinst/sweep.py | 25 +------------ 2 files changed, 20 insertions(+), 48 deletions(-) diff --git a/src/qibolab/instruments/zhinst/executor.py b/src/qibolab/instruments/zhinst/executor.py index e8db93dd04..78494b8f61 100644 --- a/src/qibolab/instruments/zhinst/executor.py +++ b/src/qibolab/instruments/zhinst/executor.py @@ -450,31 +450,26 @@ def select_exp(self, exp, qubits, exp_options): weights, qubit, pulse, i, exp_options ) - measure_pulse_parameters = {"phase": 0} - - if j == len(seq[ch]) - 1: - reset_delay = ( - exp_options.relaxation_time * NANO_TO_SECONDS - ) - else: - reset_delay = 0.0 - - exp.measure( - acquire_signal=qubit.acquisition.name, + self.play_pulse( + exp, + qubit.readout.name, + pulse, + self.processed_sweeps.sweeps_for_pulse(pulse), + ) + exp.delay( + signal=qubit.acquisition.name, + time=self.time_of_flight * NANO_TO_SECONDS, + ) # FIXME + exp.acquire( + signal=qubit.acquisition.name, handle=f"sequence{qubit.name}_{i}", - integration_kernel=weight, - integration_kernel_parameters=None, - integration_length=None, - measure_signal=qubit.readout.name, - measure_pulse=select_pulse(pulse), - measure_pulse_length=round( - pulse.duration * NANO_TO_SECONDS, 9 - ), - measure_pulse_parameters=measure_pulse_parameters, - measure_pulse_amplitude=None, - acquire_delay=self.time_of_flight * NANO_TO_SECONDS, - reset_delay=reset_delay, + kernel=weight, ) + if j == len(seq[ch]) - 1: + exp.delay( + signal=qubit.acquisition.name, + time=exp_options.relaxation_time * NANO_TO_SECONDS, + ) previous_section = section_uid @@ -566,7 +561,7 @@ def sweep( self.chanel_to_qubit = {qb.readout.name: qb for qb in qubits.values()} self.signal_map = {} - self.processed_sweeps = ProcessedSweeps(sweepers, qubits, self.channels) + self.processed_sweeps = ProcessedSweeps(sweepers, self.channels) self.nt_sweeps, self.rt_sweeps = classify_sweepers(sweepers) self.acquisition_type = None diff --git a/src/qibolab/instruments/zhinst/sweep.py b/src/qibolab/instruments/zhinst/sweep.py index 97bb6ad640..94bb13ab78 100644 --- a/src/qibolab/instruments/zhinst/sweep.py +++ b/src/qibolab/instruments/zhinst/sweep.py @@ -4,14 +4,12 @@ from copy import copy import laboneq.simple as laboneq -import numpy as np from qibolab.pulses import Pulse, PulseType -from qibolab.qubits import Qubit from qibolab.sweeper import Parameter, Sweeper from . import ZiChannel -from .util import NANO_TO_SECONDS, measure_channel_name +from .util import NANO_TO_SECONDS def classify_sweepers( @@ -60,7 +58,6 @@ class ProcessedSweeps: def __init__( self, sweepers: Iterable[Sweeper], - qubits: dict[str, Qubit], channels: dict[str, ZiChannel], ): pulse_sweeps = [] @@ -73,26 +70,6 @@ def __init__( values=sweeper.values * NANO_TO_SECONDS ) pulse_sweeps.append((pulse, sweeper.parameter, sweep_param)) - elif ( - pulse.type is PulseType.READOUT - and sweeper.parameter is Parameter.amplitude - ): - max_value = max(np.abs(sweeper.values)) - sweep_param = laboneq.SweepParameter( - values=sweeper.values / max_value - ) - # FIXME: this implicitly relies on the fact that pulse is the same python object as appears in the - # sequence that is being executed, hence the mutation is propagated. This is bad programming and - # should be fixed once things become simpler - pulse.amplitude *= max_value - - channel_sweeps.append( - ( - measure_channel_name(qubits[pulse.qubit]), # FIXME - sweeper.parameter, - sweep_param, - ) - ) else: sweep_param = laboneq.SweepParameter(values=copy(sweeper.values)) pulse_sweeps.append((pulse, sweeper.parameter, sweep_param)) From a2952a2c08d51361a174bd174498a4bf0248a8f0 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 21 May 2024 11:51:53 +0400 Subject: [PATCH 0287/1006] remove type from acquisition config --- src/qibolab/channel/configs.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/qibolab/channel/configs.py b/src/qibolab/channel/configs.py index d4f26842f9..168bf028ab 100644 --- a/src/qibolab/channel/configs.py +++ b/src/qibolab/channel/configs.py @@ -1,8 +1,6 @@ from dataclasses import dataclass from typing import Optional -from qibolab.execution_parameters import AcquisitionType - """Common configuration for various channels.""" __all__ = [ @@ -74,8 +72,6 @@ class IqConfig: class AcquisitionConfig: """Configuration for acquisition channels.""" - type: AcquisitionType - """Type of acquisition.""" twpa_pump_config: Optional[OscillatorConfig] """Config for the corresponding TWPA pump. From 7ce945ec4b6626cd7c47b2bb1c59912f4117c24b Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 21 May 2024 11:52:48 +0400 Subject: [PATCH 0288/1006] remove import of removed ZhPulse class --- src/qibolab/instruments/zhinst/__init__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/qibolab/instruments/zhinst/__init__.py b/src/qibolab/instruments/zhinst/__init__.py index a6efb1004c..cac0366082 100644 --- a/src/qibolab/instruments/zhinst/__init__.py +++ b/src/qibolab/instruments/zhinst/__init__.py @@ -1,5 +1,4 @@ from .channel import * from .executor import Zurich -from .pulse import ZhPulse from .sweep import ProcessedSweeps, classify_sweepers from .util import acquire_channel_name, measure_channel_name From 321180fa26341ff7fb3e2b4d17b1ba3dc132388c Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 21 May 2024 11:53:25 +0400 Subject: [PATCH 0289/1006] don't use properties that were made redundant --- src/qibolab/instruments/zhinst/executor.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/qibolab/instruments/zhinst/executor.py b/src/qibolab/instruments/zhinst/executor.py index 78494b8f61..22607b5ebb 100644 --- a/src/qibolab/instruments/zhinst/executor.py +++ b/src/qibolab/instruments/zhinst/executor.py @@ -127,13 +127,13 @@ def calibration_step(self, qubits, couplers, options): if any(len(seq[qubit.drive.name]) != 0 for seq in self.sequences): self.register_drive_line( qubit=qubit, - intermediate_frequency=qubit.drive_frequency + intermediate_frequency=qubit.drive.config.frequency - qubit.drive.config.lo_config.frequency, ) if any(len(seq[qubit.readout.name]) != 0 for seq in self.sequences): self.register_readout_line( qubit=qubit, - intermediate_frequency=qubit.readout_frequency + intermediate_frequency=qubit.readout.config.frequency - qubit.readout.config.lo_config.frequency, options=options, ) @@ -545,7 +545,7 @@ def play_pulse( play_parameters["phase"] = zhs if "phase" not in play_parameters: play_parameters["phase"] = pulse.relative_phase - exp.play(signal=channel, pulse=pulse.zhpulse, **play_parameters) + exp.play(signal=channel, pulse=zhpulse, **play_parameters) else: raise ValueError(f"Cannot play pulse: {pulse}") From 074c2c8d302dbf079728b40d0c57141b8df68434 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 21 May 2024 12:58:50 +0400 Subject: [PATCH 0290/1006] convert single qubit natives from Pulse to PulseSequence --- src/qibolab/native.py | 8 +++--- src/qibolab/serialize.py | 57 +++++++++++++++++++++++----------------- 2 files changed, 37 insertions(+), 28 deletions(-) diff --git a/src/qibolab/native.py b/src/qibolab/native.py index a3454eccb0..1c7c3f44de 100644 --- a/src/qibolab/native.py +++ b/src/qibolab/native.py @@ -10,13 +10,13 @@ class SingleQubitNatives: """Container with the native single-qubit gates acting on a specific qubit.""" - RX: Optional[Pulse] = None + RX: Optional[PulseSequence] = None """Pulse to drive the qubit from state 0 to state 1.""" - RX12: Optional[Pulse] = None + RX12: Optional[PulseSequence] = None """Pulse to drive to qubit from state 1 to state 2.""" - MZ: Optional[Pulse] = None + MZ: Optional[PulseSequence] = None """Measurement pulse.""" - CP: Optional[Pulse] = None + CP: Optional[PulseSequence] = None """Pulse to activate a coupler.""" @property diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index 7cce76666e..307fc9644c 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -6,11 +6,12 @@ """ import json +from collections.abc import Iterable from dataclasses import asdict, fields from pathlib import Path -from typing import Tuple +from typing import Tuple, Union -from qibolab.channel import IqMixerConfig, OscillatorConfig +from qibolab.channel import Channel, IqMixerConfig, OscillatorConfig from qibolab.couplers import Coupler from qibolab.kernels import Kernels from qibolab.native import SingleQubitNatives, TwoQubitNatives @@ -108,6 +109,13 @@ def _load_pulse(pulse_kwargs): return Pulse(**pulse_kwargs) +def _load_sequence(raw_sequence): + seq = PulseSequence() + for ch, pulses in raw_sequence.items(): + seq[ch] = [_load_pulse(raw_pulse) for raw_pulse in pulses] + return seq + + def _load_single_qubit_natives(gates) -> SingleQubitNatives: """Parse native gates from the runcard. @@ -116,19 +124,20 @@ def _load_single_qubit_natives(gates) -> SingleQubitNatives: from the runcard. """ return SingleQubitNatives( - **{name: _load_pulse(kwargs) for name, kwargs in gates.items()} + **{ + gate_name: _load_sequence(raw_sequence) + for gate_name, raw_sequence in gates.items() + } ) def _load_two_qubit_natives(gates) -> TwoQubitNatives: - sequences = {} - for name, raw_sequence in gates.items(): - sequence = PulseSequence() - for channel, pulses in raw_sequence.items(): - sequence[channel] = [_load_pulse(kwargs) for kwargs in pulses] - sequences[name] = sequence - - return TwoQubitNatives(**sequences) + return TwoQubitNatives( + **{ + gate_name: _load_sequence(raw_sequence) + for gate_name, raw_sequence in gates.items() + } + ) def register_gates( @@ -208,21 +217,15 @@ def _dump_sequence(sequence: PulseSequence): return {ch: [_dump_pulse(p) for p in pulses] for ch, pulses in sequence.items()} -def _dump_single_qubit_natives(natives: SingleQubitNatives): +def _dump_natives(natives: Union[SingleQubitNatives, TwoQubitNatives]): data = {} for fld in fields(natives): - pulse = getattr(natives, fld.name) - if pulse is not None: - data[fld.name] = _dump_pulse(pulse) + seq = getattr(natives, fld.name) + if seq is not None: + data[fld.name] = _dump_sequence(seq) return data -def _dump_two_qubit_natives(natives: TwoQubitNatives): - return { - fld.name: _dump_sequence(getattr(natives, fld.name)) for fld in fields(natives) - } - - def dump_native_gates( qubits: QubitMap, pairs: QubitPairMap, couplers: CouplerMap = None ) -> dict: @@ -231,21 +234,21 @@ def dump_native_gates( # single-qubit native gates native_gates = { "single_qubit": { - dump_qubit_name(q): _dump_single_qubit_natives(qubit.native_gates) + dump_qubit_name(q): _dump_natives(qubit.native_gates) for q, qubit in qubits.items() } } if couplers: native_gates["coupler"] = { - dump_qubit_name(c): _dump_single_qubit_natives(coupler.native_gates) + dump_qubit_name(c): _dump_natives(coupler.native_gates) for c, coupler in couplers.items() } # two-qubit native gates native_gates["two_qubit"] = {} for pair in pairs.values(): - natives = _dump_two_qubit_natives(pair.native_gates) + natives = _dump_natives(pair.native_gates) if len(natives) > 0: pair_name = f"{pair.qubit1.name}-{pair.qubit2.name}" native_gates["two_qubit"][pair_name] = natives @@ -303,6 +306,11 @@ def dump_instruments(instruments: InstrumentMap) -> dict: return data +def dump_channels(channels: Iterable[Channel]) -> dict: + """Dump channel configs.""" + return {ch.name: asdict(ch.config) for ch in channels} + + def dump_runcard(platform: Platform, path: Path): """Serializes the platform and saves it as a json runcard file. @@ -319,6 +327,7 @@ def dump_runcard(platform: Platform, path: Path): "qubits": list(platform.qubits), "topology": [list(pair) for pair in platform.ordered_pairs], "instruments": dump_instruments(platform.instruments), + "channels": dump_channels(platform.channels.values()), } if platform.couplers: From a5797055ef102270bc7eed63b81a8a45af10edbe Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Wed, 29 May 2024 11:21:49 +0400 Subject: [PATCH 0291/1006] remove frequency from IqConfig --- src/qibolab/channel/configs.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/qibolab/channel/configs.py b/src/qibolab/channel/configs.py index 168bf028ab..10c715d3c2 100644 --- a/src/qibolab/channel/configs.py +++ b/src/qibolab/channel/configs.py @@ -54,8 +54,6 @@ class IqMixerConfig: class IqConfig: """Configuration for an IQ channel.""" - frequency: float - """The carrier frequency of the channel.""" lo_config: Optional[OscillatorConfig] """Configuration for the corresponding LO. From ba8a599a4ac4b1a67eca15c63a6a823252ea8070 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Fri, 31 May 2024 13:12:01 +0400 Subject: [PATCH 0292/1006] Improve channel cfg deserialization --- src/qibolab/channel/__init__.py | 59 +-------------- src/qibolab/channel/channel.py | 72 +++++++++++++++++++ src/qibolab/channel/configs.py | 12 +++- src/qibolab/dummy/platform.py | 2 +- src/qibolab/execution_parameters.py | 2 +- .../instruments/zhinst/channel/__init__.py | 4 +- src/qibolab/platform/platform.py | 7 +- src/qibolab/serialize.py | 41 +++++++---- 8 files changed, 120 insertions(+), 79 deletions(-) create mode 100644 src/qibolab/channel/channel.py diff --git a/src/qibolab/channel/__init__.py b/src/qibolab/channel/__init__.py index 096fc28363..f1fd439eb3 100644 --- a/src/qibolab/channel/__init__.py +++ b/src/qibolab/channel/__init__.py @@ -1,59 +1,2 @@ -from dataclasses import dataclass -from typing import Optional, Union - +from .channel import * from .configs import * - -ChannelConfig = Union[DcConfig, IqConfig, AcquisitionConfig] - - -@dataclass(frozen=True) -class Channel: - """Channel is an abstract concept that defines means of communication - between users and a quantum computer. - - A quantum computer can be perceived as just a set of channels where - signals can be sent to or received from. Channels are identified - with a unique name. The type of a channel is inferred from the type - of config it accepts. - """ - - name: str - config: ChannelConfig - - -@dataclass(frozen=True) -class WithExternalLo: - """Mixin class to be used for instrument specific IQ channel definitions, - in case the instrument does not have internal up-conversion unit and relies - on an external local oscillator (LO).""" - - lo: str - """The name of the external local oscillator instrument.""" - - -@dataclass(frozen=True) -class WithExternalTwpaPump: - """Mixin class to be used for instrument specific acquisition channel - definitions, in case the instrument does not have built-in oscillator - dedicated as TWPA pump and an external TWPA pump should be used.""" - - twpa_pump: Optional[str] - """The name of the oscillator instrument used as TWPA pump. - - None, if the TWPA pump/TWPA is not installed in the setup. - """ - - -def external_config(channel: Channel) -> dict[str, str]: - """Identifies which parts of the configuration of given channel should be - used to configure and externally connected supplementary instrument. - - Returns: - Dictionary mapping config attribute to instrument name. - """ - - if isinstance(channel, WithExternalLo): - return {"lo": channel.lo} - if isinstance(channel, WithExternalTwpaPump): - return {"twpa_pump": channel.twpa_pump} - return {} diff --git a/src/qibolab/channel/channel.py b/src/qibolab/channel/channel.py new file mode 100644 index 0000000000..de27b48818 --- /dev/null +++ b/src/qibolab/channel/channel.py @@ -0,0 +1,72 @@ +from dataclasses import dataclass +from typing import Optional, Union + +from .configs import AcquisitionConfig, DcConfig, IqConfig, OscillatorConfig + +__all__ = [ + "ChannelConfig", + "Channel", + "WithExternalLo", + "WithExternalTwpaPump", + "external_config", +] + + +ChannelConfig = Union[AcquisitionConfig, DcConfig, IqConfig] + + +@dataclass(frozen=True) +class Channel: + """Channel is an abstract concept that defines means of communication + between users and a quantum computer. + + A quantum computer can be perceived as just a set of channels where + signals can be sent to or received from. Channels are identified + with a unique name. The type of a channel is inferred from the type + of config it accepts. + """ + + name: str + config: ChannelConfig + + +@dataclass(frozen=True) +class WithExternalLo: + """Mixin class to be used for instrument specific IQ channel definitions, + in case the instrument does not have internal up-conversion unit and relies + on an external local oscillator (LO).""" + + lo: str + """The name of the external local oscillator instrument.""" + + +@dataclass(frozen=True) +class WithExternalTwpaPump: + """Mixin class to be used for instrument specific acquisition channel + definitions, in case the instrument does not have built-in oscillator + dedicated as TWPA pump and an external TWPA pump should be used.""" + + twpa_pump: Optional[str] + """The name of the oscillator instrument used as TWPA pump. + + None, if the TWPA pump/TWPA is not installed in the setup. + """ + + +def external_config( + channel: Channel, config: Optional[ChannelConfig] = None +) -> dict[str, OscillatorConfig]: + """Extracts parts of given channel's configuration that should be used to + configure and externally connected supplementary instrument. If config + argument is provided it will take precedence over the config available + inside the channel object. + + Returns: + Dictionary mapping instrument name to corresponding extracted config. + """ + cfg = config or channel.config + if isinstance(channel, WithExternalLo): + return {channel.lo: cfg.lo_config} + if isinstance(channel, WithExternalTwpaPump): + return {channel.twpa_pump: cfg.twpa_pump_config} + return {} diff --git a/src/qibolab/channel/configs.py b/src/qibolab/channel/configs.py index 10c715d3c2..29331ae5d9 100644 --- a/src/qibolab/channel/configs.py +++ b/src/qibolab/channel/configs.py @@ -62,16 +62,24 @@ class IqConfig: mixer_config: Optional[IqMixerConfig] """Configuration for the corresponding IQ mixer. - None if the channel does not feature a mixer. + None if the channel does not feature a mixer, or the mixer does not + require calibration. """ @dataclass(frozen=True) class AcquisitionConfig: - """Configuration for acquisition channels.""" + """Configuration for acquisition channel. + + Currently, in qibolab, acquisition channels are FIXME: + """ twpa_pump_config: Optional[OscillatorConfig] """Config for the corresponding TWPA pump. None if the channel does not feature a TWPA. """ + delay: float + """Delay between readout pulse start and acquisition start.""" + smearing: float + """FIXME:""" diff --git a/src/qibolab/dummy/platform.py b/src/qibolab/dummy/platform.py index 888e8e87b8..f4682fd575 100644 --- a/src/qibolab/dummy/platform.py +++ b/src/qibolab/dummy/platform.py @@ -1,7 +1,7 @@ import itertools import pathlib -from qibolab.channel import Channel, ChannelMap +from qibolab.channel import Channel from qibolab.instruments.dummy import DummyInstrument, DummyLocalOscillator from qibolab.kernels import Kernels from qibolab.platform import Platform diff --git a/src/qibolab/execution_parameters.py b/src/qibolab/execution_parameters.py index 71388cbde6..f5c1699802 100644 --- a/src/qibolab/execution_parameters.py +++ b/src/qibolab/execution_parameters.py @@ -72,7 +72,7 @@ class ExecutionParameters(Model): """Data acquisition type.""" averaging_mode: AveragingMode = AveragingMode.SINGLESHOT """Data averaging mode.""" - channel_cfg: dict[str, ChannelConfig] = None + channel_cfg: dict[str, ChannelConfig] = {} """Configuration for various channels (maps channel name to respective config). diff --git a/src/qibolab/instruments/zhinst/channel/__init__.py b/src/qibolab/instruments/zhinst/channel/__init__.py index d64bdc3145..d12ac9ac8f 100644 --- a/src/qibolab/instruments/zhinst/channel/__init__.py +++ b/src/qibolab/instruments/zhinst/channel/__init__.py @@ -16,4 +16,6 @@ class ZiChannel(Channel): @dataclass(frozen=True) -class ZiAcquisitionChannel(WithExternalTwpaPump, ZiChannel): ... +class ZiAcquisitionChannel(WithExternalTwpaPump, ZiChannel): + + config: ZiAcquisitionConfig diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index a3f3bfed66..0cf67a0fc5 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -280,10 +280,9 @@ def execute( time = estimate_duration(sequences, options, sweepers) log.info(f"Minimal execution time: {time}") - if options.channel_cfg is not None: - for ch, cfg in options.channel_cfg.items(): - for attr, inst in external_config(self.channels[ch]): - self.instruments[inst].setup(**asdict(getattr(cfg, attr))) + for name, ch in self.channels.items(): + for inst, cfg in external_config(ch, options.channel_cfg.get(name)): + self.instruments[inst].setup(**asdict(cfg)) # find readout pulses ro_pulses = { diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index 307fc9644c..ccf71000aa 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -11,7 +11,13 @@ from pathlib import Path from typing import Tuple, Union -from qibolab.channel import Channel, IqMixerConfig, OscillatorConfig +from qibolab.channel import ( + AcquisitionConfig, + Channel, + ChannelConfig, + IqMixerConfig, + OscillatorConfig, +) from qibolab.couplers import Coupler from qibolab.kernels import Kernels from qibolab.native import SingleQubitNatives, TwoQubitNatives @@ -190,17 +196,28 @@ def dump_qubit_name(name: QubitId) -> str: return name -def load_channel_configs(runcard: dict) -> dict[str, dict]: - """Load configurations for channels.""" - configs = runcard["channels"] - for ch, cfg in configs.items(): - if "lo_config" in cfg and cfg["lo_config"] is not None: - cfg["lo_config"] = OscillatorConfig(**cfg["lo_config"]) - if "twpa_pump_config" in cfg and cfg["twpa_pump_config"] is not None: - cfg["twpa_pump_config"] = OscillatorConfig(**cfg["twpa_pump_config"]) - if "mixer_config" in cfg and cfg["mixer_config"] is not None: - cfg["mixer_config"] = IqMixerConfig(**cfg["mixer_config"]) - return configs +def load_channel_config( + runcard: dict, + channel: str, + config_class: type, + *, + lo_config_class: type = OscillatorConfig, + mixer_config_class: type = IqMixerConfig, + acquisition_config_class: type = AcquisitionConfig, + twpa_pump_config_class: type = OscillatorConfig, +) -> ChannelConfig: + """Load configuration for given channel.""" + config_dict = runcard["channels"][channel] + nested_cfg = { + "lo_config": lo_config_class, + "mixer_config": mixer_config_class, + "acquisition_config": acquisition_config_class, + "twpa_pump_config": twpa_pump_config_class, + } + for attr, class_ in nested_cfg.items(): + if config_dict.get(attr) is not None: + config_dict[attr] = class_(**config_dict[attr]) + return config_class(**config_dict) def _dump_pulse(pulse: Pulse): From 3be7b25e18793257212db3d349d64a168d754979 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Fri, 31 May 2024 13:12:16 +0400 Subject: [PATCH 0293/1006] Revert "remove frequency from IqConfig" This reverts commit 0b095105f7e0f2ed35a8b29299a0e5914fcb1c44. --- src/qibolab/channel/configs.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/qibolab/channel/configs.py b/src/qibolab/channel/configs.py index 29331ae5d9..57dcc0fdab 100644 --- a/src/qibolab/channel/configs.py +++ b/src/qibolab/channel/configs.py @@ -54,6 +54,8 @@ class IqMixerConfig: class IqConfig: """Configuration for an IQ channel.""" + frequency: float + """The carrier frequency of the channel.""" lo_config: Optional[OscillatorConfig] """Configuration for the corresponding LO. From a52e4bc8a6d8727beeaf0b5ca68f92db0b7c5999 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Mon, 3 Jun 2024 12:23:54 +0400 Subject: [PATCH 0294/1006] implement possibility for user to add aux IQ channels --- src/qibolab/channel/channel.py | 39 ++++++++++++++++++++++++++++++---- src/qibolab/channel/configs.py | 14 ++++++++++++ 2 files changed, 49 insertions(+), 4 deletions(-) diff --git a/src/qibolab/channel/channel.py b/src/qibolab/channel/channel.py index de27b48818..c56cfed776 100644 --- a/src/qibolab/channel/channel.py +++ b/src/qibolab/channel/channel.py @@ -1,7 +1,13 @@ -from dataclasses import dataclass +from dataclasses import dataclass, field from typing import Optional, Union -from .configs import AcquisitionConfig, DcConfig, IqConfig, OscillatorConfig +from .configs import ( + AcquisitionConfig, + AuxIqConfig, + DcConfig, + IqConfig, + OscillatorConfig, +) __all__ = [ "ChannelConfig", @@ -13,6 +19,9 @@ ChannelConfig = Union[AcquisitionConfig, DcConfig, IqConfig] +AuxChannelConfig = Union[AuxIqConfig] + +AUX_SUFFIX = "__aux" @dataclass(frozen=True) @@ -22,13 +31,35 @@ class Channel: A quantum computer can be perceived as just a set of channels where signals can be sent to or received from. Channels are identified - with a unique name. The type of a channel is inferred from the type - of config it accepts. + with a unique name. The type of channel is inferred from the type of + config it accepts. """ name: str config: ChannelConfig + _aux_channels: dict[str, AuxChannelConfig] = field(init=False, default_factory=dict) + + def __post_init__(self): + if AUX_SUFFIX in self.name: + raise ValueError(f"Channel name must not contain {AUX_SUFFIX}.") + + @property + def aux_channels(self) -> dict[str, AuxChannelConfig]: + return self._aux_channels.copy() + + def create_aux_channel(self, config: AuxChannelConfig) -> str: + if isinstance(self.config, IqConfig) and not isinstance(config, AuxIqConfig): + raise ValueError( + f"Channel {self.name} with configuration of type {IqConfig} (IQ channel) cannot contain aux channel " + f"with configuration of type {type(config)}" + ) + elif not isinstance(self.config, IqConfig): + raise ValueError(f"Aux channels are supported for IQ channels only.") + name = f"{self.name}{AUX_SUFFIX}_{len(self._aux_channels)}" + self._aux_channels[name] = config + return name + @dataclass(frozen=True) class WithExternalLo: diff --git a/src/qibolab/channel/configs.py b/src/qibolab/channel/configs.py index 57dcc0fdab..9991fa468e 100644 --- a/src/qibolab/channel/configs.py +++ b/src/qibolab/channel/configs.py @@ -9,6 +9,7 @@ "AcquisitionConfig", "OscillatorConfig", "IqMixerConfig", + "AuxIqConfig", ] @@ -69,6 +70,19 @@ class IqConfig: """ +@dataclass(frozen=True) +class AuxIqConfig: + """Configuration for auxiliary IQ channels. + + These channels share most of the configuration with the + corresponding main channel, only the frequency is supposed to be + different. + """ + + frequency: float + """The carrier frequency of the channel.""" + + @dataclass(frozen=True) class AcquisitionConfig: """Configuration for acquisition channel. From e34f149caa9771df4082e5b93e4909363fa4c0c2 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Wed, 5 Jun 2024 11:20:20 +0400 Subject: [PATCH 0295/1006] Revert "implement possibility for user to add aux IQ channels" This reverts commit ac155534f01923c0c39ceca261c34d72173873ec. --- src/qibolab/channel/channel.py | 39 ++++------------------------------ src/qibolab/channel/configs.py | 14 ------------ 2 files changed, 4 insertions(+), 49 deletions(-) diff --git a/src/qibolab/channel/channel.py b/src/qibolab/channel/channel.py index c56cfed776..de27b48818 100644 --- a/src/qibolab/channel/channel.py +++ b/src/qibolab/channel/channel.py @@ -1,13 +1,7 @@ -from dataclasses import dataclass, field +from dataclasses import dataclass from typing import Optional, Union -from .configs import ( - AcquisitionConfig, - AuxIqConfig, - DcConfig, - IqConfig, - OscillatorConfig, -) +from .configs import AcquisitionConfig, DcConfig, IqConfig, OscillatorConfig __all__ = [ "ChannelConfig", @@ -19,9 +13,6 @@ ChannelConfig = Union[AcquisitionConfig, DcConfig, IqConfig] -AuxChannelConfig = Union[AuxIqConfig] - -AUX_SUFFIX = "__aux" @dataclass(frozen=True) @@ -31,35 +22,13 @@ class Channel: A quantum computer can be perceived as just a set of channels where signals can be sent to or received from. Channels are identified - with a unique name. The type of channel is inferred from the type of - config it accepts. + with a unique name. The type of a channel is inferred from the type + of config it accepts. """ name: str config: ChannelConfig - _aux_channels: dict[str, AuxChannelConfig] = field(init=False, default_factory=dict) - - def __post_init__(self): - if AUX_SUFFIX in self.name: - raise ValueError(f"Channel name must not contain {AUX_SUFFIX}.") - - @property - def aux_channels(self) -> dict[str, AuxChannelConfig]: - return self._aux_channels.copy() - - def create_aux_channel(self, config: AuxChannelConfig) -> str: - if isinstance(self.config, IqConfig) and not isinstance(config, AuxIqConfig): - raise ValueError( - f"Channel {self.name} with configuration of type {IqConfig} (IQ channel) cannot contain aux channel " - f"with configuration of type {type(config)}" - ) - elif not isinstance(self.config, IqConfig): - raise ValueError(f"Aux channels are supported for IQ channels only.") - name = f"{self.name}{AUX_SUFFIX}_{len(self._aux_channels)}" - self._aux_channels[name] = config - return name - @dataclass(frozen=True) class WithExternalLo: diff --git a/src/qibolab/channel/configs.py b/src/qibolab/channel/configs.py index 9991fa468e..57dcc0fdab 100644 --- a/src/qibolab/channel/configs.py +++ b/src/qibolab/channel/configs.py @@ -9,7 +9,6 @@ "AcquisitionConfig", "OscillatorConfig", "IqMixerConfig", - "AuxIqConfig", ] @@ -70,19 +69,6 @@ class IqConfig: """ -@dataclass(frozen=True) -class AuxIqConfig: - """Configuration for auxiliary IQ channels. - - These channels share most of the configuration with the - corresponding main channel, only the frequency is supposed to be - different. - """ - - frequency: float - """The carrier frequency of the channel.""" - - @dataclass(frozen=True) class AcquisitionConfig: """Configuration for acquisition channel. From 0bd481d7a316a7eb204e41a2f21e272011e2fcac Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Wed, 12 Jun 2024 12:45:31 +0400 Subject: [PATCH 0296/1006] channels and components --- src/qibolab/channel/channel.py | 72 -------- src/qibolab/components/__init__.py | 19 +++ src/qibolab/components/channels.py | 77 +++++++++ .../{channel => components}/configs.py | 37 ++-- src/qibolab/couplers.py | 4 +- src/qibolab/execution_parameters.py | 9 +- src/qibolab/instruments/zhinst/__init__.py | 2 +- .../instruments/zhinst/channel/__init__.py | 21 --- .../zhinst/components}/__init__.py | 0 .../instruments/zhinst/components/channel.py | 19 +++ .../zhinst/{channel => components}/configs.py | 2 +- src/qibolab/instruments/zhinst/executor.py | 161 ++++++------------ src/qibolab/platform/platform.py | 59 ++++--- src/qibolab/qubits.py | 14 +- src/qibolab/serialize.py | 40 +---- 15 files changed, 248 insertions(+), 288 deletions(-) delete mode 100644 src/qibolab/channel/channel.py create mode 100644 src/qibolab/components/__init__.py create mode 100644 src/qibolab/components/channels.py rename src/qibolab/{channel => components}/configs.py (71%) delete mode 100644 src/qibolab/instruments/zhinst/channel/__init__.py rename src/qibolab/{channel => instruments/zhinst/components}/__init__.py (100%) create mode 100644 src/qibolab/instruments/zhinst/components/channel.py rename src/qibolab/instruments/zhinst/{channel => components}/configs.py (91%) diff --git a/src/qibolab/channel/channel.py b/src/qibolab/channel/channel.py deleted file mode 100644 index de27b48818..0000000000 --- a/src/qibolab/channel/channel.py +++ /dev/null @@ -1,72 +0,0 @@ -from dataclasses import dataclass -from typing import Optional, Union - -from .configs import AcquisitionConfig, DcConfig, IqConfig, OscillatorConfig - -__all__ = [ - "ChannelConfig", - "Channel", - "WithExternalLo", - "WithExternalTwpaPump", - "external_config", -] - - -ChannelConfig = Union[AcquisitionConfig, DcConfig, IqConfig] - - -@dataclass(frozen=True) -class Channel: - """Channel is an abstract concept that defines means of communication - between users and a quantum computer. - - A quantum computer can be perceived as just a set of channels where - signals can be sent to or received from. Channels are identified - with a unique name. The type of a channel is inferred from the type - of config it accepts. - """ - - name: str - config: ChannelConfig - - -@dataclass(frozen=True) -class WithExternalLo: - """Mixin class to be used for instrument specific IQ channel definitions, - in case the instrument does not have internal up-conversion unit and relies - on an external local oscillator (LO).""" - - lo: str - """The name of the external local oscillator instrument.""" - - -@dataclass(frozen=True) -class WithExternalTwpaPump: - """Mixin class to be used for instrument specific acquisition channel - definitions, in case the instrument does not have built-in oscillator - dedicated as TWPA pump and an external TWPA pump should be used.""" - - twpa_pump: Optional[str] - """The name of the oscillator instrument used as TWPA pump. - - None, if the TWPA pump/TWPA is not installed in the setup. - """ - - -def external_config( - channel: Channel, config: Optional[ChannelConfig] = None -) -> dict[str, OscillatorConfig]: - """Extracts parts of given channel's configuration that should be used to - configure and externally connected supplementary instrument. If config - argument is provided it will take precedence over the config available - inside the channel object. - - Returns: - Dictionary mapping instrument name to corresponding extracted config. - """ - cfg = config or channel.config - if isinstance(channel, WithExternalLo): - return {channel.lo: cfg.lo_config} - if isinstance(channel, WithExternalTwpaPump): - return {channel.twpa_pump: cfg.twpa_pump_config} - return {} diff --git a/src/qibolab/components/__init__.py b/src/qibolab/components/__init__.py new file mode 100644 index 0000000000..ee977ce991 --- /dev/null +++ b/src/qibolab/components/__init__.py @@ -0,0 +1,19 @@ +"""Component (a.k.a. logical component) is a concept that is part of the +qibolab interface exposed to its users. + +Interacting with, and controlling a quantum computer means orchestrating +its control electronics/equipment. For a qibolab user quantum computer +is just a collection of control instruments. A component represents a +piece of equipment, functionality, or configuration that can be +individually addressed, configured, and referred to in any relevant +context. It can represent a single device, part of a bigger device, or a +collection of multiple devices. Qibolab defines a handful of specific +categories of components, and each platform definition shall have only +such components, independent of what specific electronics is used, how +it is used, etc. One basic requirement for all components is that they +have unique names, and in any relevant context can be referred to by +their name. +""" + +from .channels import * +from .configs import * diff --git a/src/qibolab/components/channels.py b/src/qibolab/components/channels.py new file mode 100644 index 0000000000..0f125663fc --- /dev/null +++ b/src/qibolab/components/channels.py @@ -0,0 +1,77 @@ +"""Channels are a specific type of component, that are responsible for +generating signals. A channel has a name, and it can refer to the names of +other components as needed. The default configuration of components should be +stored elsewhere (in Platform). By dissecting configuration in smaller pieces +and storing them externally (as opposed to storing the channel configuration +inside the channel itself) has multiple benefits, that. + +all revolve around the fact that channels may have shared components, e.g. + - Some instruments use one LO for more than one channel, + - For some use cases (like qutrit experiments, or CNOT gates), we need to define multiple channels that point to the same physical wire. +If channels contain their configuration, it becomes cumbersome to make sure that user can easily see that some channels have shared +components, and changing configuration for one may affect the other as well. By storing component configurations externally we +make sure that there is only one copy of configuration for a component, plus users can clearly see when two different channels +share a component, because channels will refer to the same name for the component under discussion. +""" + +from dataclasses import dataclass +from typing import Optional + +__all__ = [ + "Channel", + "DcChannel", + "IqChannel", + "AcquireChannel", +] + + +@dataclass(frozen=True) +class Channel: + + name: str + """Name of the channel.""" + + +@dataclass(frozen=True) +class DcChannel(Channel): + """Channel that can be used to send DC pulses.""" + + +@dataclass(frozen=True) +class IqChannel(Channel): + """Channel that can be used to send IQ pulses.""" + + mixer: Optional[str] + """Name of the IQ mixer component corresponding to this channel. + + None, if the channel does not have a mixer, or it does not need + configuration. + """ + lo: Optional[str] + """Name of the local oscillator component corresponding to this channel. + + None, if the channel does not have an LO, or it is not configurable. + """ + acquisition: Optional[str] = None + """In case self is a readout channel this shall contain the name of the + corresponding acquire channel. + + FIXME: This is temporary solution to be able to generate acquisition commands on correct channel in drivers, + until we make acquire channels completely independent, and users start putting explicit acquisition commands in pulse sequence. + """ + + +@dataclass(frozen=True) +class AcquireChannel(Channel): + + twpa_pump: Optional[str] + """Name of the TWPA pump component. + + None, if there is no TWPA, or it is not configurable. + """ + measure: Optional[str] = None + """Name of the corresponding measure/probe channel. + + FIXME: This is temporary solution to be able to relate acquisition channel to corresponding measure channel wherever needed in drivers, + until we make acquire channels completely independent, and users start putting explicit acquisition commands in pulse sequence. + """ diff --git a/src/qibolab/channel/configs.py b/src/qibolab/components/configs.py similarity index 71% rename from src/qibolab/channel/configs.py rename to src/qibolab/components/configs.py index 57dcc0fdab..06dc7ded18 100644 --- a/src/qibolab/channel/configs.py +++ b/src/qibolab/components/configs.py @@ -1,14 +1,22 @@ -from dataclasses import dataclass -from typing import Optional +"""Configuration for various components. + +These represent the minimal needed configuration that needs to be +exposed to users. Specific definitions of components can expose more, +and that can be used in any troubleshooting or debugging purposes by +users, but in general any user tool should try to depend only on the +configuration defined by these classes. +""" -"""Common configuration for various channels.""" +from dataclasses import dataclass +from typing import Union __all__ = [ "DcConfig", "IqConfig", "AcquisitionConfig", - "OscillatorConfig", "IqMixerConfig", + "OscillatorConfig", + "Config", ] @@ -23,7 +31,7 @@ class DcConfig: @dataclass(frozen=True) class OscillatorConfig: - """Configuration for a local oscillator.""" + """Configuration for an oscillator.""" frequency: float power: float @@ -56,17 +64,6 @@ class IqConfig: frequency: float """The carrier frequency of the channel.""" - lo_config: Optional[OscillatorConfig] - """Configuration for the corresponding LO. - - None if the channel does not use an LO. - """ - mixer_config: Optional[IqMixerConfig] - """Configuration for the corresponding IQ mixer. - - None if the channel does not feature a mixer, or the mixer does not - require calibration. - """ @dataclass(frozen=True) @@ -76,12 +73,10 @@ class AcquisitionConfig: Currently, in qibolab, acquisition channels are FIXME: """ - twpa_pump_config: Optional[OscillatorConfig] - """Config for the corresponding TWPA pump. - - None if the channel does not feature a TWPA. - """ delay: float """Delay between readout pulse start and acquisition start.""" smearing: float """FIXME:""" + + +Config = Union[DcConfig, IqMixerConfig, OscillatorConfig, IqConfig, AcquisitionConfig] diff --git a/src/qibolab/couplers.py b/src/qibolab/couplers.py index fd312c0f5f..e499f987cb 100644 --- a/src/qibolab/couplers.py +++ b/src/qibolab/couplers.py @@ -1,7 +1,7 @@ from dataclasses import dataclass, field from typing import Dict, Optional, Union -from qibolab.channel import Channel +from qibolab.components import DcChannel from qibolab.native import SingleQubitNatives QubitId = Union[str, int] @@ -25,7 +25,7 @@ class Coupler: native_gates: SingleQubitNatives = field(default_factory=SingleQubitNatives) "For now this only contains the calibrated pulse to activate the coupler." - flux: Optional[Channel] = None + flux: Optional[DcChannel] = None "flux (:class:`qibolab.platforms.utils.Channel`): Channel used to send flux pulses to the qubit." # TODO: With topology or conectivity diff --git a/src/qibolab/execution_parameters.py b/src/qibolab/execution_parameters.py index f5c1699802..a8822fd3e3 100644 --- a/src/qibolab/execution_parameters.py +++ b/src/qibolab/execution_parameters.py @@ -1,7 +1,7 @@ from enum import Enum, auto from typing import Optional -from qibolab.channel import ChannelConfig +from qibolab.components import Config from qibolab.result import ( AveragedIntegratedResults, AveragedRawWaveformResults, @@ -72,11 +72,12 @@ class ExecutionParameters(Model): """Data acquisition type.""" averaging_mode: AveragingMode = AveragingMode.SINGLESHOT """Data averaging mode.""" - channel_cfg: dict[str, ChannelConfig] = {} - """Configuration for various channels (maps channel name to respective + component_configs: list[dict[str, Config]] = [] + """Configuration for various components (maps component name to respective config). - This takes precedence over platform defaults. + This takes precedence over platform defaults, and can be only a + subset of components (i.e. only the ones that need to be updated). """ @property diff --git a/src/qibolab/instruments/zhinst/__init__.py b/src/qibolab/instruments/zhinst/__init__.py index cac0366082..28d208e6d5 100644 --- a/src/qibolab/instruments/zhinst/__init__.py +++ b/src/qibolab/instruments/zhinst/__init__.py @@ -1,4 +1,4 @@ -from .channel import * +from .components import * from .executor import Zurich from .sweep import ProcessedSweeps, classify_sweepers from .util import acquire_channel_name, measure_channel_name diff --git a/src/qibolab/instruments/zhinst/channel/__init__.py b/src/qibolab/instruments/zhinst/channel/__init__.py deleted file mode 100644 index d12ac9ac8f..0000000000 --- a/src/qibolab/instruments/zhinst/channel/__init__.py +++ /dev/null @@ -1,21 +0,0 @@ -from dataclasses import dataclass - -from qibolab.channel import Channel, WithExternalTwpaPump - -from .configs import * - - -@dataclass(frozen=True) -class ZiChannel(Channel): - """Channel for Zurich Instruments (ZI) devices.""" - - device: str - """Name of the device.""" - path: str - """Path of the device node.""" - - -@dataclass(frozen=True) -class ZiAcquisitionChannel(WithExternalTwpaPump, ZiChannel): - - config: ZiAcquisitionConfig diff --git a/src/qibolab/channel/__init__.py b/src/qibolab/instruments/zhinst/components/__init__.py similarity index 100% rename from src/qibolab/channel/__init__.py rename to src/qibolab/instruments/zhinst/components/__init__.py diff --git a/src/qibolab/instruments/zhinst/components/channel.py b/src/qibolab/instruments/zhinst/components/channel.py new file mode 100644 index 0000000000..a7fbf7cad8 --- /dev/null +++ b/src/qibolab/instruments/zhinst/components/channel.py @@ -0,0 +1,19 @@ +from dataclasses import dataclass + +from qibolab.components import Channel + +__all__ = [ + "ZiChannel", +] + + +@dataclass(frozen=True) +class ZiChannel: + """Channel for Zurich Instruments (ZI) devices.""" + + logical_channel: Channel + """Corresponding logical channel.""" + device: str + """Name of the device.""" + path: str + """Path of the device node.""" diff --git a/src/qibolab/instruments/zhinst/channel/configs.py b/src/qibolab/instruments/zhinst/components/configs.py similarity index 91% rename from src/qibolab/instruments/zhinst/channel/configs.py rename to src/qibolab/instruments/zhinst/components/configs.py index 6684fe7a4f..6211fa69b4 100644 --- a/src/qibolab/instruments/zhinst/channel/configs.py +++ b/src/qibolab/instruments/zhinst/components/configs.py @@ -1,6 +1,6 @@ from dataclasses import dataclass -from qibolab.channel.configs import AcquisitionConfig, DcConfig, IqConfig +from qibolab.components import AcquisitionConfig, DcConfig, IqConfig __all__ = [ "ZiDcConfig", diff --git a/src/qibolab/instruments/zhinst/executor.py b/src/qibolab/instruments/zhinst/executor.py index 22607b5ebb..5d386edd9f 100644 --- a/src/qibolab/instruments/zhinst/executor.py +++ b/src/qibolab/instruments/zhinst/executor.py @@ -9,14 +9,14 @@ from laboneq.dsl.device import create_connection from qibolab import AcquisitionType, AveragingMode, ExecutionParameters -from qibolab.couplers import Coupler from qibolab.instruments.abstract import Controller from qibolab.pulses import Delay, Pulse, PulseSequence from qibolab.qubits import Qubit from qibolab.sweeper import Parameter, Sweeper from qibolab.unrolling import Bounds -from . import ZiChannel +from ...components import AcquireChannel, Config, DcChannel, IqChannel +from .components import ZiChannel from .pulse import select_pulse from .sweep import ProcessedSweeps, classify_sweepers from .util import NANO_TO_SECONDS, SAMPLING_RATE @@ -61,13 +61,14 @@ def __init__( for ch in channels: device_setup.add_connections( - ch.device, create_connection(to_signal=ch.name, ports=ch.path) + ch.device, + create_connection(to_signal=ch.logical_channel.name, ports=ch.path), ) self.device_setup = device_setup self.session = None "Zurich device parameters for connection" - self.channels = {ch.name: ch for ch in channels} + self.channels = {ch.logical_channel.name: ch for ch in channels} self.chanel_to_qubit = {} @@ -112,70 +113,59 @@ def disconnect(self): _ = self.session.disconnect() self.is_connected = False - def calibration_step(self, qubits, couplers, options): + def calibration_step(self, configs: dict[str, Config], options): """Zurich general pre experiment calibration definitions. Change to get frequencies from sequence """ - for coupler in couplers.values(): - self.register_couplerflux_line(coupler) - - for qubit in qubits.values(): - if qubit.flux is not None: - self.register_flux_line(qubit) - if any(len(seq[qubit.drive.name]) != 0 for seq in self.sequences): - self.register_drive_line( - qubit=qubit, - intermediate_frequency=qubit.drive.config.frequency - - qubit.drive.config.lo_config.frequency, - ) - if any(len(seq[qubit.readout.name]) != 0 for seq in self.sequences): - self.register_readout_line( - qubit=qubit, - intermediate_frequency=qubit.readout.config.frequency - - qubit.readout.config.lo_config.frequency, - options=options, - ) + for ch in self.channels.values(): + if isinstance(ch.logical_channel, DcChannel): + self.configure_dc_line(ch.logical_channel, configs) + if isinstance(ch.logical_channel, IqChannel): + self.configure_iq_line(ch.logical_channel, configs) + if isinstance(ch.logical_channel, AcquireChannel): + self.configure_acquire_line(ch.logical_channel, configs) self.device_setup.set_calibration(self.calibration) - def register_readout_line(self, qubit, intermediate_frequency, options): - """Registers qubit measure and acquire lines to calibration and signal - map. - - Note - ---- - To allow debugging with and oscilloscope, just set the following:: - - self.calibration[f"/logical_signal_groups/q{q}/measure_line"] = lo.SignalCalibration( - ..., - local_oscillator=lo.Oscillator( - ... - frequency=0.0, - ), - ..., - port_mode=lo.PortMode.LF, - ..., - ) - """ + def configure_dc_line(self, channel: DcChannel, configs: dict[str, Config]): + signal = self.device_setup.logical_signal_by_uid(channel.name) + self.signal_map[channel.name] = signal + self.calibration[signal.name] = laboneq.SignalCalibration( + range=configs[channel.name].power_range, + port_delay=None, + delay_signal=0, + voltage_offset=configs[channel.name].offset, + ) - measure_signal = self.device_setup.logical_signal_by_uid(qubit.readout.name) - self.signal_map[qubit.readout.name] = measure_signal - self.calibration[measure_signal.path] = laboneq.SignalCalibration( + def configure_iq_line(self, channel: IqChannel, configs: dict[str, Config]): + intermediate_frequency = ( + configs[channel.name].frequency - configs[channel.lo].frequency + ) + signal = self.device_setup.logical_signal_by_uid(channel.name) + self.signal_map[channel.name] = signal + self.calibration[signal.path] = laboneq.SignalCalibration( oscillator=laboneq.Oscillator( frequency=intermediate_frequency, - modulation_type=laboneq.ModulationType.SOFTWARE, + modulation_type=laboneq.ModulationType.HARDWARE, ), local_oscillator=laboneq.Oscillator( - frequency=int(qubit.readout.config.lo_config.frequency), + frequency=int(configs[channel.lo].frequency), ), - range=qubit.readout.config.power_range, + range=configs[channel.name].power_range, port_delay=None, delay_signal=0, ) - acquire_signal = self.device_setup.logical_signal_by_uid(qubit.acquisition.name) - self.signal_map[qubit.acquisition.name] = acquire_signal + def configure_acquire_line( + self, channel: AcquireChannel, configs: dict[str, Config] + ): + intermediate_frequency = ( + configs[channel.measure].frequency + - configs[self.channels[channel.measure].logical_channel.lo].frequency + ) + acquire_signal = self.device_setup.logical_signal_by_uid(channel.name) + self.signal_map[channel.name] = acquire_signal oscillator = laboneq.Oscillator( frequency=intermediate_frequency, @@ -183,60 +173,22 @@ def register_readout_line(self, qubit, intermediate_frequency, options): ) threshold = None - if options.acquisition_type == AcquisitionType.DISCRIMINATION: - if qubit.kernel is not None: - # Kernels don't work with the software modulation on the acquire signal - oscillator = None - else: - # To keep compatibility with angle and threshold discrimination (Remove when possible) - threshold = qubit.threshold + # FIXME: + # if options.acquisition_type == AcquisitionType.DISCRIMINATION: + # if qubit.kernel is not None: + # # Kernels don't work with the software modulation on the acquire signal + # oscillator = None + # else: + # # To keep compatibility with angle and threshold discrimination (Remove when possible) + # threshold = qubit.threshold self.calibration[acquire_signal.path] = laboneq.SignalCalibration( oscillator=oscillator, - range=qubit.acquisition.config.power_range, + range=configs[channel.name].power_range, port_delay=self.time_of_flight * NANO_TO_SECONDS, threshold=threshold, ) - def register_drive_line(self, qubit, intermediate_frequency): - """Registers qubit drive line to calibration and signal map.""" - drive_signal = self.device_setup.logical_signal_by_uid(qubit.drive.name) - self.signal_map[qubit.drive.name] = drive_signal - self.calibration[drive_signal.path] = laboneq.SignalCalibration( - oscillator=laboneq.Oscillator( - frequency=intermediate_frequency, - modulation_type=laboneq.ModulationType.HARDWARE, - ), - local_oscillator=laboneq.Oscillator( - frequency=int(qubit.drive.config.lo_config.frequency), - ), - range=qubit.drive.config.power_range, - port_delay=None, - delay_signal=0, - ) - - def register_flux_line(self, qubit): - """Registers qubit flux line to calibration and signal map.""" - flux_signal = self.device_setup.logical_signal_by_uid(qubit.flux.name) - self.signal_map[qubit.flux.name] = flux_signal - self.calibration[flux_signal.name] = laboneq.SignalCalibration( - range=qubit.flux.config.power_range, - port_delay=None, - delay_signal=0, - voltage_offset=qubit.flux.config.offset, - ) - - def register_couplerflux_line(self, coupler): - """Registers qubit flux line to calibration and signal map.""" - flux_signal = self.device_setup.logical_signal_by_uid(coupler.flux.name) - self.signal_map[coupler.flux.name] = flux_signal - self.calibration[flux_signal.path] = laboneq.SignalCalibration( - range=coupler.flux.config.power_range, - port_delay=None, - delay_signal=0, - voltage_offset=coupler.flux.config.offset, - ) - def run_exp(self): """ Compilation settings, compilation step, execution step and data retrival @@ -253,7 +205,7 @@ def run_exp(self): def experiment_flow( self, qubits: dict[str, Qubit], - couplers: dict[str, Coupler], + configs: dict[str, Config], sequences: list[PulseSequence], options: ExecutionParameters, ): @@ -264,18 +216,17 @@ def experiment_flow( Args: qubits: qubits for the platform. - couplers: couplers for the platform. sequences: list of sequences to be played in the experiment. options: execution options/parameters """ self.sequences = sequences - self.calibration_step(qubits, couplers, options) + self.calibration_step(configs, options) self.create_exp(qubits, options) # pylint: disable=W0221 - def play(self, qubits, couplers, sequence, options): + def play(self, qubits, configs, sequence, options): """Play pulse sequence.""" - return self.sweep(qubits, couplers, sequence, options) + return self.sweep(qubits, configs, sequence, options) def create_exp(self, qubits, options): """Zurich experiment initialization using their Experiment class.""" @@ -552,7 +503,7 @@ def play_pulse( def sweep( self, qubits, - couplers, + configs: dict[str, Config], sequences: list[PulseSequence], options, *sweepers, @@ -574,7 +525,7 @@ def sweep( if ch in readout_channels: self.acquisition_type = laboneq.AcquisitionType.SPECTROSCOPY - self.experiment_flow(qubits, couplers, sequences, options) + self.experiment_flow(qubits, configs, sequences, options) self.run_exp() # Get the results back diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 0cf67a0fc5..05a94afbd6 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -8,7 +8,7 @@ import networkx as nx from qibo.config import log, raise_error -from qibolab.channel import Channel, external_config +from qibolab.components import Config from qibolab.couplers import Coupler from qibolab.execution_parameters import ExecutionParameters from qibolab.instruments.abstract import Controller, Instrument, InstrumentId @@ -120,6 +120,8 @@ class Platform: pairs: QubitPairMap """Dictionary mapping tuples of qubit names to :class:`qibolab.qubits.QubitPair` objects.""" + components: dict[str, Config] + """Maps name of component to its default config.""" instruments: InstrumentMap """Dictionary mapping instrument names to :class:`qibolab.instruments.abstract.Instrument` objects.""" @@ -142,12 +144,6 @@ class Platform: topology: nx.Graph = field(default_factory=nx.Graph) """Graph representing the qubit connectivity in the quantum chip.""" - channels: dict[str, Channel] = field(default_factory=dict, init=False) - """Channels of this platform. - - Mapping channel name to channel. - """ - def __post_init__(self): log.info("Loading platform %s", self.name) if self.resonator_type is None: @@ -158,15 +154,6 @@ def __post_init__(self): [(pair.qubit1.name, pair.qubit2.name) for pair in self.pairs.values()] ) - for qubit in self.qubits.values(): - self.channels[qubit.drive.name] = qubit.drive - self.channels[qubit.readout.name] = qubit.readout - self.channels[qubit.acquisition.name] = qubit.acquisition - if qubit.flux is not None: - self.channels[qubit.flux.name] = qubit.flux - for coupler in self.couplers.values(): - self.channels[coupler.flux.name] = coupler.flux - def __str__(self): return self.name @@ -209,6 +196,30 @@ def disconnect(self): instrument.disconnect() self.is_connected = False + def _apply_config_updates( + self, updates: list[dict[str, Config]] + ) -> dict[str, Config]: + """Apply given list of config updates to the default configuration and + return the updated config dict. + + Args: + updates: list of updates, where each entry is a dict mapping component name to new config. Later entries + in the list override earlier entries (if they happen to update the same thing). + """ + components = self.components.copy() + for update in updates: + for name, cfg in update.items(): + if name not in components: + raise ValueError( + f"Cannot update configuration for unknown component {name}" + ) + if type(cfg) is not type(components[name]): + raise ValueError( + f"Configuration of component {name} with type {type(components[name])} cannot be updated with configuration of type {type(cfg)}" + ) + components[name] = cfg + return components + @property def _controller(self): """Identify controller instrument. @@ -226,14 +237,14 @@ def _controller(self): assert len(controllers) == 1 return controllers[0] - def _execute(self, sequence, options, sweepers): + def _execute(self, sequence, configs, options, sweepers): """Execute sequence on the controllers.""" result = {} for instrument in self.instruments.values(): if isinstance(instrument, Controller): new_result = instrument.play( - self.qubits, self.couplers, sequence, options, sweepers + self.qubits, self.couplers, configs, sequence, options, sweepers ) if isinstance(new_result, dict): result.update(new_result) @@ -280,9 +291,13 @@ def execute( time = estimate_duration(sequences, options, sweepers) log.info(f"Minimal execution time: {time}") - for name, ch in self.channels.items(): - for inst, cfg in external_config(ch, options.channel_cfg.get(name)): - self.instruments[inst].setup(**asdict(cfg)) + configs = self._apply_config_updates(options.component_configs) + + # for components that represent aux external instruments (e.g. lo) to the main control instrument + # set the config directly + for name, cfg in configs.items(): + if name in self.instruments: + self.instruments[name].setup(**asdict(cfg)) # find readout pulses ro_pulses = { @@ -294,7 +309,7 @@ def execute( results = defaultdict(list) for b in batch(sequences, self._controller.bounds): sequence, readouts = unroll_sequences(b, options.relaxation_time) - result = self._execute(sequence, options, sweepers) + result = self._execute(sequence, configs, options, sweepers) for serial, new_serials in readouts.items(): results[serial].extend(result[ser] for ser in new_serials) diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index 1f023810c0..040069433e 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -3,14 +3,14 @@ import numpy as np -from qibolab.channel import Channel +from qibolab.components import AcquireChannel, DcChannel, IqChannel from qibolab.couplers import Coupler from qibolab.native import SingleQubitNatives, TwoQubitNatives QubitId = Union[str, int] """Type for qubit names.""" -CHANNEL_NAMES = ("readout", "acquisition", "drive", "flux", "twpa") +CHANNEL_NAMES = ("measure", "acquisition", "drive", "flux") """Names of channels that belong to a qubit. Not all channels are required to operate a qubit. @@ -31,8 +31,6 @@ class Qubit: name (int, str): Qubit number or name. readout (:class:`qibolab.platforms.utils.Channel`): Channel used to readout pulses to the qubit. - feedback (:class:`qibolab.platforms.utils.Channel`): Channel used to - get readout feedback from the qubit. drive (:class:`qibolab.platforms.utils.Channel`): Channel used to send drive pulses to the qubit. flux (:class:`qibolab.platforms.utils.Channel`): Channel used to @@ -83,10 +81,10 @@ class Qubit: mixer_readout_g: float = 0.0 mixer_readout_phi: float = 0.0 - readout: Optional[Channel] = None - acquisition: Optional[Channel] = None - drive: Optional[Channel] = None - flux: Optional[Channel] = None + measure: Optional[IqChannel] = None + acquisition: Optional[AcquireChannel] = None + drive: Optional[IqChannel] = None + flux: Optional[DcChannel] = None native_gates: SingleQubitNatives = field(default_factory=SingleQubitNatives) diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index ccf71000aa..6ace692de1 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -6,18 +6,11 @@ """ import json -from collections.abc import Iterable from dataclasses import asdict, fields from pathlib import Path from typing import Tuple, Union -from qibolab.channel import ( - AcquisitionConfig, - Channel, - ChannelConfig, - IqMixerConfig, - OscillatorConfig, -) +from qibolab.components import Config from qibolab.couplers import Coupler from qibolab.kernels import Kernels from qibolab.native import SingleQubitNatives, TwoQubitNatives @@ -196,28 +189,13 @@ def dump_qubit_name(name: QubitId) -> str: return name -def load_channel_config( +def load_component_config( runcard: dict, - channel: str, + component: str, config_class: type, - *, - lo_config_class: type = OscillatorConfig, - mixer_config_class: type = IqMixerConfig, - acquisition_config_class: type = AcquisitionConfig, - twpa_pump_config_class: type = OscillatorConfig, -) -> ChannelConfig: - """Load configuration for given channel.""" - config_dict = runcard["channels"][channel] - nested_cfg = { - "lo_config": lo_config_class, - "mixer_config": mixer_config_class, - "acquisition_config": acquisition_config_class, - "twpa_pump_config": twpa_pump_config_class, - } - for attr, class_ in nested_cfg.items(): - if config_dict.get(attr) is not None: - config_dict[attr] = class_(**config_dict[attr]) - return config_class(**config_dict) +) -> Config: + """Load configuration for given component.""" + return config_class(**runcard["components"][component]) def _dump_pulse(pulse: Pulse): @@ -323,9 +301,9 @@ def dump_instruments(instruments: InstrumentMap) -> dict: return data -def dump_channels(channels: Iterable[Channel]) -> dict: +def dump_components(components) -> dict: """Dump channel configs.""" - return {ch.name: asdict(ch.config) for ch in channels} + return {name: asdict(cfg) for name, cfg in components.items()} def dump_runcard(platform: Platform, path: Path): @@ -344,7 +322,7 @@ def dump_runcard(platform: Platform, path: Path): "qubits": list(platform.qubits), "topology": [list(pair) for pair in platform.ordered_pairs], "instruments": dump_instruments(platform.instruments), - "channels": dump_channels(platform.channels.values()), + "components": dump_components(platform.components), } if platform.couplers: From 4cfee9a98b07fb22bf91011cf4b4a481fce54a02 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Wed, 26 Jun 2024 11:07:37 +0400 Subject: [PATCH 0297/1006] add config and components getters --- src/qibolab/platform/platform.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 05a94afbd6..132c94fdf0 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -120,7 +120,7 @@ class Platform: pairs: QubitPairMap """Dictionary mapping tuples of qubit names to :class:`qibolab.qubits.QubitPair` objects.""" - components: dict[str, Config] + component_configs: dict[str, Config] """Maps name of component to its default config.""" instruments: InstrumentMap """Dictionary mapping instrument names to @@ -175,6 +175,15 @@ def sampling_rate(self): if isinstance(instrument, Controller): return instrument.sampling_rate + @property + def components(self) -> set[str]: + """Names of all components available in the platform.""" + return set(self.component_configs.keys()) + + def config(self, name: str) -> Config: + """Returns configuration of given component.""" + return self.component_configs[name] + def connect(self): """Connect to all instruments.""" if not self.is_connected: From 8dbfb9c6aa22d79bca265bb74b9ee3ad877a7d4f Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Wed, 26 Jun 2024 15:38:17 +0400 Subject: [PATCH 0298/1006] do not refer to qubits in the driver --- src/qibolab/instruments/zhinst/executor.py | 169 +++++++++++---------- src/qibolab/platform/platform.py | 17 ++- src/qibolab/serialize.py | 6 +- 3 files changed, 102 insertions(+), 90 deletions(-) diff --git a/src/qibolab/instruments/zhinst/executor.py b/src/qibolab/instruments/zhinst/executor.py index 5d386edd9f..40e4954759 100644 --- a/src/qibolab/instruments/zhinst/executor.py +++ b/src/qibolab/instruments/zhinst/executor.py @@ -11,7 +11,6 @@ from qibolab import AcquisitionType, AveragingMode, ExecutionParameters from qibolab.instruments.abstract import Controller from qibolab.pulses import Delay, Pulse, PulseSequence -from qibolab.qubits import Qubit from qibolab.sweeper import Parameter, Sweeper from qibolab.unrolling import Bounds @@ -40,6 +39,10 @@ } +def _acquisition_handle(seq_idx: int, pulse_idx: int, acquisition_name: str) -> str: + return f"sequence_{seq_idx}_{acquisition_name}_{pulse_idx}" + + class Zurich(Controller): """Driver for a collection of ZI instruments that are automatically synchronized via ZSync protocol.""" @@ -70,8 +73,6 @@ def __init__( self.channels = {ch.logical_channel.name: ch for ch in channels} - self.chanel_to_qubit = {} - self.time_of_flight = time_of_flight self.smearing = smearing "Parameters read from the runcard not part of ExecutionParameters" @@ -100,6 +101,14 @@ def __init__( def sampling_rate(self): return SAMPLING_RATE + def _measure_channels(self) -> set[str]: + return { + ch.logical_channel.name + for ch in self.channels.values() + if isinstance(ch.logical_channel, IqChannel) + and ch.logical_channel.acquisition is not None + } + def connect(self): if self.is_connected is False: # To fully remove logging #configure_logging=False @@ -204,9 +213,9 @@ def run_exp(self): def experiment_flow( self, - qubits: dict[str, Qubit], configs: dict[str, Config], sequences: list[PulseSequence], + integration_setup, options: ExecutionParameters, ): """Create the experiment object for the devices, following the steps @@ -215,20 +224,19 @@ def experiment_flow( Translation, Calibration, Experiment Definition. Args: - qubits: qubits for the platform. sequences: list of sequences to be played in the experiment. options: execution options/parameters """ self.sequences = sequences self.calibration_step(configs, options) - self.create_exp(qubits, options) + self.create_exp(integration_setup, options) # pylint: disable=W0221 - def play(self, qubits, configs, sequence, options): + def play(self, configs, sequence, options): """Play pulse sequence.""" - return self.sweep(qubits, configs, sequence, options) + return self.sweep(configs, sequence, options) - def create_exp(self, qubits, options): + def create_exp(self, integration_setup, options): """Zurich experiment initialization using their Experiment class.""" if self.acquisition_type: acquisition_type = self.acquisition_type @@ -249,7 +257,7 @@ def create_exp(self, qubits, options): ) contexts = self._contexts(exp, exp_options) - self._populate_exp(qubits, exp, exp_options, contexts) + self._populate_exp(exp, integration_setup, exp_options, contexts) self.set_calibration_for_rt_sweep(exp) exp.set_signal_map(self.signal_map) self.experiment = exp @@ -297,22 +305,22 @@ def _contexts( def _populate_exp( self, - qubits: dict[str, Qubit], exp: laboneq.Experiment, + integration_setup, exp_options: ExecutionParameters, contexts, ): """Recursively activate the nested contexts, then define the main experiment body inside the innermost context.""" if len(contexts) == 0: - self.select_exp(exp, qubits, exp_options) + self.select_exp(exp, integration_setup, exp_options) return sweeper, ctx = contexts[0] with ctx: if sweeper in self.nt_sweeps: self.set_instrument_nodes_for_nt_sweep(exp, sweeper) - self._populate_exp(qubits, exp, exp_options, contexts[1:]) + self._populate_exp(exp, integration_setup, exp_options, contexts[1:]) def set_calibration_for_rt_sweep(self, exp: laboneq.Experiment) -> None: """Set laboneq calibration of parameters that are to be swept in real- @@ -367,15 +375,13 @@ def get_channel_node_path(self, channel_name: str) -> str: f"Could not find instrument node corresponding to channel {channel_name}" ) - def select_exp(self, exp, qubits, exp_options): + def select_exp(self, exp, integration_setup, exp_options): """Build Zurich Experiment selecting the relevant sections.""" - readout_channels = set( - chain(*([qb.readout.name, qb.acquisition.name] for qb in qubits.values())) - ) - weights = {} + measurement_channels = self._measure_channels() + kernels = {} previous_section = None for i, seq in enumerate(self.sequences): - other_channels = set(seq.keys()) - readout_channels + other_channels = set(seq.keys()) - measurement_channels section_uid = f"sequence_{i}" with exp.section(uid=section_uid, play_after=previous_section): with exp.section(uid=f"sequence_{i}_control"): @@ -390,79 +396,78 @@ def select_exp(self, exp, qubits, exp_options): for ch in set(seq.keys()) - other_channels: for j, pulse in enumerate(seq[ch]): with exp.section(uid=f"sequence_{i}_measure_{j}"): - qubit = self.chanel_to_qubit[ch] + acquisition_name = self.channels[ + ch + ].logical_channel.acquisition exp.delay( - signal=qubit.acquisition.name, + signal=acquisition_name, time=self.smearing * NANO_TO_SECONDS, ) - weight = self._get_weights( - weights, qubit, pulse, i, exp_options - ) - self.play_pulse( exp, - qubit.readout.name, + ch, pulse, self.processed_sweeps.sweeps_for_pulse(pulse), ) exp.delay( - signal=qubit.acquisition.name, + signal=acquisition_name, time=self.time_of_flight * NANO_TO_SECONDS, ) # FIXME + + kernel = kernels.setdefault( + acquisition_name, + self._construct_kernel( + acquisition_name, + integration_setup, + pulse.duration, + exp_options, + ), + ) exp.acquire( - signal=qubit.acquisition.name, - handle=f"sequence{qubit.name}_{i}", - kernel=weight, + signal=acquisition_name, + handle=_acquisition_handle(i, j, acquisition_name), + kernel=kernel, ) if j == len(seq[ch]) - 1: exp.delay( - signal=qubit.acquisition.name, + signal=acquisition_name, time=exp_options.relaxation_time * NANO_TO_SECONDS, ) previous_section = section_uid - def _get_weights(self, weights, qubit, pulse, i, exp_options): + def _construct_kernel( + self, + acquisition_name: str, + integration_setup: dict[str, tuple[np.ndarray, float]], + duration: float, + exp_options, + ): + kernel, iq_angle = integration_setup[acquisition_name] if ( - qubit.kernel is not None + kernel is not None and exp_options.acquisition_type == laboneq.AcquisitionType.DISCRIMINATION ): - weight = laboneq.pulse_library.sampled_pulse_complex( - samples=qubit.kernel * np.exp(1j * qubit.iq_angle), + return laboneq.pulse_library.sampled_pulse_complex( + samples=kernel * np.exp(1j * iq_angle), ) else: - if i == 0: - if ( - exp_options.acquisition_type - == laboneq.AcquisitionType.DISCRIMINATION - ): - weight = laboneq.pulse_library.sampled_pulse_complex( - samples=np.ones( - [ - int( - pulse.duration * 2 - - 3 * self.smearing * NANO_TO_SECONDS - ) - ] - ) - * np.exp(1j * qubit.iq_angle), + if exp_options.acquisition_type == laboneq.AcquisitionType.DISCRIMINATION: + return laboneq.pulse_library.sampled_pulse_complex( + samples=np.ones( + [int(duration * 2 - 3 * self.smearing * NANO_TO_SECONDS)] ) - weights[qubit.name] = weight - else: - weight = laboneq.pulse_library.const( - length=round(pulse.duration * NANO_TO_SECONDS, 9) - - 1.5 * self.smearing * NANO_TO_SECONDS, - amplitude=1, - ) - - weights[qubit.name] = weight + * np.exp(1j * iq_angle), + ) else: - weight = weights[qubit.name] - - return weight + return laboneq.pulse_library.const( + length=round(duration * NANO_TO_SECONDS, 9) + - 1.5 * self.smearing * NANO_TO_SECONDS, + amplitude=1, + ) @staticmethod def play_pulse( @@ -502,48 +507,44 @@ def play_pulse( def sweep( self, - qubits, configs: dict[str, Config], sequences: list[PulseSequence], options, + integration_setup: dict[str, tuple[np.ndarray, float]], *sweepers, ): """Play pulse and sweepers sequence.""" - self.chanel_to_qubit = {qb.readout.name: qb for qb in qubits.values()} self.signal_map = {} self.processed_sweeps = ProcessedSweeps(sweepers, self.channels) self.nt_sweeps, self.rt_sweeps = classify_sweepers(sweepers) self.acquisition_type = None - readout_channels = set( - chain(*([qb.readout.name, qb.acquisition.name] for qb in qubits.values())) - ) + measure_channels = self._measure_channels() for sweeper in sweepers: if sweeper.parameter in {Parameter.frequency}: for ch in sweeper.channels: - if ch in readout_channels: + if ch in measure_channels: self.acquisition_type = laboneq.AcquisitionType.SPECTROSCOPY - self.experiment_flow(qubits, configs, sequences, options) + self.experiment_flow(configs, sequences, integration_setup, options) self.run_exp() # Get the results back results = {} - for qubit in qubits.values(): - q = qubit.name # pylint: disable=C0103 - for i, ropulse in enumerate( - chain(*(seq[qubit.readout.name] for seq in self.sequences)) - ): - data = self.results.get_data(f"sequence{q}_{i}") - - if options.acquisition_type is AcquisitionType.DISCRIMINATION: - data = ( - np.ones(data.shape) - data.real - ) # Probability inversion patch - - id_ = ropulse.id - # qubit = ropulse.pulse.qubit - results[id_] = results[qubit.name] = options.results_type(data) + for ch in measure_channels: + acquisition_name = self.channels[ch].logical_channel.acquisition + for i, seq in enumerate(self.sequences): + for j, ropulse in enumerate(seq[ch]): + handle = _acquisition_handle(i, j, acquisition_name) + data = self.results.get_data(handle) + + if options.acquisition_type is AcquisitionType.DISCRIMINATION: + data = ( + np.ones(data.shape) - data.real + ) # Probability inversion patch + + id_ = ropulse.id + results[id_] = options.results_type(data) return results diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 132c94fdf0..2b19bdb43a 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -6,6 +6,7 @@ from typing import Any, Dict, List, Optional, Tuple, TypeVar import networkx as nx +import numpy as np from qibo.config import log, raise_error from qibolab.components import Config @@ -246,14 +247,14 @@ def _controller(self): assert len(controllers) == 1 return controllers[0] - def _execute(self, sequence, configs, options, sweepers): + def _execute(self, sequence, configs, options, integration_setup, sweepers): """Execute sequence on the controllers.""" result = {} for instrument in self.instruments.values(): if isinstance(instrument, Controller): new_result = instrument.play( - self.qubits, self.couplers, configs, sequence, options, sweepers + configs, sequence, options, integration_setup, sweepers ) if isinstance(new_result, dict): result.update(new_result) @@ -308,6 +309,14 @@ def execute( if name in self.instruments: self.instruments[name].setup(**asdict(cfg)) + # maps acquisition channel name to corresponding kernel and iq_angle + # FIXME: this is temporary solution to deliver the information to drivers + # until we make acquisition channels first class citizens in the sequences + # so that each acquisition command carries the info with it. + integration_setup: dict[str, tuple[np.ndarray, float]] = {} + for qubit in self.qubits.values(): + integration_setup[qubit.acquisition.name] = (qubit.kernel, qubit.iq_angle) + # find readout pulses ro_pulses = { pulse.id: pulse.qubit @@ -318,7 +327,9 @@ def execute( results = defaultdict(list) for b in batch(sequences, self._controller.bounds): sequence, readouts = unroll_sequences(b, options.relaxation_time) - result = self._execute(sequence, configs, options, sweepers) + result = self._execute( + sequence, configs, options, integration_setup, sweepers + ) for serial, new_serials in readouts.items(): results[serial].extend(result[ser] for ser in new_serials) diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index 6ace692de1..894297a3c9 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -301,9 +301,9 @@ def dump_instruments(instruments: InstrumentMap) -> dict: return data -def dump_components(components) -> dict: +def dump_component_configs(component_configs) -> dict: """Dump channel configs.""" - return {name: asdict(cfg) for name, cfg in components.items()} + return {name: asdict(cfg) for name, cfg in component_configs.items()} def dump_runcard(platform: Platform, path: Path): @@ -322,7 +322,7 @@ def dump_runcard(platform: Platform, path: Path): "qubits": list(platform.qubits), "topology": [list(pair) for pair in platform.ordered_pairs], "instruments": dump_instruments(platform.instruments), - "components": dump_components(platform.components), + "components": dump_component_configs(platform.component_configs), } if platform.couplers: From ca025d4a2378d80df1b6a51073f1a9bff0161142 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Thu, 27 Jun 2024 16:03:07 +0400 Subject: [PATCH 0299/1006] update ZI driver according to components --- src/qibolab/instruments/zhinst/executor.py | 4 ++-- src/qibolab/instruments/zhinst/sweep.py | 9 ++++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/qibolab/instruments/zhinst/executor.py b/src/qibolab/instruments/zhinst/executor.py index 40e4954759..af5c2acf3f 100644 --- a/src/qibolab/instruments/zhinst/executor.py +++ b/src/qibolab/instruments/zhinst/executor.py @@ -156,7 +156,7 @@ def configure_iq_line(self, channel: IqChannel, configs: dict[str, Config]): self.calibration[signal.path] = laboneq.SignalCalibration( oscillator=laboneq.Oscillator( frequency=intermediate_frequency, - modulation_type=laboneq.ModulationType.HARDWARE, + modulation_type=laboneq.ModulationType.HARDWARE if channel.acquisition is None else laboneq.ModulationType.SOFTWARE, ), local_oscillator=laboneq.Oscillator( frequency=int(configs[channel.lo].frequency), @@ -516,7 +516,7 @@ def sweep( """Play pulse and sweepers sequence.""" self.signal_map = {} - self.processed_sweeps = ProcessedSweeps(sweepers, self.channels) + self.processed_sweeps = ProcessedSweeps(sweepers, self.channels, configs) self.nt_sweeps, self.rt_sweeps = classify_sweepers(sweepers) self.acquisition_type = None diff --git a/src/qibolab/instruments/zhinst/sweep.py b/src/qibolab/instruments/zhinst/sweep.py index 94bb13ab78..b3f853f9a8 100644 --- a/src/qibolab/instruments/zhinst/sweep.py +++ b/src/qibolab/instruments/zhinst/sweep.py @@ -5,6 +5,7 @@ import laboneq.simple as laboneq +from qibolab.components import Config from qibolab.pulses import Pulse, PulseType from qibolab.sweeper import Parameter, Sweeper @@ -59,6 +60,7 @@ def __init__( self, sweepers: Iterable[Sweeper], channels: dict[str, ZiChannel], + configs: dict[str, Config] ): pulse_sweeps = [] channel_sweeps = [] @@ -76,14 +78,15 @@ def __init__( parallel_sweeps.append((sweeper, sweep_param)) for ch in sweeper.channels or []: + logical_channel = channels[ch].logical_channel if sweeper.parameter is Parameter.bias: sweep_param = laboneq.SweepParameter( - values=sweeper.values + channels[ch].config.offset + values=sweeper.values + configs[logical_channel.name].offset ) elif sweeper.parameter is Parameter.frequency: intermediate_frequency = ( - channels[ch].config.frequency - - channels[ch].config.lo_config.frequency + configs[logical_channel.name].frequency + - configs[logical_channel.lo].frequency ) sweep_param = laboneq.SweepParameter( values=sweeper.values + intermediate_frequency From c230637922d9b71f0b7b44e41049000e54e05775 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Thu, 27 Jun 2024 16:04:04 +0400 Subject: [PATCH 0300/1006] fix component config update --- src/qibolab/platform/platform.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 2b19bdb43a..3df4d1f8d5 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -216,7 +216,7 @@ def _apply_config_updates( updates: list of updates, where each entry is a dict mapping component name to new config. Later entries in the list override earlier entries (if they happen to update the same thing). """ - components = self.components.copy() + components = self.component_configs.copy() for update in updates: for name, cfg in update.items(): if name not in components: From 22c6d8cfb3f2b523321163fa4afd19ee50b79d32 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Thu, 27 Jun 2024 14:10:47 +0400 Subject: [PATCH 0301/1006] remove duplicate line --- src/qibolab/instruments/zhinst/sweep.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/qibolab/instruments/zhinst/sweep.py b/src/qibolab/instruments/zhinst/sweep.py index b3f853f9a8..ac7ba7a8aa 100644 --- a/src/qibolab/instruments/zhinst/sweep.py +++ b/src/qibolab/instruments/zhinst/sweep.py @@ -71,10 +71,9 @@ def __init__( sweep_param = laboneq.SweepParameter( values=sweeper.values * NANO_TO_SECONDS ) - pulse_sweeps.append((pulse, sweeper.parameter, sweep_param)) else: sweep_param = laboneq.SweepParameter(values=copy(sweeper.values)) - pulse_sweeps.append((pulse, sweeper.parameter, sweep_param)) + pulse_sweeps.append((pulse, sweeper.parameter, sweep_param)) parallel_sweeps.append((sweeper, sweep_param)) for ch in sweeper.channels or []: From 489ae862a3817d77de146b839821f745ca0c4cdd Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Mon, 1 Jul 2024 12:29:15 +0400 Subject: [PATCH 0302/1006] fix the extend implementation --- src/qibolab/pulses/sequence.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qibolab/pulses/sequence.py b/src/qibolab/pulses/sequence.py index db26b32e3e..0f5e98d1fa 100644 --- a/src/qibolab/pulses/sequence.py +++ b/src/qibolab/pulses/sequence.py @@ -41,6 +41,6 @@ def extend(self, other: "PulseSequence") -> None: durations = {ch: self.channel_duration(ch) for ch in other} max_duration = max(durations.values(), default=0.0) for ch, duration in durations.items(): - if delay := round(max_duration - duration, int(1 / tol)) > 0: - self[ch].extend(Delay(duration=delay)) + if (delay := round(max_duration - duration, int(1 / tol))) > 0: + self[ch].append(Delay(duration=delay)) self[ch].extend(other[ch]) From a079c550ad5a8e89fac2b4eaf1e0e03e5e03e31b Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Mon, 1 Jul 2024 12:31:08 +0400 Subject: [PATCH 0303/1006] sequence tests --- tests/pulses/test_sequence.py | 389 +++++++++------------------------- 1 file changed, 99 insertions(+), 290 deletions(-) diff --git a/tests/pulses/test_sequence.py b/tests/pulses/test_sequence.py index c44eacbe85..bde2bfe8fe 100644 --- a/tests/pulses/test_sequence.py +++ b/tests/pulses/test_sequence.py @@ -1,3 +1,5 @@ +from collections import defaultdict + from qibolab.pulses import ( Delay, Drag, @@ -9,335 +11,142 @@ ) -def test_add_readout(): +def test_init(): + sequence = PulseSequence() + assert isinstance(sequence, defaultdict) + assert len(sequence) == 0 + + +def test_default_factory(): + sequence = PulseSequence() + some = sequence["some channel"] + assert isinstance(some, list) + assert len(some) == 0 + + +def test_ro_pulses(): + Pulse( + amplitude=0.3, + duration=60, + relative_phase=0, + envelope=Gaussian(rel_sigma=0.2), + ) sequence = PulseSequence() - sequence.append( + sequence["ch1"].append( Pulse( - frequency=200_000_000, amplitude=0.3, duration=60, relative_phase=0, envelope=Gaussian(rel_sigma=0.2), - channel="1", ) ) - sequence.append(Delay(duration=4, channel="1")) - sequence.append( + sequence["ch2"].append(Delay(duration=4)) + sequence["ch2"].append( Pulse( - frequency=200_000_000, amplitude=0.3, duration=60, relative_phase=0, envelope=Drag(rel_sigma=0.2, beta=2), - channel="1", type=PulseType.FLUX, ) ) - sequence.append(Delay(duration=4, channel="1")) - sequence.append( - Pulse( - frequency=20_000_000, - amplitude=0.9, - duration=2000, - relative_phase=0, - envelope=Rectangular(), - channel="11", - type=PulseType.READOUT, - ) - ) - assert len(sequence) == 5 - assert len(sequence.ro_pulses) == 1 - assert len(sequence.qd_pulses) == 1 - assert len(sequence.qf_pulses) == 1 - - -def test_get_qubit_pulses(): - p1 = Pulse( - duration=400, - amplitude=0.9, - frequency=20e6, - envelope=Gaussian(rel_sigma=0.2), - relative_phase=10, - qubit=0, - ) - p2 = Pulse( - duration=400, - amplitude=0.9, - frequency=20e6, - envelope=Rectangular(), - channel="30", - qubit=0, - type=PulseType.READOUT, - ) - p3 = Pulse( - duration=400, - amplitude=0.9, - frequency=20e6, - envelope=Drag(rel_sigma=0.2, beta=50), - relative_phase=20, - qubit=1, - ) - p4 = Pulse( - duration=400, - amplitude=0.9, - frequency=20e6, - envelope=Drag(rel_sigma=0.2, beta=50), - relative_phase=30, - qubit=1, - ) - p5 = Pulse( - duration=400, + sequence["ch3"].append(Delay(duration=4)) + ro_pulse = Pulse( amplitude=0.9, - frequency=20e6, - envelope=Rectangular(), - channel="30", - qubit=1, - type=PulseType.READOUT, - ) - p6 = Pulse.flux( - duration=400, amplitude=0.9, envelope=Rectangular(), channel="40", qubit=1 - ) - p7 = Pulse.flux( - duration=400, amplitude=0.9, envelope=Rectangular(), channel="40", qubit=2 - ) - - ps = PulseSequence([p1, p2, p3, p4, p5, p6, p7]) - assert ps.qubits == [0, 1, 2] - assert len(ps.get_qubit_pulses(0)) == 2 - assert len(ps.get_qubit_pulses(1)) == 4 - assert len(ps.get_qubit_pulses(2)) == 1 - assert len(ps.get_qubit_pulses(0, 1)) == 6 - - -def test_get_channel_pulses(): - p1 = Pulse( - duration=400, - frequency=0.9, - amplitude=20e6, - envelope=Gaussian(rel_sigma=0.2), - channel="10", - ) - p2 = Pulse( - duration=400, - frequency=0.9, - amplitude=20e6, - envelope=Rectangular(), - channel="30", - type=PulseType.READOUT, - ) - p3 = Pulse( - duration=400, - frequency=0.9, - amplitude=20e6, - envelope=Drag(rel_sigma=0.2, beta=5), - channel="20", - ) - p4 = Pulse( - duration=400, - frequency=0.9, - amplitude=20e6, - envelope=Drag(rel_sigma=0.2, beta=5), - channel="30", - ) - p5 = Pulse( - duration=400, - frequency=0.9, - amplitude=20e6, + duration=2000, + relative_phase=0, envelope=Rectangular(), - channel="20", type=PulseType.READOUT, ) - p6 = Pulse( - duration=400, - frequency=0.9, - amplitude=20e6, - envelope=Gaussian(rel_sigma=0.2), - channel="30", - ) - - ps = PulseSequence([p1, p2, p3, p4, p5, p6]) - assert sorted(ps.channels) == ["10", "20", "30"] - assert len(ps.get_channel_pulses("10")) == 1 - assert len(ps.get_channel_pulses("20")) == 2 - assert len(ps.get_channel_pulses("30")) == 3 - assert len(ps.get_channel_pulses("20", "30")) == 5 - - -def test_sequence_duration(): - p0 = Delay(duration=20, channel="1") - p1 = Pulse( - duration=40, - amplitude=0.9, - frequency=200e6, - envelope=Drag(rel_sigma=0.2, beta=1), - channel="1", - type=PulseType.DRIVE, - ) - p2 = Pulse( - duration=1000, - amplitude=0.9, - frequency=20e6, - envelope=Rectangular(), - channel="1", - type=PulseType.READOUT, - ) - ps = PulseSequence([p0, p1]) + [p2] - assert ps.duration == 20 + 40 + 1000 - ps[-1] = p2.model_copy(update={"channel": "2"}) - assert ps.duration == 1000 - - -def test_init(): - p1 = Pulse( - duration=40, - amplitude=0.9, - frequency=100e6, - envelope=Drag(rel_sigma=0.2, beta=1), - channel="3", - type=PulseType.DRIVE, - ) - p2 = Pulse( - duration=40, - amplitude=0.9, - frequency=100e6, - envelope=Drag(rel_sigma=0.2, beta=1), - channel="2", - type=PulseType.DRIVE, - ) - p3 = Pulse( - duration=40, - amplitude=0.9, - frequency=100e6, - envelope=Drag(rel_sigma=0.2, beta=1), - channel="1", - type=PulseType.DRIVE, - ) - - ps = PulseSequence() - assert type(ps) == PulseSequence - - ps = PulseSequence([p1, p2, p3]) - assert len(ps) == 3 - assert ps[0] == p1 - assert ps[1] == p2 - assert ps[2] == p3 - - other_ps = PulseSequence([p1, p2, p3]) - assert len(other_ps) == 3 - assert other_ps[0] == p1 - assert other_ps[1] == p2 - assert other_ps[2] == p3 - - plist = [p1, p2, p3] - n = 0 - for pulse in ps: - assert plist[n] == pulse - n += 1 + sequence["ch3"].append(ro_pulse) + assert set(sequence.keys()) == {"ch1", "ch2", "ch3"} + assert sum(len(pulses) for pulses in sequence.values()) == 5 + assert len(sequence.ro_pulses) == 1 + assert sequence.ro_pulses[0] == ro_pulse -def test_operators(): - ps = PulseSequence() - ps += [ +def test_durations(): + sequence = PulseSequence() + sequence["ch1"].append(Delay(duration=20)) + sequence["ch1"].append( Pulse( - duration=200, + duration=1000, amplitude=0.9, - frequency=20e6, envelope=Rectangular(), - channel="3", - type=PulseType.DRIVE, + type=PulseType.READOUT, ) - ] - ps = ps + [ + ) + sequence["ch2"].append( Pulse( - duration=200, + duration=40, amplitude=0.9, - frequency=20e6, - envelope=Rectangular(), - channel="2", + envelope=Drag(rel_sigma=0.2, beta=1), type=PulseType.DRIVE, ) - ] - ps = [ + ) + assert sequence.channel_duration("ch1") == 20 + 1000 + assert sequence.channel_duration("ch2") == 40 + assert sequence.duration == 20 + 1000 + + sequence["ch2"].append( Pulse( - duration=200, + duration=1200, amplitude=0.9, - frequency=20e6, envelope=Rectangular(), - channel="3", - type=PulseType.DRIVE, + type=PulseType.READOUT, ) - ] + ps - - p4 = Pulse( - duration=40, - amplitude=0.9, - frequency=50e6, - envelope=Gaussian(rel_sigma=0.2), - channel="3", - type=PulseType.DRIVE, ) - p5 = Pulse( - duration=40, - amplitude=0.9, - frequency=50e6, - envelope=Gaussian(rel_sigma=0.2), - channel="2", - type=PulseType.DRIVE, - ) - p6 = Pulse( - duration=40, - amplitude=0.9, - frequency=50e6, - envelope=Gaussian(rel_sigma=0.2), - channel="1", - type=PulseType.DRIVE, - ) - - another_ps = PulseSequence() - another_ps.append(p4) - another_ps.extend([p5, p6]) - - assert another_ps[0] == p4 - assert another_ps[1] == p5 - assert another_ps[2] == p6 + assert sequence.duration == 40 + 1200 - ps += another_ps - assert len(ps) == 6 - assert p5 in ps - - # ps.plot() +def test_extend(): + sequence1 = PulseSequence() + sequence1["ch1"].append( + Pulse( + duration=40, + amplitude=0.9, + envelope=Drag(rel_sigma=0.2, beta=1), + ) + ) - p7 = Pulse( - duration=40, - amplitude=0.9, - frequency=100e6, - envelope=Drag(rel_sigma=0.2, beta=1), - channel="1", - type=PulseType.DRIVE, + sequence2 = PulseSequence() + sequence2["ch2"].append( + Pulse( + duration=60, + amplitude=0.9, + envelope=Drag(rel_sigma=0.2, beta=1), + ) ) - yet_another_ps = PulseSequence([p7]) - assert len(yet_another_ps) == 1 - yet_another_ps *= 3 - assert len(yet_another_ps) == 3 - yet_another_ps *= 3 - assert len(yet_another_ps) == 9 - p8 = Pulse( - duration=40, - amplitude=0.9, - frequency=100e6, - envelope=Drag(rel_sigma=0.2, beta=1), - channel="1", - type=PulseType.DRIVE, + sequence1.extend(sequence2) + assert set(sequence1.keys()) == {"ch1", "ch2"} + assert len(sequence1["ch1"]) == 1 + assert len(sequence1["ch2"]) == 1 + assert sequence1.duration == 60 + + sequence3 = PulseSequence() + sequence3["ch2"].append( + Pulse( + duration=80, + amplitude=0.9, + envelope=Drag(rel_sigma=0.2, beta=1), + ) ) - p9 = Pulse( - duration=40, - amplitude=0.9, - frequency=100e6, - envelope=Drag(rel_sigma=0.2, beta=1), - channel="2", - type=PulseType.DRIVE, + sequence3["ch3"].append( + Pulse( + duration=100, + amplitude=0.9, + envelope=Drag(rel_sigma=0.2, beta=1), + ) ) - and_yet_another_ps = 2 * PulseSequence([p9]) + [p8] * 3 - assert len(and_yet_another_ps) == 5 + + sequence1.extend(sequence3) + assert set(sequence1.keys()) == {"ch1", "ch2", "ch3"} + assert len(sequence1["ch1"]) == 1 + assert len(sequence1["ch2"]) == 2 + assert len(sequence1["ch3"]) == 2 + assert isinstance(sequence1["ch3"][0], Delay) + assert sequence1.duration == 60 + 100 + assert sequence1.channel_duration("ch1") == 40 + assert sequence1.channel_duration("ch2") == 60 + 80 + assert sequence1.channel_duration("ch3") == 60 + 100 From fc5a29f7512ee35fe272ed3fa5635e28064125ce Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Mon, 1 Jul 2024 13:31:16 +0400 Subject: [PATCH 0304/1006] fix pulse tests --- tests/pulses/test_pulse.py | 128 +++---------------------------------- 1 file changed, 9 insertions(+), 119 deletions(-) diff --git a/tests/pulses/test_pulse.py b/tests/pulses/test_pulse.py index 29650dc8e9..1cb65ed9bd 100644 --- a/tests/pulses/test_pulse.py +++ b/tests/pulses/test_pulse.py @@ -23,84 +23,35 @@ def test_init(): p0 = Pulse( duration=50, amplitude=0.9, - frequency=20_000_000, relative_phase=0.0, envelope=Rectangular(), - channel="0", type=PulseType.READOUT, - qubit=0, ) assert p0.relative_phase == 0.0 p1 = Pulse( duration=50, amplitude=0.9, - frequency=20_000_000, relative_phase=0.0, envelope=Rectangular(), - channel="0", type=PulseType.READOUT, - qubit=0, ) assert p1.type is PulseType.READOUT - # initialisation with non int (float) frequency - p2 = Pulse( - duration=50, - amplitude=0.9, - frequency=int(20e6), - relative_phase=0, - envelope=Rectangular(), - channel="0", - type=PulseType.READOUT, - qubit=0, - ) - assert isinstance(p2.frequency, float) and p2.frequency == 20_000_000 - # initialisation with non float (int) relative_phase - p3 = Pulse( + p2 = Pulse( duration=50, amplitude=0.9, - frequency=20_000_000, relative_phase=1.0, envelope=Rectangular(), - channel="0", - type=PulseType.READOUT, - qubit=0, - ) - assert isinstance(p3.relative_phase, float) and p3.relative_phase == 1.0 - - # initialisation with str shape - p4 = Pulse( - duration=50, - amplitude=0.9, - frequency=20_000_000, - relative_phase=0, - envelope=Rectangular(), - channel="0", - type=PulseType.READOUT, - qubit=0, - ) - assert isinstance(p4.envelope, Rectangular) - - # initialisation with str channel and str qubit - p5 = Pulse( - duration=50, - amplitude=0.9, - frequency=20_000_000, - relative_phase=0, - envelope=Rectangular(), - channel="channel0", type=PulseType.READOUT, - qubit=0, ) - assert p5.qubit == 0 + assert isinstance(p2.relative_phase, float) and p2.relative_phase == 1.0 - # initialisation with different frequencies, shapes and types + # initialisation with different shapes and types p6 = Pulse( duration=40, amplitude=0.9, - frequency=-50e6, envelope=Rectangular(), relative_phase=0, type=PulseType.READOUT, @@ -108,29 +59,23 @@ def test_init(): p7 = Pulse( duration=40, amplitude=0.9, - frequency=0, envelope=Rectangular(), relative_phase=0, type=PulseType.FLUX, - qubit=0, ) p8 = Pulse( duration=40, amplitude=0.9, - frequency=50e6, envelope=Gaussian(rel_sigma=0.2), relative_phase=0, type=PulseType.DRIVE, - qubit=2, ) p9 = Pulse( duration=40, amplitude=0.9, - frequency=50e6, envelope=Drag(rel_sigma=0.2, beta=2), relative_phase=0, type=PulseType.DRIVE, - qubit=200, ) p10 = Pulse.flux( duration=40, @@ -138,20 +83,15 @@ def test_init(): envelope=Iir( a=np.array([-1, 1]), b=np.array([-0.1, 0.1001]), target=Rectangular() ), - channel="0", - qubit=200, ) p11 = Pulse.flux( duration=40, amplitude=0.9, envelope=Snz(t_idling=10, b_amplitude=0.5), - channel="0", - qubit=200, ) p13 = Pulse( duration=40, amplitude=0.9, - frequency=400e6, envelope=ECap(alpha=2), relative_phase=0, type=PulseType.DRIVE, @@ -159,79 +99,36 @@ def test_init(): p14 = Pulse( duration=40, amplitude=0.9, - frequency=50e6, envelope=GaussianSquare(rel_sigma=0.2, width=0.9), relative_phase=0, type=PulseType.READOUT, - qubit=2, ) # initialisation with float duration p12 = Pulse( duration=34.33, amplitude=0.9, - frequency=20_000_000, relative_phase=1, envelope=Rectangular(), - channel="0", type=PulseType.READOUT, - qubit=0, ) assert isinstance(p12.duration, float) assert p12.duration == 34.33 def test_attributes(): - channel = "0" - qubit = 0 - - p10 = Pulse( + p = Pulse( duration=50, amplitude=0.9, - frequency=20_000_000, relative_phase=0.0, envelope=Rectangular(), - channel=channel, - qubit=qubit, ) - assert isinstance(p10.duration, float) and p10.duration == 50 - assert isinstance(p10.amplitude, float) and p10.amplitude == 0.9 - assert isinstance(p10.frequency, float) and p10.frequency == 20_000_000 - assert isinstance(p10.envelope, BaseEnvelope) - assert isinstance(p10.channel, type(channel)) and p10.channel == channel - assert isinstance(p10.qubit, type(qubit)) and p10.qubit == qubit - - -def test_aliases(): - rop = Pulse( - duration=50, - amplitude=0.9, - frequency=20_000_000, - relative_phase=0.0, - envelope=Rectangular(), - type=PulseType.READOUT, - channel="0", - qubit=0, - ) - assert rop.qubit == 0 - - dp = Pulse( - duration=2000, - amplitude=0.9, - frequency=200_000_000, - relative_phase=0.0, - envelope=Gaussian(rel_sigma=5), - channel="0", - qubit=0, - ) - assert dp.amplitude == 0.9 - assert isinstance(dp.envelope, Gaussian) - - fp = Pulse.flux( - duration=300, amplitude=0.9, envelope=Rectangular(), channel="0", qubit=0 - ) - assert fp.channel == "0" + assert isinstance(p.duration, float) and p.duration == 50 + assert isinstance(p.amplitude, float) and p.amplitude == 0.9 + assert isinstance(p.relative_phase, float) and p.relative_phase == 0.0 + assert isinstance(p.envelope, BaseEnvelope) + assert isinstance(p.type, PulseType) def test_pulse(): @@ -239,12 +136,10 @@ def test_pulse(): rel_sigma = 5 beta = 2 pulse = Pulse( - frequency=200_000_000, amplitude=1, duration=duration, relative_phase=0, envelope=Drag(rel_sigma=rel_sigma, beta=beta), - channel="1", ) assert pulse.duration == duration @@ -253,12 +148,10 @@ def test_pulse(): def test_readout_pulse(): duration = 2000 pulse = Pulse( - frequency=200_000_000, amplitude=1, duration=duration, relative_phase=0, envelope=Rectangular(), - channel="11", type=PulseType.READOUT, ) @@ -272,14 +165,11 @@ def test_envelope_waveform_i_q(): pulse = Pulse( duration=1000, amplitude=1, - frequency=10e6, relative_phase=0, envelope=Rectangular(), - channel="1", ) custom_shape_pulse = custom_shape_pulse.model_copy(update={"i_": pulse.i(1)}) - pulse = pulse.model_copy(update={"duration": 2000}) with pytest.raises(ValueError): custom_shape_pulse.i(samples=10) with pytest.raises(ValueError): From fd3fe049ddbbbe7df26491b3da6197df8e60c34d Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 2 Jul 2024 10:48:41 +0400 Subject: [PATCH 0305/1006] remove frequency from pulse --- src/qibolab/pulses/pulse.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index a399456758..c2b8259e95 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -38,11 +38,6 @@ class Pulse(Model): Pulse amplitudes are normalised between -1 and 1. """ - frequency: float - """Pulse Intermediate Frequency in Hz. - - The value has to be in the range [10e6 to 300e6]. - """ envelope: Envelope """The pulse envelope shape. @@ -61,7 +56,6 @@ def flux(cls, **kwargs): It provides a simplified syntax for the :cls:`Pulse` constructor, by applying suitable defaults. """ - kwargs["frequency"] = 0 kwargs["relative_phase"] = 0 if "type" not in kwargs: kwargs["type"] = PulseType.FLUX From 5d8607ac555abc688d53fcdc71033250bda477e8 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 2 Jul 2024 11:10:04 +0400 Subject: [PATCH 0306/1006] accept frequency explicitly as argument --- src/qibolab/pulses/plot.py | 136 ++++++++++++++++++++----------------- 1 file changed, 74 insertions(+), 62 deletions(-) diff --git a/src/qibolab/pulses/plot.py b/src/qibolab/pulses/plot.py index 87319febfd..16e7189c85 100644 --- a/src/qibolab/pulses/plot.py +++ b/src/qibolab/pulses/plot.py @@ -1,6 +1,7 @@ """Plotting tools for pulses and related entities.""" from collections import defaultdict +from typing import Optional import matplotlib.pyplot as plt import numpy as np @@ -36,10 +37,11 @@ def waveform(wf: Waveform, filename=None): plt.close() -def pulse(pulse_: Pulse, filename=None): +def pulse(pulse_: Pulse, freq: Optional[float] = None, filename: Optional[str] = None): """Plot the pulse envelope and modulated waveforms. Args: + freq: Carrier frequency used to plot modulated waveform. None if modulated plot is not needed. filename (str): a file path. If provided the plot is save to a file. """ import matplotlib.pyplot as plt @@ -69,9 +71,16 @@ def pulse(pulse_: Pulse, filename=None): ) envelope = pulse_.envelopes(SAMPLING_RATE) - modulated = modulate(np.array(envelope), pulse_.frequency, rate=SAMPLING_RATE) - ax1.plot(time, modulated[0], label="modulated i", c="C0") - ax1.plot(time, modulated[1], label="modulated q", c="C1") + modulated = ( + modulate(np.array(envelope), freq, rate=SAMPLING_RATE) + if freq is not None + else None + ) + + if modulated is not None: + ax1.plot(time, modulated[0], label="modulated i", c="C0") + ax1.plot(time, modulated[1], label="modulated q", c="C1") + ax1.plot(time, -waveform_i, c="silver", linestyle="dashed") ax1.set_xlabel("Time [ns]") ax1.set_ylabel("Amplitude") @@ -83,24 +92,25 @@ def pulse(pulse_: Pulse, filename=None): ax1.legend() ax2 = plt.subplot(gs[1]) - ax2.plot(modulated[0], modulated[1], label="modulated", c="C3") ax2.plot(waveform_i, waveform_q, label="envelope", c="C2") - ax2.plot( - modulated[0][0], - modulated[1][0], - marker="o", - markersize=5, - label="start", - c="lightcoral", - ) - ax2.plot( - modulated[0][-1], - modulated[1][-1], - marker="o", - markersize=5, - label="finish", - c="darkred", - ) + if modulated is not None: + ax2.plot(modulated[0], modulated[1], label="modulated", c="C3") + ax2.plot( + modulated[0][0], + modulated[1][0], + marker="o", + markersize=5, + label="start", + c="lightcoral", + ) + ax2.plot( + modulated[0][-1], + modulated[1][-1], + marker="o", + markersize=5, + label="finish", + c="darkred", + ) ax2.plot( np.cos(time * 2 * np.pi / pulse_.duration), @@ -120,64 +130,66 @@ def pulse(pulse_: Pulse, filename=None): plt.close() -def sequence(ps: PulseSequence, filename=None): +def sequence(ps: PulseSequence, freq: dict[str, float], filename=None): """Plot the sequence of pulses. Args: + freq: frequency per channel, used to plot modulated waveforms of corresponding pulses. If a channel is missing from this dict, + only /un-modulated/ waveforms are plotted for that channel. filename (str): a file path. If provided the plot is save to a file. """ if len(ps) > 0: import matplotlib.pyplot as plt from matplotlib import gridspec - _ = plt.figure(figsize=(14, 2 * len(ps)), dpi=200) - gs = gridspec.GridSpec(ncols=1, nrows=len(ps)) + num_pulses = sum(len(pulses) for pulses in ps.values()) + _ = plt.figure(figsize=(14, 2 * num_pulses), dpi=200) + gs = gridspec.GridSpec(ncols=1, nrows=num_pulses) vertical_lines = [] starts = defaultdict(int) - for pulse in ps: - if not isinstance(pulse, Delay): - vertical_lines.append(starts[pulse.channel]) - vertical_lines.append(starts[pulse.channel] + pulse.duration) - starts[pulse.channel] += pulse.duration + for ch, pulses in ps.items(): + for pulse in pulses: + if not isinstance(pulse, Delay): + vertical_lines.append(starts[ch]) + vertical_lines.append(starts[ch] + pulse.duration) + starts[ch] += pulse.duration n = -1 - for qubit in ps.qubits: - qubit_pulses = ps.get_qubit_pulses(qubit) - for channel in qubit_pulses.channels: - n += 1 - channel_pulses = qubit_pulses.get_channel_pulses(channel) - ax = plt.subplot(gs[n]) - ax.axis([0, ps.duration, -1, 1]) - start = 0 - for pulse in channel_pulses: - if isinstance(pulse, Delay): - start += pulse.duration - continue - - envelope = pulse.envelopes(SAMPLING_RATE) - num_samples = envelope[0].size - time = start + np.arange(num_samples) / SAMPLING_RATE + for ch, pulses in ps.items(): + n += 1 + ax = plt.subplot(gs[n]) + ax.axis([0, ps.duration, -1, 1]) + start = 0 + for pulse in pulses: + if isinstance(pulse, Delay): + start += pulse.duration + continue + + envelope = pulse.envelopes(SAMPLING_RATE) + num_samples = envelope[0].size + time = start + np.arange(num_samples) / SAMPLING_RATE + if ch in freq: modulated = modulate( - np.array(envelope), pulse.frequency, rate=SAMPLING_RATE + np.array(envelope), freq[ch], rate=SAMPLING_RATE ) ax.plot(time, modulated[1], c="lightgrey") ax.plot(time, modulated[0], c=f"C{str(n)}") - ax.plot(time, pulse.i(SAMPLING_RATE), c=f"C{str(n)}") - ax.plot(time, -pulse.i(SAMPLING_RATE), c=f"C{str(n)}") - # TODO: if they overlap use different shades - ax.axhline(0, c="dimgrey") - ax.set_ylabel(f"qubit {qubit} \n channel {channel}") - for vl in vertical_lines: - ax.axvline(vl, c="slategrey", linestyle="--") - ax.axis((0, ps.duration, -1, 1)) - ax.grid( - visible=True, - which="both", - axis="both", - color="#CCCCCC", - linestyle="-", - ) - start += pulse.duration + ax.plot(time, pulse.i(SAMPLING_RATE), c=f"C{str(n)}") + ax.plot(time, -pulse.i(SAMPLING_RATE), c=f"C{str(n)}") + # TODO: if they overlap use different shades + ax.axhline(0, c="dimgrey") + ax.set_ylabel(f"channel {ch}") + for vl in vertical_lines: + ax.axvline(vl, c="slategrey", linestyle="--") + ax.axis((0, ps.duration, -1, 1)) + ax.grid( + visible=True, + which="both", + axis="both", + color="#CCCCCC", + linestyle="-", + ) + start += pulse.duration if filename: plt.savefig(filename) From 3917625f4ecc35698d9824a4bbd6593b82ec4103 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 2 Jul 2024 11:10:24 +0400 Subject: [PATCH 0307/1006] update plot tests --- tests/pulses/test_plot.py | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/tests/pulses/test_plot.py b/tests/pulses/test_plot.py index c895404fdf..156df65b49 100644 --- a/tests/pulses/test_plot.py +++ b/tests/pulses/test_plot.py @@ -30,7 +30,6 @@ def test_plot_functions(): envelope=Rectangular(), relative_phase=0, type=PulseType.FLUX, - qubit=0, ) p1 = Pulse( duration=40, @@ -39,7 +38,6 @@ def test_plot_functions(): envelope=Gaussian(rel_sigma=0.2), relative_phase=0, type=PulseType.DRIVE, - qubit=2, ) p2 = Pulse( duration=40, @@ -48,18 +46,13 @@ def test_plot_functions(): envelope=Drag(rel_sigma=0.2, beta=2), relative_phase=0, type=PulseType.DRIVE, - qubit=200, ) p3 = Pulse.flux( duration=40, amplitude=0.9, envelope=Iir(a=np.array([-0.5, 2]), b=np.array([1]), target=Rectangular()), - channel="0", - qubit=200, - ) - p4 = Pulse.flux( - duration=40, amplitude=0.9, envelope=Snz(t_idling=10), channel="0", qubit=200 ) + p4 = Pulse.flux(duration=40, amplitude=0.9, envelope=Snz(t_idling=10)) p5 = Pulse( duration=40, amplitude=0.9, @@ -75,22 +68,34 @@ def test_plot_functions(): envelope=GaussianSquare(rel_sigma=0.2, width=0.9), relative_phase=0, type=PulseType.DRIVE, - qubit=2, ) - ps = PulseSequence([p0, p1, p2, p3, p4, p5, p6]) + ps = PulseSequence() + ps.update( + { + "q0/flux": [p0], + "q2/drive": [p1, p6], + "q200/drive": [p2], + "q200/flux": [p3, p4], + "q0/drive": [p5], + } + ) envelope = p0.envelopes(SAMPLING_RATE) wf = modulate(np.array(envelope), 0.0, rate=SAMPLING_RATE) plot_file = HERE / "test_plot.png" - plot.waveform(wf, plot_file) + plot.waveform(wf, filename=plot_file) + assert os.path.exists(plot_file) + os.remove(plot_file) + + plot.pulse(p0, filename=plot_file) assert os.path.exists(plot_file) os.remove(plot_file) - plot.pulse(p0, plot_file) + plot.pulse(p0, freq=2e9, filename=plot_file) assert os.path.exists(plot_file) os.remove(plot_file) - plot.sequence(ps, plot_file) + plot.sequence(ps, {"q200/drive": 3e9}, filename=plot_file) assert os.path.exists(plot_file) os.remove(plot_file) From 617d9ba8498fa626b22176868988161da5105961 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 2 Jul 2024 11:11:57 +0400 Subject: [PATCH 0308/1006] remove obsolete files --- tests/channel/__init__.py | 0 tests/channel/test_channel.py | 90 ----------------------------------- 2 files changed, 90 deletions(-) delete mode 100644 tests/channel/__init__.py delete mode 100644 tests/channel/test_channel.py diff --git a/tests/channel/__init__.py b/tests/channel/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/channel/test_channel.py b/tests/channel/test_channel.py deleted file mode 100644 index 2e97d847dc..0000000000 --- a/tests/channel/test_channel.py +++ /dev/null @@ -1,90 +0,0 @@ -import pytest - -from qibolab.channel import Channel, ChannelMap -from qibolab.instruments.dummy import DummyPort - - -def test_channel_init(): - channel = Channel("L1-test") - assert channel.name == "L1-test" - - -def test_channel_errors(): - channel = Channel("L1-test", port=DummyPort("test")) - channel.offset = 0.1 - channel.filter = {} - # attempt to set bias higher than the allowed value - channel.max_offset = 0.2 - with pytest.raises(ValueError): - channel.offset = 0.3 - - -def test_channel_map_add(): - channels = ChannelMap().add("a", "b") - assert "a" in channels - assert "b" in channels - assert isinstance(channels["a"], Channel) - assert isinstance(channels["b"], Channel) - assert channels["a"].name == "a" - assert channels["b"].name == "b" - - -def test_channel_map_setitem(): - channels = ChannelMap() - with pytest.raises(TypeError): - channels["c"] = "test" - channels["c"] = Channel("c") - assert isinstance(channels["c"], Channel) - - -def test_channel_map_union(): - channels1 = ChannelMap().add("a", "b") - channels2 = ChannelMap().add("c", "d") - channels = channels1 | channels2 - for name in ["a", "b", "c", "d"]: - assert name in channels - assert isinstance(channels[name], Channel) - assert channels[name].name == name - assert "a" not in channels2 - assert "b" not in channels2 - assert "c" not in channels1 - assert "d" not in channels1 - - -def test_channel_map_union_update(): - channels = ChannelMap().add("a", "b") - channels |= ChannelMap().add("c", "d") - for name in ["a", "b", "c", "d"]: - assert name in channels - assert isinstance(channels[name], Channel) - assert channels[name].name == name - - -@pytest.fixture -def first_qubit(platform): - return next(iter(platform.qubits.values())) - - -def test_platform_lo_drive_frequency(first_qubit): - first_qubit.drive.lo_frequency = 5.5e9 - assert first_qubit.drive.lo_frequency == 5.5e9 - - -def test_platform_lo_readout_frequency(first_qubit): - first_qubit.readout.lo_frequency = 7e9 - assert first_qubit.readout.lo_frequency == 7e9 - - -def test_platform_attenuation(first_qubit): - first_qubit.drive.attenuation = 10 - assert first_qubit.drive.attenuation == 10 - - -def test_platform_gain(first_qubit): - first_qubit.readout.gain = 0 - assert first_qubit.readout.gain == 0 - - -def test_platform_bias(first_qubit): - first_qubit.flux.offset = 0.05 - assert first_qubit.flux.offset == 0.05 From a7ca665750cdbc492f58007282f09fbc8fef9210 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 2 Jul 2024 13:37:22 +0400 Subject: [PATCH 0309/1006] implement sequence copy --- src/qibolab/pulses/sequence.py | 6 ++++++ tests/pulses/test_sequence.py | 39 ++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/src/qibolab/pulses/sequence.py b/src/qibolab/pulses/sequence.py index 0f5e98d1fa..3bbfe0f853 100644 --- a/src/qibolab/pulses/sequence.py +++ b/src/qibolab/pulses/sequence.py @@ -44,3 +44,9 @@ def extend(self, other: "PulseSequence") -> None: if (delay := round(max_duration - duration, int(1 / tol))) > 0: self[ch].append(Delay(duration=delay)) self[ch].extend(other[ch]) + + def copy(self) -> "PulseSequence": + """Return shallow copy of self.""" + ps = PulseSequence() + ps.extend(self) + return ps diff --git a/tests/pulses/test_sequence.py b/tests/pulses/test_sequence.py index bde2bfe8fe..8f1a265184 100644 --- a/tests/pulses/test_sequence.py +++ b/tests/pulses/test_sequence.py @@ -150,3 +150,42 @@ def test_extend(): assert sequence1.channel_duration("ch1") == 40 assert sequence1.channel_duration("ch2") == 60 + 80 assert sequence1.channel_duration("ch3") == 60 + 100 + + +def test_copy(): + sequence = PulseSequence() + sequence["ch1"].append( + Pulse( + duration=40, + amplitude=0.9, + envelope=Drag(rel_sigma=0.2, beta=1), + ) + ) + + sequence["ch2"].append( + Pulse( + duration=60, + amplitude=0.9, + envelope=Drag(rel_sigma=0.2, beta=1), + ) + ) + sequence["ch2"].append( + Pulse( + duration=80, + amplitude=0.9, + envelope=Drag(rel_sigma=0.2, beta=1), + ) + ) + + sequence_copy = sequence.copy() + assert isinstance(sequence_copy, PulseSequence) + assert sequence_copy == sequence + + sequence_copy["ch3"].append( + Pulse( + duration=100, + amplitude=0.9, + envelope=Drag(rel_sigma=0.2, beta=1), + ) + ) + assert "ch3" not in sequence From e228c29539f43bdfe9ab39aeb799a0a7f0f71faa Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 2 Jul 2024 13:38:20 +0400 Subject: [PATCH 0310/1006] add channels dedicated to 12 transition and cross resonance gates --- src/qibolab/qubits.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index 040069433e..bb8fe019a5 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -84,6 +84,8 @@ class Qubit: measure: Optional[IqChannel] = None acquisition: Optional[AcquireChannel] = None drive: Optional[IqChannel] = None + drive12: Optional[IqChannel] = None + drive_cross: Optional[dict[QubitId, IqChannel]] = None flux: Optional[DcChannel] = None native_gates: SingleQubitNatives = field(default_factory=SingleQubitNatives) From 8f66b044b1d887b14e2574412d6158ff38baabdb Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 2 Jul 2024 13:39:48 +0400 Subject: [PATCH 0311/1006] fix handling of native gates --- src/qibolab/platform/platform.py | 41 +++++--------------------------- 1 file changed, 6 insertions(+), 35 deletions(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 3df4d1f8d5..1e49cfd3c0 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -362,26 +362,17 @@ def get_coupler(self, coupler): except KeyError: return list(self.couplers.values())[coupler] - def create_RX90_pulse(self, qubit, relative_phase=0): + def create_RX90_pulse(self, qubit): qubit = self.get_qubit(qubit) - return replace( - qubit.native_gates.RX90, - relative_phase=relative_phase, - ) + return qubit.native_gates.RX90.copy() - def create_RX_pulse(self, qubit, relative_phase=0): + def create_RX_pulse(self, qubit): qubit = self.get_qubit(qubit) - return replace( - qubit.native_gates.RX, - relative_phase=relative_phase, - ) + return qubit.native_gates.RX.copy() - def create_RX12_pulse(self, qubit, relative_phase=0): + def create_RX12_pulse(self, qubit): qubit = self.get_qubit(qubit) - return replace( - qubit.native_gates.RX12, - relative_phase=relative_phase, - ) + return qubit.native_gates.RX12.copy() def create_CZ_pulse_sequence(self, qubits): pair = tuple(self.get_qubit(q).name for q in qubits) @@ -414,26 +405,6 @@ def create_MZ_pulse(self, qubit): qubit = self.get_qubit(qubit) return qubit.native_gates.MZ - def create_qubit_drive_pulse(self, qubit, duration, relative_phase=0): - qubit = self.get_qubit(qubit) - return replace( - qubit.native_gates.RX, - duration=duration, - relative_phase=relative_phase, - ) - - def create_qubit_readout_pulse(self, qubit): - return self.create_MZ_pulse(qubit) - - def create_coupler_pulse(self, coupler, duration=None, amplitude=None): - coupler = self.get_coupler(coupler) - pulse = coupler.native_gates.CP - if duration is not None: - pulse = replace(pulse, duration=duration) - if amplitude is not None: - pulse = replace(pulse, amplitude=amplitude) - return pulse - # TODO Remove RX90_drag_pulse and RX_drag_pulse, replace them with create_qubit_drive_pulse # TODO Add RY90 and RY pulses From 52cf023ac7e3a1958a173f6e53969a4b36e2863e Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 2 Jul 2024 13:40:18 +0400 Subject: [PATCH 0312/1006] update dummy instrument and platform --- src/qibolab/dummy/parameters.json | 1086 +++++++++++++++-------------- src/qibolab/dummy/platform.py | 101 ++- src/qibolab/instruments/dummy.py | 42 +- 3 files changed, 634 insertions(+), 595 deletions(-) diff --git a/src/qibolab/dummy/parameters.json b/src/qibolab/dummy/parameters.json index 3a5f5846e2..02e07b8929 100644 --- a/src/qibolab/dummy/parameters.json +++ b/src/qibolab/dummy/parameters.json @@ -25,514 +25,610 @@ "frequency": 1000000000.0 } }, + "components": { + "qubit_0/drive" : { + "frequency": 4000000000 + }, + "qubit_1/drive" : { + "frequency": 4200000000 + }, + "qubit_2/drive" : { + "frequency": 4500000000 + }, + "qubit_3/drive" : { + "frequency": 4150000000 + }, + "qubit_4/drive" : { + "frequency": 4155663000 + }, + "qubit_0/drive12" : { + "frequency": 4700000000 + }, + "qubit_1/drive12" : { + "frequency": 4855663000 + }, + "qubit_2/drive12" : { + "frequency": 2700000000 + }, + "qubit_3/drive12" : { + "frequency": 5855663000 + }, + "qubit_4/drive12" : { + "frequency": 5855663000 + }, + "qubit_0/flux" : { + "offset": -0.1 + }, + "qubit_1/flux" : { + "offset": 0.0 + }, + "qubit_2/flux" : { + "offset": 0.1 + }, + "qubit_3/flux" : { + "offset": 0.2 + }, + "qubit_4/flux" : { + "offset": 0.15 + }, + "qubit_0/measure" : { + "frequency": 5200000000 + }, + "qubit_1/measure" : { + "frequency": 4900000000 + }, + "qubit_2/measure" : { + "frequency": 6100000000 + }, + "qubit_3/measure" : { + "frequency": 5800000000 + }, + "qubit_4/measure" : { + "frequency": 5500000000 + }, + "qubit_0/acquire": { + "delay": 0, + "smearing": 0 + }, + "qubit_1/acquire": { + "delay": 0, + "smearing": 0 + }, + "qubit_2/acquire": { + "delay": 0, + "smearing": 0 + }, + "qubit_3/acquire": { + "delay": 0, + "smearing": 0 + }, + "qubit_4/acquire": { + "delay": 0, + "smearing": 0 + }, + "coupler_0/flux" : { + "offset": 0.0 + }, + "coupler_1/flux" : { + "offset": 0.0 + }, + "coupler_3/flux" : { + "offset": 0.0 + }, + "coupler_4/flux" : { + "offset": 0.0 + }, + "twpa_pump": { + "power": 10, + "frequency": 1000000000.0 + } + }, "native_gates": { "single_qubit": { "0": { "RX": { - "duration": 40, - "amplitude": 0.1, - "envelope": { "kind": "gaussian", "rel_sigma": 5 }, - "frequency": 4000000000.0, - "type": "qd" + "qubit_0/drive": [ + { + "duration": 40, + "amplitude": 0.1, + "envelope": { "kind": "gaussian", "rel_sigma": 5 }, + "type": "qd" + } + ] }, "RX12": { - "duration": 40, - "amplitude": 0.005, - "envelope": { "kind": "gaussian", "rel_sigma": 5 }, - "frequency": 4700000000, - "type": "qd" + "qubit_0/drive12": [ + { + "duration": 40, + "amplitude": 0.005, + "envelope": { "kind": "gaussian", "rel_sigma": 5 }, + "type": "qd" + } + ] }, "MZ": { - "duration": 2000, - "amplitude": 0.1, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5, - "width": 0.75 - }, - "frequency": 5200000000.0, - "type": "ro" + "qubit_0/measure": [ + { + "duration": 2000, + "amplitude": 0.1, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, + "type": "ro" + } + ] } }, "1": { "RX": { - "duration": 40, - "amplitude": 0.3, - "envelope": { "kind": "drag", "rel_sigma": 5, "beta": 0.02 }, - "frequency": 4200000000.0, - "type": "qd" + "qubit_1/drive": [ + { + "duration": 40, + "amplitude": 0.3, + "envelope": { "kind": "drag", "rel_sigma": 5, "beta": 0.02 }, + "type": "qd" + } + ] }, "RX12": { - "duration": 40, - "amplitude": 0.0484, - "envelope": { "kind": "drag", "rel_sigma": 5, "beta": 0.02 }, - "frequency": 4855663000, - "type": "qd" - }, + "qubit_1/drive12": [ + { + "duration": 40, + "amplitude": 0.0484, + "envelope": { "kind": "drag", "rel_sigma": 5, "beta": 0.02 }, + "type": "qd" + } + ] + } , "MZ": { - "duration": 2000, - "amplitude": 0.1, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5, - "width": 0.75 - }, - "frequency": 4900000000.0, - "type": "ro" + "qubit_1/measure": [ + { + "duration": 2000, + "amplitude": 0.1, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, + "type": "ro" + } + ] } }, "2": { "RX": { - "duration": 40, - "amplitude": 0.3, - "envelope": { "kind": "drag", "rel_sigma": 5, "beta": 0.02 }, - "frequency": 4500000000.0, - "type": "qd" + "qubit_2/drive": [ + { + "duration": 40, + "amplitude": 0.3, + "envelope": { "kind": "drag", "rel_sigma": 5, "beta": 0.02 }, + "type": "qd" + } + ] }, "RX12": { - "duration": 40, - "amplitude": 0.005, - "envelope": { "kind": "gaussian", "rel_sigma": 5 }, - "frequency": 2700000000, - "type": "qd" + "qubit_2/drive12": [ + { + "duration": 40, + "amplitude": 0.005, + "envelope": { "kind": "gaussian", "rel_sigma": 5 }, + "type": "qd" + } + ] }, "MZ": { - "duration": 2000, - "amplitude": 0.1, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5, - "width": 0.75 - }, - "frequency": 6100000000.0, - "type": "ro" + "qubit_2/drive": [ + { + "duration": 2000, + "amplitude": 0.1, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, + "type": "ro" + } + ] } }, "3": { "RX": { - "duration": 40, - "amplitude": 0.3, - "envelope": { "kind": "drag", "rel_sigma": 5, "beta": 0.02 }, - "frequency": 4150000000.0, - "type": "qd" + "qubit_3/drive": [ + { + "duration": 40, + "amplitude": 0.3, + "envelope": { "kind": "drag", "rel_sigma": 5, "beta": 0.02 }, + "type": "qd" + } + ] }, "RX12": { - "duration": 40, - "amplitude": 0.0484, - "envelope": { "kind": "drag", "rel_sigma": 5, "beta": 0.02 }, - "frequency": 5855663000, - "type": "qd" + "qubit_3/drive12": [ + { + "duration": 40, + "amplitude": 0.0484, + "envelope": { "kind": "drag", "rel_sigma": 5, "beta": 0.02 }, + "type": "qd" + } + ] }, "MZ": { - "duration": 2000, - "amplitude": 0.1, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5, - "width": 0.75 - }, - "frequency": 5800000000.0, - "type": "ro" + "qubit_3/measure": [ + { + "duration": 2000, + "amplitude": 0.1, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, + "type": "ro" + } + ] } }, "4": { "RX": { - "duration": 40, - "amplitude": 0.3, - "envelope": { "kind": "drag", "rel_sigma": 5, "beta": 0.02 }, - "frequency": 4155663000, - "type": "qd" + "qubit_4/drive": [ + { + "duration": 40, + "amplitude": 0.3, + "envelope": { "kind": "drag", "rel_sigma": 5, "beta": 0.02 }, + "type": "qd" + } + ] }, "RX12": { - "duration": 40, - "amplitude": 0.0484, - "envelope": { "kind": "drag", "rel_sigma": 5, "beta": 0.02 }, - "frequency": 5855663000, - "type": "qd" + "qubit_4/drive12": [ + { + "duration": 40, + "amplitude": 0.0484, + "envelope": { "kind": "drag", "rel_sigma": 5, "beta": 0.02 }, + "type": "qd" + } + ] }, "MZ": { - "duration": 2000, - "amplitude": 0.1, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5, - "width": 0.75 - }, - "frequency": 5500000000.0, - "type": "ro" - } - } - }, - "coupler": { - "0": { - "CP": { - "duration": 30, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5, - "width": 0.75 - }, - "frequency": 0, - "type": "cf" - } - }, - "1": { - "CP": { - "duration": 30, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5, - "width": 0.75 - }, - "frequency": 0, - "type": "cf" - } - }, - "3": { - "CP": { - "duration": 30, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5, - "width": 0.75 - }, - "frequency": 0, - "type": "cf" - } - }, - "4": { - "CP": { - "duration": 30, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5, - "width": 0.75 - }, - "frequency": 0, - "type": "cf" + "qubit_4/measure": [ + { + "duration": 2000, + "amplitude": 0.1, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, + "type": "ro" + } + ] } } }, "two_qubit": { "0-2": { - "CZ": [ - { - "duration": 30, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5, - "width": 0.75 - }, - "qubit": 2, - "frequency": 0, - "type": "qf" - }, - { - "type": "vz", - "phase": 0.0, - "qubit": 0 - }, - { - "type": "vz", - "phase": 0.0, - "qubit": 2 - }, - { - "duration": 30, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5, - "width": 0.75 - }, - "coupler": 0, - "frequency": 0, - "type": "cf" - } - ], - "iSWAP": [ - { - "duration": 30, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5, - "width": 0.75 - }, - "qubit": 2, - "frequency": 0, - "type": "qf" - }, - { - "type": "vz", - "phase": 0.0, - "qubit": 1 - }, - { - "type": "vz", - "phase": 0.0, - "qubit": 2 - }, - { - "duration": 30, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5, - "width": 0.75 - }, - "coupler": 0, - "frequency": 0, - "type": "cf" - } - ] + "CZ": { + "qubit_2/flux": [ + { + "duration": 30, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, + "type": "qf" + } + ], + "qubit_0/drive": [ + { + "type": "vz", + "phase": 0.0 + } + ], + "qubit_2/drive": [ + { + "type": "vz", + "phase": 0.0 + } + ], + "coupler_0/flux": [ + { + "duration": 30, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, + "type": "cf" + } + ] + }, + "iSWAP": { + "qubit_2/flux": [ + { + "duration": 30, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, + "type": "qf" + } + ], + "qubit_0/drive": [ + { + "type": "vz", + "phase": 0.0 + } + ], + "qubit_2/drive": [ + { + "type": "vz", + "phase": 0.0 + } + ], + "coupler_0/flux": [ + { + "duration": 30, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, + "type": "cf" + } + ] + } }, "1-2": { - "CZ": [ - { - "duration": 30, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5, - "width": 0.75 - }, - "qubit": 2, - "frequency": 0, - "type": "qf" - }, - { - "type": "vz", - "phase": 0.0, - "qubit": 1 - }, - { - "type": "vz", - "phase": 0.0, - "qubit": 2 - }, - { - "duration": 30, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5, - "width": 0.75 - }, - "coupler": 1, - "frequency": 0, - "type": "cf" - } - ], - "iSWAP": [ - { - "duration": 30, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5, - "width": 0.75 - }, - "qubit": 2, - "frequency": 0, - "type": "qf" - }, - { - "type": "vz", - "phase": 0.0, - "qubit": 1 - }, - { - "type": "vz", - "phase": 0.0, - "qubit": 2 - }, - { - "duration": 30, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5, - "width": 0.75 - }, - "coupler": 1, - "frequency": 0, - "type": "cf" - } - ] + "CZ": { + "qubit_2/flux": [ + { + "duration": 30, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, + "type": "qf" + } + ], + "qubit_1/drive": [ + { + "type": "vz", + "phase": 0.0 + } + ], + "qubit_2/drive": [ + { + "type": "vz", + "phase": 0.0 + } + ], + "coupler_1/flux": [ + { + "duration": 30, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, + "type": "cf" + } + ] + }, + "iSWAP": { + "qubit_2/flux": [ + { + "duration": 30, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, + "type": "qf" + } + ], + "qubit_1/drive": [ + { + "type": "vz", + "phase": 0.0 + } + ], + "qubit_2/drive": [ + { + "type": "vz", + "phase": 0.0 + } + ], + "coupler_1/flux": [ + { + "duration": 30, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, + "type": "cf" + } + ] + } }, "2-3": { - "CZ": [ - { - "duration": 30, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5, - "width": 0.75 - }, - "qubit": 2, - "frequency": 0, - "type": "qf" - }, - { - "type": "vz", - "phase": 0.0, - "qubit": 3 - }, - { - "type": "vz", - "phase": 0.0, - "qubit": 2 - }, - { - "duration": 30, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5, - "width": 0.75 - }, - "coupler": 3, - "frequency": 0, - "type": "cf" - } - ], - "iSWAP": [ - { - "duration": 30, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5, - "width": 0.75 - }, - "qubit": 2, - "frequency": 0, - "type": "qf" - }, - { - "type": "vz", - "phase": 0.0, - "qubit": 1 - }, - { - "type": "vz", - "phase": 0.0, - "qubit": 2 - }, - { - "duration": 30, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5, - "width": 0.75 - }, - "coupler": 3, - "frequency": 0, - "type": "cf" - } - ], - "CNOT": [ - { - "duration": 40, - "amplitude": 0.3, - "envelope": { "kind": "drag", "rel_sigma": 5, "beta": 0.02 }, - "frequency": 4150000000.0, - "type": "qd", - "qubit": 2 - }, - { - "type": "vz", - "phase": 0.0, - "qubit": 1 - }, - { - "type": "vz", - "phase": 0.0, - "qubit": 2 - } - ] + "CZ": { + "qubit_2/flux": [ + { + "duration": 30, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, + "type": "qf" + } + ], + "qubit_2/drive": [ + { + "type": "vz", + "phase": 0.0 + } + ], + "qubit_3/drive": [ + { + "type": "vz", + "phase": 0.0 + } + ], + "coupler_3/flux": [ + { + "duration": 30, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, + "type": "cf" + } + ] + }, + "iSWAP": { + "qubit_2/flux": [ + { + "duration": 30, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, + "type": "qf" + } + ], + "qubit_2/drive": [ + { + "type": "vz", + "phase": 0.0 + } + ], + "qubit_3/drive": [ + { + "type": "vz", + "phase": 0.0 + } + ], + "coupler_3/flux": [ + { + "duration": 30, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, + "type": "cf" + } + ] + }, + "CNOT": { + "qubit_2/drive": [ + { + "duration": 40, + "amplitude": 0.3, + "envelope": { "kind": "drag", "rel_sigma": 5, "beta": 0.02 }, + "frequency": 4150000000.0, + "type": "qd" + } + ] + } }, "2-4": { - "CZ": [ - { - "duration": 30, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5, - "width": 0.75 - }, - "qubit": 2, - "frequency": 0, - "type": "qf" - }, - { - "type": "vz", - "phase": 0.0, - "qubit": 4 - }, - { - "type": "vz", - "phase": 0.0, - "qubit": 2 - }, - { - "duration": 30, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5, - "width": 0.75 - }, - "coupler": 4, - "frequency": 0, - "type": "cf" - } - ], - "iSWAP": [ - { - "duration": 30, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5, - "width": 0.75 - }, - "qubit": 2, - "frequency": 0, - "type": "qf" - }, - { + "CZ": { + "qubit_2/flux": [ + { + "duration": 30, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, + "type": "qf" + } + ], + "qubit_2/drive": [ + { + "type": "vz", + "phase": 0.0 + } + ], + "qubit_4/drive": [ + { "type": "vz", - "phase": 0.0, - "qubit": 1 - }, - { + "phase": 0.0 + } + ], + "coupler_4/flux": [ + { + "duration": 30, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, + "type": "cf" + } + ] + }, + "iSWAP": { + "qubit_2/flux": [ + { + "duration": 30, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, + "type": "qf" + } + ], + "qubit_2/drive": [ + { + "type": "vz", + "phase": 0.0 + } + ], + "qubit_4/drive": [ + { "type": "vz", - "phase": 0.0, - "qubit": 2 - }, - { - "duration": 30, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5, - "width": 0.75 - }, - "coupler": 4, - "frequency": 0, - "type": "cf" - } - ] + "phase": 0.0 + } + ], + "coupler_4/flux": [ + { + "duration": 30, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, + "type": "cf" + } + ] + } } } }, @@ -540,10 +636,7 @@ "single_qubit": { "0": { "bare_resonator_frequency": 0, - "readout_frequency": 5200000000.0, - "drive_frequency": 4000000000.0, "anharmonicity": 0, - "sweetspot": 0.0, "asymmetry": 0.0, "crosstalk_matrix": { "0": 1 @@ -551,8 +644,7 @@ "Ec": 0.0, "Ej": 0.0, "g": 0.0, - "assignment_fidelity": [0.5, 0.1], - "gate_fidelity": [0.5, 0.1], + "assignment_fidelity": 0.0, "peak_voltage": 0, "pi_pulse_amplitude": 0, "T1": 0.0, @@ -563,18 +655,11 @@ "mean_gnd_states": [0, 1], "mean_exc_states": [1, 0], "threshold": 0.0, - "iq_angle": 0.0, - "mixer_drive_g": 0.0, - "mixer_drive_phi": 0.0, - "mixer_readout_g": 0.0, - "mixer_readout_phi": 0.0 + "iq_angle": 0.0 }, "1": { "bare_resonator_frequency": 0, - "readout_frequency": 4900000000.0, - "drive_frequency": 4200000000.0, "anharmonicity": 0, - "sweetspot": 0.0, "asymmetry": 0.0, "crosstalk_matrix": { "1": 1 @@ -582,8 +667,7 @@ "Ec": 0.0, "Ej": 0.0, "g": 0.0, - "assignment_fidelity": [0.5, 0.1], - "gate_fidelity": [0.5, 0.1], + "assignment_fidelity": 0.0, "peak_voltage": 0, "pi_pulse_amplitude": 0, "T1": 0.0, @@ -594,18 +678,11 @@ "mean_gnd_states": [0.25, 0], "mean_exc_states": [0, 0.25], "threshold": 0.0, - "iq_angle": 0.0, - "mixer_drive_g": 0.0, - "mixer_drive_phi": 0.0, - "mixer_readout_g": 0.0, - "mixer_readout_phi": 0.0 + "iq_angle": 0.0 }, "2": { "bare_resonator_frequency": 0, - "readout_frequency": 6100000000.0, - "drive_frequency": 4500000000.0, "anharmonicity": 0, - "sweetspot": 0.0, "asymmetry": 0.0, "crosstalk_matrix": { "2": 1 @@ -613,8 +690,7 @@ "Ec": 0.0, "Ej": 0.0, "g": 0.0, - "assignment_fidelity": [0.5, 0.1], - "gate_fidelity": [0.5, 0.1], + "assignment_fidelity": 0.0, "peak_voltage": 0, "pi_pulse_amplitude": 0, "T1": 0.0, @@ -625,18 +701,11 @@ "mean_gnd_states": [0.5, 0], "mean_exc_states": [0, 0.5], "threshold": 0.0, - "iq_angle": 0.0, - "mixer_drive_g": 0.0, - "mixer_drive_phi": 0.0, - "mixer_readout_g": 0.0, - "mixer_readout_phi": 0.0 + "iq_angle": 0.0 }, "3": { "bare_resonator_frequency": 0, - "readout_frequency": 5800000000.0, - "drive_frequency": 4150000000.0, "anharmonicity": 0, - "sweetspot": 0.0, "asymmetry": 0.0, "crosstalk_matrix": { "3": 1 @@ -644,8 +713,7 @@ "Ec": 0.0, "Ej": 0.0, "g": 0.0, - "assignment_fidelity": [0.5, 0.1], - "gate_fidelity": [0.5, 0.1], + "assignment_fidelity": 0.0, "peak_voltage": 0, "pi_pulse_amplitude": 0, "T1": 0.0, @@ -656,18 +724,11 @@ "mean_gnd_states": [0.75, 0], "mean_exc_states": [0, 0.75], "threshold": 0.0, - "iq_angle": 0.0, - "mixer_drive_g": 0.0, - "mixer_drive_phi": 0.0, - "mixer_readout_g": 0.0, - "mixer_readout_phi": 0.0 + "iq_angle": 0.0 }, "4": { "bare_resonator_frequency": 0, - "readout_frequency": 5500000000.0, - "drive_frequency": 4100000000.0, "anharmonicity": 0, - "sweetspot": 0.0, "asymmetry": 0.0, "crosstalk_matrix": { "4": 1 @@ -675,8 +736,7 @@ "Ec": 0.0, "Ej": 0.0, "g": 0.0, - "assignment_fidelity": [0.5, 0.1], - "gate_fidelity": [0.5, 0.1], + "assignment_fidelity": 0.0, "peak_voltage": 0, "pi_pulse_amplitude": 0, "T1": 0.0, @@ -687,29 +747,7 @@ "mean_gnd_states": [1, 0], "mean_exc_states": [0, 1], "threshold": 0.0, - "iq_angle": 0.0, - "mixer_drive_g": 0.0, - "mixer_drive_phi": 0.0, - "mixer_readout_g": 0.0, - "mixer_readout_phi": 0.0 - } - }, - "two_qubit": { - "0-2": { - "gate_fidelity": [0.5, 0.1], - "cz_fidelity": [0.5, 0.1] - }, - "1-2": { - "gate_fidelity": [0.5, 0.1], - "cz_fidelity": [0.5, 0.1] - }, - "2-3": { - "gate_fidelity": [0.5, 0.1], - "cz_fidelity": [0.5, 0.1] - }, - "2-4": { - "gate_fidelity": [0.5, 0.1], - "cz_fidelity": [0.5, 0.1] + "iq_angle": 0.0 } }, "coupler": { diff --git a/src/qibolab/dummy/platform.py b/src/qibolab/dummy/platform.py index f4682fd575..12603ffd31 100644 --- a/src/qibolab/dummy/platform.py +++ b/src/qibolab/dummy/platform.py @@ -1,11 +1,23 @@ -import itertools import pathlib -from qibolab.channel import Channel +from qibolab.components import ( + AcquireChannel, + AcquisitionConfig, + DcChannel, + DcConfig, + IqChannel, + IqConfig, + OscillatorConfig, +) from qibolab.instruments.dummy import DummyInstrument, DummyLocalOscillator from qibolab.kernels import Kernels from qibolab.platform import Platform -from qibolab.serialize import load_qubits, load_runcard, load_settings +from qibolab.serialize import ( + load_component_config, + load_qubits, + load_runcard, + load_settings, +) FOLDER = pathlib.Path(__file__).parent @@ -15,12 +27,13 @@ def remove_couplers(runcard): couplers.""" runcard["topology"] = list(runcard["topology"].values()) del runcard["couplers"] - del runcard["native_gates"]["coupler"] del runcard["characterization"]["coupler"] two_qubit = runcard["native_gates"]["two_qubit"] for i, gates in two_qubit.items(): for j, gate in gates.items(): - two_qubit[i][j] = [pulse for pulse in gate if "coupler" not in pulse] + two_qubit[i][j] = { + ch: pulses for ch, pulses in gate.items() if "coupler" not in ch + } return runcard @@ -30,13 +43,10 @@ def create_dummy(with_couplers: bool = True): Args: with_couplers (bool): Selects whether the dummy platform will have coupler qubits. """ - # Create dummy controller - instrument = DummyInstrument("dummy", 0) + instrument = DummyInstrument("dummy", "0.0.0.0") - # Create local oscillator - twpa_pump = DummyLocalOscillator(name="twpa_pump", address=0) - twpa_pump.frequency = 1e9 - twpa_pump.power = 10 + twpa_pump_name = "twpa_pump" + twpa_pump = DummyLocalOscillator(twpa_pump_name, "0.0.0.0") runcard = load_runcard(FOLDER) kernels = Kernels.load(FOLDER) @@ -44,40 +54,54 @@ def create_dummy(with_couplers: bool = True): if not with_couplers: runcard = remove_couplers(runcard) - # Create channel objects - nqubits = runcard["nqubits"] - channels = ChannelMap() - channels |= Channel("readout", port=instrument.ports("readout")) - channels |= ( - Channel(f"drive-{i}", port=instrument.ports(f"drive-{i}")) - for i in range(nqubits) - ) - channels |= ( - Channel(f"flux-{i}", port=instrument.ports(f"flux-{i}")) for i in range(nqubits) - ) - channels |= Channel("twpa", port=None) - if with_couplers: - channels |= ( - Channel(f"flux_coupler-{c}", port=instrument.ports(f"flux_coupler-{c}")) - for c in itertools.chain(range(0, 2), range(3, 5)) - ) - channels["readout"].attenuation = 0 - channels["twpa"].local_oscillator = twpa_pump - qubits, couplers, pairs = load_qubits(runcard, kernels) settings = load_settings(runcard) - # map channels to qubits + component_configs = {} + component_configs[twpa_pump_name] = load_component_config( + runcard, twpa_pump_name, OscillatorConfig + ) for q, qubit in qubits.items(): - qubit.readout = channels["readout"] - qubit.drive = channels[f"drive-{q}"] - qubit.flux = channels[f"flux-{q}"] - qubit.twpa = channels["twpa"] + acquisition_name = f"qubit_{q}/acquire" + measure_name = f"qubit_{q}/measure" + qubit.measure = IqChannel( + measure_name, mixer=None, lo=None, acquisition=acquisition_name + ) + qubit.acquisition = AcquireChannel( + acquisition_name, twpa_pump=twpa_pump_name, measure=measure_name + ) + component_configs[measure_name] = load_component_config( + runcard, measure_name, IqConfig + ) + component_configs[acquisition_name] = load_component_config( + runcard, acquisition_name, AcquisitionConfig + ) + + drive_name = f"qubit_{q}/drive" + qubit.drive = IqChannel(drive_name, mixer=None, lo=None, acquisition=None) + component_configs[drive_name] = load_component_config( + runcard, drive_name, IqConfig + ) + + drive_12_name = f"qubit_{q}/drive12" + qubit.drive12 = IqChannel(drive_12_name, mixer=None, lo=None, acquisition=None) + component_configs[drive_12_name] = load_component_config( + runcard, drive_12_name, IqConfig + ) + + flux_name = f"qubit_{q}/flux" + qubit.flux = DcChannel(flux_name) + component_configs[flux_name] = load_component_config( + runcard, flux_name, DcConfig + ) if with_couplers: - # map channels to couplers for c, coupler in couplers.items(): - coupler.flux = channels[f"flux_coupler-{c}"] + flux_name = f"coupler_{c}/flux" + coupler.flux = DcChannel(flux_name) + component_configs[flux_name] = load_component_config( + runcard, flux_name, DcConfig + ) instruments = {instrument.name: instrument, twpa_pump.name: twpa_pump} name = "dummy_couplers" if with_couplers else "dummy" @@ -85,6 +109,7 @@ def create_dummy(with_couplers: bool = True): name, qubits, pairs, + component_configs, instruments, settings, resonator_type="2D", diff --git a/src/qibolab/instruments/dummy.py b/src/qibolab/instruments/dummy.py index b9645ac219..14370b46c3 100644 --- a/src/qibolab/instruments/dummy.py +++ b/src/qibolab/instruments/dummy.py @@ -1,39 +1,18 @@ -from dataclasses import dataclass -from typing import Dict, Optional - import numpy as np from qibo.config import log -from qibolab.couplers import Coupler -from qibolab.execution_parameters import ( - AcquisitionType, - AveragingMode, - ExecutionParameters, -) +from qibolab import AcquisitionType, AveragingMode, ExecutionParameters from qibolab.pulses import PulseSequence -from qibolab.qubits import Qubit, QubitId from qibolab.sweeper import ParallelSweepers from qibolab.unrolling import Bounds +from ..components import Config from .abstract import Controller from .oscillator import LocalOscillator -from .port import Port SAMPLING_RATE = 1 -@dataclass -class DummyPort(Port): - name: str - offset: float = 0.0 - lo_frequency: int = 0 - lo_power: int = 0 - gain: int = 0 - attenuation: int = 0 - power_range: int = 0 - filters: Optional[dict] = None - - class DummyDevice: """Dummy device that does nothing but follows the QCoDeS interface. @@ -82,8 +61,6 @@ class DummyInstrument(Controller): BOUNDS = Bounds(1, 1, 1) - PortType = DummyPort - @property def sampling_rate(self): return SAMPLING_RATE @@ -116,11 +93,11 @@ def get_values(self, options, ro_pulse, shape): def play( self, - qubits: Dict[QubitId, Qubit], - couplers: Dict[QubitId, Coupler], - sequence: PulseSequence, + configs: dict[str, Config], + sequences: list[PulseSequence], options: ExecutionParameters, sweepers: list[ParallelSweepers], + integration_setup: dict[str, tuple[np.ndarray, float]], ): results = {} @@ -133,10 +110,9 @@ def play( min(len(sweep.values) for sweep in parsweeps) for parsweeps in sweepers ) - for ro_pulse in sequence.ro_pulses: - values = self.get_values(options, ro_pulse, shape) - results[ro_pulse.qubit] = results[ro_pulse.id] = options.results_type( - values - ) + for seq in sequences: + for ro_pulse in seq.ro_pulses: + values = self.get_values(options, ro_pulse, shape) + results[ro_pulse.id] = options.results_type(values) return results From 689777527e3de03af1b994c822cfbddef2c32bfc Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 2 Jul 2024 13:40:43 +0400 Subject: [PATCH 0313/1006] update dummy platform tests --- tests/test_dummy.py | 187 ++++++++++++++++++++++++++------------------ 1 file changed, 110 insertions(+), 77 deletions(-) diff --git a/tests/test_dummy.py b/tests/test_dummy.py index 68fd423d5a..94327da807 100644 --- a/tests/test_dummy.py +++ b/tests/test_dummy.py @@ -2,9 +2,15 @@ import pytest from qibolab import AcquisitionType, AveragingMode, ExecutionParameters, create_platform -from qibolab.pulses import Delay, GaussianSquare, Pulse, PulseSequence, PulseType +from qibolab.pulses import ( + Delay, + Gaussian, + GaussianSquare, + Pulse, + PulseSequence, + PulseType, +) from qibolab.qubits import QubitPair -from qibolab.serialize_ import replace from qibolab.sweeper import ChannelParameter, Parameter, Sweeper SWEPT_POINTS = 5 @@ -25,27 +31,34 @@ def test_dummy_initialization(name): def test_dummy_execute_pulse_sequence(name, acquisition): nshots = 100 platform = create_platform(name) - ro_pulse = platform.create_MZ_pulse(0) + mz_seq = platform.create_MZ_pulse(0) + mz_pulse = next(iter(mz_seq.values()))[0] sequence = PulseSequence() - sequence.append(platform.create_MZ_pulse(0)) - sequence.append(platform.create_RX12_pulse(0)) + sequence.extend(mz_seq) + sequence.extend(platform.create_RX12_pulse(0)) options = ExecutionParameters(nshots=100, acquisition_type=acquisition) - result = platform.execute([sequence], options) + result = platform.execute_pulse_sequence(sequence, options) if acquisition is AcquisitionType.INTEGRATION: - assert result[0][0].magnitude.shape == (nshots,) + assert result[mz_pulse.id].magnitude.shape == (nshots,) elif acquisition is AcquisitionType.RAW: - assert result[0][0].magnitude.shape == (nshots * ro_pulse.duration,) + assert result[mz_pulse.id].magnitude.shape == (nshots * mz_seq.duration,) def test_dummy_execute_coupler_pulse(): platform = create_platform("dummy_couplers") sequence = PulseSequence() - pulse = platform.create_coupler_pulse(coupler=0) - sequence.append(pulse) + channel = platform.get_coupler(0).flux + pulse = Pulse( + duration=30, + amplitude=0.05, + envelope=GaussianSquare(rel_sigma=5, width=0.75), + type=PulseType.COUPLERFLUX, + ) + sequence[channel.name].append(pulse) options = ExecutionParameters(nshots=None) - result = platform.execute([sequence], options) + result = platform.execute_pulse_sequence(sequence, options) def test_dummy_execute_pulse_sequence_couplers(): @@ -58,24 +71,22 @@ def test_dummy_execute_pulse_sequence_couplers(): cz = platform.create_CZ_pulse_sequence( qubits=(qubit_ordered_pair.qubit1.name, qubit_ordered_pair.qubit2.name), ) - sequence.extend(cz.get_qubit_pulses(qubit_ordered_pair.qubit1.name)) - sequence.extend(cz.get_qubit_pulses(qubit_ordered_pair.qubit2.name)) - sequence.extend(cz.coupler_pulses(qubit_ordered_pair.coupler.name)) - sequence.append(Delay(duration=40, channel=platform.qubits[0].readout.name)) - sequence.append(Delay(duration=40, channel=platform.qubits[2].readout.name)) - sequence.append(platform.create_MZ_pulse(0)) - sequence.append(platform.create_MZ_pulse(2)) + sequence.extend(cz) + sequence[platform.qubits[0].measure.name].append(Delay(duration=40)) + sequence[platform.qubits[2].measure.name].append(Delay(duration=40)) + sequence.extend(platform.create_MZ_pulse(0)) + sequence.extend(platform.create_MZ_pulse(2)) options = ExecutionParameters(nshots=None) - result = platform.execute([sequence], options) + result = platform.execute_pulse_sequence(sequence, options) @pytest.mark.parametrize("name", PLATFORM_NAMES) def test_dummy_execute_pulse_sequence_fast_reset(name): platform = create_platform(name) sequence = PulseSequence() - sequence.append(platform.create_MZ_pulse(0)) + sequence.extend(platform.create_MZ_pulse(0)) options = ExecutionParameters(nshots=None, fast_reset=True) - result = platform.execute([sequence], options) + result = platform.execute_pulse_sequence(sequence, options) @pytest.mark.parametrize("name", PLATFORM_NAMES) @@ -90,11 +101,11 @@ def test_dummy_execute_pulse_sequence_unrolling(name, acquisition, batch_size): platform.instruments["dummy"].UNROLLING_BATCH_SIZE = batch_size sequences = [] sequence = PulseSequence() - sequence.append(platform.create_MZ_pulse(0)) + sequence.extend(platform.create_MZ_pulse(0)) for _ in range(nsequences): sequences.append(sequence) options = ExecutionParameters(nshots=nshots, acquisition_type=acquisition) - result = platform.execute(sequences, options) + result = platform.execute_pulse_sequences(sequences, options) assert len(result[0]) == nsequences for r in result[0]: if acquisition is AcquisitionType.INTEGRATION: @@ -107,19 +118,24 @@ def test_dummy_execute_pulse_sequence_unrolling(name, acquisition, batch_size): def test_dummy_single_sweep_raw(name): platform = create_platform(name) sequence = PulseSequence() - pulse = platform.create_MZ_pulse(qubit=0) + mz_seq = platform.create_MZ_pulse(qubit=0) + pulse = next(iter(mz_seq.values()))[0] parameter_range = np.random.randint(SWEPT_POINTS, size=SWEPT_POINTS) - sequence.append(pulse) - sweeper = Sweeper(Parameter.frequency, parameter_range, pulses=[pulse]) + sequence.extend(mz_seq) + sweeper = Sweeper( + Parameter.frequency, + parameter_range, + channels=[platform.get_qubit(0).measure.name], + ) options = ExecutionParameters( nshots=10, averaging_mode=AveragingMode.CYCLIC, acquisition_type=AcquisitionType.RAW, ) - results = platform.execute([sequence], options, [[sweeper]]) - assert pulse.id and pulse.qubit in results - shape = results[pulse.qubit][0].magnitude.shape + results = platform.sweep(sequence, options, sweeper) + assert pulse.id in results + shape = results[pulse.id].magnitude.shape assert shape == (pulse.duration * SWEPT_POINTS,) @@ -137,22 +153,24 @@ def test_dummy_single_sweep_coupler( ): platform = create_platform("dummy_couplers") sequence = PulseSequence() - ro_pulse = platform.create_MZ_pulse(qubit=0) + mz_seq = platform.create_MZ_pulse(qubit=0) + mz_pulse = next(iter(mz_seq.values()))[0] coupler_pulse = Pulse.flux( duration=40, amplitude=0.5, envelope=GaussianSquare(rel_sigma=0.2, width=0.75), - channel="flux_coupler-0", - qubit=0, + type=PulseType.COUPLERFLUX, ) - coupler_pulse = replace(coupler_pulse, type=PulseType.COUPLERFLUX) + sequence.extend(mz_seq) + sequence[platform.get_coupler(0).flux.name].append(coupler_pulse) if parameter is Parameter.amplitude: parameter_range = np.random.rand(SWEPT_POINTS) else: parameter_range = np.random.randint(SWEPT_POINTS, size=SWEPT_POINTS) - sequence.append(ro_pulse) if parameter in ChannelParameter: - sweeper = Sweeper(parameter, parameter_range, couplers=[platform.couplers[0]]) + sweeper = Sweeper( + parameter, parameter_range, channels=[platform.couplers[0].flux.name] + ) else: sweeper = Sweeper(parameter, parameter_range, pulses=[coupler_pulse]) options = ExecutionParameters( @@ -162,20 +180,20 @@ def test_dummy_single_sweep_coupler( fast_reset=fast_reset, ) average = not options.averaging_mode is AveragingMode.SINGLESHOT - results = platform.execute([sequence], options, [[sweeper]]) + results = platform.sweep(sequence, options, sweeper) - assert ro_pulse.id and ro_pulse.qubit in results + assert mz_pulse.id in results if average: results_shape = ( - results[ro_pulse.qubit][0].magnitude.shape + results[mz_pulse.id].magnitude.shape if acquisition is AcquisitionType.INTEGRATION - else results[ro_pulse.qubit][0].statistical_frequency.shape + else results[mz_pulse.id].statistical_frequency.shape ) else: results_shape = ( - results[ro_pulse.qubit][0].magnitude.shape + results[mz_pulse.id].magnitude.shape if acquisition is AcquisitionType.INTEGRATION - else results[ro_pulse.qubit][0].samples.shape + else results[mz_pulse.id].samples.shape ) assert results_shape == (SWEPT_POINTS,) if average else (nshots, SWEPT_POINTS) @@ -191,14 +209,20 @@ def test_dummy_single_sweep_coupler( def test_dummy_single_sweep(name, fast_reset, parameter, average, acquisition, nshots): platform = create_platform(name) sequence = PulseSequence() - pulse = platform.create_MZ_pulse(qubit=0) + mz_seq = platform.create_MZ_pulse(qubit=0) + pulse = next(iter(mz_seq.values()))[0] if parameter is Parameter.amplitude: parameter_range = np.random.rand(SWEPT_POINTS) else: parameter_range = np.random.randint(SWEPT_POINTS, size=SWEPT_POINTS) - sequence.append(pulse) + sequence.extend(mz_seq) if parameter in ChannelParameter: - sweeper = Sweeper(parameter, parameter_range, qubits=[platform.qubits[0]]) + channel = ( + platform.qubits[0].drive.name + if parameter is Parameter.frequency + else platform.qubits[0].flux.name + ) + sweeper = Sweeper(parameter, parameter_range, channels=[channel]) else: sweeper = Sweeper(parameter, parameter_range, pulses=[pulse]) options = ExecutionParameters( @@ -208,20 +232,20 @@ def test_dummy_single_sweep(name, fast_reset, parameter, average, acquisition, n fast_reset=fast_reset, ) average = not options.averaging_mode is AveragingMode.SINGLESHOT - results = platform.execute([sequence], options, [[sweeper]]) + results = platform.sweep(sequence, options, sweeper) - assert pulse.id and pulse.qubit in results + assert pulse.id in results if average: results_shape = ( - results[pulse.qubit][0].magnitude.shape + results[pulse.id].magnitude.shape if acquisition is AcquisitionType.INTEGRATION - else results[pulse.qubit][0].statistical_frequency.shape + else results[pulse.id].statistical_frequency.shape ) else: results_shape = ( - results[pulse.qubit][0].magnitude.shape + results[pulse.id].magnitude.shape if acquisition is AcquisitionType.INTEGRATION - else results[pulse.qubit][0].samples.shape + else results[pulse.id].samples.shape ) assert results_shape == (SWEPT_POINTS,) if average else (nshots, SWEPT_POINTS) @@ -237,13 +261,14 @@ def test_dummy_single_sweep(name, fast_reset, parameter, average, acquisition, n def test_dummy_double_sweep(name, parameter1, parameter2, average, acquisition, nshots): platform = create_platform(name) sequence = PulseSequence() - pulse = platform.create_qubit_drive_pulse(qubit=0, duration=1000) - ro_pulse = platform.create_MZ_pulse(qubit=0) - sequence.append(pulse) - sequence.append( - Delay(duration=pulse.duration, channel=platform.qubits[0].readout.name) + pulse = Pulse( + duration=40, amplitude=0.1, envelope=Gaussian(rel_sigma=5), type=PulseType.DRIVE ) - sequence.append(ro_pulse) + mz_seq = platform.create_MZ_pulse(qubit=0) + mz_pulse = next(iter(mz_seq.values()))[0] + sequence[platform.get_qubit(0).drive.name].append(pulse) + sequence[platform.qubits[0].measure.name].append(Delay(duration=pulse.duration)) + sequence.extend(mz_seq) parameter_range_1 = ( np.random.rand(SWEPT_POINTS) if parameter1 is Parameter.amplitude @@ -256,11 +281,18 @@ def test_dummy_double_sweep(name, parameter1, parameter2, average, acquisition, ) if parameter1 in ChannelParameter: - sweeper1 = Sweeper(parameter1, parameter_range_1, qubits=[platform.qubits[0]]) + channel = ( + platform.qubits[0].measure.name + if parameter1 is Parameter.frequency + else platform.qubits[0].flux.name + ) + sweeper1 = Sweeper(parameter1, parameter_range_1, channels=[channel]) else: - sweeper1 = Sweeper(parameter1, parameter_range_1, pulses=[ro_pulse]) + sweeper1 = Sweeper(parameter1, parameter_range_1, pulses=[mz_pulse]) if parameter2 in ChannelParameter: - sweeper2 = Sweeper(parameter2, parameter_range_2, qubits=[platform.qubits[0]]) + sweeper2 = Sweeper( + parameter2, parameter_range_2, channels=[platform.qubits[0].flux.name] + ) else: sweeper2 = Sweeper(parameter2, parameter_range_2, pulses=[pulse]) @@ -270,21 +302,21 @@ def test_dummy_double_sweep(name, parameter1, parameter2, average, acquisition, acquisition_type=acquisition, ) average = not options.averaging_mode is AveragingMode.SINGLESHOT - results = platform.execute([sequence], options, [[sweeper1], [sweeper2]]) + results = platform.sweep(sequence, options, sweeper1, sweeper2) - assert ro_pulse.id and ro_pulse.qubit in results + assert mz_pulse.id in results if average: results_shape = ( - results[pulse.qubit][0].magnitude.shape + results[mz_pulse.id].magnitude.shape if acquisition is AcquisitionType.INTEGRATION - else results[pulse.qubit][0].statistical_frequency.shape + else results[mz_pulse.id].statistical_frequency.shape ) else: results_shape = ( - results[pulse.qubit][0].magnitude.shape + results[mz_pulse.id].magnitude.shape if acquisition is AcquisitionType.INTEGRATION - else results[pulse.qubit][0].samples.shape + else results[mz_pulse.id].samples.shape ) assert ( @@ -304,10 +336,11 @@ def test_dummy_double_sweep(name, parameter1, parameter2, average, acquisition, def test_dummy_single_sweep_multiplex(name, parameter, average, acquisition, nshots): platform = create_platform(name) sequence = PulseSequence() - ro_pulses = {} + mz_pulses = {} for qubit in platform.qubits: - ro_pulses[qubit] = platform.create_qubit_readout_pulse(qubit=qubit) - sequence.append(ro_pulses[qubit]) + mz_seq = platform.create_MZ_pulse(qubit=qubit) + mz_pulses[qubit] = next(iter(mz_seq.values()))[0] + sequence.extend(mz_seq) parameter_range = ( np.random.rand(SWEPT_POINTS) if parameter is Parameter.amplitude @@ -318,13 +351,13 @@ def test_dummy_single_sweep_multiplex(name, parameter, average, acquisition, nsh sweeper1 = Sweeper( parameter, parameter_range, - qubits=[platform.qubits[qubit] for qubit in platform.qubits], + channels=[qubit.measure.name for qubit in platform.qubits.values()], ) else: sweeper1 = Sweeper( parameter, parameter_range, - pulses=[ro_pulses[qubit] for qubit in platform.qubits], + pulses=[mz_pulses[qubit] for qubit in platform.qubits], ) options = ExecutionParameters( @@ -333,21 +366,21 @@ def test_dummy_single_sweep_multiplex(name, parameter, average, acquisition, nsh acquisition_type=acquisition, ) average = not options.averaging_mode is AveragingMode.SINGLESHOT - results = platform.execute([sequence], options, [[sweeper1]]) + results = platform.sweep(sequence, options, sweeper1) - for ro_pulse in ro_pulses.values(): - assert ro_pulse.id and ro_pulse.qubit in results + for pulse in mz_pulses.values(): + assert pulse.id in results if average: results_shape = ( - results[ro_pulse.qubit][0].magnitude.shape + results[pulse.id].magnitude.shape if acquisition is AcquisitionType.INTEGRATION - else results[ro_pulse.qubit][0].statistical_frequency.shape + else results[pulse.id].statistical_frequency.shape ) else: results_shape = ( - results[ro_pulse.qubit][0].magnitude.shape + results[pulse.id].magnitude.shape if acquisition is AcquisitionType.INTEGRATION - else results[ro_pulse.qubit][0].samples.shape + else results[pulse.id].samples.shape ) assert results_shape == (SWEPT_POINTS,) if average else (nshots, SWEPT_POINTS) From da255672ba4af4fe2996843371e01047b87082f8 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 2 Jul 2024 16:52:34 +0400 Subject: [PATCH 0314/1006] fix incorrect rebase [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/qibolab/instruments/rfsoc/driver.py | 21 --------------------- src/qibolab/instruments/zhinst/executor.py | 6 +++++- src/qibolab/instruments/zhinst/sweep.py | 2 +- 3 files changed, 6 insertions(+), 23 deletions(-) diff --git a/src/qibolab/instruments/rfsoc/driver.py b/src/qibolab/instruments/rfsoc/driver.py index 9f2b9c1c71..3cad39f7cc 100644 --- a/src/qibolab/instruments/rfsoc/driver.py +++ b/src/qibolab/instruments/rfsoc/driver.py @@ -283,27 +283,6 @@ def play( return results - @staticmethod - def validate_input_command( - sequence: PulseSequence, - execution_parameters: ExecutionParameters, - sweep: bool, - ): - """Check if sequence and execution_parameters are supported.""" - if execution_parameters.acquisition_type is AcquisitionType.RAW: - if sweep: - raise NotImplementedError( - "Raw data acquisition is not compatible with sweepers" - ) - if len(sequence.ro_pulses) != 1: - raise NotImplementedError( - "Raw data acquisition is compatible only with a single readout" - ) - if execution_parameters.averaging_mode is not AveragingMode.CYCLIC: - raise NotImplementedError("Raw data acquisition can only be averaged") - if execution_parameters.fast_reset: - raise NotImplementedError("Fast reset is not supported") - def update_cfg(self, execution_parameters: ExecutionParameters): """Update rfsoc.Config object with new parameters.""" if execution_parameters.nshots is not None: diff --git a/src/qibolab/instruments/zhinst/executor.py b/src/qibolab/instruments/zhinst/executor.py index af5c2acf3f..905812642c 100644 --- a/src/qibolab/instruments/zhinst/executor.py +++ b/src/qibolab/instruments/zhinst/executor.py @@ -156,7 +156,11 @@ def configure_iq_line(self, channel: IqChannel, configs: dict[str, Config]): self.calibration[signal.path] = laboneq.SignalCalibration( oscillator=laboneq.Oscillator( frequency=intermediate_frequency, - modulation_type=laboneq.ModulationType.HARDWARE if channel.acquisition is None else laboneq.ModulationType.SOFTWARE, + modulation_type=( + laboneq.ModulationType.HARDWARE + if channel.acquisition is None + else laboneq.ModulationType.SOFTWARE + ), ), local_oscillator=laboneq.Oscillator( frequency=int(configs[channel.lo].frequency), diff --git a/src/qibolab/instruments/zhinst/sweep.py b/src/qibolab/instruments/zhinst/sweep.py index ac7ba7a8aa..6fb3730e1b 100644 --- a/src/qibolab/instruments/zhinst/sweep.py +++ b/src/qibolab/instruments/zhinst/sweep.py @@ -60,7 +60,7 @@ def __init__( self, sweepers: Iterable[Sweeper], channels: dict[str, ZiChannel], - configs: dict[str, Config] + configs: dict[str, Config], ): pulse_sweeps = [] channel_sweeps = [] From 4b10a5603d75b753245c7748348ba9d107b88432 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Wed, 3 Jul 2024 10:47:22 +0400 Subject: [PATCH 0315/1006] remove obsolete functions --- src/qibolab/instruments/zhinst/__init__.py | 1 - src/qibolab/instruments/zhinst/constants.py | 4 ++++ src/qibolab/instruments/zhinst/executor.py | 2 +- src/qibolab/instruments/zhinst/pulse.py | 2 +- src/qibolab/instruments/zhinst/sweep.py | 2 +- src/qibolab/instruments/zhinst/util.py | 24 --------------------- 6 files changed, 7 insertions(+), 28 deletions(-) create mode 100644 src/qibolab/instruments/zhinst/constants.py delete mode 100644 src/qibolab/instruments/zhinst/util.py diff --git a/src/qibolab/instruments/zhinst/__init__.py b/src/qibolab/instruments/zhinst/__init__.py index 28d208e6d5..e5a00e1b89 100644 --- a/src/qibolab/instruments/zhinst/__init__.py +++ b/src/qibolab/instruments/zhinst/__init__.py @@ -1,4 +1,3 @@ from .components import * from .executor import Zurich from .sweep import ProcessedSweeps, classify_sweepers -from .util import acquire_channel_name, measure_channel_name diff --git a/src/qibolab/instruments/zhinst/constants.py b/src/qibolab/instruments/zhinst/constants.py new file mode 100644 index 0000000000..a9c1a449e6 --- /dev/null +++ b/src/qibolab/instruments/zhinst/constants.py @@ -0,0 +1,4 @@ +"""Shared constants.""" + +SAMPLING_RATE = 2 +NANO_TO_SECONDS = 1e-9 diff --git a/src/qibolab/instruments/zhinst/executor.py b/src/qibolab/instruments/zhinst/executor.py index 905812642c..ea13bf21eb 100644 --- a/src/qibolab/instruments/zhinst/executor.py +++ b/src/qibolab/instruments/zhinst/executor.py @@ -16,9 +16,9 @@ from ...components import AcquireChannel, Config, DcChannel, IqChannel from .components import ZiChannel +from .constants import NANO_TO_SECONDS, SAMPLING_RATE from .pulse import select_pulse from .sweep import ProcessedSweeps, classify_sweepers -from .util import NANO_TO_SECONDS, SAMPLING_RATE COMPILER_SETTINGS = { "SHFSG_MIN_PLAYWAVE_HINT": 32, diff --git a/src/qibolab/instruments/zhinst/pulse.py b/src/qibolab/instruments/zhinst/pulse.py index 29224c3b5f..cdfa2608ec 100644 --- a/src/qibolab/instruments/zhinst/pulse.py +++ b/src/qibolab/instruments/zhinst/pulse.py @@ -9,7 +9,7 @@ from qibolab.pulses import Drag, Gaussian, GaussianSquare, Pulse, PulseType, Rectangular -from .util import NANO_TO_SECONDS, SAMPLING_RATE +from .constants import NANO_TO_SECONDS, SAMPLING_RATE def select_pulse(pulse: Pulse): diff --git a/src/qibolab/instruments/zhinst/sweep.py b/src/qibolab/instruments/zhinst/sweep.py index 6fb3730e1b..24401b0e2e 100644 --- a/src/qibolab/instruments/zhinst/sweep.py +++ b/src/qibolab/instruments/zhinst/sweep.py @@ -10,7 +10,7 @@ from qibolab.sweeper import Parameter, Sweeper from . import ZiChannel -from .util import NANO_TO_SECONDS +from .constants import NANO_TO_SECONDS def classify_sweepers( diff --git a/src/qibolab/instruments/zhinst/util.py b/src/qibolab/instruments/zhinst/util.py deleted file mode 100644 index 8ca8843060..0000000000 --- a/src/qibolab/instruments/zhinst/util.py +++ /dev/null @@ -1,24 +0,0 @@ -"""Utility methods.""" - -from qibolab.qubits import Qubit - -SAMPLING_RATE = 2 -NANO_TO_SECONDS = 1e-9 - - -def measure_channel_name(qubit: Qubit) -> str: - """Construct and return a name for qubit's measure channel. - - FIXME: We cannot use channel name directly, because currently channels are named after wires, and due to multiplexed readout - multiple qubits have the same channel name for their readout. Should be fixed once channels are refactored. - """ - return f"{qubit.readout.name}_{qubit.name}" - - -def acquire_channel_name(qubit: Qubit) -> str: - """Construct and return a name for qubit's acquire channel. - - FIXME: We cannot use acquire channel name, because qibolab does not have a concept of acquire channel. This function shall be removed - once all channel refactoring is done. - """ - return f"acquire{qubit.name}" From 38538f70c0c52ef424fa9f3f39f2c4af3164a214 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Wed, 3 Jul 2024 11:17:01 +0400 Subject: [PATCH 0316/1006] update unrolling tests --- tests/test_unrolling.py | 173 ++++++++++++++++++++-------------------- 1 file changed, 86 insertions(+), 87 deletions(-) diff --git a/tests/test_unrolling.py b/tests/test_unrolling.py index 65411acf0f..0624db1e6c 100644 --- a/tests/test_unrolling.py +++ b/tests/test_unrolling.py @@ -7,57 +7,57 @@ def test_bounds_update(): - p1 = Pulse( - duration=40, - amplitude=0.9, - frequency=int(100e6), - envelope=Drag(rel_sigma=0.2, beta=1), - channel="3", - type=PulseType.DRIVE, + ps = PulseSequence() + ps["ch3"].append( + Pulse( + duration=40, + amplitude=0.9, + envelope=Drag(rel_sigma=0.2, beta=1), + type=PulseType.DRIVE, + ) ) - p2 = Pulse( - duration=40, - amplitude=0.9, - frequency=int(100e6), - envelope=Drag(rel_sigma=0.2, beta=1), - channel="2", - type=PulseType.DRIVE, + ps["ch2"].append( + Pulse( + duration=40, + amplitude=0.9, + envelope=Drag(rel_sigma=0.2, beta=1), + type=PulseType.DRIVE, + ) ) - p3 = Pulse( - duration=40, - amplitude=0.9, - frequency=int(100e6), - envelope=Drag(rel_sigma=0.2, beta=1), - channel="1", - type=PulseType.DRIVE, + ps["ch1"].append( + Pulse( + duration=40, + amplitude=0.9, + envelope=Drag(rel_sigma=0.2, beta=1), + type=PulseType.DRIVE, + ) ) - p4 = Pulse( - duration=1000, - amplitude=0.9, - frequency=int(20e6), - envelope=Rectangular(), - channel="3", - type=PulseType.READOUT, + ps["ch3"].append( + Pulse( + duration=1000, + amplitude=0.9, + envelope=Rectangular(), + type=PulseType.READOUT, + ) ) - p5 = Pulse( - duration=1000, - amplitude=0.9, - frequency=int(20e6), - envelope=Rectangular(), - channel="2", - type=PulseType.READOUT, + ps["ch2"].append( + Pulse( + duration=1000, + amplitude=0.9, + envelope=Rectangular(), + type=PulseType.READOUT, + ) ) - p6 = Pulse( - duration=1000, - amplitude=0.9, - frequency=int(20e6), - envelope=Rectangular(), - channel="1", - type=PulseType.READOUT, + ps["ch1"].append( + Pulse( + duration=1000, + amplitude=0.9, + envelope=Rectangular(), + type=PulseType.READOUT, + ) ) - ps = PulseSequence([p1, p2, p3, p4, p5, p6]) bounds = Bounds.update(ps) assert bounds.waveforms >= 40 @@ -93,58 +93,57 @@ def test_bounds_comparison(): ], ) def test_batch(bounds): - p1 = Pulse( - duration=40, - amplitude=0.9, - frequency=int(100e6), - envelope=Drag(rel_sigma=0.2, beta=1), - channel="3", - type=PulseType.DRIVE, + ps = PulseSequence() + ps["ch3"].append( + Pulse( + duration=40, + amplitude=0.9, + envelope=Drag(rel_sigma=0.2, beta=1), + type=PulseType.DRIVE, + ) ) - p2 = Pulse( - duration=40, - amplitude=0.9, - frequency=int(100e6), - envelope=Drag(rel_sigma=0.2, beta=1), - channel="2", - type=PulseType.DRIVE, + ps["ch2"].append( + Pulse( + duration=40, + amplitude=0.9, + envelope=Drag(rel_sigma=0.2, beta=1), + type=PulseType.DRIVE, + ) ) - p3 = Pulse( - duration=40, - amplitude=0.9, - frequency=int(100e6), - envelope=Drag(rel_sigma=0.2, beta=1), - channel="1", - type=PulseType.DRIVE, + ps["ch1"].append( + Pulse( + duration=40, + amplitude=0.9, + envelope=Drag(rel_sigma=0.2, beta=1), + type=PulseType.DRIVE, + ) ) - p4 = Pulse( - duration=1000, - amplitude=0.9, - frequency=int(20e6), - envelope=Rectangular(), - channel="3", - type=PulseType.READOUT, + ps["ch3"].append( + Pulse( + duration=1000, + amplitude=0.9, + envelope=Rectangular(), + type=PulseType.READOUT, + ) ) - p5 = Pulse( - duration=1000, - amplitude=0.9, - frequency=int(20e6), - envelope=Rectangular(), - channel="2", - type=PulseType.READOUT, + ps["ch2"].append( + Pulse( + duration=1000, + amplitude=0.9, + envelope=Rectangular(), + type=PulseType.READOUT, + ) ) - p6 = Pulse( - duration=1000, - amplitude=0.9, - frequency=int(20e6), - envelope=Rectangular(), - channel="1", - type=PulseType.READOUT, + ps["ch1"].append( + Pulse( + duration=1000, + amplitude=0.9, + envelope=Rectangular(), + type=PulseType.READOUT, + ) ) - ps = PulseSequence([p1, p2, p3, p4, p5, p6]) - sequences = 10 * [ps] batches = list(batch(sequences, bounds)) From 33b45c0836edc8ae46296f782526d7574c44d5a9 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Wed, 3 Jul 2024 11:27:08 +0400 Subject: [PATCH 0317/1006] improve error messages --- src/qibolab/sweeper.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/qibolab/sweeper.py b/src/qibolab/sweeper.py index 3e95454a96..ccfe1a5fe4 100644 --- a/src/qibolab/sweeper.py +++ b/src/qibolab/sweeper.py @@ -92,18 +92,20 @@ class Sweeper: def __post_init__(self): if self.pulses is not None and self.channels is not None: - raise ValueError("Cannot use a sweeper on both pulses and channels.") + raise ValueError( + "Cannot create a sweeper by using both pulses and channels." + ) if self.pulses is not None and self.parameter in ChannelParameter: raise ValueError( - f"Cannot sweep {self.parameter} without specifying channels." + f"Cannot create a sweeper for {self.parameter} without specifying channels." ) if self.parameter not in ChannelParameter and (self.channels is not None): raise ValueError( - f"Cannot sweep {self.parameter} without specifying pulses." + f"Cannot create a sweeper for {self.parameter} without specifying pulses." ) if self.pulses is None and self.channels is None: raise ValueError( - "Cannot use a sweeper without specifying pulses, qubits or couplers." + "Cannot create a sweeper without specifying pulses or channels." ) def get_values(self, base_value): From 8b45e5010b055d7b0e69b53b7d61467ddd2134eb Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Wed, 3 Jul 2024 11:27:26 +0400 Subject: [PATCH 0318/1006] update sweeper tests --- tests/test_sweeper.py | 41 ++++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/tests/test_sweeper.py b/tests/test_sweeper.py index 1ad1bb2aa6..848f114112 100644 --- a/tests/test_sweeper.py +++ b/tests/test_sweeper.py @@ -2,7 +2,6 @@ import pytest from qibolab.pulses import Pulse, Rectangular -from qibolab.qubits import Qubit from qibolab.sweeper import ChannelParameter, Parameter, Sweeper @@ -11,45 +10,53 @@ def test_sweeper_pulses(parameter): pulse = Pulse( duration=40, amplitude=0.1, - frequency=1e9, envelope=Rectangular(), - channel="channel", ) if parameter is Parameter.amplitude: parameter_range = np.random.rand(10) else: parameter_range = np.random.randint(10, size=10) if parameter in ChannelParameter: - with pytest.raises(ValueError): - sweeper = Sweeper(parameter, parameter_range, [pulse]) + with pytest.raises( + ValueError, match="Cannot create a sweeper .* without specifying channels" + ): + _ = Sweeper(parameter, parameter_range, pulses=[pulse]) else: - sweeper = Sweeper(parameter, parameter_range, [pulse]) + sweeper = Sweeper(parameter, parameter_range, pulses=[pulse]) assert sweeper.parameter is parameter @pytest.mark.parametrize("parameter", Parameter) -def test_sweeper_qubits(parameter): - qubit = Qubit(0) +def test_sweeper_channels(parameter): parameter_range = np.random.randint(10, size=10) if parameter in ChannelParameter: - sweeper = Sweeper(parameter, parameter_range, qubits=[qubit]) + sweeper = Sweeper(parameter, parameter_range, channels=["some channel"]) assert sweeper.parameter is parameter else: - with pytest.raises(ValueError): - sweeper = Sweeper(parameter, parameter_range, qubits=[qubit]) + with pytest.raises( + ValueError, match="Cannot create a sweeper .* without specifying pulses" + ): + _ = Sweeper(parameter, parameter_range, channels=["canal"]) def test_sweeper_errors(): pulse = Pulse( duration=40, amplitude=0.1, - frequency=1e9, envelope=Rectangular(), - channel="channel", ) - qubit = Qubit(0) parameter_range = np.random.randint(10, size=10) - with pytest.raises(ValueError): + with pytest.raises( + ValueError, + match="Cannot create a sweeper without specifying pulses or channels", + ): Sweeper(Parameter.frequency, parameter_range) - with pytest.raises(ValueError): - Sweeper(Parameter.frequency, parameter_range, [pulse], [qubit]) + with pytest.raises( + ValueError, match="Cannot create a sweeper by using both pulses and channels" + ): + Sweeper( + Parameter.frequency, + parameter_range, + pulses=[pulse], + channels=["some channel"], + ) From 22f07217d1a272ed52863def9172929a8aa6a5fb Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Wed, 3 Jul 2024 11:35:30 +0400 Subject: [PATCH 0319/1006] update result shape tests --- tests/test_result_shapes.py | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/tests/test_result_shapes.py b/tests/test_result_shapes.py index 3931d0373e..d5cd2de223 100644 --- a/tests/test_result_shapes.py +++ b/tests/test_result_shapes.py @@ -2,7 +2,6 @@ import pytest from qibolab import AcquisitionType, AveragingMode, ExecutionParameters -from qibolab.platform.platform import Platform from qibolab.pulses import PulseSequence from qibolab.result import ( AveragedIntegratedResults, @@ -17,14 +16,15 @@ NSWEEP2 = 8 -def execute(platform: Platform, acquisition_type, averaging_mode, sweep=False): +def execute(platform, acquisition_type, averaging_mode, sweep=False): qubit = next(iter(platform.qubits)) - qd_pulse = platform.create_RX_pulse(qubit, start=0) - ro_pulse = platform.create_MZ_pulse(qubit, start=qd_pulse.finish) + qd_seq = platform.create_RX_pulse(qubit) + mz_seq = platform.create_MZ_pulse(qubit) + mz_pulse = next(iter(mz_seq.values()))[0] sequence = PulseSequence() - sequence.append(qd_pulse) - sequence.append(ro_pulse) + sequence.extend(qd_seq) + sequence.extend(mz_seq) options = ExecutionParameters( nshots=NSHOTS, acquisition_type=acquisition_type, averaging_mode=averaging_mode @@ -32,13 +32,15 @@ def execute(platform: Platform, acquisition_type, averaging_mode, sweep=False): if sweep: amp_values = np.arange(0.01, 0.06, 0.01) freq_values = np.arange(-4e6, 4e6, 1e6) - sweeper1 = Sweeper(Parameter.bias, amp_values, qubits=[platform.qubits[qubit]]) + sweeper1 = Sweeper( + Parameter.bias, amp_values, channels=[platform.qubits[qubit].flux.name] + ) # sweeper1 = Sweeper(Parameter.amplitude, amp_values, pulses=[qd_pulse]) - sweeper2 = Sweeper(Parameter.frequency, freq_values, pulses=[ro_pulse]) - results = platform.execute([sequence], options, [[sweeper1], [sweeper2]]) + sweeper2 = Sweeper(Parameter.frequency, freq_values, pulses=[mz_pulse]) + results = platform.sweep(sequence, options, sweeper1, sweeper2) else: - results = platform.execute([sequence], options) - return results[qubit][0] + results = platform.execute_pulse_sequence(sequence, options) + return results[qubit] @pytest.mark.qpu From 291d45a45153950a58f86a8f9bdfd5e4d0e23e8e Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Wed, 3 Jul 2024 12:38:28 +0400 Subject: [PATCH 0320/1006] update platform tests --- tests/test_platform.py | 220 +++++++++++++++++++++++------------------ 1 file changed, 125 insertions(+), 95 deletions(-) diff --git a/tests/test_platform.py b/tests/test_platform.py index 9ae82b0ff1..80d12929fd 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -18,11 +18,18 @@ from qibolab.dummy.platform import FOLDER from qibolab.execution_parameters import ExecutionParameters from qibolab.instruments.qblox.controller import QbloxController -from qibolab.instruments.rfsoc.driver import RFSoC from qibolab.kernels import Kernels from qibolab.platform import Platform, unroll_sequences from qibolab.platform.load import PLATFORMS -from qibolab.pulses import Delay, Drag, PulseSequence, Rectangular +from qibolab.pulses import ( + Delay, + Drag, + Gaussian, + Pulse, + PulseSequence, + PulseType, + Rectangular, +) from qibolab.serialize import ( PLATFORM, dump_kernels, @@ -40,17 +47,18 @@ def test_unroll_sequences(platform): qubit = next(iter(platform.qubits)) sequence = PulseSequence() - qd_pulse = platform.create_RX_pulse(qubit) - ro_pulse = platform.create_MZ_pulse(qubit) - sequence.append(qd_pulse) - sequence.append( - Delay(duration=qd_pulse.duration, channel=platform.qubits[qubit].readout.name) + qd_seq = platform.create_RX_pulse(qubit) + mz_seq = platform.create_MZ_pulse(qubit) + mz_pulse = next(iter(mz_seq.values()))[0] + sequence.extend(qd_seq) + sequence[platform.qubits[qubit].readout.name].append( + Delay(duration=qd_seq.duration) ) - sequence.append(ro_pulse) + sequence.extend(mz_seq) total_sequence, readouts = unroll_sequences(10 * [sequence], relaxation_time=10000) assert len(total_sequence.ro_pulses) == 10 assert len(readouts) == 1 - assert len(readouts[ro_pulse.id]) == 10 + assert len(readouts[mz_pulse.id]) == 10 def test_create_platform(platform): @@ -176,17 +184,30 @@ def test_platform_execute_empty(qpu_platform): # an empty pulse sequence platform = qpu_platform sequence = PulseSequence() - platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=nshots)) + result = platform.execute_pulse_sequence( + sequence, ExecutionParameters(nshots=nshots) + ) + assert result is not None @pytest.mark.qpu def test_platform_execute_one_drive_pulse(qpu_platform): # One drive pulse platform = qpu_platform - qubit = next(iter(platform.qubits)) + qubit = next(iter(platform.qubits.values())) sequence = PulseSequence() - sequence.append(platform.create_qubit_drive_pulse(qubit, duration=200)) - platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=nshots)) + sequence[qubit.drive.name].append( + Pulse( + duration=200, + amplitude=0.07, + envelope=Gaussian(5), + type=PulseType.DRIVE, + ) + ) + result = platform.execute_pulse_sequence( + sequence, ExecutionParameters(nshots=nshots) + ) + assert result is not None @pytest.mark.qpu @@ -195,42 +216,56 @@ def test_platform_execute_one_coupler_pulse(qpu_platform): platform = qpu_platform if len(platform.couplers) == 0: pytest.skip("The platform does not have couplers") - coupler = next(iter(platform.couplers)) + coupler = next(iter(platform.couplers.values())) sequence = PulseSequence() - sequence.append(platform.create_coupler_pulse(coupler, duration=200, amplitude=1)) - platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=nshots)) - assert len(sequence.cf_pulses) > 0 + sequence[coupler.flux.name].append( + Pulse( + duration=200, + amplitude=0.31, + envelope=Rectangular(), + type=PulseType.COUPLERFLUX, + ) + ) + result = platform.execute_pulse_sequence( + sequence, ExecutionParameters(nshots=nshots) + ) + assert result is not None @pytest.mark.qpu def test_platform_execute_one_flux_pulse(qpu_platform): # One flux pulse platform = qpu_platform - qubit = next(iter(platform.qubits)) + qubit = next(iter(platform.qubits.values())) sequence = PulseSequence() - sequence.add(platform.create_qubit_flux_pulse(qubit, duration=200, amplitude=1)) - platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=nshots)) - assert len(sequence.qf_pulses) == 1 - assert len(sequence) == 1 + sequence[qubit.flux.name].append( + Pulse( + duration=200, + amplitude=0.28, + envelope=Rectangular(), + type=PulseType.FLUX, + ) + ) + result = platform.execute_pulse_sequence( + sequence, ExecutionParameters(nshots=nshots) + ) + assert result is not None @pytest.mark.qpu def test_platform_execute_one_long_drive_pulse(qpu_platform): # Long duration platform = qpu_platform - qubit = next(iter(platform.qubits)) - pulse = platform.create_qubit_drive_pulse(qubit, duration=8192 + 200) + qubit = next(iter(platform.qubits.values())) + pulse = Pulse( + duration=8192 + 200, amplitude=0.12, envelope=Gaussian(5), type=PulseType.DRIVE + ) sequence = PulseSequence() - sequence.append(pulse) + sequence[qubit.drive.name].append(pulse) options = ExecutionParameters(nshots=nshots) if find_instrument(platform, QbloxController) is not None: with pytest.raises(NotImplementedError): platform.execute_pulse_sequence(sequence, options) - elif find_instrument(platform, RFSoC) is not None and not isinstance( - pulse.shape, Rectangular - ): - with pytest.raises(RuntimeError): - platform.execute_pulse_sequence(sequence, options) else: platform.execute_pulse_sequence(sequence, options) @@ -239,19 +274,19 @@ def test_platform_execute_one_long_drive_pulse(qpu_platform): def test_platform_execute_one_extralong_drive_pulse(qpu_platform): # Extra Long duration platform = qpu_platform - qubit = next(iter(platform.qubits)) - pulse = platform.create_qubit_drive_pulse(qubit, duration=2 * 8192 + 200) + qubit = next(iter(platform.qubits.values())) + pulse = Pulse( + duration=2 * 8192 + 200, + amplitude=0.12, + envelope=Gaussian(5), + type=PulseType.DRIVE, + ) sequence = PulseSequence() - sequence.append(pulse) + sequence[qubit.drive.name].append(pulse) options = ExecutionParameters(nshots=nshots) if find_instrument(platform, QbloxController) is not None: with pytest.raises(NotImplementedError): platform.execute_pulse_sequence(sequence, options) - elif find_instrument(platform, RFSoC) is not None and not isinstance( - pulse.shape, Rectangular - ): - with pytest.raises(RuntimeError): - platform.execute_pulse_sequence(sequence, options) else: platform.execute_pulse_sequence(sequence, options) @@ -260,11 +295,11 @@ def test_platform_execute_one_extralong_drive_pulse(qpu_platform): def test_platform_execute_one_drive_one_readout(qpu_platform): """One drive pulse and one readout pulse.""" platform = qpu_platform - qubit = next(iter(platform.qubits)) + qubit_id, qubit = next(iter(platform.qubits.items())) sequence = PulseSequence() - sequence.append(platform.create_qubit_drive_pulse(qubit, duration=200)) - sequence.append(Delay(200, platform.qubits[qubit].readout.name)) - sequence.append(platform.create_qubit_readout_pulse(qubit)) + sequence.extend(platform.create_RX_pulse(qubit_id)) + sequence[qubit.measure.name].append(Delay(duration=200)) + sequence.extend(platform.create_MZ_pulse(qubit_id)) platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=nshots)) @@ -272,15 +307,15 @@ def test_platform_execute_one_drive_one_readout(qpu_platform): def test_platform_execute_multiple_drive_pulses_one_readout(qpu_platform): """Multiple qubit drive pulses and one readout pulse.""" platform = qpu_platform - qubit = next(iter(platform.qubits)) + qubit_id, qubit = next(iter(platform.qubits.items())) sequence = PulseSequence() - sequence.append(platform.create_qubit_drive_pulse(qubit, duration=200)) - sequence.append(Delay(4, platform.qubits[qubit].drive.name)) - sequence.append(platform.create_qubit_drive_pulse(qubit, duration=200)) - sequence.append(Delay(4, platform.qubits[qubit].drive.name)) - sequence.append(platform.create_qubit_drive_pulse(qubit, duration=400)) - sequence.append(Delay(808, platform.qubits[qubit].readout.name)) - sequence.append(platform.create_qubit_readout_pulse(qubit)) + sequence.extend(platform.create_RX_pulse(qubit_id)) + sequence[qubit.drive.name].append(Delay(duration=4)) + sequence.extend(platform.create_RX_pulse(qubit_id)) + sequence[qubit.drive.name].append(Delay(duration=4)) + sequence.extend(platform.create_RX_pulse(qubit_id)) + sequence[qubit.measure.name].append(Delay(duration=808)) + sequence.extend(platform.create_MZ_pulse(qubit_id)) platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=nshots)) @@ -291,13 +326,13 @@ def test_platform_execute_multiple_drive_pulses_one_readout_no_spacing( """Multiple qubit drive pulses and one readout pulse with no spacing between them.""" platform = qpu_platform - qubit = next(iter(platform.qubits)) + qubit_id, qubit = next(iter(platform.qubits.items())) sequence = PulseSequence() - sequence.append(platform.create_qubit_drive_pulse(qubit, duration=200)) - sequence.append(platform.create_qubit_drive_pulse(qubit, duration=200)) - sequence.append(platform.create_qubit_drive_pulse(qubit, duration=400)) - sequence.append(Delay(800, platform.qubits[qubit].readout.name)) - sequence.append(platform.create_qubit_readout_pulse(qubit)) + sequence.extend(platform.create_RX_pulse(qubit_id)) + sequence.extend(platform.create_RX_pulse(qubit_id)) + sequence.extend(platform.create_RX_pulse(qubit_id)) + sequence[qubit.measure.name].append(Delay(duration=800)) + sequence.extend(platform.create_MZ_pulse(qubit_id)) platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=nshots)) @@ -306,15 +341,16 @@ def test_platform_execute_multiple_overlaping_drive_pulses_one_readout( qpu_platform, ): """Multiple overlapping qubit drive pulses and one readout pulse.""" - # TODO: This requires defining different logical channels on the same qubit platform = qpu_platform - qubit = next(iter(platform.qubits)) + qubit_id, qubit = next(iter(platform.qubits.items())) sequence = PulseSequence() - sequence.append(platform.create_qubit_drive_pulse(qubit, duration=200)) - sequence.append(platform.create_qubit_drive_pulse(qubit, duration=200)) - sequence.append(platform.create_qubit_drive_pulse(qubit, duration=400)) - sequence.append(Delay(800, platform.qubits[qubit].readout.name)) - sequence.append(platform.create_qubit_readout_pulse(qubit)) + pulse = Pulse( + duration=200, amplitude=0.08, envelope=Gaussian(7), type=PulseType.DRIVE + ) + sequence[qubit.drive.name].append(pulse) + sequence[qubit.drive12.name].append(pulse.copy()) + sequence[qubit.measure.name].append(Delay(duration=800)) + sequence.extend(platform.create_MZ_pulse(qubit_id)) platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=nshots)) @@ -322,21 +358,19 @@ def test_platform_execute_multiple_overlaping_drive_pulses_one_readout( def test_platform_execute_multiple_readout_pulses(qpu_platform): """Multiple readout pulses.""" platform = qpu_platform - qubit = next(iter(platform.qubits)) + qubit_id, qubit = next(iter(platform.qubits.items())) sequence = PulseSequence() - qd_pulse1 = platform.create_qubit_drive_pulse(qubit, duration=200) - ro_pulse1 = platform.create_qubit_readout_pulse(qubit) - qd_pulse2 = platform.create_qubit_drive_pulse(qubit, duration=400) - ro_pulse2 = platform.create_qubit_readout_pulse(qubit) - sequence.append(qd_pulse1) - sequence.append(Delay(200, platform.qubits[qubit].readout.name)) - sequence.append(ro_pulse1) - sequence.append(Delay(200 + ro_pulse1.duration, platform.qubits[qubit].drive.name)) - sequence.append(qd_pulse2) - sequence.append( - Delay(200 + ro_pulse1.duration + 400, platform.qubits[qubit].readout.name) - ) - sequence.append(ro_pulse2) + qd_seq1 = platform.create_RX_pulse(qubit_id) + ro_seq1 = platform.create_MZ_pulse(qubit_id) + qd_seq2 = platform.create_RX_pulse(qubit_id) + ro_seq2 = platform.create_MZ_pulse(qubit_id) + sequence.extend(qd_seq1) + sequence[qubit.measure.name].append(Delay(duration=qd_seq1.duration)) + sequence.extend(ro_seq1) + sequence[qubit.drive.name].append(Delay(duration=ro_seq1.duration)) + sequence.extend(qd_seq2) + sequence[qubit.measure.name].append(Delay(duration=qd_seq2.duration)) + sequence.extend(ro_seq2) platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=nshots)) @@ -347,21 +381,19 @@ def test_platform_execute_multiple_readout_pulses(qpu_platform): ) def test_excited_state_probabilities_pulses(qpu_platform): platform = qpu_platform - qubits = [q for q, qb in platform.qubits.items() if qb.drive is not None] backend = QibolabBackend(platform) sequence = PulseSequence() - for qubit in qubits: - qd_pulse = platform.create_RX_pulse(qubit) - ro_pulse = platform.create_MZ_pulse(qubit) - sequence.append(qd_pulse) - sequence.append(Delay(qd_pulse.duration, platform.qubits[qubit].readout.name)) - sequence.append(ro_pulse) + for qubit_id, qubit in platform.qubits.items(): + sequence.extend(platform.create_RX_pulse(qubit_id)) + sequence[qubit.measure.name].append(Delay(duration=sequence.duration)) + sequence.extend(platform.create_MZ_pulse(qubit_id)) result = platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=5000)) - nqubits = len(qubits) + nqubits = len(platform.qubits) cr = CircuitResult(backend, Circuit(nqubits), result, nshots=5000) probs = [ - backend.circuit_result_probabilities(cr, qubits=[qubit]) for qubit in qubits + backend.circuit_result_probabilities(cr, qubits=[qubit]) + for qubit in platform.qubits ] warnings.warn(f"Excited state probabilities: {probs}") target_probs = np.zeros((nqubits, 2)) @@ -377,26 +409,24 @@ def test_excited_state_probabilities_pulses(qpu_platform): ) def test_ground_state_probabilities_pulses(qpu_platform, start_zero): platform = qpu_platform - qubits = [q for q, qb in platform.qubits.items() if qb.drive is not None] backend = QibolabBackend(platform) sequence = PulseSequence() - for qubit in qubits: + for qubit_id, qubit in platform.qubits.items(): if not start_zero: - qd_pulse = platform.create_RX_pulse(qubit) - sequence.append( + sequence[qubit.measure.name].append( Delay( - duration=qd_pulse.duration, + duration=platform.create_RX_pulse(qubit_id).duration, channel=platform.qubits[qubit].readout.name, ) ) - ro_pulse = platform.create_MZ_pulse(qubit) - sequence.append(ro_pulse) + sequence.extend(platform.create_MZ_pulse(qubit_id)) result = platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=5000)) - nqubits = len(qubits) + nqubits = len(platform.qubits) cr = CircuitResult(backend, Circuit(nqubits), result, nshots=5000) probs = [ - backend.circuit_result_probabilities(cr, qubits=[qubit]) for qubit in qubits + backend.circuit_result_probabilities(cr, qubits=[qubit]) + for qubit in platform.qubits ] warnings.warn(f"Ground state probabilities: {probs}") target_probs = np.zeros((nqubits, 2)) From f4a8e261b3c3d5725360e8779ab59742b2aa7217 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Thu, 4 Jul 2024 10:38:34 +0400 Subject: [PATCH 0321/1006] remove reference to Port --- src/qibolab/instruments/icarusqfpga.py | 3 +-- src/qibolab/instruments/qblox/port.py | 4 +--- src/qibolab/instruments/rfsoc/driver.py | 3 +-- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/qibolab/instruments/icarusqfpga.py b/src/qibolab/instruments/icarusqfpga.py index 2dbc92a462..6fad489a88 100644 --- a/src/qibolab/instruments/icarusqfpga.py +++ b/src/qibolab/instruments/icarusqfpga.py @@ -13,7 +13,6 @@ ExecutionParameters, ) from qibolab.instruments.abstract import Controller -from qibolab.instruments.port import Port from qibolab.pulses import Pulse, PulseSequence, PulseType from qibolab.qubits import Qubit, QubitId from qibolab.result import IntegratedResults, SampleResults @@ -25,7 +24,7 @@ @dataclass -class RFSOCPort(Port): +class RFSOCPort: name: str dac: int = None adc: int = None diff --git a/src/qibolab/instruments/qblox/port.py b/src/qibolab/instruments/qblox/port.py index c83cf391e3..9eb19f9572 100644 --- a/src/qibolab/instruments/qblox/port.py +++ b/src/qibolab/instruments/qblox/port.py @@ -3,8 +3,6 @@ import numpy as np from qibo.config import log, raise_error -from qibolab.instruments.port import Port - FREQUENCY_LIMIT = 500e6 MAX_OFFSET = 2.5 MIN_PULSE_DURATION = 4 @@ -29,7 +27,7 @@ class QbloxInputPort_Settings: hardware_demod_en: bool = True -class QbloxOutputPort(Port): +class QbloxOutputPort: """qibolab.instruments.port.Port interface implementation for Qblox instruments.""" diff --git a/src/qibolab/instruments/rfsoc/driver.py b/src/qibolab/instruments/rfsoc/driver.py index 3cad39f7cc..241b5ee2a8 100644 --- a/src/qibolab/instruments/rfsoc/driver.py +++ b/src/qibolab/instruments/rfsoc/driver.py @@ -13,7 +13,6 @@ from qibolab import AcquisitionType, AveragingMode, ExecutionParameters from qibolab.couplers import Coupler from qibolab.instruments.abstract import Controller -from qibolab.instruments.port import Port from qibolab.pulses import PulseSequence, PulseType from qibolab.qubits import Qubit from qibolab.result import AveragedSampleResults, IntegratedResults, SampleResults @@ -26,7 +25,7 @@ @dataclass -class RFSoCPort(Port): +class RFSoCPort: """Port object of the RFSoC.""" name: int From af4312e75fa4f82ecebf831e701a76aa7ca32dc7 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Fri, 12 Jul 2024 15:10:33 +0400 Subject: [PATCH 0322/1006] update to new pulse sequence format --- src/qibolab/unrolling.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/qibolab/unrolling.py b/src/qibolab/unrolling.py index 273b7043fe..11d58ce2ee 100644 --- a/src/qibolab/unrolling.py +++ b/src/qibolab/unrolling.py @@ -5,6 +5,7 @@ from dataclasses import asdict, dataclass, field, fields from functools import total_ordering +from itertools import chain from .pulses import Pulse, PulseSequence from .pulses.envelope import Rectangular @@ -21,7 +22,7 @@ def _waveform(sequence: PulseSequence): if isinstance(pulse, Pulse) else 1 ) - for pulse in sequence + for pulse in chain(*sequence.values()) ) From be3a119cbfa1e1b1a7a3b522bf287482dcbb7cb9 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Fri, 12 Jul 2024 17:45:39 +0400 Subject: [PATCH 0323/1006] introduce concept of gate factories --- src/qibolab/native.py | 101 ++++++++++++++++++++++++++++++++------- src/qibolab/qubits.py | 9 +++- src/qibolab/serialize.py | 27 ++++++----- 3 files changed, 106 insertions(+), 31 deletions(-) diff --git a/src/qibolab/native.py b/src/qibolab/native.py index 1c7c3f44de..2dbdcb81e0 100644 --- a/src/qibolab/native.py +++ b/src/qibolab/native.py @@ -1,28 +1,93 @@ from dataclasses import dataclass, field, fields from typing import Optional -from .pulses import Pulse, PulseSequence +import numpy as np + +from .pulses import Drag, Gaussian, PulseSequence from .serialize_ import replace +def _normalize_angles(theta, phi): + """Normalize theta to (-pi, pi], and phi to [0, 2*pi).""" + theta = theta % (2 * np.pi) + theta = theta - 2 * np.pi * (theta > np.pi) + phi = phi % (2 * np.pi) + return theta, phi + + +class RxyFactory: + """Factory for pulse sequences that generate single-qubit rotations around + an axis in xy plane. + + It is assumed that the underlying sequence contains only a single pulse. + It is assumed that the base sequence corresponds to a calibrated pi rotation around X axis. + Other rotation angles are achieved by scaling the amplitude, assuming a linear transfer function. + + Args: + sequence: The base sequence for the factory. + """ + + def __init__(self, sequence: PulseSequence): + if len(sequence) != 1: + raise ValueError( + f"Incompatible number of channels: {len(sequence)}. " + f"{self.__class__} expects a sequence on exactly one channel." + ) + + pulses = next(iter(sequence.values())) + if len(pulses) != 1: + raise ValueError( + f"Incompatible number of pulses: {len(pulses)}. " + f"{self.__class__} expects a sequence with exactly one pulse." + ) + + pulse = pulses[0] + expected_envelopes = (Gaussian, Drag) + if not isinstance(pulse.envelope, expected_envelopes): + raise ValueError( + f"Incompatible pulse envelope: {pulse.envelope.__class__}. " + f"{self.__class__} expects {expected_envelopes} envelope." + ) + + self._seq = sequence + + def create_sequence(self, theta: float, phi: float) -> PulseSequence: + """Create a sequence for single-qubit rotation. + + Args: + theta: the angle of rotation. + phi: the angle that rotation axis forms with x axis. + """ + theta, phi = _normalize_angles(theta, phi) + seq = self._seq.copy() + channel = next(iter(seq.keys())) + pulse = seq[channel][0] + new_amplitude = pulse.amplitude * theta / np.pi + seq[channel][0] = replace(pulse, amplitude=new_amplitude, relative_phase=phi) + return seq + + +class FixedSequenceFactory: + """Simple factory for a fixed arbitrary sequence.""" + + def __init__(self, sequence: PulseSequence): + self._seq = sequence + + def create_sequence(self) -> PulseSequence: + return self._seq.copy() + + @dataclass class SingleQubitNatives: """Container with the native single-qubit gates acting on a specific qubit.""" - RX: Optional[PulseSequence] = None + RX: Optional[RxyFactory] = None """Pulse to drive the qubit from state 0 to state 1.""" - RX12: Optional[PulseSequence] = None + RX12: Optional[FixedSequenceFactory] = None """Pulse to drive to qubit from state 1 to state 2.""" - MZ: Optional[PulseSequence] = None + MZ: Optional[FixedSequenceFactory] = None """Measurement pulse.""" - CP: Optional[PulseSequence] = None - """Pulse to activate a coupler.""" - - @property - def RX90(self) -> Pulse: - """RX90 native pulse is inferred from RX by halving its amplitude.""" - return replace(self.RX, amplitude=self.RX.amplitude / 2.0) @dataclass @@ -30,14 +95,14 @@ class TwoQubitNatives: """Container with the native two-qubit gates acting on a specific pair of qubits.""" - CZ: PulseSequence = field( - default_factory=lambda: PulseSequence(), metadata={"symmetric": True} + CZ: Optional[FixedSequenceFactory] = field( + default=None, metadata={"symmetric": True} ) - CNOT: PulseSequence = field( - default_factory=lambda: PulseSequence(), metadata={"symmetric": False} + CNOT: Optional[FixedSequenceFactory] = field( + default=None, metadata={"symmetric": False} ) - iSWAP: PulseSequence = field( - default_factory=lambda: PulseSequence(), metadata={"symmetric": True} + iSWAP: Optional[FixedSequenceFactory] = field( + default=None, metadata={"symmetric": True} ) @property @@ -45,6 +110,6 @@ def symmetric(self): """Check if the defined two-qubit gates are symmetric between target and control qubits.""" return all( - fld.metadata["symmetric"] or len(getattr(self, fld.name)) == 0 + fld.metadata["symmetric"] or getattr(self, fld.name) is None for fld in fields(self) ) diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index bb8fe019a5..fe4ee25aa3 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -15,7 +15,14 @@ Not all channels are required to operate a qubit. """ -EXCLUDED_FIELDS = CHANNEL_NAMES + ("name", "native_gates", "kernel", "flux") +EXCLUDED_FIELDS = CHANNEL_NAMES + ( + "name", + "native_gates", + "kernel", + "qubit1", + "qubit2", + "coupler", +) """Qubit dataclass fields that are excluded by the ``characterization`` property.""" diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index 894297a3c9..743fb54f92 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -13,7 +13,12 @@ from qibolab.components import Config from qibolab.couplers import Coupler from qibolab.kernels import Kernels -from qibolab.native import SingleQubitNatives, TwoQubitNatives +from qibolab.native import ( + FixedSequenceFactory, + RxyFactory, + SingleQubitNatives, + TwoQubitNatives, +) from qibolab.platform.platform import ( CouplerMap, InstrumentMap, @@ -124,7 +129,11 @@ def _load_single_qubit_natives(gates) -> SingleQubitNatives: """ return SingleQubitNatives( **{ - gate_name: _load_sequence(raw_sequence) + gate_name: ( + RxyFactory(_load_sequence(raw_sequence)) + if gate_name == "RX" + else FixedSequenceFactory(_load_sequence(raw_sequence)) + ) for gate_name, raw_sequence in gates.items() } ) @@ -133,7 +142,7 @@ def _load_single_qubit_natives(gates) -> SingleQubitNatives: def _load_two_qubit_natives(gates) -> TwoQubitNatives: return TwoQubitNatives( **{ - gate_name: _load_sequence(raw_sequence) + gate_name: FixedSequenceFactory(_load_sequence(raw_sequence)) for gate_name, raw_sequence in gates.items() } ) @@ -215,9 +224,9 @@ def _dump_sequence(sequence: PulseSequence): def _dump_natives(natives: Union[SingleQubitNatives, TwoQubitNatives]): data = {} for fld in fields(natives): - seq = getattr(natives, fld.name) - if seq is not None: - data[fld.name] = _dump_sequence(seq) + factory = getattr(natives, fld.name) + if factory is not None: + data[fld.name] = _dump_sequence(factory._seq) return data @@ -234,12 +243,6 @@ def dump_native_gates( } } - if couplers: - native_gates["coupler"] = { - dump_qubit_name(c): _dump_natives(coupler.native_gates) - for c, coupler in couplers.items() - } - # two-qubit native gates native_gates["two_qubit"] = {} for pair in pairs.values(): From 1ad24882d7d5b4f0bc39ac649e8f4667f40c4069 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Fri, 12 Jul 2024 17:46:40 +0400 Subject: [PATCH 0324/1006] remove redundant methods --- src/qibolab/platform/platform.py | 68 +------------------------------- 1 file changed, 1 insertion(+), 67 deletions(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 1e49cfd3c0..2a918296df 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -13,7 +13,7 @@ from qibolab.couplers import Coupler from qibolab.execution_parameters import ExecutionParameters from qibolab.instruments.abstract import Controller, Instrument, InstrumentId -from qibolab.pulses import Delay, Drag, PulseSequence, PulseType +from qibolab.pulses import Delay, PulseSequence, PulseType from qibolab.qubits import Qubit, QubitId, QubitPair, QubitPairId from qibolab.serialize_ import replace from qibolab.sweeper import ParallelSweepers @@ -361,69 +361,3 @@ def get_coupler(self, coupler): return self.couplers[coupler] except KeyError: return list(self.couplers.values())[coupler] - - def create_RX90_pulse(self, qubit): - qubit = self.get_qubit(qubit) - return qubit.native_gates.RX90.copy() - - def create_RX_pulse(self, qubit): - qubit = self.get_qubit(qubit) - return qubit.native_gates.RX.copy() - - def create_RX12_pulse(self, qubit): - qubit = self.get_qubit(qubit) - return qubit.native_gates.RX12.copy() - - def create_CZ_pulse_sequence(self, qubits): - pair = tuple(self.get_qubit(q).name for q in qubits) - if pair not in self.pairs or len(self.pairs[pair].native_gates.CZ) == 0: - raise_error( - ValueError, - f"Calibration for CZ gate between qubits {qubits[0]} and {qubits[1]} not found.", - ) - return self.pairs[pair].native_gates.CZ - - def create_iSWAP_pulse_sequence(self, qubits): - pair = tuple(self.get_qubit(q).name for q in qubits) - if pair not in self.pairs or len(self.pairs[pair].native_gates.iSWAP) == 0: - raise_error( - ValueError, - f"Calibration for iSWAP gate between qubits {qubits[0]} and {qubits[1]} not found.", - ) - return self.pairs[pair].native_gates.iSWAP - - def create_CNOT_pulse_sequence(self, qubits): - pair = tuple(self.get_qubit(q).name for q in qubits) - if pair not in self.pairs or len(self.pairs[pair].native_gates.CNOT) == 0: - raise_error( - ValueError, - f"Calibration for CNOT gate between qubits {qubits[0]} and {qubits[1]} not found.", - ) - return self.pairs[pair].native_gates.CNOT - - def create_MZ_pulse(self, qubit): - qubit = self.get_qubit(qubit) - return qubit.native_gates.MZ - - # TODO Remove RX90_drag_pulse and RX_drag_pulse, replace them with create_qubit_drive_pulse - # TODO Add RY90 and RY pulses - - def create_RX90_drag_pulse(self, qubit, beta, relative_phase=0): - """Create native RX90 pulse with Drag shape.""" - qubit = self.get_qubit(qubit) - pulse = qubit.native_gates.RX90 - return replace( - pulse, - relative_phase=relative_phase, - envelope=Drag(rel_sigma=pulse.envelope.rel_sigma, beta=beta), - ) - - def create_RX_drag_pulse(self, qubit, beta, relative_phase=0): - """Create native RX pulse with Drag shape.""" - qubit = self.get_qubit(qubit) - pulse = qubit.native_gates.RX - return replace( - pulse, - relative_phase=relative_phase, - envelope=Drag(rel_sigma=pulse.envelope.rel_sigma, beta=beta), - ) From 34c6a3e576edbad547f028d5f8080ed86f7275e2 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Fri, 12 Jul 2024 17:49:25 +0400 Subject: [PATCH 0325/1006] update compiler --- src/qibolab/backends.py | 2 +- src/qibolab/compilers/compiler.py | 27 ++++++++++++++++---------- src/qibolab/compilers/default.py | 32 +++++++++++++++++-------------- 3 files changed, 36 insertions(+), 25 deletions(-) diff --git a/src/qibolab/backends.py b/src/qibolab/backends.py index e3016e7b50..f76e5b1103 100644 --- a/src/qibolab/backends.py +++ b/src/qibolab/backends.py @@ -69,7 +69,7 @@ def assign_measurements(self, measurement_map, readout): containing the readout measurement shots. This is created in ``execute_circuit``. """ for gate, sequence in measurement_map.items(): - _samples = (readout[pulse.id].samples for pulse in sequence) + _samples = (readout[pulse.id].samples for pulse in sequence.ro_pulses) samples = list(filter(lambda x: x is not None, _samples)) gate.result.backend = self gate.result.register_samples(np.array(samples).T) diff --git a/src/qibolab/compilers/compiler.py b/src/qibolab/compilers/compiler.py index 0537cee61d..b6342c9050 100644 --- a/src/qibolab/compilers/compiler.py +++ b/src/qibolab/compilers/compiler.py @@ -135,6 +135,12 @@ def compile(self, circuit, platform): sequence (qibolab.pulses.PulseSequence): Pulse sequence that implements the circuit. measurement_map (dict): Map from each measurement gate to the sequence of readout pulse implementing it. """ + ch_to_qb = { + ch.name: qubit_id + for qubit_id, qubit in platform.qubits.items() + for ch in qubit.channels + } + sequence = PulseSequence() # FIXME: This will not work with qubits that have string names # TODO: Implement a mapping between circuit qubit ids and platform ``Qubit``s @@ -150,17 +156,18 @@ def compile(self, circuit, platform): qubit_clock[qubit] += gate.delay continue + delay_sequence = PulseSequence() gate_sequence = self.get_sequence(gate, platform) - for pulse in gate_sequence: - if qubit_clock[pulse.qubit] > channel_clock[pulse.qubit]: - delay = qubit_clock[pulse.qubit] - channel_clock[pulse.channel] - sequence.append(Delay(duration=delay, channel=pulse.channel)) - channel_clock[pulse.channel] += delay - - sequence.append(pulse) - # update clocks - qubit_clock[pulse.qubit] += pulse.duration - channel_clock[pulse.channel] += pulse.duration + for ch in gate_sequence.keys(): + qubit = ch_to_qb[ch] + if (delay := qubit_clock[qubit] - channel_clock[ch]) > 0: + delay_sequence[ch].append(Delay(duration=delay)) + channel_clock[ch] += delay + channel_duration = gate_sequence.channel_duration(ch) + qubit_clock[qubit] += channel_duration + channel_clock[ch] += channel_duration + sequence.extend(delay_sequence) + sequence.extend(gate_sequence) # register readout sequences to ``measurement_map`` so that we can # properly map acquisition results to measurement gates diff --git a/src/qibolab/compilers/default.py b/src/qibolab/compilers/default.py index 1ce546d061..bf25bed70d 100644 --- a/src/qibolab/compilers/default.py +++ b/src/qibolab/compilers/default.py @@ -5,8 +5,9 @@ import math +import numpy as np + from qibolab.pulses import PulseSequence, VirtualZ -from qibolab.serialize_ import replace def identity_rule(gate, qubit): @@ -16,32 +17,32 @@ def identity_rule(gate, qubit): def z_rule(gate, qubit): """Z gate applied virtually.""" - return PulseSequence([VirtualZ(phase=math.pi)]) + seq = PulseSequence() + seq[qubit.drive.name].append(VirtualZ(phase=math.pi)) + return seq def rz_rule(gate, qubit): """RZ gate applied virtually.""" - return PulseSequence([VirtualZ(phase=gate.parameters[0])]) + seq = PulseSequence() + seq[qubit.drive.name].append(VirtualZ(phase=gate.parameters[0])) + return seq def gpi2_rule(gate, qubit): """Rule for GPI2.""" - theta = gate.parameters[0] - pulse = replace(qubit.native_gates.RX90, relative_phase=theta) - sequence = PulseSequence([pulse]) - return sequence + return qubit.native_gates.RX.create_sequence( + theta=np.pi / 2, phi=gate.parameters[0] + ) def gpi_rule(gate, qubit): """Rule for GPI.""" - theta = gate.parameters[0] # the following definition has a global phase difference compare to # to the matrix representation. See # https://github.com/qiboteam/qibolab/pull/804#pullrequestreview-1890205509 # for more detail. - pulse = replace(qubit.native_gates.RX, relative_phase=theta) - sequence = PulseSequence([pulse]) - return sequence + return qubit.native_gates.RX.create_sequence(theta=np.pi, phi=gate.parameters[0]) def cz_rule(gate, pair): @@ -50,14 +51,17 @@ def cz_rule(gate, pair): Applying the CZ gate may involve sending pulses on qubits that the gate is not directly acting on. """ - return pair.native_gates.CZ + return pair.native_gates.CZ.create_sequence() def cnot_rule(gate, pair): """CNOT applied as defined in the platform runcard.""" - return pair.native_gates.CNOT + return pair.native_gates.CNOT.create_sequence() def measurement_rule(gate, qubits): """Measurement gate applied using the platform readout pulse.""" - return PulseSequence([qubit.native_gates.MZ for qubit in qubits]) + seq = PulseSequence() + for qubit in qubits: + seq.extend(qubit.native_gates.MZ.create_sequence()) + return seq From 2281787e065eefd47f2f5c8ca6ecfcfadc221d17 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Mon, 15 Jul 2024 10:30:58 +0400 Subject: [PATCH 0326/1006] remove obsolete property _ports --- src/qibolab/instruments/abstract.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/qibolab/instruments/abstract.py b/src/qibolab/instruments/abstract.py index b73c5cf6d3..209db0769b 100644 --- a/src/qibolab/instruments/abstract.py +++ b/src/qibolab/instruments/abstract.py @@ -55,7 +55,6 @@ class Controller(Instrument): def __init__(self, name, address): super().__init__(name, address) - self._ports = {} self.bounds: Bounds = Bounds(0, 0, 0) """Estimated limitations of the device memory.""" From 6c15dcaa0d3482f1ccd1aca29acf0d671178f2d2 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Mon, 15 Jul 2024 10:31:34 +0400 Subject: [PATCH 0327/1006] temporarily disable pylint check --- src/qibolab/instruments/icarusqfpga.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/qibolab/instruments/icarusqfpga.py b/src/qibolab/instruments/icarusqfpga.py index 6fad489a88..4c412e9dd5 100644 --- a/src/qibolab/instruments/icarusqfpga.py +++ b/src/qibolab/instruments/icarusqfpga.py @@ -89,6 +89,8 @@ def play( # We iterate over the seuence of pulses and generate the waveforms for each type of pulses for pulse in sequence.pulses: + # pylint: disable=no-member + # FIXME: ignore complaint about non-existent ports and _ports properties, until we upgrade this driver to qibolab 0.2 if pulse.channel not in self._ports: continue From ed9a17455c40d46102a3e7a1c9aa7b7aa439e291 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Mon, 15 Jul 2024 11:45:05 +0400 Subject: [PATCH 0328/1006] update zhinst tests --- tests/test_instruments_zhinst.py | 707 ++++++++++--------------------- 1 file changed, 223 insertions(+), 484 deletions(-) diff --git a/tests/test_instruments_zhinst.py b/tests/test_instruments_zhinst.py index b41be56e66..16f04a7b6a 100644 --- a/tests/test_instruments_zhinst.py +++ b/tests/test_instruments_zhinst.py @@ -1,21 +1,13 @@ -import math -from collections import defaultdict - import laboneq.dsl.experiment.pulse as laboneq_pulse import laboneq.simple as lo import numpy as np import pytest from qibolab import AcquisitionType, AveragingMode, ExecutionParameters, create_platform -from qibolab.instruments.zhinst import ( - ProcessedSweeps, - ZhPulse, - Zurich, - acquire_channel_name, - classify_sweepers, - measure_channel_name, -) +from qibolab.instruments.zhinst import ProcessedSweeps, Zurich, classify_sweepers +from qibolab.instruments.zhinst.pulse import select_pulse from qibolab.pulses import ( + Delay, Drag, Gaussian, Iir, @@ -92,9 +84,9 @@ ), ], ) -def test_zhpulse_pulse_conversion(pulse): +def test_pulse_conversion(pulse): shape = pulse.shape - zhpulse = ZhPulse(pulse).zhpulse + zhpulse = select_pulse(pulse) assert isinstance(zhpulse, laboneq_pulse.Pulse) if isinstance(shape, (Snz, Iir)): assert len(zhpulse.samples) == 80 @@ -102,68 +94,29 @@ def test_zhpulse_pulse_conversion(pulse): assert zhpulse.length == 40e-9 -def test_zhpulse_add_sweeper(): - pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Gaussian(5), "ch", qubit=0) - zhpulse = ZhPulse(pulse) - assert zhpulse.zhsweepers == [] - assert zhpulse.delay_sweeper is None - - zhpulse.add_sweeper( - Parameter.duration, lo.SweepParameter(values=np.array([1, 2, 3])) - ) - assert len(zhpulse.zhsweepers) == 1 - assert zhpulse.delay_sweeper is None - - zhpulse.add_sweeper( - Parameter.start, lo.SweepParameter(values=np.array([4, 5, 6, 7])) - ) - assert len(zhpulse.zhsweepers) == 1 - assert zhpulse.delay_sweeper is not None - - zhpulse.add_sweeper( - Parameter.amplitude, lo.SweepParameter(values=np.array([3, 2, 1, 0])) - ) - assert len(zhpulse.zhsweepers) == 2 - assert zhpulse.delay_sweeper is not None - - -def test_measure_channel_name(dummy_qrc): - platform = create_platform("zurich") - qubits = platform.qubits.values() - meas_ch_names = {measure_channel_name(q) for q in qubits} - assert len(qubits) > 0 - assert len(meas_ch_names) == len(qubits) - - -def test_acquire_channel_name(dummy_qrc): - platform = create_platform("zurich") - qubits = platform.qubits.values() - acq_ch_names = {acquire_channel_name(q) for q in qubits} - assert len(qubits) > 0 - assert len(acq_ch_names) == len(qubits) - - def test_classify_sweepers(dummy_qrc): platform = create_platform("zurich") - qubit_id, qubit = 0, platform.qubits[0] - pulse_1 = Pulse(0, 40, 0.05, int(3e9), 0.0, Gaussian(5), "ch0", qubit=qubit_id) + qubit = platform.qubits[0] + pulse_1 = Pulse( + duration=40, + amplitude=0.05, + envelope=Gaussian(rel_sigma=5), + type=PulseType.DRIVE, + ) pulse_2 = Pulse( - 0, - 40, - 0.05, - int(3e9), - 0.0, - Rectangular(), - "ch7", - PulseType.READOUT, - qubit=qubit_id, + duration=40, + amplitude=0.05, + envelope=Rectangular(), + type=PulseType.READOUT, ) amplitude_sweeper = Sweeper(Parameter.amplitude, np.array([1, 2, 3]), [pulse_1]) readout_amplitude_sweeper = Sweeper( Parameter.amplitude, np.array([1, 2, 3, 4, 5]), [pulse_2] ) freq_sweeper = Sweeper(Parameter.frequency, np.array([4, 5, 6, 7]), [pulse_1]) - bias_sweeper = Sweeper(Parameter.bias, np.array([3, 2, 1]), qubits=[qubit]) + bias_sweeper = Sweeper( + Parameter.bias, np.array([3, 2, 1]), channels=[qubit.flux.name] + ) nt_sweeps, rt_sweeps = classify_sweepers( [amplitude_sweeper, readout_amplitude_sweeper, bias_sweeper, freq_sweeper] ) @@ -176,20 +129,27 @@ def test_classify_sweepers(dummy_qrc): def test_processed_sweeps_pulse_properties(dummy_qrc): platform = create_platform("zurich") - qubit_id_1, qubit_1 = 0, platform.qubits[0] - qubit_id_2, qubit_2 = 3, platform.qubits[3] + zi_instrument = platform.instruments["EL_ZURO"] pulse_1 = Pulse( - 0, 40, 0.05, int(3e9), 0.0, Gaussian(5), qubit_1.drive.name, qubit=qubit_id_1 + duration=40, + amplitude=0.05, + envelope=Gaussian(rel_sigma=5), + type=PulseType.DRIVE, ) pulse_2 = Pulse( - 0, 40, 0.05, int(3e9), 0.0, Gaussian(5), qubit_2.drive.name, qubit=qubit_id_2 + duration=40, + amplitude=0.05, + envelope=Gaussian(rel_sigma=5), + type=PulseType.DRIVE, ) sweeper_amplitude = Sweeper( Parameter.amplitude, np.array([1, 2, 3]), [pulse_1, pulse_2] ) sweeper_duration = Sweeper(Parameter.duration, np.array([1, 2, 3, 4]), [pulse_2]) processed_sweeps = ProcessedSweeps( - [sweeper_duration, sweeper_amplitude], qubits=platform.qubits + [sweeper_duration, sweeper_amplitude], + zi_instrument.channels.values(), + platform.component_configs, ) assert len(processed_sweeps.sweeps_for_pulse(pulse_1)) == 1 @@ -221,66 +181,34 @@ def test_processed_sweeps_pulse_properties(dummy_qrc): assert processed_sweeps.channels_with_sweeps() == set() -def test_processed_sweeps_frequency(dummy_qrc): - platform = create_platform("zurich") - qubit_id, qubit = 1, platform.qubits[1] - pulse = Pulse( - 0, 40, 0.05, int(3e9), 0.0, Gaussian(5), qubit.drive.name, qubit=qubit_id - ) - freq_sweeper = Sweeper(Parameter.frequency, np.array([1, 2, 3]), [pulse]) - processed_sweeps = ProcessedSweeps([freq_sweeper], platform.qubits) - - # Frequency sweepers should result into channel property sweeps - assert len(processed_sweeps.sweeps_for_pulse(pulse)) == 0 - assert processed_sweeps.channels_with_sweeps() == {qubit.drive.name} - assert len(processed_sweeps.sweeps_for_channel(qubit.drive.name)) == 1 - - with pytest.raises(ValueError): - flux_pulse = Pulse( - 0, - 40, - 0.05, - int(3e9), - 0.0, - Gaussian(5), - qubit.flux.name, - PulseType.FLUX, - qubit=qubit_id, - ) - freq_sweeper = Sweeper( - Parameter.frequency, np.array([1, 3, 5, 7]), [flux_pulse] - ) - ProcessedSweeps([freq_sweeper], platform.qubits) - - -def test_processed_sweeps_readout_amplitude(dummy_qrc): - platform = create_platform("zurich") - qubit_id, qubit = 0, platform.qubits[0] - readout_ch = measure_channel_name(qubit) - pulse_readout = Pulse( - 0, - 40, - 0.05, - int(3e9), - 0.0, - Rectangular(), - readout_ch, - PulseType.READOUT, - qubit_id, - ) - readout_amplitude_sweeper = Sweeper( - Parameter.amplitude, np.array([1, 2, 3, 4]), [pulse_readout] - ) - processed_sweeps = ProcessedSweeps( - [readout_amplitude_sweeper], qubits=platform.qubits - ) - - # Readout amplitude should result into channel property (gain) sweep - assert len(processed_sweeps.sweeps_for_pulse(pulse_readout)) == 0 - assert processed_sweeps.channels_with_sweeps() == { - readout_ch, - } - assert len(processed_sweeps.sweeps_for_channel(readout_ch)) == 1 +# def test_processed_sweeps_readout_amplitude(dummy_qrc): +# platform = create_platform("zurich") +# qubit_id, qubit = 0, platform.qubits[0] +# readout_ch = measure_channel_name(qubit) +# pulse_readout = Pulse( +# 0, +# 40, +# 0.05, +# int(3e9), +# 0.0, +# Rectangular(), +# readout_ch, +# PulseType.READOUT, +# qubit_id, +# ) +# readout_amplitude_sweeper = Sweeper( +# Parameter.amplitude, np.array([1, 2, 3, 4]), [pulse_readout] +# ) +# processed_sweeps = ProcessedSweeps( +# [readout_amplitude_sweeper], qubits=platform.qubits +# ) +# +# # Readout amplitude should result into channel property (gain) sweep +# assert len(processed_sweeps.sweeps_for_pulse(pulse_readout)) == 0 +# assert processed_sweeps.channels_with_sweeps() == { +# readout_ch, +# } +# assert len(processed_sweeps.sweeps_for_channel(readout_ch)) == 1 def test_zhinst_setup(dummy_qrc): @@ -289,151 +217,40 @@ def test_zhinst_setup(dummy_qrc): assert IQM5q.time_of_flight == 75 -def test_zhsequence(dummy_qrc): - IQM5q = create_platform("zurich") - controller = IQM5q.instruments["EL_ZURO"] - - drive_channel, readout_channel = ( - IQM5q.qubits[0].drive.name, - measure_channel_name(IQM5q.qubits[0]), - ) - qd_pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), drive_channel, qubit=0) - ro_pulse = Pulse( - 0, - 40, - 0.05, - int(3e9), - 0.0, - Rectangular(), - readout_channel, - PulseType.READOUT, - qubit=0, - ) - sequence = PulseSequence() - sequence.append(qd_pulse) - sequence.append(qd_pulse) - sequence.append(ro_pulse) - - zhsequence = controller.sequence_zh(sequence, IQM5q.qubits) - - assert len(zhsequence) == 2 - assert len(zhsequence[drive_channel]) == 2 - assert len(zhsequence[readout_channel]) == 1 - - with pytest.raises(AttributeError): - controller.sequence_zh("sequence", IQM5q.qubits) - - -def test_zhsequence_couplers(dummy_qrc): - IQM5q = create_platform("zurich") - controller = IQM5q.instruments["EL_ZURO"] - - drive_channel, readout_channel = ( - IQM5q.qubits[0].drive.name, - measure_channel_name(IQM5q.qubits[0]), - ) - couplerflux_channel = IQM5q.couplers[0].flux.name - qd_pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), drive_channel, qubit=0) - ro_pulse = Pulse( - 0, - 40, - 0.05, - int(3e9), - 0.0, - Rectangular(), - readout_channel, - PulseType.READOUT, - qubit=0, - ) - qc_pulse = Pulse.flux( - 0, 40, 0.05, Rectangular(), channel=couplerflux_channel, qubit=3 - ) - qc_pulse.type = PulseType.COUPLERFLUX - sequence = PulseSequence() - sequence.append(qd_pulse) - sequence.append(ro_pulse) - sequence.append(qc_pulse) - - zhsequence = controller.sequence_zh(sequence, IQM5q.qubits) - - assert len(zhsequence) == 3 - assert len(zhsequence[couplerflux_channel]) == 1 - - -def test_zhsequence_multiple_ro(dummy_qrc): - platform = create_platform("zurich") - readout_channel = measure_channel_name(platform.qubits[0]) - sequence = PulseSequence() - qd_pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), "ch0", qubit=0) - sequence.append(qd_pulse) - ro_pulse = Pulse( - 0, - 40, - 0.05, - int(3e9), - 0.0, - Rectangular(), - readout_channel, - PulseType.READOUT, - qubit=0, - ) - sequence.append(ro_pulse) - ro_pulse = Pulse( - 0, - 5000, - 0.05, - int(3e9), - 0.0, - Rectangular(), - readout_channel, - PulseType.READOUT, - qubit=0, - ) - sequence.append(ro_pulse) - platform = create_platform("zurich") - - controller = platform.instruments["EL_ZURO"] - zhsequence = controller.sequence_zh(sequence, platform.qubits) - - assert len(zhsequence) == 2 - assert len(zhsequence[readout_channel]) == 2 - - -def test_zhinst_register_readout_line(dummy_qrc): +def test_zhinst_configure_acquire_line(dummy_qrc): platform = create_platform("zurich") IQM5q = platform.instruments["EL_ZURO"] qubit = platform.qubits[0] - options = ExecutionParameters( - relaxation_time=300e-6, - acquisition_type=AcquisitionType.INTEGRATION, - averaging_mode=AveragingMode.CYCLIC, - ) - - IQM5q.register_readout_line(qubit, intermediate_frequency=int(1e6), options=options) + IQM5q.configure_acquire_line(qubit.acquisition.name, platform.component_configs) - assert measure_channel_name(qubit) in IQM5q.signal_map - assert acquire_channel_name(qubit) in IQM5q.signal_map + assert qubit.acquisition.name in IQM5q.signal_map assert ( - "/logical_signal_groups/q0/measure_line" in IQM5q.calibration.calibration_items + "/logical_signal_groups/q0/acquire_line" in IQM5q.calibration.calibration_items ) -def test_zhinst_register_drive_line(dummy_qrc): +def test_zhinst_configure_iq_line(dummy_qrc): platform = create_platform("zurich") IQM5q = platform.instruments["EL_ZURO"] qubit = platform.qubits[0] - IQM5q.register_drive_line(qubit, intermediate_frequency=int(1e6)) + IQM5q.configure_iq_line(qubit.drive.name, platform.component_configs) + IQM5q.configure_iq_line(qubit.measure.name, platform.component_configs) assert qubit.drive.name in IQM5q.signal_map assert "/logical_signal_groups/q0/drive_line" in IQM5q.calibration.calibration_items + assert qubit.measure.name in IQM5q.signal_map + assert ( + "/logical_signal_groups/q0/measure_line" in IQM5q.calibration.calibration_items + ) + -def test_zhinst_register_flux_line(dummy_qrc): +def test_zhinst_configure_dc_line(dummy_qrc): platform = create_platform("zurich") IQM5q = platform.instruments["EL_ZURO"] qubit = platform.qubits[0] - IQM5q.register_flux_line(qubit) + IQM5q.configure_dc_line(qubit.flux.name, platform.component_configs) assert qubit.flux.name in IQM5q.signal_map assert "/logical_signal_groups/q0/flux_line" in IQM5q.calibration.calibration_items @@ -448,21 +265,16 @@ def test_experiment_flow(dummy_qrc): platform.qubits = qubits couplers = {} - ro_pulses = {} - qf_pulses = {} for qubit in qubits.values(): - q = qubit.name - qf_pulses[q] = Pulse.flux( - start=0, - duration=500, - amplitude=1, - shape=Rectangular(), - channel=platform.qubits[q].flux.name, - qubit=q, + sequence[qubit.flux.name].append( + Pulse.flux( + duration=500, + amplitude=1, + envelope=Rectangular(), + ) ) - sequence.append(qf_pulses[q]) - ro_pulses[q] = platform.create_qubit_readout_pulse(q, start=qf_pulses[q].finish) - sequence.append(ro_pulses[q]) + sequence[qubit.measure.name].append(Delay(duration=sequence.duration)) + sequence.extend(qubit.native_gates.MZ.create_sequence()) options = ExecutionParameters( relaxation_time=300e-6, @@ -473,8 +285,8 @@ def test_experiment_flow(dummy_qrc): IQM5q.experiment_flow(qubits, couplers, sequence, options) assert qubits[0].flux.name in IQM5q.experiment.signals - assert measure_channel_name(qubits[0]) in IQM5q.experiment.signals - assert acquire_channel_name(qubits[0]) in IQM5q.experiment.signals + assert qubits[0].measure.name in IQM5q.experiment.signals + assert qubits[0].acquisition.name in IQM5q.experiment.signals def test_experiment_flow_coupler(dummy_qrc): @@ -487,35 +299,26 @@ def test_experiment_flow_coupler(dummy_qrc): couplers = {0: platform.couplers[0]} platform.couplers = couplers - ro_pulses = {} - qf_pulses = {} for qubit in qubits.values(): - q = qubit.name - qf_pulses[q] = Pulse.flux( - start=0, - duration=500, - amplitude=1, - shape=Rectangular(), - channel=platform.qubits[q].flux.name, - qubit=q, + sequence[qubit.flux.name].append( + Pulse.flux( + duration=500, + amplitude=1, + envelope=Rectangular(), + ) ) - sequence.append(qf_pulses[q]) - ro_pulses[q] = platform.create_qubit_readout_pulse(q, start=qf_pulses[q].finish) - sequence.append(ro_pulses[q]) + sequence[qubit.measure.name].append(Delay(duration=sequence.duration)) + sequence.extend(qubit.native_gates.MZ.create_sequence()) - cf_pulses = {} for coupler in couplers.values(): - c = coupler.name - cf_pulses[c] = Pulse.flux( - start=0, - duration=500, - amplitude=1, - shape=Rectangular(), - channel=platform.couplers[c].flux.name, - qubit=c, + sequence[coupler.flux.name].append( + Pulse( + duration=500, + amplitude=1, + envelope=Rectangular(), + type=PulseType.COUPLERFLUX, + ) ) - cf_pulses[c].type = PulseType.COUPLERFLUX - sequence.append(cf_pulses[c]) options = ExecutionParameters( relaxation_time=300e-6, @@ -526,8 +329,8 @@ def test_experiment_flow_coupler(dummy_qrc): IQM5q.experiment_flow(qubits, couplers, sequence, options) assert qubits[0].flux.name in IQM5q.experiment.signals - assert measure_channel_name(qubits[0]) in IQM5q.experiment.signals - assert acquire_channel_name(qubits[0]) in IQM5q.experiment.signals + assert qubits[0].measure.name in IQM5q.experiment.signals + assert qubits[0].acquisition.name in IQM5q.experiment.signals def test_sweep_and_play_sim(dummy_qrc): @@ -540,21 +343,16 @@ def test_sweep_and_play_sim(dummy_qrc): platform.qubits = qubits couplers = {} - ro_pulses = {} - qf_pulses = {} for qubit in qubits.values(): - q = qubit.name - qf_pulses[q] = Pulse.flux( - start=0, - duration=500, - amplitude=1, - shape=Rectangular(), - channel=platform.qubits[q].flux.name, - qubit=q, + sequence[qubit.flux.name].append( + Pulse.flux( + duration=500, + amplitude=1, + envelope=Rectangular(), + ) ) - sequence.append(qf_pulses[q]) - ro_pulses[q] = platform.create_qubit_readout_pulse(q, start=qf_pulses[q].finish) - sequence.append(ro_pulses[q]) + sequence[qubit.measure.name].append(Delay(duration=sequence.duration)) + sequence.extend(qubit.native_gates.MZ.create_sequence()) options = ExecutionParameters( relaxation_time=300e-6, @@ -576,8 +374,14 @@ def test_sweep_and_play_sim(dummy_qrc): assert all(qubit in res for qubit in qubits) # check sweep with sweeps - sweep_1 = Sweeper(Parameter.start, np.array([1, 2, 3, 4]), list(qf_pulses.values())) - sweep_2 = Sweeper(Parameter.bias, np.array([1, 2, 3]), qubits=[qubits[0]]) + sweep_1 = Sweeper( + Parameter.amplitude, + np.array([1, 2, 3, 4]), + pulses=[sequence[qubit.flux.name][0] for qubit in qubits.values()], + ) + sweep_2 = Sweeper( + Parameter.bias, np.array([1, 2, 3]), channels=[qubits[0].flux.name] + ) res = IQM5q.sweep(qubits, couplers, sequence, options, sweep_1, sweep_2) assert res is not None assert all(qubit in res for qubit in qubits) @@ -588,20 +392,14 @@ def test_experiment_sweep_single(dummy_qrc, parameter1): platform = create_platform("zurich") IQM5q = platform.instruments["EL_ZURO"] - qubits = {0: platform.qubits[0]} + qubit_id, qubit = 0, platform.qubits[0] couplers = {} swept_points = 5 sequence = PulseSequence() - ro_pulses = {} - qd_pulses = {} - for qubit in qubits: - qd_pulses[qubit] = platform.create_RX_pulse(qubit, start=0) - sequence.append(qd_pulses[qubit]) - ro_pulses[qubit] = platform.create_qubit_readout_pulse( - qubit, start=qd_pulses[qubit].finish - ) - sequence.append(ro_pulses[qubit]) + sequence.extend(qubit.native_gates.RX.create_sequence(theta=np.pi, phi=0.0)) + sequence[qubit.measure.name].append(Delay(duration=sequence.duration)) + sequence.extend(qubit.native_gates.MZ.create_sequence()) parameter_range_1 = ( np.random.rand(swept_points) @@ -610,7 +408,9 @@ def test_experiment_sweep_single(dummy_qrc, parameter1): ) sweepers = [] - sweepers.append(Sweeper(parameter1, parameter_range_1, pulses=[qd_pulses[qubit]])) + sweepers.append( + Sweeper(parameter1, parameter_range_1, pulses=[sequence[qubit.drive.name][0]]) + ) options = ExecutionParameters( relaxation_time=300e-6, @@ -618,11 +418,11 @@ def test_experiment_sweep_single(dummy_qrc, parameter1): averaging_mode=AveragingMode.CYCLIC, ) - IQM5q.experiment_flow(qubits, couplers, sequence, options) + IQM5q.experiment_flow({qubit_id: qubit}, couplers, sequence, options) - assert qubits[0].drive.name in IQM5q.experiment.signals - assert measure_channel_name(qubits[0]) in IQM5q.experiment.signals - assert acquire_channel_name(qubits[0]) in IQM5q.experiment.signals + assert qubit.drive.name in IQM5q.experiment.signals + assert qubit.measure.name in IQM5q.experiment.signals + assert qubit.acquisition.name in IQM5q.experiment.signals @pytest.mark.parametrize("parameter1", [Parameter.duration]) @@ -635,29 +435,20 @@ def test_experiment_sweep_single_coupler(dummy_qrc, parameter1): swept_points = 5 sequence = PulseSequence() - ro_pulses = {} - qd_pulses = {} - for qubit in qubits: - qd_pulses[qubit] = platform.create_RX_pulse(qubit, start=0) - sequence.append(qd_pulses[qubit]) - ro_pulses[qubit] = platform.create_qubit_readout_pulse( - qubit, start=qd_pulses[qubit].finish - ) - sequence.append(ro_pulses[qubit]) + for qubit in qubits.values(): + sequence.extend(qubit.native_gates.RX.create_sequence(theta=np.pi, phi=0.0)) + sequence[qubit.measure.name].append(Delay(duration=sequence.duration)) + sequence.extend(qubit.native_gates.MZ.create_sequence()) - cf_pulses = {} for coupler in couplers.values(): - c = coupler.name - cf_pulses[c] = Pulse.flux( - start=0, - duration=500, - amplitude=1, - shape=Rectangular(), - channel=platform.couplers[c].flux.name, - qubit=c, + sequence[coupler.flux.name].append( + Pulse( + duration=500, + amplitude=1, + envelope=Rectangular(), + type=PulseType.COUPLERFLUX, + ) ) - cf_pulses[c].type = PulseType.COUPLERFLUX - sequence.append(cf_pulses[c]) parameter_range_1 = ( np.random.rand(swept_points) @@ -666,7 +457,13 @@ def test_experiment_sweep_single_coupler(dummy_qrc, parameter1): ) sweepers = [] - sweepers.append(Sweeper(parameter1, parameter_range_1, pulses=[cf_pulses[c]])) + sweepers.append( + Sweeper( + parameter1, + parameter_range_1, + pulses=[sequence[coupler.flux.name][0] for coupler in couplers.values()], + ) + ) options = ExecutionParameters( relaxation_time=300e-6, @@ -678,8 +475,8 @@ def test_experiment_sweep_single_coupler(dummy_qrc, parameter1): assert couplers[0].flux.name in IQM5q.experiment.signals assert qubits[0].drive.name in IQM5q.experiment.signals - assert measure_channel_name(qubits[0]) in IQM5q.experiment.signals - assert acquire_channel_name(qubits[0]) in IQM5q.experiment.signals + assert qubits[0].measure.name in IQM5q.experiment.signals + assert qubits[0].acquisition.name in IQM5q.experiment.signals SweeperParameter = { @@ -701,15 +498,10 @@ def test_experiment_sweep_2d_general(dummy_qrc, parameter1, parameter2): swept_points = 5 sequence = PulseSequence() - ro_pulses = {} - qd_pulses = {} - for qubit in qubits: - qd_pulses[qubit] = platform.create_RX_pulse(qubit, start=0) - sequence.append(qd_pulses[qubit]) - ro_pulses[qubit] = platform.create_qubit_readout_pulse( - qubit, start=qd_pulses[qubit].finish - ) - sequence.append(ro_pulses[qubit]) + for qubit in qubits.values(): + sequence.extend(qubit.native_gates.RX.create_sequence(theta=np.pi, phi=0.0)) + sequence[qubit.measure.name].append(Delay(duration=sequence.duration)) + sequence.extend(qubit.native_gates.MZ.create_sequence()) parameter_range_1 = ( np.random.rand(swept_points) @@ -727,13 +519,25 @@ def test_experiment_sweep_2d_general(dummy_qrc, parameter1, parameter2): if parameter1 in SweeperParameter: if parameter1 is not Parameter.start: sweepers.append( - Sweeper(parameter1, parameter_range_1, pulses=[ro_pulses[qubit]]) + Sweeper( + parameter1, + parameter_range_1, + pulses=[ + sequence[qubit.measure.name][0] for qubit in qubits.values() + ], + ) ) if parameter2 in SweeperParameter: if parameter2 is Parameter.amplitude: if parameter1 is not Parameter.amplitude: sweepers.append( - Sweeper(parameter2, parameter_range_2, pulses=[qd_pulses[qubit]]) + Sweeper( + parameter2, + parameter_range_2, + pulses=[ + sequence[qubit.drive.name][0] for qubit in qubits.values() + ], + ) ) options = ExecutionParameters( @@ -745,8 +549,8 @@ def test_experiment_sweep_2d_general(dummy_qrc, parameter1, parameter2): IQM5q.experiment_flow(qubits, couplers, sequence, options) assert qubits[0].drive.name in IQM5q.experiment.signals - assert measure_channel_name(qubits[0]) in IQM5q.experiment.signals - assert acquire_channel_name(qubits[0]) in IQM5q.experiment.signals + assert qubits[0].measure.name in IQM5q.experiment.signals + assert qubits[0].acquisition.name in IQM5q.experiment.signals def test_experiment_sweep_2d_specific(dummy_qrc): @@ -758,15 +562,10 @@ def test_experiment_sweep_2d_specific(dummy_qrc): swept_points = 5 sequence = PulseSequence() - ro_pulses = {} - qd_pulses = {} - for qubit in qubits: - qd_pulses[qubit] = platform.create_RX_pulse(qubit, start=0) - sequence.append(qd_pulses[qubit]) - ro_pulses[qubit] = platform.create_qubit_readout_pulse( - qubit, start=qd_pulses[qubit].finish - ) - sequence.append(ro_pulses[qubit]) + for qubit in qubits.values(): + sequence.extend(qubit.native_gates.RX.create_sequence(theta=np.pi, phi=0.0)) + sequence[qubit.measure.name].append(Delay(duration=sequence.duration)) + sequence.extend(qubit.native_gates.MZ.create_sequence()) parameter1 = Parameter.relative_phase parameter2 = Parameter.frequency @@ -784,8 +583,9 @@ def test_experiment_sweep_2d_specific(dummy_qrc): ) sweepers = [] - sweepers.append(Sweeper(parameter1, parameter_range_1, pulses=[qd_pulses[qubit]])) - sweepers.append(Sweeper(parameter2, parameter_range_2, pulses=[qd_pulses[qubit]])) + qd_pulses = [sequence[qubit.drive.name][0] for qubit in qubits.values()] + sweepers.append(Sweeper(parameter1, parameter_range_1, pulses=qd_pulses)) + sweepers.append(Sweeper(parameter2, parameter_range_2, pulses=qd_pulses)) options = ExecutionParameters( relaxation_time=300e-6, @@ -796,8 +596,8 @@ def test_experiment_sweep_2d_specific(dummy_qrc): IQM5q.experiment_flow(qubits, couplers, sequence, options) assert qubits[0].drive.name in IQM5q.experiment.signals - assert measure_channel_name(qubits[0]) in IQM5q.experiment.signals - assert acquire_channel_name(qubits[0]) in IQM5q.experiment.signals + assert qubits[0].measure.name in IQM5q.experiment.signals + assert qubits[0].acquisition.name in IQM5q.experiment.signals @pytest.mark.parametrize( @@ -822,10 +622,8 @@ def test_experiment_sweep_punchouts(dummy_qrc, parameter): swept_points = 5 sequence = PulseSequence() - ro_pulses = {} - for qubit in qubits: - ro_pulses[qubit] = platform.create_qubit_readout_pulse(qubit, start=0) - sequence.append(ro_pulses[qubit]) + for qubit in qubits.values(): + sequence.extend(qubit.native_gates.MZ.create_sequence()) parameter_range_1 = ( np.random.rand(swept_points) @@ -840,13 +638,18 @@ def test_experiment_sweep_punchouts(dummy_qrc, parameter): ) sweepers = [] + ro_pulses = [sequence[qubit.measure.name][0] for qubit in qubits.values()] if parameter1 is Parameter.bias: - sweepers.append(Sweeper(parameter1, parameter_range_1, qubits=[qubits[qubit]])) - else: sweepers.append( - Sweeper(parameter1, parameter_range_1, pulses=[ro_pulses[qubit]]) + Sweeper( + parameter1, + parameter_range_1, + channels=[qubit.measure.name for qubit in qubits.values()], + ) ) - sweepers.append(Sweeper(parameter2, parameter_range_2, pulses=[ro_pulses[qubit]])) + else: + sweepers.append(Sweeper(parameter1, parameter_range_1, pulses=ro_pulses)) + sweepers.append(Sweeper(parameter2, parameter_range_2, pulses=ro_pulses)) options = ExecutionParameters( relaxation_time=300e-6, @@ -856,8 +659,8 @@ def test_experiment_sweep_punchouts(dummy_qrc, parameter): IQM5q.experiment_flow(qubits, couplers, sequence, options) - assert measure_channel_name(qubits[0]) in IQM5q.experiment.signals - assert acquire_channel_name(qubits[0]) in IQM5q.experiment.signals + assert qubits[0].measure.name in IQM5q.experiment.signals + assert qubits[0].acquisition.name in IQM5q.experiment.signals def test_batching(dummy_qrc): @@ -865,11 +668,17 @@ def test_batching(dummy_qrc): instrument = platform.instruments["EL_ZURO"] sequence = PulseSequence() - sequence.append(platform.create_RX_pulse(0, start=0)) - sequence.append(platform.create_RX_pulse(1, start=0)) - measurement_start = sequence.finish - sequence.append(platform.create_MZ_pulse(0, start=measurement_start)) - sequence.append(platform.create_MZ_pulse(1, start=measurement_start)) + sequence.extend( + platform.qubits[0].native_gates.RX.create_sequence(theta=np.pi, phi=0.0) + ) + sequence.extend( + platform.qubits[1].native_gates.RX.create_sequence(theta=np.pi, phi=0.0) + ) + measurement_start = sequence.duration + sequence[platform.qubits[0].measure.name].append(Delay(duration=measurement_start)) + sequence[platform.qubits[1].measure.name].append(Delay(duration=measurement_start)) + sequence.extend(platform.qubits[0].native_gates.MZ.create_sequence()) + sequence.extend(platform.qubits[1].native_gates.MZ.create_sequence()) batches = list(batch(600 * [sequence], instrument.bounds)) # These sequences get limited by the number of measuraments (600/250/2) @@ -892,29 +701,25 @@ def test_connections(instrument): @pytest.mark.qpu -def test_experiment_execute_qpu(connected_platform, instrument): +def test_experiment_execute_pulse_sequence_qpu(connected_platform, instrument): platform = connected_platform sequence = PulseSequence() qubits = {0: platform.qubits[0], "c0": platform.qubits["c0"]} platform.qubits = qubits - ro_pulses = {} - qf_pulses = {} for qubit in qubits.values(): - q = qubit.name - qf_pulses[q] = Pulse.flux( - start=0, - duration=500, - amplitude=1, - shape=Rectangular(), - channel=platform.qubits[q].flux.name, - qubit=q, + sequence[qubit.flux.name].append( + Pulse.flux( + duration=500, + amplitude=1, + envelope=Rectangular(), + ) ) - sequence.append(qf_pulses[q]) if qubit.flux_coupler: continue - ro_pulses[q] = platform.create_qubit_readout_pulse(q, start=qf_pulses[q].finish) - sequence.append(ro_pulses[q]) + + sequence[qubit.measure.name].append(Delay(duration=sequence.duration)) + sequence.extend(qubit.native_gates.MZ.create_sequence()) options = ExecutionParameters( relaxation_time=300e-6, @@ -922,9 +727,12 @@ def test_experiment_execute_qpu(connected_platform, instrument): averaging_mode=AveragingMode.CYCLIC, ) - results = platform.execute([sequence], options) + results = platform.execute_pulse_sequence( + sequence, + options, + ) - assert len(results[ro_pulses[q][0].id]) > 0 + assert all(len(results[sequence.ro_pulses[q].id]) for q in qubits) > 0 @pytest.mark.qpu @@ -934,15 +742,10 @@ def test_experiment_sweep_2d_specific_qpu(connected_platform, instrument): swept_points = 5 sequence = PulseSequence() - ro_pulses = {} - qd_pulses = {} - for qubit in qubits: - qd_pulses[qubit] = platform.create_RX_pulse(qubit, start=0) - sequence.append(qd_pulses[qubit]) - ro_pulses[qubit] = platform.create_qubit_readout_pulse( - qubit, start=qd_pulses[qubit].finish - ) - sequence.append(ro_pulses[qubit]) + for qubit in qubits.values(): + sequence.extend(qubit.native_gates.RX.create_sequence(theta=np.pi, phi=0.0)) + sequence[qubit.measure.name].append(Delay(duration=sequence.duration)) + sequence.extend(qubit.native_gates.MZ.create_sequence()) parameter1 = Parameter.relative_phase parameter2 = Parameter.frequency @@ -960,8 +763,9 @@ def test_experiment_sweep_2d_specific_qpu(connected_platform, instrument): ) sweepers = [] - sweepers.append(Sweeper(parameter1, parameter_range_1, pulses=[qd_pulses[qubit]])) - sweepers.append(Sweeper(parameter2, parameter_range_2, pulses=[qd_pulses[qubit]])) + qd_pulses = [sequence[qubit.drive.name][0] for qubit in qubits.values()] + sweepers.append(Sweeper(parameter1, parameter_range_1, pulses=qd_pulses)) + sweepers.append(Sweeper(parameter2, parameter_range_2, pulses=qd_pulses)) options = ExecutionParameters( relaxation_time=300e-6, @@ -976,69 +780,4 @@ def test_experiment_sweep_2d_specific_qpu(connected_platform, instrument): sweepers[1], ) - assert len(results[ro_pulses[qubit].id]) > 0 - - -def get_previous_subsequence_finish(instrument, name): - """Look recursively for sub_section finish times.""" - section = next( - iter(ch for ch in instrument.experiment.sections[0].children if ch.uid == name) - ) - finish = defaultdict(int) - for pulse in section.children: - try: - finish[pulse.signal] += pulse.time - except AttributeError: - # not a laboneq Delay class object, skipping - pass - try: - finish[pulse.signal] += pulse.pulse.length - except AttributeError: - # not a laboneq PlayPulse class object, skipping - pass - return max(finish.values()) - - -def test_experiment_measurement_sequence(dummy_qrc): - platform = create_platform("zurich") - IQM5q = platform.instruments["EL_ZURO"] - - sequence = PulseSequence() - qubits = {0: platform.qubits[0]} - platform.qubits = qubits - couplers = {} - - readout_pulse_start = 40 - - for qubit in qubits: - qubit_drive_pulse_1 = platform.create_qubit_drive_pulse( - qubit, start=0, duration=40 - ) - ro_pulse = platform.create_qubit_readout_pulse(qubit, start=readout_pulse_start) - qubit_drive_pulse_2 = platform.create_qubit_drive_pulse( - qubit, start=readout_pulse_start + 50, duration=40 - ) - sequence.append(qubit_drive_pulse_1) - sequence.append(ro_pulse) - sequence.append(qubit_drive_pulse_2) - - options = ExecutionParameters( - relaxation_time=4, - acquisition_type=AcquisitionType.INTEGRATION, - averaging_mode=AveragingMode.CYCLIC, - ) - - IQM5q.experiment_flow(qubits, couplers, sequence, options) - measure_start = 0 - for section in IQM5q.experiment.sections[0].children: - if section.uid == "measure_0": - measure_start += get_previous_subsequence_finish(IQM5q, section.play_after) - for pulse in section.children: - try: - if pulse.signal == measure_channel_name(qubits[0]): - measure_start += pulse.time - except AttributeError: - # not a laboneq delay class object, skipping - pass - - assert math.isclose(measure_start * 1e9, readout_pulse_start, rel_tol=1e-4) + assert all(len(results[sequence.ro_pulses[q].id]) for q in qubits) > 0 From db768bcfa0a0ce41b6bff5661c775915bb21d081 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Mon, 15 Jul 2024 11:52:43 +0400 Subject: [PATCH 0329/1006] fix import --- tests/test_emulator.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/test_emulator.py b/tests/test_emulator.py index 78612bfbad..9c32d40f00 100644 --- a/tests/test_emulator.py +++ b/tests/test_emulator.py @@ -19,7 +19,7 @@ from qibolab.instruments.emulator.pulse_simulator import AVAILABLE_SWEEP_PARAMETERS from qibolab.platform.load import PLATFORMS from qibolab.pulses import PulseSequence -from qibolab.sweeper import Parameter, QubitParameter, Sweeper +from qibolab.sweeper import ChannelParameter, Parameter, Sweeper os.environ[PLATFORMS] = str(pathlib.Path(__file__).parent / "emulators/") @@ -95,7 +95,7 @@ def test_emulator_single_sweep( else: parameter_range = np.random.randint(1, 4, size=SWEPT_POINTS) sequence.add(pulse) - if parameter in QubitParameter: + if parameter in ChannelParameter: sweeper = Sweeper(parameter, parameter_range, qubits=[platform.qubits[0]]) else: sweeper = Sweeper(parameter, parameter_range, pulses=[pulse]) @@ -149,11 +149,11 @@ def test_emulator_double_sweep_false_history( if parameter2 is Parameter.amplitude else np.random.randint(1, 4, size=SWEPT_POINTS) ) - if parameter1 in QubitParameter: + if parameter1 in ChannelParameter: sweeper1 = Sweeper(parameter1, parameter_range_1, qubits=[platform.qubits[0]]) else: sweeper1 = Sweeper(parameter1, parameter_range_1, pulses=[ro_pulse]) - if parameter2 in QubitParameter: + if parameter2 in ChannelParameter: sweeper2 = Sweeper(parameter2, parameter_range_2, qubits=[platform.qubits[0]]) else: sweeper2 = Sweeper(parameter2, parameter_range_2, pulses=[pulse]) @@ -205,7 +205,7 @@ def test_emulator_single_sweep_multiplex( else np.random.randint(1, 4, size=SWEPT_POINTS) ) - if parameter in QubitParameter: + if parameter in ChannelParameter: sweeper1 = Sweeper( parameter, parameter_range, From 7d46d753ef7000f08ee7b7601f1234d1fe0e52e1 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Mon, 15 Jul 2024 12:23:38 +0400 Subject: [PATCH 0330/1006] make arguments optional --- src/qibolab/native.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibolab/native.py b/src/qibolab/native.py index 2dbdcb81e0..6815200314 100644 --- a/src/qibolab/native.py +++ b/src/qibolab/native.py @@ -51,7 +51,7 @@ def __init__(self, sequence: PulseSequence): self._seq = sequence - def create_sequence(self, theta: float, phi: float) -> PulseSequence: + def create_sequence(self, theta: float = np.pi, phi: float = 0.0) -> PulseSequence: """Create a sequence for single-qubit rotation. Args: From 7041713a9f87fa0f4c6c15bb1b07205d84ad3382 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Mon, 15 Jul 2024 12:45:08 +0400 Subject: [PATCH 0331/1006] Update dummy platform tests --- tests/test_dummy.py | 33 ++++++++++++++------------------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/tests/test_dummy.py b/tests/test_dummy.py index 94327da807..75048f7abd 100644 --- a/tests/test_dummy.py +++ b/tests/test_dummy.py @@ -10,7 +10,6 @@ PulseSequence, PulseType, ) -from qibolab.qubits import QubitPair from qibolab.sweeper import ChannelParameter, Parameter, Sweeper SWEPT_POINTS = 5 @@ -31,11 +30,11 @@ def test_dummy_initialization(name): def test_dummy_execute_pulse_sequence(name, acquisition): nshots = 100 platform = create_platform(name) - mz_seq = platform.create_MZ_pulse(0) + mz_seq = platform.qubits[0].native_gates.MZ.create_sequence() mz_pulse = next(iter(mz_seq.values()))[0] sequence = PulseSequence() sequence.extend(mz_seq) - sequence.extend(platform.create_RX12_pulse(0)) + sequence.extend(platform.qubits[0].native_gates.RX12.create_sequence()) options = ExecutionParameters(nshots=100, acquisition_type=acquisition) result = platform.execute_pulse_sequence(sequence, options) if acquisition is AcquisitionType.INTEGRATION: @@ -63,19 +62,15 @@ def test_dummy_execute_coupler_pulse(): def test_dummy_execute_pulse_sequence_couplers(): platform = create_platform("dummy_couplers") - qubit_ordered_pair = QubitPair( - platform.qubits[1], platform.qubits[2], coupler=platform.couplers[1] - ) sequence = PulseSequence() - cz = platform.create_CZ_pulse_sequence( - qubits=(qubit_ordered_pair.qubit1.name, qubit_ordered_pair.qubit2.name), - ) + cz = platform.pairs[(1, 2)].native_gates.CZ.create_sequence() + sequence.extend(cz) sequence[platform.qubits[0].measure.name].append(Delay(duration=40)) sequence[platform.qubits[2].measure.name].append(Delay(duration=40)) - sequence.extend(platform.create_MZ_pulse(0)) - sequence.extend(platform.create_MZ_pulse(2)) + sequence.extend(platform.qubits[0].native_gates.MZ.create_sequence()) + sequence.extend(platform.qubits[2].native_gates.MZ.create_sequence()) options = ExecutionParameters(nshots=None) result = platform.execute_pulse_sequence(sequence, options) @@ -84,7 +79,7 @@ def test_dummy_execute_pulse_sequence_couplers(): def test_dummy_execute_pulse_sequence_fast_reset(name): platform = create_platform(name) sequence = PulseSequence() - sequence.extend(platform.create_MZ_pulse(0)) + sequence.extend(platform.qubits[0].native_gates.MZ.create_sequence()) options = ExecutionParameters(nshots=None, fast_reset=True) result = platform.execute_pulse_sequence(sequence, options) @@ -101,12 +96,12 @@ def test_dummy_execute_pulse_sequence_unrolling(name, acquisition, batch_size): platform.instruments["dummy"].UNROLLING_BATCH_SIZE = batch_size sequences = [] sequence = PulseSequence() - sequence.extend(platform.create_MZ_pulse(0)) + sequence.extend(platform.qubits[0].native_gates.MZ.create_sequence()) for _ in range(nsequences): sequences.append(sequence) options = ExecutionParameters(nshots=nshots, acquisition_type=acquisition) result = platform.execute_pulse_sequences(sequences, options) - assert len(result[0]) == nsequences + assert len(next(iter(result.values()))) == nsequences for r in result[0]: if acquisition is AcquisitionType.INTEGRATION: assert r.magnitude.shape == (nshots,) @@ -118,7 +113,7 @@ def test_dummy_execute_pulse_sequence_unrolling(name, acquisition, batch_size): def test_dummy_single_sweep_raw(name): platform = create_platform(name) sequence = PulseSequence() - mz_seq = platform.create_MZ_pulse(qubit=0) + mz_seq = platform.qubits[0].native_gates.MZ.create_sequence() pulse = next(iter(mz_seq.values()))[0] parameter_range = np.random.randint(SWEPT_POINTS, size=SWEPT_POINTS) @@ -153,7 +148,7 @@ def test_dummy_single_sweep_coupler( ): platform = create_platform("dummy_couplers") sequence = PulseSequence() - mz_seq = platform.create_MZ_pulse(qubit=0) + mz_seq = platform.qubits[0].native_gates.MZ.create_sequence() mz_pulse = next(iter(mz_seq.values()))[0] coupler_pulse = Pulse.flux( duration=40, @@ -209,7 +204,7 @@ def test_dummy_single_sweep_coupler( def test_dummy_single_sweep(name, fast_reset, parameter, average, acquisition, nshots): platform = create_platform(name) sequence = PulseSequence() - mz_seq = platform.create_MZ_pulse(qubit=0) + mz_seq = platform.qubits[0].native_gates.MZ.create_sequence() pulse = next(iter(mz_seq.values()))[0] if parameter is Parameter.amplitude: parameter_range = np.random.rand(SWEPT_POINTS) @@ -264,7 +259,7 @@ def test_dummy_double_sweep(name, parameter1, parameter2, average, acquisition, pulse = Pulse( duration=40, amplitude=0.1, envelope=Gaussian(rel_sigma=5), type=PulseType.DRIVE ) - mz_seq = platform.create_MZ_pulse(qubit=0) + mz_seq = platform.qubits[0].native_gates.MZ.create_sequence() mz_pulse = next(iter(mz_seq.values()))[0] sequence[platform.get_qubit(0).drive.name].append(pulse) sequence[platform.qubits[0].measure.name].append(Delay(duration=pulse.duration)) @@ -338,7 +333,7 @@ def test_dummy_single_sweep_multiplex(name, parameter, average, acquisition, nsh sequence = PulseSequence() mz_pulses = {} for qubit in platform.qubits: - mz_seq = platform.create_MZ_pulse(qubit=qubit) + mz_seq = platform.qubits[qubit].native_gates.MZ.create_sequence() mz_pulses[qubit] = next(iter(mz_seq.values()))[0] sequence.extend(mz_seq) parameter_range = ( From 6afff2e18422020896c39297613fe35e75c6c985 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Mon, 15 Jul 2024 15:11:53 +0400 Subject: [PATCH 0332/1006] fix channel name --- src/qibolab/dummy/parameters.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibolab/dummy/parameters.json b/src/qibolab/dummy/parameters.json index 02e07b8929..054d784535 100644 --- a/src/qibolab/dummy/parameters.json +++ b/src/qibolab/dummy/parameters.json @@ -219,7 +219,7 @@ ] }, "MZ": { - "qubit_2/drive": [ + "qubit_2/measure": [ { "duration": 2000, "amplitude": 0.1, From 30135e9aba4a7b0e74e063906366007c8dc22603 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Mon, 15 Jul 2024 15:12:40 +0400 Subject: [PATCH 0333/1006] update compiler tests --- tests/test_compilers_default.py | 83 +++++++++++++++------------------ 1 file changed, 37 insertions(+), 46 deletions(-) diff --git a/tests/test_compilers_default.py b/tests/test_compilers_default.py index 3af68316a4..537ef34f5d 100644 --- a/tests/test_compilers_default.py +++ b/tests/test_compilers_default.py @@ -37,20 +37,20 @@ def compile_circuit(circuit, platform): @pytest.mark.parametrize( - "gateargs,sequence_len", + "gateargs", [ - ((gates.I,), 1), - ((gates.Z,), 2), - ((gates.GPI, np.pi / 8), 3), - ((gates.GPI2, -np.pi / 8), 3), - ((gates.RZ, np.pi / 4), 2), + (gates.I,), + (gates.Z,), + (gates.GPI, np.pi / 8), + (gates.GPI2, -np.pi / 8), + (gates.RZ, np.pi / 4), ], ) -def test_compile(platform, gateargs, sequence_len): +def test_compile(platform, gateargs): nqubits = platform.nqubits circuit = generate_circuit_with_gate(nqubits, *gateargs) sequence = compile_circuit(circuit, platform) - assert len(sequence) == nqubits * sequence_len + assert len(sequence) == nqubits * int(gateargs[0] != gates.I) + nqubits def test_compile_two_gates(platform): @@ -61,9 +61,10 @@ def test_compile_two_gates(platform): sequence = compile_circuit(circuit, platform) - assert len(sequence) == 5 - assert len(sequence.qd_pulses) == 2 - assert len(sequence.ro_pulses) == 1 + qubit = platform.qubits[0] + assert len(sequence) == 2 + assert len(sequence[qubit.drive.name]) == 2 + assert len(sequence[qubit.measure.name]) == 2 # includes delay def test_measurement(platform): @@ -74,8 +75,6 @@ def test_measurement(platform): sequence = compile_circuit(circuit, platform) assert len(sequence) == 1 * nqubits - assert len(sequence.qd_pulses) == 0 * nqubits - assert len(sequence.qf_pulses) == 0 * nqubits assert len(sequence.ro_pulses) == 1 * nqubits @@ -84,7 +83,8 @@ def test_rz_to_sequence(platform): circuit.add(gates.RZ(0, theta=0.2)) circuit.add(gates.Z(0)) sequence = compile_circuit(circuit, platform) - assert len(sequence) == 2 + assert len(sequence) == 1 + assert len(next(iter(sequence.values()))) == 2 def test_gpi_to_sequence(platform): @@ -92,12 +92,10 @@ def test_gpi_to_sequence(platform): circuit.add(gates.GPI(0, phi=0.2)) sequence = compile_circuit(circuit, platform) assert len(sequence) == 1 - assert len(sequence.qd_pulses) == 1 - rx_pulse = platform.create_RX_pulse(0, relative_phase=0.2) - s = PulseSequence([rx_pulse]) + rx_seq = platform.qubits[0].native_gates.RX.create_sequence(phi=0.2) - np.testing.assert_allclose(sequence.duration, rx_pulse.duration) + np.testing.assert_allclose(sequence.duration, rx_seq.duration) def test_gpi2_to_sequence(platform): @@ -105,13 +103,13 @@ def test_gpi2_to_sequence(platform): circuit.add(gates.GPI2(0, phi=0.2)) sequence = compile_circuit(circuit, platform) assert len(sequence) == 1 - assert len(sequence.qd_pulses) == 1 - rx90_pulse = platform.create_RX90_pulse(0, relative_phase=0.2) - s = PulseSequence([rx90_pulse]) + rx90_seq = platform.qubits[0].native_gates.RX.create_sequence( + theta=np.pi / 2, phi=0.2 + ) - np.testing.assert_allclose(sequence.duration, rx90_pulse.duration) - assert sequence == s + np.testing.assert_allclose(sequence.duration, rx90_seq.duration) + assert sequence == rx90_seq def test_cz_to_sequence(): @@ -120,7 +118,7 @@ def test_cz_to_sequence(): circuit.add(gates.CZ(1, 2)) sequence = compile_circuit(circuit, platform) - test_sequence = platform.create_CZ_pulse_sequence((2, 1)) + test_sequence = platform.pairs[(2, 1)].native_gates.CZ.create_sequence() assert sequence[0] == test_sequence[0] @@ -130,9 +128,8 @@ def test_cnot_to_sequence(): circuit.add(gates.CNOT(2, 3)) sequence = compile_circuit(circuit, platform) - test_sequence = platform.create_CNOT_pulse_sequence((2, 3)) - assert len(sequence) == len(test_sequence) + 1 - assert sequence[0] == test_sequence[0] + test_sequence = platform.pairs[(2, 3)].native_gates.CNOT.create_sequence() + assert sequence == test_sequence def test_add_measurement_to_sequence(platform): @@ -142,23 +139,18 @@ def test_add_measurement_to_sequence(platform): circuit.add(gates.M(0)) sequence = compile_circuit(circuit, platform) - assert len(sequence) == 5 - assert len(sequence.qd_pulses) == 2 - assert len(sequence.ro_pulses) == 1 + qubit = platform.qubits[0] + assert len(sequence) == 2 + assert len(sequence[qubit.drive.name]) == 2 + assert len(sequence[qubit.measure.name]) == 2 # include delay - rx90_pulse1 = platform.create_RX90_pulse(0, relative_phase=0.3) - rx90_pulse2 = platform.create_RX90_pulse(0, relative_phase=0.4 - np.pi) - mz_pulse = platform.create_MZ_pulse(0) - delay = 2 * rx90_pulse1.duration - s = PulseSequence( - [ - rx90_pulse1, - rx90_pulse2, - Delay(duration=delay, channel=mz_pulse.channel), - mz_pulse, - ] - ) - # assert sequence == s + s = PulseSequence() + s.extend(qubit.native_gates.RX.create_sequence(theta=np.pi / 2, phi=0.1)) + s.extend(qubit.native_gates.RX.create_sequence(theta=np.pi / 2, phi=0.2)) + s[qubit.measure.name].append(Delay(duration=s.duration)) + s.extend(qubit.native_gates.MZ.create_sequence()) + + assert sequence == s @pytest.mark.parametrize("delay", [0, 100]) @@ -168,10 +160,9 @@ def test_align_delay_measurement(platform, delay): circuit.add(gates.M(0)) sequence = compile_circuit(circuit, platform) - mz_pulse = platform.create_MZ_pulse(0) target_sequence = PulseSequence() if delay > 0: - target_sequence.append(Delay(duration=delay, channel=mz_pulse.channel)) - target_sequence.append(mz_pulse) + target_sequence[platform.qubits[0].measure.name].append(Delay(duration=delay)) + target_sequence.extend(platform.qubits[0].native_gates.MZ.create_sequence()) assert sequence == target_sequence assert len(sequence.ro_pulses) == 1 From ec2b34c204a46596a3ebaf91ac91b34c08593af5 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 16 Jul 2024 10:09:51 +0400 Subject: [PATCH 0334/1006] fix dummy platform --- src/qibolab/dummy/parameters.json | 1 - src/qibolab/dummy/platform.py | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/qibolab/dummy/parameters.json b/src/qibolab/dummy/parameters.json index 054d784535..665218ceca 100644 --- a/src/qibolab/dummy/parameters.json +++ b/src/qibolab/dummy/parameters.json @@ -546,7 +546,6 @@ "duration": 40, "amplitude": 0.3, "envelope": { "kind": "drag", "rel_sigma": 5, "beta": 0.02 }, - "frequency": 4150000000.0, "type": "qd" } ] diff --git a/src/qibolab/dummy/platform.py b/src/qibolab/dummy/platform.py index 12603ffd31..eaabedeaff 100644 --- a/src/qibolab/dummy/platform.py +++ b/src/qibolab/dummy/platform.py @@ -14,6 +14,7 @@ from qibolab.platform import Platform from qibolab.serialize import ( load_component_config, + load_instrument_settings, load_qubits, load_runcard, load_settings, @@ -104,6 +105,7 @@ def create_dummy(with_couplers: bool = True): ) instruments = {instrument.name: instrument, twpa_pump.name: twpa_pump} + instruments = load_instrument_settings(runcard, instruments) name = "dummy_couplers" if with_couplers else "dummy" return Platform( name, From f59bb455b1171dd1bc66a572740672916c69ef77 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 16 Jul 2024 10:10:35 +0400 Subject: [PATCH 0335/1006] update unrolling function --- src/qibolab/platform/platform.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 2a918296df..7a2c655513 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -13,7 +13,7 @@ from qibolab.couplers import Coupler from qibolab.execution_parameters import ExecutionParameters from qibolab.instruments.abstract import Controller, Instrument, InstrumentId -from qibolab.pulses import Delay, PulseSequence, PulseType +from qibolab.pulses import Delay, PulseSequence from qibolab.qubits import Qubit, QubitId, QubitPair, QubitPairId from qibolab.serialize_ import replace from qibolab.sweeper import ParallelSweepers @@ -55,16 +55,14 @@ def unroll_sequences( """ total_sequence = PulseSequence() readout_map = defaultdict(list) - channels = {pulse.channel for sequence in sequences for pulse in sequence} for sequence in sequences: - total_sequence += sequence + total_sequence.extend(sequence) # TODO: Fix unrolling results - for pulse in sequence: - if pulse.type is PulseType.READOUT: - readout_map[pulse.id].append(pulse.id) + for pulse in sequence.ro_pulses: + readout_map[pulse.id].append(pulse.id) length = sequence.duration + relaxation_time - for channel in channels: + for channel in sequence.keys(): delay = length - sequence.channel_duration(channel) total_sequence[channel].append(Delay(duration=delay)) From 03ce0c9a722dec9fff8f642637364d1bb5a43fd0 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 16 Jul 2024 10:10:56 +0400 Subject: [PATCH 0336/1006] update channel list --- src/qibolab/qubits.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index fe4ee25aa3..2abd444097 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -10,7 +10,7 @@ QubitId = Union[str, int] """Type for qubit names.""" -CHANNEL_NAMES = ("measure", "acquisition", "drive", "flux") +CHANNEL_NAMES = ("measure", "acquisition", "drive", "drive12", "drive_cross", "flux") """Names of channels that belong to a qubit. Not all channels are required to operate a qubit. From 9b0736bf043e46ae6b77576b9594563cbbeb4b20 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 16 Jul 2024 10:11:34 +0400 Subject: [PATCH 0337/1006] update platform tests --- tests/test_platform.py | 44 +++++++----------------------------------- 1 file changed, 7 insertions(+), 37 deletions(-) diff --git a/tests/test_platform.py b/tests/test_platform.py index 80d12929fd..a410f585db 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -21,15 +21,7 @@ from qibolab.kernels import Kernels from qibolab.platform import Platform, unroll_sequences from qibolab.platform.load import PLATFORMS -from qibolab.pulses import ( - Delay, - Drag, - Gaussian, - Pulse, - PulseSequence, - PulseType, - Rectangular, -) +from qibolab.pulses import Delay, Gaussian, Pulse, PulseSequence, PulseType, Rectangular from qibolab.serialize import ( PLATFORM, dump_kernels, @@ -45,20 +37,15 @@ def test_unroll_sequences(platform): - qubit = next(iter(platform.qubits)) + qubit = next(iter(platform.qubits.values())) sequence = PulseSequence() - qd_seq = platform.create_RX_pulse(qubit) - mz_seq = platform.create_MZ_pulse(qubit) - mz_pulse = next(iter(mz_seq.values()))[0] - sequence.extend(qd_seq) - sequence[platform.qubits[qubit].readout.name].append( - Delay(duration=qd_seq.duration) - ) - sequence.extend(mz_seq) + sequence.extend(qubit.native_gates.RX.create_sequence()) + sequence[qubit.measure.name].append(Delay(duration=sequence.duration)) + sequence.extend(qubit.native_gates.MZ.create_sequence()) total_sequence, readouts = unroll_sequences(10 * [sequence], relaxation_time=10000) assert len(total_sequence.ro_pulses) == 10 assert len(readouts) == 1 - assert len(readouts[mz_pulse.id]) == 10 + assert all(len(readouts[pulse.id]) == 10 for pulse in sequence.ro_pulses) def test_create_platform(platform): @@ -89,7 +76,7 @@ def test_create_platform_multipath(tmp_path: Path): from qibolab.platform import Platform def create(): - return Platform("{p.parent.name}-{p.name}", {{}}, {{}}, {{}}) + return Platform("{p.parent.name}-{p.name}", {{}}, {{}}, {{}}, {{}}) """ ) ) @@ -432,20 +419,3 @@ def test_ground_state_probabilities_pulses(qpu_platform, start_zero): target_probs = np.zeros((nqubits, 2)) target_probs[:, 0] = 1 np.testing.assert_allclose(probs, target_probs, atol=0.05) - - -def test_create_RX_drag_pulses(): - platform = create_dummy() - qubits = [q for q, qb in platform.qubits.items() if qb.drive is not None] - beta = 0.1234 - for qubit in qubits: - drag_pi = platform.create_RX_drag_pulse(qubit, beta=beta) - assert drag_pi.envelope == Drag(rel_sigma=drag_pi.envelope.rel_sigma, beta=beta) - drag_pi_half = platform.create_RX90_drag_pulse(qubit, beta=beta) - assert drag_pi_half.envelope == Drag( - rel_sigma=drag_pi_half.envelope.rel_sigma, beta=beta - ) - np.testing.assert_almost_equal(drag_pi.amplitude, 2 * drag_pi_half.amplitude) - - drag_pi.envelopes(sampling_rate=1) - drag_pi_half.envelopes(sampling_rate=1) From 284d26712ac5b78d78d5167449f33529c1700ac2 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 16 Jul 2024 10:16:32 +0400 Subject: [PATCH 0338/1006] update looping over pulses --- src/qibolab/backends.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/qibolab/backends.py b/src/qibolab/backends.py index f76e5b1103..dda4b37824 100644 --- a/src/qibolab/backends.py +++ b/src/qibolab/backends.py @@ -159,7 +159,9 @@ def execute_circuits(self, circuits, initial_states=None, nshots=1000): MeasurementOutcomes(circuit.measurements, self, nshots=nshots) ) for gate, sequence in measurement_map.items(): - samples = [readout[pulse.id].popleft().samples for pulse in sequence] + samples = [ + readout[pulse.id].popleft().samples for pulse in sequence.ro_pulses + ] gate.result.backend = self gate.result.register_samples(np.array(samples).T) return results From 65e6196d36a61ef058e6b70be4c9c98553a4d01e Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 16 Jul 2024 10:17:18 +0400 Subject: [PATCH 0339/1006] update metabackend load test --- tests/test_backends.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/tests/test_backends.py b/tests/test_backends.py index f432b6c324..c7d7b90b3a 100644 --- a/tests/test_backends.py +++ b/tests/test_backends.py @@ -195,11 +195,10 @@ def test_superposition_for_all_qubits(connected_backend): # TODO: test_circuit_result_representation -def test_metabackend_load(dummy_qrc): - for platform in Path("tests/dummy_qrc/").iterdir(): - backend = MetaBackend.load(platform.name) - assert isinstance(backend, QibolabBackend) - assert Path(backend.platform.name).name == platform.name +def test_metabackend_load(platform): + backend = MetaBackend.load(platform.name) + assert isinstance(backend, QibolabBackend) + assert backend.platform.name == platform.name def test_metabackend_list_available(tmpdir): From 55a4bf6f50c20eb118b4af0de42b4205ae2fcddd Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 16 Jul 2024 10:20:02 +0400 Subject: [PATCH 0340/1006] temporarily disable non 0.2 compatible platforms --- tests/conftest.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 39be15868f..29419dc584 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -7,12 +7,12 @@ from qibolab.platform.load import PLATFORMS ORIGINAL_PLATFORMS = os.environ.get(PLATFORMS, "") -TESTING_PLATFORM_NAMES = [ +TESTING_PLATFORM_NAMES = [ # FIXME: uncomment platforms as they get upgraded to 0.2 "dummy_couplers", - "qm", - "qm_octave", - "qblox", - "rfsoc", + # "qm", + # "qm_octave", + # "qblox", + # "rfsoc", "zurich", ] """Platforms used for testing without access to real instruments.""" From be12b6d5459cea65f444a648cf19ffb45ef3e6cb Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 16 Jul 2024 11:22:31 +0400 Subject: [PATCH 0341/1006] update unit test platform with ZI instruments --- tests/dummy_qrc/zurich/parameters.json | 687 +++++++++++++++++-------- tests/dummy_qrc/zurich/platform.py | 242 ++++----- 2 files changed, 569 insertions(+), 360 deletions(-) diff --git a/tests/dummy_qrc/zurich/parameters.json b/tests/dummy_qrc/zurich/parameters.json index 0ff76701ec..0392dae538 100644 --- a/tests/dummy_qrc/zurich/parameters.json +++ b/tests/dummy_qrc/zurich/parameters.json @@ -19,258 +19,519 @@ "readout": 250, "waveforms": 40000 } + } + }, + "components": { + "qubit_0/drive" : { + "frequency": 4000000000, + "power_range": 5 + }, + "qubit_1/drive" : { + "frequency": 4200000000, + "power_range": 0 + }, + "qubit_2/drive" : { + "frequency": 4500000000, + "power_range": -5 + }, + "qubit_3/drive" : { + "frequency": 4150000000, + "power_range": -10 + }, + "qubit_4/drive" : { + "frequency": 4155663000, + "power_range": 5 + }, + "qubit_0/flux" : { + "offset": -0.1, + "power_range": 0.2 + }, + "qubit_1/flux" : { + "offset": 0.0, + "power_range": 0.6 + }, + "qubit_2/flux" : { + "offset": 0.1, + "power_range": 0.4 + }, + "qubit_3/flux" : { + "offset": 0.2, + "power_range": 1 + }, + "qubit_4/flux" : { + "offset": 0.15, + "power_range": 5 + }, + "qubit_0/measure" : { + "frequency": 5200000000, + "power_range": -10 + }, + "qubit_1/measure" : { + "frequency": 4900000000, + "power_range": -10 + }, + "qubit_2/measure" : { + "frequency": 6100000000, + "power_range": -10 + }, + "qubit_3/measure" : { + "frequency": 5800000000, + "power_range": -10 + }, + "qubit_4/measure" : { + "frequency": 5500000000, + "power_range": -10 + }, + "qubit_0/acquire": { + "delay": 0, + "smearing": 0, + "power_range": 10 + }, + "qubit_1/acquire": { + "delay": 0, + "smearing": 0, + "power_range": 10 + }, + "qubit_2/acquire": { + "delay": 0, + "smearing": 0, + "power_range": 10 }, - "lo_readout": { - "frequency": 5500000000 + "qubit_3/acquire": { + "delay": 0, + "smearing": 0, + "power_range": 10 }, - "lo_drive_0": { - "frequency": 4200000000 + "qubit_4/acquire": { + "delay": 0, + "smearing": 0, + "power_range": 10 }, - "lo_drive_1": { - "frequency": 4600000000 + "coupler_0/flux" : { + "offset": 0.0, + "power_range": 3 }, - "lo_drive_2": { - "frequency": 4800000000 + "coupler_1/flux" : { + "offset": 0.0, + "power_range": 1 + }, + "coupler_3/flux" : { + "offset": 0.0, + "power_range": 0.4 + }, + "coupler_4/flux" : { + "offset": 0.0, + "power_range": 0.4 + }, + "measure/lo": { + "power": 10, + "frequency": 6000000000.0 + }, + "qubit_0_1/drive/lo": { + "power": 10, + "frequency": 3000000000.0 + }, + "qubit_2_3/drive/lo": { + "power": 10, + "frequency": 3500000000.0 + }, + "qubit_4/drive/lo": { + "power": 10, + "frequency": 4000000000.0 } }, "native_gates": { "single_qubit": { - "0": { - "RX": { - "duration": 40, - "amplitude": 0.625, - "frequency": 4095830788, - "envelope": { "kind": "drag", "rel_sigma": 0.2, "beta": 0.04 }, - "type": "qd" - }, - "RX12": { - "duration": 40, - "amplitude": 0.625, - "frequency": 4095830788, - "envelope": { "kind": "drag", "rel_sigma": 0.2, "beta": 0.04 }, - "type": "qd" - }, - "MZ": { - "duration": 2000, - "amplitude": 0.5, - "frequency": 5229200000, - "envelope": { "kind": "rectangular" }, - "type": "ro" - } - }, - "1": { - "RX": { - "duration": 90, - "amplitude": 0.2, - "frequency": 4170000000, - "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, - "type": "qd" - }, - "RX12": { - "duration": 90, - "amplitude": 0.2, - "frequency": 4170000000, - "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, - "type": "qd" - }, - "MZ": { - "duration": 1000, - "amplitude": 0.1, - "frequency": 4931000000, - "envelope": { "kind": "rectangular" }, - "type": "ro" - } - }, - "2": { - "RX": { - "duration": 40, - "amplitude": 0.59, - "frequency": 4300587281, - "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, - "type": "qd" - }, - "RX12": { - "duration": 40, - "amplitude": 0.59, - "frequency": 4300587281, - "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, - "type": "qd" - }, - "MZ": { - "duration": 2000, - "amplitude": 0.54, - "frequency": 6109000000.0, - "envelope": { "kind": "rectangular" }, - "type": "ro" - } - }, - "3": { - "RX": { - "duration": 90, - "amplitude": 0.75, - "frequency": 4100000000, - "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, - "type": "qd" - }, - "RX12": { - "duration": 90, - "amplitude": 0.75, - "frequency": 4100000000, - "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, - "type": "qd" - }, - "MZ": { - "duration": 2000, - "amplitude": 0.01, - "frequency": 5783000000, - "envelope": { "kind": "rectangular" }, - "type": "ro" - } - }, - "4": { - "RX": { - "duration": 53, - "amplitude": 1, - "frequency": 4196800000, - "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, - "type": "qd" - }, - "RX12": { - "duration": 53, - "amplitude": 1, - "frequency": 4196800000, - "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, - "type": "qd" - }, - "MZ": { - "duration": 1000, - "amplitude": 0.5, - "frequency": 5515000000, - "envelope": { "kind": "rectangular" }, - "type": "ro" - } - } + "0": { + "RX": { + "qubit_0/drive": [ + { + "duration": 40, + "amplitude": 0.5, + "envelope": { "kind": "gaussian", "rel_sigma": 2.0 }, + "type": "qd" + } + ] + }, + "MZ": { + "qubit_0/measure": [ + { + "duration": 2000, + "amplitude": 0.1, + "envelope": { "kind": "rectangular" }, + "type": "ro" + } + ] + } + }, + "1": { + "RX": { + "qubit_1/drive": [ + { + "duration": 40, + "amplitude": 0.5, + "envelope": { "kind": "gaussian", "rel_sigma": 2.0 }, + "type": "qd" + } + ] + }, + "MZ": { + "qubit_1/measure": [ + { + "duration": 2000, + "amplitude": 0.2, + "envelope": { "kind": "rectangular" }, + "type": "ro" + } + ] + } + }, + "2": { + "RX": { + "qubit_2/drive": [ + { + "duration": 40, + "amplitude": 0.54, + "envelope": { "kind": "gaussian", "rel_sigma": 2.0 }, + "type": "qd" + } + ] + }, + "MZ": { + "qubit_2/measure": [ + { + "duration": 2000, + "amplitude": 0.02, + "envelope": { "kind": "rectangular" }, + "type": "ro" + } + ] + } + }, + "3": { + "RX": { + "qubit_3/drive": [ + { + "duration": 40, + "amplitude": 0.454, + "envelope": { "kind": "gaussian", "rel_sigma": 2.0 }, + "type": "qd" + } + ] + }, + "MZ": { + "qubit_3/measure": [ + { + "duration": 2000, + "amplitude": 0.25, + "envelope": { "kind": "rectangular" }, + "type": "ro" + } + ] + } + }, + "4": { + "RX": { + "qubit_4/drive": [ + { + "duration": 40, + "amplitude": 0.6, + "envelope": { "kind": "gaussian", "rel_sigma": 2.0 }, + "type": "qd" + } + ] + }, + "MZ": { + "qubit_4/measure": [ + { + "duration": 2000, + "amplitude": 0.31, + "envelope": { "kind": "rectangular" }, + "type": "ro" + } + ] + } + } }, - "coupler": { - "0": { - "CP": { - "type": "cf", - "duration": 1000, - "amplitude": 0.5, - "frequency": 0, - "envelope": { "kind": "rectangular" } + "two_qubit": { + "0-2": { + "CZ": { + "qubit_2/flux": [ + { + "duration": 80, + "amplitude": 0.057, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, + "type": "qf" + } + ], + "qubit_0/drive": [ + { + "type": "vz", + "phase": 0.0 + } + ], + "qubit_2/drive": [ + { + "type": "vz", + "phase": 0.0 + } + ], + "coupler_0/flux": [ + { + "duration": 30, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, + "type": "cf" + } + ] } }, - "1": { - "CP": { - "type": "cf", - "duration": 1000, - "amplitude": 0.5, - "frequency": 0, - "envelope": { "kind": "rectangular" } + "1-2": { + "CZ": { + "qubit_2/flux": [ + { + "duration": 30, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, + "type": "qf" + } + ], + "qubit_1/drive": [ + { + "type": "vz", + "phase": 0.0 + } + ], + "qubit_2/drive": [ + { + "type": "vz", + "phase": 0.0 + } + ], + "coupler_1/flux": [ + { + "duration": 30, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, + "type": "cf" + } + ] } }, - "3": { - "CP": { - "type": "cf", - "duration": 1000, - "amplitude": 0.5, - "frequency": 0, - "envelope": { "kind": "rectangular" } + "2-3": { + "CZ": { + "qubit_2/flux": [ + { + "duration": 30, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, + "type": "qf" + } + ], + "qubit_2/drive": [ + { + "type": "vz", + "phase": 0.0 + } + ], + "qubit_3/drive": [ + { + "type": "vz", + "phase": 0.0 + } + ], + "coupler_3/flux": [ + { + "duration": 30, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, + "type": "cf" + } + ] } }, - "4": { - "CP": { - "type": "cf", - "duration": 1000, - "amplitude": 0.5, - "frequency": 0, - "envelope": { "kind": "rectangular" } - } - } - }, - "two_qubit": { - "1-2": { - "CZ": [ - { - "duration": 32, - "amplitude": -0.6025, - "envelope": { - "kind": "exponential", - "tau": 12, - "upsilon": 5000, - "g": 0.1 - }, - "qubit": 3, - "frequency": 0, - "type": "qf" - }, - { - "type": "vz", - "phase": -3.63, - "qubit": 1 - }, - { + "2-4": { + "CZ": { + "qubit_2/flux": [ + { + "duration": 30, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, + "type": "qf" + } + ], + "qubit_2/drive": [ + { + "type": "vz", + "phase": 0.0 + } + ], + "qubit_4/drive": [ + { "type": "vz", - "phase": -0.041, - "qubit": 2 - } - ] + "phase": 0.0 + } + ], + "coupler_4/flux": [ + { + "duration": 30, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5, + "width": 0.75 + }, + "type": "cf" + } + ] + } } } }, - "characterization": { + "characterization": { "single_qubit": { "0": { - "readout_frequency": 5229200000, - "drive_frequency": 4095830788, + "bare_resonator_frequency": 0, + "anharmonicity": 0, + "asymmetry": 0.0, + "crosstalk_matrix": { + "0": 1 + }, + "Ec": 0.0, + "Ej": 0.0, + "g": 0.0, + "assignment_fidelity": 0.0, + "peak_voltage": 0, + "pi_pulse_amplitude": 0, "T1": 0.0, "T2": 0.0, - "sweetspot": 0.05, - "mean_gnd_states": [1.542, 0.1813], - "mean_exc_states": [2.4499, -0.5629], - "threshold": 0.8836, - "iq_angle": -1.551 + "T2_spin_echo": 0, + "state0_voltage": 0, + "state1_voltage": 0, + "mean_gnd_states": [0, 1], + "mean_exc_states": [1, 0], + "threshold": 0.0, + "iq_angle": 0.0 }, "1": { - "readout_frequency": 4931000000, - "drive_frequency": 4170000000, + "bare_resonator_frequency": 0, + "anharmonicity": 0, + "asymmetry": 0.0, + "crosstalk_matrix": { + "1": 1 + }, + "Ec": 0.0, + "Ej": 0.0, + "g": 0.0, + "assignment_fidelity": 0.0, + "peak_voltage": 0, + "pi_pulse_amplitude": 0, "T1": 0.0, "T2": 0.0, - "sweetspot": 0.0, - "mean_gnd_states": [0, 0], - "mean_exc_states": [0, 0] + "T2_spin_echo": 0, + "state0_voltage": 0, + "state1_voltage": 0, + "mean_gnd_states": [0.25, 0], + "mean_exc_states": [0, 0.25], + "threshold": 0.0, + "iq_angle": 0.0 }, "2": { - "readout_frequency": 6109000000.0, - "drive_frequency": 4300587281, + "bare_resonator_frequency": 0, + "anharmonicity": 0, + "asymmetry": 0.0, + "crosstalk_matrix": { + "2": 1 + }, + "Ec": 0.0, + "Ej": 0.0, + "g": 0.0, + "assignment_fidelity": 0.0, + "peak_voltage": 0, + "pi_pulse_amplitude": 0, "T1": 0.0, "T2": 0.0, - "sweetspot": 0.0, - "mean_gnd_states": [-1.8243, 1.5926], - "mean_exc_states": [-0.8083, 2.3929], - "threshold": -0.0593, - "iq_angle": -0.667 + "T2_spin_echo": 0, + "state0_voltage": 0, + "state1_voltage": 0, + "mean_gnd_states": [0.5, 0], + "mean_exc_states": [0, 0.5], + "threshold": 0.0, + "iq_angle": 0.0 }, "3": { - "readout_frequency": 5783000000, - "drive_frequency": 4100000000, + "bare_resonator_frequency": 0, + "anharmonicity": 0, + "asymmetry": 0.0, + "crosstalk_matrix": { + "3": 1 + }, + "Ec": 0.0, + "Ej": 0.0, + "g": 0.0, + "assignment_fidelity": 0.0, + "peak_voltage": 0, + "pi_pulse_amplitude": 0, "T1": 0.0, "T2": 0.0, - "sweetspot": 0.0, - "mean_gnd_states": [0, 0], - "mean_exc_states": [0, 0] + "T2_spin_echo": 0, + "state0_voltage": 0, + "state1_voltage": 0, + "mean_gnd_states": [0.75, 0], + "mean_exc_states": [0, 0.75], + "threshold": 0.0, + "iq_angle": 0.0 }, "4": { - "readout_frequency": 5515000000, - "drive_frequency": 4196800000, + "bare_resonator_frequency": 0, + "anharmonicity": 0, + "asymmetry": 0.0, + "crosstalk_matrix": { + "4": 1 + }, + "Ec": 0.0, + "Ej": 0.0, + "g": 0.0, + "assignment_fidelity": 0.0, + "peak_voltage": 0, + "pi_pulse_amplitude": 0, "T1": 0.0, "T2": 0.0, - "sweetspot": 0.0, - "mean_gnd_states": [0, 0], - "mean_exc_states": [0, 0], - "threshold": 0.233806, - "iq_angle": 0.481 + "T2_spin_echo": 0, + "state0_voltage": 0, + "state1_voltage": 0, + "mean_gnd_states": [1, 0], + "mean_exc_states": [0, 1], + "threshold": 0.0, + "iq_angle": 0.0 } }, "coupler": { diff --git a/tests/dummy_qrc/zurich/platform.py b/tests/dummy_qrc/zurich/platform.py index 8a984b4af1..7464010f88 100644 --- a/tests/dummy_qrc/zurich/platform.py +++ b/tests/dummy_qrc/zurich/platform.py @@ -1,4 +1,3 @@ -import itertools import pathlib from laboneq.dsl.device import create_connection @@ -6,11 +5,17 @@ from laboneq.simple import DeviceSetup from qibolab import Platform -from qibolab.channel import Channel, ChannelMap -from qibolab.instruments.dummy import DummyLocalOscillator as LocalOscillator -from qibolab.instruments.zhinst import Zurich +from qibolab.components import AcquireChannel, DcChannel, IqChannel, OscillatorConfig +from qibolab.instruments.zhinst import ( + ZiAcquisitionConfig, + ZiChannel, + ZiDcConfig, + ZiIqConfig, + Zurich, +) from qibolab.kernels import Kernels from qibolab.serialize import ( + load_component_config, load_instrument_settings, load_qubits, load_runcard, @@ -18,61 +23,22 @@ ) FOLDER = pathlib.Path(__file__).parent -N_QUBITS = 5 +QUBITS = [0, 1, 2, 3, 4] +COUPLERS = [0, 1, 3, 4] def create(): - """IQM 5q-chip controlled Zurich Instruments (Zh) SHFQC, HDAWGs and - PQSC.""" + """A platform representing a chip with star topology, featuring 5 qubits + and 4 couplers, controlled by Zurich Instruments SHFQC, HDAWGs and PQSC.""" - device_setup = DeviceSetup("EL_ZURO") - # Dataserver + device_setup = DeviceSetup("device setup") device_setup.add_dataserver(host="localhost", port=8004) - # Instruments device_setup.add_instruments( HDAWG("device_hdawg", address="DEV8660"), HDAWG("device_hdawg2", address="DEV8673"), PQSC("device_pqsc", address="DEV10055", reference_clock_source="internal"), SHFQC("device_shfqc", address="DEV12146"), ) - device_setup.add_connections( - "device_shfqc", - *[ - create_connection( - to_signal=f"q{i}/drive_line", ports=[f"SGCHANNELS/{i}/OUTPUT"] - ) - for i in range(N_QUBITS) - ], - *[ - create_connection( - to_signal=f"q{i}/measure_line", ports=["QACHANNELS/0/OUTPUT"] - ) - for i in range(N_QUBITS) - ], - *[ - create_connection( - to_signal=f"q{i}/acquire_line", ports=["QACHANNELS/0/INPUT"] - ) - for i in range(N_QUBITS) - ], - ) - device_setup.add_connections( - "device_hdawg", - *[ - create_connection(to_signal=f"q{i}/flux_line", ports=f"SIGOUTS/{i}") - for i in range(N_QUBITS) - ], - *[ - create_connection(to_signal=f"qc{c}/flux_line", ports=f"SIGOUTS/{i}") - for c, i in zip(itertools.chain(range(0, 2), range(3, 4)), range(5, 8)) - ], - ) - - device_setup.add_connections( - "device_hdawg2", - create_connection(to_signal="qc4/flux_line", ports=["SIGOUTS/0"]), - ) - device_setup.add_connections( "device_pqsc", create_connection(to_instrument="device_hdawg2", ports="ZSYNCS/1"), @@ -80,121 +46,103 @@ def create(): create_connection(to_instrument="device_shfqc", ports="ZSYNCS/2"), ) - controller = Zurich( - "EL_ZURO", - device_setup=device_setup, - time_of_flight=75, - smearing=50, - ) + runcard = load_runcard(FOLDER) + kernels = Kernels.load(FOLDER) + qubits, couplers, pairs = load_qubits(runcard, kernels) + settings = load_settings(runcard) - # Create channel objects and map controllers - channels = ChannelMap() - # feedback - channels |= Channel( - "L2-7", port=controller.ports(("device_shfqc", "[QACHANNELS/0/INPUT]")) - ) - # readout - channels |= Channel( - "L3-31", port=controller.ports(("device_shfqc", "[QACHANNELS/0/OUTPUT]")) + components = {} + measure_lo = "measure/lo" + drive_los = { + 0: "qubit_0_1/drive/lo", + 1: "qubit_0_1/drive/lo", + 2: "qubit_2_3/drive/lo", + 3: "qubit_2_3/drive/lo", + 4: "qubit_4/drive/lo", + } + components[measure_lo] = load_component_config( + runcard, measure_lo, OscillatorConfig ) - # drive - channels |= ( - Channel( - f"L4-{i}", - port=controller.ports(("device_shfqc", f"SGCHANNELS/{i-5}/OUTPUT")), + zi_channels = [] + for q in QUBITS: + measure_name = f"qubit_{q}/measure" + acquisition_name = f"qubit_{q}/acquire" + components[measure_name] = load_component_config( + runcard, measure_name, ZiIqConfig + ) + qubits[q].measure = IqChannel( + name=measure_name, lo=measure_lo, mixer=None, acquisition=acquisition_name + ) + zi_channels.append( + ZiChannel( + qubits[q].measure, device="device_shfqc", path="QACHANNELS/0/OUTPUT" + ) ) - for i in range(15, 20) - ) - # flux qubits (CAREFUL WITH THIS !!!) - channels |= ( - Channel(f"L4-{i}", port=controller.ports(("device_hdawg", f"SIGOUTS/{i-6}"))) - for i in range(6, 11) - ) - # flux couplers - channels |= ( - Channel(f"L4-{i}", port=controller.ports(("device_hdawg", f"SIGOUTS/{i-11+5}"))) - for i in range(11, 14) - ) - channels |= Channel("L4-14", port=controller.ports(("device_hdawg2", "SIGOUTS/0"))) - # TWPA pump(EraSynth) - channels |= Channel("L3-32") - - # SHFQC - # Sets the maximal Range of the Signal Output power. - # The instrument selects the closest available Range [-50. -30. -25. -20. -15. -10. -5. 0. 5. 10.] - # with a resolution of 5 dBm. - - # readout "gain": Set to max power range (10 Dbm) if no distorsion - channels["L3-31"].power_range = -15 # -15 - # feedback "gain": play with the power range to calibrate the best RO - channels["L2-7"].power_range = 10 - - # drive - # The instrument selects the closest available Range [-30. -25. -20. -15. -10. -5. 0. 5. 10.] - channels["L4-15"].power_range = -10 # q0 - channels["L4-16"].power_range = -5 # q1 - channels["L4-17"].power_range = -10 # q2 - channels["L4-18"].power_range = -5 # q3 - channels["L4-19"].power_range = -10 # q4 - - # HDAWGS - # Sets the output voltage range. - # The instrument selects the next higher available Range with a resolution of 0.4 Volts. - - # flux - for i in range(6, 11): - channels[f"L4-{i}"].power_range = 0.8 - # flux couplers - for i in range(11, 15): - channels[f"L4-{i}"].power_range = 0.8 - # Instantiate local oscillators - local_oscillators = [ - LocalOscillator(f"lo_{kind}", None) - for kind in ["readout"] + [f"drive_{n}" for n in range(3)] - ] + components[acquisition_name] = load_component_config( + runcard, acquisition_name, ZiAcquisitionConfig + ) + qubits[q].acquisition = AcquireChannel( + name=acquisition_name, + twpa_pump=None, + measure=measure_name, + ) + zi_channels.append( + ZiChannel( + qubits[q].acquisition, device="device_shfqc", path="QACHANNELS/0/INPUT" + ) + ) - # Map LOs to channels - ch_to_lo = { - "L3-31": 0, - "L4-15": 1, - "L4-16": 1, - "L4-17": 2, - "L4-18": 2, - "L4-19": 3, - } - for ch, lo in ch_to_lo.items(): - channels[ch].local_oscillator = local_oscillators[lo] + drive_name = f"qubit_{q}/drive" + components[drive_los[q]] = load_component_config( + runcard, drive_los[q], OscillatorConfig + ) + components[drive_name] = load_component_config(runcard, drive_name, ZiIqConfig) + qubits[q].drive = IqChannel( + name=drive_name, + mixer=None, + lo=drive_los[q], + ) + zi_channels.append( + ZiChannel( + qubits[q].drive, device="device_shfqc", path=f"SGCHANNELS/{q}/OUTPUT" + ) + ) - # create qubit objects - runcard = load_runcard(FOLDER) - kernels = Kernels.load(FOLDER) - qubits, couplers, pairs = load_qubits(runcard, kernels) - settings = load_settings(runcard) + flux_name = f"qubit_{q}/flux" + components[flux_name] = load_component_config(runcard, flux_name, ZiDcConfig) + qubits[q].flux = DcChannel( + name=flux_name, + ) + zi_channels.append( + ZiChannel(qubits[q].flux, device="device_hdawg", path=f"SIGOUTS/{q}") + ) - # assign channels to qubits and sweetspots(operating points) - for q in range(0, 5): - qubits[q].readout = channels["L3-31"] - qubits[q].feedback = channels["L2-7"] + for i, c in enumerate(COUPLERS): + flux_name = f"coupler_{c}/flux" + components[flux_name] = load_component_config(runcard, flux_name, ZiDcConfig) + couplers[c].flux = DcChannel(name=flux_name) + zi_channels.append( + ZiChannel(couplers[c].flux, device="device_hdawg2", path=f"SIGOUTS/{i}") + ) - for q in range(0, 5): - qubits[q].drive = channels[f"L4-{15 + q}"] - qubits[q].flux = channels[f"L4-{6 + q}"] - qubits[q].twpa = channels["L3-32"] - channels[f"L4-{6 + q}"].qubit = qubits[q] + controller = Zurich( + "EL_ZURO", + device_setup=device_setup, + channels=zi_channels, + time_of_flight=75, + smearing=50, + ) - # assign channels to couplers and sweetspots(operating points) - for c, coupler in enumerate(couplers.values()): - coupler.flux = channels[f"L4-{11 + c}"] instruments = {controller.name: controller} - instruments.update({lo.name: lo for lo in local_oscillators}) instruments = load_instrument_settings(runcard, instruments) return Platform( str(FOLDER), qubits, pairs, + components, instruments, settings, - resonator_type="2D", + resonator_type="3D", couplers=couplers, ) From 70e8d45c81a799e5dffc4936f901bfc9ac34c65c Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 16 Jul 2024 11:25:20 +0400 Subject: [PATCH 0342/1006] change confusing name of platform --- tests/test_instruments_zhinst.py | 126 +++++++++++++++++-------------- 1 file changed, 68 insertions(+), 58 deletions(-) diff --git a/tests/test_instruments_zhinst.py b/tests/test_instruments_zhinst.py index 16f04a7b6a..3b23c1ec27 100644 --- a/tests/test_instruments_zhinst.py +++ b/tests/test_instruments_zhinst.py @@ -213,52 +213,62 @@ def test_processed_sweeps_pulse_properties(dummy_qrc): def test_zhinst_setup(dummy_qrc): platform = create_platform("zurich") - IQM5q = platform.instruments["EL_ZURO"] - assert IQM5q.time_of_flight == 75 + zi_instrument = platform.instruments["EL_ZURO"] + assert zi_instrument.time_of_flight == 75 def test_zhinst_configure_acquire_line(dummy_qrc): platform = create_platform("zurich") - IQM5q = platform.instruments["EL_ZURO"] + zi_instrument = platform.instruments["EL_ZURO"] qubit = platform.qubits[0] - IQM5q.configure_acquire_line(qubit.acquisition.name, platform.component_configs) + zi_instrument.configure_acquire_line( + qubit.acquisition.name, platform.component_configs + ) - assert qubit.acquisition.name in IQM5q.signal_map + assert qubit.acquisition.name in zi_instrument.signal_map assert ( - "/logical_signal_groups/q0/acquire_line" in IQM5q.calibration.calibration_items + "/logical_signal_groups/q0/acquire_line" + in zi_instrument.calibration.calibration_items ) def test_zhinst_configure_iq_line(dummy_qrc): platform = create_platform("zurich") - IQM5q = platform.instruments["EL_ZURO"] + zi_instrument = platform.instruments["EL_ZURO"] qubit = platform.qubits[0] - IQM5q.configure_iq_line(qubit.drive.name, platform.component_configs) - IQM5q.configure_iq_line(qubit.measure.name, platform.component_configs) + zi_instrument.configure_iq_line(qubit.drive.name, platform.component_configs) + zi_instrument.configure_iq_line(qubit.measure.name, platform.component_configs) - assert qubit.drive.name in IQM5q.signal_map - assert "/logical_signal_groups/q0/drive_line" in IQM5q.calibration.calibration_items + assert qubit.drive.name in zi_instrument.signal_map + assert ( + "/logical_signal_groups/q0/drive_line" + in zi_instrument.calibration.calibration_items + ) - assert qubit.measure.name in IQM5q.signal_map + assert qubit.measure.name in zi_instrument.signal_map assert ( - "/logical_signal_groups/q0/measure_line" in IQM5q.calibration.calibration_items + "/logical_signal_groups/q0/measure_line" + in zi_instrument.calibration.calibration_items ) def test_zhinst_configure_dc_line(dummy_qrc): platform = create_platform("zurich") - IQM5q = platform.instruments["EL_ZURO"] + zi_instrument = platform.instruments["EL_ZURO"] qubit = platform.qubits[0] - IQM5q.configure_dc_line(qubit.flux.name, platform.component_configs) + zi_instrument.configure_dc_line(qubit.flux.name, platform.component_configs) - assert qubit.flux.name in IQM5q.signal_map - assert "/logical_signal_groups/q0/flux_line" in IQM5q.calibration.calibration_items + assert qubit.flux.name in zi_instrument.signal_map + assert ( + "/logical_signal_groups/q0/flux_line" + in zi_instrument.calibration.calibration_items + ) def test_experiment_flow(dummy_qrc): platform = create_platform("zurich") - IQM5q = platform.instruments["EL_ZURO"] + zi_instrument = platform.instruments["EL_ZURO"] sequence = PulseSequence() qubits = {0: platform.qubits[0], 2: platform.qubits[2]} @@ -282,16 +292,16 @@ def test_experiment_flow(dummy_qrc): averaging_mode=AveragingMode.CYCLIC, ) - IQM5q.experiment_flow(qubits, couplers, sequence, options) + zi_instrument.experiment_flow(qubits, couplers, sequence, options) - assert qubits[0].flux.name in IQM5q.experiment.signals - assert qubits[0].measure.name in IQM5q.experiment.signals - assert qubits[0].acquisition.name in IQM5q.experiment.signals + assert qubits[0].flux.name in zi_instrument.experiment.signals + assert qubits[0].measure.name in zi_instrument.experiment.signals + assert qubits[0].acquisition.name in zi_instrument.experiment.signals def test_experiment_flow_coupler(dummy_qrc): platform = create_platform("zurich") - IQM5q = platform.instruments["EL_ZURO"] + zi_instrument = platform.instruments["EL_ZURO"] sequence = PulseSequence() qubits = {0: platform.qubits[0], 2: platform.qubits[2]} @@ -326,17 +336,17 @@ def test_experiment_flow_coupler(dummy_qrc): averaging_mode=AveragingMode.CYCLIC, ) - IQM5q.experiment_flow(qubits, couplers, sequence, options) + zi_instrument.experiment_flow(qubits, couplers, sequence, options) - assert qubits[0].flux.name in IQM5q.experiment.signals - assert qubits[0].measure.name in IQM5q.experiment.signals - assert qubits[0].acquisition.name in IQM5q.experiment.signals + assert qubits[0].flux.name in zi_instrument.experiment.signals + assert qubits[0].measure.name in zi_instrument.experiment.signals + assert qubits[0].acquisition.name in zi_instrument.experiment.signals def test_sweep_and_play_sim(dummy_qrc): """Test end-to-end experiment run using ZI emulated connection.""" platform = create_platform("zurich") - IQM5q = platform.instruments["EL_ZURO"] + zi_instrument = platform.instruments["EL_ZURO"] sequence = PulseSequence() qubits = {0: platform.qubits[0], 2: platform.qubits[2]} @@ -362,14 +372,14 @@ def test_sweep_and_play_sim(dummy_qrc): ) # check play - IQM5q.session = lo.Session(IQM5q.device_setup) - IQM5q.session.connect(do_emulation=True) - res = IQM5q.play(qubits, couplers, sequence, options) + zi_instrument.session = lo.Session(zi_instrument.device_setup) + zi_instrument.session.connect(do_emulation=True) + res = zi_instrument.play(qubits, couplers, sequence, options) assert res is not None assert all(qubit in res for qubit in qubits) # check sweep with empty list of sweeps - res = IQM5q.sweep(qubits, couplers, sequence, options) + res = zi_instrument.sweep(qubits, couplers, sequence, options) assert res is not None assert all(qubit in res for qubit in qubits) @@ -382,7 +392,7 @@ def test_sweep_and_play_sim(dummy_qrc): sweep_2 = Sweeper( Parameter.bias, np.array([1, 2, 3]), channels=[qubits[0].flux.name] ) - res = IQM5q.sweep(qubits, couplers, sequence, options, sweep_1, sweep_2) + res = zi_instrument.sweep(qubits, couplers, sequence, options, sweep_1, sweep_2) assert res is not None assert all(qubit in res for qubit in qubits) @@ -390,7 +400,7 @@ def test_sweep_and_play_sim(dummy_qrc): @pytest.mark.parametrize("parameter1", [Parameter.duration]) def test_experiment_sweep_single(dummy_qrc, parameter1): platform = create_platform("zurich") - IQM5q = platform.instruments["EL_ZURO"] + zi_instrument = platform.instruments["EL_ZURO"] qubit_id, qubit = 0, platform.qubits[0] couplers = {} @@ -418,17 +428,17 @@ def test_experiment_sweep_single(dummy_qrc, parameter1): averaging_mode=AveragingMode.CYCLIC, ) - IQM5q.experiment_flow({qubit_id: qubit}, couplers, sequence, options) + zi_instrument.experiment_flow({qubit_id: qubit}, couplers, sequence, options) - assert qubit.drive.name in IQM5q.experiment.signals - assert qubit.measure.name in IQM5q.experiment.signals - assert qubit.acquisition.name in IQM5q.experiment.signals + assert qubit.drive.name in zi_instrument.experiment.signals + assert qubit.measure.name in zi_instrument.experiment.signals + assert qubit.acquisition.name in zi_instrument.experiment.signals @pytest.mark.parametrize("parameter1", [Parameter.duration]) def test_experiment_sweep_single_coupler(dummy_qrc, parameter1): platform = create_platform("zurich") - IQM5q = platform.instruments["EL_ZURO"] + zi_instrument = platform.instruments["EL_ZURO"] qubits = {0: platform.qubits[0], 2: platform.qubits[2]} couplers = {0: platform.couplers[0]} @@ -471,12 +481,12 @@ def test_experiment_sweep_single_coupler(dummy_qrc, parameter1): averaging_mode=AveragingMode.CYCLIC, ) - IQM5q.experiment_flow(qubits, couplers, sequence, options) + zi_instrument.experiment_flow(qubits, couplers, sequence, options) - assert couplers[0].flux.name in IQM5q.experiment.signals - assert qubits[0].drive.name in IQM5q.experiment.signals - assert qubits[0].measure.name in IQM5q.experiment.signals - assert qubits[0].acquisition.name in IQM5q.experiment.signals + assert couplers[0].flux.name in zi_instrument.experiment.signals + assert qubits[0].drive.name in zi_instrument.experiment.signals + assert qubits[0].measure.name in zi_instrument.experiment.signals + assert qubits[0].acquisition.name in zi_instrument.experiment.signals SweeperParameter = { @@ -491,7 +501,7 @@ def test_experiment_sweep_single_coupler(dummy_qrc, parameter1): @pytest.mark.parametrize("parameter2", Parameter) def test_experiment_sweep_2d_general(dummy_qrc, parameter1, parameter2): platform = create_platform("zurich") - IQM5q = platform.instruments["EL_ZURO"] + zi_instrument = platform.instruments["EL_ZURO"] qubits = {0: platform.qubits[0]} couplers = {} @@ -546,16 +556,16 @@ def test_experiment_sweep_2d_general(dummy_qrc, parameter1, parameter2): averaging_mode=AveragingMode.CYCLIC, ) - IQM5q.experiment_flow(qubits, couplers, sequence, options) + zi_instrument.experiment_flow(qubits, couplers, sequence, options) - assert qubits[0].drive.name in IQM5q.experiment.signals - assert qubits[0].measure.name in IQM5q.experiment.signals - assert qubits[0].acquisition.name in IQM5q.experiment.signals + assert qubits[0].drive.name in zi_instrument.experiment.signals + assert qubits[0].measure.name in zi_instrument.experiment.signals + assert qubits[0].acquisition.name in zi_instrument.experiment.signals def test_experiment_sweep_2d_specific(dummy_qrc): platform = create_platform("zurich") - IQM5q = platform.instruments["EL_ZURO"] + zi_instrument = platform.instruments["EL_ZURO"] qubits = {0: platform.qubits[0]} couplers = {} @@ -593,11 +603,11 @@ def test_experiment_sweep_2d_specific(dummy_qrc): averaging_mode=AveragingMode.CYCLIC, ) - IQM5q.experiment_flow(qubits, couplers, sequence, options) + zi_instrument.experiment_flow(qubits, couplers, sequence, options) - assert qubits[0].drive.name in IQM5q.experiment.signals - assert qubits[0].measure.name in IQM5q.experiment.signals - assert qubits[0].acquisition.name in IQM5q.experiment.signals + assert qubits[0].drive.name in zi_instrument.experiment.signals + assert qubits[0].measure.name in zi_instrument.experiment.signals + assert qubits[0].acquisition.name in zi_instrument.experiment.signals @pytest.mark.parametrize( @@ -605,7 +615,7 @@ def test_experiment_sweep_2d_specific(dummy_qrc): ) def test_experiment_sweep_punchouts(dummy_qrc, parameter): platform = create_platform("zurich") - IQM5q = platform.instruments["EL_ZURO"] + zi_instrument = platform.instruments["EL_ZURO"] qubits = {0: platform.qubits[0]} couplers = {} @@ -657,10 +667,10 @@ def test_experiment_sweep_punchouts(dummy_qrc, parameter): averaging_mode=AveragingMode.CYCLIC, ) - IQM5q.experiment_flow(qubits, couplers, sequence, options) + zi_instrument.experiment_flow(qubits, couplers, sequence, options) - assert qubits[0].measure.name in IQM5q.experiment.signals - assert qubits[0].acquisition.name in IQM5q.experiment.signals + assert qubits[0].measure.name in zi_instrument.experiment.signals + assert qubits[0].acquisition.name in zi_instrument.experiment.signals def test_batching(dummy_qrc): From 4c4f8398cad1d81b1ea97a4bd072790725d29cc8 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Wed, 17 Jul 2024 10:12:42 +0400 Subject: [PATCH 0343/1006] recover function lost during rebase --- src/qibolab/serialize.py | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index 743fb54f92..42fbc958ad 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -10,6 +10,8 @@ from pathlib import Path from typing import Tuple, Union +from pydantic import ConfigDict, TypeAdapter + from qibolab.components import Config from qibolab.couplers import Coupler from qibolab.kernels import Kernels @@ -27,7 +29,8 @@ QubitPairMap, Settings, ) -from qibolab.pulses import Delay, Pulse, PulseSequence, VirtualZ +from qibolab.pulses import Pulse, PulseSequence +from qibolab.pulses.pulse import PulseLike from qibolab.qubits import Qubit, QubitId, QubitPair RUNCARD = "parameters.json" @@ -103,14 +106,19 @@ def load_qubits( return qubits, couplers, pairs -def _load_pulse(pulse_kwargs): - if "phase" in pulse_kwargs: - return VirtualZ(**pulse_kwargs) - if "amplitude" not in pulse_kwargs: - return Delay(**pulse_kwargs) - if "frequency" not in pulse_kwargs: - return Pulse.flux(**pulse_kwargs) - return Pulse(**pulse_kwargs) +_PulseLike = TypeAdapter(PulseLike, config=ConfigDict(extra="ignore")) +"""Parse a pulse-like object. + +.. note:: + + Extra arguments are ignored, in order to standardize the qubit handling, since the + :cls:`Delay` object has no `qubit` field. + This will be removed once there won't be any need for dedicated couplers handling. +""" + + +def _load_pulse(pulse_kwargs: dict): + return _PulseLike.validate_python(pulse_kwargs) def _load_sequence(raw_sequence): @@ -162,11 +170,11 @@ def register_gates( native_gates = runcard.get("native_gates", {}) for q, gates in native_gates.get("single_qubit", {}).items(): qubit = qubits[load_qubit_name(q)] - qubit.native_gates = _load_single_qubit_natives(qubit, gates) + qubit.native_gates = _load_single_qubit_natives(gates) for c, gates in native_gates.get("coupler", {}).items(): coupler = couplers[load_qubit_name(c)] - coupler.native_gates = _load_single_qubit_natives(coupler, gates) + coupler.native_gates = _load_single_qubit_natives(gates) # register two-qubit native gates to ``QubitPair`` objects for pair, gatedict in native_gates.get("two_qubit", {}).items(): From 246bdfc5d5f1420ebdd4c59b48d98666bc06e6b9 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Wed, 17 Jul 2024 10:22:16 +0400 Subject: [PATCH 0344/1006] improve type annotation --- src/qibolab/pulses/sequence.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qibolab/pulses/sequence.py b/src/qibolab/pulses/sequence.py index 3bbfe0f853..6732c868f5 100644 --- a/src/qibolab/pulses/sequence.py +++ b/src/qibolab/pulses/sequence.py @@ -2,10 +2,10 @@ from collections import defaultdict -from .pulse import Delay, PulseType +from .pulse import Delay, PulseLike, PulseType -class PulseSequence(defaultdict): +class PulseSequence(defaultdict[str, list[PulseLike]]): """Synchronized sequence of control instructions across multiple channels. The keys are names of channels, and the values are lists of pulses From 9f604c28ec276fef81774a53ee561e18fc335329 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Mon, 22 Jul 2024 15:30:14 +0400 Subject: [PATCH 0345/1006] implement init from dict --- src/qibolab/pulses/sequence.py | 6 ++++-- tests/pulses/test_sequence.py | 24 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/qibolab/pulses/sequence.py b/src/qibolab/pulses/sequence.py index 6732c868f5..844656c5f4 100644 --- a/src/qibolab/pulses/sequence.py +++ b/src/qibolab/pulses/sequence.py @@ -1,6 +1,7 @@ """PulseSequence class.""" from collections import defaultdict +from typing import Optional from .pulse import Delay, PulseLike, PulseType @@ -12,8 +13,9 @@ class PulseSequence(defaultdict[str, list[PulseLike]]): and delays """ - def __init__(self): - super().__init__(list) + def __init__(self, seq_dict: Optional[dict[str, list[PulseLike]]] = None): + initial_content = seq_dict if seq_dict is not None else {} + super().__init__(list, **initial_content) @property def ro_pulses(self): diff --git a/tests/pulses/test_sequence.py b/tests/pulses/test_sequence.py index 8f1a265184..c8edadc0c0 100644 --- a/tests/pulses/test_sequence.py +++ b/tests/pulses/test_sequence.py @@ -17,6 +17,30 @@ def test_init(): assert len(sequence) == 0 +def test_init_with_dict(): + seq_dict = { + "some channel": [ + Pulse(duration=20, amplitude=0.1, envelope=Gaussian(rel_sigma=3)), + Pulse(duration=30, amplitude=0.5, envelope=Gaussian(rel_sigma=3)), + ], + "other channel": [ + Pulse(duration=40, amplitude=0.2, envelope=Gaussian(rel_sigma=3)) + ], + "chanel #5": [ + Pulse(duration=45, amplitude=1.0, envelope=Gaussian(rel_sigma=3)), + Pulse(duration=50, amplitude=0.7, envelope=Gaussian(rel_sigma=3)), + Pulse(duration=60, amplitude=-0.65, envelope=Gaussian(rel_sigma=3)), + ], + } + seq = PulseSequence(seq_dict) + + assert len(seq) == 3 + assert set(seq.keys()) == set(seq_dict.keys()) + assert len(seq["some channel"]) == 2 + assert len(seq["other channel"]) == 1 + assert len(seq["chanel #5"]) == 3 + + def test_default_factory(): sequence = PulseSequence() some = sequence["some channel"] From 75580d1a4ebfdae90e6093b9e72fdd14ee4ffb4e Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 23 Jul 2024 10:59:42 +0400 Subject: [PATCH 0346/1006] update documentation --- doc/source/getting-started/experiment.rst | 137 ++++-- doc/source/main-documentation/qibolab.rst | 168 +++----- doc/source/tutorials/calibration.rst | 48 +-- doc/source/tutorials/compiler.rst | 2 +- doc/source/tutorials/instrument.rst | 27 -- doc/source/tutorials/lab.rst | 503 +++++++++++----------- doc/source/tutorials/pulses.rst | 12 +- src/qibolab/platform/platform.py | 7 +- src/qibolab/sweeper.py | 7 +- tests/emulators/default_q0/platform.py | 18 +- 10 files changed, 442 insertions(+), 487 deletions(-) diff --git a/doc/source/getting-started/experiment.rst b/doc/source/getting-started/experiment.rst index 4991c49f46..14e72a5bbb 100644 --- a/doc/source/getting-started/experiment.rst +++ b/doc/source/getting-started/experiment.rst @@ -21,7 +21,7 @@ file with additional calibration parameters. More information about defining platforms is provided in :doc:`../tutorials/lab` and several examples can be found at `TII dedicated repository `_. For a first experiment, let's define a single qubit platform at the path previously specified. -For simplicity, the qubit will be controlled by a RFSoC-based system, althought minimal changes are needed to use other devices. +In this example, the qubit is controlled by a Zurich Instruments' SHFQC instrument, although minimal changes are needed to use other devices. .. testcode:: python @@ -29,41 +29,71 @@ For simplicity, the qubit will be controlled by a RFSoC-based system, althought import pathlib - from qibolab.channels import Channel, ChannelMap - from qibolab.instruments.rfsoc import RFSoC - from qibolab.instruments.rohde_schwarz import SGS100A as LocalOscillator + from laboneq.simple import DeviceSetup, SHFQC + from qibolab.components import AcquireChannel, IqChannel, IqConfig, AcquisitionConfig, OscillatorConfig + from qibolab.instruments.zhinst import ZiChannel, Zurich from qibolab.platform import Platform - from qibolab.serialize import load_qubits, load_runcard, load_settings + from qibolab.serialize import load_component_config, load_instrument_settings, load_qubits, load_runcard, load_settings NAME = "my_platform" # name of the platform - ADDRESS = "192.168.0.1" # ip address of the controller - PORT = 6000 # port of the controller + ADDRESS = "localhost" # ip address of the ZI data server + PORT = 8004 # port of the ZI data server # folder containing runcard with calibration parameters FOLDER = pathlib.Path.cwd() def create(): - # Instantiate controller instruments - controller = RFSoC(NAME, ADDRESS, PORT) + # Define available instruments + device_setup = DeviceSetup() + device_setup.add_dataserver(host=ADDRESS, port=PORT) + device_setup.add_instruments(SHFQC("device_shfqc", address="DEV12146")) - # Create channel objects and port assignment - channels = ChannelMap() - channels |= Channel("readout", port=controller[1]) - channels |= Channel("feedback", port=controller[0]) - channels |= Channel("drive", port=controller[0]) - - # create qubit objects + # Load and parse the runcard (i.e. parameters.json) runcard = load_runcard(FOLDER) - qubits, pairs = load_qubits(runcard) - # assign channels to qubits - qubits[0].readout = channels["L3-22_ro"] - qubits[0].feedback = channels["L1-2-RO"] - qubits[0].drive = channels["L3-22_qd"] + qubits, _, pairs = load_qubits(runcard) + qubit = qubits[0] + + # define component names, and load their configurations + drive, measure, acquire = "q0/drive", "q0/measure", "q0/acquire" + drive_lo, measure_lo = "q0/drive/lo", "q0/measure/lo" - instruments = {controller.name: controller} + # assign channels to qubits + qubit.drive = IqChannel(name=drive, lo=drive_lo, mixer=None) + qubit.measure = IqChannel(name=measure, lo=measure_lo, mixer=None, acquisition=acquire) + qubit.acquisition = AcquireChannel(name=acquire, measure=measure, twpa_pump=None) + + configs = {} + configs[drive] = load_component_config(runcard, drive, IqConfig) + configs[measure] = load_component_config(runcard, measure, IqConfig) + configs[acquire] = load_component_config(runcard, acquire, AcquisitionConfig) + configs[drive_lo] = load_component_config(runcard, drive_lo, OscillatorConfig) + configs[measure_lo] = load_component_config(runcard, measure_lo, OscillatorConfig) + + zi_channels = [ + ZiChannel(qubit.drive, device="device_shfqc", path="SGCHANNELS/0/OUTPUT"), + ZiChannel(qubit.measure, device="device_shfqc", path="QACHANNELS/0/OUTPUT"), + ZiChannel(qubit.acquisition, device="device_shfqc", path="QACHANNELS/0/INPUT"), + ] + + controller = Zurich( + NAME, + device_setup=device_setup, + channels=zi_channels + ) + + instruments = load_instrument_settings(runcard, {controller.name: controller}) settings = load_settings(runcard) - return Platform(NAME, qubits, pairs, instruments, settings, resonator_type="3D") + return Platform( + NAME, + qubits, + pairs, + configs, + instruments, + settings, + resonator_type="3D", + ) + .. note:: @@ -93,22 +123,51 @@ And the we can define the runcard ``my_platform/parameters.json``: "relaxation_time": 70000, "sampling_rate": 9830400000 }, + "components": { + "qubit_0/drive": { + "frequency": 4833726197, + "power_range": 5 + }, + "qubit_0/drive/lo": { + "frequency": 5200000000, + "power": null + }, + "qubit_0/measure": { + "frequency": 7320000000, + "power_range": 1 + }, + "qubit_0/measure/lo": { + "frequency": 7300000000, + "power": null + }, + "qubit_0/acquire": { + "delay": 0, + "smearing": 0, + "power_range": 10 + } + } "native_gates": { "single_qubit": { "0": { "RX": { - "duration": 40, - "amplitude": 0.5, - "frequency": 5500000000, - "shape": "Gaussian(3)", - "type": "qd", + "qubit_0/drive": [ + { + "duration": 40, + "amplitude": 0.5, + "envelope": { "kind": "gaussian", "rel_sigma": 3.0 }, + "type": "qd" + } + ] }, "MZ": { - "duration": 2000, - "amplitude": 0.02, - "frequency": 7370000000, - "shape": "Rectangular()", - "type": "ro", + "qubit_0/measure": [ + { + "duration": 2000, + "amplitude": 0.02, + "envelope": { "kind": "rectangular" }, + "type": "ro" + } + ] } } }, @@ -117,8 +176,6 @@ And the we can define the runcard ``my_platform/parameters.json``: "characterization": { "single_qubit": { "0": { - "readout_frequency": 7370000000, - "drive_frequency": 5500000000, "anharmonicity": 0, "Ec": 0, "Ej": 0, @@ -187,16 +244,15 @@ We leave to the dedicated tutorial a full explanation of the experiment, but her # load the platform from ``dummy.py`` and ``dummy.json`` platform = create_platform("dummy") + qubit = platform.qubits[0] # define the pulse sequence - sequence = PulseSequence() - ro_pulse = platform.create_MZ_pulse(qubit=0) - sequence.append(ro_pulse) + sequence = qubit.native_gates.MZ.create_sequence() # define a sweeper for a frequency scan sweeper = Sweeper( parameter=Parameter.frequency, values=np.arange(-2e8, +2e8, 1e6), - pulses=[ro_pulse], + channels=[qubit.measure.name], type=SweeperType.OFFSET, ) @@ -209,10 +265,11 @@ We leave to the dedicated tutorial a full explanation of the experiment, but her ) results = platform.execute([sequence], options, [[sweeper]]) + ro_pulse = next(iter(sequence.ro_pulses)) # plot the results amplitudes = results[ro_pulse.id][0].magnitude - frequencies = np.arange(-2e8, +2e8, 1e6) + ro_pulse.frequency + frequencies = np.arange(-2e8, +2e8, 1e6) + platform.config(qubit.measure.name).frequency plt.title("Resonator Spectroscopy") plt.xlabel("Frequencies [Hz]") diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index 4794c7e59d..d327a7fc2a 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -16,7 +16,6 @@ In the platform, the main methods can be divided in different sections: - functions save and change qubit parameters (``dump``, ``update``) - functions to coordinate the instruments (``connect``, ``setup``, ``disconnect``) - a unique interface to execute experiments (``execute``) -- functions to initialize gates (``create_RX90_pulse``, ``create_RX_pulse``, ``create_CZ_pulse``, ``create_MZ_pulse``, ``create_qubit_drive_pulse``, ``create_qubit_readout_pulse``, ``create_RX90_drag_pulse``, ``create_RX_drag_pulse``) - setters and getters of channel/qubit parameters (local oscillator parameters, attenuations, gain and biases) The idea of the ``Platform`` is to serve as the only object exposed to the user, so that we can deploy experiments, without any need of going into the low-level instrument-specific code. @@ -35,39 +34,44 @@ Now we connect to the instruments (note that we, the user, do not need to know w platform.connect() -We can easily print some of the parameters of the channels (similarly we can set those, if needed): +We can easily access the names of channels and other components, and based on the name retrieve the corresponding configuration. As an example let's print some things: .. note:: - If the get_method does not apply to the platform (for example there is no local oscillator, to TWPA or no flux tunability...) a ``NotImplementedError`` will be raised. + If requested component does not exist in a particular platform, its name will be `None`, so watch out for such names, and make sure what you need exists before requesting its configuration. .. testcode:: python - print(f"Drive LO frequency: {platform.qubits[0].drive.lo_frequency}") - print(f"Readout LO frequency: {platform.qubits[0].readout.lo_frequency}") - print(f"TWPA LO frequency: {platform.qubits[0].twpa.lo_frequency}") - print(f"Qubit bias: {platform.qubits[0].flux.offset}") - print(f"Qubit attenuation: {platform.qubits[0].readout.attenuation}") + drive_channel = platform.qubits[0].drive + print(f"Drive channel name: {drive_channel.name}") + print(f"Drive frequency: {platform.config(drive_channel.name).frequency}") + + drive_lo = drive_channel.lo + if drive_lo is None: + print(f"Drive channel {drive_channel.name} does not use an LO.") + else: + print(f"Name of LO for channel {drive_channel.name} is {drive_lo}") + print(f"LO frequency: {platform.config(drive_lo).frequency}") .. testoutput:: python :hide: - Drive LO frequency: 0 - Readout LO frequency: 0 - TWPA LO frequency: 1000000000.0 - Qubit bias: 0.0 - Qubit attenuation: 0 + Drive channel name: qubit_0/drive + Drive frequency: 4000000000 + Drive channel qubit_0/drive does not use an LO. Now we can create a simple sequence (again, without explicitly giving any qubit specific parameter, as these are loaded automatically from the platform, as defined in the runcard): .. testcode:: python from qibolab.pulses import PulseSequence, Delay + import numpy as np ps = PulseSequence() - ps.append(platform.create_RX_pulse(qubit=0)) - ps.append(platform.create_RX_pulse(qubit=0)) - ps.append(Delay(duration=200, channel=platform.qubits[0].readout.name)) - ps.append(platform.create_MZ_pulse(qubit=0)) + qubit = platform.qubits[0] + ps.extend(qubit.native_gates.RX.create_sequence()) + ps.extend(qubit.native_gates.RX.create_sequence(phi=np.pi / 2)) + ps[qubit.measure.name].append(Delay(duration=200)) + ps.extend(qubit.native_gates.MZ.create_sequence()) Now we can execute the sequence on hardware: @@ -163,9 +167,8 @@ It encapsulates three fundamental elements crucial to qubit control and operatio Channels play a pivotal role in connecting the quantum system to the control infrastructure. They are optional and encompass distinct types, each serving a specific purpose: -- readout (from controller device to the qubits) -- feedback (from qubits to controller) -- twpa (pump to the TWPA) +- measure (from controller device to the qubits) +- acquisition (from qubits to controller) - drive - flux @@ -197,9 +200,6 @@ and usually extracted from the runcard during platform initialization. Channels -------- -In Qibolab, channels serve as abstractions for physical wires within a laboratory setup. -Each :class:`qibolab.channels.Channel` object corresponds to a specific type of connection, simplifying the process of controlling quantum pulses across the experimental setup. - Various types of channels are typically present in a quantum laboratory setup, including: - the drive line @@ -219,55 +219,6 @@ Although logically distinct from the qubit, the LO's frequency must align with t Qibolab accommodates this by enabling the assignment of a :class:`qibolab.instruments.oscillator.LocalOscillator` object to the relevant channel. The controller's driver ensures the correct pulse frequency is set based on the LO's configuration. -Let's explore an example using an RFSoC controller. -Note that while channels are defined in a device-independent manner, the port parameter varies based on the specific instrument. - -.. testcode:: python - - from qibolab.channels import Channel, ChannelMap - from qibolab.instruments.rfsoc import RFSoC - - controller = RFSoC(name="dummy", address="192.168.0.10", port="6000") - channel1 = Channel("my_channel_name_1", port=controller.ports(1)) - channel2 = Channel("my_channel_name_2", port=controller.ports(2)) - channel3 = Channel("my_channel_name_3", port=controller.ports(3)) - -Channels are then organized in :class:`qibolab.channels.ChannelMap` to be passed as a single argument to the platform. -Following the tutorial in :doc:`/tutorials/lab`, we can continue the initialization: - -.. testcode:: python - - from pathlib import Path - from qibolab.serialize import load_qubits, load_runcard - - path = Path.cwd().parent / "src" / "qibolab" / "dummy" - - ch_map = ChannelMap() - ch_map |= channel1 - ch_map |= channel2 - ch_map |= channel3 - - runcard = load_runcard(path) - qubits, couplers, pairs = load_qubits(runcard) - - qubits[0].drive = channel1 - qubits[0].readout = channel2 - qubits[0].feedback = channel3 - -Where, in the last lines, we assign the channels to the qubits. - -To assign local oscillators, the procedure is simple: - -.. testcode:: python - - from qibolab.instruments.erasynth import ERA as LocalOscillator - - LO_ADDRESS = "192.168.0.10" - local_oscillator = LocalOscillator("NameLO", LO_ADDRESS) - local_oscillator.frequency = 6e9 # Hz - local_oscillator.power = 5 # dB - channel2.local_oscillator = local_oscillator - .. _main_doc_pulses: Pulses @@ -336,54 +287,39 @@ To organize pulses into sequences, Qibolab provides the :class:`qibolab.pulses.P pulse1 = Pulse( duration=40, # timing, in all qibolab, is expressed in ns amplitude=0.5, # this amplitude is relative to the range of the instrument - frequency=1e8, # frequency are in Hz relative_phase=0, # phases are in radians envelope=Rectangular(), - channel="channel", - qubit=0, ) pulse2 = Pulse( duration=40, # timing, in all qibolab, is expressed in ns amplitude=0.5, # this amplitude is relative to the range of the instrument - frequency=1e8, # frequency are in Hz relative_phase=0, # phases are in radians envelope=Rectangular(), - channel="channel", - qubit=0, ) pulse3 = Pulse( duration=40, # timing, in all qibolab, is expressed in ns amplitude=0.5, # this amplitude is relative to the range of the instrument - frequency=1e8, # frequency are in Hz relative_phase=0, # phases are in radians envelope=Rectangular(), - channel="channel", - qubit=0, ) pulse4 = Pulse( duration=40, # timing, in all qibolab, is expressed in ns amplitude=0.5, # this amplitude is relative to the range of the instrument - frequency=1e8, # frequency are in Hz relative_phase=0, # phases are in radians envelope=Rectangular(), - channel="channel", - qubit=0, ) - sequence.append(pulse1) - sequence.append(pulse2) - sequence.append(pulse3) - sequence.append(pulse4) + sequence["channel"].append(pulse1) + sequence["channel"].append(pulse2) + sequence["channel"].append(pulse3) + sequence["channel"].append(pulse4) print(f"Total duration: {sequence.duration}") - sequence_ch1 = sequence.get_channel_pulses("channel1") # Selecting pulses on channel 1 - print(f"We have {len(sequence_ch1)} pulses on channel 1.") .. testoutput:: python :hide: Total duration: 160.0 - We have 0 pulses on channel 1. When conducting experiments on quantum hardware, pulse sequences are vital. Assuming you have already initialized a platform, executing an experiment is as simple as: @@ -402,18 +338,16 @@ Typical experiments may include both pre-defined pulses and new ones: from qibolab.pulses import Rectangular sequence = PulseSequence() - sequence.append(platform.create_RX_pulse(0)) - sequence.append( + sequence.extend(platform.qubits[0].native_gates.RX.create_sequence()) + sequence["some_channel"].append( Pulse( duration=10, amplitude=0.5, - frequency=2500000000, relative_phase=0, envelope=Rectangular(), - channel="0", ) ) - sequence.append(platform.create_MZ_pulse(0)) + sequence.extend(platform.qubits[0].native_gates.MZ.create_sequence()) results = platform.execute([sequence], options=options) @@ -444,7 +378,6 @@ To address the inefficiency, Qibolab introduces the concept of Sweeper objects. Sweeper objects in Qibolab are characterized by a :class:`qibolab.sweeper.Parameter`. This parameter, crucial to the sweeping process, can be one of several types: -- Frequency - Amplitude - Duration - Relative_phase @@ -452,17 +385,18 @@ Sweeper objects in Qibolab are characterized by a :class:`qibolab.sweeper.Parame -- +- Frequency - Attenuation - Gain - Bias -The first group includes parameters of the pulses, while the second group include parameters of a different type that, in qibolab, are linked to a qubit object. +The first group includes parameters of the pulses, while the second group includes parameters of channels. -To designate the qubit or pulse to which a sweeper is applied, you can utilize the ``pulses`` or ``qubits`` parameter within the Sweeper object. +To designate the pulse(s) or channel(s) to which a sweeper is applied, you can utilize the ``pulses`` or ``channels`` parameter within the Sweeper object. .. note:: - It is possible to simultaneously execute the same sweeper on different pulses or qubits. The ``pulses`` or ``qubits`` attribute is designed as a list, allowing for this flexibility. + It is possible to simultaneously execute the same sweeper on different pulses or channels. The ``pulses`` or ``channels`` attribute is designed as a list, allowing for this flexibility. To effectively specify the sweeping behavior, Qibolab provides the ``values`` attribute along with the ``type`` attribute. @@ -485,14 +419,14 @@ A tipical resonator spectroscopy experiment could be defined with: from qibolab.sweeper import Parameter, Sweeper, SweeperType sequence = PulseSequence() - sequence.append(platform.create_MZ_pulse(0)) # readout pulse for qubit 0 at 4 GHz - sequence.append(platform.create_MZ_pulse(1)) # readout pulse for qubit 1 at 5 GHz - sequence.append(platform.create_MZ_pulse(2)) # readout pulse for qubit 2 at 6 GHz + sequence.extend(platform.qubits[0].native_gates.MZ.create_sequence()) # readout pulse for qubit 0 at 4 GHz + sequence.extend(platform.qubits[1].native_gates.MZ.create_sequence()) # readout pulse for qubit 1 at 5 GHz + sequence.extend(platform.qubits[2].native_gates.MZ.create_sequence()) # readout pulse for qubit 2 at 6 GHz sweeper = Sweeper( parameter=Parameter.frequency, values=np.arange(-200_000, +200_000, 1), # define an interval of swept values - pulses=[sequence[0], sequence[1], sequence[2]], + channels=[qubit.measure.name for qubit in platform.qubits.values()], type=SweeperType.OFFSET, ) @@ -522,24 +456,22 @@ For example: from qibolab.pulses import PulseSequence, Delay + qubit = platform.qubits[0] sequence = PulseSequence() - - sequence.append(platform.create_RX_pulse(0)) - sequence.append( - Delay(duration=sequence.duration, channel=platform.qubits[0].readout.name) - ) - sequence.append(platform.create_MZ_pulse(0)) + sequence.extend(qubit.native_gates.RX.create_sequence()) + sequence[qubit.measure.name].append(Delay(duration=sequence.duration)) + sequence.extend(qubit.native_gates.MZ.create_sequence()) sweeper_freq = Sweeper( parameter=Parameter.frequency, values=np.arange(-100_000, +100_000, 10_000), - pulses=[sequence[0]], + channels=[qubit.drive.name], type=SweeperType.OFFSET, ) sweeper_amp = Sweeper( parameter=Parameter.amplitude, values=np.arange(0, 1.5, 0.1), - pulses=[sequence[0]], + pulses=[sequence[qubit.drive.name][0]], type=SweeperType.FACTOR, ) @@ -620,12 +552,12 @@ Let's now delve into a typical use case for result objects within the qibolab fr .. testcode:: python - drive_pulse_1 = platform.create_RX_pulse(0) - measurement_pulse = platform.create_MZ_pulse(0) + qubit = platform.qubits[0] sequence = PulseSequence() - sequence.append(drive_pulse_1) - sequence.append(measurement_pulse) + sequence.extend(qubit.native_gates.RX.create_sequence()) + sequence[qubit.measure.name].append(Delay(duration=sequence.duration)) + sequence.extend(qubit.native_gates.MZ.create_sequence()) options = ExecutionParameters( nshots=1000, @@ -651,13 +583,13 @@ The shape of the values of an integreted acquisition with 2 sweepers will be: sweeper1 = Sweeper( parameter=Parameter.frequency, values=np.arange(-100_000, +100_000, 1), # define an interval of swept values - pulses=[sequence[0]], + channels=[qubit.drive.name], type=SweeperType.OFFSET, ) sweeper2 = Sweeper( parameter=Parameter.frequency, values=np.arange(-200_000, +200_000, 1), # define an interval of swept values - pulses=[sequence[0]], + channels=[qubit.measure.name], type=SweeperType.OFFSET, ) shape = (options.nshots, len(sweeper1.values), len(sweeper2.values)) diff --git a/doc/source/tutorials/calibration.rst b/doc/source/tutorials/calibration.rst index 375a521419..5ce2ef83b9 100644 --- a/doc/source/tutorials/calibration.rst +++ b/doc/source/tutorials/calibration.rst @@ -41,16 +41,14 @@ around the pre-defined frequency. # allocate platform platform = create_platform("dummy") - # create pulse sequence and add pulse - sequence = PulseSequence() - readout_pulse = platform.create_MZ_pulse(qubit=0) - sequence.append(readout_pulse) + qubit = platform.qubits[0] + sequence = qubit.native_gates.MZ.create_sequence() # allocate frequency sweeper sweeper = Sweeper( parameter=Parameter.frequency, values=np.arange(-2e8, +2e8, 1e6), - pulses=[readout_pulse], + channels=[qubit.measure.name], type=SweeperType.OFFSET, ) @@ -73,8 +71,9 @@ In few seconds, the experiment will be finished and we can proceed to plot it. import matplotlib.pyplot as plt + readout_pulse = next(iter(sequence.ro_pulses)) amplitudes = results[readout_pulse.id][0].magnitude - frequencies = np.arange(-2e8, +2e8, 1e6) + readout_pulse.frequency + frequencies = np.arange(-2e8, +2e8, 1e6) + platform.config(qubit.measure.name).frequency plt.title("Resonator Spectroscopy") plt.xlabel("Frequencies [Hz]") @@ -110,7 +109,7 @@ complex pulse sequence. Therefore with start with that: import numpy as np import matplotlib.pyplot as plt from qibolab import create_platform - from qibolab.pulses import PulseSequence, Delay + from qibolab.pulses import Pulse, PulseSequence, Delay, Gaussian from qibolab.sweeper import Sweeper, SweeperType, Parameter from qibolab.execution_parameters import ( ExecutionParameters, @@ -122,20 +121,19 @@ complex pulse sequence. Therefore with start with that: # allocate platform platform = create_platform("dummy") + qubit = platform.qubits[0] + # create pulse sequence and add pulses sequence = PulseSequence() - drive_pulse = platform.create_RX_pulse(qubit=0) - drive_pulse = replace(drive_pulse, duration=2000, amplitude=0.01) - readout_pulse = platform.create_MZ_pulse(qubit=0) - sequence.append(drive_pulse) - sequence.append(Delay(duration=drive_pulse.duration, channel=readout_pulse.channel)) - sequence.append(readout_pulse) + sequence[qubit.drive.name].append(Pulse(duration=2000, amplitude=0.01, envelope=Gaussian(rel_sigma=5))) + sequence[qubit.measure.name].append(Delay(duration=sequence.duration)) + sequence.extend(qubit.native_gates.MZ.create_sequence()) # allocate frequency sweeper sweeper = Sweeper( parameter=Parameter.frequency, values=np.arange(-2e8, +2e8, 1e6), - pulses=[drive_pulse], + channels=[qubit.drive.name], type=SweeperType.OFFSET, ) @@ -155,8 +153,9 @@ We can now proceed to launch on hardware: results = platform.execute([sequence], options, [[sweeper]]) + readout_pulse = next(iter(sequence.ro_pulses)) amplitudes = results[readout_pulse.id][0].magnitude - frequencies = np.arange(-2e8, +2e8, 1e6) + drive_pulse.frequency + frequencies = np.arange(-2e8, +2e8, 1e6) + platform.config(qubit.drive.name).frequency plt.title("Resonator Spectroscopy") plt.xlabel("Frequencies [Hz]") @@ -217,20 +216,16 @@ and its impact on qubit states in the IQ plane. # allocate platform platform = create_platform("dummy") + qubit = platform.qubits[0] + # create pulse sequence 1 and add pulses one_sequence = PulseSequence() - drive_pulse = platform.create_RX_pulse(qubit=0) - readout_pulse1 = platform.create_MZ_pulse(qubit=0) - one_sequence.append(drive_pulse) - one_sequence.append( - Delay(duration=drive_pulse.duration, channel=readout_pulse1.channel) - ) - one_sequence.append(readout_pulse1) + one_sequence.extend(qubit.native_gates.RX.create_sequence()) + one_sequence[qubit.measure.name].append(Delay(duration=one_sequence.duration)) + one_sequence.extend(qubit.native_gates.MZ.create_sequence()) # create pulse sequence 2 and add pulses - zero_sequence = PulseSequence() - readout_pulse2 = platform.create_MZ_pulse(qubit=0) - zero_sequence.append(readout_pulse2) + zero_sequence = qubit.native_gates.MZ.create_sequence() options = ExecutionParameters( nshots=1000, @@ -242,6 +237,9 @@ and its impact on qubit states in the IQ plane. results_one = platform.execute([one_sequence], options) results_zero = platform.execute([zero_sequence], options) + readout_pulse1 = next(iter(one_sequence.ro_pulses)) + readout_pulse2 = next(iter(zero_sequence.ro_pulses)) + plt.title("Single shot classification") plt.xlabel("I [a.u.]") plt.ylabel("Q [a.u.]") diff --git a/doc/source/tutorials/compiler.rst b/doc/source/tutorials/compiler.rst index 1c7cdb1346..dd335fe4ce 100644 --- a/doc/source/tutorials/compiler.rst +++ b/doc/source/tutorials/compiler.rst @@ -82,7 +82,7 @@ The following example shows how to modify the compiler in order to execute a cir # define a compiler rule that translates X to the pi-pulse def x_rule(gate, qubit): """X gate applied with a single pi-pulse.""" - return PulseSequence([qubit.native_gates.RX]) + return qubit.native_gates.RX.create_sequence() # the empty dictionary is needed because the X gate does not require any virtual Z-phases diff --git a/doc/source/tutorials/instrument.rst b/doc/source/tutorials/instrument.rst index db30ce6416..a0bc645ffc 100644 --- a/doc/source/tutorials/instrument.rst +++ b/doc/source/tutorials/instrument.rst @@ -178,30 +178,3 @@ Let's see a minimal example: ) -> dict[str, Union[IntegratedResults, SampleResults]]: """This method is used for sequence unrolling sweeps. Here not implemented.""" raise NotImplementedError - -As we saw in :doc:`lab`, to instantiate a platform at some point you have to -write something like this: - -.. testcode:: python - - from qibolab.channels import Channel, ChannelMap - from qibolab.instruments.dummy import DummyInstrument - - instrument = DummyInstrument("my_instrument", "0.0.0.0:0") - channels = ChannelMap() - channels |= Channel("ch1out", port=instrument.ports("o1")) - - -The interesting part of this section is the ``port`` parameter that works as an -attribute of the controller. A :class:`qibolab.instruments.port.Port` object -describes the physical connections that a device may have. A Controller has, by -default, ports characterized just by ``port_name`` (see also -:class:`qibolab.instruments.abstract.Controller`), but different devices may -need to add attributes and methods to the ports. This can be done by defining in -the new controller a new port type. See, for example, the already implemented -ports: - -* :class:`qibolab.instruments.rfsoc.driver.RFSoCPort` -* :class:`qibolab.instruments.qm.ports.QMPort` -* :class:`qibolab.instruments.zhinst.ZhPort` -* :class:`qibolab.instruments.qblox.port` diff --git a/doc/source/tutorials/lab.rst b/doc/source/tutorials/lab.rst index 7ca2ca210f..82be4e6a40 100644 --- a/doc/source/tutorials/lab.rst +++ b/doc/source/tutorials/lab.rst @@ -23,10 +23,10 @@ using different Qibolab primitives. .. testcode:: python from qibolab import Platform + from qibolab.components import IqChannel, AcquireChannel, IqConfig from qibolab.qubits import Qubit from qibolab.pulses import Gaussian, Pulse, PulseType, Rectangular - from qibolab.channels import ChannelMap, Channel - from qibolab.native import SingleQubitNatives + from qibolab.native import RxyFactory, FixedSequenceFactory, SingleQubitNatives from qibolab.instruments.dummy import DummyInstrument @@ -34,39 +34,46 @@ using different Qibolab primitives. # Create a controller instrument instrument = DummyInstrument("my_instrument", "0.0.0.0:0") - # Create channel objects and assign to them the controller ports - channels = ChannelMap() - channels |= Channel("ch1out", port=instrument["o1"]) - channels |= Channel("ch2", port=instrument["o2"]) - channels |= Channel("ch1in", port=instrument["i1"]) - # create the qubit object qubit = Qubit(0) - # assign native gates to the qubit - qubit.native_gates = SingleQubitNatives( - RX=Pulse( + # assign channels to the qubit + qubit.measure = IqChannel(name="measure", mixer=None, lo=None, acquisition="acquire") + qubit.acquire = AcquireChannel(name="acquire", twpa_pump=None, measure="measure") + qubit.drive = Iqchannel(name="drive", mixer=None, lo=None) + + # define configuration for channels + configs = {} + configs[qubit.drive.name] = IqConfig(frequency=3e9) + configs[qubit.measure.name] = IqConfig(frequency=7e9) + + # create sequence that drives qubit from state 0 to 1 + drive_seq = PulseSequence() + drive_seq[qubit.drive.name].append( + Pulse( duration=40, amplitude=0.05, envelope=Gaussian(rel_sigma=0.2), type=PulseType.DRIVE, - qubit=qubit.name, - frequency=4.5e9, - ), - MZ=Pulse( + ) + ) + + # create sequence that can be used for measuring the qubit + measure_seq = PulseSequence() + measure_seq[qubit.measure.name].append( + Pulse( duration=1000, amplitude=0.005, envelope=Rectangular(), type=PulseType.READOUT, - qubit=qubit.name, - frequency=7e9, - ), + ) ) - # assign channels to the qubit - qubit.readout = channels["ch1out"] - qubit.feedback = channels["ch1in"] - qubit.drive = channels["ch2"] + # assign native gates to the qubit + qubit.native_gates = SingleQubitNatives( + RX=RxyFactory(drive_seq), + MZ=FixedSequenceFactory(measure_seq), + ) # create dictionaries of the different objects qubits = {qubit.name: qubit} @@ -74,7 +81,7 @@ using different Qibolab primitives. instruments = {instrument.name: instrument} # allocate and return Platform object - return Platform("my_platform", qubits, pairs, instruments, resonator_type="3D") + return Platform("my_platform", qubits, pairs, configs, instruments, resonator_type="3D") This code creates a platform with a single qubit that is controlled by the @@ -96,9 +103,12 @@ hold the parameters of the two-qubit gates. .. testcode:: python + from qibolab.components import IqChannel, AcquireChannel, DcChannel, IqConfig from qibolab.qubits import Qubit, QubitPair from qibolab.pulses import Gaussian, PulseType, Pulse, PulseSequence, Rectangular from qibolab.native import ( + RxyFactory, + FixedSequenceFactory, SingleQubitNatives, TwoQubitNatives, ) @@ -107,60 +117,60 @@ hold the parameters of the two-qubit gates. qubit0 = Qubit(0) qubit1 = Qubit(1) + # assign channels to the qubits + qubit0.measure = IqChannel(name="measure_0", mixer=None, lo=None, acquisition="acquire_0") + qubit0.acquire = AcquireChannel(name="acquire_0", twpa_pump=None, measure="measure_0") + qubit0.drive = IqChannel(name="drive_0", mixer=None, lo=None) + qubit0.flux = DcChannel(name="flux_0") + qubit1.measure = IqChannel(name="measure_1", mixer=None, lo=None, acquisition="acquire_1") + qubit1.acquire = AcquireChannel(name="acquire_1", twpa_pump=None, measure="measure_1") + qubit1.drive = IqChannel(name="drive_1", mixer=None, lo=None) + # assign single-qubit native gates to each qubit qubit0.native_gates = SingleQubitNatives( - RX=Pulse( + RX=RxyFactory(PulseSequence({qubit0.drive.name: [Pulse( duration=40, amplitude=0.05, envelope=Gaussian(rel_sigma=0.2), type=PulseType.DRIVE, - qubit=qubit0.name, - frequency=4.7e9, - ), - MZ=Pulse( + )]})), + MZ=FixedSequenceFactory(PulseSequence({qubit0.measure.name: [Pulse( duration=1000, amplitude=0.005, envelope=Rectangular(), type=PulseType.READOUT, - qubit=qubit0.name, - frequency=7e9, - ), + )]})), ) qubit1.native_gates = SingleQubitNatives( - RX=Pulse( + RX=RxyFactory(PulseSequence({qubit1.drive.name: [Pulse( duration=40, amplitude=0.05, envelope=Gaussian(rel_sigma=0.2), type=PulseType.DRIVE, - qubit=qubit1.name, - frequency=5.1e9, - ), - MZ=Pulse( + )]})), + MZ=FixedSequenceFactory(PulseSequence({qubit1.measure.name: [Pulse( duration=1000, amplitude=0.005, envelope=Rectangular(), type=PulseType.READOUT, - qubit=qubit1.name, - frequency=7.5e9, - ), + )]})), ) # define the pair of qubits pair = QubitPair(qubit0, qubit1) pair.native_gates = TwoQubitNatives( - CZ=PulseSequence( + CZ=FixedSequenceFactory(PulseSequence({qubit0.flux.name: [ Pulse( duration=30, amplitude=0.005, envelope=Rectangular(), type=PulseType.FLUX, - qubit=qubit1.name, - frequency=1e9, ) ], + } ) - ) + )) Some architectures may also have coupler qubits that mediate the interactions. We can also interact with them defining the :class:`qibolab.couplers.Coupler` objects. @@ -171,10 +181,12 @@ coupler but qibolab will take them into account when calling :class:`qibolab.nat .. testcode:: python + from qibolab.components import DcChannel from qibolab.couplers import Coupler from qibolab.qubits import Qubit, QubitPair from qibolab.pulses import PulseType, Pulse, PulseSequence from qibolab.native import ( + FixedSequenceFactory, SingleQubitNatives, TwoQubitNatives, ) @@ -184,13 +196,16 @@ coupler but qibolab will take them into account when calling :class:`qibolab.nat qubit1 = Qubit(1) coupler_01 = Coupler(0) + # assign channel(s) to the coupler + coupler_01.flux = DcChannel(name="flux_coupler_01") + # assign single-qubit native gates to each qubit # Look above example # define the pair of qubits pair = QubitPair(qubit0, qubit1, coupler_01) pair.native_gates = TwoQubitNatives( - CZ=PulseSequence( + CZ=FixedSequenceFactory(PulseSequence({coupler_01.flux.name: [ Pulse( duration=30, @@ -200,9 +215,9 @@ coupler but qibolab will take them into account when calling :class:`qibolab.nat type=PulseType.FLUX, qubit=qubit1.name, ) - ], + ]}, ) - ) + )) The platform automatically creates the connectivity graph of the given chip using the dictionary of :class:`qibolab.qubits.QubitPair` objects. @@ -264,47 +279,84 @@ a two-qubit system: 1 ] ], + "components": { + "drive_0": { + "frequency": 4855663000 + }, + "drive_1": { + "frequency": 5800563000 + }, + "flux_0": { + "bias": 0.0 + }, + "measure_0": { + "frequency": 7453265000 + }, + "measure_1": { + "frequency": 7655107000 + }, + "acquire_0": { + "delay": 0, + "smearing": 0 + }, + "acquire_1": { + "delay": 0, + "smearing": 0 + } + } "native_gates": { "single_qubit": { "0": { "RX": { - "duration": 40, - "amplitude": 0.0484, - "frequency": 4855663000, - "envelope": { - "kind": "drag", - "rel_sigma": 0.2, - "beta": -0.02, - }, - "type": "qd", - }, + "drive_0": [ + { + "duration": 40, + "amplitude": 0.0484, + "envelope": { + "kind": "drag", + "rel_sigma": 0.2, + "beta": -0.02, + }, + "type": "qd", + } + ] + }, "MZ": { - "duration": 620, - "amplitude": 0.003575, - "frequency": 7453265000, - "envelope": {"kind": "rectangular"}, - "type": "ro", - } + "measure_0": [ + { + "duration": 620, + "amplitude": 0.003575, + "envelope": {"kind": "rectangular"}, + "type": "ro", + } + ] + } }, "1": { "RX": { - "duration": 40, - "amplitude": 0.05682, - "frequency": 5800563000, - "envelope": { - "kind": "drag", - "rel_sigma": 0.2, - "beta": -0.04, - }, - "type": "qd", - }, + "drive_1" : [ + { + "duration": 40, + "amplitude": 0.05682, + "envelope": { + "kind": "drag", + "rel_sigma": 0.2, + "beta": -0.04, + }, + "type": "qd", + } + ] + }, "MZ": { - "duration": 960, - "amplitude": 0.00325, - "frequency": 7655107000, - "envelope": {"kind": "rectangular"}, - "type": "ro", - } + "measure_1": [ + { + "duration": 960, + "amplitude": 0.00325, + "envelope": {"kind": "rectangular"}, + "type": "ro", + } + ] + } } }, "two_qubit": { @@ -334,20 +386,14 @@ a two-qubit system: "characterization": { "single_qubit": { "0": { - "readout_frequency": 7453265000, - "drive_frequency": 4855663000, "T1": 0.0, "T2": 0.0, - "sweetspot": -0.047, "threshold": 0.00028502261712637096, "iq_angle": 1.283105298787488 }, "1": { - "readout_frequency": 7655107000, - "drive_frequency": 5800563000, "T1": 0.0, "T2": 0.0, - "sweetspot": -0.045, "threshold": 0.0002694329123116206, "iq_angle": 4.912447775569025 } @@ -374,44 +420,52 @@ we need the following changes to the previous runcard: 1 ] }, + "components": { + "flux_coupler_01": { + "bias": 0.12 + } + } "native_gates": { "two_qubit": { "0-1": { + "CZZ": { + "flux_coupler_01": [ + { + "type": "cf", + "duration": 40, + "amplitude": 0.1, + "envelope": {"kind": "rectangular"}, + "coupler": 0, + } + ] + "flux_0": [ + { + "duration": 30, + "amplitude": 0.6025, + "envelope": {"kind": "rectangular"}, + "type": "qf" + } + ], + "drive_0": [ + { + "type": "virtual_z", + "phase": -1, + "qubit": 0 + } + ], + "drive_1": [ + { + "type": "virtual_z", + "phase": -3, + "qubit": 1 + } + ] + } "CZ": [ - { - "duration": 30, - "amplitude": 0.6025, - "envelope": {"kind": "rectangular"}, - "qubit": 1, - "type": "qf" - }, - { - "type": "virtual_z", - "phase": -1, - "qubit": 0 - }, - { - "type": "virtual_z", - "phase": -3, - "qubit": 1 - }, - { - "type": "cf", - "duration": 40, - "amplitude": 0.1, - "envelope": {"kind": "rectangular"}, - "coupler": 0, - } + ] } } - }, - "characterization": { - "coupler": { - "0": { - "sweetspot": 0.0 - } - } } } @@ -439,8 +493,15 @@ the above runcard: from pathlib import Path from qibolab import Platform - from qibolab.channels import ChannelMap, Channel - from qibolab.serialize import load_runcard, load_qubits, load_settings + from qibolab.components import ( + AcquireChannel, + DcChannel, + IqChannel, + AcquisitionConfig, + DcConfig, + IqConfig + ) + from qibolab.serialize import load_component_config, load_runcard, load_qubits, load_settings from qibolab.instruments.dummy import DummyInstrument FOLDER = Path.cwd() @@ -451,32 +512,36 @@ the above runcard: # Create a controller instrument instrument = DummyInstrument("my_instrument", "0.0.0.0:0") - # Create channel objects and assign to them the controller ports - channels = ChannelMap() - channels |= Channel("ch1out", port=instrument["o1"]) - channels |= Channel("ch1in", port=instrument["i1"]) - channels |= Channel("ch2", port=instrument["o2"]) - channels |= Channel("ch3", port=instrument["o3"]) - channels |= Channel("chf1", port=instrument["o4"]) - channels |= Channel("chf2", port=instrument["o5"]) # create ``Qubit`` and ``QubitPair`` objects by loading the runcard runcard = load_runcard(folder) - qubits, couplers, pairs = load_qubits(runcard) + qubits, _, pairs = load_qubits(runcard) - # assign channels to the qubit + + # define channels and load component configs + configs = {} for q in range(2): - qubits[q].readout = channels["ch1out"] - qubits[q].feedback = channels["ch1in"] - qubits[q].drive = channels[f"ch{q + 2}"] - qubits[q].flux = channels[f"chf{q + 1}"] + drive_name = f"qubit_{q}/drive" + configs[drive_name] = load_component_config(drive_name, IqConfig) + qubits[q].drive = IqChannel(drive_name, mixer=None, lo=None) + + flux_name = f"qubit_{q}/flux" + configs[flux_name] = load_component_config(flux_name, DcConfig) + qubits[q].flux = DcChannel(flux_name) + + measure_name, acquire_name = f"qubit_{q}/measure", f"qubit_{q}/acquire" + configs[measure_name] = load_component_config(measure_name, IqConfig) + qubits[q].measure = IqChannel(measure_name, mixer=None, lo=None, acquistion=acquire_name) + + configs[acquire_name] = load_component_config(acquire_name, AcquisitionConfig) + quibts[q].acquisition = AcquireChannel(acquire_name, twpa_pump=None, measure=measure_name) # create dictionary of instruments instruments = {instrument.name: instrument} # load ``settings`` from the runcard settings = load_settings(runcard) return Platform( - "my_platform", qubits, pairs, instruments, settings, resonator_type="2D" + "my_platform", qubits, pairs, configs, instruments, settings, resonator_type="2D" ) With the following additions for coupler architectures: @@ -490,40 +555,45 @@ With the following additions for coupler architectures: # Create a controller instrument instrument = DummyInstrument("my_instrument", "0.0.0.0:0") - # Create channel objects and assign to them the controller ports - channels = ChannelMap() - channels |= Channel("ch1out", port=instrument["o1"]) - channels |= Channel("ch1in", port=instrument["i1"]) - channels |= Channel("ch2", port=instrument["o2"]) - channels |= Channel("ch3", port=instrument["o3"]) - channels |= Channel("chf1", port=instrument["o4"]) - channels |= Channel("chf2", port=instrument["o5"]) - channels |= Channel("chfc0", port=instrument["o6"]) # create ``Qubit`` and ``QubitPair`` objects by loading the runcard - runcard = load_runcard(FOLDER) + runcard = load_runcard(folder) qubits, couplers, pairs = load_qubits(runcard) - # assign channels to the qubit + + # define channels and load component configs + configs = {} for q in range(2): - qubits[q].readout = channels["ch1out"] - qubits[q].feedback = channels["ch1in"] - qubits[q].drive = channels[f"ch{q + 2}"] - qubits[q].flux = channels[f"chf{q + 1}"] + drive_name = f"qubit_{q}/drive" + configs[drive_name] = load_component_config(drive_name, IqConfig) + qubits[q].drive = IqChannel(drive_name, mixer=None, lo=None) - # assign channels to the coupler - couplers[0].flux = channels["chfc0"] + flux_name = f"qubit_{q}/flux" + configs[flux_name] = load_component_config(flux_name, DcConfig) + qubits[q].flux = DcChannel(flux_name) + + measure_name, acquire_name = f"qubit_{q}/measure", f"qubit_{q}/acquire" + configs[measure_name] = load_component_config(measure_name, IqConfig) + qubits[q].measure = IqChannel(measure_name, mixer=None, lo=None, acquistion=acquire_name) + + configs[acquire_name] = load_component_config(acquire_name, AcquisitionConfig) + quibts[q].acquisition = AcquireChannel(acquire_name, twpa_pump=None, measure=measure_name) + + coupler_flux_name = "coupler_0/flux" + configs[coupler_flux_name] = load_component_config(coupler_flux_name, DcConfig) + couplers[0].flux = DcChannel(coupler_flux_name) # create dictionary of instruments instruments = {instrument.name: instrument} # load ``settings`` from the runcard settings = load_settings(runcard) return Platform( - "my_platform", - qubits, - pairs, - instruments, - settings, + "my_platform", + qubits, + pairs, + configs, + instruments, + settings, resonator_type="2D", couplers=couplers, ) @@ -568,89 +638,20 @@ The runcard can contain an ``instruments`` section that provides these parameter } }, "native_gates": { - "single_qubit": { - "0": { - "RX": { - "duration": 40, - "amplitude": 0.0484, - "frequency": 4855663000, - "envelope": { - "kind": "drag", - "rel_sigma": 0.2, - "beta": -0.02, - }, - "type": "qd", - }, - "MZ": { - "duration": 620, - "amplitude": 0.003575, - "frequency": 7453265000, - "envelope": {"kind": "rectangular"}, - "type": "ro", - } - }, - "1": { - "RX": { - "duration": 40, - "amplitude": 0.05682, - "frequency": 5800563000, - "envelope": { - "kind": "drag", - "rel_sigma": 0.2, - "beta": -0.04, - }, - "type": "qd", - }, - "MZ": { - "duration": 960, - "amplitude": 0.00325, - "frequency": 7655107000, - "envelope": {"kind": "rectangular"}, - "type": "ro", - } - } - }, - "two_qubit": { - "0-1": { - "CZ": [ - { - "duration": 30, - "amplitude": 0.055, - "envelope": {"kind": "rectangular"}, - "qubit": 1, - "type": "qf" - }, - { - "type": "virtual_z", - "phase": -1.5707963267948966, - "qubit": 0 - }, - { - "type": "virtual_z", - "phase": -1.5707963267948966, - "qubit": 1 - } - ] - } - } + "single_qubit": {}, + "two_qubit": {} }, "characterization": { "single_qubit": { "0": { - "readout_frequency": 7453265000, - "drive_frequency": 4855663000, "T1": 0.0, "T2": 0.0, - "sweetspot": -0.047, "threshold": 0.00028502261712637096, "iq_angle": 1.283105298787488 }, "1": { - "readout_frequency": 7655107000, - "drive_frequency": 5800563000, "T1": 0.0, "T2": 0.0, - "sweetspot": -0.045, "threshold": 0.0002694329123116206, "iq_angle": 4.912447775569025 } @@ -669,47 +670,55 @@ in this case ``"twpa_pump"``. from pathlib import Path from qibolab import Platform - from qibolab.channels import ChannelMap, Channel - from qibolab.serialize import ( - load_runcard, - load_qubits, - load_settings, - load_instrument_settings, + from qibolab.components import ( + AcquireChannel, + DcChannel, + IqChannel, + AcquisitionConfig, + DcConfig, + IqConfig ) + from qibolab.serialize import load_component_config, load_runcard, load_qubits, load_settings from qibolab.instruments.dummy import DummyInstrument - from qibolab.instruments.oscillator import LocalOscillator FOLDER = Path.cwd() + # assumes runcard is storred in the same folder as platform.py def create(): # Create a controller instrument instrument = DummyInstrument("my_instrument", "0.0.0.0:0") - twpa = LocalOscillator("twpa_pump", "0.0.0.1") - # Create channel objects and assign to them the controller ports - channels = ChannelMap() - channels |= Channel("ch1out", port=instrument["o1"]) - channels |= Channel("ch2", port=instrument["o2"]) - channels |= Channel("ch3", port=instrument["o3"]) - channels |= Channel("ch1in", port=instrument["i1"]) # create ``Qubit`` and ``QubitPair`` objects by loading the runcard - runcard = load_runcard(FOLDER) - qubits, pairs = load_qubits(runcard) + runcard = load_runcard(folder) + qubits, _, pairs = load_qubits(runcard) - # assign channels to the qubit + + # define channels and load component configs + configs = {} for q in range(2): - qubits[q].readout = channels["ch1out"] - qubits[q].feedback = channels["ch1in"] - qubits[q].drive = channels[f"ch{q + 2}"] + drive_name = f"qubit_{q}/drive" + configs[drive_name] = load_component_config(drive_name, IqConfig) + qubits[q].drive = IqChannel(drive_name, mixer=None, lo=None) + + flux_name = f"qubit_{q}/flux" + configs[flux_name] = load_component_config(flux_name, DcConfig) + qubits[q].flux = DcChannel(flux_name) + + measure_name, acquire_name = f"qubit_{q}/measure", f"qubit_{q}/acquire" + configs[measure_name] = load_component_config(measure_name, IqConfig) + qubits[q].measure = IqChannel(measure_name, mixer=None, lo=None, acquistion=acquire_name) + + configs[acquire_name] = load_component_config(acquire_name, AcquisitionConfig) + quibts[q].acquisition = AcquireChannel(acquire_name, twpa_pump=None, measurement=measure_name) # create dictionary of instruments - instruments = {instrument.name: instrument, twpa.name: twpa} + instruments = {instrument.name: instrument} # load instrument settings from the runcard instruments = load_instrument_settings(runcard, instruments) # load ``settings`` from the runcard settings = load_settings(runcard) return Platform( - "my_platform", qubits, pairs, instruments, settings, resonator_type="2D" + "my_platform", qubits, pairs, configs, instruments, settings, resonator_type="2D" ) diff --git a/doc/source/tutorials/pulses.rst b/doc/source/tutorials/pulses.rst index 0b336addfb..2f039d7d32 100644 --- a/doc/source/tutorials/pulses.rst +++ b/doc/source/tutorials/pulses.rst @@ -14,29 +14,23 @@ pulses (:class:`qibolab.pulses.Pulse`) through the sequence = PulseSequence() # Add some pulses to the pulse sequence - sequence.append( + sequence["channel_0"].append( Pulse( - frequency=200000000, amplitude=0.3, duration=60, relative_phase=0, envelope=Gaussian(rel_sigma=0.2), - qubit=0, type=PulseType.DRIVE, - channel="0", ) ) - sequence.append(Delay(duration=100, channel="1")) - sequence.append( + sequence["channel_1"].append(Delay(duration=100, channel="1")) + sequence["channel_1"].append( Pulse( - frequency=20000000.0, amplitude=0.5, duration=3000, relative_phase=0, envelope=Rectangular(), - qubit=0, type=PulseType.READOUT, - channel="1", ) ) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 7a2c655513..b9a81c0cf9 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -283,12 +283,11 @@ def execute( platform = create_dummy() - sequence = PulseSequence() + qubit = platform.qubits[0] + sequence = qubit.native_gates.MZ.create_sequence() parameter = Parameter.frequency - pulse = platform.create_qubit_readout_pulse(qubit=0) - sequence.append(pulse) parameter_range = np.random.randint(10, size=10) - sweeper = [Sweeper(parameter, parameter_range, [pulse])] + sweeper = [Sweeper(parameter, parameter_range, channels=[qubit.measure.name])] platform.execute([sequence], ExecutionParameters(), [sweeper]) """ if sweepers is None: diff --git a/src/qibolab/sweeper.py b/src/qibolab/sweeper.py index ccfe1a5fe4..3c2ae51aac 100644 --- a/src/qibolab/sweeper.py +++ b/src/qibolab/sweeper.py @@ -65,12 +65,11 @@ class Sweeper: platform = create_dummy() - sequence = PulseSequence() + qubit = platform.qubits[0] + sequence = qubit.native_gates.MZ.create_sequence() parameter = Parameter.frequency - pulse = platform.create_qubit_readout_pulse(qubit=0) - sequence.append(pulse) parameter_range = np.random.randint(10, size=10) - sweeper = Sweeper(parameter, parameter_range, [pulse]) + sweeper = Sweeper(parameter, parameter_range, channels=[qubit.measure.name]) platform.execute([sequence], ExecutionParameters(), [[sweeper]]) Args: diff --git a/tests/emulators/default_q0/platform.py b/tests/emulators/default_q0/platform.py index 136350a805..611ca2f863 100644 --- a/tests/emulators/default_q0/platform.py +++ b/tests/emulators/default_q0/platform.py @@ -1,9 +1,10 @@ import pathlib -from qibolab.channels import ChannelMap +from qibolab.components import IqChannel, AcquireChannel from qibolab.instruments.emulator.pulse_simulator import PulseSimulator from qibolab.platform import Platform from qibolab.serialize import ( + load_component_config, load_instrument_settings, load_qubits, load_runcard, @@ -29,23 +30,16 @@ def create(): qubits, couplers, pairs = load_qubits(runcard) settings = load_settings(runcard) - # Create channel object - channels = ChannelMap() - channels |= (f"readout-{q}" for q in qubits) - channels |= (f"drive-{q}" for q in qubits) - - # map channels to qubits + # define channels for qubits for q, qubit in qubits.items(): - qubit.readout = channels[f"readout-{q}"] - qubit.drive = channels[f"drive-{q}"] - - channels[f"drive-{q}"].qubit = qubit - qubit.sweetspot = 0 # not used + qubit.measure = IqChannel("measure-{q}", mixer=None, lo=None, acquisition="acquire-{q}") + qubit.acquisition = AcquireChannel("acquire-{q}", mixer=None, lo=None, measure="measure-{q}") return Platform( device_name, qubits, pairs, + {}, instruments, settings, resonator_type="2D", From 1b555e9c8e3c829b44a5421e53038410921dfeed Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Mon, 29 Jul 2024 13:15:54 +0400 Subject: [PATCH 0347/1006] some port tests --- tests/test_port.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 tests/test_port.py diff --git a/tests/test_port.py b/tests/test_port.py new file mode 100644 index 0000000000..f8ae9d9ed7 --- /dev/null +++ b/tests/test_port.py @@ -0,0 +1,30 @@ +from unittest.mock import Mock + +import pytest + +from qibolab.instruments.qblox.port import QbloxOutputPort + + +def test_set_attenuation(caplog): + module = Mock() + # module.device = None + port = QbloxOutputPort(module, 17) + + port.attenuation = 40 + assert port.attenuation == 40 + + port.attenuation = 40.1 + assert port.attenuation == 40 + + port.attenuation = 65 + assert port.attenuation == 60 + assert "attenuation needs to be between 0 and 60 dB" in caplog.messages[0] + caplog.clear() + + port.attenuation = -10 + assert port.attenuation == 0 + assert "attenuation needs to be between 0 and 60 dB" in caplog.messages[0] + caplog.clear() + + with pytest.raises(ValueError, match="Invalid"): + port.attenuation = "something" From 5c512e86283a7658d98d27325207d8d0c41af389 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Mon, 29 Jul 2024 14:00:25 +0400 Subject: [PATCH 0348/1006] rename component_configs to configs --- src/qibolab/execution_parameters.py | 2 +- src/qibolab/platform/platform.py | 23 ++++++++++------------- src/qibolab/serialize.py | 2 +- tests/test_instruments_zhinst.py | 12 +++++------- 4 files changed, 17 insertions(+), 22 deletions(-) diff --git a/src/qibolab/execution_parameters.py b/src/qibolab/execution_parameters.py index a8822fd3e3..543456fe17 100644 --- a/src/qibolab/execution_parameters.py +++ b/src/qibolab/execution_parameters.py @@ -72,7 +72,7 @@ class ExecutionParameters(Model): """Data acquisition type.""" averaging_mode: AveragingMode = AveragingMode.SINGLESHOT """Data averaging mode.""" - component_configs: list[dict[str, Config]] = [] + configs: list[dict[str, Config]] = [] """Configuration for various components (maps component name to respective config). diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index b9a81c0cf9..d1eb5773e0 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -119,7 +119,7 @@ class Platform: pairs: QubitPairMap """Dictionary mapping tuples of qubit names to :class:`qibolab.qubits.QubitPair` objects.""" - component_configs: dict[str, Config] + configs: dict[str, Config] """Maps name of component to its default config.""" instruments: InstrumentMap """Dictionary mapping instrument names to @@ -177,11 +177,11 @@ def sampling_rate(self): @property def components(self) -> set[str]: """Names of all components available in the platform.""" - return set(self.component_configs.keys()) + return set(self.configs.keys()) def config(self, name: str) -> Config: """Returns configuration of given component.""" - return self.component_configs[name] + return self.configs[name] def connect(self): """Connect to all instruments.""" @@ -214,7 +214,7 @@ def _apply_config_updates( updates: list of updates, where each entry is a dict mapping component name to new config. Later entries in the list override earlier entries (if they happen to update the same thing). """ - components = self.component_configs.copy() + components = self.configs.copy() for update in updates: for name, cfg in update.items(): if name not in components: @@ -245,14 +245,14 @@ def _controller(self): assert len(controllers) == 1 return controllers[0] - def _execute(self, sequence, configs, options, integration_setup, sweepers): + def _execute(self, sequences, options, integration_setup, sweepers): """Execute sequence on the controllers.""" result = {} for instrument in self.instruments.values(): if isinstance(instrument, Controller): new_result = instrument.play( - configs, sequence, options, integration_setup, sweepers + options.configs, sequences, options, integration_setup, sweepers ) if isinstance(new_result, dict): result.update(new_result) @@ -298,7 +298,7 @@ def execute( time = estimate_duration(sequences, options, sweepers) log.info(f"Minimal execution time: {time}") - configs = self._apply_config_updates(options.component_configs) + configs = self._apply_config_updates(options.configs) # for components that represent aux external instruments (e.g. lo) to the main control instrument # set the config directly @@ -323,12 +323,9 @@ def execute( results = defaultdict(list) for b in batch(sequences, self._controller.bounds): - sequence, readouts = unroll_sequences(b, options.relaxation_time) - result = self._execute( - sequence, configs, options, integration_setup, sweepers - ) - for serial, new_serials in readouts.items(): - results[serial].extend(result[ser] for ser in new_serials) + result = self._execute(b, options, integration_setup, sweepers) + for serial, data in result.items(): + results[serial].append(data) for serial, qubit in ro_pulses.items(): results[qubit] = results[serial] diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index 42fbc958ad..d925765bff 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -333,7 +333,7 @@ def dump_runcard(platform: Platform, path: Path): "qubits": list(platform.qubits), "topology": [list(pair) for pair in platform.ordered_pairs], "instruments": dump_instruments(platform.instruments), - "components": dump_component_configs(platform.component_configs), + "components": dump_component_configs(platform.configs), } if platform.couplers: diff --git a/tests/test_instruments_zhinst.py b/tests/test_instruments_zhinst.py index 3b23c1ec27..4df1d01b4b 100644 --- a/tests/test_instruments_zhinst.py +++ b/tests/test_instruments_zhinst.py @@ -149,7 +149,7 @@ def test_processed_sweeps_pulse_properties(dummy_qrc): processed_sweeps = ProcessedSweeps( [sweeper_duration, sweeper_amplitude], zi_instrument.channels.values(), - platform.component_configs, + platform.configs, ) assert len(processed_sweeps.sweeps_for_pulse(pulse_1)) == 1 @@ -222,9 +222,7 @@ def test_zhinst_configure_acquire_line(dummy_qrc): zi_instrument = platform.instruments["EL_ZURO"] qubit = platform.qubits[0] - zi_instrument.configure_acquire_line( - qubit.acquisition.name, platform.component_configs - ) + zi_instrument.configure_acquire_line(qubit.acquisition.name, platform.configs) assert qubit.acquisition.name in zi_instrument.signal_map assert ( @@ -237,8 +235,8 @@ def test_zhinst_configure_iq_line(dummy_qrc): platform = create_platform("zurich") zi_instrument = platform.instruments["EL_ZURO"] qubit = platform.qubits[0] - zi_instrument.configure_iq_line(qubit.drive.name, platform.component_configs) - zi_instrument.configure_iq_line(qubit.measure.name, platform.component_configs) + zi_instrument.configure_iq_line(qubit.drive.name, platform.configs) + zi_instrument.configure_iq_line(qubit.measure.name, platform.configs) assert qubit.drive.name in zi_instrument.signal_map assert ( @@ -257,7 +255,7 @@ def test_zhinst_configure_dc_line(dummy_qrc): platform = create_platform("zurich") zi_instrument = platform.instruments["EL_ZURO"] qubit = platform.qubits[0] - zi_instrument.configure_dc_line(qubit.flux.name, platform.component_configs) + zi_instrument.configure_dc_line(qubit.flux.name, platform.configs) assert qubit.flux.name in zi_instrument.signal_map assert ( From bf62a8ba0faf5b835287c1f338fd6f9f1e731931 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 30 Jul 2024 15:18:01 +0400 Subject: [PATCH 0349/1006] rename the sweep method to play for zi executor --- src/qibolab/instruments/zhinst/executor.py | 7 +------ tests/test_instruments_zhinst.py | 8 +++++--- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/qibolab/instruments/zhinst/executor.py b/src/qibolab/instruments/zhinst/executor.py index ea13bf21eb..475998405f 100644 --- a/src/qibolab/instruments/zhinst/executor.py +++ b/src/qibolab/instruments/zhinst/executor.py @@ -235,11 +235,6 @@ def experiment_flow( self.calibration_step(configs, options) self.create_exp(integration_setup, options) - # pylint: disable=W0221 - def play(self, configs, sequence, options): - """Play pulse sequence.""" - return self.sweep(configs, sequence, options) - def create_exp(self, integration_setup, options): """Zurich experiment initialization using their Experiment class.""" if self.acquisition_type: @@ -509,7 +504,7 @@ def play_pulse( else: raise ValueError(f"Cannot play pulse: {pulse}") - def sweep( + def play( self, configs: dict[str, Config], sequences: list[PulseSequence], diff --git a/tests/test_instruments_zhinst.py b/tests/test_instruments_zhinst.py index 4df1d01b4b..114d52f197 100644 --- a/tests/test_instruments_zhinst.py +++ b/tests/test_instruments_zhinst.py @@ -372,12 +372,12 @@ def test_sweep_and_play_sim(dummy_qrc): # check play zi_instrument.session = lo.Session(zi_instrument.device_setup) zi_instrument.session.connect(do_emulation=True) - res = zi_instrument.play(qubits, couplers, sequence, options) + res = zi_instrument.play(platform.configs, [sequence], options, {}) assert res is not None assert all(qubit in res for qubit in qubits) # check sweep with empty list of sweeps - res = zi_instrument.sweep(qubits, couplers, sequence, options) + res = zi_instrument.sweep(platform.configs, [sequence], options, {}) assert res is not None assert all(qubit in res for qubit in qubits) @@ -390,7 +390,9 @@ def test_sweep_and_play_sim(dummy_qrc): sweep_2 = Sweeper( Parameter.bias, np.array([1, 2, 3]), channels=[qubits[0].flux.name] ) - res = zi_instrument.sweep(qubits, couplers, sequence, options, sweep_1, sweep_2) + res = zi_instrument.sweep( + platform.configs, [sequence], options, {}, sweep_1, sweep_2 + ) assert res is not None assert all(qubit in res for qubit in qubits) From f96bc015617ece045276a7b881e2b133b7ce999a Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 30 Jul 2024 15:27:31 +0400 Subject: [PATCH 0350/1006] Some port tests --- tests/test_port.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tests/test_port.py b/tests/test_port.py index f8ae9d9ed7..7341ec7997 100644 --- a/tests/test_port.py +++ b/tests/test_port.py @@ -18,13 +18,15 @@ def test_set_attenuation(caplog): port.attenuation = 65 assert port.attenuation == 60 - assert "attenuation needs to be between 0 and 60 dB" in caplog.messages[0] - caplog.clear() + if caplog.messages: + assert "attenuation needs to be between 0 and 60 dB" in caplog.messages[0] + caplog.clear() port.attenuation = -10 assert port.attenuation == 0 - assert "attenuation needs to be between 0 and 60 dB" in caplog.messages[0] - caplog.clear() + if caplog.messages: + assert "attenuation needs to be between 0 and 60 dB" in caplog.messages[0] + caplog.clear() with pytest.raises(ValueError, match="Invalid"): port.attenuation = "something" From dbe9e3b144e90da86395bcdef5acccfe72987cbd Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 30 Jul 2024 15:32:08 +0400 Subject: [PATCH 0351/1006] remove un-necessary method load_component_config --- doc/source/getting-started/experiment.rst | 38 +-- doc/source/tutorials/lab.rst | 278 ++++++++++++++-------- pyproject.toml | 6 +- src/qibolab/dummy/platform.py | 34 +-- src/qibolab/serialize.py | 10 - tests/dummy_qrc/zurich/platform.py | 28 +-- 6 files changed, 224 insertions(+), 170 deletions(-) diff --git a/doc/source/getting-started/experiment.rst b/doc/source/getting-started/experiment.rst index 14e72a5bbb..c21acbf0e7 100644 --- a/doc/source/getting-started/experiment.rst +++ b/doc/source/getting-started/experiment.rst @@ -30,10 +30,21 @@ In this example, the qubit is controlled by a Zurich Instruments' SHFQC instrume import pathlib from laboneq.simple import DeviceSetup, SHFQC - from qibolab.components import AcquireChannel, IqChannel, IqConfig, AcquisitionConfig, OscillatorConfig + from qibolab.components import ( + AcquireChannel, + IqChannel, + IqConfig, + AcquisitionConfig, + OscillatorConfig, + ) from qibolab.instruments.zhinst import ZiChannel, Zurich from qibolab.platform import Platform - from qibolab.serialize import load_component_config, load_instrument_settings, load_qubits, load_runcard, load_settings + from qibolab.serialize import ( + load_instrument_settings, + load_qubits, + load_runcard, + load_settings, + ) NAME = "my_platform" # name of the platform ADDRESS = "localhost" # ip address of the ZI data server @@ -60,15 +71,18 @@ In this example, the qubit is controlled by a Zurich Instruments' SHFQC instrume # assign channels to qubits qubit.drive = IqChannel(name=drive, lo=drive_lo, mixer=None) - qubit.measure = IqChannel(name=measure, lo=measure_lo, mixer=None, acquisition=acquire) + qubit.measure = IqChannel( + name=measure, lo=measure_lo, mixer=None, acquisition=acquire + ) qubit.acquisition = AcquireChannel(name=acquire, measure=measure, twpa_pump=None) configs = {} - configs[drive] = load_component_config(runcard, drive, IqConfig) - configs[measure] = load_component_config(runcard, measure, IqConfig) - configs[acquire] = load_component_config(runcard, acquire, AcquisitionConfig) - configs[drive_lo] = load_component_config(runcard, drive_lo, OscillatorConfig) - configs[measure_lo] = load_component_config(runcard, measure_lo, OscillatorConfig) + component_params = runcard["components"] + configs[drive] = IqConfig(**component_params[drive]) + configs[measure] = IqConfig(**component_params[measure]) + configs[acquire] = AcquisitionConfig(**component_params[acquire]) + configs[drive_lo] = OscillatorConfig(**component_params[drive_lo]) + configs[measure_lo] = OscillatorConfig(**component_params[measure_lo]) zi_channels = [ ZiChannel(qubit.drive, device="device_shfqc", path="SGCHANNELS/0/OUTPUT"), @@ -76,11 +90,7 @@ In this example, the qubit is controlled by a Zurich Instruments' SHFQC instrume ZiChannel(qubit.acquisition, device="device_shfqc", path="QACHANNELS/0/INPUT"), ] - controller = Zurich( - NAME, - device_setup=device_setup, - channels=zi_channels - ) + controller = Zurich(NAME, device_setup=device_setup, channels=zi_channels) instruments = load_instrument_settings(runcard, {controller.name: controller}) settings = load_settings(runcard) @@ -264,7 +274,7 @@ We leave to the dedicated tutorial a full explanation of the experiment, but her acquisition_type=AcquisitionType.INTEGRATION, ) - results = platform.execute([sequence], options, [[sweeper]]) + results = platform.execute([sequence], options, sweeper) ro_pulse = next(iter(sequence.ro_pulses)) # plot the results diff --git a/doc/source/tutorials/lab.rst b/doc/source/tutorials/lab.rst index 82be4e6a40..3da2c3166e 100644 --- a/doc/source/tutorials/lab.rst +++ b/doc/source/tutorials/lab.rst @@ -38,7 +38,9 @@ using different Qibolab primitives. qubit = Qubit(0) # assign channels to the qubit - qubit.measure = IqChannel(name="measure", mixer=None, lo=None, acquisition="acquire") + qubit.measure = IqChannel( + name="measure", mixer=None, lo=None, acquisition="acquire" + ) qubit.acquire = AcquireChannel(name="acquire", twpa_pump=None, measure="measure") qubit.drive = Iqchannel(name="drive", mixer=None, lo=None) @@ -81,7 +83,9 @@ using different Qibolab primitives. instruments = {instrument.name: instrument} # allocate and return Platform object - return Platform("my_platform", qubits, pairs, configs, instruments, resonator_type="3D") + return Platform( + "my_platform", qubits, pairs, configs, instruments, resonator_type="3D" + ) This code creates a platform with a single qubit that is controlled by the @@ -118,59 +122,98 @@ hold the parameters of the two-qubit gates. qubit1 = Qubit(1) # assign channels to the qubits - qubit0.measure = IqChannel(name="measure_0", mixer=None, lo=None, acquisition="acquire_0") + qubit0.measure = IqChannel( + name="measure_0", mixer=None, lo=None, acquisition="acquire_0" + ) qubit0.acquire = AcquireChannel(name="acquire_0", twpa_pump=None, measure="measure_0") qubit0.drive = IqChannel(name="drive_0", mixer=None, lo=None) qubit0.flux = DcChannel(name="flux_0") - qubit1.measure = IqChannel(name="measure_1", mixer=None, lo=None, acquisition="acquire_1") + qubit1.measure = IqChannel( + name="measure_1", mixer=None, lo=None, acquisition="acquire_1" + ) qubit1.acquire = AcquireChannel(name="acquire_1", twpa_pump=None, measure="measure_1") qubit1.drive = IqChannel(name="drive_1", mixer=None, lo=None) # assign single-qubit native gates to each qubit qubit0.native_gates = SingleQubitNatives( - RX=RxyFactory(PulseSequence({qubit0.drive.name: [Pulse( - duration=40, - amplitude=0.05, - envelope=Gaussian(rel_sigma=0.2), - type=PulseType.DRIVE, - )]})), - MZ=FixedSequenceFactory(PulseSequence({qubit0.measure.name: [Pulse( - duration=1000, - amplitude=0.005, - envelope=Rectangular(), - type=PulseType.READOUT, - )]})), + RX=RxyFactory( + PulseSequence( + { + qubit0.drive.name: [ + Pulse( + duration=40, + amplitude=0.05, + envelope=Gaussian(rel_sigma=0.2), + type=PulseType.DRIVE, + ) + ] + } + ) + ), + MZ=FixedSequenceFactory( + PulseSequence( + { + qubit0.measure.name: [ + Pulse( + duration=1000, + amplitude=0.005, + envelope=Rectangular(), + type=PulseType.READOUT, + ) + ] + } + ) + ), ) qubit1.native_gates = SingleQubitNatives( - RX=RxyFactory(PulseSequence({qubit1.drive.name: [Pulse( - duration=40, - amplitude=0.05, - envelope=Gaussian(rel_sigma=0.2), - type=PulseType.DRIVE, - )]})), - MZ=FixedSequenceFactory(PulseSequence({qubit1.measure.name: [Pulse( - duration=1000, - amplitude=0.005, - envelope=Rectangular(), - type=PulseType.READOUT, - )]})), + RX=RxyFactory( + PulseSequence( + { + qubit1.drive.name: [ + Pulse( + duration=40, + amplitude=0.05, + envelope=Gaussian(rel_sigma=0.2), + type=PulseType.DRIVE, + ) + ] + } + ) + ), + MZ=FixedSequenceFactory( + PulseSequence( + { + qubit1.measure.name: [ + Pulse( + duration=1000, + amplitude=0.005, + envelope=Rectangular(), + type=PulseType.READOUT, + ) + ] + } + ) + ), ) # define the pair of qubits pair = QubitPair(qubit0, qubit1) pair.native_gates = TwoQubitNatives( - CZ=FixedSequenceFactory(PulseSequence({qubit0.flux.name: - [ - Pulse( - duration=30, - amplitude=0.005, - envelope=Rectangular(), - type=PulseType.FLUX, - ) - ], - } + CZ=FixedSequenceFactory( + PulseSequence( + { + qubit0.flux.name: [ + Pulse( + duration=30, + amplitude=0.005, + envelope=Rectangular(), + type=PulseType.FLUX, + ) + ], + } + ) ) - )) + ) Some architectures may also have coupler qubits that mediate the interactions. We can also interact with them defining the :class:`qibolab.couplers.Coupler` objects. @@ -205,19 +248,23 @@ coupler but qibolab will take them into account when calling :class:`qibolab.nat # define the pair of qubits pair = QubitPair(qubit0, qubit1, coupler_01) pair.native_gates = TwoQubitNatives( - CZ=FixedSequenceFactory(PulseSequence({coupler_01.flux.name: - [ - Pulse( - duration=30, - amplitude=0.005, - frequency=1e9, - envelope=Rectangular(), - type=PulseType.FLUX, - qubit=qubit1.name, - ) - ]}, + CZ=FixedSequenceFactory( + PulseSequence( + { + coupler_01.flux.name: [ + Pulse( + duration=30, + amplitude=0.005, + frequency=1e9, + envelope=Rectangular(), + type=PulseType.FLUX, + qubit=qubit1.name, + ) + ] + }, + ) ) - )) + ) The platform automatically creates the connectivity graph of the given chip using the dictionary of :class:`qibolab.qubits.QubitPair` objects. @@ -329,7 +376,7 @@ a two-qubit system: "envelope": {"kind": "rectangular"}, "type": "ro", } - ] + ] } }, "1": { @@ -462,7 +509,7 @@ we need the following changes to the previous runcard: ] } "CZ": [ - + ] } } @@ -494,14 +541,18 @@ the above runcard: from pathlib import Path from qibolab import Platform from qibolab.components import ( - AcquireChannel, - DcChannel, - IqChannel, - AcquisitionConfig, - DcConfig, - IqConfig + AcquireChannel, + DcChannel, + IqChannel, + AcquisitionConfig, + DcConfig, + IqConfig, + ) + from qibolab.serialize import ( + load_runcard, + load_qubits, + load_settings, ) - from qibolab.serialize import load_component_config, load_runcard, load_qubits, load_settings from qibolab.instruments.dummy import DummyInstrument FOLDER = Path.cwd() @@ -512,36 +563,45 @@ the above runcard: # Create a controller instrument instrument = DummyInstrument("my_instrument", "0.0.0.0:0") - # create ``Qubit`` and ``QubitPair`` objects by loading the runcard runcard = load_runcard(folder) qubits, _, pairs = load_qubits(runcard) - # define channels and load component configs configs = {} + component_params = runcard["components"] for q in range(2): drive_name = f"qubit_{q}/drive" - configs[drive_name] = load_component_config(drive_name, IqConfig) + configs[drive_name] = IqConfig(**component_params[drive_name]) qubits[q].drive = IqChannel(drive_name, mixer=None, lo=None) flux_name = f"qubit_{q}/flux" - configs[flux_name] = load_component_config(flux_name, DcConfig) + configs[flux_name] = DcConfig(**component_params[flux_name]) qubits[q].flux = DcChannel(flux_name) measure_name, acquire_name = f"qubit_{q}/measure", f"qubit_{q}/acquire" - configs[measure_name] = load_component_config(measure_name, IqConfig) - qubits[q].measure = IqChannel(measure_name, mixer=None, lo=None, acquistion=acquire_name) + configs[measure_name] = IqConfig(**component_params[measure_name]) + qubits[q].measure = IqChannel( + measure_name, mixer=None, lo=None, acquistion=acquire_name + ) - configs[acquire_name] = load_component_config(acquire_name, AcquisitionConfig) - quibts[q].acquisition = AcquireChannel(acquire_name, twpa_pump=None, measure=measure_name) + configs[acquire_name] = AcquisitionConfig(**component_params[acquire_name]) + quibts[q].acquisition = AcquireChannel( + acquire_name, twpa_pump=None, measure=measure_name + ) # create dictionary of instruments instruments = {instrument.name: instrument} # load ``settings`` from the runcard settings = load_settings(runcard) return Platform( - "my_platform", qubits, pairs, configs, instruments, settings, resonator_type="2D" + "my_platform", + qubits, + pairs, + configs, + instruments, + settings, + resonator_type="2D", ) With the following additions for coupler architectures: @@ -555,32 +615,35 @@ With the following additions for coupler architectures: # Create a controller instrument instrument = DummyInstrument("my_instrument", "0.0.0.0:0") - # create ``Qubit`` and ``QubitPair`` objects by loading the runcard runcard = load_runcard(folder) qubits, couplers, pairs = load_qubits(runcard) - # define channels and load component configs configs = {} + component_params = runcard["components"] for q in range(2): drive_name = f"qubit_{q}/drive" - configs[drive_name] = load_component_config(drive_name, IqConfig) + configs[drive_name] = IqConfig(**component_params[drive_name]) qubits[q].drive = IqChannel(drive_name, mixer=None, lo=None) flux_name = f"qubit_{q}/flux" - configs[flux_name] = load_component_config(flux_name, DcConfig) + configs[flux_name] = DcConfig(**component_params[flux_name]) qubits[q].flux = DcChannel(flux_name) measure_name, acquire_name = f"qubit_{q}/measure", f"qubit_{q}/acquire" - configs[measure_name] = load_component_config(measure_name, IqConfig) - qubits[q].measure = IqChannel(measure_name, mixer=None, lo=None, acquistion=acquire_name) + configs[measure_name] = IqConfig(**component_params[measure_name]) + qubits[q].measure = IqChannel( + measure_name, mixer=None, lo=None, acquistion=acquire_name + ) + + configs[acquire_name] = AcquisitionConfig(**component_params[acquire_name]) + quibts[q].acquisition = AcquireChannel( + acquire_name, twpa_pump=None, measure=measure_name + ) - configs[acquire_name] = load_component_config(acquire_name, AcquisitionConfig) - quibts[q].acquisition = AcquireChannel(acquire_name, twpa_pump=None, measure=measure_name) - coupler_flux_name = "coupler_0/flux" - configs[coupler_flux_name] = load_component_config(coupler_flux_name, DcConfig) + configs[coupler_flux_name] = DcConfig(**component_params[coupler_flux_name]) couplers[0].flux = DcChannel(coupler_flux_name) # create dictionary of instruments @@ -588,12 +651,12 @@ With the following additions for coupler architectures: # load ``settings`` from the runcard settings = load_settings(runcard) return Platform( - "my_platform", - qubits, - pairs, - configs, - instruments, - settings, + "my_platform", + qubits, + pairs, + configs, + instruments, + settings, resonator_type="2D", couplers=couplers, ) @@ -671,14 +734,18 @@ in this case ``"twpa_pump"``. from pathlib import Path from qibolab import Platform from qibolab.components import ( - AcquireChannel, - DcChannel, - IqChannel, - AcquisitionConfig, - DcConfig, - IqConfig + AcquireChannel, + DcChannel, + IqChannel, + AcquisitionConfig, + DcConfig, + IqConfig, + ) + from qibolab.serialize import ( + load_runcard, + load_qubits, + load_settings, ) - from qibolab.serialize import load_component_config, load_runcard, load_qubits, load_settings from qibolab.instruments.dummy import DummyInstrument FOLDER = Path.cwd() @@ -689,29 +756,32 @@ in this case ``"twpa_pump"``. # Create a controller instrument instrument = DummyInstrument("my_instrument", "0.0.0.0:0") - # create ``Qubit`` and ``QubitPair`` objects by loading the runcard runcard = load_runcard(folder) qubits, _, pairs = load_qubits(runcard) - # define channels and load component configs configs = {} + component_params = runcard["components"] for q in range(2): drive_name = f"qubit_{q}/drive" - configs[drive_name] = load_component_config(drive_name, IqConfig) + configs[drive_name] = IqConfig(**component_params[drive_name]) qubits[q].drive = IqChannel(drive_name, mixer=None, lo=None) flux_name = f"qubit_{q}/flux" - configs[flux_name] = load_component_config(flux_name, DcConfig) + configs[flux_name] = DcConfig(**component_params[flux_name]) qubits[q].flux = DcChannel(flux_name) measure_name, acquire_name = f"qubit_{q}/measure", f"qubit_{q}/acquire" - configs[measure_name] = load_component_config(measure_name, IqConfig) - qubits[q].measure = IqChannel(measure_name, mixer=None, lo=None, acquistion=acquire_name) + configs[measure_name] = IqConfig(**component_params[measure_name]) + qubits[q].measure = IqChannel( + measure_name, mixer=None, lo=None, acquistion=acquire_name + ) - configs[acquire_name] = load_component_config(acquire_name, AcquisitionConfig) - quibts[q].acquisition = AcquireChannel(acquire_name, twpa_pump=None, measurement=measure_name) + configs[acquire_name] = AcquisitionConfig(**component_params[acquire_name]) + quibts[q].acquisition = AcquireChannel( + acquire_name, twpa_pump=None, measurement=measure_name + ) # create dictionary of instruments instruments = {instrument.name: instrument} @@ -720,5 +790,11 @@ in this case ``"twpa_pump"``. # load ``settings`` from the runcard settings = load_settings(runcard) return Platform( - "my_platform", qubits, pairs, configs, instruments, settings, resonator_type="2D" + "my_platform", + qubits, + pairs, + configs, + instruments, + settings, + resonator_type="2D", ) diff --git a/pyproject.toml b/pyproject.toml index 5a65beaee4..38dc1bc092 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -107,9 +107,5 @@ disable = ["E1123", "E1120", "C0301"] testpaths = ['tests/'] markers = ["qpu: mark tests that require qpu"] addopts = [ - '--cov=qibolab', - '--cov-report=xml', - '--cov-report=html', - '-m not qpu', - '-k not emulator', + ] diff --git a/src/qibolab/dummy/platform.py b/src/qibolab/dummy/platform.py index eaabedeaff..16f36c413f 100644 --- a/src/qibolab/dummy/platform.py +++ b/src/qibolab/dummy/platform.py @@ -13,7 +13,6 @@ from qibolab.kernels import Kernels from qibolab.platform import Platform from qibolab.serialize import ( - load_component_config, load_instrument_settings, load_qubits, load_runcard, @@ -58,10 +57,9 @@ def create_dummy(with_couplers: bool = True): qubits, couplers, pairs = load_qubits(runcard, kernels) settings = load_settings(runcard) - component_configs = {} - component_configs[twpa_pump_name] = load_component_config( - runcard, twpa_pump_name, OscillatorConfig - ) + configs = {} + component_params = runcard["components"] + configs[twpa_pump_name] = OscillatorConfig(**component_params[twpa_pump_name]) for q, qubit in qubits.items(): acquisition_name = f"qubit_{q}/acquire" measure_name = f"qubit_{q}/measure" @@ -71,38 +69,28 @@ def create_dummy(with_couplers: bool = True): qubit.acquisition = AcquireChannel( acquisition_name, twpa_pump=twpa_pump_name, measure=measure_name ) - component_configs[measure_name] = load_component_config( - runcard, measure_name, IqConfig - ) - component_configs[acquisition_name] = load_component_config( - runcard, acquisition_name, AcquisitionConfig + configs[measure_name] = IqConfig(**component_params[measure_name]) + configs[acquisition_name] = AcquisitionConfig( + **component_params[acquisition_name] ) drive_name = f"qubit_{q}/drive" qubit.drive = IqChannel(drive_name, mixer=None, lo=None, acquisition=None) - component_configs[drive_name] = load_component_config( - runcard, drive_name, IqConfig - ) + configs[drive_name] = IqConfig(**component_params[drive_name]) drive_12_name = f"qubit_{q}/drive12" qubit.drive12 = IqChannel(drive_12_name, mixer=None, lo=None, acquisition=None) - component_configs[drive_12_name] = load_component_config( - runcard, drive_12_name, IqConfig - ) + configs[drive_12_name] = IqConfig(**component_params[drive_12_name]) flux_name = f"qubit_{q}/flux" qubit.flux = DcChannel(flux_name) - component_configs[flux_name] = load_component_config( - runcard, flux_name, DcConfig - ) + configs[flux_name] = DcConfig(**component_params[flux_name]) if with_couplers: for c, coupler in couplers.items(): flux_name = f"coupler_{c}/flux" coupler.flux = DcChannel(flux_name) - component_configs[flux_name] = load_component_config( - runcard, flux_name, DcConfig - ) + configs[flux_name] = DcConfig(**component_params[flux_name]) instruments = {instrument.name: instrument, twpa_pump.name: twpa_pump} instruments = load_instrument_settings(runcard, instruments) @@ -111,7 +99,7 @@ def create_dummy(with_couplers: bool = True): name, qubits, pairs, - component_configs, + configs, instruments, settings, resonator_type="2D", diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index d925765bff..cf4852a247 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -12,7 +12,6 @@ from pydantic import ConfigDict, TypeAdapter -from qibolab.components import Config from qibolab.couplers import Coupler from qibolab.kernels import Kernels from qibolab.native import ( @@ -206,15 +205,6 @@ def dump_qubit_name(name: QubitId) -> str: return name -def load_component_config( - runcard: dict, - component: str, - config_class: type, -) -> Config: - """Load configuration for given component.""" - return config_class(**runcard["components"][component]) - - def _dump_pulse(pulse: Pulse): data = pulse.model_dump() data["type"] = data["type"].value diff --git a/tests/dummy_qrc/zurich/platform.py b/tests/dummy_qrc/zurich/platform.py index 7464010f88..ca025b139e 100644 --- a/tests/dummy_qrc/zurich/platform.py +++ b/tests/dummy_qrc/zurich/platform.py @@ -15,7 +15,6 @@ ) from qibolab.kernels import Kernels from qibolab.serialize import ( - load_component_config, load_instrument_settings, load_qubits, load_runcard, @@ -51,7 +50,8 @@ def create(): qubits, couplers, pairs = load_qubits(runcard, kernels) settings = load_settings(runcard) - components = {} + configs = {} + component_params = runcard["components"] measure_lo = "measure/lo" drive_los = { 0: "qubit_0_1/drive/lo", @@ -60,16 +60,12 @@ def create(): 3: "qubit_2_3/drive/lo", 4: "qubit_4/drive/lo", } - components[measure_lo] = load_component_config( - runcard, measure_lo, OscillatorConfig - ) + configs[measure_lo] = OscillatorConfig(**component_params[measure_lo]) zi_channels = [] for q in QUBITS: measure_name = f"qubit_{q}/measure" acquisition_name = f"qubit_{q}/acquire" - components[measure_name] = load_component_config( - runcard, measure_name, ZiIqConfig - ) + configs[measure_name] = ZiIqConfig(**component_params[measure_name]) qubits[q].measure = IqChannel( name=measure_name, lo=measure_lo, mixer=None, acquisition=acquisition_name ) @@ -79,8 +75,8 @@ def create(): ) ) - components[acquisition_name] = load_component_config( - runcard, acquisition_name, ZiAcquisitionConfig + configs[acquisition_name] = ZiAcquisitionConfig( + **component_params[acquisition_name] ) qubits[q].acquisition = AcquireChannel( name=acquisition_name, @@ -94,10 +90,8 @@ def create(): ) drive_name = f"qubit_{q}/drive" - components[drive_los[q]] = load_component_config( - runcard, drive_los[q], OscillatorConfig - ) - components[drive_name] = load_component_config(runcard, drive_name, ZiIqConfig) + configs[drive_los[q]] = OscillatorConfig(**component_params[drive_los[q]]) + configs[drive_name] = ZiIqConfig(**component_params[drive_name]) qubits[q].drive = IqChannel( name=drive_name, mixer=None, @@ -110,7 +104,7 @@ def create(): ) flux_name = f"qubit_{q}/flux" - components[flux_name] = load_component_config(runcard, flux_name, ZiDcConfig) + configs[flux_name] = ZiDcConfig(**component_params[flux_name]) qubits[q].flux = DcChannel( name=flux_name, ) @@ -120,7 +114,7 @@ def create(): for i, c in enumerate(COUPLERS): flux_name = f"coupler_{c}/flux" - components[flux_name] = load_component_config(runcard, flux_name, ZiDcConfig) + configs[flux_name] = ZiDcConfig(**component_params[flux_name]) couplers[c].flux = DcChannel(name=flux_name) zi_channels.append( ZiChannel(couplers[c].flux, device="device_hdawg2", path=f"SIGOUTS/{i}") @@ -140,7 +134,7 @@ def create(): str(FOLDER), qubits, pairs, - components, + configs, instruments, settings, resonator_type="3D", From 6aa7ffbb498f80ef2f6b632edf243b31721bb3f6 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 30 Jul 2024 15:55:06 +0400 Subject: [PATCH 0352/1006] revert accidental change in pyproject.toml --- pyproject.toml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 38dc1bc092..5a65beaee4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -107,5 +107,9 @@ disable = ["E1123", "E1120", "C0301"] testpaths = ['tests/'] markers = ["qpu: mark tests that require qpu"] addopts = [ - + '--cov=qibolab', + '--cov-report=xml', + '--cov-report=html', + '-m not qpu', + '-k not emulator', ] From 734812d96cd6ef42c9d0aef09dd9a5611e445c69 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Wed, 31 Jul 2024 09:24:09 +0400 Subject: [PATCH 0353/1006] rename measure to probe --- doc/source/getting-started/experiment.rst | 30 ++--- doc/source/main-documentation/qibolab.rst | 10 +- doc/source/tutorials/calibration.rst | 36 +++--- doc/source/tutorials/lab.rst | 68 +++++----- src/qibolab/backends.py | 5 +- src/qibolab/components/channels.py | 4 +- src/qibolab/dummy/parameters.json | 20 +-- src/qibolab/dummy/platform.py | 10 +- src/qibolab/instruments/dummy.py | 2 +- .../instruments/emulator/pulse_simulator.py | 6 +- .../instruments/qblox/cluster_qrm_rf.py | 14 +- src/qibolab/instruments/qblox/controller.py | 15 ++- src/qibolab/instruments/rfsoc/driver.py | 10 +- src/qibolab/instruments/zhinst/executor.py | 18 +-- src/qibolab/platform/platform.py | 2 +- src/qibolab/pulses/sequence.py | 2 +- src/qibolab/qubits.py | 4 +- src/qibolab/sweeper.py | 2 +- src/qibolab/unrolling.py | 2 +- tests/dummy_qrc/zurich/parameters.json | 22 ++-- tests/dummy_qrc/zurich/platform.py | 16 +-- tests/emulators/default_q0/platform.py | 11 +- tests/pulses/test_sequence.py | 4 +- tests/test_compilers_default.py | 12 +- tests/test_dummy.py | 120 +++++++++--------- tests/test_instruments_rfsoc.py | 4 +- tests/test_instruments_zhinst.py | 60 ++++----- tests/test_platform.py | 22 ++-- tests/test_result_shapes.py | 26 ++-- 29 files changed, 277 insertions(+), 280 deletions(-) diff --git a/doc/source/getting-started/experiment.rst b/doc/source/getting-started/experiment.rst index c21acbf0e7..833f4c478b 100644 --- a/doc/source/getting-started/experiment.rst +++ b/doc/source/getting-started/experiment.rst @@ -66,27 +66,25 @@ In this example, the qubit is controlled by a Zurich Instruments' SHFQC instrume qubit = qubits[0] # define component names, and load their configurations - drive, measure, acquire = "q0/drive", "q0/measure", "q0/acquire" - drive_lo, measure_lo = "q0/drive/lo", "q0/measure/lo" + drive, probe, acquire = "q0/drive", "q0/probe", "q0/acquire" + drive_lo, readout_lo = "q0/drive/lo", "q0/readout/lo" # assign channels to qubits qubit.drive = IqChannel(name=drive, lo=drive_lo, mixer=None) - qubit.measure = IqChannel( - name=measure, lo=measure_lo, mixer=None, acquisition=acquire - ) - qubit.acquisition = AcquireChannel(name=acquire, measure=measure, twpa_pump=None) + qubit.probe = IqChannel(name=probe, lo=readout_lo, mixer=None, acquisition=acquire) + qubit.acquisition = AcquireChannel(name=acquire, probe=probe, twpa_pump=None) configs = {} component_params = runcard["components"] configs[drive] = IqConfig(**component_params[drive]) - configs[measure] = IqConfig(**component_params[measure]) + configs[probe] = IqConfig(**component_params[probe]) configs[acquire] = AcquisitionConfig(**component_params[acquire]) configs[drive_lo] = OscillatorConfig(**component_params[drive_lo]) - configs[measure_lo] = OscillatorConfig(**component_params[measure_lo]) + configs[readout_lo] = OscillatorConfig(**component_params[readout_lo]) zi_channels = [ ZiChannel(qubit.drive, device="device_shfqc", path="SGCHANNELS/0/OUTPUT"), - ZiChannel(qubit.measure, device="device_shfqc", path="QACHANNELS/0/OUTPUT"), + ZiChannel(qubit.probe, device="device_shfqc", path="QACHANNELS/0/OUTPUT"), ZiChannel(qubit.acquisition, device="device_shfqc", path="QACHANNELS/0/INPUT"), ] @@ -142,11 +140,11 @@ And the we can define the runcard ``my_platform/parameters.json``: "frequency": 5200000000, "power": null }, - "qubit_0/measure": { + "qubit_0/probe": { "frequency": 7320000000, "power_range": 1 }, - "qubit_0/measure/lo": { + "qubit_0/readout/lo": { "frequency": 7300000000, "power": null }, @@ -170,7 +168,7 @@ And the we can define the runcard ``my_platform/parameters.json``: ] }, "MZ": { - "qubit_0/measure": [ + "qubit_0/probe": [ { "duration": 2000, "amplitude": 0.02, @@ -262,7 +260,7 @@ We leave to the dedicated tutorial a full explanation of the experiment, but her sweeper = Sweeper( parameter=Parameter.frequency, values=np.arange(-2e8, +2e8, 1e6), - channels=[qubit.measure.name], + channels=[qubit.probe.name], type=SweeperType.OFFSET, ) @@ -275,11 +273,11 @@ We leave to the dedicated tutorial a full explanation of the experiment, but her ) results = platform.execute([sequence], options, sweeper) - ro_pulse = next(iter(sequence.ro_pulses)) + probe_pulse = next(iter(sequence.ro_pulses)) # plot the results - amplitudes = results[ro_pulse.id][0].magnitude - frequencies = np.arange(-2e8, +2e8, 1e6) + platform.config(qubit.measure.name).frequency + amplitudes = results[probe_pulse.id][0].magnitude + frequencies = np.arange(-2e8, +2e8, 1e6) + platform.config(qubit.probe.name).frequency plt.title("Resonator Spectroscopy") plt.xlabel("Frequencies [Hz]") diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index d327a7fc2a..c2477424a6 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -70,7 +70,7 @@ Now we can create a simple sequence (again, without explicitly giving any qubit qubit = platform.qubits[0] ps.extend(qubit.native_gates.RX.create_sequence()) ps.extend(qubit.native_gates.RX.create_sequence(phi=np.pi / 2)) - ps[qubit.measure.name].append(Delay(duration=200)) + ps[qubit.probe.name].append(Delay(duration=200)) ps.extend(qubit.native_gates.MZ.create_sequence()) Now we can execute the sequence on hardware: @@ -426,7 +426,7 @@ A tipical resonator spectroscopy experiment could be defined with: sweeper = Sweeper( parameter=Parameter.frequency, values=np.arange(-200_000, +200_000, 1), # define an interval of swept values - channels=[qubit.measure.name for qubit in platform.qubits.values()], + channels=[qubit.probe.name for qubit in platform.qubits.values()], type=SweeperType.OFFSET, ) @@ -459,7 +459,7 @@ For example: qubit = platform.qubits[0] sequence = PulseSequence() sequence.extend(qubit.native_gates.RX.create_sequence()) - sequence[qubit.measure.name].append(Delay(duration=sequence.duration)) + sequence[qubit.probe.name].append(Delay(duration=sequence.duration)) sequence.extend(qubit.native_gates.MZ.create_sequence()) sweeper_freq = Sweeper( @@ -556,7 +556,7 @@ Let's now delve into a typical use case for result objects within the qibolab fr sequence = PulseSequence() sequence.extend(qubit.native_gates.RX.create_sequence()) - sequence[qubit.measure.name].append(Delay(duration=sequence.duration)) + sequence[qubit.probe.name].append(Delay(duration=sequence.duration)) sequence.extend(qubit.native_gates.MZ.create_sequence()) options = ExecutionParameters( @@ -589,7 +589,7 @@ The shape of the values of an integreted acquisition with 2 sweepers will be: sweeper2 = Sweeper( parameter=Parameter.frequency, values=np.arange(-200_000, +200_000, 1), # define an interval of swept values - channels=[qubit.measure.name], + channels=[qubit.probe.name], type=SweeperType.OFFSET, ) shape = (options.nshots, len(sweeper1.values), len(sweeper2.values)) diff --git a/doc/source/tutorials/calibration.rst b/doc/source/tutorials/calibration.rst index 5ce2ef83b9..52aa106dc1 100644 --- a/doc/source/tutorials/calibration.rst +++ b/doc/source/tutorials/calibration.rst @@ -48,7 +48,7 @@ around the pre-defined frequency. sweeper = Sweeper( parameter=Parameter.frequency, values=np.arange(-2e8, +2e8, 1e6), - channels=[qubit.measure.name], + channels=[qubit.probe.name], type=SweeperType.OFFSET, ) @@ -63,7 +63,7 @@ We then define the execution parameters and launch the experiment. acquisition_type=AcquisitionType.INTEGRATION, ) - results = platform.execute([sequence], options, [[sweeper]]) + results = platform.execute([sequence], options, sweeper) In few seconds, the experiment will be finished and we can proceed to plot it. @@ -71,9 +71,9 @@ In few seconds, the experiment will be finished and we can proceed to plot it. import matplotlib.pyplot as plt - readout_pulse = next(iter(sequence.ro_pulses)) - amplitudes = results[readout_pulse.id][0].magnitude - frequencies = np.arange(-2e8, +2e8, 1e6) + platform.config(qubit.measure.name).frequency + probe_pulse = next(iter(sequence.ro_pulses)) + amplitudes = results[probe_pulse.id][0].magnitude + frequencies = np.arange(-2e8, +2e8, 1e6) + platform.config(qubit.probe.name).frequency plt.title("Resonator Spectroscopy") plt.xlabel("Frequencies [Hz]") @@ -125,8 +125,10 @@ complex pulse sequence. Therefore with start with that: # create pulse sequence and add pulses sequence = PulseSequence() - sequence[qubit.drive.name].append(Pulse(duration=2000, amplitude=0.01, envelope=Gaussian(rel_sigma=5))) - sequence[qubit.measure.name].append(Delay(duration=sequence.duration)) + sequence[qubit.drive.name].append( + Pulse(duration=2000, amplitude=0.01, envelope=Gaussian(rel_sigma=5)) + ) + sequence[qubit.probe.name].append(Delay(duration=sequence.duration)) sequence.extend(qubit.native_gates.MZ.create_sequence()) # allocate frequency sweeper @@ -151,10 +153,10 @@ We can now proceed to launch on hardware: acquisition_type=AcquisitionType.INTEGRATION, ) - results = platform.execute([sequence], options, [[sweeper]]) + results = platform.execute([sequence], options, sweeper) - readout_pulse = next(iter(sequence.ro_pulses)) - amplitudes = results[readout_pulse.id][0].magnitude + probe_pulse = next(iter(sequence.ro_pulses)) + amplitudes = results[probe_pulse.id][0].magnitude frequencies = np.arange(-2e8, +2e8, 1e6) + platform.config(qubit.drive.name).frequency plt.title("Resonator Spectroscopy") @@ -221,7 +223,7 @@ and its impact on qubit states in the IQ plane. # create pulse sequence 1 and add pulses one_sequence = PulseSequence() one_sequence.extend(qubit.native_gates.RX.create_sequence()) - one_sequence[qubit.measure.name].append(Delay(duration=one_sequence.duration)) + one_sequence[qubit.probe.name].append(Delay(duration=one_sequence.duration)) one_sequence.extend(qubit.native_gates.MZ.create_sequence()) # create pulse sequence 2 and add pulses @@ -237,20 +239,20 @@ and its impact on qubit states in the IQ plane. results_one = platform.execute([one_sequence], options) results_zero = platform.execute([zero_sequence], options) - readout_pulse1 = next(iter(one_sequence.ro_pulses)) - readout_pulse2 = next(iter(zero_sequence.ro_pulses)) + probe_pulse1 = next(iter(one_sequence.ro_pulses)) + probe_pulse2 = next(iter(zero_sequence.ro_pulses)) plt.title("Single shot classification") plt.xlabel("I [a.u.]") plt.ylabel("Q [a.u.]") plt.scatter( - results_one[readout_pulse1.id][0].voltage_i, - results_one[readout_pulse1.id][0].voltage_q, + results_one[probe_pulse1.id][0].voltage_i, + results_one[probe_pulse1.id][0].voltage_q, label="One state", ) plt.scatter( - results_zero[readout_pulse2.id][0].voltage_i, - results_zero[readout_pulse2.id][0].voltage_q, + results_zero[probe_pulse2.id][0].voltage_i, + results_zero[probe_pulse2.id][0].voltage_q, label="Zero state", ) plt.show() diff --git a/doc/source/tutorials/lab.rst b/doc/source/tutorials/lab.rst index 3da2c3166e..6bfd1dd23f 100644 --- a/doc/source/tutorials/lab.rst +++ b/doc/source/tutorials/lab.rst @@ -38,16 +38,14 @@ using different Qibolab primitives. qubit = Qubit(0) # assign channels to the qubit - qubit.measure = IqChannel( - name="measure", mixer=None, lo=None, acquisition="acquire" - ) - qubit.acquire = AcquireChannel(name="acquire", twpa_pump=None, measure="measure") + qubit.probe = IqChannel(name="probe", mixer=None, lo=None, acquisition="acquire") + qubit.acquire = AcquireChannel(name="acquire", twpa_pump=None, probe="probe") qubit.drive = Iqchannel(name="drive", mixer=None, lo=None) # define configuration for channels configs = {} configs[qubit.drive.name] = IqConfig(frequency=3e9) - configs[qubit.measure.name] = IqConfig(frequency=7e9) + configs[qubit.probe.name] = IqConfig(frequency=7e9) # create sequence that drives qubit from state 0 to 1 drive_seq = PulseSequence() @@ -61,8 +59,8 @@ using different Qibolab primitives. ) # create sequence that can be used for measuring the qubit - measure_seq = PulseSequence() - measure_seq[qubit.measure.name].append( + probe_seq = PulseSequence() + probe_seq[qubit.probe.name].append( Pulse( duration=1000, amplitude=0.005, @@ -74,7 +72,7 @@ using different Qibolab primitives. # assign native gates to the qubit qubit.native_gates = SingleQubitNatives( RX=RxyFactory(drive_seq), - MZ=FixedSequenceFactory(measure_seq), + MZ=FixedSequenceFactory(probe_seq), ) # create dictionaries of the different objects @@ -122,16 +120,12 @@ hold the parameters of the two-qubit gates. qubit1 = Qubit(1) # assign channels to the qubits - qubit0.measure = IqChannel( - name="measure_0", mixer=None, lo=None, acquisition="acquire_0" - ) - qubit0.acquire = AcquireChannel(name="acquire_0", twpa_pump=None, measure="measure_0") + qubit0.probe = IqChannel(name="probe_0", mixer=None, lo=None, acquisition="acquire_0") + qubit0.acquire = AcquireChannel(name="acquire_0", twpa_pump=None, probe="probe_0") qubit0.drive = IqChannel(name="drive_0", mixer=None, lo=None) qubit0.flux = DcChannel(name="flux_0") - qubit1.measure = IqChannel( - name="measure_1", mixer=None, lo=None, acquisition="acquire_1" - ) - qubit1.acquire = AcquireChannel(name="acquire_1", twpa_pump=None, measure="measure_1") + qubit1.probe = IqChannel(name="probe_1", mixer=None, lo=None, acquisition="acquire_1") + qubit1.acquire = AcquireChannel(name="acquire_1", twpa_pump=None, probe="probe_1") qubit1.drive = IqChannel(name="drive_1", mixer=None, lo=None) # assign single-qubit native gates to each qubit @@ -153,7 +147,7 @@ hold the parameters of the two-qubit gates. MZ=FixedSequenceFactory( PulseSequence( { - qubit0.measure.name: [ + qubit0.probe.name: [ Pulse( duration=1000, amplitude=0.005, @@ -183,7 +177,7 @@ hold the parameters of the two-qubit gates. MZ=FixedSequenceFactory( PulseSequence( { - qubit1.measure.name: [ + qubit1.probe.name: [ Pulse( duration=1000, amplitude=0.005, @@ -336,10 +330,10 @@ a two-qubit system: "flux_0": { "bias": 0.0 }, - "measure_0": { + "probe_0": { "frequency": 7453265000 }, - "measure_1": { + "probe_1": { "frequency": 7655107000 }, "acquire_0": { @@ -369,7 +363,7 @@ a two-qubit system: ] }, "MZ": { - "measure_0": [ + "probe_0": [ { "duration": 620, "amplitude": 0.003575, @@ -395,7 +389,7 @@ a two-qubit system: ] }, "MZ": { - "measure_1": [ + "probe_1": [ { "duration": 960, "amplitude": 0.00325, @@ -579,15 +573,15 @@ the above runcard: configs[flux_name] = DcConfig(**component_params[flux_name]) qubits[q].flux = DcChannel(flux_name) - measure_name, acquire_name = f"qubit_{q}/measure", f"qubit_{q}/acquire" - configs[measure_name] = IqConfig(**component_params[measure_name]) - qubits[q].measure = IqChannel( - measure_name, mixer=None, lo=None, acquistion=acquire_name + probe_name, acquire_name = f"qubit_{q}/probe", f"qubit_{q}/acquire" + configs[probe_name] = IqConfig(**component_params[probe_name]) + qubits[q].probe = IqChannel( + probe_name, mixer=None, lo=None, acquistion=acquire_name ) configs[acquire_name] = AcquisitionConfig(**component_params[acquire_name]) quibts[q].acquisition = AcquireChannel( - acquire_name, twpa_pump=None, measure=measure_name + acquire_name, twpa_pump=None, probe=probe_name ) # create dictionary of instruments @@ -631,15 +625,15 @@ With the following additions for coupler architectures: configs[flux_name] = DcConfig(**component_params[flux_name]) qubits[q].flux = DcChannel(flux_name) - measure_name, acquire_name = f"qubit_{q}/measure", f"qubit_{q}/acquire" - configs[measure_name] = IqConfig(**component_params[measure_name]) - qubits[q].measure = IqChannel( - measure_name, mixer=None, lo=None, acquistion=acquire_name + probe_name, acquire_name = f"qubit_{q}/probe", f"qubit_{q}/acquire" + configs[probe_name] = IqConfig(**component_params[probe_name]) + qubits[q].probe = IqChannel( + probe_name, mixer=None, lo=None, acquistion=acquire_name ) configs[acquire_name] = AcquisitionConfig(**component_params[acquire_name]) quibts[q].acquisition = AcquireChannel( - acquire_name, twpa_pump=None, measure=measure_name + acquire_name, twpa_pump=None, probe=probe_name ) coupler_flux_name = "coupler_0/flux" @@ -772,15 +766,15 @@ in this case ``"twpa_pump"``. configs[flux_name] = DcConfig(**component_params[flux_name]) qubits[q].flux = DcChannel(flux_name) - measure_name, acquire_name = f"qubit_{q}/measure", f"qubit_{q}/acquire" - configs[measure_name] = IqConfig(**component_params[measure_name]) - qubits[q].measure = IqChannel( - measure_name, mixer=None, lo=None, acquistion=acquire_name + probe_name, acquire_name = f"qubit_{q}/probe", f"qubit_{q}/acquire" + configs[probe_name] = IqConfig(**component_params[probe_name]) + qubits[q].probe = IqChannel( + probe_name, mixer=None, lo=None, acquistion=acquire_name ) configs[acquire_name] = AcquisitionConfig(**component_params[acquire_name]) quibts[q].acquisition = AcquireChannel( - acquire_name, twpa_pump=None, measurement=measure_name + acquire_name, twpa_pump=None, probe=probe_name ) # create dictionary of instruments diff --git a/src/qibolab/backends.py b/src/qibolab/backends.py index dda4b37824..c26928b87a 100644 --- a/src/qibolab/backends.py +++ b/src/qibolab/backends.py @@ -69,7 +69,7 @@ def assign_measurements(self, measurement_map, readout): containing the readout measurement shots. This is created in ``execute_circuit``. """ for gate, sequence in measurement_map.items(): - _samples = (readout[pulse.id].samples for pulse in sequence.ro_pulses) + _samples = (readout[pulse.id].samples for pulse in sequence.probe_pulses) samples = list(filter(lambda x: x is not None, _samples)) gate.result.backend = self gate.result.register_samples(np.array(samples).T) @@ -160,7 +160,8 @@ def execute_circuits(self, circuits, initial_states=None, nshots=1000): ) for gate, sequence in measurement_map.items(): samples = [ - readout[pulse.id].popleft().samples for pulse in sequence.ro_pulses + readout[pulse.id].popleft().samples + for pulse in sequence.probe_pulses ] gate.result.backend = self gate.result.register_samples(np.array(samples).T) diff --git a/src/qibolab/components/channels.py b/src/qibolab/components/channels.py index 0f125663fc..548efa7b55 100644 --- a/src/qibolab/components/channels.py +++ b/src/qibolab/components/channels.py @@ -69,9 +69,9 @@ class AcquireChannel(Channel): None, if there is no TWPA, or it is not configurable. """ - measure: Optional[str] = None + probe: Optional[str] = None """Name of the corresponding measure/probe channel. - FIXME: This is temporary solution to be able to relate acquisition channel to corresponding measure channel wherever needed in drivers, + FIXME: This is temporary solution to be able to relate acquisition channel to corresponding probe channel wherever needed in drivers, until we make acquire channels completely independent, and users start putting explicit acquisition commands in pulse sequence. """ diff --git a/src/qibolab/dummy/parameters.json b/src/qibolab/dummy/parameters.json index 665218ceca..42da6014bd 100644 --- a/src/qibolab/dummy/parameters.json +++ b/src/qibolab/dummy/parameters.json @@ -71,19 +71,19 @@ "qubit_4/flux" : { "offset": 0.15 }, - "qubit_0/measure" : { + "qubit_0/probe" : { "frequency": 5200000000 }, - "qubit_1/measure" : { + "qubit_1/probe" : { "frequency": 4900000000 }, - "qubit_2/measure" : { + "qubit_2/probe" : { "frequency": 6100000000 }, - "qubit_3/measure" : { + "qubit_3/probe" : { "frequency": 5800000000 }, - "qubit_4/measure" : { + "qubit_4/probe" : { "frequency": 5500000000 }, "qubit_0/acquire": { @@ -147,7 +147,7 @@ ] }, "MZ": { - "qubit_0/measure": [ + "qubit_0/probe": [ { "duration": 2000, "amplitude": 0.1, @@ -183,7 +183,7 @@ ] } , "MZ": { - "qubit_1/measure": [ + "qubit_1/probe": [ { "duration": 2000, "amplitude": 0.1, @@ -219,7 +219,7 @@ ] }, "MZ": { - "qubit_2/measure": [ + "qubit_2/probe": [ { "duration": 2000, "amplitude": 0.1, @@ -255,7 +255,7 @@ ] }, "MZ": { - "qubit_3/measure": [ + "qubit_3/probe": [ { "duration": 2000, "amplitude": 0.1, @@ -291,7 +291,7 @@ ] }, "MZ": { - "qubit_4/measure": [ + "qubit_4/probe": [ { "duration": 2000, "amplitude": 0.1, diff --git a/src/qibolab/dummy/platform.py b/src/qibolab/dummy/platform.py index 16f36c413f..0a978e2c7e 100644 --- a/src/qibolab/dummy/platform.py +++ b/src/qibolab/dummy/platform.py @@ -62,14 +62,14 @@ def create_dummy(with_couplers: bool = True): configs[twpa_pump_name] = OscillatorConfig(**component_params[twpa_pump_name]) for q, qubit in qubits.items(): acquisition_name = f"qubit_{q}/acquire" - measure_name = f"qubit_{q}/measure" - qubit.measure = IqChannel( - measure_name, mixer=None, lo=None, acquisition=acquisition_name + probe_name = f"qubit_{q}/probe" + qubit.probe = IqChannel( + probe_name, mixer=None, lo=None, acquisition=acquisition_name ) qubit.acquisition = AcquireChannel( - acquisition_name, twpa_pump=twpa_pump_name, measure=measure_name + acquisition_name, twpa_pump=twpa_pump_name, probe=probe_name ) - configs[measure_name] = IqConfig(**component_params[measure_name]) + configs[probe_name] = IqConfig(**component_params[probe_name]) configs[acquisition_name] = AcquisitionConfig( **component_params[acquisition_name] ) diff --git a/src/qibolab/instruments/dummy.py b/src/qibolab/instruments/dummy.py index 14370b46c3..e9c4f85b27 100644 --- a/src/qibolab/instruments/dummy.py +++ b/src/qibolab/instruments/dummy.py @@ -111,7 +111,7 @@ def play( ) for seq in sequences: - for ro_pulse in seq.ro_pulses: + for ro_pulse in seq.probe_pulses: values = self.get_values(options, ro_pulse, shape) results[ro_pulse.id] = options.results_type(values) diff --git a/src/qibolab/instruments/emulator/pulse_simulator.py b/src/qibolab/instruments/emulator/pulse_simulator.py index 7d657a8b69..b13eafa563 100644 --- a/src/qibolab/instruments/emulator/pulse_simulator.py +++ b/src/qibolab/instruments/emulator/pulse_simulator.py @@ -154,7 +154,7 @@ def play( Qibolab results object, as well as simulation-related time and states data. """ nshots = execution_parameters.nshots - ro_pulse_list = sequence.ro_pulses + ro_pulse_list = sequence.probe_pulses times_dict, output_states, ro_reduced_dm, rdm_qubit_list = ( self.run_pulse_simulation(sequence, self.instant_measurement) ) @@ -249,7 +249,7 @@ def sweep( # reshape and reformat samples to results format results = get_results_from_samples( - sequence.ro_pulses, sweep_samples, execution_parameters, sweeper_shape + sequence.probe_pulses, sweep_samples, execution_parameters, sweeper_shape ) # Reset pulse values back to original values (following icarusqfpga) @@ -358,7 +358,7 @@ def _sweep_play( dict: A tuple with dictionary containing simulation-related time data, a list of states at each time step in the simulation, and a dictionary mapping the qubit indices to list of sampled values. """ nshots = execution_parameters.nshots - ro_pulse_list = sequence.ro_pulses + ro_pulse_list = sequence.probe_pulses # run pulse simulation times_dict, state_history, ro_reduced_dm, rdm_qubit_list = ( diff --git a/src/qibolab/instruments/qblox/cluster_qrm_rf.py b/src/qibolab/instruments/qblox/cluster_qrm_rf.py index 9d582e8598..92aacaf98e 100644 --- a/src/qibolab/instruments/qblox/cluster_qrm_rf.py +++ b/src/qibolab/instruments/qblox/cluster_qrm_rf.py @@ -615,7 +615,9 @@ def process_pulse_sequence( # Acquisitions pulse = None - for acquisition_index, pulse in enumerate(sequencer.pulses.ro_pulses): + for acquisition_index, pulse in enumerate( + sequencer.pulses.probe_pulses + ): sequencer.acquisitions[pulse.id] = { "num_bins": num_bins, "index": acquisition_index, @@ -759,14 +761,14 @@ def process_pulse_sequence( # Prepare acquire instruction: acquire acquisition_index, bin_index, delay_next_instruction if active_reset: pulses_block.append( - f"acquire {pulses.ro_pulses.index(pulses[n])},{bin_n},4" + f"acquire {pulses.probe_pulses.index(pulses[n])},{bin_n},4" ) pulses_block.append( f"latch_rst {delay_after_acquire + 300 - 4}" ) else: pulses_block.append( - f"acquire {pulses.ro_pulses.index(pulses[n])},{bin_n},{delay_after_acquire}" + f"acquire {pulses.probe_pulses.index(pulses[n])},{bin_n},{delay_after_acquire}" ) else: @@ -990,8 +992,8 @@ def acquire(self): "scope_acquisition" ] if not hardware_demod_enabled: # Software Demodulation - if len(sequencer.pulses.ro_pulses) == 1: - pulse = sequencer.pulses.ro_pulses[0] + if len(sequencer.pulses.probe_pulses) == 1: + pulse = sequencer.pulses.probe_pulses[0] frequency = self.get_if(pulse) acquisitions[pulse.qubit] = acquisitions[pulse.id] = ( AveragedAcquisition(scope, duration, frequency) @@ -1003,7 +1005,7 @@ def acquire(self): ) else: # Hardware Demodulation results = self.device.get_acquisitions(sequencer.number) - for pulse in sequencer.pulses.ro_pulses: + for pulse in sequencer.pulses.probe_pulses: bins = results[pulse.id]["acquisition"]["bins"] acquisitions[pulse.qubit] = acquisitions[pulse.id] = ( DemodulatedAcquisition(scope, bins, duration) diff --git a/src/qibolab/instruments/qblox/controller.py b/src/qibolab/instruments/qblox/controller.py index 099d8c9dac..fb9c691e48 100644 --- a/src/qibolab/instruments/qblox/controller.py +++ b/src/qibolab/instruments/qblox/controller.py @@ -196,14 +196,17 @@ def _execute_pulse_sequence( # retrieve the results acquisition_results = {} for name, module in self.modules.items(): - if isinstance(module, QrmRf) and not module_pulses[name].ro_pulses.is_empty: + if ( + isinstance(module, QrmRf) + and not module_pulses[name].probe_pulses.is_empty + ): results = module.acquire() for key, value in results.items(): acquisition_results[key] = value # TODO: move to QRM_RF.acquire() shape = tuple(len(sweeper.values) for sweeper in reversed(sweepers)) shots_shape = (nshots,) + shape - for ro_pulse in sequence.ro_pulses: + for ro_pulse in sequence.probe_pulses: if options.acquisition_type is AcquisitionType.DISCRIMINATION: _res = acquisition_results[ro_pulse.id].classified _res = np.reshape(_res, shots_shape) @@ -284,7 +287,7 @@ def sweep( sweepers_copy.reverse() # create a map between the pulse id, which never changes, and the original serial - for pulse in sequence_copy.ro_pulses: + for pulse in sequence_copy.probe_pulses: map_id_serial[pulse.id] = pulse.id id_results[pulse.id] = None id_results[pulse.qubit] = None @@ -300,7 +303,7 @@ def sweep( # return the results using the original serials serial_results = {} - for pulse in sequence_copy.ro_pulses: + for pulse in sequence_copy.probe_pulses: serial_results[map_id_serial[pulse.id]] = id_results[pulse.id] serial_results[pulse.qubit] = id_results[pulse.id] return serial_results @@ -395,7 +398,7 @@ def _sweep_recursion( result = self._execute_pulse_sequence( qubits=qubits, sequence=sequence, options=options ) - for pulse in sequence.ro_pulses: + for pulse in sequence.probe_pulses: if results[pulse.id]: results[pulse.id] += result[pulse.id] else: @@ -532,7 +535,7 @@ def _combine_result_chunks(chunks): @staticmethod def _add_to_results(sequence, results, results_to_add): - for pulse in sequence.ro_pulses: + for pulse in sequence.probe_pulses: if results[pulse.id]: results[pulse.id] += results_to_add[pulse.id] else: diff --git a/src/qibolab/instruments/rfsoc/driver.py b/src/qibolab/instruments/rfsoc/driver.py index 241b5ee2a8..b9cdd49052 100644 --- a/src/qibolab/instruments/rfsoc/driver.py +++ b/src/qibolab/instruments/rfsoc/driver.py @@ -108,7 +108,7 @@ def validate_input_command( raise NotImplementedError( "Raw data acquisition is not compatible with sweepers" ) - if len(sequence.ro_pulses) != 1: + if len(sequence.probe_pulses) != 1: raise NotImplementedError( "Raw data acquisition is compatible only with a single readout" ) @@ -259,10 +259,10 @@ def play( toti, totq = self._execute_pulse_sequence(sequence, qubits, opcode) results = {} - probed_qubits = np.unique([p.qubit for p in sequence.ro_pulses]) + probed_qubits = np.unique([p.qubit for p in sequence.probe_pulses]) for j, qubit in enumerate(probed_qubits): - for i, ro_pulse in enumerate(sequence.ro_pulses.get_qubit_pulses(qubit)): + for i, ro_pulse in enumerate(sequence.probe_pulses.get_qubit_pulses(qubit)): i_pulse = np.array(toti[j][i]) q_pulse = np.array(totq[j][i]) @@ -328,7 +328,7 @@ def play_sequence_in_sweep_recursion( """ res = self.play(qubits, couplers, sequence, execution_parameters) newres = {} - serials = [pulse.id for pulse in or_sequence.ro_pulses] + serials = [pulse.id for pulse in or_sequence.probe_pulses] for idx, key in enumerate(res): if idx % 2 == 1: newres[serials[idx // 2]] = res[key] @@ -596,7 +596,7 @@ def sweep( qubits, couplers, sweepsequence, - sequence.ro_pulses, + sequence.probe_pulses, *rfsoc_sweepers, execution_parameters=execution_parameters, ) diff --git a/src/qibolab/instruments/zhinst/executor.py b/src/qibolab/instruments/zhinst/executor.py index 475998405f..33cf8c858a 100644 --- a/src/qibolab/instruments/zhinst/executor.py +++ b/src/qibolab/instruments/zhinst/executor.py @@ -101,7 +101,7 @@ def __init__( def sampling_rate(self): return SAMPLING_RATE - def _measure_channels(self) -> set[str]: + def _probe_channels(self) -> set[str]: return { ch.logical_channel.name for ch in self.channels.values() @@ -174,8 +174,8 @@ def configure_acquire_line( self, channel: AcquireChannel, configs: dict[str, Config] ): intermediate_frequency = ( - configs[channel.measure].frequency - - configs[self.channels[channel.measure].logical_channel.lo].frequency + configs[channel.probe].frequency + - configs[self.channels[channel.probe].logical_channel.lo].frequency ) acquire_signal = self.device_setup.logical_signal_by_uid(channel.name) self.signal_map[channel.name] = acquire_signal @@ -376,11 +376,11 @@ def get_channel_node_path(self, channel_name: str) -> str: def select_exp(self, exp, integration_setup, exp_options): """Build Zurich Experiment selecting the relevant sections.""" - measurement_channels = self._measure_channels() + probe_channels = self._probe_channels() kernels = {} previous_section = None for i, seq in enumerate(self.sequences): - other_channels = set(seq.keys()) - measurement_channels + other_channels = set(seq.keys()) - probe_channels section_uid = f"sequence_{i}" with exp.section(uid=section_uid, play_after=previous_section): with exp.section(uid=f"sequence_{i}_control"): @@ -394,7 +394,7 @@ def select_exp(self, exp, integration_setup, exp_options): ) for ch in set(seq.keys()) - other_channels: for j, pulse in enumerate(seq[ch]): - with exp.section(uid=f"sequence_{i}_measure_{j}"): + with exp.section(uid=f"sequence_{i}_probe_{j}"): acquisition_name = self.channels[ ch ].logical_channel.acquisition @@ -519,11 +519,11 @@ def play( self.nt_sweeps, self.rt_sweeps = classify_sweepers(sweepers) self.acquisition_type = None - measure_channels = self._measure_channels() + probe_channels = self._probe_channels() for sweeper in sweepers: if sweeper.parameter in {Parameter.frequency}: for ch in sweeper.channels: - if ch in measure_channels: + if ch in probe_channels: self.acquisition_type = laboneq.AcquisitionType.SPECTROSCOPY self.experiment_flow(configs, sequences, integration_setup, options) @@ -531,7 +531,7 @@ def play( # Get the results back results = {} - for ch in measure_channels: + for ch in probe_channels: acquisition_name = self.channels[ch].logical_channel.acquisition for i, seq in enumerate(self.sequences): for j, ropulse in enumerate(seq[ch]): diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index d1eb5773e0..476846fef0 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -58,7 +58,7 @@ def unroll_sequences( for sequence in sequences: total_sequence.extend(sequence) # TODO: Fix unrolling results - for pulse in sequence.ro_pulses: + for pulse in sequence.probe_pulses: readout_map[pulse.id].append(pulse.id) length = sequence.duration + relaxation_time diff --git a/src/qibolab/pulses/sequence.py b/src/qibolab/pulses/sequence.py index 844656c5f4..beb6b03c6f 100644 --- a/src/qibolab/pulses/sequence.py +++ b/src/qibolab/pulses/sequence.py @@ -18,7 +18,7 @@ def __init__(self, seq_dict: Optional[dict[str, list[PulseLike]]] = None): super().__init__(list, **initial_content) @property - def ro_pulses(self): + def probe_pulses(self): """Return list of the readout pulses in this sequence.""" pulses = [] for seq in self.values(): diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index 2abd444097..ebba47f48c 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -10,7 +10,7 @@ QubitId = Union[str, int] """Type for qubit names.""" -CHANNEL_NAMES = ("measure", "acquisition", "drive", "drive12", "drive_cross", "flux") +CHANNEL_NAMES = ("probe", "acquisition", "drive", "drive12", "drive_cross", "flux") """Names of channels that belong to a qubit. Not all channels are required to operate a qubit. @@ -88,7 +88,7 @@ class Qubit: mixer_readout_g: float = 0.0 mixer_readout_phi: float = 0.0 - measure: Optional[IqChannel] = None + probe: Optional[IqChannel] = None acquisition: Optional[AcquireChannel] = None drive: Optional[IqChannel] = None drive12: Optional[IqChannel] = None diff --git a/src/qibolab/sweeper.py b/src/qibolab/sweeper.py index 3c2ae51aac..91107aef6c 100644 --- a/src/qibolab/sweeper.py +++ b/src/qibolab/sweeper.py @@ -69,7 +69,7 @@ class Sweeper: sequence = qubit.native_gates.MZ.create_sequence() parameter = Parameter.frequency parameter_range = np.random.randint(10, size=10) - sweeper = Sweeper(parameter, parameter_range, channels=[qubit.measure.name]) + sweeper = Sweeper(parameter, parameter_range, channels=[qubit.probe.name]) platform.execute([sequence], ExecutionParameters(), [[sweeper]]) Args: diff --git a/src/qibolab/unrolling.py b/src/qibolab/unrolling.py index 11d58ce2ee..bccf99fa60 100644 --- a/src/qibolab/unrolling.py +++ b/src/qibolab/unrolling.py @@ -28,7 +28,7 @@ def _waveform(sequence: PulseSequence): def _readout(sequence: PulseSequence): # TODO: Do we count 1 readout per pulse or 1 readout per multiplexed readout ? - return len(sequence.ro_pulses) + return len(sequence.probe_pulses) def _instructions(sequence: PulseSequence): diff --git a/tests/dummy_qrc/zurich/parameters.json b/tests/dummy_qrc/zurich/parameters.json index 0392dae538..7b1cb9e9cd 100644 --- a/tests/dummy_qrc/zurich/parameters.json +++ b/tests/dummy_qrc/zurich/parameters.json @@ -62,23 +62,23 @@ "offset": 0.15, "power_range": 5 }, - "qubit_0/measure" : { + "qubit_0/probe" : { "frequency": 5200000000, "power_range": -10 }, - "qubit_1/measure" : { + "qubit_1/probe" : { "frequency": 4900000000, "power_range": -10 }, - "qubit_2/measure" : { + "qubit_2/probe" : { "frequency": 6100000000, "power_range": -10 }, - "qubit_3/measure" : { + "qubit_3/probe" : { "frequency": 5800000000, "power_range": -10 }, - "qubit_4/measure" : { + "qubit_4/probe" : { "frequency": 5500000000, "power_range": -10 }, @@ -123,7 +123,7 @@ "offset": 0.0, "power_range": 0.4 }, - "measure/lo": { + "readout/lo": { "power": 10, "frequency": 6000000000.0 }, @@ -154,7 +154,7 @@ ] }, "MZ": { - "qubit_0/measure": [ + "qubit_0/probe": [ { "duration": 2000, "amplitude": 0.1, @@ -176,7 +176,7 @@ ] }, "MZ": { - "qubit_1/measure": [ + "qubit_1/probe": [ { "duration": 2000, "amplitude": 0.2, @@ -198,7 +198,7 @@ ] }, "MZ": { - "qubit_2/measure": [ + "qubit_2/probe": [ { "duration": 2000, "amplitude": 0.02, @@ -220,7 +220,7 @@ ] }, "MZ": { - "qubit_3/measure": [ + "qubit_3/probe": [ { "duration": 2000, "amplitude": 0.25, @@ -242,7 +242,7 @@ ] }, "MZ": { - "qubit_4/measure": [ + "qubit_4/probe": [ { "duration": 2000, "amplitude": 0.31, diff --git a/tests/dummy_qrc/zurich/platform.py b/tests/dummy_qrc/zurich/platform.py index ca025b139e..8c79638c94 100644 --- a/tests/dummy_qrc/zurich/platform.py +++ b/tests/dummy_qrc/zurich/platform.py @@ -52,7 +52,7 @@ def create(): configs = {} component_params = runcard["components"] - measure_lo = "measure/lo" + readout_lo = "readout/lo" drive_los = { 0: "qubit_0_1/drive/lo", 1: "qubit_0_1/drive/lo", @@ -60,18 +60,18 @@ def create(): 3: "qubit_2_3/drive/lo", 4: "qubit_4/drive/lo", } - configs[measure_lo] = OscillatorConfig(**component_params[measure_lo]) + configs[readout_lo] = OscillatorConfig(**component_params[readout_lo]) zi_channels = [] for q in QUBITS: - measure_name = f"qubit_{q}/measure" + probe_name = f"qubit_{q}/probe" acquisition_name = f"qubit_{q}/acquire" - configs[measure_name] = ZiIqConfig(**component_params[measure_name]) - qubits[q].measure = IqChannel( - name=measure_name, lo=measure_lo, mixer=None, acquisition=acquisition_name + configs[probe_name] = ZiIqConfig(**component_params[probe_name]) + qubits[q].probe = IqChannel( + name=probe_name, lo=readout_lo, mixer=None, acquisition=acquisition_name ) zi_channels.append( ZiChannel( - qubits[q].measure, device="device_shfqc", path="QACHANNELS/0/OUTPUT" + qubits[q].probe, device="device_shfqc", path="QACHANNELS/0/OUTPUT" ) ) @@ -81,7 +81,7 @@ def create(): qubits[q].acquisition = AcquireChannel( name=acquisition_name, twpa_pump=None, - measure=measure_name, + probe=probe_name, ) zi_channels.append( ZiChannel( diff --git a/tests/emulators/default_q0/platform.py b/tests/emulators/default_q0/platform.py index 611ca2f863..b1d8498416 100644 --- a/tests/emulators/default_q0/platform.py +++ b/tests/emulators/default_q0/platform.py @@ -1,10 +1,9 @@ import pathlib -from qibolab.components import IqChannel, AcquireChannel +from qibolab.components import AcquireChannel, IqChannel from qibolab.instruments.emulator.pulse_simulator import PulseSimulator from qibolab.platform import Platform from qibolab.serialize import ( - load_component_config, load_instrument_settings, load_qubits, load_runcard, @@ -32,8 +31,12 @@ def create(): # define channels for qubits for q, qubit in qubits.items(): - qubit.measure = IqChannel("measure-{q}", mixer=None, lo=None, acquisition="acquire-{q}") - qubit.acquisition = AcquireChannel("acquire-{q}", mixer=None, lo=None, measure="measure-{q}") + qubit.probe = IqChannel( + "probe-{q}", mixer=None, lo=None, acquisition="acquire-{q}" + ) + qubit.acquisition = AcquireChannel( + "acquire-{q}", mixer=None, lo=None, twpa_pump=None, probe="probe-{q}" + ) return Platform( device_name, diff --git a/tests/pulses/test_sequence.py b/tests/pulses/test_sequence.py index c8edadc0c0..2963c80213 100644 --- a/tests/pulses/test_sequence.py +++ b/tests/pulses/test_sequence.py @@ -85,8 +85,8 @@ def test_ro_pulses(): sequence["ch3"].append(ro_pulse) assert set(sequence.keys()) == {"ch1", "ch2", "ch3"} assert sum(len(pulses) for pulses in sequence.values()) == 5 - assert len(sequence.ro_pulses) == 1 - assert sequence.ro_pulses[0] == ro_pulse + assert len(sequence.probe_pulses) == 1 + assert sequence.probe_pulses[0] == ro_pulse def test_durations(): diff --git a/tests/test_compilers_default.py b/tests/test_compilers_default.py index 537ef34f5d..c1b726212a 100644 --- a/tests/test_compilers_default.py +++ b/tests/test_compilers_default.py @@ -64,7 +64,7 @@ def test_compile_two_gates(platform): qubit = platform.qubits[0] assert len(sequence) == 2 assert len(sequence[qubit.drive.name]) == 2 - assert len(sequence[qubit.measure.name]) == 2 # includes delay + assert len(sequence[qubit.probe.name]) == 2 # includes delay def test_measurement(platform): @@ -75,7 +75,7 @@ def test_measurement(platform): sequence = compile_circuit(circuit, platform) assert len(sequence) == 1 * nqubits - assert len(sequence.ro_pulses) == 1 * nqubits + assert len(sequence.probe_pulses) == 1 * nqubits def test_rz_to_sequence(platform): @@ -142,12 +142,12 @@ def test_add_measurement_to_sequence(platform): qubit = platform.qubits[0] assert len(sequence) == 2 assert len(sequence[qubit.drive.name]) == 2 - assert len(sequence[qubit.measure.name]) == 2 # include delay + assert len(sequence[qubit.probe.name]) == 2 # include delay s = PulseSequence() s.extend(qubit.native_gates.RX.create_sequence(theta=np.pi / 2, phi=0.1)) s.extend(qubit.native_gates.RX.create_sequence(theta=np.pi / 2, phi=0.2)) - s[qubit.measure.name].append(Delay(duration=s.duration)) + s[qubit.probe.name].append(Delay(duration=s.duration)) s.extend(qubit.native_gates.MZ.create_sequence()) assert sequence == s @@ -162,7 +162,7 @@ def test_align_delay_measurement(platform, delay): target_sequence = PulseSequence() if delay > 0: - target_sequence[platform.qubits[0].measure.name].append(Delay(duration=delay)) + target_sequence[platform.qubits[0].probe.name].append(Delay(duration=delay)) target_sequence.extend(platform.qubits[0].native_gates.MZ.create_sequence()) assert sequence == target_sequence - assert len(sequence.ro_pulses) == 1 + assert len(sequence.probe_pulses) == 1 diff --git a/tests/test_dummy.py b/tests/test_dummy.py index 75048f7abd..3d1d650917 100644 --- a/tests/test_dummy.py +++ b/tests/test_dummy.py @@ -30,17 +30,19 @@ def test_dummy_initialization(name): def test_dummy_execute_pulse_sequence(name, acquisition): nshots = 100 platform = create_platform(name) - mz_seq = platform.qubits[0].native_gates.MZ.create_sequence() - mz_pulse = next(iter(mz_seq.values()))[0] + probe_seq = platform.qubits[0].native_gates.MZ.create_sequence() + probe_pulse = next(iter(probe_seq.values()))[0] sequence = PulseSequence() - sequence.extend(mz_seq) + sequence.extend(probe_seq) sequence.extend(platform.qubits[0].native_gates.RX12.create_sequence()) options = ExecutionParameters(nshots=100, acquisition_type=acquisition) - result = platform.execute_pulse_sequence(sequence, options) + result = platform.execute([sequence], options) if acquisition is AcquisitionType.INTEGRATION: - assert result[mz_pulse.id].magnitude.shape == (nshots,) + assert result[probe_pulse.id][0].magnitude.shape == (nshots,) elif acquisition is AcquisitionType.RAW: - assert result[mz_pulse.id].magnitude.shape == (nshots * mz_seq.duration,) + assert result[probe_pulse.id][0].magnitude.shape == ( + nshots * probe_seq.duration, + ) def test_dummy_execute_coupler_pulse(): @@ -57,7 +59,7 @@ def test_dummy_execute_coupler_pulse(): sequence[channel.name].append(pulse) options = ExecutionParameters(nshots=None) - result = platform.execute_pulse_sequence(sequence, options) + _ = platform.execute([sequence], options) def test_dummy_execute_pulse_sequence_couplers(): @@ -67,12 +69,12 @@ def test_dummy_execute_pulse_sequence_couplers(): cz = platform.pairs[(1, 2)].native_gates.CZ.create_sequence() sequence.extend(cz) - sequence[platform.qubits[0].measure.name].append(Delay(duration=40)) - sequence[platform.qubits[2].measure.name].append(Delay(duration=40)) + sequence[platform.qubits[0].probe.name].append(Delay(duration=40)) + sequence[platform.qubits[2].probe.name].append(Delay(duration=40)) sequence.extend(platform.qubits[0].native_gates.MZ.create_sequence()) sequence.extend(platform.qubits[2].native_gates.MZ.create_sequence()) options = ExecutionParameters(nshots=None) - result = platform.execute_pulse_sequence(sequence, options) + _ = platform.execute([sequence], options) @pytest.mark.parametrize("name", PLATFORM_NAMES) @@ -81,7 +83,7 @@ def test_dummy_execute_pulse_sequence_fast_reset(name): sequence = PulseSequence() sequence.extend(platform.qubits[0].native_gates.MZ.create_sequence()) options = ExecutionParameters(nshots=None, fast_reset=True) - result = platform.execute_pulse_sequence(sequence, options) + _ = platform.execute([sequence], options) @pytest.mark.parametrize("name", PLATFORM_NAMES) @@ -100,7 +102,7 @@ def test_dummy_execute_pulse_sequence_unrolling(name, acquisition, batch_size): for _ in range(nsequences): sequences.append(sequence) options = ExecutionParameters(nshots=nshots, acquisition_type=acquisition) - result = platform.execute_pulse_sequences(sequences, options) + result = platform.execute(sequences, options) assert len(next(iter(result.values()))) == nsequences for r in result[0]: if acquisition is AcquisitionType.INTEGRATION: @@ -113,24 +115,24 @@ def test_dummy_execute_pulse_sequence_unrolling(name, acquisition, batch_size): def test_dummy_single_sweep_raw(name): platform = create_platform(name) sequence = PulseSequence() - mz_seq = platform.qubits[0].native_gates.MZ.create_sequence() - pulse = next(iter(mz_seq.values()))[0] + probe_seq = platform.qubits[0].native_gates.MZ.create_sequence() + pulse = next(iter(probe_seq.values()))[0] parameter_range = np.random.randint(SWEPT_POINTS, size=SWEPT_POINTS) - sequence.extend(mz_seq) + sequence.extend(probe_seq) sweeper = Sweeper( Parameter.frequency, parameter_range, - channels=[platform.get_qubit(0).measure.name], + channels=[platform.get_qubit(0).probe.name], ) options = ExecutionParameters( nshots=10, averaging_mode=AveragingMode.CYCLIC, acquisition_type=AcquisitionType.RAW, ) - results = platform.sweep(sequence, options, sweeper) + results = platform.execute([sequence], options, sweeper) assert pulse.id in results - shape = results[pulse.id].magnitude.shape + shape = results[pulse.id][0].magnitude.shape assert shape == (pulse.duration * SWEPT_POINTS,) @@ -148,15 +150,15 @@ def test_dummy_single_sweep_coupler( ): platform = create_platform("dummy_couplers") sequence = PulseSequence() - mz_seq = platform.qubits[0].native_gates.MZ.create_sequence() - mz_pulse = next(iter(mz_seq.values()))[0] + probe_seq = platform.qubits[0].native_gates.MZ.create_sequence() + probe_pulse = next(iter(probe_seq.values()))[0] coupler_pulse = Pulse.flux( duration=40, amplitude=0.5, envelope=GaussianSquare(rel_sigma=0.2, width=0.75), type=PulseType.COUPLERFLUX, ) - sequence.extend(mz_seq) + sequence.extend(probe_seq) sequence[platform.get_coupler(0).flux.name].append(coupler_pulse) if parameter is Parameter.amplitude: parameter_range = np.random.rand(SWEPT_POINTS) @@ -175,20 +177,20 @@ def test_dummy_single_sweep_coupler( fast_reset=fast_reset, ) average = not options.averaging_mode is AveragingMode.SINGLESHOT - results = platform.sweep(sequence, options, sweeper) + results = platform.execute([sequence], options, sweeper) - assert mz_pulse.id in results + assert probe_pulse.id in results if average: results_shape = ( - results[mz_pulse.id].magnitude.shape + results[probe_pulse.id][0].magnitude.shape if acquisition is AcquisitionType.INTEGRATION - else results[mz_pulse.id].statistical_frequency.shape + else results[probe_pulse.id][0].statistical_frequency.shape ) else: results_shape = ( - results[mz_pulse.id].magnitude.shape + results[probe_pulse.id][0].magnitude.shape if acquisition is AcquisitionType.INTEGRATION - else results[mz_pulse.id].samples.shape + else results[probe_pulse.id][0].samples.shape ) assert results_shape == (SWEPT_POINTS,) if average else (nshots, SWEPT_POINTS) @@ -204,13 +206,13 @@ def test_dummy_single_sweep_coupler( def test_dummy_single_sweep(name, fast_reset, parameter, average, acquisition, nshots): platform = create_platform(name) sequence = PulseSequence() - mz_seq = platform.qubits[0].native_gates.MZ.create_sequence() - pulse = next(iter(mz_seq.values()))[0] + probe_seq = platform.qubits[0].native_gates.MZ.create_sequence() + pulse = next(iter(probe_seq.values()))[0] if parameter is Parameter.amplitude: parameter_range = np.random.rand(SWEPT_POINTS) else: parameter_range = np.random.randint(SWEPT_POINTS, size=SWEPT_POINTS) - sequence.extend(mz_seq) + sequence.extend(probe_seq) if parameter in ChannelParameter: channel = ( platform.qubits[0].drive.name @@ -227,20 +229,20 @@ def test_dummy_single_sweep(name, fast_reset, parameter, average, acquisition, n fast_reset=fast_reset, ) average = not options.averaging_mode is AveragingMode.SINGLESHOT - results = platform.sweep(sequence, options, sweeper) + results = platform.execute([sequence], options, sweeper) assert pulse.id in results if average: results_shape = ( - results[pulse.id].magnitude.shape + results[pulse.id][0].magnitude.shape if acquisition is AcquisitionType.INTEGRATION - else results[pulse.id].statistical_frequency.shape + else results[pulse.id][0].statistical_frequency.shape ) else: results_shape = ( - results[pulse.id].magnitude.shape + results[pulse.id][0].magnitude.shape if acquisition is AcquisitionType.INTEGRATION - else results[pulse.id].samples.shape + else results[pulse.id][0].samples.shape ) assert results_shape == (SWEPT_POINTS,) if average else (nshots, SWEPT_POINTS) @@ -259,11 +261,11 @@ def test_dummy_double_sweep(name, parameter1, parameter2, average, acquisition, pulse = Pulse( duration=40, amplitude=0.1, envelope=Gaussian(rel_sigma=5), type=PulseType.DRIVE ) - mz_seq = platform.qubits[0].native_gates.MZ.create_sequence() - mz_pulse = next(iter(mz_seq.values()))[0] + probe_seq = platform.qubits[0].native_gates.MZ.create_sequence() + probe_pulse = next(iter(probe_seq.values()))[0] sequence[platform.get_qubit(0).drive.name].append(pulse) - sequence[platform.qubits[0].measure.name].append(Delay(duration=pulse.duration)) - sequence.extend(mz_seq) + sequence[platform.qubits[0].probe.name].append(Delay(duration=pulse.duration)) + sequence.extend(probe_seq) parameter_range_1 = ( np.random.rand(SWEPT_POINTS) if parameter1 is Parameter.amplitude @@ -277,13 +279,13 @@ def test_dummy_double_sweep(name, parameter1, parameter2, average, acquisition, if parameter1 in ChannelParameter: channel = ( - platform.qubits[0].measure.name + platform.qubits[0].probe.name if parameter1 is Parameter.frequency else platform.qubits[0].flux.name ) sweeper1 = Sweeper(parameter1, parameter_range_1, channels=[channel]) else: - sweeper1 = Sweeper(parameter1, parameter_range_1, pulses=[mz_pulse]) + sweeper1 = Sweeper(parameter1, parameter_range_1, pulses=[probe_pulse]) if parameter2 in ChannelParameter: sweeper2 = Sweeper( parameter2, parameter_range_2, channels=[platform.qubits[0].flux.name] @@ -297,21 +299,21 @@ def test_dummy_double_sweep(name, parameter1, parameter2, average, acquisition, acquisition_type=acquisition, ) average = not options.averaging_mode is AveragingMode.SINGLESHOT - results = platform.sweep(sequence, options, sweeper1, sweeper2) + results = platform.execute([sequence], options, sweeper1, sweeper2) - assert mz_pulse.id in results + assert probe_pulse.id in results if average: results_shape = ( - results[mz_pulse.id].magnitude.shape + results[probe_pulse.id][0].magnitude.shape if acquisition is AcquisitionType.INTEGRATION - else results[mz_pulse.id].statistical_frequency.shape + else results[probe_pulse.id][0].statistical_frequency.shape ) else: results_shape = ( - results[mz_pulse.id].magnitude.shape + results[probe_pulse.id][0].magnitude.shape if acquisition is AcquisitionType.INTEGRATION - else results[mz_pulse.id].samples.shape + else results[probe_pulse.id][0].samples.shape ) assert ( @@ -331,11 +333,11 @@ def test_dummy_double_sweep(name, parameter1, parameter2, average, acquisition, def test_dummy_single_sweep_multiplex(name, parameter, average, acquisition, nshots): platform = create_platform(name) sequence = PulseSequence() - mz_pulses = {} + probe_pulses = {} for qubit in platform.qubits: - mz_seq = platform.qubits[qubit].native_gates.MZ.create_sequence() - mz_pulses[qubit] = next(iter(mz_seq.values()))[0] - sequence.extend(mz_seq) + probe_seq = platform.qubits[qubit].native_gates.MZ.create_sequence() + probe_pulses[qubit] = next(iter(probe_seq.values()))[0] + sequence.extend(probe_seq) parameter_range = ( np.random.rand(SWEPT_POINTS) if parameter is Parameter.amplitude @@ -346,13 +348,13 @@ def test_dummy_single_sweep_multiplex(name, parameter, average, acquisition, nsh sweeper1 = Sweeper( parameter, parameter_range, - channels=[qubit.measure.name for qubit in platform.qubits.values()], + channels=[qubit.probe.name for qubit in platform.qubits.values()], ) else: sweeper1 = Sweeper( parameter, parameter_range, - pulses=[mz_pulses[qubit] for qubit in platform.qubits], + pulses=[probe_pulses[qubit] for qubit in platform.qubits], ) options = ExecutionParameters( @@ -361,21 +363,21 @@ def test_dummy_single_sweep_multiplex(name, parameter, average, acquisition, nsh acquisition_type=acquisition, ) average = not options.averaging_mode is AveragingMode.SINGLESHOT - results = platform.sweep(sequence, options, sweeper1) + results = platform.execute([sequence], options, sweeper1) - for pulse in mz_pulses.values(): + for pulse in probe_pulses.values(): assert pulse.id in results if average: results_shape = ( - results[pulse.id].magnitude.shape + results[pulse.id][0].magnitude.shape if acquisition is AcquisitionType.INTEGRATION - else results[pulse.id].statistical_frequency.shape + else results[pulse.id][0].statistical_frequency.shape ) else: results_shape = ( - results[pulse.id].magnitude.shape + results[pulse.id][0].magnitude.shape if acquisition is AcquisitionType.INTEGRATION - else results[pulse.id].samples.shape + else results[pulse.id][0].samples.shape ) assert results_shape == (SWEPT_POINTS,) if average else (nshots, SWEPT_POINTS) diff --git a/tests/test_instruments_rfsoc.py b/tests/test_instruments_rfsoc.py index da943061d1..0612c40c28 100644 --- a/tests/test_instruments_rfsoc.py +++ b/tests/test_instruments_rfsoc.py @@ -688,7 +688,7 @@ def test_convert_av_sweep_results(dummy_qrc): averaging_mode=AveragingMode.CYCLIC, ) out_dict = instrument.convert_sweep_results( - sequence.ro_pulses, platform.qubits, avgi, avgq, execution_parameters + sequence.probe_pulses, platform.qubits, avgi, avgq, execution_parameters ) targ_dict = { serial1: AveragedIntegratedResults( @@ -741,7 +741,7 @@ def test_convert_nav_sweep_results(dummy_qrc): averaging_mode=AveragingMode.CYCLIC, ) out_dict = instrument.convert_sweep_results( - sequence.ro_pulses, platform.qubits, avgi, avgq, execution_parameters + sequence.probe_pulses, platform.qubits, avgi, avgq, execution_parameters ) targ_dict = { serial1: AveragedIntegratedResults( diff --git a/tests/test_instruments_zhinst.py b/tests/test_instruments_zhinst.py index 114d52f197..ea431ec9ce 100644 --- a/tests/test_instruments_zhinst.py +++ b/tests/test_instruments_zhinst.py @@ -236,7 +236,7 @@ def test_zhinst_configure_iq_line(dummy_qrc): zi_instrument = platform.instruments["EL_ZURO"] qubit = platform.qubits[0] zi_instrument.configure_iq_line(qubit.drive.name, platform.configs) - zi_instrument.configure_iq_line(qubit.measure.name, platform.configs) + zi_instrument.configure_iq_line(qubit.probe.name, platform.configs) assert qubit.drive.name in zi_instrument.signal_map assert ( @@ -244,7 +244,7 @@ def test_zhinst_configure_iq_line(dummy_qrc): in zi_instrument.calibration.calibration_items ) - assert qubit.measure.name in zi_instrument.signal_map + assert qubit.probe.name in zi_instrument.signal_map assert ( "/logical_signal_groups/q0/measure_line" in zi_instrument.calibration.calibration_items @@ -281,7 +281,7 @@ def test_experiment_flow(dummy_qrc): envelope=Rectangular(), ) ) - sequence[qubit.measure.name].append(Delay(duration=sequence.duration)) + sequence[qubit.probe.name].append(Delay(duration=sequence.duration)) sequence.extend(qubit.native_gates.MZ.create_sequence()) options = ExecutionParameters( @@ -293,7 +293,7 @@ def test_experiment_flow(dummy_qrc): zi_instrument.experiment_flow(qubits, couplers, sequence, options) assert qubits[0].flux.name in zi_instrument.experiment.signals - assert qubits[0].measure.name in zi_instrument.experiment.signals + assert qubits[0].probe.name in zi_instrument.experiment.signals assert qubits[0].acquisition.name in zi_instrument.experiment.signals @@ -315,7 +315,7 @@ def test_experiment_flow_coupler(dummy_qrc): envelope=Rectangular(), ) ) - sequence[qubit.measure.name].append(Delay(duration=sequence.duration)) + sequence[qubit.probe.name].append(Delay(duration=sequence.duration)) sequence.extend(qubit.native_gates.MZ.create_sequence()) for coupler in couplers.values(): @@ -337,7 +337,7 @@ def test_experiment_flow_coupler(dummy_qrc): zi_instrument.experiment_flow(qubits, couplers, sequence, options) assert qubits[0].flux.name in zi_instrument.experiment.signals - assert qubits[0].measure.name in zi_instrument.experiment.signals + assert qubits[0].probe.name in zi_instrument.experiment.signals assert qubits[0].acquisition.name in zi_instrument.experiment.signals @@ -359,7 +359,7 @@ def test_sweep_and_play_sim(dummy_qrc): envelope=Rectangular(), ) ) - sequence[qubit.measure.name].append(Delay(duration=sequence.duration)) + sequence[qubit.probe.name].append(Delay(duration=sequence.duration)) sequence.extend(qubit.native_gates.MZ.create_sequence()) options = ExecutionParameters( @@ -408,7 +408,7 @@ def test_experiment_sweep_single(dummy_qrc, parameter1): swept_points = 5 sequence = PulseSequence() sequence.extend(qubit.native_gates.RX.create_sequence(theta=np.pi, phi=0.0)) - sequence[qubit.measure.name].append(Delay(duration=sequence.duration)) + sequence[qubit.probe.name].append(Delay(duration=sequence.duration)) sequence.extend(qubit.native_gates.MZ.create_sequence()) parameter_range_1 = ( @@ -431,7 +431,7 @@ def test_experiment_sweep_single(dummy_qrc, parameter1): zi_instrument.experiment_flow({qubit_id: qubit}, couplers, sequence, options) assert qubit.drive.name in zi_instrument.experiment.signals - assert qubit.measure.name in zi_instrument.experiment.signals + assert qubit.probe.name in zi_instrument.experiment.signals assert qubit.acquisition.name in zi_instrument.experiment.signals @@ -447,7 +447,7 @@ def test_experiment_sweep_single_coupler(dummy_qrc, parameter1): sequence = PulseSequence() for qubit in qubits.values(): sequence.extend(qubit.native_gates.RX.create_sequence(theta=np.pi, phi=0.0)) - sequence[qubit.measure.name].append(Delay(duration=sequence.duration)) + sequence[qubit.probe.name].append(Delay(duration=sequence.duration)) sequence.extend(qubit.native_gates.MZ.create_sequence()) for coupler in couplers.values(): @@ -485,7 +485,7 @@ def test_experiment_sweep_single_coupler(dummy_qrc, parameter1): assert couplers[0].flux.name in zi_instrument.experiment.signals assert qubits[0].drive.name in zi_instrument.experiment.signals - assert qubits[0].measure.name in zi_instrument.experiment.signals + assert qubits[0].probe.name in zi_instrument.experiment.signals assert qubits[0].acquisition.name in zi_instrument.experiment.signals @@ -510,7 +510,7 @@ def test_experiment_sweep_2d_general(dummy_qrc, parameter1, parameter2): sequence = PulseSequence() for qubit in qubits.values(): sequence.extend(qubit.native_gates.RX.create_sequence(theta=np.pi, phi=0.0)) - sequence[qubit.measure.name].append(Delay(duration=sequence.duration)) + sequence[qubit.probe.name].append(Delay(duration=sequence.duration)) sequence.extend(qubit.native_gates.MZ.create_sequence()) parameter_range_1 = ( @@ -532,9 +532,7 @@ def test_experiment_sweep_2d_general(dummy_qrc, parameter1, parameter2): Sweeper( parameter1, parameter_range_1, - pulses=[ - sequence[qubit.measure.name][0] for qubit in qubits.values() - ], + pulses=[sequence[qubit.probe.name][0] for qubit in qubits.values()], ) ) if parameter2 in SweeperParameter: @@ -559,7 +557,7 @@ def test_experiment_sweep_2d_general(dummy_qrc, parameter1, parameter2): zi_instrument.experiment_flow(qubits, couplers, sequence, options) assert qubits[0].drive.name in zi_instrument.experiment.signals - assert qubits[0].measure.name in zi_instrument.experiment.signals + assert qubits[0].probe.name in zi_instrument.experiment.signals assert qubits[0].acquisition.name in zi_instrument.experiment.signals @@ -574,7 +572,7 @@ def test_experiment_sweep_2d_specific(dummy_qrc): sequence = PulseSequence() for qubit in qubits.values(): sequence.extend(qubit.native_gates.RX.create_sequence(theta=np.pi, phi=0.0)) - sequence[qubit.measure.name].append(Delay(duration=sequence.duration)) + sequence[qubit.probe.name].append(Delay(duration=sequence.duration)) sequence.extend(qubit.native_gates.MZ.create_sequence()) parameter1 = Parameter.relative_phase @@ -606,7 +604,7 @@ def test_experiment_sweep_2d_specific(dummy_qrc): zi_instrument.experiment_flow(qubits, couplers, sequence, options) assert qubits[0].drive.name in zi_instrument.experiment.signals - assert qubits[0].measure.name in zi_instrument.experiment.signals + assert qubits[0].probe.name in zi_instrument.experiment.signals assert qubits[0].acquisition.name in zi_instrument.experiment.signals @@ -648,13 +646,13 @@ def test_experiment_sweep_punchouts(dummy_qrc, parameter): ) sweepers = [] - ro_pulses = [sequence[qubit.measure.name][0] for qubit in qubits.values()] + ro_pulses = [sequence[qubit.probe.name][0] for qubit in qubits.values()] if parameter1 is Parameter.bias: sweepers.append( Sweeper( parameter1, parameter_range_1, - channels=[qubit.measure.name for qubit in qubits.values()], + channels=[qubit.probe.name for qubit in qubits.values()], ) ) else: @@ -669,7 +667,7 @@ def test_experiment_sweep_punchouts(dummy_qrc, parameter): zi_instrument.experiment_flow(qubits, couplers, sequence, options) - assert qubits[0].measure.name in zi_instrument.experiment.signals + assert qubits[0].probe.name in zi_instrument.experiment.signals assert qubits[0].acquisition.name in zi_instrument.experiment.signals @@ -685,8 +683,8 @@ def test_batching(dummy_qrc): platform.qubits[1].native_gates.RX.create_sequence(theta=np.pi, phi=0.0) ) measurement_start = sequence.duration - sequence[platform.qubits[0].measure.name].append(Delay(duration=measurement_start)) - sequence[platform.qubits[1].measure.name].append(Delay(duration=measurement_start)) + sequence[platform.qubits[0].probe.name].append(Delay(duration=measurement_start)) + sequence[platform.qubits[1].probe.name].append(Delay(duration=measurement_start)) sequence.extend(platform.qubits[0].native_gates.MZ.create_sequence()) sequence.extend(platform.qubits[1].native_gates.MZ.create_sequence()) @@ -711,7 +709,7 @@ def test_connections(instrument): @pytest.mark.qpu -def test_experiment_execute_pulse_sequence_qpu(connected_platform, instrument): +def test_experiment_execute_qpu(connected_platform, instrument): platform = connected_platform sequence = PulseSequence() qubits = {0: platform.qubits[0], "c0": platform.qubits["c0"]} @@ -728,7 +726,7 @@ def test_experiment_execute_pulse_sequence_qpu(connected_platform, instrument): if qubit.flux_coupler: continue - sequence[qubit.measure.name].append(Delay(duration=sequence.duration)) + sequence[qubit.probe.name].append(Delay(duration=sequence.duration)) sequence.extend(qubit.native_gates.MZ.create_sequence()) options = ExecutionParameters( @@ -737,12 +735,8 @@ def test_experiment_execute_pulse_sequence_qpu(connected_platform, instrument): averaging_mode=AveragingMode.CYCLIC, ) - results = platform.execute_pulse_sequence( - sequence, - options, - ) - - assert all(len(results[sequence.ro_pulses[q].id]) for q in qubits) > 0 + results = platform.execute([sequence], options) + assert all(len(results[sequence.probe_pulses[q].id]) > 1 for q in qubits) @pytest.mark.qpu @@ -754,7 +748,7 @@ def test_experiment_sweep_2d_specific_qpu(connected_platform, instrument): sequence = PulseSequence() for qubit in qubits.values(): sequence.extend(qubit.native_gates.RX.create_sequence(theta=np.pi, phi=0.0)) - sequence[qubit.measure.name].append(Delay(duration=sequence.duration)) + sequence[qubit.probe.name].append(Delay(duration=sequence.duration)) sequence.extend(qubit.native_gates.MZ.create_sequence()) parameter1 = Parameter.relative_phase @@ -790,4 +784,4 @@ def test_experiment_sweep_2d_specific_qpu(connected_platform, instrument): sweepers[1], ) - assert all(len(results[sequence.ro_pulses[q].id]) for q in qubits) > 0 + assert all(len(results[sequence.probe_pulses[q].id]) for q in qubits) > 0 diff --git a/tests/test_platform.py b/tests/test_platform.py index a410f585db..d35dddf7a1 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -40,12 +40,12 @@ def test_unroll_sequences(platform): qubit = next(iter(platform.qubits.values())) sequence = PulseSequence() sequence.extend(qubit.native_gates.RX.create_sequence()) - sequence[qubit.measure.name].append(Delay(duration=sequence.duration)) + sequence[qubit.probe.name].append(Delay(duration=sequence.duration)) sequence.extend(qubit.native_gates.MZ.create_sequence()) total_sequence, readouts = unroll_sequences(10 * [sequence], relaxation_time=10000) - assert len(total_sequence.ro_pulses) == 10 + assert len(total_sequence.probe_pulses) == 10 assert len(readouts) == 1 - assert all(len(readouts[pulse.id]) == 10 for pulse in sequence.ro_pulses) + assert all(len(readouts[pulse.id]) == 10 for pulse in sequence.probe_pulses) def test_create_platform(platform): @@ -285,7 +285,7 @@ def test_platform_execute_one_drive_one_readout(qpu_platform): qubit_id, qubit = next(iter(platform.qubits.items())) sequence = PulseSequence() sequence.extend(platform.create_RX_pulse(qubit_id)) - sequence[qubit.measure.name].append(Delay(duration=200)) + sequence[qubit.probe.name].append(Delay(duration=200)) sequence.extend(platform.create_MZ_pulse(qubit_id)) platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=nshots)) @@ -301,7 +301,7 @@ def test_platform_execute_multiple_drive_pulses_one_readout(qpu_platform): sequence.extend(platform.create_RX_pulse(qubit_id)) sequence[qubit.drive.name].append(Delay(duration=4)) sequence.extend(platform.create_RX_pulse(qubit_id)) - sequence[qubit.measure.name].append(Delay(duration=808)) + sequence[qubit.probe.name].append(Delay(duration=808)) sequence.extend(platform.create_MZ_pulse(qubit_id)) platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=nshots)) @@ -318,7 +318,7 @@ def test_platform_execute_multiple_drive_pulses_one_readout_no_spacing( sequence.extend(platform.create_RX_pulse(qubit_id)) sequence.extend(platform.create_RX_pulse(qubit_id)) sequence.extend(platform.create_RX_pulse(qubit_id)) - sequence[qubit.measure.name].append(Delay(duration=800)) + sequence[qubit.probe.name].append(Delay(duration=800)) sequence.extend(platform.create_MZ_pulse(qubit_id)) platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=nshots)) @@ -336,7 +336,7 @@ def test_platform_execute_multiple_overlaping_drive_pulses_one_readout( ) sequence[qubit.drive.name].append(pulse) sequence[qubit.drive12.name].append(pulse.copy()) - sequence[qubit.measure.name].append(Delay(duration=800)) + sequence[qubit.probe.name].append(Delay(duration=800)) sequence.extend(platform.create_MZ_pulse(qubit_id)) platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=nshots)) @@ -352,11 +352,11 @@ def test_platform_execute_multiple_readout_pulses(qpu_platform): qd_seq2 = platform.create_RX_pulse(qubit_id) ro_seq2 = platform.create_MZ_pulse(qubit_id) sequence.extend(qd_seq1) - sequence[qubit.measure.name].append(Delay(duration=qd_seq1.duration)) + sequence[qubit.probe.name].append(Delay(duration=qd_seq1.duration)) sequence.extend(ro_seq1) sequence[qubit.drive.name].append(Delay(duration=ro_seq1.duration)) sequence.extend(qd_seq2) - sequence[qubit.measure.name].append(Delay(duration=qd_seq2.duration)) + sequence[qubit.probe.name].append(Delay(duration=qd_seq2.duration)) sequence.extend(ro_seq2) platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=nshots)) @@ -372,7 +372,7 @@ def test_excited_state_probabilities_pulses(qpu_platform): sequence = PulseSequence() for qubit_id, qubit in platform.qubits.items(): sequence.extend(platform.create_RX_pulse(qubit_id)) - sequence[qubit.measure.name].append(Delay(duration=sequence.duration)) + sequence[qubit.probe.name].append(Delay(duration=sequence.duration)) sequence.extend(platform.create_MZ_pulse(qubit_id)) result = platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=5000)) @@ -400,7 +400,7 @@ def test_ground_state_probabilities_pulses(qpu_platform, start_zero): sequence = PulseSequence() for qubit_id, qubit in platform.qubits.items(): if not start_zero: - sequence[qubit.measure.name].append( + sequence[qubit.probe.name].append( Delay( duration=platform.create_RX_pulse(qubit_id).duration, channel=platform.qubits[qubit].readout.name, diff --git a/tests/test_result_shapes.py b/tests/test_result_shapes.py index d5cd2de223..38497178cd 100644 --- a/tests/test_result_shapes.py +++ b/tests/test_result_shapes.py @@ -2,6 +2,7 @@ import pytest from qibolab import AcquisitionType, AveragingMode, ExecutionParameters +from qibolab.platform.platform import Platform from qibolab.pulses import PulseSequence from qibolab.result import ( AveragedIntegratedResults, @@ -16,15 +17,15 @@ NSWEEP2 = 8 -def execute(platform, acquisition_type, averaging_mode, sweep=False): - qubit = next(iter(platform.qubits)) +def execute(platform: Platform, acquisition_type, averaging_mode, sweep=False): + qubit = next(iter(platform.qubits.values())) - qd_seq = platform.create_RX_pulse(qubit) - mz_seq = platform.create_MZ_pulse(qubit) - mz_pulse = next(iter(mz_seq.values()))[0] + qd_seq = qubit.native_gates.RX.create_sequence() + probe_seq = qubit.native_gates.MZ.create_sequence() + probe_pulse = next(iter(probe_seq.values()))[0] sequence = PulseSequence() sequence.extend(qd_seq) - sequence.extend(mz_seq) + sequence.extend(probe_seq) options = ExecutionParameters( nshots=NSHOTS, acquisition_type=acquisition_type, averaging_mode=averaging_mode @@ -32,15 +33,12 @@ def execute(platform, acquisition_type, averaging_mode, sweep=False): if sweep: amp_values = np.arange(0.01, 0.06, 0.01) freq_values = np.arange(-4e6, 4e6, 1e6) - sweeper1 = Sweeper( - Parameter.bias, amp_values, channels=[platform.qubits[qubit].flux.name] - ) - # sweeper1 = Sweeper(Parameter.amplitude, amp_values, pulses=[qd_pulse]) - sweeper2 = Sweeper(Parameter.frequency, freq_values, pulses=[mz_pulse]) - results = platform.sweep(sequence, options, sweeper1, sweeper2) + sweeper1 = Sweeper(Parameter.bias, amp_values, channels=[qubit.flux.name]) + sweeper2 = Sweeper(Parameter.amplitude, freq_values, pulses=[probe_pulse]) + results = platform.execute([sequence], options, sweeper1, sweeper2) else: - results = platform.execute_pulse_sequence(sequence, options) - return results[qubit] + results = platform.execute([sequence], options) + return results[probe_pulse.id][0] @pytest.mark.qpu From ca64bd088fab224b0eedb30323bce1703c3cb8aa Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Wed, 31 Jul 2024 11:27:18 +0400 Subject: [PATCH 0354/1006] dump platform with updates --- src/qibolab/execution_parameters.py | 21 ++++++++---- src/qibolab/platform/platform.py | 51 +++++++++++++---------------- src/qibolab/serialize.py | 23 ++++++++++--- tests/test_platform.py | 49 +++++++++++++++++++++++++++ 4 files changed, 104 insertions(+), 40 deletions(-) diff --git a/src/qibolab/execution_parameters.py b/src/qibolab/execution_parameters.py index 543456fe17..7ac569e085 100644 --- a/src/qibolab/execution_parameters.py +++ b/src/qibolab/execution_parameters.py @@ -1,7 +1,6 @@ from enum import Enum, auto -from typing import Optional +from typing import Any, Optional -from qibolab.components import Config from qibolab.result import ( AveragedIntegratedResults, AveragedRawWaveformResults, @@ -52,6 +51,14 @@ class AveragingMode(Enum): } +ConfigUpdate = dict[str, dict[str, Any]] +"""Update for component configs. + +Maps component name to corresponding update, which in turn is a map from +config property name that needs an update to its new value. +""" + + class ExecutionParameters(Model): """Data structure to deal with execution parameters.""" @@ -72,12 +79,12 @@ class ExecutionParameters(Model): """Data acquisition type.""" averaging_mode: AveragingMode = AveragingMode.SINGLESHOT """Data averaging mode.""" - configs: list[dict[str, Config]] = [] - """Configuration for various components (maps component name to respective - config). + updates: list[ConfigUpdate] = [] + """List of updates for component configs. - This takes precedence over platform defaults, and can be only a - subset of components (i.e. only the ones that need to be updated). + Later entries in the list take precedence over earlier ones (if they + happen to update the same thing). These updates will be applied on + top of platform defaults. """ @property diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 476846fef0..799377e998 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -1,5 +1,6 @@ """A platform for executing quantum algorithms.""" +import dataclasses from collections import defaultdict from dataclasses import asdict, dataclass, field from math import prod @@ -11,7 +12,7 @@ from qibolab.components import Config from qibolab.couplers import Coupler -from qibolab.execution_parameters import ExecutionParameters +from qibolab.execution_parameters import ConfigUpdate, ExecutionParameters from qibolab.instruments.abstract import Controller, Instrument, InstrumentId from qibolab.pulses import Delay, PulseSequence from qibolab.qubits import Qubit, QubitId, QubitPair, QubitPairId @@ -86,6 +87,23 @@ def estimate_duration( ) +def update_configs(configs: dict[str, Config], updates: list[ConfigUpdate]): + """Apply updates to configs in place. + + Args: + configs: configs to update. Maps component name to respective config. + updates: list of config updates. Later entries in the list take precedence over earlier entries + (if they happen to update the same thing). + """ + for update in updates: + for name, changes in update.items(): + if name not in configs: + raise ValueError( + f"Cannot update configuration for unknown component {name}" + ) + configs[name] = dataclasses.replace(configs[name], **changes) + + @dataclass class Settings: """Default execution settings read from the runcard.""" @@ -204,30 +222,6 @@ def disconnect(self): instrument.disconnect() self.is_connected = False - def _apply_config_updates( - self, updates: list[dict[str, Config]] - ) -> dict[str, Config]: - """Apply given list of config updates to the default configuration and - return the updated config dict. - - Args: - updates: list of updates, where each entry is a dict mapping component name to new config. Later entries - in the list override earlier entries (if they happen to update the same thing). - """ - components = self.configs.copy() - for update in updates: - for name, cfg in update.items(): - if name not in components: - raise ValueError( - f"Cannot update configuration for unknown component {name}" - ) - if type(cfg) is not type(components[name]): - raise ValueError( - f"Configuration of component {name} with type {type(components[name])} cannot be updated with configuration of type {type(cfg)}" - ) - components[name] = cfg - return components - @property def _controller(self): """Identify controller instrument. @@ -252,7 +246,7 @@ def _execute(self, sequences, options, integration_setup, sweepers): for instrument in self.instruments.values(): if isinstance(instrument, Controller): new_result = instrument.play( - options.configs, sequences, options, integration_setup, sweepers + options.updates, sequences, options, integration_setup, sweepers ) if isinstance(new_result, dict): result.update(new_result) @@ -287,7 +281,7 @@ def execute( sequence = qubit.native_gates.MZ.create_sequence() parameter = Parameter.frequency parameter_range = np.random.randint(10, size=10) - sweeper = [Sweeper(parameter, parameter_range, channels=[qubit.measure.name])] + sweeper = [Sweeper(parameter, parameter_range, channels=[qubit.probe.name])] platform.execute([sequence], ExecutionParameters(), [sweeper]) """ if sweepers is None: @@ -298,7 +292,8 @@ def execute( time = estimate_duration(sequences, options, sweepers) log.info(f"Minimal execution time: {time}") - configs = self._apply_config_updates(options.configs) + configs = self.configs.copy() + update_configs(configs, options.updates) # for components that represent aux external instruments (e.g. lo) to the main control instrument # set the config directly diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index cf4852a247..0c10f7135d 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -8,11 +8,12 @@ import json from dataclasses import asdict, fields from pathlib import Path -from typing import Tuple, Union +from typing import Optional, Tuple, Union from pydantic import ConfigDict, TypeAdapter from qibolab.couplers import Coupler +from qibolab.execution_parameters import ConfigUpdate from qibolab.kernels import Kernels from qibolab.native import ( FixedSequenceFactory, @@ -27,6 +28,7 @@ QubitMap, QubitPairMap, Settings, + update_configs, ) from qibolab.pulses import Pulse, PulseSequence from qibolab.pulses.pulse import PulseLike @@ -307,7 +309,9 @@ def dump_component_configs(component_configs) -> dict: return {name: asdict(cfg) for name, cfg in component_configs.items()} -def dump_runcard(platform: Platform, path: Path): +def dump_runcard( + platform: Platform, path: Path, updates: Optional[list[ConfigUpdate]] = None +): """Serializes the platform and saves it as a json runcard file. The file saved follows the format explained in :ref:`Using runcards `. @@ -315,15 +319,20 @@ def dump_runcard(platform: Platform, path: Path): Args: platform (qibolab.platform.Platform): The platform to be serialized. path (pathlib.Path): Path that the json file will be saved. + updates: List if updates for platform configs. + Later entries in the list take precedence over earlier ones (if they happen to update the same thing). """ + configs = platform.configs.copy() + update_configs(configs, updates or []) + settings = { "nqubits": platform.nqubits, "settings": asdict(platform.settings), "qubits": list(platform.qubits), "topology": [list(pair) for pair in platform.ordered_pairs], "instruments": dump_instruments(platform.instruments), - "components": dump_component_configs(platform.configs), + "components": dump_component_configs(configs), } if platform.couplers: @@ -363,13 +372,17 @@ def dump_kernels(platform: Platform, path: Path): kernels.dump(path) -def dump_platform(platform: Platform, path: Path): +def dump_platform( + platform: Platform, path: Path, updates: Optional[list[ConfigUpdate]] = None +): """Platform serialization as runcard (json) and kernels (npz). Args: platform (qibolab.platform.Platform): The platform to be serialized. path (pathlib.Path): Path where json and npz will be dumped. + updates: List if updates for platform configs. + Later entries in the list take precedence over earlier ones (if they happen to update the same thing). """ dump_kernels(platform=platform, path=path) - dump_runcard(platform=platform, path=path) + dump_runcard(platform=platform, path=path, updates=updates) diff --git a/tests/test_platform.py b/tests/test_platform.py index d35dddf7a1..2b12df79ee 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -14,6 +14,7 @@ from qibolab import create_platform from qibolab.backends import QibolabBackend +from qibolab.components import IqConfig, OscillatorConfig from qibolab.dummy import create_dummy from qibolab.dummy.platform import FOLDER from qibolab.execution_parameters import ExecutionParameters @@ -21,6 +22,7 @@ from qibolab.kernels import Kernels from qibolab.platform import Platform, unroll_sequences from qibolab.platform.load import PLATFORMS +from qibolab.platform.platform import update_configs from qibolab.pulses import Delay, Gaussian, Pulse, PulseSequence, PulseType, Rectangular from qibolab.serialize import ( PLATFORM, @@ -97,6 +99,38 @@ def test_platform_sampling_rate(platform): assert platform.sampling_rate >= 1 +def test_update_configs(platform): + drive_name = "q0/drive" + pump_name = "twpa_pump" + configs = { + drive_name: IqConfig(4.1e9), + pump_name: OscillatorConfig(3e9, -5), + } + + updated = update_configs(configs, [{drive_name: {"frequency": 4.2e9}}]) + assert updated is None + assert configs[drive_name].frequency == 4.2e9 + + update_configs( + configs, [{drive_name: {"frequency": 4.3e9}, pump_name: {"power": -10}}] + ) + assert configs[drive_name].frequency == 4.3e9 + assert configs[pump_name].frequency == 3e9 + assert configs[pump_name].power == -10 + + update_configs( + configs, + [{drive_name: {"frequency": 4.4e9}}, {drive_name: {"frequency": 4.5e9}}], + ) + assert configs[drive_name].frequency == 4.5e9 + + with pytest.raises(ValueError, match="unknown component"): + update_configs(configs, [{"non existent": {"property": 1.0}}]) + + with pytest.raises(TypeError, match="prprty"): + update_configs(configs, [{pump_name: {"prprty": 0.7}}]) + + def test_dump_runcard(platform, tmp_path): dump_runcard(platform, tmp_path) final_runcard = load_runcard(tmp_path) @@ -105,6 +139,7 @@ def test_dump_runcard(platform, tmp_path): else: target_path = pathlib.Path(__file__).parent / "dummy_qrc" / f"{platform.name}" target_runcard = load_runcard(target_path) + # for the characterization section the dumped runcard may contain # some default ``Qubit`` parameters target_char = target_runcard.pop("characterization")["single_qubit"] @@ -120,6 +155,20 @@ def test_dump_runcard(platform, tmp_path): assert final_instruments == target_instruments +def test_dump_runcard_with_updates(platform, tmp_path): + qubit = next(iter(platform.qubits.values())) + frequency = platform.config(qubit.drive.name).frequency + 1.5e9 + smearing = platform.config(qubit.acquisition.name).smearing + 10 + update = { + qubit.drive.name: {"frequency": frequency}, + qubit.acquisition.name: {"smearing": smearing}, + } + dump_runcard(platform, tmp_path, [update]) + final_runcard = load_runcard(tmp_path) + assert final_runcard["components"][qubit.drive.name]["frequency"] == frequency + assert final_runcard["components"][qubit.acquisition.name]["smearing"] == smearing + + @pytest.mark.parametrize("has_kernels", [False, True]) def test_kernels(tmp_path, has_kernels): """Test dumping and loading of `Kernels`.""" From 7794ce703003258f5e9bc7e61ff20f59c506a96f Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Wed, 31 Jul 2024 11:54:53 +0400 Subject: [PATCH 0355/1006] update documentation --- doc/source/getting-started/experiment.rst | 2 +- doc/source/tutorials/calibration.rst | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/source/getting-started/experiment.rst b/doc/source/getting-started/experiment.rst index 833f4c478b..180bdf4def 100644 --- a/doc/source/getting-started/experiment.rst +++ b/doc/source/getting-started/experiment.rst @@ -273,7 +273,7 @@ We leave to the dedicated tutorial a full explanation of the experiment, but her ) results = platform.execute([sequence], options, sweeper) - probe_pulse = next(iter(sequence.ro_pulses)) + probe_pulse = next(iter(sequence.probe_pulses)) # plot the results amplitudes = results[probe_pulse.id][0].magnitude diff --git a/doc/source/tutorials/calibration.rst b/doc/source/tutorials/calibration.rst index 52aa106dc1..db80c01d96 100644 --- a/doc/source/tutorials/calibration.rst +++ b/doc/source/tutorials/calibration.rst @@ -71,7 +71,7 @@ In few seconds, the experiment will be finished and we can proceed to plot it. import matplotlib.pyplot as plt - probe_pulse = next(iter(sequence.ro_pulses)) + probe_pulse = next(iter(sequence.probe_pulses)) amplitudes = results[probe_pulse.id][0].magnitude frequencies = np.arange(-2e8, +2e8, 1e6) + platform.config(qubit.probe.name).frequency @@ -155,7 +155,7 @@ We can now proceed to launch on hardware: results = platform.execute([sequence], options, sweeper) - probe_pulse = next(iter(sequence.ro_pulses)) + probe_pulse = next(iter(sequence.probe_pulses)) amplitudes = results[probe_pulse.id][0].magnitude frequencies = np.arange(-2e8, +2e8, 1e6) + platform.config(qubit.drive.name).frequency @@ -239,8 +239,8 @@ and its impact on qubit states in the IQ plane. results_one = platform.execute([one_sequence], options) results_zero = platform.execute([zero_sequence], options) - probe_pulse1 = next(iter(one_sequence.ro_pulses)) - probe_pulse2 = next(iter(zero_sequence.ro_pulses)) + probe_pulse1 = next(iter(one_sequence.probe_pulses)) + probe_pulse2 = next(iter(zero_sequence.probe_pulses)) plt.title("Single shot classification") plt.xlabel("I [a.u.]") From 7c7e4bcbb1851b3f66d707de531a17e30726f8da Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 5 Aug 2024 15:15:23 +0200 Subject: [PATCH 0356/1006] chore: Fix rebase leftover --- doc/source/getting-started/experiment.rst | 2 +- doc/source/main-documentation/qibolab.rst | 14 +- doc/source/tutorials/calibration.rst | 4 +- src/qibolab/instruments/dummy.py | 5 +- src/qibolab/platform/platform.py | 36 ++-- src/qibolab/qubits.py | 5 - tests/test_dummy.py | 10 +- tests/test_native.py | 213 ++++++++++++++++++++++ tests/test_result_shapes.py | 2 +- 9 files changed, 252 insertions(+), 39 deletions(-) create mode 100644 tests/test_native.py diff --git a/doc/source/getting-started/experiment.rst b/doc/source/getting-started/experiment.rst index 180bdf4def..cd4c4d244a 100644 --- a/doc/source/getting-started/experiment.rst +++ b/doc/source/getting-started/experiment.rst @@ -272,7 +272,7 @@ We leave to the dedicated tutorial a full explanation of the experiment, but her acquisition_type=AcquisitionType.INTEGRATION, ) - results = platform.execute([sequence], options, sweeper) + results = platform.execute([sequence], options, [[sweeper]]) probe_pulse = next(iter(sequence.probe_pulses)) # plot the results diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index c2477424a6..48df331656 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -419,9 +419,15 @@ A tipical resonator spectroscopy experiment could be defined with: from qibolab.sweeper import Parameter, Sweeper, SweeperType sequence = PulseSequence() - sequence.extend(platform.qubits[0].native_gates.MZ.create_sequence()) # readout pulse for qubit 0 at 4 GHz - sequence.extend(platform.qubits[1].native_gates.MZ.create_sequence()) # readout pulse for qubit 1 at 5 GHz - sequence.extend(platform.qubits[2].native_gates.MZ.create_sequence()) # readout pulse for qubit 2 at 6 GHz + sequence.extend( + platform.qubits[0].native_gates.MZ.create_sequence() + ) # readout pulse for qubit 0 at 4 GHz + sequence.extend( + platform.qubits[1].native_gates.MZ.create_sequence() + ) # readout pulse for qubit 1 at 5 GHz + sequence.extend( + platform.qubits[2].native_gates.MZ.create_sequence() + ) # readout pulse for qubit 2 at 6 GHz sweeper = Sweeper( parameter=Parameter.frequency, @@ -552,7 +558,7 @@ Let's now delve into a typical use case for result objects within the qibolab fr .. testcode:: python - qubit = platform.qubits[0] + qubit = platform.qubits[0] sequence = PulseSequence() sequence.extend(qubit.native_gates.RX.create_sequence()) diff --git a/doc/source/tutorials/calibration.rst b/doc/source/tutorials/calibration.rst index db80c01d96..6d699ed788 100644 --- a/doc/source/tutorials/calibration.rst +++ b/doc/source/tutorials/calibration.rst @@ -63,7 +63,7 @@ We then define the execution parameters and launch the experiment. acquisition_type=AcquisitionType.INTEGRATION, ) - results = platform.execute([sequence], options, sweeper) + results = platform.execute([sequence], options, [[sweeper]]) In few seconds, the experiment will be finished and we can proceed to plot it. @@ -153,7 +153,7 @@ We can now proceed to launch on hardware: acquisition_type=AcquisitionType.INTEGRATION, ) - results = platform.execute([sequence], options, sweeper) + results = platform.execute([sequence], options, [[sweeper]]) probe_pulse = next(iter(sequence.probe_pulses)) amplitudes = results[probe_pulse.id][0].magnitude diff --git a/src/qibolab/instruments/dummy.py b/src/qibolab/instruments/dummy.py index e9c4f85b27..d23b2a1950 100644 --- a/src/qibolab/instruments/dummy.py +++ b/src/qibolab/instruments/dummy.py @@ -96,11 +96,9 @@ def play( configs: dict[str, Config], sequences: list[PulseSequence], options: ExecutionParameters, - sweepers: list[ParallelSweepers], integration_setup: dict[str, tuple[np.ndarray, float]], + sweepers: list[ParallelSweepers], ): - results = {} - if options.averaging_mode is not AveragingMode.CYCLIC: shape = (options.nshots,) + tuple( min(len(sweep.values) for sweep in parsweeps) for parsweeps in sweepers @@ -110,6 +108,7 @@ def play( min(len(sweep.values) for sweep in parsweeps) for parsweeps in sweepers ) + results = {} for seq in sequences: for ro_pulse in seq.probe_pulses: values = self.get_values(options, ro_pulse, shape) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 799377e998..7742f04759 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -70,23 +70,6 @@ def unroll_sequences( return total_sequence, readout_map -def estimate_duration( - sequences: list[PulseSequence], - options: ExecutionParameters, - sweepers: list[ParallelSweepers], -) -> float: - """Estimate experiment duration.""" - duration = sum(seq.duration for seq in sequences) - relaxation = default(options.relaxation_time, 0) - nshots = default(options.nshots, 0) - return ( - (duration + len(sequences) * relaxation) - * nshots - * NS_TO_SEC - * prod(len(s[0].values) for s in sweepers) - ) - - def update_configs(configs: dict[str, Config], updates: list[ConfigUpdate]): """Apply updates to configs in place. @@ -104,6 +87,23 @@ def update_configs(configs: dict[str, Config], updates: list[ConfigUpdate]): configs[name] = dataclasses.replace(configs[name], **changes) +def estimate_duration( + sequences: list[PulseSequence], + options: ExecutionParameters, + sweepers: list[ParallelSweepers], +) -> float: + """Estimate experiment duration.""" + duration = sum(seq.duration for seq in sequences) + relaxation = default(options.relaxation_time, 0) + nshots = default(options.nshots, 0) + return ( + (duration + len(sequences) * relaxation) + * nshots + * NS_TO_SEC + * prod(len(s[0].values) for s in sweepers) + ) + + @dataclass class Settings: """Default execution settings read from the runcard.""" @@ -240,7 +240,7 @@ def _controller(self): return controllers[0] def _execute(self, sequences, options, integration_setup, sweepers): - """Execute sequence on the controllers.""" + """Execute sequences on the controllers.""" result = {} for instrument in self.instruments.values(): diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index ebba47f48c..6148eecadf 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -82,11 +82,6 @@ class Qubit: threshold: float = 0.0 iq_angle: float = 0.0 kernel: Optional[np.ndarray] = field(default=None, repr=False) - # required for mixers (not sure if it should be here) - mixer_drive_g: float = 0.0 - mixer_drive_phi: float = 0.0 - mixer_readout_g: float = 0.0 - mixer_readout_phi: float = 0.0 probe: Optional[IqChannel] = None acquisition: Optional[AcquireChannel] = None diff --git a/tests/test_dummy.py b/tests/test_dummy.py index 3d1d650917..f55dcda390 100644 --- a/tests/test_dummy.py +++ b/tests/test_dummy.py @@ -130,7 +130,7 @@ def test_dummy_single_sweep_raw(name): averaging_mode=AveragingMode.CYCLIC, acquisition_type=AcquisitionType.RAW, ) - results = platform.execute([sequence], options, sweeper) + results = platform.execute([sequence], options, [[sweeper]]) assert pulse.id in results shape = results[pulse.id][0].magnitude.shape assert shape == (pulse.duration * SWEPT_POINTS,) @@ -177,7 +177,7 @@ def test_dummy_single_sweep_coupler( fast_reset=fast_reset, ) average = not options.averaging_mode is AveragingMode.SINGLESHOT - results = platform.execute([sequence], options, sweeper) + results = platform.execute([sequence], options, [[sweeper]]) assert probe_pulse.id in results if average: @@ -229,7 +229,7 @@ def test_dummy_single_sweep(name, fast_reset, parameter, average, acquisition, n fast_reset=fast_reset, ) average = not options.averaging_mode is AveragingMode.SINGLESHOT - results = platform.execute([sequence], options, sweeper) + results = platform.execute([sequence], options, [[sweeper]]) assert pulse.id in results if average: @@ -299,7 +299,7 @@ def test_dummy_double_sweep(name, parameter1, parameter2, average, acquisition, acquisition_type=acquisition, ) average = not options.averaging_mode is AveragingMode.SINGLESHOT - results = platform.execute([sequence], options, sweeper1, sweeper2) + results = platform.execute([sequence], options, [[sweeper1], [sweeper2]]) assert probe_pulse.id in results @@ -363,7 +363,7 @@ def test_dummy_single_sweep_multiplex(name, parameter, average, acquisition, nsh acquisition_type=acquisition, ) average = not options.averaging_mode is AveragingMode.SINGLESHOT - results = platform.execute([sequence], options, sweeper1) + results = platform.execute([sequence], options, [[sweeper1]]) for pulse in probe_pulses.values(): assert pulse.id in results diff --git a/tests/test_native.py b/tests/test_native.py new file mode 100644 index 0000000000..c275773df7 --- /dev/null +++ b/tests/test_native.py @@ -0,0 +1,213 @@ +import contextlib + +import numpy as np +import pytest + +from qibolab.native import FixedSequenceFactory, RxyFactory, TwoQubitNatives +from qibolab.pulses import ( + Drag, + Exponential, + Gaussian, + GaussianSquare, + Pulse, + PulseSequence, + Rectangular, +) + + +def test_fixed_sequence_factory(): + seq = PulseSequence() + seq["channel_1"].append( + Pulse( + duration=40, + amplitude=0.3, + envelope=Gaussian(rel_sigma=3.0), + ) + ) + seq["channel_17"].append( + Pulse( + duration=125, + amplitude=1.0, + envelope=Rectangular(), + ) + ) + factory = FixedSequenceFactory(seq) + + fseq1 = factory.create_sequence() + fseq2 = factory.create_sequence() + assert fseq1 == seq + assert fseq2 == seq + + fseq1["new channel"].append( + Pulse( + duration=30, + amplitude=0.04, + envelope=Drag(rel_sigma=4.0, beta=0.02), + ) + ) + assert "new channel" not in seq + assert "new channel" not in fseq2 + + +@pytest.mark.parametrize( + "args,amplitude,phase", + [ + ({}, 1.0, 0.0), + ({"theta": np.pi / 2}, 0.5, 0.0), + ({"phi": np.pi / 4}, 1.0, np.pi / 4), + ({"theta": np.pi / 4, "phi": np.pi / 3}, 1.0 / 4, np.pi / 3), + ({"theta": 3 * np.pi / 2}, -0.5, 0.0), + ({"theta": 7 * np.pi}, 1.0, 0.0), + ({"theta": 7.5 * np.pi}, -0.5, 0.0), + ({"phi": 7.5 * np.pi}, 1.0, 1.5 * np.pi), + ], +) +def test_rxy_rotation_factory(args, amplitude, phase): + seq = PulseSequence( + { + "channel_1": [ + Pulse( + duration=40, + amplitude=1.0, + envelope=Gaussian(rel_sigma=3.0), + ) + ] + } + ) + factory = RxyFactory(seq) + + fseq1 = factory.create_sequence(**args) + fseq2 = factory.create_sequence(**args) + assert fseq1 == fseq2 + fseq2["new channel"].append( + Pulse( + duration=56, + amplitude=0.43, + envelope=Rectangular(), + ) + ) + assert "new channel" not in fseq1 + + pulse = fseq1["channel_1"][0] + assert pulse.amplitude == pytest.approx(amplitude) + assert pulse.relative_phase == pytest.approx(phase) + + +def test_rxy_factory_multiple_channels(): + seq = PulseSequence( + { + "channel_1": [ + Pulse( + duration=40, + amplitude=0.7, + envelope=Gaussian(rel_sigma=5.0), + ) + ], + "channel_2": [ + Pulse( + duration=30, + amplitude=1.0, + envelope=Gaussian(rel_sigma=3.0), + ) + ], + } + ) + + with pytest.raises(ValueError, match="Incompatible number of channels"): + _ = RxyFactory(seq) + + +def test_rxy_factory_multiple_pulses(): + seq = PulseSequence( + { + "channel_1": [ + Pulse( + duration=40, + amplitude=0.08, + envelope=Gaussian(rel_sigma=4.0), + ), + Pulse( + duration=80, + amplitude=0.76, + envelope=Gaussian(rel_sigma=4.0), + ), + ] + } + ) + + with pytest.raises(ValueError, match="Incompatible number of pulses"): + _ = RxyFactory(seq) + + +@pytest.mark.parametrize( + "envelope", + [ + Gaussian(rel_sigma=3.0), + GaussianSquare(rel_sigma=3.0, width=80), + Drag(rel_sigma=5.0, beta=-0.037), + Rectangular(), + Exponential(tau=0.7, upsilon=0.8), + ], +) +def test_rxy_rotation_factory_envelopes(envelope): + seq = PulseSequence( + { + "channel_1": [ + Pulse( + duration=100, + amplitude=1.0, + envelope=envelope, + ) + ] + } + ) + + if isinstance(envelope, (Gaussian, Drag)): + context = contextlib.nullcontext() + else: + context = pytest.raises(ValueError, match="Incompatible pulse envelope") + + with context: + _ = RxyFactory(seq) + + +def test_two_qubit_natives_symmetric(): + natives = TwoQubitNatives( + CZ=FixedSequenceFactory(PulseSequence()), + CNOT=FixedSequenceFactory(PulseSequence()), + iSWAP=FixedSequenceFactory(PulseSequence()), + ) + assert natives.symmetric is False + + natives = TwoQubitNatives( + CZ=FixedSequenceFactory(PulseSequence()), + iSWAP=FixedSequenceFactory(PulseSequence()), + ) + assert natives.symmetric is True + + natives = TwoQubitNatives( + CZ=FixedSequenceFactory(PulseSequence()), + ) + assert natives.symmetric is True + + natives = TwoQubitNatives( + iSWAP=FixedSequenceFactory(PulseSequence()), + ) + assert natives.symmetric is True + + natives = TwoQubitNatives( + CNOT=FixedSequenceFactory(PulseSequence()), + ) + assert natives.symmetric is False + + natives = TwoQubitNatives( + CZ=FixedSequenceFactory(PulseSequence()), + CNOT=FixedSequenceFactory(PulseSequence()), + ) + assert natives.symmetric is False + + natives = TwoQubitNatives( + CNOT=FixedSequenceFactory(PulseSequence()), + iSWAP=FixedSequenceFactory(PulseSequence()), + ) + assert natives.symmetric is False diff --git a/tests/test_result_shapes.py b/tests/test_result_shapes.py index 38497178cd..1b6e14b130 100644 --- a/tests/test_result_shapes.py +++ b/tests/test_result_shapes.py @@ -35,7 +35,7 @@ def execute(platform: Platform, acquisition_type, averaging_mode, sweep=False): freq_values = np.arange(-4e6, 4e6, 1e6) sweeper1 = Sweeper(Parameter.bias, amp_values, channels=[qubit.flux.name]) sweeper2 = Sweeper(Parameter.amplitude, freq_values, pulses=[probe_pulse]) - results = platform.execute([sequence], options, sweeper1, sweeper2) + results = platform.execute([sequence], options, [[sweeper1], [sweeper2]]) else: results = platform.execute([sequence], options) return results[probe_pulse.id][0] From bb3d3a572d6379b07fc225733ddedd9cb646c859 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 5 Aug 2024 15:20:47 +0200 Subject: [PATCH 0357/1006] ci: Temporarily block automated run of Rust checks Something changed remotely, at the point that even old runs, already passing, are failing once rerun Compare the two attempts in https://github.com/qiboteam/qibolab/actions/runs/10177610824 --- .github/workflows/rustapi.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/rustapi.yml b/.github/workflows/rustapi.yml index ed69c5a83f..82d15b54a2 100644 --- a/.github/workflows/rustapi.yml +++ b/.github/workflows/rustapi.yml @@ -2,7 +2,6 @@ name: Rust API on: - push: workflow_dispatch: jobs: From 50dc5a63564393af686796afb40b8d639ccdb22a Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 5 Aug 2024 12:12:00 +0200 Subject: [PATCH 0358/1006] ci: Replace rustup update with external installation action https://github.com/rust-lang/rustup/issues/3409#issuecomment-1676825769 --- .github/workflows/rustapi.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/rustapi.yml b/.github/workflows/rustapi.yml index 82d15b54a2..64349f0887 100644 --- a/.github/workflows/rustapi.yml +++ b/.github/workflows/rustapi.yml @@ -20,10 +20,7 @@ jobs: - name: Prepare virtual environment run: | pip install . - - name: Install Rust - uses: actions-rs/toolchain@v1 - with: - toolchain: stable + - uses: dtolnay/rust-toolchain@stable - name: Check and lint working-directory: crate run: | From d2464de0836f931dc817a91b1b79ffa8fa10c559 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 5 Aug 2024 15:24:18 +0200 Subject: [PATCH 0359/1006] ci: Update actions in local workflows GitHub is deprecating those based on an old Node version --- .github/workflows/capi.yml | 6 +++--- .github/workflows/rustapi.yml | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/capi.yml b/.github/workflows/capi.yml index af0d6d4027..cae687e22c 100644 --- a/.github/workflows/capi.yml +++ b/.github/workflows/capi.yml @@ -13,11 +13,11 @@ jobs: runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: "3.11" - name: Prepare virtual environment run: | python -m venv env diff --git a/.github/workflows/rustapi.yml b/.github/workflows/rustapi.yml index 64349f0887..3b3ac52aca 100644 --- a/.github/workflows/rustapi.yml +++ b/.github/workflows/rustapi.yml @@ -12,11 +12,11 @@ jobs: runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: "3.11" - name: Prepare virtual environment run: | pip install . From 06f7e56d2c6b30b4345882ea497a4db9797492e8 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 5 Aug 2024 15:27:33 +0200 Subject: [PATCH 0360/1006] fix: Fix further rebase leftover --- src/qibolab/platform/platform.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 7742f04759..edda234ccd 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -309,22 +309,12 @@ def execute( for qubit in self.qubits.values(): integration_setup[qubit.acquisition.name] = (qubit.kernel, qubit.iq_angle) - # find readout pulses - ro_pulses = { - pulse.id: pulse.qubit - for sequence in sequences - for pulse in sequence.ro_pulses - } - results = defaultdict(list) for b in batch(sequences, self._controller.bounds): result = self._execute(b, options, integration_setup, sweepers) for serial, data in result.items(): results[serial].append(data) - for serial, qubit in ro_pulses.items(): - results[qubit] = results[serial] - return results def get_qubit(self, qubit): From 5a7807faa7f13ac799ae60296593f4b303de600b Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 5 Aug 2024 15:47:22 +0200 Subject: [PATCH 0361/1006] ci: Attempt switching back to macos latest --- .github/workflows/deploy.yml | 2 +- .github/workflows/rules.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 854ec7f7ca..fabee8daf6 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -11,7 +11,7 @@ jobs: build: strategy: matrix: - os: [ubuntu-latest, macos-13, windows-latest] + os: [ubuntu-latest, macos-latest, windows-latest] python-version: [3.9, "3.10", "3.11"] uses: qiboteam/workflows/.github/workflows/deploy-pip-poetry.yml@v1 with: diff --git a/.github/workflows/rules.yml b/.github/workflows/rules.yml index 462f544195..4e6b11f357 100644 --- a/.github/workflows/rules.yml +++ b/.github/workflows/rules.yml @@ -11,7 +11,7 @@ jobs: build: strategy: matrix: - os: [ubuntu-latest, macos-13, windows-latest] + os: [ubuntu-latest, macos-latest, windows-latest] python-version: [3.9, "3.10", "3.11"] uses: qiboteam/workflows/.github/workflows/rules-poetry.yml@v1 with: From c82ebb0d5eba1605009005b4a7730af6a038076c Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 23 Jul 2024 16:15:54 +0200 Subject: [PATCH 0362/1006] feat: Introduce method to compute the expected results shape --- src/qibolab/execution_parameters.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/qibolab/execution_parameters.py b/src/qibolab/execution_parameters.py index 7ac569e085..ba241aa990 100644 --- a/src/qibolab/execution_parameters.py +++ b/src/qibolab/execution_parameters.py @@ -10,6 +10,7 @@ SampleResults, ) from qibolab.serialize_ import Model +from qibolab.sweeper import ParallelSweepers class AcquisitionType(Enum): @@ -91,3 +92,20 @@ class ExecutionParameters(Model): def results_type(self): """Returns corresponding results class.""" return RESULTS_TYPE[self.averaging_mode][self.acquisition_type] + + def results_shape( + self, sweepers: list[ParallelSweepers], samples: Optional[int] = None + ) -> tuple[int, ...]: + """Compute the expected shape for collected data.""" + + shots = self.nshots if self.averaging_mode is AveragingMode.SINGLESHOT else 1 + assert isinstance(shots, int) + sweeps = ( + min(len(sweep.values) for sweep in parsweeps) for parsweeps in sweepers + ) + inner = { + AcquisitionType.DISCRIMINATION: 1, + AcquisitionType.INTEGRATION: 2, + AcquisitionType.RAW: samples, + }[self.acquisition_type] + return tuple([shots, *sweeps, inner]) From 84f4a9d2c38ef3e57e85ea8ec3ac3d988dc05df0 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 23 Jul 2024 16:55:57 +0200 Subject: [PATCH 0363/1006] fix: Roll back to variable length shapes --- src/qibolab/execution_parameters.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/qibolab/execution_parameters.py b/src/qibolab/execution_parameters.py index ba241aa990..e134c9d11b 100644 --- a/src/qibolab/execution_parameters.py +++ b/src/qibolab/execution_parameters.py @@ -98,14 +98,13 @@ def results_shape( ) -> tuple[int, ...]: """Compute the expected shape for collected data.""" - shots = self.nshots if self.averaging_mode is AveragingMode.SINGLESHOT else 1 - assert isinstance(shots, int) - sweeps = ( + shots = [self.nshots] if self.averaging_mode is AveragingMode.SINGLESHOT else [] + sweeps = [ min(len(sweep.values) for sweep in parsweeps) for parsweeps in sweepers - ) + ] inner = { - AcquisitionType.DISCRIMINATION: 1, - AcquisitionType.INTEGRATION: 2, - AcquisitionType.RAW: samples, + AcquisitionType.DISCRIMINATION: [], + AcquisitionType.INTEGRATION: [2], + AcquisitionType.RAW: [samples, 2], }[self.acquisition_type] - return tuple([shots, *sweeps, inner]) + return tuple(shots + sweeps + inner) From af8cf07201943703bdabc1c52bcea7a1425ec7b4 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 23 Jul 2024 17:02:55 +0200 Subject: [PATCH 0364/1006] feat!: Turn dummy results into plain mapping id -> array --- src/qibolab/instruments/dummy.py | 40 ++++++++------------------------ 1 file changed, 10 insertions(+), 30 deletions(-) diff --git a/src/qibolab/instruments/dummy.py b/src/qibolab/instruments/dummy.py index d23b2a1950..949e1be954 100644 --- a/src/qibolab/instruments/dummy.py +++ b/src/qibolab/instruments/dummy.py @@ -3,6 +3,7 @@ from qibolab import AcquisitionType, AveragingMode, ExecutionParameters from qibolab.pulses import PulseSequence +from qibolab.pulses.pulse import Pulse from qibolab.sweeper import ParallelSweepers from qibolab.unrolling import Bounds @@ -74,22 +75,12 @@ def disconnect(self): def setup(self, *args, **kwargs): log.info(f"Setting up {self.name} instrument.") - def get_values(self, options, ro_pulse, shape): + def values(self, options: ExecutionParameters, shape: tuple[int, ...]): if options.acquisition_type is AcquisitionType.DISCRIMINATION: if options.averaging_mode is AveragingMode.SINGLESHOT: - values = np.random.randint(2, size=shape) - elif options.averaging_mode is AveragingMode.CYCLIC: - values = np.random.rand(*shape) - elif options.acquisition_type is AcquisitionType.RAW: - samples = int(ro_pulse.duration * SAMPLING_RATE) - waveform_shape = tuple(samples * dim for dim in shape) - values = ( - np.random.rand(*waveform_shape) * 100 - + 1j * np.random.rand(*waveform_shape) * 100 - ) - elif options.acquisition_type is AcquisitionType.INTEGRATION: - values = np.random.rand(*shape) * 100 + 1j * np.random.rand(*shape) * 100 - return values + return np.random.randint(2, size=shape) + return np.random.rand(*shape) + return np.random.rand(*shape) * 100 def play( self, @@ -99,19 +90,8 @@ def play( integration_setup: dict[str, tuple[np.ndarray, float]], sweepers: list[ParallelSweepers], ): - if options.averaging_mode is not AveragingMode.CYCLIC: - shape = (options.nshots,) + tuple( - min(len(sweep.values) for sweep in parsweeps) for parsweeps in sweepers - ) - else: - shape = tuple( - min(len(sweep.values) for sweep in parsweeps) for parsweeps in sweepers - ) - - results = {} - for seq in sequences: - for ro_pulse in seq.probe_pulses: - values = self.get_values(options, ro_pulse, shape) - results[ro_pulse.id] = options.results_type(values) - - return results + def values(pulse: Pulse): + samples = int(pulse.duration * self.sampling_rate) + return self.values(options, options.results_shape(sweepers, samples)) + + return {ro.id: values(ro) for seq in sequences for ro in seq.probe_pulses} From 9a64957a3662e2b998f6fe50d356c5915742c39c Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 23 Jul 2024 17:03:13 +0200 Subject: [PATCH 0365/1006] refactor: Add type hint for sampling rate --- src/qibolab/instruments/abstract.py | 2 +- src/qibolab/instruments/dummy.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qibolab/instruments/abstract.py b/src/qibolab/instruments/abstract.py index 209db0769b..070bcec4a8 100644 --- a/src/qibolab/instruments/abstract.py +++ b/src/qibolab/instruments/abstract.py @@ -68,7 +68,7 @@ def dump(self): @property @abstractmethod - def sampling_rate(self): + def sampling_rate(self) -> int: """Sampling rate of control electronics in giga samples per second (GSps).""" diff --git a/src/qibolab/instruments/dummy.py b/src/qibolab/instruments/dummy.py index 949e1be954..e684dbc922 100644 --- a/src/qibolab/instruments/dummy.py +++ b/src/qibolab/instruments/dummy.py @@ -63,7 +63,7 @@ class DummyInstrument(Controller): BOUNDS = Bounds(1, 1, 1) @property - def sampling_rate(self): + def sampling_rate(self) -> int: return SAMPLING_RATE def connect(self): From 27460a7e739175ff5bd8e001d6a0e10374edc3ee Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 23 Jul 2024 17:54:33 +0200 Subject: [PATCH 0366/1006] feat!: Drop results types, keep results transformations --- src/qibolab/execution_parameters.py | 27 ----- src/qibolab/result.py | 179 ++++------------------------ 2 files changed, 20 insertions(+), 186 deletions(-) diff --git a/src/qibolab/execution_parameters.py b/src/qibolab/execution_parameters.py index e134c9d11b..9e2dd8b4a7 100644 --- a/src/qibolab/execution_parameters.py +++ b/src/qibolab/execution_parameters.py @@ -1,14 +1,6 @@ from enum import Enum, auto from typing import Any, Optional -from qibolab.result import ( - AveragedIntegratedResults, - AveragedRawWaveformResults, - AveragedSampleResults, - IntegratedResults, - RawWaveformResults, - SampleResults, -) from qibolab.serialize_ import Model from qibolab.sweeper import ParallelSweepers @@ -38,20 +30,6 @@ class AveragingMode(Enum): """SEQUENTIAL: Worse averaging for noise[Avoid]""" -RESULTS_TYPE = { - AveragingMode.CYCLIC: { - AcquisitionType.INTEGRATION: AveragedIntegratedResults, - AcquisitionType.RAW: AveragedRawWaveformResults, - AcquisitionType.DISCRIMINATION: AveragedSampleResults, - }, - AveragingMode.SINGLESHOT: { - AcquisitionType.INTEGRATION: IntegratedResults, - AcquisitionType.RAW: RawWaveformResults, - AcquisitionType.DISCRIMINATION: SampleResults, - }, -} - - ConfigUpdate = dict[str, dict[str, Any]] """Update for component configs. @@ -88,11 +66,6 @@ class ExecutionParameters(Model): top of platform defaults. """ - @property - def results_type(self): - """Returns corresponding results class.""" - return RESULTS_TYPE[self.averaging_mode][self.acquisition_type] - def results_shape( self, sweepers: list[ParallelSweepers], samples: Optional[int] = None ) -> tuple[int, ...]: diff --git a/src/qibolab/result.py b/src/qibolab/result.py index 494b74bf51..8126b402b7 100644 --- a/src/qibolab/result.py +++ b/src/qibolab/result.py @@ -1,177 +1,38 @@ -from functools import cached_property, lru_cache -from typing import Optional - import numpy as np import numpy.typing as npt -class IntegratedResults: - """Data structure to deal with the execution output. - - Associated with AcquisitionType.INTEGRATION and - AveragingMode.SINGLESHOT - """ - - def __init__(self, data: np.ndarray): - self.voltage: npt.NDArray[np.complex128] = data - - def __add__(self, data): - return self.__class__(np.append(self.voltage, data.voltage)) - - @property - def voltage_i(self): - """Signal component i in volts.""" - return self.voltage.real - - @property - def voltage_q(self): - """Signal component q in volts.""" - return self.voltage.imag - - @cached_property - def magnitude(self): - """Signal magnitude in volts.""" - return np.sqrt(self.voltage_i**2 + self.voltage_q**2) +def _transpose(values: npt.NDArray): + """Transpose the innermost dimension to the outermost.""" + return np.transpose(values, [-1, *range(values.ndim - 1)]) - @cached_property - def phase(self): - """Signal phase in radians.""" - return np.unwrap(np.arctan2(self.voltage_i, self.voltage_q)) - @cached_property - def phase_std(self): - """Signal phase in radians.""" - return np.std(self.phase, axis=0, ddof=1) / np.sqrt(self.phase.shape[0]) +def _backspose(values: npt.NDArray): + """Innermost transposition inverse. - @property - def serialize(self): - """Serialize as a dictionary.""" - serialized_dict = { - "MSR[V]": self.magnitude.flatten(), - "i[V]": self.voltage_i.flatten(), - "q[V]": self.voltage_q.flatten(), - "phase[rad]": self.phase.flatten(), - } - return serialized_dict - - @property - def average(self): - """Perform average over i and q.""" - average_data = np.mean(self.voltage, axis=0) - std_data = np.std(self.voltage, axis=0, ddof=1) / np.sqrt(self.voltage.shape[0]) - return AveragedIntegratedResults(average_data, std_data) - - -class AveragedIntegratedResults(IntegratedResults): - """Data structure to deal with the execution output. - - Associated with AcquisitionType.INTEGRATION and AveragingMode.CYCLIC - or the averages of ``IntegratedResults`` + Cf. :func:`_transpose`. """ + return np.transpose(values, [*range(1, values.ndim), 0]) - def __init__(self, data: np.ndarray, std: Optional[np.ndarray] = None): - super().__init__(data) - self.std: Optional[npt.NDArray[np.float64]] = std - - def __add__(self, data): - new_res = super().__add__(data) - new_res.std = np.append(self.std, data.std) - return new_res - - @property - def average(self): - """Average on AveragedIntegratedResults is itself.""" - return self - - @cached_property - def phase_std(self): - """Standard deviation is None for AveragedIntegratedResults.""" - return None - - @cached_property - def phase(self): - """Phase not unwrapped because it is a single value.""" - return np.arctan2(self.voltage_i, self.voltage_q) +def magnitude(iq: npt.NDArray): + """Signal magnitude. -class RawWaveformResults(IntegratedResults): - """Data structure to deal with the execution output. - - Associated with AcquisitionType.RAW and AveragingMode.SINGLESHOT may - also be used to store the integration weights ? + It is supposed to be a tension, possibly in arbitrary units. """ + iq_ = _transpose(iq) + return np.sqrt(iq_[0] ** 2 + iq_[1] ** 2) -class AveragedRawWaveformResults(AveragedIntegratedResults): - """Data structure to deal with the execution output. - - Associated with AcquisitionType.RAW and AveragingMode.CYCLIC - or the averages of ``RawWaveformResults`` - """ +def phase(iq: npt.NDArray): + """Signal phase in radians.""" + iq_ = _transpose(iq) + return np.unwrap(np.arctan2(iq_[0], iq_[1])) -class SampleResults: - """Data structure to deal with the execution output. +def probability(values: npt.NDArray, state: int = 0): + """Returns the statistical frequency of the specified state. - Associated with AcquisitionType.DISCRIMINATION and - AveragingMode.SINGLESHOT + The only accepted values `state` are `0` and `1`. """ - - def __init__(self, data: np.ndarray): - self.samples: npt.NDArray[np.uint32] = np.array(data).astype(np.uint32) - - def __add__(self, data): - return self.__class__(np.append(self.samples, data.samples)) - - @lru_cache - def probability(self, state=0): - """Returns the statistical frequency of the specified state (0 or - 1).""" - return abs(1 - state - np.mean(self.samples, axis=0)) - - @property - def serialize(self): - """Serialize as a dictionary.""" - serialized_dict = { - "0": self.probability(0).flatten(), - } - return serialized_dict - - @property - def average(self): - """Perform samples average.""" - average = self.probability(1) - std = np.std(self.samples, axis=0, ddof=1) / np.sqrt(self.samples.shape[0]) - return AveragedSampleResults(average, self.samples, std=std) - - -class AveragedSampleResults(SampleResults): - """Data structure to deal with the execution output. - - Associated with AcquisitionType.DISCRIMINATION and AveragingMode.CYCLIC - or the averages of ``SampleResults`` - """ - - def __init__( - self, - statistical_frequency: np.ndarray, - samples: np.ndarray = np.array([]), - std: np.ndarray = np.array([]), - ): - super().__init__(samples) - self.statistical_frequency: npt.NDArray[np.float64] = statistical_frequency - self.std: Optional[npt.NDArray[np.float64]] = std - - def __add__(self, data): - new_res = super().__add__(data) - new_res.statistical_frequency = np.append( - self.statistical_frequency, data.statistical_frequency - ) - new_res.std = np.append(self.std, data.std) - return new_res - - @lru_cache - def probability(self, state=0): - """Returns the statistical frequency of the specified state (0 or - 1).""" - return abs(1 - state - self.statistical_frequency) + return abs(1 - state - np.mean(values, axis=0)) From 8617c7366385ee52552970541c0dd2c6c274a58d Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 23 Jul 2024 17:55:08 +0200 Subject: [PATCH 0367/1006] docs: Document layout assumptions --- src/qibolab/result.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/qibolab/result.py b/src/qibolab/result.py index 8126b402b7..9384e27290 100644 --- a/src/qibolab/result.py +++ b/src/qibolab/result.py @@ -19,13 +19,20 @@ def magnitude(iq: npt.NDArray): """Signal magnitude. It is supposed to be a tension, possibly in arbitrary units. + + It is assumed that the I and Q component are discriminated by the + innermost dimension of the array. """ iq_ = _transpose(iq) return np.sqrt(iq_[0] ** 2 + iq_[1] ** 2) def phase(iq: npt.NDArray): - """Signal phase in radians.""" + """Signal phase in radians. + + It is assumed that the I and Q component are discriminated by the + innermost dimension of the array. + """ iq_ = _transpose(iq) return np.unwrap(np.arctan2(iq_[0], iq_[1])) From 660f75f8c31d50a02cac289f61f531c14dffa167 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 5 Aug 2024 17:29:05 +0200 Subject: [PATCH 0368/1006] fix: Update backend methods to new results --- src/qibolab/backends.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/qibolab/backends.py b/src/qibolab/backends.py index c26928b87a..b57c69ee9c 100644 --- a/src/qibolab/backends.py +++ b/src/qibolab/backends.py @@ -69,7 +69,7 @@ def assign_measurements(self, measurement_map, readout): containing the readout measurement shots. This is created in ``execute_circuit``. """ for gate, sequence in measurement_map.items(): - _samples = (readout[pulse.id].samples for pulse in sequence.probe_pulses) + _samples = (readout[pulse.id] for pulse in sequence.probe_pulses) samples = list(filter(lambda x: x is not None, _samples)) gate.result.backend = self gate.result.register_samples(np.array(samples).T) @@ -160,8 +160,7 @@ def execute_circuits(self, circuits, initial_states=None, nshots=1000): ) for gate, sequence in measurement_map.items(): samples = [ - readout[pulse.id].popleft().samples - for pulse in sequence.probe_pulses + readout[pulse.id].popleft() for pulse in sequence.probe_pulses ] gate.result.backend = self gate.result.register_samples(np.array(samples).T) From cdc8266a43afae8af481498765361dae27e771ff Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 5 Aug 2024 17:58:01 +0200 Subject: [PATCH 0369/1006] feat: Restore average functions in the result module --- src/qibolab/result.py | 47 +++++++++++++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 11 deletions(-) diff --git a/src/qibolab/result.py b/src/qibolab/result.py index 9384e27290..27c3317acd 100644 --- a/src/qibolab/result.py +++ b/src/qibolab/result.py @@ -1,44 +1,69 @@ +"""Common result operations.""" + import numpy as np import numpy.typing as npt +IQ = npt.NDArray[np.float64] +"""An array of I and Q values. + +It is assumed that the I and Q component are discriminated by the +innermost dimension of the array. +""" -def _transpose(values: npt.NDArray): + +def _lift(values: IQ) -> npt.NDArray: """Transpose the innermost dimension to the outermost.""" return np.transpose(values, [-1, *range(values.ndim - 1)]) -def _backspose(values: npt.NDArray): - """Innermost transposition inverse. +def _lower(values: npt.NDArray) -> IQ: + """Transpose the outermost dimension to the innermost. - Cf. :func:`_transpose`. + Inverse of :func:`_transpose`. """ return np.transpose(values, [*range(1, values.ndim), 0]) -def magnitude(iq: npt.NDArray): +def magnitude(iq: IQ): """Signal magnitude. It is supposed to be a tension, possibly in arbitrary units. - - It is assumed that the I and Q component are discriminated by the - innermost dimension of the array. """ - iq_ = _transpose(iq) + iq_ = _lift(iq) return np.sqrt(iq_[0] ** 2 + iq_[1] ** 2) +def average(iq: IQ) -> tuple[npt.NDArray, npt.NDArray]: + """Perform the average over i and q. + + It returns both the average estimator itself, and its standard + deviation estimator. + """ + mean = np.mean(iq, axis=0) + std = np.std(iq, axis=0, ddof=1) / np.sqrt(iq.shape[0]) + return mean, std + + +def average_iq(i: npt.NDArray, q: npt.NDArray) -> tuple[npt.NDArray, npt.NDArray]: + """Perform the average over i and q. + + Wraps :func:`average` for separate i and q samples arrays. + """ + return average(_lower(np.stack([i, q]))) + + def phase(iq: npt.NDArray): """Signal phase in radians. It is assumed that the I and Q component are discriminated by the innermost dimension of the array. """ - iq_ = _transpose(iq) + iq_ = _lift(iq) return np.unwrap(np.arctan2(iq_[0], iq_[1])) def probability(values: npt.NDArray, state: int = 0): - """Returns the statistical frequency of the specified state. + """Return the statistical frequency of the specified state. The only accepted values `state` are `0` and `1`. """ From f1bf99e3bfd837fb888a2f7406cb944d5cc35838 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 5 Aug 2024 18:16:56 +0200 Subject: [PATCH 0370/1006] feat: Expose function to collect i and q components in the standard layout --- src/qibolab/result.py | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/qibolab/result.py b/src/qibolab/result.py index 27c3317acd..bc0fac430f 100644 --- a/src/qibolab/result.py +++ b/src/qibolab/result.py @@ -16,7 +16,7 @@ def _lift(values: IQ) -> npt.NDArray: return np.transpose(values, [-1, *range(values.ndim - 1)]) -def _lower(values: npt.NDArray) -> IQ: +def _sink(values: npt.NDArray) -> IQ: """Transpose the outermost dimension to the innermost. Inverse of :func:`_transpose`. @@ -24,6 +24,11 @@ def _lower(values: npt.NDArray) -> IQ: return np.transpose(values, [*range(1, values.ndim), 0]) +def collect(i: npt.NDArray, q: npt.NDArray) -> IQ: + """Collect I and Q components in a single array.""" + return _sink(np.stack([i, q])) + + def magnitude(iq: IQ): """Signal magnitude. @@ -33,23 +38,25 @@ def magnitude(iq: IQ): return np.sqrt(iq_[0] ** 2 + iq_[1] ** 2) -def average(iq: IQ) -> tuple[npt.NDArray, npt.NDArray]: - """Perform the average over i and q. +def average(values: npt.NDArray) -> tuple[npt.NDArray, npt.NDArray]: + """Perform the values average. It returns both the average estimator itself, and its standard deviation estimator. + + Use this also for I and Q values in the *standard layout*, cf. :cls:`IQ`. """ - mean = np.mean(iq, axis=0) - std = np.std(iq, axis=0, ddof=1) / np.sqrt(iq.shape[0]) + mean = np.mean(values, axis=0) + std = np.std(values, axis=0, ddof=1) / np.sqrt(values.shape[0]) return mean, std def average_iq(i: npt.NDArray, q: npt.NDArray) -> tuple[npt.NDArray, npt.NDArray]: - """Perform the average over i and q. + """Perform the average over I and Q. - Wraps :func:`average` for separate i and q samples arrays. + Convenience wrapper over :func:`average` for separate i and q samples arrays. """ - return average(_lower(np.stack([i, q]))) + return average(collect(i, q)) def phase(iq: npt.NDArray): From a9fe37f874726c8629159fc6bccf00f141d1c2e1 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 5 Aug 2024 18:17:28 +0200 Subject: [PATCH 0371/1006] fix: Fix usage of results classes in IcarusQ --- src/qibolab/instruments/icarusqfpga.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/qibolab/instruments/icarusqfpga.py b/src/qibolab/instruments/icarusqfpga.py index 4c412e9dd5..e04e3f4cc6 100644 --- a/src/qibolab/instruments/icarusqfpga.py +++ b/src/qibolab/instruments/icarusqfpga.py @@ -15,7 +15,7 @@ from qibolab.instruments.abstract import Controller from qibolab.pulses import Pulse, PulseSequence, PulseType from qibolab.qubits import Qubit, QubitId -from qibolab.result import IntegratedResults, SampleResults +from qibolab.result import average, average_iq, collect from qibolab.sweeper import Parameter, Sweeper, SweeperType DAC_SAMPLNG_RATE_MHZ = 5898.24 @@ -260,12 +260,12 @@ def play( if options.averaging_mode is not AveragingMode.SINGLESHOT: res = { - qunit_mapping[qunit]: IntegratedResults(i + 1j * q).average + qunit_mapping[qunit]: average_iq(i, q) for qunit, (i, q) in raw.items() } else: res = { - qunit_mapping[qunit]: IntegratedResults(i + 1j * q) + qunit_mapping[qunit]: average_iq(i, q) for qunit, (i, q) in raw.items() } # Temp fix for readout pulse sweepers, to be removed with IcarusQ v2 @@ -276,8 +276,7 @@ def play( elif options.acquisition_type is AcquisitionType.DISCRIMINATION: self.device.set_adc_trigger_mode(1) self.device.set_qunit_mode(1) - raw = self.device.start_qunit_acquisition(options.nshots, readout_qubits) - res = {qubit: SampleResults(states) for qubit, states in raw.items()} + res = self.device.start_qunit_acquisition(options.nshots, readout_qubits) # Temp fix for readout pulse sweepers, to be removed with IcarusQ v2 for ro_pulse in readout_pulses: res[ro_pulse.qubit] = res[ro_pulse.serial] @@ -306,9 +305,9 @@ def process_readout_signal( i = np.dot(raw_signal, cos) q = np.dot(raw_signal, sin) - singleshot = IntegratedResults(i + 1j * q) + singleshot = collect(i, q) results[readout_pulse.serial] = ( - singleshot.average + average(singleshot) if options.averaging_mode is not AveragingMode.SINGLESHOT else singleshot ) From 75657f362dd2f7b9c7277f83cc2817ef880ea452 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 5 Aug 2024 18:17:41 +0200 Subject: [PATCH 0372/1006] fix: Fix usage of results classes in the emulator --- .../instruments/emulator/pulse_simulator.py | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/qibolab/instruments/emulator/pulse_simulator.py b/src/qibolab/instruments/emulator/pulse_simulator.py index b13eafa563..ce6358aa01 100644 --- a/src/qibolab/instruments/emulator/pulse_simulator.py +++ b/src/qibolab/instruments/emulator/pulse_simulator.py @@ -6,6 +6,7 @@ from typing import Dict, List, Union import numpy as np +import numpy.typing as npt from qibolab import AcquisitionType, AveragingMode, ExecutionParameters from qibolab.couplers import Coupler @@ -14,7 +15,7 @@ from qibolab.instruments.emulator.models import general_no_coupler_model from qibolab.pulses import PulseSequence, PulseType from qibolab.qubits import Qubit, QubitId -from qibolab.result import IntegratedResults, SampleResults +from qibolab.result import average, collect from qibolab.sweeper import Parameter, Sweeper, SweeperType AVAILABLE_SWEEP_PARAMETERS = { @@ -135,7 +136,7 @@ def play( couplers: Dict[QubitId, Coupler], sequence: PulseSequence, execution_parameters: ExecutionParameters, - ) -> dict[str, Union[IntegratedResults, SampleResults]]: + ) -> dict[str, npt.NDArray]: """Executes the sequence of instructions and generates readout results, as well as simulation-related time and states data. @@ -189,7 +190,7 @@ def sweep( sequence: PulseSequence, execution_parameters: ExecutionParameters, *sweeper: List[Sweeper], - ) -> dict[str, Union[IntegratedResults, SampleResults, dict]]: + ) -> dict[str, Union[npt.NDArray, dict]]: """Executes the sweep and generates readout results, as well as simulation-related time and states data. @@ -379,9 +380,9 @@ def _sweep_play( @staticmethod def merge_sweep_results( - dict_a: """dict[str, Union[IntegratedResults, SampleResults, list]]""", - dict_b: """dict[str, Union[IntegratedResults, SampleResults, list]]""", - ) -> """dict[str, Union[IntegratedResults, SampleResults, list]]""": + dict_a: """dict[str, Union[npt.NDArray, list]]""", + dict_b: """dict[str, Union[npt.NDArray, list]]""", + ) -> """dict[str, Union[npt.NDArray, list]]""": """Merges two dictionary mapping pulse serial to Qibolab results object. @@ -646,7 +647,7 @@ def get_results_from_samples( samples: dict[Union[str, int], list], execution_parameters: ExecutionParameters, prepend_to_shape: list = [], -) -> dict[str, Union[IntegratedResults, SampleResults]]: +) -> dict[str, npt.NDArray]: """Converts samples into Qibolab results format. Args: @@ -673,10 +674,11 @@ def get_results_from_samples( values = np.array(samples[ro_pulse.qubit]).reshape(shape).transpose(tshape) if execution_parameters.acquisition_type is AcquisitionType.DISCRIMINATION: - processed_values = SampleResults(values) + processed_values = values elif execution_parameters.acquisition_type is AcquisitionType.INTEGRATION: - processed_values = IntegratedResults(values.astype(np.complex128)) + vals = values.astype(np.complex128) + processed_values = collect(vals.real, vals.imag) else: raise ValueError( @@ -684,9 +686,7 @@ def get_results_from_samples( ) if execution_parameters.averaging_mode is AveragingMode.CYCLIC: - processed_values = ( - processed_values.average - ) # generates AveragedSampleResults + processed_values = average(processed_values) results[ro_pulse.qubit] = results[ro_pulse.serial] = processed_values return results From fa06f929dd3ecb8b34f98508730b47a79d1ad2ae Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 5 Aug 2024 18:26:01 +0200 Subject: [PATCH 0373/1006] fix: Fix usage of results classes in qick --- src/qibolab/instruments/rfsoc/driver.py | 50 +++++++++---------------- 1 file changed, 18 insertions(+), 32 deletions(-) diff --git a/src/qibolab/instruments/rfsoc/driver.py b/src/qibolab/instruments/rfsoc/driver.py index b9cdd49052..09c1ce06d0 100644 --- a/src/qibolab/instruments/rfsoc/driver.py +++ b/src/qibolab/instruments/rfsoc/driver.py @@ -2,7 +2,6 @@ import re from dataclasses import asdict, dataclass -from typing import Union import numpy as np import numpy.typing as npt @@ -15,7 +14,6 @@ from qibolab.instruments.abstract import Controller from qibolab.pulses import PulseSequence, PulseType from qibolab.qubits import Qubit -from qibolab.result import AveragedSampleResults, IntegratedResults, SampleResults from qibolab.sweeper import BIAS, Sweeper from .convert import convert, convert_units_sweeper @@ -119,9 +117,9 @@ def validate_input_command( @staticmethod def merge_sweep_results( - dict_a: dict[str, Union[IntegratedResults, SampleResults]], - dict_b: dict[str, Union[IntegratedResults, SampleResults]], - ) -> dict[str, Union[IntegratedResults, SampleResults]]: + dict_a: dict[str, npt.NDArray], + dict_b: dict[str, npt.NDArray], + ) -> dict[str, npt.NDArray]: """Merge two dictionary mapping pulse serial to Results object. If dict_b has a key (serial) that dict_a does not have, simply add it, @@ -135,32 +133,20 @@ def merge_sweep_results( """ for serial in dict_b: if serial in dict_a: - data = lambda res: ( - res.voltage if isinstance(res, IntegratedResults) else res.samples - ) - dict_a[serial] = type(dict_a[serial])( - np.append(data(dict_a[serial]), data(dict_b[serial])) - ) + dict_a[serial] = np.append(dict_a[serial], dict_b[serial]) else: dict_a[serial] = dict_b[serial] return dict_a @staticmethod - def reshape_sweep_results(results, sweepers, execution_parameters): - shape = [len(sweeper.values) for sweeper in sweepers] - if execution_parameters.averaging_mode is not AveragingMode.CYCLIC: - shape.insert(0, execution_parameters.nshots) - - def data(value): - if isinstance(value, IntegratedResults): - data = value.voltage - elif isinstance(value, AveragedSampleResults): - data = value.statistical_frequency - else: - data = value.samples - return type(value)(data.reshape(shape)) - - return {key: data(value) for key, value in results.items()} + def reshape_sweep_results( + results, sweepers, execution_parameters: ExecutionParameters + ): + # TODO: pay attention: the following will not work in raw waveform acquisition + # modes, in which case the number of samples taken should be passed as an + # explicit parameter + shape = execution_parameters.results_shape(sweepers) + return {key: value.reshape(shape) for key, value in results.items()} def _execute_pulse_sequence( self, @@ -218,7 +204,7 @@ def play( couplers: dict[int, Coupler], sequence: PulseSequence, execution_parameters: ExecutionParameters, - ) -> dict[str, Union[IntegratedResults, SampleResults]]: + ) -> dict[str, npt.NDArray]: """Execute the sequence of instructions and retrieves readout results. Each readout pulse generates a separate acquisition. @@ -317,7 +303,7 @@ def play_sequence_in_sweep_recursion( sequence: PulseSequence, or_sequence: PulseSequence, execution_parameters: ExecutionParameters, - ) -> dict[str, Union[IntegratedResults, SampleResults]]: + ) -> dict[str, npt.NDArray]: """Last recursion layer, if no sweeps are present. After playing the sequence, the resulting dictionary keys need @@ -345,7 +331,7 @@ def recursive_python_sweep( or_sequence: PulseSequence, *sweepers: rfsoc.Sweeper, execution_parameters: ExecutionParameters, - ) -> dict[str, Union[IntegratedResults, SampleResults]]: + ) -> dict[str, npt.NDArray]: """Execute a sweep of an arbitrary number of Sweepers via recursion. Args: @@ -391,7 +377,7 @@ def recursive_python_sweep( val = val.astype(int) values.append(val) - results: dict[str, Union[IntegratedResults, SampleResults]] = {} + results: dict[str, npt.NDArray] = {} for idx in range(sweeper.expts): # update values for jdx, kdx in enumerate(sweeper.indexes): @@ -488,7 +474,7 @@ def convert_sweep_results( toti: list[list[list[float]]], totq: list[list[list[float]]], execution_parameters: ExecutionParameters, - ) -> dict[str, Union[IntegratedResults, SampleResults]]: + ) -> dict[str, npt.NDArray]: """Convert sweep res to qibolab dict res. Args: @@ -546,7 +532,7 @@ def sweep( sequence: PulseSequence, execution_parameters: ExecutionParameters, *sweepers: Sweeper, - ) -> dict[str, Union[IntegratedResults, SampleResults]]: + ) -> dict[str, npt.NDArray]: """Execute the sweep and retrieves the readout results. Each readout pulse generates a separate acquisition. From 4bc8b4a3f6492fb875c9c4c47d848cf0c6af7247 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 5 Aug 2024 18:36:31 +0200 Subject: [PATCH 0374/1006] fix: Fix usage of results classes in QM --- src/qibolab/instruments/qblox/controller.py | 6 +---- src/qibolab/instruments/qm/acquisition.py | 28 ++------------------- 2 files changed, 3 insertions(+), 31 deletions(-) diff --git a/src/qibolab/instruments/qblox/controller.py b/src/qibolab/instruments/qblox/controller.py index fb9c691e48..ecf44172f0 100644 --- a/src/qibolab/instruments/qblox/controller.py +++ b/src/qibolab/instruments/qblox/controller.py @@ -12,7 +12,6 @@ from qibolab.instruments.qblox.cluster_qrm_rf import QrmRf from qibolab.instruments.qblox.sequencer import SAMPLING_RATE from qibolab.pulses import PulseSequence, PulseType -from qibolab.result import SampleResults from qibolab.sweeper import Parameter, Sweeper, SweeperType from qibolab.unrolling import Bounds @@ -523,12 +522,9 @@ def _sweep_recursion( def _combine_result_chunks(chunks): some_chunk = next(iter(chunks)) some_result = next(iter(some_chunk.values())) - attribute = "samples" if isinstance(some_result, SampleResults) else "voltage" return { key: some_result.__class__( - np.concatenate( - [getattr(chunk[key], attribute) for chunk in chunks], axis=0 - ) + np.concatenate([chunk[key] for chunk in chunks], axis=0) ) for key in some_chunk.keys() } diff --git a/src/qibolab/instruments/qm/acquisition.py b/src/qibolab/instruments/qm/acquisition.py index 4e6390a135..d0ad33832d 100644 --- a/src/qibolab/instruments/qm/acquisition.py +++ b/src/qibolab/instruments/qm/acquisition.py @@ -11,14 +11,6 @@ from qibolab.execution_parameters import AcquisitionType, AveragingMode from qibolab.qubits import QubitId -from qibolab.result import ( - AveragedIntegratedResults, - AveragedRawWaveformResults, - AveragedSampleResults, - IntegratedResults, - RawWaveformResults, - SampleResults, -) @dataclass @@ -38,12 +30,6 @@ class Acquisition(ABC): keys: list[str] = field(default_factory=list) - RESULT_CLS = IntegratedResults - """Result object type that corresponds to this acquisition type.""" - AVERAGED_RESULT_CLS = AveragedIntegratedResults - """Averaged result object type that corresponds to this acquisition - type.""" - @property def npulses(self): return len(self.keys) @@ -81,10 +67,9 @@ def fetch(self): def result(self, data): """Creates Qibolab result object that is returned to the platform.""" - res_cls = self.AVERAGED_RESULT_CLS if self.average else self.RESULT_CLS if self.npulses > 1: - return [res_cls(data[..., i]) for i in range(self.npulses)] - return [res_cls(data)] + return [data[..., i] for i in range(self.npulses)] + return [data] @dataclass @@ -96,9 +81,6 @@ class RawAcquisition(Acquisition): ) """Stream to collect raw ADC data.""" - RESULT_CLS = RawWaveformResults - AVERAGED_RESULT_CLS = AveragedRawWaveformResults - def assign_element(self, element): pass @@ -135,9 +117,6 @@ class IntegratedAcquisition(Acquisition): qstream: _ResultSource = field(default_factory=lambda: declare_stream()) """Streams to collect the results of all shots.""" - RESULT_CLS = IntegratedResults - AVERAGED_RESULT_CLS = AveragedIntegratedResults - def assign_element(self, element): assign_variables_to_element(element, self.i, self.q) @@ -193,9 +172,6 @@ class ShotsAcquisition(Acquisition): shots: _ResultSource = field(default_factory=lambda: declare_stream()) """Stream to collect multiple shots.""" - RESULT_CLS = SampleResults - AVERAGED_RESULT_CLS = AveragedSampleResults - def __post_init__(self): self.cos = np.cos(self.angle) self.sin = np.sin(self.angle) From 5878251d73fc5cc367fdc988b4c1bd3b68617f34 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 5 Aug 2024 19:10:20 +0200 Subject: [PATCH 0375/1006] test: Remove stale imports from broken drivers tests --- tests/test_instruments_qblox_controller.py | 1 - tests/test_instruments_rfsoc.py | 5 ----- 2 files changed, 6 deletions(-) diff --git a/tests/test_instruments_qblox_controller.py b/tests/test_instruments_qblox_controller.py index e979354767..34ecaee7a2 100644 --- a/tests/test_instruments_qblox_controller.py +++ b/tests/test_instruments_qblox_controller.py @@ -6,7 +6,6 @@ from qibolab import AveragingMode, ExecutionParameters from qibolab.instruments.qblox.controller import MAX_NUM_BINS, QbloxController from qibolab.pulses import Gaussian, Pulse, PulseSequence, PulseType, Rectangular -from qibolab.result import IntegratedResults from qibolab.sweeper import Parameter, Sweeper from .qblox_fixtures import connected_controller, controller diff --git a/tests/test_instruments_rfsoc.py b/tests/test_instruments_rfsoc.py index 0612c40c28..b61b848061 100644 --- a/tests/test_instruments_rfsoc.py +++ b/tests/test_instruments_rfsoc.py @@ -16,11 +16,6 @@ ) from qibolab.pulses import Drag, Gaussian, Pulse, PulseSequence, PulseType, Rectangular from qibolab.qubits import Qubit -from qibolab.result import ( - AveragedIntegratedResults, - AveragedSampleResults, - IntegratedResults, -) from qibolab.sweeper import Parameter, Sweeper, SweeperType from .conftest import get_instrument From 3ecd122676dde31b8433ea559e08c2dd2917b877 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 5 Aug 2024 19:14:23 +0200 Subject: [PATCH 0376/1006] test: Unlock results shapes tests in the ci Change name to the option, since `--platform` is already used by Pytest itself for the OS By default, it runs on dummy, making sure that the tests themselves are up-to-date --- tests/conftest.py | 2 +- tests/test_result_shapes.py | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 29419dc584..da23c30448 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -108,7 +108,7 @@ def connected_platform(request): the ``QIBOLAB_PLATFORMS`` environment variable. """ os.environ[PLATFORMS] = ORIGINAL_PLATFORMS - name = request.config.getoption("--platform") + name = request.config.getoption("--device", default="dummy") platform = create_platform(name) platform.connect() yield platform diff --git a/tests/test_result_shapes.py b/tests/test_result_shapes.py index 1b6e14b130..bd562cf041 100644 --- a/tests/test_result_shapes.py +++ b/tests/test_result_shapes.py @@ -41,7 +41,6 @@ def execute(platform: Platform, acquisition_type, averaging_mode, sweep=False): return results[probe_pulse.id][0] -@pytest.mark.qpu @pytest.mark.parametrize("sweep", [False, True]) def test_discrimination_singleshot(connected_platform, sweep): result = execute( @@ -57,7 +56,6 @@ def test_discrimination_singleshot(connected_platform, sweep): assert result.samples.shape == (NSHOTS,) -@pytest.mark.qpu @pytest.mark.parametrize("sweep", [False, True]) def test_discrimination_cyclic(connected_platform, sweep): result = execute( @@ -70,7 +68,6 @@ def test_discrimination_cyclic(connected_platform, sweep): assert result.statistical_frequency.shape == tuple() -@pytest.mark.qpu @pytest.mark.parametrize("sweep", [False, True]) def test_integration_singleshot(connected_platform, sweep): result = execute( @@ -83,7 +80,6 @@ def test_integration_singleshot(connected_platform, sweep): assert result.voltage.shape == (NSHOTS,) -@pytest.mark.qpu @pytest.mark.parametrize("sweep", [False, True]) def test_integration_cyclic(connected_platform, sweep): result = execute( From ecd55086d15ef1ad2cd4343d36b1fa3dd807dfaf Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 5 Aug 2024 19:15:14 +0200 Subject: [PATCH 0377/1006] test: Update result shapes test to accommodate plain arrays --- tests/test_result_shapes.py | 34 +++++++++++++++------------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/tests/test_result_shapes.py b/tests/test_result_shapes.py index bd562cf041..4c1d95cc72 100644 --- a/tests/test_result_shapes.py +++ b/tests/test_result_shapes.py @@ -1,15 +1,10 @@ import numpy as np +import numpy.typing as npt import pytest from qibolab import AcquisitionType, AveragingMode, ExecutionParameters from qibolab.platform.platform import Platform from qibolab.pulses import PulseSequence -from qibolab.result import ( - AveragedIntegratedResults, - AveragedSampleResults, - IntegratedResults, - SampleResults, -) from qibolab.sweeper import Parameter, Sweeper NSHOTS = 50 @@ -17,7 +12,12 @@ NSWEEP2 = 8 -def execute(platform: Platform, acquisition_type, averaging_mode, sweep=False): +def execute( + platform: Platform, + acquisition_type: AcquisitionType, + averaging_mode: AveragingMode, + sweep=False, +) -> npt.NDArray: qubit = next(iter(platform.qubits.values())) qd_seq = qubit.native_gates.RX.create_sequence() @@ -49,11 +49,10 @@ def test_discrimination_singleshot(connected_platform, sweep): AveragingMode.SINGLESHOT, sweep, ) - assert isinstance(result, SampleResults) if sweep: - assert result.samples.shape == (NSHOTS, NSWEEP1, NSWEEP2) + assert result.shape == (NSHOTS, NSWEEP1, NSWEEP2) else: - assert result.samples.shape == (NSHOTS,) + assert result.shape == (NSHOTS,) @pytest.mark.parametrize("sweep", [False, True]) @@ -61,11 +60,10 @@ def test_discrimination_cyclic(connected_platform, sweep): result = execute( connected_platform, AcquisitionType.DISCRIMINATION, AveragingMode.CYCLIC, sweep ) - assert isinstance(result, AveragedSampleResults) if sweep: - assert result.statistical_frequency.shape == (NSWEEP1, NSWEEP2) + assert result.shape == (NSWEEP1, NSWEEP2) else: - assert result.statistical_frequency.shape == tuple() + assert result.shape == tuple() @pytest.mark.parametrize("sweep", [False, True]) @@ -73,11 +71,10 @@ def test_integration_singleshot(connected_platform, sweep): result = execute( connected_platform, AcquisitionType.INTEGRATION, AveragingMode.SINGLESHOT, sweep ) - assert isinstance(result, IntegratedResults) if sweep: - assert result.voltage.shape == (NSHOTS, NSWEEP1, NSWEEP2) + assert result.shape == (NSHOTS, NSWEEP1, NSWEEP2) else: - assert result.voltage.shape == (NSHOTS,) + assert result.shape == (NSHOTS,) @pytest.mark.parametrize("sweep", [False, True]) @@ -85,8 +82,7 @@ def test_integration_cyclic(connected_platform, sweep): result = execute( connected_platform, AcquisitionType.INTEGRATION, AveragingMode.CYCLIC, sweep ) - assert isinstance(result, AveragedIntegratedResults) if sweep: - assert result.voltage.shape == (NSWEEP1, NSWEEP2) + assert result.shape == (NSWEEP1, NSWEEP2) else: - assert result.voltage.shape == tuple() + assert result.shape == tuple() From b99e3d364d96406d158a51ce60ae5ecca42a0570 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 5 Aug 2024 19:18:58 +0200 Subject: [PATCH 0378/1006] fix: Ensure dummy result is always an array Even when a single scalar --- src/qibolab/instruments/dummy.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/qibolab/instruments/dummy.py b/src/qibolab/instruments/dummy.py index e684dbc922..b8556dbb12 100644 --- a/src/qibolab/instruments/dummy.py +++ b/src/qibolab/instruments/dummy.py @@ -92,6 +92,8 @@ def play( ): def values(pulse: Pulse): samples = int(pulse.duration * self.sampling_rate) - return self.values(options, options.results_shape(sweepers, samples)) + return np.array( + self.values(options, options.results_shape(sweepers, samples)) + ) return {ro.id: values(ro) for seq in sequences for ro in seq.probe_pulses} From c3b5c1ff2c93d0c7c3915a91547509ffeeb8e2da Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 5 Aug 2024 19:19:29 +0200 Subject: [PATCH 0379/1006] test: Update result shapes test for complex removal --- tests/test_result_shapes.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test_result_shapes.py b/tests/test_result_shapes.py index 4c1d95cc72..4a22950c1b 100644 --- a/tests/test_result_shapes.py +++ b/tests/test_result_shapes.py @@ -72,9 +72,9 @@ def test_integration_singleshot(connected_platform, sweep): connected_platform, AcquisitionType.INTEGRATION, AveragingMode.SINGLESHOT, sweep ) if sweep: - assert result.shape == (NSHOTS, NSWEEP1, NSWEEP2) + assert result.shape == (NSHOTS, NSWEEP1, NSWEEP2, 2) else: - assert result.shape == (NSHOTS,) + assert result.shape == (NSHOTS, 2) @pytest.mark.parametrize("sweep", [False, True]) @@ -83,6 +83,6 @@ def test_integration_cyclic(connected_platform, sweep): connected_platform, AcquisitionType.INTEGRATION, AveragingMode.CYCLIC, sweep ) if sweep: - assert result.shape == (NSWEEP1, NSWEEP2) + assert result.shape == (NSWEEP1, NSWEEP2, 2) else: - assert result.shape == tuple() + assert result.shape == (2,) From 6c076e36b549172a0d2229393a8d9691332651ea Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 5 Aug 2024 19:34:33 +0200 Subject: [PATCH 0380/1006] test: Lift execution function to fixture, for general reuse --- tests/conftest.py | 53 +++++++++++++++++++++++++++++++++- tests/test_result_shapes.py | 57 ++++++------------------------------- 2 files changed, 61 insertions(+), 49 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index da23c30448..c8bca6781a 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,10 +1,21 @@ import os import pathlib +from collections.abc import Callable +import numpy as np +import numpy.typing as npt import pytest -from qibolab.platform import create_platform +from qibolab import ( + AcquisitionType, + AveragingMode, + ExecutionParameters, + Platform, + create_platform, +) from qibolab.platform.load import PLATFORMS +from qibolab.pulses import PulseSequence +from qibolab.sweeper import Parameter, Sweeper ORIGINAL_PLATFORMS = os.environ.get(PLATFORMS, "") TESTING_PLATFORM_NAMES = [ # FIXME: uncomment platforms as they get upgraded to 0.2 @@ -115,6 +126,46 @@ def connected_platform(request): platform.disconnect() +Execution = Callable[[AcquisitionType, AveragingMode, bool], npt.NDArray] + + +@pytest.fixture +def execute(connected_platform: Platform) -> Execution: + def wrapped( + acquisition_type: AcquisitionType, + averaging_mode: AveragingMode, + sweep: bool = False, + nshots: int = 1000, + ) -> npt.NDArray: + qubit = next(iter(connected_platform.qubits.values())) + + qd_seq = qubit.native_gates.RX.create_sequence() + probe_seq = qubit.native_gates.MZ.create_sequence() + probe_pulse = next(iter(probe_seq.values()))[0] + sequence = PulseSequence() + sequence.extend(qd_seq) + sequence.extend(probe_seq) + + options = ExecutionParameters( + nshots=nshots, + acquisition_type=acquisition_type, + averaging_mode=averaging_mode, + ) + if sweep: + amp_values = np.arange(0.01, 0.06, 0.01) + freq_values = np.arange(-4e6, 4e6, 1e6) + sweeper1 = Sweeper(Parameter.bias, amp_values, channels=[qubit.flux.name]) + sweeper2 = Sweeper(Parameter.amplitude, freq_values, pulses=[probe_pulse]) + results = connected_platform.execute( + [sequence], options, [[sweeper1], [sweeper2]] + ) + else: + results = connected_platform.execute([sequence], options) + return results[probe_pulse.id][0] + + return wrapped + + def pytest_generate_tests(metafunc): name = metafunc.module.__name__ if "test_instruments" in name: diff --git a/tests/test_result_shapes.py b/tests/test_result_shapes.py index 4a22950c1b..c062235df5 100644 --- a/tests/test_result_shapes.py +++ b/tests/test_result_shapes.py @@ -1,53 +1,16 @@ -import numpy as np -import numpy.typing as npt import pytest -from qibolab import AcquisitionType, AveragingMode, ExecutionParameters -from qibolab.platform.platform import Platform -from qibolab.pulses import PulseSequence -from qibolab.sweeper import Parameter, Sweeper +from qibolab import AcquisitionType, AveragingMode NSHOTS = 50 NSWEEP1 = 5 NSWEEP2 = 8 -def execute( - platform: Platform, - acquisition_type: AcquisitionType, - averaging_mode: AveragingMode, - sweep=False, -) -> npt.NDArray: - qubit = next(iter(platform.qubits.values())) - - qd_seq = qubit.native_gates.RX.create_sequence() - probe_seq = qubit.native_gates.MZ.create_sequence() - probe_pulse = next(iter(probe_seq.values()))[0] - sequence = PulseSequence() - sequence.extend(qd_seq) - sequence.extend(probe_seq) - - options = ExecutionParameters( - nshots=NSHOTS, acquisition_type=acquisition_type, averaging_mode=averaging_mode - ) - if sweep: - amp_values = np.arange(0.01, 0.06, 0.01) - freq_values = np.arange(-4e6, 4e6, 1e6) - sweeper1 = Sweeper(Parameter.bias, amp_values, channels=[qubit.flux.name]) - sweeper2 = Sweeper(Parameter.amplitude, freq_values, pulses=[probe_pulse]) - results = platform.execute([sequence], options, [[sweeper1], [sweeper2]]) - else: - results = platform.execute([sequence], options) - return results[probe_pulse.id][0] - - @pytest.mark.parametrize("sweep", [False, True]) -def test_discrimination_singleshot(connected_platform, sweep): +def test_discrimination_singleshot(execute, sweep): result = execute( - connected_platform, - AcquisitionType.DISCRIMINATION, - AveragingMode.SINGLESHOT, - sweep, + AcquisitionType.DISCRIMINATION, AveragingMode.SINGLESHOT, sweep, NSHOTS ) if sweep: assert result.shape == (NSHOTS, NSWEEP1, NSWEEP2) @@ -56,9 +19,9 @@ def test_discrimination_singleshot(connected_platform, sweep): @pytest.mark.parametrize("sweep", [False, True]) -def test_discrimination_cyclic(connected_platform, sweep): +def test_discrimination_cyclic(execute, sweep): result = execute( - connected_platform, AcquisitionType.DISCRIMINATION, AveragingMode.CYCLIC, sweep + AcquisitionType.DISCRIMINATION, AveragingMode.CYCLIC, sweep, NSHOTS ) if sweep: assert result.shape == (NSWEEP1, NSWEEP2) @@ -67,9 +30,9 @@ def test_discrimination_cyclic(connected_platform, sweep): @pytest.mark.parametrize("sweep", [False, True]) -def test_integration_singleshot(connected_platform, sweep): +def test_integration_singleshot(execute, sweep): result = execute( - connected_platform, AcquisitionType.INTEGRATION, AveragingMode.SINGLESHOT, sweep + AcquisitionType.INTEGRATION, AveragingMode.SINGLESHOT, sweep, NSHOTS ) if sweep: assert result.shape == (NSHOTS, NSWEEP1, NSWEEP2, 2) @@ -78,10 +41,8 @@ def test_integration_singleshot(connected_platform, sweep): @pytest.mark.parametrize("sweep", [False, True]) -def test_integration_cyclic(connected_platform, sweep): - result = execute( - connected_platform, AcquisitionType.INTEGRATION, AveragingMode.CYCLIC, sweep - ) +def test_integration_cyclic(execute, sweep): + result = execute(AcquisitionType.INTEGRATION, AveragingMode.CYCLIC, sweep, NSHOTS) if sweep: assert result.shape == (NSWEEP1, NSWEEP2, 2) else: From 6e4210b6d87bc9cd5e4644b77fe120b50a44c53c Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 5 Aug 2024 19:47:44 +0200 Subject: [PATCH 0381/1006] feat: Expose i and q unpacking --- src/qibolab/result.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/qibolab/result.py b/src/qibolab/result.py index bc0fac430f..05e6d6b254 100644 --- a/src/qibolab/result.py +++ b/src/qibolab/result.py @@ -29,6 +29,15 @@ def collect(i: npt.NDArray, q: npt.NDArray) -> IQ: return _sink(np.stack([i, q])) +def unpack(iq: IQ) -> tuple[npt.NDArray, npt.NDArray]: + """Unpack I and Q components from single array. + + Inverse of :func:`collect`. + """ + i, q = tuple(_lift(iq)) + return i, q + + def magnitude(iq: IQ): """Signal magnitude. From 9dcdd440541fd0822f6c435768584a9388e8d1e3 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 5 Aug 2024 19:50:49 +0200 Subject: [PATCH 0382/1006] test: Remove old results generators and constructors tests --- tests/test_result.py | 55 -------------------------------------------- 1 file changed, 55 deletions(-) diff --git a/tests/test_result.py b/tests/test_result.py index e861f56796..075992cb1e 100644 --- a/tests/test_result.py +++ b/tests/test_result.py @@ -3,61 +3,6 @@ import numpy as np import pytest -from qibolab.result import ( - AveragedIntegratedResults, - AveragedSampleResults, - IntegratedResults, - RawWaveformResults, - SampleResults, -) - - -def generate_random_iq_result(length=5): - data = np.random.rand(length, length, length) - return IntegratedResults(data) - - -def generate_random_raw_result(length=5): - data = np.random.rand(length, length, length) - return IntegratedResults(data) - - -def generate_random_state_result(length=5): - data = np.random.randint(low=2, size=(length, length, length)) - return SampleResults(data) - - -def generate_random_avg_iq_result(length=5): - data = np.random.rand(length, length, length) - return AveragedIntegratedResults(data) - - -def generate_random_avg_raw_result(length=5): - data = np.random.rand(length, length, length) - return AveragedIntegratedResults(data) - - -def generate_random_avg_state_result(length=5): - data = np.random.randint(low=2, size=(length, length, length)) - return AveragedSampleResults(data) - - -def test_iq_constructor(): - """Testing ExecutionResults constructor.""" - test = np.array([(1, 2), (1, 2)]) - IntegratedResults(test) - - -def test_raw_constructor(): - """Testing ExecutionResults constructor.""" - test = np.array([(1, 2), (1, 2)]) - RawWaveformResults(test) - - -def test_state_constructor(): - """Testing ExecutionResults constructor.""" - test = np.array([1, 1, 0]) - SampleResults(test) @pytest.mark.parametrize("result", ["iq", "raw"]) From e82a597ab2a721468398e132eb78e813b29620c6 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 5 Aug 2024 19:51:14 +0200 Subject: [PATCH 0383/1006] test: Test i and q polar representation --- tests/test_result.py | 21 +++++++++++---------- tests/test_result_shapes.py | 17 ++++++----------- 2 files changed, 17 insertions(+), 21 deletions(-) diff --git a/tests/test_result.py b/tests/test_result.py index 075992cb1e..f3c6778c98 100644 --- a/tests/test_result.py +++ b/tests/test_result.py @@ -3,21 +3,22 @@ import numpy as np import pytest +from qibolab import AcquisitionType as Acq +from qibolab import AveragingMode as Av +from qibolab.result import magnitude, phase, unpack @pytest.mark.parametrize("result", ["iq", "raw"]) -def test_integrated_result_properties(result): - """Testing IntegratedResults and RawWaveformResults properties.""" +def test_polar(result, execute): + """Testing I and Q polar representation.""" if result == "iq": - results = generate_random_iq_result(5) + res = execute(Acq.INTEGRATION, Av.CYCLIC, 5) else: - results = generate_random_raw_result(5) - np.testing.assert_equal( - np.sqrt(results.voltage_i**2 + results.voltage_q**2), results.magnitude - ) - np.testing.assert_equal( - np.unwrap(np.arctan2(results.voltage_i, results.voltage_q)), results.phase - ) + res = execute(Acq.RAW, Av.CYCLIC, 5) + + i, q = unpack(res) + np.testing.assert_equal(np.sqrt(i**2 + q**2), magnitude(res)) + np.testing.assert_equal(np.unwrap(np.arctan2(i, q)), phase(res)) @pytest.mark.parametrize("state", [0, 1]) diff --git a/tests/test_result_shapes.py b/tests/test_result_shapes.py index c062235df5..e52480e4b3 100644 --- a/tests/test_result_shapes.py +++ b/tests/test_result_shapes.py @@ -1,6 +1,7 @@ import pytest -from qibolab import AcquisitionType, AveragingMode +from qibolab import AcquisitionType as Acq +from qibolab import AveragingMode as Av NSHOTS = 50 NSWEEP1 = 5 @@ -9,9 +10,7 @@ @pytest.mark.parametrize("sweep", [False, True]) def test_discrimination_singleshot(execute, sweep): - result = execute( - AcquisitionType.DISCRIMINATION, AveragingMode.SINGLESHOT, sweep, NSHOTS - ) + result = execute(Acq.DISCRIMINATION, Av.SINGLESHOT, sweep, NSHOTS) if sweep: assert result.shape == (NSHOTS, NSWEEP1, NSWEEP2) else: @@ -20,9 +19,7 @@ def test_discrimination_singleshot(execute, sweep): @pytest.mark.parametrize("sweep", [False, True]) def test_discrimination_cyclic(execute, sweep): - result = execute( - AcquisitionType.DISCRIMINATION, AveragingMode.CYCLIC, sweep, NSHOTS - ) + result = execute(Acq.DISCRIMINATION, Av.CYCLIC, sweep, NSHOTS) if sweep: assert result.shape == (NSWEEP1, NSWEEP2) else: @@ -31,9 +28,7 @@ def test_discrimination_cyclic(execute, sweep): @pytest.mark.parametrize("sweep", [False, True]) def test_integration_singleshot(execute, sweep): - result = execute( - AcquisitionType.INTEGRATION, AveragingMode.SINGLESHOT, sweep, NSHOTS - ) + result = execute(Acq.INTEGRATION, Av.SINGLESHOT, sweep, NSHOTS) if sweep: assert result.shape == (NSHOTS, NSWEEP1, NSWEEP2, 2) else: @@ -42,7 +37,7 @@ def test_integration_singleshot(execute, sweep): @pytest.mark.parametrize("sweep", [False, True]) def test_integration_cyclic(execute, sweep): - result = execute(AcquisitionType.INTEGRATION, AveragingMode.CYCLIC, sweep, NSHOTS) + result = execute(Acq.INTEGRATION, Av.CYCLIC, sweep, NSHOTS) if sweep: assert result.shape == (NSWEEP1, NSWEEP2, 2) else: From 43bbdea1382213c0698539ba73f6a03bb3878662 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 5 Aug 2024 20:05:19 +0200 Subject: [PATCH 0384/1006] test: Test probabilities computation --- src/qibolab/result.py | 2 ++ tests/test_result.py | 23 +++++++++++------------ 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/qibolab/result.py b/src/qibolab/result.py index 05e6d6b254..a8b918f75c 100644 --- a/src/qibolab/result.py +++ b/src/qibolab/result.py @@ -83,4 +83,6 @@ def probability(values: npt.NDArray, state: int = 0): The only accepted values `state` are `0` and `1`. """ + # The absolute value is only needed to make sure the result is always positive, even + # when extremely close to zero return abs(1 - state - np.mean(values, axis=0)) diff --git a/tests/test_result.py b/tests/test_result.py index f3c6778c98..db021553de 100644 --- a/tests/test_result.py +++ b/tests/test_result.py @@ -2,17 +2,18 @@ import numpy as np import pytest +from pytest import approx from qibolab import AcquisitionType as Acq from qibolab import AveragingMode as Av -from qibolab.result import magnitude, phase, unpack +from qibolab.result import magnitude, phase, probability, unpack @pytest.mark.parametrize("result", ["iq", "raw"]) def test_polar(result, execute): """Testing I and Q polar representation.""" if result == "iq": - res = execute(Acq.INTEGRATION, Av.CYCLIC, 5) + res = execute(Acq.INTEGRATION, Av.SINGLESHOT, 5) else: res = execute(Acq.RAW, Av.CYCLIC, 5) @@ -21,18 +22,16 @@ def test_polar(result, execute): np.testing.assert_equal(np.unwrap(np.arctan2(i, q)), phase(res)) -@pytest.mark.parametrize("state", [0, 1]) -def test_state_probability(state): +def test_probability(execute): """Testing raw_probability method.""" - results = generate_random_state_result(5) - if state == 0: - target_dict = {"probability": results.probability(0)} - else: - target_dict = {"probability": results.probability(1)} + res = execute(Acq.DISCRIMINATION, Av.SINGLESHOT, 1000) + prob = probability(res) - assert np.allclose( - target_dict["probability"], results.probability(state=state), atol=1e-08 - ) + # unless the result is exactly 0, there is no need for the absolute value + # and when its close to 0, the absolute tolerance is preventing the possible error + # due to floating point operations + assert prob == approx(1 - np.mean(res, axis=0)) + assert probability(res, 1) == approx(1 - prob) @pytest.mark.parametrize("average", [True, False]) From 2296babcf26aaaac3a3c3f93dc2298aabb50821f Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 5 Aug 2024 20:05:56 +0200 Subject: [PATCH 0385/1006] test: Remove serialization tests, since the feature is not needed any longer --- tests/test_result.py | 73 -------------------------------------------- 1 file changed, 73 deletions(-) diff --git a/tests/test_result.py b/tests/test_result.py index db021553de..0aec37676e 100644 --- a/tests/test_result.py +++ b/tests/test_result.py @@ -32,76 +32,3 @@ def test_probability(execute): # due to floating point operations assert prob == approx(1 - np.mean(res, axis=0)) assert probability(res, 1) == approx(1 - prob) - - -@pytest.mark.parametrize("average", [True, False]) -@pytest.mark.parametrize("result", ["iq", "raw"]) -def test_serialize(average, result): - """Testing to_dict method.""" - if not average: - if result == "iq": - results = generate_random_iq_result(5) - else: - results = generate_random_raw_result(5) - output = results.serialize - target_dict = { - "MSR[V]": results.magnitude, - "i[V]": results.voltage_i, - "q[V]": results.voltage_q, - "phase[rad]": results.phase, - } - assert output.keys() == target_dict.keys() - for key in output: - np.testing.assert_equal(output[key], target_dict[key].flatten()) - else: - if result == "iq": - results = generate_random_avg_iq_result(5) - else: - results = generate_random_avg_iq_result(5) - output = results.serialize - avg = results - target_dict = { - "MSR[V]": np.sqrt(avg.voltage_i**2 + avg.voltage_q**2), - "i[V]": avg.voltage_i, - "q[V]": avg.voltage_q, - "phase[rad]": np.unwrap(np.arctan2(avg.voltage_i, avg.voltage_q)), - } - assert avg.serialize.keys() == target_dict.keys() - for key in output: - np.testing.assert_equal(avg.serialize[key], target_dict[key].flatten()) - - -@pytest.mark.parametrize("average", [True, False]) -def test_serialize_state(average): - """Testing to_dict method.""" - if not average: - results = generate_random_state_result(5) - output = results.serialize - target_dict = { - "0": abs(1 - np.mean(results.samples, axis=0)), - } - assert output.keys() == target_dict.keys() - for key in output: - np.testing.assert_equal(output[key], target_dict[key].flatten()) - else: - results = generate_random_avg_state_result(5) - assert len(results.serialize["0"]) == 125 - - -@pytest.mark.parametrize("result", ["iq", "raw"]) -def test_serialize_averaged_iq_results(result): - """Testing to_dict method.""" - if result == "iq": - results = generate_random_avg_iq_result(5) - else: - results = generate_random_avg_raw_result(5) - output = results.serialize - target_dict = { - "MSR[V]": np.sqrt(results.voltage_i**2 + results.voltage_q**2), - "i[V]": results.voltage_i, - "q[V]": results.voltage_q, - "phase[rad]": np.unwrap(np.arctan2(results.voltage_i, results.voltage_q)), - } - assert output.keys() == target_dict.keys() - for key in output: - np.testing.assert_equal(output[key], target_dict[key].flatten()) From 6fcc445a3e8d342acfc530ad41ae338d6d909a3a Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 6 Aug 2024 00:15:10 +0200 Subject: [PATCH 0386/1006] docs: Fix reference to renamed function Co-authored-by: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> --- src/qibolab/result.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibolab/result.py b/src/qibolab/result.py index a8b918f75c..86bc13f8c4 100644 --- a/src/qibolab/result.py +++ b/src/qibolab/result.py @@ -19,7 +19,7 @@ def _lift(values: IQ) -> npt.NDArray: def _sink(values: npt.NDArray) -> IQ: """Transpose the outermost dimension to the innermost. - Inverse of :func:`_transpose`. + Inverse of :func:`_lift`. """ return np.transpose(values, [*range(1, values.ndim), 0]) From 90ce6dd1e9636a9034bc2cb45be1cbbd91dce60b Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 6 Aug 2024 11:54:48 +0200 Subject: [PATCH 0387/1006] feat: Extend id attribution to all pulse-like objects --- src/qibolab/pulses/pulse.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index c2b8259e95..f722c50a28 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -27,7 +27,13 @@ class PulseType(Enum): VIRTUALZ = "vz" -class Pulse(Model): +class _PulseLike(Model): + @property + def id(self) -> int: + return id(self) + + +class Pulse(_PulseLike): """A pulse to be sent to the QPU.""" duration: float @@ -61,10 +67,6 @@ def flux(cls, **kwargs): kwargs["type"] = PulseType.FLUX return cls(**kwargs) - @property - def id(self) -> int: - return id(self) - def i(self, sampling_rate: float) -> Waveform: """The envelope waveform of the i component of the pulse.""" samples = int(self.duration * sampling_rate) @@ -103,7 +105,7 @@ def __hash__(self): ) -class Delay(Model): +class Delay(_PulseLike): """A wait instruction during which we are not sending any pulses to the QPU.""" @@ -113,7 +115,7 @@ class Delay(Model): """Type fixed to ``DELAY`` to comply with ``Pulse`` interface.""" -class VirtualZ(Model): +class VirtualZ(_PulseLike): """Implementation of Z-rotations using virtual phase.""" phase: float From 9fceaf3896f1a3bd48f208058fc8f01ea597ba71 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 6 Aug 2024 12:13:52 +0200 Subject: [PATCH 0388/1006] test: Fix dummy tests --- tests/test_dummy.py | 76 +++++++++++++++++++++++++++------------------ 1 file changed, 46 insertions(+), 30 deletions(-) diff --git a/tests/test_dummy.py b/tests/test_dummy.py index f55dcda390..1b45931e1c 100644 --- a/tests/test_dummy.py +++ b/tests/test_dummy.py @@ -38,11 +38,9 @@ def test_dummy_execute_pulse_sequence(name, acquisition): options = ExecutionParameters(nshots=100, acquisition_type=acquisition) result = platform.execute([sequence], options) if acquisition is AcquisitionType.INTEGRATION: - assert result[probe_pulse.id][0].magnitude.shape == (nshots,) + assert result[probe_pulse.id][0].shape == (nshots, 2) elif acquisition is AcquisitionType.RAW: - assert result[probe_pulse.id][0].magnitude.shape == ( - nshots * probe_seq.duration, - ) + assert result[probe_pulse.id][0].shape == (nshots, int(probe_seq.duration), 2) def test_dummy_execute_coupler_pulse(): @@ -132,8 +130,8 @@ def test_dummy_single_sweep_raw(name): ) results = platform.execute([sequence], options, [[sweeper]]) assert pulse.id in results - shape = results[pulse.id][0].magnitude.shape - assert shape == (pulse.duration * SWEPT_POINTS,) + shape = results[pulse.id][0].shape + assert shape == (SWEPT_POINTS, int(pulse.duration), 2) @pytest.mark.parametrize("fast_reset", [True, False]) @@ -182,17 +180,22 @@ def test_dummy_single_sweep_coupler( assert probe_pulse.id in results if average: results_shape = ( - results[probe_pulse.id][0].magnitude.shape + results[probe_pulse.id][0].shape if acquisition is AcquisitionType.INTEGRATION - else results[probe_pulse.id][0].statistical_frequency.shape + else results[probe_pulse.id][0].shape ) else: results_shape = ( - results[probe_pulse.id][0].magnitude.shape + results[probe_pulse.id][0].shape if acquisition is AcquisitionType.INTEGRATION - else results[probe_pulse.id][0].samples.shape + else results[probe_pulse.id][0].shape ) - assert results_shape == (SWEPT_POINTS,) if average else (nshots, SWEPT_POINTS) + expected_shape = (SWEPT_POINTS,) + if not average: + expected_shape = (nshots,) + expected_shape + if acquisition is not AcquisitionType.DISCRIMINATION: + expected_shape += (2,) + assert results_shape == expected_shape @pytest.mark.parametrize("name", PLATFORM_NAMES) @@ -234,17 +237,23 @@ def test_dummy_single_sweep(name, fast_reset, parameter, average, acquisition, n assert pulse.id in results if average: results_shape = ( - results[pulse.id][0].magnitude.shape + results[pulse.id][0].shape if acquisition is AcquisitionType.INTEGRATION - else results[pulse.id][0].statistical_frequency.shape + else results[pulse.id][0].shape ) else: results_shape = ( - results[pulse.id][0].magnitude.shape + results[pulse.id][0].shape if acquisition is AcquisitionType.INTEGRATION - else results[pulse.id][0].samples.shape + else results[pulse.id][0].shape ) - assert results_shape == (SWEPT_POINTS,) if average else (nshots, SWEPT_POINTS) + + expected_shape = (SWEPT_POINTS,) + if not average: + expected_shape = (nshots,) + expected_shape + if acquisition is not AcquisitionType.DISCRIMINATION: + expected_shape += (2,) + assert results_shape == expected_shape @pytest.mark.parametrize("name", PLATFORM_NAMES) @@ -305,22 +314,23 @@ def test_dummy_double_sweep(name, parameter1, parameter2, average, acquisition, if average: results_shape = ( - results[probe_pulse.id][0].magnitude.shape + results[probe_pulse.id][0].shape if acquisition is AcquisitionType.INTEGRATION - else results[probe_pulse.id][0].statistical_frequency.shape + else results[probe_pulse.id][0].shape ) else: results_shape = ( - results[probe_pulse.id][0].magnitude.shape + results[probe_pulse.id][0].shape if acquisition is AcquisitionType.INTEGRATION - else results[probe_pulse.id][0].samples.shape + else results[probe_pulse.id][0].shape ) - assert ( - results_shape == (SWEPT_POINTS, SWEPT_POINTS) - if average - else (nshots, SWEPT_POINTS, SWEPT_POINTS) - ) + expected_shape = (SWEPT_POINTS, SWEPT_POINTS) + if not average: + expected_shape = (nshots,) + expected_shape + if acquisition is not AcquisitionType.DISCRIMINATION: + expected_shape += (2,) + assert results_shape == expected_shape @pytest.mark.parametrize("name", PLATFORM_NAMES) @@ -369,17 +379,23 @@ def test_dummy_single_sweep_multiplex(name, parameter, average, acquisition, nsh assert pulse.id in results if average: results_shape = ( - results[pulse.id][0].magnitude.shape + results[pulse.id][0].shape if acquisition is AcquisitionType.INTEGRATION - else results[pulse.id][0].statistical_frequency.shape + else results[pulse.id][0].shape ) else: results_shape = ( - results[pulse.id][0].magnitude.shape + results[pulse.id][0].shape if acquisition is AcquisitionType.INTEGRATION - else results[pulse.id][0].samples.shape + else results[pulse.id][0].shape ) - assert results_shape == (SWEPT_POINTS,) if average else (nshots, SWEPT_POINTS) + + expected_shape = (SWEPT_POINTS,) + if not average: + expected_shape = (nshots,) + expected_shape + if acquisition is not AcquisitionType.DISCRIMINATION: + expected_shape += (2,) + assert results_shape == expected_shape # TODO: add test_dummy_double_sweep_multiplex From b481352c74b6f50f8a0a7dd7c8b748b243033fda Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 6 Aug 2024 12:47:58 +0200 Subject: [PATCH 0389/1006] test: Generalize execute fixture to accept custom sweepers --- tests/conftest.py | 31 ++++++++++++++-------------- tests/test_result_shapes.py | 41 +++++++++++++++++++------------------ 2 files changed, 37 insertions(+), 35 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index c8bca6781a..50dce1a4e4 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,6 +1,7 @@ import os import pathlib from collections.abc import Callable +from typing import Optional import numpy as np import numpy.typing as npt @@ -15,7 +16,7 @@ ) from qibolab.platform.load import PLATFORMS from qibolab.pulses import PulseSequence -from qibolab.sweeper import Parameter, Sweeper +from qibolab.sweeper import ParallelSweepers, Parameter, Sweeper ORIGINAL_PLATFORMS = os.environ.get(PLATFORMS, "") TESTING_PLATFORM_NAMES = [ # FIXME: uncomment platforms as they get upgraded to 0.2 @@ -126,7 +127,9 @@ def connected_platform(request): platform.disconnect() -Execution = Callable[[AcquisitionType, AveragingMode, bool], npt.NDArray] +Execution = Callable[ + [AcquisitionType, AveragingMode, int, Optional[list[ParallelSweepers]]], npt.NDArray +] @pytest.fixture @@ -134,9 +137,15 @@ def execute(connected_platform: Platform) -> Execution: def wrapped( acquisition_type: AcquisitionType, averaging_mode: AveragingMode, - sweep: bool = False, nshots: int = 1000, + sweepers: Optional[list[ParallelSweepers]] = None, ) -> npt.NDArray: + options = ExecutionParameters( + nshots=nshots, + acquisition_type=acquisition_type, + averaging_mode=averaging_mode, + ) + qubit = next(iter(connected_platform.qubits.values())) qd_seq = qubit.native_gates.RX.create_sequence() @@ -145,22 +154,14 @@ def wrapped( sequence = PulseSequence() sequence.extend(qd_seq) sequence.extend(probe_seq) - - options = ExecutionParameters( - nshots=nshots, - acquisition_type=acquisition_type, - averaging_mode=averaging_mode, - ) - if sweep: + if sweepers is None: amp_values = np.arange(0.01, 0.06, 0.01) freq_values = np.arange(-4e6, 4e6, 1e6) sweeper1 = Sweeper(Parameter.bias, amp_values, channels=[qubit.flux.name]) sweeper2 = Sweeper(Parameter.amplitude, freq_values, pulses=[probe_pulse]) - results = connected_platform.execute( - [sequence], options, [[sweeper1], [sweeper2]] - ) - else: - results = connected_platform.execute([sequence], options) + sweepers = [[sweeper1], [sweeper2]] + + results = connected_platform.execute([sequence], options, sweepers) return results[probe_pulse.id][0] return wrapped diff --git a/tests/test_result_shapes.py b/tests/test_result_shapes.py index e52480e4b3..96d54a119e 100644 --- a/tests/test_result_shapes.py +++ b/tests/test_result_shapes.py @@ -8,37 +8,38 @@ NSWEEP2 = 8 -@pytest.mark.parametrize("sweep", [False, True]) +@pytest.fixture(params=[False, True]) +def sweep(request): + return None if request.param else [] + + def test_discrimination_singleshot(execute, sweep): - result = execute(Acq.DISCRIMINATION, Av.SINGLESHOT, sweep, NSHOTS) - if sweep: - assert result.shape == (NSHOTS, NSWEEP1, NSWEEP2) - else: + result = execute(Acq.DISCRIMINATION, Av.SINGLESHOT, NSHOTS, sweep) + if sweep == []: assert result.shape == (NSHOTS,) + else: + assert result.shape == (NSHOTS, NSWEEP1, NSWEEP2) -@pytest.mark.parametrize("sweep", [False, True]) def test_discrimination_cyclic(execute, sweep): - result = execute(Acq.DISCRIMINATION, Av.CYCLIC, sweep, NSHOTS) - if sweep: - assert result.shape == (NSWEEP1, NSWEEP2) - else: + result = execute(Acq.DISCRIMINATION, Av.CYCLIC, NSHOTS, sweep) + if sweep == []: assert result.shape == tuple() + else: + assert result.shape == (NSWEEP1, NSWEEP2) -@pytest.mark.parametrize("sweep", [False, True]) def test_integration_singleshot(execute, sweep): - result = execute(Acq.INTEGRATION, Av.SINGLESHOT, sweep, NSHOTS) - if sweep: - assert result.shape == (NSHOTS, NSWEEP1, NSWEEP2, 2) - else: + result = execute(Acq.INTEGRATION, Av.SINGLESHOT, NSHOTS, sweep) + if sweep == []: assert result.shape == (NSHOTS, 2) + else: + assert result.shape == (NSHOTS, NSWEEP1, NSWEEP2, 2) -@pytest.mark.parametrize("sweep", [False, True]) def test_integration_cyclic(execute, sweep): - result = execute(Acq.INTEGRATION, Av.CYCLIC, sweep, NSHOTS) - if sweep: - assert result.shape == (NSWEEP1, NSWEEP2, 2) - else: + result = execute(Acq.INTEGRATION, Av.CYCLIC, NSHOTS, sweep) + if sweep == []: assert result.shape == (2,) + else: + assert result.shape == (NSWEEP1, NSWEEP2, 2) From 4e8b2b38db8cc7a4ee47dddc9c494be85c8e0b2f Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 6 Aug 2024 12:50:54 +0200 Subject: [PATCH 0390/1006] test: Generalize execute fixture to accept custom sequence --- tests/conftest.py | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 50dce1a4e4..e3d8db802e 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -139,6 +139,8 @@ def wrapped( averaging_mode: AveragingMode, nshots: int = 1000, sweepers: Optional[list[ParallelSweepers]] = None, + sequence: Optional[PulseSequence] = None, + target: Optional[tuple[int, int]] = None, ) -> npt.NDArray: options = ExecutionParameters( nshots=nshots, @@ -148,21 +150,32 @@ def wrapped( qubit = next(iter(connected_platform.qubits.values())) - qd_seq = qubit.native_gates.RX.create_sequence() - probe_seq = qubit.native_gates.MZ.create_sequence() - probe_pulse = next(iter(probe_seq.values()))[0] - sequence = PulseSequence() - sequence.extend(qd_seq) - sequence.extend(probe_seq) - if sweepers is None: - amp_values = np.arange(0.01, 0.06, 0.01) - freq_values = np.arange(-4e6, 4e6, 1e6) - sweeper1 = Sweeper(Parameter.bias, amp_values, channels=[qubit.flux.name]) - sweeper2 = Sweeper(Parameter.amplitude, freq_values, pulses=[probe_pulse]) - sweepers = [[sweeper1], [sweeper2]] + if sequence is None: + qd_seq = qubit.native_gates.RX.create_sequence() + probe_seq = qubit.native_gates.MZ.create_sequence() + probe_pulse = next(iter(probe_seq.values()))[0] + sequence = PulseSequence() + sequence.extend(qd_seq) + sequence.extend(probe_seq) + if sweepers is None: + amp_values = np.arange(0.01, 0.06, 0.01) + freq_values = np.arange(-4e6, 4e6, 1e6) + sweeper1 = Sweeper( + Parameter.bias, amp_values, channels=[qubit.flux.name] + ) + sweeper2 = Sweeper( + Parameter.amplitude, freq_values, pulses=[probe_pulse] + ) + sweepers = [[sweeper1], [sweeper2]] + if target is None: + target = (probe_pulse.id, 0) + + # default target and sweepers only supported for default sequence + assert target is not None + assert sweepers is not None results = connected_platform.execute([sequence], options, sweepers) - return results[probe_pulse.id][0] + return results[target[0]][target[1]] return wrapped From 4d55de3220c961027b3f35936b1f8f9d709b784b Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 6 Aug 2024 12:58:21 +0200 Subject: [PATCH 0391/1006] feat: Add average property to averaging mode enum --- src/qibolab/execution_parameters.py | 5 +++++ tests/test_dummy.py | 24 +++++++++--------------- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/qibolab/execution_parameters.py b/src/qibolab/execution_parameters.py index 9e2dd8b4a7..dc2aead43a 100644 --- a/src/qibolab/execution_parameters.py +++ b/src/qibolab/execution_parameters.py @@ -29,6 +29,11 @@ class AveragingMode(Enum): SEQUENTIAL = auto() """SEQUENTIAL: Worse averaging for noise[Avoid]""" + @property + def average(self) -> bool: + """Whether an average is performed or not.""" + return self is not AveragingMode.SINGLESHOT + ConfigUpdate = dict[str, dict[str, Any]] """Update for component configs. diff --git a/tests/test_dummy.py b/tests/test_dummy.py index 1b45931e1c..71f26f1d43 100644 --- a/tests/test_dummy.py +++ b/tests/test_dummy.py @@ -174,11 +174,10 @@ def test_dummy_single_sweep_coupler( acquisition_type=acquisition, fast_reset=fast_reset, ) - average = not options.averaging_mode is AveragingMode.SINGLESHOT results = platform.execute([sequence], options, [[sweeper]]) assert probe_pulse.id in results - if average: + if not options.averaging_mode.average: results_shape = ( results[probe_pulse.id][0].shape if acquisition is AcquisitionType.INTEGRATION @@ -190,8 +189,9 @@ def test_dummy_single_sweep_coupler( if acquisition is AcquisitionType.INTEGRATION else results[probe_pulse.id][0].shape ) + expected_shape = (SWEPT_POINTS,) - if not average: + if not options.averaging_mode.average: expected_shape = (nshots,) + expected_shape if acquisition is not AcquisitionType.DISCRIMINATION: expected_shape += (2,) @@ -231,11 +231,10 @@ def test_dummy_single_sweep(name, fast_reset, parameter, average, acquisition, n acquisition_type=acquisition, fast_reset=fast_reset, ) - average = not options.averaging_mode is AveragingMode.SINGLESHOT results = platform.execute([sequence], options, [[sweeper]]) assert pulse.id in results - if average: + if options.averaging_mode.average: results_shape = ( results[pulse.id][0].shape if acquisition is AcquisitionType.INTEGRATION @@ -249,7 +248,7 @@ def test_dummy_single_sweep(name, fast_reset, parameter, average, acquisition, n ) expected_shape = (SWEPT_POINTS,) - if not average: + if not options.averaging_mode.average: expected_shape = (nshots,) + expected_shape if acquisition is not AcquisitionType.DISCRIMINATION: expected_shape += (2,) @@ -307,12 +306,11 @@ def test_dummy_double_sweep(name, parameter1, parameter2, average, acquisition, averaging_mode=average, acquisition_type=acquisition, ) - average = not options.averaging_mode is AveragingMode.SINGLESHOT results = platform.execute([sequence], options, [[sweeper1], [sweeper2]]) assert probe_pulse.id in results - if average: + if options.averaging_mode.average: results_shape = ( results[probe_pulse.id][0].shape if acquisition is AcquisitionType.INTEGRATION @@ -326,7 +324,7 @@ def test_dummy_double_sweep(name, parameter1, parameter2, average, acquisition, ) expected_shape = (SWEPT_POINTS, SWEPT_POINTS) - if not average: + if not options.averaging_mode.average: expected_shape = (nshots,) + expected_shape if acquisition is not AcquisitionType.DISCRIMINATION: expected_shape += (2,) @@ -372,12 +370,11 @@ def test_dummy_single_sweep_multiplex(name, parameter, average, acquisition, nsh averaging_mode=average, acquisition_type=acquisition, ) - average = not options.averaging_mode is AveragingMode.SINGLESHOT results = platform.execute([sequence], options, [[sweeper1]]) for pulse in probe_pulses.values(): assert pulse.id in results - if average: + if not options.averaging_mode.average: results_shape = ( results[pulse.id][0].shape if acquisition is AcquisitionType.INTEGRATION @@ -391,11 +388,8 @@ def test_dummy_single_sweep_multiplex(name, parameter, average, acquisition, nsh ) expected_shape = (SWEPT_POINTS,) - if not average: + if not options.averaging_mode.average: expected_shape = (nshots,) + expected_shape if acquisition is not AcquisitionType.DISCRIMINATION: expected_shape += (2,) assert results_shape == expected_shape - - -# TODO: add test_dummy_double_sweep_multiplex From 7d68c2101df87d3a0dd5f1355a38d71ce385cee2 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 6 Aug 2024 13:07:29 +0200 Subject: [PATCH 0392/1006] docs: Fix doctests for results' classes removal --- doc/source/getting-started/experiment.rst | 3 ++- doc/source/tutorials/calibration.rst | 14 ++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/doc/source/getting-started/experiment.rst b/doc/source/getting-started/experiment.rst index cd4c4d244a..d9afda70be 100644 --- a/doc/source/getting-started/experiment.rst +++ b/doc/source/getting-started/experiment.rst @@ -242,6 +242,7 @@ We leave to the dedicated tutorial a full explanation of the experiment, but her from qibolab import create_platform from qibolab.pulses import PulseSequence + from qibolab.result import magnitude from qibolab.sweeper import Sweeper, SweeperType, Parameter from qibolab.execution_parameters import ( ExecutionParameters, @@ -276,7 +277,7 @@ We leave to the dedicated tutorial a full explanation of the experiment, but her probe_pulse = next(iter(sequence.probe_pulses)) # plot the results - amplitudes = results[probe_pulse.id][0].magnitude + amplitudes = magnitude(results[probe_pulse.id][0]) frequencies = np.arange(-2e8, +2e8, 1e6) + platform.config(qubit.probe.name).frequency plt.title("Resonator Spectroscopy") diff --git a/doc/source/tutorials/calibration.rst b/doc/source/tutorials/calibration.rst index 6d699ed788..b053b16758 100644 --- a/doc/source/tutorials/calibration.rst +++ b/doc/source/tutorials/calibration.rst @@ -31,6 +31,7 @@ around the pre-defined frequency. import numpy as np from qibolab import create_platform from qibolab.pulses import PulseSequence + from qibolab.result import magnitude from qibolab.sweeper import Sweeper, SweeperType, Parameter from qibolab.execution_parameters import ( ExecutionParameters, @@ -72,7 +73,7 @@ In few seconds, the experiment will be finished and we can proceed to plot it. import matplotlib.pyplot as plt probe_pulse = next(iter(sequence.probe_pulses)) - amplitudes = results[probe_pulse.id][0].magnitude + amplitudes = magnitude(results[probe_pulse.id][0]) frequencies = np.arange(-2e8, +2e8, 1e6) + platform.config(qubit.probe.name).frequency plt.title("Resonator Spectroscopy") @@ -110,6 +111,7 @@ complex pulse sequence. Therefore with start with that: import matplotlib.pyplot as plt from qibolab import create_platform from qibolab.pulses import Pulse, PulseSequence, Delay, Gaussian + from qibolab.result import magnitude from qibolab.sweeper import Sweeper, SweeperType, Parameter from qibolab.execution_parameters import ( ExecutionParameters, @@ -156,7 +158,7 @@ We can now proceed to launch on hardware: results = platform.execute([sequence], options, [[sweeper]]) probe_pulse = next(iter(sequence.probe_pulses)) - amplitudes = results[probe_pulse.id][0].magnitude + amplitudes = magnitude(results[probe_pulse.id][0]) frequencies = np.arange(-2e8, +2e8, 1e6) + platform.config(qubit.drive.name).frequency plt.title("Resonator Spectroscopy") @@ -208,6 +210,7 @@ and its impact on qubit states in the IQ plane. import matplotlib.pyplot as plt from qibolab import create_platform from qibolab.pulses import PulseSequence, Delay + from qibolab.result import unpack from qibolab.sweeper import Sweeper, SweeperType, Parameter from qibolab.execution_parameters import ( ExecutionParameters, @@ -246,13 +249,12 @@ and its impact on qubit states in the IQ plane. plt.xlabel("I [a.u.]") plt.ylabel("Q [a.u.]") plt.scatter( - results_one[probe_pulse1.id][0].voltage_i, - results_one[probe_pulse1.id][0].voltage_q, + results_one[probe_pulse1.id][0], + results_one[probe_pulse1.id][0], label="One state", ) plt.scatter( - results_zero[probe_pulse2.id][0].voltage_i, - results_zero[probe_pulse2.id][0].voltage_q, + *unpack(results_zero[probe_pulse2.id][0]), label="Zero state", ) plt.show() From ef11044e180ad016ba5b8eee4f0b3ccfd1adaca2 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 6 Aug 2024 13:09:17 +0200 Subject: [PATCH 0393/1006] fix: Use tuples instead of lists, to avoid conversion --- src/qibolab/execution_parameters.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/qibolab/execution_parameters.py b/src/qibolab/execution_parameters.py index dc2aead43a..f9117f32b5 100644 --- a/src/qibolab/execution_parameters.py +++ b/src/qibolab/execution_parameters.py @@ -76,13 +76,15 @@ def results_shape( ) -> tuple[int, ...]: """Compute the expected shape for collected data.""" - shots = [self.nshots] if self.averaging_mode is AveragingMode.SINGLESHOT else [] - sweeps = [ + shots = ( + (self.nshots,) if self.averaging_mode is AveragingMode.SINGLESHOT else () + ) + sweeps = tuple( min(len(sweep.values) for sweep in parsweeps) for parsweeps in sweepers - ] + ) inner = { - AcquisitionType.DISCRIMINATION: [], - AcquisitionType.INTEGRATION: [2], - AcquisitionType.RAW: [samples, 2], + AcquisitionType.DISCRIMINATION: (), + AcquisitionType.INTEGRATION: (2,), + AcquisitionType.RAW: (samples, 2), }[self.acquisition_type] - return tuple(shots + sweeps + inner) + return shots + sweeps + inner From 69264c323e83e635093c3df3d3e96516e6990530 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 6 Aug 2024 14:31:16 +0200 Subject: [PATCH 0394/1006] fix: Replace explicit graph topology with a derived list --- src/qibolab/platform/platform.py | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index edda234ccd..afe2ca74dd 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -6,7 +6,6 @@ from math import prod from typing import Any, Dict, List, Optional, Tuple, TypeVar -import networkx as nx import numpy as np from qibo.config import log, raise_error @@ -158,19 +157,11 @@ class Platform: is_connected: bool = False """Flag for whether we are connected to the physical instruments.""" - topology: nx.Graph = field(default_factory=nx.Graph) - """Graph representing the qubit connectivity in the quantum chip.""" - def __post_init__(self): log.info("Loading platform %s", self.name) if self.resonator_type is None: self.resonator_type = "3D" if self.nqubits == 1 else "2D" - self.topology.add_nodes_from(self.qubits.keys()) - self.topology.add_edges_from( - [(pair.qubit1.name, pair.qubit2.name) for pair in self.pairs.values()] - ) - def __str__(self): return self.name @@ -184,6 +175,11 @@ def ordered_pairs(self): """List of qubit pairs that are connected in the QPU.""" return sorted({tuple(sorted(pair)) for pair in self.pairs}) + @property + def topology(self) -> list[QubitPairId]: + """Graph representing the qubit connectivity in the quantum chip.""" + return list(self.pairs) + @property def sampling_rate(self): """Sampling rate of control electronics in giga samples per second From 20b600e9c0b88ab9308b411d450e29c6c1c75c63 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 6 Aug 2024 14:34:38 +0200 Subject: [PATCH 0395/1006] build: Remove networkx as a direct dependency --- poetry.lock | 1798 +++++++++++++++++++++++++----------------------- pyproject.toml | 1 - 2 files changed, 934 insertions(+), 865 deletions(-) diff --git a/poetry.lock b/poetry.lock index 84cc4e3a60..3f72710fde 100644 --- a/poetry.lock +++ b/poetry.lock @@ -103,22 +103,22 @@ test = ["pytest", "uvloop"] [[package]] name = "attrs" -version = "23.2.0" +version = "24.1.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.7" files = [ - {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, - {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, + {file = "attrs-24.1.0-py3-none-any.whl", hash = "sha256:377b47448cb61fea38533f671fba0d0f8a96fd58facd4dc518e3dac9dbea0905"}, + {file = "attrs-24.1.0.tar.gz", hash = "sha256:adbdec84af72d38be7628e353a09b6a6790d15cd71819f6e9d7b0faa8a125745"}, ] [package.extras] -cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -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-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] -tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] +benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] [[package]] name = "azure-core" @@ -280,24 +280,24 @@ test = ["black (>=22.3.0)", "coverage[toml] (>=6.2)", "hypothesis (>=5.49.0)", " [[package]] name = "cachetools" -version = "5.3.3" +version = "5.4.0" description = "Extensible memoizing collections and decorators" optional = false python-versions = ">=3.7" files = [ - {file = "cachetools-5.3.3-py3-none-any.whl", hash = "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945"}, - {file = "cachetools-5.3.3.tar.gz", hash = "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105"}, + {file = "cachetools-5.4.0-py3-none-any.whl", hash = "sha256:3ae3b49a3d5e28a77a0be2b37dbcb89005058959cb2323858c2657c4a8cab474"}, + {file = "cachetools-5.4.0.tar.gz", hash = "sha256:b8adc2e7c07f105ced7bc56dbb6dfbe7c4a00acce20e2227b3f355be89bc6827"}, ] [[package]] name = "certifi" -version = "2024.6.2" +version = "2024.7.4" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.6.2-py3-none-any.whl", hash = "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"}, - {file = "certifi-2024.6.2.tar.gz", hash = "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516"}, + {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, + {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, ] [[package]] @@ -490,13 +490,13 @@ files = [ [[package]] name = "cma" -version = "3.3.0" +version = "3.4.0" description = "CMA-ES, Covariance Matrix Adaptation Evolution Strategy for non-linear numerical optimization in Python" optional = false python-versions = "*" files = [ - {file = "cma-3.3.0-py3-none-any.whl", hash = "sha256:5cc571b1e2068fcf1c538be36f8f3a870107456fed22ce81c1345a96329e61db"}, - {file = "cma-3.3.0.tar.gz", hash = "sha256:b748b8e03f4e7ae816157d7b9bb2fc6b1fb2fee1d5fd3399329b646bb75861ec"}, + {file = "cma-3.4.0-py3-none-any.whl", hash = "sha256:4140e490cc4e68cf8c7b1114e079c0561c9b78b1bf9ec69362c20865636ae5ca"}, + {file = "cma-3.4.0.tar.gz", hash = "sha256:a1ebd969b99871be3715d5a24b7bf54cf04ea94e80d6b8536d7147620dd10f6c"}, ] [package.dependencies] @@ -613,63 +613,83 @@ test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] [[package]] name = "coverage" -version = "7.5.4" +version = "7.6.1" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6cfb5a4f556bb51aba274588200a46e4dd6b505fb1a5f8c5ae408222eb416f99"}, - {file = "coverage-7.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2174e7c23e0a454ffe12267a10732c273243b4f2d50d07544a91198f05c48f47"}, - {file = "coverage-7.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2214ee920787d85db1b6a0bd9da5f8503ccc8fcd5814d90796c2f2493a2f4d2e"}, - {file = "coverage-7.5.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1137f46adb28e3813dec8c01fefadcb8c614f33576f672962e323b5128d9a68d"}, - {file = "coverage-7.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b385d49609f8e9efc885790a5a0e89f2e3ae042cdf12958b6034cc442de428d3"}, - {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b4a474f799456e0eb46d78ab07303286a84a3140e9700b9e154cfebc8f527016"}, - {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5cd64adedf3be66f8ccee418473c2916492d53cbafbfcff851cbec5a8454b136"}, - {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e564c2cf45d2f44a9da56f4e3a26b2236504a496eb4cb0ca7221cd4cc7a9aca9"}, - {file = "coverage-7.5.4-cp310-cp310-win32.whl", hash = "sha256:7076b4b3a5f6d2b5d7f1185fde25b1e54eb66e647a1dfef0e2c2bfaf9b4c88c8"}, - {file = "coverage-7.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:018a12985185038a5b2bcafab04ab833a9a0f2c59995b3cec07e10074c78635f"}, - {file = "coverage-7.5.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:db14f552ac38f10758ad14dd7b983dbab424e731588d300c7db25b6f89e335b5"}, - {file = "coverage-7.5.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3257fdd8e574805f27bb5342b77bc65578e98cbc004a92232106344053f319ba"}, - {file = "coverage-7.5.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a6612c99081d8d6134005b1354191e103ec9705d7ba2754e848211ac8cacc6b"}, - {file = "coverage-7.5.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d45d3cbd94159c468b9b8c5a556e3f6b81a8d1af2a92b77320e887c3e7a5d080"}, - {file = "coverage-7.5.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed550e7442f278af76d9d65af48069f1fb84c9f745ae249c1a183c1e9d1b025c"}, - {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7a892be37ca35eb5019ec85402c3371b0f7cda5ab5056023a7f13da0961e60da"}, - {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8192794d120167e2a64721d88dbd688584675e86e15d0569599257566dec9bf0"}, - {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:820bc841faa502e727a48311948e0461132a9c8baa42f6b2b84a29ced24cc078"}, - {file = "coverage-7.5.4-cp311-cp311-win32.whl", hash = "sha256:6aae5cce399a0f065da65c7bb1e8abd5c7a3043da9dceb429ebe1b289bc07806"}, - {file = "coverage-7.5.4-cp311-cp311-win_amd64.whl", hash = "sha256:d2e344d6adc8ef81c5a233d3a57b3c7d5181f40e79e05e1c143da143ccb6377d"}, - {file = "coverage-7.5.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:54317c2b806354cbb2dc7ac27e2b93f97096912cc16b18289c5d4e44fc663233"}, - {file = "coverage-7.5.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:042183de01f8b6d531e10c197f7f0315a61e8d805ab29c5f7b51a01d62782747"}, - {file = "coverage-7.5.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6bb74ed465d5fb204b2ec41d79bcd28afccf817de721e8a807d5141c3426638"}, - {file = "coverage-7.5.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3d45ff86efb129c599a3b287ae2e44c1e281ae0f9a9bad0edc202179bcc3a2e"}, - {file = "coverage-7.5.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5013ed890dc917cef2c9f765c4c6a8ae9df983cd60dbb635df8ed9f4ebc9f555"}, - {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1014fbf665fef86cdfd6cb5b7371496ce35e4d2a00cda501cf9f5b9e6fced69f"}, - {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3684bc2ff328f935981847082ba4fdc950d58906a40eafa93510d1b54c08a66c"}, - {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:581ea96f92bf71a5ec0974001f900db495488434a6928a2ca7f01eee20c23805"}, - {file = "coverage-7.5.4-cp312-cp312-win32.whl", hash = "sha256:73ca8fbc5bc622e54627314c1a6f1dfdd8db69788f3443e752c215f29fa87a0b"}, - {file = "coverage-7.5.4-cp312-cp312-win_amd64.whl", hash = "sha256:cef4649ec906ea7ea5e9e796e68b987f83fa9a718514fe147f538cfeda76d7a7"}, - {file = "coverage-7.5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdd31315fc20868c194130de9ee6bfd99755cc9565edff98ecc12585b90be882"}, - {file = "coverage-7.5.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:02ff6e898197cc1e9fa375581382b72498eb2e6d5fc0b53f03e496cfee3fac6d"}, - {file = "coverage-7.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d05c16cf4b4c2fc880cb12ba4c9b526e9e5d5bb1d81313d4d732a5b9fe2b9d53"}, - {file = "coverage-7.5.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5986ee7ea0795a4095ac4d113cbb3448601efca7f158ec7f7087a6c705304e4"}, - {file = "coverage-7.5.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5df54843b88901fdc2f598ac06737f03d71168fd1175728054c8f5a2739ac3e4"}, - {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ab73b35e8d109bffbda9a3e91c64e29fe26e03e49addf5b43d85fc426dde11f9"}, - {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:aea072a941b033813f5e4814541fc265a5c12ed9720daef11ca516aeacd3bd7f"}, - {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:16852febd96acd953b0d55fc842ce2dac1710f26729b31c80b940b9afcd9896f"}, - {file = "coverage-7.5.4-cp38-cp38-win32.whl", hash = "sha256:8f894208794b164e6bd4bba61fc98bf6b06be4d390cf2daacfa6eca0a6d2bb4f"}, - {file = "coverage-7.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:e2afe743289273209c992075a5a4913e8d007d569a406ffed0bd080ea02b0633"}, - {file = "coverage-7.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b95c3a8cb0463ba9f77383d0fa8c9194cf91f64445a63fc26fb2327e1e1eb088"}, - {file = "coverage-7.5.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3d7564cc09dd91b5a6001754a5b3c6ecc4aba6323baf33a12bd751036c998be4"}, - {file = "coverage-7.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44da56a2589b684813f86d07597fdf8a9c6ce77f58976727329272f5a01f99f7"}, - {file = "coverage-7.5.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e16f3d6b491c48c5ae726308e6ab1e18ee830b4cdd6913f2d7f77354b33f91c8"}, - {file = "coverage-7.5.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbc5958cb471e5a5af41b0ddaea96a37e74ed289535e8deca404811f6cb0bc3d"}, - {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a04e990a2a41740b02d6182b498ee9796cf60eefe40cf859b016650147908029"}, - {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ddbd2f9713a79e8e7242d7c51f1929611e991d855f414ca9996c20e44a895f7c"}, - {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b1ccf5e728ccf83acd313c89f07c22d70d6c375a9c6f339233dcf792094bcbf7"}, - {file = "coverage-7.5.4-cp39-cp39-win32.whl", hash = "sha256:56b4eafa21c6c175b3ede004ca12c653a88b6f922494b023aeb1e836df953ace"}, - {file = "coverage-7.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:65e528e2e921ba8fd67d9055e6b9f9e34b21ebd6768ae1c1723f4ea6ace1234d"}, - {file = "coverage-7.5.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:79b356f3dd5b26f3ad23b35c75dbdaf1f9e2450b6bcefc6d0825ea0aa3f86ca5"}, - {file = "coverage-7.5.4.tar.gz", hash = "sha256:a44963520b069e12789d0faea4e9fdb1e410cdc4aab89d94f7f55cbb7fef0353"}, + {file = "coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16"}, + {file = "coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36"}, + {file = "coverage-7.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02"}, + {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc"}, + {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23"}, + {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34"}, + {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c"}, + {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959"}, + {file = "coverage-7.6.1-cp310-cp310-win32.whl", hash = "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232"}, + {file = "coverage-7.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0"}, + {file = "coverage-7.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93"}, + {file = "coverage-7.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3"}, + {file = "coverage-7.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff"}, + {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d"}, + {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6"}, + {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56"}, + {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234"}, + {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133"}, + {file = "coverage-7.6.1-cp311-cp311-win32.whl", hash = "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c"}, + {file = "coverage-7.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6"}, + {file = "coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778"}, + {file = "coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d"}, + {file = "coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5"}, + {file = "coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb"}, + {file = "coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106"}, + {file = "coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9"}, + {file = "coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c"}, + {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a"}, + {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060"}, + {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862"}, + {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388"}, + {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155"}, + {file = "coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a"}, + {file = "coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129"}, + {file = "coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e"}, + {file = "coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962"}, + {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb"}, + {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704"}, + {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b"}, + {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f"}, + {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223"}, + {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3"}, + {file = "coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f"}, + {file = "coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657"}, + {file = "coverage-7.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0"}, + {file = "coverage-7.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a"}, + {file = "coverage-7.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b"}, + {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3"}, + {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de"}, + {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6"}, + {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569"}, + {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989"}, + {file = "coverage-7.6.1-cp38-cp38-win32.whl", hash = "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7"}, + {file = "coverage-7.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8"}, + {file = "coverage-7.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255"}, + {file = "coverage-7.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8"}, + {file = "coverage-7.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2"}, + {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a"}, + {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc"}, + {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004"}, + {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb"}, + {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36"}, + {file = "coverage-7.6.1-cp39-cp39-win32.whl", hash = "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c"}, + {file = "coverage-7.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca"}, + {file = "coverage-7.6.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df"}, + {file = "coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d"}, ] [package.dependencies] @@ -680,43 +700,38 @@ toml = ["tomli"] [[package]] name = "cryptography" -version = "42.0.8" +version = "43.0.0" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:81d8a521705787afe7a18d5bfb47ea9d9cc068206270aad0b96a725022e18d2e"}, - {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:961e61cefdcb06e0c6d7e3a1b22ebe8b996eb2bf50614e89384be54c48c6b63d"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3ec3672626e1b9e55afd0df6d774ff0e953452886e06e0f1eb7eb0c832e8902"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e599b53fd95357d92304510fb7bda8523ed1f79ca98dce2f43c115950aa78801"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5226d5d21ab681f432a9c1cf8b658c0cb02533eece706b155e5fbd8a0cdd3949"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6b7c4f03ce01afd3b76cf69a5455caa9cfa3de8c8f493e0d3ab7d20611c8dae9"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:2346b911eb349ab547076f47f2e035fc8ff2c02380a7cbbf8d87114fa0f1c583"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ad803773e9df0b92e0a817d22fd8a3675493f690b96130a5e24f1b8fabbea9c7"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2f66d9cd9147ee495a8374a45ca445819f8929a3efcd2e3df6428e46c3cbb10b"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d45b940883a03e19e944456a558b67a41160e367a719833c53de6911cabba2b7"}, - {file = "cryptography-42.0.8-cp37-abi3-win32.whl", hash = "sha256:a0c5b2b0585b6af82d7e385f55a8bc568abff8923af147ee3c07bd8b42cda8b2"}, - {file = "cryptography-42.0.8-cp37-abi3-win_amd64.whl", hash = "sha256:57080dee41209e556a9a4ce60d229244f7a66ef52750f813bfbe18959770cfba"}, - {file = "cryptography-42.0.8-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:dea567d1b0e8bc5764b9443858b673b734100c2871dc93163f58c46a97a83d28"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4783183f7cb757b73b2ae9aed6599b96338eb957233c58ca8f49a49cc32fd5e"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0608251135d0e03111152e41f0cc2392d1e74e35703960d4190b2e0f4ca9c70"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dc0fdf6787f37b1c6b08e6dfc892d9d068b5bdb671198c72072828b80bd5fe4c"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9c0c1716c8447ee7dbf08d6db2e5c41c688544c61074b54fc4564196f55c25a7"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fff12c88a672ab9c9c1cf7b0c80e3ad9e2ebd9d828d955c126be4fd3e5578c9e"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:cafb92b2bc622cd1aa6a1dce4b93307792633f4c5fe1f46c6b97cf67073ec961"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:31f721658a29331f895a5a54e7e82075554ccfb8b163a18719d342f5ffe5ecb1"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b297f90c5723d04bcc8265fc2a0f86d4ea2e0f7ab4b6994459548d3a6b992a14"}, - {file = "cryptography-42.0.8-cp39-abi3-win32.whl", hash = "sha256:2f88d197e66c65be5e42cd72e5c18afbfae3f741742070e3019ac8f4ac57262c"}, - {file = "cryptography-42.0.8-cp39-abi3-win_amd64.whl", hash = "sha256:fa76fbb7596cc5839320000cdd5d0955313696d9511debab7ee7278fc8b5c84a"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ba4f0a211697362e89ad822e667d8d340b4d8d55fae72cdd619389fb5912eefe"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:81884c4d096c272f00aeb1f11cf62ccd39763581645b0812e99a91505fa48e0c"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c9bb2ae11bfbab395bdd072985abde58ea9860ed84e59dbc0463a5d0159f5b71"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7016f837e15b0a1c119d27ecd89b3515f01f90a8615ed5e9427e30d9cdbfed3d"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5a94eccb2a81a309806027e1670a358b99b8fe8bfe9f8d329f27d72c094dde8c"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dec9b018df185f08483f294cae6ccac29e7a6e0678996587363dc352dc65c842"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:343728aac38decfdeecf55ecab3264b015be68fc2816ca800db649607aeee648"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:013629ae70b40af70c9a7a5db40abe5d9054e6f4380e50ce769947b73bf3caad"}, - {file = "cryptography-42.0.8.tar.gz", hash = "sha256:8d09d05439ce7baa8e9e95b07ec5b6c886f548deb7e0f69ef25f64b3bce842f2"}, + {file = "cryptography-43.0.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:64c3f16e2a4fc51c0d06af28441881f98c5d91009b8caaff40cf3548089e9c74"}, + {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3dcdedae5c7710b9f97ac6bba7e1052b95c7083c9d0e9df96e02a1932e777895"}, + {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d9a1eca329405219b605fac09ecfc09ac09e595d6def650a437523fcd08dd22"}, + {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ea9e57f8ea880eeea38ab5abf9fbe39f923544d7884228ec67d666abd60f5a47"}, + {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9a8d6802e0825767476f62aafed40532bd435e8a5f7d23bd8b4f5fd04cc80ecf"}, + {file = "cryptography-43.0.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:cc70b4b581f28d0a254d006f26949245e3657d40d8857066c2ae22a61222ef55"}, + {file = "cryptography-43.0.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4a997df8c1c2aae1e1e5ac49c2e4f610ad037fc5a3aadc7b64e39dea42249431"}, + {file = "cryptography-43.0.0-cp37-abi3-win32.whl", hash = "sha256:6e2b11c55d260d03a8cf29ac9b5e0608d35f08077d8c087be96287f43af3ccdc"}, + {file = "cryptography-43.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:31e44a986ceccec3d0498e16f3d27b2ee5fdf69ce2ab89b52eaad1d2f33d8778"}, + {file = "cryptography-43.0.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:7b3f5fe74a5ca32d4d0f302ffe6680fcc5c28f8ef0dc0ae8f40c0f3a1b4fca66"}, + {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac1955ce000cb29ab40def14fd1bbfa7af2017cca696ee696925615cafd0dce5"}, + {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:299d3da8e00b7e2b54bb02ef58d73cd5f55fb31f33ebbf33bd00d9aa6807df7e"}, + {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ee0c405832ade84d4de74b9029bedb7b31200600fa524d218fc29bfa371e97f5"}, + {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cb013933d4c127349b3948aa8aaf2f12c0353ad0eccd715ca789c8a0f671646f"}, + {file = "cryptography-43.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fdcb265de28585de5b859ae13e3846a8e805268a823a12a4da2597f1f5afc9f0"}, + {file = "cryptography-43.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2905ccf93a8a2a416f3ec01b1a7911c3fe4073ef35640e7ee5296754e30b762b"}, + {file = "cryptography-43.0.0-cp39-abi3-win32.whl", hash = "sha256:47ca71115e545954e6c1d207dd13461ab81f4eccfcb1345eac874828b5e3eaaf"}, + {file = "cryptography-43.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:0663585d02f76929792470451a5ba64424acc3cd5227b03921dab0e2f27b1709"}, + {file = "cryptography-43.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2c6d112bf61c5ef44042c253e4859b3cbbb50df2f78fa8fae6747a7814484a70"}, + {file = "cryptography-43.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:844b6d608374e7d08f4f6e6f9f7b951f9256db41421917dfb2d003dde4cd6b66"}, + {file = "cryptography-43.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:51956cf8730665e2bdf8ddb8da0056f699c1a5715648c1b0144670c1ba00b48f"}, + {file = "cryptography-43.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:aae4d918f6b180a8ab8bf6511a419473d107df4dbb4225c7b48c5c9602c38c7f"}, + {file = "cryptography-43.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:232ce02943a579095a339ac4b390fbbe97f5b5d5d107f8a08260ea2768be8cc2"}, + {file = "cryptography-43.0.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5bcb8a5620008a8034d39bce21dc3e23735dfdb6a33a06974739bfa04f853947"}, + {file = "cryptography-43.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:08a24a7070b2b6804c1940ff0f910ff728932a9d0e80e7814234269f9d46d069"}, + {file = "cryptography-43.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e9c5266c432a1e23738d178e51c2c7a5e2ddf790f248be939448c0ba2021f9d1"}, + {file = "cryptography-43.0.0.tar.gz", hash = "sha256:b88075ada2d51aa9f18283532c9f60e72170041bba88d7f37e49cbb10275299e"}, ] [package.dependencies] @@ -729,7 +744,7 @@ nox = ["nox"] pep8test = ["check-sdist", "click", "mypy", "ruff"] sdist = ["build"] ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test = ["certifi", "cryptography-vectors (==43.0.0)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] [[package]] @@ -856,13 +871,13 @@ files = [ [[package]] name = "datadog-api-client" -version = "2.25.0" +version = "2.26.0" description = "Collection of all Datadog Public endpoints" optional = false python-versions = ">=3.7" files = [ - {file = "datadog_api_client-2.25.0-py3-none-any.whl", hash = "sha256:c173cd49f8e7832d58b39e8139dc288315f34a724107601b3c62f322aa2ce98b"}, - {file = "datadog_api_client-2.25.0.tar.gz", hash = "sha256:61feed575bd6d6e41439e2942dc7d4d338a3deeb514551dfa35cdedc25053572"}, + {file = "datadog_api_client-2.26.0-py3-none-any.whl", hash = "sha256:47a94516df51bae0c0556a6d6d7a0f43557afb4fef081e00a264aa0483b7f817"}, + {file = "datadog_api_client-2.26.0.tar.gz", hash = "sha256:3f376f1300984cbb2f51b3eceadfbb30c93938cadb5e93e60563781e07d67e6c"}, ] [package.dependencies] @@ -1039,13 +1054,13 @@ files = [ [[package]] name = "exceptiongroup" -version = "1.2.1" +version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, - {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, + {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, + {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, ] [package.extras] @@ -1119,53 +1134,53 @@ dotenv = ["python-dotenv"] [[package]] name = "fonttools" -version = "4.53.0" +version = "4.53.1" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.53.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:52a6e0a7a0bf611c19bc8ec8f7592bdae79c8296c70eb05917fd831354699b20"}, - {file = "fonttools-4.53.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:099634631b9dd271d4a835d2b2a9e042ccc94ecdf7e2dd9f7f34f7daf333358d"}, - {file = "fonttools-4.53.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e40013572bfb843d6794a3ce076c29ef4efd15937ab833f520117f8eccc84fd6"}, - {file = "fonttools-4.53.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:715b41c3e231f7334cbe79dfc698213dcb7211520ec7a3bc2ba20c8515e8a3b5"}, - {file = "fonttools-4.53.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74ae2441731a05b44d5988d3ac2cf784d3ee0a535dbed257cbfff4be8bb49eb9"}, - {file = "fonttools-4.53.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:95db0c6581a54b47c30860d013977b8a14febc206c8b5ff562f9fe32738a8aca"}, - {file = "fonttools-4.53.0-cp310-cp310-win32.whl", hash = "sha256:9cd7a6beec6495d1dffb1033d50a3f82dfece23e9eb3c20cd3c2444d27514068"}, - {file = "fonttools-4.53.0-cp310-cp310-win_amd64.whl", hash = "sha256:daaef7390e632283051e3cf3e16aff2b68b247e99aea916f64e578c0449c9c68"}, - {file = "fonttools-4.53.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a209d2e624ba492df4f3bfad5996d1f76f03069c6133c60cd04f9a9e715595ec"}, - {file = "fonttools-4.53.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4f520d9ac5b938e6494f58a25c77564beca7d0199ecf726e1bd3d56872c59749"}, - {file = "fonttools-4.53.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eceef49f457253000e6a2d0f7bd08ff4e9fe96ec4ffce2dbcb32e34d9c1b8161"}, - {file = "fonttools-4.53.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa1f3e34373aa16045484b4d9d352d4c6b5f9f77ac77a178252ccbc851e8b2ee"}, - {file = "fonttools-4.53.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:28d072169fe8275fb1a0d35e3233f6df36a7e8474e56cb790a7258ad822b6fd6"}, - {file = "fonttools-4.53.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4a2a6ba400d386e904fd05db81f73bee0008af37799a7586deaa4aef8cd5971e"}, - {file = "fonttools-4.53.0-cp311-cp311-win32.whl", hash = "sha256:bb7273789f69b565d88e97e9e1da602b4ee7ba733caf35a6c2affd4334d4f005"}, - {file = "fonttools-4.53.0-cp311-cp311-win_amd64.whl", hash = "sha256:9fe9096a60113e1d755e9e6bda15ef7e03391ee0554d22829aa506cdf946f796"}, - {file = "fonttools-4.53.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d8f191a17369bd53a5557a5ee4bab91d5330ca3aefcdf17fab9a497b0e7cff7a"}, - {file = "fonttools-4.53.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:93156dd7f90ae0a1b0e8871032a07ef3178f553f0c70c386025a808f3a63b1f4"}, - {file = "fonttools-4.53.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bff98816cb144fb7b85e4b5ba3888a33b56ecef075b0e95b95bcd0a5fbf20f06"}, - {file = "fonttools-4.53.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:973d030180eca8255b1bce6ffc09ef38a05dcec0e8320cc9b7bcaa65346f341d"}, - {file = "fonttools-4.53.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c4ee5a24e281fbd8261c6ab29faa7fd9a87a12e8c0eed485b705236c65999109"}, - {file = "fonttools-4.53.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bd5bc124fae781a4422f61b98d1d7faa47985f663a64770b78f13d2c072410c2"}, - {file = "fonttools-4.53.0-cp312-cp312-win32.whl", hash = "sha256:a239afa1126b6a619130909c8404070e2b473dd2b7fc4aacacd2e763f8597fea"}, - {file = "fonttools-4.53.0-cp312-cp312-win_amd64.whl", hash = "sha256:45b4afb069039f0366a43a5d454bc54eea942bfb66b3fc3e9a2c07ef4d617380"}, - {file = "fonttools-4.53.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:93bc9e5aaa06ff928d751dc6be889ff3e7d2aa393ab873bc7f6396a99f6fbb12"}, - {file = "fonttools-4.53.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2367d47816cc9783a28645bc1dac07f8ffc93e0f015e8c9fc674a5b76a6da6e4"}, - {file = "fonttools-4.53.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:907fa0b662dd8fc1d7c661b90782ce81afb510fc4b7aa6ae7304d6c094b27bce"}, - {file = "fonttools-4.53.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e0ad3c6ea4bd6a289d958a1eb922767233f00982cf0fe42b177657c86c80a8f"}, - {file = "fonttools-4.53.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:73121a9b7ff93ada888aaee3985a88495489cc027894458cb1a736660bdfb206"}, - {file = "fonttools-4.53.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ee595d7ba9bba130b2bec555a40aafa60c26ce68ed0cf509983e0f12d88674fd"}, - {file = "fonttools-4.53.0-cp38-cp38-win32.whl", hash = "sha256:fca66d9ff2ac89b03f5aa17e0b21a97c21f3491c46b583bb131eb32c7bab33af"}, - {file = "fonttools-4.53.0-cp38-cp38-win_amd64.whl", hash = "sha256:31f0e3147375002aae30696dd1dc596636abbd22fca09d2e730ecde0baad1d6b"}, - {file = "fonttools-4.53.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7d6166192dcd925c78a91d599b48960e0a46fe565391c79fe6de481ac44d20ac"}, - {file = "fonttools-4.53.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef50ec31649fbc3acf6afd261ed89d09eb909b97cc289d80476166df8438524d"}, - {file = "fonttools-4.53.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f193f060391a455920d61684a70017ef5284ccbe6023bb056e15e5ac3de11d1"}, - {file = "fonttools-4.53.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba9f09ff17f947392a855e3455a846f9855f6cf6bec33e9a427d3c1d254c712f"}, - {file = "fonttools-4.53.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0c555e039d268445172b909b1b6bdcba42ada1cf4a60e367d68702e3f87e5f64"}, - {file = "fonttools-4.53.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5a4788036201c908079e89ae3f5399b33bf45b9ea4514913f4dbbe4fac08efe0"}, - {file = "fonttools-4.53.0-cp39-cp39-win32.whl", hash = "sha256:d1a24f51a3305362b94681120c508758a88f207fa0a681c16b5a4172e9e6c7a9"}, - {file = "fonttools-4.53.0-cp39-cp39-win_amd64.whl", hash = "sha256:1e677bfb2b4bd0e5e99e0f7283e65e47a9814b0486cb64a41adf9ef110e078f2"}, - {file = "fonttools-4.53.0-py3-none-any.whl", hash = "sha256:6b4f04b1fbc01a3569d63359f2227c89ab294550de277fd09d8fca6185669fa4"}, - {file = "fonttools-4.53.0.tar.gz", hash = "sha256:c93ed66d32de1559b6fc348838c7572d5c0ac1e4a258e76763a5caddd8944002"}, + {file = "fonttools-4.53.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0679a30b59d74b6242909945429dbddb08496935b82f91ea9bf6ad240ec23397"}, + {file = "fonttools-4.53.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e8bf06b94694251861ba7fdeea15c8ec0967f84c3d4143ae9daf42bbc7717fe3"}, + {file = "fonttools-4.53.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b96cd370a61f4d083c9c0053bf634279b094308d52fdc2dd9a22d8372fdd590d"}, + {file = "fonttools-4.53.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1c7c5aa18dd3b17995898b4a9b5929d69ef6ae2af5b96d585ff4005033d82f0"}, + {file = "fonttools-4.53.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e013aae589c1c12505da64a7d8d023e584987e51e62006e1bb30d72f26522c41"}, + {file = "fonttools-4.53.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9efd176f874cb6402e607e4cc9b4a9cd584d82fc34a4b0c811970b32ba62501f"}, + {file = "fonttools-4.53.1-cp310-cp310-win32.whl", hash = "sha256:c8696544c964500aa9439efb6761947393b70b17ef4e82d73277413f291260a4"}, + {file = "fonttools-4.53.1-cp310-cp310-win_amd64.whl", hash = "sha256:8959a59de5af6d2bec27489e98ef25a397cfa1774b375d5787509c06659b3671"}, + {file = "fonttools-4.53.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:da33440b1413bad53a8674393c5d29ce64d8c1a15ef8a77c642ffd900d07bfe1"}, + {file = "fonttools-4.53.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5ff7e5e9bad94e3a70c5cd2fa27f20b9bb9385e10cddab567b85ce5d306ea923"}, + {file = "fonttools-4.53.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6e7170d675d12eac12ad1a981d90f118c06cf680b42a2d74c6c931e54b50719"}, + {file = "fonttools-4.53.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bee32ea8765e859670c4447b0817514ca79054463b6b79784b08a8df3a4d78e3"}, + {file = "fonttools-4.53.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6e08f572625a1ee682115223eabebc4c6a2035a6917eac6f60350aba297ccadb"}, + {file = "fonttools-4.53.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b21952c092ffd827504de7e66b62aba26fdb5f9d1e435c52477e6486e9d128b2"}, + {file = "fonttools-4.53.1-cp311-cp311-win32.whl", hash = "sha256:9dfdae43b7996af46ff9da520998a32b105c7f098aeea06b2226b30e74fbba88"}, + {file = "fonttools-4.53.1-cp311-cp311-win_amd64.whl", hash = "sha256:d4d0096cb1ac7a77b3b41cd78c9b6bc4a400550e21dc7a92f2b5ab53ed74eb02"}, + {file = "fonttools-4.53.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d92d3c2a1b39631a6131c2fa25b5406855f97969b068e7e08413325bc0afba58"}, + {file = "fonttools-4.53.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3b3c8ebafbee8d9002bd8f1195d09ed2bd9ff134ddec37ee8f6a6375e6a4f0e8"}, + {file = "fonttools-4.53.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32f029c095ad66c425b0ee85553d0dc326d45d7059dbc227330fc29b43e8ba60"}, + {file = "fonttools-4.53.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10f5e6c3510b79ea27bb1ebfcc67048cde9ec67afa87c7dd7efa5c700491ac7f"}, + {file = "fonttools-4.53.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f677ce218976496a587ab17140da141557beb91d2a5c1a14212c994093f2eae2"}, + {file = "fonttools-4.53.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9e6ceba2a01b448e36754983d376064730690401da1dd104ddb543519470a15f"}, + {file = "fonttools-4.53.1-cp312-cp312-win32.whl", hash = "sha256:791b31ebbc05197d7aa096bbc7bd76d591f05905d2fd908bf103af4488e60670"}, + {file = "fonttools-4.53.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ed170b5e17da0264b9f6fae86073be3db15fa1bd74061c8331022bca6d09bab"}, + {file = "fonttools-4.53.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c818c058404eb2bba05e728d38049438afd649e3c409796723dfc17cd3f08749"}, + {file = "fonttools-4.53.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:651390c3b26b0c7d1f4407cad281ee7a5a85a31a110cbac5269de72a51551ba2"}, + {file = "fonttools-4.53.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e54f1bba2f655924c1138bbc7fa91abd61f45c68bd65ab5ed985942712864bbb"}, + {file = "fonttools-4.53.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9cd19cf4fe0595ebdd1d4915882b9440c3a6d30b008f3cc7587c1da7b95be5f"}, + {file = "fonttools-4.53.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2af40ae9cdcb204fc1d8f26b190aa16534fcd4f0df756268df674a270eab575d"}, + {file = "fonttools-4.53.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:35250099b0cfb32d799fb5d6c651220a642fe2e3c7d2560490e6f1d3f9ae9169"}, + {file = "fonttools-4.53.1-cp38-cp38-win32.whl", hash = "sha256:f08df60fbd8d289152079a65da4e66a447efc1d5d5a4d3f299cdd39e3b2e4a7d"}, + {file = "fonttools-4.53.1-cp38-cp38-win_amd64.whl", hash = "sha256:7b6b35e52ddc8fb0db562133894e6ef5b4e54e1283dff606fda3eed938c36fc8"}, + {file = "fonttools-4.53.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75a157d8d26c06e64ace9df037ee93a4938a4606a38cb7ffaf6635e60e253b7a"}, + {file = "fonttools-4.53.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4824c198f714ab5559c5be10fd1adf876712aa7989882a4ec887bf1ef3e00e31"}, + {file = "fonttools-4.53.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:becc5d7cb89c7b7afa8321b6bb3dbee0eec2b57855c90b3e9bf5fb816671fa7c"}, + {file = "fonttools-4.53.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84ec3fb43befb54be490147b4a922b5314e16372a643004f182babee9f9c3407"}, + {file = "fonttools-4.53.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:73379d3ffdeecb376640cd8ed03e9d2d0e568c9d1a4e9b16504a834ebadc2dfb"}, + {file = "fonttools-4.53.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:02569e9a810f9d11f4ae82c391ebc6fb5730d95a0657d24d754ed7763fb2d122"}, + {file = "fonttools-4.53.1-cp39-cp39-win32.whl", hash = "sha256:aae7bd54187e8bf7fd69f8ab87b2885253d3575163ad4d669a262fe97f0136cb"}, + {file = "fonttools-4.53.1-cp39-cp39-win_amd64.whl", hash = "sha256:e5b708073ea3d684235648786f5f6153a48dc8762cdfe5563c57e80787c29fbb"}, + {file = "fonttools-4.53.1-py3-none-any.whl", hash = "sha256:f1f8758a2ad110bd6432203a344269f445a2907dc24ef6bccfd0ac4e14e0d71d"}, + {file = "fonttools-4.53.1.tar.gz", hash = "sha256:e128778a8e9bc11159ce5447f76766cefbd876f44bd79aff030287254e4752c4"}, ] [package.extras] @@ -1235,13 +1250,13 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-auth" -version = "2.30.0" +version = "2.32.0" description = "Google Authentication Library" optional = false python-versions = ">=3.7" files = [ - {file = "google-auth-2.30.0.tar.gz", hash = "sha256:ab630a1320f6720909ad76a7dbdb6841cdf5c66b328d690027e4867bdfb16688"}, - {file = "google_auth-2.30.0-py2.py3-none-any.whl", hash = "sha256:8df7da660f62757388b8a7f249df13549b3373f24388cb5d2f1dd91cc18180b5"}, + {file = "google_auth-2.32.0-py2.py3-none-any.whl", hash = "sha256:53326ea2ebec768070a94bee4e1b9194c9646ea0c2bd72422785bd0f9abfad7b"}, + {file = "google_auth-2.32.0.tar.gz", hash = "sha256:49315be72c55a6a37d62819e3573f6b416aca00721f7e3e31a008d928bf64022"}, ] [package.dependencies] @@ -1275,61 +1290,61 @@ grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] [[package]] name = "grpcio" -version = "1.64.1" +version = "1.65.4" description = "HTTP/2-based RPC framework" optional = false python-versions = ">=3.8" files = [ - {file = "grpcio-1.64.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:55697ecec192bc3f2f3cc13a295ab670f51de29884ca9ae6cd6247df55df2502"}, - {file = "grpcio-1.64.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:3b64ae304c175671efdaa7ec9ae2cc36996b681eb63ca39c464958396697daff"}, - {file = "grpcio-1.64.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:bac71b4b28bc9af61efcdc7630b166440bbfbaa80940c9a697271b5e1dabbc61"}, - {file = "grpcio-1.64.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c024ffc22d6dc59000faf8ad781696d81e8e38f4078cb0f2630b4a3cf231a90"}, - {file = "grpcio-1.64.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7cd5c1325f6808b8ae31657d281aadb2a51ac11ab081ae335f4f7fc44c1721d"}, - {file = "grpcio-1.64.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0a2813093ddb27418a4c99f9b1c223fab0b053157176a64cc9db0f4557b69bd9"}, - {file = "grpcio-1.64.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2981c7365a9353f9b5c864595c510c983251b1ab403e05b1ccc70a3d9541a73b"}, - {file = "grpcio-1.64.1-cp310-cp310-win32.whl", hash = "sha256:1262402af5a511c245c3ae918167eca57342c72320dffae5d9b51840c4b2f86d"}, - {file = "grpcio-1.64.1-cp310-cp310-win_amd64.whl", hash = "sha256:19264fc964576ddb065368cae953f8d0514ecc6cb3da8903766d9fb9d4554c33"}, - {file = "grpcio-1.64.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:58b1041e7c870bb30ee41d3090cbd6f0851f30ae4eb68228955d973d3efa2e61"}, - {file = "grpcio-1.64.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bbc5b1d78a7822b0a84c6f8917faa986c1a744e65d762ef6d8be9d75677af2ca"}, - {file = "grpcio-1.64.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:5841dd1f284bd1b3d8a6eca3a7f062b06f1eec09b184397e1d1d43447e89a7ae"}, - {file = "grpcio-1.64.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8caee47e970b92b3dd948371230fcceb80d3f2277b3bf7fbd7c0564e7d39068e"}, - {file = "grpcio-1.64.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73819689c169417a4f978e562d24f2def2be75739c4bed1992435d007819da1b"}, - {file = "grpcio-1.64.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6503b64c8b2dfad299749cad1b595c650c91e5b2c8a1b775380fcf8d2cbba1e9"}, - {file = "grpcio-1.64.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1de403fc1305fd96cfa75e83be3dee8538f2413a6b1685b8452301c7ba33c294"}, - {file = "grpcio-1.64.1-cp311-cp311-win32.whl", hash = "sha256:d4d29cc612e1332237877dfa7fe687157973aab1d63bd0f84cf06692f04c0367"}, - {file = "grpcio-1.64.1-cp311-cp311-win_amd64.whl", hash = "sha256:5e56462b05a6f860b72f0fa50dca06d5b26543a4e88d0396259a07dc30f4e5aa"}, - {file = "grpcio-1.64.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:4657d24c8063e6095f850b68f2d1ba3b39f2b287a38242dcabc166453e950c59"}, - {file = "grpcio-1.64.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:62b4e6eb7bf901719fce0ca83e3ed474ae5022bb3827b0a501e056458c51c0a1"}, - {file = "grpcio-1.64.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:ee73a2f5ca4ba44fa33b4d7d2c71e2c8a9e9f78d53f6507ad68e7d2ad5f64a22"}, - {file = "grpcio-1.64.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:198908f9b22e2672a998870355e226a725aeab327ac4e6ff3a1399792ece4762"}, - {file = "grpcio-1.64.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39b9d0acaa8d835a6566c640f48b50054f422d03e77e49716d4c4e8e279665a1"}, - {file = "grpcio-1.64.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:5e42634a989c3aa6049f132266faf6b949ec2a6f7d302dbb5c15395b77d757eb"}, - {file = "grpcio-1.64.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b1a82e0b9b3022799c336e1fc0f6210adc019ae84efb7321d668129d28ee1efb"}, - {file = "grpcio-1.64.1-cp312-cp312-win32.whl", hash = "sha256:55260032b95c49bee69a423c2f5365baa9369d2f7d233e933564d8a47b893027"}, - {file = "grpcio-1.64.1-cp312-cp312-win_amd64.whl", hash = "sha256:c1a786ac592b47573a5bb7e35665c08064a5d77ab88a076eec11f8ae86b3e3f6"}, - {file = "grpcio-1.64.1-cp38-cp38-linux_armv7l.whl", hash = "sha256:a011ac6c03cfe162ff2b727bcb530567826cec85eb8d4ad2bfb4bd023287a52d"}, - {file = "grpcio-1.64.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4d6dab6124225496010bd22690f2d9bd35c7cbb267b3f14e7a3eb05c911325d4"}, - {file = "grpcio-1.64.1-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:a5e771d0252e871ce194d0fdcafd13971f1aae0ddacc5f25615030d5df55c3a2"}, - {file = "grpcio-1.64.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2c3c1b90ab93fed424e454e93c0ed0b9d552bdf1b0929712b094f5ecfe7a23ad"}, - {file = "grpcio-1.64.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20405cb8b13fd779135df23fabadc53b86522d0f1cba8cca0e87968587f50650"}, - {file = "grpcio-1.64.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0cc79c982ccb2feec8aad0e8fb0d168bcbca85bc77b080d0d3c5f2f15c24ea8f"}, - {file = "grpcio-1.64.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a3a035c37ce7565b8f4f35ff683a4db34d24e53dc487e47438e434eb3f701b2a"}, - {file = "grpcio-1.64.1-cp38-cp38-win32.whl", hash = "sha256:1257b76748612aca0f89beec7fa0615727fd6f2a1ad580a9638816a4b2eb18fd"}, - {file = "grpcio-1.64.1-cp38-cp38-win_amd64.whl", hash = "sha256:0a12ddb1678ebc6a84ec6b0487feac020ee2b1659cbe69b80f06dbffdb249122"}, - {file = "grpcio-1.64.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:75dbbf415026d2862192fe1b28d71f209e2fd87079d98470db90bebe57b33179"}, - {file = "grpcio-1.64.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e3d9f8d1221baa0ced7ec7322a981e28deb23749c76eeeb3d33e18b72935ab62"}, - {file = "grpcio-1.64.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:5f8b75f64d5d324c565b263c67dbe4f0af595635bbdd93bb1a88189fc62ed2e5"}, - {file = "grpcio-1.64.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c84ad903d0d94311a2b7eea608da163dace97c5fe9412ea311e72c3684925602"}, - {file = "grpcio-1.64.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:940e3ec884520155f68a3b712d045e077d61c520a195d1a5932c531f11883489"}, - {file = "grpcio-1.64.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f10193c69fc9d3d726e83bbf0f3d316f1847c3071c8c93d8090cf5f326b14309"}, - {file = "grpcio-1.64.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ac15b6c2c80a4d1338b04d42a02d376a53395ddf0ec9ab157cbaf44191f3ffdd"}, - {file = "grpcio-1.64.1-cp39-cp39-win32.whl", hash = "sha256:03b43d0ccf99c557ec671c7dede64f023c7da9bb632ac65dbc57f166e4970040"}, - {file = "grpcio-1.64.1-cp39-cp39-win_amd64.whl", hash = "sha256:ed6091fa0adcc7e4ff944090cf203a52da35c37a130efa564ded02b7aff63bcd"}, - {file = "grpcio-1.64.1.tar.gz", hash = "sha256:8d51dd1c59d5fa0f34266b80a3805ec29a1f26425c2a54736133f6d87fc4968a"}, + {file = "grpcio-1.65.4-cp310-cp310-linux_armv7l.whl", hash = "sha256:0e85c8766cf7f004ab01aff6a0393935a30d84388fa3c58d77849fcf27f3e98c"}, + {file = "grpcio-1.65.4-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:e4a795c02405c7dfa8affd98c14d980f4acea16ea3b539e7404c645329460e5a"}, + {file = "grpcio-1.65.4-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:d7b984a8dd975d949c2042b9b5ebcf297d6d5af57dcd47f946849ee15d3c2fb8"}, + {file = "grpcio-1.65.4-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:644a783ce604a7d7c91412bd51cf9418b942cf71896344b6dc8d55713c71ce82"}, + {file = "grpcio-1.65.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5764237d751d3031a36fafd57eb7d36fd2c10c658d2b4057c516ccf114849a3e"}, + {file = "grpcio-1.65.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ee40d058cf20e1dd4cacec9c39e9bce13fedd38ce32f9ba00f639464fcb757de"}, + {file = "grpcio-1.65.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4482a44ce7cf577a1f8082e807a5b909236bce35b3e3897f839f2fbd9ae6982d"}, + {file = "grpcio-1.65.4-cp310-cp310-win32.whl", hash = "sha256:66bb051881c84aa82e4f22d8ebc9d1704b2e35d7867757f0740c6ef7b902f9b1"}, + {file = "grpcio-1.65.4-cp310-cp310-win_amd64.whl", hash = "sha256:870370524eff3144304da4d1bbe901d39bdd24f858ce849b7197e530c8c8f2ec"}, + {file = "grpcio-1.65.4-cp311-cp311-linux_armv7l.whl", hash = "sha256:85e9c69378af02e483bc626fc19a218451b24a402bdf44c7531e4c9253fb49ef"}, + {file = "grpcio-1.65.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2bd672e005afab8bf0d6aad5ad659e72a06dd713020554182a66d7c0c8f47e18"}, + {file = "grpcio-1.65.4-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:abccc5d73f5988e8f512eb29341ed9ced923b586bb72e785f265131c160231d8"}, + {file = "grpcio-1.65.4-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:886b45b29f3793b0c2576201947258782d7e54a218fe15d4a0468d9a6e00ce17"}, + {file = "grpcio-1.65.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be952436571dacc93ccc7796db06b7daf37b3b56bb97e3420e6503dccfe2f1b4"}, + {file = "grpcio-1.65.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8dc9ddc4603ec43f6238a5c95400c9a901b6d079feb824e890623da7194ff11e"}, + {file = "grpcio-1.65.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ade1256c98cba5a333ef54636095f2c09e6882c35f76acb04412f3b1aa3c29a5"}, + {file = "grpcio-1.65.4-cp311-cp311-win32.whl", hash = "sha256:280e93356fba6058cbbfc6f91a18e958062ef1bdaf5b1caf46c615ba1ae71b5b"}, + {file = "grpcio-1.65.4-cp311-cp311-win_amd64.whl", hash = "sha256:d2b819f9ee27ed4e3e737a4f3920e337e00bc53f9e254377dd26fc7027c4d558"}, + {file = "grpcio-1.65.4-cp312-cp312-linux_armv7l.whl", hash = "sha256:926a0750a5e6fb002542e80f7fa6cab8b1a2ce5513a1c24641da33e088ca4c56"}, + {file = "grpcio-1.65.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:2a1d4c84d9e657f72bfbab8bedf31bdfc6bfc4a1efb10b8f2d28241efabfaaf2"}, + {file = "grpcio-1.65.4-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:17de4fda50967679677712eec0a5c13e8904b76ec90ac845d83386b65da0ae1e"}, + {file = "grpcio-1.65.4-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3dee50c1b69754a4228e933696408ea87f7e896e8d9797a3ed2aeed8dbd04b74"}, + {file = "grpcio-1.65.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74c34fc7562bdd169b77966068434a93040bfca990e235f7a67cdf26e1bd5c63"}, + {file = "grpcio-1.65.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:24a2246e80a059b9eb981e4c2a6d8111b1b5e03a44421adbf2736cc1d4988a8a"}, + {file = "grpcio-1.65.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:18c10f0d054d2dce34dd15855fcca7cc44ec3b811139437543226776730c0f28"}, + {file = "grpcio-1.65.4-cp312-cp312-win32.whl", hash = "sha256:d72962788b6c22ddbcdb70b10c11fbb37d60ae598c51eb47ec019db66ccfdff0"}, + {file = "grpcio-1.65.4-cp312-cp312-win_amd64.whl", hash = "sha256:7656376821fed8c89e68206a522522317787a3d9ed66fb5110b1dff736a5e416"}, + {file = "grpcio-1.65.4-cp38-cp38-linux_armv7l.whl", hash = "sha256:4934077b33aa6fe0b451de8b71dabde96bf2d9b4cb2b3187be86e5adebcba021"}, + {file = "grpcio-1.65.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0cef8c919a3359847c357cb4314e50ed1f0cca070f828ee8f878d362fd744d52"}, + {file = "grpcio-1.65.4-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:a925446e6aa12ca37114840d8550f308e29026cdc423a73da3043fd1603a6385"}, + {file = "grpcio-1.65.4-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf53e6247f1e2af93657e62e240e4f12e11ee0b9cef4ddcb37eab03d501ca864"}, + {file = "grpcio-1.65.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdb34278e4ceb224c89704cd23db0d902e5e3c1c9687ec9d7c5bb4c150f86816"}, + {file = "grpcio-1.65.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e6cbdd107e56bde55c565da5fd16f08e1b4e9b0674851d7749e7f32d8645f524"}, + {file = "grpcio-1.65.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:626319a156b1f19513156a3b0dbfe977f5f93db63ca673a0703238ebd40670d7"}, + {file = "grpcio-1.65.4-cp38-cp38-win32.whl", hash = "sha256:3d1bbf7e1dd1096378bd83c83f554d3b93819b91161deaf63e03b7022a85224a"}, + {file = "grpcio-1.65.4-cp38-cp38-win_amd64.whl", hash = "sha256:a99e6dffefd3027b438116f33ed1261c8d360f0dd4f943cb44541a2782eba72f"}, + {file = "grpcio-1.65.4-cp39-cp39-linux_armv7l.whl", hash = "sha256:874acd010e60a2ec1e30d5e505b0651ab12eb968157cd244f852b27c6dbed733"}, + {file = "grpcio-1.65.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b07f36faf01fca5427d4aa23645e2d492157d56c91fab7e06fe5697d7e171ad4"}, + {file = "grpcio-1.65.4-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:b81711bf4ec08a3710b534e8054c7dcf90f2edc22bebe11c1775a23f145595fe"}, + {file = "grpcio-1.65.4-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88fcabc332a4aef8bcefadc34a02e9ab9407ab975d2c7d981a8e12c1aed92aa1"}, + {file = "grpcio-1.65.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9ba3e63108a8749994f02c7c0e156afb39ba5bdf755337de8e75eb685be244b"}, + {file = "grpcio-1.65.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8eb485801957a486bf5de15f2c792d9f9c897a86f2f18db8f3f6795a094b4bb2"}, + {file = "grpcio-1.65.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:075f3903bc1749ace93f2b0664f72964ee5f2da5c15d4b47e0ab68e4f442c257"}, + {file = "grpcio-1.65.4-cp39-cp39-win32.whl", hash = "sha256:0a0720299bdb2cc7306737295d56e41ce8827d5669d4a3cd870af832e3b17c4d"}, + {file = "grpcio-1.65.4-cp39-cp39-win_amd64.whl", hash = "sha256:a146bc40fa78769f22e1e9ff4f110ef36ad271b79707577bf2a31e3e931141b9"}, + {file = "grpcio-1.65.4.tar.gz", hash = "sha256:2a4f476209acffec056360d3e647ae0e14ae13dcf3dfb130c227ae1c594cbe39"}, ] [package.extras] -protobuf = ["grpcio-tools (>=1.64.1)"] +protobuf = ["grpcio-tools (>=1.65.4)"] [[package]] name = "grpclib" @@ -1554,13 +1569,13 @@ files = [ [[package]] name = "importlib-metadata" -version = "8.0.0" +version = "8.2.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-8.0.0-py3-none-any.whl", hash = "sha256:15584cf2b1bf449d98ff8a6ff1abef57bf20f3ac6454f431736cd3e660921b2f"}, - {file = "importlib_metadata-8.0.0.tar.gz", hash = "sha256:188bd24e4c346d3f0a933f275c2fec67050326a856b9a359881d7c2a697e8812"}, + {file = "importlib_metadata-8.2.0-py3-none-any.whl", hash = "sha256:11901fa0c2f97919b288679932bb64febaeacf289d18ac84dd68cb2e74213369"}, + {file = "importlib_metadata-8.2.0.tar.gz", hash = "sha256:72e8d4399996132204f9a16dcc751af254a48f8d1b20b9ff0f98d4a8f901e73d"}, ] [package.dependencies] @@ -1756,13 +1771,13 @@ files = [ [[package]] name = "jsonschema" -version = "4.22.0" +version = "4.23.0" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" files = [ - {file = "jsonschema-4.22.0-py3-none-any.whl", hash = "sha256:ff4cfd6b1367a40e7bc6411caec72effadd3db0bbe5017de188f2d6108335802"}, - {file = "jsonschema-4.22.0.tar.gz", hash = "sha256:5b22d434a45935119af990552c862e5d6d564e8f6601206b305a61fdf661a2b7"}, + {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"}, + {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"}, ] [package.dependencies] @@ -1773,7 +1788,7 @@ rpds-py = ">=0.7.1" [package.extras] format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] -format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=24.6.0)"] [[package]] name = "jsonschema-specifications" @@ -2358,13 +2373,13 @@ tests = ["pytest (>=4.6)"] [[package]] name = "msal" -version = "1.29.0" +version = "1.30.0" description = "The Microsoft Authentication Library (MSAL) for Python library enables your app to access the Microsoft Cloud by supporting authentication of users with Microsoft Azure Active Directory accounts (AAD) and Microsoft Accounts (MSA) using industry standard OAuth2 and OpenID Connect." optional = false python-versions = ">=3.7" files = [ - {file = "msal-1.29.0-py3-none-any.whl", hash = "sha256:6b301e63f967481f0cc1a3a3bac0cf322b276855bc1b0955468d9deb3f33d511"}, - {file = "msal-1.29.0.tar.gz", hash = "sha256:8f6725f099752553f9b2fe84125e2a5ebe47b49f92eacca33ebedd3a9ebaae25"}, + {file = "msal-1.30.0-py3-none-any.whl", hash = "sha256:423872177410cb61683566dc3932db7a76f661a5d2f6f52f02a047f101e1c1de"}, + {file = "msal-1.30.0.tar.gz", hash = "sha256:b4bf00850092e465157d814efa24a18f788284c9a479491024d62903085ea2fb"}, ] [package.dependencies] @@ -2730,13 +2745,13 @@ tests = ["pytest (>=6.0)", "pyyaml"] [[package]] name = "openqasm3" -version = "0.5.0" +version = "1.0.0" description = "Reference OpenQASM AST in Python" optional = false python-versions = "*" files = [ - {file = "openqasm3-0.5.0-py3-none-any.whl", hash = "sha256:40991ac057b9e3c208d1b34242b0aad8a3b9840df0335a652b1e4e4248937b1c"}, - {file = "openqasm3-0.5.0.tar.gz", hash = "sha256:bf8bf4ed098393447e552eaea18b0a34a2429d228477683d6b579348bc17bfc8"}, + {file = "openqasm3-1.0.0-py3-none-any.whl", hash = "sha256:d4371737b4a49b0d56248ed3d30766a94000bccfb43303ec9c7ead351a1b6cc3"}, + {file = "openqasm3-1.0.0.tar.gz", hash = "sha256:3f2bb1cca855cff114e046bac22d59adbf9b754cac6398961aa6d22588fb688e"}, ] [package.dependencies] @@ -2750,57 +2765,62 @@ tests = ["pytest (>=6.0)", "pyyaml"] [[package]] name = "orjson" -version = "3.10.5" +version = "3.10.6" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" optional = false python-versions = ">=3.8" files = [ - {file = "orjson-3.10.5-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:545d493c1f560d5ccfc134803ceb8955a14c3fcb47bbb4b2fee0232646d0b932"}, - {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4324929c2dd917598212bfd554757feca3e5e0fa60da08be11b4aa8b90013c1"}, - {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c13ca5e2ddded0ce6a927ea5a9f27cae77eee4c75547b4297252cb20c4d30e6"}, - {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b6c8e30adfa52c025f042a87f450a6b9ea29649d828e0fec4858ed5e6caecf63"}, - {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:338fd4f071b242f26e9ca802f443edc588fa4ab60bfa81f38beaedf42eda226c"}, - {file = "orjson-3.10.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6970ed7a3126cfed873c5d21ece1cd5d6f83ca6c9afb71bbae21a0b034588d96"}, - {file = "orjson-3.10.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:235dadefb793ad12f7fa11e98a480db1f7c6469ff9e3da5e73c7809c700d746b"}, - {file = "orjson-3.10.5-cp310-none-win32.whl", hash = "sha256:be79e2393679eda6a590638abda16d167754393f5d0850dcbca2d0c3735cebe2"}, - {file = "orjson-3.10.5-cp310-none-win_amd64.whl", hash = "sha256:c4a65310ccb5c9910c47b078ba78e2787cb3878cdded1702ac3d0da71ddc5228"}, - {file = "orjson-3.10.5-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:cdf7365063e80899ae3a697def1277c17a7df7ccfc979990a403dfe77bb54d40"}, - {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b68742c469745d0e6ca5724506858f75e2f1e5b59a4315861f9e2b1df77775a"}, - {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7d10cc1b594951522e35a3463da19e899abe6ca95f3c84c69e9e901e0bd93d38"}, - {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dcbe82b35d1ac43b0d84072408330fd3295c2896973112d495e7234f7e3da2e1"}, - {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c0eb7e0c75e1e486c7563fe231b40fdd658a035ae125c6ba651ca3b07936f5"}, - {file = "orjson-3.10.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:53ed1c879b10de56f35daf06dbc4a0d9a5db98f6ee853c2dbd3ee9d13e6f302f"}, - {file = "orjson-3.10.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:099e81a5975237fda3100f918839af95f42f981447ba8f47adb7b6a3cdb078fa"}, - {file = "orjson-3.10.5-cp311-none-win32.whl", hash = "sha256:1146bf85ea37ac421594107195db8bc77104f74bc83e8ee21a2e58596bfb2f04"}, - {file = "orjson-3.10.5-cp311-none-win_amd64.whl", hash = "sha256:36a10f43c5f3a55c2f680efe07aa93ef4a342d2960dd2b1b7ea2dd764fe4a37c"}, - {file = "orjson-3.10.5-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:68f85ecae7af14a585a563ac741b0547a3f291de81cd1e20903e79f25170458f"}, - {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28afa96f496474ce60d3340fe8d9a263aa93ea01201cd2bad844c45cd21f5268"}, - {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cd684927af3e11b6e754df80b9ffafd9fb6adcaa9d3e8fdd5891be5a5cad51e"}, - {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d21b9983da032505f7050795e98b5d9eee0df903258951566ecc358f6696969"}, - {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ad1de7fef79736dde8c3554e75361ec351158a906d747bd901a52a5c9c8d24b"}, - {file = "orjson-3.10.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2d97531cdfe9bdd76d492e69800afd97e5930cb0da6a825646667b2c6c6c0211"}, - {file = "orjson-3.10.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d69858c32f09c3e1ce44b617b3ebba1aba030e777000ebdf72b0d8e365d0b2b3"}, - {file = "orjson-3.10.5-cp312-none-win32.whl", hash = "sha256:64c9cc089f127e5875901ac05e5c25aa13cfa5dbbbd9602bda51e5c611d6e3e2"}, - {file = "orjson-3.10.5-cp312-none-win_amd64.whl", hash = "sha256:b2efbd67feff8c1f7728937c0d7f6ca8c25ec81373dc8db4ef394c1d93d13dc5"}, - {file = "orjson-3.10.5-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:03b565c3b93f5d6e001db48b747d31ea3819b89abf041ee10ac6988886d18e01"}, - {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:584c902ec19ab7928fd5add1783c909094cc53f31ac7acfada817b0847975f26"}, - {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5a35455cc0b0b3a1eaf67224035f5388591ec72b9b6136d66b49a553ce9eb1e6"}, - {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1670fe88b116c2745a3a30b0f099b699a02bb3482c2591514baf5433819e4f4d"}, - {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:185c394ef45b18b9a7d8e8f333606e2e8194a50c6e3c664215aae8cf42c5385e"}, - {file = "orjson-3.10.5-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ca0b3a94ac8d3886c9581b9f9de3ce858263865fdaa383fbc31c310b9eac07c9"}, - {file = "orjson-3.10.5-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dfc91d4720d48e2a709e9c368d5125b4b5899dced34b5400c3837dadc7d6271b"}, - {file = "orjson-3.10.5-cp38-none-win32.whl", hash = "sha256:c05f16701ab2a4ca146d0bca950af254cb7c02f3c01fca8efbbad82d23b3d9d4"}, - {file = "orjson-3.10.5-cp38-none-win_amd64.whl", hash = "sha256:8a11d459338f96a9aa7f232ba95679fc0c7cedbd1b990d736467894210205c09"}, - {file = "orjson-3.10.5-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:85c89131d7b3218db1b24c4abecea92fd6c7f9fab87441cfc342d3acc725d807"}, - {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb66215277a230c456f9038d5e2d84778141643207f85336ef8d2a9da26bd7ca"}, - {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:51bbcdea96cdefa4a9b4461e690c75ad4e33796530d182bdd5c38980202c134a"}, - {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbead71dbe65f959b7bd8cf91e0e11d5338033eba34c114f69078d59827ee139"}, - {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5df58d206e78c40da118a8c14fc189207fffdcb1f21b3b4c9c0c18e839b5a214"}, - {file = "orjson-3.10.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c4057c3b511bb8aef605616bd3f1f002a697c7e4da6adf095ca5b84c0fd43595"}, - {file = "orjson-3.10.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b39e006b00c57125ab974362e740c14a0c6a66ff695bff44615dcf4a70ce2b86"}, - {file = "orjson-3.10.5-cp39-none-win32.whl", hash = "sha256:eded5138cc565a9d618e111c6d5c2547bbdd951114eb822f7f6309e04db0fb47"}, - {file = "orjson-3.10.5-cp39-none-win_amd64.whl", hash = "sha256:cc28e90a7cae7fcba2493953cff61da5a52950e78dc2dacfe931a317ee3d8de7"}, - {file = "orjson-3.10.5.tar.gz", hash = "sha256:7a5baef8a4284405d96c90c7c62b755e9ef1ada84c2406c24a9ebec86b89f46d"}, + {file = "orjson-3.10.6-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:fb0ee33124db6eaa517d00890fc1a55c3bfe1cf78ba4a8899d71a06f2d6ff5c7"}, + {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c1c4b53b24a4c06547ce43e5fee6ec4e0d8fe2d597f4647fc033fd205707365"}, + {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eadc8fd310edb4bdbd333374f2c8fec6794bbbae99b592f448d8214a5e4050c0"}, + {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:61272a5aec2b2661f4fa2b37c907ce9701e821b2c1285d5c3ab0207ebd358d38"}, + {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57985ee7e91d6214c837936dc1608f40f330a6b88bb13f5a57ce5257807da143"}, + {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:633a3b31d9d7c9f02d49c4ab4d0a86065c4a6f6adc297d63d272e043472acab5"}, + {file = "orjson-3.10.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1c680b269d33ec444afe2bdc647c9eb73166fa47a16d9a75ee56a374f4a45f43"}, + {file = "orjson-3.10.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f759503a97a6ace19e55461395ab0d618b5a117e8d0fbb20e70cfd68a47327f2"}, + {file = "orjson-3.10.6-cp310-none-win32.whl", hash = "sha256:95a0cce17f969fb5391762e5719575217bd10ac5a189d1979442ee54456393f3"}, + {file = "orjson-3.10.6-cp310-none-win_amd64.whl", hash = "sha256:df25d9271270ba2133cc88ee83c318372bdc0f2cd6f32e7a450809a111efc45c"}, + {file = "orjson-3.10.6-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:b1ec490e10d2a77c345def52599311849fc063ae0e67cf4f84528073152bb2ba"}, + {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55d43d3feb8f19d07e9f01e5b9be4f28801cf7c60d0fa0d279951b18fae1932b"}, + {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac3045267e98fe749408eee1593a142e02357c5c99be0802185ef2170086a863"}, + {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c27bc6a28ae95923350ab382c57113abd38f3928af3c80be6f2ba7eb8d8db0b0"}, + {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d27456491ca79532d11e507cadca37fb8c9324a3976294f68fb1eff2dc6ced5a"}, + {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05ac3d3916023745aa3b3b388e91b9166be1ca02b7c7e41045da6d12985685f0"}, + {file = "orjson-3.10.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1335d4ef59ab85cab66fe73fd7a4e881c298ee7f63ede918b7faa1b27cbe5212"}, + {file = "orjson-3.10.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4bbc6d0af24c1575edc79994c20e1b29e6fb3c6a570371306db0993ecf144dc5"}, + {file = "orjson-3.10.6-cp311-none-win32.whl", hash = "sha256:450e39ab1f7694465060a0550b3f6d328d20297bf2e06aa947b97c21e5241fbd"}, + {file = "orjson-3.10.6-cp311-none-win_amd64.whl", hash = "sha256:227df19441372610b20e05bdb906e1742ec2ad7a66ac8350dcfd29a63014a83b"}, + {file = "orjson-3.10.6-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:ea2977b21f8d5d9b758bb3f344a75e55ca78e3ff85595d248eee813ae23ecdfb"}, + {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b6f3d167d13a16ed263b52dbfedff52c962bfd3d270b46b7518365bcc2121eed"}, + {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f710f346e4c44a4e8bdf23daa974faede58f83334289df80bc9cd12fe82573c7"}, + {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7275664f84e027dcb1ad5200b8b18373e9c669b2a9ec33d410c40f5ccf4b257e"}, + {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0943e4c701196b23c240b3d10ed8ecd674f03089198cf503105b474a4f77f21f"}, + {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:446dee5a491b5bc7d8f825d80d9637e7af43f86a331207b9c9610e2f93fee22a"}, + {file = "orjson-3.10.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:64c81456d2a050d380786413786b057983892db105516639cb5d3ee3c7fd5148"}, + {file = "orjson-3.10.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:960db0e31c4e52fa0fc3ecbaea5b2d3b58f379e32a95ae6b0ebeaa25b93dfd34"}, + {file = "orjson-3.10.6-cp312-none-win32.whl", hash = "sha256:a6ea7afb5b30b2317e0bee03c8d34c8181bc5a36f2afd4d0952f378972c4efd5"}, + {file = "orjson-3.10.6-cp312-none-win_amd64.whl", hash = "sha256:874ce88264b7e655dde4aeaacdc8fd772a7962faadfb41abe63e2a4861abc3dc"}, + {file = "orjson-3.10.6-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:66680eae4c4e7fc193d91cfc1353ad6d01b4801ae9b5314f17e11ba55e934183"}, + {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:caff75b425db5ef8e8f23af93c80f072f97b4fb3afd4af44482905c9f588da28"}, + {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3722fddb821b6036fd2a3c814f6bd9b57a89dc6337b9924ecd614ebce3271394"}, + {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2c116072a8533f2fec435fde4d134610f806bdac20188c7bd2081f3e9e0133f"}, + {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6eeb13218c8cf34c61912e9df2de2853f1d009de0e46ea09ccdf3d757896af0a"}, + {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:965a916373382674e323c957d560b953d81d7a8603fbeee26f7b8248638bd48b"}, + {file = "orjson-3.10.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:03c95484d53ed8e479cade8628c9cea00fd9d67f5554764a1110e0d5aa2de96e"}, + {file = "orjson-3.10.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:e060748a04cccf1e0a6f2358dffea9c080b849a4a68c28b1b907f272b5127e9b"}, + {file = "orjson-3.10.6-cp38-none-win32.whl", hash = "sha256:738dbe3ef909c4b019d69afc19caf6b5ed0e2f1c786b5d6215fbb7539246e4c6"}, + {file = "orjson-3.10.6-cp38-none-win_amd64.whl", hash = "sha256:d40f839dddf6a7d77114fe6b8a70218556408c71d4d6e29413bb5f150a692ff7"}, + {file = "orjson-3.10.6-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:697a35a083c4f834807a6232b3e62c8b280f7a44ad0b759fd4dce748951e70db"}, + {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd502f96bf5ea9a61cbc0b2b5900d0dd68aa0da197179042bdd2be67e51a1e4b"}, + {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f215789fb1667cdc874c1b8af6a84dc939fd802bf293a8334fce185c79cd359b"}, + {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2debd8ddce948a8c0938c8c93ade191d2f4ba4649a54302a7da905a81f00b56"}, + {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5410111d7b6681d4b0d65e0f58a13be588d01b473822483f77f513c7f93bd3b2"}, + {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb1f28a137337fdc18384079fa5726810681055b32b92253fa15ae5656e1dddb"}, + {file = "orjson-3.10.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bf2fbbce5fe7cd1aa177ea3eab2b8e6a6bc6e8592e4279ed3db2d62e57c0e1b2"}, + {file = "orjson-3.10.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:79b9b9e33bd4c517445a62b90ca0cc279b0f1f3970655c3df9e608bc3f91741a"}, + {file = "orjson-3.10.6-cp39-none-win32.whl", hash = "sha256:30b0a09a2014e621b1adf66a4f705f0809358350a757508ee80209b2d8dae219"}, + {file = "orjson-3.10.6-cp39-none-win_amd64.whl", hash = "sha256:49e3bc615652617d463069f91b867a4458114c5b104e13b7ae6872e5f79d0844"}, + {file = "orjson-3.10.6.tar.gz", hash = "sha256:e54b63d0a7c6c54a5f5f726bc93a2078111ef060fec4ecbf34c5db800ca3b3a7"}, ] [[package]] @@ -2822,7 +2842,6 @@ optional = false python-versions = ">=3.9" files = [ {file = "pandas-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce"}, - {file = "pandas-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238"}, {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08"}, {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0"}, {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51"}, @@ -2836,14 +2855,12 @@ files = [ {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1"}, {file = "pandas-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24"}, {file = "pandas-2.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef"}, - {file = "pandas-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b79011ff7a0f4b1d6da6a61aa1aa604fb312d6647de5bad20013682d1429ce"}, {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad"}, {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad"}, {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76"}, {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32"}, {file = "pandas-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23"}, {file = "pandas-2.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2"}, - {file = "pandas-2.2.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd"}, {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863"}, {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921"}, {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a"}, @@ -2948,84 +2965,95 @@ ptyprocess = ">=0.5" [[package]] name = "pillow" -version = "10.3.0" +version = "10.4.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.8" files = [ - {file = "pillow-10.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45"}, - {file = "pillow-10.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c"}, - {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf"}, - {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599"}, - {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475"}, - {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf"}, - {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3"}, - {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5"}, - {file = "pillow-10.3.0-cp310-cp310-win32.whl", hash = "sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2"}, - {file = "pillow-10.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f"}, - {file = "pillow-10.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b"}, - {file = "pillow-10.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795"}, - {file = "pillow-10.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57"}, - {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27"}, - {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994"}, - {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451"}, - {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd"}, - {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad"}, - {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c"}, - {file = "pillow-10.3.0-cp311-cp311-win32.whl", hash = "sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09"}, - {file = "pillow-10.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d"}, - {file = "pillow-10.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f"}, - {file = "pillow-10.3.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84"}, - {file = "pillow-10.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a"}, - {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef"}, - {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3"}, - {file = "pillow-10.3.0-cp312-cp312-win32.whl", hash = "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d"}, - {file = "pillow-10.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b"}, - {file = "pillow-10.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a"}, - {file = "pillow-10.3.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b"}, - {file = "pillow-10.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2"}, - {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa"}, - {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383"}, - {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d"}, - {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd"}, - {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d"}, - {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3"}, - {file = "pillow-10.3.0-cp38-cp38-win32.whl", hash = "sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b"}, - {file = "pillow-10.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999"}, - {file = "pillow-10.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936"}, - {file = "pillow-10.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002"}, - {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60"}, - {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375"}, - {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57"}, - {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8"}, - {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9"}, - {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb"}, - {file = "pillow-10.3.0-cp39-cp39-win32.whl", hash = "sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572"}, - {file = "pillow-10.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb"}, - {file = "pillow-10.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591"}, - {file = "pillow-10.3.0.tar.gz", hash = "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d"}, + {file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"}, + {file = "pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46"}, + {file = "pillow-10.4.0-cp310-cp310-win32.whl", hash = "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984"}, + {file = "pillow-10.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141"}, + {file = "pillow-10.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696"}, + {file = "pillow-10.4.0-cp311-cp311-win32.whl", hash = "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496"}, + {file = "pillow-10.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91"}, + {file = "pillow-10.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9"}, + {file = "pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42"}, + {file = "pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a"}, + {file = "pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309"}, + {file = "pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060"}, + {file = "pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea"}, + {file = "pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd"}, + {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84"}, + {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0"}, + {file = "pillow-10.4.0-cp38-cp38-win32.whl", hash = "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e"}, + {file = "pillow-10.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab"}, + {file = "pillow-10.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d"}, + {file = "pillow-10.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c"}, + {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1"}, + {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df"}, + {file = "pillow-10.4.0-cp39-cp39-win32.whl", hash = "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef"}, + {file = "pillow-10.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5"}, + {file = "pillow-10.4.0-cp39-cp39-win_arm64.whl", hash = "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3"}, + {file = "pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06"}, ] [package.extras] -docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +docs = ["furo", "olefile", "sphinx (>=7.3)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] fpx = ["olefile"] mic = ["olefile"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] @@ -3050,13 +3078,13 @@ type = ["mypy (>=1.8)"] [[package]] name = "plotly" -version = "5.22.0" +version = "5.23.0" description = "An open-source, interactive data visualization library for Python" optional = false python-versions = ">=3.8" files = [ - {file = "plotly-5.22.0-py3-none-any.whl", hash = "sha256:68fc1901f098daeb233cc3dd44ec9dc31fb3ca4f4e53189344199c43496ed006"}, - {file = "plotly-5.22.0.tar.gz", hash = "sha256:859fdadbd86b5770ae2466e542b761b247d1c6b49daed765b95bb8c7063e7469"}, + {file = "plotly-5.23.0-py3-none-any.whl", hash = "sha256:76cbe78f75eddc10c56f5a4ee3e7ccaade7c0a57465546f02098c0caed6c2d1a"}, + {file = "plotly-5.23.0.tar.gz", hash = "sha256:89e57d003a116303a34de6700862391367dd564222ab71f8531df70279fc0193"}, ] [package.dependencies] @@ -3080,13 +3108,13 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "portalocker" -version = "2.10.0" +version = "2.10.1" description = "Wraps the portalocker recipe for easy usage" optional = false python-versions = ">=3.8" files = [ - {file = "portalocker-2.10.0-py3-none-any.whl", hash = "sha256:48944147b2cd42520549bc1bb8fe44e220296e56f7c3d551bc6ecce69d9b0de1"}, - {file = "portalocker-2.10.0.tar.gz", hash = "sha256:49de8bc0a2f68ca98bf9e219c81a3e6b27097c7bf505a87c5a112ce1aaeb9b81"}, + {file = "portalocker-2.10.1-py3-none-any.whl", hash = "sha256:53a5984ebc86a025552264b459b46a2086e269b21823cb572f8f28ee759e45bf"}, + {file = "portalocker-2.10.1.tar.gz", hash = "sha256:ef1bf844e878ab08aee7e40184156e1151f228f103aa5c6bd0724cc330960f8f"}, ] [package.dependencies] @@ -3161,22 +3189,22 @@ files = [ [[package]] name = "protobuf" -version = "4.25.3" +version = "4.25.4" description = "" optional = false python-versions = ">=3.8" files = [ - {file = "protobuf-4.25.3-cp310-abi3-win32.whl", hash = "sha256:d4198877797a83cbfe9bffa3803602bbe1625dc30d8a097365dbc762e5790faa"}, - {file = "protobuf-4.25.3-cp310-abi3-win_amd64.whl", hash = "sha256:209ba4cc916bab46f64e56b85b090607a676f66b473e6b762e6f1d9d591eb2e8"}, - {file = "protobuf-4.25.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c"}, - {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:e7cb0ae90dd83727f0c0718634ed56837bfeeee29a5f82a7514c03ee1364c019"}, - {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:7c8daa26095f82482307bc717364e7c13f4f1c99659be82890dcfc215194554d"}, - {file = "protobuf-4.25.3-cp38-cp38-win32.whl", hash = "sha256:f4f118245c4a087776e0a8408be33cf09f6c547442c00395fbfb116fac2f8ac2"}, - {file = "protobuf-4.25.3-cp38-cp38-win_amd64.whl", hash = "sha256:c053062984e61144385022e53678fbded7aea14ebb3e0305ae3592fb219ccfa4"}, - {file = "protobuf-4.25.3-cp39-cp39-win32.whl", hash = "sha256:19b270aeaa0099f16d3ca02628546b8baefe2955bbe23224aaf856134eccf1e4"}, - {file = "protobuf-4.25.3-cp39-cp39-win_amd64.whl", hash = "sha256:e3c97a1555fd6388f857770ff8b9703083de6bf1f9274a002a332d65fbb56c8c"}, - {file = "protobuf-4.25.3-py3-none-any.whl", hash = "sha256:f0700d54bcf45424477e46a9f0944155b46fb0639d69728739c0e47bab83f2b9"}, - {file = "protobuf-4.25.3.tar.gz", hash = "sha256:25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c"}, + {file = "protobuf-4.25.4-cp310-abi3-win32.whl", hash = "sha256:db9fd45183e1a67722cafa5c1da3e85c6492a5383f127c86c4c4aa4845867dc4"}, + {file = "protobuf-4.25.4-cp310-abi3-win_amd64.whl", hash = "sha256:ba3d8504116a921af46499471c63a85260c1a5fc23333154a427a310e015d26d"}, + {file = "protobuf-4.25.4-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:eecd41bfc0e4b1bd3fa7909ed93dd14dd5567b98c941d6c1ad08fdcab3d6884b"}, + {file = "protobuf-4.25.4-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:4c8a70fdcb995dcf6c8966cfa3a29101916f7225e9afe3ced4395359955d3835"}, + {file = "protobuf-4.25.4-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:3319e073562e2515c6ddc643eb92ce20809f5d8f10fead3332f71c63be6a7040"}, + {file = "protobuf-4.25.4-cp38-cp38-win32.whl", hash = "sha256:7e372cbbda66a63ebca18f8ffaa6948455dfecc4e9c1029312f6c2edcd86c4e1"}, + {file = "protobuf-4.25.4-cp38-cp38-win_amd64.whl", hash = "sha256:051e97ce9fa6067a4546e75cb14f90cf0232dcb3e3d508c448b8d0e4265b61c1"}, + {file = "protobuf-4.25.4-cp39-cp39-win32.whl", hash = "sha256:90bf6fd378494eb698805bbbe7afe6c5d12c8e17fca817a646cd6a1818c696ca"}, + {file = "protobuf-4.25.4-cp39-cp39-win_amd64.whl", hash = "sha256:ac79a48d6b99dfed2729ccccee547b34a1d3d63289c71cef056653a846a2240f"}, + {file = "protobuf-4.25.4-py3-none-any.whl", hash = "sha256:bfbebc1c8e4793cfd58589acfb8a1026be0003e852b9da7db5a4285bde996978"}, + {file = "protobuf-4.25.4.tar.gz", hash = "sha256:0dc4a62cc4052a036ee2204d26fe4d835c62827c855c8a03f29fe6da146b380d"}, ] [[package]] @@ -3221,13 +3249,13 @@ files = [ [[package]] name = "pure-eval" -version = "0.2.2" +version = "0.2.3" description = "Safely evaluate AST nodes without side effects" optional = false python-versions = "*" files = [ - {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, - {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, + {file = "pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"}, + {file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"}, ] [package.extras] @@ -3271,132 +3299,134 @@ pyasn1 = ">=0.4.6,<0.7.0" [[package]] name = "pybase64" -version = "1.3.2" +version = "1.4.0" description = "Fast Base64 encoding/decoding" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "pybase64-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3f89501c77883568612d9133be6684e36d60c098f30f4d5d6844d3130757c961"}, - {file = "pybase64-1.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1da5c376605397e1ff862ec414151eac183af7bd4843527022739144b302b8a9"}, - {file = "pybase64-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc61af2d33b2103af8507c549932fecb41b25e6d5c2916e0da92532378e3d639"}, - {file = "pybase64-1.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2fecde2c7d2bec98f585b57d33a48a54deaeb7dfc01df11e67926d44ddbdb235"}, - {file = "pybase64-1.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c4436edcff0cad586fd265d469696d1058ae4ec6b56cc96b180e2a8bcb3eab44"}, - {file = "pybase64-1.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9c919d38e70b7047f92210de8571422d7ba9df7fb74e35ae43be6e08c6842c9"}, - {file = "pybase64-1.3.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9af3f1700b4bdac7a3dfd3242af14d30b87e21e5940d95430c7ad576c79be101"}, - {file = "pybase64-1.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:812f2f8264a7f5e6bbb7605e0df9a2f827cfe2af994b92353bd4183480338104"}, - {file = "pybase64-1.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fdfbe910e666c6d8b05356668ee6fee8848bfa09fc5d326e58466c30ef8db6c1"}, - {file = "pybase64-1.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c99ae0e46bd7bec2c66bd1b5a9115911f15935202c55f71d64cd58dede018c52"}, - {file = "pybase64-1.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:1e52cd080d22960491688b0512d11108da58e8a3e0a28756afef4d201399f932"}, - {file = "pybase64-1.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4ae3659c92447d229fd272a90d215b0b3defe88c16ce5be784c8ecff77b4e2b4"}, - {file = "pybase64-1.3.2-cp310-cp310-win32.whl", hash = "sha256:ca3278ea46f026400bad43bf2780bb69d851b4931c99996f6d3172d30e224694"}, - {file = "pybase64-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:06fc379c0bbb03ce12afbcb11c1dd89943dc297d2eb7f38f17da86567c1e2da9"}, - {file = "pybase64-1.3.2-cp310-cp310-win_arm64.whl", hash = "sha256:db8bdddb2aaa57a1dfbb7133d431bd2f5c2f67b3638f0fe28f6c63a5ce52a03d"}, - {file = "pybase64-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1aef411095a3e53ecb232da05cce23518230bbf40b3b4b633b11b98d0f0c5621"}, - {file = "pybase64-1.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:951a32cb5d280a0ffd50d9dfd74af2d66e9ba6a052200f7b42ab57efd3da4230"}, - {file = "pybase64-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21ddd131cf0bbf0ff18138089268fa9e658b205ac9b31cb9fabae6b16b31e2ff"}, - {file = "pybase64-1.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31b796e74d691ee75903e38cc6008bfa9163c80814c148b71efb43473ee406ed"}, - {file = "pybase64-1.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8bf72833e16eae9e44ae46409b9a32a030bb5e26bc5cf4413dc74241cf2e845a"}, - {file = "pybase64-1.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:227e1b6c31d5306ba2820680b61ba7739fbc92a46ba1c6335d4e9abeff2338da"}, - {file = "pybase64-1.3.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19f3a2ade62217ee42e36b43d781589b9e265556191c30b72cf05f3f64aa9f2f"}, - {file = "pybase64-1.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1d67fdb1ef66f154d2d116a1e74fb4f60a3812cc43fd0907dd9fc05526fae763"}, - {file = "pybase64-1.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bbfa7795782ff5079ddf183ffed6a67ec149a543cb0edf4902f875c31857a8ee"}, - {file = "pybase64-1.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:9ca4bb2efce3de2179adf57dafe2a7f7cf5dcc5361d04f9a2e8c58e93cca6741"}, - {file = "pybase64-1.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:d5ee9f5e7dabc4921abd8b5408fc6f9f330e9383d62fe69b142c403f3632ecd1"}, - {file = "pybase64-1.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f0ab56e017acaa59de96aa0a8e5f3aab88d3831d873426e003e11d39a91e7a84"}, - {file = "pybase64-1.3.2-cp311-cp311-win32.whl", hash = "sha256:7b6358d0cc13f3d1764cccdce0af563ec6abc79835fa7f25d1b7aa45da6393e4"}, - {file = "pybase64-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:98b186d0f3cad2ac164970e3a68a6a46c6b9c5c3f3c4d925f6181883d2a62470"}, - {file = "pybase64-1.3.2-cp311-cp311-win_arm64.whl", hash = "sha256:26f3153652bf4da3f7e634f13d44c4bb48b780551a6abd8f98d54745d3a83404"}, - {file = "pybase64-1.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:dc7f4628dafb04aa338bf14535e9db3579796f49bdebb03f9250d0a12b1f36cc"}, - {file = "pybase64-1.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e47bc67434a7e76fac34170f8d6091086acc1807fdad8fdf2069b516d73e9e38"}, - {file = "pybase64-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:349c3b6705ab7fd1f94c042d03482c66ff819274d3642ee6f7ec6978553da7b3"}, - {file = "pybase64-1.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b9d45188090f5af2948baab32624f8da87d569fa27f769b05264554c54be1f49"}, - {file = "pybase64-1.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fb2d1526fa41631673aa92290195b38015e4dea8fb265a7f9a7bb4d17eb98a8f"}, - {file = "pybase64-1.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f038d3da111399a4246bc3f9c588956bc666e48192281759b9d310c423fcbcb"}, - {file = "pybase64-1.3.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6f34260036cd94b83c450dadb0d9316cdd468dfddd0aadb20837cb7f3e4b3d4"}, - {file = "pybase64-1.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8c1dabbcfbc09d2cd41b02f0c9caaa5afc9282855b4b32451cb03af3fc5ff6ff"}, - {file = "pybase64-1.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:2c07669c87f66a164aba142cd812f1efb84b8bbb616c2cc35a28bd5c66d6414b"}, - {file = "pybase64-1.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:609b5c1fe84251b519e5f7e5c73c25635f4b722243b36f9aefe98a27d8b96938"}, - {file = "pybase64-1.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:736b0163926b2eb4e592dee7b41f89a29c2d3d0bcf93cb34fa9b84cfff948258"}, - {file = "pybase64-1.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f6a6b9dbb8257de1aac18c7b25e0d8849f3016a067743124e18de436e930f00"}, - {file = "pybase64-1.3.2-cp312-cp312-win32.whl", hash = "sha256:fbacb2f79e4dabf3abe25c247bea8000360fd0babb5b87579427310d852c8325"}, - {file = "pybase64-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:e8aec2d73a622ddf3c532ea860de6aebfaab646a6a6bb6ffeca295de106235e9"}, - {file = "pybase64-1.3.2-cp312-cp312-win_arm64.whl", hash = "sha256:9cd58fc35b81ccf647ae2d570fc957182b3a3b3f9b48b1f1d6d97e8cebd4c8d6"}, - {file = "pybase64-1.3.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:7a919d5129a543033a40cce7c4d26760953bb0108c1550b99961d7497131c60f"}, - {file = "pybase64-1.3.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88ca827cc2fca05b22e61bfebbe5ba85e9fb5d4ce5c376ad630a52b30bf20456"}, - {file = "pybase64-1.3.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:28e3ec4f74042352a85efb3c19ed9b115ff968bd16cc916a7fd70e6ae99cf67d"}, - {file = "pybase64-1.3.2-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:76662aa43a7a3d8ae2d51779c5a223fbaa4fa07925dead4c234316fc938084c2"}, - {file = "pybase64-1.3.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b95141be248c37a055deac1730d41f2a1715d41355a330b44738b2e4d3de28b8"}, - {file = "pybase64-1.3.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48f778c3bf3080d4a6230cd65eb06f0c0d3e05bb587fa7910db60e99815958a4"}, - {file = "pybase64-1.3.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:fde83acf303fe3a73f6ef4841866211c4ec7b4dc94b7439e1079089896efe8e0"}, - {file = "pybase64-1.3.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:4f8c20fb576bc9b54b547da8b3ce26e43e2447983d67197e13bc21e6874ed8ef"}, - {file = "pybase64-1.3.2-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:c0c8be6e23c28f98ec5d8f35a638676f983129651a37dc08c676e8edd7f2cf20"}, - {file = "pybase64-1.3.2-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:e0f65f6d682d72316d877c86b677793abaa65b391a3692767a077faced4b7802"}, - {file = "pybase64-1.3.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:4876c26f59c1ed4e1d63f947cefd5536a3511f74bc3c85afeaf81f75bcd21ff3"}, - {file = "pybase64-1.3.2-cp36-cp36m-win32.whl", hash = "sha256:a52a28b1f7b1f8a28c960637ec5c6e7fd90dadd5958b6c52632db704b6fa01a3"}, - {file = "pybase64-1.3.2-cp36-cp36m-win_amd64.whl", hash = "sha256:9ef6f22fc4223c8fd92cce2bf2d5fb4e26940319dec28ed5ac0e525076df2068"}, - {file = "pybase64-1.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e19c6fe8ce448402137e8906bb4b4ec193a3152bd492e9bb2889b2ac705e8a17"}, - {file = "pybase64-1.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f07fb1f4884acc86272d7fe93f0475c85632d38806e03c69a03188b4367edec"}, - {file = "pybase64-1.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc6a436a0cb2e8e78c92d1a98b2cb37bccb05bdf62225c0a1cda482ffa33a71a"}, - {file = "pybase64-1.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bb7420858e1c0608b895910495c664ac586dadef22cec5a2194e71a8917ec92e"}, - {file = "pybase64-1.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:085f0d8b7e593f5374f32483e5dcf543715a9a9fc1ea310f8d2ed664dabf7cdb"}, - {file = "pybase64-1.3.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:894415376efe88f9a22d45b6bfc06d9d594daac76c2acab3655afe3225987d37"}, - {file = "pybase64-1.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0784181bf9368842ae9ff12c68c452e9ed6aeadb459b8e675201f4e4ba2444ff"}, - {file = "pybase64-1.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:755377cf87e76d7b48d7ff8d5814e114e9f153f22ae2636b5a875189824cf4ff"}, - {file = "pybase64-1.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:1f65c78b257beda1579d01836b27a89bc2f526b047998d328f010ecd078b73ee"}, - {file = "pybase64-1.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:0a0dcd173c7d4d1e971c94e15a246a4445955b0686e1488e78d18c05d3b71d9a"}, - {file = "pybase64-1.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:059d326412e5dbd786065dc525dbc53fc24656b3327de7ab70af41d432561a2f"}, - {file = "pybase64-1.3.2-cp37-cp37m-win32.whl", hash = "sha256:0b5f570f0d52a4d21c1adc762552a4aa0f9e8bc92f9ecd6b6b69c833eedfe8b9"}, - {file = "pybase64-1.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:025b613650939d618a4aef5473137bacc3346a71ed82e947551816e2bb06987f"}, - {file = "pybase64-1.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1e427957de7428446820a227bf483a3bca0351473e9ff3bbd831fca95f814a35"}, - {file = "pybase64-1.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:28591a028683dec543b5e9573ecad97ff72aa74c94b0ec62d0ee9c82cda8fa38"}, - {file = "pybase64-1.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06d919d1279825e757a53b80396306c54c2512cf3169567746c7768fb68b7cee"}, - {file = "pybase64-1.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:879a41a64713068bfad2d6bc7c522b8f697527446658df97d061e79e5bb3c45c"}, - {file = "pybase64-1.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c7f7b2f072c8c7ab63c61e7a35f0685fb460600df820b950f2b690b1d4647ee6"}, - {file = "pybase64-1.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5126e7f0d53ce17e004439e928b3a4212a11f31d91b03c56408d2b385570eada"}, - {file = "pybase64-1.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f906b295210d5f6bc8cfe87445e92bc1a290d2b89bff1a74069e3a412eb7602a"}, - {file = "pybase64-1.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cdd036423e0cd121eee3b5b7ea9e52413409c64537bd5f94bdfa615583229ea3"}, - {file = "pybase64-1.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:af4688d8554b7b0f20e3cd4cb167eab62d2b8886683f26b634301ac259b6c1f4"}, - {file = "pybase64-1.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:7bc5fc155935fd0d204bed726507aa04f7ef49885a79b93c347037c437fa45a3"}, - {file = "pybase64-1.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9bc5f4866a6b9940bd10a5a1f8be139bb46728b40c48c5af8dd590eb170e8fb1"}, - {file = "pybase64-1.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c1ec8154e6e867b2c2a6de9abbe50115d7c2d426d69e7791e1f4337270304497"}, - {file = "pybase64-1.3.2-cp38-cp38-win32.whl", hash = "sha256:651c4e07c507f7756179aa75de3b1b802346a195fa40991c75ced57da45ba761"}, - {file = "pybase64-1.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:11b4971af5aa3926115cdacc7e837d018c6cc9b6cfe0b93c839c29a0af5be2b2"}, - {file = "pybase64-1.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0bf75f63bc16b68152ac31b552a09313dc54c2dca171a7a8c27f4505a8e91104"}, - {file = "pybase64-1.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:81cd93debccda870834adadca7c7923bd5c276e1ef544cf62ee9a5d1c4045f68"}, - {file = "pybase64-1.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2758adcbebd18fefb325a2c2caa6698a9ede6dee3dd97439cc17e9354bceb8bb"}, - {file = "pybase64-1.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f9d3f645c7c74321273a5851504fab90fbee9e013b1069d066c8aec2613ce4f6"}, - {file = "pybase64-1.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc0fe1a2a54958ff268d04582b0b942208c7ce020e81f581625b5a0281a0da29"}, - {file = "pybase64-1.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9622442f217bd2ec12d4188eb942a3210b0a5bdb9e295e252cca099a703001ce"}, - {file = "pybase64-1.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11114b6b3c7f4d6668b20b473fae88a92214389a86bda3c98914c8a2fa376556"}, - {file = "pybase64-1.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a19312ced969d8f7b712ed3201fcf803eefdf882891977037596391ab11da26b"}, - {file = "pybase64-1.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e0a8518e6b01aa89a274b7a833cde079ace40c16cdd9573a7dfa6166f904a3fb"}, - {file = "pybase64-1.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:47afc5ae22fef448142db84f0cf631fe9f86160055f018f9002f816a3b63ef15"}, - {file = "pybase64-1.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:41a177b58e3b2dbb93fe03c6aa14798142e1cd16ae0257cb844c44e42cd25144"}, - {file = "pybase64-1.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6f3188bfa49e4bd27a7bf120d17da891ad4d190be44e45aca0abb95c4b7ab656"}, - {file = "pybase64-1.3.2-cp39-cp39-win32.whl", hash = "sha256:f0190a9b9e30aa448221fb6ca6c9a4359b28ffe769c4a8c08c1d2457e04093c8"}, - {file = "pybase64-1.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:9499f665dcc86713332e5759b1552d141b6d4770da4206094b869eb7c001337c"}, - {file = "pybase64-1.3.2-cp39-cp39-win_arm64.whl", hash = "sha256:15b844e29b6bb08949ffb07021383e3182e6651436708130d1d528e42aeacab5"}, - {file = "pybase64-1.3.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b9f7e26e2c5c4c73755a6cd13979cba0fcfa8efcefa68d5baf6766cd86de200f"}, - {file = "pybase64-1.3.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2be5ec28edf2ba01fd12b1d04ff4c06208bf2a0eb81812db4966eef83bb2d68"}, - {file = "pybase64-1.3.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbd9419835e8723691c536ca17c5b4f928837a709ca8abb8a25ab5667ae7f081"}, - {file = "pybase64-1.3.2-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d23b6ccbb5244bd853a33428dd9b1e37e187c51ccc98e5a54b202c8ecd9a0780"}, - {file = "pybase64-1.3.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7f5c52598f4cb2c45f15cba9c823f3af469408837dea2cb105b53a0cce862b0b"}, - {file = "pybase64-1.3.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:72d7044ea0137a9f8936b65f40817490fc2dab34fa7715f60034f8fca556748d"}, - {file = "pybase64-1.3.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fea73a50e8f236aa60cb87ccb5a85778e64db8bc7446c3f89226dd79ed23894f"}, - {file = "pybase64-1.3.2-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ba5ab04d84db9963610bcada4a46bf654b12ea7934795c2781667c1694ae60d"}, - {file = "pybase64-1.3.2-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4f5974ada99be1f0222e0e17f5584df07a8ccd8b025b739ae66006127718bb1"}, - {file = "pybase64-1.3.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:48292d202b134ec320e6ec2212199f8a5ea3b58ae83cba2b30201040e7733904"}, - {file = "pybase64-1.3.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:03b1d733116cf6f77ad7c3b286b793ed0fbb8363d2e4a031bd3d120dcbdbe9c7"}, - {file = "pybase64-1.3.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f109a6aba9c235406f994d80083f5680a81b52358102751c23b8f2e1da57b231"}, - {file = "pybase64-1.3.2-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:915c4eb35bc339f100749856eac74a145639ea7c2bb7b83e5a14d4ef70c6af7a"}, - {file = "pybase64-1.3.2-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71b65b78197ed6bc009cb84418a484ecc568dafc9329d4bac90b8eff21ca8cb4"}, - {file = "pybase64-1.3.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:33f11c42ce14fbb2eeb41b76b6f4f7acfdd970c16a609ae0a26fa283761f06f3"}, - {file = "pybase64-1.3.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:91da83c784f86254eb05c1aa134b91952f90c82e336bbbc54d59d15af8023f1f"}, - {file = "pybase64-1.3.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b54d33adca9e96408dc8ecabf7f880bb86ce15c7e2e00e3919e8b45e6e0ec07"}, - {file = "pybase64-1.3.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bac1442c9c4de1c4d977adaa67a2410838fa8c3150149f32b0596731e0b7babb"}, - {file = "pybase64-1.3.2-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:266466931e324706eee0c3a12d032ae8b80d1b3895e17686c41176755c7c3684"}, - {file = "pybase64-1.3.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1b722174c06c204dff14852f3a968ee448698cf9af0c0c31a5d15343ccb19ef3"}, - {file = "pybase64-1.3.2.tar.gz", hash = "sha256:32ef993c55821dac9abd767ee4656a5013b2ed8bf1125cabbae7e84d2b991038"}, + {file = "pybase64-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:53588d4343c867329830a68c305da771f151e3e850962991b28e8e946ac359c7"}, + {file = "pybase64-1.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:68d3143f14cb91459f5ab942dc8ec717e84b45a20108832603815257b65319f2"}, + {file = "pybase64-1.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78b8eeddc5914cc407cf56aa70fb45142a4da60ce4c259b93a78f7ec28e4c086"}, + {file = "pybase64-1.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7236b6da20d1264e7afe80c04e168c2346b1d92b6c040dc200ae15c8c85780d3"}, + {file = "pybase64-1.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f8fb055b149cef84c238bfe83405d4e16a85717b5ee3b7196a90e75ce6d3e062"}, + {file = "pybase64-1.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cff5181ae5c01d4a00e5cd4d76c571f696bbc61c4dde448cc3ccf00e6efe0aba"}, + {file = "pybase64-1.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46e423377492ddedca1ea5a6c1790de194421be0635652b05b3e9dac14e6843f"}, + {file = "pybase64-1.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:fd6ad3539c0c649856f7eeb92beb279087b25a1c1b67c1a6937eeac53035e972"}, + {file = "pybase64-1.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:6b1271d3c4952eb0668e1252e46457ed6b30d6e1c7e678b02fdb3dcee237559b"}, + {file = "pybase64-1.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:7343b9488c2a141bf139ac479aa39be895c75d1813e10062a9ba445d83d77fc1"}, + {file = "pybase64-1.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:4956588c464e267627b9260443834ffb10033e4ca28725595c58f0894847f327"}, + {file = "pybase64-1.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7e0d8d16f608e613fff5481200ce17ea159ef08519344cd6d3b4e9096124e44f"}, + {file = "pybase64-1.4.0-cp310-cp310-win32.whl", hash = "sha256:8683400369296f920f1546437be6ef46e3a9f446b199c6c372504a0e09e19e83"}, + {file = "pybase64-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:ce3d5dd91ec1673cc92b36f4fe1c1476cfc7ac1305c8f3ac1b2327ae186093bb"}, + {file = "pybase64-1.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:6fb1932336d3f413ce0497a7ff73cfce8cc90991e3724811d83147c3199b85d5"}, + {file = "pybase64-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a0d09663dae7999b3efac87561cf469d1c394b683f59d8e233db587c3a2b4c35"}, + {file = "pybase64-1.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e7427a5d51d99791165c1f1b0113e9eb2699043fa4b0686ffd8465dc015c5eb2"}, + {file = "pybase64-1.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2590ecc24ff7325457f37c742b7e48aeb87444f23773dfd6a9c12e5d2e8f363f"}, + {file = "pybase64-1.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e581031d510431213168a6c9c735d74bf24f6dd0b92a2a82413aded8cb31cac4"}, + {file = "pybase64-1.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:618e1c7fce64223e8fdca9360d7f23d8da0d31d3ab8b6afed034c9c3ba566860"}, + {file = "pybase64-1.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:916591bcd8d1858f27be636d984e4c0713c7c1f0a651cf18529a8fc0cbc9c6d9"}, + {file = "pybase64-1.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:288a5d00500faf13ead83c6611dc265304cc04fd85013ed23eb730ccf9e54399"}, + {file = "pybase64-1.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:30df6f3f6f3b5485dcea9f0dfa4807a9ec41e186824e16f37a300a08e13ba836"}, + {file = "pybase64-1.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:853a00a9f43d1410c57399fc23e8bba0c705fb46abcba7604a0e59d0d6426161"}, + {file = "pybase64-1.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e2515dd6cfbd204cb5cdcc94f34bf70ca380dfecaf750867fd2b211620ba5b3e"}, + {file = "pybase64-1.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:8d5678655a84633a7044bab2b6cb09bfd0735862b9f1092539e7718a6bba782a"}, + {file = "pybase64-1.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:cc9aa578ab7810b282c2426904db5b2cb86a3e36e51732118fe3340921ade360"}, + {file = "pybase64-1.4.0-cp311-cp311-win32.whl", hash = "sha256:b9beab673f09203201db6e03bf7dd285250e075b5f66d5b337f4a08c11a587c7"}, + {file = "pybase64-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:6d8366e268cb9743cf73b7351c31c2f03270c0e9cb397e5f00daa1824f453bb7"}, + {file = "pybase64-1.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:d8d8133ad82c1584be15e59b3c8c590da9160eb698298c59aa4e60983c9f73a8"}, + {file = "pybase64-1.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:51a3aa66a989affa85b311ad88c05bf16ef3803e60e84cd821f7231c83b22d7f"}, + {file = "pybase64-1.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2607bfdda2c582a870dc5b18fbc121434278712a78e41249caf7ea1a9f1266ce"}, + {file = "pybase64-1.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0eb2ddaa008e53944cf62b927f18e7800d629c7b71ab77f87d3293f937a40abb"}, + {file = "pybase64-1.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9b73d2b3cb9107f78a77ad98501f075c58823604f0de27f59216f19b68ed0fc"}, + {file = "pybase64-1.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c50cba5cea82c86ac0a3c7eb30e74a25ac24f42de18e48e1ff2fe60ca82bc2b3"}, + {file = "pybase64-1.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c56a3a43b9a6b9d8917724cab65bdd59f72ed7a66c73bf55abdb31fa0ee1ce7f"}, + {file = "pybase64-1.4.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35c018a191be4f7ac2f4cf404843ed30832da11643251fe9536ef9067577325a"}, + {file = "pybase64-1.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:dab702ba6723dcbf82bdcac9c080bac949eaecba1591ba50e1925fd8f8cde159"}, + {file = "pybase64-1.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:030441e07c410c011431c97df4906fda79a333fd984c4170eec23cb6d6d89fc1"}, + {file = "pybase64-1.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:24a4e1bfb41dea3e88487dee9d46c634505e907ddf5429fa80692453d6ae3541"}, + {file = "pybase64-1.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:03d5aab98b6d529e0fa48eefd1db5c5bc0c931853eb3fb527beb3d0478ccd04e"}, + {file = "pybase64-1.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8612a3701fb5a33ce14128f2fbe7e3603e6347cbdeb256910d96b25e431b9323"}, + {file = "pybase64-1.4.0-cp312-cp312-win32.whl", hash = "sha256:6d9901f0b6f0c6873856ce59ffc0b53135b4078e04e0ceb0ecc050138c6ba71e"}, + {file = "pybase64-1.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:c0f8bd2321724f386020b1b0a00f546a4b7c49b86c6a81cbb5afb601b44e5131"}, + {file = "pybase64-1.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:23ef9e0d02818f2d3ee5f84bba0dec591c67b7fde74c6c40c8eae4a3030a4d8a"}, + {file = "pybase64-1.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4c1631af25e24d1643f18454f68649c0e07e9ba880553ef0e7b144b62b7551f9"}, + {file = "pybase64-1.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ac9005d947c5680dde42b120b6ccc18461bd203cba52cfb32e2d20dbe3c149e0"}, + {file = "pybase64-1.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81767f59b639bb6b481bcef0add94fc9ff4434ab65b694f46224654874c8d888"}, + {file = "pybase64-1.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:158263489efbce7ef7b4d70771e8882650810440a2386e53e17af1753d70e1e5"}, + {file = "pybase64-1.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9946adae43bbffc3a62a943bc8dd467373ff27166cec59de113d2ce954343210"}, + {file = "pybase64-1.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:407aa690d5ed8d9ddd06e83ce61e9be9fb33f52575db28bc935eba42f65d3b0d"}, + {file = "pybase64-1.4.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7c173a645a28ddecaf991f0dda7a7f789a026ebbb56580aa3e761470b15fa8c"}, + {file = "pybase64-1.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5bbf14daab52a6340ed9b9473a74ff91564110466f5e295ab1ff85913eadcb7c"}, + {file = "pybase64-1.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cea8377c2f24808fd9ed254bbaede2a96cead3df331fbc533c9efb6b425f3d1c"}, + {file = "pybase64-1.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b206fb7a1190e69b05c1469f78948ba770009e608e4e4ded1934ea87143c3a7e"}, + {file = "pybase64-1.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:1f68a13383d9f9ef55e9d316c6491d60b47e14ca7407bc43be9e991f03c2a969"}, + {file = "pybase64-1.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7bf62a95a4ff55239a5094af69c528dfc926db27543bfc1676f620d9d90c21d5"}, + {file = "pybase64-1.4.0-cp313-cp313-win32.whl", hash = "sha256:d81a28738a28678eb637f1798e43e9e700b336ae69c46e397f84a3168c8dc8cc"}, + {file = "pybase64-1.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:4d711d8c840e8d684ac31b21c79db4722fb6fd7610f544827448f7a0c6695ea2"}, + {file = "pybase64-1.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:fb8b219b4eecd935f1f0c9deebee9b8b0b4b50cf4ab603b9e2eeaf9ed278d909"}, + {file = "pybase64-1.4.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:b88810395971b333c71920e3bd6387224a75aa6c3c2670cb1fd144a50426e84d"}, + {file = "pybase64-1.4.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:6c7e1cf93dc692896481c0e60ccd44c2329e1bc14e7913fcaac0a671d011c7c4"}, + {file = "pybase64-1.4.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea61017577d5bbc39339f3af0ef0115d9c7c4317bf461d6e2cac4d0473e6afba"}, + {file = "pybase64-1.4.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7227c049aa1399fb61827d27fcc2ba089ecbbc5b1a60e16ba7620ca246a60d17"}, + {file = "pybase64-1.4.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ed7d38b5d96eab31ea7e45cc3a5f586db023bfdf5df4b7ad096d63d6f70267dd"}, + {file = "pybase64-1.4.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cae19e57eb8155ef68e770d8e0283384fb2a04c568f729f2d12e6bd3ffbee3a6"}, + {file = "pybase64-1.4.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ced59a394de5d181bdf6493d72838b7603fb89898d12f2213a55f7175fc25ac"}, + {file = "pybase64-1.4.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:305798dff96d23621e10262a4c64dd641b39c5123289a119359941ab7c17dcfc"}, + {file = "pybase64-1.4.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:acdad56404a0a17a8a240a21a55272b2165bb98f898cf76b0b35d219db1237fe"}, + {file = "pybase64-1.4.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:c7052eebefb4a543a2a70e2dab1a717a431656a8831149c1a99dec39677ce4ca"}, + {file = "pybase64-1.4.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:669a6e55a4dcc0069524bca84702ae99645bfb5d9f6745379b9c043b424530e3"}, + {file = "pybase64-1.4.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c8abce1e40a2c0b2a332995cd716c16d9449e3aaea29c94f632643e7a66a54cb"}, + {file = "pybase64-1.4.0-cp313-cp313t-win32.whl", hash = "sha256:62b19c962b0f205615766f49aaeab8e981173681a5762904794573a56d899ab7"}, + {file = "pybase64-1.4.0-cp313-cp313t-win_amd64.whl", hash = "sha256:af0349c823aa0e605dbf2cfaaf0b89212123158421a2968a3c3565dd6771e57f"}, + {file = "pybase64-1.4.0-cp313-cp313t-win_arm64.whl", hash = "sha256:9dc05a62222395a3f4b7f3860792612f8b06e448e3bf483e316ce1361e6f338e"}, + {file = "pybase64-1.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:322a93f1dcbe4d4e0c9a7499c761b835969a84d5e5f30d2bce73b511bc3d660d"}, + {file = "pybase64-1.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a64823e3b83f3cd14a781e5ff1f49ca91cf48238df21241222a129e8d41d1368"}, + {file = "pybase64-1.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:470e7d5103b421a481ad5676013c2ddfd0c07d086ff86e3c8f4b0c71bbeb00f5"}, + {file = "pybase64-1.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66c865421e30a277ee4dcd1a9ec4628d0dc04bfe0f4c22802ad0db3b1e0247d4"}, + {file = "pybase64-1.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1146c303f02e9f1996e1e926fde932090499473d143362265b1b771fec45418"}, + {file = "pybase64-1.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4d307fd11a16266375f9c9032445498faa101abe54ba65b422fb34bab83aa147"}, + {file = "pybase64-1.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89d7c5ac318d4c832f0d07c9cfb323fbdec60b3138d3cf94df622d56628aaffb"}, + {file = "pybase64-1.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:1ad8afea87817744fd5ea0d61cc3bb9ab0023e2a1f9741df578d347fc106cfd4"}, + {file = "pybase64-1.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:11f9c7edf1d221203938f8fb58be2b3e9b3ec87863bfeb215a783a228d305786"}, + {file = "pybase64-1.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:09b8bc436c0f16e675fddb963d7d2be0fce3d0f8a28a39081c127d4aa3ffb1bf"}, + {file = "pybase64-1.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:ddf2f84779a338ad52d37594442c03109ab559cc6c9b437daaa745d6253d0bf9"}, + {file = "pybase64-1.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:05f1f292a3926df58b8c5b38bdfc4cf4d5ad1499a07309df94a84e7111cf5075"}, + {file = "pybase64-1.4.0-cp38-cp38-win32.whl", hash = "sha256:b52cfeb6f2a4ec8281dafab9a304133c6b3c8c83d96af476d336b068597ecee2"}, + {file = "pybase64-1.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:ccc097310842d8054b91983481840cf52c85166b295d70348a59423b966cf965"}, + {file = "pybase64-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:420c5503b768b7aa0e454fd890915ffbc66bcf9653ee978486a90c4dd6c98a56"}, + {file = "pybase64-1.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:957befeb3b23566f2e54dba8e2c0a15ceeb06c18fce63a3b834308e6e5b0ac29"}, + {file = "pybase64-1.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b13c62ba0ce3bf19d01b736b43b93f89bc1477b1f75e7d5882048d2e0fb1f0"}, + {file = "pybase64-1.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f855a2d52886fdf8c7edf3b0d6cfe00690337ae8cbf3f29ef40140b194c578c0"}, + {file = "pybase64-1.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:976bb75cffeb87ca5d865cb1a5c4b96de420d6a0d9a7f8ed334f65d5f2785e8c"}, + {file = "pybase64-1.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b1fbc82eed9c1f68277a8fd9b0f09b887b64bddacb1e2dd874c4ae1bf1aea6cf"}, + {file = "pybase64-1.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed6e3448ab5037d60e5568f5667a996704e889bdad0f460fbf521626cf81e6ee"}, + {file = "pybase64-1.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:59729edf77dc96d7c8cfe4db46688af3e685b0f627e91aec0be2e631e1ed5735"}, + {file = "pybase64-1.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:7187ec5b97e5f2034335e340d92a8e0bd65b467497b209ee37770a5e80f9ab87"}, + {file = "pybase64-1.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:cbb69a4bda3d2ccb044eab060e5a3312931e80c0b1a438310e0494b80a7c2f8c"}, + {file = "pybase64-1.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:971c897a6844c7ca061d9abe61979c6cc5b8801511b6ebf3f147d2bfa7059c13"}, + {file = "pybase64-1.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f18bccbe275ae65953d44aa27fbde14412fbbe65d526a5862f15c59f4920a563"}, + {file = "pybase64-1.4.0-cp39-cp39-win32.whl", hash = "sha256:3ca60f2b6745e12b838854dcfc2e65a6d1d3cea0725a78f278b4ea8090563a6e"}, + {file = "pybase64-1.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:46825067ae83fda34d983ba89632191370919f9fd17186eee808f8f8b49043a0"}, + {file = "pybase64-1.4.0-cp39-cp39-win_arm64.whl", hash = "sha256:de47017df163056f3124ec9bc4405db3df213e43b315204429d78fd3ce6a4299"}, + {file = "pybase64-1.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0f867d6b667e1f3a9acf602c3cdf9a477f75ed88e7496cd792470bb74a7c275d"}, + {file = "pybase64-1.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:de01468a6626c5056038b51d28748d3cae1765e3913c956d47469cced5aba353"}, + {file = "pybase64-1.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc497c8c05fb00a3ee4b0946aba811c7c1e2153e11e26b91f31a65fb72820f71"}, + {file = "pybase64-1.4.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:974aab42844d33b5b3b98999e3a614705f5ad28f5cdcfd6bed2140e1d30bc187"}, + {file = "pybase64-1.4.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:528f23e78c5f9b116e828d7f3981bc35b102e9b4a46d14b1113973f217f7c03b"}, + {file = "pybase64-1.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a10dea4196cb44492137a31dcc5062b076f784eb7fd6160b329600942319e100"}, + {file = "pybase64-1.4.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:371835babfa0119a809e60b18cd48e506db05a12717c96086e16b74856fcc186"}, + {file = "pybase64-1.4.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:9d1dd06136a5a1f7c1ea0c9fb0faf23ee333346a8667d462a537ca557b321e8f"}, + {file = "pybase64-1.4.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7920615b0db6e8b59ea3b3a0f831962819db96bc63583e918a6e97e2327b0218"}, + {file = "pybase64-1.4.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b3a789d61e39bb84f5e894332c6db108c39acf68b2710b6339162ff90d7a615"}, + {file = "pybase64-1.4.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a1357a4913b72b947877a13ef54cf0543978a1a5b55ae8983e5856bb8ff2e8e"}, + {file = "pybase64-1.4.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:06fb8f4706f0148484788b0036e8ee77717a103d50854ac060d51b894735451a"}, + {file = "pybase64-1.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ae9e00211374a3c0d16c557b157a6fbfaf76c976a55da5516ba952d3ff893422"}, + {file = "pybase64-1.4.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:5bd98d7b4467953c6b904ae946cf78443dca0f42ec44facb3e9db1800272ff45"}, + {file = "pybase64-1.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:824d0d1c04cf0556b22a386b4a3dcefa22f288d15784dd04aa3240c0831efb51"}, + {file = "pybase64-1.4.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d03e7373b1b398bb6137ee1fe39fa2c328f9d6a92a0ea5c8b9b37767b7ff52d"}, + {file = "pybase64-1.4.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e252a1a04fbbb7ed091150aed92ad1fbce378099e6ad385b0473e25f3a97a98e"}, + {file = "pybase64-1.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c689e9aa56c7056eb42bfd7dd383d98f67852e3fc78c57747a11e049e0e1ba12"}, + {file = "pybase64-1.4.0.tar.gz", hash = "sha256:714f021c3eaa287c1097ced68f2df4c5b2ecd2504551c2e71c843f54365aca03"}, ] [[package]] @@ -3526,109 +3556,119 @@ files = [ [[package]] name = "pydantic" -version = "2.7.4" +version = "2.8.2" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.7.4-py3-none-any.whl", hash = "sha256:ee8538d41ccb9c0a9ad3e0e5f07bf15ed8015b481ced539a1759d8cc89ae90d0"}, - {file = "pydantic-2.7.4.tar.gz", hash = "sha256:0c84efd9548d545f63ac0060c1e4d39bb9b14db8b3c0652338aecc07b5adec52"}, + {file = "pydantic-2.8.2-py3-none-any.whl", hash = "sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8"}, + {file = "pydantic-2.8.2.tar.gz", hash = "sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a"}, ] [package.dependencies] annotated-types = ">=0.4.0" -pydantic-core = "2.18.4" -typing-extensions = ">=4.6.1" +pydantic-core = "2.20.1" +typing-extensions = {version = ">=4.6.1", markers = "python_version < \"3.13\""} [package.extras] email = ["email-validator (>=2.0.0)"] [[package]] name = "pydantic-core" -version = "2.18.4" +version = "2.20.1" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.18.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:f76d0ad001edd426b92233d45c746fd08f467d56100fd8f30e9ace4b005266e4"}, - {file = "pydantic_core-2.18.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:59ff3e89f4eaf14050c8022011862df275b552caef8082e37b542b066ce1ff26"}, - {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a55b5b16c839df1070bc113c1f7f94a0af4433fcfa1b41799ce7606e5c79ce0a"}, - {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4d0dcc59664fcb8974b356fe0a18a672d6d7cf9f54746c05f43275fc48636851"}, - {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8951eee36c57cd128f779e641e21eb40bc5073eb28b2d23f33eb0ef14ffb3f5d"}, - {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4701b19f7e3a06ea655513f7938de6f108123bf7c86bbebb1196eb9bd35cf724"}, - {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e00a3f196329e08e43d99b79b286d60ce46bed10f2280d25a1718399457e06be"}, - {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:97736815b9cc893b2b7f663628e63f436018b75f44854c8027040e05230eeddb"}, - {file = "pydantic_core-2.18.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6891a2ae0e8692679c07728819b6e2b822fb30ca7445f67bbf6509b25a96332c"}, - {file = "pydantic_core-2.18.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bc4ff9805858bd54d1a20efff925ccd89c9d2e7cf4986144b30802bf78091c3e"}, - {file = "pydantic_core-2.18.4-cp310-none-win32.whl", hash = "sha256:1b4de2e51bbcb61fdebd0ab86ef28062704f62c82bbf4addc4e37fa4b00b7cbc"}, - {file = "pydantic_core-2.18.4-cp310-none-win_amd64.whl", hash = "sha256:6a750aec7bf431517a9fd78cb93c97b9b0c496090fee84a47a0d23668976b4b0"}, - {file = "pydantic_core-2.18.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:942ba11e7dfb66dc70f9ae66b33452f51ac7bb90676da39a7345e99ffb55402d"}, - {file = "pydantic_core-2.18.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b2ebef0e0b4454320274f5e83a41844c63438fdc874ea40a8b5b4ecb7693f1c4"}, - {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a642295cd0c8df1b86fc3dced1d067874c353a188dc8e0f744626d49e9aa51c4"}, - {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f09baa656c904807e832cf9cce799c6460c450c4ad80803517032da0cd062e2"}, - {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98906207f29bc2c459ff64fa007afd10a8c8ac080f7e4d5beff4c97086a3dabd"}, - {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19894b95aacfa98e7cb093cd7881a0c76f55731efad31073db4521e2b6ff5b7d"}, - {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fbbdc827fe5e42e4d196c746b890b3d72876bdbf160b0eafe9f0334525119c8"}, - {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f85d05aa0918283cf29a30b547b4df2fbb56b45b135f9e35b6807cb28bc47951"}, - {file = "pydantic_core-2.18.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e85637bc8fe81ddb73fda9e56bab24560bdddfa98aa64f87aaa4e4b6730c23d2"}, - {file = "pydantic_core-2.18.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2f5966897e5461f818e136b8451d0551a2e77259eb0f73a837027b47dc95dab9"}, - {file = "pydantic_core-2.18.4-cp311-none-win32.whl", hash = "sha256:44c7486a4228413c317952e9d89598bcdfb06399735e49e0f8df643e1ccd0558"}, - {file = "pydantic_core-2.18.4-cp311-none-win_amd64.whl", hash = "sha256:8a7164fe2005d03c64fd3b85649891cd4953a8de53107940bf272500ba8a788b"}, - {file = "pydantic_core-2.18.4-cp311-none-win_arm64.whl", hash = "sha256:4e99bc050fe65c450344421017f98298a97cefc18c53bb2f7b3531eb39bc7805"}, - {file = "pydantic_core-2.18.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:6f5c4d41b2771c730ea1c34e458e781b18cc668d194958e0112455fff4e402b2"}, - {file = "pydantic_core-2.18.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2fdf2156aa3d017fddf8aea5adfba9f777db1d6022d392b682d2a8329e087cef"}, - {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4748321b5078216070b151d5271ef3e7cc905ab170bbfd27d5c83ee3ec436695"}, - {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:847a35c4d58721c5dc3dba599878ebbdfd96784f3fb8bb2c356e123bdcd73f34"}, - {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c40d4eaad41f78e3bbda31b89edc46a3f3dc6e171bf0ecf097ff7a0ffff7cb1"}, - {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:21a5e440dbe315ab9825fcd459b8814bb92b27c974cbc23c3e8baa2b76890077"}, - {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01dd777215e2aa86dfd664daed5957704b769e726626393438f9c87690ce78c3"}, - {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4b06beb3b3f1479d32befd1f3079cc47b34fa2da62457cdf6c963393340b56e9"}, - {file = "pydantic_core-2.18.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:564d7922e4b13a16b98772441879fcdcbe82ff50daa622d681dd682175ea918c"}, - {file = "pydantic_core-2.18.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0eb2a4f660fcd8e2b1c90ad566db2b98d7f3f4717c64fe0a83e0adb39766d5b8"}, - {file = "pydantic_core-2.18.4-cp312-none-win32.whl", hash = "sha256:8b8bab4c97248095ae0c4455b5a1cd1cdd96e4e4769306ab19dda135ea4cdb07"}, - {file = "pydantic_core-2.18.4-cp312-none-win_amd64.whl", hash = "sha256:14601cdb733d741b8958224030e2bfe21a4a881fb3dd6fbb21f071cabd48fa0a"}, - {file = "pydantic_core-2.18.4-cp312-none-win_arm64.whl", hash = "sha256:c1322d7dd74713dcc157a2b7898a564ab091ca6c58302d5c7b4c07296e3fd00f"}, - {file = "pydantic_core-2.18.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:823be1deb01793da05ecb0484d6c9e20baebb39bd42b5d72636ae9cf8350dbd2"}, - {file = "pydantic_core-2.18.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ebef0dd9bf9b812bf75bda96743f2a6c5734a02092ae7f721c048d156d5fabae"}, - {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae1d6df168efb88d7d522664693607b80b4080be6750c913eefb77e34c12c71a"}, - {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f9899c94762343f2cc2fc64c13e7cae4c3cc65cdfc87dd810a31654c9b7358cc"}, - {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99457f184ad90235cfe8461c4d70ab7dd2680e28821c29eca00252ba90308c78"}, - {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18f469a3d2a2fdafe99296a87e8a4c37748b5080a26b806a707f25a902c040a8"}, - {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7cdf28938ac6b8b49ae5e92f2735056a7ba99c9b110a474473fd71185c1af5d"}, - {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:938cb21650855054dc54dfd9120a851c974f95450f00683399006aa6e8abb057"}, - {file = "pydantic_core-2.18.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:44cd83ab6a51da80fb5adbd9560e26018e2ac7826f9626bc06ca3dc074cd198b"}, - {file = "pydantic_core-2.18.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:972658f4a72d02b8abfa2581d92d59f59897d2e9f7e708fdabe922f9087773af"}, - {file = "pydantic_core-2.18.4-cp38-none-win32.whl", hash = "sha256:1d886dc848e60cb7666f771e406acae54ab279b9f1e4143babc9c2258213daa2"}, - {file = "pydantic_core-2.18.4-cp38-none-win_amd64.whl", hash = "sha256:bb4462bd43c2460774914b8525f79b00f8f407c945d50881568f294c1d9b4443"}, - {file = "pydantic_core-2.18.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:44a688331d4a4e2129140a8118479443bd6f1905231138971372fcde37e43528"}, - {file = "pydantic_core-2.18.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a2fdd81edd64342c85ac7cf2753ccae0b79bf2dfa063785503cb85a7d3593223"}, - {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86110d7e1907ab36691f80b33eb2da87d780f4739ae773e5fc83fb272f88825f"}, - {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:46387e38bd641b3ee5ce247563b60c5ca098da9c56c75c157a05eaa0933ed154"}, - {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:123c3cec203e3f5ac7b000bd82235f1a3eced8665b63d18be751f115588fea30"}, - {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dc1803ac5c32ec324c5261c7209e8f8ce88e83254c4e1aebdc8b0a39f9ddb443"}, - {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53db086f9f6ab2b4061958d9c276d1dbe3690e8dd727d6abf2321d6cce37fa94"}, - {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:abc267fa9837245cc28ea6929f19fa335f3dc330a35d2e45509b6566dc18be23"}, - {file = "pydantic_core-2.18.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a0d829524aaefdebccb869eed855e2d04c21d2d7479b6cada7ace5448416597b"}, - {file = "pydantic_core-2.18.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:509daade3b8649f80d4e5ff21aa5673e4ebe58590b25fe42fac5f0f52c6f034a"}, - {file = "pydantic_core-2.18.4-cp39-none-win32.whl", hash = "sha256:ca26a1e73c48cfc54c4a76ff78df3727b9d9f4ccc8dbee4ae3f73306a591676d"}, - {file = "pydantic_core-2.18.4-cp39-none-win_amd64.whl", hash = "sha256:c67598100338d5d985db1b3d21f3619ef392e185e71b8d52bceacc4a7771ea7e"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:574d92eac874f7f4db0ca653514d823a0d22e2354359d0759e3f6a406db5d55d"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1f4d26ceb5eb9eed4af91bebeae4b06c3fb28966ca3a8fb765208cf6b51102ab"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77450e6d20016ec41f43ca4a6c63e9fdde03f0ae3fe90e7c27bdbeaece8b1ed4"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d323a01da91851a4f17bf592faf46149c9169d68430b3146dcba2bb5e5719abc"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:43d447dd2ae072a0065389092a231283f62d960030ecd27565672bd40746c507"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:578e24f761f3b425834f297b9935e1ce2e30f51400964ce4801002435a1b41ef"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:81b5efb2f126454586d0f40c4d834010979cb80785173d1586df845a632e4e6d"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ab86ce7c8f9bea87b9d12c7f0af71102acbf5ecbc66c17796cff45dae54ef9a5"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:90afc12421df2b1b4dcc975f814e21bc1754640d502a2fbcc6d41e77af5ec312"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:51991a89639a912c17bef4b45c87bd83593aee0437d8102556af4885811d59f5"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:293afe532740370aba8c060882f7d26cfd00c94cae32fd2e212a3a6e3b7bc15e"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b48ece5bde2e768197a2d0f6e925f9d7e3e826f0ad2271120f8144a9db18d5c8"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eae237477a873ab46e8dd748e515c72c0c804fb380fbe6c85533c7de51f23a8f"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:834b5230b5dfc0c1ec37b2fda433b271cbbc0e507560b5d1588e2cc1148cf1ce"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e858ac0a25074ba4bce653f9b5d0a85b7456eaddadc0ce82d3878c22489fa4ee"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2fd41f6eff4c20778d717af1cc50eca52f5afe7805ee530a4fbd0bae284f16e9"}, - {file = "pydantic_core-2.18.4.tar.gz", hash = "sha256:ec3beeada09ff865c344ff3bc2f427f5e6c26401cc6113d77e372c3fdac73864"}, + {file = "pydantic_core-2.20.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3acae97ffd19bf091c72df4d726d552c473f3576409b2a7ca36b2f535ffff4a3"}, + {file = "pydantic_core-2.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41f4c96227a67a013e7de5ff8f20fb496ce573893b7f4f2707d065907bffdbd6"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f239eb799a2081495ea659d8d4a43a8f42cd1fe9ff2e7e436295c38a10c286a"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53e431da3fc53360db73eedf6f7124d1076e1b4ee4276b36fb25514544ceb4a3"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1f62b2413c3a0e846c3b838b2ecd6c7a19ec6793b2a522745b0869e37ab5bc1"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d41e6daee2813ecceea8eda38062d69e280b39df793f5a942fa515b8ed67953"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d482efec8b7dc6bfaedc0f166b2ce349df0011f5d2f1f25537ced4cfc34fd98"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e93e1a4b4b33daed65d781a57a522ff153dcf748dee70b40c7258c5861e1768a"}, + {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7c4ea22b6739b162c9ecaaa41d718dfad48a244909fe7ef4b54c0b530effc5a"}, + {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4f2790949cf385d985a31984907fecb3896999329103df4e4983a4a41e13e840"}, + {file = "pydantic_core-2.20.1-cp310-none-win32.whl", hash = "sha256:5e999ba8dd90e93d57410c5e67ebb67ffcaadcea0ad973240fdfd3a135506250"}, + {file = "pydantic_core-2.20.1-cp310-none-win_amd64.whl", hash = "sha256:512ecfbefef6dac7bc5eaaf46177b2de58cdf7acac8793fe033b24ece0b9566c"}, + {file = "pydantic_core-2.20.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d2a8fa9d6d6f891f3deec72f5cc668e6f66b188ab14bb1ab52422fe8e644f312"}, + {file = "pydantic_core-2.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:175873691124f3d0da55aeea1d90660a6ea7a3cfea137c38afa0a5ffabe37b88"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37eee5b638f0e0dcd18d21f59b679686bbd18917b87db0193ae36f9c23c355fc"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25e9185e2d06c16ee438ed39bf62935ec436474a6ac4f9358524220f1b236e43"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:150906b40ff188a3260cbee25380e7494ee85048584998c1e66df0c7a11c17a6"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ad4aeb3e9a97286573c03df758fc7627aecdd02f1da04516a86dc159bf70121"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3f3ed29cd9f978c604708511a1f9c2fdcb6c38b9aae36a51905b8811ee5cbf1"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b0dae11d8f5ded51699c74d9548dcc5938e0804cc8298ec0aa0da95c21fff57b"}, + {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:faa6b09ee09433b87992fb5a2859efd1c264ddc37280d2dd5db502126d0e7f27"}, + {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9dc1b507c12eb0481d071f3c1808f0529ad41dc415d0ca11f7ebfc666e66a18b"}, + {file = "pydantic_core-2.20.1-cp311-none-win32.whl", hash = "sha256:fa2fddcb7107e0d1808086ca306dcade7df60a13a6c347a7acf1ec139aa6789a"}, + {file = "pydantic_core-2.20.1-cp311-none-win_amd64.whl", hash = "sha256:40a783fb7ee353c50bd3853e626f15677ea527ae556429453685ae32280c19c2"}, + {file = "pydantic_core-2.20.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231"}, + {file = "pydantic_core-2.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24"}, + {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1"}, + {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd"}, + {file = "pydantic_core-2.20.1-cp312-none-win32.whl", hash = "sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688"}, + {file = "pydantic_core-2.20.1-cp312-none-win_amd64.whl", hash = "sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d"}, + {file = "pydantic_core-2.20.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0827505a5c87e8aa285dc31e9ec7f4a17c81a813d45f70b1d9164e03a813a686"}, + {file = "pydantic_core-2.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19c0fa39fa154e7e0b7f82f88ef85faa2a4c23cc65aae2f5aea625e3c13c735a"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa223cd1e36b642092c326d694d8bf59b71ddddc94cdb752bbbb1c5c91d833b"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c336a6d235522a62fef872c6295a42ecb0c4e1d0f1a3e500fe949415761b8a19"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7eb6a0587eded33aeefea9f916899d42b1799b7b14b8f8ff2753c0ac1741edac"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70c8daf4faca8da5a6d655f9af86faf6ec2e1768f4b8b9d0226c02f3d6209703"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9fa4c9bf273ca41f940bceb86922a7667cd5bf90e95dbb157cbb8441008482c"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:11b71d67b4725e7e2a9f6e9c0ac1239bbc0c48cce3dc59f98635efc57d6dac83"}, + {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:270755f15174fb983890c49881e93f8f1b80f0b5e3a3cc1394a255706cabd203"}, + {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c81131869240e3e568916ef4c307f8b99583efaa60a8112ef27a366eefba8ef0"}, + {file = "pydantic_core-2.20.1-cp313-none-win32.whl", hash = "sha256:b91ced227c41aa29c672814f50dbb05ec93536abf8f43cd14ec9521ea09afe4e"}, + {file = "pydantic_core-2.20.1-cp313-none-win_amd64.whl", hash = "sha256:65db0f2eefcaad1a3950f498aabb4875c8890438bc80b19362cf633b87a8ab20"}, + {file = "pydantic_core-2.20.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:4745f4ac52cc6686390c40eaa01d48b18997cb130833154801a442323cc78f91"}, + {file = "pydantic_core-2.20.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a8ad4c766d3f33ba8fd692f9aa297c9058970530a32c728a2c4bfd2616d3358b"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41e81317dd6a0127cabce83c0c9c3fbecceae981c8391e6f1dec88a77c8a569a"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04024d270cf63f586ad41fff13fde4311c4fc13ea74676962c876d9577bcc78f"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eaad4ff2de1c3823fddf82f41121bdf453d922e9a238642b1dedb33c4e4f98ad"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26ab812fa0c845df815e506be30337e2df27e88399b985d0bb4e3ecfe72df31c"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c5ebac750d9d5f2706654c638c041635c385596caf68f81342011ddfa1e5598"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2aafc5a503855ea5885559eae883978c9b6d8c8993d67766ee73d82e841300dd"}, + {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4868f6bd7c9d98904b748a2653031fc9c2f85b6237009d475b1008bfaeb0a5aa"}, + {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa2f457b4af386254372dfa78a2eda2563680d982422641a85f271c859df1987"}, + {file = "pydantic_core-2.20.1-cp38-none-win32.whl", hash = "sha256:225b67a1f6d602de0ce7f6c1c3ae89a4aa25d3de9be857999e9124f15dab486a"}, + {file = "pydantic_core-2.20.1-cp38-none-win_amd64.whl", hash = "sha256:6b507132dcfc0dea440cce23ee2182c0ce7aba7054576efc65634f080dbe9434"}, + {file = "pydantic_core-2.20.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b03f7941783b4c4a26051846dea594628b38f6940a2fdc0df00b221aed39314c"}, + {file = "pydantic_core-2.20.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1eedfeb6089ed3fad42e81a67755846ad4dcc14d73698c120a82e4ccf0f1f9f6"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:635fee4e041ab9c479e31edda27fcf966ea9614fff1317e280d99eb3e5ab6fe2"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:77bf3ac639c1ff567ae3b47f8d4cc3dc20f9966a2a6dd2311dcc055d3d04fb8a"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ed1b0132f24beeec5a78b67d9388656d03e6a7c837394f99257e2d55b461611"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6514f963b023aeee506678a1cf821fe31159b925c4b76fe2afa94cc70b3222b"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10d4204d8ca33146e761c79f83cc861df20e7ae9f6487ca290a97702daf56006"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2d036c7187b9422ae5b262badb87a20a49eb6c5238b2004e96d4da1231badef1"}, + {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9ebfef07dbe1d93efb94b4700f2d278494e9162565a54f124c404a5656d7ff09"}, + {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6b9d9bb600328a1ce523ab4f454859e9d439150abb0906c5a1983c146580ebab"}, + {file = "pydantic_core-2.20.1-cp39-none-win32.whl", hash = "sha256:784c1214cb6dd1e3b15dd8b91b9a53852aed16671cc3fbe4786f4f1db07089e2"}, + {file = "pydantic_core-2.20.1-cp39-none-win_amd64.whl", hash = "sha256:d2fe69c5434391727efa54b47a1e7986bb0186e72a41b203df8f5b0a19a4f669"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:407653af5617f0757261ae249d3fba09504d7a71ab36ac057c938572d1bc9331"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:c693e916709c2465b02ca0ad7b387c4f8423d1db7b4649c551f27a529181c5ad"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b5ff4911aea936a47d9376fd3ab17e970cc543d1b68921886e7f64bd28308d1"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:177f55a886d74f1808763976ac4efd29b7ed15c69f4d838bbd74d9d09cf6fa86"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:964faa8a861d2664f0c7ab0c181af0bea66098b1919439815ca8803ef136fc4e"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4dd484681c15e6b9a977c785a345d3e378d72678fd5f1f3c0509608da24f2ac0"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f6d6cff3538391e8486a431569b77921adfcdef14eb18fbf19b7c0a5294d4e6a"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a6d511cc297ff0883bc3708b465ff82d7560193169a8b93260f74ecb0a5e08a7"}, + {file = "pydantic_core-2.20.1.tar.gz", hash = "sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4"}, ] [package.dependencies] @@ -3661,13 +3701,13 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pyjwt" -version = "2.8.0" +version = "2.9.0" description = "JSON Web Token implementation in Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"}, - {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, + {file = "PyJWT-2.9.0-py3-none-any.whl", hash = "sha256:3b02fb0f44517787776cf48f2ae25d8e14f300e6d7545a4315cee571a415e850"}, + {file = "pyjwt-2.9.0.tar.gz", hash = "sha256:7e1e5b56cc735432a7369cbfa0efe50fa113ebecdc04ae6922deba8b84582d0c"}, ] [package.dependencies] @@ -3675,8 +3715,8 @@ cryptography = {version = ">=3.4.0", optional = true, markers = "extra == \"cryp [package.extras] crypto = ["cryptography (>=3.4.0)"] -dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] -docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] +dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx", "sphinx-rtd-theme", "zope.interface"] +docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] @@ -3808,13 +3848,13 @@ cp2110 = ["hidapi"] [[package]] name = "pytest" -version = "8.2.2" +version = "8.3.2" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-8.2.2-py3-none-any.whl", hash = "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343"}, - {file = "pytest-8.2.2.tar.gz", hash = "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977"}, + {file = "pytest-8.3.2-py3-none-any.whl", hash = "sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5"}, + {file = "pytest-8.3.2.tar.gz", hash = "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce"}, ] [package.dependencies] @@ -3822,7 +3862,7 @@ colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" packaging = "*" -pluggy = ">=1.5,<2.0" +pluggy = ">=1.5,<2" tomli = {version = ">=1", markers = "python_version < \"3.11\""} [package.extras] @@ -4034,6 +4074,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"}, @@ -4070,99 +4111,120 @@ files = [ [[package]] name = "pyzmq" -version = "26.0.3" +version = "26.1.0" description = "Python bindings for 0MQ" optional = false python-versions = ">=3.7" files = [ - {file = "pyzmq-26.0.3-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:44dd6fc3034f1eaa72ece33588867df9e006a7303725a12d64c3dff92330f625"}, - {file = "pyzmq-26.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:acb704195a71ac5ea5ecf2811c9ee19ecdc62b91878528302dd0be1b9451cc90"}, - {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dbb9c997932473a27afa93954bb77a9f9b786b4ccf718d903f35da3232317de"}, - {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6bcb34f869d431799c3ee7d516554797f7760cb2198ecaa89c3f176f72d062be"}, - {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ece17ec5f20d7d9b442e5174ae9f020365d01ba7c112205a4d59cf19dc38ee"}, - {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:ba6e5e6588e49139a0979d03a7deb9c734bde647b9a8808f26acf9c547cab1bf"}, - {file = "pyzmq-26.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3bf8b000a4e2967e6dfdd8656cd0757d18c7e5ce3d16339e550bd462f4857e59"}, - {file = "pyzmq-26.0.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2136f64fbb86451dbbf70223635a468272dd20075f988a102bf8a3f194a411dc"}, - {file = "pyzmq-26.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e8918973fbd34e7814f59143c5f600ecd38b8038161239fd1a3d33d5817a38b8"}, - {file = "pyzmq-26.0.3-cp310-cp310-win32.whl", hash = "sha256:0aaf982e68a7ac284377d051c742610220fd06d330dcd4c4dbb4cdd77c22a537"}, - {file = "pyzmq-26.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:f1a9b7d00fdf60b4039f4455afd031fe85ee8305b019334b72dcf73c567edc47"}, - {file = "pyzmq-26.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:80b12f25d805a919d53efc0a5ad7c0c0326f13b4eae981a5d7b7cc343318ebb7"}, - {file = "pyzmq-26.0.3-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:a72a84570f84c374b4c287183debc776dc319d3e8ce6b6a0041ce2e400de3f32"}, - {file = "pyzmq-26.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ca684ee649b55fd8f378127ac8462fb6c85f251c2fb027eb3c887e8ee347bcd"}, - {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e222562dc0f38571c8b1ffdae9d7adb866363134299264a1958d077800b193b7"}, - {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f17cde1db0754c35a91ac00b22b25c11da6eec5746431d6e5092f0cd31a3fea9"}, - {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b7c0c0b3244bb2275abe255d4a30c050d541c6cb18b870975553f1fb6f37527"}, - {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:ac97a21de3712afe6a6c071abfad40a6224fd14fa6ff0ff8d0c6e6cd4e2f807a"}, - {file = "pyzmq-26.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:88b88282e55fa39dd556d7fc04160bcf39dea015f78e0cecec8ff4f06c1fc2b5"}, - {file = "pyzmq-26.0.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:72b67f966b57dbd18dcc7efbc1c7fc9f5f983e572db1877081f075004614fcdd"}, - {file = "pyzmq-26.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f4b6cecbbf3b7380f3b61de3a7b93cb721125dc125c854c14ddc91225ba52f83"}, - {file = "pyzmq-26.0.3-cp311-cp311-win32.whl", hash = "sha256:eed56b6a39216d31ff8cd2f1d048b5bf1700e4b32a01b14379c3b6dde9ce3aa3"}, - {file = "pyzmq-26.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:3191d312c73e3cfd0f0afdf51df8405aafeb0bad71e7ed8f68b24b63c4f36500"}, - {file = "pyzmq-26.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:b6907da3017ef55139cf0e417c5123a84c7332520e73a6902ff1f79046cd3b94"}, - {file = "pyzmq-26.0.3-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:068ca17214038ae986d68f4a7021f97e187ed278ab6dccb79f837d765a54d753"}, - {file = "pyzmq-26.0.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7821d44fe07335bea256b9f1f41474a642ca55fa671dfd9f00af8d68a920c2d4"}, - {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eeb438a26d87c123bb318e5f2b3d86a36060b01f22fbdffd8cf247d52f7c9a2b"}, - {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:69ea9d6d9baa25a4dc9cef5e2b77b8537827b122214f210dd925132e34ae9b12"}, - {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7daa3e1369355766dea11f1d8ef829905c3b9da886ea3152788dc25ee6079e02"}, - {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:6ca7a9a06b52d0e38ccf6bca1aeff7be178917893f3883f37b75589d42c4ac20"}, - {file = "pyzmq-26.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1b7d0e124948daa4d9686d421ef5087c0516bc6179fdcf8828b8444f8e461a77"}, - {file = "pyzmq-26.0.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e746524418b70f38550f2190eeee834db8850088c834d4c8406fbb9bc1ae10b2"}, - {file = "pyzmq-26.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:6b3146f9ae6af82c47a5282ac8803523d381b3b21caeae0327ed2f7ecb718798"}, - {file = "pyzmq-26.0.3-cp312-cp312-win32.whl", hash = "sha256:2b291d1230845871c00c8462c50565a9cd6026fe1228e77ca934470bb7d70ea0"}, - {file = "pyzmq-26.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:926838a535c2c1ea21c903f909a9a54e675c2126728c21381a94ddf37c3cbddf"}, - {file = "pyzmq-26.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:5bf6c237f8c681dfb91b17f8435b2735951f0d1fad10cc5dfd96db110243370b"}, - {file = "pyzmq-26.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c0991f5a96a8e620f7691e61178cd8f457b49e17b7d9cfa2067e2a0a89fc1d5"}, - {file = "pyzmq-26.0.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dbf012d8fcb9f2cf0643b65df3b355fdd74fc0035d70bb5c845e9e30a3a4654b"}, - {file = "pyzmq-26.0.3-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:01fbfbeb8249a68d257f601deb50c70c929dc2dfe683b754659569e502fbd3aa"}, - {file = "pyzmq-26.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c8eb19abe87029c18f226d42b8a2c9efdd139d08f8bf6e085dd9075446db450"}, - {file = "pyzmq-26.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5344b896e79800af86ad643408ca9aa303a017f6ebff8cee5a3163c1e9aec987"}, - {file = "pyzmq-26.0.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:204e0f176fd1d067671157d049466869b3ae1fc51e354708b0dc41cf94e23a3a"}, - {file = "pyzmq-26.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a42db008d58530efa3b881eeee4991146de0b790e095f7ae43ba5cc612decbc5"}, - {file = "pyzmq-26.0.3-cp37-cp37m-win32.whl", hash = "sha256:8d7a498671ca87e32b54cb47c82a92b40130a26c5197d392720a1bce1b3c77cf"}, - {file = "pyzmq-26.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:3b4032a96410bdc760061b14ed6a33613ffb7f702181ba999df5d16fb96ba16a"}, - {file = "pyzmq-26.0.3-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:2cc4e280098c1b192c42a849de8de2c8e0f3a84086a76ec5b07bfee29bda7d18"}, - {file = "pyzmq-26.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5bde86a2ed3ce587fa2b207424ce15b9a83a9fa14422dcc1c5356a13aed3df9d"}, - {file = "pyzmq-26.0.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:34106f68e20e6ff253c9f596ea50397dbd8699828d55e8fa18bd4323d8d966e6"}, - {file = "pyzmq-26.0.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ebbbd0e728af5db9b04e56389e2299a57ea8b9dd15c9759153ee2455b32be6ad"}, - {file = "pyzmq-26.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6b1d1c631e5940cac5a0b22c5379c86e8df6a4ec277c7a856b714021ab6cfad"}, - {file = "pyzmq-26.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e891ce81edd463b3b4c3b885c5603c00141151dd9c6936d98a680c8c72fe5c67"}, - {file = "pyzmq-26.0.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:9b273ecfbc590a1b98f014ae41e5cf723932f3b53ba9367cfb676f838038b32c"}, - {file = "pyzmq-26.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b32bff85fb02a75ea0b68f21e2412255b5731f3f389ed9aecc13a6752f58ac97"}, - {file = "pyzmq-26.0.3-cp38-cp38-win32.whl", hash = "sha256:f6c21c00478a7bea93caaaef9e7629145d4153b15a8653e8bb4609d4bc70dbfc"}, - {file = "pyzmq-26.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:3401613148d93ef0fd9aabdbddb212de3db7a4475367f49f590c837355343972"}, - {file = "pyzmq-26.0.3-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:2ed8357f4c6e0daa4f3baf31832df8a33334e0fe5b020a61bc8b345a3db7a606"}, - {file = "pyzmq-26.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c1c8f2a2ca45292084c75bb6d3a25545cff0ed931ed228d3a1810ae3758f975f"}, - {file = "pyzmq-26.0.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b63731993cdddcc8e087c64e9cf003f909262b359110070183d7f3025d1c56b5"}, - {file = "pyzmq-26.0.3-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b3cd31f859b662ac5d7f4226ec7d8bd60384fa037fc02aee6ff0b53ba29a3ba8"}, - {file = "pyzmq-26.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:115f8359402fa527cf47708d6f8a0f8234f0e9ca0cab7c18c9c189c194dbf620"}, - {file = "pyzmq-26.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:715bdf952b9533ba13dfcf1f431a8f49e63cecc31d91d007bc1deb914f47d0e4"}, - {file = "pyzmq-26.0.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e1258c639e00bf5e8a522fec6c3eaa3e30cf1c23a2f21a586be7e04d50c9acab"}, - {file = "pyzmq-26.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:15c59e780be8f30a60816a9adab900c12a58d79c1ac742b4a8df044ab2a6d920"}, - {file = "pyzmq-26.0.3-cp39-cp39-win32.whl", hash = "sha256:d0cdde3c78d8ab5b46595054e5def32a755fc028685add5ddc7403e9f6de9879"}, - {file = "pyzmq-26.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:ce828058d482ef860746bf532822842e0ff484e27f540ef5c813d516dd8896d2"}, - {file = "pyzmq-26.0.3-cp39-cp39-win_arm64.whl", hash = "sha256:788f15721c64109cf720791714dc14afd0f449d63f3a5487724f024345067381"}, - {file = "pyzmq-26.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2c18645ef6294d99b256806e34653e86236eb266278c8ec8112622b61db255de"}, - {file = "pyzmq-26.0.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e6bc96ebe49604df3ec2c6389cc3876cabe475e6bfc84ced1bf4e630662cb35"}, - {file = "pyzmq-26.0.3-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:971e8990c5cc4ddcff26e149398fc7b0f6a042306e82500f5e8db3b10ce69f84"}, - {file = "pyzmq-26.0.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8416c23161abd94cc7da80c734ad7c9f5dbebdadfdaa77dad78244457448223"}, - {file = "pyzmq-26.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:082a2988364b60bb5de809373098361cf1dbb239623e39e46cb18bc035ed9c0c"}, - {file = "pyzmq-26.0.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d57dfbf9737763b3a60d26e6800e02e04284926329aee8fb01049635e957fe81"}, - {file = "pyzmq-26.0.3-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:77a85dca4c2430ac04dc2a2185c2deb3858a34fe7f403d0a946fa56970cf60a1"}, - {file = "pyzmq-26.0.3-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4c82a6d952a1d555bf4be42b6532927d2a5686dd3c3e280e5f63225ab47ac1f5"}, - {file = "pyzmq-26.0.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4496b1282c70c442809fc1b151977c3d967bfb33e4e17cedbf226d97de18f709"}, - {file = "pyzmq-26.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:e4946d6bdb7ba972dfda282f9127e5756d4f299028b1566d1245fa0d438847e6"}, - {file = "pyzmq-26.0.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:03c0ae165e700364b266876d712acb1ac02693acd920afa67da2ebb91a0b3c09"}, - {file = "pyzmq-26.0.3-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:3e3070e680f79887d60feeda051a58d0ac36622e1759f305a41059eff62c6da7"}, - {file = "pyzmq-26.0.3-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6ca08b840fe95d1c2bd9ab92dac5685f949fc6f9ae820ec16193e5ddf603c3b2"}, - {file = "pyzmq-26.0.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e76654e9dbfb835b3518f9938e565c7806976c07b37c33526b574cc1a1050480"}, - {file = "pyzmq-26.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:871587bdadd1075b112e697173e946a07d722459d20716ceb3d1bd6c64bd08ce"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d0a2d1bd63a4ad79483049b26514e70fa618ce6115220da9efdff63688808b17"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0270b49b6847f0d106d64b5086e9ad5dc8a902413b5dbbb15d12b60f9c1747a4"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:703c60b9910488d3d0954ca585c34f541e506a091a41930e663a098d3b794c67"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74423631b6be371edfbf7eabb02ab995c2563fee60a80a30829176842e71722a"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4adfbb5451196842a88fda3612e2c0414134874bffb1c2ce83ab4242ec9e027d"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3516119f4f9b8671083a70b6afaa0a070f5683e431ab3dc26e9215620d7ca1ad"}, - {file = "pyzmq-26.0.3.tar.gz", hash = "sha256:dba7d9f2e047dfa2bca3b01f4f84aa5246725203d6284e3790f2ca15fba6b40a"}, + {file = "pyzmq-26.1.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:263cf1e36862310bf5becfbc488e18d5d698941858860c5a8c079d1511b3b18e"}, + {file = "pyzmq-26.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d5c8b17f6e8f29138678834cf8518049e740385eb2dbf736e8f07fc6587ec682"}, + {file = "pyzmq-26.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75a95c2358fcfdef3374cb8baf57f1064d73246d55e41683aaffb6cfe6862917"}, + {file = "pyzmq-26.1.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f99de52b8fbdb2a8f5301ae5fc0f9e6b3ba30d1d5fc0421956967edcc6914242"}, + {file = "pyzmq-26.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bcbfbab4e1895d58ab7da1b5ce9a327764f0366911ba5b95406c9104bceacb0"}, + {file = "pyzmq-26.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:77ce6a332c7e362cb59b63f5edf730e83590d0ab4e59c2aa5bd79419a42e3449"}, + {file = "pyzmq-26.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ba0a31d00e8616149a5ab440d058ec2da621e05d744914774c4dde6837e1f545"}, + {file = "pyzmq-26.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8b88641384e84a258b740801cd4dbc45c75f148ee674bec3149999adda4a8598"}, + {file = "pyzmq-26.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2fa76ebcebe555cce90f16246edc3ad83ab65bb7b3d4ce408cf6bc67740c4f88"}, + {file = "pyzmq-26.1.0-cp310-cp310-win32.whl", hash = "sha256:fbf558551cf415586e91160d69ca6416f3fce0b86175b64e4293644a7416b81b"}, + {file = "pyzmq-26.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:a7b8aab50e5a288c9724d260feae25eda69582be84e97c012c80e1a5e7e03fb2"}, + {file = "pyzmq-26.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:08f74904cb066e1178c1ec706dfdb5c6c680cd7a8ed9efebeac923d84c1f13b1"}, + {file = "pyzmq-26.1.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:46d6800b45015f96b9d92ece229d92f2aef137d82906577d55fadeb9cf5fcb71"}, + {file = "pyzmq-26.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5bc2431167adc50ba42ea3e5e5f5cd70d93e18ab7b2f95e724dd8e1bd2c38120"}, + {file = "pyzmq-26.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3bb34bebaa1b78e562931a1687ff663d298013f78f972a534f36c523311a84d"}, + {file = "pyzmq-26.1.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd3f6329340cef1c7ba9611bd038f2d523cea79f09f9c8f6b0553caba59ec562"}, + {file = "pyzmq-26.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:471880c4c14e5a056a96cd224f5e71211997d40b4bf5e9fdded55dafab1f98f2"}, + {file = "pyzmq-26.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:ce6f2b66799971cbae5d6547acefa7231458289e0ad481d0be0740535da38d8b"}, + {file = "pyzmq-26.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0a1f6ea5b1d6cdbb8cfa0536f0d470f12b4b41ad83625012e575f0e3ecfe97f0"}, + {file = "pyzmq-26.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b45e6445ac95ecb7d728604bae6538f40ccf4449b132b5428c09918523abc96d"}, + {file = "pyzmq-26.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:94c4262626424683feea0f3c34951d39d49d354722db2745c42aa6bb50ecd93b"}, + {file = "pyzmq-26.1.0-cp311-cp311-win32.whl", hash = "sha256:a0f0ab9df66eb34d58205913f4540e2ad17a175b05d81b0b7197bc57d000e829"}, + {file = "pyzmq-26.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:8efb782f5a6c450589dbab4cb0f66f3a9026286333fe8f3a084399149af52f29"}, + {file = "pyzmq-26.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:f133d05aaf623519f45e16ab77526e1e70d4e1308e084c2fb4cedb1a0c764bbb"}, + {file = "pyzmq-26.1.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:3d3146b1c3dcc8a1539e7cc094700b2be1e605a76f7c8f0979b6d3bde5ad4072"}, + {file = "pyzmq-26.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d9270fbf038bf34ffca4855bcda6e082e2c7f906b9eb8d9a8ce82691166060f7"}, + {file = "pyzmq-26.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:995301f6740a421afc863a713fe62c0aaf564708d4aa057dfdf0f0f56525294b"}, + {file = "pyzmq-26.1.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7eca8b89e56fb8c6c26dd3e09bd41b24789022acf1cf13358e96f1cafd8cae3"}, + {file = "pyzmq-26.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d4feb2e83dfe9ace6374a847e98ee9d1246ebadcc0cb765482e272c34e5820"}, + {file = "pyzmq-26.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d4fafc2eb5d83f4647331267808c7e0c5722c25a729a614dc2b90479cafa78bd"}, + {file = "pyzmq-26.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:58c33dc0e185dd97a9ac0288b3188d1be12b756eda67490e6ed6a75cf9491d79"}, + {file = "pyzmq-26.1.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:68a0a1d83d33d8367ddddb3e6bb4afbb0f92bd1dac2c72cd5e5ddc86bdafd3eb"}, + {file = "pyzmq-26.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2ae7c57e22ad881af78075e0cea10a4c778e67234adc65c404391b417a4dda83"}, + {file = "pyzmq-26.1.0-cp312-cp312-win32.whl", hash = "sha256:347e84fc88cc4cb646597f6d3a7ea0998f887ee8dc31c08587e9c3fd7b5ccef3"}, + {file = "pyzmq-26.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:9f136a6e964830230912f75b5a116a21fe8e34128dcfd82285aa0ef07cb2c7bd"}, + {file = "pyzmq-26.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:a4b7a989c8f5a72ab1b2bbfa58105578753ae77b71ba33e7383a31ff75a504c4"}, + {file = "pyzmq-26.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d416f2088ac8f12daacffbc2e8918ef4d6be8568e9d7155c83b7cebed49d2322"}, + {file = "pyzmq-26.1.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:ecb6c88d7946166d783a635efc89f9a1ff11c33d680a20df9657b6902a1d133b"}, + {file = "pyzmq-26.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:471312a7375571857a089342beccc1a63584315188560c7c0da7e0a23afd8a5c"}, + {file = "pyzmq-26.1.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e6cea102ffa16b737d11932c426f1dc14b5938cf7bc12e17269559c458ac334"}, + {file = "pyzmq-26.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec7248673ffc7104b54e4957cee38b2f3075a13442348c8d651777bf41aa45ee"}, + {file = "pyzmq-26.1.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:0614aed6f87d550b5cecb03d795f4ddbb1544b78d02a4bd5eecf644ec98a39f6"}, + {file = "pyzmq-26.1.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:e8746ce968be22a8a1801bf4a23e565f9687088580c3ed07af5846580dd97f76"}, + {file = "pyzmq-26.1.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:7688653574392d2eaeef75ddcd0b2de5b232d8730af29af56c5adf1df9ef8d6f"}, + {file = "pyzmq-26.1.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:8d4dac7d97f15c653a5fedcafa82626bd6cee1450ccdaf84ffed7ea14f2b07a4"}, + {file = "pyzmq-26.1.0-cp313-cp313-win32.whl", hash = "sha256:ccb42ca0a4a46232d716779421bbebbcad23c08d37c980f02cc3a6bd115ad277"}, + {file = "pyzmq-26.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e1e5d0a25aea8b691a00d6b54b28ac514c8cc0d8646d05f7ca6cb64b97358250"}, + {file = "pyzmq-26.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:fc82269d24860cfa859b676d18850cbb8e312dcd7eada09e7d5b007e2f3d9eb1"}, + {file = "pyzmq-26.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:416ac51cabd54f587995c2b05421324700b22e98d3d0aa2cfaec985524d16f1d"}, + {file = "pyzmq-26.1.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:ff832cce719edd11266ca32bc74a626b814fff236824aa1aeaad399b69fe6eae"}, + {file = "pyzmq-26.1.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:393daac1bcf81b2a23e696b7b638eedc965e9e3d2112961a072b6cd8179ad2eb"}, + {file = "pyzmq-26.1.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9869fa984c8670c8ab899a719eb7b516860a29bc26300a84d24d8c1b71eae3ec"}, + {file = "pyzmq-26.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b3b8e36fd4c32c0825b4461372949ecd1585d326802b1321f8b6dc1d7e9318c"}, + {file = "pyzmq-26.1.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:3ee647d84b83509b7271457bb428cc347037f437ead4b0b6e43b5eba35fec0aa"}, + {file = "pyzmq-26.1.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:45cb1a70eb00405ce3893041099655265fabcd9c4e1e50c330026e82257892c1"}, + {file = "pyzmq-26.1.0-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:5cca7b4adb86d7470e0fc96037771981d740f0b4cb99776d5cb59cd0e6684a73"}, + {file = "pyzmq-26.1.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:91d1a20bdaf3b25f3173ff44e54b1cfbc05f94c9e8133314eb2962a89e05d6e3"}, + {file = "pyzmq-26.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c0665d85535192098420428c779361b8823d3d7ec4848c6af3abb93bc5c915bf"}, + {file = "pyzmq-26.1.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:96d7c1d35ee4a495df56c50c83df7af1c9688cce2e9e0edffdbf50889c167595"}, + {file = "pyzmq-26.1.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b281b5ff5fcc9dcbfe941ac5c7fcd4b6c065adad12d850f95c9d6f23c2652384"}, + {file = "pyzmq-26.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5384c527a9a004445c5074f1e20db83086c8ff1682a626676229aafd9cf9f7d1"}, + {file = "pyzmq-26.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:754c99a9840839375ee251b38ac5964c0f369306eddb56804a073b6efdc0cd88"}, + {file = "pyzmq-26.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9bdfcb74b469b592972ed881bad57d22e2c0acc89f5e8c146782d0d90fb9f4bf"}, + {file = "pyzmq-26.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bd13f0231f4788db619347b971ca5f319c5b7ebee151afc7c14632068c6261d3"}, + {file = "pyzmq-26.1.0-cp37-cp37m-win32.whl", hash = "sha256:c5668dac86a869349828db5fc928ee3f58d450dce2c85607067d581f745e4fb1"}, + {file = "pyzmq-26.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ad875277844cfaeca7fe299ddf8c8d8bfe271c3dc1caf14d454faa5cdbf2fa7a"}, + {file = "pyzmq-26.1.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:65c6e03cc0222eaf6aad57ff4ecc0a070451e23232bb48db4322cc45602cede0"}, + {file = "pyzmq-26.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:038ae4ffb63e3991f386e7fda85a9baab7d6617fe85b74a8f9cab190d73adb2b"}, + {file = "pyzmq-26.1.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:bdeb2c61611293f64ac1073f4bf6723b67d291905308a7de9bb2ca87464e3273"}, + {file = "pyzmq-26.1.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:61dfa5ee9d7df297c859ac82b1226d8fefaf9c5113dc25c2c00ecad6feeeb04f"}, + {file = "pyzmq-26.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3292d384537b9918010769b82ab3e79fca8b23d74f56fc69a679106a3e2c2cf"}, + {file = "pyzmq-26.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f9499c70c19ff0fbe1007043acb5ad15c1dec7d8e84ab429bca8c87138e8f85c"}, + {file = "pyzmq-26.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d3dd5523ed258ad58fed7e364c92a9360d1af8a9371e0822bd0146bdf017ef4c"}, + {file = "pyzmq-26.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baba2fd199b098c5544ef2536b2499d2e2155392973ad32687024bd8572a7d1c"}, + {file = "pyzmq-26.1.0-cp38-cp38-win32.whl", hash = "sha256:ddbb2b386128d8eca92bd9ca74e80f73fe263bcca7aa419f5b4cbc1661e19741"}, + {file = "pyzmq-26.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:79e45a4096ec8388cdeb04a9fa5e9371583bcb826964d55b8b66cbffe7b33c86"}, + {file = "pyzmq-26.1.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:add52c78a12196bc0fda2de087ba6c876ea677cbda2e3eba63546b26e8bf177b"}, + {file = "pyzmq-26.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:98c03bd7f3339ff47de7ea9ac94a2b34580a8d4df69b50128bb6669e1191a895"}, + {file = "pyzmq-26.1.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dcc37d9d708784726fafc9c5e1232de655a009dbf97946f117aefa38d5985a0f"}, + {file = "pyzmq-26.1.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5a6ed52f0b9bf8dcc64cc82cce0607a3dfed1dbb7e8c6f282adfccc7be9781de"}, + {file = "pyzmq-26.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:451e16ae8bea3d95649317b463c9f95cd9022641ec884e3d63fc67841ae86dfe"}, + {file = "pyzmq-26.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:906e532c814e1d579138177a00ae835cd6becbf104d45ed9093a3aaf658f6a6a"}, + {file = "pyzmq-26.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:05bacc4f94af468cc82808ae3293390278d5f3375bb20fef21e2034bb9a505b6"}, + {file = "pyzmq-26.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:57bb2acba798dc3740e913ffadd56b1fcef96f111e66f09e2a8db3050f1f12c8"}, + {file = "pyzmq-26.1.0-cp39-cp39-win32.whl", hash = "sha256:f774841bb0e8588505002962c02da420bcfb4c5056e87a139c6e45e745c0e2e2"}, + {file = "pyzmq-26.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:359c533bedc62c56415a1f5fcfd8279bc93453afdb0803307375ecf81c962402"}, + {file = "pyzmq-26.1.0-cp39-cp39-win_arm64.whl", hash = "sha256:7907419d150b19962138ecec81a17d4892ea440c184949dc29b358bc730caf69"}, + {file = "pyzmq-26.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b24079a14c9596846bf7516fe75d1e2188d4a528364494859106a33d8b48be38"}, + {file = "pyzmq-26.1.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59d0acd2976e1064f1b398a00e2c3e77ed0a157529779e23087d4c2fb8aaa416"}, + {file = "pyzmq-26.1.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:911c43a4117915203c4cc8755e0f888e16c4676a82f61caee2f21b0c00e5b894"}, + {file = "pyzmq-26.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b10163e586cc609f5f85c9b233195554d77b1e9a0801388907441aaeb22841c5"}, + {file = "pyzmq-26.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:28a8b2abb76042f5fd7bd720f7fea48c0fd3e82e9de0a1bf2c0de3812ce44a42"}, + {file = "pyzmq-26.1.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bef24d3e4ae2c985034439f449e3f9e06bf579974ce0e53d8a507a1577d5b2ab"}, + {file = "pyzmq-26.1.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2cd0f4d314f4a2518e8970b6f299ae18cff7c44d4a1fc06fc713f791c3a9e3ea"}, + {file = "pyzmq-26.1.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fa25a620eed2a419acc2cf10135b995f8f0ce78ad00534d729aa761e4adcef8a"}, + {file = "pyzmq-26.1.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef3b048822dca6d231d8a8ba21069844ae38f5d83889b9b690bf17d2acc7d099"}, + {file = "pyzmq-26.1.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:9a6847c92d9851b59b9f33f968c68e9e441f9a0f8fc972c5580c5cd7cbc6ee24"}, + {file = "pyzmq-26.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c9b9305004d7e4e6a824f4f19b6d8f32b3578aad6f19fc1122aaf320cbe3dc83"}, + {file = "pyzmq-26.1.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:63c1d3a65acb2f9c92dce03c4e1758cc552f1ae5c78d79a44e3bb88d2fa71f3a"}, + {file = "pyzmq-26.1.0-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d36b8fffe8b248a1b961c86fbdfa0129dfce878731d169ede7fa2631447331be"}, + {file = "pyzmq-26.1.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67976d12ebfd61a3bc7d77b71a9589b4d61d0422282596cf58c62c3866916544"}, + {file = "pyzmq-26.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:998444debc8816b5d8d15f966e42751032d0f4c55300c48cc337f2b3e4f17d03"}, + {file = "pyzmq-26.1.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e5c88b2f13bcf55fee78ea83567b9fe079ba1a4bef8b35c376043440040f7edb"}, + {file = "pyzmq-26.1.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d906d43e1592be4b25a587b7d96527cb67277542a5611e8ea9e996182fae410"}, + {file = "pyzmq-26.1.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80b0c9942430d731c786545da6be96d824a41a51742e3e374fedd9018ea43106"}, + {file = "pyzmq-26.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:314d11564c00b77f6224d12eb3ddebe926c301e86b648a1835c5b28176c83eab"}, + {file = "pyzmq-26.1.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:093a1a3cae2496233f14b57f4b485da01b4ff764582c854c0f42c6dd2be37f3d"}, + {file = "pyzmq-26.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3c397b1b450f749a7e974d74c06d69bd22dd362142f370ef2bd32a684d6b480c"}, + {file = "pyzmq-26.1.0.tar.gz", hash = "sha256:6c5aeea71f018ebd3b9115c7cb13863dd850e98ca6b9258509de1246461a7e7f"}, ] [package.dependencies] @@ -4413,38 +4475,38 @@ interplot = ["dill (>=0.3.4,<0.4.0)", "ipython (>=7.31.1,<8.0.0)", "pypiwin32 (> [[package]] name = "qutip" -version = "5.0.2" +version = "5.0.3.post1" description = "QuTiP: The Quantum Toolbox in Python" optional = false python-versions = ">=3.9" files = [ - {file = "qutip-5.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e31c629d2f45ed60cf2510b64f867632a2148dac34b1d3e047c27e8c9e35713"}, - {file = "qutip-5.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ebf1bf3d5a3e8337121549d4dab62a28b268d417f1614598bd9422f5b2669fd9"}, - {file = "qutip-5.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:08c7b7a42796b160b3d58eb0873797ad15748c5842076f259ecfed2e9645f5a9"}, - {file = "qutip-5.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fb1fd548a1db7217530569773a8fa617ee1cf1ff9776efc84684f1f40089b8bf"}, - {file = "qutip-5.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f298929be214bb057cddb5434711b8471779259115329ed7edea501b489d3b79"}, - {file = "qutip-5.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:2f385d6b540def78aabc87c5aaf230bd83b58db7a6383b11651354a30f3c2bf8"}, - {file = "qutip-5.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:52eabd9e1bfa608b0af13d07bda8f43b97f2d9d3cb1ea493d35a851bc2cbf006"}, - {file = "qutip-5.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97fc764e302da7450c63727773e21cab78b45fc66f6e904e28a786c0f87f7db3"}, - {file = "qutip-5.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:0fb98f3ff347ee75d90a7b3ae65014c62e6985abf62d28e75d26ad8fde541867"}, - {file = "qutip-5.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5be725b2d43cd88be6432b14d687e850c653bee24ca277423c7a737b7be389ec"}, - {file = "qutip-5.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd57dc5c1e654f3e8d4dcad1d3ffa3fba608b8ca9523088d5f7a19004f3b26f9"}, - {file = "qutip-5.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:493fcdf20f43b61a426b206ae7ce01265d869f8038934c097076d6611a228cb6"}, - {file = "qutip-5.0.2.tar.gz", hash = "sha256:1c3d0fecc3e237783a9ef22cec2c54f49f0da4c17b9ee036848bdd9009f4baf5"}, + {file = "qutip-5.0.3.post1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:345a79f07256ad6b543b7cb207e45f402018e180d476f70b612eaf705387c4ce"}, + {file = "qutip-5.0.3.post1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79d866cdf87819900df9169b1a73bee9c15643f2e80b9f0494d3d94ab94b267e"}, + {file = "qutip-5.0.3.post1-cp310-cp310-win_amd64.whl", hash = "sha256:095c43b1d9c13763cdfa0947e459bb24b30a0582039383944f503ab6f5157637"}, + {file = "qutip-5.0.3.post1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9acd0484f770d3c66f0e285357afa5ee0a047de11ef25b025c4359a8f8e98411"}, + {file = "qutip-5.0.3.post1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2ad3aab764da51a1dcf804bdaec151ddbaa88812986c0b53147be69a3dd9aec"}, + {file = "qutip-5.0.3.post1-cp311-cp311-win_amd64.whl", hash = "sha256:ed1b75ae0aa65bbe5dd5efd8652223df674df9182770e41bb2eee96c45a4f5e1"}, + {file = "qutip-5.0.3.post1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d0c5d1a6a5e57ba3b182bface793c0ce82cc6f531404e0471159c1183404b01d"}, + {file = "qutip-5.0.3.post1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b30f4f9738c18cf8904ae1fdc94a92e94e8aff7ea305f14791e7359d7ece946e"}, + {file = "qutip-5.0.3.post1-cp312-cp312-win_amd64.whl", hash = "sha256:b6a7a3511ce886dbf27ed4b28be51c0b4f76edd3e35e1e22a82000e10b101403"}, + {file = "qutip-5.0.3.post1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:073e798828fffc941a98e850d0332d78995466ffbbb95edcd58cf4af0d8b2f9e"}, + {file = "qutip-5.0.3.post1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0365fedd161b6fd8461207456258a5859fb0d8bb771d52bfae845c78a4275859"}, + {file = "qutip-5.0.3.post1-cp39-cp39-win_amd64.whl", hash = "sha256:4a44e11e70093390eeee00f81b34e46718cccf2aa612b4d5728031f062af379b"}, + {file = "qutip-5.0.3.post1.tar.gz", hash = "sha256:a00a27380f7c799444d2553888f5050de3ea6ff44247e468cb7dced71d789f0e"}, ] [package.dependencies] -numpy = ">=1.22,<2.0.0" +numpy = ">=1.22" packaging = "*" -scipy = ">=1.8" +scipy = ">=1.9" [package.extras] extras = ["loky", "tqdm"] -full = ["cvxopt", "cvxpy (>=1.0)", "cython (>=0.29.20)", "cython (>=0.29.20,<3.0.0)", "filelock", "ipython", "loky", "matplotlib (>=1.2.1)", "pytest (>=5.2)", "pytest-rerunfailures", "setuptools", "tqdm"] -graphics = ["matplotlib (>=1.2.1)"] +full = ["cvxopt", "cvxpy (>=1.0)", "cython (>=0.29.20)", "filelock", "ipython", "loky", "matplotlib (>=3.5)", "pytest (>=5.2)", "pytest-rerunfailures", "setuptools", "tqdm"] +graphics = ["matplotlib (>=3.5)"] ipython = ["ipython"] mpi = ["mpi4py"] -runtime-compilation = ["cython (>=0.29.20)", "cython (>=0.29.20,<3.0.0)", "filelock", "setuptools"] +runtime-compilation = ["cython (>=0.29.20)", "filelock", "setuptools"] semidefinite = ["cvxopt", "cvxpy (>=1.0)"] tests = ["pytest (>=5.2)", "pytest-rerunfailures"] @@ -4551,110 +4613,114 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "rpds-py" -version = "0.18.1" +version = "0.19.1" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.8" files = [ - {file = "rpds_py-0.18.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:d31dea506d718693b6b2cffc0648a8929bdc51c70a311b2770f09611caa10d53"}, - {file = "rpds_py-0.18.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:732672fbc449bab754e0b15356c077cc31566df874964d4801ab14f71951ea80"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a98a1f0552b5f227a3d6422dbd61bc6f30db170939bd87ed14f3c339aa6c7c9"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f1944ce16401aad1e3f7d312247b3d5de7981f634dc9dfe90da72b87d37887d"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38e14fb4e370885c4ecd734f093a2225ee52dc384b86fa55fe3f74638b2cfb09"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08d74b184f9ab6289b87b19fe6a6d1a97fbfea84b8a3e745e87a5de3029bf944"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d70129cef4a8d979caa37e7fe957202e7eee8ea02c5e16455bc9808a59c6b2f0"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ce0bb20e3a11bd04461324a6a798af34d503f8d6f1aa3d2aa8901ceaf039176d"}, - {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81c5196a790032e0fc2464c0b4ab95f8610f96f1f2fa3d4deacce6a79852da60"}, - {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f3027be483868c99b4985fda802a57a67fdf30c5d9a50338d9db646d590198da"}, - {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d44607f98caa2961bab4fa3c4309724b185b464cdc3ba6f3d7340bac3ec97cc1"}, - {file = "rpds_py-0.18.1-cp310-none-win32.whl", hash = "sha256:c273e795e7a0f1fddd46e1e3cb8be15634c29ae8ff31c196debb620e1edb9333"}, - {file = "rpds_py-0.18.1-cp310-none-win_amd64.whl", hash = "sha256:8352f48d511de5f973e4f2f9412736d7dea76c69faa6d36bcf885b50c758ab9a"}, - {file = "rpds_py-0.18.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6b5ff7e1d63a8281654b5e2896d7f08799378e594f09cf3674e832ecaf396ce8"}, - {file = "rpds_py-0.18.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8927638a4d4137a289e41d0fd631551e89fa346d6dbcfc31ad627557d03ceb6d"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:154bf5c93d79558b44e5b50cc354aa0459e518e83677791e6adb0b039b7aa6a7"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07f2139741e5deb2c5154a7b9629bc5aa48c766b643c1a6750d16f865a82c5fc"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c7672e9fba7425f79019db9945b16e308ed8bc89348c23d955c8c0540da0a07"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:489bdfe1abd0406eba6b3bb4fdc87c7fa40f1031de073d0cfb744634cc8fa261"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c20f05e8e3d4fc76875fc9cb8cf24b90a63f5a1b4c5b9273f0e8225e169b100"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:967342e045564cef76dfcf1edb700b1e20838d83b1aa02ab313e6a497cf923b8"}, - {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2cc7c1a47f3a63282ab0f422d90ddac4aa3034e39fc66a559ab93041e6505da7"}, - {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f7afbfee1157e0f9376c00bb232e80a60e59ed716e3211a80cb8506550671e6e"}, - {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9e6934d70dc50f9f8ea47081ceafdec09245fd9f6032669c3b45705dea096b88"}, - {file = "rpds_py-0.18.1-cp311-none-win32.whl", hash = "sha256:c69882964516dc143083d3795cb508e806b09fc3800fd0d4cddc1df6c36e76bb"}, - {file = "rpds_py-0.18.1-cp311-none-win_amd64.whl", hash = "sha256:70a838f7754483bcdc830444952fd89645569e7452e3226de4a613a4c1793fb2"}, - {file = "rpds_py-0.18.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3dd3cd86e1db5aadd334e011eba4e29d37a104b403e8ca24dcd6703c68ca55b3"}, - {file = "rpds_py-0.18.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:05f3d615099bd9b13ecf2fc9cf2d839ad3f20239c678f461c753e93755d629ee"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35b2b771b13eee8729a5049c976197ff58a27a3829c018a04341bcf1ae409b2b"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ee17cd26b97d537af8f33635ef38be873073d516fd425e80559f4585a7b90c43"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b646bf655b135ccf4522ed43d6902af37d3f5dbcf0da66c769a2b3938b9d8184"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19ba472b9606c36716062c023afa2484d1e4220548751bda14f725a7de17b4f6"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e30ac5e329098903262dc5bdd7e2086e0256aa762cc8b744f9e7bf2a427d3f8"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d58ad6317d188c43750cb76e9deacf6051d0f884d87dc6518e0280438648a9ac"}, - {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e1735502458621921cee039c47318cb90b51d532c2766593be6207eec53e5c4c"}, - {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f5bab211605d91db0e2995a17b5c6ee5edec1270e46223e513eaa20da20076ac"}, - {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2fc24a329a717f9e2448f8cd1f960f9dac4e45b6224d60734edeb67499bab03a"}, - {file = "rpds_py-0.18.1-cp312-none-win32.whl", hash = "sha256:1805d5901779662d599d0e2e4159d8a82c0b05faa86ef9222bf974572286b2b6"}, - {file = "rpds_py-0.18.1-cp312-none-win_amd64.whl", hash = "sha256:720edcb916df872d80f80a1cc5ea9058300b97721efda8651efcd938a9c70a72"}, - {file = "rpds_py-0.18.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:c827576e2fa017a081346dce87d532a5310241648eb3700af9a571a6e9fc7e74"}, - {file = "rpds_py-0.18.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:aa3679e751408d75a0b4d8d26d6647b6d9326f5e35c00a7ccd82b78ef64f65f8"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0abeee75434e2ee2d142d650d1e54ac1f8b01e6e6abdde8ffd6eeac6e9c38e20"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed402d6153c5d519a0faf1bb69898e97fb31613b49da27a84a13935ea9164dfc"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:338dee44b0cef8b70fd2ef54b4e09bb1b97fc6c3a58fea5db6cc083fd9fc2724"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7750569d9526199c5b97e5a9f8d96a13300950d910cf04a861d96f4273d5b104"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:607345bd5912aacc0c5a63d45a1f73fef29e697884f7e861094e443187c02be5"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:207c82978115baa1fd8d706d720b4a4d2b0913df1c78c85ba73fe6c5804505f0"}, - {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6d1e42d2735d437e7e80bab4d78eb2e459af48c0a46e686ea35f690b93db792d"}, - {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5463c47c08630007dc0fe99fb480ea4f34a89712410592380425a9b4e1611d8e"}, - {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:06d218939e1bf2ca50e6b0ec700ffe755e5216a8230ab3e87c059ebb4ea06afc"}, - {file = "rpds_py-0.18.1-cp38-none-win32.whl", hash = "sha256:312fe69b4fe1ffbe76520a7676b1e5ac06ddf7826d764cc10265c3b53f96dbe9"}, - {file = "rpds_py-0.18.1-cp38-none-win_amd64.whl", hash = "sha256:9437ca26784120a279f3137ee080b0e717012c42921eb07861b412340f85bae2"}, - {file = "rpds_py-0.18.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:19e515b78c3fc1039dd7da0a33c28c3154458f947f4dc198d3c72db2b6b5dc93"}, - {file = "rpds_py-0.18.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7b28c5b066bca9a4eb4e2f2663012debe680f097979d880657f00e1c30875a0"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:673fdbbf668dd958eff750e500495ef3f611e2ecc209464f661bc82e9838991e"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d960de62227635d2e61068f42a6cb6aae91a7fe00fca0e3aeed17667c8a34611"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:352a88dc7892f1da66b6027af06a2e7e5d53fe05924cc2cfc56495b586a10b72"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e0ee01ad8260184db21468a6e1c37afa0529acc12c3a697ee498d3c2c4dcaf3"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4c39ad2f512b4041343ea3c7894339e4ca7839ac38ca83d68a832fc8b3748ab"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aaa71ee43a703c321906813bb252f69524f02aa05bf4eec85f0c41d5d62d0f4c"}, - {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6cd8098517c64a85e790657e7b1e509b9fe07487fd358e19431cb120f7d96338"}, - {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:4adec039b8e2928983f885c53b7cc4cda8965b62b6596501a0308d2703f8af1b"}, - {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:32b7daaa3e9389db3695964ce8e566e3413b0c43e3394c05e4b243a4cd7bef26"}, - {file = "rpds_py-0.18.1-cp39-none-win32.whl", hash = "sha256:2625f03b105328729f9450c8badda34d5243231eef6535f80064d57035738360"}, - {file = "rpds_py-0.18.1-cp39-none-win_amd64.whl", hash = "sha256:bf18932d0003c8c4d51a39f244231986ab23ee057d235a12b2684ea26a353590"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cbfbea39ba64f5e53ae2915de36f130588bba71245b418060ec3330ebf85678e"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:a3d456ff2a6a4d2adcdf3c1c960a36f4fd2fec6e3b4902a42a384d17cf4e7a65"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7700936ef9d006b7ef605dc53aa364da2de5a3aa65516a1f3ce73bf82ecfc7ae"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:51584acc5916212e1bf45edd17f3a6b05fe0cbb40482d25e619f824dccb679de"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:942695a206a58d2575033ff1e42b12b2aece98d6003c6bc739fbf33d1773b12f"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b906b5f58892813e5ba5c6056d6a5ad08f358ba49f046d910ad992196ea61397"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6f8e3fecca256fefc91bb6765a693d96692459d7d4c644660a9fff32e517843"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7732770412bab81c5a9f6d20aeb60ae943a9b36dcd990d876a773526468e7163"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:bd1105b50ede37461c1d51b9698c4f4be6e13e69a908ab7751e3807985fc0346"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:618916f5535784960f3ecf8111581f4ad31d347c3de66d02e728de460a46303c"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:17c6d2155e2423f7e79e3bb18151c686d40db42d8645e7977442170c360194d4"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c4c4c3f878df21faf5fac86eda32671c27889e13570645a9eea0a1abdd50922"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:fab6ce90574645a0d6c58890e9bcaac8d94dff54fb51c69e5522a7358b80ab64"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:531796fb842b53f2695e94dc338929e9f9dbf473b64710c28af5a160b2a8927d"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:740884bc62a5e2bbb31e584f5d23b32320fd75d79f916f15a788d527a5e83644"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:998125738de0158f088aef3cb264a34251908dd2e5d9966774fdab7402edfab7"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e2be6e9dd4111d5b31ba3b74d17da54a8319d8168890fbaea4b9e5c3de630ae5"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0cee71bc618cd93716f3c1bf56653740d2d13ddbd47673efa8bf41435a60daa"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2c3caec4ec5cd1d18e5dd6ae5194d24ed12785212a90b37f5f7f06b8bedd7139"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:27bba383e8c5231cd559affe169ca0b96ec78d39909ffd817f28b166d7ddd4d8"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:a888e8bdb45916234b99da2d859566f1e8a1d2275a801bb8e4a9644e3c7e7909"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6031b25fb1b06327b43d841f33842b383beba399884f8228a6bb3df3088485ff"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48c2faaa8adfacefcbfdb5f2e2e7bdad081e5ace8d182e5f4ade971f128e6bb3"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:d85164315bd68c0806768dc6bb0429c6f95c354f87485ee3593c4f6b14def2bd"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6afd80f6c79893cfc0574956f78a0add8c76e3696f2d6a15bca2c66c415cf2d4"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa242ac1ff583e4ec7771141606aafc92b361cd90a05c30d93e343a0c2d82a89"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21be4770ff4e08698e1e8e0bce06edb6ea0626e7c8f560bc08222880aca6a6f"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c45a639e93a0c5d4b788b2613bd637468edd62f8f95ebc6fcc303d58ab3f0a8"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:910e71711d1055b2768181efa0a17537b2622afeb0424116619817007f8a2b10"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b9bb1f182a97880f6078283b3505a707057c42bf55d8fca604f70dedfdc0772a"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d54f74f40b1f7aaa595a02ff42ef38ca654b1469bef7d52867da474243cc633"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:8d2e182c9ee01135e11e9676e9a62dfad791a7a467738f06726872374a83db49"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:636a15acc588f70fda1661234761f9ed9ad79ebed3f2125d44be0862708b666e"}, - {file = "rpds_py-0.18.1.tar.gz", hash = "sha256:dc48b479d540770c811fbd1eb9ba2bb66951863e448efec2e2c102625328e92f"}, + {file = "rpds_py-0.19.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:aaf71f95b21f9dc708123335df22e5a2fef6307e3e6f9ed773b2e0938cc4d491"}, + {file = "rpds_py-0.19.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ca0dda0c5715efe2ab35bb83f813f681ebcd2840d8b1b92bfc6fe3ab382fae4a"}, + {file = "rpds_py-0.19.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81db2e7282cc0487f500d4db203edc57da81acde9e35f061d69ed983228ffe3b"}, + {file = "rpds_py-0.19.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1a8dfa125b60ec00c7c9baef945bb04abf8ac772d8ebefd79dae2a5f316d7850"}, + {file = "rpds_py-0.19.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:271accf41b02687cef26367c775ab220372ee0f4925591c6796e7c148c50cab5"}, + {file = "rpds_py-0.19.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9bc4161bd3b970cd6a6fcda70583ad4afd10f2750609fb1f3ca9505050d4ef3"}, + {file = "rpds_py-0.19.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0cf2a0dbb5987da4bd92a7ca727eadb225581dd9681365beba9accbe5308f7d"}, + {file = "rpds_py-0.19.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b5e28e56143750808c1c79c70a16519e9bc0a68b623197b96292b21b62d6055c"}, + {file = "rpds_py-0.19.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c7af6f7b80f687b33a4cdb0a785a5d4de1fb027a44c9a049d8eb67d5bfe8a687"}, + {file = "rpds_py-0.19.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e429fc517a1c5e2a70d576077231538a98d59a45dfc552d1ac45a132844e6dfb"}, + {file = "rpds_py-0.19.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d2dbd8f4990d4788cb122f63bf000357533f34860d269c1a8e90ae362090ff3a"}, + {file = "rpds_py-0.19.1-cp310-none-win32.whl", hash = "sha256:e0f9d268b19e8f61bf42a1da48276bcd05f7ab5560311f541d22557f8227b866"}, + {file = "rpds_py-0.19.1-cp310-none-win_amd64.whl", hash = "sha256:df7c841813f6265e636fe548a49664c77af31ddfa0085515326342a751a6ba51"}, + {file = "rpds_py-0.19.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:902cf4739458852fe917104365ec0efbea7d29a15e4276c96a8d33e6ed8ec137"}, + {file = "rpds_py-0.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f3d73022990ab0c8b172cce57c69fd9a89c24fd473a5e79cbce92df87e3d9c48"}, + {file = "rpds_py-0.19.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3837c63dd6918a24de6c526277910e3766d8c2b1627c500b155f3eecad8fad65"}, + {file = "rpds_py-0.19.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cdb7eb3cf3deb3dd9e7b8749323b5d970052711f9e1e9f36364163627f96da58"}, + {file = "rpds_py-0.19.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:26ab43b6d65d25b1a333c8d1b1c2f8399385ff683a35ab5e274ba7b8bb7dc61c"}, + {file = "rpds_py-0.19.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75130df05aae7a7ac171b3b5b24714cffeabd054ad2ebc18870b3aa4526eba23"}, + {file = "rpds_py-0.19.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c34f751bf67cab69638564eee34023909380ba3e0d8ee7f6fe473079bf93f09b"}, + {file = "rpds_py-0.19.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f2671cb47e50a97f419a02cd1e0c339b31de017b033186358db92f4d8e2e17d8"}, + {file = "rpds_py-0.19.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3c73254c256081704dba0a333457e2fb815364018788f9b501efe7c5e0ada401"}, + {file = "rpds_py-0.19.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4383beb4a29935b8fa28aca8fa84c956bf545cb0c46307b091b8d312a9150e6a"}, + {file = "rpds_py-0.19.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:dbceedcf4a9329cc665452db1aaf0845b85c666e4885b92ee0cddb1dbf7e052a"}, + {file = "rpds_py-0.19.1-cp311-none-win32.whl", hash = "sha256:f0a6d4a93d2a05daec7cb885157c97bbb0be4da739d6f9dfb02e101eb40921cd"}, + {file = "rpds_py-0.19.1-cp311-none-win_amd64.whl", hash = "sha256:c149a652aeac4902ecff2dd93c3b2681c608bd5208c793c4a99404b3e1afc87c"}, + {file = "rpds_py-0.19.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:56313be667a837ff1ea3508cebb1ef6681d418fa2913a0635386cf29cff35165"}, + {file = "rpds_py-0.19.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6d1d7539043b2b31307f2c6c72957a97c839a88b2629a348ebabe5aa8b626d6b"}, + {file = "rpds_py-0.19.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e1dc59a5e7bc7f44bd0c048681f5e05356e479c50be4f2c1a7089103f1621d5"}, + {file = "rpds_py-0.19.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b8f78398e67a7227aefa95f876481485403eb974b29e9dc38b307bb6eb2315ea"}, + {file = "rpds_py-0.19.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ef07a0a1d254eeb16455d839cef6e8c2ed127f47f014bbda64a58b5482b6c836"}, + {file = "rpds_py-0.19.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8124101e92c56827bebef084ff106e8ea11c743256149a95b9fd860d3a4f331f"}, + {file = "rpds_py-0.19.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08ce9c95a0b093b7aec75676b356a27879901488abc27e9d029273d280438505"}, + {file = "rpds_py-0.19.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0b02dd77a2de6e49078c8937aadabe933ceac04b41c5dde5eca13a69f3cf144e"}, + {file = "rpds_py-0.19.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4dd02e29c8cbed21a1875330b07246b71121a1c08e29f0ee3db5b4cfe16980c4"}, + {file = "rpds_py-0.19.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9c7042488165f7251dc7894cd533a875d2875af6d3b0e09eda9c4b334627ad1c"}, + {file = "rpds_py-0.19.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f809a17cc78bd331e137caa25262b507225854073fd319e987bd216bed911b7c"}, + {file = "rpds_py-0.19.1-cp312-none-win32.whl", hash = "sha256:3ddab996807c6b4227967fe1587febade4e48ac47bb0e2d3e7858bc621b1cace"}, + {file = "rpds_py-0.19.1-cp312-none-win_amd64.whl", hash = "sha256:32e0db3d6e4f45601b58e4ac75c6f24afbf99818c647cc2066f3e4b192dabb1f"}, + {file = "rpds_py-0.19.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:747251e428406b05fc86fee3904ee19550c4d2d19258cef274e2151f31ae9d38"}, + {file = "rpds_py-0.19.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dc733d35f861f8d78abfaf54035461e10423422999b360966bf1c443cbc42705"}, + {file = "rpds_py-0.19.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbda75f245caecff8faa7e32ee94dfaa8312a3367397975527f29654cd17a6ed"}, + {file = "rpds_py-0.19.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bd04d8cab16cab5b0a9ffc7d10f0779cf1120ab16c3925404428f74a0a43205a"}, + {file = "rpds_py-0.19.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2d66eb41ffca6cc3c91d8387509d27ba73ad28371ef90255c50cb51f8953301"}, + {file = "rpds_py-0.19.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fdf4890cda3b59170009d012fca3294c00140e7f2abe1910e6a730809d0f3f9b"}, + {file = "rpds_py-0.19.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1fa67ef839bad3815124f5f57e48cd50ff392f4911a9f3cf449d66fa3df62a5"}, + {file = "rpds_py-0.19.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b82c9514c6d74b89a370c4060bdb80d2299bc6857e462e4a215b4ef7aa7b090e"}, + {file = "rpds_py-0.19.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c7b07959866a6afb019abb9564d8a55046feb7a84506c74a6f197cbcdf8a208e"}, + {file = "rpds_py-0.19.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4f580ae79d0b861dfd912494ab9d477bea535bfb4756a2269130b6607a21802e"}, + {file = "rpds_py-0.19.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c6d20c8896c00775e6f62d8373aba32956aa0b850d02b5ec493f486c88e12859"}, + {file = "rpds_py-0.19.1-cp313-none-win32.whl", hash = "sha256:afedc35fe4b9e30ab240b208bb9dc8938cb4afe9187589e8d8d085e1aacb8309"}, + {file = "rpds_py-0.19.1-cp313-none-win_amd64.whl", hash = "sha256:1d4af2eb520d759f48f1073ad3caef997d1bfd910dc34e41261a595d3f038a94"}, + {file = "rpds_py-0.19.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:34bca66e2e3eabc8a19e9afe0d3e77789733c702c7c43cd008e953d5d1463fde"}, + {file = "rpds_py-0.19.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:24f8ae92c7fae7c28d0fae9b52829235df83f34847aa8160a47eb229d9666c7b"}, + {file = "rpds_py-0.19.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71157f9db7f6bc6599a852852f3389343bea34315b4e6f109e5cbc97c1fb2963"}, + {file = "rpds_py-0.19.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1d494887d40dc4dd0d5a71e9d07324e5c09c4383d93942d391727e7a40ff810b"}, + {file = "rpds_py-0.19.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7b3661e6d4ba63a094138032c1356d557de5b3ea6fd3cca62a195f623e381c76"}, + {file = "rpds_py-0.19.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97fbb77eaeb97591efdc654b8b5f3ccc066406ccfb3175b41382f221ecc216e8"}, + {file = "rpds_py-0.19.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cc4bc73e53af8e7a42c8fd7923bbe35babacfa7394ae9240b3430b5dcf16b2a"}, + {file = "rpds_py-0.19.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:35af5e4d5448fa179fd7fff0bba0fba51f876cd55212f96c8bbcecc5c684ae5c"}, + {file = "rpds_py-0.19.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:3511f6baf8438326e351097cecd137eb45c5f019944fe0fd0ae2fea2fd26be39"}, + {file = "rpds_py-0.19.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:57863d16187995c10fe9cf911b897ed443ac68189179541734502353af33e693"}, + {file = "rpds_py-0.19.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:9e318e6786b1e750a62f90c6f7fa8b542102bdcf97c7c4de2a48b50b61bd36ec"}, + {file = "rpds_py-0.19.1-cp38-none-win32.whl", hash = "sha256:53dbc35808c6faa2ce3e48571f8f74ef70802218554884787b86a30947842a14"}, + {file = "rpds_py-0.19.1-cp38-none-win_amd64.whl", hash = "sha256:8df1c283e57c9cb4d271fdc1875f4a58a143a2d1698eb0d6b7c0d7d5f49c53a1"}, + {file = "rpds_py-0.19.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:e76c902d229a3aa9d5ceb813e1cbcc69bf5bda44c80d574ff1ac1fa3136dea71"}, + {file = "rpds_py-0.19.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:de1f7cd5b6b351e1afd7568bdab94934d656abe273d66cda0ceea43bbc02a0c2"}, + {file = "rpds_py-0.19.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24fc5a84777cb61692d17988989690d6f34f7f95968ac81398d67c0d0994a897"}, + {file = "rpds_py-0.19.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:74129d5ffc4cde992d89d345f7f7d6758320e5d44a369d74d83493429dad2de5"}, + {file = "rpds_py-0.19.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e360188b72f8080fefa3adfdcf3618604cc8173651c9754f189fece068d2a45"}, + {file = "rpds_py-0.19.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13e6d4840897d4e4e6b2aa1443e3a8eca92b0402182aafc5f4ca1f5e24f9270a"}, + {file = "rpds_py-0.19.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f09529d2332264a902688031a83c19de8fda5eb5881e44233286b9c9ec91856d"}, + {file = "rpds_py-0.19.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0d4b52811dcbc1aba08fd88d475f75b4f6db0984ba12275d9bed1a04b2cae9b5"}, + {file = "rpds_py-0.19.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dd635c2c4043222d80d80ca1ac4530a633102a9f2ad12252183bcf338c1b9474"}, + {file = "rpds_py-0.19.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f35b34a5184d5e0cc360b61664c1c06e866aab077b5a7c538a3e20c8fcdbf90b"}, + {file = "rpds_py-0.19.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d4ec0046facab83012d821b33cead742a35b54575c4edfb7ed7445f63441835f"}, + {file = "rpds_py-0.19.1-cp39-none-win32.whl", hash = "sha256:f5b8353ea1a4d7dfb59a7f45c04df66ecfd363bb5b35f33b11ea579111d4655f"}, + {file = "rpds_py-0.19.1-cp39-none-win_amd64.whl", hash = "sha256:1fb93d3486f793d54a094e2bfd9cd97031f63fcb5bc18faeb3dd4b49a1c06523"}, + {file = "rpds_py-0.19.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7d5c7e32f3ee42f77d8ff1a10384b5cdcc2d37035e2e3320ded909aa192d32c3"}, + {file = "rpds_py-0.19.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:89cc8921a4a5028d6dd388c399fcd2eef232e7040345af3d5b16c04b91cf3c7e"}, + {file = "rpds_py-0.19.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bca34e913d27401bda2a6f390d0614049f5a95b3b11cd8eff80fe4ec340a1208"}, + {file = "rpds_py-0.19.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5953391af1405f968eb5701ebbb577ebc5ced8d0041406f9052638bafe52209d"}, + {file = "rpds_py-0.19.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:840e18c38098221ea6201f091fc5d4de6128961d2930fbbc96806fb43f69aec1"}, + {file = "rpds_py-0.19.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6d8b735c4d162dc7d86a9cf3d717f14b6c73637a1f9cd57fe7e61002d9cb1972"}, + {file = "rpds_py-0.19.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce757c7c90d35719b38fa3d4ca55654a76a40716ee299b0865f2de21c146801c"}, + {file = "rpds_py-0.19.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a9421b23c85f361a133aa7c5e8ec757668f70343f4ed8fdb5a4a14abd5437244"}, + {file = "rpds_py-0.19.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:3b823be829407393d84ee56dc849dbe3b31b6a326f388e171555b262e8456cc1"}, + {file = "rpds_py-0.19.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:5e58b61dcbb483a442c6239c3836696b79f2cd8e7eec11e12155d3f6f2d886d1"}, + {file = "rpds_py-0.19.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:39d67896f7235b2c886fb1ee77b1491b77049dcef6fbf0f401e7b4cbed86bbd4"}, + {file = "rpds_py-0.19.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:8b32cd4ab6db50c875001ba4f5a6b30c0f42151aa1fbf9c2e7e3674893fb1dc4"}, + {file = "rpds_py-0.19.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:1c32e41de995f39b6b315d66c27dea3ef7f7c937c06caab4c6a79a5e09e2c415"}, + {file = "rpds_py-0.19.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1a129c02b42d46758c87faeea21a9f574e1c858b9f358b6dd0bbd71d17713175"}, + {file = "rpds_py-0.19.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:346557f5b1d8fd9966059b7a748fd79ac59f5752cd0e9498d6a40e3ac1c1875f"}, + {file = "rpds_py-0.19.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:31e450840f2f27699d014cfc8865cc747184286b26d945bcea6042bb6aa4d26e"}, + {file = "rpds_py-0.19.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01227f8b3e6c8961490d869aa65c99653df80d2f0a7fde8c64ebddab2b9b02fd"}, + {file = "rpds_py-0.19.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:69084fd29bfeff14816666c93a466e85414fe6b7d236cfc108a9c11afa6f7301"}, + {file = "rpds_py-0.19.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d2b88efe65544a7d5121b0c3b003ebba92bfede2ea3577ce548b69c5235185"}, + {file = "rpds_py-0.19.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6ea961a674172ed2235d990d7edf85d15d8dfa23ab8575e48306371c070cda67"}, + {file = "rpds_py-0.19.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:5beffdbe766cfe4fb04f30644d822a1080b5359df7db3a63d30fa928375b2720"}, + {file = "rpds_py-0.19.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:720f3108fb1bfa32e51db58b832898372eb5891e8472a8093008010911e324c5"}, + {file = "rpds_py-0.19.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:c2087dbb76a87ec2c619253e021e4fb20d1a72580feeaa6892b0b3d955175a71"}, + {file = "rpds_py-0.19.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2ddd50f18ebc05ec29a0d9271e9dbe93997536da3546677f8ca00b76d477680c"}, + {file = "rpds_py-0.19.1.tar.gz", hash = "sha256:31dd5794837f00b46f4096aa8ccaa5972f73a938982e32ed817bb520c465e520"}, ] [[package]] @@ -4761,32 +4827,32 @@ files = [ [[package]] name = "scikit-learn" -version = "1.5.0" +version = "1.5.1" description = "A set of python modules for machine learning and data mining" optional = false python-versions = ">=3.9" files = [ - {file = "scikit_learn-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:12e40ac48555e6b551f0a0a5743cc94cc5a765c9513fe708e01f0aa001da2801"}, - {file = "scikit_learn-1.5.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:f405c4dae288f5f6553b10c4ac9ea7754d5180ec11e296464adb5d6ac68b6ef5"}, - {file = "scikit_learn-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df8ccabbf583315f13160a4bb06037bde99ea7d8211a69787a6b7c5d4ebb6fc3"}, - {file = "scikit_learn-1.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c75ea812cd83b1385bbfa94ae971f0d80adb338a9523f6bbcb5e0b0381151d4"}, - {file = "scikit_learn-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:a90c5da84829a0b9b4bf00daf62754b2be741e66b5946911f5bdfaa869fcedd6"}, - {file = "scikit_learn-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2a65af2d8a6cce4e163a7951a4cfbfa7fceb2d5c013a4b593686c7f16445cf9d"}, - {file = "scikit_learn-1.5.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:4c0c56c3005f2ec1db3787aeaabefa96256580678cec783986836fc64f8ff622"}, - {file = "scikit_learn-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f77547165c00625551e5c250cefa3f03f2fc92c5e18668abd90bfc4be2e0bff"}, - {file = "scikit_learn-1.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:118a8d229a41158c9f90093e46b3737120a165181a1b58c03461447aa4657415"}, - {file = "scikit_learn-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:a03b09f9f7f09ffe8c5efffe2e9de1196c696d811be6798ad5eddf323c6f4d40"}, - {file = "scikit_learn-1.5.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:460806030c666addee1f074788b3978329a5bfdc9b7d63e7aad3f6d45c67a210"}, - {file = "scikit_learn-1.5.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:1b94d6440603752b27842eda97f6395f570941857456c606eb1d638efdb38184"}, - {file = "scikit_learn-1.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d82c2e573f0f2f2f0be897e7a31fcf4e73869247738ab8c3ce7245549af58ab8"}, - {file = "scikit_learn-1.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3a10e1d9e834e84d05e468ec501a356226338778769317ee0b84043c0d8fb06"}, - {file = "scikit_learn-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:855fc5fa8ed9e4f08291203af3d3e5fbdc4737bd617a371559aaa2088166046e"}, - {file = "scikit_learn-1.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:40fb7d4a9a2db07e6e0cae4dc7bdbb8fada17043bac24104d8165e10e4cff1a2"}, - {file = "scikit_learn-1.5.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:47132440050b1c5beb95f8ba0b2402bbd9057ce96ec0ba86f2f445dd4f34df67"}, - {file = "scikit_learn-1.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:174beb56e3e881c90424e21f576fa69c4ffcf5174632a79ab4461c4c960315ac"}, - {file = "scikit_learn-1.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261fe334ca48f09ed64b8fae13f9b46cc43ac5f580c4a605cbb0a517456c8f71"}, - {file = "scikit_learn-1.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:057b991ac64b3e75c9c04b5f9395eaf19a6179244c089afdebaad98264bff37c"}, - {file = "scikit_learn-1.5.0.tar.gz", hash = "sha256:789e3db01c750ed6d496fa2db7d50637857b451e57bcae863bff707c1247bef7"}, + {file = "scikit_learn-1.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:781586c414f8cc58e71da4f3d7af311e0505a683e112f2f62919e3019abd3745"}, + {file = "scikit_learn-1.5.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:f5b213bc29cc30a89a3130393b0e39c847a15d769d6e59539cd86b75d276b1a7"}, + {file = "scikit_learn-1.5.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ff4ba34c2abff5ec59c803ed1d97d61b036f659a17f55be102679e88f926fac"}, + {file = "scikit_learn-1.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:161808750c267b77b4a9603cf9c93579c7a74ba8486b1336034c2f1579546d21"}, + {file = "scikit_learn-1.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:10e49170691514a94bb2e03787aa921b82dbc507a4ea1f20fd95557862c98dc1"}, + {file = "scikit_learn-1.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:154297ee43c0b83af12464adeab378dee2d0a700ccd03979e2b821e7dd7cc1c2"}, + {file = "scikit_learn-1.5.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:b5e865e9bd59396220de49cb4a57b17016256637c61b4c5cc81aaf16bc123bbe"}, + {file = "scikit_learn-1.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:909144d50f367a513cee6090873ae582dba019cb3fca063b38054fa42704c3a4"}, + {file = "scikit_learn-1.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:689b6f74b2c880276e365fe84fe4f1befd6a774f016339c65655eaff12e10cbf"}, + {file = "scikit_learn-1.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:9a07f90846313a7639af6a019d849ff72baadfa4c74c778821ae0fad07b7275b"}, + {file = "scikit_learn-1.5.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5944ce1faada31c55fb2ba20a5346b88e36811aab504ccafb9f0339e9f780395"}, + {file = "scikit_learn-1.5.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:0828673c5b520e879f2af6a9e99eee0eefea69a2188be1ca68a6121b809055c1"}, + {file = "scikit_learn-1.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:508907e5f81390e16d754e8815f7497e52139162fd69c4fdbd2dfa5d6cc88915"}, + {file = "scikit_learn-1.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97625f217c5c0c5d0505fa2af28ae424bd37949bb2f16ace3ff5f2f81fb4498b"}, + {file = "scikit_learn-1.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:da3f404e9e284d2b0a157e1b56b6566a34eb2798205cba35a211df3296ab7a74"}, + {file = "scikit_learn-1.5.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:88e0672c7ac21eb149d409c74cc29f1d611d5158175846e7a9c2427bd12b3956"}, + {file = "scikit_learn-1.5.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:7b073a27797a283187a4ef4ee149959defc350b46cbf63a84d8514fe16b69855"}, + {file = "scikit_learn-1.5.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b59e3e62d2be870e5c74af4e793293753565c7383ae82943b83383fdcf5cc5c1"}, + {file = "scikit_learn-1.5.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bd8d3a19d4bd6dc5a7d4f358c8c3a60934dc058f363c34c0ac1e9e12a31421d"}, + {file = "scikit_learn-1.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:5f57428de0c900a98389c4a433d4a3cf89de979b3aa24d1c1d251802aa15e44d"}, + {file = "scikit_learn-1.5.1.tar.gz", hash = "sha256:0ea5d40c0e3951df445721927448755d3fe1d80833b0b7308ebff5d2a45e6414"}, ] [package.dependencies] @@ -4797,8 +4863,8 @@ threadpoolctl = ">=3.1.0" [package.extras] benchmark = ["matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "pandas (>=1.1.5)"] -build = ["cython (>=3.0.10)", "meson-python (>=0.15.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)"] -docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "polars (>=0.20.23)", "pooch (>=1.6.0)", "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)"] +build = ["cython (>=3.0.10)", "meson-python (>=0.16.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)"] +docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "polars (>=0.20.23)", "pooch (>=1.6.0)", "pydata-sphinx-theme (>=0.15.3)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)", "sphinx (>=7.3.7)", "sphinx-copybutton (>=0.5.2)", "sphinx-design (>=0.5.0)", "sphinx-gallery (>=0.16.0)", "sphinx-prompt (>=1.4.0)", "sphinx-remove-toctrees (>=1.0.0.post1)", "sphinxcontrib-sass (>=0.3.4)", "sphinxext-opengraph (>=0.9.1)"] examples = ["matplotlib (>=3.3.4)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)"] install = ["joblib (>=1.2.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)", "threadpoolctl (>=3.1.0)"] maintenance = ["conda-lock (==2.5.6)"] @@ -4848,18 +4914,19 @@ test = ["array-api-strict", "asv", "gmpy2", "hypothesis (>=6.30)", "mpmath", "po [[package]] name = "setuptools" -version = "70.1.1" +version = "72.1.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-70.1.1-py3-none-any.whl", hash = "sha256:a58a8fde0541dab0419750bcc521fbdf8585f6e5cb41909df3a472ef7b81ca95"}, - {file = "setuptools-70.1.1.tar.gz", hash = "sha256:937a48c7cdb7a21eb53cd7f9b59e525503aa8abaf3584c730dc5f7a5bec3a650"}, + {file = "setuptools-72.1.0-py3-none-any.whl", hash = "sha256:5a03e1860cf56bb6ef48ce186b0e557fdba433237481a9a625176c2831be15d1"}, + {file = "setuptools-72.1.0.tar.gz", hash = "sha256:8d243eff56d095e5817f796ede6ae32941278f542e0f941867cc05ae52b162ec"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.10.0)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.text (>=3.7)", "more-itertools (>=8.8)", "ordered-set (>=3.1.1)", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.11.*)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (<0.4)", "pytest-ruff (>=0.2.1)", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "six" @@ -5016,17 +5083,17 @@ markdown = ">=3.4" [[package]] name = "sphinxcontrib-applehelp" -version = "1.0.8" +version = "2.0.0" description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_applehelp-1.0.8-py3-none-any.whl", hash = "sha256:cb61eb0ec1b61f349e5cc36b2028e9e7ca765be05e49641c97241274753067b4"}, - {file = "sphinxcontrib_applehelp-1.0.8.tar.gz", hash = "sha256:c40a4f96f3776c4393d933412053962fac2b84f4c99a7982ba42e09576a70619"}, + {file = "sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5"}, + {file = "sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1"}, ] [package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] standalone = ["Sphinx (>=5)"] test = ["pytest"] @@ -5050,33 +5117,33 @@ Sphinx = ">=2.1" [[package]] name = "sphinxcontrib-devhelp" -version = "1.0.6" +version = "2.0.0" description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_devhelp-1.0.6-py3-none-any.whl", hash = "sha256:6485d09629944511c893fa11355bda18b742b83a2b181f9a009f7e500595c90f"}, - {file = "sphinxcontrib_devhelp-1.0.6.tar.gz", hash = "sha256:9893fd3f90506bc4b97bdb977ceb8fbd823989f4316b28c3841ec128544372d3"}, + {file = "sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2"}, + {file = "sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad"}, ] [package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "sphinxcontrib-htmlhelp" -version = "2.0.5" +version = "2.1.0" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_htmlhelp-2.0.5-py3-none-any.whl", hash = "sha256:393f04f112b4d2f53d93448d4bce35842f62b307ccdc549ec1585e950bc35e04"}, - {file = "sphinxcontrib_htmlhelp-2.0.5.tar.gz", hash = "sha256:0dc87637d5de53dd5eec3a6a01753b1ccf99494bd756aafecd74b4fa9e729015"}, + {file = "sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8"}, + {file = "sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9"}, ] [package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] standalone = ["Sphinx (>=5)"] test = ["html5lib", "pytest"] @@ -5096,33 +5163,33 @@ test = ["flake8", "mypy", "pytest"] [[package]] name = "sphinxcontrib-qthelp" -version = "1.0.7" +version = "2.0.0" description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_qthelp-1.0.7-py3-none-any.whl", hash = "sha256:e2ae3b5c492d58fcbd73281fbd27e34b8393ec34a073c792642cd8e529288182"}, - {file = "sphinxcontrib_qthelp-1.0.7.tar.gz", hash = "sha256:053dedc38823a80a7209a80860b16b722e9e0209e32fea98c90e4e6624588ed6"}, + {file = "sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb"}, + {file = "sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab"}, ] [package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] standalone = ["Sphinx (>=5)"] -test = ["pytest"] +test = ["defusedxml (>=0.7.1)", "pytest"] [[package]] name = "sphinxcontrib-serializinghtml" -version = "1.1.10" +version = "2.0.0" 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.10-py3-none-any.whl", hash = "sha256:326369b8df80a7d2d8d7f99aa5ac577f51ea51556ed974e7716cfd4fca3f6cb7"}, - {file = "sphinxcontrib_serializinghtml-1.1.10.tar.gz", hash = "sha256:93f3f5dc458b91b192fe10c397e324f262cf163d79f3282c158e8436a2c4511f"}, + {file = "sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331"}, + {file = "sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d"}, ] [package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] standalone = ["Sphinx (>=5)"] test = ["pytest"] @@ -5172,17 +5239,20 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] [[package]] name = "sympy" -version = "1.12.1" +version = "1.13.1" description = "Computer algebra system (CAS) in Python" optional = false python-versions = ">=3.8" files = [ - {file = "sympy-1.12.1-py3-none-any.whl", hash = "sha256:9b2cbc7f1a640289430e13d2a56f02f867a1da0190f2f99d8968c2f74da0e515"}, - {file = "sympy-1.12.1.tar.gz", hash = "sha256:2877b03f998cd8c08f07cd0de5b767119cd3ef40d09f41c30d722f6686b0fb88"}, + {file = "sympy-1.13.1-py3-none-any.whl", hash = "sha256:db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8"}, + {file = "sympy-1.13.1.tar.gz", hash = "sha256:9cebf7e04ff162015ce31c9c6c9144daa34a93bd082f54fd8f12deca4f47515f"}, ] [package.dependencies] -mpmath = ">=1.1.0,<1.4.0" +mpmath = ">=1.1.0,<1.4" + +[package.extras] +dev = ["hypothesis (>=6.70.0)", "pytest (>=7.1.0)"] [[package]] name = "tabulate" @@ -5200,13 +5270,13 @@ widechars = ["wcwidth"] [[package]] name = "tenacity" -version = "8.4.2" +version = "9.0.0" description = "Retry code until it succeeds" optional = false python-versions = ">=3.8" files = [ - {file = "tenacity-8.4.2-py3-none-any.whl", hash = "sha256:9e6f7cf7da729125c7437222f8a522279751cdfbe6b67bfe64f75d3a348661b2"}, - {file = "tenacity-8.4.2.tar.gz", hash = "sha256:cd80a53a79336edba8489e767f729e4f391c896956b57140b5d7511a64bbd3ef"}, + {file = "tenacity-9.0.0-py3-none-any.whl", hash = "sha256:93de0c98785b27fcf659856aa9f54bfbd399e29969b0621bc7f762bd441b4539"}, + {file = "tenacity-9.0.0.tar.gz", hash = "sha256:807f37ca97d62aa361264d497b0e31e92b8027044942bfa756160d908320d73b"}, ] [package.extras] @@ -5266,13 +5336,13 @@ files = [ [[package]] name = "tomlkit" -version = "0.12.5" +version = "0.13.0" description = "Style preserving TOML library" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tomlkit-0.12.5-py3-none-any.whl", hash = "sha256:af914f5a9c59ed9d0762c7b64d3b5d5df007448eb9cd2edc8a46b1eafead172f"}, - {file = "tomlkit-0.12.5.tar.gz", hash = "sha256:eef34fba39834d4d6b73c9ba7f3e4d1c417a4e56f89a7e96e090dd0d24b8fb3c"}, + {file = "tomlkit-0.13.0-py3-none-any.whl", hash = "sha256:7075d3042d03b80f603482d69bf0c8f345c2b30e41699fd8883227f89972b264"}, + {file = "tomlkit-0.13.0.tar.gz", hash = "sha256:08ad192699734149f5b97b45f1f18dad7eb1b6d16bc72ad0c2335772650d7b72"}, ] [[package]] @@ -5297,13 +5367,13 @@ files = [ [[package]] name = "tqdm" -version = "4.66.4" +version = "4.66.5" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.66.4-py3-none-any.whl", hash = "sha256:b75ca56b413b030bc3f00af51fd2c1a1a5eac6a0c1cca83cbb37a5c52abce644"}, - {file = "tqdm-4.66.4.tar.gz", hash = "sha256:e4d936c9de8727928f3be6079590e97d9abfe8d39a590be678eb5919ffc186bb"}, + {file = "tqdm-4.66.5-py3-none-any.whl", hash = "sha256:90279a3770753eafc9194a0364852159802111925aa30eb3f9d85b0e805ac7cd"}, + {file = "tqdm-4.66.5.tar.gz", hash = "sha256:e1020aef2e5096702d8a025ac7d16b1577279c9d63f8375b63083e9a5f0fcbad"}, ] [package.dependencies] @@ -5354,13 +5424,13 @@ files = [ [[package]] name = "uncertainties" -version = "3.2.1" +version = "3.2.2" description = "calculations with values with uncertainties, error propagation" optional = false python-versions = ">=3.8" files = [ - {file = "uncertainties-3.2.1-py3-none-any.whl", hash = "sha256:80dea7f0c2fe37c9de6893b2352311b5f332be60060cbd6387f88050f7ec345d"}, - {file = "uncertainties-3.2.1.tar.gz", hash = "sha256:b05417b58bdef236c20e711fb2fee18e4db7348a92edcec01318b32aab34925e"}, + {file = "uncertainties-3.2.2-py3-none-any.whl", hash = "sha256:fd8543355952f4052786ed4150acaf12e23117bd0f5bd03ea07de466bce646e7"}, + {file = "uncertainties-3.2.2.tar.gz", hash = "sha256:e62c86fdc64429828229de6ab4e11466f114907e6bd343c077858994cc12e00b"}, ] [package.extras] @@ -5398,13 +5468,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "versioningit" -version = "3.1.1" +version = "3.1.2" description = "Versioning It with your Version In Git" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "versioningit-3.1.1-py3-none-any.whl", hash = "sha256:3f5a855d98a2a85e909264f2eac3cce380b71f7632e7de55bc22bff9f03639ee"}, - {file = "versioningit-3.1.1.tar.gz", hash = "sha256:b0ba586e5af08b87dbe3354082910a1d0502c36202d496e1ae60ef3b41ee29c1"}, + {file = "versioningit-3.1.2-py3-none-any.whl", hash = "sha256:33c0905aeac7877b562171387c2c98af87b391aa9195f095455f21ddc47d4636"}, + {file = "versioningit-3.1.2.tar.gz", hash = "sha256:4db83ed99f56b07d83940bee3445ca46ca120d13b6b304cdb5fb44e5aa4edec0"}, ] [package.dependencies] @@ -5656,13 +5726,13 @@ files = [ [[package]] name = "xarray" -version = "2024.6.0" +version = "2024.7.0" description = "N-D labeled arrays and datasets in Python" optional = false python-versions = ">=3.9" files = [ - {file = "xarray-2024.6.0-py3-none-any.whl", hash = "sha256:721a7394e8ec3d592b2d8ebe21eed074ac077dc1bb1bd777ce00e41700b4866c"}, - {file = "xarray-2024.6.0.tar.gz", hash = "sha256:0b91e0bc4dc0296947947640fe31ec6e867ce258d2f7cbc10bedf4a6d68340c7"}, + {file = "xarray-2024.7.0-py3-none-any.whl", hash = "sha256:1b0fd51ec408474aa1f4a355d75c00cc1c02bd425d97b2c2e551fd21810e7f64"}, + {file = "xarray-2024.7.0.tar.gz", hash = "sha256:4cae512d121a8522d41e66d942fb06c526bc1fd32c2c181d5fe62fe65b671638"}, ] [package.dependencies] @@ -5733,13 +5803,13 @@ numpy = ">=1.14" [[package]] name = "zhinst-toolkit" -version = "0.6.3" +version = "0.6.4" description = "Zurich Instruments Toolkit High Level API" optional = false python-versions = ">=3.7" files = [ - {file = "zhinst-toolkit-0.6.3.tar.gz", hash = "sha256:26d1a55e570fa54557dbd81cdae8cfaf0295c19bb402d8cf3433ee9eac9a99ba"}, - {file = "zhinst_toolkit-0.6.3-py3-none-any.whl", hash = "sha256:9d97dcc790a8d58b11745db99face6adb081e07cf25b3f03876090f1697e6096"}, + {file = "zhinst_toolkit-0.6.4-py3-none-any.whl", hash = "sha256:d9a0c237d228636ec7438bf5f8c63312fd5e6dc4ac37df18a9ca3d9b450c42fa"}, + {file = "zhinst_toolkit-0.6.4.tar.gz", hash = "sha256:62d883cee6476cd3e00be8f8299cb01094f480aa91b3df754fc6005b452fa0f4"}, ] [package.dependencies] @@ -5792,4 +5862,4 @@ zh = ["laboneq"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.12" -content-hash = "119c26fb9dd5316d2d9cbc98c7175238acd500e30816883420289be3e45e34d6" +content-hash = "30a7e1b0b8caa372b4076bce71583a537c7ad92555c5249a883c96b799f9cc5f" diff --git a/pyproject.toml b/pyproject.toml index 5a65beaee4..d9171385bf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,7 +23,6 @@ include = ["*.out", "*.yml"] [tool.poetry.dependencies] python = ">=3.9,<3.12" qibo = ">=0.2.6" -networkx = "^3.0" numpy = "^1.26.4" scipy = "^1.13.0" more-itertools = "^9.1.0" From 793ed60fee8deebb055a2ef48e8bb4c55a5736ec Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 6 Aug 2024 14:49:52 +0200 Subject: [PATCH 0396/1006] test: Test platform topology and string representation --- tests/test_platform.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tests/test_platform.py b/tests/test_platform.py index 2b12df79ee..c7a0c3c7bf 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -24,6 +24,7 @@ from qibolab.platform.load import PLATFORMS from qibolab.platform.platform import update_configs from qibolab.pulses import Delay, Gaussian, Pulse, PulseSequence, PulseType, Rectangular +from qibolab.qubits import Qubit, QubitPair from qibolab.serialize import ( PLATFORM, dump_kernels, @@ -59,6 +60,23 @@ def test_create_platform_error(): platform = create_platform("nonexistent") +def test_platform_basics(): + platform = Platform("ciao", {}, {}, {}, {}) + assert str(platform) == "ciao" + assert platform.topology == [] + + qs = {q: Qubit(q) for q in range(10)} + platform2 = Platform( + "come va?", + qs, + {(q1, q2): QubitPair(qs[q1], qs[q2]) for q1 in range(3) for q2 in range(4, 8)}, + {}, + {}, + ) + assert str(platform2) == "come va?" + assert (1, 6) in platform2.topology + + def test_create_platform_multipath(tmp_path: Path): some = tmp_path / "some" others = tmp_path / "others" From 58bf42d714e9c0f4e2564864d30e3c0790a25549 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 6 Aug 2024 14:57:09 +0200 Subject: [PATCH 0397/1006] fix: Remove usage of tuple type hint from typing --- src/qibolab/platform/platform.py | 30 ++++++++++++++---------------- src/qibolab/qubits.py | 8 ++++---- src/qibolab/serialize.py | 6 +++--- 3 files changed, 21 insertions(+), 23 deletions(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index afe2ca74dd..c40a13a634 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -4,7 +4,7 @@ from collections import defaultdict from dataclasses import asdict, dataclass, field from math import prod -from typing import Any, Dict, List, Optional, Tuple, TypeVar +from typing import Any, Optional, TypeVar import numpy as np from qibo.config import log, raise_error @@ -19,10 +19,10 @@ from qibolab.sweeper import ParallelSweepers from qibolab.unrolling import batch -InstrumentMap = Dict[InstrumentId, Instrument] -QubitMap = Dict[QubitId, Qubit] -CouplerMap = Dict[QubitId, Coupler] -QubitPairMap = Dict[QubitPairId, QubitPair] +InstrumentMap = dict[InstrumentId, Instrument] +QubitMap = dict[QubitId, Qubit] +CouplerMap = dict[QubitId, Coupler] +QubitPairMap = dict[QubitPairId, QubitPair] NS_TO_SEC = 1e-9 @@ -37,8 +37,8 @@ def default(value: Optional[T], default: T) -> T: def unroll_sequences( - sequences: List[PulseSequence], relaxation_time: int -) -> Tuple[PulseSequence, dict[str, list[str]]]: + sequences: list[PulseSequence], relaxation_time: int +) -> tuple[PulseSequence, dict[str, list[str]]]: """Unrolls a list of pulse sequences to a single pulse sequence with multiple measurements. @@ -131,15 +131,14 @@ class Platform: name: str """Name of the platform.""" qubits: QubitMap - """Dictionary mapping qubit names to :class:`qibolab.qubits.Qubit` - objects.""" + """Mapping qubit names to :class:`qibolab.qubits.Qubit` objects.""" pairs: QubitPairMap - """Dictionary mapping tuples of qubit names to - :class:`qibolab.qubits.QubitPair` objects.""" + """Mapping tuples of qubit names to :class:`qibolab.qubits.QubitPair` + objects.""" configs: dict[str, Config] - """Maps name of component to its default config.""" + """Mapping name of component to its default config.""" instruments: InstrumentMap - """Dictionary mapping instrument names to + """Mapping instrument names to :class:`qibolab.instruments.abstract.Instrument` objects.""" settings: Settings = field(default_factory=Settings) @@ -151,8 +150,7 @@ class Platform: """ couplers: CouplerMap = field(default_factory=dict) - """Dictionary mapping coupler names to :class:`qibolab.couplers.Coupler` - objects.""" + """Mapping coupler names to :class:`qibolab.couplers.Coupler` objects.""" is_connected: bool = False """Flag for whether we are connected to the physical instruments.""" @@ -251,7 +249,7 @@ def _execute(self, sequences, options, integration_setup, sweepers): def execute( self, - sequences: List[PulseSequence], + sequences: list[PulseSequence], options: ExecutionParameters, sweepers: Optional[list[ParallelSweepers]] = None, ) -> dict[Any, list]: diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index 6148eecadf..91df2836d1 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -1,5 +1,5 @@ from dataclasses import dataclass, field, fields -from typing import List, Optional, Tuple, Union +from typing import Optional, Union import numpy as np @@ -75,8 +75,8 @@ class Qubit: T2_spin_echo: int = 0 state0_voltage: int = 0 state1_voltage: int = 0 - mean_gnd_states: List[float] = field(default_factory=lambda: [0, 0]) - mean_exc_states: List[float] = field(default_factory=lambda: [0, 0]) + mean_gnd_states: list[float] = field(default_factory=lambda: [0, 0]) + mean_exc_states: list[float] = field(default_factory=lambda: [0, 0]) # parameters for single shot classification threshold: float = 0.0 @@ -125,7 +125,7 @@ def mixer_frequencies(self): return freqs -QubitPairId = Tuple[QubitId, QubitId] +QubitPairId = tuple[QubitId, QubitId] """Type for holding ``QubitPair``s in the ``platform.pairs`` dictionary.""" diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index 0c10f7135d..5ebc88535f 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -8,7 +8,7 @@ import json from dataclasses import asdict, fields from pathlib import Path -from typing import Optional, Tuple, Union +from typing import Optional, Union from pydantic import ConfigDict, TypeAdapter @@ -58,7 +58,7 @@ def load_qubit_name(name: str) -> QubitId: def load_qubits( runcard: dict, kernels: Kernels = None -) -> Tuple[QubitMap, CouplerMap, QubitPairMap]: +) -> tuple[QubitMap, CouplerMap, QubitPairMap]: """Load qubits and pairs from the runcard. Uses the native gate and characterization sections of the runcard to @@ -159,7 +159,7 @@ def _load_two_qubit_natives(gates) -> TwoQubitNatives: def register_gates( runcard: dict, qubits: QubitMap, pairs: QubitPairMap, couplers: CouplerMap = None -) -> Tuple[QubitMap, QubitPairMap]: +) -> tuple[QubitMap, QubitPairMap]: """Register single qubit native gates to ``Qubit`` objects from the runcard. From a1914e571867f50d5b30fdd554c45bc84d5f943a Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 6 Aug 2024 15:00:03 +0200 Subject: [PATCH 0398/1006] docs: Simplify unrolling function docstring --- src/qibolab/platform/platform.py | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index c40a13a634..5ba244e83e 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -39,19 +39,16 @@ def default(value: Optional[T], default: T) -> T: def unroll_sequences( sequences: list[PulseSequence], relaxation_time: int ) -> tuple[PulseSequence, dict[str, list[str]]]: - """Unrolls a list of pulse sequences to a single pulse sequence with - multiple measurements. + """Unrolls a list of pulse sequences to a single sequence. - Args: - sequences (list): List of pulse sequences to unroll. - relaxation_time (int): Time in ns to wait for the qubit to relax between - playing different sequences. - - Returns: - total_sequence (:class:`qibolab.pulses.PulseSequence`): Unrolled pulse sequence containing - multiple measurements. - readout_map (dict): Map from original readout pulse serials to the unrolled readout pulse - serials. Required to construct the results dictionary that is returned after execution. + The resulting sequence may contain multiple measurements. + + `relaxation_time` is the time in ns to wait for the qubit to relax between playing + different sequences. + + It returns both the unrolled pulse sequence, and the map from original readout pulse + serials to the unrolled readout pulse serials. Required to construct the results + dictionary that is returned after execution. """ total_sequence = PulseSequence() readout_map = defaultdict(list) From 6dcb6d3dc5da4d82805771d124b7050acf20fb50 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 6 Aug 2024 15:09:24 +0200 Subject: [PATCH 0399/1006] fix: Remove usage of dict type hint from typing --- src/qibolab/couplers.py | 6 +++--- src/qibolab/instruments/abstract.py | 2 +- .../emulator/engines/qutip_engine.py | 4 ++-- .../instruments/emulator/pulse_simulator.py | 18 +++++++++--------- src/qibolab/instruments/icarusqfpga.py | 14 +++++++------- src/qibolab/instruments/qm/controller.py | 6 +++--- src/qibolab/instruments/qm/devices.py | 5 ++--- src/qibolab/instruments/qm/ports.py | 4 ++-- src/qibolab/instruments/qm/sequence.py | 8 ++++---- 9 files changed, 33 insertions(+), 34 deletions(-) diff --git a/src/qibolab/couplers.py b/src/qibolab/couplers.py index e499f987cb..b3a57c9985 100644 --- a/src/qibolab/couplers.py +++ b/src/qibolab/couplers.py @@ -1,5 +1,5 @@ from dataclasses import dataclass, field -from typing import Dict, Optional, Union +from typing import Optional, Union from qibolab.components import DcChannel from qibolab.native import SingleQubitNatives @@ -29,8 +29,8 @@ class Coupler: "flux (:class:`qibolab.platforms.utils.Channel`): Channel used to send flux pulses to the qubit." # TODO: With topology or conectivity - # qubits: Optional[Dict[QubitId, Qubit]] = field(default_factory=dict) - qubits: Dict = field(default_factory=dict) + # qubits: Optional[dict[QubitId, Qubit]] = field(default_factory=dict) + qubits: dict = field(default_factory=dict) "Qubits the coupler acts on" @property diff --git a/src/qibolab/instruments/abstract.py b/src/qibolab/instruments/abstract.py index 070bcec4a8..de69e0c376 100644 --- a/src/qibolab/instruments/abstract.py +++ b/src/qibolab/instruments/abstract.py @@ -80,7 +80,7 @@ def play(self, *args, **kwargs): executed in real-time. If not possible, an error is raised. Returns: - (Dict[ResultType]) mapping the serial of the readout pulses used to + (dict[ResultType]) mapping the serial of the readout pulses used to the acquired :class:`qibolab.result.ExecutionResults` object. """ diff --git a/src/qibolab/instruments/emulator/engines/qutip_engine.py b/src/qibolab/instruments/emulator/engines/qutip_engine.py index ab3bc244c9..79e4707825 100644 --- a/src/qibolab/instruments/emulator/engines/qutip_engine.py +++ b/src/qibolab/instruments/emulator/engines/qutip_engine.py @@ -6,7 +6,7 @@ from collections import OrderedDict from timeit import default_timer as timer -from typing import Dict, List, Optional +from typing import List, Optional import numpy as np from qutip import Options, Qobj, basis, expect, ket2dm, mesolve, ptrace @@ -412,7 +412,7 @@ def state_from_basis_vector( def compute_overlaps( self, target_states: List[Qobj], - reference_states: Optional[Dict[str, Qobj]] = None, + reference_states: Optional[dict[str, Qobj]] = None, ) -> dict: """Calculates the overlaps between a list of target device states, with respect to a list of reference device states. diff --git a/src/qibolab/instruments/emulator/pulse_simulator.py b/src/qibolab/instruments/emulator/pulse_simulator.py index ce6358aa01..67ea6c6e16 100644 --- a/src/qibolab/instruments/emulator/pulse_simulator.py +++ b/src/qibolab/instruments/emulator/pulse_simulator.py @@ -3,7 +3,7 @@ import copy import operator -from typing import Dict, List, Union +from typing import List, Union import numpy as np import numpy.typing as npt @@ -132,8 +132,8 @@ def run_pulse_simulation( def play( self, - qubits: Dict[QubitId, Qubit], - couplers: Dict[QubitId, Coupler], + qubits: dict[QubitId, Qubit], + couplers: dict[QubitId, Coupler], sequence: PulseSequence, execution_parameters: ExecutionParameters, ) -> dict[str, npt.NDArray]: @@ -185,8 +185,8 @@ def play( ### sweeper adapted from icarusqfpga ### def sweep( self, - qubits: Dict[QubitId, Qubit], - couplers: Dict[QubitId, Coupler], + qubits: dict[QubitId, Qubit], + couplers: dict[QubitId, Coupler], sequence: PulseSequence, execution_parameters: ExecutionParameters, *sweeper: List[Sweeper], @@ -278,8 +278,8 @@ def sweep( def _sweep_recursion( self, - qubits: Dict[QubitId, Qubit], - couplers: Dict[QubitId, Coupler], + qubits: dict[QubitId, Qubit], + couplers: dict[QubitId, Coupler], sequence: PulseSequence, execution_parameters: ExecutionParameters, *sweeper: Sweeper, @@ -337,8 +337,8 @@ def _sweep_recursion( def _sweep_play( self, - qubits: Dict[QubitId, Qubit], - couplers: Dict[QubitId, Coupler], + qubits: dict[QubitId, Qubit], + couplers: dict[QubitId, Coupler], sequence: PulseSequence, execution_parameters: ExecutionParameters, ) -> dict[Union[str, int], list]: diff --git a/src/qibolab/instruments/icarusqfpga.py b/src/qibolab/instruments/icarusqfpga.py index e04e3f4cc6..fc4b625510 100644 --- a/src/qibolab/instruments/icarusqfpga.py +++ b/src/qibolab/instruments/icarusqfpga.py @@ -1,6 +1,6 @@ import operator from dataclasses import dataclass -from typing import Dict, List, Union +from typing import List, Union import numpy as np from icarusq_rfsoc_driver import IcarusQRFSoC # pylint: disable=E0401 @@ -68,7 +68,7 @@ def sampling_rate(self): def play( self, - qubits: Dict[QubitId, Qubit], + qubits: dict[QubitId, Qubit], couplers, sequence: PulseSequence, options: ExecutionParameters, @@ -222,7 +222,7 @@ def connect(self): def play( self, - qubits: Dict[QubitId, Qubit], + qubits: dict[QubitId, Qubit], couplers, sequence: PulseSequence, options: ExecutionParameters, @@ -284,9 +284,9 @@ def play( def process_readout_signal( self, - adc_raw_data: Dict[int, np.ndarray], + adc_raw_data: dict[int, np.ndarray], sequence: List[Pulse], - qubits: Dict[QubitId, Qubit], + qubits: dict[QubitId, Qubit], options: ExecutionParameters, ): """Processes the raw signal from the ADC into IQ values.""" @@ -318,7 +318,7 @@ def process_readout_signal( def sweep( self, - qubits: Dict[QubitId, Qubit], + qubits: dict[QubitId, Qubit], couplers, sequence: PulseSequence, options: ExecutionParameters, @@ -353,7 +353,7 @@ def sweep( def _sweep_recursion( self, - qubits: Dict[QubitId, Qubit], + qubits: dict[QubitId, Qubit], couplers, sequence: PulseSequence, options: ExecutionParameters, diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 1754216dd3..04dd8cbb82 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -2,7 +2,7 @@ import tempfile from dataclasses import dataclass, field from pathlib import Path -from typing import Dict, Optional +from typing import Optional from qm import QuantumMachinesManager, SimulationConfig, generate_qua_script, qua from qm.octave import QmOctaveConfig @@ -117,10 +117,10 @@ class QMController(Controller): Has the form XXX.XXX.XXX.XXX:XXX. """ - opxs: Dict[int, OPXplus] = field(default_factory=dict) + opxs: dict[int, OPXplus] = field(default_factory=dict) """Dictionary containing the :class:`qibolab.instruments.qm.devices.OPXplus` instruments being used.""" - octaves: Dict[int, Octave] = field(default_factory=dict) + octaves: dict[int, Octave] = field(default_factory=dict) """Dictionary containing the :class:`qibolab.instruments.qm.devices.Octave` instruments being used.""" diff --git a/src/qibolab/instruments/qm/devices.py b/src/qibolab/instruments/qm/devices.py index 6ec0674d88..0c40ea57c9 100644 --- a/src/qibolab/instruments/qm/devices.py +++ b/src/qibolab/instruments/qm/devices.py @@ -1,7 +1,6 @@ from collections import defaultdict from dataclasses import dataclass, field from itertools import chain -from typing import Dict from qibolab.instruments.abstract import Instrument @@ -38,9 +37,9 @@ class QMDevice(Instrument): name: str """Name of the device.""" - outputs: Dict[int, QMOutput] = field(init=False) + outputs: dict[int, QMOutput] = field(init=False) """Dictionary containing the instrument's output ports.""" - inputs: Dict[int, QMInput] = field(init=False) + inputs: dict[int, QMInput] = field(init=False) """Dictionary containing the instrument's input ports.""" def ports(self, number, output=True): diff --git a/src/qibolab/instruments/qm/ports.py b/src/qibolab/instruments/qm/ports.py index 1d6ce2d444..090ddb83dc 100644 --- a/src/qibolab/instruments/qm/ports.py +++ b/src/qibolab/instruments/qm/ports.py @@ -1,5 +1,5 @@ from dataclasses import dataclass, field, fields -from typing import ClassVar, Dict, Optional, Union +from typing import ClassVar, Optional, Union DIGITAL_DELAY = 57 DIGITAL_BUFFER = 18 @@ -94,7 +94,7 @@ class OPXOutput(QMOutput): offset: float = field(default=0.0, metadata={"config": "offset"}) """Constant voltage to be applied on the output.""" - filter: Dict[str, float] = field( + filter: dict[str, float] = field( default_factory=dict, metadata={"config": "filter", "settings": True} ) """FIR and IIR filters to be applied to correct signal distortions.""" diff --git a/src/qibolab/instruments/qm/sequence.py b/src/qibolab/instruments/qm/sequence.py index f950d734f0..acb825a3e4 100644 --- a/src/qibolab/instruments/qm/sequence.py +++ b/src/qibolab/instruments/qm/sequence.py @@ -1,6 +1,6 @@ import collections from dataclasses import dataclass, field -from typing import Dict, List, Optional, Set, Union +from typing import List, Optional, Set, Union import numpy as np from numpy import typing as npt @@ -189,12 +189,12 @@ class Sequence: qmpulses: List[QMPulse] = field(default_factory=list) """List of :class:`qibolab.instruments.qm.QMPulse` objects corresponding to the original pulses.""" - pulse_to_qmpulse: Dict[Pulse, QMPulse] = field(default_factory=dict) + pulse_to_qmpulse: dict[Pulse, QMPulse] = field(default_factory=dict) """Map from qibolab pulses to QMPulses (useful when sweeping).""" - clock: Dict[str, int] = field(default_factory=lambda: collections.defaultdict(int)) + clock: dict[str, int] = field(default_factory=lambda: collections.defaultdict(int)) """Dictionary used to keep track of times of each element, in order to calculate wait times.""" - pulse_finish: Dict[int, List[QMPulse]] = field( + pulse_finish: dict[int, List[QMPulse]] = field( default_factory=lambda: collections.defaultdict(list) ) """Map to find all pulses that finish at a given time (useful for From 1e2f8f7699be3c8d7e31efeaa8170cbebdf12018 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 6 Aug 2024 15:12:04 +0200 Subject: [PATCH 0400/1006] docs: Simplify play method docstring in the abstract instrument --- src/qibolab/instruments/abstract.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/qibolab/instruments/abstract.py b/src/qibolab/instruments/abstract.py index de69e0c376..5c9d17d4dd 100644 --- a/src/qibolab/instruments/abstract.py +++ b/src/qibolab/instruments/abstract.py @@ -79,9 +79,7 @@ def play(self, *args, **kwargs): If :cls:`qibolab.sweeper.Sweeper` objects are passed as arguments, they are executed in real-time. If not possible, an error is raised. - Returns: - (dict[ResultType]) mapping the serial of the readout pulses used to - the acquired :class:`qibolab.result.ExecutionResults` object. + Returns a mapping with the id of the probe pulses used to acquired data. """ From a9164d17d438c6b70feb81fa09888db39e8b0c3f Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 6 Aug 2024 15:16:49 +0200 Subject: [PATCH 0401/1006] fix: Spell out play signature It is not truly free, and in particular is fixed by the platform call --- src/qibolab/instruments/abstract.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/qibolab/instruments/abstract.py b/src/qibolab/instruments/abstract.py index 5c9d17d4dd..fe219af833 100644 --- a/src/qibolab/instruments/abstract.py +++ b/src/qibolab/instruments/abstract.py @@ -2,6 +2,11 @@ from dataclasses import asdict, dataclass from typing import Optional +import numpy.typing as npt + +from qibolab.execution_parameters import ConfigUpdate, ExecutionParameters +from qibolab.pulses.sequence import PulseSequence +from qibolab.sweeper import ParallelSweepers from qibolab.unrolling import Bounds InstrumentId = str @@ -73,7 +78,14 @@ def sampling_rate(self) -> int: (GSps).""" @abstractmethod - def play(self, *args, **kwargs): + def play( + self, + updates: list[ConfigUpdate], + sequences: list[PulseSequence], + options: ExecutionParameters, + integration_setup, + sweepers: list[ParallelSweepers], + ) -> dict[int, npt.NDArray]: """Play a pulse sequence and retrieve feedback. If :cls:`qibolab.sweeper.Sweeper` objects are passed as arguments, they are From 775646de1032cee1f835b4f51997191a10044eb1 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 6 Aug 2024 15:17:53 +0200 Subject: [PATCH 0402/1006] fix: Spell out internal execution helper signature --- src/qibolab/platform/platform.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 5ba244e83e..bac525cebd 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -24,6 +24,8 @@ CouplerMap = dict[QubitId, Coupler] QubitPairMap = dict[QubitPairId, QubitPair] +IntegrationSetup = dict[str, tuple[np.ndarray, float]] + NS_TO_SEC = 1e-9 # TODO: replace with https://docs.python.org/3/reference/compound_stmts.html#type-params @@ -230,7 +232,13 @@ def _controller(self): assert len(controllers) == 1 return controllers[0] - def _execute(self, sequences, options, integration_setup, sweepers): + def _execute( + self, + sequences: list[PulseSequence], + options: ExecutionParameters, + integration_setup: IntegrationSetup, + sweepers: list[ParallelSweepers], + ): """Execute sequences on the controllers.""" result = {} @@ -296,7 +304,7 @@ def execute( # FIXME: this is temporary solution to deliver the information to drivers # until we make acquisition channels first class citizens in the sequences # so that each acquisition command carries the info with it. - integration_setup: dict[str, tuple[np.ndarray, float]] = {} + integration_setup: IntegrationSetup = {} for qubit in self.qubits.values(): integration_setup[qubit.acquisition.name] = (qubit.kernel, qubit.iq_angle) From 4fb1193df8866d4e337ec87289de983353b64b35 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 6 Aug 2024 15:27:47 +0200 Subject: [PATCH 0403/1006] fix: Remove usage of list type hint from typing --- .../instruments/emulator/engines/generic.py | 4 +-- .../emulator/engines/qutip_engine.py | 26 +++++++++---------- .../instruments/emulator/pulse_simulator.py | 6 ++--- src/qibolab/instruments/icarusqfpga.py | 6 ++--- src/qibolab/instruments/qblox/acquisition.py | 6 ++--- src/qibolab/instruments/qm/sequence.py | 10 +++---- 6 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/qibolab/instruments/emulator/engines/generic.py b/src/qibolab/instruments/emulator/engines/generic.py index 87807e4954..a8686a0dfe 100644 --- a/src/qibolab/instruments/emulator/engines/generic.py +++ b/src/qibolab/instruments/emulator/engines/generic.py @@ -1,5 +1,5 @@ from collections import OrderedDict -from typing import List, Optional +from typing import Optional import numpy as np @@ -121,7 +121,7 @@ def op_from_instruction( ) op_connectors_dict = op_connectors_dict_check - def process_op(op_list: list, connector_list: List[str], connector: str) -> list: + def process_op(op_list: list, connector_list: list[str], connector: str) -> list: """Implements connectors between operators.""" index_list = [] for i in range(connector_list.count(connector)): diff --git a/src/qibolab/instruments/emulator/engines/qutip_engine.py b/src/qibolab/instruments/emulator/engines/qutip_engine.py index 79e4707825..80234265c7 100644 --- a/src/qibolab/instruments/emulator/engines/qutip_engine.py +++ b/src/qibolab/instruments/emulator/engines/qutip_engine.py @@ -6,7 +6,7 @@ from collections import OrderedDict from timeit import default_timer as timer -from typing import List, Optional +from typing import Optional import numpy as np from qutip import Options, Qobj, basis, expect, ket2dm, mesolve, ptrace @@ -206,7 +206,7 @@ def make_arbitrary_state( return arbitrary_state def extend_op_dim( - self, op_qobj: Qobj, op_indices_q: List[int] = [0], op_indices_c: List[int] = [] + self, op_qobj: Qobj, op_indices_q: list[int] = [0], op_indices_c: list[int] = [] ) -> Qobj: """Extends the dimension of an operator from its local Hilbert space to the full system Hilbert space. @@ -272,7 +272,7 @@ def qevolve( self, channel_waveforms: dict, simulate_dissipation: bool = False, - ) -> tuple[np.ndarray, List[int]]: + ) -> tuple[np.ndarray, list[int]]: """Performs the quantum dynamics simulation. Args: @@ -347,8 +347,8 @@ def qevolve( ) def qobj_to_reduced_dm( - self, emu_qstate: Qobj, qubit_list: List[int] - ) -> tuple[np.ndarray, List[int]]: + self, emu_qstate: Qobj, qubit_list: list[int] + ) -> tuple[np.ndarray, list[int]]: """Computes the reduced density matrix of the emulator quantum state specified by `qubit_list`. @@ -370,14 +370,14 @@ def qobj_to_reduced_dm( return reduced_dm, rdm_qubit_list def state_from_basis_vector( - self, basis_vector: List[int], cbasis_vector: List[int] = None + self, basis_vector: list[int], cbasis_vector: list[int] = None ) -> Qobj: """Constructs the corresponding computational basis state of the generalized Hilbert space specified by qubit_list. Args: - basis_vector (List[int]): Generalized bitstring that specifies the computational basis state corresponding to the qubits in big endian order. - cbasis_vector (List[int]): Generalized bitstring that specifies the computational basis state corresponding to the couplers in big endian order. + basis_vector (list[int]): Generalized bitstring that specifies the computational basis state corresponding to the qubits in big endian order. + cbasis_vector (list[int]): Generalized bitstring that specifies the computational basis state corresponding to the couplers in big endian order. Returns: `qutip.Qobj`: Computational basis state consistent with Hilbert space @@ -411,7 +411,7 @@ def state_from_basis_vector( def compute_overlaps( self, - target_states: List[Qobj], + target_states: list[Qobj], reference_states: Optional[dict[str, Qobj]] = None, ) -> dict: """Calculates the overlaps between a list of target device states, with @@ -466,10 +466,10 @@ def make_arbitrary_state(statedata: np.ndarray, dims: list[int]) -> Qobj: def extend_op_dim( op_qobj: Qobj, - op_indices_q: List[int] = [0], - op_indices_c: List[int] = [], - nlevels_q: List[int] = [2], - nlevels_c: List[int] = [], + op_indices_q: list[int] = [0], + op_indices_c: list[int] = [], + nlevels_q: list[int] = [2], + nlevels_c: list[int] = [], ) -> Qobj: """Extenda the dimension of the input operator from its local Hilbert space to a larger n-body Hilbert space. diff --git a/src/qibolab/instruments/emulator/pulse_simulator.py b/src/qibolab/instruments/emulator/pulse_simulator.py index 67ea6c6e16..96ff337054 100644 --- a/src/qibolab/instruments/emulator/pulse_simulator.py +++ b/src/qibolab/instruments/emulator/pulse_simulator.py @@ -3,7 +3,7 @@ import copy import operator -from typing import List, Union +from typing import Union import numpy as np import numpy.typing as npt @@ -189,7 +189,7 @@ def sweep( couplers: dict[QubitId, Coupler], sequence: PulseSequence, execution_parameters: ExecutionParameters, - *sweeper: List[Sweeper], + *sweeper: list[Sweeper], ) -> dict[str, Union[npt.NDArray, dict]]: """Executes the sweep and generates readout results, as well as simulation-related time and states data. @@ -618,7 +618,7 @@ def apply_readout_noise( def make_comp_basis( - qubit_list: List[Union[int, str]], qid_nlevels_map: dict[Union[int, str], int] + qubit_list: list[Union[int, str]], qid_nlevels_map: dict[Union[int, str], int] ) -> np.ndarray: """Generates the computational basis states of the Hilbert space. diff --git a/src/qibolab/instruments/icarusqfpga.py b/src/qibolab/instruments/icarusqfpga.py index fc4b625510..daf4a25293 100644 --- a/src/qibolab/instruments/icarusqfpga.py +++ b/src/qibolab/instruments/icarusqfpga.py @@ -1,6 +1,6 @@ import operator from dataclasses import dataclass -from typing import List, Union +from typing import Union import numpy as np from icarusq_rfsoc_driver import IcarusQRFSoC # pylint: disable=E0401 @@ -208,7 +208,7 @@ def __init__( address, delay_samples_offset_dac: int = 0, delay_samples_offset_adc: int = 0, - adcs_to_read: List[int] = [], + adcs_to_read: list[int] = [], ): super().__init__( name, address, delay_samples_offset_dac, delay_samples_offset_adc @@ -285,7 +285,7 @@ def play( def process_readout_signal( self, adc_raw_data: dict[int, np.ndarray], - sequence: List[Pulse], + sequence: list[Pulse], qubits: dict[QubitId, Qubit], options: ExecutionParameters, ): diff --git a/src/qibolab/instruments/qblox/acquisition.py b/src/qibolab/instruments/qblox/acquisition.py index d736855249..e38b174336 100644 --- a/src/qibolab/instruments/qblox/acquisition.py +++ b/src/qibolab/instruments/qblox/acquisition.py @@ -1,5 +1,5 @@ from dataclasses import dataclass -from typing import List, Optional +from typing import Optional import numpy as np @@ -32,8 +32,8 @@ class AveragedAcquisition: frequency: int """Frequency of the readout pulse used for demodulation.""" - i: Optional[List[float]] = None - q: Optional[List[float]] = None + i: Optional[list[float]] = None + q: Optional[list[float]] = None @property def scope(self): diff --git a/src/qibolab/instruments/qm/sequence.py b/src/qibolab/instruments/qm/sequence.py index acb825a3e4..8a0df0d392 100644 --- a/src/qibolab/instruments/qm/sequence.py +++ b/src/qibolab/instruments/qm/sequence.py @@ -1,6 +1,6 @@ import collections from dataclasses import dataclass, field -from typing import List, Optional, Set, Union +from typing import Optional, Set, Union import numpy as np from numpy import typing as npt @@ -14,7 +14,7 @@ from .acquisition import Acquisition from .config import SAMPLING_RATE, QMConfig -DurationsType = Union[List[int], npt.NDArray[int]] +DurationsType = Union[list[int], npt.NDArray[int]] """Type of values that can be accepted in a duration sweeper.""" @@ -115,7 +115,7 @@ def play(self): class BakedPulse(QMPulse): """Baking allows 1ns resolution in the pulse waveforms.""" - segments: List[Baking] = field(default_factory=list) + segments: list[Baking] = field(default_factory=list) """Baked segments implementing the pulse.""" amplitude: Optional[float] = None """Amplitude of the baked pulse. @@ -186,7 +186,7 @@ class Sequence: corresponds to each pulse, as defined in the QM config. """ - qmpulses: List[QMPulse] = field(default_factory=list) + qmpulses: list[QMPulse] = field(default_factory=list) """List of :class:`qibolab.instruments.qm.QMPulse` objects corresponding to the original pulses.""" pulse_to_qmpulse: dict[Pulse, QMPulse] = field(default_factory=dict) @@ -194,7 +194,7 @@ class Sequence: clock: dict[str, int] = field(default_factory=lambda: collections.defaultdict(int)) """Dictionary used to keep track of times of each element, in order to calculate wait times.""" - pulse_finish: dict[int, List[QMPulse]] = field( + pulse_finish: dict[int, list[QMPulse]] = field( default_factory=lambda: collections.defaultdict(list) ) """Map to find all pulses that finish at a given time (useful for From 4bb09d50b419491afc621d2f050969e3a34ec067 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 6 Aug 2024 15:30:20 +0200 Subject: [PATCH 0404/1006] fix: Remove usage of set type hint from typing --- src/qibolab/instruments/qm/sequence.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/qibolab/instruments/qm/sequence.py b/src/qibolab/instruments/qm/sequence.py index 8a0df0d392..52724f05b7 100644 --- a/src/qibolab/instruments/qm/sequence.py +++ b/src/qibolab/instruments/qm/sequence.py @@ -1,6 +1,6 @@ import collections from dataclasses import dataclass, field -from typing import Optional, Set, Union +from typing import Optional, Union import numpy as np from numpy import typing as npt @@ -57,13 +57,13 @@ class QMPulse: """Data class containing the variables required for data acquisition for the instrument.""" - next_: Set["QMPulse"] = field(default_factory=set) + next_: set["QMPulse"] = field(default_factory=set) """Pulses that will be played after the current pulse. These pulses need to be re-aligned if we are sweeping the start or duration. """ - elements_to_align: Set[str] = field(default_factory=set) + elements_to_align: set[str] = field(default_factory=set) def __post_init__(self): pulse_type = self.pulse.type.name.lower() From cc58a40845f80045d9a8e73b5a416dddb469c695 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 7 Aug 2024 19:44:50 +0200 Subject: [PATCH 0405/1006] fix: Replace complicated transposition with moveaxis --- src/qibolab/result.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qibolab/result.py b/src/qibolab/result.py index 86bc13f8c4..5d5ecdaf96 100644 --- a/src/qibolab/result.py +++ b/src/qibolab/result.py @@ -13,7 +13,7 @@ def _lift(values: IQ) -> npt.NDArray: """Transpose the innermost dimension to the outermost.""" - return np.transpose(values, [-1, *range(values.ndim - 1)]) + return np.moveaxis(values, -1, 0) def _sink(values: npt.NDArray) -> IQ: @@ -21,7 +21,7 @@ def _sink(values: npt.NDArray) -> IQ: Inverse of :func:`_lift`. """ - return np.transpose(values, [*range(1, values.ndim), 0]) + return np.moveaxis(values, 0, -1) def collect(i: npt.NDArray, q: npt.NDArray) -> IQ: From 67c31aad99601c251c03e60b3783e65c21f92312 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 7 Aug 2024 15:46:45 +0200 Subject: [PATCH 0406/1006] build: Add a twpa extra For the time being mirroring the los one, but better to keep them independent, since the two things may split. And it's pretty cheap anyhow... --- poetry.lock | 3 ++- pyproject.toml | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index 3f72710fde..469d2da859 100644 --- a/poetry.lock +++ b/poetry.lock @@ -5857,9 +5857,10 @@ los = ["pyvisa-py", "qcodes", "qcodes_contrib_drivers"] qblox = ["pyvisa-py", "qblox-instruments", "qcodes", "qcodes_contrib_drivers"] qm = ["qm-qua", "qualang-tools"] rfsoc = ["qibosoq"] +twpa = ["pyvisa-py", "qcodes", "qcodes_contrib_drivers"] zh = ["laboneq"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.12" -content-hash = "30a7e1b0b8caa372b4076bce71583a537c7ad92555c5249a883c96b799f9cc5f" +content-hash = "a5bf84cc1a4fa49d87dd8a53e5bc48949e4f1bef7c09fd73aca1f26aed3906cd" diff --git a/pyproject.toml b/pyproject.toml index d9171385bf..8f57d469c5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -87,6 +87,7 @@ qm = ["qm-qua", "qualang-tools"] zh = ["laboneq"] rfsoc = ["qibosoq"] los = ["qcodes", "qcodes_contrib_drivers", "pyvisa-py"] +twpa = ["qcodes", "qcodes_contrib_drivers", "pyvisa-py"] emulator = ["qutip"] From 1d93ed0eb5b911fe4a49d29c98ac32fcf57bbb65 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 30 Jan 2024 17:59:14 +0400 Subject: [PATCH 0407/1006] sketch ideas --- src/qibolab/channel.py | 42 ++++++++++++++++++++ src/qibolab/channel_config.py | 38 ++++++++++++++++++ src/qibolab/instruments/abstract_channels.py | 25 ++++++++++++ src/qibolab/instruments/zhinst/channels.py | 22 ++++++++++ 4 files changed, 127 insertions(+) create mode 100644 src/qibolab/channel.py create mode 100644 src/qibolab/channel_config.py create mode 100644 src/qibolab/instruments/abstract_channels.py create mode 100644 src/qibolab/instruments/zhinst/channels.py diff --git a/src/qibolab/channel.py b/src/qibolab/channel.py new file mode 100644 index 0000000000..8bf1ec6762 --- /dev/null +++ b/src/qibolab/channel.py @@ -0,0 +1,42 @@ +from dataclasses import dataclass + + +@dataclass +class NamedChannel: + """Channel that has a name. This is part of the end-user API, i.e. is in + the top layer. + + The idea is the following: + 1. End users do not know what are the types of channels in a platform, they just know names. + They use only NamedChannels to describe pulse sequences. They can create NamedChannels using the get_channel function below. + 2. User makes some assumptions about the types of channels. E.g. they assume that the channel NamedChannel("qubit_0/drive") + is an IQ channel, hence they play IQ pulses on it, and they provide IQChannelConfig for it. + 3. Upon receival of the execution request qibolab validates that the requested execution can be done, i.e. + channels with those names exist and user's assumptions are correct. + 4. qibolab proceeds with execution. + For the last two steps qibolab needs to replace generic NamedChannels with concrete channels (e.g. ZurichIQChannel, QbloxDCChannel, etc.), and + those should be available in the Platform description. + + TODO: I am not sure if having this class brings any benefit to this plan compared to the case where we just use naked str names, but I will figure + this out later during implementation. + + TODO: One might argue that it is reasonable to provide the end user the types of channels as well, and then do all the validation while constructing the pulse + sequence. I thought about this and failed to find real benefit, it just seems to complicate the code and the user-facing API for no real benefit. + Please comment if you have anything to say regarding this. + """ + + name: str + + def __str__(self) -> str: + return self.name + + +def get_channel(element: str, line: str) -> NamedChannel: + """Named channel for given element (qubit|qubit|coupler|etc.), for given + line (drive|flux|readout|etc.) + + This method can be used by users to get the channel that they are interested in, and then use this in their pulse sequence description. + + FIXME: the function signature is just a mock/sketch. Needs to be designed properly. + """ + return NamedChannel(f"{element}/{line}") diff --git a/src/qibolab/channel_config.py b/src/qibolab/channel_config.py new file mode 100644 index 0000000000..7ed8c04690 --- /dev/null +++ b/src/qibolab/channel_config.py @@ -0,0 +1,38 @@ +from dataclasses import dataclass +from enum import Enum + +"""Definitions for common options for various types of channels. This is part of the end-user API, i.e. is in the top layer. +""" + + +class AcquisitionType(Enum): + RAW = "raw" + INTEGRATION = "integration" + CLASSIFICATION = "classification" + + +@dataclass +class DCChannelConfig: + sampling_rate: float + bias: float + + +@dataclass +class IQChannelConfig: + sampling_rate: float + frequency: float + mixer_g: float = 0.0 + mixer_phi: float = 0.0 + + +@dataclass +class OscillatorChannelConfig: + frequency: float + + +@dataclass +class AcquisitionChannelConfig: + type: AcquisitionType + integration_weights_i: list[float] + integration_weights_q: list[float] + classification_kernel: float # FIXME diff --git a/src/qibolab/instruments/abstract_channels.py b/src/qibolab/instruments/abstract_channels.py new file mode 100644 index 0000000000..65b965a073 --- /dev/null +++ b/src/qibolab/instruments/abstract_channels.py @@ -0,0 +1,25 @@ +from abc import ABC, abstractmethod + +""" +In the instrument layer we shall try to do as many things as possible in a unified manner. +This file defines the requrements on various types of channels that instrument-specific implementations should satisfy. +E.g. there could be methods returning the memory limitation on a channel, so that a unified unrolling-batching algorithm +can be written that is not instrument-specific. + +TODO: this needs proper design +""" + + +class IQChannel(ABC): + + @abstractmethod + def foo(self, args, kwargs): ... + + @abstractmethod + def bar(self, args): ... + + +class DCChannel(ABC): + + @abstractmethod + def baz(self, kwargs): ... diff --git a/src/qibolab/instruments/zhinst/channels.py b/src/qibolab/instruments/zhinst/channels.py new file mode 100644 index 0000000000..144e36406f --- /dev/null +++ b/src/qibolab/instruments/zhinst/channels.py @@ -0,0 +1,22 @@ +from qibolab.channel import NamedChannel +from qibolab.channel_config import IQChannelConfig +from qibolab.instruments.abstract_channels import IQChannel + +"""The glue part of the platform shall manually define all channels according to wiring, +then for each user request appropriate channels will be collected for handling the execution. +""" + + +class ZIIQChannel(IQChannel, NamedChannel): + """IQChannel using a from Zurich instruments.""" + + config: IQChannelConfig + + # FIXME: add all the necessary stuff needed to define a ZI IQ channel + + def foo(self, args, kwargs): ... + + def bar(self, args): ... + + +# TODO: Similarly, other ZI channels can be implemented From dc7d8b53d1278ec47a5f2f96c1addec829455bc0 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Fri, 5 Apr 2024 12:47:40 +0400 Subject: [PATCH 0408/1006] Define user facing Channel and various *ChannelConfig classes --- src/qibolab/channel.py | 42 ------------ src/qibolab/channel_config.py | 71 +++++++++++++++----- src/qibolab/instruments/abstract_channels.py | 25 ------- src/qibolab/instruments/zhinst/channels.py | 22 ------ 4 files changed, 55 insertions(+), 105 deletions(-) delete mode 100644 src/qibolab/channel.py delete mode 100644 src/qibolab/instruments/abstract_channels.py delete mode 100644 src/qibolab/instruments/zhinst/channels.py diff --git a/src/qibolab/channel.py b/src/qibolab/channel.py deleted file mode 100644 index 8bf1ec6762..0000000000 --- a/src/qibolab/channel.py +++ /dev/null @@ -1,42 +0,0 @@ -from dataclasses import dataclass - - -@dataclass -class NamedChannel: - """Channel that has a name. This is part of the end-user API, i.e. is in - the top layer. - - The idea is the following: - 1. End users do not know what are the types of channels in a platform, they just know names. - They use only NamedChannels to describe pulse sequences. They can create NamedChannels using the get_channel function below. - 2. User makes some assumptions about the types of channels. E.g. they assume that the channel NamedChannel("qubit_0/drive") - is an IQ channel, hence they play IQ pulses on it, and they provide IQChannelConfig for it. - 3. Upon receival of the execution request qibolab validates that the requested execution can be done, i.e. - channels with those names exist and user's assumptions are correct. - 4. qibolab proceeds with execution. - For the last two steps qibolab needs to replace generic NamedChannels with concrete channels (e.g. ZurichIQChannel, QbloxDCChannel, etc.), and - those should be available in the Platform description. - - TODO: I am not sure if having this class brings any benefit to this plan compared to the case where we just use naked str names, but I will figure - this out later during implementation. - - TODO: One might argue that it is reasonable to provide the end user the types of channels as well, and then do all the validation while constructing the pulse - sequence. I thought about this and failed to find real benefit, it just seems to complicate the code and the user-facing API for no real benefit. - Please comment if you have anything to say regarding this. - """ - - name: str - - def __str__(self) -> str: - return self.name - - -def get_channel(element: str, line: str) -> NamedChannel: - """Named channel for given element (qubit|qubit|coupler|etc.), for given - line (drive|flux|readout|etc.) - - This method can be used by users to get the channel that they are interested in, and then use this in their pulse sequence description. - - FIXME: the function signature is just a mock/sketch. Needs to be designed properly. - """ - return NamedChannel(f"{element}/{line}") diff --git a/src/qibolab/channel_config.py b/src/qibolab/channel_config.py index 7ed8c04690..6c71c8ad43 100644 --- a/src/qibolab/channel_config.py +++ b/src/qibolab/channel_config.py @@ -1,38 +1,77 @@ from dataclasses import dataclass -from enum import Enum - -"""Definitions for common options for various types of channels. This is part of the end-user API, i.e. is in the top layer. -""" +from typing import Union +from .execution_parameters import AcquisitionType -class AcquisitionType(Enum): - RAW = "raw" - INTEGRATION = "integration" - CLASSIFICATION = "classification" +""" +Channel is an abstract concept that defines an interface in front of various instrument drivers in qibolab, without +exposing instrument specific implementation details. For the users of this interface a quantum computer is just a +predefined set of channels where they can send signals or receive signals/data from. Users do not have control over what +channels exist - it is determined by the setup of a certain quantum computer. However, users have control over some +configuration parameters. A typical use case is to configure some channels with desired parameters and request an +execution of a synchronized pulse sequence that implements a certain computation or a calibration experiment. +""" @dataclass class DCChannelConfig: - sampling_rate: float + """Configuration for a channel that can be used to send DC pulses (i.e. + just envelopes without modulation on any frequency)""" + bias: float + """DC bias/offset of the channel.""" @dataclass class IQChannelConfig: - sampling_rate: float + """Configuration for an IQ channel. This is used for IQ channels that can + generate requested signals by first generating them at an intermediate + frequency, and then mixing it with a local oscillator (LO) to upconvert to + the target carrier frequency. + + For this type of IQ channels users typically + 1. want to have control over the LO frequency. + 2. need to be able to calibrate parameters related to the mixer imperfections. + Mixers typically have some imbalance in the way they treat the I and Q components + of the signal, and to compensate for it users typically need to calibrate the + compensation parameters and provide them as channel configuration. + """ + frequency: float - mixer_g: float = 0.0 - mixer_phi: float = 0.0 + """The carrier frequency of the channel.""" + lo_frequency: float + """The frequency of the local oscillator.""" + mixer_correction_scale: float = 0.0 + """The relative amplitude scale/factor of the q channel.""" + mixer_correction_phase: float = 0.0 + """The phase offset of the q channel of the LO.""" @dataclass -class OscillatorChannelConfig: +class DirectIQChannelConfig: + """Configuration for an IQ channel that directly generates signals at + necessary carrier frequency.""" + frequency: float + """The carrier frequency of the channel.""" @dataclass class AcquisitionChannelConfig: + """Configuration for acquisition channels.""" + type: AcquisitionType - integration_weights_i: list[float] - integration_weights_q: list[float] - classification_kernel: float # FIXME + + +@dataclass +class Channel: + """A channel is represented by its unique name, and the type of + configuration that should be specified for it.""" + + name: str + config_type: type + + +ChannelConfig = Union[ + DCChannelConfig, IQChannelConfig, DirectIQChannelConfig, AcquisitionChannelConfig +] diff --git a/src/qibolab/instruments/abstract_channels.py b/src/qibolab/instruments/abstract_channels.py deleted file mode 100644 index 65b965a073..0000000000 --- a/src/qibolab/instruments/abstract_channels.py +++ /dev/null @@ -1,25 +0,0 @@ -from abc import ABC, abstractmethod - -""" -In the instrument layer we shall try to do as many things as possible in a unified manner. -This file defines the requrements on various types of channels that instrument-specific implementations should satisfy. -E.g. there could be methods returning the memory limitation on a channel, so that a unified unrolling-batching algorithm -can be written that is not instrument-specific. - -TODO: this needs proper design -""" - - -class IQChannel(ABC): - - @abstractmethod - def foo(self, args, kwargs): ... - - @abstractmethod - def bar(self, args): ... - - -class DCChannel(ABC): - - @abstractmethod - def baz(self, kwargs): ... diff --git a/src/qibolab/instruments/zhinst/channels.py b/src/qibolab/instruments/zhinst/channels.py deleted file mode 100644 index 144e36406f..0000000000 --- a/src/qibolab/instruments/zhinst/channels.py +++ /dev/null @@ -1,22 +0,0 @@ -from qibolab.channel import NamedChannel -from qibolab.channel_config import IQChannelConfig -from qibolab.instruments.abstract_channels import IQChannel - -"""The glue part of the platform shall manually define all channels according to wiring, -then for each user request appropriate channels will be collected for handling the execution. -""" - - -class ZIIQChannel(IQChannel, NamedChannel): - """IQChannel using a from Zurich instruments.""" - - config: IQChannelConfig - - # FIXME: add all the necessary stuff needed to define a ZI IQ channel - - def foo(self, args, kwargs): ... - - def bar(self, args): ... - - -# TODO: Similarly, other ZI channels can be implemented From d411b5083baa6c47d9d94fe7c599c5e534ce3f66 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 23 Apr 2024 17:51:07 +0400 Subject: [PATCH 0409/1006] simple channel definition --- src/qibolab/channel.py | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/qibolab/channel.py diff --git a/src/qibolab/channel.py b/src/qibolab/channel.py new file mode 100644 index 0000000000..46e963de63 --- /dev/null +++ b/src/qibolab/channel.py @@ -0,0 +1,9 @@ +from dataclasses import dataclass + +from .channel_config import ChannelConfig + + +@dataclass(frozen=True) +class Channel: + name: str + config: ChannelConfig From 84a0b4cbe431cf30b0f06ee38ad63ce8f4b4bca5 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Wed, 24 Apr 2024 16:08:15 +0400 Subject: [PATCH 0410/1006] update platfrom according to new way of defining sequences rename PulseSequence to ControlSequence update platfrom according to new way of defining sequences Revert "remove the ChannelMap class" This reverts commit 0e73c12e285f76e950f7b83c9ac9e45c79f08651. clean up channel and config definitions propagate user provided channel configs Revert "rename PulseSequence to ControlSequence" This reverts commit 42d606eed05f5a97997904b0a93d5474fc0639b8 --- .../{channel_config.py => channel_configs.py} | 9 +------ src/qibolab/instruments/rfsoc/driver.py | 21 ++++++++++++++++ src/qibolab/instruments/zhinst/channel.py | 10 ++++++++ .../instruments/zhinst/channel_configs.py | 25 +++++++++++++++++++ 4 files changed, 57 insertions(+), 8 deletions(-) rename src/qibolab/{channel_config.py => channel_configs.py} (74%) create mode 100644 src/qibolab/instruments/zhinst/channel.py create mode 100644 src/qibolab/instruments/zhinst/channel_configs.py diff --git a/src/qibolab/channel_config.py b/src/qibolab/channel_configs.py similarity index 74% rename from src/qibolab/channel_config.py rename to src/qibolab/channel_configs.py index 6c71c8ad43..368c5d77b0 100644 --- a/src/qibolab/channel_config.py +++ b/src/qibolab/channel_configs.py @@ -3,14 +3,7 @@ from .execution_parameters import AcquisitionType -""" -Channel is an abstract concept that defines an interface in front of various instrument drivers in qibolab, without -exposing instrument specific implementation details. For the users of this interface a quantum computer is just a -predefined set of channels where they can send signals or receive signals/data from. Users do not have control over what -channels exist - it is determined by the setup of a certain quantum computer. However, users have control over some -configuration parameters. A typical use case is to configure some channels with desired parameters and request an -execution of a synchronized pulse sequence that implements a certain computation or a calibration experiment. -""" +"""Common configuration for various channels.""" @dataclass diff --git a/src/qibolab/instruments/rfsoc/driver.py b/src/qibolab/instruments/rfsoc/driver.py index 09c1ce06d0..c6437eed08 100644 --- a/src/qibolab/instruments/rfsoc/driver.py +++ b/src/qibolab/instruments/rfsoc/driver.py @@ -268,6 +268,27 @@ def play( return results + @staticmethod + def validate_input_command( + sequence: PulseSequence, + execution_parameters: ExecutionParameters, + sweep: bool, + ): + """Check if sequence and execution_parameters are supported.""" + if execution_parameters.acquisition_type is AcquisitionType.RAW: + if sweep: + raise NotImplementedError( + "Raw data acquisition is not compatible with sweepers" + ) + if len(sequence.ro_pulses) != 1: + raise NotImplementedError( + "Raw data acquisition is compatible only with a single readout" + ) + if execution_parameters.averaging_mode is not AveragingMode.CYCLIC: + raise NotImplementedError("Raw data acquisition can only be averaged") + if execution_parameters.fast_reset: + raise NotImplementedError("Fast reset is not supported") + def update_cfg(self, execution_parameters: ExecutionParameters): """Update rfsoc.Config object with new parameters.""" if execution_parameters.nshots is not None: diff --git a/src/qibolab/instruments/zhinst/channel.py b/src/qibolab/instruments/zhinst/channel.py new file mode 100644 index 0000000000..119383d9da --- /dev/null +++ b/src/qibolab/instruments/zhinst/channel.py @@ -0,0 +1,10 @@ +from dataclasses import dataclass + +from qibolab.channel import Channel + + +@dataclass(frozen=True) +class ZIChannel(Channel): + + device: str + path: str diff --git a/src/qibolab/instruments/zhinst/channel_configs.py b/src/qibolab/instruments/zhinst/channel_configs.py new file mode 100644 index 0000000000..38c87b9090 --- /dev/null +++ b/src/qibolab/instruments/zhinst/channel_configs.py @@ -0,0 +1,25 @@ +from dataclasses import dataclass + +from qibolab.channel_configs import DCChannelConfig, IQChannelConfig + + +@dataclass(frozen=True) +class ZurichDCChannelConfig(DCChannelConfig): + """DC channel config using ZI HDAWG.""" + + power_range: float + """Power range in volts. + + Possible values are [0.2 0.4 0.6 0.8 1. 2. 3. 4. 5.]. + """ + + +@dataclass(frozen=True) +class ZurichIQChannelConfig(IQChannelConfig): + """IQ channel config for ZI SHF* line instrument.""" + + power_range: float + """Power range in dBm. + + Possible values are [-30. -25. -20. -15. -10. -5. 0. 5. 10.]. + """ From 787da661081b30f3326adcca87a7330154f9681f Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Mon, 6 May 2024 12:24:36 +0400 Subject: [PATCH 0411/1006] remove load_instrument_settings since it is replaced by channel config machinery From ca9703df81206852d1b203f1fe1c019140fcd477 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 7 May 2024 12:40:15 +0400 Subject: [PATCH 0412/1006] Revert "remove load_instrument_settings since it is replaced by channel config machinery" This reverts commit 5e237b3f9dbd5416dc6c70362e2435f32bc0e853. From 4a0b23abf98a3b1d491361f186d2307f490a81d2 Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 2 Jul 2024 16:52:34 +0400 Subject: [PATCH 0413/1006] fix incorrect rebase [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/qibolab/instruments/rfsoc/driver.py | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/src/qibolab/instruments/rfsoc/driver.py b/src/qibolab/instruments/rfsoc/driver.py index c6437eed08..09c1ce06d0 100644 --- a/src/qibolab/instruments/rfsoc/driver.py +++ b/src/qibolab/instruments/rfsoc/driver.py @@ -268,27 +268,6 @@ def play( return results - @staticmethod - def validate_input_command( - sequence: PulseSequence, - execution_parameters: ExecutionParameters, - sweep: bool, - ): - """Check if sequence and execution_parameters are supported.""" - if execution_parameters.acquisition_type is AcquisitionType.RAW: - if sweep: - raise NotImplementedError( - "Raw data acquisition is not compatible with sweepers" - ) - if len(sequence.ro_pulses) != 1: - raise NotImplementedError( - "Raw data acquisition is compatible only with a single readout" - ) - if execution_parameters.averaging_mode is not AveragingMode.CYCLIC: - raise NotImplementedError("Raw data acquisition can only be averaged") - if execution_parameters.fast_reset: - raise NotImplementedError("Fast reset is not supported") - def update_cfg(self, execution_parameters: ExecutionParameters): """Update rfsoc.Config object with new parameters.""" if execution_parameters.nshots is not None: From 46021867877989a5faa3c623b03e843c7e894d57 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 30 Jan 2024 18:34:12 +0400 Subject: [PATCH 0414/1006] refactor: Simplify native.py --- src/qibolab/native.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/qibolab/native.py b/src/qibolab/native.py index 6815200314..4239972f66 100644 --- a/src/qibolab/native.py +++ b/src/qibolab/native.py @@ -88,6 +88,8 @@ class SingleQubitNatives: """Pulse to drive to qubit from state 1 to state 2.""" MZ: Optional[FixedSequenceFactory] = None """Measurement pulse.""" + CP: Optional[Pulse] = None + """Pulse to activate a coupler.""" @dataclass From c2ad1b70816e9f76fcf7bb83d059d0920ec2ec3b Mon Sep 17 00:00:00 2001 From: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> Date: Tue, 30 Apr 2024 13:05:31 +0400 Subject: [PATCH 0415/1006] remove channel and qubit properties from pulse --- src/qibolab/compilers/default.py | 33 ++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/qibolab/compilers/default.py b/src/qibolab/compilers/default.py index bf25bed70d..d899dd8d75 100644 --- a/src/qibolab/compilers/default.py +++ b/src/qibolab/compilers/default.py @@ -17,16 +17,24 @@ def identity_rule(gate, qubit): def z_rule(gate, qubit): """Z gate applied virtually.""" +<<<<<<< HEAD seq = PulseSequence() seq[qubit.drive.name].append(VirtualZ(phase=math.pi)) return seq +======= + return PulseSequence([VirtualZ(phase=math.pi)]) +>>>>>>> c5ef5a19 (remove channel and qubit properties from pulse) def rz_rule(gate, qubit): """RZ gate applied virtually.""" +<<<<<<< HEAD seq = PulseSequence() seq[qubit.drive.name].append(VirtualZ(phase=gate.parameters[0])) return seq +======= + return PulseSequence([VirtualZ(phase=gate.parameters[0])]) +>>>>>>> c5ef5a19 (remove channel and qubit properties from pulse) def gpi2_rule(gate, qubit): @@ -42,7 +50,32 @@ def gpi_rule(gate, qubit): # to the matrix representation. See # https://github.com/qiboteam/qibolab/pull/804#pullrequestreview-1890205509 # for more detail. +<<<<<<< HEAD return qubit.native_gates.RX.create_sequence(theta=np.pi, phi=gate.parameters[0]) +======= + pulse = replace(qubit.native_gates.RX, relative_phase=theta) + sequence = PulseSequence([pulse]) + return sequence + + +def u3_rule(gate, qubit): + """U3 applied as RZ-RX90-RZ-RX90-RZ.""" + # Transform gate to U3 and add pi/2-pulses + theta, phi, lam = gate.parameters + # apply RZ(lam) + virtual_z_phases = {qubit.name: lam} + sequence = PulseSequence() + sequence.append(VirtualZ(phase=lam)) + # Fetch pi/2 pulse from calibration and apply RX(pi/2) + sequence.append(qubit.native_gates.RX90) + # apply RZ(theta) + sequence.append(VirtualZ(phase=theta)) + # Fetch pi/2 pulse from calibration and apply RX(-pi/2) + sequence.append(replace(qubit.native_gates.RX90, relative_phase=-math.pi)) + # apply RZ(phi) + sequence.append(VirtualZ(phase=phi)) + return sequence +>>>>>>> c5ef5a19 (remove channel and qubit properties from pulse) def cz_rule(gate, pair): From d8671dc34a203580fc96fb94f458a55763dfdbb8 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 18 Jan 2024 18:18:40 +0100 Subject: [PATCH 0416/1006] Start rearranging pulses into a subpackage --- src/qibolab/pulses/waveform.py | 42 ++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 src/qibolab/pulses/waveform.py diff --git a/src/qibolab/pulses/waveform.py b/src/qibolab/pulses/waveform.py new file mode 100644 index 0000000000..7c530bf362 --- /dev/null +++ b/src/qibolab/pulses/waveform.py @@ -0,0 +1,42 @@ +"""Waveform class.""" +import numpy as np + + +class Waveform: + """A class to save pulse waveforms. + + A waveform is a list of samples, or discrete data points, used by the digital to analogue converters (DACs) + to synthesise pulses. + + Attributes: + data (np.ndarray): a numpy array containing the samples. + """ + + DECIMALS = 5 + + def __init__(self, data): + """Initialise the waveform with a of samples.""" + self.data: np.ndarray = np.array(data) + + def __len__(self): + """Return the length of the waveform, the number of samples.""" + return len(self.data) + + def __hash__(self): + """Hash the underlying data. + + .. todo:: + + In order to make this reliable, we should set the data as immutable. This we + could by making both the class frozen and the contained array readonly + https://numpy.org/doc/stable/reference/generated/numpy.ndarray.flags.html#numpy.ndarray.flags + """ + return hash(self.data.tobytes()) + + def __eq__(self, other): + """Compare two waveforms. + + Two waveforms are considered equal if their samples, rounded to + `Waveform.DECIMALS` decimal places, are all equal. + """ + return np.allclose(self.data, other.data) From 0c654cb918cbe7d38b08c1ac87cebad5ef7b932d Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 19 Jan 2024 19:15:24 +0100 Subject: [PATCH 0417/1006] Turn waveform into a bare array --- src/qibolab/pulses/waveform.py | 42 ---------------------------------- 1 file changed, 42 deletions(-) delete mode 100644 src/qibolab/pulses/waveform.py diff --git a/src/qibolab/pulses/waveform.py b/src/qibolab/pulses/waveform.py deleted file mode 100644 index 7c530bf362..0000000000 --- a/src/qibolab/pulses/waveform.py +++ /dev/null @@ -1,42 +0,0 @@ -"""Waveform class.""" -import numpy as np - - -class Waveform: - """A class to save pulse waveforms. - - A waveform is a list of samples, or discrete data points, used by the digital to analogue converters (DACs) - to synthesise pulses. - - Attributes: - data (np.ndarray): a numpy array containing the samples. - """ - - DECIMALS = 5 - - def __init__(self, data): - """Initialise the waveform with a of samples.""" - self.data: np.ndarray = np.array(data) - - def __len__(self): - """Return the length of the waveform, the number of samples.""" - return len(self.data) - - def __hash__(self): - """Hash the underlying data. - - .. todo:: - - In order to make this reliable, we should set the data as immutable. This we - could by making both the class frozen and the contained array readonly - https://numpy.org/doc/stable/reference/generated/numpy.ndarray.flags.html#numpy.ndarray.flags - """ - return hash(self.data.tobytes()) - - def __eq__(self, other): - """Compare two waveforms. - - Two waveforms are considered equal if their samples, rounded to - `Waveform.DECIMALS` decimal places, are all equal. - """ - return np.allclose(self.data, other.data) From f797a466f542cfaa1a787d586f6bff2c2491dfc6 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Mon, 4 Mar 2024 19:16:45 +0400 Subject: [PATCH 0418/1006] fix: compiler and tests --- src/qibolab/compilers/default.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/qibolab/compilers/default.py b/src/qibolab/compilers/default.py index d899dd8d75..b5fd3867fe 100644 --- a/src/qibolab/compilers/default.py +++ b/src/qibolab/compilers/default.py @@ -4,6 +4,7 @@ """ import math +from dataclasses import replace import numpy as np From 86a2246c75312578395be1c092c28a995642ef1c Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 18 Jan 2024 18:18:40 +0100 Subject: [PATCH 0419/1006] Start rearranging pulses into a subpackage --- src/qibolab/pulses/plot.py | 12 ++++++---- src/qibolab/pulses/pulse.py | 24 +++++++++++++++++++ src/qibolab/pulses/waveform.py | 42 ++++++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+), 5 deletions(-) create mode 100644 src/qibolab/pulses/waveform.py diff --git a/src/qibolab/pulses/plot.py b/src/qibolab/pulses/plot.py index 16e7189c85..052486b5c7 100644 --- a/src/qibolab/pulses/plot.py +++ b/src/qibolab/pulses/plot.py @@ -26,7 +26,7 @@ def waveform(wf: Waveform, filename=None): filename (str): a file path. If provided the plot is save to a file. """ plt.figure(figsize=(14, 5), dpi=200) - plt.plot(wf, c="C0", linestyle="dashed") + plt.plot(wf.data, c="C0", linestyle="dashed") plt.xlabel("Sample Number") plt.ylabel("Amplitude") plt.grid(visible=True, which="both", axis="both", color="#888888", linestyle="-") @@ -57,14 +57,14 @@ def pulse(pulse_: Pulse, freq: Optional[float] = None, filename: Optional[str] = ax1 = plt.subplot(gs[0]) ax1.plot( time, - waveform_i, + waveform_i.data, label="envelope i", c="C0", linestyle="dashed", ) ax1.plot( time, - waveform_q, + waveform_q.data, label="envelope q", c="C1", linestyle="dashed", @@ -86,11 +86,13 @@ def pulse(pulse_: Pulse, freq: Optional[float] = None, filename: Optional[str] = ax1.set_ylabel("Amplitude") ax1.grid(visible=True, which="both", axis="both", color="#888888", linestyle="-") - start = 0 - finish = float(pulse_.duration) + start = float(pulse_.start) + finish = float(pulse._finish) if pulse._finish is not None else 0.0 ax1.axis((start, finish, -1.0, 1.0)) ax1.legend() + modulated_i = pulse_.shape.modulated_waveform_i(sampling_rate).data + modulated_q = pulse_.shape.modulated_waveform_q(sampling_rate).data ax2 = plt.subplot(gs[1]) ax2.plot(waveform_i, waveform_q, label="envelope", c="C2") if modulated is not None: diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index f722c50a28..198f05457c 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -81,6 +81,24 @@ def envelopes(self, sampling_rate: float) -> IqWaveform: """A tuple with the i and q envelope waveforms of the pulse.""" return np.array([self.i(sampling_rate), self.q(sampling_rate)]) + def modulated_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: + """The waveform of the i component of the pulse, modulated with its + frequency.""" + + return self.shape.modulated_waveform_i(sampling_rate) + + def modulated_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: + """The waveform of the q component of the pulse, modulated with its + frequency.""" + + return self.shape.modulated_waveform_q(sampling_rate) + + def modulated_waveforms(self, sampling_rate): # -> tuple[Waveform, Waveform]: + """A tuple with the i and q waveforms of the pulse, modulated with its + frequency.""" + + return self.shape.modulated_waveforms(sampling_rate) + def __hash__(self): """Hash the content. @@ -104,6 +122,12 @@ def __hash__(self): ) ) + def __add__(self, other): + if isinstance(other, Pulse): + return PulseSequence(self, other) + if isinstance(other, PulseSequence): + return PulseSequence(self, *other) + raise TypeError(f"Expected Pulse or PulseSequence; got {type(other).__name__}") class Delay(_PulseLike): """A wait instruction during which we are not sending any pulses to the diff --git a/src/qibolab/pulses/waveform.py b/src/qibolab/pulses/waveform.py new file mode 100644 index 0000000000..7c530bf362 --- /dev/null +++ b/src/qibolab/pulses/waveform.py @@ -0,0 +1,42 @@ +"""Waveform class.""" +import numpy as np + + +class Waveform: + """A class to save pulse waveforms. + + A waveform is a list of samples, or discrete data points, used by the digital to analogue converters (DACs) + to synthesise pulses. + + Attributes: + data (np.ndarray): a numpy array containing the samples. + """ + + DECIMALS = 5 + + def __init__(self, data): + """Initialise the waveform with a of samples.""" + self.data: np.ndarray = np.array(data) + + def __len__(self): + """Return the length of the waveform, the number of samples.""" + return len(self.data) + + def __hash__(self): + """Hash the underlying data. + + .. todo:: + + In order to make this reliable, we should set the data as immutable. This we + could by making both the class frozen and the contained array readonly + https://numpy.org/doc/stable/reference/generated/numpy.ndarray.flags.html#numpy.ndarray.flags + """ + return hash(self.data.tobytes()) + + def __eq__(self, other): + """Compare two waveforms. + + Two waveforms are considered equal if their samples, rounded to + `Waveform.DECIMALS` decimal places, are all equal. + """ + return np.allclose(self.data, other.data) From 03bf945b633e0bdd1ef0bc93b53f85c831c5cf06 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 15 Mar 2024 18:10:32 +0100 Subject: [PATCH 0420/1006] test: Fix remaining pytests collection errors --- src/qibolab/instruments/qm/config.py | 4 +++- tests/test_instruments_qm.py | 4 +++- tests/test_instruments_rfsoc.py | 4 ++++ tests/test_sweeper.py | 2 ++ 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/qibolab/instruments/qm/config.py b/src/qibolab/instruments/qm/config.py index cc934fb202..e6ceeca78f 100644 --- a/src/qibolab/instruments/qm/config.py +++ b/src/qibolab/instruments/qm/config.py @@ -4,10 +4,12 @@ import numpy as np from qibo.config import raise_error -from qibolab.pulses import PulseType, Rectangular +from qibolab.pulses import Envelopes, PulseType from .ports import OPXIQ, OctaveInput, OctaveOutput, OPXOutput +Rectangular = Envelopes.RECTANGULAR.value + SAMPLING_RATE = 1 """Sampling rate of Quantum Machines OPX in GSps.""" diff --git a/tests/test_instruments_qm.py b/tests/test_instruments_qm.py index 62b3ef994b..b60670f868 100644 --- a/tests/test_instruments_qm.py +++ b/tests/test_instruments_qm.py @@ -9,12 +9,14 @@ from qibolab.instruments.qm.acquisition import Acquisition, declare_acquisitions from qibolab.instruments.qm.controller import controllers_config from qibolab.instruments.qm.sequence import BakedPulse, QMPulse, Sequence -from qibolab.pulses import Pulse, PulseSequence, PulseType, Rectangular +from qibolab.pulses import Envelopes, Pulse, PulseSequence, PulseType from qibolab.qubits import Qubit from qibolab.sweeper import Parameter, Sweeper from .conftest import set_platform_profile +Rectangular = Envelopes.RECTANGULAR.value + def test_qmpulse(): pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), "ch0", qubit=0) diff --git a/tests/test_instruments_rfsoc.py b/tests/test_instruments_rfsoc.py index b61b848061..96bebb79b0 100644 --- a/tests/test_instruments_rfsoc.py +++ b/tests/test_instruments_rfsoc.py @@ -20,6 +20,10 @@ from .conftest import get_instrument +Rectangular = Envelopes.RECTANGULAR.value +Gaussian = Envelopes.GAUSSIAN.value +Drag = Envelopes.DRAG.value + def test_convert_default(dummy_qrc): """Test convert function raises errors when parameter have wrong types.""" diff --git a/tests/test_sweeper.py b/tests/test_sweeper.py index 848f114112..6b450adc6e 100644 --- a/tests/test_sweeper.py +++ b/tests/test_sweeper.py @@ -4,6 +4,8 @@ from qibolab.pulses import Pulse, Rectangular from qibolab.sweeper import ChannelParameter, Parameter, Sweeper +Rectangular = Envelopes.RECTANGULAR.value + @pytest.mark.parametrize("parameter", Parameter) def test_sweeper_pulses(parameter): From 0fa7a7fc27d73b92da6670afb39f5752d85644d3 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 21 Mar 2024 15:50:10 +0400 Subject: [PATCH 0421/1006] fix: Propagate Pydantic models to Pulse --- src/qibolab/instruments/qm/config.py | 4 +--- src/qibolab/pulses/pulse.py | 1 + 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/qibolab/instruments/qm/config.py b/src/qibolab/instruments/qm/config.py index e6ceeca78f..cc934fb202 100644 --- a/src/qibolab/instruments/qm/config.py +++ b/src/qibolab/instruments/qm/config.py @@ -4,12 +4,10 @@ import numpy as np from qibo.config import raise_error -from qibolab.pulses import Envelopes, PulseType +from qibolab.pulses import PulseType, Rectangular from .ports import OPXIQ, OctaveInput, OctaveOutput, OPXOutput -Rectangular = Envelopes.RECTANGULAR.value - SAMPLING_RATE = 1 """Sampling rate of Quantum Machines OPX in GSps.""" diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index 198f05457c..ba8e9d594c 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -5,6 +5,7 @@ from typing import Union import numpy as np +from pydantic import BaseModel from qibolab.serialize_ import Model From 1583625656591f52f33db9fa0a82b9137b1eb60b Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 21 Mar 2024 19:06:20 +0400 Subject: [PATCH 0422/1006] fix: Solve import-related issues in tests --- tests/test_instruments_qm.py | 4 +--- tests/test_instruments_rfsoc.py | 4 ---- tests/test_sweeper.py | 2 -- 3 files changed, 1 insertion(+), 9 deletions(-) diff --git a/tests/test_instruments_qm.py b/tests/test_instruments_qm.py index b60670f868..62b3ef994b 100644 --- a/tests/test_instruments_qm.py +++ b/tests/test_instruments_qm.py @@ -9,14 +9,12 @@ from qibolab.instruments.qm.acquisition import Acquisition, declare_acquisitions from qibolab.instruments.qm.controller import controllers_config from qibolab.instruments.qm.sequence import BakedPulse, QMPulse, Sequence -from qibolab.pulses import Envelopes, Pulse, PulseSequence, PulseType +from qibolab.pulses import Pulse, PulseSequence, PulseType, Rectangular from qibolab.qubits import Qubit from qibolab.sweeper import Parameter, Sweeper from .conftest import set_platform_profile -Rectangular = Envelopes.RECTANGULAR.value - def test_qmpulse(): pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), "ch0", qubit=0) diff --git a/tests/test_instruments_rfsoc.py b/tests/test_instruments_rfsoc.py index 96bebb79b0..b61b848061 100644 --- a/tests/test_instruments_rfsoc.py +++ b/tests/test_instruments_rfsoc.py @@ -20,10 +20,6 @@ from .conftest import get_instrument -Rectangular = Envelopes.RECTANGULAR.value -Gaussian = Envelopes.GAUSSIAN.value -Drag = Envelopes.DRAG.value - def test_convert_default(dummy_qrc): """Test convert function raises errors when parameter have wrong types.""" diff --git a/tests/test_sweeper.py b/tests/test_sweeper.py index 6b450adc6e..848f114112 100644 --- a/tests/test_sweeper.py +++ b/tests/test_sweeper.py @@ -4,8 +4,6 @@ from qibolab.pulses import Pulse, Rectangular from qibolab.sweeper import ChannelParameter, Parameter, Sweeper -Rectangular = Envelopes.RECTANGULAR.value - @pytest.mark.parametrize("parameter", Parameter) def test_sweeper_pulses(parameter): From 0997d57090f476d495cfdd9a96ed51e7d33ed151 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 28 Mar 2024 18:20:49 +0100 Subject: [PATCH 0423/1006] feat: Propagate pydantic models to execution parameters, fix backend tests --- src/qibolab/compilers/default.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/qibolab/compilers/default.py b/src/qibolab/compilers/default.py index b5fd3867fe..d899dd8d75 100644 --- a/src/qibolab/compilers/default.py +++ b/src/qibolab/compilers/default.py @@ -4,7 +4,6 @@ """ import math -from dataclasses import replace import numpy as np From 6c271cdeaeffdfc33c0f773c9fe510a810f2afc4 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Sat, 20 Apr 2024 18:01:51 +0400 Subject: [PATCH 0424/1006] refactor: Drop QM specific sequences and pulses --- src/qibolab/instruments/qm/program.py | 67 +++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 src/qibolab/instruments/qm/program.py diff --git a/src/qibolab/instruments/qm/program.py b/src/qibolab/instruments/qm/program.py new file mode 100644 index 0000000000..bb46ad90a3 --- /dev/null +++ b/src/qibolab/instruments/qm/program.py @@ -0,0 +1,67 @@ +from dataclasses import dataclass +from typing import Optional + +from qm import qua + +from qibolab.pulses import Delay, PulseType + +from .acquisition import Acquisition + + +def operation(pulse): + """Generate operation name in QM ``config`` for the given pulse.""" + return str(hash(pulse)) + + +def element(pulse): + """Generate element name in QM ``config`` for the given pulse.""" + return pulse.channel + + +@dataclass +class Parameters: + # TODO: Split acquisition and sweep parameters + acquisition: Optional[Acquisition] = None + # TODO: Change the following types to QUA variables + duration: Optional[int] = None + amplitude: Optional[float] = None + phase: Optional[float] = None + + +def _delay(pulse): + # TODO: How to play delays on multiple elements? + qua.wait(pulse.duration, element(pulse)) + + +def _play(pulse, parameters): + el = element(pulse) + if parameters.phase is not None: + qua.frame_rotation_2pi(parameters.phase, el) + if parameters.amplitude is not None: + op = operation(pulse) * parameters.amplitude + else: + op = operation(pulse) + + if pulse.type is PulseType.READOUT: + parameters.acquisition.measure(op) + else: + qua.play(op, el, duration=parameters.duration) + + if parameters.phase is not None: + qua.reset_frame(el) + + +def play(self, sequence, parameters, relaxation_time=0): + """Part of QUA program that plays an arbitrary pulse sequence. + + Should be used inside a ``program()`` context. + """ + qua.align() + for pulse in sequence: + if isinstance(pulse, Delay): + _delay(pulse) + else: + _play(pulse, parameters[operation(pulse)]) + + if relaxation_time > 0: + qua.wait(relaxation_time // 4) From c99d0687de75fbf6b7f5d122bc2e3f8ce0e65946 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Sat, 20 Apr 2024 23:33:39 +0400 Subject: [PATCH 0425/1006] fix: single shot classification works --- src/qibolab/instruments/qm/config.py | 43 +++++-- src/qibolab/instruments/qm/controller.py | 81 +++++++----- src/qibolab/instruments/qm/program.py | 15 +-- src/qibolab/instruments/qm/sweepers.py | 150 ++++++++++++----------- src/qibolab/pulses/pulse.py | 39 +++--- 5 files changed, 184 insertions(+), 144 deletions(-) diff --git a/src/qibolab/instruments/qm/config.py b/src/qibolab/instruments/qm/config.py index cc934fb202..1bb60a86f7 100644 --- a/src/qibolab/instruments/qm/config.py +++ b/src/qibolab/instruments/qm/config.py @@ -19,6 +19,21 @@ """ +def operation(pulse): + """Generate operation name in QM ``config`` for the given pulse.""" + return str(hash(pulse)) + + +def element(pulse): + """Generate element name in QM ``config`` for the given pulse.""" + return pulse.channel + + +def float_serial(x): + """Convert float to string to use in config keys.""" + return format(x, ".6f").rstrip("0").rstrip(".") + + @dataclass class QMConfig: """Configuration for communicating with the ``QuantumMachinesManager``.""" @@ -251,7 +266,7 @@ def register_element(self, qubit, pulse, time_of_flight=0, smearing=0): element = self.register_flux_element(qubit, pulse.frequency) return element - def register_pulse(self, qubit, qmpulse): + def register_pulse(self, pulse, qubit): """Registers pulse, waveforms and integration weights in QM config. Args: @@ -340,17 +355,31 @@ def register_waveform(self, pulse, mode="i"): serial = "zero_wf" if serial not in self.waveforms: self.waveforms[serial] = {"type": "constant", "sample": 0.0} - elif isinstance(pulse.shape, Rectangular): - serial = f"constant_wf{pulse.amplitude}" + return serial + + phase = (pulse.relative_phase % (2 * np.pi)) / (2 * np.pi) + amplitude = float_serial(pulse.amplitude) + phase_str = float_serial(phase) + if isinstance(pulse.envelope, Rectangular): + serial = f"constant_wf({amplitude}, {phase_str})" if serial not in self.waveforms: - self.waveforms[serial] = {"type": "constant", "sample": pulse.amplitude} + if mode == "i": + sample = pulse.amplitude * np.cos(phase) + else: + sample = pulse.amplitude * np.sin(phase) + self.waveforms[serial] = {"type": "constant", "sample": sample} else: - waveform = getattr(pulse, f"envelope_waveform_{mode}")(SAMPLING_RATE) - serial = hash(waveform.tobytes()) + serial = f"{hash(pulse)}_{mode}" if serial not in self.waveforms: + samples_i = pulse.i(SAMPLING_RATE) + samples_q = pulse.q(SAMPLING_RATE) + if mode == "i": + samples = samples_i * np.cos(phase) - samples_q * np.sin(phase) + else: + samples = samples_i * np.sin(phase) + samples_q * np.cos(phase) self.waveforms[serial] = { "type": "arbitrary", - "samples": waveform.tolist(), + "samples": samples.tolist(), } return serial diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 04dd8cbb82..fe38ed8671 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -1,5 +1,6 @@ import shutil import tempfile +from collections import defaultdict from dataclasses import dataclass, field from pathlib import Path from typing import Optional @@ -12,15 +13,15 @@ from qibolab import AveragingMode from qibolab.instruments.abstract import Controller -from qibolab.pulses import PulseType +from qibolab.pulses import Delay, PulseType from qibolab.sweeper import Parameter from qibolab.unrolling import Bounds -from .acquisition import declare_acquisitions, fetch_results -from .config import SAMPLING_RATE, QMConfig +from .acquisition import create_acquisition, fetch_results +from .config import SAMPLING_RATE, QMConfig, element, operation from .devices import Octave, OPXplus from .ports import OPXIQ -from .sequence import BakedPulse, QMPulse, Sequence +from .program import Parameters from .sweepers import sweep OCTAVE_ADDRESS_OFFSET = 11000 @@ -150,11 +151,12 @@ class QMController(Controller): manager: Optional[QuantumMachinesManager] = None """Manager object used for controlling the Quantum Machines cluster.""" - config: QMConfig = field(default_factory=QMConfig) - """Configuration dictionary required for pulse execution on the OPXs.""" is_connected: bool = False """Boolean that shows whether we are connected to the QM manager.""" + config: QMConfig = field(default_factory=QMConfig) + """Configuration dictionary required for pulse execution on the OPXs.""" + simulation_duration: Optional[int] = None """Duration for the simulation in ns. @@ -302,29 +304,31 @@ def simulate_program(self, program): ) return self.manager.simulate(self.config.__dict__, program, simulation_config) - def create_sequence(self, qubits, sequence, sweepers): - """Translates a :class:`qibolab.pulses.PulseSequence` to a - :class:`qibolab.instruments.qm.sequence.Sequence`. + def register_pulses(self, qubits, sequence, options): + """Translates a :class:`qibolab.pulses.PulseSequence` to + :class:`qibolab.instruments.qm.instructions.Instructions`. Args: qubits (list): List of :class:`qibolab.platforms.abstract.Qubit` objects passed from the platform. sequence (:class:`qibolab.pulses.PulseSequence`). Pulse sequence to translate. sweepers (list): List of sweeper objects so that pulses that require baking are identified. + Returns: - (:class:`qibolab.instruments.qm.sequence.Sequence`) containing the pulses from given pulse sequence. + acquisitions (dict): Map from measurement instructions to acquisition objects. + parameters (dict): """ # Current driver cannot play overlapping pulses on drive and flux channels # If we want to play overlapping pulses we need to define different elements on the same ports # like we do for readout multiplex - pulses_to_bake = find_baking_pulses(sweepers) + acquisitions = {} + parameters = defaultdict(Parameters) + for pulse in sequence: + if isinstance(pulse, Delay): + continue - qmsequence = Sequence() - ro_pulses = [] - for pulse in sorted(sequence, key=lambda pulse: (pulse.start, pulse.duration)): qubit = qubits[pulse.qubit] - self.config.register_port(getattr(qubit, pulse.type.name.lower()).port) if pulse.type is PulseType.READOUT: self.config.register_port(qubit.feedback.port) @@ -346,8 +350,17 @@ def create_sequence(self, qubits, sequence, sweepers): self.config.register_pulse(qubit, qmpulse) qmsequence.add(qmpulse) - qmsequence.shift() - return qmsequence, ro_pulses + op = self.config.register_pulse(pulse, qubit) + if pulse.type is PulseType.READOUT: + if op not in acquisitions: + el = element(pulse) + acquisitions[op] = create_acquisition( + op, el, pulse.qubit, options, qubit.threshold, qubit.iq_angle + ) + parameters[op].acquisition = acquisitions[op] + acquisitions[op].keys.append(pulse.id) + + return acquisitions, parameters def play(self, qubits, couplers, sequence, options): return self.sweep(qubits, couplers, sequence, options) @@ -367,35 +380,41 @@ def sweep(self, qubits, couplers, sequence, options, *sweepers): self.config.register_port(qubit.flux.port) self.config.register_flux_element(qubit) - qmsequence, ro_pulses = self.create_sequence(qubits, sequence, sweepers) - # play pulses using QUA + acquisitions, parameters = self.register_pulses(qubits, sequence, options) with qua.program() as experiment: n = declare(int) - acquisitions = declare_acquisitions(ro_pulses, qubits, options) + # declare acquisition variables + for acquisition in acquisitions.values(): + acquisition.declare() + # execute pulses with for_(n, 0, n < options.nshots, n + 1): sweep( list(sweepers), qubits, - qmsequence, + sequence, + parameters, options.relaxation_time, - self.config, + # self.config, ) - + # download acquisitions with qua.stream_processing(): - for acquisition in acquisitions: + for acquisition in acquisitions.values(): acquisition.download(*buffer_dims) if self.script_file_name is not None: + script = generate_qua_script(experiment, self.config.__dict__) + for pulse in sequence: + script = script.replace(operation(pulse), str(pulse)) with open(self.script_file_name, "w") as file: - file.write(generate_qua_script(experiment, self.config.__dict__)) + file.write(script) if self.simulation_duration is not None: result = self.simulate_program(experiment) results = {} - for qmpulse in ro_pulses: - pulse = qmpulse.pulse - results[pulse.qubit] = results[pulse.id] = result + for pulse in sequence: + if pulse.type is PulseType.READOUT: + results[pulse.qubit] = results[pulse.id] = result return results - else: - result = self.execute_program(experiment) - return fetch_results(result, acquisitions) + + result = self.execute_program(experiment) + return fetch_results(result, acquisitions.values()) diff --git a/src/qibolab/instruments/qm/program.py b/src/qibolab/instruments/qm/program.py index bb46ad90a3..a95f9832e9 100644 --- a/src/qibolab/instruments/qm/program.py +++ b/src/qibolab/instruments/qm/program.py @@ -6,16 +6,7 @@ from qibolab.pulses import Delay, PulseType from .acquisition import Acquisition - - -def operation(pulse): - """Generate operation name in QM ``config`` for the given pulse.""" - return str(hash(pulse)) - - -def element(pulse): - """Generate element name in QM ``config`` for the given pulse.""" - return pulse.channel +from .config import element, operation @dataclass @@ -30,7 +21,7 @@ class Parameters: def _delay(pulse): # TODO: How to play delays on multiple elements? - qua.wait(pulse.duration, element(pulse)) + qua.wait(pulse.duration // 4 + 1, element(pulse)) def _play(pulse, parameters): @@ -51,7 +42,7 @@ def _play(pulse, parameters): qua.reset_frame(el) -def play(self, sequence, parameters, relaxation_time=0): +def play(sequence, parameters, relaxation_time=0): """Part of QUA program that plays an arbitrary pulse sequence. Should be used inside a ``program()`` context. diff --git a/src/qibolab/instruments/qm/sweepers.py b/src/qibolab/instruments/qm/sweepers.py index 8eb5ea1961..be9188b4b3 100644 --- a/src/qibolab/instruments/qm/sweepers.py +++ b/src/qibolab/instruments/qm/sweepers.py @@ -8,7 +8,9 @@ from qibolab.instruments.qm.sequence import BakedPulse from qibolab.pulses import PulseType -from qibolab.sweeper import Parameter + +from .config import element, operation +from .program import play def maximum_sweep_value(values, value0): @@ -54,31 +56,33 @@ def _update_baked_pulses(sweeper, qmsequence, config): qmpulse.bake(config, values) -def sweep(sweepers, qubits, qmsequence, relaxation_time, config): +def sweep(sweepers, qubits, sequence, parameters, relaxation_time): """Public sweep function that is called by the driver.""" - for sweeper in sweepers: - if sweeper.parameter is Parameter.duration: - _update_baked_pulses(sweeper, qmsequence, config) - _sweep_recursion(sweepers, qubits, qmsequence, relaxation_time) + # for sweeper in sweepers: + # if sweeper.parameter is Parameter.duration: + # _update_baked_pulses(sweeper, instructions, config) + _sweep_recursion(sweepers, qubits, sequence, parameters, relaxation_time) -def _sweep_recursion(sweepers, qubits, qmsequence, relaxation_time): +def _sweep_recursion(sweepers, qubits, sequence, parameters, relaxation_time): """Unrolls a list of qibolab sweepers to the corresponding QUA for loops using recursion.""" if len(sweepers) > 0: parameter = sweepers[0].parameter.name func_name = f"_sweep_{parameter}" if func_name in globals(): - globals()[func_name](sweepers, qubits, qmsequence, relaxation_time) + globals()[func_name]( + sweepers, qubits, sequence, parameters, relaxation_time + ) else: raise_error( NotImplementedError, f"Sweeper for {parameter} is not implemented." ) else: - qmsequence.play(relaxation_time) + play(sequence, parameters, relaxation_time) -def _sweep_frequency(sweepers, qubits, qmsequence, relaxation_time): +def _sweep_frequency(sweepers, qubits, sequence, parameters, relaxation_time): sweeper = sweepers[0] freqs0 = [] for pulse in sweeper.pulses: @@ -107,13 +111,12 @@ def _sweep_frequency(sweepers, qubits, qmsequence, relaxation_time): f = declare(int) with for_(*from_array(f, sweeper.values.astype(int))): for pulse, f0 in zip(sweeper.pulses, freqs0): - qmpulse = qmsequence.pulse_to_qmpulse[pulse.id] - qua.update_frequency(qmpulse.element, f + f0) + qua.update_frequency(element(pulse), f + f0) - _sweep_recursion(sweepers[1:], qubits, qmsequence, relaxation_time) + _sweep_recursion(sweepers[1:], qubits, sequence, parameters, relaxation_time) -def _sweep_amplitude(sweepers, qubits, qmsequence, relaxation_time): +def _sweep_amplitude(sweepers, qubits, sequence, parameters, relaxation_time): sweeper = sweepers[0] # TODO: Consider sweeping amplitude without multiplication if min(sweeper.values) < -2: @@ -126,27 +129,25 @@ def _sweep_amplitude(sweepers, qubits, qmsequence, relaxation_time): a = declare(fixed) with for_(*from_array(a, sweeper.values)): for pulse in sweeper.pulses: - qmpulse = qmsequence.pulse_to_qmpulse[pulse.id] - if isinstance(qmpulse, BakedPulse): - qmpulse.amplitude = a - else: - qmpulse.operation = qmpulse.operation * qua.amp(a) + # if isinstance(instruction, Bake): + # instructions.update_kwargs(instruction, amplitude=a) + # else: + parameters[operation(pulse)].amplitude = qua.amp(a) - _sweep_recursion(sweepers[1:], qubits, qmsequence, relaxation_time) + _sweep_recursion(sweepers[1:], qubits, sequence, parameters, relaxation_time) -def _sweep_relative_phase(sweepers, qubits, qmsequence, relaxation_time): +def _sweep_relative_phase(sweepers, qubits, sequence, parameters, relaxation_time): sweeper = sweepers[0] relphase = declare(fixed) with for_(*from_array(relphase, sweeper.values / (2 * np.pi))): for pulse in sweeper.pulses: - qmpulse = qmsequence.pulse_to_qmpulse[pulse.id] - qmpulse.relative_phase = relphase + parameters[operation(pulse)].phase = relphase - _sweep_recursion(sweepers[1:], qubits, qmsequence, relaxation_time) + _sweep_recursion(sweepers[1:], qubits, sequence, parameters, relaxation_time) -def _sweep_bias(sweepers, qubits, qmsequence, relaxation_time): +def _sweep_bias(sweepers, qubits, sequence, parameters, relaxation_time): sweeper = sweepers[0] offset0 = [] for qubit in sweeper.qubits: @@ -165,52 +166,53 @@ def _sweep_bias(sweepers, qubits, qmsequence, relaxation_time): with qua.else_(): qua.set_dc_offset(f"flux{qubit.name}", "single", (b + b0)) - _sweep_recursion(sweepers[1:], qubits, qmsequence, relaxation_time) - - -def _sweep_start(sweepers, qubits, qmsequence, relaxation_time): - sweeper = sweepers[0] - start = declare(int) - values = (np.array(sweeper.values) // 4).astype(int) - - if len(np.unique(values[1:] - values[:-1])) > 1: - loop = qua.for_each_(start, values) - else: - loop = for_(*from_array(start, values)) - - with loop: - for pulse in sweeper.pulses: - qmpulse = qmsequence.pulse_to_qmpulse[pulse.id] - # find all pulses that are connected to ``qmpulse`` and update their starts - to_process = {qmpulse} - while to_process: - next_qmpulse = to_process.pop() - to_process |= next_qmpulse.next_ - next_qmpulse.wait_time_variable = start - - _sweep_recursion(sweepers[1:], qubits, qmsequence, relaxation_time) - - -def _sweep_duration(sweepers, qubits, qmsequence, relaxation_time): - sweeper = sweepers[0] - qmpulse = qmsequence.pulse_to_qmpulse[sweeper.pulses[0].id] - if isinstance(qmpulse, BakedPulse): - values = np.array(sweeper.values).astype(int) - else: - values = np.array(sweeper.values).astype(int) // 4 - - dur = declare(int) - with for_(*from_array(dur, values)): - for pulse in sweeper.pulses: - qmpulse = qmsequence.pulse_to_qmpulse[pulse.id] - qmpulse.swept_duration = dur - # find all pulses that are connected to ``qmpulse`` and align them - if not isinstance(qmpulse, BakedPulse): - to_process = set(qmpulse.next_) - while to_process: - next_qmpulse = to_process.pop() - to_process |= next_qmpulse.next_ - qmpulse.elements_to_align.add(next_qmpulse.element) - next_qmpulse.wait_time -= qmpulse.wait_time + qmpulse.duration // 4 - - _sweep_recursion(sweepers[1:], qubits, qmsequence, relaxation_time) + _sweep_recursion(sweepers[1:], qubits, sequence, parameters, relaxation_time) + + +# def _sweep_start(sweepers, qubits, qmsequence, relaxation_time): +# sweeper = sweepers[0] +# start = declare(int) +# values = (np.array(sweeper.values) // 4).astype(int) +# +# if len(np.unique(values[1:] - values[:-1])) > 1: +# loop = qua.for_each_(start, values) +# else: +# loop = for_(*from_array(start, values)) +# +# with loop: +# for pulse in sweeper.pulses: +# qmpulse = qmsequence.pulse_to_qmpulse[pulse.serial] +# # find all pulses that are connected to ``qmpulse`` and update their starts +# to_process = {qmpulse} +# while to_process: +# next_qmpulse = to_process.pop() +# to_process |= next_qmpulse.next_ +# next_qmpulse.wait_time_variable = start +# +# _sweep_recursion(sweepers[1:], qubits, qmsequence, relaxation_time) + + +# def _sweep_duration(sweepers, qubits, qmsequence, relaxation_time): +# sweeper = sweepers[0] +# qmpulse = qmsequence.pulse_to_qmpulse[sweeper.pulses[0].serial] +# if isinstance(qmpulse, BakedPulse): +# values = np.array(sweeper.values).astype(int) +# else: +# values = np.array(sweeper.values).astype(int) // 4 +# +# dur = declare(int) +# with for_(*from_array(dur, values)): +# for pulse in sweeper.pulses: +# qmpulse = qmsequence.pulse_to_qmpulse[pulse.serial] +# qmpulse.swept_duration = dur +# # find all pulses that are connected to ``qmpulse`` and align them +# if not isinstance(qmpulse, BakedPulse): +# to_process = set(qmpulse.next_) +# while to_process: +# next_qmpulse = to_process.pop() +# to_process |= next_qmpulse.next_ +# qmpulse.elements_to_align.add(next_qmpulse.element) +# next_qmpulse.wait_time -= qmpulse.wait_time + qmpulse.duration // 4 +# +# _sweep_recursion(sweepers[1:], qubits, qmsequence, relaxation_time) +# diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index ba8e9d594c..1b78146644 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -1,6 +1,5 @@ """Pulse class.""" -from dataclasses import fields from enum import Enum from typing import Union @@ -103,25 +102,25 @@ def modulated_waveforms(self, sampling_rate): # -> tuple[Waveform, Waveform]: def __hash__(self): """Hash the content. - .. warning:: - - unhashable attributes are not taken into account, so there will be more - clashes than those usually expected with a regular hash - - .. todo:: - - This method should be eventually dropped, and be provided automatically by - freezing the dataclass (i.e. setting ``frozen=true`` in the decorator). - However, at the moment is not possible nor desired, because it contains - unhashable attributes and because some instances are mutated inside Qibolab. - """ - return hash( - tuple( - getattr(self, f.name) - for f in fields(self) - if f.name not in ("type", "shape") - ) - ) + # .. warning:: + + # unhashable attributes are not taken into account, so there will be more + # clashes than those usually expected with a regular hash + + # .. todo:: + + # This method should be eventually dropped, and be provided automatically by + # freezing the dataclass (i.e. setting ``frozen=true`` in the decorator). + # However, at the moment is not possible nor desired, because it contains + # unhashable attributes and because some instances are mutated inside Qibolab. + # """ + # return hash(self) + # # tuple( + # # getattr(self, f.name) + # # for f in fields(self) + # # if f.name not in ("type", "shape") + # # ) + # #) def __add__(self, other): if isinstance(other, Pulse): From 28cfd6277c08981f87425137c7089d3a5b35ddb6 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Sun, 21 Apr 2024 00:36:39 +0400 Subject: [PATCH 0426/1006] refactor: drop old serialization and hash --- src/qibolab/instruments/qm/config.py | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/qibolab/instruments/qm/config.py b/src/qibolab/instruments/qm/config.py index 1bb60a86f7..40a1341e2e 100644 --- a/src/qibolab/instruments/qm/config.py +++ b/src/qibolab/instruments/qm/config.py @@ -29,11 +29,6 @@ def element(pulse): return pulse.channel -def float_serial(x): - """Convert float to string to use in config keys.""" - return format(x, ".6f").rstrip("0").rstrip(".") - - @dataclass class QMConfig: """Configuration for communicating with the ``QuantumMachinesManager``.""" @@ -358,10 +353,8 @@ def register_waveform(self, pulse, mode="i"): return serial phase = (pulse.relative_phase % (2 * np.pi)) / (2 * np.pi) - amplitude = float_serial(pulse.amplitude) - phase_str = float_serial(phase) + serial = f"{hash(pulse)}_{mode}" if isinstance(pulse.envelope, Rectangular): - serial = f"constant_wf({amplitude}, {phase_str})" if serial not in self.waveforms: if mode == "i": sample = pulse.amplitude * np.cos(phase) @@ -369,7 +362,6 @@ def register_waveform(self, pulse, mode="i"): sample = pulse.amplitude * np.sin(phase) self.waveforms[serial] = {"type": "constant", "sample": sample} else: - serial = f"{hash(pulse)}_{mode}" if serial not in self.waveforms: samples_i = pulse.i(SAMPLING_RATE) samples_q = pulse.q(SAMPLING_RATE) From 17e523d4d0e061e2e1aa2098f2362c390ef1d04d Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Mon, 22 Apr 2024 18:09:12 +0400 Subject: [PATCH 0427/1006] fix: duration sweeper --- src/qibolab/instruments/qm/program.py | 13 +++++-- src/qibolab/instruments/qm/sweepers.py | 53 +++++--------------------- 2 files changed, 18 insertions(+), 48 deletions(-) diff --git a/src/qibolab/instruments/qm/program.py b/src/qibolab/instruments/qm/program.py index a95f9832e9..c3e89a2639 100644 --- a/src/qibolab/instruments/qm/program.py +++ b/src/qibolab/instruments/qm/program.py @@ -19,9 +19,13 @@ class Parameters: phase: Optional[float] = None -def _delay(pulse): +def _delay(pulse, parameters): # TODO: How to play delays on multiple elements? - qua.wait(pulse.duration // 4 + 1, element(pulse)) + if parameters.duration is None: + duration = pulse.duration // 4 + 1 + else: + duration = parameters.duration + qua.wait(duration, element(pulse)) def _play(pulse, parameters): @@ -49,10 +53,11 @@ def play(sequence, parameters, relaxation_time=0): """ qua.align() for pulse in sequence: + params = parameters[operation(pulse)] if isinstance(pulse, Delay): - _delay(pulse) + _delay(pulse, params) else: - _play(pulse, parameters[operation(pulse)]) + _play(pulse, params) if relaxation_time > 0: qua.wait(relaxation_time // 4) diff --git a/src/qibolab/instruments/qm/sweepers.py b/src/qibolab/instruments/qm/sweepers.py index be9188b4b3..c192dcde35 100644 --- a/src/qibolab/instruments/qm/sweepers.py +++ b/src/qibolab/instruments/qm/sweepers.py @@ -169,50 +169,15 @@ def _sweep_bias(sweepers, qubits, sequence, parameters, relaxation_time): _sweep_recursion(sweepers[1:], qubits, sequence, parameters, relaxation_time) -# def _sweep_start(sweepers, qubits, qmsequence, relaxation_time): -# sweeper = sweepers[0] -# start = declare(int) -# values = (np.array(sweeper.values) // 4).astype(int) -# -# if len(np.unique(values[1:] - values[:-1])) > 1: -# loop = qua.for_each_(start, values) -# else: -# loop = for_(*from_array(start, values)) -# -# with loop: -# for pulse in sweeper.pulses: -# qmpulse = qmsequence.pulse_to_qmpulse[pulse.serial] -# # find all pulses that are connected to ``qmpulse`` and update their starts -# to_process = {qmpulse} -# while to_process: -# next_qmpulse = to_process.pop() -# to_process |= next_qmpulse.next_ -# next_qmpulse.wait_time_variable = start -# -# _sweep_recursion(sweepers[1:], qubits, qmsequence, relaxation_time) +def _sweep_duration(sweepers, qubits, sequence, parameters, relaxation_time): + # TODO: Handle baked pulses + sweeper = sweepers[0] + dur = declare(int) + with for_(*from_array(dur, (sweeper.values // 4).astype(int))): + for pulse in sweeper.pulses: + parameters[operation(pulse)].duration = dur + + _sweep_recursion(sweepers[1:], qubits, sequence, parameters, relaxation_time) -# def _sweep_duration(sweepers, qubits, qmsequence, relaxation_time): -# sweeper = sweepers[0] -# qmpulse = qmsequence.pulse_to_qmpulse[sweeper.pulses[0].serial] -# if isinstance(qmpulse, BakedPulse): -# values = np.array(sweeper.values).astype(int) -# else: -# values = np.array(sweeper.values).astype(int) // 4 -# -# dur = declare(int) -# with for_(*from_array(dur, values)): -# for pulse in sweeper.pulses: -# qmpulse = qmsequence.pulse_to_qmpulse[pulse.serial] -# qmpulse.swept_duration = dur -# # find all pulses that are connected to ``qmpulse`` and align them -# if not isinstance(qmpulse, BakedPulse): -# to_process = set(qmpulse.next_) -# while to_process: -# next_qmpulse = to_process.pop() -# to_process |= next_qmpulse.next_ -# qmpulse.elements_to_align.add(next_qmpulse.element) -# next_qmpulse.wait_time -= qmpulse.wait_time + qmpulse.duration // 4 -# -# _sweep_recursion(sweepers[1:], qubits, qmsequence, relaxation_time) # From 089ec3ce3a8f0b9cca8cf13d09a744ad6eecadef Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 23 Apr 2024 17:26:47 +0400 Subject: [PATCH 0428/1006] fix: unrolling tested with single shot routine --- src/qibolab/instruments/qm/sweepers.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/qibolab/instruments/qm/sweepers.py b/src/qibolab/instruments/qm/sweepers.py index c192dcde35..20e95a1233 100644 --- a/src/qibolab/instruments/qm/sweepers.py +++ b/src/qibolab/instruments/qm/sweepers.py @@ -178,6 +178,3 @@ def _sweep_duration(sweepers, qubits, sequence, parameters, relaxation_time): parameters[operation(pulse)].duration = dur _sweep_recursion(sweepers[1:], qubits, sequence, parameters, relaxation_time) - - -# From 8622ffb35da67b80c81b6ba83bec04aff0e238c8 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 4 Jul 2024 12:06:59 +0000 Subject: [PATCH 0429/1006] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/qibolab/pulses/pulse.py | 38 +++++++++++++++++----------------- src/qibolab/pulses/waveform.py | 1 + 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index 1b78146644..8df3cd0ca4 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -4,7 +4,6 @@ from typing import Union import numpy as np -from pydantic import BaseModel from qibolab.serialize_ import Model @@ -27,13 +26,7 @@ class PulseType(Enum): VIRTUALZ = "vz" -class _PulseLike(Model): - @property - def id(self) -> int: - return id(self) - - -class Pulse(_PulseLike): +class Pulse(Model): """A pulse to be sent to the QPU.""" duration: float @@ -67,6 +60,10 @@ def flux(cls, **kwargs): kwargs["type"] = PulseType.FLUX return cls(**kwargs) + @property + def id(self) -> int: + return id(self) + def i(self, sampling_rate: float) -> Waveform: """The envelope waveform of the i component of the pulse.""" samples = int(self.duration * sampling_rate) @@ -102,18 +99,20 @@ def modulated_waveforms(self, sampling_rate): # -> tuple[Waveform, Waveform]: def __hash__(self): """Hash the content. - # .. warning:: + # .. warning:: - # unhashable attributes are not taken into account, so there will be more - # clashes than those usually expected with a regular hash + # unhashable attributes are not taken into account, so there will be more + # clashes than those usually expected with a regular hash - # .. todo:: + # .. todo:: + + # This method should be eventually dropped, and be provided automatically by + # freezing the dataclass (i.e. setting ``frozen=true`` in the decorator). + # However, at the moment is not possible nor desired, because it contains + # unhashable attributes and because some instances are mutated inside Qibolab. + # + """ - # This method should be eventually dropped, and be provided automatically by - # freezing the dataclass (i.e. setting ``frozen=true`` in the decorator). - # However, at the moment is not possible nor desired, because it contains - # unhashable attributes and because some instances are mutated inside Qibolab. - # """ # return hash(self) # # tuple( # # getattr(self, f.name) @@ -129,7 +128,8 @@ def __add__(self, other): return PulseSequence(self, *other) raise TypeError(f"Expected Pulse or PulseSequence; got {type(other).__name__}") -class Delay(_PulseLike): + +class Delay(Model): """A wait instruction during which we are not sending any pulses to the QPU.""" @@ -139,7 +139,7 @@ class Delay(_PulseLike): """Type fixed to ``DELAY`` to comply with ``Pulse`` interface.""" -class VirtualZ(_PulseLike): +class VirtualZ(Model): """Implementation of Z-rotations using virtual phase.""" phase: float diff --git a/src/qibolab/pulses/waveform.py b/src/qibolab/pulses/waveform.py index 7c530bf362..2e59a1a2d1 100644 --- a/src/qibolab/pulses/waveform.py +++ b/src/qibolab/pulses/waveform.py @@ -1,4 +1,5 @@ """Waveform class.""" + import numpy as np From c1fce48dfc9dfc7a217af24bb7f53549ebb1a98d Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 4 Jul 2024 16:12:17 +0400 Subject: [PATCH 0430/1006] fix: rebasing gone wrong --- src/qibolab/pulses/plot.py | 12 +++---- src/qibolab/pulses/pulse.py | 58 ++++++++++------------------------ src/qibolab/pulses/waveform.py | 43 ------------------------- 3 files changed, 21 insertions(+), 92 deletions(-) delete mode 100644 src/qibolab/pulses/waveform.py diff --git a/src/qibolab/pulses/plot.py b/src/qibolab/pulses/plot.py index 052486b5c7..16e7189c85 100644 --- a/src/qibolab/pulses/plot.py +++ b/src/qibolab/pulses/plot.py @@ -26,7 +26,7 @@ def waveform(wf: Waveform, filename=None): filename (str): a file path. If provided the plot is save to a file. """ plt.figure(figsize=(14, 5), dpi=200) - plt.plot(wf.data, c="C0", linestyle="dashed") + plt.plot(wf, c="C0", linestyle="dashed") plt.xlabel("Sample Number") plt.ylabel("Amplitude") plt.grid(visible=True, which="both", axis="both", color="#888888", linestyle="-") @@ -57,14 +57,14 @@ def pulse(pulse_: Pulse, freq: Optional[float] = None, filename: Optional[str] = ax1 = plt.subplot(gs[0]) ax1.plot( time, - waveform_i.data, + waveform_i, label="envelope i", c="C0", linestyle="dashed", ) ax1.plot( time, - waveform_q.data, + waveform_q, label="envelope q", c="C1", linestyle="dashed", @@ -86,13 +86,11 @@ def pulse(pulse_: Pulse, freq: Optional[float] = None, filename: Optional[str] = ax1.set_ylabel("Amplitude") ax1.grid(visible=True, which="both", axis="both", color="#888888", linestyle="-") - start = float(pulse_.start) - finish = float(pulse._finish) if pulse._finish is not None else 0.0 + start = 0 + finish = float(pulse_.duration) ax1.axis((start, finish, -1.0, 1.0)) ax1.legend() - modulated_i = pulse_.shape.modulated_waveform_i(sampling_rate).data - modulated_q = pulse_.shape.modulated_waveform_q(sampling_rate).data ax2 = plt.subplot(gs[1]) ax2.plot(waveform_i, waveform_q, label="envelope", c="C2") if modulated is not None: diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index 8df3cd0ca4..c2b8259e95 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -1,5 +1,6 @@ """Pulse class.""" +from dataclasses import fields from enum import Enum from typing import Union @@ -78,55 +79,28 @@ def envelopes(self, sampling_rate: float) -> IqWaveform: """A tuple with the i and q envelope waveforms of the pulse.""" return np.array([self.i(sampling_rate), self.q(sampling_rate)]) - def modulated_waveform_i(self, sampling_rate=SAMPLING_RATE) -> Waveform: - """The waveform of the i component of the pulse, modulated with its - frequency.""" - - return self.shape.modulated_waveform_i(sampling_rate) - - def modulated_waveform_q(self, sampling_rate=SAMPLING_RATE) -> Waveform: - """The waveform of the q component of the pulse, modulated with its - frequency.""" - - return self.shape.modulated_waveform_q(sampling_rate) - - def modulated_waveforms(self, sampling_rate): # -> tuple[Waveform, Waveform]: - """A tuple with the i and q waveforms of the pulse, modulated with its - frequency.""" - - return self.shape.modulated_waveforms(sampling_rate) - def __hash__(self): """Hash the content. - # .. warning:: + .. warning:: - # unhashable attributes are not taken into account, so there will be more - # clashes than those usually expected with a regular hash + unhashable attributes are not taken into account, so there will be more + clashes than those usually expected with a regular hash - # .. todo:: + .. todo:: - # This method should be eventually dropped, and be provided automatically by - # freezing the dataclass (i.e. setting ``frozen=true`` in the decorator). - # However, at the moment is not possible nor desired, because it contains - # unhashable attributes and because some instances are mutated inside Qibolab. - # + This method should be eventually dropped, and be provided automatically by + freezing the dataclass (i.e. setting ``frozen=true`` in the decorator). + However, at the moment is not possible nor desired, because it contains + unhashable attributes and because some instances are mutated inside Qibolab. """ - - # return hash(self) - # # tuple( - # # getattr(self, f.name) - # # for f in fields(self) - # # if f.name not in ("type", "shape") - # # ) - # #) - - def __add__(self, other): - if isinstance(other, Pulse): - return PulseSequence(self, other) - if isinstance(other, PulseSequence): - return PulseSequence(self, *other) - raise TypeError(f"Expected Pulse or PulseSequence; got {type(other).__name__}") + return hash( + tuple( + getattr(self, f.name) + for f in fields(self) + if f.name not in ("type", "shape") + ) + ) class Delay(Model): diff --git a/src/qibolab/pulses/waveform.py b/src/qibolab/pulses/waveform.py deleted file mode 100644 index 2e59a1a2d1..0000000000 --- a/src/qibolab/pulses/waveform.py +++ /dev/null @@ -1,43 +0,0 @@ -"""Waveform class.""" - -import numpy as np - - -class Waveform: - """A class to save pulse waveforms. - - A waveform is a list of samples, or discrete data points, used by the digital to analogue converters (DACs) - to synthesise pulses. - - Attributes: - data (np.ndarray): a numpy array containing the samples. - """ - - DECIMALS = 5 - - def __init__(self, data): - """Initialise the waveform with a of samples.""" - self.data: np.ndarray = np.array(data) - - def __len__(self): - """Return the length of the waveform, the number of samples.""" - return len(self.data) - - def __hash__(self): - """Hash the underlying data. - - .. todo:: - - In order to make this reliable, we should set the data as immutable. This we - could by making both the class frozen and the contained array readonly - https://numpy.org/doc/stable/reference/generated/numpy.ndarray.flags.html#numpy.ndarray.flags - """ - return hash(self.data.tobytes()) - - def __eq__(self, other): - """Compare two waveforms. - - Two waveforms are considered equal if their samples, rounded to - `Waveform.DECIMALS` decimal places, are all equal. - """ - return np.allclose(self.data, other.data) From b03a9fe171858bde3a1c1b71263245d0e1218c68 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 11 Jul 2024 20:14:51 +0400 Subject: [PATCH 0431/1006] refactor: elimate qubit references from QM driver --- .../instruments/qm/components/__init__.py | 2 + .../instruments/qm/components/channel.py | 21 + .../instruments/qm/components/configs.py | 54 +++ src/qibolab/instruments/qm/config.py | 459 +++++++++--------- src/qibolab/instruments/qm/controller.py | 224 +++++---- src/qibolab/instruments/qm/program.py | 28 +- src/qibolab/instruments/qm/sweepers.py | 44 +- src/qibolab/platform/platform.py | 6 +- 8 files changed, 469 insertions(+), 369 deletions(-) create mode 100644 src/qibolab/instruments/qm/components/__init__.py create mode 100644 src/qibolab/instruments/qm/components/channel.py create mode 100644 src/qibolab/instruments/qm/components/configs.py diff --git a/src/qibolab/instruments/qm/components/__init__.py b/src/qibolab/instruments/qm/components/__init__.py new file mode 100644 index 0000000000..f1fd439eb3 --- /dev/null +++ b/src/qibolab/instruments/qm/components/__init__.py @@ -0,0 +1,2 @@ +from .channel import * +from .configs import * diff --git a/src/qibolab/instruments/qm/components/channel.py b/src/qibolab/instruments/qm/components/channel.py new file mode 100644 index 0000000000..4775e663c9 --- /dev/null +++ b/src/qibolab/instruments/qm/components/channel.py @@ -0,0 +1,21 @@ +from dataclasses import dataclass + +from qibolab.components import Channel + +__all__ = [ + "QmChannel", +] + + +@dataclass(frozen=True) +class QmChannel: + """Channel for Zurich Instruments (ZI) devices.""" + + logical_channel: Channel + """Corresponding logical channel.""" + device: str + """Name of the device.""" + port: int + """Number of port.""" + output: bool = True # FIXME: Probably not needed + """Distinguish output from input ports when they have the same numbers.""" diff --git a/src/qibolab/instruments/qm/components/configs.py b/src/qibolab/instruments/qm/components/configs.py new file mode 100644 index 0000000000..d580df1358 --- /dev/null +++ b/src/qibolab/instruments/qm/components/configs.py @@ -0,0 +1,54 @@ +from dataclasses import dataclass + +from qibolab.components import AcquisitionConfig, DcConfig + +__all__ = [ + "OpxDcConfig", + "QmAcquisitionConfig", + "OctaveOscillatorConfig", +] + + +@dataclass(frozen=True) +class OpxDcConfig(DcConfig): + """DC channel config using QM OPX+.""" + + offset: float + """DC offset to be applied in V. + + Possible values are -0.5V to 0.5V. + """ + filter: dict[str, float] + """FIR and IIR filters to be applied for correcting signal distortions. + + See + https://docs.quantum-machines.co/1.1.7/qm-qua-sdk/docs/Guides/output_filter/?h=filter#output-filter + for more details. + Changing the filters affects the calibration of single shot discrimination (threshold and angle). + """ + + +@dataclass(frozen=True) +class QmAcquisitionConfig(AcquisitionConfig): + """Acquisition config for QM OPX+.""" + + gain: int + """Input gain in dB. + + Possible values are -12dB to 20dB in steps of 1dB. + """ + # offset: float = 0.0 + # """Constant voltage to be applied on the input.""" + + +@dataclass(frozen=True) +class OctaveOscillatorConfig(OscillatorConfig): + """Octave internal local oscillator config.""" + + frequency: float + """Octave local oscillator frequency in Hz.""" + power: float + """Octave local oscillator gain in dB. + + Possible values are -20dB to 20dB in steps of 0.5dB. + """ diff --git a/src/qibolab/instruments/qm/config.py b/src/qibolab/instruments/qm/config.py index 40a1341e2e..cea2da8cea 100644 --- a/src/qibolab/instruments/qm/config.py +++ b/src/qibolab/instruments/qm/config.py @@ -1,12 +1,10 @@ -import math from dataclasses import dataclass, field import numpy as np -from qibo.config import raise_error from qibolab.pulses import PulseType, Rectangular -from .ports import OPXIQ, OctaveInput, OctaveOutput, OPXOutput +from .ports import OPXIQ SAMPLING_RATE = 1 """Sampling rate of Quantum Machines OPX in GSps.""" @@ -17,6 +15,33 @@ Inputs are always registered to avoid issues with automatic mixer calibration when using Octaves. """ +DIGITAL_DELAY = 57 +DIGITAL_BUFFER = 18 +"""Default calibration parameters for digital pulses. + +https://docs.quantum-machines.co/1.1.7/qm-qua-sdk/docs/Guides/octave/#calibrating-the-digital-pulse + +Digital markers are used for LO triggering. +""" + + +def iq_imbalance(g, phi): + """Creates the correction matrix for the mixer imbalance caused by the gain + and phase imbalances. + + More information here: + https://docs.qualang.io/libs/examples/mixer-calibration/#non-ideal-mixer + + Args: + g (float): relative gain imbalance between the I & Q ports (unit-less). + Set to 0 for no gain imbalance. + phi (float): relative phase imbalance between the I & Q ports (radians). + Set to 0 for no phase imbalance. + """ + c = np.cos(phi) + s = np.sin(phi) + N = 1 / ((1 - g**2) * (2 * c**2 - 1)) + return [float(N * x) for x in [(1 - g) * c, (1 + g) * s, (1 - g) * s, (1 + g) * c]] def operation(pulse): @@ -24,11 +49,6 @@ def operation(pulse): return str(hash(pulse)) -def element(pulse): - """Generate element name in QM ``config`` for the given pulse.""" - return pulse.channel - - @dataclass class QMConfig: """Configuration for communicating with the ``QuantumMachinesManager``.""" @@ -45,80 +65,89 @@ class QMConfig: integration_weights: dict = field(default_factory=dict) mixers: dict = field(default_factory=dict) - def register_port(self, port): - """Register controllers and octaves sections in the ``config``. + def register_opx_output( + self, + device: str, + port: int, + digital_port: int = None, + offset: float = 0.0, + filter: dict[str, float] = None, + ): + if device not in self.controllers: + self.controllers[device] = { + "analog_inputs": DEFAULT_INPUTS, + "digital_outputs": {}, + "analog_outputs": {}, + } + + if digital_port is not None: + self.controllers[device]["digital_outputs"][str(digital_port)] = {} - Args: - ports (QMPort): Port we are registering. - Contains information about the controller and port number and - some parameters, such as offset, gain, filter, etc.). - """ - if isinstance(port, OPXIQ): - self.register_port(port.i) - self.register_port(port.q) - else: - is_octave = isinstance(port, (OctaveOutput, OctaveInput)) - controllers = self.octaves if is_octave else self.controllers - if port.device not in controllers: - if is_octave: - controllers[port.device] = {} - else: - controllers[port.device] = { - "analog_inputs": DEFAULT_INPUTS, - "digital_outputs": {}, - } - - device = controllers[port.device] - if port.key in device: - device[port.key].update(port.config) - else: - device[port.key] = port.config - - if is_octave: - con = port.opx_port.i.device - number = port.opx_port.i.number - device["connectivity"] = con - self.register_port(port.opx_port) - self.controllers[con]["digital_outputs"][number] = {} - - @staticmethod - def iq_imbalance(g, phi): - """Creates the correction matrix for the mixer imbalance caused by the - gain and phase imbalances. - - More information here: - https://docs.qualang.io/libs/examples/mixer-calibration/#non-ideal-mixer + self.controllers[device]["analog_outputs"][str(port)] = { + "offset": offset, + "filter": filter if filter is not None else {}, + } + + def register_opx_input( + self, device: str, port: int, offset: float = 0.0, gain: int = 0 + ): + # assumes output is already registered + self.controllers[device]["analog_inputs"][str(port)] = { + "offset": offset, + "gain_db": gain, + } + + def register_octave_output( + self, + device: str, + port: int, + connectivity: str, + frequency: int = None, + power: int = None, + ): + if device not in self.controllers: + self.octaves[device] = { + "RF_outputs": {}, + "connectivity": connectivity, + "RF_inputs": {}, + } + self.octaves[device]["RF_outputs"][str(port)] = { + "LO_frequency": frequency, + "gain": power, + "LO_source": "internal", + "output_mode": "triggered", + } + + def register_octave_input(self, device: str, port: int, frequency: int = None): + # assumes output is already registered + self.octaves[device]["RF_inputs"][str(port)] = { + "LO_frequency": frequency, + "LO_source": "internal", + "IF_mode_I": "direct", + "IF_mode_Q": "direct", + } + + def register_dc_element(self, channel: QmChannel): + """Register qubit flux elements and controllers in the QM config. Args: - g (float): relative gain imbalance between the I & Q ports (unit-less). - Set to 0 for no gain imbalance. - phi (float): relative phase imbalance between the I & Q ports (radians). - Set to 0 for no phase imbalance. + qubit (:class:`qibolab.platforms.utils.Qubit`): Qubit to add elements for. + intermediate_frequency (int): Intermediate frequency that the OPX + will send to this qubit. This frequency will be mixed with the + LO connected to the same channel. """ - c = np.cos(phi) - s = np.sin(phi) - N = 1 / ((1 - g**2) * (2 * c**2 - 1)) - return [ - float(N * x) for x in [(1 - g) * c, (1 + g) * s, (1 - g) * s, (1 + g) * c] - ] - - def _new_frequency_element(self, qubit, intermediate_frequency, mode="drive"): - """Register element on existing port but with different frequency.""" - element = f"{mode}{qubit.name}" - current_if = self.elements[element]["intermediate_frequency"] - if intermediate_frequency == current_if: - return element - - if isinstance(getattr(qubit, mode).port, (OPXIQ, OPXOutput)): - raise NotImplementedError( - f"Cannot play two different frequencies on the same {mode} line." - ) - new_element = f"{element}_{intermediate_frequency}" - self.elements[new_element] = dict(self.elements[element]) - self.elements[new_element]["intermediate_frequency"] = intermediate_frequency - return new_element - - def register_drive_element(self, qubit, intermediate_frequency=0): + element = channel.logical_channel.name + self.elements[element] = { + "singleInput": { + "port": (channel.device, channel.port), + }, + "intermediate_frequency": 0, + "operations": {}, + } + + def register_iq_element( + self, channel: QmChannel, intermediate_frequency=0, opx=None + ): """Register qubit drive elements and controllers in the QM config. Args: @@ -127,33 +156,37 @@ def register_drive_element(self, qubit, intermediate_frequency=0): will send to this qubit. This frequency will be mixed with the LO connected to the same channel. """ - element = f"drive{qubit.name}" - if element in self.elements: - return self._new_frequency_element(qubit, intermediate_frequency, "drive") - + element = channel.logical_channel.name if isinstance(qubit.drive.port, OPXIQ): - lo_frequency = math.floor(qubit.drive.lo_frequency) - self.elements[element] = { - "mixInputs": { - "I": qubit.drive.port.i.pair, - "Q": qubit.drive.port.q.pair, - "lo_frequency": lo_frequency, - "mixer": f"mixer_drive{qubit.name}", - }, - } - drive_g = qubit.mixer_drive_g - drive_phi = qubit.mixer_drive_phi - self.mixers[f"mixer_drive{qubit.name}"] = [ - { - "intermediate_frequency": intermediate_frequency, - "lo_frequency": lo_frequency, - "correction": self.iq_imbalance(drive_g, drive_phi), - } - ] + raise NotImplementedError + # lo_frequency = math.floor(qubit.drive.lo_frequency) + # self.elements[element] = { + # "mixInputs": { + # "I": qubit.drive.port.i.pair, + # "Q": qubit.drive.port.q.pair, + # "lo_frequency": lo_frequency, + # "mixer": f"mixer_drive{qubit.name}", + # }, + # } + # drive_g = qubit.mixer_drive_g + # drive_phi = qubit.mixer_drive_phi + # self.mixers[f"mixer_drive{qubit.name}"] = [ + # { + # "intermediate_frequency": intermediate_frequency, + # "lo_frequency": lo_frequency, + # "correction": iq_imbalance(drive_g, drive_phi), + # } + # ] else: self.elements[element] = { - "RF_inputs": {"port": qubit.drive.port.pair}, - "digitalInputs": qubit.drive.port.digital_inputs, + "RF_inputs": {"port": (channel.device, channel.port)}, + "digitalInputs": { + "output_switch": { + "port": (opx, 2 * channel.device - 1), + "delay": DIGITAL_DELAY, + "buffer": DIGITAL_BUFFER, + }, + }, } self.elements[element].update( { @@ -161,10 +194,9 @@ def register_drive_element(self, qubit, intermediate_frequency=0): "operations": {}, } ) - return element - def register_readout_element( - self, qubit, intermediate_frequency=0, time_of_flight=0, smearing=0 + def register_acquire_element( + self, channel: QmChannel, time_of_flight=0, smearing=0 ): """Register resonator elements and controllers in the QM config. @@ -174,94 +206,70 @@ def register_readout_element( will send to this qubit. This frequency will be mixed with the LO connected to the same channel. """ - element = f"readout{qubit.name}" - if element in self.elements: - return self._new_frequency_element(qubit, intermediate_frequency, "readout") - + element = measure_channel.logical_channel.name if isinstance(qubit.readout.port, OPXIQ): - lo_frequency = math.floor(qubit.readout.lo_frequency) - self.elements[element] = { - "mixInputs": { - "I": qubit.readout.port.i.pair, - "Q": qubit.readout.port.q.pair, - "lo_frequency": lo_frequency, - "mixer": f"mixer_readout{qubit.name}", - }, - "outputs": { - "out1": qubit.feedback.port.i.pair, - "out2": qubit.feedback.port.q.pair, - }, - } - readout_g = qubit.mixer_readout_g - readout_phi = qubit.mixer_readout_phi - self.mixers[f"mixer_readout{qubit.name}"] = [ - { - "intermediate_frequency": intermediate_frequency, - "lo_frequency": lo_frequency, - "correction": self.iq_imbalance(readout_g, readout_phi), - } - ] + raise NotImplementedError + # lo_frequency = math.floor(qubit.readout.lo_frequency) + # self.elements[element] = { + # "mixInputs": { + # "I": qubit.readout.port.i.pair, + # "Q": qubit.readout.port.q.pair, + # "lo_frequency": lo_frequency, + # "mixer": f"mixer_readout{qubit.name}", + # }, + # "outputs": { + # "out1": qubit.feedback.port.i.pair, + # "out2": qubit.feedback.port.q.pair, + # }, + # } + # readout_g = qubit.mixer_readout_g + # readout_phi = qubit.mixer_readout_phi + # self.mixers[f"mixer_readout{qubit.name}"] = [ + # { + # "intermediate_frequency": intermediate_frequency, + # "lo_frequency": lo_frequency, + # "correction": iq_imbalance(readout_g, readout_phi), + # } + # ] else: - self.elements[element] = { - "RF_inputs": {"port": qubit.readout.port.pair}, - "RF_outputs": {"port": qubit.feedback.port.pair}, - "digitalInputs": qubit.readout.port.digital_inputs, + self.elements[element]["RF_outputs"] = { + "port": (channel.device, channel.port) } + self.elements[element].update( { - "intermediate_frequency": intermediate_frequency, - "operations": {}, "time_of_flight": time_of_flight, "smearing": smearing, } ) - return element - - def register_flux_element(self, qubit, intermediate_frequency=0): - """Register qubit flux elements and controllers in the QM config. - - Args: - qubit (:class:`qibolab.platforms.utils.Qubit`): Qubit to add elements for. - intermediate_frequency (int): Intermediate frequency that the OPX - will send to this qubit. This frequency will be mixed with the - LO connected to the same channel. - """ - element = f"flux{qubit.name}" - if element in self.elements: - return self._new_frequency_element(qubit, intermediate_frequency, "flux") - self.elements[element] = { - "singleInput": { - "port": qubit.flux.port.pair, + def register_iq_pulse(self, element, pulse): + op = operation(pulse) + serial_i = self.register_waveform(pulse, "i") + serial_q = self.register_waveform(pulse, "q") + self.pulses[op] = { + "operation": "control", + "length": pulse.duration, + "waveforms": {"I": serial_i, "Q": serial_q}, + "digital_marker": "ON", + } + # register drive pulse in elements + self.elements[element]["operations"][op] = op + + def register_dc_pulse(self, element, pulse): + op = operation(pulse) + serial = self.register_waveform(pulse) + self.pulses[op] = { + "operation": "control", + "length": pulse.duration, + "waveforms": { + "single": serial, }, - "intermediate_frequency": intermediate_frequency, - "operations": {}, } - return element - - def register_element(self, qubit, pulse, time_of_flight=0, smearing=0): - if pulse.type is PulseType.DRIVE: - # register drive element - if_frequency = pulse.frequency - math.floor(qubit.drive.lo_frequency) - element = self.register_drive_element(qubit, if_frequency) - # register flux element (if available) - if qubit.flux: - self.register_flux_element(qubit) - elif pulse.type is PulseType.READOUT: - # register readout element (if it does not already exist) - if_frequency = pulse.frequency - math.floor(qubit.readout.lo_frequency) - element = self.register_readout_element( - qubit, if_frequency, time_of_flight, smearing - ) - # register flux element (if available) - if qubit.flux: - self.register_flux_element(qubit) - else: - # register flux element - element = self.register_flux_element(qubit, pulse.frequency) - return element + # register flux pulse in elements + self.elements[element]["operations"][op] = op - def register_pulse(self, pulse, qubit): + def register_acquisition_pulse(self, element, pulse, kernel=None): """Registers pulse, waveforms and integration weights in QM config. Args: @@ -274,61 +282,27 @@ def register_pulse(self, pulse, qubit): instantiation of the Qubit objects. They are named as "drive0", "drive1", "flux0", "readout0", ... """ - pulse = qmpulse.pulse - if qmpulse.operation not in self.pulses: - if pulse.type is PulseType.DRIVE: - serial_i = self.register_waveform(pulse, "i") - serial_q = self.register_waveform(pulse, "q") - self.pulses[qmpulse.operation] = { - "operation": "control", - "length": pulse.duration, - "waveforms": {"I": serial_i, "Q": serial_q}, - "digital_marker": "ON", - } - # register drive pulse in elements - self.elements[qmpulse.element]["operations"][ - qmpulse.operation - ] = qmpulse.operation - - elif pulse.type is PulseType.FLUX: - serial = self.register_waveform(pulse) - self.pulses[qmpulse.operation] = { - "operation": "control", - "length": pulse.duration, - "waveforms": { - "single": serial, - }, - } - # register flux pulse in elements - self.elements[qmpulse.element]["operations"][ - qmpulse.operation - ] = qmpulse.operation - - elif pulse.type is PulseType.READOUT: - serial_i = self.register_waveform(pulse, "i") - serial_q = self.register_waveform(pulse, "q") - self.register_integration_weights(qubit, pulse.duration) - self.pulses[qmpulse.operation] = { - "operation": "measurement", - "length": pulse.duration, - "waveforms": { - "I": serial_i, - "Q": serial_q, - }, - "integration_weights": { - "cos": f"cosine_weights{qubit.name}", - "sin": f"sine_weights{qubit.name}", - "minus_sin": f"minus_sine_weights{qubit.name}", - }, - "digital_marker": "ON", - } - # register readout pulse in elements - self.elements[qmpulse.element]["operations"][ - qmpulse.operation - ] = qmpulse.operation - - else: - raise_error(TypeError, f"Unknown pulse type {pulse.type.name}.") + op = operation(pulse) + serial_i = self.register_waveform(pulse, "i") + serial_q = self.register_waveform(pulse, "q") + self.register_integration_weights(element, pulse.duration, kernel) + self.pulses[qmpulse.operation] = { + "operation": "measurement", + "length": pulse.duration, + "waveforms": { + "I": serial_i, + "Q": serial_q, + }, + "integration_weights": { + "cos": f"cosine_weights_{element}", + "sin": f"sine_weights_{element}", + "minus_sin": f"minus_sine_weights_{element}", + }, + "digital_marker": "ON", + } + # register readout pulse in elements + self.elements[element]["operations"][op] = op + return op def register_waveform(self, pulse, mode="i"): """Registers waveforms in QM config. @@ -345,6 +319,7 @@ def register_waveform(self, pulse, mode="i"): serial (str): String with a serialization of the waveform. Used as key to identify the waveform in the config. """ + # TODO: Remove this? if pulse.type is PulseType.READOUT and mode == "q": # Force zero q waveforms for readout serial = "zero_wf" @@ -375,7 +350,7 @@ def register_waveform(self, pulse, mode="i"): } return serial - def register_integration_weights(self, qubit, readout_len): + def register_integration_weights(self, element, readout_len, kernel=None): """Registers integration weights in QM config. Args: @@ -385,24 +360,24 @@ def register_integration_weights(self, qubit, readout_len): """ angle = 0 cos, sin = np.cos(angle), np.sin(angle) - if qubit.kernel is None: + if kernel is None: convert = lambda x: [(x, readout_len)] else: - cos = qubit.kernel * cos - sin = qubit.kernel * sin + cos = kernel * cos + sin = kernel * sin convert = lambda x: x self.integration_weights.update( { - f"cosine_weights{qubit.name}": { + f"cosine_weights_{element}": { "cosine": convert(cos), "sine": convert(-sin), }, - f"sine_weights{qubit.name}": { + f"sine_weights_{element}": { "cosine": convert(sin), "sine": convert(cos), }, - f"minus_sine_weights{qubit.name}": { + f"minus_sine_weights_{element}": { "cosine": convert(-sin), "sine": convert(-cos), }, diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index fe38ed8671..f85e0e9059 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -18,9 +18,8 @@ from qibolab.unrolling import Bounds from .acquisition import create_acquisition, fetch_results -from .config import SAMPLING_RATE, QMConfig, element, operation +from .config import SAMPLING_RATE, QMConfig, operation from .devices import Octave, OPXplus -from .ports import OPXIQ from .program import Parameters from .sweepers import sweep @@ -68,6 +67,7 @@ def find_baking_pulses(sweepers): return to_bake +# TODO: Remove time of flight and smearing def controllers_config(qubits, time_of_flight, smearing=0): """Create a Quantum Machines configuration without pulses. @@ -118,17 +118,14 @@ class QMController(Controller): Has the form XXX.XXX.XXX.XXX:XXX. """ - opxs: dict[int, OPXplus] = field(default_factory=dict) + opxs: dict[str, OPXplus] """Dictionary containing the :class:`qibolab.instruments.qm.devices.OPXplus` instruments being used.""" - octaves: dict[int, Octave] = field(default_factory=dict) + octaves: dict[str, Octave] """Dictionary containing the :class:`qibolab.instruments.qm.devices.Octave` instruments being used.""" + channels: dict[str, QmChannel] - time_of_flight: int = 0 - """Time of flight used for hardware signal integration.""" - smearing: int = 0 - """Smearing used for hardware signal integration.""" bounds: Bounds = Bounds(0, 0, 0) """Maximum bounds used for batching in sequence unrolling.""" calibration_path: Optional[str] = None @@ -181,42 +178,11 @@ def __post_init__(self): readout=30, instructions=int(1e6), ) - # convert lists to dicts - if not isinstance(self.opxs, dict): - self.opxs = {instr.name: instr for instr in self.opxs} - if not isinstance(self.octaves, dict): - self.octaves = {instr.name: instr for instr in self.octaves} if self.simulation_duration is not None: # convert simulation duration from ns to clock cycles self.simulation_duration //= 4 - def ports(self, name, output=True): - """Provides instrument ports to the user. - - Note that individual ports can also be accessed from the corresponding devices - using :meth:`qibolab.instruments.qm.devices.QMDevice.ports`. - - Args: - name (tuple): Contains the numbers of controller and port to be obtained. - For example ``((conX, Y),)`` returns port-Y of OPX+ controller X. - ``((conX, Y), (conX, Z))`` returns port-Y and Z of OPX+ controller X - as an :class:`qibolab.instruments.qm.ports.OPXIQ` port pair. - output (bool): ``True`` for obtaining an output port, otherwise an - input port is returned. Default is ``True``. - """ - if len(name) == 1: - con, port = name[0] - return self.opxs[con].ports(port, output) - elif len(name) == 2: - (con1, port1), (con2, port2) = name - return OPXIQ( - self.opxs[con1].ports(port1, output), - self.opxs[con2].ports(port2, output), - ) - else: - raise ValueError(f"Invalid port {name} for Quantum Machines controller.") - @property def sampling_rate(self): """Sampling rate of Quantum Machines instruments.""" @@ -270,6 +236,7 @@ def calibrate_mixers(self, qubits): if isinstance(qubits, dict): qubits = list(qubits.values()) + # TODO: Remove time of flight and smearing config = controllers_config(qubits, self.time_of_flight, self.smearing) machine = self.manager.open_qm(config.__dict__) for qubit in qubits: @@ -304,7 +271,74 @@ def simulate_program(self, program): ) return self.manager.simulate(self.config.__dict__, program, simulation_config) - def register_pulses(self, qubits, sequence, options): + def configure_dc_line(self, channel: QmChannel, configs: dict[str, Config]): + config = configs[channel.logical_channel.name] + self.config.register_opx_output( + channel.device, channel.port, digital_port=None, **asdict(config) + ) + self.config.register_dc_element(channel) + + def configure_iq_line(self, channel: QmChannel, configs: dict[str, Config]): + if "octave" in channel.device: + opx = self.octaves[channel.device].connectivity + opx_i = 2 * channel.port - 1 + opx_q = 2 * channel.port + config = configs[channel.logical_channel.name] + self.config.register_opx_output( + opx, opx_i, digital_port=opx_i, offset=config.offset + ) + self.config.register_opx_output( + opx, opx_q, digital_port=opx_i, offset=config.offset + ) + + lo_config = configs[channel.logical_channel.lo] + self.config.register_octave_output( + channel.device, channel.port, opx, asdict(lo_config) + ) + + intermediate_frequency = config.frequency - lo_config.frequency + self.config.register_iq_element(channel, intermediate_frequency, opx) + else: + raise NotImplementedError + + def configure_acquire_line(self, channel: QmChannel, configs: dict[str, Config]): + if "octave" in channel.device: + opx = self.octaves[channel.device].connectivity + opx_i = 2 * channel.port - 1 + opx_q = 2 * channel.port + config = configs[channel.logical_channel.name] + self.config.register_opx_input( + opx, opx_i, offset=config.offset, gain=config.gain + ) + self.config.register_opx_input( + opx, opx_q, offset=config.offset, gain=config.gain + ) + + measure_channel = self.channels[logical_channel.measure] + lo_config = configs[measure_channel.logical_channel.lo] + self.config.register_octave_input( + channel.device, channel.port, lo_config.frequency + ) + + self.config.register_acquire_element( + channel, time_of_flight=config.delay, smearing=config.smearing + ) + else: + raise NotImplementedError + + def configure_channel(self, channel, configs): + channel = self.channels[channel_name] + logical_channel = channel.logical_channel + if isinstance(logical_channel, DcChannel): + self.configure_dc_line(channel, configs) + elif isinstance(logical_channel, IqChannel): + self.configure_iq_line(channel, configs) + if logical_channel.acquisition is not None: + self.configure_channel( + self.channels[logical_channel.acquisition], configs + ) + + def register_pulses(self, sequence, configs, options): """Translates a :class:`qibolab.pulses.PulseSequence` to :class:`qibolab.instruments.qm.instructions.Instructions`. @@ -318,69 +352,82 @@ def register_pulses(self, qubits, sequence, options): acquisitions (dict): Map from measurement instructions to acquisition objects. parameters (dict): """ - # Current driver cannot play overlapping pulses on drive and flux channels - # If we want to play overlapping pulses we need to define different elements on the same ports - # like we do for readout multiplex + self.register_channels(sequence, configs) acquisitions = {} parameters = defaultdict(Parameters) - for pulse in sequence: - if isinstance(pulse, Delay): - continue - - qubit = qubits[pulse.qubit] - self.config.register_port(getattr(qubit, pulse.type.name.lower()).port) - if pulse.type is PulseType.READOUT: - self.config.register_port(qubit.feedback.port) - - element = self.config.register_element( - qubit, pulse, self.time_of_flight, self.smearing - ) - if ( - pulse.duration % 4 != 0 - or pulse.duration < 16 - or pulse.id in pulses_to_bake - ): - qmpulse = BakedPulse(pulse, element) - qmpulse.bake(self.config, durations=[pulse.duration]) - else: - qmpulse = QMPulse(pulse, element) - if pulse.type is PulseType.READOUT: - ro_pulses.append(qmpulse) - self.config.register_pulse(qubit, qmpulse) - qmsequence.add(qmpulse) - - op = self.config.register_pulse(pulse, qubit) - if pulse.type is PulseType.READOUT: - if op not in acquisitions: - el = element(pulse) - acquisitions[op] = create_acquisition( - op, el, pulse.qubit, options, qubit.threshold, qubit.iq_angle - ) - parameters[op].acquisition = acquisitions[op] - acquisitions[op].keys.append(pulse.id) + for channel_name, channel_sequence in sequence.items(): + channel = self.channels[channel_name] + self.configure_channel(channel, configs) + + for pulse in channel_sequence: + if isinstance(pulse, (Delay, VirtualZ)): + continue + + # if ( + # pulse.duration % 4 != 0 + # or pulse.duration < 16 + # or pulse.id in pulses_to_bake + # ): + # qmpulse = BakedPulse(pulse, element) + # qmpulse.bake(self.config, durations=[pulse.duration]) + # else: + logical_channel = channel.logical_channel + if isinstance(logical_channel, DcChannel): + self.config.register_dc_pulse(channel_name, pulse) + else: + if logical_channel.acquisition is None: + self.config.register_iq_pulse(channel_name, pulse) + else: + acquisition = self.channels[ + logical_channel.acquisition + ].logical_channel + + kernel, threshold, iq_angle = integration_setup[ + acquisition.name + ] + op = self.config.register_acquisition_pulse( + channel_name, pulse, kernel + ) + if op not in acquisitions: + acquisitions[op] = create_acquisition( + op, + channel_name, + pulse.qubit, + options, + threshold, + iq_angle, + ) + parameters[op].acquisition = acquisitions[op] + acquisitions[op].keys.append(pulse.id) return acquisitions, parameters - def play(self, qubits, couplers, sequence, options): - return self.sweep(qubits, couplers, sequence, options) + def play(self, configs, sequences, options, integration_setup): + return self.sweep(configs, sequences, options, integration_weights) + + def sweep(self, configs, sequences, options, integration_setup, *sweepers): + if len(sequences) > 1: + raise NotImplementedError + elif len(sequences) == 0: + return {} - def sweep(self, qubits, couplers, sequence, options, *sweepers): - if not sequence: + sequence = sequences[0] + if len(sequence) == 0: return {} buffer_dims = [len(sweeper.values) for sweeper in reversed(sweepers)] if options.averaging_mode is AveragingMode.SINGLESHOT: buffer_dims.append(options.nshots) - # register flux elements for all qubits so that they are - # always at sweetspot even when they are not used - for qubit in qubits.values(): - if qubit.flux: - self.config.register_port(qubit.flux.port) + # register DC elements so that all qubits are + # sweetspot even when they are not used + for channel in self.channels.values(): + if isinstance(channel.logical_channel, DcChannel): + self.configure_dc_line(channel, configs) self.config.register_flux_element(qubit) - acquisitions, parameters = self.register_pulses(qubits, sequence, options) + acquisitions, parameters = self.register_pulses(configs, sequence, options) with qua.program() as experiment: n = declare(int) # declare acquisition variables @@ -390,7 +437,6 @@ def sweep(self, qubits, couplers, sequence, options, *sweepers): with for_(n, 0, n < options.nshots, n + 1): sweep( list(sweepers), - qubits, sequence, parameters, options.relaxation_time, diff --git a/src/qibolab/instruments/qm/program.py b/src/qibolab/instruments/qm/program.py index c3e89a2639..41c92cae27 100644 --- a/src/qibolab/instruments/qm/program.py +++ b/src/qibolab/instruments/qm/program.py @@ -6,7 +6,7 @@ from qibolab.pulses import Delay, PulseType from .acquisition import Acquisition -from .config import element, operation +from .config import operation @dataclass @@ -19,19 +19,18 @@ class Parameters: phase: Optional[float] = None -def _delay(pulse, parameters): +def _delay(pulse, element, parameters): # TODO: How to play delays on multiple elements? if parameters.duration is None: duration = pulse.duration // 4 + 1 else: duration = parameters.duration - qua.wait(duration, element(pulse)) + qua.wait(duration, element) -def _play(pulse, parameters): - el = element(pulse) +def _play(pulse, element, parameters): if parameters.phase is not None: - qua.frame_rotation_2pi(parameters.phase, el) + qua.frame_rotation_2pi(parameters.phase, element) if parameters.amplitude is not None: op = operation(pulse) * parameters.amplitude else: @@ -40,10 +39,10 @@ def _play(pulse, parameters): if pulse.type is PulseType.READOUT: parameters.acquisition.measure(op) else: - qua.play(op, el, duration=parameters.duration) + qua.play(op, element, duration=parameters.duration) if parameters.phase is not None: - qua.reset_frame(el) + qua.reset_frame(element) def play(sequence, parameters, relaxation_time=0): @@ -52,12 +51,13 @@ def play(sequence, parameters, relaxation_time=0): Should be used inside a ``program()`` context. """ qua.align() - for pulse in sequence: - params = parameters[operation(pulse)] - if isinstance(pulse, Delay): - _delay(pulse, params) - else: - _play(pulse, params) + for element, pulses in sequence.items(): + for pulse in pulses: + params = parameters[operation(pulse)] + if isinstance(pulse, Delay): + _delay(pulse, element, params) + else: + _play(pulse, element, params) if relaxation_time > 0: qua.wait(relaxation_time // 4) diff --git a/src/qibolab/instruments/qm/sweepers.py b/src/qibolab/instruments/qm/sweepers.py index 20e95a1233..ab5c0f5abe 100644 --- a/src/qibolab/instruments/qm/sweepers.py +++ b/src/qibolab/instruments/qm/sweepers.py @@ -6,7 +6,6 @@ from qm.qua import declare, fixed, for_ from qualang_tools.loops import from_array -from qibolab.instruments.qm.sequence import BakedPulse from qibolab.pulses import PulseType from .config import element, operation @@ -40,40 +39,38 @@ def check_max_offset(offset, max_offset): ) -def _update_baked_pulses(sweeper, qmsequence, config): - """Updates baked pulse if duration sweeper is used.""" - qmpulse = qmsequence.pulse_to_qmpulse[sweeper.pulses[0].id] - is_baked = isinstance(qmpulse, BakedPulse) - for pulse in sweeper.pulses: - qmpulse = qmsequence.pulse_to_qmpulse[pulse.id] - if isinstance(qmpulse, BakedPulse): - if not is_baked: - raise_error( - TypeError, - "Duration sweeper cannot contain both baked and not baked pulses.", - ) - values = np.array(sweeper.values).astype(int) - qmpulse.bake(config, values) - - -def sweep(sweepers, qubits, sequence, parameters, relaxation_time): +# def _update_baked_pulses(sweeper, qmsequence, config): +# """Updates baked pulse if duration sweeper is used.""" +# qmpulse = qmsequence.pulse_to_qmpulse[sweeper.pulses[0].id] +# is_baked = isinstance(qmpulse, BakedPulse) +# for pulse in sweeper.pulses: +# qmpulse = qmsequence.pulse_to_qmpulse[pulse.id] +# if isinstance(qmpulse, BakedPulse): +# if not is_baked: +# raise_error( +# TypeError, +# "Duration sweeper cannot contain both baked and not baked pulses.", +# ) +# values = np.array(sweeper.values).astype(int) +# qmpulse.bake(config, values) + + +def sweep(sweepers, sequence, parameters, relaxation_time): """Public sweep function that is called by the driver.""" # for sweeper in sweepers: # if sweeper.parameter is Parameter.duration: # _update_baked_pulses(sweeper, instructions, config) - _sweep_recursion(sweepers, qubits, sequence, parameters, relaxation_time) + _sweep_recursion(sweepers, sequence, parameters, relaxation_time) -def _sweep_recursion(sweepers, qubits, sequence, parameters, relaxation_time): +def _sweep_recursion(sweepers, sequence, parameters, relaxation_time): """Unrolls a list of qibolab sweepers to the corresponding QUA for loops using recursion.""" if len(sweepers) > 0: parameter = sweepers[0].parameter.name func_name = f"_sweep_{parameter}" if func_name in globals(): - globals()[func_name]( - sweepers, qubits, sequence, parameters, relaxation_time - ) + globals()[func_name](sweepers, sequence, parameters, relaxation_time) else: raise_error( NotImplementedError, f"Sweeper for {parameter} is not implemented." @@ -82,6 +79,7 @@ def _sweep_recursion(sweepers, qubits, sequence, parameters, relaxation_time): play(sequence, parameters, relaxation_time) +# TODO: Remove ``qubits`` from all ``_sweep`` functions def _sweep_frequency(sweepers, qubits, sequence, parameters, relaxation_time): sweeper = sweepers[0] freqs0 = [] diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index bac525cebd..ccea081bf4 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -306,7 +306,11 @@ def execute( # so that each acquisition command carries the info with it. integration_setup: IntegrationSetup = {} for qubit in self.qubits.values(): - integration_setup[qubit.acquisition.name] = (qubit.kernel, qubit.iq_angle) + integration_setup[qubit.acquisition.name] = ( + qubit.kernel, + qubit.threshold, + qubit.iq_angle, + ) results = defaultdict(list) for b in batch(sequences, self._controller.bounds): From 78f13b071aa13d0da65383796d6d850248f75d42 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 11 Jul 2024 20:19:11 +0400 Subject: [PATCH 0432/1006] chore: drop qubits from acquisition --- src/qibolab/instruments/qm/acquisition.py | 162 +++++++++++++--------- src/qibolab/instruments/qm/controller.py | 5 +- 2 files changed, 99 insertions(+), 68 deletions(-) diff --git a/src/qibolab/instruments/qm/acquisition.py b/src/qibolab/instruments/qm/acquisition.py index d0ad33832d..9d28388afb 100644 --- a/src/qibolab/instruments/qm/acquisition.py +++ b/src/qibolab/instruments/qm/acquisition.py @@ -1,4 +1,5 @@ from abc import ABC, abstractmethod +from collections import defaultdict from dataclasses import dataclass, field from typing import Optional @@ -9,8 +10,21 @@ from qualang_tools.addons.variables import assign_variables_to_element from qualang_tools.units import unit -from qibolab.execution_parameters import AcquisitionType, AveragingMode -from qibolab.qubits import QubitId +from qibolab.execution_parameters import ( + AcquisitionType, + AveragingMode, + ExecutionParameters, +) +from qibolab.result import ( + AveragedIntegratedResults, + AveragedRawWaveformResults, + AveragedSampleResults, + IntegratedResults, + RawWaveformResults, + SampleResults, +) + +# TODO: Change name to operation? @dataclass @@ -25,32 +39,36 @@ class Acquisition(ABC): name: str """Name of the acquisition used as identifier to download results from the instruments.""" - qubit: QubitId + element: str + """Element from QM ``config`` that the pulse will be applied on.""" average: bool keys: list[str] = field(default_factory=list) + RESULT_CLS = IntegratedResults + """Result object type that corresponds to this acquisition type.""" + AVERAGED_RESULT_CLS = AveragedIntegratedResults + """Averaged result object type that corresponds to this acquisition + type.""" + @property def npulses(self): return len(self.keys) @abstractmethod - def assign_element(self, element): - """Assign acquisition variables to the corresponding QM controlled. + def declare(self): + """Declares QUA variables related to this acquisition. - Proposed to do by QM to avoid crashes. - - Args: - element (str): Element (from ``config``) that the pulse will be applied on. + Assigns acquisition variables to the corresponding QM + controller. This was proposed by QM to avoid crashes. """ @abstractmethod - def measure(self, operation, element): + def measure(self, operation): """Send measurement pulse and acquire results. Args: operation (str): Operation (from ``config``) corresponding to the pulse to be played. - element (str): Element (from ``config``) that the pulse will be applied on. """ @abstractmethod @@ -67,22 +85,24 @@ def fetch(self): def result(self, data): """Creates Qibolab result object that is returned to the platform.""" + res_cls = self.AVERAGED_RESULT_CLS if self.average else self.RESULT_CLS if self.npulses > 1: - return [data[..., i] for i in range(self.npulses)] - return [data] + return [res_cls(data[..., i]) for i in range(self.npulses)] + return [res_cls(data)] @dataclass class RawAcquisition(Acquisition): """QUA variables used for raw waveform acquisition.""" - adc_stream: _ResultSource = field( - default_factory=lambda: declare_stream(adc_trace=True) - ) + adc_stream: Optional[_ResultSource] = None """Stream to collect raw ADC data.""" - def assign_element(self, element): - pass + RESULT_CLS = RawWaveformResults + AVERAGED_RESULT_CLS = AveragedRawWaveformResults + + def declare(self): + self.adc_stream = declare_stream(adc_trace=True) def measure(self, operation, element): qua.reset_phase(element) @@ -110,20 +130,27 @@ def fetch(self, handles): class IntegratedAcquisition(Acquisition): """QUA variables used for integrated acquisition.""" - i: _Variable = field(default_factory=lambda: declare(fixed)) - q: _Variable = field(default_factory=lambda: declare(fixed)) + i: Optional[_Variable] = None + q: Optional[_Variable] = None """Variables to save the (I, Q) values acquired from a single shot.""" - istream: _ResultSource = field(default_factory=lambda: declare_stream()) - qstream: _ResultSource = field(default_factory=lambda: declare_stream()) + istream: Optional[_ResultSource] = None + qstream: Optional[_ResultSource] = None """Streams to collect the results of all shots.""" - def assign_element(self, element): - assign_variables_to_element(element, self.i, self.q) + RESULT_CLS = IntegratedResults + AVERAGED_RESULT_CLS = AveragedIntegratedResults - def measure(self, operation, element): + def declare(self): + self.i = declare(fixed) + self.q = declare(fixed) + self.istream = declare_stream() + self.qstream = declare_stream() + assign_variables_to_element(self.element, self.i, self.q) + + def measure(self, operation): qua.measure( operation, - element, + self.element, None, qua.dual_demod.full("cos", "out1", "sin", "out2", self.i), qua.dual_demod.full("minus_sin", "out1", "cos", "out2", self.q), @@ -164,25 +191,32 @@ class ShotsAcquisition(Acquisition): angle: Optional[float] = None """Angle in the IQ plane to be used for classification of single shots.""" - i: _Variable = field(default_factory=lambda: declare(fixed)) - q: _Variable = field(default_factory=lambda: declare(fixed)) + i: Optional[_Variable] = None + q: Optional[_Variable] = None """Variables to save the (I, Q) values acquired from a single shot.""" - shot: _Variable = field(default_factory=lambda: declare(int)) + shot: Optional[_Variable] = None """Variable for calculating an individual shots.""" - shots: _ResultSource = field(default_factory=lambda: declare_stream()) + shots: Optional[_ResultSource] = None """Stream to collect multiple shots.""" + RESULT_CLS = SampleResults + AVERAGED_RESULT_CLS = AveragedSampleResults + def __post_init__(self): self.cos = np.cos(self.angle) self.sin = np.sin(self.angle) - def assign_element(self, element): - assign_variables_to_element(element, self.i, self.q, self.shot) + def declare(self): + self.i = declare(fixed) + self.q = declare(fixed) + self.shot = declare(int) + self.shots = declare_stream() + assign_variables_to_element(self.element, self.i, self.q, self.shot) - def measure(self, operation, element): + def measure(self, operation): qua.measure( operation, - element, + self.element, None, qua.dual_demod.full("cos", "out1", "sin", "out2", self.i), qua.dual_demod.full("minus_sin", "out1", "cos", "out2", self.q), @@ -215,39 +249,33 @@ def fetch(self, handles): } -def declare_acquisitions(ro_pulses, qubits, options): - """Declares variables for saving acquisition in the QUA program. +def create_acquisition( + operation: str, + element: str, + options: ExecutionParameters, + threshold: float, + angle: float, +): + """Create container for the variables used for saving acquisition in the + QUA program. Args: - ro_pulses (list): List of readout pulses in the sequence. - qubits (dict): Dictionary containing all the :class:`qibolab.qubits.Qubit` - objects of the platform. + operation (str): + element (str): options (:class:`qibolab.execution_parameters.ExecutionParameters`): Execution options containing acquisition type and averaging mode. Returns: - List of all :class:`qibolab.instruments.qm.acquisition.Acquisition` objects. + :class:`qibolab.instruments.qm.acquisition.Acquisition` object containing acquisition variables. """ - acquisitions = {} - for qmpulse in ro_pulses: - qubit = qmpulse.pulse.qubit - name = f"{qmpulse.operation}_{qubit}" - if name not in acquisitions: - average = options.averaging_mode is AveragingMode.CYCLIC - kwargs = {} - if options.acquisition_type is AcquisitionType.DISCRIMINATION: - kwargs["threshold"] = qubits[qubit].threshold - kwargs["angle"] = qubits[qubit].iq_angle - - acquisition = ACQUISITION_TYPES[options.acquisition_type]( - name, qubit, average, **kwargs - ) - acquisition.assign_element(qmpulse.element) - acquisitions[name] = acquisition - - acquisitions[name].keys.append(qmpulse.pulse.id) - qmpulse.acquisition = acquisitions[name] - return list(acquisitions.values()) + average = options.averaging_mode is AveragingMode.CYCLIC + kwargs = {} + if options.acquisition_type is AcquisitionType.DISCRIMINATION: + kwargs = {"threshold": threshold, "angle": angle} + acquisition = ACQUISITION_TYPES[options.acquisition_type]( + operation, element, average, **kwargs + ) + return acquisition def fetch_results(result, acquisitions): @@ -255,16 +283,20 @@ def fetch_results(result, acquisitions): Args: result: Result of the executed experiment. - acquisition (dict): Dictionary containing :class:`qibolab.instruments.qm.acquisition.Acquisition` objects. + acquisition: Dictionary containing :class:`qibolab.instruments.qm.acquisition.Acquisition` objects. Returns: Dictionary with the results in the format required by the platform. """ handles = result.result_handles handles.wait_for_all_values() # for async replace with ``handles.is_processing()`` - results = {} + results = defaultdict(list) for acquisition in acquisitions: data = acquisition.fetch(handles) - for id_, result in zip(acquisition.keys, data): - results[acquisition.qubit] = results[id_] = result - return results + for serial, result in zip(acquisition.keys, data): + results[serial].append(result) + + # collapse single element lists for back-compatibility + return { + key: value[0] if len(value) == 1 else value for key, value in results.items() + } diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index f85e0e9059..1361fb65d3 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -393,7 +393,6 @@ def register_pulses(self, sequence, configs, options): acquisitions[op] = create_acquisition( op, channel_name, - pulse.qubit, options, threshold, iq_angle, @@ -425,7 +424,7 @@ def sweep(self, configs, sequences, options, integration_setup, *sweepers): for channel in self.channels.values(): if isinstance(channel.logical_channel, DcChannel): self.configure_dc_line(channel, configs) - self.config.register_flux_element(qubit) + self.config.register_dc_element(channel) acquisitions, parameters = self.register_pulses(configs, sequence, options) with qua.program() as experiment: @@ -459,7 +458,7 @@ def sweep(self, configs, sequences, options, integration_setup, *sweepers): results = {} for pulse in sequence: if pulse.type is PulseType.READOUT: - results[pulse.qubit] = results[pulse.id] = result + results[pulse.id] = result return results result = self.execute_program(experiment) From b4e01dbb7ccfc2314509379a0127b7a1670baacc Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 11 Jul 2024 20:28:42 +0400 Subject: [PATCH 0433/1006] fix: some imports --- src/qibolab/instruments/qm/config.py | 10 ++++++---- src/qibolab/instruments/qm/controller.py | 6 ++++-- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/qibolab/instruments/qm/config.py b/src/qibolab/instruments/qm/config.py index cea2da8cea..7da7083da7 100644 --- a/src/qibolab/instruments/qm/config.py +++ b/src/qibolab/instruments/qm/config.py @@ -4,7 +4,7 @@ from qibolab.pulses import PulseType, Rectangular -from .ports import OPXIQ +from .components import QmChannel SAMPLING_RATE = 1 """Sampling rate of Quantum Machines OPX in GSps.""" @@ -157,7 +157,8 @@ def register_iq_element( LO connected to the same channel. """ element = channel.logical_channel.name - if isinstance(qubit.drive.port, OPXIQ): + if False: + # if isinstance(qubit.drive.port, OPXIQ): raise NotImplementedError # lo_frequency = math.floor(qubit.drive.lo_frequency) # self.elements[element] = { @@ -207,7 +208,8 @@ def register_acquire_element( LO connected to the same channel. """ element = measure_channel.logical_channel.name - if isinstance(qubit.readout.port, OPXIQ): + if False: + # if isinstance(qubit.readout.port, OPXIQ): raise NotImplementedError # lo_frequency = math.floor(qubit.readout.lo_frequency) # self.elements[element] = { @@ -286,7 +288,7 @@ def register_acquisition_pulse(self, element, pulse, kernel=None): serial_i = self.register_waveform(pulse, "i") serial_q = self.register_waveform(pulse, "q") self.register_integration_weights(element, pulse.duration, kernel) - self.pulses[qmpulse.operation] = { + self.pulses[op] = { "operation": "measurement", "length": pulse.duration, "waveforms": { diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 1361fb65d3..0c67a601bf 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -1,7 +1,7 @@ import shutil import tempfile from collections import defaultdict -from dataclasses import dataclass, field +from dataclasses import asdict, dataclass, field from pathlib import Path from typing import Optional @@ -12,12 +12,14 @@ from qualang_tools.simulator_tools import create_simulator_controller_connections from qibolab import AveragingMode +from qibolab.components import Config, DcChannel, IqChannel from qibolab.instruments.abstract import Controller from qibolab.pulses import Delay, PulseType from qibolab.sweeper import Parameter from qibolab.unrolling import Bounds from .acquisition import create_acquisition, fetch_results +from .components import QmChannel from .config import SAMPLING_RATE, QMConfig, operation from .devices import Octave, OPXplus from .program import Parameters @@ -403,7 +405,7 @@ def register_pulses(self, sequence, configs, options): return acquisitions, parameters def play(self, configs, sequences, options, integration_setup): - return self.sweep(configs, sequences, options, integration_weights) + return self.sweep(configs, sequences, options, integration_setup) def sweep(self, configs, sequences, options, integration_setup, *sweepers): if len(sequences) > 1: From 091057c1db232df2abe9670cc80e5a9f4160959e Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 12 Jul 2024 16:50:26 +0400 Subject: [PATCH 0434/1006] refactor: remove qubit references from sweepers --- src/qibolab/instruments/qm/sweepers.py | 70 ++++++++++++-------------- 1 file changed, 31 insertions(+), 39 deletions(-) diff --git a/src/qibolab/instruments/qm/sweepers.py b/src/qibolab/instruments/qm/sweepers.py index ab5c0f5abe..1863f21ea6 100644 --- a/src/qibolab/instruments/qm/sweepers.py +++ b/src/qibolab/instruments/qm/sweepers.py @@ -6,11 +6,12 @@ from qm.qua import declare, fixed, for_ from qualang_tools.loops import from_array -from qibolab.pulses import PulseType - from .config import element, operation from .program import play +MAX_OFFSET = 0.5 +"""Maximum voltage supported by Quantum Machines OPX+ instrument in volts.""" + def maximum_sweep_value(values, value0): """Calculates maximum value that is reached during a sweep. @@ -27,7 +28,7 @@ def maximum_sweep_value(values, value0): return max(abs(min(values) + value0), abs(max(values) + value0)) -def check_max_offset(offset, max_offset): +def check_max_offset(offset, max_offset=MAX_OFFSET): """Checks if a given offset value exceeds the maximum supported offset. This is to avoid sending high currents that could damage lab @@ -55,22 +56,24 @@ def check_max_offset(offset, max_offset): # qmpulse.bake(config, values) -def sweep(sweepers, sequence, parameters, relaxation_time): +def sweep(sweepers, sequence, parameters, configs, relaxation_time): """Public sweep function that is called by the driver.""" # for sweeper in sweepers: # if sweeper.parameter is Parameter.duration: # _update_baked_pulses(sweeper, instructions, config) - _sweep_recursion(sweepers, sequence, parameters, relaxation_time) + _sweep_recursion(sweepers, sequence, parameters, configs, relaxation_time) -def _sweep_recursion(sweepers, sequence, parameters, relaxation_time): +def _sweep_recursion(sweepers, sequence, parameters, configs, relaxation_time): """Unrolls a list of qibolab sweepers to the corresponding QUA for loops using recursion.""" if len(sweepers) > 0: parameter = sweepers[0].parameter.name func_name = f"_sweep_{parameter}" if func_name in globals(): - globals()[func_name](sweepers, sequence, parameters, relaxation_time) + globals()[func_name]( + sweepers, sequence, parameters, configs, relaxation_time + ) else: raise_error( NotImplementedError, f"Sweeper for {parameter} is not implemented." @@ -79,30 +82,20 @@ def _sweep_recursion(sweepers, sequence, parameters, relaxation_time): play(sequence, parameters, relaxation_time) -# TODO: Remove ``qubits`` from all ``_sweep`` functions -def _sweep_frequency(sweepers, qubits, sequence, parameters, relaxation_time): +def _sweep_frequency(sweepers, sequence, parameters, configs, relaxation_time): sweeper = sweepers[0] freqs0 = [] - for pulse in sweeper.pulses: - qubit = qubits[pulse.qubit] - if pulse.type is PulseType.DRIVE: - lo_frequency = math.floor(qubit.drive.lo_frequency) - elif pulse.type is PulseType.READOUT: - lo_frequency = math.floor(qubit.readout.lo_frequency) - else: - raise_error( - NotImplementedError, - f"Cannot sweep frequency of pulse of type {pulse.type}.", - ) + for channel in sweeper.channels: + lo_frequency = configs[channel.lo].frequency # convert to IF frequency for readout and drive pulses - f0 = math.floor(pulse.frequency - lo_frequency) + f0 = math.floor(configs[channel.name].frequency - lo_frequency) freqs0.append(declare(int, value=f0)) # check if sweep is within the supported bandwidth [-400, 400] MHz max_freq = maximum_sweep_value(sweeper.values, f0) if max_freq > 4e8: raise_error( ValueError, - f"Frequency {max_freq} for qubit {qubit.name} is beyond instrument bandwidth.", + f"Frequency {max_freq} for channel {channel.name} is beyond instrument bandwidth.", ) # is it fine to have this declaration inside the ``nshots`` QUA loop? @@ -111,10 +104,10 @@ def _sweep_frequency(sweepers, qubits, sequence, parameters, relaxation_time): for pulse, f0 in zip(sweeper.pulses, freqs0): qua.update_frequency(element(pulse), f + f0) - _sweep_recursion(sweepers[1:], qubits, sequence, parameters, relaxation_time) + _sweep_recursion(sweepers[1:], sequence, parameters, configs, relaxation_time) -def _sweep_amplitude(sweepers, qubits, sequence, parameters, relaxation_time): +def _sweep_amplitude(sweepers, sequence, parameters, configs, relaxation_time): sweeper = sweepers[0] # TODO: Consider sweeping amplitude without multiplication if min(sweeper.values) < -2: @@ -132,42 +125,41 @@ def _sweep_amplitude(sweepers, qubits, sequence, parameters, relaxation_time): # else: parameters[operation(pulse)].amplitude = qua.amp(a) - _sweep_recursion(sweepers[1:], qubits, sequence, parameters, relaxation_time) + _sweep_recursion(sweepers[1:], sequence, parameters, configs, relaxation_time) -def _sweep_relative_phase(sweepers, qubits, sequence, parameters, relaxation_time): +def _sweep_relative_phase(sweepers, sequence, parameters, configs, relaxation_time): sweeper = sweepers[0] relphase = declare(fixed) with for_(*from_array(relphase, sweeper.values / (2 * np.pi))): for pulse in sweeper.pulses: parameters[operation(pulse)].phase = relphase - _sweep_recursion(sweepers[1:], qubits, sequence, parameters, relaxation_time) + _sweep_recursion(sweepers[1:], sequence, parameters, configs, relaxation_time) -def _sweep_bias(sweepers, qubits, sequence, parameters, relaxation_time): +def _sweep_bias(sweepers, sequence, parameters, configs, relaxation_time): sweeper = sweepers[0] offset0 = [] - for qubit in sweeper.qubits: - b0 = qubit.flux.offset - max_offset = qubit.flux.max_offset + for channel in sweeper.channels: + b0 = configs[channel.name].offset max_value = maximum_sweep_value(sweeper.values, b0) - check_max_offset(max_value, max_offset) + check_max_offset(max_value, MAX_OFFSET) offset0.append(declare(fixed, value=b0)) b = declare(fixed) with for_(*from_array(b, sweeper.values)): - for qubit, b0 in zip(sweeper.qubits, offset0): + for channel, b0 in zip(sweeper.channels, offset0): with qua.if_((b + b0) >= 0.49): - qua.set_dc_offset(f"flux{qubit.name}", "single", 0.49) + qua.set_dc_offset(f"flux{channel.name}", "single", 0.49) with qua.elif_((b + b0) <= -0.49): - qua.set_dc_offset(f"flux{qubit.name}", "single", -0.49) + qua.set_dc_offset(f"flux{channel.name}", "single", -0.49) with qua.else_(): - qua.set_dc_offset(f"flux{qubit.name}", "single", (b + b0)) + qua.set_dc_offset(f"flux{channel.name}", "single", (b + b0)) - _sweep_recursion(sweepers[1:], qubits, sequence, parameters, relaxation_time) + _sweep_recursion(sweepers[1:], sequence, parameters, configs, relaxation_time) -def _sweep_duration(sweepers, qubits, sequence, parameters, relaxation_time): +def _sweep_duration(sweepers, sequence, parameters, configs, relaxation_time): # TODO: Handle baked pulses sweeper = sweepers[0] dur = declare(int) @@ -175,4 +167,4 @@ def _sweep_duration(sweepers, qubits, sequence, parameters, relaxation_time): for pulse in sweeper.pulses: parameters[operation(pulse)].duration = dur - _sweep_recursion(sweepers[1:], qubits, sequence, parameters, relaxation_time) + _sweep_recursion(sweepers[1:], sequence, parameters, configs, relaxation_time) From 23807b91a20175c70ee041e3d0319234b66d9236 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 12 Jul 2024 16:51:47 +0400 Subject: [PATCH 0435/1006] chore: drop mixer calibration utilities --- src/qibolab/instruments/qm/controller.py | 54 ++---------------------- 1 file changed, 3 insertions(+), 51 deletions(-) diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 0c67a601bf..27901885e9 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -69,32 +69,6 @@ def find_baking_pulses(sweepers): return to_bake -# TODO: Remove time of flight and smearing -def controllers_config(qubits, time_of_flight, smearing=0): - """Create a Quantum Machines configuration without pulses. - - This contains the readout and drive elements and controllers and - is used by :meth:`qibolab.instruments.qm.controller.QMController.calibrate_mixers`. - - Args: - qubits (list): List of :class:`qibolab.qubits.Qubit` objects to be - included in the config. - time_of_flight (int): Time of flight used on readout elements. - smearing (int): Smearing used on readout elements. - """ - config = QMConfig() - for qubit in qubits: - if qubit.readout is not None: - config.register_port(qubit.readout.port) - config.register_readout_element( - qubit, qubit.mixer_frequencies["MZ"][1], time_of_flight, smearing - ) - if qubit.drive is not None: - config.register_port(qubit.drive.port) - config.register_drive_element(qubit, qubit.mixer_frequencies["RX"][1]) - return config - - @dataclass class QMController(Controller): """:class:`qibolab.instruments.abstract.Controller` object for controlling @@ -106,7 +80,7 @@ class QMController(Controller): written in QUA language. The ``config`` file is generated in parts in :class:`qibolab.instruments.qm.config.QMConfig`. Controllers, elements and pulses are all registered after a pulse sequence is given, so that - the config contains only elements related to the participating qubits. + the config contains only elements related to the participating channels. The QUA program for executing an arbitrary :class:`qibolab.pulses.PulseSequence` is written in :meth:`qibolab.instruments.qm.controller.QMController.play` and executed in :meth:`qibolab.instruments.qm.controller.QMController.execute_program`. @@ -228,28 +202,6 @@ def disconnect(self): self.manager.close() self.is_connected = False - def calibrate_mixers(self, qubits): - """Calibrate Octave mixers for readout and drive lines of given qubits. - - Args: - qubits (list): List of :class:`qibolab.qubits.Qubit` objects for - which mixers will be calibrated. - """ - if isinstance(qubits, dict): - qubits = list(qubits.values()) - - # TODO: Remove time of flight and smearing - config = controllers_config(qubits, self.time_of_flight, self.smearing) - machine = self.manager.open_qm(config.__dict__) - for qubit in qubits: - print(f"Calibrating mixers for qubit {qubit.name}") - if qubit.readout is not None: - _lo, _if = qubit.mixer_frequencies["MZ"] - machine.calibrate_element(f"readout{qubit.name}", {_lo: (_if,)}) - if qubit.drive is not None: - _lo, _if = qubit.mixer_frequencies["RX"] - machine.calibrate_element(f"drive{qubit.name}", {_lo: (_if,)}) - def execute_program(self, program): """Executes an arbitrary program written in QUA language. @@ -345,9 +297,9 @@ def register_pulses(self, sequence, configs, options): :class:`qibolab.instruments.qm.instructions.Instructions`. Args: - qubits (list): List of :class:`qibolab.platforms.abstract.Qubit` objects - passed from the platform. sequence (:class:`qibolab.pulses.PulseSequence`). Pulse sequence to translate. + configs (dict): + options: sweepers (list): List of sweeper objects so that pulses that require baking are identified. Returns: From 8b555756c6fcc61d9893971d3aaab38b219da565 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 12 Jul 2024 17:00:44 +0400 Subject: [PATCH 0436/1006] fix: pylint for QM --- src/qibolab/instruments/qm/components/configs.py | 2 +- src/qibolab/instruments/qm/config.py | 2 +- src/qibolab/instruments/qm/controller.py | 14 +++++++------- src/qibolab/instruments/qm/sweepers.py | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/qibolab/instruments/qm/components/configs.py b/src/qibolab/instruments/qm/components/configs.py index d580df1358..6e05dc8ac0 100644 --- a/src/qibolab/instruments/qm/components/configs.py +++ b/src/qibolab/instruments/qm/components/configs.py @@ -1,6 +1,6 @@ from dataclasses import dataclass -from qibolab.components import AcquisitionConfig, DcConfig +from qibolab.components import AcquisitionConfig, DcConfig, OscillatorConfig __all__ = [ "OpxDcConfig", diff --git a/src/qibolab/instruments/qm/config.py b/src/qibolab/instruments/qm/config.py index 7da7083da7..5d24428606 100644 --- a/src/qibolab/instruments/qm/config.py +++ b/src/qibolab/instruments/qm/config.py @@ -207,7 +207,7 @@ def register_acquire_element( will send to this qubit. This frequency will be mixed with the LO connected to the same channel. """ - element = measure_channel.logical_channel.name + element = channel.logical_channel.measure if False: # if isinstance(qubit.readout.port, OPXIQ): raise NotImplementedError diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 27901885e9..6b78a64169 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -14,7 +14,7 @@ from qibolab import AveragingMode from qibolab.components import Config, DcChannel, IqChannel from qibolab.instruments.abstract import Controller -from qibolab.pulses import Delay, PulseType +from qibolab.pulses import Delay, PulseType, VirtualZ from qibolab.sweeper import Parameter from qibolab.unrolling import Bounds @@ -256,11 +256,12 @@ def configure_iq_line(self, channel: QmChannel, configs: dict[str, Config]): raise NotImplementedError def configure_acquire_line(self, channel: QmChannel, configs: dict[str, Config]): + logical_channel = channel.logical_channel if "octave" in channel.device: opx = self.octaves[channel.device].connectivity opx_i = 2 * channel.port - 1 opx_q = 2 * channel.port - config = configs[channel.logical_channel.name] + config = configs[logical_channel.name] self.config.register_opx_input( opx, opx_i, offset=config.offset, gain=config.gain ) @@ -281,7 +282,6 @@ def configure_acquire_line(self, channel: QmChannel, configs: dict[str, Config]) raise NotImplementedError def configure_channel(self, channel, configs): - channel = self.channels[channel_name] logical_channel = channel.logical_channel if isinstance(logical_channel, DcChannel): self.configure_dc_line(channel, configs) @@ -292,7 +292,7 @@ def configure_channel(self, channel, configs): self.channels[logical_channel.acquisition], configs ) - def register_pulses(self, sequence, configs, options): + def register_pulses(self, sequence, configs, integration_setup, options): """Translates a :class:`qibolab.pulses.PulseSequence` to :class:`qibolab.instruments.qm.instructions.Instructions`. @@ -306,8 +306,6 @@ def register_pulses(self, sequence, configs, options): acquisitions (dict): Map from measurement instructions to acquisition objects. parameters (dict): """ - self.register_channels(sequence, configs) - acquisitions = {} parameters = defaultdict(Parameters) for channel_name, channel_sequence in sequence.items(): @@ -380,7 +378,9 @@ def sweep(self, configs, sequences, options, integration_setup, *sweepers): self.configure_dc_line(channel, configs) self.config.register_dc_element(channel) - acquisitions, parameters = self.register_pulses(configs, sequence, options) + acquisitions, parameters = self.register_pulses( + configs, sequence, integration_setup, options + ) with qua.program() as experiment: n = declare(int) # declare acquisition variables diff --git a/src/qibolab/instruments/qm/sweepers.py b/src/qibolab/instruments/qm/sweepers.py index 1863f21ea6..ca190e1f1c 100644 --- a/src/qibolab/instruments/qm/sweepers.py +++ b/src/qibolab/instruments/qm/sweepers.py @@ -6,7 +6,7 @@ from qm.qua import declare, fixed, for_ from qualang_tools.loops import from_array -from .config import element, operation +from .config import operation from .program import play MAX_OFFSET = 0.5 @@ -101,8 +101,8 @@ def _sweep_frequency(sweepers, sequence, parameters, configs, relaxation_time): # is it fine to have this declaration inside the ``nshots`` QUA loop? f = declare(int) with for_(*from_array(f, sweeper.values.astype(int))): - for pulse, f0 in zip(sweeper.pulses, freqs0): - qua.update_frequency(element(pulse), f + f0) + for channel, f0 in zip(sweeper.channels, freqs0): + qua.update_frequency(channel.name, f + f0) _sweep_recursion(sweepers[1:], sequence, parameters, configs, relaxation_time) From b37b360a842dffbd4fb92d7991260e1278bca17a Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 12 Jul 2024 17:01:41 +0400 Subject: [PATCH 0437/1006] refactor: drop OctaveOscillatorConfig --- src/qibolab/instruments/qm/components/configs.py | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/src/qibolab/instruments/qm/components/configs.py b/src/qibolab/instruments/qm/components/configs.py index 6e05dc8ac0..32e19149c5 100644 --- a/src/qibolab/instruments/qm/components/configs.py +++ b/src/qibolab/instruments/qm/components/configs.py @@ -1,11 +1,10 @@ from dataclasses import dataclass -from qibolab.components import AcquisitionConfig, DcConfig, OscillatorConfig +from qibolab.components import AcquisitionConfig, DcConfig __all__ = [ "OpxDcConfig", "QmAcquisitionConfig", - "OctaveOscillatorConfig", ] @@ -39,16 +38,3 @@ class QmAcquisitionConfig(AcquisitionConfig): """ # offset: float = 0.0 # """Constant voltage to be applied on the input.""" - - -@dataclass(frozen=True) -class OctaveOscillatorConfig(OscillatorConfig): - """Octave internal local oscillator config.""" - - frequency: float - """Octave local oscillator frequency in Hz.""" - power: float - """Octave local oscillator gain in dB. - - Possible values are -20dB to 20dB in steps of 0.5dB. - """ From b5e6735454f03f7db534c63633c103e45f6395f4 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 12 Jul 2024 17:05:22 +0400 Subject: [PATCH 0438/1006] chore: Drop PulseType from controller --- src/qibolab/instruments/qm/controller.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 6b78a64169..f9fc474652 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -14,7 +14,7 @@ from qibolab import AveragingMode from qibolab.components import Config, DcChannel, IqChannel from qibolab.instruments.abstract import Controller -from qibolab.pulses import Delay, PulseType, VirtualZ +from qibolab.pulses import Delay, VirtualZ from qibolab.sweeper import Parameter from qibolab.unrolling import Bounds @@ -410,9 +410,10 @@ def sweep(self, configs, sequences, options, integration_setup, *sweepers): if self.simulation_duration is not None: result = self.simulate_program(experiment) results = {} - for pulse in sequence: - if pulse.type is PulseType.READOUT: - results[pulse.id] = result + for channel_name, pulses in sequence.items(): + if self.channels[channel_name].logical_channel.acquisition is not None: + for pulse in pulses: + results[pulse.id] = result return results result = self.execute_program(experiment) From 3f80e73b401cb5262ea431abfa06645d7624a8ba Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 12 Jul 2024 17:15:08 +0400 Subject: [PATCH 0439/1006] refactor: drop QM ports and devices --- src/qibolab/instruments/qm/__init__.py | 2 +- src/qibolab/instruments/qm/controller.py | 5 +- src/qibolab/instruments/qm/devices.py | 120 -------------- src/qibolab/instruments/qm/octave.py | 13 ++ src/qibolab/instruments/qm/ports.py | 196 ----------------------- 5 files changed, 15 insertions(+), 321 deletions(-) delete mode 100644 src/qibolab/instruments/qm/devices.py create mode 100644 src/qibolab/instruments/qm/octave.py delete mode 100644 src/qibolab/instruments/qm/ports.py diff --git a/src/qibolab/instruments/qm/__init__.py b/src/qibolab/instruments/qm/__init__.py index e053aa970a..621f4cecab 100644 --- a/src/qibolab/instruments/qm/__init__.py +++ b/src/qibolab/instruments/qm/__init__.py @@ -1,2 +1,2 @@ from .controller import QMController -from .devices import Octave, OPXplus +from .octave import Octave diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index f9fc474652..8240ccef2f 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -21,7 +21,7 @@ from .acquisition import create_acquisition, fetch_results from .components import QmChannel from .config import SAMPLING_RATE, QMConfig, operation -from .devices import Octave, OPXplus +from .octave import Octave from .program import Parameters from .sweepers import sweep @@ -94,9 +94,6 @@ class QMController(Controller): Has the form XXX.XXX.XXX.XXX:XXX. """ - opxs: dict[str, OPXplus] - """Dictionary containing the - :class:`qibolab.instruments.qm.devices.OPXplus` instruments being used.""" octaves: dict[str, Octave] """Dictionary containing the :class:`qibolab.instruments.qm.devices.Octave` instruments being used.""" diff --git a/src/qibolab/instruments/qm/devices.py b/src/qibolab/instruments/qm/devices.py deleted file mode 100644 index 0c40ea57c9..0000000000 --- a/src/qibolab/instruments/qm/devices.py +++ /dev/null @@ -1,120 +0,0 @@ -from collections import defaultdict -from dataclasses import dataclass, field -from itertools import chain - -from qibolab.instruments.abstract import Instrument - -from .ports import ( - OPXIQ, - OctaveInput, - OctaveOutput, - OPXInput, - OPXOutput, - QMInput, - QMOutput, -) - - -class PortsDefaultdict(defaultdict): - """Dictionary mapping port numbers to - :class:`qibolab.instruments.qm.ports.QMPort` objects. - - Automatically instantiates ports that have not yet been created. - Used by :class:`qibolab.instruments.qm.devices.QMDevice` - - https://stackoverflow.com/questions/2912231/is-there-a-clever-way-to-pass-the-key-to-defaultdicts-default-factory - """ - - def __missing__(self, key): - ret = self[key] = self.default_factory(key) # pylint: disable=E1102 - return ret - - -@dataclass -class QMDevice(Instrument): - """Abstract class for an individual Quantum Machines devices.""" - - name: str - """Name of the device.""" - - outputs: dict[int, QMOutput] = field(init=False) - """Dictionary containing the instrument's output ports.""" - inputs: dict[int, QMInput] = field(init=False) - """Dictionary containing the instrument's input ports.""" - - def ports(self, number, output=True): - """Provides instrument's ports to the user. - - Args: - number (int): Port number. - Can be 1 to 10 for :class:`qibolab.instruments.qm.devices.OPXplus` - and 1 to 5 for :class:`qibolab.instruments.qm.devices.Octave`. - output (bool): ``True`` for obtaining an output port, otherwise an - input port is returned. Default is ``True``. - """ - ports_ = self.outputs if output else self.inputs - return ports_[number] - - def connect(self): - """Only applicable for - :class:`qibolab.instruments.qm.controller.QMController`, not individual - devices.""" - - def setup(self, **kwargs): - for name, settings in kwargs.items(): - number = int(name[1:]) - if name[0] == "o": - self.outputs[number].setup(**settings) - elif name[0] == "i": - self.inputs[number].setup(**settings) - else: - raise ValueError( - f"Invalid port name {name} in instrument settings for {self.name}." - ) - - def disconnect(self): - """Only applicable for - :class:`qibolab.instruments.qm.controller.QMController`, not individual - devices.""" - - def dump(self): - """Serializes device settings to a dictionary for dumping to the - runcard YAML.""" - ports = chain(self.outputs.values(), self.inputs.values()) - return {port.name: port.settings for port in ports if len(port.settings) > 0} - - -@dataclass -class OPXplus(QMDevice): - """Device handling OPX+ controllers.""" - - def __post_init__(self): - self.outputs = PortsDefaultdict(lambda n: OPXOutput(self.name, n)) - self.inputs = PortsDefaultdict(lambda n: OPXInput(self.name, n)) - - -@dataclass -class Octave(QMDevice): - """Device handling Octaves.""" - - port: int - """Network port of the Octave in the cluster configuration.""" - connectivity: OPXplus - """OPXplus that acts as the waveform generator for the Octave.""" - - def __post_init__(self): - self.outputs = PortsDefaultdict(lambda n: OctaveOutput(self.name, n)) - self.inputs = PortsDefaultdict(lambda n: OctaveInput(self.name, n)) - - def ports(self, number, output=True): - """Provides Octave ports. - - Extension of the abstract :meth:`qibolab.instruments.qm.devices.QMDevice.ports` - because Octave ports are used for mixing two existing (I, Q) OPX+ ports. - """ - port = super().ports(number, output) - if port.opx_port is None: - iport = self.connectivity.ports(2 * number - 1, output) - qport = self.connectivity.ports(2 * number, output) - port.opx_port = OPXIQ(iport, qport) - return port diff --git a/src/qibolab/instruments/qm/octave.py b/src/qibolab/instruments/qm/octave.py new file mode 100644 index 0000000000..049c663095 --- /dev/null +++ b/src/qibolab/instruments/qm/octave.py @@ -0,0 +1,13 @@ +from dataclasses import dataclass + + +@dataclass(frozen=True) +class Octave: + """Device handling Octaves.""" + + name: str + """Name of the device.""" + port: int + """Network port of the Octave in the cluster configuration.""" + connectivity: str + """OPXplus that acts as the waveform generator for the Octave.""" diff --git a/src/qibolab/instruments/qm/ports.py b/src/qibolab/instruments/qm/ports.py deleted file mode 100644 index 090ddb83dc..0000000000 --- a/src/qibolab/instruments/qm/ports.py +++ /dev/null @@ -1,196 +0,0 @@ -from dataclasses import dataclass, field, fields -from typing import ClassVar, Optional, Union - -DIGITAL_DELAY = 57 -DIGITAL_BUFFER = 18 -"""Default calibration parameters for digital pulses. - -https://docs.quantum-machines.co/1.1.7/qm-qua-sdk/docs/Guides/octave/#calibrating-the-digital-pulse - -Digital markers are used for LO triggering. -""" - - -@dataclass -class QMPort: - """Abstract representation of Quantum Machine instrument ports. - - Contains the ports settings for each device. - """ - - device: str - """Name of the device holding this port.""" - number: int - """Number of this port in the device.""" - - key: ClassVar[Optional[str]] = None - """Key corresponding to this port type in the Quantum Machines config. - - Used in :meth:`qibolab.instruments.qm.config.QMConfig.register_port`. - """ - - @property - def pair(self): - """Representation of the port in the Quantum Machines config.""" - return (self.device, self.number) - - def setup(self, **kwargs): - """Updates port settings.""" - for name, value in kwargs.items(): - if not hasattr(self, name): - raise KeyError(f"Unknown port setting {name}.") - setattr(self, name, value) - - @property - def settings(self): - """Serialization of the port settings to dump in the runcard YAML. - - Only fields that provide the ``metadata['settings']`` flag are dumped - in the serialization. - """ - return { - fld.name: getattr(self, fld.name) - for fld in fields(self) - if fld.metadata.get("settings", False) - } - - @property - def config(self): - """Port settings in the format of the Quantum Machines config. - - Field ``metadata['config']`` are used to translate qibolab port setting names - to the corresponding Quantum Machine config properties. - """ - data = {} - for fld in fields(self): - if "config" in fld.metadata: - data[fld.metadata["config"]] = getattr(self, fld.name) - return {self.number: data} - - -class QMOutput(QMPort): - """Abstract Quantum Machines output port.""" - - @property - def name(self): - """Name of the port when dumping instrument settings on the runcard - YAML.""" - return f"o{self.number}" - - -class QMInput(QMPort): - """Abstract Quantum Machines input port.""" - - @property - def name(self): - """Name of the port when dumping instrument settings on the runcard - YAML.""" - return f"i{self.number}" - - -@dataclass -class OPXOutput(QMOutput): - key: ClassVar[str] = "analog_outputs" - - offset: float = field(default=0.0, metadata={"config": "offset"}) - """Constant voltage to be applied on the output.""" - filter: dict[str, float] = field( - default_factory=dict, metadata={"config": "filter", "settings": True} - ) - """FIR and IIR filters to be applied to correct signal distortions.""" - - @property - def settings(self): - """OPX+ output settings to be dumped to the runcard YAML. - - Filter is removed if empty to simplify the runcard. - """ - data = super().settings - if len(self.filter) == 0: - del data["filter"] - return data - - -@dataclass -class OPXInput(QMInput): - key: ClassVar[str] = "analog_inputs" - - offset: float = field(default=0.0, metadata={"config": "offset"}) - """Constant voltage to be applied on the output.""" - gain: int = field(default=0, metadata={"config": "gain_db", "settings": True}) - """Gain applied to amplify the input.""" - - -@dataclass -class OPXIQ: - """Pair of I-Q ports.""" - - i: Union[OPXOutput, OPXInput] - """Port implementing the I-component of the signal.""" - q: Union[OPXOutput, OPXInput] - """Port implementing the Q-component of the signal.""" - - -@dataclass -class OctaveOutput(QMOutput): - key: ClassVar[str] = "RF_outputs" - - lo_frequency: float = field( - default=0.0, metadata={"config": "LO_frequency", "settings": True} - ) - """Local oscillator frequency.""" - gain: int = field(default=0, metadata={"config": "gain", "settings": True}) - """Local oscillator gain. - - Can be in the range [-20 : 0.5 : 20] dB. - """ - lo_source: str = field(default="internal", metadata={"config": "LO_source"}) - """Local oscillator clock source. - - Can be external or internal. - """ - output_mode: str = field(default="triggered", metadata={"config": "output_mode"}) - """Can be: "always_on" / "always_off"/ "triggered" / "triggered_reversed".""" - digital_delay: int = DIGITAL_DELAY - """Delay for digital output channel.""" - digital_buffer: int = DIGITAL_BUFFER - """Buffer for digital output channel.""" - - opx_port: Optional[OPXOutput] = None - """OPX+ port that is connected to the Octave port.""" - - @property - def digital_inputs(self): - """Generates `digitalInputs` entry for elements in QM config. - - Digital markers are used to switch LOs on in triggered mode. - """ - opx = self.opx_port.i.device - number = self.opx_port.i.number - return { - "output_switch": { - "port": (opx, number), - "delay": self.digital_delay, - "buffer": self.digital_buffer, - } - } - - -@dataclass -class OctaveInput(QMInput): - key: ClassVar[str] = "RF_inputs" - - lo_frequency: float = field( - default=0.0, metadata={"config": "LO_frequency", "settings": True} - ) - """Local oscillator frequency.""" - lo_source: str = field(default="internal", metadata={"config": "LO_source"}) - """Local oscillator clock source. - - Can be external or internal. - """ - IF_mode_I: str = field(default="direct", metadata={"config": "IF_mode_I"}) - IF_mode_Q: str = field(default="direct", metadata={"config": "IF_mode_Q"}) - - opx_port: Optional[OPXIQ] = None - """OPX+ port that is connected to the Octave port.""" From 6a3d12122a7adf59c17a467d462ff6e3bc5b0306 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Sat, 13 Jul 2024 00:42:14 +0400 Subject: [PATCH 0440/1006] fix: rebase --- src/qibolab/compilers/default.py | 33 -------------------------------- 1 file changed, 33 deletions(-) diff --git a/src/qibolab/compilers/default.py b/src/qibolab/compilers/default.py index d899dd8d75..bf25bed70d 100644 --- a/src/qibolab/compilers/default.py +++ b/src/qibolab/compilers/default.py @@ -17,24 +17,16 @@ def identity_rule(gate, qubit): def z_rule(gate, qubit): """Z gate applied virtually.""" -<<<<<<< HEAD seq = PulseSequence() seq[qubit.drive.name].append(VirtualZ(phase=math.pi)) return seq -======= - return PulseSequence([VirtualZ(phase=math.pi)]) ->>>>>>> c5ef5a19 (remove channel and qubit properties from pulse) def rz_rule(gate, qubit): """RZ gate applied virtually.""" -<<<<<<< HEAD seq = PulseSequence() seq[qubit.drive.name].append(VirtualZ(phase=gate.parameters[0])) return seq -======= - return PulseSequence([VirtualZ(phase=gate.parameters[0])]) ->>>>>>> c5ef5a19 (remove channel and qubit properties from pulse) def gpi2_rule(gate, qubit): @@ -50,32 +42,7 @@ def gpi_rule(gate, qubit): # to the matrix representation. See # https://github.com/qiboteam/qibolab/pull/804#pullrequestreview-1890205509 # for more detail. -<<<<<<< HEAD return qubit.native_gates.RX.create_sequence(theta=np.pi, phi=gate.parameters[0]) -======= - pulse = replace(qubit.native_gates.RX, relative_phase=theta) - sequence = PulseSequence([pulse]) - return sequence - - -def u3_rule(gate, qubit): - """U3 applied as RZ-RX90-RZ-RX90-RZ.""" - # Transform gate to U3 and add pi/2-pulses - theta, phi, lam = gate.parameters - # apply RZ(lam) - virtual_z_phases = {qubit.name: lam} - sequence = PulseSequence() - sequence.append(VirtualZ(phase=lam)) - # Fetch pi/2 pulse from calibration and apply RX(pi/2) - sequence.append(qubit.native_gates.RX90) - # apply RZ(theta) - sequence.append(VirtualZ(phase=theta)) - # Fetch pi/2 pulse from calibration and apply RX(-pi/2) - sequence.append(replace(qubit.native_gates.RX90, relative_phase=-math.pi)) - # apply RZ(phi) - sequence.append(VirtualZ(phase=phi)) - return sequence ->>>>>>> c5ef5a19 (remove channel and qubit properties from pulse) def cz_rule(gate, pair): From 120900d01f7bc5350c61858187cabe4cc68475f6 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Sat, 13 Jul 2024 18:50:59 +0400 Subject: [PATCH 0441/1006] fix: imports --- src/qibolab/instruments/qm/__init__.py | 3 ++- src/qibolab/instruments/qm/controller.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/qibolab/instruments/qm/__init__.py b/src/qibolab/instruments/qm/__init__.py index 621f4cecab..80b836296e 100644 --- a/src/qibolab/instruments/qm/__init__.py +++ b/src/qibolab/instruments/qm/__init__.py @@ -1,2 +1,3 @@ -from .controller import QMController +from .components import * +from .controller import QmController from .octave import Octave diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 8240ccef2f..6d49f4cddd 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -70,7 +70,7 @@ def find_baking_pulses(sweepers): @dataclass -class QMController(Controller): +class QmController(Controller): """:class:`qibolab.instruments.abstract.Controller` object for controlling a Quantum Machines cluster. From 21409ff02946a1e97a1fd2ef5abe67caa700a988 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Sat, 13 Jul 2024 22:27:35 +0400 Subject: [PATCH 0442/1006] fix: fixes required to generate config with qw11q --- .../instruments/qm/components/configs.py | 4 +-- src/qibolab/instruments/qm/config.py | 8 +++--- src/qibolab/instruments/qm/controller.py | 27 +++++++++---------- src/qibolab/pulses/pulse.py | 24 ----------------- 4 files changed, 19 insertions(+), 44 deletions(-) diff --git a/src/qibolab/instruments/qm/components/configs.py b/src/qibolab/instruments/qm/components/configs.py index 32e19149c5..0d2ffb737f 100644 --- a/src/qibolab/instruments/qm/components/configs.py +++ b/src/qibolab/instruments/qm/components/configs.py @@ -1,4 +1,4 @@ -from dataclasses import dataclass +from dataclasses import dataclass, field from qibolab.components import AcquisitionConfig, DcConfig @@ -17,7 +17,7 @@ class OpxDcConfig(DcConfig): Possible values are -0.5V to 0.5V. """ - filter: dict[str, float] + filter: dict[str, float] = field(default_factory=dict) """FIR and IIR filters to be applied for correcting signal distortions. See diff --git a/src/qibolab/instruments/qm/config.py b/src/qibolab/instruments/qm/config.py index 5d24428606..add0ea592f 100644 --- a/src/qibolab/instruments/qm/config.py +++ b/src/qibolab/instruments/qm/config.py @@ -102,8 +102,8 @@ def register_octave_output( device: str, port: int, connectivity: str, - frequency: int = None, - power: int = None, + frequency: int, + power: int = 0, ): if device not in self.controllers: self.octaves[device] = { @@ -118,7 +118,7 @@ def register_octave_output( "output_mode": "triggered", } - def register_octave_input(self, device: str, port: int, frequency: int = None): + def register_octave_input(self, device: str, port: int, frequency: int): # assumes output is already registered self.octaves[device]["RF_inputs"][str(port)] = { "LO_frequency": frequency, @@ -183,7 +183,7 @@ def register_iq_element( "RF_inputs": {"port": (channel.device, channel.port)}, "digitalInputs": { "output_switch": { - "port": (opx, 2 * channel.device - 1), + "port": (opx, 2 * channel.port - 1), "delay": DIGITAL_DELAY, "buffer": DIGITAL_BUFFER, }, diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 6d49f4cddd..3a18d33aae 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -1,5 +1,6 @@ import shutil import tempfile +import warnings from collections import defaultdict from dataclasses import asdict, dataclass, field from pathlib import Path @@ -235,12 +236,8 @@ def configure_iq_line(self, channel: QmChannel, configs: dict[str, Config]): opx_i = 2 * channel.port - 1 opx_q = 2 * channel.port config = configs[channel.logical_channel.name] - self.config.register_opx_output( - opx, opx_i, digital_port=opx_i, offset=config.offset - ) - self.config.register_opx_output( - opx, opx_q, digital_port=opx_i, offset=config.offset - ) + self.config.register_opx_output(opx, opx_i, digital_port=opx_i) + self.config.register_opx_output(opx, opx_q, digital_port=opx_i) lo_config = configs[channel.logical_channel.lo] self.config.register_octave_output( @@ -259,12 +256,8 @@ def configure_acquire_line(self, channel: QmChannel, configs: dict[str, Config]) opx_i = 2 * channel.port - 1 opx_q = 2 * channel.port config = configs[logical_channel.name] - self.config.register_opx_input( - opx, opx_i, offset=config.offset, gain=config.gain - ) - self.config.register_opx_input( - opx, opx_q, offset=config.offset, gain=config.gain - ) + self.config.register_opx_input(opx, opx_i, gain=config.gain) + self.config.register_opx_input(opx, opx_q, gain=config.gain) measure_channel = self.channels[logical_channel.measure] lo_config = configs[measure_channel.logical_channel.lo] @@ -289,7 +282,7 @@ def configure_channel(self, channel, configs): self.channels[logical_channel.acquisition], configs ) - def register_pulses(self, sequence, configs, integration_setup, options): + def register_pulses(self, configs, sequence, integration_setup, options): """Translates a :class:`qibolab.pulses.PulseSequence` to :class:`qibolab.instruments.qm.instructions.Instructions`. @@ -389,14 +382,20 @@ def sweep(self, configs, sequences, options, integration_setup, *sweepers): list(sweepers), sequence, parameters, + configs, options.relaxation_time, - # self.config, ) # download acquisitions with qua.stream_processing(): for acquisition in acquisitions.values(): acquisition.download(*buffer_dims) + if self.manager is None: + warnings.warn( + "Not connected to Quantum Machines. Returning program and config." + ) + return {"program": experiment, "config": self.config.__dict__} + if self.script_file_name is not None: script = generate_qua_script(experiment, self.config.__dict__) for pulse in sequence: diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index c2b8259e95..e077610894 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -1,6 +1,5 @@ """Pulse class.""" -from dataclasses import fields from enum import Enum from typing import Union @@ -79,29 +78,6 @@ def envelopes(self, sampling_rate: float) -> IqWaveform: """A tuple with the i and q envelope waveforms of the pulse.""" return np.array([self.i(sampling_rate), self.q(sampling_rate)]) - def __hash__(self): - """Hash the content. - - .. warning:: - - unhashable attributes are not taken into account, so there will be more - clashes than those usually expected with a regular hash - - .. todo:: - - This method should be eventually dropped, and be provided automatically by - freezing the dataclass (i.e. setting ``frozen=true`` in the decorator). - However, at the moment is not possible nor desired, because it contains - unhashable attributes and because some instances are mutated inside Qibolab. - """ - return hash( - tuple( - getattr(self, f.name) - for f in fields(self) - if f.name not in ("type", "shape") - ) - ) - class Delay(Model): """A wait instruction during which we are not sending any pulses to the From 57dcea3a37cf72e64cfcaeaae22f2e24ca5617e5 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Sat, 13 Jul 2024 23:11:12 +0400 Subject: [PATCH 0443/1006] fix: QMConfig issues --- src/qibolab/instruments/qm/config.py | 6 +++--- src/qibolab/instruments/qm/controller.py | 8 ++++++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/qibolab/instruments/qm/config.py b/src/qibolab/instruments/qm/config.py index add0ea592f..5f8a57004f 100644 --- a/src/qibolab/instruments/qm/config.py +++ b/src/qibolab/instruments/qm/config.py @@ -9,7 +9,7 @@ SAMPLING_RATE = 1 """Sampling rate of Quantum Machines OPX in GSps.""" -DEFAULT_INPUTS = {1: {}, 2: {}} +DEFAULT_INPUTS = {"1": {}, "2": {}} """Default controller config section. Inputs are always registered to avoid issues with automatic mixer @@ -75,7 +75,7 @@ def register_opx_output( ): if device not in self.controllers: self.controllers[device] = { - "analog_inputs": DEFAULT_INPUTS, + "analog_inputs": dict(DEFAULT_INPUTS), "digital_outputs": {}, "analog_outputs": {}, } @@ -105,7 +105,7 @@ def register_octave_output( frequency: int, power: int = 0, ): - if device not in self.controllers: + if device not in self.octaves: self.octaves[device] = { "RF_outputs": {}, "connectivity": connectivity, diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 3a18d33aae..f31297c41f 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -13,7 +13,7 @@ from qualang_tools.simulator_tools import create_simulator_controller_connections from qibolab import AveragingMode -from qibolab.components import Config, DcChannel, IqChannel +from qibolab.components import AcquireChannel, Config, DcChannel, IqChannel from qibolab.instruments.abstract import Controller from qibolab.pulses import Delay, VirtualZ from qibolab.sweeper import Parameter @@ -241,7 +241,7 @@ def configure_iq_line(self, channel: QmChannel, configs: dict[str, Config]): lo_config = configs[channel.logical_channel.lo] self.config.register_octave_output( - channel.device, channel.port, opx, asdict(lo_config) + channel.device, channel.port, opx, **asdict(lo_config) ) intermediate_frequency = config.frequency - lo_config.frequency @@ -281,6 +281,10 @@ def configure_channel(self, channel, configs): self.configure_channel( self.channels[logical_channel.acquisition], configs ) + elif isinstance(logical_channel, AcquireChannel): + self.configure_acquire_line(channel, configs) + else: + raise TypeError(f"Unknown channel type: {type(channel)}.") def register_pulses(self, configs, sequence, integration_setup, options): """Translates a :class:`qibolab.pulses.PulseSequence` to From 3184e840a20ed85e9dcb0ee001f307c2c8cab688 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Sat, 13 Jul 2024 23:40:13 +0400 Subject: [PATCH 0444/1006] fix: pulse names in dumped qua_script --- src/qibolab/instruments/qm/controller.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index f31297c41f..8092e42f43 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -402,8 +402,9 @@ def sweep(self, configs, sequences, options, integration_setup, *sweepers): if self.script_file_name is not None: script = generate_qua_script(experiment, self.config.__dict__) - for pulse in sequence: - script = script.replace(operation(pulse), str(pulse)) + for pulses in sequence.values(): + for pulse in pulses: + script = script.replace(operation(pulse), str(pulse)) with open(self.script_file_name, "w") as file: file.write(script) From 759e4fc9f873b88e23e1adb2dc9264de16d09130 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Sat, 13 Jul 2024 23:47:58 +0400 Subject: [PATCH 0445/1006] chore: drop output --- src/qibolab/instruments/qm/components/channel.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/qibolab/instruments/qm/components/channel.py b/src/qibolab/instruments/qm/components/channel.py index 4775e663c9..015d2daf94 100644 --- a/src/qibolab/instruments/qm/components/channel.py +++ b/src/qibolab/instruments/qm/components/channel.py @@ -17,5 +17,3 @@ class QmChannel: """Name of the device.""" port: int """Number of port.""" - output: bool = True # FIXME: Probably not needed - """Distinguish output from input ports when they have the same numbers.""" From f61c37d6da5e2e0df37512149883b720459324ac Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 23 Jul 2024 19:47:49 +0300 Subject: [PATCH 0446/1006] fix: pylint --- src/qibolab/native.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/qibolab/native.py b/src/qibolab/native.py index 4239972f66..6815200314 100644 --- a/src/qibolab/native.py +++ b/src/qibolab/native.py @@ -88,8 +88,6 @@ class SingleQubitNatives: """Pulse to drive to qubit from state 1 to state 2.""" MZ: Optional[FixedSequenceFactory] = None """Measurement pulse.""" - CP: Optional[Pulse] = None - """Pulse to activate a coupler.""" @dataclass From f915db9fd17db9cab68194bdd466b3694a943683 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 23 Jul 2024 19:52:05 +0300 Subject: [PATCH 0447/1006] fix: QM tests --- tests/test_instruments_qm.py | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/tests/test_instruments_qm.py b/tests/test_instruments_qm.py index 62b3ef994b..736be3c604 100644 --- a/tests/test_instruments_qm.py +++ b/tests/test_instruments_qm.py @@ -5,10 +5,8 @@ from qm import qua from qibolab import AcquisitionType, ExecutionParameters, create_platform -from qibolab.instruments.qm import OPXplus, QMController -from qibolab.instruments.qm.acquisition import Acquisition, declare_acquisitions -from qibolab.instruments.qm.controller import controllers_config -from qibolab.instruments.qm.sequence import BakedPulse, QMPulse, Sequence +from qibolab.instruments.qm import QmController +from qibolab.instruments.qm.acquisition import Acquisition from qibolab.pulses import Pulse, PulseSequence, PulseType, Rectangular from qibolab.qubits import Qubit from qibolab.sweeper import Parameter, Sweeper @@ -168,7 +166,7 @@ def test_qmpulse_previous_and_next_flux(): def qmcontroller(): name = "test" address = "0.0.0.0:0" - return QMController(name, address, opxs=[OPXplus("con1")]) + return QmController(name, address) @pytest.mark.parametrize("offset", [0.0, 0.005]) @@ -212,12 +210,6 @@ def qmplatform(request): return create_platform(request.param) -def test_controllers_config(qmplatform): - config = controllers_config(list(qmplatform.qubits.values()), time_of_flight=30) - assert len(config.controllers) == 3 - assert len(config.elements) == 10 - - # TODO: Test connect/disconnect @@ -466,7 +458,7 @@ def test_qm_register_baked_pulse(qmplatform, duration): } -@patch("qibolab.instruments.qm.QMController.execute_program") +@patch("qibolab.instruments.qm.QmController.execute_program") def test_qm_qubit_spectroscopy(mocker, qmplatform): platform = qmplatform controller = platform.instruments["qm"] @@ -488,7 +480,7 @@ def test_qm_qubit_spectroscopy(mocker, qmplatform): result = controller.play(platform.qubits, platform.couplers, sequence, options) -@patch("qibolab.instruments.qm.QMController.execute_program") +@patch("qibolab.instruments.qm.QmController.execute_program") def test_qm_duration_sweeper(mocker, qmplatform): platform = qmplatform controller = platform.instruments["qm"] From 7d092397d7c3d8f0b7d775f651f47beec4106540 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Sat, 20 Jul 2024 15:50:01 +0300 Subject: [PATCH 0448/1006] feat: introduction of QmConfig entries --- .../instruments/qm/components/configs.py | 6 +- src/qibolab/instruments/qm/config/__init__.py | 1 + src/qibolab/instruments/qm/config/config.py | 65 ++++++++++ src/qibolab/instruments/qm/config/entries.py | 120 ++++++++++++++++++ 4 files changed, 189 insertions(+), 3 deletions(-) create mode 100644 src/qibolab/instruments/qm/config/__init__.py create mode 100644 src/qibolab/instruments/qm/config/config.py create mode 100644 src/qibolab/instruments/qm/config/entries.py diff --git a/src/qibolab/instruments/qm/components/configs.py b/src/qibolab/instruments/qm/components/configs.py index 0d2ffb737f..2f02670b8d 100644 --- a/src/qibolab/instruments/qm/components/configs.py +++ b/src/qibolab/instruments/qm/components/configs.py @@ -31,10 +31,10 @@ class OpxDcConfig(DcConfig): class QmAcquisitionConfig(AcquisitionConfig): """Acquisition config for QM OPX+.""" - gain: int + gain: int = 0 """Input gain in dB. Possible values are -12dB to 20dB in steps of 1dB. """ - # offset: float = 0.0 - # """Constant voltage to be applied on the input.""" + offset: float = 0.0 + """Constant voltage to be applied on the input.""" diff --git a/src/qibolab/instruments/qm/config/__init__.py b/src/qibolab/instruments/qm/config/__init__.py new file mode 100644 index 0000000000..82b93bd54e --- /dev/null +++ b/src/qibolab/instruments/qm/config/__init__.py @@ -0,0 +1 @@ +from .config import QmConfig diff --git a/src/qibolab/instruments/qm/config/config.py b/src/qibolab/instruments/qm/config/config.py new file mode 100644 index 0000000000..67fa645d1d --- /dev/null +++ b/src/qibolab/instruments/qm/config/config.py @@ -0,0 +1,65 @@ +from dataclasses import asdict, dataclass, field + + +@dataclass +class QmConfig: + """Configuration for communicating with the ``QuantumMachinesManager``.""" + + version: int = 1 + controllers: dict[str, Controller] = field(default_factory=dict) + octaves: dict[str, Octave] = field(default_factory=dict) + elements: dict[str, Element] = field(default_factory=dict) + pulses: dict = field(default_factory=dict) + waveforms: dict = field(default_factory=dict) + digital_waveforms: dict = field( + default_factory=lambda: {"ON": {"samples": [(1, 0)]}} + ) + integration_weights: dict = field(default_factory=dict) + mixers: dict = field(default_factory=dict) + + def add_controller(self, device: str): + if device not in self.controllers: + self.controllers[device] = Controller() + + def add_octave(self, device: str, port: str, connectivity: str): + if device not in self.octaves: + self.add_controller(connectivity) + self.octaves[device] = Octave(connectivity) + + def configure_dc_line(self, channel: QmChannel, config: OpxDcConfig): + self.controllers[channel.device][str(channel.port)] = asdict(config) + self.elements[channel.logical_channel.name] = DcElement( + { + "port": (channel.device, channel.port), + } + ) + + def configure_iq_line( + self, channel: QmChannel, config: IqConfig, lo_config: OscillatorConfig + ): + octave = self.octaves[channel.device] + octave.add(channel.port, OctaveOuput.from_config(lo_config)) + + intermediate_frequency = config.frequency - lo_config.frequency + self.elements[channel.logical_channel.name] = RfElement( + Input((channel.device, channel.port)), + DigitalInput(OutputSwitch((opx, opx_i))), + intermediate_frequency, + ) + + def configure_acquire_line( + self, + channel: QmChannel, + config: QmAcquisitionConfig, + lo_config: OscillatorConfig, + ): + octave = self.octaves[channel.device] + octave.add(channel.port, OctaveOuput.from_config(lo_config)) + octave.add(channel.port, OctaveInput(lo_config.frequency)) + + intermediate_frequency = config.frequency - lo_config.frequency + self.elements[channel.logical_channel.name] = AcquireElement( + Input((channel.device, channel.port)), + DigitalInput(OutputSwitch((opx, opx_i))), + intermediate_frequency, + ) diff --git a/src/qibolab/instruments/qm/config/entries.py b/src/qibolab/instruments/qm/config/entries.py new file mode 100644 index 0000000000..4089c8182e --- /dev/null +++ b/src/qibolab/instruments/qm/config/entries.py @@ -0,0 +1,120 @@ +from dataclasses import dataclass, field + +from ..components import OpxDcConfig + +AnalogOutput = OpxDcConfig + + +@dataclass(frozen=True) +class AnalogInput: + offset: float = 0.0 + gain_db: int = 0 + + +DigitalOutput = dict + + +@dataclass +class Controller: + analog_outputs: dict[str, dict[str, AnalogOutput]] = field(default_factory=dict) + digital_outputs: dict[str, dict] = field(default_factory=dict) + analog_inputs: dict[str, dict[str, AnalogInput]] = field(default_factory=dict) + + def add(self, port, config): + if isinstance(config, AnalogOutput): + self.analog_outputs[str(port)] = config + elif isinstance(config, DigitalOutput): + self.digital_outputs[str(port)] = config + elif isinstance(config, AnalogInput): + self.analog_inputs[str(port)] = config + else: + raise TypeError + + +@dataclass +class OctaveOuput: + LO_frequency: int + gain: int = 0 + LO_source: str = "internal" + output_mode: str = "triggered" + + @classmethod + def from_config(cls, config: OscillatorConfig): + return cls( + LO_frequency=config.frequency, + gain=config.power, + ) + + +@dataclass +class OctaveInput: + LO_frequency: int + LO_source: str = "internal" + IF_mode_I: str = "direct" + IF_mode_Q: str = "direct" + + +@dataclass +class Octave: + connectivity: str + RF_outputs: dict[str, dict[str, OctaveOuput]] = field(default_factory=dict) + RF_inputs: dict[str, dict[str, OctaveInput]] = field(default_factory=dict) + + def add(self, port, config): + if isinstance(config, OctaveOuput): + self.RF_outputs[str(port)] = config + elif isinstance(config, OctaveInput): + self.RF_inputs[str(port)] = config + else: + raise TypeError + + +@dataclass +class Input: + port: tuple[str, int] + + +@dataclass +class Output: + port: tuple[str, int] + + +@dataclass +class OutputSwitch: + port: tuple[str, int] + delay: int = 57 + buffer: int = 18 + + +@dataclass +class DigitalInput: + output_switch: OutputSwitch + + +@dataclass +class DcElement: + singleInput: Input + intermediate_frequency: int = 0 + operations: dict[str, str] = field(default_factory=dict) + + +@dataclass +class RfElement: + RF_inputs: Input + digitalInputs: DigitalInput + intermediate_frequency: int + operations: dict[str, str] = field(default_factory=dict) + + +@dataclass +class AcquireElement: + RF_inputs: Input + RF_outputs: Output + digitalInputs: DigitalInput + intermediate_frequency: int + time_of_flight: int = 24 + smearing: int = 0 + operations: dict[str, str] = field(default_factory=dict) + + +Element = DcElement | RfElement | AcquireElement From 6d681564784a64b83baf5b56f73f70e2cea6efd8 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Mon, 22 Jul 2024 14:39:07 +0300 Subject: [PATCH 0449/1006] chore: split components --- .../instruments/qm/components/channel.py | 4 + .../instruments/qm/components/configs.py | 4 +- src/qibolab/instruments/qm/config/config.py | 50 ++++--- src/qibolab/instruments/qm/config/devices.py | 65 +++++++++ src/qibolab/instruments/qm/config/elements.py | 42 ++++++ src/qibolab/instruments/qm/config/entries.py | 120 ----------------- src/qibolab/instruments/qm/config/pulses.py | 0 src/qibolab/instruments/qm/controller.py | 127 +++++++----------- 8 files changed, 192 insertions(+), 220 deletions(-) create mode 100644 src/qibolab/instruments/qm/config/devices.py create mode 100644 src/qibolab/instruments/qm/config/elements.py delete mode 100644 src/qibolab/instruments/qm/config/entries.py create mode 100644 src/qibolab/instruments/qm/config/pulses.py diff --git a/src/qibolab/instruments/qm/components/channel.py b/src/qibolab/instruments/qm/components/channel.py index 015d2daf94..eb23e4952e 100644 --- a/src/qibolab/instruments/qm/components/channel.py +++ b/src/qibolab/instruments/qm/components/channel.py @@ -17,3 +17,7 @@ class QmChannel: """Name of the device.""" port: int """Number of port.""" + + @property + def serial(self): + return {"port": (self.device, self.port)} diff --git a/src/qibolab/instruments/qm/components/configs.py b/src/qibolab/instruments/qm/components/configs.py index 2f02670b8d..100d422fcc 100644 --- a/src/qibolab/instruments/qm/components/configs.py +++ b/src/qibolab/instruments/qm/components/configs.py @@ -3,13 +3,13 @@ from qibolab.components import AcquisitionConfig, DcConfig __all__ = [ - "OpxDcConfig", + "OpxOutputConfig", "QmAcquisitionConfig", ] @dataclass(frozen=True) -class OpxDcConfig(DcConfig): +class OpxOutputConfig(DcConfig): """DC channel config using QM OPX+.""" offset: float diff --git a/src/qibolab/instruments/qm/config/config.py b/src/qibolab/instruments/qm/config/config.py index 67fa645d1d..247ebdafcf 100644 --- a/src/qibolab/instruments/qm/config/config.py +++ b/src/qibolab/instruments/qm/config/config.py @@ -21,45 +21,55 @@ def add_controller(self, device: str): if device not in self.controllers: self.controllers[device] = Controller() - def add_octave(self, device: str, port: str, connectivity: str): + def add_octave(self, device: str, connectivity: str): if device not in self.octaves: self.add_controller(connectivity) self.octaves[device] = Octave(connectivity) def configure_dc_line(self, channel: QmChannel, config: OpxDcConfig): - self.controllers[channel.device][str(channel.port)] = asdict(config) - self.elements[channel.logical_channel.name] = DcElement( - { - "port": (channel.device, channel.port), - } - ) + controller = self.controllers[channel.device] + controller.analog_outputs[str(channel.port)] = asdict(config) + self.elements[channel.logical_channel.name] = DcElement(channel.serial) def configure_iq_line( self, channel: QmChannel, config: IqConfig, lo_config: OscillatorConfig ): + port = channel.port octave = self.octaves[channel.device] - octave.add(channel.port, OctaveOuput.from_config(lo_config)) + octave.RF_outputs[str(port)] = OctaveOuput.from_config(lo_config) + self.controllers[octave.connectivity].add_octave_output(port) intermediate_frequency = config.frequency - lo_config.frequency - self.elements[channel.logical_channel.name] = RfElement( - Input((channel.device, channel.port)), - DigitalInput(OutputSwitch((opx, opx_i))), + self.elements[channel.logical_channel.name] = RfOctaveElement( + channel.serial, + output_switch(octave.connectivity, channel.port), intermediate_frequency, ) def configure_acquire_line( self, - channel: QmChannel, - config: QmAcquisitionConfig, + acquire_channel: QmChannel, + probe_channel: QmChannel, + acquire_config: QmAcquisitionConfig, + probe_config: IqConfig, lo_config: OscillatorConfig, ): - octave = self.octaves[channel.device] - octave.add(channel.port, OctaveOuput.from_config(lo_config)) - octave.add(channel.port, OctaveInput(lo_config.frequency)) + port = acquire_channel.port + octave = self.octaves[acquire_channel.device] + octave.RF_inputs[str(port)] = OctaveInput(lo_config.frequency) + self.controllers[octave.connectivity].add_octave_input(port, config) - intermediate_frequency = config.frequency - lo_config.frequency - self.elements[channel.logical_channel.name] = AcquireElement( - Input((channel.device, channel.port)), - DigitalInput(OutputSwitch((opx, opx_i))), + port = probe_channel.port + octave = self.octaves[probe_channel.device] + octave.RF_outputs[str(port)] = OctaveOuput.from_config(lo_config) + self.controllers[octave.connectivity].add_octave_output(port) + + intermediate_frequency = probe_config.frequency - lo_config.frequency + self.elements[channel.logical_channel.name] = RfOctaveElement( + probe_channel.serial, + acquire_channel.serial, + output_switch(octave.connectivity, probe_channel.port), intermediate_frequency, + time_of_flight=acquire_config.delay, + smearing=acquire_config.smearing, ) diff --git a/src/qibolab/instruments/qm/config/devices.py b/src/qibolab/instruments/qm/config/devices.py new file mode 100644 index 0000000000..f32a87e129 --- /dev/null +++ b/src/qibolab/instruments/qm/config/devices.py @@ -0,0 +1,65 @@ +from dataclasses import dataclass, field + +from ..components import OpxOutputConfig + + +@dataclass(frozen=True) +class AnalogInput: + offset: float = 0.0 + gain_db: int = 0 + + @classmethod + def from_config(cls, config: QmAcquisitionConfig): + return cls( + offset=config.offset, + gain_db=config.gain, + ) + + +@dataclass(frozen=True) +class OctaveOuput: + LO_frequency: int + gain: int = 0 + LO_source: str = "internal" + output_mode: str = "triggered" + + @classmethod + def from_config(cls, config: OscillatorConfig): + return cls( + LO_frequency=config.frequency, + gain=config.power, + ) + + +@dataclass(frozen=True) +class OctaveInput: + LO_frequency: int + LO_source: str = "internal" + IF_mode_I: str = "direct" + IF_mode_Q: str = "direct" + + +@dataclass +class Controller: + analog_outputs: dict[str, dict[str, OpxOutputConfig]] = field(default_factory=dict) + digital_outputs: dict[str, dict[str, dict]] = field(default_factory=dict) + analog_inputs: dict[str, dict[str, AnalogInput]] = field(default_factory=dict) + + def add_octave_output(self, port: int): + # TODO: Add offset here? + self.analog_outputs[str(2 * port - 1)] = OpxOutputConfig() + self.analog_outputs[str(2 * port)] = OpxOutputConfig() + + self.digital_outputs[str(2 * port - 1)] = {} + + def add_octave_input(self, port: int, config: QmAcquisitionConfig): + self.analog_inputs[str(2 * port - 1)] = self.analog_inputs[str(2 * port)] = ( + AnalogInput.from_config(config) + ) + + +@dataclass +class Octave: + connectivity: str + RF_outputs: dict[str, dict[str, OctaveOuput]] = field(default_factory=dict) + RF_inputs: dict[str, dict[str, OctaveInput]] = field(default_factory=dict) diff --git a/src/qibolab/instruments/qm/config/elements.py b/src/qibolab/instruments/qm/config/elements.py new file mode 100644 index 0000000000..3bab5a1d23 --- /dev/null +++ b/src/qibolab/instruments/qm/config/elements.py @@ -0,0 +1,42 @@ +from dataclasses import dataclass, field + + +@dataclass(frozen=True) +class OutputSwitch: + port: tuple[str, int] + delay: int = 57 + buffer: int = 18 + + +def output_switch(opx: str, port: int): + """Create output switch section.""" + return {"output_switch": OutputSwitch((opx, 2 * port - 1))} + + +@dataclass +class DcElement: + singleInput: dict[str, tuple[str, int]] + intermediate_frequency: int = 0 + operations: dict[str, str] = field(default_factory=dict) + + +@dataclass +class RfOctaveElement: + RF_inputs: dict[str, tuple[str, int]] + digitalInputs: dict[str, OutputSwitch] + intermediate_frequency: int + operations: dict[str, str] = field(default_factory=dict) + + +@dataclass +class AcquireOctaveElement: + RF_inputs: dict[str, tuple[str, int]] + RF_outputs: dict[str, tuple[str, int]] + digitalInputs: dict[str, OutputSwitch] + intermediate_frequency: int + time_of_flight: int = 24 + smearing: int = 0 + operations: dict[str, str] = field(default_factory=dict) + + +Element = DcElement | RfElement | AcquireElement diff --git a/src/qibolab/instruments/qm/config/entries.py b/src/qibolab/instruments/qm/config/entries.py deleted file mode 100644 index 4089c8182e..0000000000 --- a/src/qibolab/instruments/qm/config/entries.py +++ /dev/null @@ -1,120 +0,0 @@ -from dataclasses import dataclass, field - -from ..components import OpxDcConfig - -AnalogOutput = OpxDcConfig - - -@dataclass(frozen=True) -class AnalogInput: - offset: float = 0.0 - gain_db: int = 0 - - -DigitalOutput = dict - - -@dataclass -class Controller: - analog_outputs: dict[str, dict[str, AnalogOutput]] = field(default_factory=dict) - digital_outputs: dict[str, dict] = field(default_factory=dict) - analog_inputs: dict[str, dict[str, AnalogInput]] = field(default_factory=dict) - - def add(self, port, config): - if isinstance(config, AnalogOutput): - self.analog_outputs[str(port)] = config - elif isinstance(config, DigitalOutput): - self.digital_outputs[str(port)] = config - elif isinstance(config, AnalogInput): - self.analog_inputs[str(port)] = config - else: - raise TypeError - - -@dataclass -class OctaveOuput: - LO_frequency: int - gain: int = 0 - LO_source: str = "internal" - output_mode: str = "triggered" - - @classmethod - def from_config(cls, config: OscillatorConfig): - return cls( - LO_frequency=config.frequency, - gain=config.power, - ) - - -@dataclass -class OctaveInput: - LO_frequency: int - LO_source: str = "internal" - IF_mode_I: str = "direct" - IF_mode_Q: str = "direct" - - -@dataclass -class Octave: - connectivity: str - RF_outputs: dict[str, dict[str, OctaveOuput]] = field(default_factory=dict) - RF_inputs: dict[str, dict[str, OctaveInput]] = field(default_factory=dict) - - def add(self, port, config): - if isinstance(config, OctaveOuput): - self.RF_outputs[str(port)] = config - elif isinstance(config, OctaveInput): - self.RF_inputs[str(port)] = config - else: - raise TypeError - - -@dataclass -class Input: - port: tuple[str, int] - - -@dataclass -class Output: - port: tuple[str, int] - - -@dataclass -class OutputSwitch: - port: tuple[str, int] - delay: int = 57 - buffer: int = 18 - - -@dataclass -class DigitalInput: - output_switch: OutputSwitch - - -@dataclass -class DcElement: - singleInput: Input - intermediate_frequency: int = 0 - operations: dict[str, str] = field(default_factory=dict) - - -@dataclass -class RfElement: - RF_inputs: Input - digitalInputs: DigitalInput - intermediate_frequency: int - operations: dict[str, str] = field(default_factory=dict) - - -@dataclass -class AcquireElement: - RF_inputs: Input - RF_outputs: Output - digitalInputs: DigitalInput - intermediate_frequency: int - time_of_flight: int = 24 - smearing: int = 0 - operations: dict[str, str] = field(default_factory=dict) - - -Element = DcElement | RfElement | AcquireElement diff --git a/src/qibolab/instruments/qm/config/pulses.py b/src/qibolab/instruments/qm/config/pulses.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 8092e42f43..b06a57d544 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -2,7 +2,7 @@ import tempfile import warnings from collections import defaultdict -from dataclasses import asdict, dataclass, field +from dataclasses import dataclass, field from pathlib import Path from typing import Optional @@ -13,7 +13,7 @@ from qualang_tools.simulator_tools import create_simulator_controller_connections from qibolab import AveragingMode -from qibolab.components import AcquireChannel, Config, DcChannel, IqChannel +from qibolab.components import Config, DcChannel, IqChannel from qibolab.instruments.abstract import Controller from qibolab.pulses import Delay, VirtualZ from qibolab.sweeper import Parameter @@ -200,89 +200,37 @@ def disconnect(self): self.manager.close() self.is_connected = False - def execute_program(self, program): - """Executes an arbitrary program written in QUA language. - - Args: - program: QUA program. - """ - machine = self.manager.open_qm(self.config.__dict__) - return machine.execute(program) - - def simulate_program(self, program): - """Simulates an arbitrary program written in QUA language. - - Args: - program: QUA program. - """ - ncontrollers = len(self.config.controllers) - controller_connections = create_simulator_controller_connections(ncontrollers) - simulation_config = SimulationConfig( - duration=self.simulation_duration, - controller_connections=controller_connections, - ) - return self.manager.simulate(self.config.__dict__, program, simulation_config) - - def configure_dc_line(self, channel: QmChannel, configs: dict[str, Config]): - config = configs[channel.logical_channel.name] - self.config.register_opx_output( - channel.device, channel.port, digital_port=None, **asdict(config) - ) - self.config.register_dc_element(channel) - - def configure_iq_line(self, channel: QmChannel, configs: dict[str, Config]): - if "octave" in channel.device: - opx = self.octaves[channel.device].connectivity - opx_i = 2 * channel.port - 1 - opx_q = 2 * channel.port - config = configs[channel.logical_channel.name] - self.config.register_opx_output(opx, opx_i, digital_port=opx_i) - self.config.register_opx_output(opx, opx_q, digital_port=opx_i) - - lo_config = configs[channel.logical_channel.lo] - self.config.register_octave_output( - channel.device, channel.port, opx, **asdict(lo_config) - ) - - intermediate_frequency = config.frequency - lo_config.frequency - self.config.register_iq_element(channel, intermediate_frequency, opx) + def configure_device(self, device: str): + if "octave" in device: + self.config.add_octave(device, self.octaves[device].connectivity) else: - raise NotImplementedError + self.config.add_controller(device) - def configure_acquire_line(self, channel: QmChannel, configs: dict[str, Config]): + def configure_channel(self, channel: QmChannel, configs: dict[str, Config]): logical_channel = channel.logical_channel - if "octave" in channel.device: - opx = self.octaves[channel.device].connectivity - opx_i = 2 * channel.port - 1 - opx_q = 2 * channel.port - config = configs[logical_channel.name] - self.config.register_opx_input(opx, opx_i, gain=config.gain) - self.config.register_opx_input(opx, opx_q, gain=config.gain) - - measure_channel = self.channels[logical_channel.measure] - lo_config = configs[measure_channel.logical_channel.lo] - self.config.register_octave_input( - channel.device, channel.port, lo_config.frequency - ) - - self.config.register_acquire_element( - channel, time_of_flight=config.delay, smearing=config.smearing - ) - else: - raise NotImplementedError + channel_config = configs[logical_channel.name] + self.configure_device(channel.device) - def configure_channel(self, channel, configs): - logical_channel = channel.logical_channel if isinstance(logical_channel, DcChannel): - self.configure_dc_line(channel, configs) + self.config.configure_dc_line(channel, channel_config) + elif isinstance(logical_channel, IqChannel): - self.configure_iq_line(channel, configs) - if logical_channel.acquisition is not None: - self.configure_channel( - self.channels[logical_channel.acquisition], configs + lo_config = configs[logical_channel.lo] + if logical_channel.acquisition is None: + self.config.configure_iq_line(channel, channel_config, lo_config) + + else: + acquisition = logical_channel.acquisition + acquire_channel = self.channels[acquisition] + self.configure_device(config, acquire_channel.device) + self.config.configure_acquire_line( + acquire_channel, + channel, + configs[acquisition], + channel_config, + lo_config, ) - elif isinstance(logical_channel, AcquireChannel): - self.configure_acquire_line(channel, configs) + else: raise TypeError(f"Unknown channel type: {type(channel)}.") @@ -348,6 +296,29 @@ def register_pulses(self, configs, sequence, integration_setup, options): return acquisitions, parameters + def execute_program(self, program): + """Executes an arbitrary program written in QUA language. + + Args: + program: QUA program. + """ + machine = self.manager.open_qm(self.config.__dict__) + return machine.execute(program) + + def simulate_program(self, program): + """Simulates an arbitrary program written in QUA language. + + Args: + program: QUA program. + """ + ncontrollers = len(self.config.controllers) + controller_connections = create_simulator_controller_connections(ncontrollers) + simulation_config = SimulationConfig( + duration=self.simulation_duration, + controller_connections=controller_connections, + ) + return self.manager.simulate(self.config.__dict__, program, simulation_config) + def play(self, configs, sequences, options, integration_setup): return self.sweep(configs, sequences, options, integration_setup) From f5511bd27c2f5c373ee0d44809fc0c362517f53d Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Mon, 22 Jul 2024 18:05:28 +0300 Subject: [PATCH 0450/1006] chore: implement pulses and remove old QMConfig --- src/qibolab/instruments/qm/config.py | 387 ------------------ src/qibolab/instruments/qm/config/__init__.py | 1 - src/qibolab/instruments/qm/config/config.py | 46 ++- src/qibolab/instruments/qm/config/devices.py | 23 +- src/qibolab/instruments/qm/config/elements.py | 27 ++ src/qibolab/instruments/qm/config/pulses.py | 129 ++++++ src/qibolab/instruments/qm/controller.py | 12 +- 7 files changed, 224 insertions(+), 401 deletions(-) delete mode 100644 src/qibolab/instruments/qm/config.py diff --git a/src/qibolab/instruments/qm/config.py b/src/qibolab/instruments/qm/config.py deleted file mode 100644 index 5f8a57004f..0000000000 --- a/src/qibolab/instruments/qm/config.py +++ /dev/null @@ -1,387 +0,0 @@ -from dataclasses import dataclass, field - -import numpy as np - -from qibolab.pulses import PulseType, Rectangular - -from .components import QmChannel - -SAMPLING_RATE = 1 -"""Sampling rate of Quantum Machines OPX in GSps.""" - -DEFAULT_INPUTS = {"1": {}, "2": {}} -"""Default controller config section. - -Inputs are always registered to avoid issues with automatic mixer -calibration when using Octaves. -""" -DIGITAL_DELAY = 57 -DIGITAL_BUFFER = 18 -"""Default calibration parameters for digital pulses. - -https://docs.quantum-machines.co/1.1.7/qm-qua-sdk/docs/Guides/octave/#calibrating-the-digital-pulse - -Digital markers are used for LO triggering. -""" - - -def iq_imbalance(g, phi): - """Creates the correction matrix for the mixer imbalance caused by the gain - and phase imbalances. - - More information here: - https://docs.qualang.io/libs/examples/mixer-calibration/#non-ideal-mixer - - Args: - g (float): relative gain imbalance between the I & Q ports (unit-less). - Set to 0 for no gain imbalance. - phi (float): relative phase imbalance between the I & Q ports (radians). - Set to 0 for no phase imbalance. - """ - c = np.cos(phi) - s = np.sin(phi) - N = 1 / ((1 - g**2) * (2 * c**2 - 1)) - return [float(N * x) for x in [(1 - g) * c, (1 + g) * s, (1 - g) * s, (1 + g) * c]] - - -def operation(pulse): - """Generate operation name in QM ``config`` for the given pulse.""" - return str(hash(pulse)) - - -@dataclass -class QMConfig: - """Configuration for communicating with the ``QuantumMachinesManager``.""" - - version: int = 1 - controllers: dict = field(default_factory=dict) - octaves: dict = field(default_factory=dict) - elements: dict = field(default_factory=dict) - pulses: dict = field(default_factory=dict) - waveforms: dict = field(default_factory=dict) - digital_waveforms: dict = field( - default_factory=lambda: {"ON": {"samples": [(1, 0)]}} - ) - integration_weights: dict = field(default_factory=dict) - mixers: dict = field(default_factory=dict) - - def register_opx_output( - self, - device: str, - port: int, - digital_port: int = None, - offset: float = 0.0, - filter: dict[str, float] = None, - ): - if device not in self.controllers: - self.controllers[device] = { - "analog_inputs": dict(DEFAULT_INPUTS), - "digital_outputs": {}, - "analog_outputs": {}, - } - - if digital_port is not None: - self.controllers[device]["digital_outputs"][str(digital_port)] = {} - - self.controllers[device]["analog_outputs"][str(port)] = { - "offset": offset, - "filter": filter if filter is not None else {}, - } - - def register_opx_input( - self, device: str, port: int, offset: float = 0.0, gain: int = 0 - ): - # assumes output is already registered - self.controllers[device]["analog_inputs"][str(port)] = { - "offset": offset, - "gain_db": gain, - } - - def register_octave_output( - self, - device: str, - port: int, - connectivity: str, - frequency: int, - power: int = 0, - ): - if device not in self.octaves: - self.octaves[device] = { - "RF_outputs": {}, - "connectivity": connectivity, - "RF_inputs": {}, - } - self.octaves[device]["RF_outputs"][str(port)] = { - "LO_frequency": frequency, - "gain": power, - "LO_source": "internal", - "output_mode": "triggered", - } - - def register_octave_input(self, device: str, port: int, frequency: int): - # assumes output is already registered - self.octaves[device]["RF_inputs"][str(port)] = { - "LO_frequency": frequency, - "LO_source": "internal", - "IF_mode_I": "direct", - "IF_mode_Q": "direct", - } - - def register_dc_element(self, channel: QmChannel): - """Register qubit flux elements and controllers in the QM config. - - Args: - qubit (:class:`qibolab.platforms.utils.Qubit`): Qubit to add elements for. - intermediate_frequency (int): Intermediate frequency that the OPX - will send to this qubit. This frequency will be mixed with the - LO connected to the same channel. - """ - element = channel.logical_channel.name - self.elements[element] = { - "singleInput": { - "port": (channel.device, channel.port), - }, - "intermediate_frequency": 0, - "operations": {}, - } - - def register_iq_element( - self, channel: QmChannel, intermediate_frequency=0, opx=None - ): - """Register qubit drive elements and controllers in the QM config. - - Args: - qubit (:class:`qibolab.platforms.utils.Qubit`): Qubit to add elements for. - intermediate_frequency (int): Intermediate frequency that the OPX - will send to this qubit. This frequency will be mixed with the - LO connected to the same channel. - """ - element = channel.logical_channel.name - if False: - # if isinstance(qubit.drive.port, OPXIQ): - raise NotImplementedError - # lo_frequency = math.floor(qubit.drive.lo_frequency) - # self.elements[element] = { - # "mixInputs": { - # "I": qubit.drive.port.i.pair, - # "Q": qubit.drive.port.q.pair, - # "lo_frequency": lo_frequency, - # "mixer": f"mixer_drive{qubit.name}", - # }, - # } - # drive_g = qubit.mixer_drive_g - # drive_phi = qubit.mixer_drive_phi - # self.mixers[f"mixer_drive{qubit.name}"] = [ - # { - # "intermediate_frequency": intermediate_frequency, - # "lo_frequency": lo_frequency, - # "correction": iq_imbalance(drive_g, drive_phi), - # } - # ] - else: - self.elements[element] = { - "RF_inputs": {"port": (channel.device, channel.port)}, - "digitalInputs": { - "output_switch": { - "port": (opx, 2 * channel.port - 1), - "delay": DIGITAL_DELAY, - "buffer": DIGITAL_BUFFER, - }, - }, - } - self.elements[element].update( - { - "intermediate_frequency": intermediate_frequency, - "operations": {}, - } - ) - - def register_acquire_element( - self, channel: QmChannel, time_of_flight=0, smearing=0 - ): - """Register resonator elements and controllers in the QM config. - - Args: - qubit (:class:`qibolab.platforms.utils.Qubit`): Qubit to add elements for. - intermediate_frequency (int): Intermediate frequency that the OPX - will send to this qubit. This frequency will be mixed with the - LO connected to the same channel. - """ - element = channel.logical_channel.measure - if False: - # if isinstance(qubit.readout.port, OPXIQ): - raise NotImplementedError - # lo_frequency = math.floor(qubit.readout.lo_frequency) - # self.elements[element] = { - # "mixInputs": { - # "I": qubit.readout.port.i.pair, - # "Q": qubit.readout.port.q.pair, - # "lo_frequency": lo_frequency, - # "mixer": f"mixer_readout{qubit.name}", - # }, - # "outputs": { - # "out1": qubit.feedback.port.i.pair, - # "out2": qubit.feedback.port.q.pair, - # }, - # } - # readout_g = qubit.mixer_readout_g - # readout_phi = qubit.mixer_readout_phi - # self.mixers[f"mixer_readout{qubit.name}"] = [ - # { - # "intermediate_frequency": intermediate_frequency, - # "lo_frequency": lo_frequency, - # "correction": iq_imbalance(readout_g, readout_phi), - # } - # ] - else: - self.elements[element]["RF_outputs"] = { - "port": (channel.device, channel.port) - } - - self.elements[element].update( - { - "time_of_flight": time_of_flight, - "smearing": smearing, - } - ) - - def register_iq_pulse(self, element, pulse): - op = operation(pulse) - serial_i = self.register_waveform(pulse, "i") - serial_q = self.register_waveform(pulse, "q") - self.pulses[op] = { - "operation": "control", - "length": pulse.duration, - "waveforms": {"I": serial_i, "Q": serial_q}, - "digital_marker": "ON", - } - # register drive pulse in elements - self.elements[element]["operations"][op] = op - - def register_dc_pulse(self, element, pulse): - op = operation(pulse) - serial = self.register_waveform(pulse) - self.pulses[op] = { - "operation": "control", - "length": pulse.duration, - "waveforms": { - "single": serial, - }, - } - # register flux pulse in elements - self.elements[element]["operations"][op] = op - - def register_acquisition_pulse(self, element, pulse, kernel=None): - """Registers pulse, waveforms and integration weights in QM config. - - Args: - qubit (:class:`qibolab.platforms.utils.Qubit`): Qubit that the pulse acts on. - pulse (:class:`qibolab.pulses.Pulse`): Pulse object to register. - - Returns: - element (str): Name of the element this pulse will be played on. - Elements are a part of the QM config and are generated during - instantiation of the Qubit objects. They are named as - "drive0", "drive1", "flux0", "readout0", ... - """ - op = operation(pulse) - serial_i = self.register_waveform(pulse, "i") - serial_q = self.register_waveform(pulse, "q") - self.register_integration_weights(element, pulse.duration, kernel) - self.pulses[op] = { - "operation": "measurement", - "length": pulse.duration, - "waveforms": { - "I": serial_i, - "Q": serial_q, - }, - "integration_weights": { - "cos": f"cosine_weights_{element}", - "sin": f"sine_weights_{element}", - "minus_sin": f"minus_sine_weights_{element}", - }, - "digital_marker": "ON", - } - # register readout pulse in elements - self.elements[element]["operations"][op] = op - return op - - def register_waveform(self, pulse, mode="i"): - """Registers waveforms in QM config. - - QM supports two kinds of waveforms, examples: - "zero_wf": {"type": "constant", "sample": 0.0} - "x90_wf": {"type": "arbitrary", "samples": x90_wf.tolist()} - - Args: - pulse (:class:`qibolab.pulses.Pulse`): Pulse object to read the waveform from. - mode (str): "i" or "q" specifying which channel the waveform will be played. - - Returns: - serial (str): String with a serialization of the waveform. - Used as key to identify the waveform in the config. - """ - # TODO: Remove this? - if pulse.type is PulseType.READOUT and mode == "q": - # Force zero q waveforms for readout - serial = "zero_wf" - if serial not in self.waveforms: - self.waveforms[serial] = {"type": "constant", "sample": 0.0} - return serial - - phase = (pulse.relative_phase % (2 * np.pi)) / (2 * np.pi) - serial = f"{hash(pulse)}_{mode}" - if isinstance(pulse.envelope, Rectangular): - if serial not in self.waveforms: - if mode == "i": - sample = pulse.amplitude * np.cos(phase) - else: - sample = pulse.amplitude * np.sin(phase) - self.waveforms[serial] = {"type": "constant", "sample": sample} - else: - if serial not in self.waveforms: - samples_i = pulse.i(SAMPLING_RATE) - samples_q = pulse.q(SAMPLING_RATE) - if mode == "i": - samples = samples_i * np.cos(phase) - samples_q * np.sin(phase) - else: - samples = samples_i * np.sin(phase) + samples_q * np.cos(phase) - self.waveforms[serial] = { - "type": "arbitrary", - "samples": samples.tolist(), - } - return serial - - def register_integration_weights(self, element, readout_len, kernel=None): - """Registers integration weights in QM config. - - Args: - qubit (:class:`qibolab.platforms.quantum_machines.Qubit`): Qubit - object that the integration weights will be used for. - readout_len (int): Duration of the readout pulse in ns. - """ - angle = 0 - cos, sin = np.cos(angle), np.sin(angle) - if kernel is None: - convert = lambda x: [(x, readout_len)] - else: - cos = kernel * cos - sin = kernel * sin - convert = lambda x: x - - self.integration_weights.update( - { - f"cosine_weights_{element}": { - "cosine": convert(cos), - "sine": convert(-sin), - }, - f"sine_weights_{element}": { - "cosine": convert(sin), - "sine": convert(cos), - }, - f"minus_sine_weights_{element}": { - "cosine": convert(-sin), - "sine": convert(-cos), - }, - } - ) diff --git a/src/qibolab/instruments/qm/config/__init__.py b/src/qibolab/instruments/qm/config/__init__.py index 82b93bd54e..e69de29bb2 100644 --- a/src/qibolab/instruments/qm/config/__init__.py +++ b/src/qibolab/instruments/qm/config/__init__.py @@ -1 +0,0 @@ -from .config import QmConfig diff --git a/src/qibolab/instruments/qm/config/config.py b/src/qibolab/instruments/qm/config/config.py index 247ebdafcf..2bb0ce64d6 100644 --- a/src/qibolab/instruments/qm/config/config.py +++ b/src/qibolab/instruments/qm/config/config.py @@ -1,4 +1,8 @@ -from dataclasses import asdict, dataclass, field +from dataclasses import dataclass, field + +from .devices import * +from .elements import * +from .pulses import * @dataclass @@ -9,8 +13,10 @@ class QmConfig: controllers: dict[str, Controller] = field(default_factory=dict) octaves: dict[str, Octave] = field(default_factory=dict) elements: dict[str, Element] = field(default_factory=dict) - pulses: dict = field(default_factory=dict) - waveforms: dict = field(default_factory=dict) + pulses: dict[str, QmPulse | QmAcquisition] = field(default_factory=dict) + waveforms: dict[str, ConstantWaveform | ArbitraryWaveform] = field( + default_factory=dict + ) digital_waveforms: dict = field( default_factory=lambda: {"ON": {"samples": [(1, 0)]}} ) @@ -28,7 +34,7 @@ def add_octave(self, device: str, connectivity: str): def configure_dc_line(self, channel: QmChannel, config: OpxDcConfig): controller = self.controllers[channel.device] - controller.analog_outputs[str(channel.port)] = asdict(config) + controller.analog_outputs[str(channel.port)] = config self.elements[channel.logical_channel.name] = DcElement(channel.serial) def configure_iq_line( @@ -65,7 +71,7 @@ def configure_acquire_line( self.controllers[octave.connectivity].add_octave_output(port) intermediate_frequency = probe_config.frequency - lo_config.frequency - self.elements[channel.logical_channel.name] = RfOctaveElement( + self.elements[channel.logical_channel.name] = AcquireOctaveElement( probe_channel.serial, acquire_channel.serial, output_switch(octave.connectivity, probe_channel.port), @@ -73,3 +79,33 @@ def configure_acquire_line( time_of_flight=acquire_config.delay, smearing=acquire_config.smearing, ) + + def register_iq_pulse(self, element: str, pulse: Pulse): + op = operation(pulse) + if op not in self.pulses: + self.pulses[op] = qmpulse = QmPulse.from_pulse(pulse) + self.elements[element].operations[op] = op + waveforms = waveforms_from_pulse(pulse) + for mode in ["I", "Q"]: + self.waveforms[qmpulse.waveforms[mode]] = waveforms[mode] + + def register_dc_pulse(self, element: str, pulse: Pulse): + op = operation(pulse) + if op not in self.pulses: + self.pulses[op] = qmpulse = QmPulse.from_dc_pulse(pulse) + self.elements[element].operations[op] = op + self.waveforms[qmpulse.waveforms["I"]] = waveforms_from_pulse(pulse)["I"] + + def register_acquisition_pulse(self, element: str, pulse: Pulse, kernel=None): + """Registers pulse, waveforms and integration weights in QM config.""" + op = operation(pulse) + if op not in self.pulses: + self.register_integration_weights(element, pulse.duration, kernel) + self.pulses[op] = qmpulse = QmAcquisition.from_pulse(pulse, element) + self.elements[element]["operations"][op] = op + waveforms = waveforms_from_pulse(pulse) + for mode in ["I", "Q"]: + self.waveforms[qmpulse.waveforms[mode]] = waveforms[mode] + self.integration_weights.update( + qmpulse.register_integration_weights(element, kernel) + ) diff --git a/src/qibolab/instruments/qm/config/devices.py b/src/qibolab/instruments/qm/config/devices.py index f32a87e129..9da8045bab 100644 --- a/src/qibolab/instruments/qm/config/devices.py +++ b/src/qibolab/instruments/qm/config/devices.py @@ -1,6 +1,23 @@ from dataclasses import dataclass, field -from ..components import OpxOutputConfig +from qibolab.components.configs import OscillatorConfig + +from ..components import OpxOutputConfig, QmAcquisitionConfig + +__all__ = [ + "OctaveOutput", + "OctaveInput", + "Controller", + "Octave", +] + + +DEFAULT_INPUTS = {"1": {}, "2": {}} +"""Default controller config section. + +Inputs are always registered to avoid issues with automatic mixer +calibration when using Octaves. +""" @dataclass(frozen=True) @@ -43,7 +60,9 @@ class OctaveInput: class Controller: analog_outputs: dict[str, dict[str, OpxOutputConfig]] = field(default_factory=dict) digital_outputs: dict[str, dict[str, dict]] = field(default_factory=dict) - analog_inputs: dict[str, dict[str, AnalogInput]] = field(default_factory=dict) + analog_inputs: dict[str, dict[str, AnalogInput]] = field( + default_factory=lambda: dict(DEFAULT_INPUTS) + ) def add_octave_output(self, port: int): # TODO: Add offset here? diff --git a/src/qibolab/instruments/qm/config/elements.py b/src/qibolab/instruments/qm/config/elements.py index 3bab5a1d23..d31146c3de 100644 --- a/src/qibolab/instruments/qm/config/elements.py +++ b/src/qibolab/instruments/qm/config/elements.py @@ -1,11 +1,38 @@ from dataclasses import dataclass, field +__all__ = ["output_switch", "DcElement", "RfOctaveElement", "AcquireOctaveElement"] + + +def iq_imbalance(g, phi): + """Creates the correction matrix for the mixer imbalance caused by the gain + and phase imbalances. + + More information here: + https://docs.qualang.io/libs/examples/mixer-calibration/#non-ideal-mixer + + Args: + g (float): relative gain imbalance between the I & Q ports (unit-less). + Set to 0 for no gain imbalance. + phi (float): relative phase imbalance between the I & Q ports (radians). + Set to 0 for no phase imbalance. + """ + c = np.cos(phi) + s = np.sin(phi) + N = 1 / ((1 - g**2) * (2 * c**2 - 1)) + return [float(N * x) for x in [(1 - g) * c, (1 + g) * s, (1 - g) * s, (1 + g) * c]] + @dataclass(frozen=True) class OutputSwitch: port: tuple[str, int] delay: int = 57 buffer: int = 18 + """Default calibration parameters for digital pulses. + + https://docs.quantum-machines.co/1.1.7/qm-qua-sdk/docs/Guides/octave/#calibrating-the-digital-pulse + + Digital markers are used for LO triggering. + """ def output_switch(opx: str, port: int): diff --git a/src/qibolab/instruments/qm/config/pulses.py b/src/qibolab/instruments/qm/config/pulses.py index e69de29bb2..581bae1625 100644 --- a/src/qibolab/instruments/qm/config/pulses.py +++ b/src/qibolab/instruments/qm/config/pulses.py @@ -0,0 +1,129 @@ +from dataclasses import dataclass, field + +SAMPLING_RATE = 1 +"""Sampling rate of Quantum Machines OPX in GSps.""" + +__all__ = [ + "operation", + "Waveform", + "waveforms_from_pulse", + "QmPulse", + "QmAcquisition", +] + + +def operation(pulse): + """Generate operation name in QM ``config`` for the given pulse.""" + return str(hash(pulse)) + + +def _normalize_phase(phase: float): + return (phase % (2 * np.pi)) / (2 * np.pi) + + +@dataclass(frozen=True) +class ConstantWaveform: + sample: float + type: str = "constant" + + @classmethod + def from_pulse(cls, pulse: Pulse): + phase = _normalize_phase(pulse.relative_phase) + return { + "I": cls(pulse.amplitude * np.cos(phase)), + "Q": cls(pulse.amplitude * np.sin(phase)), + } + + +@dataclass(frozen=True) +class ArbitraryWaveform: + samples: list[float] + type: str = "arbitrary" + + @classmethod + def from_pulse(cls, pulse: Pulse): + phase = _normalize_phase(pulse.relative_phase) + samples_i = pulse.i(SAMPLING_RATE) + samples_q = pulse.q(SAMPLING_RATE) + return { + "I": cls(samples_i * np.cos(phase) - samples_q * np.sin(phase)), + "Q": cls(samples_i * np.sin(phase) + samples_q * np.cos(phase)), + } + + +Waveform = Union[ConstantWaveform, ArbitraryWaveform] + + +def waveforms_from_pulse(pulse: Pulse) -> Waveform: + """Register QM waveforms for a given pulse.""" + if isinstance(pulse.envelope, Rectangular): + return ConstantWaveform.from_pulse(pulse) + return ArbitraryWaveform.from_pulse(pulse) + + +@dataclass(frozen=True) +class QmPulse: + length: int + waveforms: dict[str, str] + digital_marker: str = "ON" + operation: str = "control" + + @classmethod + def from_pulse(cls, pulse: Pulse): + op = operation(pulse) + return cls( + length=pulse.duration, + waveforms={"I": f"{op}_i", "Q": f"{op}_q"}, + ) + + @classmethod + def from_dc_pulse(cls, pulse: Pulse): + op = operation(pulse) + return cls( + length=pulse.duration, + waveforms={"single": op}, + ) + + +def integration_weights(element: str, readout_len: int, kernel=None, angle: float = 0): + """Registers integration weights in QM config. + + Args: + readout_len (int): Duration of the readout pulse in ns. + """ + cos, sin = np.cos(angle), np.sin(angle) + if kernel is None: + convert = lambda x: [(x, readout_len)] + else: + cos = kernel * cos + sin = kernel * sin + convert = lambda x: x + + return { + f"cosine_weights_{element}": { + "cosine": convert(cos), + "sine": convert(-sin), + }, + f"sine_weights_{element}": { + "cosine": convert(sin), + "sine": convert(cos), + }, + f"minus_sine_weights_{element}": { + "cosine": convert(-sin), + "sine": convert(-cos), + }, + } + + +@dataclass(frozen=True) +class QmAcquisition(QmPulse): + operation: str = "measurement" + integration_weights: dict[str, str] = field(default_factory=dict) + + def register_integration_weights(self, element: str, kernel=None, angle: float = 0): + self.integration_weights = { + "cos": f"cosine_weights_{element}", + "sin": f"sine_weights_{element}", + "minus_sin": f"minus_sine_weights_{element}", + } + return integration_weights(element, self.length, kernel, angle) diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index b06a57d544..8a3380d27d 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -302,7 +302,7 @@ def execute_program(self, program): Args: program: QUA program. """ - machine = self.manager.open_qm(self.config.__dict__) + machine = self.manager.open_qm(asdict(self.config)) return machine.execute(program) def simulate_program(self, program): @@ -317,7 +317,7 @@ def simulate_program(self, program): duration=self.simulation_duration, controller_connections=controller_connections, ) - return self.manager.simulate(self.config.__dict__, program, simulation_config) + return self.manager.simulate(asdict(self.config), program, simulation_config) def play(self, configs, sequences, options, integration_setup): return self.sweep(configs, sequences, options, integration_setup) @@ -340,8 +340,8 @@ def sweep(self, configs, sequences, options, integration_setup, *sweepers): # sweetspot even when they are not used for channel in self.channels.values(): if isinstance(channel.logical_channel, DcChannel): - self.configure_dc_line(channel, configs) - self.config.register_dc_element(channel) + name = channel.logical_channel.name + self.config.configure_dc_line(channel, configs[name]) acquisitions, parameters = self.register_pulses( configs, sequence, integration_setup, options @@ -369,10 +369,10 @@ def sweep(self, configs, sequences, options, integration_setup, *sweepers): warnings.warn( "Not connected to Quantum Machines. Returning program and config." ) - return {"program": experiment, "config": self.config.__dict__} + return {"program": experiment, "config": asdict(self.config)} if self.script_file_name is not None: - script = generate_qua_script(experiment, self.config.__dict__) + script = generate_qua_script(experiment, asdict(self.config)) for pulses in sequence.values(): for pulse in pulses: script = script.replace(operation(pulse), str(pulse)) From 2c4d3581d0a1316aab2a0bbe6126d492575c9657 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Mon, 22 Jul 2024 18:24:16 +0300 Subject: [PATCH 0451/1006] fix: pylint --- src/qibolab/instruments/qm/config/__init__.py | 2 ++ src/qibolab/instruments/qm/config/config.py | 21 ++++++++++++------- src/qibolab/instruments/qm/config/devices.py | 4 ++-- src/qibolab/instruments/qm/config/elements.py | 12 +++++++++-- src/qibolab/instruments/qm/config/pulses.py | 5 +++++ src/qibolab/instruments/qm/controller.py | 10 ++++----- 6 files changed, 38 insertions(+), 16 deletions(-) diff --git a/src/qibolab/instruments/qm/config/__init__.py b/src/qibolab/instruments/qm/config/__init__.py index e69de29bb2..eb0793a8cc 100644 --- a/src/qibolab/instruments/qm/config/__init__.py +++ b/src/qibolab/instruments/qm/config/__init__.py @@ -0,0 +1,2 @@ +from .config import QmConfig +from .pulses import SAMPLING_RATE, operation diff --git a/src/qibolab/instruments/qm/config/config.py b/src/qibolab/instruments/qm/config/config.py index 2bb0ce64d6..ea9ae3a762 100644 --- a/src/qibolab/instruments/qm/config/config.py +++ b/src/qibolab/instruments/qm/config/config.py @@ -1,9 +1,14 @@ from dataclasses import dataclass, field +from qibolab.components.configs import IqConfig + +from ..components import OpxOutputConfig, QmChannel from .devices import * from .elements import * from .pulses import * +__all__ = ["QmConfig"] + @dataclass class QmConfig: @@ -32,7 +37,7 @@ def add_octave(self, device: str, connectivity: str): self.add_controller(connectivity) self.octaves[device] = Octave(connectivity) - def configure_dc_line(self, channel: QmChannel, config: OpxDcConfig): + def configure_dc_line(self, channel: QmChannel, config: OpxOutputConfig): controller = self.controllers[channel.device] controller.analog_outputs[str(channel.port)] = config self.elements[channel.logical_channel.name] = DcElement(channel.serial) @@ -42,7 +47,7 @@ def configure_iq_line( ): port = channel.port octave = self.octaves[channel.device] - octave.RF_outputs[str(port)] = OctaveOuput.from_config(lo_config) + octave.RF_outputs[str(port)] = OctaveOutput.from_config(lo_config) self.controllers[octave.connectivity].add_octave_output(port) intermediate_frequency = config.frequency - lo_config.frequency @@ -63,15 +68,15 @@ def configure_acquire_line( port = acquire_channel.port octave = self.octaves[acquire_channel.device] octave.RF_inputs[str(port)] = OctaveInput(lo_config.frequency) - self.controllers[octave.connectivity].add_octave_input(port, config) + self.controllers[octave.connectivity].add_octave_input(port, acquire_config) port = probe_channel.port octave = self.octaves[probe_channel.device] - octave.RF_outputs[str(port)] = OctaveOuput.from_config(lo_config) + octave.RF_outputs[str(port)] = OctaveOutput.from_config(lo_config) self.controllers[octave.connectivity].add_octave_output(port) intermediate_frequency = probe_config.frequency - lo_config.frequency - self.elements[channel.logical_channel.name] = AcquireOctaveElement( + self.elements[probe_channel.logical_channel.name] = AcquireOctaveElement( probe_channel.serial, acquire_channel.serial, output_switch(octave.connectivity, probe_channel.port), @@ -88,6 +93,7 @@ def register_iq_pulse(self, element: str, pulse: Pulse): waveforms = waveforms_from_pulse(pulse) for mode in ["I", "Q"]: self.waveforms[qmpulse.waveforms[mode]] = waveforms[mode] + return op def register_dc_pulse(self, element: str, pulse: Pulse): op = operation(pulse) @@ -95,13 +101,13 @@ def register_dc_pulse(self, element: str, pulse: Pulse): self.pulses[op] = qmpulse = QmPulse.from_dc_pulse(pulse) self.elements[element].operations[op] = op self.waveforms[qmpulse.waveforms["I"]] = waveforms_from_pulse(pulse)["I"] + return op def register_acquisition_pulse(self, element: str, pulse: Pulse, kernel=None): """Registers pulse, waveforms and integration weights in QM config.""" op = operation(pulse) if op not in self.pulses: - self.register_integration_weights(element, pulse.duration, kernel) - self.pulses[op] = qmpulse = QmAcquisition.from_pulse(pulse, element) + self.pulses[op] = qmpulse = QmAcquisition.from_pulse(pulse) self.elements[element]["operations"][op] = op waveforms = waveforms_from_pulse(pulse) for mode in ["I", "Q"]: @@ -109,3 +115,4 @@ def register_acquisition_pulse(self, element: str, pulse: Pulse, kernel=None): self.integration_weights.update( qmpulse.register_integration_weights(element, kernel) ) + return op diff --git a/src/qibolab/instruments/qm/config/devices.py b/src/qibolab/instruments/qm/config/devices.py index 9da8045bab..1b8aab4d22 100644 --- a/src/qibolab/instruments/qm/config/devices.py +++ b/src/qibolab/instruments/qm/config/devices.py @@ -34,7 +34,7 @@ def from_config(cls, config: QmAcquisitionConfig): @dataclass(frozen=True) -class OctaveOuput: +class OctaveOutput: LO_frequency: int gain: int = 0 LO_source: str = "internal" @@ -80,5 +80,5 @@ def add_octave_input(self, port: int, config: QmAcquisitionConfig): @dataclass class Octave: connectivity: str - RF_outputs: dict[str, dict[str, OctaveOuput]] = field(default_factory=dict) + RF_outputs: dict[str, dict[str, OctaveOutput]] = field(default_factory=dict) RF_inputs: dict[str, dict[str, OctaveInput]] = field(default_factory=dict) diff --git a/src/qibolab/instruments/qm/config/elements.py b/src/qibolab/instruments/qm/config/elements.py index d31146c3de..8e1d30665e 100644 --- a/src/qibolab/instruments/qm/config/elements.py +++ b/src/qibolab/instruments/qm/config/elements.py @@ -1,6 +1,14 @@ from dataclasses import dataclass, field -__all__ = ["output_switch", "DcElement", "RfOctaveElement", "AcquireOctaveElement"] +import numpy as np + +__all__ = [ + "output_switch", + "DcElement", + "RfOctaveElement", + "AcquireOctaveElement", + "Element", +] def iq_imbalance(g, phi): @@ -66,4 +74,4 @@ class AcquireOctaveElement: operations: dict[str, str] = field(default_factory=dict) -Element = DcElement | RfElement | AcquireElement +Element = DcElement | RfOctaveElement | AcquireOctaveElement diff --git a/src/qibolab/instruments/qm/config/pulses.py b/src/qibolab/instruments/qm/config/pulses.py index 581bae1625..7afed90ddf 100644 --- a/src/qibolab/instruments/qm/config/pulses.py +++ b/src/qibolab/instruments/qm/config/pulses.py @@ -1,4 +1,9 @@ from dataclasses import dataclass, field +from typing import Union + +import numpy as np + +from qibolab.pulses import Pulse, Rectangular SAMPLING_RATE = 1 """Sampling rate of Quantum Machines OPX in GSps.""" diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 8a3380d27d..90b8871c86 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -2,7 +2,7 @@ import tempfile import warnings from collections import defaultdict -from dataclasses import dataclass, field +from dataclasses import asdict, dataclass, field from pathlib import Path from typing import Optional @@ -21,7 +21,7 @@ from .acquisition import create_acquisition, fetch_results from .components import QmChannel -from .config import SAMPLING_RATE, QMConfig, operation +from .config import SAMPLING_RATE, QmConfig, operation from .octave import Octave from .program import Parameters from .sweepers import sweep @@ -79,7 +79,7 @@ class QmController(Controller): Playing pulses on QM controllers requires a ``config`` dictionary and a program written in QUA language. - The ``config`` file is generated in parts in :class:`qibolab.instruments.qm.config.QMConfig`. + The ``config`` file is generated in parts in :class:`qibolab.instruments.qm.config.QmConfig`. Controllers, elements and pulses are all registered after a pulse sequence is given, so that the config contains only elements related to the participating channels. The QUA program for executing an arbitrary :class:`qibolab.pulses.PulseSequence` is written in @@ -125,7 +125,7 @@ class QmController(Controller): is_connected: bool = False """Boolean that shows whether we are connected to the QM manager.""" - config: QMConfig = field(default_factory=QMConfig) + config: QmConfig = field(default_factory=QmConfig) """Configuration dictionary required for pulse execution on the OPXs.""" simulation_duration: Optional[int] = None @@ -222,7 +222,7 @@ def configure_channel(self, channel: QmChannel, configs: dict[str, Config]): else: acquisition = logical_channel.acquisition acquire_channel = self.channels[acquisition] - self.configure_device(config, acquire_channel.device) + self.configure_device(acquire_channel.device) self.config.configure_acquire_line( acquire_channel, channel, From adc8fa0b601465e480d2487dd5483fef80ed127c Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 23 Jul 2024 14:52:28 +0400 Subject: [PATCH 0452/1006] fix: execute single shot routine --- .../instruments/qm/components/configs.py | 2 +- src/qibolab/instruments/qm/config/config.py | 23 +++++++++---------- src/qibolab/instruments/qm/config/pulses.py | 19 ++++++++------- src/qibolab/instruments/qm/controller.py | 3 +-- 4 files changed, 24 insertions(+), 23 deletions(-) diff --git a/src/qibolab/instruments/qm/components/configs.py b/src/qibolab/instruments/qm/components/configs.py index 100d422fcc..6f6fbc9422 100644 --- a/src/qibolab/instruments/qm/components/configs.py +++ b/src/qibolab/instruments/qm/components/configs.py @@ -12,7 +12,7 @@ class OpxOutputConfig(DcConfig): """DC channel config using QM OPX+.""" - offset: float + offset: float = 0.0 """DC offset to be applied in V. Possible values are -0.5V to 0.5V. diff --git a/src/qibolab/instruments/qm/config/config.py b/src/qibolab/instruments/qm/config/config.py index ea9ae3a762..399944143d 100644 --- a/src/qibolab/instruments/qm/config/config.py +++ b/src/qibolab/instruments/qm/config/config.py @@ -1,8 +1,9 @@ from dataclasses import dataclass, field -from qibolab.components.configs import IqConfig +from qibolab.components.configs import IqConfig, OscillatorConfig +from qibolab.pulses import Pulse -from ..components import OpxOutputConfig, QmChannel +from ..components import OpxOutputConfig, QmAcquisitionConfig, QmChannel from .devices import * from .elements import * from .pulses import * @@ -19,9 +20,7 @@ class QmConfig: octaves: dict[str, Octave] = field(default_factory=dict) elements: dict[str, Element] = field(default_factory=dict) pulses: dict[str, QmPulse | QmAcquisition] = field(default_factory=dict) - waveforms: dict[str, ConstantWaveform | ArbitraryWaveform] = field( - default_factory=dict - ) + waveforms: dict[str, Waveform] = field(default_factory=dict) digital_waveforms: dict = field( default_factory=lambda: {"ON": {"samples": [(1, 0)]}} ) @@ -89,30 +88,30 @@ def register_iq_pulse(self, element: str, pulse: Pulse): op = operation(pulse) if op not in self.pulses: self.pulses[op] = qmpulse = QmPulse.from_pulse(pulse) - self.elements[element].operations[op] = op waveforms = waveforms_from_pulse(pulse) for mode in ["I", "Q"]: self.waveforms[qmpulse.waveforms[mode]] = waveforms[mode] + self.elements[element].operations[op] = op return op def register_dc_pulse(self, element: str, pulse: Pulse): op = operation(pulse) if op not in self.pulses: self.pulses[op] = qmpulse = QmPulse.from_dc_pulse(pulse) - self.elements[element].operations[op] = op self.waveforms[qmpulse.waveforms["I"]] = waveforms_from_pulse(pulse)["I"] + self.elements[element].operations[op] = op return op def register_acquisition_pulse(self, element: str, pulse: Pulse, kernel=None): """Registers pulse, waveforms and integration weights in QM config.""" op = operation(pulse) if op not in self.pulses: - self.pulses[op] = qmpulse = QmAcquisition.from_pulse(pulse) - self.elements[element]["operations"][op] = op + self.pulses[op] = qmpulse = QmAcquisition.from_pulse(pulse, element) waveforms = waveforms_from_pulse(pulse) for mode in ["I", "Q"]: self.waveforms[qmpulse.waveforms[mode]] = waveforms[mode] - self.integration_weights.update( - qmpulse.register_integration_weights(element, kernel) - ) + self.integration_weights.update( + integration_weights(element, pulse.duration, kernel) + ) + self.elements[element].operations[op] = op return op diff --git a/src/qibolab/instruments/qm/config/pulses.py b/src/qibolab/instruments/qm/config/pulses.py index 7afed90ddf..a9aa9491e7 100644 --- a/src/qibolab/instruments/qm/config/pulses.py +++ b/src/qibolab/instruments/qm/config/pulses.py @@ -12,6 +12,7 @@ "operation", "Waveform", "waveforms_from_pulse", + "integration_weights", "QmPulse", "QmAcquisition", ] @@ -91,11 +92,7 @@ def from_dc_pulse(cls, pulse: Pulse): def integration_weights(element: str, readout_len: int, kernel=None, angle: float = 0): - """Registers integration weights in QM config. - - Args: - readout_len (int): Duration of the readout pulse in ns. - """ + """Create integration weights section for QM config.""" cos, sin = np.cos(angle), np.sin(angle) if kernel is None: convert = lambda x: [(x, readout_len)] @@ -125,10 +122,16 @@ class QmAcquisition(QmPulse): operation: str = "measurement" integration_weights: dict[str, str] = field(default_factory=dict) - def register_integration_weights(self, element: str, kernel=None, angle: float = 0): - self.integration_weights = { + @classmethod + def from_pulse(cls, pulse: Pulse, element: str): + op = operation(pulse) + integration_weights = { "cos": f"cosine_weights_{element}", "sin": f"sine_weights_{element}", "minus_sin": f"minus_sine_weights_{element}", } - return integration_weights(element, self.length, kernel, angle) + return cls( + length=pulse.duration, + waveforms={"I": f"{op}_i", "Q": f"{op}_q"}, + integration_weights=integration_weights, + ) diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 90b8871c86..a5d6f3ed0d 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -340,8 +340,7 @@ def sweep(self, configs, sequences, options, integration_setup, *sweepers): # sweetspot even when they are not used for channel in self.channels.values(): if isinstance(channel.logical_channel, DcChannel): - name = channel.logical_channel.name - self.config.configure_dc_line(channel, configs[name]) + self.configure_channel(channel, configs) acquisitions, parameters = self.register_pulses( configs, sequence, integration_setup, options From 2341de826af4e494be589190ff549ebfa7114915 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 23 Jul 2024 20:28:03 +0400 Subject: [PATCH 0453/1006] fix: readout pulses per element --- src/qibolab/instruments/qm/acquisition.py | 17 ++-- src/qibolab/instruments/qm/config/config.py | 17 ++-- src/qibolab/instruments/qm/controller.py | 95 ++++++++++----------- src/qibolab/instruments/qm/program.py | 48 +++++++---- src/qibolab/instruments/qm/sweepers.py | 45 +++++----- 5 files changed, 120 insertions(+), 102 deletions(-) diff --git a/src/qibolab/instruments/qm/acquisition.py b/src/qibolab/instruments/qm/acquisition.py index 9d28388afb..a7253b457d 100644 --- a/src/qibolab/instruments/qm/acquisition.py +++ b/src/qibolab/instruments/qm/acquisition.py @@ -24,8 +24,6 @@ SampleResults, ) -# TODO: Change name to operation? - @dataclass class Acquisition(ABC): @@ -36,9 +34,7 @@ class Acquisition(ABC): variables. """ - name: str - """Name of the acquisition used as identifier to download results from the - instruments.""" + operation: str element: str """Element from QM ``config`` that the pulse will be applied on.""" average: bool @@ -51,6 +47,11 @@ class Acquisition(ABC): """Averaged result object type that corresponds to this acquisition type.""" + @property + def name(self): + """Identifier to download results from the instruments.""" + return f"{self.operation}_{self.element}" + @property def npulses(self): return len(self.keys) @@ -104,9 +105,9 @@ class RawAcquisition(Acquisition): def declare(self): self.adc_stream = declare_stream(adc_trace=True) - def measure(self, operation, element): - qua.reset_phase(element) - qua.measure(operation, element, self.adc_stream) + def measure(self, operation): + qua.reset_phase(self.element) + qua.measure(operation, self.element, self.adc_stream) def download(self, *dimensions): istream = self.adc_stream.input1() diff --git a/src/qibolab/instruments/qm/config/config.py b/src/qibolab/instruments/qm/config/config.py index 399944143d..118cf9ca54 100644 --- a/src/qibolab/instruments/qm/config/config.py +++ b/src/qibolab/instruments/qm/config/config.py @@ -102,16 +102,19 @@ def register_dc_pulse(self, element: str, pulse: Pulse): self.elements[element].operations[op] = op return op - def register_acquisition_pulse(self, element: str, pulse: Pulse, kernel=None): + def register_acquisition_pulse(self, element: str, pulse: Pulse): """Registers pulse, waveforms and integration weights in QM config.""" op = operation(pulse) - if op not in self.pulses: - self.pulses[op] = qmpulse = QmAcquisition.from_pulse(pulse, element) + acquisition = f"{op}_{element}" + if acquisition not in self.pulses: + self.pulses[acquisition] = qmpulse = QmAcquisition.from_pulse( + pulse, element + ) waveforms = waveforms_from_pulse(pulse) for mode in ["I", "Q"]: self.waveforms[qmpulse.waveforms[mode]] = waveforms[mode] - self.integration_weights.update( - integration_weights(element, pulse.duration, kernel) - ) - self.elements[element].operations[op] = op + self.elements[element].operations[op] = acquisition return op + + def register_integration_weights(self, element: str, duration: int, kernel): + self.integration_weights.update(integration_weights(element, duration, kernel)) diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index a5d6f3ed0d..bae675a5aa 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -1,7 +1,6 @@ import shutil import tempfile import warnings -from collections import defaultdict from dataclasses import asdict, dataclass, field from pathlib import Path from typing import Optional @@ -13,9 +12,9 @@ from qualang_tools.simulator_tools import create_simulator_controller_connections from qibolab import AveragingMode -from qibolab.components import Config, DcChannel, IqChannel +from qibolab.components import Channel, Config, DcChannel, IqChannel from qibolab.instruments.abstract import Controller -from qibolab.pulses import Delay, VirtualZ +from qibolab.pulses import Delay, Pulse, VirtualZ from qibolab.sweeper import Parameter from qibolab.unrolling import Bounds @@ -23,7 +22,7 @@ from .components import QmChannel from .config import SAMPLING_RATE, QmConfig, operation from .octave import Octave -from .program import Parameters +from .program import ExecutionArguments from .sweepers import sweep OCTAVE_ADDRESS_OFFSET = 11000 @@ -234,6 +233,21 @@ def configure_channel(self, channel: QmChannel, configs: dict[str, Config]): else: raise TypeError(f"Unknown channel type: {type(channel)}.") + def register_pulse(self, channel: Channel, pulse: Pulse): + # if ( + # pulse.duration % 4 != 0 + # or pulse.duration < 16 + # or pulse.id in pulses_to_bake + # ): + # qmpulse = BakedPulse(pulse, element) + # qmpulse.bake(self.config, durations=[pulse.duration]) + # else: + if isinstance(channel, DcChannel): + return self.config.register_dc_pulse(channel.name, pulse) + if channel.acquisition is None: + return self.config.register_iq_pulse(channel.name, pulse) + return self.config.register_acquisition_pulse(channel.name, pulse) + def register_pulses(self, configs, sequence, integration_setup, options): """Translates a :class:`qibolab.pulses.PulseSequence` to :class:`qibolab.instruments.qm.instructions.Instructions`. @@ -249,52 +263,40 @@ def register_pulses(self, configs, sequence, integration_setup, options): parameters (dict): """ acquisitions = {} - parameters = defaultdict(Parameters) - for channel_name, channel_sequence in sequence.items(): - channel = self.channels[channel_name] + for name, channel_sequence in sequence.items(): + channel = self.channels[name] self.configure_channel(channel, configs) for pulse in channel_sequence: if isinstance(pulse, (Delay, VirtualZ)): continue - # if ( - # pulse.duration % 4 != 0 - # or pulse.duration < 16 - # or pulse.id in pulses_to_bake - # ): - # qmpulse = BakedPulse(pulse, element) - # qmpulse.bake(self.config, durations=[pulse.duration]) - # else: logical_channel = channel.logical_channel - if isinstance(logical_channel, DcChannel): - self.config.register_dc_pulse(channel_name, pulse) - else: - if logical_channel.acquisition is None: - self.config.register_iq_pulse(channel_name, pulse) + op = self.register_pulse(logical_channel, pulse) + + if ( + isinstance(logical_channel, IqChannel) + and logical_channel.acquisition is not None + ): + kernel, threshold, iq_angle = integration_setup[ + logical_channel.acquisition + ] + self.config.register_integration_weights( + name, pulse.duration, kernel + ) + if (op, name) in acquisitions: + acquisition = acquisitions[(op, name)] else: - acquisition = self.channels[ - logical_channel.acquisition - ].logical_channel - - kernel, threshold, iq_angle = integration_setup[ - acquisition.name - ] - op = self.config.register_acquisition_pulse( - channel_name, pulse, kernel + acquisition = acquisitions[(op, name)] = create_acquisition( + op, + name, + options, + threshold, + iq_angle, ) - if op not in acquisitions: - acquisitions[op] = create_acquisition( - op, - channel_name, - options, - threshold, - iq_angle, - ) - parameters[op].acquisition = acquisitions[op] - acquisitions[op].keys.append(pulse.id) - - return acquisitions, parameters + acquisition.keys.append(pulse.id) + + return acquisitions def execute_program(self, program): """Executes an arbitrary program written in QUA language. @@ -342,7 +344,7 @@ def sweep(self, configs, sequences, options, integration_setup, *sweepers): if isinstance(channel.logical_channel, DcChannel): self.configure_channel(channel, configs) - acquisitions, parameters = self.register_pulses( + acquisitions = self.register_pulses( configs, sequence, integration_setup, options ) with qua.program() as experiment: @@ -351,14 +353,9 @@ def sweep(self, configs, sequences, options, integration_setup, *sweepers): for acquisition in acquisitions.values(): acquisition.declare() # execute pulses + args = ExecutionArguments(sequence, acquisitions, options.relaxation_time) with for_(n, 0, n < options.nshots, n + 1): - sweep( - list(sweepers), - sequence, - parameters, - configs, - options.relaxation_time, - ) + sweep(list(sweepers), configs, args) # download acquisitions with qua.stream_processing(): for acquisition in acquisitions.values(): diff --git a/src/qibolab/instruments/qm/program.py b/src/qibolab/instruments/qm/program.py index 41c92cae27..cc6a2deed3 100644 --- a/src/qibolab/instruments/qm/program.py +++ b/src/qibolab/instruments/qm/program.py @@ -1,9 +1,10 @@ -from dataclasses import dataclass +from collections import defaultdict +from dataclasses import dataclass, field from typing import Optional from qm import qua -from qibolab.pulses import Delay, PulseType +from qibolab.pulses import Delay, PulseSequence from .acquisition import Acquisition from .config import operation @@ -11,15 +12,13 @@ @dataclass class Parameters: - # TODO: Split acquisition and sweep parameters - acquisition: Optional[Acquisition] = None # TODO: Change the following types to QUA variables duration: Optional[int] = None amplitude: Optional[float] = None phase: Optional[float] = None -def _delay(pulse, element, parameters): +def _delay(pulse: Delay, element: str, parameters: Parameters): # TODO: How to play delays on multiple elements? if parameters.duration is None: duration = pulse.duration // 4 + 1 @@ -28,16 +27,19 @@ def _delay(pulse, element, parameters): qua.wait(duration, element) -def _play(pulse, element, parameters): +def _play( + op: str, + element: str, + parameters: Parameters, + acquisition: Optional[Acquisition] = None, +): if parameters.phase is not None: qua.frame_rotation_2pi(parameters.phase, element) if parameters.amplitude is not None: - op = operation(pulse) * parameters.amplitude - else: - op = operation(pulse) + op = op * parameters.amplitude - if pulse.type is PulseType.READOUT: - parameters.acquisition.measure(op) + if acquisition is not None: + acquisition.measure(op) else: qua.play(op, element, duration=parameters.duration) @@ -45,19 +47,31 @@ def _play(pulse, element, parameters): qua.reset_frame(element) -def play(sequence, parameters, relaxation_time=0): +@dataclass +class ExecutionArguments: + sequence: PulseSequence + acquisitions: dict[tuple[str, str], Acquisition] + relaxation_time: int = 0 + parameters: dict[str, Parameters] = field( + default_factory=lambda: defaultdict(Parameters) + ) + + +def play(args: ExecutionArguments): """Part of QUA program that plays an arbitrary pulse sequence. Should be used inside a ``program()`` context. """ qua.align() - for element, pulses in sequence.items(): + for element, pulses in args.sequence.items(): for pulse in pulses: - params = parameters[operation(pulse)] + op = operation(pulse) + params = args.parameters[op] if isinstance(pulse, Delay): _delay(pulse, element, params) else: - _play(pulse, element, params) + acquisition = args.acquisitions.get((op, element)) + _play(op, element, params, acquisition) - if relaxation_time > 0: - qua.wait(relaxation_time // 4) + if args.relaxation_time > 0: + qua.wait(args.relaxation_time // 4) diff --git a/src/qibolab/instruments/qm/sweepers.py b/src/qibolab/instruments/qm/sweepers.py index ca190e1f1c..4b7fdba392 100644 --- a/src/qibolab/instruments/qm/sweepers.py +++ b/src/qibolab/instruments/qm/sweepers.py @@ -6,8 +6,11 @@ from qm.qua import declare, fixed, for_ from qualang_tools.loops import from_array +from qibolab.components import Config +from qibolab.sweeper import Sweeper + from .config import operation -from .program import play +from .program import ExecutionArguments, play MAX_OFFSET = 0.5 """Maximum voltage supported by Quantum Machines OPX+ instrument in volts.""" @@ -56,33 +59,33 @@ def check_max_offset(offset, max_offset=MAX_OFFSET): # qmpulse.bake(config, values) -def sweep(sweepers, sequence, parameters, configs, relaxation_time): +def sweep( + sweepers: list[Sweeper], configs: dict[str, Config], args: ExecutionArguments +): """Public sweep function that is called by the driver.""" # for sweeper in sweepers: # if sweeper.parameter is Parameter.duration: # _update_baked_pulses(sweeper, instructions, config) - _sweep_recursion(sweepers, sequence, parameters, configs, relaxation_time) + _sweep_recursion(sweepers, configs, args) -def _sweep_recursion(sweepers, sequence, parameters, configs, relaxation_time): +def _sweep_recursion(sweepers, configs, args): """Unrolls a list of qibolab sweepers to the corresponding QUA for loops using recursion.""" if len(sweepers) > 0: parameter = sweepers[0].parameter.name func_name = f"_sweep_{parameter}" if func_name in globals(): - globals()[func_name]( - sweepers, sequence, parameters, configs, relaxation_time - ) + globals()[func_name](sweepers, configs, args) else: raise_error( NotImplementedError, f"Sweeper for {parameter} is not implemented." ) else: - play(sequence, parameters, relaxation_time) + play(args) -def _sweep_frequency(sweepers, sequence, parameters, configs, relaxation_time): +def _sweep_frequency(sweepers, configs, args): sweeper = sweepers[0] freqs0 = [] for channel in sweeper.channels: @@ -104,10 +107,10 @@ def _sweep_frequency(sweepers, sequence, parameters, configs, relaxation_time): for channel, f0 in zip(sweeper.channels, freqs0): qua.update_frequency(channel.name, f + f0) - _sweep_recursion(sweepers[1:], sequence, parameters, configs, relaxation_time) + _sweep_recursion(sweepers[1:], configs, args) -def _sweep_amplitude(sweepers, sequence, parameters, configs, relaxation_time): +def _sweep_amplitude(sweepers, configs, args): sweeper = sweepers[0] # TODO: Consider sweeping amplitude without multiplication if min(sweeper.values) < -2: @@ -123,22 +126,22 @@ def _sweep_amplitude(sweepers, sequence, parameters, configs, relaxation_time): # if isinstance(instruction, Bake): # instructions.update_kwargs(instruction, amplitude=a) # else: - parameters[operation(pulse)].amplitude = qua.amp(a) + args.parameters[operation(pulse)].amplitude = qua.amp(a) - _sweep_recursion(sweepers[1:], sequence, parameters, configs, relaxation_time) + _sweep_recursion(sweepers[1:], configs, args) -def _sweep_relative_phase(sweepers, sequence, parameters, configs, relaxation_time): +def _sweep_relative_phase(sweepers, configs, args): sweeper = sweepers[0] relphase = declare(fixed) with for_(*from_array(relphase, sweeper.values / (2 * np.pi))): for pulse in sweeper.pulses: - parameters[operation(pulse)].phase = relphase + args.parameters[operation(pulse)].phase = relphase - _sweep_recursion(sweepers[1:], sequence, parameters, configs, relaxation_time) + _sweep_recursion(sweepers[1:], configs, args) -def _sweep_bias(sweepers, sequence, parameters, configs, relaxation_time): +def _sweep_bias(sweepers, configs, args): sweeper = sweepers[0] offset0 = [] for channel in sweeper.channels: @@ -156,15 +159,15 @@ def _sweep_bias(sweepers, sequence, parameters, configs, relaxation_time): with qua.else_(): qua.set_dc_offset(f"flux{channel.name}", "single", (b + b0)) - _sweep_recursion(sweepers[1:], sequence, parameters, configs, relaxation_time) + _sweep_recursion(sweepers[1:], configs, args) -def _sweep_duration(sweepers, sequence, parameters, configs, relaxation_time): +def _sweep_duration(sweepers, configs, args): # TODO: Handle baked pulses sweeper = sweepers[0] dur = declare(int) with for_(*from_array(dur, (sweeper.values // 4).astype(int))): for pulse in sweeper.pulses: - parameters[operation(pulse)].duration = dur + args.parameters[operation(pulse)].duration = dur - _sweep_recursion(sweepers[1:], sequence, parameters, configs, relaxation_time) + _sweep_recursion(sweepers[1:], configs, args) From d564cc988bd9e644cb240d82802df3872185357f Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 23 Jul 2024 20:01:22 +0300 Subject: [PATCH 0454/1006] build: bump version in pyproject --- pyproject.toml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 8f57d469c5..c351e8bcfb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api" [tool.poetry] name = "qibolab" -version = "0.1.10" +version = "0.2.0" description = "Quantum hardware module and drivers for Qibo" authors = ["The Qibo team"] license = "Apache License 2.0" @@ -87,7 +87,6 @@ qm = ["qm-qua", "qualang-tools"] zh = ["laboneq"] rfsoc = ["qibosoq"] los = ["qcodes", "qcodes_contrib_drivers", "pyvisa-py"] -twpa = ["qcodes", "qcodes_contrib_drivers", "pyvisa-py"] emulator = ["qutip"] From 7f4f6c213af2e3e424ab57eb7bef65a873328e94 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 6 Aug 2024 17:26:38 +0400 Subject: [PATCH 0455/1006] chore: remove old file --- src/qibolab/instruments/qm/sequence.py | 273 ------------------------- 1 file changed, 273 deletions(-) delete mode 100644 src/qibolab/instruments/qm/sequence.py diff --git a/src/qibolab/instruments/qm/sequence.py b/src/qibolab/instruments/qm/sequence.py deleted file mode 100644 index 52724f05b7..0000000000 --- a/src/qibolab/instruments/qm/sequence.py +++ /dev/null @@ -1,273 +0,0 @@ -import collections -from dataclasses import dataclass, field -from typing import Optional, Union - -import numpy as np -from numpy import typing as npt -from qm import qua -from qm.qua._dsl import _Variable # for type declaration only -from qualang_tools.bakery import baking -from qualang_tools.bakery.bakery import Baking - -from qibolab.pulses import Pulse, PulseType - -from .acquisition import Acquisition -from .config import SAMPLING_RATE, QMConfig - -DurationsType = Union[list[int], npt.NDArray[int]] -"""Type of values that can be accepted in a duration sweeper.""" - - -@dataclass -class QMPulse: - """Wrapper around :class:`qibolab.pulses.Pulse` for easier translation to - QUA program. - - These pulses are defined when :meth:`qibolab.instruments.qm.QMOPX.play` is called - and hold attributes for the ``element`` and ``operation`` that corresponds to each pulse, - as defined in the QM config. - """ - - pulse: Pulse - """:class:`qibolab.pulses.Pulse` corresponding to the ``QMPulse``.""" - element: Optional[str] = None - """Element that the pulse will be played on, as defined in the QM - config.""" - operation: Optional[str] = None - """Name of the operation that is implementing the pulse in the QM - config.""" - relative_phase: Optional[float] = None - """Relative phase of the pulse normalized to follow QM convention. - - May be overwritten when sweeping phase. - """ - wait_time: int = 0 - """Time (in clock cycles) to wait before playing this pulse. - - Calculated and assigned by - :meth: `qibolab.instruments.qm.Sequence.add`. - """ - wait_time_variable: Optional[_Variable] = None - """Time (in clock cycles) to wait before playing this pulse when we are - sweeping start.""" - swept_duration: Optional[_Variable] = None - """Pulse duration when sweeping it.""" - - acquisition: Optional[Acquisition] = None - """Data class containing the variables required for data acquisition for - the instrument.""" - - next_: set["QMPulse"] = field(default_factory=set) - """Pulses that will be played after the current pulse. - - These pulses need to be re-aligned if we are sweeping the start or - duration. - """ - elements_to_align: set[str] = field(default_factory=set) - - def __post_init__(self): - pulse_type = self.pulse.type.name.lower() - amplitude = format(self.pulse.amplitude, ".6f").rstrip("0").rstrip(".") - if self.element is None: - self.element = f"{pulse_type}{self.pulse.qubit}" - self.operation: str = ( - f"{pulse_type}({self.pulse.duration}, {amplitude}, {self.pulse.envelope})" - ) - self.relative_phase: float = self.pulse.relative_phase / (2 * np.pi) - self.elements_to_align.add(self.element) - - def __hash__(self): - return hash(self.pulse) - - @property - def duration(self): - """Duration of the pulse as defined in the - :class:`qibolab.pulses.PulseSequence`. - - Remains constant even when we are sweeping the duration of this - pulse. - """ - return self.pulse.duration - - @property - def wait_cycles(self): - """Instrument clock cycles (1 cycle = 4ns) to wait before playing the - pulse. - - This property will be used in the QUA ``wait`` command, so that it is compatible - with and without start sweepers. - """ - if self.wait_time_variable is not None: - return self.wait_time_variable + self.wait_time - if self.wait_time >= 4: - return self.wait_time - return None - - def play(self): - """Play the pulse. - - Relevant only in the context of a QUA program. - """ - qua.play(self.operation, self.element, duration=self.swept_duration) - - -@dataclass -class BakedPulse(QMPulse): - """Baking allows 1ns resolution in the pulse waveforms.""" - - segments: list[Baking] = field(default_factory=list) - """Baked segments implementing the pulse.""" - amplitude: Optional[float] = None - """Amplitude of the baked pulse. - - Relevant only when sweeping amplitude. - """ - durations: Optional[DurationsType] = None - - def __hash__(self): - return super().__hash__() - - @property - def duration(self): - return self.segments[-1].get_op_length() - - @staticmethod - def calculate_waveform(original_waveform, t): - if t == 0: # Otherwise, the baking will be empty and will not be created - return [0.0] * 16 - - expanded_waveform = list(original_waveform) - for i in range(t // len(original_waveform)): - expanded_waveform.extend(original_waveform) - return expanded_waveform[:t] - - def bake(self, config: QMConfig, durations: DurationsType): - self.segments = [] - self.durations = durations - for t in durations: - with baking(config.__dict__, padding_method="right") as segment: - if self.pulse.type is PulseType.FLUX: - waveform = self.pulse.i(SAMPLING_RATE).tolist() - waveform = self.calculate_waveform(waveform, t) - else: - waveform_i = self.pulse.i(SAMPLING_RATE).tolist() - waveform_q = self.pulse.q(SAMPLING_RATE).tolist() - waveform = [ - self.calculate_waveform(waveform_i, t), - self.calculate_waveform(waveform_q, t), - ] - segment.add_op(self.operation, self.element, waveform) - segment.play(self.operation, self.element) - self.segments.append(segment) - - @property - def amplitude_array(self): - if self.amplitude is None: - return None - return [(self.element, self.amplitude)] - - def play(self): - if self.swept_duration is not None: - with qua.switch_(self.swept_duration): - for dur, segment in zip(self.durations, self.segments): - with qua.case_(dur): - segment.run(amp_array=self.amplitude_array) - else: - segment = self.segments[0] - segment.run(amp_array=self.amplitude_array) - - -@dataclass -class Sequence: - """Pulse sequence containing QM specific pulses (``qmpulse``). - - Defined in :meth:`qibolab.instruments.qm.QMOPX.play`. - Holds attributes for the ``element`` and ``operation`` that - corresponds to each pulse, as defined in the QM config. - """ - - qmpulses: list[QMPulse] = field(default_factory=list) - """List of :class:`qibolab.instruments.qm.QMPulse` objects corresponding to - the original pulses.""" - pulse_to_qmpulse: dict[Pulse, QMPulse] = field(default_factory=dict) - """Map from qibolab pulses to QMPulses (useful when sweeping).""" - clock: dict[str, int] = field(default_factory=lambda: collections.defaultdict(int)) - """Dictionary used to keep track of times of each element, in order to - calculate wait times.""" - pulse_finish: dict[int, list[QMPulse]] = field( - default_factory=lambda: collections.defaultdict(list) - ) - """Map to find all pulses that finish at a given time (useful for - ``_find_previous``).""" - - def _find_previous(self, pulse): - for finish in reversed(sorted(self.pulse_finish.keys())): - if finish <= pulse.start: - # first try to find a previous pulse targeting the same qubit - last_pulses = self.pulse_finish[finish] - for previous in reversed(last_pulses): - if previous.pulse.qubit == pulse.qubit: - return previous - # otherwise - if finish == pulse.start: - return last_pulses[-1] - return None - - def add(self, qmpulse: QMPulse): - pulse = qmpulse.pulse - self.pulse_to_qmpulse[pulse.id] = qmpulse - - previous = self._find_previous(pulse) - if previous is not None: - previous.next_.add(qmpulse) - - wait_time = pulse.start - self.clock[qmpulse.element] - if wait_time >= 12: - qmpulse.wait_time = wait_time // 4 + 1 - self.clock[qmpulse.element] += 4 * qmpulse.wait_time - self.clock[qmpulse.element] += qmpulse.duration - - self.pulse_finish[pulse.finish].append(qmpulse) - self.qmpulses.append(qmpulse) - - def shift(self): - """Shift all pulses that come after a ``BakedPulse`` a bit to avoid - overlapping pulses.""" - to_shift = collections.deque() - for qmpulse in self.qmpulses: - if isinstance(qmpulse, BakedPulse): - to_shift.extend(qmpulse.next_) - while to_shift: - qmpulse = to_shift.popleft() - qmpulse.wait_time += 2 - to_shift.extend(qmpulse.next_) - - def play(self, relaxation_time=0): - """Part of QUA program that plays an arbitrary pulse sequence. - - Should be used inside a ``program()`` context. - """ - needs_reset = False - qua.align() - for qmpulse in self.qmpulses: - pulse = qmpulse.pulse - if qmpulse.wait_cycles is not None: - qua.wait(qmpulse.wait_cycles, qmpulse.element) - if pulse.type is PulseType.READOUT: - qmpulse.acquisition.measure(qmpulse.operation, qmpulse.element) - else: - if ( - not isinstance(qmpulse.relative_phase, float) - or qmpulse.relative_phase != 0 - ): - qua.frame_rotation_2pi(qmpulse.relative_phase, qmpulse.element) - needs_reset = True - qmpulse.play() - if needs_reset: - qua.reset_frame(qmpulse.element) - needs_reset = False - if len(qmpulse.elements_to_align) > 1: - qua.align(*qmpulse.elements_to_align) - - if relaxation_time > 0: - qua.wait(relaxation_time // 4) From 4043ff93b3a289e6e6c8401c3df7fde64f64e003 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 6 Aug 2024 17:54:34 +0400 Subject: [PATCH 0456/1006] chore: remove old file --- src/qibolab/channel.py | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 src/qibolab/channel.py diff --git a/src/qibolab/channel.py b/src/qibolab/channel.py deleted file mode 100644 index 46e963de63..0000000000 --- a/src/qibolab/channel.py +++ /dev/null @@ -1,9 +0,0 @@ -from dataclasses import dataclass - -from .channel_config import ChannelConfig - - -@dataclass(frozen=True) -class Channel: - name: str - config: ChannelConfig From 047fa14dcad135f6fd82850f1469258c043a9f74 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 6 Aug 2024 17:57:09 +0400 Subject: [PATCH 0457/1006] fix: remove references to old results --- src/qibolab/instruments/qm/acquisition.py | 51 +++++++---------------- 1 file changed, 16 insertions(+), 35 deletions(-) diff --git a/src/qibolab/instruments/qm/acquisition.py b/src/qibolab/instruments/qm/acquisition.py index a7253b457d..aabd212aee 100644 --- a/src/qibolab/instruments/qm/acquisition.py +++ b/src/qibolab/instruments/qm/acquisition.py @@ -15,14 +15,17 @@ AveragingMode, ExecutionParameters, ) -from qibolab.result import ( - AveragedIntegratedResults, - AveragedRawWaveformResults, - AveragedSampleResults, - IntegratedResults, - RawWaveformResults, - SampleResults, -) +from qibolab.result import collect + + +def _split(data, npulses, iq=False): + """Split results of different readout pulses that were acquired in the same + acquisition.""" + if npulses == 1: + return [data] + if iq: + return [data[..., i, :] for i in range(npulses)] + return [data[..., i] for i in range(npulses)] @dataclass @@ -38,15 +41,8 @@ class Acquisition(ABC): element: str """Element from QM ``config`` that the pulse will be applied on.""" average: bool - keys: list[str] = field(default_factory=list) - RESULT_CLS = IntegratedResults - """Result object type that corresponds to this acquisition type.""" - AVERAGED_RESULT_CLS = AveragedIntegratedResults - """Averaged result object type that corresponds to this acquisition - type.""" - @property def name(self): """Identifier to download results from the instruments.""" @@ -84,13 +80,6 @@ def download(self, *dimensions): def fetch(self): """Fetch downloaded streams to host device.""" - def result(self, data): - """Creates Qibolab result object that is returned to the platform.""" - res_cls = self.AVERAGED_RESULT_CLS if self.average else self.RESULT_CLS - if self.npulses > 1: - return [res_cls(data[..., i]) for i in range(self.npulses)] - return [res_cls(data)] - @dataclass class RawAcquisition(Acquisition): @@ -99,9 +88,6 @@ class RawAcquisition(Acquisition): adc_stream: Optional[_ResultSource] = None """Stream to collect raw ADC data.""" - RESULT_CLS = RawWaveformResults - AVERAGED_RESULT_CLS = AveragedRawWaveformResults - def declare(self): self.adc_stream = declare_stream(adc_trace=True) @@ -123,8 +109,8 @@ def fetch(self, handles): qres = handles.get(f"{self.name}_Q").fetch_all() # convert raw ADC signal to volts u = unit() - signal = u.raw2volts(ires) + 1j * u.raw2volts(qres) - return self.result(signal) + signal = collect(u.raw2volts(ires), 1j * u.raw2volts(qres)) + return _split(signal, self.npulses, iq=True) @dataclass @@ -138,9 +124,6 @@ class IntegratedAcquisition(Acquisition): qstream: Optional[_ResultSource] = None """Streams to collect the results of all shots.""" - RESULT_CLS = IntegratedResults - AVERAGED_RESULT_CLS = AveragedIntegratedResults - def declare(self): self.i = declare(fixed) self.q = declare(fixed) @@ -177,7 +160,8 @@ def download(self, *dimensions): def fetch(self, handles): ires = handles.get(f"{self.name}_I").fetch_all() qres = handles.get(f"{self.name}_Q").fetch_all() - return self.result(ires + 1j * qres) + signal = collect(ires, qres) + return _split(signal, self.npulses, iq=True) @dataclass @@ -200,9 +184,6 @@ class ShotsAcquisition(Acquisition): shots: Optional[_ResultSource] = None """Stream to collect multiple shots.""" - RESULT_CLS = SampleResults - AVERAGED_RESULT_CLS = AveragedSampleResults - def __post_init__(self): self.cos = np.cos(self.angle) self.sin = np.sin(self.angle) @@ -240,7 +221,7 @@ def download(self, *dimensions): def fetch(self, handles): shots = handles.get(f"{self.name}_shots").fetch_all() - return self.result(shots) + return _split(shots, self.npulses, iq=False) ACQUISITION_TYPES = { From 6f1223f71c457b54035a561e68a2b9d98aa7f29c Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 6 Aug 2024 18:07:53 +0400 Subject: [PATCH 0458/1006] chore: remove files from wrong rebase --- src/qibolab/channel_configs.py | 70 ------------------- src/qibolab/instruments/zhinst/channel.py | 10 --- .../instruments/zhinst/channel_configs.py | 25 ------- src/qibolab/pulses/pulse.py | 16 +++-- 4 files changed, 9 insertions(+), 112 deletions(-) delete mode 100644 src/qibolab/channel_configs.py delete mode 100644 src/qibolab/instruments/zhinst/channel.py delete mode 100644 src/qibolab/instruments/zhinst/channel_configs.py diff --git a/src/qibolab/channel_configs.py b/src/qibolab/channel_configs.py deleted file mode 100644 index 368c5d77b0..0000000000 --- a/src/qibolab/channel_configs.py +++ /dev/null @@ -1,70 +0,0 @@ -from dataclasses import dataclass -from typing import Union - -from .execution_parameters import AcquisitionType - -"""Common configuration for various channels.""" - - -@dataclass -class DCChannelConfig: - """Configuration for a channel that can be used to send DC pulses (i.e. - just envelopes without modulation on any frequency)""" - - bias: float - """DC bias/offset of the channel.""" - - -@dataclass -class IQChannelConfig: - """Configuration for an IQ channel. This is used for IQ channels that can - generate requested signals by first generating them at an intermediate - frequency, and then mixing it with a local oscillator (LO) to upconvert to - the target carrier frequency. - - For this type of IQ channels users typically - 1. want to have control over the LO frequency. - 2. need to be able to calibrate parameters related to the mixer imperfections. - Mixers typically have some imbalance in the way they treat the I and Q components - of the signal, and to compensate for it users typically need to calibrate the - compensation parameters and provide them as channel configuration. - """ - - frequency: float - """The carrier frequency of the channel.""" - lo_frequency: float - """The frequency of the local oscillator.""" - mixer_correction_scale: float = 0.0 - """The relative amplitude scale/factor of the q channel.""" - mixer_correction_phase: float = 0.0 - """The phase offset of the q channel of the LO.""" - - -@dataclass -class DirectIQChannelConfig: - """Configuration for an IQ channel that directly generates signals at - necessary carrier frequency.""" - - frequency: float - """The carrier frequency of the channel.""" - - -@dataclass -class AcquisitionChannelConfig: - """Configuration for acquisition channels.""" - - type: AcquisitionType - - -@dataclass -class Channel: - """A channel is represented by its unique name, and the type of - configuration that should be specified for it.""" - - name: str - config_type: type - - -ChannelConfig = Union[ - DCChannelConfig, IQChannelConfig, DirectIQChannelConfig, AcquisitionChannelConfig -] diff --git a/src/qibolab/instruments/zhinst/channel.py b/src/qibolab/instruments/zhinst/channel.py deleted file mode 100644 index 119383d9da..0000000000 --- a/src/qibolab/instruments/zhinst/channel.py +++ /dev/null @@ -1,10 +0,0 @@ -from dataclasses import dataclass - -from qibolab.channel import Channel - - -@dataclass(frozen=True) -class ZIChannel(Channel): - - device: str - path: str diff --git a/src/qibolab/instruments/zhinst/channel_configs.py b/src/qibolab/instruments/zhinst/channel_configs.py deleted file mode 100644 index 38c87b9090..0000000000 --- a/src/qibolab/instruments/zhinst/channel_configs.py +++ /dev/null @@ -1,25 +0,0 @@ -from dataclasses import dataclass - -from qibolab.channel_configs import DCChannelConfig, IQChannelConfig - - -@dataclass(frozen=True) -class ZurichDCChannelConfig(DCChannelConfig): - """DC channel config using ZI HDAWG.""" - - power_range: float - """Power range in volts. - - Possible values are [0.2 0.4 0.6 0.8 1. 2. 3. 4. 5.]. - """ - - -@dataclass(frozen=True) -class ZurichIQChannelConfig(IQChannelConfig): - """IQ channel config for ZI SHF* line instrument.""" - - power_range: float - """Power range in dBm. - - Possible values are [-30. -25. -20. -15. -10. -5. 0. 5. 10.]. - """ diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index e077610894..9d74256195 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -26,7 +26,13 @@ class PulseType(Enum): VIRTUALZ = "vz" -class Pulse(Model): +class _PulseLike(Model): + @property + def id(self) -> int: + return id(self) + + +class Pulse(_PulseLike): """A pulse to be sent to the QPU.""" duration: float @@ -60,10 +66,6 @@ def flux(cls, **kwargs): kwargs["type"] = PulseType.FLUX return cls(**kwargs) - @property - def id(self) -> int: - return id(self) - def i(self, sampling_rate: float) -> Waveform: """The envelope waveform of the i component of the pulse.""" samples = int(self.duration * sampling_rate) @@ -79,7 +81,7 @@ def envelopes(self, sampling_rate: float) -> IqWaveform: return np.array([self.i(sampling_rate), self.q(sampling_rate)]) -class Delay(Model): +class Delay(_PulseLike): """A wait instruction during which we are not sending any pulses to the QPU.""" @@ -89,7 +91,7 @@ class Delay(Model): """Type fixed to ``DELAY`` to comply with ``Pulse`` interface.""" -class VirtualZ(Model): +class VirtualZ(_PulseLike): """Implementation of Z-rotations using virtual phase.""" phase: float From 70f6eaae315f2cef4610c0d0206530237195fd49 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 6 Aug 2024 18:36:27 +0400 Subject: [PATCH 0459/1006] fix: pylint --- src/qibolab/instruments/qm/config/config.py | 3 ++- src/qibolab/instruments/qm/config/elements.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/qibolab/instruments/qm/config/config.py b/src/qibolab/instruments/qm/config/config.py index 118cf9ca54..ffd8353dca 100644 --- a/src/qibolab/instruments/qm/config/config.py +++ b/src/qibolab/instruments/qm/config/config.py @@ -1,4 +1,5 @@ from dataclasses import dataclass, field +from typing import Union from qibolab.components.configs import IqConfig, OscillatorConfig from qibolab.pulses import Pulse @@ -19,7 +20,7 @@ class QmConfig: controllers: dict[str, Controller] = field(default_factory=dict) octaves: dict[str, Octave] = field(default_factory=dict) elements: dict[str, Element] = field(default_factory=dict) - pulses: dict[str, QmPulse | QmAcquisition] = field(default_factory=dict) + pulses: dict[str, Union[QmPulse, QmAcquisition]] = field(default_factory=dict) waveforms: dict[str, Waveform] = field(default_factory=dict) digital_waveforms: dict = field( default_factory=lambda: {"ON": {"samples": [(1, 0)]}} diff --git a/src/qibolab/instruments/qm/config/elements.py b/src/qibolab/instruments/qm/config/elements.py index 8e1d30665e..2a4048bf94 100644 --- a/src/qibolab/instruments/qm/config/elements.py +++ b/src/qibolab/instruments/qm/config/elements.py @@ -1,4 +1,5 @@ from dataclasses import dataclass, field +from typing import Union import numpy as np @@ -74,4 +75,4 @@ class AcquireOctaveElement: operations: dict[str, str] = field(default_factory=dict) -Element = DcElement | RfOctaveElement | AcquireOctaveElement +Element = Union[DcElement, RfOctaveElement, AcquireOctaveElement] From d5f5d35beda6e9abd830a6099085a45cb5cd78ce Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 26 Jul 2024 14:23:37 +0300 Subject: [PATCH 0460/1006] refactor: change sweeper structure to be ready for parallel sweeps --- src/qibolab/instruments/qm/sweepers.py | 201 ++++++++++++++----------- 1 file changed, 113 insertions(+), 88 deletions(-) diff --git a/src/qibolab/instruments/qm/sweepers.py b/src/qibolab/instruments/qm/sweepers.py index 4b7fdba392..e9a2fe7a0a 100644 --- a/src/qibolab/instruments/qm/sweepers.py +++ b/src/qibolab/instruments/qm/sweepers.py @@ -1,4 +1,5 @@ import math +from dataclasses import dataclass import numpy as np from qibo.config import raise_error @@ -7,7 +8,7 @@ from qualang_tools.loops import from_array from qibolab.components import Config -from qibolab.sweeper import Sweeper +from qibolab.sweeper import Parameter, Sweeper from .config import operation from .program import ExecutionArguments, play @@ -59,115 +60,139 @@ def check_max_offset(offset, max_offset=MAX_OFFSET): # qmpulse.bake(config, values) -def sweep( - sweepers: list[Sweeper], configs: dict[str, Config], args: ExecutionArguments -): - """Public sweep function that is called by the driver.""" - # for sweeper in sweepers: - # if sweeper.parameter is Parameter.duration: - # _update_baked_pulses(sweeper, instructions, config) - _sweep_recursion(sweepers, configs, args) +@dataclass +class QuaSweep: + sweeper: Sweeper -def _sweep_recursion(sweepers, configs, args): - """Unrolls a list of qibolab sweepers to the corresponding QUA for loops - using recursion.""" - if len(sweepers) > 0: - parameter = sweepers[0].parameter.name - func_name = f"_sweep_{parameter}" - if func_name in globals(): - globals()[func_name](sweepers, configs, args) - else: - raise_error( - NotImplementedError, f"Sweeper for {parameter} is not implemented." - ) - else: - play(args) + def declare(self): + return declare(fixed) + @property + def values(self): + return self.sweeper.values -def _sweep_frequency(sweepers, configs, args): - sweeper = sweepers[0] - freqs0 = [] - for channel in sweeper.channels: - lo_frequency = configs[channel.lo].frequency - # convert to IF frequency for readout and drive pulses - f0 = math.floor(configs[channel.name].frequency - lo_frequency) - freqs0.append(declare(int, value=f0)) - # check if sweep is within the supported bandwidth [-400, 400] MHz - max_freq = maximum_sweep_value(sweeper.values, f0) - if max_freq > 4e8: - raise_error( - ValueError, - f"Frequency {max_freq} for channel {channel.name} is beyond instrument bandwidth.", - ) + def __call__(self, variable, configs, args): + raise NotImplementedError - # is it fine to have this declaration inside the ``nshots`` QUA loop? - f = declare(int) - with for_(*from_array(f, sweeper.values.astype(int))): - for channel, f0 in zip(sweeper.channels, freqs0): - qua.update_frequency(channel.name, f + f0) - _sweep_recursion(sweepers[1:], configs, args) +class Frequency(QuaSweep): + def declare(self): + return declare(int) -def _sweep_amplitude(sweepers, configs, args): - sweeper = sweepers[0] - # TODO: Consider sweeping amplitude without multiplication - if min(sweeper.values) < -2: - raise_error( - ValueError, "Amplitude sweep values are <-2 which is not supported." - ) - if max(sweeper.values) > 2: - raise_error(ValueError, "Amplitude sweep values are >2 which is not supported.") + def __call__(self, variable, configs, args): + for channel in self.sweeper.channels: + lo_frequency = configs[channel.lo].frequency + # convert to IF frequency for readout and drive pulses + f0 = math.floor(configs[channel.name].frequency - lo_frequency) + # check if sweep is within the supported bandwidth [-400, 400] MHz + max_freq = maximum_sweep_value(self.values, f0) + if max_freq > 4e8: + raise_error( + ValueError, + f"Frequency {max_freq} for channel {channel.name} is beyond instrument bandwidth.", + ) + qua.update_frequency(channel.name, variable + f0) + + +class Amplitude(QuaSweep): + + def __call__(self, variable, configs, args): + # TODO: Consider sweeping amplitude without multiplication + if min(self.values) < -2: + raise_error( + ValueError, "Amplitude sweep values are <-2 which is not supported." + ) + if max(self.values) > 2: + raise_error( + ValueError, "Amplitude sweep values are >2 which is not supported." + ) - a = declare(fixed) - with for_(*from_array(a, sweeper.values)): - for pulse in sweeper.pulses: + for pulse in self.sweeper.pulses: # if isinstance(instruction, Bake): # instructions.update_kwargs(instruction, amplitude=a) # else: - args.parameters[operation(pulse)].amplitude = qua.amp(a) + args.parameters[operation(pulse)].amplitude = qua.amp(variable) + - _sweep_recursion(sweepers[1:], configs, args) +class RelativePhase(QuaSweep): + @property + def values(self): + return self.sweeper.values / (2 * np.pi) -def _sweep_relative_phase(sweepers, configs, args): - sweeper = sweepers[0] - relphase = declare(fixed) - with for_(*from_array(relphase, sweeper.values / (2 * np.pi))): - for pulse in sweeper.pulses: - args.parameters[operation(pulse)].phase = relphase + def __call__(self, variable, configs, args): + for pulse in self.sweeper.pulses: + args.parameters[operation(pulse)].phase = variable - _sweep_recursion(sweepers[1:], configs, args) +class Bias(QuaSweep): -def _sweep_bias(sweepers, configs, args): - sweeper = sweepers[0] - offset0 = [] - for channel in sweeper.channels: - b0 = configs[channel.name].offset - max_value = maximum_sweep_value(sweeper.values, b0) - check_max_offset(max_value, MAX_OFFSET) - offset0.append(declare(fixed, value=b0)) - b = declare(fixed) - with for_(*from_array(b, sweeper.values)): - for channel, b0 in zip(sweeper.channels, offset0): - with qua.if_((b + b0) >= 0.49): + def __call__(self, variable, configs, args): + for channel in self.sweeper.channels: + offset = configs[channel.name].offset + max_value = maximum_sweep_value(self.values, offset) + check_max_offset(max_value, MAX_OFFSET) + b0 = declare(fixed, value=offset) + with qua.if_((variable + b0) >= 0.49): qua.set_dc_offset(f"flux{channel.name}", "single", 0.49) - with qua.elif_((b + b0) <= -0.49): + with qua.elif_((variable + b0) <= -0.49): qua.set_dc_offset(f"flux{channel.name}", "single", -0.49) with qua.else_(): - qua.set_dc_offset(f"flux{channel.name}", "single", (b + b0)) + qua.set_dc_offset(f"flux{channel.name}", "single", (variable + b0)) + + +class Duration(QuaSweep): + def declare(self): + return declare(int) + + @property + def values(self): + return (self.sweeper.values // 4).astype(int) + + def __call__(self, variable, configs, args): + # TODO: Handle baked pulses + for pulse in self.sweeper.pulses: + args.parameters[operation(pulse)].duration = variable + + +QUA_SWEEPERS = { + Parameter.frequency: Frequency, + Parameter.amplitude: Amplitude, + Parameter.duration: Duration, + Parameter.relative_phase: RelativePhase, + Parameter.bias: Bias, +} + + +def _sweep_recursion(sweepers, configs, args): + """Unrolls a list of qibolab sweepers to the corresponding QUA for loops + using recursion.""" + if len(sweepers) > 0: + sweeper = sweepers[0] + parameter = sweeper.parameter + if parameter in QUA_SWEEPERS: + qua_sweeper = QUA_SWEEPERS[parameter](sweeper) + else: + raise_error( + NotImplementedError, f"Sweeper for {parameter} is not implemented." + ) - _sweep_recursion(sweepers[1:], configs, args) + variable = qua_sweeper.declare() + with for_(*from_array(variable, qua_sweeper.values)): + qua_sweeper(variable, configs, args) + _sweep_recursion(sweepers[1:], configs, args) + else: + play(args) -def _sweep_duration(sweepers, configs, args): - # TODO: Handle baked pulses - sweeper = sweepers[0] - dur = declare(int) - with for_(*from_array(dur, (sweeper.values // 4).astype(int))): - for pulse in sweeper.pulses: - args.parameters[operation(pulse)].duration = dur - _sweep_recursion(sweepers[1:], configs, args) +def sweep( + sweepers: list[Sweeper], configs: dict[str, Config], args: ExecutionArguments +): + """Public sweep function that is called by the driver.""" + # for sweeper in sweepers: + # if sweeper.parameter is Parameter.duration: + # _update_baked_pulses(sweeper, instructions, config) + _sweep_recursion(sweepers, configs, args) From 1df2a7b3e8f1b8a6fead6efec19114a83f78f904 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 6 Aug 2024 19:46:45 +0400 Subject: [PATCH 0461/1006] refactor: change program structure and update for new execution API --- src/qibolab/instruments/qm/controller.py | 75 ++++++----- src/qibolab/instruments/qm/program.py | 77 ----------- .../instruments/qm/program/__init__.py | 2 + .../qm/{ => program}/acquisition.py | 26 +--- .../instruments/qm/program/arguments.py | 26 ++++ .../instruments/qm/program/instructions.py | 121 ++++++++++++++++++ .../instruments/qm/{ => program}/sweepers.py | 82 +++++------- 7 files changed, 224 insertions(+), 185 deletions(-) delete mode 100644 src/qibolab/instruments/qm/program.py create mode 100644 src/qibolab/instruments/qm/program/__init__.py rename src/qibolab/instruments/qm/{ => program}/acquisition.py (90%) create mode 100644 src/qibolab/instruments/qm/program/arguments.py create mode 100644 src/qibolab/instruments/qm/program/instructions.py rename src/qibolab/instruments/qm/{ => program}/sweepers.py (72%) diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index bae675a5aa..6806afbfb5 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -1,29 +1,27 @@ import shutil import tempfile import warnings +from collections import defaultdict from dataclasses import asdict, dataclass, field from pathlib import Path from typing import Optional -from qm import QuantumMachinesManager, SimulationConfig, generate_qua_script, qua +from qm import QuantumMachinesManager, SimulationConfig, generate_qua_script from qm.octave import QmOctaveConfig -from qm.qua import declare, for_ from qm.simulate.credentials import create_credentials from qualang_tools.simulator_tools import create_simulator_controller_connections -from qibolab import AveragingMode from qibolab.components import Channel, Config, DcChannel, IqChannel +from qibolab.execution_parameters import ExecutionParameters from qibolab.instruments.abstract import Controller -from qibolab.pulses import Delay, Pulse, VirtualZ -from qibolab.sweeper import Parameter +from qibolab.pulses import Delay, Pulse, PulseSequence, VirtualZ +from qibolab.sweeper import ParallelSweepers, Parameter from qibolab.unrolling import Bounds -from .acquisition import create_acquisition, fetch_results from .components import QmChannel from .config import SAMPLING_RATE, QmConfig, operation from .octave import Octave -from .program import ExecutionArguments -from .sweepers import sweep +from .program import create_acquisition, program OCTAVE_ADDRESS_OFFSET = 11000 """Offset to be added to Octave addresses, because they must be 11xxx, where @@ -69,6 +67,30 @@ def find_baking_pulses(sweepers): return to_bake +def fetch_results(result, acquisitions): + """Fetches results from an executed experiment. + + Args: + result: Result of the executed experiment. + acquisition: Dictionary containing :class:`qibolab.instruments.qm.acquisition.Acquisition` objects. + + Returns: + Dictionary with the results in the format required by the platform. + """ + handles = result.result_handles + handles.wait_for_all_values() # for async replace with ``handles.is_processing()`` + results = defaultdict(list) + for acquisition in acquisitions: + data = acquisition.fetch(handles) + for serial, result in zip(acquisition.keys, data): + results[serial].append(result) + + # collapse single element lists for back-compatibility + return { + key: value[0] if len(value) == 1 else value for key, value in results.items() + } + + @dataclass class QmController(Controller): """:class:`qibolab.instruments.abstract.Controller` object for controlling @@ -321,45 +343,30 @@ def simulate_program(self, program): ) return self.manager.simulate(asdict(self.config), program, simulation_config) - def play(self, configs, sequences, options, integration_setup): - return self.sweep(configs, sequences, options, integration_setup) - - def sweep(self, configs, sequences, options, integration_setup, *sweepers): + def play( + self, + configs: dict[str, Config], + sequences: list[PulseSequence], + options: ExecutionParameters, + integration_setup, + sweepers: list[ParallelSweepers], + ): if len(sequences) > 1: raise NotImplementedError - elif len(sequences) == 0: - return {} - - sequence = sequences[0] - if len(sequence) == 0: + elif len(sequences) == 0 or len(sequences[0]) == 0: return {} - buffer_dims = [len(sweeper.values) for sweeper in reversed(sweepers)] - if options.averaging_mode is AveragingMode.SINGLESHOT: - buffer_dims.append(options.nshots) - # register DC elements so that all qubits are # sweetspot even when they are not used for channel in self.channels.values(): if isinstance(channel.logical_channel, DcChannel): self.configure_channel(channel, configs) + sequence = sequences[0] acquisitions = self.register_pulses( configs, sequence, integration_setup, options ) - with qua.program() as experiment: - n = declare(int) - # declare acquisition variables - for acquisition in acquisitions.values(): - acquisition.declare() - # execute pulses - args = ExecutionArguments(sequence, acquisitions, options.relaxation_time) - with for_(n, 0, n < options.nshots, n + 1): - sweep(list(sweepers), configs, args) - # download acquisitions - with qua.stream_processing(): - for acquisition in acquisitions.values(): - acquisition.download(*buffer_dims) + experiment = program(configs, sequence, options, acquisitions, sweepers) if self.manager is None: warnings.warn( diff --git a/src/qibolab/instruments/qm/program.py b/src/qibolab/instruments/qm/program.py deleted file mode 100644 index cc6a2deed3..0000000000 --- a/src/qibolab/instruments/qm/program.py +++ /dev/null @@ -1,77 +0,0 @@ -from collections import defaultdict -from dataclasses import dataclass, field -from typing import Optional - -from qm import qua - -from qibolab.pulses import Delay, PulseSequence - -from .acquisition import Acquisition -from .config import operation - - -@dataclass -class Parameters: - # TODO: Change the following types to QUA variables - duration: Optional[int] = None - amplitude: Optional[float] = None - phase: Optional[float] = None - - -def _delay(pulse: Delay, element: str, parameters: Parameters): - # TODO: How to play delays on multiple elements? - if parameters.duration is None: - duration = pulse.duration // 4 + 1 - else: - duration = parameters.duration - qua.wait(duration, element) - - -def _play( - op: str, - element: str, - parameters: Parameters, - acquisition: Optional[Acquisition] = None, -): - if parameters.phase is not None: - qua.frame_rotation_2pi(parameters.phase, element) - if parameters.amplitude is not None: - op = op * parameters.amplitude - - if acquisition is not None: - acquisition.measure(op) - else: - qua.play(op, element, duration=parameters.duration) - - if parameters.phase is not None: - qua.reset_frame(element) - - -@dataclass -class ExecutionArguments: - sequence: PulseSequence - acquisitions: dict[tuple[str, str], Acquisition] - relaxation_time: int = 0 - parameters: dict[str, Parameters] = field( - default_factory=lambda: defaultdict(Parameters) - ) - - -def play(args: ExecutionArguments): - """Part of QUA program that plays an arbitrary pulse sequence. - - Should be used inside a ``program()`` context. - """ - qua.align() - for element, pulses in args.sequence.items(): - for pulse in pulses: - op = operation(pulse) - params = args.parameters[op] - if isinstance(pulse, Delay): - _delay(pulse, element, params) - else: - acquisition = args.acquisitions.get((op, element)) - _play(op, element, params, acquisition) - - if args.relaxation_time > 0: - qua.wait(args.relaxation_time // 4) diff --git a/src/qibolab/instruments/qm/program/__init__.py b/src/qibolab/instruments/qm/program/__init__.py new file mode 100644 index 0000000000..98e99fbe59 --- /dev/null +++ b/src/qibolab/instruments/qm/program/__init__.py @@ -0,0 +1,2 @@ +from .acquisition import Acquisitions, create_acquisition +from .instructions import program diff --git a/src/qibolab/instruments/qm/acquisition.py b/src/qibolab/instruments/qm/program/acquisition.py similarity index 90% rename from src/qibolab/instruments/qm/acquisition.py rename to src/qibolab/instruments/qm/program/acquisition.py index aabd212aee..c83191ce0c 100644 --- a/src/qibolab/instruments/qm/acquisition.py +++ b/src/qibolab/instruments/qm/program/acquisition.py @@ -1,5 +1,4 @@ from abc import ABC, abstractmethod -from collections import defaultdict from dataclasses import dataclass, field from typing import Optional @@ -237,7 +236,7 @@ def create_acquisition( options: ExecutionParameters, threshold: float, angle: float, -): +) -> Acquisition: """Create container for the variables used for saving acquisition in the QUA program. @@ -260,25 +259,4 @@ def create_acquisition( return acquisition -def fetch_results(result, acquisitions): - """Fetches results from an executed experiment. - - Args: - result: Result of the executed experiment. - acquisition: Dictionary containing :class:`qibolab.instruments.qm.acquisition.Acquisition` objects. - - Returns: - Dictionary with the results in the format required by the platform. - """ - handles = result.result_handles - handles.wait_for_all_values() # for async replace with ``handles.is_processing()`` - results = defaultdict(list) - for acquisition in acquisitions: - data = acquisition.fetch(handles) - for serial, result in zip(acquisition.keys, data): - results[serial].append(result) - - # collapse single element lists for back-compatibility - return { - key: value[0] if len(value) == 1 else value for key, value in results.items() - } +Acquisitions = dict[tuple[str, str], Acquisition] diff --git a/src/qibolab/instruments/qm/program/arguments.py b/src/qibolab/instruments/qm/program/arguments.py new file mode 100644 index 0000000000..36f5d7b3c2 --- /dev/null +++ b/src/qibolab/instruments/qm/program/arguments.py @@ -0,0 +1,26 @@ +from collections import defaultdict +from dataclasses import dataclass, field +from typing import Optional + +from qm.qua._dsl import _Variable # for type declaration only + +from qibolab.pulses import PulseSequence + +from .acquisition import Acquisition + + +@dataclass +class Parameters: + duration: Optional[_Variable] = None + amplitude: Optional[_Variable] = None + phase: Optional[_Variable] = None + + +@dataclass +class ExecutionArguments: + sequence: PulseSequence + acquisitions: dict[tuple[str, str], Acquisition] + relaxation_time: int = 0 + parameters: dict[str, Parameters] = field( + default_factory=lambda: defaultdict(Parameters) + ) diff --git a/src/qibolab/instruments/qm/program/instructions.py b/src/qibolab/instruments/qm/program/instructions.py new file mode 100644 index 0000000000..fb200a9f68 --- /dev/null +++ b/src/qibolab/instruments/qm/program/instructions.py @@ -0,0 +1,121 @@ +from typing import Optional + +from qm import qua +from qm.qua import declare, for_ +from qualang_tools.loops import from_array + +from qibolab.components import Config +from qibolab.execution_parameters import AcquisitionType, ExecutionParameters +from qibolab.pulses import Delay, PulseSequence +from qibolab.sweeper import ParallelSweepers, Sweeper + +from ..config import operation +from .acquisition import Acquisition, Acquisitions +from .arguments import ExecutionArguments, Parameters +from .sweepers import QUA_SWEEPERS + + +def _delay(pulse: Delay, element: str, parameters: Parameters): + # TODO: How to play delays on multiple elements? + if parameters.duration is None: + duration = pulse.duration // 4 + 1 + else: + duration = parameters.duration + qua.wait(duration, element) + + +def _play( + op: str, + element: str, + parameters: Parameters, + acquisition: Optional[Acquisition] = None, +): + if parameters.phase is not None: + qua.frame_rotation_2pi(parameters.phase, element) + if parameters.amplitude is not None: + op = op * parameters.amplitude + + if acquisition is not None: + acquisition.measure(op) + else: + qua.play(op, element, duration=parameters.duration) + + if parameters.phase is not None: + qua.reset_frame(element) + + +def play(args: ExecutionArguments): + """Part of QUA program that plays an arbitrary pulse sequence. + + Should be used inside a ``program()`` context. + """ + qua.align() + for element, pulses in args.sequence.items(): + for pulse in pulses: + op = operation(pulse) + params = args.parameters[op] + if isinstance(pulse, Delay): + _delay(pulse, element, params) + else: + acquisition = args.acquisitions.get((op, element)) + _play(op, element, params, acquisition) + + if args.relaxation_time > 0: + qua.wait(args.relaxation_time // 4) + + +def _sweep_recursion(sweepers, configs, args): + """Unrolls a list of qibolab sweepers to the corresponding QUA for loops + using recursion.""" + if len(sweepers) > 0: + sweeper = sweepers[0] + parameter = sweeper.parameter + if parameter in QUA_SWEEPERS: + qua_sweeper = QUA_SWEEPERS[parameter](sweeper) + else: + raise NotImplementedError(f"Sweeper for {parameter} is not implemented.") + + variable = qua_sweeper.declare() + with for_(*from_array(variable, qua_sweeper.values)): + qua_sweeper(variable, configs, args) + _sweep_recursion(sweepers[1:], configs, args) + + else: + play(args) + + +def sweep( + sweepers: list[Sweeper], configs: dict[str, Config], args: ExecutionArguments +): + """Public sweep function that is called by the driver.""" + # for sweeper in sweepers: + # if sweeper.parameter is Parameter.duration: + # _update_baked_pulses(sweeper, instructions, config) + _sweep_recursion(sweepers, configs, args) + + +def program( + self, + configs: dict[str, Config], + sequence: PulseSequence, + options: ExecutionParameters, + acquisitions: Acquisitions, + sweepers: list[ParallelSweepers], +): + """QUA program implementing the required experiment.""" + with qua.program() as experiment: + n = declare(int) + # declare acquisition variables + for acquisition in acquisitions.values(): + acquisition.declare() + # execute pulses + args = ExecutionArguments(sequence, acquisitions, options.relaxation_time) + with for_(n, 0, n < options.nshots, n + 1): + sweep(list(sweepers), configs, args) + # download acquisitions + has_iq = options.acquisition_type is AcquisitionType.INTEGRATION + buffer_dims = options.results_shape(sweepers)[::-1][int(has_iq) :] + with qua.stream_processing(): + for acquisition in acquisitions.values(): + acquisition.download(*buffer_dims) + return experiment diff --git a/src/qibolab/instruments/qm/sweepers.py b/src/qibolab/instruments/qm/program/sweepers.py similarity index 72% rename from src/qibolab/instruments/qm/sweepers.py rename to src/qibolab/instruments/qm/program/sweepers.py index e9a2fe7a0a..a693f216a8 100644 --- a/src/qibolab/instruments/qm/sweepers.py +++ b/src/qibolab/instruments/qm/program/sweepers.py @@ -1,23 +1,25 @@ import math from dataclasses import dataclass +from typing import Optional import numpy as np +import numpy.typing as npt from qibo.config import raise_error from qm import qua -from qm.qua import declare, fixed, for_ -from qualang_tools.loops import from_array +from qm.qua import declare, fixed +from qm.qua._dsl import _Variable # for type declaration only from qibolab.components import Config from qibolab.sweeper import Parameter, Sweeper -from .config import operation -from .program import ExecutionArguments, play +from ..config import operation +from .arguments import ExecutionArguments MAX_OFFSET = 0.5 """Maximum voltage supported by Quantum Machines OPX+ instrument in volts.""" -def maximum_sweep_value(values, value0): +def maximum_sweep_value(values: npt.NDArray, value0: npt.NDArray) -> float: """Calculates maximum value that is reached during a sweep. Useful to check whether a sweep exceeds the range of allowed values. @@ -32,7 +34,7 @@ def maximum_sweep_value(values, value0): return max(abs(min(values) + value0), abs(max(values) + value0)) -def check_max_offset(offset, max_offset=MAX_OFFSET): +def check_max_offset(offset: Optional[float], max_offset: float = MAX_OFFSET): """Checks if a given offset value exceeds the maximum supported offset. This is to avoid sending high currents that could damage lab @@ -65,23 +67,27 @@ class QuaSweep: sweeper: Sweeper - def declare(self): + def declare(self) -> _Variable: return declare(fixed) @property - def values(self): + def values(self) -> npt.NDArray: return self.sweeper.values - def __call__(self, variable, configs, args): + def __call__( + self, variable: _Variable, configs: dict[str, Config], args: ExecutionArguments + ): raise NotImplementedError class Frequency(QuaSweep): - def declare(self): + def declare(self) -> _Variable: return declare(int) - def __call__(self, variable, configs, args): + def __call__( + self, variable: _Variable, configs: dict[str, Config], args: ExecutionArguments + ): for channel in self.sweeper.channels: lo_frequency = configs[channel.lo].frequency # convert to IF frequency for readout and drive pulses @@ -98,7 +104,9 @@ def __call__(self, variable, configs, args): class Amplitude(QuaSweep): - def __call__(self, variable, configs, args): + def __call__( + self, variable: _Variable, configs: dict[str, Config], args: ExecutionArguments + ): # TODO: Consider sweeping amplitude without multiplication if min(self.values) < -2: raise_error( @@ -119,17 +127,21 @@ def __call__(self, variable, configs, args): class RelativePhase(QuaSweep): @property - def values(self): + def values(self) -> npt.NDArray: return self.sweeper.values / (2 * np.pi) - def __call__(self, variable, configs, args): + def __call__( + self, variable: _Variable, configs: dict[str, Config], args: ExecutionArguments + ): for pulse in self.sweeper.pulses: args.parameters[operation(pulse)].phase = variable class Bias(QuaSweep): - def __call__(self, variable, configs, args): + def __call__( + self, variable: _Variable, configs: dict[str, Config], args: ExecutionArguments + ): for channel in self.sweeper.channels: offset = configs[channel.name].offset max_value = maximum_sweep_value(self.values, offset) @@ -144,14 +156,16 @@ def __call__(self, variable, configs, args): class Duration(QuaSweep): - def declare(self): + def declare(self) -> _Variable: return declare(int) @property - def values(self): + def values(self) -> npt.NDArray: return (self.sweeper.values // 4).astype(int) - def __call__(self, variable, configs, args): + def __call__( + self, variable: _Variable, configs: dict[str, Config], args: ExecutionArguments + ): # TODO: Handle baked pulses for pulse in self.sweeper.pulses: args.parameters[operation(pulse)].duration = variable @@ -164,35 +178,3 @@ def __call__(self, variable, configs, args): Parameter.relative_phase: RelativePhase, Parameter.bias: Bias, } - - -def _sweep_recursion(sweepers, configs, args): - """Unrolls a list of qibolab sweepers to the corresponding QUA for loops - using recursion.""" - if len(sweepers) > 0: - sweeper = sweepers[0] - parameter = sweeper.parameter - if parameter in QUA_SWEEPERS: - qua_sweeper = QUA_SWEEPERS[parameter](sweeper) - else: - raise_error( - NotImplementedError, f"Sweeper for {parameter} is not implemented." - ) - - variable = qua_sweeper.declare() - with for_(*from_array(variable, qua_sweeper.values)): - qua_sweeper(variable, configs, args) - _sweep_recursion(sweepers[1:], configs, args) - - else: - play(args) - - -def sweep( - sweepers: list[Sweeper], configs: dict[str, Config], args: ExecutionArguments -): - """Public sweep function that is called by the driver.""" - # for sweeper in sweepers: - # if sweeper.parameter is Parameter.duration: - # _update_baked_pulses(sweeper, instructions, config) - _sweep_recursion(sweepers, configs, args) From a9d4fb3e03c70a712f09cb90b8fb91b3f78601b5 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 6 Aug 2024 19:52:17 +0400 Subject: [PATCH 0462/1006] refactor: move Octave to controller file --- src/qibolab/instruments/qm/__init__.py | 3 +-- src/qibolab/instruments/qm/controller.py | 15 ++++++++++++++- src/qibolab/instruments/qm/octave.py | 13 ------------- tests/test_instruments_qm.py | 1 - 4 files changed, 15 insertions(+), 17 deletions(-) delete mode 100644 src/qibolab/instruments/qm/octave.py diff --git a/src/qibolab/instruments/qm/__init__.py b/src/qibolab/instruments/qm/__init__.py index 80b836296e..bb7e1fa795 100644 --- a/src/qibolab/instruments/qm/__init__.py +++ b/src/qibolab/instruments/qm/__init__.py @@ -1,3 +1,2 @@ from .components import * -from .controller import QmController -from .octave import Octave +from .controller import * diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 6806afbfb5..c807d7a045 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -20,7 +20,6 @@ from .components import QmChannel from .config import SAMPLING_RATE, QmConfig, operation -from .octave import Octave from .program import create_acquisition, program OCTAVE_ADDRESS_OFFSET = 11000 @@ -29,6 +28,20 @@ CALIBRATION_DB = "calibration_db.json" """Name of the file where the mixer calibration is stored.""" +__all__ = ["QmController", "Octave"] + + +@dataclass(frozen=True) +class Octave: + """Device handling Octaves.""" + + name: str + """Name of the device.""" + port: int + """Network port of the Octave in the cluster configuration.""" + connectivity: str + """OPXplus that acts as the waveform generator for the Octave.""" + def declare_octaves(octaves, host, calibration_path=None): """Initiate Octave configuration and add octaves info. diff --git a/src/qibolab/instruments/qm/octave.py b/src/qibolab/instruments/qm/octave.py deleted file mode 100644 index 049c663095..0000000000 --- a/src/qibolab/instruments/qm/octave.py +++ /dev/null @@ -1,13 +0,0 @@ -from dataclasses import dataclass - - -@dataclass(frozen=True) -class Octave: - """Device handling Octaves.""" - - name: str - """Name of the device.""" - port: int - """Network port of the Octave in the cluster configuration.""" - connectivity: str - """OPXplus that acts as the waveform generator for the Octave.""" diff --git a/tests/test_instruments_qm.py b/tests/test_instruments_qm.py index 736be3c604..65c80490fd 100644 --- a/tests/test_instruments_qm.py +++ b/tests/test_instruments_qm.py @@ -6,7 +6,6 @@ from qibolab import AcquisitionType, ExecutionParameters, create_platform from qibolab.instruments.qm import QmController -from qibolab.instruments.qm.acquisition import Acquisition from qibolab.pulses import Pulse, PulseSequence, PulseType, Rectangular from qibolab.qubits import Qubit from qibolab.sweeper import Parameter, Sweeper From c7ab0120ead73f294c874a434ecf777701481c13 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 6 Aug 2024 23:08:49 +0400 Subject: [PATCH 0463/1006] fix: single shot routine working --- src/qibolab/instruments/qm/program/instructions.py | 1 - src/qibolab/platform/platform.py | 5 +++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/qibolab/instruments/qm/program/instructions.py b/src/qibolab/instruments/qm/program/instructions.py index fb200a9f68..864fa6d2b1 100644 --- a/src/qibolab/instruments/qm/program/instructions.py +++ b/src/qibolab/instruments/qm/program/instructions.py @@ -95,7 +95,6 @@ def sweep( def program( - self, configs: dict[str, Config], sequence: PulseSequence, options: ExecutionParameters, diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index ccea081bf4..8c81a005e7 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -236,6 +236,7 @@ def _execute( self, sequences: list[PulseSequence], options: ExecutionParameters, + configs: dict[str, Config], integration_setup: IntegrationSetup, sweepers: list[ParallelSweepers], ): @@ -245,7 +246,7 @@ def _execute( for instrument in self.instruments.values(): if isinstance(instrument, Controller): new_result = instrument.play( - options.updates, sequences, options, integration_setup, sweepers + configs, sequences, options, integration_setup, sweepers ) if isinstance(new_result, dict): result.update(new_result) @@ -314,7 +315,7 @@ def execute( results = defaultdict(list) for b in batch(sequences, self._controller.bounds): - result = self._execute(b, options, integration_setup, sweepers) + result = self._execute(b, options, configs, integration_setup, sweepers) for serial, data in result.items(): results[serial].append(data) From b2a7b6b000c37a5e20275196a6d19370d10be601 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 6 Aug 2024 23:58:36 +0400 Subject: [PATCH 0464/1006] fix: sweepers --- src/qibolab/instruments/qm/program/instructions.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/qibolab/instruments/qm/program/instructions.py b/src/qibolab/instruments/qm/program/instructions.py index 864fa6d2b1..ae7eeedf86 100644 --- a/src/qibolab/instruments/qm/program/instructions.py +++ b/src/qibolab/instruments/qm/program/instructions.py @@ -7,7 +7,7 @@ from qibolab.components import Config from qibolab.execution_parameters import AcquisitionType, ExecutionParameters from qibolab.pulses import Delay, PulseSequence -from qibolab.sweeper import ParallelSweepers, Sweeper +from qibolab.sweeper import ParallelSweepers from ..config import operation from .acquisition import Acquisition, Acquisitions @@ -68,7 +68,11 @@ def _sweep_recursion(sweepers, configs, args): """Unrolls a list of qibolab sweepers to the corresponding QUA for loops using recursion.""" if len(sweepers) > 0: - sweeper = sweepers[0] + parallel_sweepers = sweepers[0] + if len(parallel_sweepers) > 1: + raise NotImplementedError + + sweeper = parallel_sweepers[0] parameter = sweeper.parameter if parameter in QUA_SWEEPERS: qua_sweeper = QUA_SWEEPERS[parameter](sweeper) @@ -85,7 +89,9 @@ def _sweep_recursion(sweepers, configs, args): def sweep( - sweepers: list[Sweeper], configs: dict[str, Config], args: ExecutionArguments + sweepers: list[ParallelSweepers], + configs: dict[str, Config], + args: ExecutionArguments, ): """Public sweep function that is called by the driver.""" # for sweeper in sweepers: From 80fce172ac6bff4885d5b054b46fae294c9c2059 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Wed, 7 Aug 2024 00:54:22 +0400 Subject: [PATCH 0465/1006] fix: docstrings --- .../instruments/qm/components/channel.py | 2 +- src/qibolab/instruments/qm/config/config.py | 6 ++- src/qibolab/instruments/qm/controller.py | 47 +++++++------------ .../instruments/qm/program/acquisition.py | 7 ++- .../instruments/qm/program/arguments.py | 8 ++++ .../instruments/qm/program/sweepers.py | 7 +++ 6 files changed, 43 insertions(+), 34 deletions(-) diff --git a/src/qibolab/instruments/qm/components/channel.py b/src/qibolab/instruments/qm/components/channel.py index eb23e4952e..c00dc7da7e 100644 --- a/src/qibolab/instruments/qm/components/channel.py +++ b/src/qibolab/instruments/qm/components/channel.py @@ -9,7 +9,7 @@ @dataclass(frozen=True) class QmChannel: - """Channel for Zurich Instruments (ZI) devices.""" + """Channel for Quantum Machines devices.""" logical_channel: Channel """Corresponding logical channel.""" diff --git a/src/qibolab/instruments/qm/config/config.py b/src/qibolab/instruments/qm/config/config.py index ffd8353dca..9f876a88af 100644 --- a/src/qibolab/instruments/qm/config/config.py +++ b/src/qibolab/instruments/qm/config/config.py @@ -14,7 +14,11 @@ @dataclass class QmConfig: - """Configuration for communicating with the ``QuantumMachinesManager``.""" + """Configuration for communicating with the ``QuantumMachinesManager``. + + Contains nested ``dataclass`` objects and is serialized using ``asdict`` + to be sent to the instrument. + """ version: int = 1 controllers: dict[str, Controller] = field(default_factory=dict) diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index c807d7a045..3e305e01c5 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -33,7 +33,7 @@ @dataclass(frozen=True) class Octave: - """Device handling Octaves.""" + """User-facing object for defining Octave configuration.""" name: str """Name of the device.""" @@ -109,16 +109,13 @@ class QmController(Controller): """:class:`qibolab.instruments.abstract.Controller` object for controlling a Quantum Machines cluster. - A cluster consists of multiple :class:`qibolab.instruments.qm.devices.QMDevice` devices. - Playing pulses on QM controllers requires a ``config`` dictionary and a program written in QUA language. - The ``config`` file is generated in parts in :class:`qibolab.instruments.qm.config.QmConfig`. - Controllers, elements and pulses are all registered after a pulse sequence is given, so that - the config contains only elements related to the participating channels. - The QUA program for executing an arbitrary :class:`qibolab.pulses.PulseSequence` is written in - :meth:`qibolab.instruments.qm.controller.QMController.play` and executed in - :meth:`qibolab.instruments.qm.controller.QMController.execute_program`. + The ``config`` file is generated using the ``dataclass`` objects defined in + :py_mod:`qibolab.instruments.qm.config`. + The QUA program is generated using the methods in :py_mod:`qibolab.instruments.qm.program`. + Controllers, elements and pulses are added in the ``config`` after a pulse sequence is given, + so that only elements related to the participating channels are registered. """ name: str @@ -130,8 +127,9 @@ class QmController(Controller): """ octaves: dict[str, Octave] - """Dictionary containing the :class:`qibolab.instruments.qm.devices.Octave` - instruments being used.""" + """Dictionary containing the + :class:`qibolab.instruments.qm.controller.Octave` instruments being + used.""" channels: dict[str, QmChannel] bounds: Bounds = Bounds(0, 0, 0) @@ -181,6 +179,7 @@ class QmController(Controller): def __post_init__(self): super().__init__(self.name, self.address) # redefine bounds because abstract instrument overwrites them + # FIXME: This overwrites the ``bounds`` given in the runcard! self.bounds = Bounds( waveforms=int(4e4), readout=30, @@ -235,12 +234,14 @@ def disconnect(self): self.is_connected = False def configure_device(self, device: str): + """Add device in the ``config``.""" if "octave" in device: self.config.add_octave(device, self.octaves[device].connectivity) else: self.config.add_controller(device) def configure_channel(self, channel: QmChannel, configs: dict[str, Config]): + """Add element (QM version of channel) in the config.""" logical_channel = channel.logical_channel channel_config = configs[logical_channel.name] self.configure_device(channel.device) @@ -269,6 +270,7 @@ def configure_channel(self, channel: QmChannel, configs: dict[str, Config]): raise TypeError(f"Unknown channel type: {type(channel)}.") def register_pulse(self, channel: Channel, pulse: Pulse): + """Add pulse in the ``config``.""" # if ( # pulse.duration % 4 != 0 # or pulse.duration < 16 @@ -284,18 +286,11 @@ def register_pulse(self, channel: Channel, pulse: Pulse): return self.config.register_acquisition_pulse(channel.name, pulse) def register_pulses(self, configs, sequence, integration_setup, options): - """Translates a :class:`qibolab.pulses.PulseSequence` to - :class:`qibolab.instruments.qm.instructions.Instructions`. - - Args: - sequence (:class:`qibolab.pulses.PulseSequence`). Pulse sequence to translate. - configs (dict): - options: - sweepers (list): List of sweeper objects so that pulses that require baking are identified. + """Adds all pulses of a given :class:`qibolab.pulses.PulseSequence` in + the ``config``. Returns: acquisitions (dict): Map from measurement instructions to acquisition objects. - parameters (dict): """ acquisitions = {} for name, channel_sequence in sequence.items(): @@ -334,20 +329,12 @@ def register_pulses(self, configs, sequence, integration_setup, options): return acquisitions def execute_program(self, program): - """Executes an arbitrary program written in QUA language. - - Args: - program: QUA program. - """ + """Executes an arbitrary program written in QUA language.""" machine = self.manager.open_qm(asdict(self.config)) return machine.execute(program) def simulate_program(self, program): - """Simulates an arbitrary program written in QUA language. - - Args: - program: QUA program. - """ + """Simulates an arbitrary program written in QUA language.""" ncontrollers = len(self.config.controllers) controller_connections = create_simulator_controller_connections(ncontrollers) simulation_config = SimulationConfig( diff --git a/src/qibolab/instruments/qm/program/acquisition.py b/src/qibolab/instruments/qm/program/acquisition.py index c83191ce0c..cf1b55ac2f 100644 --- a/src/qibolab/instruments/qm/program/acquisition.py +++ b/src/qibolab/instruments/qm/program/acquisition.py @@ -18,8 +18,11 @@ def _split(data, npulses, iq=False): - """Split results of different readout pulses that were acquired in the same - acquisition.""" + """Split results of different readout pulses to list. + + These results were acquired in the same acquisition stream in the + instrument. + """ if npulses == 1: return [data] if iq: diff --git a/src/qibolab/instruments/qm/program/arguments.py b/src/qibolab/instruments/qm/program/arguments.py index 36f5d7b3c2..efd3869759 100644 --- a/src/qibolab/instruments/qm/program/arguments.py +++ b/src/qibolab/instruments/qm/program/arguments.py @@ -11,6 +11,8 @@ @dataclass class Parameters: + """Container of swept QUA variables.""" + duration: Optional[_Variable] = None amplitude: Optional[_Variable] = None phase: Optional[_Variable] = None @@ -18,6 +20,12 @@ class Parameters: @dataclass class ExecutionArguments: + """Container of arguments required to generate the QUA program. + + These are collected in a single class because they are passed to all + the different sweeper types. + """ + sequence: PulseSequence acquisitions: dict[tuple[str, str], Acquisition] relaxation_time: int = 0 diff --git a/src/qibolab/instruments/qm/program/sweepers.py b/src/qibolab/instruments/qm/program/sweepers.py index a693f216a8..79b5692655 100644 --- a/src/qibolab/instruments/qm/program/sweepers.py +++ b/src/qibolab/instruments/qm/program/sweepers.py @@ -64,19 +64,26 @@ def check_max_offset(offset: Optional[float], max_offset: float = MAX_OFFSET): @dataclass class QuaSweep: + """Base class for different sweep parameters.""" sweeper: Sweeper def declare(self) -> _Variable: + """Declares the QUA variable that is swept.""" return declare(fixed) @property def values(self) -> npt.NDArray: + """Returns array of values that we are sweeping over. + + Implements potential normalizations. + """ return self.sweeper.values def __call__( self, variable: _Variable, configs: dict[str, Config], args: ExecutionArguments ): + """Part of the QUA program that updates the swept variable.""" raise NotImplementedError From f80821bc239686f80eb9114c35ef5c252887d685 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Wed, 7 Aug 2024 01:02:41 +0400 Subject: [PATCH 0466/1006] fix: drop complex value from raw acquisition --- src/qibolab/instruments/qm/program/acquisition.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibolab/instruments/qm/program/acquisition.py b/src/qibolab/instruments/qm/program/acquisition.py index cf1b55ac2f..26a906ca2b 100644 --- a/src/qibolab/instruments/qm/program/acquisition.py +++ b/src/qibolab/instruments/qm/program/acquisition.py @@ -111,7 +111,7 @@ def fetch(self, handles): qres = handles.get(f"{self.name}_Q").fetch_all() # convert raw ADC signal to volts u = unit() - signal = collect(u.raw2volts(ires), 1j * u.raw2volts(qres)) + signal = collect(u.raw2volts(ires), u.raw2volts(qres)) return _split(signal, self.npulses, iq=True) From 1949e4de0e44f41b1839bc4d9280b99849aa7839 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 8 Aug 2024 15:43:31 +0400 Subject: [PATCH 0467/1006] chore: rename _normalize_phase to _wrap --- src/qibolab/instruments/qm/config/pulses.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/qibolab/instruments/qm/config/pulses.py b/src/qibolab/instruments/qm/config/pulses.py index a9aa9491e7..c42e35400b 100644 --- a/src/qibolab/instruments/qm/config/pulses.py +++ b/src/qibolab/instruments/qm/config/pulses.py @@ -23,7 +23,8 @@ def operation(pulse): return str(hash(pulse)) -def _normalize_phase(phase: float): +def _wrap(phase: float): + """Convert phase to multiples of 2pi.""" return (phase % (2 * np.pi)) / (2 * np.pi) @@ -34,7 +35,7 @@ class ConstantWaveform: @classmethod def from_pulse(cls, pulse: Pulse): - phase = _normalize_phase(pulse.relative_phase) + phase = _wrap(pulse.relative_phase) return { "I": cls(pulse.amplitude * np.cos(phase)), "Q": cls(pulse.amplitude * np.sin(phase)), @@ -48,7 +49,7 @@ class ArbitraryWaveform: @classmethod def from_pulse(cls, pulse: Pulse): - phase = _normalize_phase(pulse.relative_phase) + phase = _wrap(pulse.relative_phase) samples_i = pulse.i(SAMPLING_RATE) samples_q = pulse.q(SAMPLING_RATE) return { From 8609dd6814c06fb877838d427131905533151ebe Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 8 Aug 2024 15:49:31 +0400 Subject: [PATCH 0468/1006] refactor: move QmChannel.serial to function --- src/qibolab/instruments/qm/components/channel.py | 4 ---- src/qibolab/instruments/qm/config/config.py | 13 +++++++++---- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/qibolab/instruments/qm/components/channel.py b/src/qibolab/instruments/qm/components/channel.py index c00dc7da7e..6aabc3c2a9 100644 --- a/src/qibolab/instruments/qm/components/channel.py +++ b/src/qibolab/instruments/qm/components/channel.py @@ -17,7 +17,3 @@ class QmChannel: """Name of the device.""" port: int """Number of port.""" - - @property - def serial(self): - return {"port": (self.device, self.port)} diff --git a/src/qibolab/instruments/qm/config/config.py b/src/qibolab/instruments/qm/config/config.py index 9f876a88af..ada193cfbd 100644 --- a/src/qibolab/instruments/qm/config/config.py +++ b/src/qibolab/instruments/qm/config/config.py @@ -12,6 +12,11 @@ __all__ = ["QmConfig"] +def _to_port(channel: QmChannel) -> dict[str, tuple[str, int]]: + """Convert a channel to the port dictionary required for the QUA config.""" + return {"port": (channel.device, channel.port)} + + @dataclass class QmConfig: """Configuration for communicating with the ``QuantumMachinesManager``. @@ -44,7 +49,7 @@ def add_octave(self, device: str, connectivity: str): def configure_dc_line(self, channel: QmChannel, config: OpxOutputConfig): controller = self.controllers[channel.device] controller.analog_outputs[str(channel.port)] = config - self.elements[channel.logical_channel.name] = DcElement(channel.serial) + self.elements[channel.logical_channel.name] = DcElement(_to_port(channel)) def configure_iq_line( self, channel: QmChannel, config: IqConfig, lo_config: OscillatorConfig @@ -56,7 +61,7 @@ def configure_iq_line( intermediate_frequency = config.frequency - lo_config.frequency self.elements[channel.logical_channel.name] = RfOctaveElement( - channel.serial, + _to_port(channel), output_switch(octave.connectivity, channel.port), intermediate_frequency, ) @@ -81,8 +86,8 @@ def configure_acquire_line( intermediate_frequency = probe_config.frequency - lo_config.frequency self.elements[probe_channel.logical_channel.name] = AcquireOctaveElement( - probe_channel.serial, - acquire_channel.serial, + _to_port(probe_channel), + _to_port(acquire_channel), output_switch(octave.connectivity, probe_channel.port), intermediate_frequency, time_of_flight=acquire_config.delay, From e028d9d9f8374f51422a450ddea11ea922e36069 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 8 Aug 2024 15:56:00 +0400 Subject: [PATCH 0469/1006] refactor: use custom __setitem__ for converting ports to str --- src/qibolab/instruments/qm/config/config.py | 10 +++--- src/qibolab/instruments/qm/config/devices.py | 33 ++++++++++++++------ 2 files changed, 28 insertions(+), 15 deletions(-) diff --git a/src/qibolab/instruments/qm/config/config.py b/src/qibolab/instruments/qm/config/config.py index ada193cfbd..27d53b022d 100644 --- a/src/qibolab/instruments/qm/config/config.py +++ b/src/qibolab/instruments/qm/config/config.py @@ -48,7 +48,7 @@ def add_octave(self, device: str, connectivity: str): def configure_dc_line(self, channel: QmChannel, config: OpxOutputConfig): controller = self.controllers[channel.device] - controller.analog_outputs[str(channel.port)] = config + controller.analog_outputs[channel.port] = config self.elements[channel.logical_channel.name] = DcElement(_to_port(channel)) def configure_iq_line( @@ -56,13 +56,13 @@ def configure_iq_line( ): port = channel.port octave = self.octaves[channel.device] - octave.RF_outputs[str(port)] = OctaveOutput.from_config(lo_config) + octave.RF_outputs[port] = OctaveOutput.from_config(lo_config) self.controllers[octave.connectivity].add_octave_output(port) intermediate_frequency = config.frequency - lo_config.frequency self.elements[channel.logical_channel.name] = RfOctaveElement( _to_port(channel), - output_switch(octave.connectivity, channel.port), + output_switch(octave.connectivity, port), intermediate_frequency, ) @@ -76,12 +76,12 @@ def configure_acquire_line( ): port = acquire_channel.port octave = self.octaves[acquire_channel.device] - octave.RF_inputs[str(port)] = OctaveInput(lo_config.frequency) + octave.RF_inputs[port] = OctaveInput(lo_config.frequency) self.controllers[octave.connectivity].add_octave_input(port, acquire_config) port = probe_channel.port octave = self.octaves[probe_channel.device] - octave.RF_outputs[str(port)] = OctaveOutput.from_config(lo_config) + octave.RF_outputs[port] = OctaveOutput.from_config(lo_config) self.controllers[octave.connectivity].add_octave_output(port) intermediate_frequency = probe_config.frequency - lo_config.frequency diff --git a/src/qibolab/instruments/qm/config/devices.py b/src/qibolab/instruments/qm/config/devices.py index 1b8aab4d22..6b088640f0 100644 --- a/src/qibolab/instruments/qm/config/devices.py +++ b/src/qibolab/instruments/qm/config/devices.py @@ -20,6 +20,17 @@ """ +class PortDict(dict): + """Dictionary that automatically converts keys to strings. + + Used to register input and output ports to controllers and Octaves + in the QUA config. + """ + + def __setitem__(self, key, value): + super().__setitem__(str(key), value) + + @dataclass(frozen=True) class AnalogInput: offset: float = 0.0 @@ -58,21 +69,23 @@ class OctaveInput: @dataclass class Controller: - analog_outputs: dict[str, dict[str, OpxOutputConfig]] = field(default_factory=dict) - digital_outputs: dict[str, dict[str, dict]] = field(default_factory=dict) - analog_inputs: dict[str, dict[str, AnalogInput]] = field( - default_factory=lambda: dict(DEFAULT_INPUTS) + analog_outputs: PortDict[str, dict[str, OpxOutputConfig]] = field( + default_factory=PortDict + ) + digital_outputs: PortDict[str, dict[str, dict]] = field(default_factory=PortDict) + analog_inputs: PortDict[str, dict[str, AnalogInput]] = field( + default_factory=lambda: PortDict(DEFAULT_INPUTS) ) def add_octave_output(self, port: int): # TODO: Add offset here? - self.analog_outputs[str(2 * port - 1)] = OpxOutputConfig() - self.analog_outputs[str(2 * port)] = OpxOutputConfig() + self.analog_outputs[2 * port - 1] = OpxOutputConfig() + self.analog_outputs[2 * port] = OpxOutputConfig() - self.digital_outputs[str(2 * port - 1)] = {} + self.digital_outputs[2 * port - 1] = {} def add_octave_input(self, port: int, config: QmAcquisitionConfig): - self.analog_inputs[str(2 * port - 1)] = self.analog_inputs[str(2 * port)] = ( + self.analog_inputs[2 * port - 1] = self.analog_inputs[2 * port] = ( AnalogInput.from_config(config) ) @@ -80,5 +93,5 @@ def add_octave_input(self, port: int, config: QmAcquisitionConfig): @dataclass class Octave: connectivity: str - RF_outputs: dict[str, dict[str, OctaveOutput]] = field(default_factory=dict) - RF_inputs: dict[str, dict[str, OctaveInput]] = field(default_factory=dict) + RF_outputs: PortDict[str, dict[str, OctaveOutput]] = field(default_factory=PortDict) + RF_inputs: PortDict[str, dict[str, OctaveInput]] = field(default_factory=PortDict) From 052f785b09770b63818c362456bfbb142bdc0e76 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 8 Aug 2024 16:08:59 +0400 Subject: [PATCH 0470/1006] refactor: add Waveforms dataclass --- src/qibolab/instruments/qm/config/pulses.py | 25 ++++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/src/qibolab/instruments/qm/config/pulses.py b/src/qibolab/instruments/qm/config/pulses.py index c42e35400b..83cd3a8185 100644 --- a/src/qibolab/instruments/qm/config/pulses.py +++ b/src/qibolab/instruments/qm/config/pulses.py @@ -63,15 +63,28 @@ def from_pulse(cls, pulse: Pulse): def waveforms_from_pulse(pulse: Pulse) -> Waveform: """Register QM waveforms for a given pulse.""" - if isinstance(pulse.envelope, Rectangular): - return ConstantWaveform.from_pulse(pulse) - return ArbitraryWaveform.from_pulse(pulse) + wvtype = ( + ConstantWaveform + if isinstance(pulse.envelope, Rectangular) + else ArbitraryWaveform + ) + return wvtype.from_pulse(pulse) + + +@dataclass(frozen=True) +class Waveforms: + i: str + q: str + + @classmethod + def from_op(cls, op: str): + return cls(f"{op}_i", f"{op}_q") @dataclass(frozen=True) class QmPulse: length: int - waveforms: dict[str, str] + waveforms: Waveforms digital_marker: str = "ON" operation: str = "control" @@ -80,7 +93,7 @@ def from_pulse(cls, pulse: Pulse): op = operation(pulse) return cls( length=pulse.duration, - waveforms={"I": f"{op}_i", "Q": f"{op}_q"}, + waveforms=Waveforms.from_op(op), ) @classmethod @@ -133,6 +146,6 @@ def from_pulse(cls, pulse: Pulse, element: str): } return cls( length=pulse.duration, - waveforms={"I": f"{op}_i", "Q": f"{op}_q"}, + waveforms=Waveforms.from_op(op), integration_weights=integration_weights, ) From 7a9353c8a501577e30c107caa0a96c86e628b0b4 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 8 Aug 2024 16:42:30 +0400 Subject: [PATCH 0471/1006] chore: constructors of elements --- src/qibolab/instruments/qm/config/config.py | 29 ++++++------- src/qibolab/instruments/qm/config/elements.py | 41 ++++++++++++++++++- 2 files changed, 52 insertions(+), 18 deletions(-) diff --git a/src/qibolab/instruments/qm/config/config.py b/src/qibolab/instruments/qm/config/config.py index 27d53b022d..b8d08f55ba 100644 --- a/src/qibolab/instruments/qm/config/config.py +++ b/src/qibolab/instruments/qm/config/config.py @@ -12,11 +12,6 @@ __all__ = ["QmConfig"] -def _to_port(channel: QmChannel) -> dict[str, tuple[str, int]]: - """Convert a channel to the port dictionary required for the QUA config.""" - return {"port": (channel.device, channel.port)} - - @dataclass class QmConfig: """Configuration for communicating with the ``QuantumMachinesManager``. @@ -49,7 +44,7 @@ def add_octave(self, device: str, connectivity: str): def configure_dc_line(self, channel: QmChannel, config: OpxOutputConfig): controller = self.controllers[channel.device] controller.analog_outputs[channel.port] = config - self.elements[channel.logical_channel.name] = DcElement(_to_port(channel)) + self.elements[channel.logical_channel.name] = DcElement.from_channel(channel) def configure_iq_line( self, channel: QmChannel, config: IqConfig, lo_config: OscillatorConfig @@ -60,10 +55,8 @@ def configure_iq_line( self.controllers[octave.connectivity].add_octave_output(port) intermediate_frequency = config.frequency - lo_config.frequency - self.elements[channel.logical_channel.name] = RfOctaveElement( - _to_port(channel), - output_switch(octave.connectivity, port), - intermediate_frequency, + self.elements[channel.logical_channel.name] = RfOctaveElement.from_channel( + channel, octave.connectivity, intermediate_frequency ) def configure_acquire_line( @@ -85,13 +78,15 @@ def configure_acquire_line( self.controllers[octave.connectivity].add_octave_output(port) intermediate_frequency = probe_config.frequency - lo_config.frequency - self.elements[probe_channel.logical_channel.name] = AcquireOctaveElement( - _to_port(probe_channel), - _to_port(acquire_channel), - output_switch(octave.connectivity, probe_channel.port), - intermediate_frequency, - time_of_flight=acquire_config.delay, - smearing=acquire_config.smearing, + self.elements[probe_channel.logical_channel.name] = ( + AcquireOctaveElement.from_channel( + probe_channel, + acquire_channel, + octave.connectivity, + intermediate_frequency, + time_of_flight=acquire_config.delay, + smearing=acquire_config.smearing, + ) ) def register_iq_pulse(self, element: str, pulse: Pulse): diff --git a/src/qibolab/instruments/qm/config/elements.py b/src/qibolab/instruments/qm/config/elements.py index 2a4048bf94..789134fdd1 100644 --- a/src/qibolab/instruments/qm/config/elements.py +++ b/src/qibolab/instruments/qm/config/elements.py @@ -3,8 +3,9 @@ import numpy as np +from ..components import QmChannel + __all__ = [ - "output_switch", "DcElement", "RfOctaveElement", "AcquireOctaveElement", @@ -44,6 +45,11 @@ class OutputSwitch: """ +def _to_port(channel: QmChannel) -> dict[str, tuple[str, int]]: + """Convert a channel to the port dictionary required for the QUA config.""" + return {"port": (channel.device, channel.port)} + + def output_switch(opx: str, port: int): """Create output switch section.""" return {"output_switch": OutputSwitch((opx, 2 * port - 1))} @@ -55,6 +61,10 @@ class DcElement: intermediate_frequency: int = 0 operations: dict[str, str] = field(default_factory=dict) + @classmethod + def from_channel(cls, channel: QmChannel): + return cls(_to_port(channel)) + @dataclass class RfOctaveElement: @@ -63,6 +73,16 @@ class RfOctaveElement: intermediate_frequency: int operations: dict[str, str] = field(default_factory=dict) + @classmethod + def from_channel( + cls, channel: QmChannel, connectivity: str, intermediate_frequency: int + ): + return cls( + _to_port(channel), + output_switch(octave.connectivity, channel.port), + intermediate_frequency, + ) + @dataclass class AcquireOctaveElement: @@ -74,5 +94,24 @@ class AcquireOctaveElement: smearing: int = 0 operations: dict[str, str] = field(default_factory=dict) + @classmethod + def from_channel( + cls, + probe_channel: QmChannel, + acquire_channel: QmChannel, + connectivity: str, + intermediate_frequency: int, + time_of_flight: int, + smearing: int, + ): + return cls( + _to_port(probe_channel), + _to_port(acquire_channel), + output_switch(connectivity, probe_channel.port), + intermediate_frequency, + time_of_flight=time_of_flight, + smearing=smearing, + ) + Element = Union[DcElement, RfOctaveElement, AcquireOctaveElement] From 5235841a09a03f02cab672f32825bbfd8a564c04 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 8 Aug 2024 16:51:08 +0400 Subject: [PATCH 0472/1006] chore: add QmConfig.register_waveforms method --- src/qibolab/instruments/qm/config/config.py | 31 +++++++++++++-------- src/qibolab/instruments/qm/config/pulses.py | 2 +- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/qibolab/instruments/qm/config/config.py b/src/qibolab/instruments/qm/config/config.py index b8d08f55ba..89851443ff 100644 --- a/src/qibolab/instruments/qm/config/config.py +++ b/src/qibolab/instruments/qm/config/config.py @@ -89,21 +89,33 @@ def configure_acquire_line( ) ) + def register_waveforms( + self, pulse: Pulse, element: Optional[str] = None, dc: bool = False + ): + if dc: + qmpulse = QmPulse.from_dc_pulse(pulse) + else: + if element is None: + qmpulse = QmPulse.from_pulse(pulse) + else: + qmpulse = QmAcquisition.from_pulse(pulse, element) + waveforms = waveforms_from_pulse(pulse) + modes = ["I"] if dc else ["I", "Q"] + for mode in modes: + self.waveforms[qmpulse.waveforms[mode]] = waveforms[mode] + return qmpulse + def register_iq_pulse(self, element: str, pulse: Pulse): op = operation(pulse) if op not in self.pulses: - self.pulses[op] = qmpulse = QmPulse.from_pulse(pulse) - waveforms = waveforms_from_pulse(pulse) - for mode in ["I", "Q"]: - self.waveforms[qmpulse.waveforms[mode]] = waveforms[mode] + self.pulses[op] = self.register_waveforms(pulse) self.elements[element].operations[op] = op return op def register_dc_pulse(self, element: str, pulse: Pulse): op = operation(pulse) if op not in self.pulses: - self.pulses[op] = qmpulse = QmPulse.from_dc_pulse(pulse) - self.waveforms[qmpulse.waveforms["I"]] = waveforms_from_pulse(pulse)["I"] + self.pulses[op] = self.register_waveforms(pulse, dc=True) self.elements[element].operations[op] = op return op @@ -112,12 +124,7 @@ def register_acquisition_pulse(self, element: str, pulse: Pulse): op = operation(pulse) acquisition = f"{op}_{element}" if acquisition not in self.pulses: - self.pulses[acquisition] = qmpulse = QmAcquisition.from_pulse( - pulse, element - ) - waveforms = waveforms_from_pulse(pulse) - for mode in ["I", "Q"]: - self.waveforms[qmpulse.waveforms[mode]] = waveforms[mode] + self.pulses[acquisition] = self.register_waveforms(pulse, element) self.elements[element].operations[op] = acquisition return op diff --git a/src/qibolab/instruments/qm/config/pulses.py b/src/qibolab/instruments/qm/config/pulses.py index 83cd3a8185..a99248427d 100644 --- a/src/qibolab/instruments/qm/config/pulses.py +++ b/src/qibolab/instruments/qm/config/pulses.py @@ -84,7 +84,7 @@ def from_op(cls, op: str): @dataclass(frozen=True) class QmPulse: length: int - waveforms: Waveforms + waveforms: Union[Waveforms, dict[str, str]] digital_marker: str = "ON" operation: str = "control" From b548b615fcadf38f14cdb24db9cf5b684b3445f3 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 8 Aug 2024 16:53:45 +0400 Subject: [PATCH 0473/1006] fix: missing import --- src/qibolab/instruments/qm/config/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibolab/instruments/qm/config/config.py b/src/qibolab/instruments/qm/config/config.py index 89851443ff..77ef761001 100644 --- a/src/qibolab/instruments/qm/config/config.py +++ b/src/qibolab/instruments/qm/config/config.py @@ -1,5 +1,5 @@ from dataclasses import dataclass, field -from typing import Union +from typing import Optional, Union from qibolab.components.configs import IqConfig, OscillatorConfig from qibolab.pulses import Pulse From ea82cacd6fbd481dd0414dc15aa5683824d50822 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 8 Aug 2024 16:57:48 +0400 Subject: [PATCH 0474/1006] refactor: use moveaxis --- src/qibolab/instruments/qm/program/acquisition.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qibolab/instruments/qm/program/acquisition.py b/src/qibolab/instruments/qm/program/acquisition.py index 26a906ca2b..624c67595e 100644 --- a/src/qibolab/instruments/qm/program/acquisition.py +++ b/src/qibolab/instruments/qm/program/acquisition.py @@ -26,8 +26,8 @@ def _split(data, npulses, iq=False): if npulses == 1: return [data] if iq: - return [data[..., i, :] for i in range(npulses)] - return [data[..., i] for i in range(npulses)] + return list(np.moveaxis(data, -2, 0)) + return list(np.moveaxis(data, -1, 0)) @dataclass From c2bf8fe07146175c46898279c8d6c2458e822e6d Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 8 Aug 2024 17:07:19 +0400 Subject: [PATCH 0475/1006] fix: pylint --- src/qibolab/instruments/qm/config/elements.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibolab/instruments/qm/config/elements.py b/src/qibolab/instruments/qm/config/elements.py index 789134fdd1..a08b7be89f 100644 --- a/src/qibolab/instruments/qm/config/elements.py +++ b/src/qibolab/instruments/qm/config/elements.py @@ -79,7 +79,7 @@ def from_channel( ): return cls( _to_port(channel), - output_switch(octave.connectivity, channel.port), + output_switch(connectivity, channel.port), intermediate_frequency, ) From 6b2299a3a59e7acb7a9586f457634fb955d994d4 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 8 Aug 2024 17:41:15 +0400 Subject: [PATCH 0476/1006] refactor: convert sweeper classes to functions --- .../instruments/qm/program/instructions.py | 23 +- .../instruments/qm/program/sweepers.py | 230 ++++++++---------- 2 files changed, 123 insertions(+), 130 deletions(-) diff --git a/src/qibolab/instruments/qm/program/instructions.py b/src/qibolab/instruments/qm/program/instructions.py index ae7eeedf86..b4e1616d57 100644 --- a/src/qibolab/instruments/qm/program/instructions.py +++ b/src/qibolab/instruments/qm/program/instructions.py @@ -1,7 +1,7 @@ from typing import Optional from qm import qua -from qm.qua import declare, for_ +from qm.qua import declare, fixed, for_ from qualang_tools.loops import from_array from qibolab.components import Config @@ -12,7 +12,7 @@ from ..config import operation from .acquisition import Acquisition, Acquisitions from .arguments import ExecutionArguments, Parameters -from .sweepers import QUA_SWEEPERS +from .sweepers import INT_TYPE, NORMALIZERS, SWEEPER_METHODS def _delay(pulse: Delay, element: str, parameters: Parameters): @@ -74,14 +74,21 @@ def _sweep_recursion(sweepers, configs, args): sweeper = parallel_sweepers[0] parameter = sweeper.parameter - if parameter in QUA_SWEEPERS: - qua_sweeper = QUA_SWEEPERS[parameter](sweeper) - else: + if parameter not in SWEEPER_METHODS: raise NotImplementedError(f"Sweeper for {parameter} is not implemented.") - variable = qua_sweeper.declare() - with for_(*from_array(variable, qua_sweeper.values)): - qua_sweeper(variable, configs, args) + variable = declare(int) if parameter in INT_TYPE else declare(fixed) + values = sweeper.values + if parameter in NORMALIZERS: + values = NORMALIZERS[parameter](sweeper.values) + + method = SWEEPER_METHODS[parameter] + with for_(*from_array(variable, values)): + if sweeper.pulses is not None: + method(sweeper.pulses, values, variable, configs, args) + else: + method(sweeper.channels, values, variable, configs, args) + _sweep_recursion(sweepers[1:], configs, args) else: diff --git a/src/qibolab/instruments/qm/program/sweepers.py b/src/qibolab/instruments/qm/program/sweepers.py index 79b5692655..e101e4b9cb 100644 --- a/src/qibolab/instruments/qm/program/sweepers.py +++ b/src/qibolab/instruments/qm/program/sweepers.py @@ -1,5 +1,4 @@ import math -from dataclasses import dataclass from typing import Optional import numpy as np @@ -9,8 +8,9 @@ from qm.qua import declare, fixed from qm.qua._dsl import _Variable # for type declaration only -from qibolab.components import Config -from qibolab.sweeper import Parameter, Sweeper +from qibolab.components import Channel, Config +from qibolab.pulses import Pulse +from qibolab.sweeper import Parameter from ..config import operation from .arguments import ExecutionArguments @@ -62,126 +62,112 @@ def check_max_offset(offset: Optional[float], max_offset: float = MAX_OFFSET): # qmpulse.bake(config, values) -@dataclass -class QuaSweep: - """Base class for different sweep parameters.""" - - sweeper: Sweeper - - def declare(self) -> _Variable: - """Declares the QUA variable that is swept.""" - return declare(fixed) - - @property - def values(self) -> npt.NDArray: - """Returns array of values that we are sweeping over. - - Implements potential normalizations. - """ - return self.sweeper.values - - def __call__( - self, variable: _Variable, configs: dict[str, Config], args: ExecutionArguments - ): - """Part of the QUA program that updates the swept variable.""" - raise NotImplementedError - - -class Frequency(QuaSweep): - - def declare(self) -> _Variable: - return declare(int) - - def __call__( - self, variable: _Variable, configs: dict[str, Config], args: ExecutionArguments - ): - for channel in self.sweeper.channels: - lo_frequency = configs[channel.lo].frequency - # convert to IF frequency for readout and drive pulses - f0 = math.floor(configs[channel.name].frequency - lo_frequency) - # check if sweep is within the supported bandwidth [-400, 400] MHz - max_freq = maximum_sweep_value(self.values, f0) - if max_freq > 4e8: - raise_error( - ValueError, - f"Frequency {max_freq} for channel {channel.name} is beyond instrument bandwidth.", - ) - qua.update_frequency(channel.name, variable + f0) - - -class Amplitude(QuaSweep): - - def __call__( - self, variable: _Variable, configs: dict[str, Config], args: ExecutionArguments - ): - # TODO: Consider sweeping amplitude without multiplication - if min(self.values) < -2: - raise_error( - ValueError, "Amplitude sweep values are <-2 which is not supported." - ) - if max(self.values) > 2: +def _frequency( + channels: list[Channel], + values: npt.NDArray, + variable: _Variable, + configs: dict[str, Config], + args: ExecutionArguments, +): + for channel in channels: + lo_frequency = configs[channel.lo].frequency + # convert to IF frequency for readout and drive pulses + f0 = math.floor(configs[channel.name].frequency - lo_frequency) + # check if sweep is within the supported bandwidth [-400, 400] MHz + max_freq = maximum_sweep_value(values, f0) + if max_freq > 4e8: raise_error( - ValueError, "Amplitude sweep values are >2 which is not supported." + ValueError, + f"Frequency {max_freq} for channel {channel.name} is beyond instrument bandwidth.", ) + qua.update_frequency(channel.name, variable + f0) + + +def _amplitude( + pulses: list[Pulse], + values: npt.NDArray, + variable: _Variable, + configs: dict[str, Config], + args: ExecutionArguments, +): + # TODO: Consider sweeping amplitude without multiplication + if min(values) < -2: + raise_error( + ValueError, "Amplitude sweep values are <-2 which is not supported." + ) + if max(values) > 2: + raise_error(ValueError, "Amplitude sweep values are >2 which is not supported.") + + for pulse in pulses: + # if isinstance(instruction, Bake): + # instructions.update_kwargs(instruction, amplitude=a) + # else: + args.parameters[operation(pulse)].amplitude = qua.amp(variable) + + +def _relative_phase( + pulses: list[Pulse], + values: npt.NDArray, + variable: _Variable, + configs: dict[str, Config], + args: ExecutionArguments, +): + for pulse in pulses: + args.parameters[operation(pulse)].phase = variable + + +def _bias( + channels: list[Channel], + values: npt.NDArray, + variable: _Variable, + configs: dict[str, Config], + args: ExecutionArguments, +): + for channel in channels: + offset = configs[channel.name].offset + max_value = maximum_sweep_value(values, offset) + check_max_offset(max_value, MAX_OFFSET) + b0 = declare(fixed, value=offset) + with qua.if_((variable + b0) >= 0.49): + qua.set_dc_offset(f"flux{channel.name}", "single", 0.49) + with qua.elif_((variable + b0) <= -0.49): + qua.set_dc_offset(f"flux{channel.name}", "single", -0.49) + with qua.else_(): + qua.set_dc_offset(f"flux{channel.name}", "single", (variable + b0)) + + +def _duration( + pulses: list[Pulse], + values: npt.NDArray, + variable: _Variable, + configs: dict[str, Config], + args: ExecutionArguments, +): + # TODO: Handle baked pulses + for pulse in pulses: + args.parameters[operation(pulse)].duration = variable + + +INT_TYPE = {Parameter.frequency, Parameter.duration} +"""Sweeper parameters for which we need ``int`` variable type. + +The rest parameters need ``fixed`` type. +""" + +NORMALIZERS = { + Parameter.relative_phase: lambda values: values / (2 * np.pi), + Parameter.duration: lambda values: (values // 4).astype(int), +} +"""Functions to normalize sweeper values. + +The rest parameters do not need normalization (identity function). +""" - for pulse in self.sweeper.pulses: - # if isinstance(instruction, Bake): - # instructions.update_kwargs(instruction, amplitude=a) - # else: - args.parameters[operation(pulse)].amplitude = qua.amp(variable) - - -class RelativePhase(QuaSweep): - - @property - def values(self) -> npt.NDArray: - return self.sweeper.values / (2 * np.pi) - - def __call__( - self, variable: _Variable, configs: dict[str, Config], args: ExecutionArguments - ): - for pulse in self.sweeper.pulses: - args.parameters[operation(pulse)].phase = variable - - -class Bias(QuaSweep): - - def __call__( - self, variable: _Variable, configs: dict[str, Config], args: ExecutionArguments - ): - for channel in self.sweeper.channels: - offset = configs[channel.name].offset - max_value = maximum_sweep_value(self.values, offset) - check_max_offset(max_value, MAX_OFFSET) - b0 = declare(fixed, value=offset) - with qua.if_((variable + b0) >= 0.49): - qua.set_dc_offset(f"flux{channel.name}", "single", 0.49) - with qua.elif_((variable + b0) <= -0.49): - qua.set_dc_offset(f"flux{channel.name}", "single", -0.49) - with qua.else_(): - qua.set_dc_offset(f"flux{channel.name}", "single", (variable + b0)) - - -class Duration(QuaSweep): - def declare(self) -> _Variable: - return declare(int) - - @property - def values(self) -> npt.NDArray: - return (self.sweeper.values // 4).astype(int) - - def __call__( - self, variable: _Variable, configs: dict[str, Config], args: ExecutionArguments - ): - # TODO: Handle baked pulses - for pulse in self.sweeper.pulses: - args.parameters[operation(pulse)].duration = variable - - -QUA_SWEEPERS = { - Parameter.frequency: Frequency, - Parameter.amplitude: Amplitude, - Parameter.duration: Duration, - Parameter.relative_phase: RelativePhase, - Parameter.bias: Bias, +SWEEPER_METHODS = { + Parameter.frequency: _frequency, + Parameter.amplitude: _amplitude, + Parameter.duration: _duration, + Parameter.relative_phase: _relative_phase, + Parameter.bias: _bias, } +"""Methods that return part of QUA program to be used inside the loop.""" From 2eb35b78b05df9acaf71bbc15e0bdfe811ad6d6f Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 8 Aug 2024 18:17:31 +0400 Subject: [PATCH 0477/1006] fix: waveforms after running on hardware --- src/qibolab/instruments/qm/config/config.py | 2 +- src/qibolab/instruments/qm/config/pulses.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/qibolab/instruments/qm/config/config.py b/src/qibolab/instruments/qm/config/config.py index 77ef761001..ef8b8d3623 100644 --- a/src/qibolab/instruments/qm/config/config.py +++ b/src/qibolab/instruments/qm/config/config.py @@ -102,7 +102,7 @@ def register_waveforms( waveforms = waveforms_from_pulse(pulse) modes = ["I"] if dc else ["I", "Q"] for mode in modes: - self.waveforms[qmpulse.waveforms[mode]] = waveforms[mode] + self.waveforms[getattr(qmpulse.waveforms, mode)] = waveforms[mode] return qmpulse def register_iq_pulse(self, element: str, pulse: Pulse): diff --git a/src/qibolab/instruments/qm/config/pulses.py b/src/qibolab/instruments/qm/config/pulses.py index a99248427d..f34f9dd834 100644 --- a/src/qibolab/instruments/qm/config/pulses.py +++ b/src/qibolab/instruments/qm/config/pulses.py @@ -73,8 +73,8 @@ def waveforms_from_pulse(pulse: Pulse) -> Waveform: @dataclass(frozen=True) class Waveforms: - i: str - q: str + I: str + Q: str @classmethod def from_op(cls, op: str): From 07f20159783c0a3217a7cfec95cbd42b615097f9 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 9 Aug 2024 12:17:48 +0400 Subject: [PATCH 0478/1006] chore: document default digital waveform --- src/qibolab/instruments/qm/config/config.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/qibolab/instruments/qm/config/config.py b/src/qibolab/instruments/qm/config/config.py index ef8b8d3623..09abf2375f 100644 --- a/src/qibolab/instruments/qm/config/config.py +++ b/src/qibolab/instruments/qm/config/config.py @@ -11,6 +11,13 @@ __all__ = ["QmConfig"] +DEFAULT_DIGITAL_WAVEFORMS = {"ON": {"samples": [(1, 0)]}} +"""Required to be registered in the config for QM to work. + +Also used as triggering that allows the Octave LO signal to pass only +when we are executing something. +""" + @dataclass class QmConfig: @@ -27,7 +34,7 @@ class QmConfig: pulses: dict[str, Union[QmPulse, QmAcquisition]] = field(default_factory=dict) waveforms: dict[str, Waveform] = field(default_factory=dict) digital_waveforms: dict = field( - default_factory=lambda: {"ON": {"samples": [(1, 0)]}} + default_factory=lambda: DEFAULT_DIGITAL_WAVEFORMS.copy() ) integration_weights: dict = field(default_factory=dict) mixers: dict = field(default_factory=dict) From 149de7e7a8d7a39fd6468ecea74b4eab64542a1b Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 9 Aug 2024 12:42:50 +0400 Subject: [PATCH 0479/1006] refactor: lift envelope rotation to qibolab pulses --- src/qibolab/instruments/qm/config/pulses.py | 17 ++++++----------- src/qibolab/pulses/modulation.py | 16 +++++++++++++++- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/qibolab/instruments/qm/config/pulses.py b/src/qibolab/instruments/qm/config/pulses.py index f34f9dd834..3b808ace3e 100644 --- a/src/qibolab/instruments/qm/config/pulses.py +++ b/src/qibolab/instruments/qm/config/pulses.py @@ -4,6 +4,7 @@ import numpy as np from qibolab.pulses import Pulse, Rectangular +from qibolab.pulses.modulation import rotate, wrap_phase SAMPLING_RATE = 1 """Sampling rate of Quantum Machines OPX in GSps.""" @@ -23,11 +24,6 @@ def operation(pulse): return str(hash(pulse)) -def _wrap(phase: float): - """Convert phase to multiples of 2pi.""" - return (phase % (2 * np.pi)) / (2 * np.pi) - - @dataclass(frozen=True) class ConstantWaveform: sample: float @@ -35,7 +31,7 @@ class ConstantWaveform: @classmethod def from_pulse(cls, pulse: Pulse): - phase = _wrap(pulse.relative_phase) + phase = wrap_phase(pulse.relative_phase) return { "I": cls(pulse.amplitude * np.cos(phase)), "Q": cls(pulse.amplitude * np.sin(phase)), @@ -49,12 +45,11 @@ class ArbitraryWaveform: @classmethod def from_pulse(cls, pulse: Pulse): - phase = _wrap(pulse.relative_phase) - samples_i = pulse.i(SAMPLING_RATE) - samples_q = pulse.q(SAMPLING_RATE) + original_waveforms = pulse.envelopes(SAMPLING_RATE) + rotated_waveforms = rotate(original_waveforms, pulse.relative_phase) return { - "I": cls(samples_i * np.cos(phase) - samples_q * np.sin(phase)), - "Q": cls(samples_i * np.sin(phase) + samples_q * np.cos(phase)), + "I": cls(rotated_waveforms[0]), + "Q": cls(rotated_waveforms[1]), } diff --git a/src/qibolab/pulses/modulation.py b/src/qibolab/pulses/modulation.py index 05e2b67475..2088ba6a43 100644 --- a/src/qibolab/pulses/modulation.py +++ b/src/qibolab/pulses/modulation.py @@ -2,7 +2,21 @@ from .envelope import IqWaveform -__all__ = ["modulate", "demodulate"] +__all__ = ["wrap_phase", "rotate", "modulate", "demodulate"] + + +def wrap_phase(phase: float): + """Limit phase to [0, 2pi).""" + return phase % (2 * np.pi) + + +def rotate(envelope: IqWaveform, phase: float) -> IqWaveform: + """Rotate envelopes in the IQ-plane according to a phase.""" + wrapped_phase = wrap_phase(phase) + cos = np.cos(wrapped_phase) + sin = np.sin(wrapped_phase) + mod = np.array([[cos, -sin], [sin, cos]]) + return np.einsum("ij,jt->it", mod, envelope) def modulate( From 31366bb677b8c60560047766402f202367ed31b4 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 9 Aug 2024 12:49:03 +0400 Subject: [PATCH 0480/1006] fix: channel conversion to dict --- src/qibolab/instruments/qm/controller.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 3e305e01c5..482b883608 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -178,6 +178,10 @@ class QmController(Controller): def __post_init__(self): super().__init__(self.name, self.address) + # convert ``channels`` from list to dict + self.channels = { + channel.logical_channel.name: channel for channel in self.channels + } # redefine bounds because abstract instrument overwrites them # FIXME: This overwrites the ``bounds`` given in the runcard! self.bounds = Bounds( From c63c31fc9de3daf079c7f8502a64f3ac9e90d1fc Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 6 Aug 2024 15:49:20 +0200 Subject: [PATCH 0481/1006] feat!: Drop pulse type Only in source code, and outside instruments --- src/qibolab/pulses/__init__.py | 2 +- src/qibolab/pulses/pulse.py | 24 ------------------------ src/qibolab/pulses/sequence.py | 14 +++++++++----- 3 files changed, 10 insertions(+), 30 deletions(-) diff --git a/src/qibolab/pulses/__init__.py b/src/qibolab/pulses/__init__.py index d190134e2a..2eac3de07f 100644 --- a/src/qibolab/pulses/__init__.py +++ b/src/qibolab/pulses/__init__.py @@ -1,3 +1,3 @@ from .envelope import * -from .pulse import Delay, Pulse, PulseType, VirtualZ +from .pulse import Delay, Pulse, VirtualZ from .sequence import PulseSequence diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index 9d74256195..6a05d820b2 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -1,6 +1,5 @@ """Pulse class.""" -from enum import Enum from typing import Union import numpy as np @@ -10,22 +9,6 @@ from .envelope import Envelope, IqWaveform, Waveform -class PulseType(Enum): - """An enumeration to distinguish different types of pulses. - - READOUT pulses triger acquisitions. DRIVE pulses are used to control - qubit states. FLUX pulses are used to shift the frequency of flux - tunable qubits and with it implement two-qubit gates. - """ - - READOUT = "ro" - DRIVE = "qd" - FLUX = "qf" - COUPLERFLUX = "cf" - DELAY = "dl" - VIRTUALZ = "vz" - - class _PulseLike(Model): @property def id(self) -> int: @@ -51,8 +34,6 @@ class Pulse(_PulseLike): """ relative_phase: float = 0.0 """Relative phase of the pulse, in radians.""" - type: PulseType = PulseType.DRIVE - """Pulse type, as an element of PulseType enumeration.""" @classmethod def flux(cls, **kwargs): @@ -62,8 +43,6 @@ def flux(cls, **kwargs): suitable defaults. """ kwargs["relative_phase"] = 0 - if "type" not in kwargs: - kwargs["type"] = PulseType.FLUX return cls(**kwargs) def i(self, sampling_rate: float) -> Waveform: @@ -87,8 +66,6 @@ class Delay(_PulseLike): duration: int """Delay duration in ns.""" - type: PulseType = PulseType.DELAY - """Type fixed to ``DELAY`` to comply with ``Pulse`` interface.""" class VirtualZ(_PulseLike): @@ -96,7 +73,6 @@ class VirtualZ(_PulseLike): phase: float """Phase that implements the rotation.""" - type: PulseType = PulseType.VIRTUALZ @property def duration(self): diff --git a/src/qibolab/pulses/sequence.py b/src/qibolab/pulses/sequence.py index beb6b03c6f..8e49f9650f 100644 --- a/src/qibolab/pulses/sequence.py +++ b/src/qibolab/pulses/sequence.py @@ -3,7 +3,7 @@ from collections import defaultdict from typing import Optional -from .pulse import Delay, PulseLike, PulseType +from .pulse import Delay, Pulse, PulseLike class PulseSequence(defaultdict[str, list[PulseLike]]): @@ -21,16 +21,20 @@ def __init__(self, seq_dict: Optional[dict[str, list[PulseLike]]] = None): def probe_pulses(self): """Return list of the readout pulses in this sequence.""" pulses = [] - for seq in self.values(): + for name, seq in self.items(): + if "probe" not in name: + continue + for pulse in seq: - if pulse.type == PulseType.READOUT: + # exclude delays + if isinstance(pulse, Pulse): pulses.append(pulse) return pulses @property - def duration(self) -> int: + def duration(self) -> float: """Duration of the entire sequence.""" - return max((self.channel_duration(ch) for ch in self), default=0) + return max((self.channel_duration(ch) for ch in self), default=0.0) def channel_duration(self, channel: str) -> float: """Duration of the given channel.""" From c3dd3187756cf7711046b049d6b3014121347f7c Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 6 Aug 2024 17:42:15 +0200 Subject: [PATCH 0482/1006] fix: Remove pulse type from IcarusQ --- src/qibolab/instruments/icarusqfpga.py | 182 +++++++++++++------------ 1 file changed, 94 insertions(+), 88 deletions(-) diff --git a/src/qibolab/instruments/icarusqfpga.py b/src/qibolab/instruments/icarusqfpga.py index daf4a25293..cb89b99790 100644 --- a/src/qibolab/instruments/icarusqfpga.py +++ b/src/qibolab/instruments/icarusqfpga.py @@ -13,7 +13,7 @@ ExecutionParameters, ) from qibolab.instruments.abstract import Controller -from qibolab.pulses import Pulse, PulseSequence, PulseType +from qibolab.pulses import Pulse, PulseSequence from qibolab.qubits import Qubit, QubitId from qibolab.result import average, average_iq, collect from qibolab.sweeper import Parameter, Sweeper, SweeperType @@ -88,94 +88,99 @@ def play( dac_sr_ghz = dac_sampling_rate / 1e9 # We iterate over the seuence of pulses and generate the waveforms for each type of pulses - for pulse in sequence.pulses: - # pylint: disable=no-member - # FIXME: ignore complaint about non-existent ports and _ports properties, until we upgrade this driver to qibolab 0.2 - if pulse.channel not in self._ports: - continue - - dac = self.ports(pulse.channel).dac - start = int(pulse.start * 1e-9 * dac_sampling_rate) - i_env = pulse.envelope_waveform_i(dac_sr_ghz).data - q_env = pulse.envelope_waveform_q(dac_sr_ghz).data - - # Flux pulses - # TODO: Add envelope support for flux pulses - if pulse.type == PulseType.FLUX: - wfm = i_env - end = start + len(wfm) - - # Qubit drive microwave signals - elif pulse.type == PulseType.DRIVE: - end = start + len(i_env) - t = np.arange(start, end) / dac_sampling_rate - cosalpha = np.cos( - 2 * np.pi * pulse.frequency * t + pulse.relative_phase - ) - sinalpha = np.sin( - 2 * np.pi * pulse.frequency * t + pulse.relative_phase - ) - wfm = i_env * sinalpha + q_env * cosalpha - - elif pulse.type == PulseType.READOUT: - # For readout pulses, we move the corresponding DAC/ADC pair to the start of the pulse to save memory - # This locks the phase of the readout in the demodulation - adc = self.ports(pulse.channel).adc - start = 0 - - end = start + len(i_env) - t = np.arange(start, end) / dac_sampling_rate - cosalpha = np.cos( - 2 * np.pi * pulse.frequency * t + pulse.relative_phase - ) - sinalpha = np.sin( - 2 * np.pi * pulse.frequency * t + pulse.relative_phase - ) - wfm = i_env * sinalpha + q_env * cosalpha - - # First we convert the pulse starting time to number of ADC samples - # Then, we convert this number to the number of ADC clock cycles (8 samples per clock cycle) - # Next, we raise it to the next nearest integer to prevent an overlap between drive and readout pulses - # Finally, we ensure that the number is even for the DAC delay conversion - delay_start_adc = int( - int( - np.ceil( - self.device.adc_sampling_rate * 1e6 * pulse.start * 1e-9 / 8 + for ch, seq in sequence.items(): + for pulse in seq: + # pylint: disable=no-member + # FIXME: ignore complaint about non-existent ports and _ports properties, until we upgrade this driver to qibolab 0.2 + if pulse.channel not in self._ports: + continue + + dac = self.ports(pulse.channel).dac + start = int(pulse.start * 1e-9 * dac_sampling_rate) + i_env = pulse.envelope_waveform_i(dac_sr_ghz).data + q_env = pulse.envelope_waveform_q(dac_sr_ghz).data + + # Flux pulses + # TODO: Add envelope support for flux pulses + if "flux" in ch: + wfm = i_env + end = start + len(wfm) + + # Qubit drive microwave signals + elif "drive" in ch: + end = start + len(i_env) + t = np.arange(start, end) / dac_sampling_rate + cosalpha = np.cos( + 2 * np.pi * pulse.frequency * t + pulse.relative_phase + ) + sinalpha = np.sin( + 2 * np.pi * pulse.frequency * t + pulse.relative_phase + ) + wfm = i_env * sinalpha + q_env * cosalpha + + elif "probe" in ch: + # For readout pulses, we move the corresponding DAC/ADC pair to the start of the pulse to save memory + # This locks the phase of the readout in the demodulation + adc = self.ports(pulse.channel).adc + start = 0 + + end = start + len(i_env) + t = np.arange(start, end) / dac_sampling_rate + cosalpha = np.cos( + 2 * np.pi * pulse.frequency * t + pulse.relative_phase + ) + sinalpha = np.sin( + 2 * np.pi * pulse.frequency * t + pulse.relative_phase + ) + wfm = i_env * sinalpha + q_env * cosalpha + + # First we convert the pulse starting time to number of ADC samples + # Then, we convert this number to the number of ADC clock cycles (8 samples per clock cycle) + # Next, we raise it to the next nearest integer to prevent an overlap between drive and readout pulses + # Finally, we ensure that the number is even for the DAC delay conversion + delay_start_adc = int( + int( + np.ceil( + self.device.adc_sampling_rate + * 1e6 + * pulse.start + * 1e-9 + / 8 + ) + / 2 ) - / 2 + * 2 ) - * 2 - ) - # For the DAC, currently the sampling rate is 3x higher than the ADC - # The number of clock cycles is 16 samples per clock cycle - # Hence, we multiply the adc delay clock cycles by 1.5x to align the DAC/ADC pair - delay_start_dac = int(delay_start_adc * 1.5) + # For the DAC, currently the sampling rate is 3x higher than the ADC + # The number of clock cycles is 16 samples per clock cycle + # Hence, we multiply the adc delay clock cycles by 1.5x to align the DAC/ADC pair + delay_start_dac = int(delay_start_adc * 1.5) - self.device.dac[dac].delay = ( - delay_start_dac + self.channel_delay_offset_dac - ) - self.device.adc[adc].delay = ( - delay_start_adc + self.channel_delay_offset_adc - ) - # ADC0 complete marks the end of acquisition, so we also need to move ADC0 - self.device.adc[0].delay = ( - delay_start_adc + self.channel_delay_offset_adc - ) - - if ( - options.acquisition_type is AcquisitionType.DISCRIMINATION - or AcquisitionType.INTEGRATION - ): - self.device.program_qunit( - readout_frequency=pulse.frequency, - readout_time=pulse.duration * 1e-9, - qunit=pulse.qubit, + self.device.dac[dac].delay = ( + delay_start_dac + self.channel_delay_offset_dac + ) + self.device.adc[adc].delay = ( + delay_start_adc + self.channel_delay_offset_adc + ) + # ADC0 complete marks the end of acquisition, so we also need to move ADC0 + self.device.adc[0].delay = ( + delay_start_adc + self.channel_delay_offset_adc ) - end = start + len(wfm) - waveform_array[dac][start:end] += self.device.dac_max_amplitude * wfm - dac_end_addr[dac] = max(end >> 4, dac_end_addr[dac]) + if ( + options.acquisition_type is AcquisitionType.DISCRIMINATION + or AcquisitionType.INTEGRATION + ): + self.device.program_qunit( + readout_frequency=pulse.frequency, + readout_time=pulse.duration * 1e-9, + qunit=pulse.qubit, + ) + + end = start + len(wfm) + waveform_array[dac][start:end] += self.device.dac_max_amplitude * wfm + dac_end_addr[dac] = max(end >> 4, dac_end_addr[dac]) payload = [ (dac, wfm, dac_end_addr[dac]) @@ -237,9 +242,7 @@ def play( """ super().play(qubits, couplers, sequence, options) self.device.set_adc_trigger_repetition_rate(int(options.relaxation_time / 1e3)) - readout_pulses = [ - pulse for pulse in sequence.pulses if pulse.type is PulseType.READOUT - ] + readout_pulses = sequence.probe_pulses readout_qubits = [pulse.qubit for pulse in readout_pulses] if options.acquisition_type is AcquisitionType.RAW: @@ -346,8 +349,11 @@ def sweep( # Since the sweeper will modify the readout pulse serial, we collate the results with the qubit number. # This is only for qibocal compatiability and will be removed with IcarusQ v2. - if pulse.type is PulseType.READOUT: - res[pulse.serial] = res[pulse.qubit] + # FIXME: if this was required, now it's completely broken, since it + # isn't possible to identify the pulse channel from the pulse itself + # (nor it should be needed) + # if pulse.type is PulseType.READOUT: + # res[pulse.serial] = res[pulse.qubit] return res From cf313964a023b0511790cc89081c683694b12ebc Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 6 Aug 2024 17:45:43 +0200 Subject: [PATCH 0483/1006] fix: Remove pulse type imports --- src/qibolab/instruments/emulator/pulse_simulator.py | 2 +- src/qibolab/instruments/qblox/cluster_qcm_bb.py | 2 +- src/qibolab/instruments/qblox/cluster_qcm_rf.py | 2 +- src/qibolab/instruments/qblox/cluster_qrm_rf.py | 2 +- src/qibolab/instruments/qblox/controller.py | 2 +- src/qibolab/instruments/qblox/sequencer.py | 2 +- src/qibolab/instruments/rfsoc/driver.py | 2 +- src/qibolab/instruments/zhinst/pulse.py | 2 +- src/qibolab/instruments/zhinst/sweep.py | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/qibolab/instruments/emulator/pulse_simulator.py b/src/qibolab/instruments/emulator/pulse_simulator.py index 96ff337054..9098fe5822 100644 --- a/src/qibolab/instruments/emulator/pulse_simulator.py +++ b/src/qibolab/instruments/emulator/pulse_simulator.py @@ -13,7 +13,7 @@ from qibolab.instruments.abstract import Controller from qibolab.instruments.emulator.engines.qutip_engine import QutipSimulator from qibolab.instruments.emulator.models import general_no_coupler_model -from qibolab.pulses import PulseSequence, PulseType +from qibolab.pulses import PulseSequence from qibolab.qubits import Qubit, QubitId from qibolab.result import average, collect from qibolab.sweeper import Parameter, Sweeper, SweeperType diff --git a/src/qibolab/instruments/qblox/cluster_qcm_bb.py b/src/qibolab/instruments/qblox/cluster_qcm_bb.py index 2b395ccfd5..8d2588d091 100644 --- a/src/qibolab/instruments/qblox/cluster_qcm_bb.py +++ b/src/qibolab/instruments/qblox/cluster_qcm_bb.py @@ -18,7 +18,7 @@ ) from qibolab.instruments.qblox.sequencer import Sequencer, WaveformsBuffer from qibolab.instruments.qblox.sweeper import QbloxSweeper, QbloxSweeperType -from qibolab.pulses import Pulse, PulseSequence, PulseType +from qibolab.pulses import Pulse, PulseSequence from qibolab.sweeper import Parameter, Sweeper, SweeperType diff --git a/src/qibolab/instruments/qblox/cluster_qcm_rf.py b/src/qibolab/instruments/qblox/cluster_qcm_rf.py index ed99fa5987..2996546afd 100644 --- a/src/qibolab/instruments/qblox/cluster_qcm_rf.py +++ b/src/qibolab/instruments/qblox/cluster_qcm_rf.py @@ -18,7 +18,7 @@ ) from qibolab.instruments.qblox.sequencer import Sequencer, WaveformsBuffer from qibolab.instruments.qblox.sweeper import QbloxSweeper, QbloxSweeperType -from qibolab.pulses import Pulse, PulseSequence, PulseType +from qibolab.pulses import Pulse, PulseSequence from qibolab.sweeper import Parameter, Sweeper, SweeperType diff --git a/src/qibolab/instruments/qblox/cluster_qrm_rf.py b/src/qibolab/instruments/qblox/cluster_qrm_rf.py index 92aacaf98e..ad72e8cd84 100644 --- a/src/qibolab/instruments/qblox/cluster_qrm_rf.py +++ b/src/qibolab/instruments/qblox/cluster_qrm_rf.py @@ -10,7 +10,7 @@ from qblox_instruments.qcodes_drivers.module import Module from qibo.config import log -from qibolab.pulses import Pulse, PulseSequence, PulseType +from qibolab.pulses import Pulse, PulseSequence from qibolab.sweeper import Parameter, Sweeper, SweeperType from .acquisition import AveragedAcquisition, DemodulatedAcquisition diff --git a/src/qibolab/instruments/qblox/controller.py b/src/qibolab/instruments/qblox/controller.py index ecf44172f0..1209497c11 100644 --- a/src/qibolab/instruments/qblox/controller.py +++ b/src/qibolab/instruments/qblox/controller.py @@ -11,7 +11,7 @@ from qibolab.instruments.qblox.cluster_qcm_rf import QcmRf from qibolab.instruments.qblox.cluster_qrm_rf import QrmRf from qibolab.instruments.qblox.sequencer import SAMPLING_RATE -from qibolab.pulses import PulseSequence, PulseType +from qibolab.pulses import PulseSequence from qibolab.sweeper import Parameter, Sweeper, SweeperType from qibolab.unrolling import Bounds diff --git a/src/qibolab/instruments/qblox/sequencer.py b/src/qibolab/instruments/qblox/sequencer.py index e450b8e005..5375f1c55a 100644 --- a/src/qibolab/instruments/qblox/sequencer.py +++ b/src/qibolab/instruments/qblox/sequencer.py @@ -4,7 +4,7 @@ from qblox_instruments.qcodes_drivers.sequencer import Sequencer as QbloxSequencer from qibolab.instruments.qblox.q1asm import Program -from qibolab.pulses import Pulse, PulseSequence, PulseType +from qibolab.pulses import Pulse, PulseSequence from qibolab.pulses.modulation import modulate from qibolab.sweeper import Parameter, Sweeper diff --git a/src/qibolab/instruments/rfsoc/driver.py b/src/qibolab/instruments/rfsoc/driver.py index 09c1ce06d0..77dfade060 100644 --- a/src/qibolab/instruments/rfsoc/driver.py +++ b/src/qibolab/instruments/rfsoc/driver.py @@ -12,7 +12,7 @@ from qibolab import AcquisitionType, AveragingMode, ExecutionParameters from qibolab.couplers import Coupler from qibolab.instruments.abstract import Controller -from qibolab.pulses import PulseSequence, PulseType +from qibolab.pulses import PulseSequence from qibolab.qubits import Qubit from qibolab.sweeper import BIAS, Sweeper diff --git a/src/qibolab/instruments/zhinst/pulse.py b/src/qibolab/instruments/zhinst/pulse.py index cdfa2608ec..52ce6f9210 100644 --- a/src/qibolab/instruments/zhinst/pulse.py +++ b/src/qibolab/instruments/zhinst/pulse.py @@ -7,7 +7,7 @@ sampled_pulse_real, ) -from qibolab.pulses import Drag, Gaussian, GaussianSquare, Pulse, PulseType, Rectangular +from qibolab.pulses import Drag, Gaussian, GaussianSquare, Pulse, Rectangular from .constants import NANO_TO_SECONDS, SAMPLING_RATE diff --git a/src/qibolab/instruments/zhinst/sweep.py b/src/qibolab/instruments/zhinst/sweep.py index 24401b0e2e..69c8810dfe 100644 --- a/src/qibolab/instruments/zhinst/sweep.py +++ b/src/qibolab/instruments/zhinst/sweep.py @@ -6,7 +6,7 @@ import laboneq.simple as laboneq from qibolab.components import Config -from qibolab.pulses import Pulse, PulseType +from qibolab.pulses import Pulse from qibolab.sweeper import Parameter, Sweeper from . import ZiChannel From 607c5c4ba5f7a8c8309fd68a4a7442f031261641 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 6 Aug 2024 18:29:49 +0200 Subject: [PATCH 0484/1006] fix: Comment pulse type in Qblox This is a terrible fix, it's not even a hint about how to solve the problem, but Qblox is scheduled for rewriting anyhow, so it's not worth to anything else --- src/qibolab/instruments/qblox/cluster_qcm_bb.py | 4 +++- src/qibolab/instruments/qblox/cluster_qcm_rf.py | 4 +++- src/qibolab/instruments/qblox/cluster_qrm_rf.py | 12 +++++++++--- src/qibolab/instruments/qblox/controller.py | 9 ++++++--- src/qibolab/instruments/qblox/sequencer.py | 4 +++- 5 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/qibolab/instruments/qblox/cluster_qcm_bb.py b/src/qibolab/instruments/qblox/cluster_qcm_bb.py index 8d2588d091..7677b8ef48 100644 --- a/src/qibolab/instruments/qblox/cluster_qcm_bb.py +++ b/src/qibolab/instruments/qblox/cluster_qcm_bb.py @@ -616,7 +616,9 @@ def process_pulse_sequence( and pulses[n].sweeper.type == QbloxSweeperType.duration ): RI = pulses[n].sweeper.register - if pulses[n].type == PulseType.FLUX: + # FIXME: + # if pulses[n].type == PulseType.FLUX: + if True: RQ = pulses[n].sweeper.register else: RQ = pulses[n].sweeper.aux_register diff --git a/src/qibolab/instruments/qblox/cluster_qcm_rf.py b/src/qibolab/instruments/qblox/cluster_qcm_rf.py index 2996546afd..e0ba55dd17 100644 --- a/src/qibolab/instruments/qblox/cluster_qcm_rf.py +++ b/src/qibolab/instruments/qblox/cluster_qcm_rf.py @@ -610,7 +610,9 @@ def process_pulse_sequence( and pulses[n].sweeper.type == QbloxSweeperType.duration ): RI = pulses[n].sweeper.register - if pulses[n].type == PulseType.FLUX: + # FIXME: + # if pulses[n].type == PulseType.FLUX: + if True: RQ = pulses[n].sweeper.register else: RQ = pulses[n].sweeper.aux_register diff --git a/src/qibolab/instruments/qblox/cluster_qrm_rf.py b/src/qibolab/instruments/qblox/cluster_qrm_rf.py index ad72e8cd84..97783324d0 100644 --- a/src/qibolab/instruments/qblox/cluster_qrm_rf.py +++ b/src/qibolab/instruments/qblox/cluster_qrm_rf.py @@ -711,7 +711,9 @@ def process_pulse_sequence( comment=f"set relative phase {pulses[n].relative_phase} rads", ) - if pulses[n].type == PulseType.READOUT: + # FIXME: + # if pulses[n].type == PulseType.READOUT: + if True: delay_after_play = self._ports["i1"].acquisition_hold_off if len(pulses) > n + 1: @@ -742,7 +744,9 @@ def process_pulse_sequence( and pulses[n].sweeper.type == QbloxSweeperType.duration ): RI = pulses[n].sweeper.register - if pulses[n].type == PulseType.FLUX: + # FIXME: + # if pulses[n].type == PulseType.FLUX: + if True: RQ = pulses[n].sweeper.register else: RQ = pulses[n].sweeper.aux_register @@ -789,7 +793,9 @@ def process_pulse_sequence( and pulses[n].sweeper.type == QbloxSweeperType.duration ): RI = pulses[n].sweeper.register - if pulses[n].type == PulseType.FLUX: + # FIXME: + # if pulses[n].type == PulseType.FLUX: + if True: RQ = pulses[n].sweeper.register else: RQ = pulses[n].sweeper.aux_register diff --git a/src/qibolab/instruments/qblox/controller.py b/src/qibolab/instruments/qblox/controller.py index 1209497c11..35fc17fb20 100644 --- a/src/qibolab/instruments/qblox/controller.py +++ b/src/qibolab/instruments/qblox/controller.py @@ -359,7 +359,9 @@ def _sweep_recursion( elif sweeper.parameter is Parameter.lo_frequency: initial = {} for pulse in sweeper.pulses: - if pulse.type == PulseType.READOUT: + # FIXME: + # if pulse.type == PulseType.READOUT: + if True: initial[pulse.id] = qubits[pulse.qubit].readout.lo_frequency if sweeper.type == SweeperType.ABSOLUTE: qubits[pulse.qubit].readout.lo_frequency = value @@ -371,8 +373,9 @@ def _sweep_recursion( qubits[pulse.qubit].readout.lo_frequency = ( initial[pulse.id] * value ) - - elif pulse.type == PulseType.DRIVE: + # FIXME: + # elif pulse.type == PulseType.DRIVE: + elif True: initial[pulse.id] = qubits[pulse.qubit].drive.lo_frequency if sweeper.type == SweeperType.ABSOLUTE: qubits[pulse.qubit].drive.lo_frequency = value diff --git a/src/qibolab/instruments/qblox/sequencer.py b/src/qibolab/instruments/qblox/sequencer.py index 5375f1c55a..706f2d2e86 100644 --- a/src/qibolab/instruments/qblox/sequencer.py +++ b/src/qibolab/instruments/qblox/sequencer.py @@ -136,7 +136,9 @@ def bake_pulse_waveforms( # there may be other waveforms stored already, set first index as the next available first_idx = len(self.unique_waveforms) - if pulse.type == PulseType.FLUX: + # FIXME: + # if pulses.type == PulseType.FLUX: + if True: # for flux pulses, store i waveforms idx_range = np.arange(first_idx, first_idx + len(values), 1) From 71670c4edb501ef6b791dc1f59e7d71116521af3 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 6 Aug 2024 18:52:02 +0200 Subject: [PATCH 0485/1006] fix: Cool down linter errors in emulator and qick --- src/qibolab/instruments/emulator/pulse_simulator.py | 10 +++++----- src/qibolab/instruments/rfsoc/driver.py | 6 ++++-- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/qibolab/instruments/emulator/pulse_simulator.py b/src/qibolab/instruments/emulator/pulse_simulator.py index 9098fe5822..28a04007b3 100644 --- a/src/qibolab/instruments/emulator/pulse_simulator.py +++ b/src/qibolab/instruments/emulator/pulse_simulator.py @@ -258,10 +258,11 @@ def sweep( param_name = sweep.parameter.name.lower() for pulse, value in zip(sweep.pulses, base_sweeper_values): setattr(pulse, param_name, value) + # FIXME: this is copy-pasted from IcarusQ, check the comment in there # Since the sweeper will modify the readout pulse serial, we collate the results with the qubit number. # This is only for qibocal compatiability and will be removed with IcarusQ v2. - if pulse.type is PulseType.READOUT: - results[pulse.serial] = results[pulse.qubit] + # if pulse.type is PulseType.READOUT: + # results[pulse.serial] = results[pulse.qubit] results.update( { @@ -753,8 +754,7 @@ def truncate_ro_pulses( `qibolab.pulses.PulseSequence`: Modified pulse sequence with one time step readout pulses. """ sequence = copy.deepcopy(sequence) - for i in range(len(sequence)): - if sequence[i].type is PulseType.READOUT: - sequence[i].duration = 1 + for pulse in sequence.probe_pulses: + pulse.duration = 1 return sequence diff --git a/src/qibolab/instruments/rfsoc/driver.py b/src/qibolab/instruments/rfsoc/driver.py index 77dfade060..cc7adfa085 100644 --- a/src/qibolab/instruments/rfsoc/driver.py +++ b/src/qibolab/instruments/rfsoc/driver.py @@ -434,7 +434,7 @@ def get_if_python_sweep( A boolean value true if the sweeper must be executed by python loop, false otherwise """ - if any(pulse.type is PulseType.FLUX for pulse in sequence): + if any("flux" in ch for ch in sequence): return True for sweeper in sweepers: if all( @@ -453,7 +453,9 @@ def get_if_python_sweep( for sweep_idx, parameter in enumerate(sweeper.parameters): is_freq = parameter is rfsoc.Parameter.FREQUENCY - is_ro = sequence[sweeper.indexes[sweep_idx]].type == PulseType.READOUT + # FIXME: the sequence can not even be indexed like this any longer + # is_ro = sequence[sweeper.indexes[sweep_idx]].type == PulseType.READOUT + is_ro = False # if it's a sweep on the readout freq do a python sweep if is_freq and is_ro: return True From e834001ec36d4525c9c59d3e7e672ca4ea47126e Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 6 Aug 2024 18:54:45 +0200 Subject: [PATCH 0486/1006] fix: Cool down linter errors in zhinst --- src/qibolab/instruments/zhinst/pulse.py | 8 ++++++-- src/qibolab/instruments/zhinst/sweep.py | 4 +++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/qibolab/instruments/zhinst/pulse.py b/src/qibolab/instruments/zhinst/pulse.py index 52ce6f9210..6878d0ea98 100644 --- a/src/qibolab/instruments/zhinst/pulse.py +++ b/src/qibolab/instruments/zhinst/pulse.py @@ -15,7 +15,9 @@ def select_pulse(pulse: Pulse): """Return laboneq pulse object corresponding to the given qibolab pulse.""" if isinstance(pulse.envelope, Rectangular): - can_compress = pulse.type is not PulseType.READOUT + # FIXME: + # can_compress = pulse.type is not PulseType.READOUT + can_compress = False return laboneq.pulse_library.const( length=round(pulse.duration * NANO_TO_SECONDS, 9), amplitude=pulse.amplitude, @@ -33,7 +35,9 @@ def select_pulse(pulse: Pulse): if isinstance(pulse.envelope, GaussianSquare): sigma = pulse.envelope.rel_sigma width = pulse.envelope.width - can_compress = pulse.type is not PulseType.READOUT + # FIXME: + # can_compress = pulse.type is not PulseType.READOUT + can_compress = False return laboneq.pulse_library.gaussian_square( length=round(pulse.duration * NANO_TO_SECONDS, 9), width=round(pulse.duration * NANO_TO_SECONDS, 9) * width, diff --git a/src/qibolab/instruments/zhinst/sweep.py b/src/qibolab/instruments/zhinst/sweep.py index 69c8810dfe..892368eee6 100644 --- a/src/qibolab/instruments/zhinst/sweep.py +++ b/src/qibolab/instruments/zhinst/sweep.py @@ -22,7 +22,9 @@ def classify_sweepers( for sweeper in sweepers: if sweeper.parameter is Parameter.bias or ( sweeper.parameter is Parameter.amplitude - and sweeper.pulses[0].type is PulseType.READOUT + # FIXME: + # and sweeper.pulses[0].type is PulseType.READOUT + and False ): nt_sweepers.append(sweeper) else: From 04f8745b2d66c77e6e41d24412fde21407a1c27c Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 6 Aug 2024 19:20:47 +0200 Subject: [PATCH 0487/1006] test: Fix pulse tests for pulse type removal --- tests/pulses/test_envelope.py | 3 --- tests/pulses/test_plot.py | 6 ------ tests/pulses/test_pulse.py | 15 +------------- tests/pulses/test_sequence.py | 37 ++++++++++++----------------------- 4 files changed, 13 insertions(+), 48 deletions(-) diff --git a/tests/pulses/test_envelope.py b/tests/pulses/test_envelope.py index ed991d18b6..72ca1d08fa 100644 --- a/tests/pulses/test_envelope.py +++ b/tests/pulses/test_envelope.py @@ -8,7 +8,6 @@ GaussianSquare, Iir, Pulse, - PulseType, Rectangular, Snz, ) @@ -30,7 +29,6 @@ def test_sampling_rate(shape): frequency=int(100e6), envelope=shape, relative_phase=0, - type=PulseType.DRIVE, ) assert len(pulse.i(sampling_rate=1)) == 40 assert len(pulse.i(sampling_rate=100)) == 4000 @@ -43,7 +41,6 @@ def test_drag_shape(): frequency=int(4e9), envelope=Drag(rel_sigma=0.5, beta=1), relative_phase=0, - type=PulseType.DRIVE, ) # envelope i & envelope q should cross nearly at 0 and at 2 waveform = pulse.i(sampling_rate=10) diff --git a/tests/pulses/test_plot.py b/tests/pulses/test_plot.py index 156df65b49..ddfd048ad4 100644 --- a/tests/pulses/test_plot.py +++ b/tests/pulses/test_plot.py @@ -11,7 +11,6 @@ Iir, Pulse, PulseSequence, - PulseType, Rectangular, Snz, plot, @@ -29,7 +28,6 @@ def test_plot_functions(): frequency=0, envelope=Rectangular(), relative_phase=0, - type=PulseType.FLUX, ) p1 = Pulse( duration=40, @@ -37,7 +35,6 @@ def test_plot_functions(): frequency=50e6, envelope=Gaussian(rel_sigma=0.2), relative_phase=0, - type=PulseType.DRIVE, ) p2 = Pulse( duration=40, @@ -45,7 +42,6 @@ def test_plot_functions(): frequency=50e6, envelope=Drag(rel_sigma=0.2, beta=2), relative_phase=0, - type=PulseType.DRIVE, ) p3 = Pulse.flux( duration=40, @@ -59,7 +55,6 @@ def test_plot_functions(): frequency=400e6, envelope=ECap(alpha=2), relative_phase=0, - type=PulseType.DRIVE, ) p6 = Pulse( duration=40, @@ -67,7 +62,6 @@ def test_plot_functions(): frequency=50e6, envelope=GaussianSquare(rel_sigma=0.2, width=0.9), relative_phase=0, - type=PulseType.DRIVE, ) ps = PulseSequence() ps.update( diff --git a/tests/pulses/test_pulse.py b/tests/pulses/test_pulse.py index 1cb65ed9bd..b591b470ea 100644 --- a/tests/pulses/test_pulse.py +++ b/tests/pulses/test_pulse.py @@ -12,7 +12,6 @@ GaussianSquare, Iir, Pulse, - PulseType, Rectangular, Snz, ) @@ -25,7 +24,6 @@ def test_init(): amplitude=0.9, relative_phase=0.0, envelope=Rectangular(), - type=PulseType.READOUT, ) assert p0.relative_phase == 0.0 @@ -34,9 +32,8 @@ def test_init(): amplitude=0.9, relative_phase=0.0, envelope=Rectangular(), - type=PulseType.READOUT, ) - assert p1.type is PulseType.READOUT + assert p1.amplitude == 0.9 # initialisation with non float (int) relative_phase p2 = Pulse( @@ -44,7 +41,6 @@ def test_init(): amplitude=0.9, relative_phase=1.0, envelope=Rectangular(), - type=PulseType.READOUT, ) assert isinstance(p2.relative_phase, float) and p2.relative_phase == 1.0 @@ -54,28 +50,24 @@ def test_init(): amplitude=0.9, envelope=Rectangular(), relative_phase=0, - type=PulseType.READOUT, ) p7 = Pulse( duration=40, amplitude=0.9, envelope=Rectangular(), relative_phase=0, - type=PulseType.FLUX, ) p8 = Pulse( duration=40, amplitude=0.9, envelope=Gaussian(rel_sigma=0.2), relative_phase=0, - type=PulseType.DRIVE, ) p9 = Pulse( duration=40, amplitude=0.9, envelope=Drag(rel_sigma=0.2, beta=2), relative_phase=0, - type=PulseType.DRIVE, ) p10 = Pulse.flux( duration=40, @@ -94,14 +86,12 @@ def test_init(): amplitude=0.9, envelope=ECap(alpha=2), relative_phase=0, - type=PulseType.DRIVE, ) p14 = Pulse( duration=40, amplitude=0.9, envelope=GaussianSquare(rel_sigma=0.2, width=0.9), relative_phase=0, - type=PulseType.READOUT, ) # initialisation with float duration @@ -110,7 +100,6 @@ def test_init(): amplitude=0.9, relative_phase=1, envelope=Rectangular(), - type=PulseType.READOUT, ) assert isinstance(p12.duration, float) assert p12.duration == 34.33 @@ -128,7 +117,6 @@ def test_attributes(): assert isinstance(p.amplitude, float) and p.amplitude == 0.9 assert isinstance(p.relative_phase, float) and p.relative_phase == 0.0 assert isinstance(p.envelope, BaseEnvelope) - assert isinstance(p.type, PulseType) def test_pulse(): @@ -152,7 +140,6 @@ def test_readout_pulse(): duration=duration, relative_phase=0, envelope=Rectangular(), - type=PulseType.READOUT, ) assert pulse.duration == duration diff --git a/tests/pulses/test_sequence.py b/tests/pulses/test_sequence.py index 2963c80213..7636cd2993 100644 --- a/tests/pulses/test_sequence.py +++ b/tests/pulses/test_sequence.py @@ -1,14 +1,6 @@ from collections import defaultdict -from qibolab.pulses import ( - Delay, - Drag, - Gaussian, - Pulse, - PulseSequence, - PulseType, - Rectangular, -) +from qibolab.pulses import Delay, Drag, Gaussian, Pulse, PulseSequence, Rectangular def test_init(): @@ -64,26 +56,24 @@ def test_ro_pulses(): envelope=Gaussian(rel_sigma=0.2), ) ) - sequence["ch2"].append(Delay(duration=4)) - sequence["ch2"].append( + sequence["ch2/flux"].append(Delay(duration=4)) + sequence["ch2/flux"].append( Pulse( amplitude=0.3, duration=60, relative_phase=0, envelope=Drag(rel_sigma=0.2, beta=2), - type=PulseType.FLUX, ) ) - sequence["ch3"].append(Delay(duration=4)) + sequence["ch3/readout"].append(Delay(duration=4)) ro_pulse = Pulse( amplitude=0.9, duration=2000, relative_phase=0, envelope=Rectangular(), - type=PulseType.READOUT, ) - sequence["ch3"].append(ro_pulse) - assert set(sequence.keys()) == {"ch1", "ch2", "ch3"} + sequence["ch3/readout"].append(ro_pulse) + assert set(sequence.keys()) == {"ch1", "ch2/flux", "ch3/readout"} assert sum(len(pulses) for pulses in sequence.values()) == 5 assert len(sequence.probe_pulses) == 1 assert sequence.probe_pulses[0] == ro_pulse @@ -91,33 +81,30 @@ def test_ro_pulses(): def test_durations(): sequence = PulseSequence() - sequence["ch1"].append(Delay(duration=20)) - sequence["ch1"].append( + sequence["ch1/readout"].append(Delay(duration=20)) + sequence["ch1/readout"].append( Pulse( duration=1000, amplitude=0.9, envelope=Rectangular(), - type=PulseType.READOUT, ) ) - sequence["ch2"].append( + sequence["ch2/drive"].append( Pulse( duration=40, amplitude=0.9, envelope=Drag(rel_sigma=0.2, beta=1), - type=PulseType.DRIVE, ) ) - assert sequence.channel_duration("ch1") == 20 + 1000 - assert sequence.channel_duration("ch2") == 40 + assert sequence.channel_duration("ch1/drive") == 20 + 1000 + assert sequence.channel_duration("ch2/readout") == 40 assert sequence.duration == 20 + 1000 - sequence["ch2"].append( + sequence["ch2/readout"].append( Pulse( duration=1200, amplitude=0.9, envelope=Rectangular(), - type=PulseType.READOUT, ) ) assert sequence.duration == 40 + 1200 From a1fc4ca9696f780cc070ca8ef2a11a9abcbcd8f3 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 6 Aug 2024 19:23:33 +0200 Subject: [PATCH 0488/1006] test: Fix remaining non-drivers pulse tests --- tests/test_dummy.py | 15 ++------------- tests/test_platform.py | 14 +++----------- tests/test_unrolling.py | 14 +------------- 3 files changed, 6 insertions(+), 37 deletions(-) diff --git a/tests/test_dummy.py b/tests/test_dummy.py index 71f26f1d43..8ab815d636 100644 --- a/tests/test_dummy.py +++ b/tests/test_dummy.py @@ -2,14 +2,7 @@ import pytest from qibolab import AcquisitionType, AveragingMode, ExecutionParameters, create_platform -from qibolab.pulses import ( - Delay, - Gaussian, - GaussianSquare, - Pulse, - PulseSequence, - PulseType, -) +from qibolab.pulses import Delay, Gaussian, GaussianSquare, Pulse, PulseSequence from qibolab.sweeper import ChannelParameter, Parameter, Sweeper SWEPT_POINTS = 5 @@ -52,7 +45,6 @@ def test_dummy_execute_coupler_pulse(): duration=30, amplitude=0.05, envelope=GaussianSquare(rel_sigma=5, width=0.75), - type=PulseType.COUPLERFLUX, ) sequence[channel.name].append(pulse) @@ -154,7 +146,6 @@ def test_dummy_single_sweep_coupler( duration=40, amplitude=0.5, envelope=GaussianSquare(rel_sigma=0.2, width=0.75), - type=PulseType.COUPLERFLUX, ) sequence.extend(probe_seq) sequence[platform.get_coupler(0).flux.name].append(coupler_pulse) @@ -266,9 +257,7 @@ def test_dummy_single_sweep(name, fast_reset, parameter, average, acquisition, n def test_dummy_double_sweep(name, parameter1, parameter2, average, acquisition, nshots): platform = create_platform(name) sequence = PulseSequence() - pulse = Pulse( - duration=40, amplitude=0.1, envelope=Gaussian(rel_sigma=5), type=PulseType.DRIVE - ) + pulse = Pulse(duration=40, amplitude=0.1, envelope=Gaussian(rel_sigma=5)) probe_seq = platform.qubits[0].native_gates.MZ.create_sequence() probe_pulse = next(iter(probe_seq.values()))[0] sequence[platform.get_qubit(0).drive.name].append(pulse) diff --git a/tests/test_platform.py b/tests/test_platform.py index c7a0c3c7bf..c83d6ccc22 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -23,7 +23,7 @@ from qibolab.platform import Platform, unroll_sequences from qibolab.platform.load import PLATFORMS from qibolab.platform.platform import update_configs -from qibolab.pulses import Delay, Gaussian, Pulse, PulseSequence, PulseType, Rectangular +from qibolab.pulses import Delay, Gaussian, Pulse, PulseSequence, Rectangular from qibolab.qubits import Qubit, QubitPair from qibolab.serialize import ( PLATFORM, @@ -255,7 +255,6 @@ def test_platform_execute_one_drive_pulse(qpu_platform): duration=200, amplitude=0.07, envelope=Gaussian(5), - type=PulseType.DRIVE, ) ) result = platform.execute_pulse_sequence( @@ -277,7 +276,6 @@ def test_platform_execute_one_coupler_pulse(qpu_platform): duration=200, amplitude=0.31, envelope=Rectangular(), - type=PulseType.COUPLERFLUX, ) ) result = platform.execute_pulse_sequence( @@ -297,7 +295,6 @@ def test_platform_execute_one_flux_pulse(qpu_platform): duration=200, amplitude=0.28, envelope=Rectangular(), - type=PulseType.FLUX, ) ) result = platform.execute_pulse_sequence( @@ -311,9 +308,7 @@ def test_platform_execute_one_long_drive_pulse(qpu_platform): # Long duration platform = qpu_platform qubit = next(iter(platform.qubits.values())) - pulse = Pulse( - duration=8192 + 200, amplitude=0.12, envelope=Gaussian(5), type=PulseType.DRIVE - ) + pulse = Pulse(duration=8192 + 200, amplitude=0.12, envelope=Gaussian(5)) sequence = PulseSequence() sequence[qubit.drive.name].append(pulse) options = ExecutionParameters(nshots=nshots) @@ -333,7 +328,6 @@ def test_platform_execute_one_extralong_drive_pulse(qpu_platform): duration=2 * 8192 + 200, amplitude=0.12, envelope=Gaussian(5), - type=PulseType.DRIVE, ) sequence = PulseSequence() sequence[qubit.drive.name].append(pulse) @@ -398,9 +392,7 @@ def test_platform_execute_multiple_overlaping_drive_pulses_one_readout( platform = qpu_platform qubit_id, qubit = next(iter(platform.qubits.items())) sequence = PulseSequence() - pulse = Pulse( - duration=200, amplitude=0.08, envelope=Gaussian(7), type=PulseType.DRIVE - ) + pulse = Pulse(duration=200, amplitude=0.08, envelope=Gaussian(7)) sequence[qubit.drive.name].append(pulse) sequence[qubit.drive12.name].append(pulse.copy()) sequence[qubit.probe.name].append(Delay(duration=800)) diff --git a/tests/test_unrolling.py b/tests/test_unrolling.py index 0624db1e6c..42ab67a400 100644 --- a/tests/test_unrolling.py +++ b/tests/test_unrolling.py @@ -2,7 +2,7 @@ import pytest -from qibolab.pulses import Drag, Pulse, PulseSequence, PulseType, Rectangular +from qibolab.pulses import Drag, Pulse, PulseSequence, Rectangular from qibolab.unrolling import Bounds, batch @@ -13,7 +13,6 @@ def test_bounds_update(): duration=40, amplitude=0.9, envelope=Drag(rel_sigma=0.2, beta=1), - type=PulseType.DRIVE, ) ) ps["ch2"].append( @@ -21,7 +20,6 @@ def test_bounds_update(): duration=40, amplitude=0.9, envelope=Drag(rel_sigma=0.2, beta=1), - type=PulseType.DRIVE, ) ) ps["ch1"].append( @@ -29,7 +27,6 @@ def test_bounds_update(): duration=40, amplitude=0.9, envelope=Drag(rel_sigma=0.2, beta=1), - type=PulseType.DRIVE, ) ) @@ -38,7 +35,6 @@ def test_bounds_update(): duration=1000, amplitude=0.9, envelope=Rectangular(), - type=PulseType.READOUT, ) ) ps["ch2"].append( @@ -46,7 +42,6 @@ def test_bounds_update(): duration=1000, amplitude=0.9, envelope=Rectangular(), - type=PulseType.READOUT, ) ) ps["ch1"].append( @@ -54,7 +49,6 @@ def test_bounds_update(): duration=1000, amplitude=0.9, envelope=Rectangular(), - type=PulseType.READOUT, ) ) @@ -99,7 +93,6 @@ def test_batch(bounds): duration=40, amplitude=0.9, envelope=Drag(rel_sigma=0.2, beta=1), - type=PulseType.DRIVE, ) ) ps["ch2"].append( @@ -107,7 +100,6 @@ def test_batch(bounds): duration=40, amplitude=0.9, envelope=Drag(rel_sigma=0.2, beta=1), - type=PulseType.DRIVE, ) ) ps["ch1"].append( @@ -115,7 +107,6 @@ def test_batch(bounds): duration=40, amplitude=0.9, envelope=Drag(rel_sigma=0.2, beta=1), - type=PulseType.DRIVE, ) ) @@ -124,7 +115,6 @@ def test_batch(bounds): duration=1000, amplitude=0.9, envelope=Rectangular(), - type=PulseType.READOUT, ) ) ps["ch2"].append( @@ -132,7 +122,6 @@ def test_batch(bounds): duration=1000, amplitude=0.9, envelope=Rectangular(), - type=PulseType.READOUT, ) ) ps["ch1"].append( @@ -140,7 +129,6 @@ def test_batch(bounds): duration=1000, amplitude=0.9, envelope=Rectangular(), - type=PulseType.READOUT, ) ) From eef51d043a73415f67415797cfb32d33c1d8293d Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 6 Aug 2024 19:26:05 +0200 Subject: [PATCH 0489/1006] test: Remove pulse type import from drivers' tests It's not useful to properly fix, since they can not be tested anyhow --- tests/test_instruments_qblox_controller.py | 2 +- tests/test_instruments_rfsoc.py | 2 +- tests/test_instruments_zhinst.py | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/test_instruments_qblox_controller.py b/tests/test_instruments_qblox_controller.py index 34ecaee7a2..601154d312 100644 --- a/tests/test_instruments_qblox_controller.py +++ b/tests/test_instruments_qblox_controller.py @@ -5,7 +5,7 @@ from qibolab import AveragingMode, ExecutionParameters from qibolab.instruments.qblox.controller import MAX_NUM_BINS, QbloxController -from qibolab.pulses import Gaussian, Pulse, PulseSequence, PulseType, Rectangular +from qibolab.pulses import Gaussian, Pulse, PulseSequence, Rectangular from qibolab.sweeper import Parameter, Sweeper from .qblox_fixtures import connected_controller, controller diff --git a/tests/test_instruments_rfsoc.py b/tests/test_instruments_rfsoc.py index b61b848061..470a2a3767 100644 --- a/tests/test_instruments_rfsoc.py +++ b/tests/test_instruments_rfsoc.py @@ -14,7 +14,7 @@ convert_units_sweeper, replace_pulse_shape, ) -from qibolab.pulses import Drag, Gaussian, Pulse, PulseSequence, PulseType, Rectangular +from qibolab.pulses import Drag, Gaussian, Pulse, PulseSequence, Rectangular from qibolab.qubits import Qubit from qibolab.sweeper import Parameter, Sweeper, SweeperType diff --git a/tests/test_instruments_zhinst.py b/tests/test_instruments_zhinst.py index ea431ec9ce..9dc5536e9b 100644 --- a/tests/test_instruments_zhinst.py +++ b/tests/test_instruments_zhinst.py @@ -13,7 +13,6 @@ Iir, Pulse, PulseSequence, - PulseType, Rectangular, Snz, ) From 28e24fb60092e3f8f545c4aff44479c41536bcfd Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 6 Aug 2024 19:28:57 +0200 Subject: [PATCH 0490/1006] fix: Remove type handling during serialization --- src/qibolab/serialize.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index 5ebc88535f..cf1cd50d4a 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -209,7 +209,6 @@ def dump_qubit_name(name: QubitId) -> str: def _dump_pulse(pulse: Pulse): data = pulse.model_dump() - data["type"] = data["type"].value if "channel" in data: del data["channel"] if "relative_phase" in data: From 5aaca8a91d2ca19fd93b009c156c160a8fb3228b Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 6 Aug 2024 19:34:47 +0200 Subject: [PATCH 0491/1006] test: Fix sequence tests, by fixing channel names --- tests/pulses/test_sequence.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/pulses/test_sequence.py b/tests/pulses/test_sequence.py index 7636cd2993..aea6a69160 100644 --- a/tests/pulses/test_sequence.py +++ b/tests/pulses/test_sequence.py @@ -65,15 +65,15 @@ def test_ro_pulses(): envelope=Drag(rel_sigma=0.2, beta=2), ) ) - sequence["ch3/readout"].append(Delay(duration=4)) + sequence["ch3/probe"].append(Delay(duration=4)) ro_pulse = Pulse( amplitude=0.9, duration=2000, relative_phase=0, envelope=Rectangular(), ) - sequence["ch3/readout"].append(ro_pulse) - assert set(sequence.keys()) == {"ch1", "ch2/flux", "ch3/readout"} + sequence["ch3/probe"].append(ro_pulse) + assert set(sequence.keys()) == {"ch1", "ch2/flux", "ch3/probe"} assert sum(len(pulses) for pulses in sequence.values()) == 5 assert len(sequence.probe_pulses) == 1 assert sequence.probe_pulses[0] == ro_pulse @@ -81,8 +81,8 @@ def test_ro_pulses(): def test_durations(): sequence = PulseSequence() - sequence["ch1/readout"].append(Delay(duration=20)) - sequence["ch1/readout"].append( + sequence["ch1/probe"].append(Delay(duration=20)) + sequence["ch1/probe"].append( Pulse( duration=1000, amplitude=0.9, @@ -96,11 +96,11 @@ def test_durations(): envelope=Drag(rel_sigma=0.2, beta=1), ) ) - assert sequence.channel_duration("ch1/drive") == 20 + 1000 - assert sequence.channel_duration("ch2/readout") == 40 + assert sequence.channel_duration("ch1/probe") == 20 + 1000 + assert sequence.channel_duration("ch2/drive") == 40 assert sequence.duration == 20 + 1000 - sequence["ch2/readout"].append( + sequence["ch2/drive"].append( Pulse( duration=1200, amplitude=0.9, From dd0d459184bc2d326c87007d0e26fd8d4037f497 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 6 Aug 2024 19:38:05 +0200 Subject: [PATCH 0492/1006] test: Fix unrolling tests, by fixing channel names --- tests/test_unrolling.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/tests/test_unrolling.py b/tests/test_unrolling.py index 42ab67a400..54ec598cf2 100644 --- a/tests/test_unrolling.py +++ b/tests/test_unrolling.py @@ -8,21 +8,21 @@ def test_bounds_update(): ps = PulseSequence() - ps["ch3"].append( + ps["ch3/drive"].append( Pulse( duration=40, amplitude=0.9, envelope=Drag(rel_sigma=0.2, beta=1), ) ) - ps["ch2"].append( + ps["ch2/drive"].append( Pulse( duration=40, amplitude=0.9, envelope=Drag(rel_sigma=0.2, beta=1), ) ) - ps["ch1"].append( + ps["ch1/drive"].append( Pulse( duration=40, amplitude=0.9, @@ -30,21 +30,21 @@ def test_bounds_update(): ) ) - ps["ch3"].append( + ps["ch3/probe"].append( Pulse( duration=1000, amplitude=0.9, envelope=Rectangular(), ) ) - ps["ch2"].append( + ps["ch2/probe"].append( Pulse( duration=1000, amplitude=0.9, envelope=Rectangular(), ) ) - ps["ch1"].append( + ps["ch1/probe"].append( Pulse( duration=1000, amplitude=0.9, @@ -88,21 +88,21 @@ def test_bounds_comparison(): ) def test_batch(bounds): ps = PulseSequence() - ps["ch3"].append( + ps["ch3/drive"].append( Pulse( duration=40, amplitude=0.9, envelope=Drag(rel_sigma=0.2, beta=1), ) ) - ps["ch2"].append( + ps["ch2/drive"].append( Pulse( duration=40, amplitude=0.9, envelope=Drag(rel_sigma=0.2, beta=1), ) ) - ps["ch1"].append( + ps["ch1/drive"].append( Pulse( duration=40, amplitude=0.9, @@ -110,21 +110,21 @@ def test_batch(bounds): ) ) - ps["ch3"].append( + ps["ch3/probe"].append( Pulse( duration=1000, amplitude=0.9, envelope=Rectangular(), ) ) - ps["ch2"].append( + ps["ch2/probe"].append( Pulse( duration=1000, amplitude=0.9, envelope=Rectangular(), ) ) - ps["ch1"].append( + ps["ch1/probe"].append( Pulse( duration=1000, amplitude=0.9, From 8e39b193fc99b156ab2514b9091de608313df15d Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 6 Aug 2024 19:55:06 +0200 Subject: [PATCH 0493/1006] fix: Remove pulse types from runcards, make durations floats --- src/qibolab/dummy/parameters.json | 275 ++++++++++------------- tests/dummy_qrc/zurich/parameters.json | 296 +++++++++++-------------- 2 files changed, 246 insertions(+), 325 deletions(-) diff --git a/src/qibolab/dummy/parameters.json b/src/qibolab/dummy/parameters.json index 42da6014bd..f36c80b7c2 100644 --- a/src/qibolab/dummy/parameters.json +++ b/src/qibolab/dummy/parameters.json @@ -26,64 +26,64 @@ } }, "components": { - "qubit_0/drive" : { + "qubit_0/drive": { "frequency": 4000000000 }, - "qubit_1/drive" : { + "qubit_1/drive": { "frequency": 4200000000 }, - "qubit_2/drive" : { + "qubit_2/drive": { "frequency": 4500000000 }, - "qubit_3/drive" : { + "qubit_3/drive": { "frequency": 4150000000 }, - "qubit_4/drive" : { + "qubit_4/drive": { "frequency": 4155663000 }, - "qubit_0/drive12" : { + "qubit_0/drive12": { "frequency": 4700000000 }, - "qubit_1/drive12" : { + "qubit_1/drive12": { "frequency": 4855663000 }, - "qubit_2/drive12" : { + "qubit_2/drive12": { "frequency": 2700000000 }, - "qubit_3/drive12" : { + "qubit_3/drive12": { "frequency": 5855663000 }, - "qubit_4/drive12" : { + "qubit_4/drive12": { "frequency": 5855663000 }, - "qubit_0/flux" : { + "qubit_0/flux": { "offset": -0.1 }, - "qubit_1/flux" : { + "qubit_1/flux": { "offset": 0.0 }, - "qubit_2/flux" : { + "qubit_2/flux": { "offset": 0.1 }, - "qubit_3/flux" : { + "qubit_3/flux": { "offset": 0.2 }, - "qubit_4/flux" : { + "qubit_4/flux": { "offset": 0.15 }, - "qubit_0/probe" : { + "qubit_0/probe": { "frequency": 5200000000 }, - "qubit_1/probe" : { + "qubit_1/probe": { "frequency": 4900000000 }, - "qubit_2/probe" : { + "qubit_2/probe": { "frequency": 6100000000 }, - "qubit_3/probe" : { + "qubit_3/probe": { "frequency": 5800000000 }, - "qubit_4/probe" : { + "qubit_4/probe": { "frequency": 5500000000 }, "qubit_0/acquire": { @@ -106,16 +106,16 @@ "delay": 0, "smearing": 0 }, - "coupler_0/flux" : { + "coupler_0/flux": { "offset": 0.0 }, - "coupler_1/flux" : { + "coupler_1/flux": { "offset": 0.0 }, - "coupler_3/flux" : { + "coupler_3/flux": { "offset": 0.0 }, - "coupler_4/flux" : { + "coupler_4/flux": { "offset": 0.0 }, "twpa_pump": { @@ -129,34 +129,31 @@ "RX": { "qubit_0/drive": [ { - "duration": 40, + "duration": 40.0, "amplitude": 0.1, - "envelope": { "kind": "gaussian", "rel_sigma": 5 }, - "type": "qd" + "envelope": { "kind": "gaussian", "rel_sigma": 5.0 } } ] }, "RX12": { "qubit_0/drive12": [ { - "duration": 40, + "duration": 40.0, "amplitude": 0.005, - "envelope": { "kind": "gaussian", "rel_sigma": 5 }, - "type": "qd" + "envelope": { "kind": "gaussian", "rel_sigma": 5.0 } } ] }, "MZ": { "qubit_0/probe": [ { - "duration": 2000, + "duration": 2000.0, "amplitude": 0.1, "envelope": { "kind": "gaussian_square", - "rel_sigma": 5, + "rel_sigma": 5.0, "width": 0.75 - }, - "type": "ro" + } } ] } @@ -165,34 +162,31 @@ "RX": { "qubit_1/drive": [ { - "duration": 40, + "duration": 40.0, "amplitude": 0.3, - "envelope": { "kind": "drag", "rel_sigma": 5, "beta": 0.02 }, - "type": "qd" + "envelope": { "kind": "drag", "rel_sigma": 5.0, "beta": 0.02 } } ] }, "RX12": { "qubit_1/drive12": [ { - "duration": 40, + "duration": 40.0, "amplitude": 0.0484, - "envelope": { "kind": "drag", "rel_sigma": 5, "beta": 0.02 }, - "type": "qd" + "envelope": { "kind": "drag", "rel_sigma": 5.0, "beta": 0.02 } } ] - } , + }, "MZ": { "qubit_1/probe": [ { - "duration": 2000, + "duration": 2000.0, "amplitude": 0.1, "envelope": { "kind": "gaussian_square", - "rel_sigma": 5, + "rel_sigma": 5.0, "width": 0.75 - }, - "type": "ro" + } } ] } @@ -201,34 +195,31 @@ "RX": { "qubit_2/drive": [ { - "duration": 40, + "duration": 40.0, "amplitude": 0.3, - "envelope": { "kind": "drag", "rel_sigma": 5, "beta": 0.02 }, - "type": "qd" + "envelope": { "kind": "drag", "rel_sigma": 5.0, "beta": 0.02 } } ] }, "RX12": { "qubit_2/drive12": [ { - "duration": 40, + "duration": 40.0, "amplitude": 0.005, - "envelope": { "kind": "gaussian", "rel_sigma": 5 }, - "type": "qd" + "envelope": { "kind": "gaussian", "rel_sigma": 5.0 } } ] }, "MZ": { "qubit_2/probe": [ { - "duration": 2000, + "duration": 2000.0, "amplitude": 0.1, "envelope": { "kind": "gaussian_square", - "rel_sigma": 5, + "rel_sigma": 5.0, "width": 0.75 - }, - "type": "ro" + } } ] } @@ -237,34 +228,31 @@ "RX": { "qubit_3/drive": [ { - "duration": 40, + "duration": 40.0, "amplitude": 0.3, - "envelope": { "kind": "drag", "rel_sigma": 5, "beta": 0.02 }, - "type": "qd" + "envelope": { "kind": "drag", "rel_sigma": 5.0, "beta": 0.02 } } ] }, "RX12": { "qubit_3/drive12": [ { - "duration": 40, + "duration": 40.0, "amplitude": 0.0484, - "envelope": { "kind": "drag", "rel_sigma": 5, "beta": 0.02 }, - "type": "qd" - } + "envelope": { "kind": "drag", "rel_sigma": 5.0, "beta": 0.02 } + } ] }, "MZ": { "qubit_3/probe": [ { - "duration": 2000, + "duration": 2000.0, "amplitude": 0.1, "envelope": { "kind": "gaussian_square", - "rel_sigma": 5, + "rel_sigma": 5.0, "width": 0.75 - }, - "type": "ro" + } } ] } @@ -273,34 +261,31 @@ "RX": { "qubit_4/drive": [ { - "duration": 40, + "duration": 40.0, "amplitude": 0.3, - "envelope": { "kind": "drag", "rel_sigma": 5, "beta": 0.02 }, - "type": "qd" + "envelope": { "kind": "drag", "rel_sigma": 5.0, "beta": 0.02 } } ] }, "RX12": { "qubit_4/drive12": [ { - "duration": 40, + "duration": 40.0, "amplitude": 0.0484, - "envelope": { "kind": "drag", "rel_sigma": 5, "beta": 0.02 }, - "type": "qd" + "envelope": { "kind": "drag", "rel_sigma": 5.0, "beta": 0.02 } } ] }, "MZ": { "qubit_4/probe": [ { - "duration": 2000, + "duration": 2000.0, "amplitude": 0.1, "envelope": { "kind": "gaussian_square", - "rel_sigma": 5, + "rel_sigma": 5.0, "width": 0.75 - }, - "type": "ro" + } } ] } @@ -311,76 +296,68 @@ "CZ": { "qubit_2/flux": [ { - "duration": 30, + "duration": 30.0, "amplitude": 0.05, "envelope": { "kind": "gaussian_square", - "rel_sigma": 5, + "rel_sigma": 5.0, "width": 0.75 - }, - "type": "qf" + } } ], "qubit_0/drive": [ { - "type": "vz", "phase": 0.0 } ], "qubit_2/drive": [ { - "type": "vz", "phase": 0.0 } ], "coupler_0/flux": [ { - "duration": 30, + "duration": 30.0, "amplitude": 0.05, "envelope": { "kind": "gaussian_square", - "rel_sigma": 5, + "rel_sigma": 5.0, "width": 0.75 - }, - "type": "cf" + } } ] }, "iSWAP": { "qubit_2/flux": [ { - "duration": 30, + "duration": 30.0, "amplitude": 0.05, "envelope": { "kind": "gaussian_square", - "rel_sigma": 5, + "rel_sigma": 5.0, "width": 0.75 - }, - "type": "qf" + } } ], "qubit_0/drive": [ { - "type": "vz", "phase": 0.0 } ], "qubit_2/drive": [ { - "type": "vz", "phase": 0.0 } ], "coupler_0/flux": [ { - "duration": 30, + "duration": 30.0, "amplitude": 0.05, "envelope": { "kind": "gaussian_square", - "rel_sigma": 5, + "rel_sigma": 5.0, "width": 0.75 - }, - "type": "cf" + } } ] } @@ -389,76 +366,68 @@ "CZ": { "qubit_2/flux": [ { - "duration": 30, + "duration": 30.0, "amplitude": 0.05, "envelope": { "kind": "gaussian_square", - "rel_sigma": 5, + "rel_sigma": 5.0, "width": 0.75 - }, - "type": "qf" + } } ], "qubit_1/drive": [ { - "type": "vz", "phase": 0.0 } ], "qubit_2/drive": [ { - "type": "vz", "phase": 0.0 } ], "coupler_1/flux": [ { - "duration": 30, + "duration": 30.0, "amplitude": 0.05, "envelope": { "kind": "gaussian_square", - "rel_sigma": 5, + "rel_sigma": 5.0, "width": 0.75 - }, - "type": "cf" + } } ] }, "iSWAP": { "qubit_2/flux": [ { - "duration": 30, + "duration": 30.0, "amplitude": 0.05, "envelope": { "kind": "gaussian_square", - "rel_sigma": 5, + "rel_sigma": 5.0, "width": 0.75 - }, - "type": "qf" + } } ], "qubit_1/drive": [ { - "type": "vz", "phase": 0.0 } ], "qubit_2/drive": [ { - "type": "vz", "phase": 0.0 } ], "coupler_1/flux": [ { - "duration": 30, + "duration": 30.0, "amplitude": 0.05, "envelope": { "kind": "gaussian_square", - "rel_sigma": 5, + "rel_sigma": 5.0, "width": 0.75 - }, - "type": "cf" + } } ] } @@ -467,86 +436,77 @@ "CZ": { "qubit_2/flux": [ { - "duration": 30, + "duration": 30.0, "amplitude": 0.05, "envelope": { "kind": "gaussian_square", - "rel_sigma": 5, + "rel_sigma": 5.0, "width": 0.75 - }, - "type": "qf" + } } ], "qubit_2/drive": [ { - "type": "vz", "phase": 0.0 } ], "qubit_3/drive": [ { - "type": "vz", "phase": 0.0 } ], "coupler_3/flux": [ { - "duration": 30, + "duration": 30.0, "amplitude": 0.05, "envelope": { "kind": "gaussian_square", - "rel_sigma": 5, + "rel_sigma": 5.0, "width": 0.75 - }, - "type": "cf" + } } ] }, "iSWAP": { "qubit_2/flux": [ { - "duration": 30, + "duration": 30.0, "amplitude": 0.05, "envelope": { "kind": "gaussian_square", - "rel_sigma": 5, + "rel_sigma": 5.0, "width": 0.75 - }, - "type": "qf" + } } ], "qubit_2/drive": [ { - "type": "vz", "phase": 0.0 } ], "qubit_3/drive": [ { - "type": "vz", "phase": 0.0 } ], "coupler_3/flux": [ { - "duration": 30, + "duration": 30.0, "amplitude": 0.05, "envelope": { "kind": "gaussian_square", - "rel_sigma": 5, + "rel_sigma": 5.0, "width": 0.75 - }, - "type": "cf" + } } ] }, "CNOT": { "qubit_2/drive": [ { - "duration": 40, + "duration": 40.0, "amplitude": 0.3, - "envelope": { "kind": "drag", "rel_sigma": 5, "beta": 0.02 }, - "type": "qd" + "envelope": { "kind": "drag", "rel_sigma": 5.0, "beta": 0.02 } } ] } @@ -555,76 +515,63 @@ "CZ": { "qubit_2/flux": [ { - "duration": 30, + "duration": 30.0, "amplitude": 0.05, "envelope": { "kind": "gaussian_square", - "rel_sigma": 5, + "rel_sigma": 5.0, "width": 0.75 - }, - "type": "qf" - } - ], - "qubit_2/drive": [ - { - "type": "vz", - "phase": 0.0 + } } ], "qubit_4/drive": [ { - "type": "vz", "phase": 0.0 } ], "coupler_4/flux": [ { - "duration": 30, + "duration": 30.0, "amplitude": 0.05, "envelope": { "kind": "gaussian_square", - "rel_sigma": 5, + "rel_sigma": 5.0, "width": 0.75 - }, - "type": "cf" + } } ] }, "iSWAP": { "qubit_2/flux": [ { - "duration": 30, + "duration": 30.0, "amplitude": 0.05, "envelope": { "kind": "gaussian_square", - "rel_sigma": 5, + "rel_sigma": 5.0, "width": 0.75 - }, - "type": "qf" + } } ], "qubit_2/drive": [ { - "type": "vz", "phase": 0.0 } ], "qubit_4/drive": [ { - "type": "vz", "phase": 0.0 } ], "coupler_4/flux": [ { - "duration": 30, + "duration": 30.0, "amplitude": 0.05, "envelope": { "kind": "gaussian_square", - "rel_sigma": 5, + "rel_sigma": 5.0, "width": 0.75 - }, - "type": "cf" + } } ] } diff --git a/tests/dummy_qrc/zurich/parameters.json b/tests/dummy_qrc/zurich/parameters.json index 7b1cb9e9cd..4f26c3dee3 100644 --- a/tests/dummy_qrc/zurich/parameters.json +++ b/tests/dummy_qrc/zurich/parameters.json @@ -22,63 +22,63 @@ } }, "components": { - "qubit_0/drive" : { + "qubit_0/drive": { "frequency": 4000000000, "power_range": 5 }, - "qubit_1/drive" : { + "qubit_1/drive": { "frequency": 4200000000, "power_range": 0 }, - "qubit_2/drive" : { + "qubit_2/drive": { "frequency": 4500000000, "power_range": -5 }, - "qubit_3/drive" : { + "qubit_3/drive": { "frequency": 4150000000, "power_range": -10 }, - "qubit_4/drive" : { + "qubit_4/drive": { "frequency": 4155663000, "power_range": 5 }, - "qubit_0/flux" : { + "qubit_0/flux": { "offset": -0.1, "power_range": 0.2 }, - "qubit_1/flux" : { + "qubit_1/flux": { "offset": 0.0, "power_range": 0.6 }, - "qubit_2/flux" : { + "qubit_2/flux": { "offset": 0.1, "power_range": 0.4 }, - "qubit_3/flux" : { + "qubit_3/flux": { "offset": 0.2, "power_range": 1 }, - "qubit_4/flux" : { + "qubit_4/flux": { "offset": 0.15, "power_range": 5 }, - "qubit_0/probe" : { + "qubit_0/probe": { "frequency": 5200000000, "power_range": -10 }, - "qubit_1/probe" : { + "qubit_1/probe": { "frequency": 4900000000, "power_range": -10 }, - "qubit_2/probe" : { + "qubit_2/probe": { "frequency": 6100000000, "power_range": -10 }, - "qubit_3/probe" : { + "qubit_3/probe": { "frequency": 5800000000, "power_range": -10 }, - "qubit_4/probe" : { + "qubit_4/probe": { "frequency": 5500000000, "power_range": -10 }, @@ -107,19 +107,19 @@ "smearing": 0, "power_range": 10 }, - "coupler_0/flux" : { + "coupler_0/flux": { "offset": 0.0, "power_range": 3 }, - "coupler_1/flux" : { + "coupler_1/flux": { "offset": 0.0, "power_range": 1 }, - "coupler_3/flux" : { + "coupler_3/flux": { "offset": 0.0, "power_range": 0.4 }, - "coupler_4/flux" : { + "coupler_4/flux": { "offset": 0.0, "power_range": 0.4 }, @@ -142,154 +142,140 @@ }, "native_gates": { "single_qubit": { - "0": { - "RX": { - "qubit_0/drive": [ - { - "duration": 40, - "amplitude": 0.5, - "envelope": { "kind": "gaussian", "rel_sigma": 2.0 }, - "type": "qd" - } - ] - }, - "MZ": { - "qubit_0/probe": [ - { - "duration": 2000, - "amplitude": 0.1, - "envelope": { "kind": "rectangular" }, - "type": "ro" - } - ] - } - }, - "1": { - "RX": { - "qubit_1/drive": [ - { - "duration": 40, - "amplitude": 0.5, - "envelope": { "kind": "gaussian", "rel_sigma": 2.0 }, - "type": "qd" - } - ] - }, - "MZ": { - "qubit_1/probe": [ - { - "duration": 2000, - "amplitude": 0.2, - "envelope": { "kind": "rectangular" }, - "type": "ro" - } - ] - } - }, - "2": { - "RX": { - "qubit_2/drive": [ - { - "duration": 40, - "amplitude": 0.54, - "envelope": { "kind": "gaussian", "rel_sigma": 2.0 }, - "type": "qd" - } - ] - }, - "MZ": { - "qubit_2/probe": [ - { - "duration": 2000, - "amplitude": 0.02, - "envelope": { "kind": "rectangular" }, - "type": "ro" - } - ] - } - }, - "3": { - "RX": { - "qubit_3/drive": [ - { - "duration": 40, - "amplitude": 0.454, - "envelope": { "kind": "gaussian", "rel_sigma": 2.0 }, - "type": "qd" - } - ] - }, - "MZ": { - "qubit_3/probe": [ - { - "duration": 2000, - "amplitude": 0.25, - "envelope": { "kind": "rectangular" }, - "type": "ro" - } - ] - } - }, - "4": { - "RX": { - "qubit_4/drive": [ - { - "duration": 40, - "amplitude": 0.6, - "envelope": { "kind": "gaussian", "rel_sigma": 2.0 }, - "type": "qd" - } - ] - }, - "MZ": { - "qubit_4/probe": [ - { - "duration": 2000, - "amplitude": 0.31, - "envelope": { "kind": "rectangular" }, - "type": "ro" - } - ] - } + "0": { + "RX": { + "qubit_0/drive": [ + { + "duration": 40.0, + "amplitude": 0.5, + "envelope": { "kind": "gaussian", "rel_sigma": 2.0 } + } + ] + }, + "MZ": { + "qubit_0/probe": [ + { + "duration": 2000.0, + "amplitude": 0.1, + "envelope": { "kind": "rectangular" } + } + ] + } + }, + "1": { + "RX": { + "qubit_1/drive": [ + { + "duration": 40.0, + "amplitude": 0.5, + "envelope": { "kind": "gaussian", "rel_sigma": 2.0 } + } + ] + }, + "MZ": { + "qubit_1/probe": [ + { + "duration": 2000.0, + "amplitude": 0.2, + "envelope": { "kind": "rectangular" } + } + ] + } + }, + "2": { + "RX": { + "qubit_2/drive": [ + { + "duration": 40.0, + "amplitude": 0.54, + "envelope": { "kind": "gaussian", "rel_sigma": 2.0 } + } + ] + }, + "MZ": { + "qubit_2/probe": [ + { + "duration": 2000.0, + "amplitude": 0.02, + "envelope": { "kind": "rectangular" } + } + ] + } + }, + "3": { + "RX": { + "qubit_3/drive": [ + { + "duration": 40.0, + "amplitude": 0.454, + "envelope": { "kind": "gaussian", "rel_sigma": 2.0 } } + ] + }, + "MZ": { + "qubit_3/probe": [ + { + "duration": 2000.0, + "amplitude": 0.25, + "envelope": { "kind": "rectangular" } + } + ] + } + }, + "4": { + "RX": { + "qubit_4/drive": [ + { + "duration": 40.0, + "amplitude": 0.6, + "envelope": { "kind": "gaussian", "rel_sigma": 2.0 } + } + ] + }, + "MZ": { + "qubit_4/probe": [ + { + "duration": 2000.0, + "amplitude": 0.31, + "envelope": { "kind": "rectangular" } + } + ] + } + } }, "two_qubit": { "0-2": { "CZ": { "qubit_2/flux": [ { - "duration": 80, + "duration": 80.0, "amplitude": 0.057, "envelope": { "kind": "gaussian_square", "rel_sigma": 5, "width": 0.75 - }, - "type": "qf" + } } ], "qubit_0/drive": [ { - "type": "vz", "phase": 0.0 } ], "qubit_2/drive": [ { - "type": "vz", "phase": 0.0 } ], "coupler_0/flux": [ { - "duration": 30, + "duration": 30.0, "amplitude": 0.05, "envelope": { "kind": "gaussian_square", "rel_sigma": 5, "width": 0.75 - }, - "type": "cf" + } } ] } @@ -298,38 +284,34 @@ "CZ": { "qubit_2/flux": [ { - "duration": 30, + "duration": 30.0, "amplitude": 0.05, "envelope": { "kind": "gaussian_square", "rel_sigma": 5, "width": 0.75 - }, - "type": "qf" + } } ], "qubit_1/drive": [ { - "type": "vz", "phase": 0.0 } ], "qubit_2/drive": [ { - "type": "vz", "phase": 0.0 } ], "coupler_1/flux": [ { - "duration": 30, + "duration": 30.0, "amplitude": 0.05, "envelope": { "kind": "gaussian_square", "rel_sigma": 5, "width": 0.75 - }, - "type": "cf" + } } ] } @@ -338,38 +320,34 @@ "CZ": { "qubit_2/flux": [ { - "duration": 30, + "duration": 30.0, "amplitude": 0.05, "envelope": { "kind": "gaussian_square", "rel_sigma": 5, "width": 0.75 - }, - "type": "qf" + } } ], "qubit_2/drive": [ { - "type": "vz", "phase": 0.0 } ], "qubit_3/drive": [ { - "type": "vz", "phase": 0.0 } ], "coupler_3/flux": [ { - "duration": 30, + "duration": 30.0, "amplitude": 0.05, "envelope": { "kind": "gaussian_square", "rel_sigma": 5, "width": 0.75 - }, - "type": "cf" + } } ] } @@ -378,45 +356,41 @@ "CZ": { "qubit_2/flux": [ { - "duration": 30, + "duration": 30.0, "amplitude": 0.05, "envelope": { "kind": "gaussian_square", "rel_sigma": 5, "width": 0.75 - }, - "type": "qf" + } } ], "qubit_2/drive": [ { - "type": "vz", "phase": 0.0 } ], "qubit_4/drive": [ { - "type": "vz", "phase": 0.0 } ], "coupler_4/flux": [ { - "duration": 30, + "duration": 30.0, "amplitude": 0.05, "envelope": { "kind": "gaussian_square", "rel_sigma": 5, "width": 0.75 - }, - "type": "cf" + } } ] } } } }, - "characterization": { + "characterization": { "single_qubit": { "0": { "bare_resonator_frequency": 0, From c35653338cce06c911e6307648158a8e142d0526 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 7 Aug 2024 19:29:19 +0200 Subject: [PATCH 0494/1006] test: Remove pulse type import from qm tests --- tests/test_instruments_qm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_instruments_qm.py b/tests/test_instruments_qm.py index 65c80490fd..b089800ee4 100644 --- a/tests/test_instruments_qm.py +++ b/tests/test_instruments_qm.py @@ -6,7 +6,7 @@ from qibolab import AcquisitionType, ExecutionParameters, create_platform from qibolab.instruments.qm import QmController -from qibolab.pulses import Pulse, PulseSequence, PulseType, Rectangular +from qibolab.pulses import Pulse, PulseSequence, Rectangular from qibolab.qubits import Qubit from qibolab.sweeper import Parameter, Sweeper From 7bc121354be3e2f5c0a3aa92b87c7075b9faab46 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 7 Aug 2024 19:39:41 +0200 Subject: [PATCH 0495/1006] test: Remove pulse type from docs --- doc/source/main-documentation/qibolab.rst | 7 +++---- doc/source/tutorials/lab.rst | 14 +++----------- doc/source/tutorials/pulses.rst | 4 +--- 3 files changed, 7 insertions(+), 18 deletions(-) diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index 48df331656..c4d9849f83 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -253,7 +253,6 @@ To illustrate, here are some examples of single pulses using the Qibolab API: relative_phase=0, # Phase in radians envelope=Rectangular(), channel="channel", - type="qd", # Enum type: :class:`qibolab.pulses.PulseType` qubit=0, ) @@ -402,9 +401,9 @@ To effectively specify the sweeping behavior, Qibolab provides the ``values`` at The ``values`` attribute comprises an array of numerical values that define the sweeper's progression. To facilitate multi-qubit execution, these numbers can be interpreted in three ways: -- Absolute Values: Represented by `qibolab.sweeper.PulseType.ABSOLUTE`, these values are used directly. -- Relative Values with Offset: Utilizing `qibolab.sweeper.PulseType.OFFSET`, these values are relative to a designated base value, corresponding to the pulse or qubit value. -- Relative Values with Factor: Employing `qibolab.sweeper.PulseType.FACTOR`, these values are scaled by a factor from the base value, akin to a multiplier. +- Absolute Values: Represented by `qibolab.sweeper.SweeperType.ABSOLUTE`, these values are used directly. +- Relative Values with Offset: Utilizing `qibolab.sweeper.SweeperType.OFFSET`, these values are relative to a designated base value, corresponding to the pulse or qubit value. +- Relative Values with Factor: Employing `qibolab.sweeper.SweeperType.FACTOR`, these values are scaled by a factor from the base value, akin to a multiplier. For offset and factor sweepers, the base value is determined by the respective pulse or qubit value. diff --git a/doc/source/tutorials/lab.rst b/doc/source/tutorials/lab.rst index 6bfd1dd23f..2dc4ccb4dc 100644 --- a/doc/source/tutorials/lab.rst +++ b/doc/source/tutorials/lab.rst @@ -25,7 +25,7 @@ using different Qibolab primitives. from qibolab import Platform from qibolab.components import IqChannel, AcquireChannel, IqConfig from qibolab.qubits import Qubit - from qibolab.pulses import Gaussian, Pulse, PulseType, Rectangular + from qibolab.pulses import Gaussian, Pulse, Rectangular from qibolab.native import RxyFactory, FixedSequenceFactory, SingleQubitNatives from qibolab.instruments.dummy import DummyInstrument @@ -54,7 +54,6 @@ using different Qibolab primitives. duration=40, amplitude=0.05, envelope=Gaussian(rel_sigma=0.2), - type=PulseType.DRIVE, ) ) @@ -65,7 +64,6 @@ using different Qibolab primitives. duration=1000, amplitude=0.005, envelope=Rectangular(), - type=PulseType.READOUT, ) ) @@ -107,7 +105,7 @@ hold the parameters of the two-qubit gates. from qibolab.components import IqChannel, AcquireChannel, DcChannel, IqConfig from qibolab.qubits import Qubit, QubitPair - from qibolab.pulses import Gaussian, PulseType, Pulse, PulseSequence, Rectangular + from qibolab.pulses import Gaussian, Pulse, PulseSequence, Rectangular from qibolab.native import ( RxyFactory, FixedSequenceFactory, @@ -138,7 +136,6 @@ hold the parameters of the two-qubit gates. duration=40, amplitude=0.05, envelope=Gaussian(rel_sigma=0.2), - type=PulseType.DRIVE, ) ] } @@ -152,7 +149,6 @@ hold the parameters of the two-qubit gates. duration=1000, amplitude=0.005, envelope=Rectangular(), - type=PulseType.READOUT, ) ] } @@ -168,7 +164,6 @@ hold the parameters of the two-qubit gates. duration=40, amplitude=0.05, envelope=Gaussian(rel_sigma=0.2), - type=PulseType.DRIVE, ) ] } @@ -182,7 +177,6 @@ hold the parameters of the two-qubit gates. duration=1000, amplitude=0.005, envelope=Rectangular(), - type=PulseType.READOUT, ) ] } @@ -201,7 +195,6 @@ hold the parameters of the two-qubit gates. duration=30, amplitude=0.005, envelope=Rectangular(), - type=PulseType.FLUX, ) ], } @@ -221,7 +214,7 @@ coupler but qibolab will take them into account when calling :class:`qibolab.nat from qibolab.components import DcChannel from qibolab.couplers import Coupler from qibolab.qubits import Qubit, QubitPair - from qibolab.pulses import PulseType, Pulse, PulseSequence + from qibolab.pulses import Pulse, PulseSequence from qibolab.native import ( FixedSequenceFactory, SingleQubitNatives, @@ -251,7 +244,6 @@ coupler but qibolab will take them into account when calling :class:`qibolab.nat amplitude=0.005, frequency=1e9, envelope=Rectangular(), - type=PulseType.FLUX, qubit=qubit1.name, ) ] diff --git a/doc/source/tutorials/pulses.rst b/doc/source/tutorials/pulses.rst index 2f039d7d32..ea40bf26ce 100644 --- a/doc/source/tutorials/pulses.rst +++ b/doc/source/tutorials/pulses.rst @@ -8,7 +8,7 @@ pulses (:class:`qibolab.pulses.Pulse`) through the .. testcode:: python - from qibolab.pulses import Pulse, PulseSequence, PulseType, Rectangular, Gaussian, Delay + from qibolab.pulses import Pulse, PulseSequence, Rectangular, Gaussian, Delay # Define PulseSequence sequence = PulseSequence() @@ -20,7 +20,6 @@ pulses (:class:`qibolab.pulses.Pulse`) through the duration=60, relative_phase=0, envelope=Gaussian(rel_sigma=0.2), - type=PulseType.DRIVE, ) ) sequence["channel_1"].append(Delay(duration=100, channel="1")) @@ -30,7 +29,6 @@ pulses (:class:`qibolab.pulses.Pulse`) through the duration=3000, relative_phase=0, envelope=Rectangular(), - type=PulseType.READOUT, ) ) From 0d5b61cc81b0ffe325320234830ff313a8b3b210 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 8 Aug 2024 17:59:32 +0200 Subject: [PATCH 0496/1006] chore: Add fixme explanations in broken drivers --- src/qibolab/instruments/icarusqfpga.py | 9 +++++++++ src/qibolab/instruments/rfsoc/driver.py | 5 +++++ 2 files changed, 14 insertions(+) diff --git a/src/qibolab/instruments/icarusqfpga.py b/src/qibolab/instruments/icarusqfpga.py index cb89b99790..148ba0d307 100644 --- a/src/qibolab/instruments/icarusqfpga.py +++ b/src/qibolab/instruments/icarusqfpga.py @@ -100,6 +100,13 @@ def play( i_env = pulse.envelope_waveform_i(dac_sr_ghz).data q_env = pulse.envelope_waveform_q(dac_sr_ghz).data + # FIXME: since pulse types have been deprecated, now channel types + # should be used instead. In the following, the code is relying on a + # non-standard channels naming convention, and thus fragile (or just + # broken) + # instead, the channel object should be retrieved from the platform + # configuration, and its type should be inspected + # Flux pulses # TODO: Add envelope support for flux pulses if "flux" in ch: @@ -352,6 +359,8 @@ def sweep( # FIXME: if this was required, now it's completely broken, since it # isn't possible to identify the pulse channel from the pulse itself # (nor it should be needed) + # it should be possible to retrieve the information looking for the + # channel type # if pulse.type is PulseType.READOUT: # res[pulse.serial] = res[pulse.qubit] diff --git a/src/qibolab/instruments/rfsoc/driver.py b/src/qibolab/instruments/rfsoc/driver.py index cc7adfa085..10fb07d016 100644 --- a/src/qibolab/instruments/rfsoc/driver.py +++ b/src/qibolab/instruments/rfsoc/driver.py @@ -434,6 +434,11 @@ def get_if_python_sweep( A boolean value true if the sweeper must be executed by python loop, false otherwise """ + # FIXME: since pulse types have been deprecated, now channel types should be + # used instead. In the following, the code is relying on a non-standard channels + # naming convention, and thus fragile (or just broken) + # instead, the channel object should be retrieved from the platform + # configuration, and its type should be inspected if any("flux" in ch for ch in sequence): return True for sweeper in sweepers: From b1687a104bbb3427f99332fd6edf0ad449d964ff Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 3 May 2024 16:12:56 +0200 Subject: [PATCH 0497/1006] test: Turn import time error in test time error --- tests/channel/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/channel/__init__.py diff --git a/tests/channel/__init__.py b/tests/channel/__init__.py new file mode 100644 index 0000000000..e69de29bb2 From 83f863a97314a4a5a464a48ef4ed414bc7f9a4eb Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 2 May 2024 19:51:18 +0200 Subject: [PATCH 0498/1006] feat: Drop couplers --- src/qibolab/couplers.py | 39 --------------------------------------- 1 file changed, 39 deletions(-) delete mode 100644 src/qibolab/couplers.py diff --git a/src/qibolab/couplers.py b/src/qibolab/couplers.py deleted file mode 100644 index b3a57c9985..0000000000 --- a/src/qibolab/couplers.py +++ /dev/null @@ -1,39 +0,0 @@ -from dataclasses import dataclass, field -from typing import Optional, Union - -from qibolab.components import DcChannel -from qibolab.native import SingleQubitNatives - -QubitId = Union[str, int] -"""Type for Coupler names.""" - - -@dataclass -class Coupler: - """Representation of a physical coupler. - - Coupler objects are instantiated by - :class: `qibolab.platforms.platform.Platform` - and are passed to instruments to play pulses on them. - """ - - name: QubitId - "Coupler number or name." - - sweetspot: float = 0 - "Coupler sweetspot to center it's flux dependence if needed." - native_gates: SingleQubitNatives = field(default_factory=SingleQubitNatives) - "For now this only contains the calibrated pulse to activate the coupler." - - flux: Optional[DcChannel] = None - "flux (:class:`qibolab.platforms.utils.Channel`): Channel used to send flux pulses to the qubit." - - # TODO: With topology or conectivity - # qubits: Optional[dict[QubitId, Qubit]] = field(default_factory=dict) - qubits: dict = field(default_factory=dict) - "Qubits the coupler acts on" - - @property - def channels(self): - if self.flux is not None: - yield self.flux From 2f780d177dfc598eebc6349e0865072d38c8ea83 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 2 May 2024 20:17:58 +0200 Subject: [PATCH 0499/1006] fix: Remove a few instances of Coupler and CouplerMap --- src/qibolab/instruments/rfsoc/driver.py | 9 ++++----- src/qibolab/qubits.py | 2 +- src/qibolab/serialize.py | 12 +++++------- 3 files changed, 10 insertions(+), 13 deletions(-) diff --git a/src/qibolab/instruments/rfsoc/driver.py b/src/qibolab/instruments/rfsoc/driver.py index 10fb07d016..397216e5fd 100644 --- a/src/qibolab/instruments/rfsoc/driver.py +++ b/src/qibolab/instruments/rfsoc/driver.py @@ -10,7 +10,6 @@ from qibosoq import client from qibolab import AcquisitionType, AveragingMode, ExecutionParameters -from qibolab.couplers import Coupler from qibolab.instruments.abstract import Controller from qibolab.pulses import PulseSequence from qibolab.qubits import Qubit @@ -201,7 +200,7 @@ def _execute_sweeps( def play( self, qubits: dict[int, Qubit], - couplers: dict[int, Coupler], + couplers: dict[int, Qubit], sequence: PulseSequence, execution_parameters: ExecutionParameters, ) -> dict[str, npt.NDArray]: @@ -299,7 +298,7 @@ def classify_shots( def play_sequence_in_sweep_recursion( self, qubits: dict[int, Qubit], - couplers: dict[int, Coupler], + couplers: dict[int, Qubit], sequence: PulseSequence, or_sequence: PulseSequence, execution_parameters: ExecutionParameters, @@ -326,7 +325,7 @@ def play_sequence_in_sweep_recursion( def recursive_python_sweep( self, qubits: dict[int, Qubit], - couplers: dict[int, Coupler], + couplers: dict[int, Qubit], sequence: PulseSequence, or_sequence: PulseSequence, *sweepers: rfsoc.Sweeper, @@ -535,7 +534,7 @@ def convert_sweep_results( def sweep( self, qubits: dict[int, Qubit], - couplers: dict[int, Coupler], + couplers: dict[int, Qubit], sequence: PulseSequence, execution_parameters: ExecutionParameters, *sweepers: Sweeper, diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index 91df2836d1..288249018c 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -155,7 +155,7 @@ class QubitPair: cz_fidelity: float = 0.0 """Gate fidelity from CZ interleaved RB.""" - coupler: Optional[Coupler] = None + coupler: Optional[Qubit] = None native_gates: TwoQubitNatives = field(default_factory=TwoQubitNatives) diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index cf1cd50d4a..83c52940f6 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -12,7 +12,6 @@ from pydantic import ConfigDict, TypeAdapter -from qibolab.couplers import Coupler from qibolab.execution_parameters import ConfigUpdate from qibolab.kernels import Kernels from qibolab.native import ( @@ -22,7 +21,6 @@ TwoQubitNatives, ) from qibolab.platform.platform import ( - CouplerMap, InstrumentMap, Platform, QubitMap, @@ -58,7 +56,7 @@ def load_qubit_name(name: str) -> QubitId: def load_qubits( runcard: dict, kernels: Kernels = None -) -> tuple[QubitMap, CouplerMap, QubitPairMap]: +) -> tuple[QubitMap, QubitMap, QubitPairMap]: """Load qubits and pairs from the runcard. Uses the native gate and characterization sections of the runcard to @@ -85,7 +83,7 @@ def load_qubits( two_qubit_characterization = runcard["characterization"].get("two_qubit", {}) if "coupler" in runcard["characterization"]: couplers = { - load_qubit_name(c): Coupler(load_qubit_name(c), **char) + load_qubit_name(c): Qubit(load_qubit_name(c), **char) for c, char in runcard["characterization"]["coupler"].items() } for c, pair in runcard["topology"].items(): @@ -158,7 +156,7 @@ def _load_two_qubit_natives(gates) -> TwoQubitNatives: def register_gates( - runcard: dict, qubits: QubitMap, pairs: QubitPairMap, couplers: CouplerMap = None + runcard: dict, qubits: QubitMap, pairs: QubitPairMap, couplers: QubitMap = None ) -> tuple[QubitMap, QubitPairMap]: """Register single qubit native gates to ``Qubit`` objects from the runcard. @@ -230,7 +228,7 @@ def _dump_natives(natives: Union[SingleQubitNatives, TwoQubitNatives]): def dump_native_gates( - qubits: QubitMap, pairs: QubitPairMap, couplers: CouplerMap = None + qubits: QubitMap, pairs: QubitPairMap, couplers: QubitMap = None ) -> dict: """Dump native gates section to dictionary following the runcard format, using qubit and pair objects.""" @@ -254,7 +252,7 @@ def dump_native_gates( def dump_characterization( - qubits: QubitMap, pairs: QubitPairMap = None, couplers: CouplerMap = None + qubits: QubitMap, pairs: QubitPairMap = None, couplers: QubitMap = None ) -> dict: """Dump qubit characterization section to dictionary following the runcard format, using qubit and pair objects.""" From efbb94222fa8c2effc2daa43eb891d5e33b49910 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 3 May 2024 15:58:38 +0200 Subject: [PATCH 0500/1006] fix: Replace last occurrences of Coupler --- src/qibolab/serialize.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index 83c52940f6..0eb923a45c 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -55,7 +55,7 @@ def load_qubit_name(name: str) -> QubitId: def load_qubits( - runcard: dict, kernels: Kernels = None + runcard: dict, kernels: Optional[Kernels] = None ) -> tuple[QubitMap, QubitMap, QubitPairMap]: """Load qubits and pairs from the runcard. @@ -156,8 +156,11 @@ def _load_two_qubit_natives(gates) -> TwoQubitNatives: def register_gates( - runcard: dict, qubits: QubitMap, pairs: QubitPairMap, couplers: QubitMap = None -) -> tuple[QubitMap, QubitPairMap]: + runcard: dict, + qubits: QubitMap, + pairs: QubitPairMap, + couplers: Optional[QubitMap] = None, +) -> tuple[QubitMap, QubitPairMap, QubitMap]: """Register single qubit native gates to ``Qubit`` objects from the runcard. @@ -228,7 +231,7 @@ def _dump_natives(natives: Union[SingleQubitNatives, TwoQubitNatives]): def dump_native_gates( - qubits: QubitMap, pairs: QubitPairMap, couplers: QubitMap = None + qubits: QubitMap, pairs: QubitPairMap, couplers: Optional[QubitMap] = None ) -> dict: """Dump native gates section to dictionary following the runcard format, using qubit and pair objects.""" @@ -252,7 +255,9 @@ def dump_native_gates( def dump_characterization( - qubits: QubitMap, pairs: QubitPairMap = None, couplers: QubitMap = None + qubits: QubitMap, + pairs: Optional[QubitPairMap] = None, + couplers: Optional[QubitMap] = None, ) -> dict: """Dump qubit characterization section to dictionary following the runcard format, using qubit and pair objects.""" From 6c059201013a71bc8282492d238b93eeac4393ad Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 3 May 2024 15:58:52 +0200 Subject: [PATCH 0501/1006] docs: Update couplers-related docs --- doc/source/main-documentation/qibolab.rst | 10 ++++++---- doc/source/tutorials/lab.rst | 4 +--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index c4d9849f83..eeb54509f3 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -180,18 +180,20 @@ These parameters are typically extracted from the runcard during platform initia Couplers -------- -The :class:`qibolab.couplers.Coupler` class serves as a comprehensive representation of a physical coupler qubit within the Qibolab framework. -It's a simplified :class:`qibolab.qubits.Qubit` to control couplers during 2q gate operation: +Instead of using a dedicated class, a :class:`qibolab.qubits.Qubit` object can also +serve as a comprehensive representation of a physical coupler qubit within the Qibolab +framework. +Used like this, it would control couplers during 2q gate operation: - :ref:`Channels `: Physical Connection -- :class:`Parameters `: Configurable Properties +- :class:`Parameters `: Configurable Properties - :ref:`Qubits `: Qubits the coupler acts on We have a single required Channel for flux coupler control: - flux -The Coupler class allows us to handle 2q interactions in coupler based architectures +These instances allow us to handle 2q interactions in coupler based architectures in a simple way. They are usually associated with :class:`qibolab.qubits.QubitPair` and usually extracted from the runcard during platform initialization. diff --git a/doc/source/tutorials/lab.rst b/doc/source/tutorials/lab.rst index 2dc4ccb4dc..88415d94b6 100644 --- a/doc/source/tutorials/lab.rst +++ b/doc/source/tutorials/lab.rst @@ -203,7 +203,6 @@ hold the parameters of the two-qubit gates. ) Some architectures may also have coupler qubits that mediate the interactions. -We can also interact with them defining the :class:`qibolab.couplers.Coupler` objects. Then we add them to their corresponding :class:`qibolab.qubits.QubitPair` objects according to the chip topology. We neglected characterization parameters associated to the coupler but qibolab will take them into account when calling :class:`qibolab.native.TwoQubitNatives`. @@ -212,7 +211,6 @@ coupler but qibolab will take them into account when calling :class:`qibolab.nat .. testcode:: python from qibolab.components import DcChannel - from qibolab.couplers import Coupler from qibolab.qubits import Qubit, QubitPair from qibolab.pulses import Pulse, PulseSequence from qibolab.native import ( @@ -224,7 +222,7 @@ coupler but qibolab will take them into account when calling :class:`qibolab.nat # create the qubit and coupler objects qubit0 = Qubit(0) qubit1 = Qubit(1) - coupler_01 = Coupler(0) + coupler_01 = Qubit(100) # assign channel(s) to the coupler coupler_01.flux = DcChannel(name="flux_coupler_01") From 75652dc9d466f266277856c38361eb901b5324f5 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 6 Aug 2024 11:58:52 +0000 Subject: [PATCH 0502/1006] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/qibolab/qubits.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index 288249018c..e7d4049581 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -4,7 +4,6 @@ import numpy as np from qibolab.components import AcquireChannel, DcChannel, IqChannel -from qibolab.couplers import Coupler from qibolab.native import SingleQubitNatives, TwoQubitNatives QubitId = Union[str, int] From 60498179cc5338c130159f14c3facaa4ac85bd03 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 6 Aug 2024 14:24:47 +0200 Subject: [PATCH 0503/1006] fix: Remove coupler class references leftover --- src/qibolab/instruments/emulator/pulse_simulator.py | 9 ++++----- src/qibolab/platform/platform.py | 5 ++--- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/qibolab/instruments/emulator/pulse_simulator.py b/src/qibolab/instruments/emulator/pulse_simulator.py index 28a04007b3..851177557a 100644 --- a/src/qibolab/instruments/emulator/pulse_simulator.py +++ b/src/qibolab/instruments/emulator/pulse_simulator.py @@ -9,7 +9,6 @@ import numpy.typing as npt from qibolab import AcquisitionType, AveragingMode, ExecutionParameters -from qibolab.couplers import Coupler from qibolab.instruments.abstract import Controller from qibolab.instruments.emulator.engines.qutip_engine import QutipSimulator from qibolab.instruments.emulator.models import general_no_coupler_model @@ -133,7 +132,7 @@ def run_pulse_simulation( def play( self, qubits: dict[QubitId, Qubit], - couplers: dict[QubitId, Coupler], + couplers: dict[QubitId, Qubit], sequence: PulseSequence, execution_parameters: ExecutionParameters, ) -> dict[str, npt.NDArray]: @@ -186,7 +185,7 @@ def play( def sweep( self, qubits: dict[QubitId, Qubit], - couplers: dict[QubitId, Coupler], + couplers: dict[QubitId, Qubit], sequence: PulseSequence, execution_parameters: ExecutionParameters, *sweeper: list[Sweeper], @@ -280,7 +279,7 @@ def sweep( def _sweep_recursion( self, qubits: dict[QubitId, Qubit], - couplers: dict[QubitId, Coupler], + couplers: dict[QubitId, Qubit], sequence: PulseSequence, execution_parameters: ExecutionParameters, *sweeper: Sweeper, @@ -339,7 +338,7 @@ def _sweep_recursion( def _sweep_play( self, qubits: dict[QubitId, Qubit], - couplers: dict[QubitId, Coupler], + couplers: dict[QubitId, Qubit], sequence: PulseSequence, execution_parameters: ExecutionParameters, ) -> dict[Union[str, int], list]: diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 8c81a005e7..a361abaca7 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -10,7 +10,6 @@ from qibo.config import log, raise_error from qibolab.components import Config -from qibolab.couplers import Coupler from qibolab.execution_parameters import ConfigUpdate, ExecutionParameters from qibolab.instruments.abstract import Controller, Instrument, InstrumentId from qibolab.pulses import Delay, PulseSequence @@ -21,7 +20,7 @@ InstrumentMap = dict[InstrumentId, Instrument] QubitMap = dict[QubitId, Qubit] -CouplerMap = dict[QubitId, Coupler] +CouplerMap = dict[QubitId, Qubit] QubitPairMap = dict[QubitPairId, QubitPair] IntegrationSetup = dict[str, tuple[np.ndarray, float]] @@ -149,7 +148,7 @@ class Platform: """ couplers: CouplerMap = field(default_factory=dict) - """Mapping coupler names to :class:`qibolab.couplers.Coupler` objects.""" + """Mapping coupler names to :class:`qibolab.qubits.Qubit` objects.""" is_connected: bool = False """Flag for whether we are connected to the physical instruments.""" From e19a1ba51086f182eaa80b01fe2d7f333d4db3bb Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 8 Aug 2024 15:00:00 +0200 Subject: [PATCH 0504/1006] fix: Remove sweetspot from json also for couplers --- src/qibolab/dummy/parameters.json | 16 ++++------------ src/qibolab/serialize.py | 3 +-- tests/dummy_qrc/zurich/parameters.json | 16 ++++------------ 3 files changed, 9 insertions(+), 26 deletions(-) diff --git a/src/qibolab/dummy/parameters.json b/src/qibolab/dummy/parameters.json index f36c80b7c2..33b7e3e9eb 100644 --- a/src/qibolab/dummy/parameters.json +++ b/src/qibolab/dummy/parameters.json @@ -697,18 +697,10 @@ } }, "coupler": { - "0": { - "sweetspot": 0.0 - }, - "1": { - "sweetspot": 0.0 - }, - "3": { - "sweetspot": 0.0 - }, - "4": { - "sweetspot": 0.0 - } + "0": {}, + "1": {}, + "3": {}, + "4": {} } } } diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index 0eb923a45c..eaeb8f73f0 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -277,8 +277,7 @@ def dump_characterization( if couplers: characterization["coupler"] = { - dump_qubit_name(c.name): {"sweetspot": c.sweetspot} - for c in couplers.values() + dump_qubit_name(c.name): {} for c in couplers.values() } return characterization diff --git a/tests/dummy_qrc/zurich/parameters.json b/tests/dummy_qrc/zurich/parameters.json index 4f26c3dee3..60ffa832c3 100644 --- a/tests/dummy_qrc/zurich/parameters.json +++ b/tests/dummy_qrc/zurich/parameters.json @@ -509,18 +509,10 @@ } }, "coupler": { - "0": { - "sweetspot": 0.0 - }, - "1": { - "sweetspot": 0.0 - }, - "3": { - "sweetspot": 0.0 - }, - "4": { - "sweetspot": 0.0 - } + "0": {}, + "1": {}, + "3": {}, + "4": {} } } } From 85a60a0cbc9612ea3927651081f318498f9a310d Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 8 Aug 2024 15:54:30 +0200 Subject: [PATCH 0505/1006] feat!: Drop dummy without couplers --- src/qibolab/dummy/platform.py | 38 +++++++---------------------------- src/qibolab/platform/load.py | 4 ++-- 2 files changed, 9 insertions(+), 33 deletions(-) diff --git a/src/qibolab/dummy/platform.py b/src/qibolab/dummy/platform.py index 0a978e2c7e..dcc433bf5a 100644 --- a/src/qibolab/dummy/platform.py +++ b/src/qibolab/dummy/platform.py @@ -22,27 +22,8 @@ FOLDER = pathlib.Path(__file__).parent -def remove_couplers(runcard): - """Remove coupler sections from runcard to create a dummy platform without - couplers.""" - runcard["topology"] = list(runcard["topology"].values()) - del runcard["couplers"] - del runcard["characterization"]["coupler"] - two_qubit = runcard["native_gates"]["two_qubit"] - for i, gates in two_qubit.items(): - for j, gate in gates.items(): - two_qubit[i][j] = { - ch: pulses for ch, pulses in gate.items() if "coupler" not in ch - } - return runcard - - -def create_dummy(with_couplers: bool = True): - """Create a dummy platform using the dummy instrument. - - Args: - with_couplers (bool): Selects whether the dummy platform will have coupler qubits. - """ +def create_dummy(): + """Create a dummy platform using the dummy instrument.""" instrument = DummyInstrument("dummy", "0.0.0.0") twpa_pump_name = "twpa_pump" @@ -51,9 +32,6 @@ def create_dummy(with_couplers: bool = True): runcard = load_runcard(FOLDER) kernels = Kernels.load(FOLDER) - if not with_couplers: - runcard = remove_couplers(runcard) - qubits, couplers, pairs = load_qubits(runcard, kernels) settings = load_settings(runcard) @@ -86,17 +64,15 @@ def create_dummy(with_couplers: bool = True): qubit.flux = DcChannel(flux_name) configs[flux_name] = DcConfig(**component_params[flux_name]) - if with_couplers: - for c, coupler in couplers.items(): - flux_name = f"coupler_{c}/flux" - coupler.flux = DcChannel(flux_name) - configs[flux_name] = DcConfig(**component_params[flux_name]) + for c, coupler in couplers.items(): + flux_name = f"coupler_{c}/flux" + coupler.flux = DcChannel(flux_name) + configs[flux_name] = DcConfig(**component_params[flux_name]) instruments = {instrument.name: instrument, twpa_pump.name: twpa_pump} instruments = load_instrument_settings(runcard, instruments) - name = "dummy_couplers" if with_couplers else "dummy" return Platform( - name, + "dummy", qubits, pairs, configs, diff --git a/src/qibolab/platform/load.py b/src/qibolab/platform/load.py index 8faf0ba388..d5b514fb85 100644 --- a/src/qibolab/platform/load.py +++ b/src/qibolab/platform/load.py @@ -56,10 +56,10 @@ def create_platform(name: str) -> Platform: Returns: The plaform class. """ - if name == "dummy" or name == "dummy_couplers": + if name == "dummy": from qibolab.dummy import create_dummy - return create_dummy(with_couplers=name == "dummy_couplers") + return create_dummy() return _load(_search(name, _platforms_paths())) From c1f3022105efbe36bebb61b1af348c505543e8d7 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 8 Aug 2024 15:55:05 +0200 Subject: [PATCH 0506/1006] test: Fix test errors for dummy couplers --- tests/conftest.py | 2 +- tests/test_dummy.py | 50 +++++++++++++++++++++------------------------ 2 files changed, 24 insertions(+), 28 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index e3d8db802e..5f47109355 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -20,7 +20,7 @@ ORIGINAL_PLATFORMS = os.environ.get(PLATFORMS, "") TESTING_PLATFORM_NAMES = [ # FIXME: uncomment platforms as they get upgraded to 0.2 - "dummy_couplers", + "dummy", # "qm", # "qm_octave", # "qblox", diff --git a/tests/test_dummy.py b/tests/test_dummy.py index 8ab815d636..33b61e8589 100644 --- a/tests/test_dummy.py +++ b/tests/test_dummy.py @@ -2,27 +2,28 @@ import pytest from qibolab import AcquisitionType, AveragingMode, ExecutionParameters, create_platform +from qibolab.platform.platform import Platform from qibolab.pulses import Delay, Gaussian, GaussianSquare, Pulse, PulseSequence from qibolab.sweeper import ChannelParameter, Parameter, Sweeper SWEPT_POINTS = 5 -PLATFORM_NAMES = ["dummy", "dummy_couplers"] -@pytest.mark.parametrize("name", PLATFORM_NAMES) -def test_dummy_initialization(name): - platform = create_platform(name) +@pytest.fixture +def platform() -> Platform: + return create_platform("dummy") + + +def test_dummy_initialization(platform: Platform): platform.connect() platform.disconnect() -@pytest.mark.parametrize("name", PLATFORM_NAMES) @pytest.mark.parametrize( "acquisition", [AcquisitionType.INTEGRATION, AcquisitionType.RAW] ) -def test_dummy_execute_pulse_sequence(name, acquisition): +def test_dummy_execute_pulse_sequence(platform: Platform, acquisition): nshots = 100 - platform = create_platform(name) probe_seq = platform.qubits[0].native_gates.MZ.create_sequence() probe_pulse = next(iter(probe_seq.values()))[0] sequence = PulseSequence() @@ -36,8 +37,7 @@ def test_dummy_execute_pulse_sequence(name, acquisition): assert result[probe_pulse.id][0].shape == (nshots, int(probe_seq.duration), 2) -def test_dummy_execute_coupler_pulse(): - platform = create_platform("dummy_couplers") +def test_dummy_execute_coupler_pulse(platform: Platform): sequence = PulseSequence() channel = platform.get_coupler(0).flux @@ -67,24 +67,22 @@ def test_dummy_execute_pulse_sequence_couplers(): _ = platform.execute([sequence], options) -@pytest.mark.parametrize("name", PLATFORM_NAMES) -def test_dummy_execute_pulse_sequence_fast_reset(name): - platform = create_platform(name) +def test_dummy_execute_pulse_sequence_fast_reset(platform: Platform): sequence = PulseSequence() sequence.extend(platform.qubits[0].native_gates.MZ.create_sequence()) options = ExecutionParameters(nshots=None, fast_reset=True) _ = platform.execute([sequence], options) -@pytest.mark.parametrize("name", PLATFORM_NAMES) @pytest.mark.parametrize( "acquisition", [AcquisitionType.INTEGRATION, AcquisitionType.DISCRIMINATION] ) @pytest.mark.parametrize("batch_size", [None, 3, 5]) -def test_dummy_execute_pulse_sequence_unrolling(name, acquisition, batch_size): +def test_dummy_execute_pulse_sequence_unrolling( + platform: Platform, acquisition, batch_size +): nshots = 100 nsequences = 10 - platform = create_platform(name) platform.instruments["dummy"].UNROLLING_BATCH_SIZE = batch_size sequences = [] sequence = PulseSequence() @@ -101,9 +99,7 @@ def test_dummy_execute_pulse_sequence_unrolling(name, acquisition, batch_size): assert r.samples.shape == (nshots,) -@pytest.mark.parametrize("name", PLATFORM_NAMES) -def test_dummy_single_sweep_raw(name): - platform = create_platform(name) +def test_dummy_single_sweep_raw(platform: Platform): sequence = PulseSequence() probe_seq = platform.qubits[0].native_gates.MZ.create_sequence() pulse = next(iter(probe_seq.values()))[0] @@ -189,7 +185,6 @@ def test_dummy_single_sweep_coupler( assert results_shape == expected_shape -@pytest.mark.parametrize("name", PLATFORM_NAMES) @pytest.mark.parametrize("fast_reset", [True, False]) @pytest.mark.parametrize("parameter", Parameter) @pytest.mark.parametrize("average", [AveragingMode.SINGLESHOT, AveragingMode.CYCLIC]) @@ -197,8 +192,9 @@ def test_dummy_single_sweep_coupler( "acquisition", [AcquisitionType.INTEGRATION, AcquisitionType.DISCRIMINATION] ) @pytest.mark.parametrize("nshots", [10, 20]) -def test_dummy_single_sweep(name, fast_reset, parameter, average, acquisition, nshots): - platform = create_platform(name) +def test_dummy_single_sweep( + platform: Platform, fast_reset, parameter, average, acquisition, nshots +): sequence = PulseSequence() probe_seq = platform.qubits[0].native_gates.MZ.create_sequence() pulse = next(iter(probe_seq.values()))[0] @@ -246,7 +242,6 @@ def test_dummy_single_sweep(name, fast_reset, parameter, average, acquisition, n assert results_shape == expected_shape -@pytest.mark.parametrize("name", PLATFORM_NAMES) @pytest.mark.parametrize("parameter1", Parameter) @pytest.mark.parametrize("parameter2", Parameter) @pytest.mark.parametrize("average", [AveragingMode.SINGLESHOT, AveragingMode.CYCLIC]) @@ -254,8 +249,9 @@ def test_dummy_single_sweep(name, fast_reset, parameter, average, acquisition, n "acquisition", [AcquisitionType.INTEGRATION, AcquisitionType.DISCRIMINATION] ) @pytest.mark.parametrize("nshots", [10, 20]) -def test_dummy_double_sweep(name, parameter1, parameter2, average, acquisition, nshots): - platform = create_platform(name) +def test_dummy_double_sweep( + platform: Platform, parameter1, parameter2, average, acquisition, nshots +): sequence = PulseSequence() pulse = Pulse(duration=40, amplitude=0.1, envelope=Gaussian(rel_sigma=5)) probe_seq = platform.qubits[0].native_gates.MZ.create_sequence() @@ -320,15 +316,15 @@ def test_dummy_double_sweep(name, parameter1, parameter2, average, acquisition, assert results_shape == expected_shape -@pytest.mark.parametrize("name", PLATFORM_NAMES) @pytest.mark.parametrize("parameter", Parameter) @pytest.mark.parametrize("average", [AveragingMode.SINGLESHOT, AveragingMode.CYCLIC]) @pytest.mark.parametrize( "acquisition", [AcquisitionType.INTEGRATION, AcquisitionType.DISCRIMINATION] ) @pytest.mark.parametrize("nshots", [10, 20]) -def test_dummy_single_sweep_multiplex(name, parameter, average, acquisition, nshots): - platform = create_platform(name) +def test_dummy_single_sweep_multiplex( + platform: Platform, parameter, average, acquisition, nshots +): sequence = PulseSequence() probe_pulses = {} for qubit in platform.qubits: From d11a5a64edeb6f042a072c4cc24fd8dd48c1226c Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 8 Aug 2024 16:05:16 +0200 Subject: [PATCH 0507/1006] feat: Directly couple qubit 3 to qubit 2 in dummy In practice, just drop the corresponding coupler and its pulses --- src/qibolab/dummy/parameters.json | 28 +--------------------------- 1 file changed, 1 insertion(+), 27 deletions(-) diff --git a/src/qibolab/dummy/parameters.json b/src/qibolab/dummy/parameters.json index 33b7e3e9eb..6bf4c2027a 100644 --- a/src/qibolab/dummy/parameters.json +++ b/src/qibolab/dummy/parameters.json @@ -5,7 +5,7 @@ "relaxation_time": 0 }, "qubits": [0, 1, 2, 3, 4], - "couplers": [0, 1, 3, 4], + "couplers": [0, 1, 4], "topology": { "0": [0, 2], "1": [1, 2], @@ -112,9 +112,6 @@ "coupler_1/flux": { "offset": 0.0 }, - "coupler_3/flux": { - "offset": 0.0 - }, "coupler_4/flux": { "offset": 0.0 }, @@ -454,17 +451,6 @@ { "phase": 0.0 } - ], - "coupler_3/flux": [ - { - "duration": 30.0, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - } - } ] }, "iSWAP": { @@ -488,17 +474,6 @@ { "phase": 0.0 } - ], - "coupler_3/flux": [ - { - "duration": 30.0, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - } - } ] }, "CNOT": { @@ -699,7 +674,6 @@ "coupler": { "0": {}, "1": {}, - "3": {}, "4": {} } } From 533b903fd68f5f56c7861f2b425ee411081b7ab9 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 8 Aug 2024 16:19:50 +0200 Subject: [PATCH 0508/1006] feat: Avoid runcards distinctions based on couplers, remove topology --- src/qibolab/serialize.py | 38 ++++++++++---------------------------- 1 file changed, 10 insertions(+), 28 deletions(-) diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index eaeb8f73f0..a63ddcd3f1 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -78,27 +78,17 @@ def load_qubits( for q in kernels: qubits[q].kernel = kernels[q] - couplers = {} + characterization = runcard["characterization"] + pairs = {} - two_qubit_characterization = runcard["characterization"].get("two_qubit", {}) - if "coupler" in runcard["characterization"]: - couplers = { - load_qubit_name(c): Qubit(load_qubit_name(c), **char) - for c, char in runcard["characterization"]["coupler"].items() - } - for c, pair in runcard["topology"].items(): - q0, q1 = pair - char = two_qubit_characterization.get(str(q0) + "-" + str(q1), {}) - pairs[(q0, q1)] = pairs[(q1, q0)] = QubitPair( - qubits[q0], qubits[q1], **char, coupler=couplers[load_qubit_name(c)] - ) - else: - for pair in runcard["topology"]: - q0, q1 = pair - char = two_qubit_characterization.get(str(q0) + "-" + str(q1), {}) - pairs[(q0, q1)] = pairs[(q1, q0)] = QubitPair( - qubits[q0], qubits[q1], **char, coupler=None - ) + for pair, char in characterization.get("two_qubit", {}).items(): + q0, q1 = (load_qubit_name(q) for q in pair.split("-")) + pairs[(q0, q1)] = pairs[(q1, q0)] = QubitPair(qubits[q0], qubits[q1], **char) + + couplers = { + load_qubit_name(c): Qubit(load_qubit_name(c), **char) + for c, char in runcard["characterization"].get("coupler", {}).items() + } qubits, pairs, couplers = register_gates(runcard, qubits, pairs, couplers) @@ -331,18 +321,10 @@ def dump_runcard( "nqubits": platform.nqubits, "settings": asdict(platform.settings), "qubits": list(platform.qubits), - "topology": [list(pair) for pair in platform.ordered_pairs], "instruments": dump_instruments(platform.instruments), "components": dump_component_configs(configs), } - if platform.couplers: - settings["couplers"] = list(platform.couplers) - settings["topology"] = { - platform.pairs[pair].coupler.name: list(pair) - for pair in platform.ordered_pairs - } - settings["native_gates"] = dump_native_gates( platform.qubits, platform.pairs, platform.couplers ) From 6d3a5f87238c675865ae72ee0a7c2f3fcbcca3f8 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 8 Aug 2024 16:37:07 +0200 Subject: [PATCH 0509/1006] fix: Use a unique source of truth for pairs And thus the natives, not the characterization --- src/qibolab/serialize.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index a63ddcd3f1..e34353a277 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -81,8 +81,10 @@ def load_qubits( characterization = runcard["characterization"] pairs = {} - for pair, char in characterization.get("two_qubit", {}).items(): + two_qubit = characterization.get("two_qubit", {}) + for pair in runcard.get("native_gates", {}).get("two_qubit", {}): q0, q1 = (load_qubit_name(q) for q in pair.split("-")) + char = two_qubit.get(pair, {}) pairs[(q0, q1)] = pairs[(q1, q0)] = QubitPair(qubits[q0], qubits[q1], **char) couplers = { From cb0dbb5eac3a18ce6ec3d9c3ecd57ac27dd0959d Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 8 Aug 2024 16:40:14 +0200 Subject: [PATCH 0510/1006] test: Remove last explicit mention of dummy couplers --- doc/source/main-documentation/qibolab.rst | 2 +- tests/test_dummy.py | 4 ++-- tests/test_platform.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index eeb54509f3..c5cbfcd35f 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -121,7 +121,7 @@ It is useful for testing parts of the code that do not necessarily require acces from qibolab import create_platform - platform = create_platform("dummy_couplers") + platform = create_platform("dummy") will create a dummy platform that also has coupler qubits. diff --git a/tests/test_dummy.py b/tests/test_dummy.py index 33b61e8589..32f8927a9b 100644 --- a/tests/test_dummy.py +++ b/tests/test_dummy.py @@ -53,7 +53,7 @@ def test_dummy_execute_coupler_pulse(platform: Platform): def test_dummy_execute_pulse_sequence_couplers(): - platform = create_platform("dummy_couplers") + platform = create_platform("dummy") sequence = PulseSequence() cz = platform.pairs[(1, 2)].native_gates.CZ.create_sequence() @@ -134,7 +134,7 @@ def test_dummy_single_sweep_raw(platform: Platform): def test_dummy_single_sweep_coupler( fast_reset, parameter, average, acquisition, nshots ): - platform = create_platform("dummy_couplers") + platform = create_platform("dummy") sequence = PulseSequence() probe_seq = platform.qubits[0].native_gates.MZ.create_sequence() probe_pulse = next(iter(probe_seq.values()))[0] diff --git a/tests/test_platform.py b/tests/test_platform.py index c83d6ccc22..0c66d9e6d7 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -152,7 +152,7 @@ def test_update_configs(platform): def test_dump_runcard(platform, tmp_path): dump_runcard(platform, tmp_path) final_runcard = load_runcard(tmp_path) - if platform.name == "dummy" or platform.name == "dummy_couplers": + if platform.name == "dummy": target_runcard = load_runcard(FOLDER) else: target_path = pathlib.Path(__file__).parent / "dummy_qrc" / f"{platform.name}" From b4f977152243a55004bef76255b7de8c988a645b Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 8 Aug 2024 17:01:24 +0200 Subject: [PATCH 0511/1006] feat: Extend platform properties to channels --- src/qibolab/platform/platform.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index a361abaca7..517ca662f5 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -189,6 +189,21 @@ def components(self) -> set[str]: """Names of all components available in the platform.""" return set(self.configs.keys()) + @property + def elements(self) -> dict: + """Qubits and couplers.""" + return self.qubits | self.couplers + + @property + def channels(self) -> list[str]: + """Channels in the platform.""" + return list(self.channels_map) + + @property + def channels_map(self) -> dict[str, QubitId]: + """Channel to element map.""" + return {ch.name: id for id, el in self.elements.items() for ch in el.channels} + def config(self, name: str) -> Config: """Returns configuration of given component.""" return self.configs[name] From af3da78a13d711c77d3a827f509e87a6f999b3f6 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 8 Aug 2024 17:02:23 +0200 Subject: [PATCH 0512/1006] fix: Use platform channels during compilation --- src/qibolab/compilers/compiler.py | 11 ++++------- src/qibolab/dummy/parameters.json | 14 ++++---------- src/qibolab/dummy/platform.py | 1 + 3 files changed, 9 insertions(+), 17 deletions(-) diff --git a/src/qibolab/compilers/compiler.py b/src/qibolab/compilers/compiler.py index b6342c9050..a9607a7bcb 100644 --- a/src/qibolab/compilers/compiler.py +++ b/src/qibolab/compilers/compiler.py @@ -1,7 +1,7 @@ from collections import defaultdict from dataclasses import dataclass, field -from qibo import gates +from qibo import Circuit, gates from qibo.config import raise_error from qibolab.compilers.default import ( @@ -14,6 +14,7 @@ rz_rule, z_rule, ) +from qibolab.platform import Platform from qibolab.pulses import Delay, PulseSequence @@ -122,7 +123,7 @@ def get_sequence(self, gate, platform): return gate_sequence # FIXME: pulse.qubit and pulse.channel do not exist anymore - def compile(self, circuit, platform): + def compile(self, circuit: Circuit, platform: Platform): """Transforms a circuit to pulse sequence. Args: @@ -135,11 +136,7 @@ def compile(self, circuit, platform): sequence (qibolab.pulses.PulseSequence): Pulse sequence that implements the circuit. measurement_map (dict): Map from each measurement gate to the sequence of readout pulse implementing it. """ - ch_to_qb = { - ch.name: qubit_id - for qubit_id, qubit in platform.qubits.items() - for ch in qubit.channels - } + ch_to_qb = platform.channels_map sequence = PulseSequence() # FIXME: This will not work with qubits that have string names diff --git a/src/qibolab/dummy/parameters.json b/src/qibolab/dummy/parameters.json index 6bf4c2027a..0743b3a66f 100644 --- a/src/qibolab/dummy/parameters.json +++ b/src/qibolab/dummy/parameters.json @@ -5,13 +5,7 @@ "relaxation_time": 0 }, "qubits": [0, 1, 2, 3, 4], - "couplers": [0, 1, 4], - "topology": { - "0": [0, 2], - "1": [1, 2], - "3": [2, 3], - "4": [2, 4] - }, + "couplers": ["c0", "c1", "c4"], "instruments": { "dummy": { "bounds": { @@ -672,9 +666,9 @@ } }, "coupler": { - "0": {}, - "1": {}, - "4": {} + "c0": {}, + "c1": {}, + "c4": {} } } } diff --git a/src/qibolab/dummy/platform.py b/src/qibolab/dummy/platform.py index dcc433bf5a..1296945650 100644 --- a/src/qibolab/dummy/platform.py +++ b/src/qibolab/dummy/platform.py @@ -65,6 +65,7 @@ def create_dummy(): configs[flux_name] = DcConfig(**component_params[flux_name]) for c, coupler in couplers.items(): + c = c[1:] flux_name = f"coupler_{c}/flux" coupler.flux = DcChannel(flux_name) configs[flux_name] = DcConfig(**component_params[flux_name]) From 0473e45af5758a41c506dd5f25e35c9b1deb1388 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 8 Aug 2024 17:14:01 +0200 Subject: [PATCH 0513/1006] fix: Avoid overlapping names for couplers --- src/qibolab/dummy/parameters.json | 1 - tests/dummy_qrc/zurich/parameters.json | 15 ++++----------- tests/dummy_qrc/zurich/platform.py | 9 +++++---- tests/test_dummy.py | 6 +++--- 4 files changed, 12 insertions(+), 19 deletions(-) diff --git a/src/qibolab/dummy/parameters.json b/src/qibolab/dummy/parameters.json index 0743b3a66f..201c26e2a6 100644 --- a/src/qibolab/dummy/parameters.json +++ b/src/qibolab/dummy/parameters.json @@ -5,7 +5,6 @@ "relaxation_time": 0 }, "qubits": [0, 1, 2, 3, 4], - "couplers": ["c0", "c1", "c4"], "instruments": { "dummy": { "bounds": { diff --git a/tests/dummy_qrc/zurich/parameters.json b/tests/dummy_qrc/zurich/parameters.json index 60ffa832c3..cfd840392b 100644 --- a/tests/dummy_qrc/zurich/parameters.json +++ b/tests/dummy_qrc/zurich/parameters.json @@ -1,13 +1,6 @@ { "nqubits": 5, "qubits": [0, 1, 2, 3, 4], - "couplers": [0, 1, 3, 4], - "topology": { - "0": [0, 2], - "1": [1, 2], - "3": [2, 3], - "4": [2, 4] - }, "settings": { "nshots": 4096, "relaxation_time": 300000 @@ -509,10 +502,10 @@ } }, "coupler": { - "0": {}, - "1": {}, - "3": {}, - "4": {} + "c0": {}, + "c1": {}, + "c3": {}, + "c4": {} } } } diff --git a/tests/dummy_qrc/zurich/platform.py b/tests/dummy_qrc/zurich/platform.py index 8c79638c94..21fc6ebd0a 100644 --- a/tests/dummy_qrc/zurich/platform.py +++ b/tests/dummy_qrc/zurich/platform.py @@ -23,7 +23,7 @@ FOLDER = pathlib.Path(__file__).parent QUBITS = [0, 1, 2, 3, 4] -COUPLERS = [0, 1, 3, 4] +COUPLERS = ["c0", "c1", "c3", "c4"] def create(): @@ -112,12 +112,13 @@ def create(): ZiChannel(qubits[q].flux, device="device_hdawg", path=f"SIGOUTS/{q}") ) - for i, c in enumerate(COUPLERS): + for i, c_ in enumerate(COUPLERS): + c = c_[1:] flux_name = f"coupler_{c}/flux" configs[flux_name] = ZiDcConfig(**component_params[flux_name]) - couplers[c].flux = DcChannel(name=flux_name) + couplers[c_].flux = DcChannel(name=flux_name) zi_channels.append( - ZiChannel(couplers[c].flux, device="device_hdawg2", path=f"SIGOUTS/{i}") + ZiChannel(couplers[c_].flux, device="device_hdawg2", path=f"SIGOUTS/{i}") ) controller = Zurich( diff --git a/tests/test_dummy.py b/tests/test_dummy.py index 32f8927a9b..03f532821b 100644 --- a/tests/test_dummy.py +++ b/tests/test_dummy.py @@ -40,7 +40,7 @@ def test_dummy_execute_pulse_sequence(platform: Platform, acquisition): def test_dummy_execute_coupler_pulse(platform: Platform): sequence = PulseSequence() - channel = platform.get_coupler(0).flux + channel = platform.get_coupler("c0").flux pulse = Pulse( duration=30, amplitude=0.05, @@ -144,14 +144,14 @@ def test_dummy_single_sweep_coupler( envelope=GaussianSquare(rel_sigma=0.2, width=0.75), ) sequence.extend(probe_seq) - sequence[platform.get_coupler(0).flux.name].append(coupler_pulse) + sequence[platform.get_coupler("c0").flux.name].append(coupler_pulse) if parameter is Parameter.amplitude: parameter_range = np.random.rand(SWEPT_POINTS) else: parameter_range = np.random.randint(SWEPT_POINTS, size=SWEPT_POINTS) if parameter in ChannelParameter: sweeper = Sweeper( - parameter, parameter_range, channels=[platform.couplers[0].flux.name] + parameter, parameter_range, channels=[platform.couplers["c0"].flux.name] ) else: sweeper = Sweeper(parameter, parameter_range, pulses=[coupler_pulse]) From 94f53796975efb23fbec589d3c5b43ea3d1e9dfe Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Sun, 11 Aug 2024 12:29:03 +0200 Subject: [PATCH 0514/1006] fix: Use folder name as platform name for dummy Co-authored-by: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> --- src/qibolab/dummy/platform.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibolab/dummy/platform.py b/src/qibolab/dummy/platform.py index 1296945650..69bc23f443 100644 --- a/src/qibolab/dummy/platform.py +++ b/src/qibolab/dummy/platform.py @@ -73,7 +73,7 @@ def create_dummy(): instruments = {instrument.name: instrument, twpa_pump.name: twpa_pump} instruments = load_instrument_settings(runcard, instruments) return Platform( - "dummy", + FOLDER.name, qubits, pairs, configs, From 7087414589edeeecc06eea6631f443ccc6b4f4d1 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 7 Aug 2024 21:32:54 +0200 Subject: [PATCH 0515/1006] feat!: Revert sequence to the internal layout --- src/qibolab/components/channels.py | 6 ++- src/qibolab/pulses/pulse.py | 2 +- src/qibolab/pulses/sequence.py | 69 +++++++++++++++--------------- 3 files changed, 39 insertions(+), 38 deletions(-) diff --git a/src/qibolab/components/channels.py b/src/qibolab/components/channels.py index 548efa7b55..cf66e38b8f 100644 --- a/src/qibolab/components/channels.py +++ b/src/qibolab/components/channels.py @@ -19,15 +19,18 @@ __all__ = [ "Channel", + "ChannelId", "DcChannel", "IqChannel", "AcquireChannel", ] +ChannelId = str +"""Unique identifier for a channel.""" + @dataclass(frozen=True) class Channel: - name: str """Name of the channel.""" @@ -63,7 +66,6 @@ class IqChannel(Channel): @dataclass(frozen=True) class AcquireChannel(Channel): - twpa_pump: Optional[str] """Name of the TWPA pump component. diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index 6a05d820b2..45d7b12f25 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -64,7 +64,7 @@ class Delay(_PulseLike): """A wait instruction during which we are not sending any pulses to the QPU.""" - duration: int + duration: float """Delay duration in ns.""" diff --git a/src/qibolab/pulses/sequence.py b/src/qibolab/pulses/sequence.py index 8e49f9650f..6d76b0c077 100644 --- a/src/qibolab/pulses/sequence.py +++ b/src/qibolab/pulses/sequence.py @@ -1,58 +1,57 @@ """PulseSequence class.""" -from collections import defaultdict -from typing import Optional +from collections.abc import Iterable + +from qibolab.components import ChannelId from .pulse import Delay, Pulse, PulseLike +__all__ = ["PulseSequence"] + +_Element = tuple[ChannelId, PulseLike] -class PulseSequence(defaultdict[str, list[PulseLike]]): + +class PulseSequence(list[_Element]): """Synchronized sequence of control instructions across multiple channels. The keys are names of channels, and the values are lists of pulses and delays """ - def __init__(self, seq_dict: Optional[dict[str, list[PulseLike]]] = None): - initial_content = seq_dict if seq_dict is not None else {} - super().__init__(list, **initial_content) - - @property - def probe_pulses(self): - """Return list of the readout pulses in this sequence.""" - pulses = [] - for name, seq in self.items(): - if "probe" not in name: - continue - - for pulse in seq: - # exclude delays - if isinstance(pulse, Pulse): - pulses.append(pulse) - return pulses - @property def duration(self) -> float: """Duration of the entire sequence.""" - return max((self.channel_duration(ch) for ch in self), default=0.0) + return max((self.channel_duration(ch) for ch in self.channels), default=0.0) + + @property + def channels(self) -> set[ChannelId]: + """Channels involved in the sequence.""" + return {ch for (ch, _) in self} + + def channel(self, channel: ChannelId) -> Iterable[PulseLike]: + """Isolate pulses on a given channel.""" + return (pulse for (ch, pulse) in self if ch == channel) - def channel_duration(self, channel: str) -> float: + def channel_duration(self, channel: ChannelId) -> float: """Duration of the given channel.""" - return sum(item.duration for item in self[channel]) + return sum(pulse.duration for pulse in self.channel(channel)) - def extend(self, other: "PulseSequence") -> None: + def concatenate(self, other: "PulseSequence") -> None: """Appends other in-place such that the result is self + necessary delays to synchronize channels + other.""" tol = 1e-12 - durations = {ch: self.channel_duration(ch) for ch in other} + durations = {ch: self.channel_duration(ch) for ch in other.channels} max_duration = max(durations.values(), default=0.0) for ch, duration in durations.items(): - if (delay := round(max_duration - duration, int(1 / tol))) > 0: - self[ch].append(Delay(duration=delay)) - self[ch].extend(other[ch]) - - def copy(self) -> "PulseSequence": - """Return shallow copy of self.""" - ps = PulseSequence() - ps.extend(self) - return ps + delay = round(max_duration - duration, int(1 / tol)) + if delay > 0: + self.append((ch, Delay(duration=delay))) + self.extend((ch, pulse) for pulse in other.channel(ch)) + + @property + def probe_pulses(self) -> list[Pulse]: + """Return list of the readout pulses in this sequence.""" + # pulse filter needed to exclude delays + return [ + pulse for (ch, pulse) in self if isinstance(pulse, Pulse) if "probe" in ch + ] From 2fb290e042411a1f8f0f414225c9e6d9bd65e312 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 8 Aug 2024 19:01:07 +0200 Subject: [PATCH 0516/1006] docs: Update documentation for the new sequence layout --- src/qibolab/pulses/sequence.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/qibolab/pulses/sequence.py b/src/qibolab/pulses/sequence.py index 6d76b0c077..a6016752da 100644 --- a/src/qibolab/pulses/sequence.py +++ b/src/qibolab/pulses/sequence.py @@ -14,8 +14,11 @@ class PulseSequence(list[_Element]): """Synchronized sequence of control instructions across multiple channels. - The keys are names of channels, and the values are lists of pulses - and delays + The sequence is a linear stream of instructions, which may be + executed in parallel over multiple channels. + + Each instruction is composed by the pulse-like object representing + the action, and the channel on which it should be performed. """ @property @@ -37,8 +40,13 @@ def channel_duration(self, channel: ChannelId) -> float: return sum(pulse.duration for pulse in self.channel(channel)) def concatenate(self, other: "PulseSequence") -> None: - """Appends other in-place such that the result is self + necessary - delays to synchronize channels + other.""" + """Juxtapose two sequences. + + Appends ``other`` in-place such that the result is: + - ``self`` + - necessary delays to synchronize channels + - ``other`` + """ tol = 1e-12 durations = {ch: self.channel_duration(ch) for ch in other.channels} max_duration = max(durations.values(), default=0.0) From 48fb043818ce6a316e775c90a531666eaae290f9 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 8 Aug 2024 19:04:51 +0200 Subject: [PATCH 0517/1006] fix: Use floats for inter-sequence delays Notice that the former implementation was bugged, since the second argument of the builtin `round()` is the number of digits, not the accuracy. So, it was attempting to retain 1e12 digits... --- src/qibolab/pulses/sequence.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/qibolab/pulses/sequence.py b/src/qibolab/pulses/sequence.py index a6016752da..da91cd79fa 100644 --- a/src/qibolab/pulses/sequence.py +++ b/src/qibolab/pulses/sequence.py @@ -47,11 +47,10 @@ def concatenate(self, other: "PulseSequence") -> None: - necessary delays to synchronize channels - ``other`` """ - tol = 1e-12 durations = {ch: self.channel_duration(ch) for ch in other.channels} max_duration = max(durations.values(), default=0.0) for ch, duration in durations.items(): - delay = round(max_duration - duration, int(1 / tol)) + delay = max_duration - duration if delay > 0: self.append((ch, Delay(duration=delay))) self.extend((ch, pulse) for pulse in other.channel(ch)) From ecd71117940fb5d9f2dc184b95a2a522eb83e860 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 8 Aug 2024 19:15:51 +0200 Subject: [PATCH 0518/1006] fix: Fix plots for new sequence layout --- src/qibolab/pulses/plot.py | 25 ++++++++++++------------- tests/pulses/test_plot.py | 18 ++++++++++-------- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/src/qibolab/pulses/plot.py b/src/qibolab/pulses/plot.py index 16e7189c85..7b3926a464 100644 --- a/src/qibolab/pulses/plot.py +++ b/src/qibolab/pulses/plot.py @@ -8,7 +8,7 @@ from .envelope import Waveform from .modulation import modulate -from .pulse import Delay, Pulse +from .pulse import Delay, Pulse, VirtualZ from .sequence import PulseSequence SAMPLING_RATE = 1 @@ -142,26 +142,25 @@ def sequence(ps: PulseSequence, freq: dict[str, float], filename=None): import matplotlib.pyplot as plt from matplotlib import gridspec - num_pulses = sum(len(pulses) for pulses in ps.values()) + num_pulses = len(ps) _ = plt.figure(figsize=(14, 2 * num_pulses), dpi=200) gs = gridspec.GridSpec(ncols=1, nrows=num_pulses) vertical_lines = [] - starts = defaultdict(int) - for ch, pulses in ps.items(): - for pulse in pulses: - if not isinstance(pulse, Delay): - vertical_lines.append(starts[ch]) - vertical_lines.append(starts[ch] + pulse.duration) - starts[ch] += pulse.duration + starts = defaultdict(float) + for ch, pulse in ps: + if not isinstance(pulse, Delay): + vertical_lines.append(starts[ch]) + vertical_lines.append(starts[ch] + pulse.duration) + starts[ch] += pulse.duration n = -1 - for ch, pulses in ps.items(): + for ch in ps.channels: n += 1 ax = plt.subplot(gs[n]) - ax.axis([0, ps.duration, -1, 1]) + ax.axis((0.0, ps.duration, -1.0, 1.0)) start = 0 - for pulse in pulses: - if isinstance(pulse, Delay): + for pulse in ps.channel(ch): + if isinstance(pulse, (Delay, VirtualZ)): start += pulse.duration continue diff --git a/tests/pulses/test_plot.py b/tests/pulses/test_plot.py index ddfd048ad4..225240d13c 100644 --- a/tests/pulses/test_plot.py +++ b/tests/pulses/test_plot.py @@ -64,14 +64,16 @@ def test_plot_functions(): relative_phase=0, ) ps = PulseSequence() - ps.update( - { - "q0/flux": [p0], - "q2/drive": [p1, p6], - "q200/drive": [p2], - "q200/flux": [p3, p4], - "q0/drive": [p5], - } + ps.extend( + [ + ("q0/flux", p0), + ("q2/drive", p1), + ("q200/drive", p2), + ("q200/flux", p3), + ("q200/flux", p4), + ("q0/drive", p5), + ("q2/drive", p6), + ] ) envelope = p0.envelopes(SAMPLING_RATE) wf = modulate(np.array(envelope), 0.0, rate=SAMPLING_RATE) From 760ff186cb81ab689bb48b95688b7fc341adc7ac Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 8 Aug 2024 19:39:01 +0200 Subject: [PATCH 0519/1006] fix: Subclass user list, to preserve type during copy, fix sequence tests --- src/qibolab/pulses/sequence.py | 3 +- tests/pulses/test_sequence.py | 248 +++++++++++++-------------------- 2 files changed, 96 insertions(+), 155 deletions(-) diff --git a/src/qibolab/pulses/sequence.py b/src/qibolab/pulses/sequence.py index da91cd79fa..d7b8c05647 100644 --- a/src/qibolab/pulses/sequence.py +++ b/src/qibolab/pulses/sequence.py @@ -1,5 +1,6 @@ """PulseSequence class.""" +from collections import UserList from collections.abc import Iterable from qibolab.components import ChannelId @@ -11,7 +12,7 @@ _Element = tuple[ChannelId, PulseLike] -class PulseSequence(list[_Element]): +class PulseSequence(UserList[_Element]): """Synchronized sequence of control instructions across multiple channels. The sequence is a linear stream of instructions, which may be diff --git a/tests/pulses/test_sequence.py b/tests/pulses/test_sequence.py index aea6a69160..fd11bb2a78 100644 --- a/tests/pulses/test_sequence.py +++ b/tests/pulses/test_sequence.py @@ -1,162 +1,110 @@ -from collections import defaultdict - from qibolab.pulses import Delay, Drag, Gaussian, Pulse, PulseSequence, Rectangular def test_init(): sequence = PulseSequence() - assert isinstance(sequence, defaultdict) assert len(sequence) == 0 -def test_init_with_dict(): - seq_dict = { - "some channel": [ - Pulse(duration=20, amplitude=0.1, envelope=Gaussian(rel_sigma=3)), - Pulse(duration=30, amplitude=0.5, envelope=Gaussian(rel_sigma=3)), - ], - "other channel": [ - Pulse(duration=40, amplitude=0.2, envelope=Gaussian(rel_sigma=3)) - ], - "chanel #5": [ - Pulse(duration=45, amplitude=1.0, envelope=Gaussian(rel_sigma=3)), - Pulse(duration=50, amplitude=0.7, envelope=Gaussian(rel_sigma=3)), - Pulse(duration=60, amplitude=-0.65, envelope=Gaussian(rel_sigma=3)), - ], - } - seq = PulseSequence(seq_dict) - - assert len(seq) == 3 - assert set(seq.keys()) == set(seq_dict.keys()) - assert len(seq["some channel"]) == 2 - assert len(seq["other channel"]) == 1 - assert len(seq["chanel #5"]) == 3 - - -def test_default_factory(): - sequence = PulseSequence() - some = sequence["some channel"] - assert isinstance(some, list) - assert len(some) == 0 - - -def test_ro_pulses(): - Pulse( - amplitude=0.3, - duration=60, - relative_phase=0, - envelope=Gaussian(rel_sigma=0.2), - ) - sequence = PulseSequence() - sequence["ch1"].append( - Pulse( - amplitude=0.3, - duration=60, - relative_phase=0, - envelope=Gaussian(rel_sigma=0.2), - ) +def test_init_with_iterable(): + seq = PulseSequence( + [ + ("some channel", p) + for p in [ + Pulse(duration=20, amplitude=0.1, envelope=Gaussian(rel_sigma=3)), + Pulse(duration=30, amplitude=0.5, envelope=Gaussian(rel_sigma=3)), + ] + ] + + [ + ( + "other channel", + Pulse(duration=40, amplitude=0.2, envelope=Gaussian(rel_sigma=3)), + ) + ] + + [ + ("chanel #5", p) + for p in [ + Pulse(duration=45, amplitude=1.0, envelope=Gaussian(rel_sigma=3)), + Pulse(duration=50, amplitude=0.7, envelope=Gaussian(rel_sigma=3)), + Pulse(duration=60, amplitude=-0.65, envelope=Gaussian(rel_sigma=3)), + ] + ] ) - sequence["ch2/flux"].append(Delay(duration=4)) - sequence["ch2/flux"].append( - Pulse( - amplitude=0.3, - duration=60, - relative_phase=0, - envelope=Drag(rel_sigma=0.2, beta=2), - ) - ) - sequence["ch3/probe"].append(Delay(duration=4)) - ro_pulse = Pulse( - amplitude=0.9, - duration=2000, - relative_phase=0, - envelope=Rectangular(), - ) - sequence["ch3/probe"].append(ro_pulse) - assert set(sequence.keys()) == {"ch1", "ch2/flux", "ch3/probe"} - assert sum(len(pulses) for pulses in sequence.values()) == 5 - assert len(sequence.probe_pulses) == 1 - assert sequence.probe_pulses[0] == ro_pulse + + assert len(seq) == 6 + assert set(seq.channels) == {"some channel", "other channel", "chanel #5"} + assert len(list(seq.channel("some channel"))) == 2 + assert len(list(seq.channel("other channel"))) == 1 + assert len(list(seq.channel("chanel #5"))) == 3 def test_durations(): sequence = PulseSequence() - sequence["ch1/probe"].append(Delay(duration=20)) - sequence["ch1/probe"].append( - Pulse( - duration=1000, - amplitude=0.9, - envelope=Rectangular(), - ) + sequence.append(("ch1/probe", Delay(duration=20))) + sequence.append( + ("ch1/probe", Pulse(duration=1000, amplitude=0.9, envelope=Rectangular())) ) - sequence["ch2/drive"].append( - Pulse( - duration=40, - amplitude=0.9, - envelope=Drag(rel_sigma=0.2, beta=1), + sequence.append( + ( + "ch2/drive", + Pulse(duration=40, amplitude=0.9, envelope=Drag(rel_sigma=0.2, beta=1)), ) ) assert sequence.channel_duration("ch1/probe") == 20 + 1000 assert sequence.channel_duration("ch2/drive") == 40 assert sequence.duration == 20 + 1000 - sequence["ch2/drive"].append( - Pulse( - duration=1200, - amplitude=0.9, - envelope=Rectangular(), - ) + sequence.append( + ("ch2/drive", Pulse(duration=1200, amplitude=0.9, envelope=Rectangular())) ) assert sequence.duration == 40 + 1200 def test_extend(): - sequence1 = PulseSequence() - sequence1["ch1"].append( - Pulse( - duration=40, - amplitude=0.9, - envelope=Drag(rel_sigma=0.2, beta=1), - ) + sequence1 = PulseSequence( + [ + ( + "ch1", + Pulse(duration=40, amplitude=0.9, envelope=Drag(rel_sigma=0.2, beta=1)), + ) + ] ) - - sequence2 = PulseSequence() - sequence2["ch2"].append( - Pulse( - duration=60, - amplitude=0.9, - envelope=Drag(rel_sigma=0.2, beta=1), - ) + sequence2 = PulseSequence( + [ + ( + "ch2", + Pulse(duration=60, amplitude=0.9, envelope=Drag(rel_sigma=0.2, beta=1)), + ) + ] ) - sequence1.extend(sequence2) - assert set(sequence1.keys()) == {"ch1", "ch2"} - assert len(sequence1["ch1"]) == 1 - assert len(sequence1["ch2"]) == 1 + sequence1.concatenate(sequence2) + assert set(sequence1.channels) == {"ch1", "ch2"} + assert len(list(sequence1.channel("ch1"))) == 1 + assert len(list(sequence1.channel("ch2"))) == 1 assert sequence1.duration == 60 - sequence3 = PulseSequence() - sequence3["ch2"].append( - Pulse( - duration=80, - amplitude=0.9, - envelope=Drag(rel_sigma=0.2, beta=1), - ) - ) - sequence3["ch3"].append( - Pulse( - duration=100, - amplitude=0.9, - envelope=Drag(rel_sigma=0.2, beta=1), - ) + sequence3 = PulseSequence( + [ + ( + "ch2", + Pulse(duration=80, amplitude=0.9, envelope=Drag(rel_sigma=0.2, beta=1)), + ), + ( + "ch3", + Pulse( + duration=100, amplitude=0.9, envelope=Drag(rel_sigma=0.2, beta=1) + ), + ), + ] ) - sequence1.extend(sequence3) - assert set(sequence1.keys()) == {"ch1", "ch2", "ch3"} - assert len(sequence1["ch1"]) == 1 - assert len(sequence1["ch2"]) == 2 - assert len(sequence1["ch3"]) == 2 - assert isinstance(sequence1["ch3"][0], Delay) + sequence1.concatenate(sequence3) + assert sequence1.channels == {"ch1", "ch2", "ch3"} + assert len(list(sequence1.channel("ch1"))) == 1 + assert len(list(sequence1.channel("ch2"))) == 2 + assert len(list(sequence1.channel("ch3"))) == 2 + assert isinstance(next(iter(sequence1.channel("ch3"))), Delay) assert sequence1.duration == 60 + 100 assert sequence1.channel_duration("ch1") == 40 assert sequence1.channel_duration("ch2") == 60 + 80 @@ -164,39 +112,31 @@ def test_extend(): def test_copy(): - sequence = PulseSequence() - sequence["ch1"].append( - Pulse( - duration=40, - amplitude=0.9, - envelope=Drag(rel_sigma=0.2, beta=1), - ) - ) - - sequence["ch2"].append( - Pulse( - duration=60, - amplitude=0.9, - envelope=Drag(rel_sigma=0.2, beta=1), - ) - ) - sequence["ch2"].append( - Pulse( - duration=80, - amplitude=0.9, - envelope=Drag(rel_sigma=0.2, beta=1), - ) + sequence = PulseSequence( + [ + ( + "ch1", + Pulse(duration=40, amplitude=0.9, envelope=Drag(rel_sigma=0.2, beta=1)), + ), + ( + "ch2", + Pulse(duration=60, amplitude=0.9, envelope=Drag(rel_sigma=0.2, beta=1)), + ), + ( + "ch2", + Pulse(duration=80, amplitude=0.9, envelope=Drag(rel_sigma=0.2, beta=1)), + ), + ] ) sequence_copy = sequence.copy() assert isinstance(sequence_copy, PulseSequence) assert sequence_copy == sequence - sequence_copy["ch3"].append( - Pulse( - duration=100, - amplitude=0.9, - envelope=Drag(rel_sigma=0.2, beta=1), + sequence_copy.append( + ( + "ch3", + Pulse(duration=100, amplitude=0.9, envelope=Drag(rel_sigma=0.2, beta=1)), ) ) assert "ch3" not in sequence From ed1b5f7095072f63edc972408566a0fe316b1e75 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 8 Aug 2024 20:25:51 +0200 Subject: [PATCH 0520/1006] fix: Update sequence layout in dummy --- src/qibolab/dummy/parameters.json | 243 ++++++++++++++++++------------ 1 file changed, 147 insertions(+), 96 deletions(-) diff --git a/src/qibolab/dummy/parameters.json b/src/qibolab/dummy/parameters.json index 201c26e2a6..faf037537a 100644 --- a/src/qibolab/dummy/parameters.json +++ b/src/qibolab/dummy/parameters.json @@ -116,26 +116,29 @@ "native_gates": { "single_qubit": { "0": { - "RX": { - "qubit_0/drive": [ + "RX": [ + [ + "qubit_0/drive", { "duration": 40.0, "amplitude": 0.1, "envelope": { "kind": "gaussian", "rel_sigma": 5.0 } } ] - }, - "RX12": { - "qubit_0/drive12": [ + ], + "RX12": [ + [ + "qubit_0/drive12", { "duration": 40.0, "amplitude": 0.005, "envelope": { "kind": "gaussian", "rel_sigma": 5.0 } } ] - }, - "MZ": { - "qubit_0/probe": [ + ], + "MZ": [ + [ + "qubit_0/probe", { "duration": 2000.0, "amplitude": 0.1, @@ -146,29 +149,32 @@ } } ] - } + ] }, "1": { - "RX": { - "qubit_1/drive": [ + "RX": [ + [ + "qubit_1/drive", { "duration": 40.0, "amplitude": 0.3, "envelope": { "kind": "drag", "rel_sigma": 5.0, "beta": 0.02 } } ] - }, - "RX12": { - "qubit_1/drive12": [ + ], + "RX12": [ + [ + "qubit_1/drive12", { "duration": 40.0, "amplitude": 0.0484, "envelope": { "kind": "drag", "rel_sigma": 5.0, "beta": 0.02 } } ] - }, - "MZ": { - "qubit_1/probe": [ + ], + "MZ": [ + [ + "qubit_1/probe", { "duration": 2000.0, "amplitude": 0.1, @@ -179,29 +185,32 @@ } } ] - } + ] }, "2": { - "RX": { - "qubit_2/drive": [ + "RX": [ + [ + "qubit_2/drive", { "duration": 40.0, "amplitude": 0.3, "envelope": { "kind": "drag", "rel_sigma": 5.0, "beta": 0.02 } } ] - }, - "RX12": { - "qubit_2/drive12": [ + ], + "RX12": [ + [ + "qubit_2/drive12", { "duration": 40.0, "amplitude": 0.005, "envelope": { "kind": "gaussian", "rel_sigma": 5.0 } } ] - }, - "MZ": { - "qubit_2/probe": [ + ], + "MZ": [ + [ + "qubit_2/probe", { "duration": 2000.0, "amplitude": 0.1, @@ -212,29 +221,32 @@ } } ] - } + ] }, "3": { - "RX": { - "qubit_3/drive": [ + "RX": [ + [ + "qubit_3/drive", { "duration": 40.0, "amplitude": 0.3, "envelope": { "kind": "drag", "rel_sigma": 5.0, "beta": 0.02 } } ] - }, - "RX12": { - "qubit_3/drive12": [ + ], + "RX12": [ + [ + "qubit_3/drive12", { "duration": 40.0, "amplitude": 0.0484, "envelope": { "kind": "drag", "rel_sigma": 5.0, "beta": 0.02 } } ] - }, - "MZ": { - "qubit_3/probe": [ + ], + "MZ": [ + [ + "qubit_3/probe", { "duration": 2000.0, "amplitude": 0.1, @@ -245,29 +257,32 @@ } } ] - } + ] }, "4": { - "RX": { - "qubit_4/drive": [ + "RX": [ + [ + "qubit_4/drive", { "duration": 40.0, "amplitude": 0.3, "envelope": { "kind": "drag", "rel_sigma": 5.0, "beta": 0.02 } } ] - }, - "RX12": { - "qubit_4/drive12": [ + ], + "RX12": [ + [ + "qubit_4/drive12", { "duration": 40.0, "amplitude": 0.0484, "envelope": { "kind": "drag", "rel_sigma": 5.0, "beta": 0.02 } } ] - }, - "MZ": { - "qubit_4/probe": [ + ], + "MZ": [ + [ + "qubit_4/probe", { "duration": 2000.0, "amplitude": 0.1, @@ -278,13 +293,14 @@ } } ] - } + ] } }, "two_qubit": { "0-2": { - "CZ": { - "qubit_2/flux": [ + "CZ": [ + [ + "qubit_2/flux", { "duration": 30.0, "amplitude": 0.05, @@ -295,17 +311,20 @@ } } ], - "qubit_0/drive": [ + [ + "qubit_0/drive", { "phase": 0.0 } ], - "qubit_2/drive": [ + [ + "qubit_2/drive", { "phase": 0.0 } ], - "coupler_0/flux": [ + [ + "coupler_0/flux", { "duration": 30.0, "amplitude": 0.05, @@ -316,9 +335,10 @@ } } ] - }, - "iSWAP": { - "qubit_2/flux": [ + ], + "iSWAP": [ + [ + "qubit_2/flux", { "duration": 30.0, "amplitude": 0.05, @@ -329,17 +349,20 @@ } } ], - "qubit_0/drive": [ + [ + "qubit_0/drive", { "phase": 0.0 } ], - "qubit_2/drive": [ + [ + "qubit_2/drive", { "phase": 0.0 } ], - "coupler_0/flux": [ + [ + "coupler_0/flux", { "duration": 30.0, "amplitude": 0.05, @@ -350,11 +373,12 @@ } } ] - } + ] }, "1-2": { - "CZ": { - "qubit_2/flux": [ + "CZ": [ + [ + "qubit_2/flux", { "duration": 30.0, "amplitude": 0.05, @@ -365,17 +389,20 @@ } } ], - "qubit_1/drive": [ + [ + "qubit_1/drive", { "phase": 0.0 } ], - "qubit_2/drive": [ + [ + "qubit_2/drive", { "phase": 0.0 } ], - "coupler_1/flux": [ + [ + "coupler_1/flux", { "duration": 30.0, "amplitude": 0.05, @@ -386,9 +413,10 @@ } } ] - }, - "iSWAP": { - "qubit_2/flux": [ + ], + "iSWAP": [ + [ + "qubit_2/flux", { "duration": 30.0, "amplitude": 0.05, @@ -399,17 +427,20 @@ } } ], - "qubit_1/drive": [ + [ + "qubit_1/drive", { "phase": 0.0 } ], - "qubit_2/drive": [ + [ + "qubit_2/drive", { "phase": 0.0 } ], - "coupler_1/flux": [ + [ + "coupler_1/flux", { "duration": 30.0, "amplitude": 0.05, @@ -420,11 +451,12 @@ } } ] - } + ] }, "2-3": { - "CZ": { - "qubit_2/flux": [ + "CZ": [ + [ + "qubit_2/flux", { "duration": 30.0, "amplitude": 0.05, @@ -435,19 +467,22 @@ } } ], - "qubit_2/drive": [ + [ + "qubit_2/drive", { "phase": 0.0 } ], - "qubit_3/drive": [ + [ + "qubit_3/drive", { "phase": 0.0 } ] - }, - "iSWAP": { - "qubit_2/flux": [ + ], + "iSWAP": [ + [ + "qubit_2/flux", { "duration": 30.0, "amplitude": 0.05, @@ -458,30 +493,34 @@ } } ], - "qubit_2/drive": [ + [ + "qubit_2/drive", { "phase": 0.0 } ], - "qubit_3/drive": [ + [ + "qubit_3/drive", { "phase": 0.0 } ] - }, - "CNOT": { - "qubit_2/drive": [ + ], + "CNOT": [ + [ + "qubit_2/drive", { "duration": 40.0, "amplitude": 0.3, "envelope": { "kind": "drag", "rel_sigma": 5.0, "beta": 0.02 } } ] - } + ] }, "2-4": { - "CZ": { - "qubit_2/flux": [ + "CZ": [ + [ + "qubit_2/flux", { "duration": 30.0, "amplitude": 0.05, @@ -492,12 +531,14 @@ } } ], - "qubit_4/drive": [ + [ + "qubit_4/drive", { "phase": 0.0 } ], - "coupler_4/flux": [ + [ + "coupler_4/flux", { "duration": 30.0, "amplitude": 0.05, @@ -508,9 +549,10 @@ } } ] - }, - "iSWAP": { - "qubit_2/flux": [ + ], + "iSWAP": [ + [ + "qubit_2/flux", { "duration": 30.0, "amplitude": 0.05, @@ -521,17 +563,20 @@ } } ], - "qubit_2/drive": [ + [ + "qubit_2/drive", { "phase": 0.0 } ], - "qubit_4/drive": [ + [ + "qubit_4/drive", { "phase": 0.0 } ], - "coupler_4/flux": [ + [ + "coupler_4/flux", { "duration": 30.0, "amplitude": 0.05, @@ -542,7 +587,7 @@ } } ] - } + ] } } }, @@ -665,9 +710,15 @@ } }, "coupler": { - "c0": {}, - "c1": {}, - "c4": {} + "0": { + "sweetspot": 0.0 + }, + "1": { + "sweetspot": 0.0 + }, + "4": { + "sweetspot": 0.0 + } } } } From c4112ef7da1f54cfeaa8d740f2f75405e2160b5a Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 8 Aug 2024 20:26:42 +0200 Subject: [PATCH 0521/1006] fix: Propagate sequence layout to deserialization and compiler --- src/qibolab/compilers/compiler.py | 11 ++++++----- src/qibolab/serialize.py | 5 +---- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/qibolab/compilers/compiler.py b/src/qibolab/compilers/compiler.py index a9607a7bcb..40995f8fcf 100644 --- a/src/qibolab/compilers/compiler.py +++ b/src/qibolab/compilers/compiler.py @@ -155,16 +155,17 @@ def compile(self, circuit: Circuit, platform: Platform): delay_sequence = PulseSequence() gate_sequence = self.get_sequence(gate, platform) - for ch in gate_sequence.keys(): + for ch in gate_sequence.channels: qubit = ch_to_qb[ch] - if (delay := qubit_clock[qubit] - channel_clock[ch]) > 0: - delay_sequence[ch].append(Delay(duration=delay)) + delay = qubit_clock[qubit] - channel_clock[ch] + if delay > 0: + delay_sequence.append((ch, Delay(duration=delay))) channel_clock[ch] += delay channel_duration = gate_sequence.channel_duration(ch) qubit_clock[qubit] += channel_duration channel_clock[ch] += channel_duration - sequence.extend(delay_sequence) - sequence.extend(gate_sequence) + sequence.concatenate(delay_sequence) + sequence.concatenate(gate_sequence) # register readout sequences to ``measurement_map`` so that we can # properly map acquisition results to measurement gates diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index e34353a277..da63e0f272 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -113,10 +113,7 @@ def _load_pulse(pulse_kwargs: dict): def _load_sequence(raw_sequence): - seq = PulseSequence() - for ch, pulses in raw_sequence.items(): - seq[ch] = [_load_pulse(raw_pulse) for raw_pulse in pulses] - return seq + return PulseSequence([(ch, _load_pulse(pulse)) for ch, pulse in raw_sequence]) def _load_single_qubit_natives(gates) -> SingleQubitNatives: From aacc7612545e22662ba01090a88ddc08fc654d1c Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 8 Aug 2024 20:28:26 +0200 Subject: [PATCH 0522/1006] fix: Propagate sequence layout to native --- src/qibolab/native.py | 24 ++++++++++++------------ src/qibolab/serialize_.py | 7 +++++-- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/qibolab/native.py b/src/qibolab/native.py index 6815200314..194c76ca11 100644 --- a/src/qibolab/native.py +++ b/src/qibolab/native.py @@ -3,7 +3,7 @@ import numpy as np -from .pulses import Drag, Gaussian, PulseSequence +from .pulses import Drag, Gaussian, Pulse, PulseSequence from .serialize_ import replace @@ -28,20 +28,20 @@ class RxyFactory: """ def __init__(self, sequence: PulseSequence): - if len(sequence) != 1: + if len(sequence.channels) != 1: raise ValueError( - f"Incompatible number of channels: {len(sequence)}. " + f"Incompatible number of channels: {len(sequence.channels)}. " f"{self.__class__} expects a sequence on exactly one channel." ) - pulses = next(iter(sequence.values())) - if len(pulses) != 1: + if len(sequence) != 1: raise ValueError( - f"Incompatible number of pulses: {len(pulses)}. " + f"Incompatible number of pulses: {len(sequence)}. " f"{self.__class__} expects a sequence with exactly one pulse." ) - pulse = pulses[0] + pulse = sequence[0][1] + assert isinstance(pulse, Pulse) expected_envelopes = (Gaussian, Drag) if not isinstance(pulse.envelope, expected_envelopes): raise ValueError( @@ -59,12 +59,12 @@ def create_sequence(self, theta: float = np.pi, phi: float = 0.0) -> PulseSequen phi: the angle that rotation axis forms with x axis. """ theta, phi = _normalize_angles(theta, phi) - seq = self._seq.copy() - channel = next(iter(seq.keys())) - pulse = seq[channel][0] + ch, pulse = self._seq[0] + assert isinstance(pulse, Pulse) new_amplitude = pulse.amplitude * theta / np.pi - seq[channel][0] = replace(pulse, amplitude=new_amplitude, relative_phase=phi) - return seq + return PulseSequence( + [(ch, replace(pulse, amplitude=new_amplitude, relative_phase=phi))] + ) class FixedSequenceFactory: diff --git a/src/qibolab/serialize_.py b/src/qibolab/serialize_.py index c7a4a3d12d..eb8cceb0ab 100644 --- a/src/qibolab/serialize_.py +++ b/src/qibolab/serialize_.py @@ -2,7 +2,7 @@ import base64 import io -from typing import Annotated, Union +from typing import Annotated, TypeVar, Union import numpy as np import numpy.typing as npt @@ -61,7 +61,10 @@ class Model(BaseModel): model_config = ConfigDict(arbitrary_types_allowed=True, frozen=True) -def replace(model: BaseModel, **update): +M = TypeVar("M", bound=BaseModel) + + +def replace(model: M, **update) -> M: """Replace interface for pydantic models. To have the same familiar syntax of :func:`dataclasses.replace`. From bbbd1ff4f75b9ce8249daaf34f4d60de0ceb98c9 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 9 Aug 2024 12:06:43 +0200 Subject: [PATCH 0523/1006] fix: Propagate sequence layout to default compiler --- src/qibolab/compilers/default.py | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/src/qibolab/compilers/default.py b/src/qibolab/compilers/default.py index bf25bed70d..eb0f56f241 100644 --- a/src/qibolab/compilers/default.py +++ b/src/qibolab/compilers/default.py @@ -6,37 +6,35 @@ import math import numpy as np +from qibo.gates import Gate from qibolab.pulses import PulseSequence, VirtualZ +from qibolab.qubits import Qubit, QubitPair -def identity_rule(gate, qubit): +def identity_rule(gate: Gate, qubit: Qubit) -> PulseSequence: """Identity gate skipped.""" return PulseSequence() -def z_rule(gate, qubit): +def z_rule(gate: Gate, qubit: Qubit) -> PulseSequence: """Z gate applied virtually.""" - seq = PulseSequence() - seq[qubit.drive.name].append(VirtualZ(phase=math.pi)) - return seq + return PulseSequence([(qubit.drive.name, VirtualZ(phase=math.pi))]) -def rz_rule(gate, qubit): +def rz_rule(gate: Gate, qubit: Qubit) -> PulseSequence: """RZ gate applied virtually.""" - seq = PulseSequence() - seq[qubit.drive.name].append(VirtualZ(phase=gate.parameters[0])) - return seq + return PulseSequence([(qubit.drive.name, VirtualZ(phase=gate.parameters[0]))]) -def gpi2_rule(gate, qubit): +def gpi2_rule(gate: Gate, qubit: Qubit) -> PulseSequence: """Rule for GPI2.""" return qubit.native_gates.RX.create_sequence( theta=np.pi / 2, phi=gate.parameters[0] ) -def gpi_rule(gate, qubit): +def gpi_rule(gate: Gate, qubit: Qubit) -> PulseSequence: """Rule for GPI.""" # the following definition has a global phase difference compare to # to the matrix representation. See @@ -45,7 +43,7 @@ def gpi_rule(gate, qubit): return qubit.native_gates.RX.create_sequence(theta=np.pi, phi=gate.parameters[0]) -def cz_rule(gate, pair): +def cz_rule(gate: Gate, pair: QubitPair) -> PulseSequence: """CZ applied as defined in the platform runcard. Applying the CZ gate may involve sending pulses on qubits that the @@ -54,14 +52,14 @@ def cz_rule(gate, pair): return pair.native_gates.CZ.create_sequence() -def cnot_rule(gate, pair): +def cnot_rule(gate: Gate, pair: QubitPair) -> PulseSequence: """CNOT applied as defined in the platform runcard.""" return pair.native_gates.CNOT.create_sequence() -def measurement_rule(gate, qubits): +def measurement_rule(gate: Gate, qubits: list[Qubit]) -> PulseSequence: """Measurement gate applied using the platform readout pulse.""" seq = PulseSequence() for qubit in qubits: - seq.extend(qubit.native_gates.MZ.create_sequence()) + seq.concatenate(qubit.native_gates.MZ.create_sequence()) return seq From 6166fd5641b3d8f98e3d943a80ad3cec75cd894d Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 9 Aug 2024 12:13:07 +0200 Subject: [PATCH 0524/1006] test: Fix compiler tests --- tests/test_compilers_default.py | 36 ++++++++++++++++----------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/tests/test_compilers_default.py b/tests/test_compilers_default.py index c1b726212a..b2315ad231 100644 --- a/tests/test_compilers_default.py +++ b/tests/test_compilers_default.py @@ -50,7 +50,7 @@ def test_compile(platform, gateargs): nqubits = platform.nqubits circuit = generate_circuit_with_gate(nqubits, *gateargs) sequence = compile_circuit(circuit, platform) - assert len(sequence) == nqubits * int(gateargs[0] != gates.I) + nqubits + assert len(sequence.channels) == nqubits * int(gateargs[0] != gates.I) + nqubits def test_compile_two_gates(platform): @@ -62,9 +62,9 @@ def test_compile_two_gates(platform): sequence = compile_circuit(circuit, platform) qubit = platform.qubits[0] - assert len(sequence) == 2 - assert len(sequence[qubit.drive.name]) == 2 - assert len(sequence[qubit.probe.name]) == 2 # includes delay + assert len(sequence.channels) == 2 + assert len(list(sequence.channel(qubit.drive.name))) == 2 + assert len(list(sequence.channel(qubit.probe.name))) == 2 # includes delay def test_measurement(platform): @@ -74,7 +74,7 @@ def test_measurement(platform): circuit.add(gates.M(*qubits)) sequence = compile_circuit(circuit, platform) - assert len(sequence) == 1 * nqubits + assert len(sequence.channels) == 1 * nqubits assert len(sequence.probe_pulses) == 1 * nqubits @@ -83,15 +83,15 @@ def test_rz_to_sequence(platform): circuit.add(gates.RZ(0, theta=0.2)) circuit.add(gates.Z(0)) sequence = compile_circuit(circuit, platform) - assert len(sequence) == 1 - assert len(next(iter(sequence.values()))) == 2 + assert len(sequence.channels) == 1 + assert len(sequence) == 2 def test_gpi_to_sequence(platform): circuit = Circuit(1) circuit.add(gates.GPI(0, phi=0.2)) sequence = compile_circuit(circuit, platform) - assert len(sequence) == 1 + assert len(sequence.channels) == 1 rx_seq = platform.qubits[0].native_gates.RX.create_sequence(phi=0.2) @@ -102,7 +102,7 @@ def test_gpi2_to_sequence(platform): circuit = Circuit(1) circuit.add(gates.GPI2(0, phi=0.2)) sequence = compile_circuit(circuit, platform) - assert len(sequence) == 1 + assert len(sequence.channels) == 1 rx90_seq = platform.qubits[0].native_gates.RX.create_sequence( theta=np.pi / 2, phi=0.2 @@ -140,15 +140,15 @@ def test_add_measurement_to_sequence(platform): sequence = compile_circuit(circuit, platform) qubit = platform.qubits[0] - assert len(sequence) == 2 - assert len(sequence[qubit.drive.name]) == 2 - assert len(sequence[qubit.probe.name]) == 2 # include delay + assert len(sequence.channels) == 2 + assert len(list(sequence.channel(qubit.drive.name))) == 2 + assert len(list(sequence.channel(qubit.probe.name))) == 2 # include delay s = PulseSequence() - s.extend(qubit.native_gates.RX.create_sequence(theta=np.pi / 2, phi=0.1)) - s.extend(qubit.native_gates.RX.create_sequence(theta=np.pi / 2, phi=0.2)) - s[qubit.probe.name].append(Delay(duration=s.duration)) - s.extend(qubit.native_gates.MZ.create_sequence()) + s.concatenate(qubit.native_gates.RX.create_sequence(theta=np.pi / 2, phi=0.1)) + s.concatenate(qubit.native_gates.RX.create_sequence(theta=np.pi / 2, phi=0.2)) + s.append((qubit.probe.name, Delay(duration=s.duration))) + s.concatenate(qubit.native_gates.MZ.create_sequence()) assert sequence == s @@ -162,7 +162,7 @@ def test_align_delay_measurement(platform, delay): target_sequence = PulseSequence() if delay > 0: - target_sequence[platform.qubits[0].probe.name].append(Delay(duration=delay)) - target_sequence.extend(platform.qubits[0].native_gates.MZ.create_sequence()) + target_sequence.append((platform.qubits[0].probe.name, Delay(duration=delay))) + target_sequence.concatenate(platform.qubits[0].native_gates.MZ.create_sequence()) assert sequence == target_sequence assert len(sequence.probe_pulses) == 1 From b55a92848144253f846b662f4bc236be365ca6ec Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 9 Aug 2024 12:24:28 +0200 Subject: [PATCH 0525/1006] test: Fix first sequence element access in dummy --- tests/test_dummy.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/test_dummy.py b/tests/test_dummy.py index 03f532821b..0795d15123 100644 --- a/tests/test_dummy.py +++ b/tests/test_dummy.py @@ -25,7 +25,7 @@ def test_dummy_initialization(platform: Platform): def test_dummy_execute_pulse_sequence(platform: Platform, acquisition): nshots = 100 probe_seq = platform.qubits[0].native_gates.MZ.create_sequence() - probe_pulse = next(iter(probe_seq.values()))[0] + probe_pulse = probe_seq[0] sequence = PulseSequence() sequence.extend(probe_seq) sequence.extend(platform.qubits[0].native_gates.RX12.create_sequence()) @@ -102,7 +102,7 @@ def test_dummy_execute_pulse_sequence_unrolling( def test_dummy_single_sweep_raw(platform: Platform): sequence = PulseSequence() probe_seq = platform.qubits[0].native_gates.MZ.create_sequence() - pulse = next(iter(probe_seq.values()))[0] + pulse = probe_seq[0] parameter_range = np.random.randint(SWEPT_POINTS, size=SWEPT_POINTS) sequence.extend(probe_seq) @@ -137,7 +137,7 @@ def test_dummy_single_sweep_coupler( platform = create_platform("dummy") sequence = PulseSequence() probe_seq = platform.qubits[0].native_gates.MZ.create_sequence() - probe_pulse = next(iter(probe_seq.values()))[0] + probe_pulse = probe_seq[0] coupler_pulse = Pulse.flux( duration=40, amplitude=0.5, @@ -197,7 +197,7 @@ def test_dummy_single_sweep( ): sequence = PulseSequence() probe_seq = platform.qubits[0].native_gates.MZ.create_sequence() - pulse = next(iter(probe_seq.values()))[0] + pulse = probe_seq[0] if parameter is Parameter.amplitude: parameter_range = np.random.rand(SWEPT_POINTS) else: @@ -255,7 +255,7 @@ def test_dummy_double_sweep( sequence = PulseSequence() pulse = Pulse(duration=40, amplitude=0.1, envelope=Gaussian(rel_sigma=5)) probe_seq = platform.qubits[0].native_gates.MZ.create_sequence() - probe_pulse = next(iter(probe_seq.values()))[0] + probe_pulse = probe_seq[0] sequence[platform.get_qubit(0).drive.name].append(pulse) sequence[platform.qubits[0].probe.name].append(Delay(duration=pulse.duration)) sequence.extend(probe_seq) @@ -329,7 +329,7 @@ def test_dummy_single_sweep_multiplex( probe_pulses = {} for qubit in platform.qubits: probe_seq = platform.qubits[qubit].native_gates.MZ.create_sequence() - probe_pulses[qubit] = next(iter(probe_seq.values()))[0] + probe_pulses[qubit] = probe_seq[0] sequence.extend(probe_seq) parameter_range = ( np.random.rand(SWEPT_POINTS) @@ -357,7 +357,7 @@ def test_dummy_single_sweep_multiplex( ) results = platform.execute([sequence], options, [[sweeper1]]) - for pulse in probe_pulses.values(): + for _, pulse in probe_pulses: assert pulse.id in results if not options.averaging_mode.average: results_shape = ( From 1af593c3a899325e4a2b821e95d09c3f72f37073 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 9 Aug 2024 12:29:39 +0200 Subject: [PATCH 0526/1006] test: Upgrade zurich platform runcard to new layout --- src/qibolab/dummy/parameters.json | 12 +- tests/dummy_qrc/zurich/parameters.json | 179 ++++++++++++++++--------- 2 files changed, 118 insertions(+), 73 deletions(-) diff --git a/src/qibolab/dummy/parameters.json b/src/qibolab/dummy/parameters.json index faf037537a..a5fb9c0ec8 100644 --- a/src/qibolab/dummy/parameters.json +++ b/src/qibolab/dummy/parameters.json @@ -710,15 +710,9 @@ } }, "coupler": { - "0": { - "sweetspot": 0.0 - }, - "1": { - "sweetspot": 0.0 - }, - "4": { - "sweetspot": 0.0 - } + "0": {}, + "1": {}, + "4": {} } } } diff --git a/tests/dummy_qrc/zurich/parameters.json b/tests/dummy_qrc/zurich/parameters.json index cfd840392b..67658d15e2 100644 --- a/tests/dummy_qrc/zurich/parameters.json +++ b/tests/dummy_qrc/zurich/parameters.json @@ -136,110 +136,146 @@ "native_gates": { "single_qubit": { "0": { - "RX": { - "qubit_0/drive": [ + "RX": [ + [ + "qubit_0/drive", { "duration": 40.0, "amplitude": 0.5, - "envelope": { "kind": "gaussian", "rel_sigma": 2.0 } + "envelope": { + "kind": "gaussian", + "rel_sigma": 2.0 + } } ] - }, - "MZ": { - "qubit_0/probe": [ + ], + "MZ": [ + [ + "qubit_0/probe", { "duration": 2000.0, "amplitude": 0.1, - "envelope": { "kind": "rectangular" } + "envelope": { + "kind": "rectangular" + } } ] - } + ] }, "1": { - "RX": { - "qubit_1/drive": [ + "RX": [ + [ + "qubit_1/drive", { "duration": 40.0, "amplitude": 0.5, - "envelope": { "kind": "gaussian", "rel_sigma": 2.0 } + "envelope": { + "kind": "gaussian", + "rel_sigma": 2.0 + } } ] - }, - "MZ": { - "qubit_1/probe": [ + ], + "MZ": [ + [ + "qubit_1/probe", { "duration": 2000.0, "amplitude": 0.2, - "envelope": { "kind": "rectangular" } + "envelope": { + "kind": "rectangular" + } } ] - } + ] }, "2": { - "RX": { - "qubit_2/drive": [ + "RX": [ + [ + "qubit_2/drive", { "duration": 40.0, "amplitude": 0.54, - "envelope": { "kind": "gaussian", "rel_sigma": 2.0 } + "envelope": { + "kind": "gaussian", + "rel_sigma": 2.0 + } } ] - }, - "MZ": { - "qubit_2/probe": [ + ], + "MZ": [ + [ + "qubit_2/probe", { "duration": 2000.0, "amplitude": 0.02, - "envelope": { "kind": "rectangular" } + "envelope": { + "kind": "rectangular" + } } ] - } + ] }, "3": { - "RX": { - "qubit_3/drive": [ + "RX": [ + [ + "qubit_3/drive", { "duration": 40.0, "amplitude": 0.454, - "envelope": { "kind": "gaussian", "rel_sigma": 2.0 } + "envelope": { + "kind": "gaussian", + "rel_sigma": 2.0 + } } ] - }, - "MZ": { - "qubit_3/probe": [ + ], + "MZ": [ + [ + "qubit_3/probe", { "duration": 2000.0, "amplitude": 0.25, - "envelope": { "kind": "rectangular" } + "envelope": { + "kind": "rectangular" + } } ] - } + ] }, "4": { - "RX": { - "qubit_4/drive": [ + "RX": [ + [ + "qubit_4/drive", { "duration": 40.0, "amplitude": 0.6, - "envelope": { "kind": "gaussian", "rel_sigma": 2.0 } + "envelope": { + "kind": "gaussian", + "rel_sigma": 2.0 + } } ] - }, - "MZ": { - "qubit_4/probe": [ + ], + "MZ": [ + [ + "qubit_4/probe", { "duration": 2000.0, "amplitude": 0.31, - "envelope": { "kind": "rectangular" } + "envelope": { + "kind": "rectangular" + } } ] - } + ] } }, "two_qubit": { "0-2": { - "CZ": { - "qubit_2/flux": [ + "CZ": [ + [ + "qubit_2/flux", { "duration": 80.0, "amplitude": 0.057, @@ -250,17 +286,20 @@ } } ], - "qubit_0/drive": [ + [ + "qubit_0/drive", { "phase": 0.0 } ], - "qubit_2/drive": [ + [ + "qubit_2/drive", { "phase": 0.0 } ], - "coupler_0/flux": [ + [ + "coupler_0/flux", { "duration": 30.0, "amplitude": 0.05, @@ -271,11 +310,12 @@ } } ] - } + ] }, "1-2": { - "CZ": { - "qubit_2/flux": [ + "CZ": [ + [ + "qubit_2/flux", { "duration": 30.0, "amplitude": 0.05, @@ -286,17 +326,20 @@ } } ], - "qubit_1/drive": [ + [ + "qubit_1/drive", { "phase": 0.0 } ], - "qubit_2/drive": [ + [ + "qubit_2/drive", { "phase": 0.0 } ], - "coupler_1/flux": [ + [ + "coupler_1/flux", { "duration": 30.0, "amplitude": 0.05, @@ -307,11 +350,12 @@ } } ] - } + ] }, "2-3": { - "CZ": { - "qubit_2/flux": [ + "CZ": [ + [ + "qubit_2/flux", { "duration": 30.0, "amplitude": 0.05, @@ -322,17 +366,20 @@ } } ], - "qubit_2/drive": [ + [ + "qubit_2/drive", { "phase": 0.0 } ], - "qubit_3/drive": [ + [ + "qubit_3/drive", { "phase": 0.0 } ], - "coupler_3/flux": [ + [ + "coupler_3/flux", { "duration": 30.0, "amplitude": 0.05, @@ -343,11 +390,12 @@ } } ] - } + ] }, "2-4": { - "CZ": { - "qubit_2/flux": [ + "CZ": [ + [ + "qubit_2/flux", { "duration": 30.0, "amplitude": 0.05, @@ -358,17 +406,20 @@ } } ], - "qubit_2/drive": [ + [ + "qubit_2/drive", { "phase": 0.0 } ], - "qubit_4/drive": [ + [ + "qubit_4/drive", { "phase": 0.0 } ], - "coupler_4/flux": [ + [ + "coupler_4/flux", { "duration": 30.0, "amplitude": 0.05, @@ -379,7 +430,7 @@ } } ] - } + ] } } }, From 6d6b6b751cf6e5334b229540fe2fe308238bb5d1 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 9 Aug 2024 12:33:14 +0200 Subject: [PATCH 0527/1006] fix: Propagate sequence layout to unrolling --- src/qibolab/unrolling.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/qibolab/unrolling.py b/src/qibolab/unrolling.py index bccf99fa60..c8eb888f80 100644 --- a/src/qibolab/unrolling.py +++ b/src/qibolab/unrolling.py @@ -5,7 +5,6 @@ from dataclasses import asdict, dataclass, field, fields from functools import total_ordering -from itertools import chain from .pulses import Pulse, PulseSequence from .pulses.envelope import Rectangular @@ -22,7 +21,7 @@ def _waveform(sequence: PulseSequence): if isinstance(pulse, Pulse) else 1 ) - for pulse in chain(*sequence.values()) + for _, pulse in sequence ) From d33e588a6d014eeceb3e40af00eb76651ab35a98 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 9 Aug 2024 13:10:53 +0200 Subject: [PATCH 0528/1006] fix: Avoid tracking qubit time separately from its channels The previous compiler was not allowing pulses to run in parallel, since the qubit clock was always advanced, thus, for a 10 channels qubit, playing a 50 ns pulse on each of them would have resulted in a qubit clock of 500 ns, since it was always incremented. --- src/qibolab/compilers/compiler.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/qibolab/compilers/compiler.py b/src/qibolab/compilers/compiler.py index 40995f8fcf..aafc6f30a1 100644 --- a/src/qibolab/compilers/compiler.py +++ b/src/qibolab/compilers/compiler.py @@ -16,6 +16,7 @@ ) from qibolab.platform import Platform from qibolab.pulses import Delay, PulseSequence +from qibolab.qubits import QubitId @dataclass @@ -143,26 +144,30 @@ def compile(self, circuit: Circuit, platform: Platform): # TODO: Implement a mapping between circuit qubit ids and platform ``Qubit``s measurement_map = {} - qubit_clock = defaultdict(int) channel_clock = defaultdict(int) + + def qubit_clock(qubit: QubitId): + return max(channel_clock[ch] for ch in platform.qubits[qubit].channels) + # process circuit gates for moment in circuit.queue.moments: for gate in set(filter(lambda x: x is not None, moment)): if isinstance(gate, gates.Align): for qubit in gate.qubits: - qubit_clock[qubit] += gate.delay + clock = qubit_clock(qubit) + for ch in platform.qubits[qubit].channels: + channel_clock[qubit] = clock + gate.delay continue delay_sequence = PulseSequence() gate_sequence = self.get_sequence(gate, platform) for ch in gate_sequence.channels: qubit = ch_to_qb[ch] - delay = qubit_clock[qubit] - channel_clock[ch] + delay = qubit_clock(qubit) - channel_clock[ch] if delay > 0: delay_sequence.append((ch, Delay(duration=delay))) channel_clock[ch] += delay channel_duration = gate_sequence.channel_duration(ch) - qubit_clock[qubit] += channel_duration channel_clock[ch] += channel_duration sequence.concatenate(delay_sequence) sequence.concatenate(gate_sequence) From ef0d40e99fb13e3262e92329c5f70f1ec958ea92 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 9 Aug 2024 14:29:29 +0200 Subject: [PATCH 0529/1006] fix: Compile the align Instead of treating it exceptionally --- src/qibolab/compilers/compiler.py | 13 ++++--------- src/qibolab/compilers/default.py | 15 +++++++++++++-- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/qibolab/compilers/compiler.py b/src/qibolab/compilers/compiler.py index aafc6f30a1..ea753a8556 100644 --- a/src/qibolab/compilers/compiler.py +++ b/src/qibolab/compilers/compiler.py @@ -5,6 +5,7 @@ from qibo.config import raise_error from qibolab.compilers.default import ( + align_rule, cnot_rule, cz_rule, gpi2_rule, @@ -55,6 +56,7 @@ def default(cls): gates.GPI2: gpi2_rule, gates.GPI: gpi_rule, gates.M: measurement_rule, + gates.Align: align_rule, } ) @@ -108,7 +110,7 @@ def get_sequence(self, gate, platform): """ # get local sequence for the current gate rule = self[type(gate)] - if isinstance(gate, gates.M): + if isinstance(gate, (gates.M, gates.Align)): qubits = [platform.get_qubit(q) for q in gate.qubits] gate_sequence = rule(gate, qubits) elif len(gate.qubits) == 1: @@ -147,18 +149,11 @@ def compile(self, circuit: Circuit, platform: Platform): channel_clock = defaultdict(int) def qubit_clock(qubit: QubitId): - return max(channel_clock[ch] for ch in platform.qubits[qubit].channels) + return max(channel_clock[ch.name] for ch in platform.qubits[qubit].channels) # process circuit gates for moment in circuit.queue.moments: for gate in set(filter(lambda x: x is not None, moment)): - if isinstance(gate, gates.Align): - for qubit in gate.qubits: - clock = qubit_clock(qubit) - for ch in platform.qubits[qubit].channels: - channel_clock[qubit] = clock + gate.delay - continue - delay_sequence = PulseSequence() gate_sequence = self.get_sequence(gate, platform) for ch in gate_sequence.channels: diff --git a/src/qibolab/compilers/default.py b/src/qibolab/compilers/default.py index eb0f56f241..00ff757f08 100644 --- a/src/qibolab/compilers/default.py +++ b/src/qibolab/compilers/default.py @@ -6,9 +6,9 @@ import math import numpy as np -from qibo.gates import Gate +from qibo.gates import Align, Gate -from qibolab.pulses import PulseSequence, VirtualZ +from qibolab.pulses import Delay, PulseSequence, VirtualZ from qibolab.qubits import Qubit, QubitPair @@ -63,3 +63,14 @@ def measurement_rule(gate: Gate, qubits: list[Qubit]) -> PulseSequence: for qubit in qubits: seq.concatenate(qubit.native_gates.MZ.create_sequence()) return seq + + +def align_rule(gate: Align, qubits: list[Qubit]) -> PulseSequence: + """Measurement gate applied using the platform readout pulse.""" + return PulseSequence( + [ + (ch.name, Delay(duration=gate.delay)) + for qubit in qubits + for ch in qubit.channels + ] + ) From a9a40faffcb590b437ec9b130dd29e41f7cb10f1 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 9 Aug 2024 14:44:11 +0200 Subject: [PATCH 0530/1006] test: Fix native tests --- tests/test_native.py | 127 +++++++++++++++++-------------------------- 1 file changed, 50 insertions(+), 77 deletions(-) diff --git a/tests/test_native.py b/tests/test_native.py index c275773df7..160b24d24f 100644 --- a/tests/test_native.py +++ b/tests/test_native.py @@ -16,20 +16,14 @@ def test_fixed_sequence_factory(): - seq = PulseSequence() - seq["channel_1"].append( - Pulse( - duration=40, - amplitude=0.3, - envelope=Gaussian(rel_sigma=3.0), - ) - ) - seq["channel_17"].append( - Pulse( - duration=125, - amplitude=1.0, - envelope=Rectangular(), - ) + seq = PulseSequence( + [ + ( + "channel_1", + Pulse(duration=40, amplitude=0.3, envelope=Gaussian(rel_sigma=3.0)), + ), + ("channel_17", Pulse(duration=125, amplitude=1.0, envelope=Rectangular())), + ] ) factory = FixedSequenceFactory(seq) @@ -38,15 +32,14 @@ def test_fixed_sequence_factory(): assert fseq1 == seq assert fseq2 == seq - fseq1["new channel"].append( - Pulse( - duration=30, - amplitude=0.04, - envelope=Drag(rel_sigma=4.0, beta=0.02), + fseq1.append( + ( + "new channel", + Pulse(duration=30, amplitude=0.04, envelope=Drag(rel_sigma=4.0, beta=0.02)), ) ) - assert "new channel" not in seq - assert "new channel" not in fseq2 + assert "new channel" not in seq.channels + assert "new channel" not in fseq2.channels @pytest.mark.parametrize( @@ -64,53 +57,40 @@ def test_fixed_sequence_factory(): ) def test_rxy_rotation_factory(args, amplitude, phase): seq = PulseSequence( - { - "channel_1": [ - Pulse( - duration=40, - amplitude=1.0, - envelope=Gaussian(rel_sigma=3.0), - ) - ] - } + [ + ( + "channel_1", + Pulse(duration=40, amplitude=1.0, envelope=Gaussian(rel_sigma=3.0)), + ) + ] ) factory = RxyFactory(seq) fseq1 = factory.create_sequence(**args) fseq2 = factory.create_sequence(**args) assert fseq1 == fseq2 - fseq2["new channel"].append( - Pulse( - duration=56, - amplitude=0.43, - envelope=Rectangular(), - ) + fseq2.append( + ("new channel", Pulse(duration=56, amplitude=0.43, envelope=Rectangular())) ) - assert "new channel" not in fseq1 + assert "new channel" not in fseq1.channels - pulse = fseq1["channel_1"][0] + pulse = next(iter(fseq1.channel("channel_1"))) assert pulse.amplitude == pytest.approx(amplitude) assert pulse.relative_phase == pytest.approx(phase) def test_rxy_factory_multiple_channels(): seq = PulseSequence( - { - "channel_1": [ - Pulse( - duration=40, - amplitude=0.7, - envelope=Gaussian(rel_sigma=5.0), - ) - ], - "channel_2": [ - Pulse( - duration=30, - amplitude=1.0, - envelope=Gaussian(rel_sigma=3.0), - ) - ], - } + [ + ( + "channel_1", + Pulse(duration=40, amplitude=0.7, envelope=Gaussian(rel_sigma=5.0)), + ), + ( + "channel_2", + Pulse(duration=30, amplitude=1.0, envelope=Gaussian(rel_sigma=3.0)), + ), + ] ) with pytest.raises(ValueError, match="Incompatible number of channels"): @@ -119,20 +99,16 @@ def test_rxy_factory_multiple_channels(): def test_rxy_factory_multiple_pulses(): seq = PulseSequence( - { - "channel_1": [ - Pulse( - duration=40, - amplitude=0.08, - envelope=Gaussian(rel_sigma=4.0), - ), - Pulse( - duration=80, - amplitude=0.76, - envelope=Gaussian(rel_sigma=4.0), - ), - ] - } + [ + ( + "channel_1", + Pulse(duration=40, amplitude=0.08, envelope=Gaussian(rel_sigma=4.0)), + ), + ( + "channel_1", + Pulse(duration=80, amplitude=0.76, envelope=Gaussian(rel_sigma=4.0)), + ), + ] ) with pytest.raises(ValueError, match="Incompatible number of pulses"): @@ -151,15 +127,12 @@ def test_rxy_factory_multiple_pulses(): ) def test_rxy_rotation_factory_envelopes(envelope): seq = PulseSequence( - { - "channel_1": [ - Pulse( - duration=100, - amplitude=1.0, - envelope=envelope, - ) - ] - } + [ + ( + "channel_1", + Pulse(duration=100, amplitude=1.0, envelope=envelope), + ) + ] ) if isinstance(envelope, (Gaussian, Drag)): From afa13a16108f5d07ac71f4f709f87a92afc712fb Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 9 Aug 2024 14:46:55 +0200 Subject: [PATCH 0531/1006] test: Fix execution fixture --- tests/conftest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/conftest.py b/tests/conftest.py index 5f47109355..8020b1bd11 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -153,7 +153,7 @@ def wrapped( if sequence is None: qd_seq = qubit.native_gates.RX.create_sequence() probe_seq = qubit.native_gates.MZ.create_sequence() - probe_pulse = next(iter(probe_seq.values()))[0] + probe_pulse = probe_seq[0][1] sequence = PulseSequence() sequence.extend(qd_seq) sequence.extend(probe_seq) From d8c91b5dacf3cc5ff0bca5dac439712a9ecb5a4d Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 9 Aug 2024 14:52:07 +0200 Subject: [PATCH 0532/1006] test: Fix unrolling test sequences --- tests/test_unrolling.py | 131 ++++++++++++++-------------------------- 1 file changed, 45 insertions(+), 86 deletions(-) diff --git a/tests/test_unrolling.py b/tests/test_unrolling.py index 54ec598cf2..6d16404d77 100644 --- a/tests/test_unrolling.py +++ b/tests/test_unrolling.py @@ -7,49 +7,33 @@ def test_bounds_update(): - ps = PulseSequence() - ps["ch3/drive"].append( - Pulse( - duration=40, - amplitude=0.9, - envelope=Drag(rel_sigma=0.2, beta=1), - ) - ) - ps["ch2/drive"].append( - Pulse( - duration=40, - amplitude=0.9, - envelope=Drag(rel_sigma=0.2, beta=1), - ) - ) - ps["ch1/drive"].append( - Pulse( - duration=40, - amplitude=0.9, - envelope=Drag(rel_sigma=0.2, beta=1), - ) - ) - - ps["ch3/probe"].append( - Pulse( - duration=1000, - amplitude=0.9, - envelope=Rectangular(), - ) - ) - ps["ch2/probe"].append( - Pulse( - duration=1000, - amplitude=0.9, - envelope=Rectangular(), - ) - ) - ps["ch1/probe"].append( - Pulse( - duration=1000, - amplitude=0.9, - envelope=Rectangular(), - ) + ps = PulseSequence( + [ + ( + "ch3/drive", + Pulse(duration=40, amplitude=0.9, envelope=Drag(rel_sigma=0.2, beta=1)), + ), + ( + "ch2/drive", + Pulse(duration=40, amplitude=0.9, envelope=Drag(rel_sigma=0.2, beta=1)), + ), + ( + "ch1/drive", + Pulse(duration=40, amplitude=0.9, envelope=Drag(rel_sigma=0.2, beta=1)), + ), + ( + "ch3/probe", + Pulse(duration=1000, amplitude=0.9, envelope=Rectangular()), + ), + ( + "ch2/probe", + Pulse(duration=1000, amplitude=0.9, envelope=Rectangular()), + ), + ( + "ch1/probe", + Pulse(duration=1000, amplitude=0.9, envelope=Rectangular()), + ), + ] ) bounds = Bounds.update(ps) @@ -87,49 +71,24 @@ def test_bounds_comparison(): ], ) def test_batch(bounds): - ps = PulseSequence() - ps["ch3/drive"].append( - Pulse( - duration=40, - amplitude=0.9, - envelope=Drag(rel_sigma=0.2, beta=1), - ) - ) - ps["ch2/drive"].append( - Pulse( - duration=40, - amplitude=0.9, - envelope=Drag(rel_sigma=0.2, beta=1), - ) - ) - ps["ch1/drive"].append( - Pulse( - duration=40, - amplitude=0.9, - envelope=Drag(rel_sigma=0.2, beta=1), - ) - ) - - ps["ch3/probe"].append( - Pulse( - duration=1000, - amplitude=0.9, - envelope=Rectangular(), - ) - ) - ps["ch2/probe"].append( - Pulse( - duration=1000, - amplitude=0.9, - envelope=Rectangular(), - ) - ) - ps["ch1/probe"].append( - Pulse( - duration=1000, - amplitude=0.9, - envelope=Rectangular(), - ) + ps = PulseSequence( + [ + ( + "ch3/drive", + Pulse(duration=40, amplitude=0.9, envelope=Drag(rel_sigma=0.2, beta=1)), + ), + ( + "ch2/drive", + Pulse(duration=40, amplitude=0.9, envelope=Drag(rel_sigma=0.2, beta=1)), + ), + ( + "ch1/drive", + Pulse(duration=40, amplitude=0.9, envelope=Drag(rel_sigma=0.2, beta=1)), + ), + ("ch3/probe", Pulse(duration=1000, amplitude=0.9, envelope=Rectangular())), + ("ch2/probe", Pulse(duration=1000, amplitude=0.9, envelope=Rectangular())), + ("ch1/probe", Pulse(duration=1000, amplitude=0.9, envelope=Rectangular())), + ] ) sequences = 10 * [ps] From 44b80230fe553f6da01f9adbd50ef31bdf858bb5 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 9 Aug 2024 15:07:31 +0200 Subject: [PATCH 0533/1006] fix: Fix dummy tests, including sequences serialization and usage in unrolling --- src/qibolab/platform/platform.py | 4 +-- src/qibolab/serialize.py | 6 ++-- tests/test_dummy.py | 50 ++++++++++++++++---------------- tests/test_platform.py | 6 ++-- 4 files changed, 33 insertions(+), 33 deletions(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 517ca662f5..11e035437e 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -60,9 +60,9 @@ def unroll_sequences( readout_map[pulse.id].append(pulse.id) length = sequence.duration + relaxation_time - for channel in sequence.keys(): + for channel in sequence.channels: delay = length - sequence.channel_duration(channel) - total_sequence[channel].append(Delay(duration=delay)) + total_sequence.append((channel, Delay(duration=delay))) return total_sequence, readout_map diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index da63e0f272..0d74d9926c 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -28,7 +28,7 @@ Settings, update_configs, ) -from qibolab.pulses import Pulse, PulseSequence +from qibolab.pulses import PulseSequence from qibolab.pulses.pulse import PulseLike from qibolab.qubits import Qubit, QubitId, QubitPair @@ -197,7 +197,7 @@ def dump_qubit_name(name: QubitId) -> str: return name -def _dump_pulse(pulse: Pulse): +def _dump_pulse(pulse: PulseLike): data = pulse.model_dump() if "channel" in data: del data["channel"] @@ -207,7 +207,7 @@ def _dump_pulse(pulse: Pulse): def _dump_sequence(sequence: PulseSequence): - return {ch: [_dump_pulse(p) for p in pulses] for ch, pulses in sequence.items()} + return [(ch, _dump_pulse(p)) for ch, p in sequence] def _dump_natives(natives: Union[SingleQubitNatives, TwoQubitNatives]): diff --git a/tests/test_dummy.py b/tests/test_dummy.py index 0795d15123..83d6fb22ba 100644 --- a/tests/test_dummy.py +++ b/tests/test_dummy.py @@ -25,10 +25,10 @@ def test_dummy_initialization(platform: Platform): def test_dummy_execute_pulse_sequence(platform: Platform, acquisition): nshots = 100 probe_seq = platform.qubits[0].native_gates.MZ.create_sequence() - probe_pulse = probe_seq[0] + probe_pulse = probe_seq[0][1] sequence = PulseSequence() - sequence.extend(probe_seq) - sequence.extend(platform.qubits[0].native_gates.RX12.create_sequence()) + sequence.concatenate(probe_seq) + sequence.concatenate(platform.qubits[0].native_gates.RX12.create_sequence()) options = ExecutionParameters(nshots=100, acquisition_type=acquisition) result = platform.execute([sequence], options) if acquisition is AcquisitionType.INTEGRATION: @@ -46,7 +46,7 @@ def test_dummy_execute_coupler_pulse(platform: Platform): amplitude=0.05, envelope=GaussianSquare(rel_sigma=5, width=0.75), ) - sequence[channel.name].append(pulse) + sequence.append((channel.name, pulse)) options = ExecutionParameters(nshots=None) _ = platform.execute([sequence], options) @@ -58,18 +58,18 @@ def test_dummy_execute_pulse_sequence_couplers(): cz = platform.pairs[(1, 2)].native_gates.CZ.create_sequence() - sequence.extend(cz) - sequence[platform.qubits[0].probe.name].append(Delay(duration=40)) - sequence[platform.qubits[2].probe.name].append(Delay(duration=40)) - sequence.extend(platform.qubits[0].native_gates.MZ.create_sequence()) - sequence.extend(platform.qubits[2].native_gates.MZ.create_sequence()) + sequence.concatenate(cz) + sequence.append((platform.qubits[0].probe.name, Delay(duration=40))) + sequence.append((platform.qubits[2].probe.name, Delay(duration=40))) + sequence.concatenate(platform.qubits[0].native_gates.MZ.create_sequence()) + sequence.concatenate(platform.qubits[2].native_gates.MZ.create_sequence()) options = ExecutionParameters(nshots=None) _ = platform.execute([sequence], options) def test_dummy_execute_pulse_sequence_fast_reset(platform: Platform): sequence = PulseSequence() - sequence.extend(platform.qubits[0].native_gates.MZ.create_sequence()) + sequence.concatenate(platform.qubits[0].native_gates.MZ.create_sequence()) options = ExecutionParameters(nshots=None, fast_reset=True) _ = platform.execute([sequence], options) @@ -86,7 +86,7 @@ def test_dummy_execute_pulse_sequence_unrolling( platform.instruments["dummy"].UNROLLING_BATCH_SIZE = batch_size sequences = [] sequence = PulseSequence() - sequence.extend(platform.qubits[0].native_gates.MZ.create_sequence()) + sequence.concatenate(platform.qubits[0].native_gates.MZ.create_sequence()) for _ in range(nsequences): sequences.append(sequence) options = ExecutionParameters(nshots=nshots, acquisition_type=acquisition) @@ -102,10 +102,10 @@ def test_dummy_execute_pulse_sequence_unrolling( def test_dummy_single_sweep_raw(platform: Platform): sequence = PulseSequence() probe_seq = platform.qubits[0].native_gates.MZ.create_sequence() - pulse = probe_seq[0] + pulse = probe_seq[0][1] parameter_range = np.random.randint(SWEPT_POINTS, size=SWEPT_POINTS) - sequence.extend(probe_seq) + sequence.concatenate(probe_seq) sweeper = Sweeper( Parameter.frequency, parameter_range, @@ -137,14 +137,14 @@ def test_dummy_single_sweep_coupler( platform = create_platform("dummy") sequence = PulseSequence() probe_seq = platform.qubits[0].native_gates.MZ.create_sequence() - probe_pulse = probe_seq[0] + probe_pulse = probe_seq[0][1] coupler_pulse = Pulse.flux( duration=40, amplitude=0.5, envelope=GaussianSquare(rel_sigma=0.2, width=0.75), ) - sequence.extend(probe_seq) - sequence[platform.get_coupler("c0").flux.name].append(coupler_pulse) + sequence.concatenate(probe_seq) + sequence.append((platform.get_coupler("c0").flux.name, coupler_pulse)) if parameter is Parameter.amplitude: parameter_range = np.random.rand(SWEPT_POINTS) else: @@ -197,12 +197,12 @@ def test_dummy_single_sweep( ): sequence = PulseSequence() probe_seq = platform.qubits[0].native_gates.MZ.create_sequence() - pulse = probe_seq[0] + pulse = probe_seq[0][1] if parameter is Parameter.amplitude: parameter_range = np.random.rand(SWEPT_POINTS) else: parameter_range = np.random.randint(SWEPT_POINTS, size=SWEPT_POINTS) - sequence.extend(probe_seq) + sequence.concatenate(probe_seq) if parameter in ChannelParameter: channel = ( platform.qubits[0].drive.name @@ -255,10 +255,10 @@ def test_dummy_double_sweep( sequence = PulseSequence() pulse = Pulse(duration=40, amplitude=0.1, envelope=Gaussian(rel_sigma=5)) probe_seq = platform.qubits[0].native_gates.MZ.create_sequence() - probe_pulse = probe_seq[0] - sequence[platform.get_qubit(0).drive.name].append(pulse) - sequence[platform.qubits[0].probe.name].append(Delay(duration=pulse.duration)) - sequence.extend(probe_seq) + probe_pulse = probe_seq[0][1] + sequence.append((platform.get_qubit(0).drive.name, pulse)) + sequence.append((platform.qubits[0].probe.name, Delay(duration=pulse.duration))) + sequence.concatenate(probe_seq) parameter_range_1 = ( np.random.rand(SWEPT_POINTS) if parameter1 is Parameter.amplitude @@ -329,8 +329,8 @@ def test_dummy_single_sweep_multiplex( probe_pulses = {} for qubit in platform.qubits: probe_seq = platform.qubits[qubit].native_gates.MZ.create_sequence() - probe_pulses[qubit] = probe_seq[0] - sequence.extend(probe_seq) + probe_pulses[qubit] = probe_seq[0][1] + sequence.concatenate(probe_seq) parameter_range = ( np.random.rand(SWEPT_POINTS) if parameter is Parameter.amplitude @@ -357,7 +357,7 @@ def test_dummy_single_sweep_multiplex( ) results = platform.execute([sequence], options, [[sweeper1]]) - for _, pulse in probe_pulses: + for pulse in probe_pulses.values(): assert pulse.id in results if not options.averaging_mode.average: results_shape = ( diff --git a/tests/test_platform.py b/tests/test_platform.py index 0c66d9e6d7..3b481228f4 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -42,9 +42,9 @@ def test_unroll_sequences(platform): qubit = next(iter(platform.qubits.values())) sequence = PulseSequence() - sequence.extend(qubit.native_gates.RX.create_sequence()) - sequence[qubit.probe.name].append(Delay(duration=sequence.duration)) - sequence.extend(qubit.native_gates.MZ.create_sequence()) + sequence.concatenate(qubit.native_gates.RX.create_sequence()) + sequence.append((qubit.probe.name, Delay(duration=sequence.duration))) + sequence.concatenate(qubit.native_gates.MZ.create_sequence()) total_sequence, readouts = unroll_sequences(10 * [sequence], relaxation_time=10000) assert len(total_sequence.probe_pulses) == 10 assert len(readouts) == 1 From bb2711224c1ca89201133c3c281ada8dc926afd9 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 9 Aug 2024 15:46:09 +0200 Subject: [PATCH 0534/1006] fix: Only increment channel clocks after computing all increments --- src/qibolab/compilers/compiler.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/qibolab/compilers/compiler.py b/src/qibolab/compilers/compiler.py index ea753a8556..c0e41463d7 100644 --- a/src/qibolab/compilers/compiler.py +++ b/src/qibolab/compilers/compiler.py @@ -156,14 +156,16 @@ def qubit_clock(qubit: QubitId): for gate in set(filter(lambda x: x is not None, moment)): delay_sequence = PulseSequence() gate_sequence = self.get_sequence(gate, platform) + increment = defaultdict(int) for ch in gate_sequence.channels: qubit = ch_to_qb[ch] delay = qubit_clock(qubit) - channel_clock[ch] if delay > 0: delay_sequence.append((ch, Delay(duration=delay))) channel_clock[ch] += delay - channel_duration = gate_sequence.channel_duration(ch) - channel_clock[ch] += channel_duration + increment[ch] = gate_sequence.channel_duration(ch) + for ch, inc in increment.items(): + channel_clock[ch] += inc sequence.concatenate(delay_sequence) sequence.concatenate(gate_sequence) From 323b4fe6523423b900506f42b2b796c4ddb74153 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 9 Aug 2024 16:16:15 +0200 Subject: [PATCH 0535/1006] docs: Fix doctests for internal sequence layout --- doc/source/main-documentation/qibolab.rst | 55 +-- doc/source/tutorials/calibration.rst | 22 +- doc/source/tutorials/lab.rst | 489 +++++++++++----------- doc/source/tutorials/pulses.rst | 39 +- 4 files changed, 304 insertions(+), 301 deletions(-) diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index c5cbfcd35f..01921032c8 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -68,10 +68,10 @@ Now we can create a simple sequence (again, without explicitly giving any qubit ps = PulseSequence() qubit = platform.qubits[0] - ps.extend(qubit.native_gates.RX.create_sequence()) - ps.extend(qubit.native_gates.RX.create_sequence(phi=np.pi / 2)) - ps[qubit.probe.name].append(Delay(duration=200)) - ps.extend(qubit.native_gates.MZ.create_sequence()) + ps.concatenate(qubit.native_gates.RX.create_sequence()) + ps.concatenate(qubit.native_gates.RX.create_sequence(phi=np.pi / 2)) + ps.append((qubit.probe.name, Delay(duration=200))) + ps.concatenate(qubit.native_gates.MZ.create_sequence()) Now we can execute the sequence on hardware: @@ -283,7 +283,6 @@ To organize pulses into sequences, Qibolab provides the :class:`qibolab.pulses.P from qibolab.pulses import PulseSequence - sequence = PulseSequence() pulse1 = Pulse( duration=40, # timing, in all qibolab, is expressed in ns @@ -309,10 +308,14 @@ To organize pulses into sequences, Qibolab provides the :class:`qibolab.pulses.P relative_phase=0, # phases are in radians envelope=Rectangular(), ) - sequence["channel"].append(pulse1) - sequence["channel"].append(pulse2) - sequence["channel"].append(pulse3) - sequence["channel"].append(pulse4) + sequence = PulseSequence( + [ + ("channel", pulse1), + ("channel", pulse2), + ("channel", pulse3), + ("channel", pulse4), + ], + ) print(f"Total duration: {sequence.duration}") @@ -339,16 +342,14 @@ Typical experiments may include both pre-defined pulses and new ones: from qibolab.pulses import Rectangular sequence = PulseSequence() - sequence.extend(platform.qubits[0].native_gates.RX.create_sequence()) - sequence["some_channel"].append( - Pulse( - duration=10, - amplitude=0.5, - relative_phase=0, - envelope=Rectangular(), + sequence.concatenate(platform.qubits[0].native_gates.RX.create_sequence()) + sequence.append( + ( + "some_channel", + Pulse(duration=10, amplitude=0.5, relative_phase=0, envelope=Rectangular()), ) ) - sequence.extend(platform.qubits[0].native_gates.MZ.create_sequence()) + sequence.concatenate(platform.qubits[0].native_gates.MZ.create_sequence()) results = platform.execute([sequence], options=options) @@ -420,13 +421,13 @@ A tipical resonator spectroscopy experiment could be defined with: from qibolab.sweeper import Parameter, Sweeper, SweeperType sequence = PulseSequence() - sequence.extend( + sequence.concatenate( platform.qubits[0].native_gates.MZ.create_sequence() ) # readout pulse for qubit 0 at 4 GHz - sequence.extend( + sequence.concatenate( platform.qubits[1].native_gates.MZ.create_sequence() ) # readout pulse for qubit 1 at 5 GHz - sequence.extend( + sequence.concatenate( platform.qubits[2].native_gates.MZ.create_sequence() ) # readout pulse for qubit 2 at 6 GHz @@ -465,9 +466,9 @@ For example: qubit = platform.qubits[0] sequence = PulseSequence() - sequence.extend(qubit.native_gates.RX.create_sequence()) - sequence[qubit.probe.name].append(Delay(duration=sequence.duration)) - sequence.extend(qubit.native_gates.MZ.create_sequence()) + sequence.concatenate(qubit.native_gates.RX.create_sequence()) + sequence.append((qubit.probe.name, Delay(duration=sequence.duration))) + sequence.concatenate(qubit.native_gates.MZ.create_sequence()) sweeper_freq = Sweeper( parameter=Parameter.frequency, @@ -478,7 +479,7 @@ For example: sweeper_amp = Sweeper( parameter=Parameter.amplitude, values=np.arange(0, 1.5, 0.1), - pulses=[sequence[qubit.drive.name][0]], + pulses=[next(iter(sequence.channel(qubit.drive.name)))], type=SweeperType.FACTOR, ) @@ -562,9 +563,9 @@ Let's now delve into a typical use case for result objects within the qibolab fr qubit = platform.qubits[0] sequence = PulseSequence() - sequence.extend(qubit.native_gates.RX.create_sequence()) - sequence[qubit.probe.name].append(Delay(duration=sequence.duration)) - sequence.extend(qubit.native_gates.MZ.create_sequence()) + sequence.concatenate(qubit.native_gates.RX.create_sequence()) + sequence.append((qubit.probe.name, Delay(duration=sequence.duration))) + sequence.concatenate(qubit.native_gates.MZ.create_sequence()) options = ExecutionParameters( nshots=1000, diff --git a/doc/source/tutorials/calibration.rst b/doc/source/tutorials/calibration.rst index b053b16758..001284b626 100644 --- a/doc/source/tutorials/calibration.rst +++ b/doc/source/tutorials/calibration.rst @@ -72,7 +72,7 @@ In few seconds, the experiment will be finished and we can proceed to plot it. import matplotlib.pyplot as plt - probe_pulse = next(iter(sequence.probe_pulses)) + probe_pulse = sequence.probe_pulses[0] amplitudes = magnitude(results[probe_pulse.id][0]) frequencies = np.arange(-2e8, +2e8, 1e6) + platform.config(qubit.probe.name).frequency @@ -126,12 +126,16 @@ complex pulse sequence. Therefore with start with that: qubit = platform.qubits[0] # create pulse sequence and add pulses - sequence = PulseSequence() - sequence[qubit.drive.name].append( - Pulse(duration=2000, amplitude=0.01, envelope=Gaussian(rel_sigma=5)) + sequence = PulseSequence( + [ + ( + qubit.drive.name, + Pulse(duration=2000, amplitude=0.01, envelope=Gaussian(rel_sigma=5)), + ), + (qubit.probe.name, Delay(duration=sequence.duration)), + ] ) - sequence[qubit.probe.name].append(Delay(duration=sequence.duration)) - sequence.extend(qubit.native_gates.MZ.create_sequence()) + sequence.concatenate(qubit.native_gates.MZ.create_sequence()) # allocate frequency sweeper sweeper = Sweeper( @@ -225,9 +229,9 @@ and its impact on qubit states in the IQ plane. # create pulse sequence 1 and add pulses one_sequence = PulseSequence() - one_sequence.extend(qubit.native_gates.RX.create_sequence()) - one_sequence[qubit.probe.name].append(Delay(duration=one_sequence.duration)) - one_sequence.extend(qubit.native_gates.MZ.create_sequence()) + one_sequence.concatenate(qubit.native_gates.RX.create_sequence()) + one_sequence.append((qubit.probe.name, Delay(duration=one_sequence.duration))) + one_sequence.concatenate(qubit.native_gates.MZ.create_sequence()) # create pulse sequence 2 and add pulses zero_sequence = qubit.native_gates.MZ.create_sequence() diff --git a/doc/source/tutorials/lab.rst b/doc/source/tutorials/lab.rst index 88415d94b6..bb7cc3652d 100644 --- a/doc/source/tutorials/lab.rst +++ b/doc/source/tutorials/lab.rst @@ -48,23 +48,23 @@ using different Qibolab primitives. configs[qubit.probe.name] = IqConfig(frequency=7e9) # create sequence that drives qubit from state 0 to 1 - drive_seq = PulseSequence() - drive_seq[qubit.drive.name].append( - Pulse( - duration=40, - amplitude=0.05, - envelope=Gaussian(rel_sigma=0.2), - ) + drive_seq = PulseSequence( + [ + ( + qubit.drive.name, + Pulse(duration=40, amplitude=0.05, envelope=Gaussian(rel_sigma=0.2)), + ) + ] ) # create sequence that can be used for measuring the qubit - probe_seq = PulseSequence() - probe_seq[qubit.probe.name].append( - Pulse( - duration=1000, - amplitude=0.005, - envelope=Rectangular(), - ) + probe_seq = PulseSequence( + [ + ( + qubit.probe.name, + Pulse(duration=1000, amplitude=0.005, envelope=Rectangular()), + ) + ] ) # assign native gates to the qubit @@ -130,56 +130,50 @@ hold the parameters of the two-qubit gates. qubit0.native_gates = SingleQubitNatives( RX=RxyFactory( PulseSequence( - { - qubit0.drive.name: [ + [ + ( + qubit0.drive.name, Pulse( duration=40, amplitude=0.05, envelope=Gaussian(rel_sigma=0.2), - ) - ] - } + ), + ) + ] ) ), MZ=FixedSequenceFactory( PulseSequence( - { - qubit0.probe.name: [ - Pulse( - duration=1000, - amplitude=0.005, - envelope=Rectangular(), - ) - ] - } + [ + ( + qubit0.probe.name, + Pulse(duration=1000, amplitude=0.005, envelope=Rectangular()), + ) + ] ) ), ) qubit1.native_gates = SingleQubitNatives( RX=RxyFactory( PulseSequence( - { - qubit1.drive.name: [ + [ + ( + qubit1.drive.name, Pulse( - duration=40, - amplitude=0.05, - envelope=Gaussian(rel_sigma=0.2), - ) - ] - } + duration=40, amplitude=0.05, envelope=Gaussian(rel_sigma=0.2) + ), + ) + ] ) ), MZ=FixedSequenceFactory( PulseSequence( - { - qubit1.probe.name: [ - Pulse( - duration=1000, - amplitude=0.005, - envelope=Rectangular(), - ) - ] - } + [ + ( + qubit1.probe.name, + Pulse(duration=1000, amplitude=0.005, envelope=Rectangular()), + ) + ] ) ), ) @@ -189,15 +183,12 @@ hold the parameters of the two-qubit gates. pair.native_gates = TwoQubitNatives( CZ=FixedSequenceFactory( PulseSequence( - { - qubit0.flux.name: [ - Pulse( - duration=30, - amplitude=0.005, - envelope=Rectangular(), - ) - ], - } + [ + ( + qubit0.flux.name, + Pulse(duration=30, amplitude=0.005, envelope=Rectangular()), + ), + ] ) ) ) @@ -235,17 +226,18 @@ coupler but qibolab will take them into account when calling :class:`qibolab.nat pair.native_gates = TwoQubitNatives( CZ=FixedSequenceFactory( PulseSequence( - { - coupler_01.flux.name: [ + [ + ( + coupler_01.flux.name, Pulse( duration=30, amplitude=0.005, frequency=1e9, envelope=Rectangular(), qubit=qubit1.name, - ) - ] - }, + ), + ) + ], ) ) ) @@ -294,142 +286,145 @@ a two-qubit system: .. code-block:: json { - "nqubits": 2, - "qubits": [ - 0, - 1 - ], - "settings": { - "nshots": 1024, - "sampling_rate": 1000000000, - "relaxation_time": 50000 + "nqubits": 2, + "qubits": [0, 1], + "settings": { + "nshots": 1024, + "sampling_rate": 1000000000, + "relaxation_time": 50000 + }, + "topology": [[0, 1]], + "components": { + "drive_0": { + "frequency": 4855663000 }, - "topology": [ - [ - 0, - 1 + "drive_1": { + "frequency": 5800563000 + }, + "flux_0": { + "bias": 0.0 + }, + "probe_0": { + "frequency": 7453265000 + }, + "probe_1": { + "frequency": 7655107000 + }, + "acquire_0": { + "delay": 0, + "smearing": 0 + }, + "acquire_1": { + "delay": 0, + "smearing": 0 + } + }, + "native_gates": { + "single_qubit": { + "0": { + "RX": [ + [ + "drive_0", + { + "duration": 40, + "amplitude": 0.0484, + "envelope": { + "kind": "drag", + "rel_sigma": 0.2, + "beta": -0.02 + } + } + ] + ], + "MZ": [ + [ + "probe_0", + { + "duration": 620, + "amplitude": 0.003575, + "envelope": { + "kind": "rectangular" + } + } + ] ] - ], - "components": { - "drive_0": { - "frequency": 4855663000 - }, - "drive_1": { - "frequency": 5800563000 - }, - "flux_0": { - "bias": 0.0 - }, - "probe_0": { - "frequency": 7453265000 - }, - "probe_1": { - "frequency": 7655107000 - }, - "acquire_0": { - "delay": 0, - "smearing": 0 - }, - "acquire_1": { - "delay": 0, - "smearing": 0 - } - } - "native_gates": { - "single_qubit": { - "0": { - "RX": { - "drive_0": [ - { - "duration": 40, - "amplitude": 0.0484, - "envelope": { - "kind": "drag", - "rel_sigma": 0.2, - "beta": -0.02, - }, - "type": "qd", - } - ] - }, - "MZ": { - "probe_0": [ - { - "duration": 620, - "amplitude": 0.003575, - "envelope": {"kind": "rectangular"}, - "type": "ro", - } - ] - } - }, - "1": { - "RX": { - "drive_1" : [ - { - "duration": 40, - "amplitude": 0.05682, - "envelope": { - "kind": "drag", - "rel_sigma": 0.2, - "beta": -0.04, - }, - "type": "qd", - } - ] - }, - "MZ": { - "probe_1": [ - { - "duration": 960, - "amplitude": 0.00325, - "envelope": {"kind": "rectangular"}, - "type": "ro", - } - ] - } + }, + "1": { + "RX": [ + [ + "drive_1", + { + "duration": 40, + "amplitude": 0.05682, + "envelope": { + "kind": "drag", + "rel_sigma": 0.2, + "beta": -0.04 + } } - }, - "two_qubit": { - "0-1": { - "CZ": [ - { - "duration": 30, - "amplitude": 0.055, - "envelope": {"kind": "rectangular"}, - "qubit": 1, - "type": "qf" - }, - { - "type": "virtual_z", - "phase": -1.5707963267948966, - "qubit": 0 - }, - { - "type": "virtual_z", - "phase": -1.5707963267948966, - "qubit": 1 - } - ] + ] + ], + "MZ": [ + [ + "probe_1", + { + "duration": 960, + "amplitude": 0.00325, + "envelope": { + "kind": "rectangular" + } } - } + ] + ] + } }, - "characterization": { - "single_qubit": { - "0": { - "T1": 0.0, - "T2": 0.0, - "threshold": 0.00028502261712637096, - "iq_angle": 1.283105298787488 - }, - "1": { - "T1": 0.0, - "T2": 0.0, - "threshold": 0.0002694329123116206, - "iq_angle": 4.912447775569025 + "two_qubit": { + "0-1": { + "CZ": [ + [ + "flux_1", + { + "duration": 30, + "amplitude": 0.055, + "envelope": { + "kind": "rectangular" + } } - } + ], + [ + "drive_0", + { + "type": "virtual_z", + "phase": -1.5707963267948966 + } + ], + [ + "drive_1", + { + "type": "virtual_z", + "phase": -1.5707963267948966 + } + ] + ] + } + } + }, + "characterization": { + "single_qubit": { + "0": { + "T1": 0.0, + "T2": 0.0, + "threshold": 0.00028502261712637096, + "iq_angle": 1.283105298787488 + }, + "1": { + "T1": 0.0, + "T2": 0.0, + "threshold": 0.0002694329123116206, + "iq_angle": 4.912447775569025 + } } + } } And in the case of having a chip with coupler qubits @@ -438,66 +433,68 @@ we need the following changes to the previous runcard: .. code-block:: json { - "qubits": [ - 0, - 1 - ], - "couplers": [ - 0 - ], - "topology": { - "0": [ - 0, - 1 - ] - }, - "components": { - "flux_coupler_01": { - "bias": 0.12 - } - } - "native_gates": { - "two_qubit": { - "0-1": { - "CZZ": { - "flux_coupler_01": [ - { - "type": "cf", - "duration": 40, - "amplitude": 0.1, - "envelope": {"kind": "rectangular"}, - "coupler": 0, - } - ] - "flux_0": [ - { - "duration": 30, - "amplitude": 0.6025, - "envelope": {"kind": "rectangular"}, - "type": "qf" - } - ], - "drive_0": [ - { - "type": "virtual_z", - "phase": -1, - "qubit": 0 - } - ], - "drive_1": [ - { - "type": "virtual_z", - "phase": -3, - "qubit": 1 - } - ] - } - "CZ": [ - - ] + "qubits": [ + 0, + 1 + ], + "couplers": [ + 0 + ], + "topology": { + "0": [ + 0, + 1 + ] + }, + "components": { + "flux_coupler_01": { + "bias": 0.12 + } + }, + "native_gates": { + "two_qubit": { + "0-1": { + "CZZ": [ + [ + "flux_coupler_01", + { + "duration": 40, + "amplitude": 0.1, + "envelope": { + "kind": "rectangular" + }, + "coupler": 0 } - } + ], + [ + "flux_0", + { + "duration": 30, + "amplitude": 0.6025, + "envelope": { + "kind": "rectangular" + }, + } + ], + [ + "drive_0", + { + "phase": -1, + "qubit": 0 + } + ], + [ + "drive_1", + { + "phase": -3, + "qubit": 1 + } + ] + ], + "CZ": [] + } } + } } This file contains different sections: ``qubits`` is a list with the qubit diff --git a/doc/source/tutorials/pulses.rst b/doc/source/tutorials/pulses.rst index ea40bf26ce..303bd47046 100644 --- a/doc/source/tutorials/pulses.rst +++ b/doc/source/tutorials/pulses.rst @@ -11,27 +11,28 @@ pulses (:class:`qibolab.pulses.Pulse`) through the from qibolab.pulses import Pulse, PulseSequence, Rectangular, Gaussian, Delay # Define PulseSequence - sequence = PulseSequence() - - # Add some pulses to the pulse sequence - sequence["channel_0"].append( - Pulse( - amplitude=0.3, - duration=60, - relative_phase=0, - envelope=Gaussian(rel_sigma=0.2), - ) - ) - sequence["channel_1"].append(Delay(duration=100, channel="1")) - sequence["channel_1"].append( - Pulse( - amplitude=0.5, - duration=3000, - relative_phase=0, - envelope=Rectangular(), - ) + sequence = PulseSequence( + [ + ( + "channel_0", + Pulse( + amplitude=0.3, + duration=60, + relative_phase=0, + envelope=Gaussian(rel_sigma=0.2), + ), + ), + ("channel_1", Delay(duration=100, channel="1")), + ( + "channel_1", + Pulse( + amplitude=0.5, duration=3000, relative_phase=0, envelope=Rectangular() + ), + ), + ] ) + The next step consists in connecting to a specific lab in which the pulse sequence will be executed. In order to do this we allocate a platform object via the :func:`qibolab.create_platform("name")` where ``name`` is the name of From 5503318a67769522fd9d87e67e1bd7091794fafb Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 9 Aug 2024 16:29:11 +0200 Subject: [PATCH 0536/1006] fix: Replace remaining usages of extend --- src/qibolab/platform/platform.py | 2 +- tests/conftest.py | 4 +- tests/pulses/test_plot.py | 8 +- tests/pulses/test_sequence.py | 2 +- tests/test_platform.py | 133 +++++++++++++++---------------- 5 files changed, 71 insertions(+), 78 deletions(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 11e035437e..8c390228a8 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -54,7 +54,7 @@ def unroll_sequences( total_sequence = PulseSequence() readout_map = defaultdict(list) for sequence in sequences: - total_sequence.extend(sequence) + total_sequence.concatenate(sequence) # TODO: Fix unrolling results for pulse in sequence.probe_pulses: readout_map[pulse.id].append(pulse.id) diff --git a/tests/conftest.py b/tests/conftest.py index 8020b1bd11..81d031c540 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -155,8 +155,8 @@ def wrapped( probe_seq = qubit.native_gates.MZ.create_sequence() probe_pulse = probe_seq[0][1] sequence = PulseSequence() - sequence.extend(qd_seq) - sequence.extend(probe_seq) + sequence.concatenate(qd_seq) + sequence.concatenate(probe_seq) if sweepers is None: amp_values = np.arange(0.01, 0.06, 0.01) freq_values = np.arange(-4e6, 4e6, 1e6) diff --git a/tests/pulses/test_plot.py b/tests/pulses/test_plot.py index 225240d13c..ec1150c834 100644 --- a/tests/pulses/test_plot.py +++ b/tests/pulses/test_plot.py @@ -25,21 +25,18 @@ def test_plot_functions(): p0 = Pulse( duration=40, amplitude=0.9, - frequency=0, envelope=Rectangular(), relative_phase=0, ) p1 = Pulse( duration=40, amplitude=0.9, - frequency=50e6, envelope=Gaussian(rel_sigma=0.2), relative_phase=0, ) p2 = Pulse( duration=40, amplitude=0.9, - frequency=50e6, envelope=Drag(rel_sigma=0.2, beta=2), relative_phase=0, ) @@ -52,19 +49,16 @@ def test_plot_functions(): p5 = Pulse( duration=40, amplitude=0.9, - frequency=400e6, envelope=ECap(alpha=2), relative_phase=0, ) p6 = Pulse( duration=40, amplitude=0.9, - frequency=50e6, envelope=GaussianSquare(rel_sigma=0.2, width=0.9), relative_phase=0, ) - ps = PulseSequence() - ps.extend( + ps = PulseSequence( [ ("q0/flux", p0), ("q2/drive", p1), diff --git a/tests/pulses/test_sequence.py b/tests/pulses/test_sequence.py index fd11bb2a78..a3ee58d26b 100644 --- a/tests/pulses/test_sequence.py +++ b/tests/pulses/test_sequence.py @@ -60,7 +60,7 @@ def test_durations(): assert sequence.duration == 40 + 1200 -def test_extend(): +def test_concatenate(): sequence1 = PulseSequence( [ ( diff --git a/tests/test_platform.py b/tests/test_platform.py index 3b481228f4..0f4ec1d799 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -249,13 +249,13 @@ def test_platform_execute_one_drive_pulse(qpu_platform): # One drive pulse platform = qpu_platform qubit = next(iter(platform.qubits.values())) - sequence = PulseSequence() - sequence[qubit.drive.name].append( - Pulse( - duration=200, - amplitude=0.07, - envelope=Gaussian(5), - ) + sequence = PulseSequence( + [ + ( + qubit.drive.name, + Pulse(duration=200, amplitude=0.07, envelope=Gaussian(0.2)), + ) + ] ) result = platform.execute_pulse_sequence( sequence, ExecutionParameters(nshots=nshots) @@ -270,13 +270,13 @@ def test_platform_execute_one_coupler_pulse(qpu_platform): if len(platform.couplers) == 0: pytest.skip("The platform does not have couplers") coupler = next(iter(platform.couplers.values())) - sequence = PulseSequence() - sequence[coupler.flux.name].append( - Pulse( - duration=200, - amplitude=0.31, - envelope=Rectangular(), - ) + sequence = PulseSequence( + [ + ( + coupler.flux.name, + Pulse(duration=200, amplitude=0.31, envelope=Rectangular()), + ) + ] ) result = platform.execute_pulse_sequence( sequence, ExecutionParameters(nshots=nshots) @@ -289,13 +289,13 @@ def test_platform_execute_one_flux_pulse(qpu_platform): # One flux pulse platform = qpu_platform qubit = next(iter(platform.qubits.values())) - sequence = PulseSequence() - sequence[qubit.flux.name].append( - Pulse( - duration=200, - amplitude=0.28, - envelope=Rectangular(), - ) + sequence = PulseSequence( + [ + ( + qubit.flux.name, + Pulse(duration=200, amplitude=0.28, envelope=Rectangular()), + ) + ] ) result = platform.execute_pulse_sequence( sequence, ExecutionParameters(nshots=nshots) @@ -309,8 +309,7 @@ def test_platform_execute_one_long_drive_pulse(qpu_platform): platform = qpu_platform qubit = next(iter(platform.qubits.values())) pulse = Pulse(duration=8192 + 200, amplitude=0.12, envelope=Gaussian(5)) - sequence = PulseSequence() - sequence[qubit.drive.name].append(pulse) + sequence = PulseSequence([(qubit.drive.name, pulse)]) options = ExecutionParameters(nshots=nshots) if find_instrument(platform, QbloxController) is not None: with pytest.raises(NotImplementedError): @@ -324,13 +323,8 @@ def test_platform_execute_one_extralong_drive_pulse(qpu_platform): # Extra Long duration platform = qpu_platform qubit = next(iter(platform.qubits.values())) - pulse = Pulse( - duration=2 * 8192 + 200, - amplitude=0.12, - envelope=Gaussian(5), - ) - sequence = PulseSequence() - sequence[qubit.drive.name].append(pulse) + pulse = Pulse(duration=2 * 8192 + 200, amplitude=0.12, envelope=Gaussian(0.2)) + sequence = PulseSequence([(qubit.drive.name, pulse)]) options = ExecutionParameters(nshots=nshots) if find_instrument(platform, QbloxController) is not None: with pytest.raises(NotImplementedError): @@ -345,9 +339,9 @@ def test_platform_execute_one_drive_one_readout(qpu_platform): platform = qpu_platform qubit_id, qubit = next(iter(platform.qubits.items())) sequence = PulseSequence() - sequence.extend(platform.create_RX_pulse(qubit_id)) - sequence[qubit.probe.name].append(Delay(duration=200)) - sequence.extend(platform.create_MZ_pulse(qubit_id)) + sequence.concatenate(platform.create_RX_pulse(qubit_id)) + sequence.append((qubit.probe.name, Delay(duration=200))) + sequence.concatenate(platform.create_MZ_pulse(qubit_id)) platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=nshots)) @@ -357,13 +351,13 @@ def test_platform_execute_multiple_drive_pulses_one_readout(qpu_platform): platform = qpu_platform qubit_id, qubit = next(iter(platform.qubits.items())) sequence = PulseSequence() - sequence.extend(platform.create_RX_pulse(qubit_id)) - sequence[qubit.drive.name].append(Delay(duration=4)) - sequence.extend(platform.create_RX_pulse(qubit_id)) - sequence[qubit.drive.name].append(Delay(duration=4)) - sequence.extend(platform.create_RX_pulse(qubit_id)) - sequence[qubit.probe.name].append(Delay(duration=808)) - sequence.extend(platform.create_MZ_pulse(qubit_id)) + sequence.concatenate(platform.create_RX_pulse(qubit_id)) + sequence.append((qubit.drive.name, Delay(duration=4))) + sequence.concatenate(platform.create_RX_pulse(qubit_id)) + sequence.append((qubit.drive.name, Delay(duration=4))) + sequence.concatenate(platform.create_RX_pulse(qubit_id)) + sequence.append((qubit.probe.name, Delay(duration=808))) + sequence.concatenate(platform.create_MZ_pulse(qubit_id)) platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=nshots)) @@ -376,11 +370,11 @@ def test_platform_execute_multiple_drive_pulses_one_readout_no_spacing( platform = qpu_platform qubit_id, qubit = next(iter(platform.qubits.items())) sequence = PulseSequence() - sequence.extend(platform.create_RX_pulse(qubit_id)) - sequence.extend(platform.create_RX_pulse(qubit_id)) - sequence.extend(platform.create_RX_pulse(qubit_id)) - sequence[qubit.probe.name].append(Delay(duration=800)) - sequence.extend(platform.create_MZ_pulse(qubit_id)) + sequence.concatenate(platform.create_RX_pulse(qubit_id)) + sequence.concatenate(platform.create_RX_pulse(qubit_id)) + sequence.concatenate(platform.create_RX_pulse(qubit_id)) + sequence.append((qubit.probe.name, Delay(duration=800))) + sequence.concatenate(platform.create_MZ_pulse(qubit_id)) platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=nshots)) @@ -391,12 +385,15 @@ def test_platform_execute_multiple_overlaping_drive_pulses_one_readout( """Multiple overlapping qubit drive pulses and one readout pulse.""" platform = qpu_platform qubit_id, qubit = next(iter(platform.qubits.items())) - sequence = PulseSequence() - pulse = Pulse(duration=200, amplitude=0.08, envelope=Gaussian(7)) - sequence[qubit.drive.name].append(pulse) - sequence[qubit.drive12.name].append(pulse.copy()) - sequence[qubit.probe.name].append(Delay(duration=800)) - sequence.extend(platform.create_MZ_pulse(qubit_id)) + pulse = Pulse(duration=200, amplitude=0.08, envelope=Gaussian(rel_sigma=1 / 7)) + sequence = PulseSequence( + [ + (qubit.drive.name, pulse), + (qubit.drive12.name, pulse.model_copy()), + (qubit.probe.name, Delay(duration=800)), + ] + ) + sequence.concatenate(platform.create_MZ_pulse(qubit_id)) platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=nshots)) @@ -410,13 +407,13 @@ def test_platform_execute_multiple_readout_pulses(qpu_platform): ro_seq1 = platform.create_MZ_pulse(qubit_id) qd_seq2 = platform.create_RX_pulse(qubit_id) ro_seq2 = platform.create_MZ_pulse(qubit_id) - sequence.extend(qd_seq1) - sequence[qubit.probe.name].append(Delay(duration=qd_seq1.duration)) - sequence.extend(ro_seq1) - sequence[qubit.drive.name].append(Delay(duration=ro_seq1.duration)) - sequence.extend(qd_seq2) - sequence[qubit.probe.name].append(Delay(duration=qd_seq2.duration)) - sequence.extend(ro_seq2) + sequence.concatenate(qd_seq1) + sequence.append((qubit.probe.name, Delay(duration=qd_seq1.duration))) + sequence.concatenate(ro_seq1) + sequence.append((qubit.drive.name, Delay(duration=ro_seq1.duration))) + sequence.concatenate(qd_seq2) + sequence.append((qubit.probe.name, Delay(duration=qd_seq2.duration))) + sequence.concatenate(ro_seq2) platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=nshots)) @@ -430,10 +427,10 @@ def test_excited_state_probabilities_pulses(qpu_platform): backend = QibolabBackend(platform) sequence = PulseSequence() for qubit_id, qubit in platform.qubits.items(): - sequence.extend(platform.create_RX_pulse(qubit_id)) - sequence[qubit.probe.name].append(Delay(duration=sequence.duration)) - sequence.extend(platform.create_MZ_pulse(qubit_id)) - result = platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=5000)) + sequence.concatenate(platform.create_RX_pulse(qubit_id)) + sequence.append((qubit.probe.name, Delay(duration=sequence.duration))) + sequence.concatenate(platform.create_MZ_pulse(qubit_id)) + result = platform.execute([sequence], ExecutionParameters(nshots=5000)) nqubits = len(platform.qubits) cr = CircuitResult(backend, Circuit(nqubits), result, nshots=5000) @@ -459,13 +456,15 @@ def test_ground_state_probabilities_pulses(qpu_platform, start_zero): sequence = PulseSequence() for qubit_id, qubit in platform.qubits.items(): if not start_zero: - sequence[qubit.probe.name].append( - Delay( - duration=platform.create_RX_pulse(qubit_id).duration, - channel=platform.qubits[qubit].readout.name, + sequence.append( + ( + qubit.probe.name, + Delay( + duration=platform.create_RX_pulse(qubit_id).duration, + ), ) ) - sequence.extend(platform.create_MZ_pulse(qubit_id)) + sequence.concatenate(platform.create_MZ_pulse(qubit_id)) result = platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=5000)) nqubits = len(platform.qubits) From b607e0b6d391e4062ad2096ceaa9e6b8fb5d0c7d Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 9 Aug 2024 16:50:25 +0200 Subject: [PATCH 0537/1006] feat: Add sequence method to trim final delays --- src/qibolab/pulses/sequence.py | 16 ++++++++++++++++ tests/pulses/test_sequence.py | 12 ++++++++++++ 2 files changed, 28 insertions(+) diff --git a/src/qibolab/pulses/sequence.py b/src/qibolab/pulses/sequence.py index d7b8c05647..e91a0cf1e9 100644 --- a/src/qibolab/pulses/sequence.py +++ b/src/qibolab/pulses/sequence.py @@ -56,6 +56,22 @@ def concatenate(self, other: "PulseSequence") -> None: self.append((ch, Delay(duration=delay))) self.extend((ch, pulse) for pulse in other.channel(ch)) + def trim(self) -> "PulseSequence": + """Drop final delays. + + The operation is not in place, and does not modify the original + sequence. + """ + terminated = set() + new = [] + for ch, pulse in reversed(self): + if ch not in terminated: + if isinstance(pulse, Delay): + continue + terminated.add(ch) + new.append((ch, pulse)) + return type(self)(reversed(new)) + @property def probe_pulses(self) -> list[Pulse]: """Return list of the readout pulses in this sequence.""" diff --git a/tests/pulses/test_sequence.py b/tests/pulses/test_sequence.py index a3ee58d26b..b398a71089 100644 --- a/tests/pulses/test_sequence.py +++ b/tests/pulses/test_sequence.py @@ -140,3 +140,15 @@ def test_copy(): ) ) assert "ch3" not in sequence + + +def test_trim(): + p = Pulse(duration=40, amplitude=0.9, envelope=Rectangular()) + d = Delay(duration=10) + sequence = PulseSequence( + [("a", p), ("a", d), ("b", d), ("b", d), ("c", d), ("c", p)] + ) + trimmed = sequence.trim() + assert len(list(trimmed.channel("a"))) == 1 + assert len(list(trimmed.channel("b"))) == 0 + assert len(list(trimmed.channel("c"))) == 2 From 39ebc7fe03fb7e21fcdd35b0dd85b7290389b3d9 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 9 Aug 2024 16:53:47 +0200 Subject: [PATCH 0538/1006] test: Check the double reserve is working correctly --- tests/pulses/test_sequence.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/tests/pulses/test_sequence.py b/tests/pulses/test_sequence.py index b398a71089..15c9cb89a2 100644 --- a/tests/pulses/test_sequence.py +++ b/tests/pulses/test_sequence.py @@ -1,4 +1,5 @@ from qibolab.pulses import Delay, Drag, Gaussian, Pulse, PulseSequence, Rectangular +from qibolab.pulses.pulse import VirtualZ def test_init(): @@ -145,10 +146,25 @@ def test_copy(): def test_trim(): p = Pulse(duration=40, amplitude=0.9, envelope=Rectangular()) d = Delay(duration=10) + vz = VirtualZ(phase=0.1) sequence = PulseSequence( - [("a", p), ("a", d), ("b", d), ("b", d), ("c", d), ("c", p)] + [ + ("a", p), + ("a", d), + ("b", d), + ("b", d), + ("c", d), + ("c", p), + ("d", p), + ("d", vz), + ] ) trimmed = sequence.trim() + # the final delay is dropped assert len(list(trimmed.channel("a"))) == 1 + # only delays, all dropped assert len(list(trimmed.channel("b"))) == 0 + # initial delay is kept assert len(list(trimmed.channel("c"))) == 2 + # the order is preserved + assert isinstance(next(iter(trimmed.channel("d"))), Pulse) From 4dfeceba237c93136e1282ef57bf917d63c053fa Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 9 Aug 2024 16:53:59 +0200 Subject: [PATCH 0539/1006] fix: Trim compiled sequences --- src/qibolab/compilers/compiler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibolab/compilers/compiler.py b/src/qibolab/compilers/compiler.py index c0e41463d7..2ef4839fd8 100644 --- a/src/qibolab/compilers/compiler.py +++ b/src/qibolab/compilers/compiler.py @@ -174,4 +174,4 @@ def qubit_clock(qubit: QubitId): if isinstance(gate, gates.M): measurement_map[gate] = gate_sequence - return sequence, measurement_map + return sequence.trim(), measurement_map From b229c678f5d0b522093ed8e31ee55070116fe4e2 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 9 Aug 2024 16:57:04 +0200 Subject: [PATCH 0540/1006] fix: Prevent adding null delays during alignment --- src/qibolab/compilers/default.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/qibolab/compilers/default.py b/src/qibolab/compilers/default.py index 00ff757f08..de1fb8f1c1 100644 --- a/src/qibolab/compilers/default.py +++ b/src/qibolab/compilers/default.py @@ -67,6 +67,8 @@ def measurement_rule(gate: Gate, qubits: list[Qubit]) -> PulseSequence: def align_rule(gate: Align, qubits: list[Qubit]) -> PulseSequence: """Measurement gate applied using the platform readout pulse.""" + if gate.delay == 0.0: + return PulseSequence() return PulseSequence( [ (ch.name, Delay(duration=gate.delay)) From 355ee92ac77cd0f31df348eae683eb05957b33b7 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 9 Aug 2024 17:21:24 +0200 Subject: [PATCH 0541/1006] test: Test full sequences during cz compilation Not just the first pulse This was causing a weird issue, since the order for sets seems to be platform and python-version dependent. --- tests/test_compilers_default.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_compilers_default.py b/tests/test_compilers_default.py index b2315ad231..bd05dfc629 100644 --- a/tests/test_compilers_default.py +++ b/tests/test_compilers_default.py @@ -119,7 +119,7 @@ def test_cz_to_sequence(): sequence = compile_circuit(circuit, platform) test_sequence = platform.pairs[(2, 1)].native_gates.CZ.create_sequence() - assert sequence[0] == test_sequence[0] + assert sequence == test_sequence def test_cnot_to_sequence(): From a7459d88cced65f678c35860847939180ed9e2ef Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 9 Aug 2024 17:22:55 +0200 Subject: [PATCH 0542/1006] fix: Preserve sequences order during concatenation Placing all delays in between --- src/qibolab/compilers/compiler.py | 2 ++ src/qibolab/pulses/sequence.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/qibolab/compilers/compiler.py b/src/qibolab/compilers/compiler.py index 2ef4839fd8..90b1026c6c 100644 --- a/src/qibolab/compilers/compiler.py +++ b/src/qibolab/compilers/compiler.py @@ -164,6 +164,8 @@ def qubit_clock(qubit: QubitId): delay_sequence.append((ch, Delay(duration=delay))) channel_clock[ch] += delay increment[ch] = gate_sequence.channel_duration(ch) + # add the increment only after computing them, since multiple channels + # are related to each other because belonging to the same qubit for ch, inc in increment.items(): channel_clock[ch] += inc sequence.concatenate(delay_sequence) diff --git a/src/qibolab/pulses/sequence.py b/src/qibolab/pulses/sequence.py index e91a0cf1e9..6ad5b4144a 100644 --- a/src/qibolab/pulses/sequence.py +++ b/src/qibolab/pulses/sequence.py @@ -54,7 +54,7 @@ def concatenate(self, other: "PulseSequence") -> None: delay = max_duration - duration if delay > 0: self.append((ch, Delay(duration=delay))) - self.extend((ch, pulse) for pulse in other.channel(ch)) + self.extend(other) def trim(self) -> "PulseSequence": """Drop final delays. From b6ff92c6fc8a5765fa557554dd738a2c409779dc Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 9 Aug 2024 17:28:21 +0200 Subject: [PATCH 0543/1006] test: Test sequence concatenation order --- tests/pulses/test_sequence.py | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/tests/pulses/test_sequence.py b/tests/pulses/test_sequence.py index 15c9cb89a2..718b526f24 100644 --- a/tests/pulses/test_sequence.py +++ b/tests/pulses/test_sequence.py @@ -62,22 +62,10 @@ def test_durations(): def test_concatenate(): - sequence1 = PulseSequence( - [ - ( - "ch1", - Pulse(duration=40, amplitude=0.9, envelope=Drag(rel_sigma=0.2, beta=1)), - ) - ] - ) - sequence2 = PulseSequence( - [ - ( - "ch2", - Pulse(duration=60, amplitude=0.9, envelope=Drag(rel_sigma=0.2, beta=1)), - ) - ] - ) + p1 = Pulse(duration=40, amplitude=0.9, envelope=Drag(rel_sigma=0.2, beta=1)) + sequence1 = PulseSequence([("ch1", p1)]) + p2 = Pulse(duration=60, amplitude=0.9, envelope=Drag(rel_sigma=0.2, beta=1)) + sequence2 = PulseSequence([("ch2", p2)]) sequence1.concatenate(sequence2) assert set(sequence1.channels) == {"ch1", "ch2"} @@ -111,6 +99,20 @@ def test_concatenate(): assert sequence1.channel_duration("ch2") == 60 + 80 assert sequence1.channel_duration("ch3") == 60 + 100 + # Check order preservation, even with various channels + vz = VirtualZ(phase=0.1) + s1 = PulseSequence([("a", p1), ("b", vz)]) + s2 = PulseSequence([("a", vz), ("a", p2)]) + s1.concatenate(s2) + assert isinstance(s1[0][1], Pulse) + assert s1[0][0] == "a" + assert isinstance(s1[1][1], VirtualZ) + assert s1[1][0] == "b" + assert isinstance(s1[2][1], VirtualZ) + assert s1[2][0] == "a" + assert isinstance(s1[3][1], Pulse) + assert s1[3][0] == "a" + def test_copy(): sequence = PulseSequence( From 6598976f124ab221a72c6d585e82f812a8dae484 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 9 Aug 2024 18:17:55 +0200 Subject: [PATCH 0544/1006] fix: Extend clock to couplers --- src/qibolab/compilers/compiler.py | 4 ++-- src/qibolab/dummy/parameters.json | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/qibolab/compilers/compiler.py b/src/qibolab/compilers/compiler.py index 90b1026c6c..264278c218 100644 --- a/src/qibolab/compilers/compiler.py +++ b/src/qibolab/compilers/compiler.py @@ -148,8 +148,8 @@ def compile(self, circuit: Circuit, platform: Platform): measurement_map = {} channel_clock = defaultdict(int) - def qubit_clock(qubit: QubitId): - return max(channel_clock[ch.name] for ch in platform.qubits[qubit].channels) + def qubit_clock(el: QubitId): + return max(channel_clock[ch.name] for ch in platform.elements[el].channels) # process circuit gates for moment in circuit.queue.moments: diff --git a/src/qibolab/dummy/parameters.json b/src/qibolab/dummy/parameters.json index a5fb9c0ec8..b13da301c6 100644 --- a/src/qibolab/dummy/parameters.json +++ b/src/qibolab/dummy/parameters.json @@ -710,9 +710,9 @@ } }, "coupler": { - "0": {}, - "1": {}, - "4": {} + "c0": {}, + "c1": {}, + "c4": {} } } } From 00b2442daf10a6a7a0f441ccb23c10c686af68bc Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 12 Aug 2024 12:56:27 +0200 Subject: [PATCH 0545/1006] fix: Add return type to compilation --- src/qibolab/compilers/compiler.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/qibolab/compilers/compiler.py b/src/qibolab/compilers/compiler.py index 264278c218..d47596685d 100644 --- a/src/qibolab/compilers/compiler.py +++ b/src/qibolab/compilers/compiler.py @@ -126,7 +126,9 @@ def get_sequence(self, gate, platform): return gate_sequence # FIXME: pulse.qubit and pulse.channel do not exist anymore - def compile(self, circuit: Circuit, platform: Platform): + def compile( + self, circuit: Circuit, platform: Platform + ) -> tuple[PulseSequence, dict]: """Transforms a circuit to pulse sequence. Args: From 5275c366039573b6d7e711c11ebf887018b4ab74 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 12 Aug 2024 12:56:45 +0200 Subject: [PATCH 0546/1006] test: Add test for delay computation failure --- tests/test_compilers_default.py | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/tests/test_compilers_default.py b/tests/test_compilers_default.py index bd05dfc629..5bd41393ed 100644 --- a/tests/test_compilers_default.py +++ b/tests/test_compilers_default.py @@ -29,11 +29,10 @@ def test_u3_sim_agreement(): np.testing.assert_allclose(u3_matrix, target_matrix) -def compile_circuit(circuit, platform): +def compile_circuit(circuit, platform) -> PulseSequence: """Compile a circuit to a pulse sequence.""" compiler = Compiler.default() - sequence, _ = compiler.compile(circuit, platform) - return sequence + return compiler.compile(circuit, platform)[0] @pytest.mark.parametrize( @@ -166,3 +165,18 @@ def test_align_delay_measurement(platform, delay): target_sequence.concatenate(platform.qubits[0].native_gates.MZ.create_sequence()) assert sequence == target_sequence assert len(sequence.probe_pulses) == 1 + + +def test_align_multiqubit(platform): + main, coupled = 0, 2 + circuit = Circuit(3) + circuit.add(gates.GPI2(main, phi=0.2)) + circuit.add(gates.CZ(main, coupled)) + circuit.add(gates.M(main, coupled)) + + sequence = compile_circuit(circuit, platform) + flux_duration = sequence.channel_duration(f"qubit_{coupled}/flux") + for q in (main, coupled): + probe_delay = next(iter(sequence.channel(f"qubit_{q}/probe"))) + assert isinstance(probe_delay, Delay) + assert flux_duration == probe_delay.duration From 4c44dc1e4a62deeb8b49f7f27a4f90ac94fec24f Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 12 Aug 2024 13:16:29 +0200 Subject: [PATCH 0547/1006] fix: Fix start computation for multi-qubit gates During compilation, all channels involved in the gate should be taken into accunt, to keep all the pulses in the internal sequence relatively synced. --- src/qibolab/compilers/compiler.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/qibolab/compilers/compiler.py b/src/qibolab/compilers/compiler.py index d47596685d..c6ee0229f4 100644 --- a/src/qibolab/compilers/compiler.py +++ b/src/qibolab/compilers/compiler.py @@ -148,7 +148,7 @@ def compile( # TODO: Implement a mapping between circuit qubit ids and platform ``Qubit``s measurement_map = {} - channel_clock = defaultdict(int) + channel_clock = defaultdict(float) def qubit_clock(el: QubitId): return max(channel_clock[ch.name] for ch in platform.elements[el].channels) @@ -159,9 +159,15 @@ def qubit_clock(el: QubitId): delay_sequence = PulseSequence() gate_sequence = self.get_sequence(gate, platform) increment = defaultdict(int) + start = max( + ( + qubit_clock(el) + for el in {ch_to_qb[ch] for ch in gate_sequence.channels} + ), + default=0.0, + ) for ch in gate_sequence.channels: - qubit = ch_to_qb[ch] - delay = qubit_clock(qubit) - channel_clock[ch] + delay = start - channel_clock[ch] if delay > 0: delay_sequence.append((ch, Delay(duration=delay))) channel_clock[ch] += delay From 7e75cb282dc56c238dad6902569fc21ac4792848 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 9 Aug 2024 16:33:58 +0400 Subject: [PATCH 0548/1006] refactor: remove characterization section from runcard --- src/qibolab/components/configs.py | 2 + src/qibolab/dummy/parameters.json | 144 +++--------------------- src/qibolab/qubits.py | 77 +------------ src/qibolab/serialize.py | 176 +++++++++--------------------- 4 files changed, 74 insertions(+), 325 deletions(-) diff --git a/src/qibolab/components/configs.py b/src/qibolab/components/configs.py index 06dc7ded18..df1d187eed 100644 --- a/src/qibolab/components/configs.py +++ b/src/qibolab/components/configs.py @@ -77,6 +77,8 @@ class AcquisitionConfig: """Delay between readout pulse start and acquisition start.""" smearing: float """FIXME:""" + threshold: float + iq_angle: float Config = Union[DcConfig, IqMixerConfig, OscillatorConfig, IqConfig, AcquisitionConfig] diff --git a/src/qibolab/dummy/parameters.json b/src/qibolab/dummy/parameters.json index b13da301c6..3238c3db55 100644 --- a/src/qibolab/dummy/parameters.json +++ b/src/qibolab/dummy/parameters.json @@ -81,23 +81,33 @@ }, "qubit_0/acquire": { "delay": 0, - "smearing": 0 + "smearing": 0, + "threshold": 0.0, + "iq_angle": 0.0 }, "qubit_1/acquire": { "delay": 0, - "smearing": 0 + "smearing": 0, + "threshold": 0.0, + "iq_angle": 0.0 }, "qubit_2/acquire": { "delay": 0, - "smearing": 0 + "smearing": 0, + "threshold": 0.0, + "iq_angle": 0.0 }, "qubit_3/acquire": { "delay": 0, - "smearing": 0 + "smearing": 0, + "threshold": 0.0, + "iq_angle": 0.0 }, "qubit_4/acquire": { "delay": 0, - "smearing": 0 + "smearing": 0, + "threshold": 0.0, + "iq_angle": 0.0 }, "coupler_0/flux": { "offset": 0.0 @@ -590,129 +600,5 @@ ] } } - }, - "characterization": { - "single_qubit": { - "0": { - "bare_resonator_frequency": 0, - "anharmonicity": 0, - "asymmetry": 0.0, - "crosstalk_matrix": { - "0": 1 - }, - "Ec": 0.0, - "Ej": 0.0, - "g": 0.0, - "assignment_fidelity": 0.0, - "peak_voltage": 0, - "pi_pulse_amplitude": 0, - "T1": 0.0, - "T2": 0.0, - "T2_spin_echo": 0, - "state0_voltage": 0, - "state1_voltage": 0, - "mean_gnd_states": [0, 1], - "mean_exc_states": [1, 0], - "threshold": 0.0, - "iq_angle": 0.0 - }, - "1": { - "bare_resonator_frequency": 0, - "anharmonicity": 0, - "asymmetry": 0.0, - "crosstalk_matrix": { - "1": 1 - }, - "Ec": 0.0, - "Ej": 0.0, - "g": 0.0, - "assignment_fidelity": 0.0, - "peak_voltage": 0, - "pi_pulse_amplitude": 0, - "T1": 0.0, - "T2": 0.0, - "T2_spin_echo": 0, - "state0_voltage": 0, - "state1_voltage": 0, - "mean_gnd_states": [0.25, 0], - "mean_exc_states": [0, 0.25], - "threshold": 0.0, - "iq_angle": 0.0 - }, - "2": { - "bare_resonator_frequency": 0, - "anharmonicity": 0, - "asymmetry": 0.0, - "crosstalk_matrix": { - "2": 1 - }, - "Ec": 0.0, - "Ej": 0.0, - "g": 0.0, - "assignment_fidelity": 0.0, - "peak_voltage": 0, - "pi_pulse_amplitude": 0, - "T1": 0.0, - "T2": 0.0, - "T2_spin_echo": 0, - "state0_voltage": 0, - "state1_voltage": 0, - "mean_gnd_states": [0.5, 0], - "mean_exc_states": [0, 0.5], - "threshold": 0.0, - "iq_angle": 0.0 - }, - "3": { - "bare_resonator_frequency": 0, - "anharmonicity": 0, - "asymmetry": 0.0, - "crosstalk_matrix": { - "3": 1 - }, - "Ec": 0.0, - "Ej": 0.0, - "g": 0.0, - "assignment_fidelity": 0.0, - "peak_voltage": 0, - "pi_pulse_amplitude": 0, - "T1": 0.0, - "T2": 0.0, - "T2_spin_echo": 0, - "state0_voltage": 0, - "state1_voltage": 0, - "mean_gnd_states": [0.75, 0], - "mean_exc_states": [0, 0.75], - "threshold": 0.0, - "iq_angle": 0.0 - }, - "4": { - "bare_resonator_frequency": 0, - "anharmonicity": 0, - "asymmetry": 0.0, - "crosstalk_matrix": { - "4": 1 - }, - "Ec": 0.0, - "Ej": 0.0, - "g": 0.0, - "assignment_fidelity": 0.0, - "peak_voltage": 0, - "pi_pulse_amplitude": 0, - "T1": 0.0, - "T2": 0.0, - "T2_spin_echo": 0, - "state0_voltage": 0, - "state1_voltage": 0, - "mean_gnd_states": [1, 0], - "mean_exc_states": [0, 1], - "threshold": 0.0, - "iq_angle": 0.0 - } - }, - "coupler": { - "c0": {}, - "c1": {}, - "c4": {} - } } } diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index e7d4049581..2a12bd9a3d 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -14,16 +14,6 @@ Not all channels are required to operate a qubit. """ -EXCLUDED_FIELDS = CHANNEL_NAMES + ( - "name", - "native_gates", - "kernel", - "qubit1", - "qubit2", - "coupler", -) -"""Qubit dataclass fields that are excluded by the ``characterization`` -property.""" @dataclass @@ -46,40 +36,8 @@ class Qubit: name: QubitId - bare_resonator_frequency: int = 0 - anharmonicity: int = 0 - asymmetry: float = 0.0 - crosstalk_matrix: dict[QubitId, float] = field(default_factory=dict) - """Crosstalk matrix for voltages.""" - Ec: float = 0.0 - """Readout Charge Energy.""" - Ej: float = 0.0 - """Readout Josephson Energy.""" - g: float = 0.0 - """Readout coupling.""" - assignment_fidelity: float = 0.0 - """Assignment fidelity.""" - readout_fidelity: float = 0.0 - """Readout fidelity.""" - gate_fidelity: float = 0.0 - """Gate fidelity from standard RB.""" - - effective_temperature: float = 0.0 - """Effective temperature.""" - peak_voltage: float = 0 - pi_pulse_amplitude: float = 0 - resonator_depletion_time: int = 0 - T1: int = 0 - T2: int = 0 - T2_spin_echo: int = 0 - state0_voltage: int = 0 - state1_voltage: int = 0 - mean_gnd_states: list[float] = field(default_factory=lambda: [0, 0]) - mean_exc_states: list[float] = field(default_factory=lambda: [0, 0]) - - # parameters for single shot classification - threshold: float = 0.0 - iq_angle: float = 0.0 + native_gates: SingleQubitNatives = field(default_factory=SingleQubitNatives) + kernel: Optional[np.ndarray] = field(default=None, repr=False) probe: Optional[IqChannel] = None @@ -89,8 +47,6 @@ class Qubit: drive_cross: Optional[dict[QubitId, IqChannel]] = None flux: Optional[DcChannel] = None - native_gates: SingleQubitNatives = field(default_factory=SingleQubitNatives) - @property def channels(self): for name in CHANNEL_NAMES: @@ -98,15 +54,6 @@ def channels(self): if channel is not None: yield channel - @property - def characterization(self): - """Dictionary containing characterization parameters.""" - return { - fld.name: getattr(self, fld.name) - for fld in fields(self) - if fld.name not in EXCLUDED_FIELDS - } - @property def mixer_frequencies(self): """Get local oscillator and intermediate frequencies of native gates. @@ -148,21 +95,9 @@ class QubitPair: Acts as target on two-qubit gates. """ - gate_fidelity: float = 0.0 - """Gate fidelity from standard 2q RB.""" - - cz_fidelity: float = 0.0 - """Gate fidelity from CZ interleaved RB.""" - - coupler: Optional[Qubit] = None + # coupler: Optional[Qubit] = None + # FIXME: I think this is not needed but not sure yet + # This information is not provided in the runcard so it is not + # parsed by serialize.py native_gates: TwoQubitNatives = field(default_factory=TwoQubitNatives) - - @property - def characterization(self): - """Dictionary containing characterization parameters.""" - return { - fld.name: getattr(self, fld.name) - for fld in fields(self) - if fld.name not in EXCLUDED_FIELDS - } diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index 0d74d9926c..cfed656a81 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -30,7 +30,7 @@ ) from qibolab.pulses import PulseSequence from qibolab.pulses.pulse import PulseLike -from qibolab.qubits import Qubit, QubitId, QubitPair +from qibolab.qubits import Qubit, QubitId, QubitPair, QubitPairId RUNCARD = "parameters.json" PLATFORM = "platform.py" @@ -54,49 +54,6 @@ def load_qubit_name(name: str) -> QubitId: return name -def load_qubits( - runcard: dict, kernels: Optional[Kernels] = None -) -> tuple[QubitMap, QubitMap, QubitPairMap]: - """Load qubits and pairs from the runcard. - - Uses the native gate and characterization sections of the runcard to - parse the - :class: `qibolab.qubits.Qubit` and - :class: `qibolab.qubits.QubitPair` - objects. - """ - qubits = {} - for q, char in runcard["characterization"]["single_qubit"].items(): - raw_qubit = Qubit(load_qubit_name(q), **char) - raw_qubit.crosstalk_matrix = { - load_qubit_name(key): value - for key, value in raw_qubit.crosstalk_matrix.items() - } - qubits[load_qubit_name(q)] = raw_qubit - - if kernels is not None: - for q in kernels: - qubits[q].kernel = kernels[q] - - characterization = runcard["characterization"] - - pairs = {} - two_qubit = characterization.get("two_qubit", {}) - for pair in runcard.get("native_gates", {}).get("two_qubit", {}): - q0, q1 = (load_qubit_name(q) for q in pair.split("-")) - char = two_qubit.get(pair, {}) - pairs[(q0, q1)] = pairs[(q1, q0)] = QubitPair(qubits[q0], qubits[q1], **char) - - couplers = { - load_qubit_name(c): Qubit(load_qubit_name(c), **char) - for c, char in runcard["characterization"].get("coupler", {}).items() - } - - qubits, pairs, couplers = register_gates(runcard, qubits, pairs, couplers) - - return qubits, couplers, pairs - - _PulseLike = TypeAdapter(PulseLike, config=ConfigDict(extra="ignore")) """Parse a pulse-like object. @@ -116,69 +73,70 @@ def _load_sequence(raw_sequence): return PulseSequence([(ch, _load_pulse(pulse)) for ch, pulse in raw_sequence]) -def _load_single_qubit_natives(gates) -> SingleQubitNatives: +def _load_single_qubit_natives(gates: dict) -> dict[QubitId, Qubit]: """Parse native gates from the runcard. Args: gates (dict): Dictionary with native gate pulse parameters as loaded from the runcard. """ - return SingleQubitNatives( - **{ - gate_name: ( - RxyFactory(_load_sequence(raw_sequence)) - if gate_name == "RX" - else FixedSequenceFactory(_load_sequence(raw_sequence)) - ) - for gate_name, raw_sequence in gates.items() - } - ) + qubits = {} + for q, gatedict in gates.items(): + name = load_qubit_name(q) + native_gates = SingleQubitNatives( + **{ + gate_name: ( + RxyFactory(_load_sequence(raw_sequence)) + if gate_name == "RX" + else FixedSequenceFactory(_load_sequence(raw_sequence)) + ) + for gate_name, raw_sequence in gatedict.items() + } + ) + qubits[name] = Qubit(load_qubit_name(q), native_gates=native_gates) + return qubits -def _load_two_qubit_natives(gates) -> TwoQubitNatives: - return TwoQubitNatives( - **{ - gate_name: FixedSequenceFactory(_load_sequence(raw_sequence)) - for gate_name, raw_sequence in gates.items() - } - ) +def _load_two_qubit_natives( + gates: dict, qubits: dict[QubitId, Qubit] +) -> dict[QubitPairId, QubitPair]: + pairs = {} + for pair, gatedict in gates.items(): + q0, q1 = (load_qubit_name(q) for q in pair.split("-")) + native_gates = TwoQubitNatives( + **{ + gate_name: FixedSequenceFactory(_load_sequence(raw_sequence)) + for gate_name, raw_sequence in gatedict.items() + } + ) + pairs[(q0, q1)] = QubitPair(qubits[q0], qubits[q1], native_gates=native_gates) + if native_gates.symmetric: + pairs[(q1, q0)] = pairs[(q0, q1)] + return pairs -def register_gates( - runcard: dict, - qubits: QubitMap, - pairs: QubitPairMap, - couplers: Optional[QubitMap] = None, -) -> tuple[QubitMap, QubitPairMap, QubitMap]: - """Register single qubit native gates to ``Qubit`` objects from the - runcard. +def load_qubits( + runcard: dict, kernels: Optional[Kernels] = None +) -> tuple[QubitMap, QubitMap, QubitPairMap]: + """Load qubits, couplers and pairs from the runcard. - Uses the native gate and characterization sections of the runcard - to parse the :class:`qibolab.qubits.Qubit` and :class:`qibolab.qubits.QubitPair` - objects. + Uses the native gate section of the runcard to parse the + corresponding :class: `qibolab.qubits.Qubit` and + :class: `qibolab.qubits.QubitPair` objects. """ - native_gates = runcard.get("native_gates", {}) - for q, gates in native_gates.get("single_qubit", {}).items(): - qubit = qubits[load_qubit_name(q)] - qubit.native_gates = _load_single_qubit_natives(gates) - - for c, gates in native_gates.get("coupler", {}).items(): - coupler = couplers[load_qubit_name(c)] - coupler.native_gates = _load_single_qubit_natives(gates) - - # register two-qubit native gates to ``QubitPair`` objects - for pair, gatedict in native_gates.get("two_qubit", {}).items(): - q0, q1 = tuple(int(q) if q.isdigit() else q for q in pair.split("-")) - native_gates = _load_two_qubit_natives(gatedict) - coupler = pairs[(q0, q1)].coupler - pairs[(q0, q1)] = QubitPair( - qubits[q0], qubits[q1], coupler=coupler, native_gates=native_gates - ) - if native_gates.symmetric: - pairs[(q1, q0)] = pairs[(q0, q1)] - return qubits, pairs, couplers + qubits = _load_single_qubit_natives(native_gates.get("single_qubit", {})) + + if kernels is not None: + for q in kernels: + qubits[q].kernel = kernels[q] + + couplers = _load_single_qubit_natives(native_gates.get("coupler", {})) + + pairs = _load_two_qubit_natives(native_gates.get("two_qubit", {}), qubits) + + return qubits, couplers, pairs def load_instrument_settings( @@ -243,34 +201,6 @@ def dump_native_gates( return native_gates -def dump_characterization( - qubits: QubitMap, - pairs: Optional[QubitPairMap] = None, - couplers: Optional[QubitMap] = None, -) -> dict: - """Dump qubit characterization section to dictionary following the runcard - format, using qubit and pair objects.""" - single_qubit = {} - for q, qubit in qubits.items(): - char = qubit.characterization - char["crosstalk_matrix"] = { - dump_qubit_name(q): c for q, c in qubit.crosstalk_matrix.items() - } - single_qubit[dump_qubit_name(q)] = char - - characterization = {"single_qubit": single_qubit} - if len(pairs) > 0: - characterization["two_qubit"] = { - f"{q1}-{q2}": pair.characterization for (q1, q2), pair in pairs.items() - } - - if couplers: - characterization["coupler"] = { - dump_qubit_name(c.name): {} for c in couplers.values() - } - return characterization - - def dump_instruments(instruments: InstrumentMap) -> dict: """Dump instrument settings to a dictionary following the runcard format.""" @@ -328,10 +258,6 @@ def dump_runcard( platform.qubits, platform.pairs, platform.couplers ) - settings["characterization"] = dump_characterization( - platform.qubits, platform.pairs, platform.couplers - ) - (path / RUNCARD).write_text(json.dumps(settings, sort_keys=False, indent=4)) From a18e918141ec756ad9166b70c3d92978c17bc60f Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 9 Aug 2024 23:13:09 +0400 Subject: [PATCH 0549/1006] chore: register coupler natives for dummy --- src/qibolab/dummy/parameters.json | 65 +++++++++++++++++++++++++++++++ src/qibolab/dummy/platform.py | 1 - src/qibolab/native.py | 2 + src/qibolab/platform/platform.py | 6 +-- tests/test_dummy.py | 6 +-- 5 files changed, 71 insertions(+), 9 deletions(-) diff --git a/src/qibolab/dummy/parameters.json b/src/qibolab/dummy/parameters.json index 3238c3db55..3ae0fb68ae 100644 --- a/src/qibolab/dummy/parameters.json +++ b/src/qibolab/dummy/parameters.json @@ -115,6 +115,9 @@ "coupler_1/flux": { "offset": 0.0 }, + "coupler_3/flux": { + "offset": 0.0 + }, "coupler_4/flux": { "offset": 0.0 }, @@ -306,6 +309,68 @@ ] } }, + "coupler": { + "0": { + "CP": { + "coupler_0/flux": [ + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + } + } + ] + } + }, + "1": { + "CP": { + "coupler_1/flux": [ + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + } + } + ] + } + }, + "3": { + "CP": { + "coupler_3/flux": [ + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + } + } + ] + } + }, + "4": { + "CP": { + "coupler_4/flux": [ + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + } + } + ] + } + } + }, "two_qubit": { "0-2": { "CZ": [ diff --git a/src/qibolab/dummy/platform.py b/src/qibolab/dummy/platform.py index 69bc23f443..b56f7cb064 100644 --- a/src/qibolab/dummy/platform.py +++ b/src/qibolab/dummy/platform.py @@ -65,7 +65,6 @@ def create_dummy(): configs[flux_name] = DcConfig(**component_params[flux_name]) for c, coupler in couplers.items(): - c = c[1:] flux_name = f"coupler_{c}/flux" coupler.flux = DcChannel(flux_name) configs[flux_name] = DcConfig(**component_params[flux_name]) diff --git a/src/qibolab/native.py b/src/qibolab/native.py index 194c76ca11..753c569108 100644 --- a/src/qibolab/native.py +++ b/src/qibolab/native.py @@ -88,6 +88,8 @@ class SingleQubitNatives: """Pulse to drive to qubit from state 1 to state 2.""" MZ: Optional[FixedSequenceFactory] = None """Measurement pulse.""" + CP: Optional[FixedSequenceFactory] = None + """Pulse to activate coupler.""" @dataclass diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 8c390228a8..1559a6ade4 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -321,11 +321,7 @@ def execute( # so that each acquisition command carries the info with it. integration_setup: IntegrationSetup = {} for qubit in self.qubits.values(): - integration_setup[qubit.acquisition.name] = ( - qubit.kernel, - qubit.threshold, - qubit.iq_angle, - ) + integration_setup[qubit.acquisition.name] = qubit.kernel results = defaultdict(list) for b in batch(sequences, self._controller.bounds): diff --git a/tests/test_dummy.py b/tests/test_dummy.py index 83d6fb22ba..1a3b5265cc 100644 --- a/tests/test_dummy.py +++ b/tests/test_dummy.py @@ -40,7 +40,7 @@ def test_dummy_execute_pulse_sequence(platform: Platform, acquisition): def test_dummy_execute_coupler_pulse(platform: Platform): sequence = PulseSequence() - channel = platform.get_coupler("c0").flux + channel = platform.get_coupler(0).flux pulse = Pulse( duration=30, amplitude=0.05, @@ -144,14 +144,14 @@ def test_dummy_single_sweep_coupler( envelope=GaussianSquare(rel_sigma=0.2, width=0.75), ) sequence.concatenate(probe_seq) - sequence.append((platform.get_coupler("c0").flux.name, coupler_pulse)) + sequence.append((platform.get_coupler(0).flux.name, coupler_pulse)) if parameter is Parameter.amplitude: parameter_range = np.random.rand(SWEPT_POINTS) else: parameter_range = np.random.randint(SWEPT_POINTS, size=SWEPT_POINTS) if parameter in ChannelParameter: sweeper = Sweeper( - parameter, parameter_range, channels=[platform.couplers["c0"].flux.name] + parameter, parameter_range, channels=[platform.couplers[0].flux.name] ) else: sweeper = Sweeper(parameter, parameter_range, pulses=[coupler_pulse]) From 620df67b991097d348c31bab1039d3d76546c5c6 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 9 Aug 2024 23:27:49 +0400 Subject: [PATCH 0550/1006] fix: make threshold and angle optional --- src/qibolab/components/configs.py | 6 +++--- src/qibolab/instruments/zhinst/components/configs.py | 2 +- src/qibolab/platform/platform.py | 9 +++------ tests/test_platform.py | 9 --------- 4 files changed, 7 insertions(+), 19 deletions(-) diff --git a/src/qibolab/components/configs.py b/src/qibolab/components/configs.py index df1d187eed..f56589b570 100644 --- a/src/qibolab/components/configs.py +++ b/src/qibolab/components/configs.py @@ -8,7 +8,7 @@ """ from dataclasses import dataclass -from typing import Union +from typing import Optional, Union __all__ = [ "DcConfig", @@ -77,8 +77,8 @@ class AcquisitionConfig: """Delay between readout pulse start and acquisition start.""" smearing: float """FIXME:""" - threshold: float - iq_angle: float + threshold: Optional[float] = None + iq_angle: Optional[float] = None Config = Union[DcConfig, IqMixerConfig, OscillatorConfig, IqConfig, AcquisitionConfig] diff --git a/src/qibolab/instruments/zhinst/components/configs.py b/src/qibolab/instruments/zhinst/components/configs.py index 6211fa69b4..d65a28dd8a 100644 --- a/src/qibolab/instruments/zhinst/components/configs.py +++ b/src/qibolab/instruments/zhinst/components/configs.py @@ -35,7 +35,7 @@ class ZiIqConfig(IqConfig): class ZiAcquisitionConfig(AcquisitionConfig): """Acquisition config for ZI SHF* line instrument.""" - power_range: float + power_range: float = 0 """Power range in dBm. Possible values are [-30. -25. -20. -15. -10. -5. 0. 5. 10.]. diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 1559a6ade4..f22a2a19ea 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -189,11 +189,6 @@ def components(self) -> set[str]: """Names of all components available in the platform.""" return set(self.configs.keys()) - @property - def elements(self) -> dict: - """Qubits and couplers.""" - return self.qubits | self.couplers - @property def channels(self) -> list[str]: """Channels in the platform.""" @@ -202,7 +197,9 @@ def channels(self) -> list[str]: @property def channels_map(self) -> dict[str, QubitId]: """Channel to element map.""" - return {ch.name: id for id, el in self.elements.items() for ch in el.channels} + return {ch.name: id for id, el in self.qubits.items() for ch in el.channels} | { + ch.name: id for id, el in self.couplers.items() for ch in el.channels + } def config(self, name: str) -> Config: """Returns configuration of given component.""" diff --git a/tests/test_platform.py b/tests/test_platform.py index 0f4ec1d799..8dff9bdbd5 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -158,15 +158,6 @@ def test_dump_runcard(platform, tmp_path): target_path = pathlib.Path(__file__).parent / "dummy_qrc" / f"{platform.name}" target_runcard = load_runcard(target_path) - # for the characterization section the dumped runcard may contain - # some default ``Qubit`` parameters - target_char = target_runcard.pop("characterization")["single_qubit"] - final_char = final_runcard.pop("characterization")["single_qubit"] - - assert final_runcard == target_runcard - for qubit, values in target_char.items(): - for name, value in values.items(): - assert final_char[qubit][name] == value # assert instrument section is dumped properly in the runcard target_instruments = target_runcard.pop("instruments") final_instruments = final_runcard.pop("instruments") From b5ef4283be981fd4fa39887681e4dd66be827b9a Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 9 Aug 2024 23:32:39 +0400 Subject: [PATCH 0551/1006] chore: update zurich platform --- tests/dummy_qrc/zurich/parameters.json | 187 ++++++++----------------- tests/dummy_qrc/zurich/platform.py | 11 +- 2 files changed, 66 insertions(+), 132 deletions(-) diff --git a/tests/dummy_qrc/zurich/parameters.json b/tests/dummy_qrc/zurich/parameters.json index 67658d15e2..d864aa8274 100644 --- a/tests/dummy_qrc/zurich/parameters.json +++ b/tests/dummy_qrc/zurich/parameters.json @@ -271,6 +271,68 @@ ] } }, + "coupler": { + "0": { + "CP": { + "coupler_0/flux": [ + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + } + } + ] + } + }, + "1": { + "CP": { + "coupler_1/flux": [ + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + } + } + ] + } + }, + "3": { + "CP": { + "coupler_3/flux": [ + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + } + } + ] + } + }, + "4": { + "CP": { + "coupler_4/flux": [ + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + } + } + ] + } + } + }, "two_qubit": { "0-2": { "CZ": [ @@ -433,130 +495,5 @@ ] } } - }, - "characterization": { - "single_qubit": { - "0": { - "bare_resonator_frequency": 0, - "anharmonicity": 0, - "asymmetry": 0.0, - "crosstalk_matrix": { - "0": 1 - }, - "Ec": 0.0, - "Ej": 0.0, - "g": 0.0, - "assignment_fidelity": 0.0, - "peak_voltage": 0, - "pi_pulse_amplitude": 0, - "T1": 0.0, - "T2": 0.0, - "T2_spin_echo": 0, - "state0_voltage": 0, - "state1_voltage": 0, - "mean_gnd_states": [0, 1], - "mean_exc_states": [1, 0], - "threshold": 0.0, - "iq_angle": 0.0 - }, - "1": { - "bare_resonator_frequency": 0, - "anharmonicity": 0, - "asymmetry": 0.0, - "crosstalk_matrix": { - "1": 1 - }, - "Ec": 0.0, - "Ej": 0.0, - "g": 0.0, - "assignment_fidelity": 0.0, - "peak_voltage": 0, - "pi_pulse_amplitude": 0, - "T1": 0.0, - "T2": 0.0, - "T2_spin_echo": 0, - "state0_voltage": 0, - "state1_voltage": 0, - "mean_gnd_states": [0.25, 0], - "mean_exc_states": [0, 0.25], - "threshold": 0.0, - "iq_angle": 0.0 - }, - "2": { - "bare_resonator_frequency": 0, - "anharmonicity": 0, - "asymmetry": 0.0, - "crosstalk_matrix": { - "2": 1 - }, - "Ec": 0.0, - "Ej": 0.0, - "g": 0.0, - "assignment_fidelity": 0.0, - "peak_voltage": 0, - "pi_pulse_amplitude": 0, - "T1": 0.0, - "T2": 0.0, - "T2_spin_echo": 0, - "state0_voltage": 0, - "state1_voltage": 0, - "mean_gnd_states": [0.5, 0], - "mean_exc_states": [0, 0.5], - "threshold": 0.0, - "iq_angle": 0.0 - }, - "3": { - "bare_resonator_frequency": 0, - "anharmonicity": 0, - "asymmetry": 0.0, - "crosstalk_matrix": { - "3": 1 - }, - "Ec": 0.0, - "Ej": 0.0, - "g": 0.0, - "assignment_fidelity": 0.0, - "peak_voltage": 0, - "pi_pulse_amplitude": 0, - "T1": 0.0, - "T2": 0.0, - "T2_spin_echo": 0, - "state0_voltage": 0, - "state1_voltage": 0, - "mean_gnd_states": [0.75, 0], - "mean_exc_states": [0, 0.75], - "threshold": 0.0, - "iq_angle": 0.0 - }, - "4": { - "bare_resonator_frequency": 0, - "anharmonicity": 0, - "asymmetry": 0.0, - "crosstalk_matrix": { - "4": 1 - }, - "Ec": 0.0, - "Ej": 0.0, - "g": 0.0, - "assignment_fidelity": 0.0, - "peak_voltage": 0, - "pi_pulse_amplitude": 0, - "T1": 0.0, - "T2": 0.0, - "T2_spin_echo": 0, - "state0_voltage": 0, - "state1_voltage": 0, - "mean_gnd_states": [1, 0], - "mean_exc_states": [0, 1], - "threshold": 0.0, - "iq_angle": 0.0 - } - }, - "coupler": { - "c0": {}, - "c1": {}, - "c3": {}, - "c4": {} - } } } diff --git a/tests/dummy_qrc/zurich/platform.py b/tests/dummy_qrc/zurich/platform.py index 21fc6ebd0a..bee4919f03 100644 --- a/tests/dummy_qrc/zurich/platform.py +++ b/tests/dummy_qrc/zurich/platform.py @@ -22,8 +22,6 @@ ) FOLDER = pathlib.Path(__file__).parent -QUBITS = [0, 1, 2, 3, 4] -COUPLERS = ["c0", "c1", "c3", "c4"] def create(): @@ -62,7 +60,7 @@ def create(): } configs[readout_lo] = OscillatorConfig(**component_params[readout_lo]) zi_channels = [] - for q in QUBITS: + for q in qubits: probe_name = f"qubit_{q}/probe" acquisition_name = f"qubit_{q}/acquire" configs[probe_name] = ZiIqConfig(**component_params[probe_name]) @@ -112,13 +110,12 @@ def create(): ZiChannel(qubits[q].flux, device="device_hdawg", path=f"SIGOUTS/{q}") ) - for i, c_ in enumerate(COUPLERS): - c = c_[1:] + for i, c in enumerate(couplers): flux_name = f"coupler_{c}/flux" configs[flux_name] = ZiDcConfig(**component_params[flux_name]) - couplers[c_].flux = DcChannel(name=flux_name) + couplers[c].flux = DcChannel(name=flux_name) zi_channels.append( - ZiChannel(couplers[c_].flux, device="device_hdawg2", path=f"SIGOUTS/{i}") + ZiChannel(couplers[c].flux, device="device_hdawg2", path=f"SIGOUTS/{i}") ) controller = Zurich( From 9c3db4adc73040aac1695c92403a76ece9dc0932 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 9 Aug 2024 23:34:54 +0400 Subject: [PATCH 0552/1006] chore: drop qubits list from runcards --- src/qibolab/dummy/parameters.json | 1 - tests/dummy_qrc/zurich/parameters.json | 1 - 2 files changed, 2 deletions(-) diff --git a/src/qibolab/dummy/parameters.json b/src/qibolab/dummy/parameters.json index 3ae0fb68ae..af13de13f2 100644 --- a/src/qibolab/dummy/parameters.json +++ b/src/qibolab/dummy/parameters.json @@ -4,7 +4,6 @@ "nshots": 1024, "relaxation_time": 0 }, - "qubits": [0, 1, 2, 3, 4], "instruments": { "dummy": { "bounds": { diff --git a/tests/dummy_qrc/zurich/parameters.json b/tests/dummy_qrc/zurich/parameters.json index d864aa8274..8e606cd213 100644 --- a/tests/dummy_qrc/zurich/parameters.json +++ b/tests/dummy_qrc/zurich/parameters.json @@ -1,6 +1,5 @@ { "nqubits": 5, - "qubits": [0, 1, 2, 3, 4], "settings": { "nshots": 4096, "relaxation_time": 300000 From 3ebf4386b8df4bcec917aa65597f67c6f3dd02b2 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Sat, 10 Aug 2024 00:46:35 +0400 Subject: [PATCH 0553/1006] fix: replace elements in compiler and fix runcards --- src/qibolab/compilers/compiler.py | 6 +++++- src/qibolab/dummy/parameters.json | 24 ++++++++++++------------ tests/dummy_qrc/zurich/parameters.json | 24 ++++++++++++------------ 3 files changed, 29 insertions(+), 25 deletions(-) diff --git a/src/qibolab/compilers/compiler.py b/src/qibolab/compilers/compiler.py index c6ee0229f4..cbd6c93b52 100644 --- a/src/qibolab/compilers/compiler.py +++ b/src/qibolab/compilers/compiler.py @@ -151,7 +151,11 @@ def compile( channel_clock = defaultdict(float) def qubit_clock(el: QubitId): - return max(channel_clock[ch.name] for ch in platform.elements[el].channels) + if el in platform.qubits: + return max( + channel_clock[ch.name] for ch in platform.qubits[el].channels + ) + return max(channel_clock[ch.name] for ch in platform.couplers[el].channels) # process circuit gates for moment in circuit.queue.moments: diff --git a/src/qibolab/dummy/parameters.json b/src/qibolab/dummy/parameters.json index af13de13f2..d894f20dbd 100644 --- a/src/qibolab/dummy/parameters.json +++ b/src/qibolab/dummy/parameters.json @@ -310,8 +310,8 @@ }, "coupler": { "0": { - "CP": { - "coupler_0/flux": [ + "CP": [ + ["coupler_0/flux", { "duration": 30.0, "amplitude": 0.05, @@ -322,11 +322,11 @@ } } ] - } + ] }, "1": { - "CP": { - "coupler_1/flux": [ + "CP": [ + ["coupler_1/flux", { "duration": 30.0, "amplitude": 0.05, @@ -337,11 +337,11 @@ } } ] - } + ] }, "3": { - "CP": { - "coupler_3/flux": [ + "CP": [ + ["coupler_3/flux", { "duration": 30.0, "amplitude": 0.05, @@ -352,11 +352,11 @@ } } ] - } + ] }, "4": { - "CP": { - "coupler_4/flux": [ + "CP": [ + ["coupler_4/flux", { "duration": 30.0, "amplitude": 0.05, @@ -367,7 +367,7 @@ } } ] - } + ] } }, "two_qubit": { diff --git a/tests/dummy_qrc/zurich/parameters.json b/tests/dummy_qrc/zurich/parameters.json index 8e606cd213..5bcd3dec7f 100644 --- a/tests/dummy_qrc/zurich/parameters.json +++ b/tests/dummy_qrc/zurich/parameters.json @@ -272,8 +272,8 @@ }, "coupler": { "0": { - "CP": { - "coupler_0/flux": [ + "CP": [ + ["coupler_0/flux", { "duration": 30.0, "amplitude": 0.05, @@ -284,11 +284,11 @@ } } ] - } + ] }, "1": { - "CP": { - "coupler_1/flux": [ + "CP": [ + ["coupler_1/flux", { "duration": 30.0, "amplitude": 0.05, @@ -299,11 +299,11 @@ } } ] - } + ] }, "3": { - "CP": { - "coupler_3/flux": [ + "CP": [ + ["coupler_3/flux", { "duration": 30.0, "amplitude": 0.05, @@ -313,12 +313,12 @@ "width": 0.75 } } + ] ] - } }, "4": { - "CP": { - "coupler_4/flux": [ + "CP": [ + ["coupler_4/flux", { "duration": 30.0, "amplitude": 0.05, @@ -329,7 +329,7 @@ } } ] - } + ] } }, "two_qubit": { From b09d84dacd9069e369e6723d8daf67e6dc230e0f Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Sat, 10 Aug 2024 20:22:53 +0400 Subject: [PATCH 0554/1006] docs: drop characterization references from docs --- doc/source/getting-started/experiment.rst | 22 ------- doc/source/tutorials/lab.rst | 74 +++-------------------- src/qibolab/qubits.py | 1 - 3 files changed, 7 insertions(+), 90 deletions(-) diff --git a/doc/source/getting-started/experiment.rst b/doc/source/getting-started/experiment.rst index d9afda70be..3908d23f3d 100644 --- a/doc/source/getting-started/experiment.rst +++ b/doc/source/getting-started/experiment.rst @@ -180,28 +180,6 @@ And the we can define the runcard ``my_platform/parameters.json``: } }, "two_qubits": {} - }, - "characterization": { - "single_qubit": { - "0": { - "anharmonicity": 0, - "Ec": 0, - "Ej": 0, - "g": 0, - "T1": 0.0, - "T2": 0.0, - "threshold": 0.0, - "iq_angle": 0.0, - "mean_gnd_states": [ - 0.0, - 0.0 - ], - "mean_exc_states": [ - 0.0, - 0.0 - ] - } - } } } diff --git a/doc/source/tutorials/lab.rst b/doc/source/tutorials/lab.rst index bb7cc3652d..94dc4cdbe7 100644 --- a/doc/source/tutorials/lab.rst +++ b/doc/source/tutorials/lab.rst @@ -14,8 +14,7 @@ How to define a platform for a self-hosted QPU? The :class:`qibolab.platform.Platform` object holds all the information required to execute programs, and in particular :class:`qibolab.pulses.PulseSequence` in a real QPU. It is comprised by different objects that contain information about -the qubit characterization and connectivity, the native gates and the lab's -instrumentation. +the native gates and the lab's instrumentation. The following cell shows how to define a single qubit platform from scratch, using different Qibolab primitives. @@ -92,8 +91,7 @@ coded following the abstract :class:`qibolab.instruments.abstract.Instrument` interface. Furthermore, above we defined three channels that connect the qubit to the -control instrument and we assigned two native gates to the qubit. In this -example we neglected or characterization parameters associated to the qubit. +control instrument and we assigned two native gates to the qubit. These can be passed when defining the :class:`qibolab.qubits.Qubit` objects. When the QPU contains more than one qubit, some of the qubits are connected so @@ -408,22 +406,6 @@ a two-qubit system: ] } } - }, - "characterization": { - "single_qubit": { - "0": { - "T1": 0.0, - "T2": 0.0, - "threshold": 0.00028502261712637096, - "iq_angle": 1.283105298787488 - }, - "1": { - "T1": 0.0, - "T2": 0.0, - "threshold": 0.0002694329123116206, - "iq_angle": 4.912447775569025 - } - } } } @@ -433,19 +415,6 @@ we need the following changes to the previous runcard: .. code-block:: json { - "qubits": [ - 0, - 1 - ], - "couplers": [ - 0 - ], - "topology": { - "0": [ - 0, - 1 - ] - }, "components": { "flux_coupler_01": { "bias": 0.12 @@ -497,15 +466,12 @@ we need the following changes to the previous runcard: } } -This file contains different sections: ``qubits`` is a list with the qubit -names, ``couplers`` one with the coupler names , ``settings`` defines default execution parameters, ``topology`` defines -the qubit connectivity (qubit pairs), ``native_gates`` specifies the calibrated -pulse parameters for implementing single and two-qubit gates and -``characterization`` provides the physical parameters associated to each qubit and coupler. +This file contains different sections: ``components`` defines the configuration of channel +parameters, while ``native_gates`` specifies the calibrated pulse parameters for implementing +single and two-qubit gates. Note that such parameters may slightly differ depending on the QPU architecture, however the pulses under ``native_gates`` should comply with the -:class:`qibolab.pulses.Pulse` API and the parameters under ``characterization`` -should be a subset of :class:`qibolab.qubits.Qubit` attributes. +:class:`qibolab.pulses.Pulse` API. Providing the above runcard is not sufficient to instantiate a :class:`qibolab.platform.Platform`. This should still be done using a @@ -642,7 +608,7 @@ With the following additions for coupler architectures: couplers=couplers, ) -Note that this assumes that the runcard is saved as ``/parameters.yml`` where ```` +Note that this assumes that the runcard is saved as ``/parameters.json`` where ```` is the directory containing ``platform.py``. @@ -660,21 +626,11 @@ The runcard can contain an ``instruments`` section that provides these parameter { "nqubits": 2, - "qubits": [ - 0, - 1 - ], "settings": { "nshots": 1024, "sampling_rate": 1000000000, "relaxation_time": 50000 }, - "topology": [ - [ - 0, - 1 - ] - ], "instruments": { "twpa_pump": { "frequency": 4600000000, @@ -684,22 +640,6 @@ The runcard can contain an ``instruments`` section that provides these parameter "native_gates": { "single_qubit": {}, "two_qubit": {} - }, - "characterization": { - "single_qubit": { - "0": { - "T1": 0.0, - "T2": 0.0, - "threshold": 0.00028502261712637096, - "iq_angle": 1.283105298787488 - }, - "1": { - "T1": 0.0, - "T2": 0.0, - "threshold": 0.0002694329123116206, - "iq_angle": 4.912447775569025 - } - } } } diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index 2a12bd9a3d..ed15341ebe 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -31,7 +31,6 @@ class Qubit: send drive pulses to the qubit. flux (:class:`qibolab.platforms.utils.Channel`): Channel used to send flux pulses to the qubit. - Other characterization parameters for the qubit, loaded from the runcard. """ name: QubitId From fac1a7c7fd0d2c0b9962c257f37f62ff5b74059b Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Sat, 10 Aug 2024 20:25:00 +0400 Subject: [PATCH 0555/1006] chore: drop characterization section from dummy runcards --- tests/dummy_qrc/qblox/parameters.json | 70 ------------------- tests/dummy_qrc/qm/parameters.json | 69 ------------------ tests/dummy_qrc/qm_octave/parameters.json | 69 ------------------ tests/dummy_qrc/rfsoc/parameters.json | 16 ----- tests/emulators/default_q0/parameters.json | 19 ----- .../ibmfakebelem_q01/parameters.json | 32 --------- 6 files changed, 275 deletions(-) diff --git a/tests/dummy_qrc/qblox/parameters.json b/tests/dummy_qrc/qblox/parameters.json index 45058b9101..8a4997512a 100644 --- a/tests/dummy_qrc/qblox/parameters.json +++ b/tests/dummy_qrc/qblox/parameters.json @@ -268,75 +268,5 @@ ] } } - }, - "characterization": { - "single_qubit": { - "0": { - "readout_frequency": 7213299307, - "drive_frequency": 5050304836, - "anharmonicity": 291463266, - "T1": 5857, - "T2": 0, - "sweetspot": 0.5507 - }, - "1": { - "readout_frequency": 7452990931, - "drive_frequency": 4852833073, - "anharmonicity": 292584018, - "T1": 1253, - "T2": 0, - "sweetspot": 0.2227, - "iq_angle": 146.297, - "threshold": 0.003488 - }, - "2": { - "readout_frequency": 7655083068, - "drive_frequency": 5795371914, - "anharmonicity": 276187576, - "T1": 4563, - "T2": 0, - "sweetspot": -0.378, - "iq_angle": 97.821, - "threshold": 0.002904 - }, - "3": { - "readout_frequency": 7803441221, - "drive_frequency": 6761018001, - "anharmonicity": 262310994, - "T1": 4232, - "T2": 0, - "sweetspot": -0.8899, - "iq_angle": 91.209, - "threshold": 0.004318 - }, - "4": { - "readout_frequency": 8058947261, - "drive_frequency": 6586543060, - "anharmonicity": 261390626, - "T1": 492, - "T2": 0, - "sweetspot": 0.589, - "iq_angle": 7.997, - "threshold": 0.002323 - } - }, - "two_qubit": { - "0-2": { - "gate_fidelity": [0.0, 0.0], - "cz_fidelity": [0.0, 0.0] - }, - "1-2": { - "gate_fidelity": [0.0, 0.0], - "cz_fidelity": [0.0, 0.0] - }, - "2-3": { - "gate_fidelity": [0.0, 0.0], - "cz_fidelity": [0.0, 0.0] - }, - "2-4": { - "gate_fidelity": [0.0, 0.0], - "cz_fidelity": [0.0, 0.0] - } - } } } diff --git a/tests/dummy_qrc/qm/parameters.json b/tests/dummy_qrc/qm/parameters.json index d8eb059eeb..6b22d264cb 100644 --- a/tests/dummy_qrc/qm/parameters.json +++ b/tests/dummy_qrc/qm/parameters.json @@ -222,74 +222,5 @@ ] } } - }, - "characterization": { - "single_qubit": { - "0": { - "readout_frequency": 0.0, - "drive_frequency": 0.0, - "T1": 0.0, - "T2": 0.0, - "sweetspot": 0.0, - "threshold": 0.0, - "iq_angle": 0.0, - "mixer_drive_g": 0.0, - "mixer_drive_phi": 0.0, - "mixer_readout_g": 0.0, - "mixer_readout_phi": 0.0 - }, - "1": { - "readout_frequency": 7453265000, - "drive_frequency": 4855663000, - "T1": 0.0, - "T2": 0.0, - "sweetspot": -0.047, - "threshold": 0.00028502261712637096, - "iq_angle": 1.283105298787488, - "mixer_drive_g": 0.0, - "mixer_drive_phi": 0.0, - "mixer_readout_g": 0.0, - "mixer_readout_phi": 0.0 - }, - "2": { - "readout_frequency": 7655107000, - "drive_frequency": 5799876000, - "T1": 0.0, - "T2": 0.0, - "sweetspot": -0.045, - "threshold": 0.0002694329123116206, - "iq_angle": 4.912447775569025, - "mixer_drive_g": 0.0, - "mixer_drive_phi": 0.0, - "mixer_readout_g": 0.0, - "mixer_readout_phi": 0.0 - }, - "3": { - "readout_frequency": 7802391000, - "drive_frequency": 6760700000, - "T1": 0.0, - "T2": 0.0, - "sweetspot": 0.034, - "threshold": 0.0003363427381347193, - "iq_angle": 1.6124890998581591, - "mixer_drive_g": 0.0, - "mixer_drive_phi": 0.0, - "mixer_readout_g": 0.0, - "mixer_readout_phi": 0.0 - }, - "4": { - "readout_frequency": 8057668000, - "drive_frequency": 6585053000, - "T1": 0.0, - "T2": 0.0, - "sweetspot": -0.057, - "threshold": 0.00013079660165463033, - "iq_angle": 5.6303684840135, - "mixer_drive_g": 0.0, - "mixer_drive_phi": 0.0, - "mixer_readout_g": 0.0, - "mixer_readout_phi": 0.0 - } - } } } diff --git a/tests/dummy_qrc/qm_octave/parameters.json b/tests/dummy_qrc/qm_octave/parameters.json index 0e496f4220..822b549c37 100644 --- a/tests/dummy_qrc/qm_octave/parameters.json +++ b/tests/dummy_qrc/qm_octave/parameters.json @@ -244,74 +244,5 @@ ] } } - }, - "characterization": { - "single_qubit": { - "0": { - "readout_frequency": 0.0, - "drive_frequency": 0.0, - "T1": 0.0, - "T2": 0.0, - "sweetspot": 0.0, - "threshold": 0.0, - "iq_angle": 0.0, - "mixer_drive_g": 0.0, - "mixer_drive_phi": 0.0, - "mixer_readout_g": 0.0, - "mixer_readout_phi": 0.0 - }, - "1": { - "readout_frequency": 7453265000, - "drive_frequency": 4855663000, - "T1": 0.0, - "T2": 0.0, - "sweetspot": -0.047, - "threshold": 0.00028502261712637096, - "iq_angle": 1.283105298787488, - "mixer_drive_g": 0.0, - "mixer_drive_phi": 0.0, - "mixer_readout_g": 0.0, - "mixer_readout_phi": 0.0 - }, - "2": { - "readout_frequency": 7655107000, - "drive_frequency": 5799876000, - "T1": 0.0, - "T2": 0.0, - "sweetspot": -0.045, - "threshold": 0.0002694329123116206, - "iq_angle": 4.912447775569025, - "mixer_drive_g": 0.0, - "mixer_drive_phi": 0.0, - "mixer_readout_g": 0.0, - "mixer_readout_phi": 0.0 - }, - "3": { - "readout_frequency": 7802391000, - "drive_frequency": 6760700000, - "T1": 0.0, - "T2": 0.0, - "sweetspot": 0.034, - "threshold": 0.0003363427381347193, - "iq_angle": 1.6124890998581591, - "mixer_drive_g": 0.0, - "mixer_drive_phi": 0.0, - "mixer_readout_g": 0.0, - "mixer_readout_phi": 0.0 - }, - "4": { - "readout_frequency": 8057668000, - "drive_frequency": 6585053000, - "T1": 0.0, - "T2": 0.0, - "sweetspot": -0.057, - "threshold": 0.00013079660165463033, - "iq_angle": 5.6303684840135, - "mixer_drive_g": 0.0, - "mixer_drive_phi": 0.0, - "mixer_readout_g": 0.0, - "mixer_readout_phi": 0.0 - } - } } } diff --git a/tests/dummy_qrc/rfsoc/parameters.json b/tests/dummy_qrc/rfsoc/parameters.json index eb1b24813d..505673d25b 100644 --- a/tests/dummy_qrc/rfsoc/parameters.json +++ b/tests/dummy_qrc/rfsoc/parameters.json @@ -50,21 +50,5 @@ } }, "two_qubit": {} - }, - "characterization": { - "single_qubit": { - "0": { - "readout_frequency": 7371258599, - "drive_frequency": 5542341844, - "pi_pulse_amplitude": 0.05284168507293318, - "T1": 10441.64173639732, - "T2": 4083.4697338939845, - "threshold": -0.8981346462690887, - "iq_angle": -1.2621946150226666, - "mean_gnd_states": [-0.17994037940379404, -2.4709365853658536], - "mean_exc_states": [0.6854460704607047, 0.24369105691056914], - "T2_spin_echo": 5425.5448969467925 - } - } } } diff --git a/tests/emulators/default_q0/parameters.json b/tests/emulators/default_q0/parameters.json index 319e727c58..42f2f45bb6 100644 --- a/tests/emulators/default_q0/parameters.json +++ b/tests/emulators/default_q0/parameters.json @@ -72,24 +72,5 @@ } } } - }, - "characterization": { - "single_qubit": { - "0": { - "readout_frequency": 7301661824.000001, - "drive_frequency": 5090167234.445013, - "anharmonicity": -336123005.1821652, - "Ec": 0, - "Ej": 0, - "g": 0, - "T1": 88578.48970762537, - "T2": 106797.94866226273, - "sweetspot": 0, - "mean_gnd_states": "1.5417+0.1817j", - "mean_exc_states": "2.5332-0.5914j", - "threshold": 1.5435, - "iq_angle": 2.602 - } - } } } diff --git a/tests/emulators/ibmfakebelem_q01/parameters.json b/tests/emulators/ibmfakebelem_q01/parameters.json index 39ef172066..16811bda9c 100644 --- a/tests/emulators/ibmfakebelem_q01/parameters.json +++ b/tests/emulators/ibmfakebelem_q01/parameters.json @@ -248,37 +248,5 @@ ] } } - }, - "characterization": { - "single_qubit": { - "0": { - "readout_frequency": 7301661824.000001, - "drive_frequency": 5090167234.445013, - "anharmonicity": -336123005.1821652, - "Ec": 0, - "Ej": 0, - "g": 0, - "T1": 0.0, - "T2": 0.0, - "sweetspot": 0, - "mean_gnd_states": "1.5417+0.1817j", - "mean_exc_states": "2.5332-0.5914j", - "threshold": 1.5435, - "iq_angle": 2.602 - }, - "1": { - "readout_frequency": 7393428047.0, - "drive_frequency": 5245306068.285917, - "anharmonicity": -316572131.412737, - "Ec": 0, - "Ej": 0, - "g": 0, - "T1": 0.0, - "T2": 0.0, - "sweetspot": 0, - "mean_gnd_states": "(0+0j)", - "mean_exc_states": "(0+0j)" - } - } } } From 251e47afb17a878e93c7c2fe0043e1fc61a24788 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Sat, 10 Aug 2024 20:32:37 +0400 Subject: [PATCH 0556/1006] refactor: use qubit names in QubitPair object --- doc/source/tutorials/lab.rst | 4 ++-- src/qibolab/qubits.py | 9 ++------- src/qibolab/serialize.py | 4 ++-- tests/test_platform.py | 2 +- 4 files changed, 7 insertions(+), 12 deletions(-) diff --git a/doc/source/tutorials/lab.rst b/doc/source/tutorials/lab.rst index 94dc4cdbe7..764a3775cb 100644 --- a/doc/source/tutorials/lab.rst +++ b/doc/source/tutorials/lab.rst @@ -177,7 +177,7 @@ hold the parameters of the two-qubit gates. ) # define the pair of qubits - pair = QubitPair(qubit0, qubit1) + pair = QubitPair(qubit0.name, qubit1.name) pair.native_gates = TwoQubitNatives( CZ=FixedSequenceFactory( PulseSequence( @@ -220,7 +220,7 @@ coupler but qibolab will take them into account when calling :class:`qibolab.nat # Look above example # define the pair of qubits - pair = QubitPair(qubit0, qubit1, coupler_01) + pair = QubitPair(qubit0.name, qubit1.name) pair.native_gates = TwoQubitNatives( CZ=FixedSequenceFactory( PulseSequence( diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index ed15341ebe..fd7daf4ea0 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -83,20 +83,15 @@ class QubitPair: :class:`qibolab.platforms.abstract.Qubit`. """ - qubit1: Qubit + qubit1: QubitId """First qubit of the pair. Acts as control on two-qubit gates. """ - qubit2: Qubit + qubit2: QubitId """Second qubit of the pair. Acts as target on two-qubit gates. """ - # coupler: Optional[Qubit] = None - # FIXME: I think this is not needed but not sure yet - # This information is not provided in the runcard so it is not - # parsed by serialize.py - native_gates: TwoQubitNatives = field(default_factory=TwoQubitNatives) diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index cfed656a81..40f26cc971 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -109,7 +109,7 @@ def _load_two_qubit_natives( for gate_name, raw_sequence in gatedict.items() } ) - pairs[(q0, q1)] = QubitPair(qubits[q0], qubits[q1], native_gates=native_gates) + pairs[(q0, q1)] = QubitPair(q0, q1, native_gates=native_gates) if native_gates.symmetric: pairs[(q1, q0)] = pairs[(q0, q1)] return pairs @@ -195,7 +195,7 @@ def dump_native_gates( for pair in pairs.values(): natives = _dump_natives(pair.native_gates) if len(natives) > 0: - pair_name = f"{pair.qubit1.name}-{pair.qubit2.name}" + pair_name = f"{pair.qubit1}-{pair.qubit2}" native_gates["two_qubit"][pair_name] = natives return native_gates diff --git a/tests/test_platform.py b/tests/test_platform.py index 8dff9bdbd5..f6318e4050 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -69,7 +69,7 @@ def test_platform_basics(): platform2 = Platform( "come va?", qs, - {(q1, q2): QubitPair(qs[q1], qs[q2]) for q1 in range(3) for q2 in range(4, 8)}, + {(q1, q2): QubitPair(q1, q2) for q1 in range(3) for q2 in range(4, 8)}, {}, {}, ) From 50a65c18d6a5acf30e7253882aed190a249f2b65 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Sat, 10 Aug 2024 20:48:50 +0400 Subject: [PATCH 0557/1006] refactor: reduce code repetition for qubits and couplers --- src/qibolab/compilers/compiler.py | 10 ++++++---- src/qibolab/platform/platform.py | 11 +++++++---- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/qibolab/compilers/compiler.py b/src/qibolab/compilers/compiler.py index cbd6c93b52..5d77356ec3 100644 --- a/src/qibolab/compilers/compiler.py +++ b/src/qibolab/compilers/compiler.py @@ -15,6 +15,7 @@ rz_rule, z_rule, ) +from qibolab.components import Channel from qibolab.platform import Platform from qibolab.pulses import Delay, PulseSequence from qibolab.qubits import QubitId @@ -150,12 +151,13 @@ def compile( measurement_map = {} channel_clock = defaultdict(float) + def find_max(channels: list[Channel]): + return max(channel_clock[ch.name] for ch in channels) + def qubit_clock(el: QubitId): if el in platform.qubits: - return max( - channel_clock[ch.name] for ch in platform.qubits[el].channels - ) - return max(channel_clock[ch.name] for ch in platform.couplers[el].channels) + return find_max(platform.qubits[el].channels) + return find_max(platform.couplers[el].channels) # process circuit gates for moment in circuit.queue.moments: diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index f22a2a19ea..77f186d4b8 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -4,7 +4,7 @@ from collections import defaultdict from dataclasses import asdict, dataclass, field from math import prod -from typing import Any, Optional, TypeVar +from typing import Any, Optional, TypeVar, Union import numpy as np from qibo.config import log, raise_error @@ -122,6 +122,11 @@ def fill(self, options: ExecutionParameters): return options +def _channels_map(elements: Union[QubitMap, CouplerMap]): + """Map channel names to element (qubit or coupler).""" + return {ch.name: id for id, el in elements.items() for ch in el.channels} + + @dataclass class Platform: """Platform for controlling quantum devices.""" @@ -197,9 +202,7 @@ def channels(self) -> list[str]: @property def channels_map(self) -> dict[str, QubitId]: """Channel to element map.""" - return {ch.name: id for id, el in self.qubits.items() for ch in el.channels} | { - ch.name: id for id, el in self.couplers.items() for ch in el.channels - } + return _channels_map(self.qubits) | _channels_map(self.couplers) def config(self, name: str) -> Config: """Returns configuration of given component.""" From ab7f5f2193aed91c389ecca1687cc884f5c2f96b Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Sat, 10 Aug 2024 21:56:41 +0400 Subject: [PATCH 0558/1006] refactor: move kernels to AcquisitionConfig --- src/qibolab/components/configs.py | 14 +++++++++++++- src/qibolab/dummy/platform.py | 4 ++-- src/qibolab/instruments/abstract.py | 6 +++--- src/qibolab/instruments/dummy.py | 1 - src/qibolab/platform/platform.py | 18 ++---------------- src/qibolab/qubits.py | 4 ---- src/qibolab/serialize.py | 27 ++++++++++++--------------- tests/dummy_qrc/zurich/platform.py | 4 ++-- tests/test_platform.py | 23 ++++++++++++++--------- 9 files changed, 48 insertions(+), 53 deletions(-) diff --git a/src/qibolab/components/configs.py b/src/qibolab/components/configs.py index f56589b570..72f63a39ea 100644 --- a/src/qibolab/components/configs.py +++ b/src/qibolab/components/configs.py @@ -7,9 +7,11 @@ configuration defined by these classes. """ -from dataclasses import dataclass +from dataclasses import dataclass, field from typing import Optional, Union +import numpy.typing as npt + __all__ = [ "DcConfig", "IqConfig", @@ -77,8 +79,18 @@ class AcquisitionConfig: """Delay between readout pulse start and acquisition start.""" smearing: float """FIXME:""" + + # FIXME: this is temporary solution to deliver the information to drivers + # until we make acquisition channels first class citizens in the sequences + # so that each acquisition command carries the info with it. threshold: Optional[float] = None + """Signal threshold for discriminating ground and excited states.""" iq_angle: Optional[float] = None + """Signal angle in the IQ-plane for disciminating ground and excited + states.""" + kernel: Optional[npt.NDArray] = field(default=None, repr=False) + """Integration weights to be used when post-processing the acquired + signal.""" Config = Union[DcConfig, IqMixerConfig, OscillatorConfig, IqConfig, AcquisitionConfig] diff --git a/src/qibolab/dummy/platform.py b/src/qibolab/dummy/platform.py index b56f7cb064..05ef378dd4 100644 --- a/src/qibolab/dummy/platform.py +++ b/src/qibolab/dummy/platform.py @@ -32,7 +32,7 @@ def create_dummy(): runcard = load_runcard(FOLDER) kernels = Kernels.load(FOLDER) - qubits, couplers, pairs = load_qubits(runcard, kernels) + qubits, couplers, pairs = load_qubits(runcard) settings = load_settings(runcard) configs = {} @@ -49,7 +49,7 @@ def create_dummy(): ) configs[probe_name] = IqConfig(**component_params[probe_name]) configs[acquisition_name] = AcquisitionConfig( - **component_params[acquisition_name] + **component_params[acquisition_name], kernel=kernels.get(q) ) drive_name = f"qubit_{q}/drive" diff --git a/src/qibolab/instruments/abstract.py b/src/qibolab/instruments/abstract.py index fe219af833..1824f58fb2 100644 --- a/src/qibolab/instruments/abstract.py +++ b/src/qibolab/instruments/abstract.py @@ -4,7 +4,8 @@ import numpy.typing as npt -from qibolab.execution_parameters import ConfigUpdate, ExecutionParameters +from qibolab.components import Config +from qibolab.execution_parameters import ExecutionParameters from qibolab.pulses.sequence import PulseSequence from qibolab.sweeper import ParallelSweepers from qibolab.unrolling import Bounds @@ -80,10 +81,9 @@ def sampling_rate(self) -> int: @abstractmethod def play( self, - updates: list[ConfigUpdate], + configs: dict[str, Config], sequences: list[PulseSequence], options: ExecutionParameters, - integration_setup, sweepers: list[ParallelSweepers], ) -> dict[int, npt.NDArray]: """Play a pulse sequence and retrieve feedback. diff --git a/src/qibolab/instruments/dummy.py b/src/qibolab/instruments/dummy.py index b8556dbb12..30f38d8c33 100644 --- a/src/qibolab/instruments/dummy.py +++ b/src/qibolab/instruments/dummy.py @@ -87,7 +87,6 @@ def play( configs: dict[str, Config], sequences: list[PulseSequence], options: ExecutionParameters, - integration_setup: dict[str, tuple[np.ndarray, float]], sweepers: list[ParallelSweepers], ): def values(pulse: Pulse): diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 77f186d4b8..8e2072b994 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -6,7 +6,6 @@ from math import prod from typing import Any, Optional, TypeVar, Union -import numpy as np from qibo.config import log, raise_error from qibolab.components import Config @@ -23,8 +22,6 @@ CouplerMap = dict[QubitId, Qubit] QubitPairMap = dict[QubitPairId, QubitPair] -IntegrationSetup = dict[str, tuple[np.ndarray, float]] - NS_TO_SEC = 1e-9 # TODO: replace with https://docs.python.org/3/reference/compound_stmts.html#type-params @@ -251,7 +248,6 @@ def _execute( sequences: list[PulseSequence], options: ExecutionParameters, configs: dict[str, Config], - integration_setup: IntegrationSetup, sweepers: list[ParallelSweepers], ): """Execute sequences on the controllers.""" @@ -259,9 +255,7 @@ def _execute( for instrument in self.instruments.values(): if isinstance(instrument, Controller): - new_result = instrument.play( - configs, sequences, options, integration_setup, sweepers - ) + new_result = instrument.play(configs, sequences, options, sweepers) if isinstance(new_result, dict): result.update(new_result) @@ -315,17 +309,9 @@ def execute( if name in self.instruments: self.instruments[name].setup(**asdict(cfg)) - # maps acquisition channel name to corresponding kernel and iq_angle - # FIXME: this is temporary solution to deliver the information to drivers - # until we make acquisition channels first class citizens in the sequences - # so that each acquisition command carries the info with it. - integration_setup: IntegrationSetup = {} - for qubit in self.qubits.values(): - integration_setup[qubit.acquisition.name] = qubit.kernel - results = defaultdict(list) for b in batch(sequences, self._controller.bounds): - result = self._execute(b, options, configs, integration_setup, sweepers) + result = self._execute(b, options, configs, sweepers) for serial, data in result.items(): results[serial].append(data) diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index fd7daf4ea0..645a1f3c1a 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -1,8 +1,6 @@ from dataclasses import dataclass, field, fields from typing import Optional, Union -import numpy as np - from qibolab.components import AcquireChannel, DcChannel, IqChannel from qibolab.native import SingleQubitNatives, TwoQubitNatives @@ -37,8 +35,6 @@ class Qubit: native_gates: SingleQubitNatives = field(default_factory=SingleQubitNatives) - kernel: Optional[np.ndarray] = field(default=None, repr=False) - probe: Optional[IqChannel] = None acquisition: Optional[AcquireChannel] = None drive: Optional[IqChannel] = None diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index 40f26cc971..e72baed208 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -12,6 +12,7 @@ from pydantic import ConfigDict, TypeAdapter +from qibolab.components import AcquisitionConfig from qibolab.execution_parameters import ConfigUpdate from qibolab.kernels import Kernels from qibolab.native import ( @@ -115,9 +116,7 @@ def _load_two_qubit_natives( return pairs -def load_qubits( - runcard: dict, kernels: Optional[Kernels] = None -) -> tuple[QubitMap, QubitMap, QubitPairMap]: +def load_qubits(runcard: dict) -> tuple[QubitMap, QubitMap, QubitPairMap]: """Load qubits, couplers and pairs from the runcard. Uses the native gate section of the runcard to parse the @@ -125,17 +124,9 @@ def load_qubits( :class: `qibolab.qubits.QubitPair` objects. """ native_gates = runcard.get("native_gates", {}) - qubits = _load_single_qubit_natives(native_gates.get("single_qubit", {})) - - if kernels is not None: - for q in kernels: - qubits[q].kernel = kernels[q] - couplers = _load_single_qubit_natives(native_gates.get("coupler", {})) - pairs = _load_two_qubit_natives(native_gates.get("two_qubit", {}), qubits) - return qubits, couplers, pairs @@ -226,7 +217,12 @@ def dump_instruments(instruments: InstrumentMap) -> dict: def dump_component_configs(component_configs) -> dict: """Dump channel configs.""" - return {name: asdict(cfg) for name, cfg in component_configs.items()} + components = {} + for name, cfg in component_configs.items(): + components[name] = asdict(cfg) + if isinstance(cfg, AcquisitionConfig): + del components[name]["kernel"] + return components def dump_runcard( @@ -272,11 +268,12 @@ def dump_kernels(platform: Platform, path: Path): # create kernels kernels = Kernels() for qubit in platform.qubits.values(): - if qubit.kernel is not None: - kernels[qubit.name] = qubit.kernel + kernel = platform.configs[qubit.acquisition.name].kernel + if kernel is not None: + kernels[qubit.name] = kernel # dump only if not None - if kernels: + if len(kernels) > 0: kernels.dump(path) diff --git a/tests/dummy_qrc/zurich/platform.py b/tests/dummy_qrc/zurich/platform.py index bee4919f03..a98c6859b1 100644 --- a/tests/dummy_qrc/zurich/platform.py +++ b/tests/dummy_qrc/zurich/platform.py @@ -45,7 +45,7 @@ def create(): runcard = load_runcard(FOLDER) kernels = Kernels.load(FOLDER) - qubits, couplers, pairs = load_qubits(runcard, kernels) + qubits, couplers, pairs = load_qubits(runcard) settings = load_settings(runcard) configs = {} @@ -74,7 +74,7 @@ def create(): ) configs[acquisition_name] = ZiAcquisitionConfig( - **component_params[acquisition_name] + **component_params[acquisition_name], kernel=kernels.get(q) ) qubits[q].acquisition = AcquireChannel( name=acquisition_name, diff --git a/tests/test_platform.py b/tests/test_platform.py index f6318e4050..dd216c7033 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -5,6 +5,7 @@ import os import pathlib import warnings +from dataclasses import replace from pathlib import Path import numpy as np @@ -14,7 +15,7 @@ from qibolab import create_platform from qibolab.backends import QibolabBackend -from qibolab.components import IqConfig, OscillatorConfig +from qibolab.components import AcquisitionConfig, IqConfig, OscillatorConfig from qibolab.dummy import create_dummy from qibolab.dummy.platform import FOLDER from qibolab.execution_parameters import ExecutionParameters @@ -184,15 +185,17 @@ def test_kernels(tmp_path, has_kernels): platform = create_dummy() if has_kernels: - for qubit in platform.qubits: - platform.qubits[qubit].kernel = np.random.rand(10) + for name, config in platform.configs.items(): + if isinstance(config, AcquisitionConfig): + platform.configs[name] = replace(config, kernel=np.random.rand(10)) dump_kernels(platform, tmp_path) if has_kernels: kernels = Kernels.load(tmp_path) - for qubit in platform.qubits: - np.testing.assert_array_equal(platform.qubits[qubit].kernel, kernels[qubit]) + for qubit in platform.qubits.values(): + kernel = platform.configs[qubit.acquisition.name].kernel + np.testing.assert_array_equal(kernel, kernels[qubit.name]) else: with pytest.raises(FileNotFoundError): Kernels.load(tmp_path) @@ -204,16 +207,18 @@ def test_dump_platform(tmp_path, has_kernels): platform = create_dummy() if has_kernels: - for qubit in platform.qubits: - platform.qubits[qubit].kernel = np.random.rand(10) + for name, config in platform.configs.items(): + if isinstance(config, AcquisitionConfig): + platform.configs[name] = replace(config, kernel=np.random.rand(10)) dump_platform(platform, tmp_path) settings = load_settings(load_runcard(tmp_path)) if has_kernels: kernels = Kernels.load(tmp_path) - for qubit in platform.qubits: - np.testing.assert_array_equal(platform.qubits[qubit].kernel, kernels[qubit]) + for qubit in platform.qubits.values(): + kernel = platform.configs[qubit.acquisition.name].kernel + np.testing.assert_array_equal(kernel, kernels[qubit.name]) assert settings == platform.settings From 3318250bcc8d707d10cfebb0db971421a245e2ae Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Sun, 11 Aug 2024 13:49:21 +0400 Subject: [PATCH 0559/1006] chore: apply suggestion from review --- src/qibolab/compilers/compiler.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/qibolab/compilers/compiler.py b/src/qibolab/compilers/compiler.py index 5d77356ec3..c23308e31f 100644 --- a/src/qibolab/compilers/compiler.py +++ b/src/qibolab/compilers/compiler.py @@ -155,9 +155,8 @@ def find_max(channels: list[Channel]): return max(channel_clock[ch.name] for ch in channels) def qubit_clock(el: QubitId): - if el in platform.qubits: - return find_max(platform.qubits[el].channels) - return find_max(platform.couplers[el].channels) + elements = platform.qubits if el in platform.qubits else platform.couplers + return max(channel_clock[ch.name] for ch in elements[el].channels) # process circuit gates for moment in circuit.queue.moments: From 1cdcfe131e303e1a1c5d16eb6533f299b4b7d5c9 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Sat, 10 Aug 2024 20:48:50 +0400 Subject: [PATCH 0560/1006] refactor: reduce code repetition for qubits and couplers --- src/qibolab/compilers/compiler.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/qibolab/compilers/compiler.py b/src/qibolab/compilers/compiler.py index c23308e31f..6a2496676f 100644 --- a/src/qibolab/compilers/compiler.py +++ b/src/qibolab/compilers/compiler.py @@ -151,6 +151,9 @@ def compile( measurement_map = {} channel_clock = defaultdict(float) + def find_max(channels: list[Channel]): + return max(channel_clock[ch.name] for ch in channels) + def find_max(channels: list[Channel]): return max(channel_clock[ch.name] for ch in channels) From 3f043bd9b376a70e662aa245ef7b86d6ff07829c Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Sun, 11 Aug 2024 14:57:27 +0400 Subject: [PATCH 0561/1006] fix: update QM driver for new sequence layout --- src/qibolab/instruments/qm/controller.py | 98 ++++++++++--------- .../instruments/qm/program/instructions.py | 19 ++-- 2 files changed, 61 insertions(+), 56 deletions(-) diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 482b883608..5bafbf8153 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -11,7 +11,7 @@ from qm.simulate.credentials import create_credentials from qualang_tools.simulator_tools import create_simulator_controller_connections -from qibolab.components import Channel, Config, DcChannel, IqChannel +from qibolab.components import Channel, ChannelId, Config, DcChannel, IqChannel from qibolab.execution_parameters import ExecutionParameters from qibolab.instruments.abstract import Controller from qibolab.pulses import Delay, Pulse, PulseSequence, VirtualZ @@ -273,8 +273,19 @@ def configure_channel(self, channel: QmChannel, configs: dict[str, Config]): else: raise TypeError(f"Unknown channel type: {type(channel)}.") + def configure_channels( + self, + configs: dict[str, Config], + channels: set[ChannelId], + ): + """Register channels participating in the sequence in the QM + ``config``.""" + for channel_name in channels: + channel = self.channels[channel_name] + self.configure_channel(channel, configs) + def register_pulse(self, channel: Channel, pulse: Pulse): - """Add pulse in the ``config``.""" + """Add pulse in the QM ``config``.""" # if ( # pulse.duration % 4 != 0 # or pulse.duration < 16 @@ -289,46 +300,45 @@ def register_pulse(self, channel: Channel, pulse: Pulse): return self.config.register_iq_pulse(channel.name, pulse) return self.config.register_acquisition_pulse(channel.name, pulse) - def register_pulses(self, configs, sequence, integration_setup, options): - """Adds all pulses of a given :class:`qibolab.pulses.PulseSequence` in - the ``config``. + def register_pulses( + self, + configs: dict[str, Config], + sequence: PulseSequence, + options: ExecutionParameters, + ): + """Adds all pulses of a given sequence in the QM ``config``. Returns: acquisitions (dict): Map from measurement instructions to acquisition objects. """ acquisitions = {} - for name, channel_sequence in sequence.items(): - channel = self.channels[name] - self.configure_channel(channel, configs) - - for pulse in channel_sequence: - if isinstance(pulse, (Delay, VirtualZ)): - continue - - logical_channel = channel.logical_channel - op = self.register_pulse(logical_channel, pulse) - - if ( - isinstance(logical_channel, IqChannel) - and logical_channel.acquisition is not None - ): - kernel, threshold, iq_angle = integration_setup[ - logical_channel.acquisition - ] - self.config.register_integration_weights( - name, pulse.duration, kernel + for channel_name, pulse in sequence: + if isinstance(pulse, (Delay, VirtualZ)): + continue + + channel = self.channels[channel_name] + logical_channel = channel.logical_channel + op = self.register_pulse(logical_channel, pulse) + + if ( + isinstance(logical_channel, IqChannel) + and logical_channel.acquisition is not None + ): + acq_config = configs[logical_channel.acquisition] + self.config.register_integration_weights( + channel_name, pulse.duration, acq_config.kernel + ) + if (op, channel_name) in acquisitions: + acquisition = acquisitions[(op, channel_name)] + else: + acquisition = acquisitions[(op, channel_name)] = create_acquisition( + op, + channel_name, + options, + acq_config.threshold, + acq_config.iq_angle, ) - if (op, name) in acquisitions: - acquisition = acquisitions[(op, name)] - else: - acquisition = acquisitions[(op, name)] = create_acquisition( - op, - name, - options, - threshold, - iq_angle, - ) - acquisition.keys.append(pulse.id) + acquisition.keys.append(pulse.id) return acquisitions @@ -352,7 +362,6 @@ def play( configs: dict[str, Config], sequences: list[PulseSequence], options: ExecutionParameters, - integration_setup, sweepers: list[ParallelSweepers], ): if len(sequences) > 1: @@ -367,9 +376,8 @@ def play( self.configure_channel(channel, configs) sequence = sequences[0] - acquisitions = self.register_pulses( - configs, sequence, integration_setup, options - ) + self.configure_channels(configs, sequence.channels) + acquisitions = self.register_pulses(configs, sequence, options) experiment = program(configs, sequence, options, acquisitions, sweepers) if self.manager is None: @@ -380,19 +388,17 @@ def play( if self.script_file_name is not None: script = generate_qua_script(experiment, asdict(self.config)) - for pulses in sequence.values(): - for pulse in pulses: - script = script.replace(operation(pulse), str(pulse)) + for _, pulse in sequence: + script = script.replace(operation(pulse), str(pulse)) with open(self.script_file_name, "w") as file: file.write(script) if self.simulation_duration is not None: result = self.simulate_program(experiment) results = {} - for channel_name, pulses in sequence.items(): + for channel_name, pulse in sequence: if self.channels[channel_name].logical_channel.acquisition is not None: - for pulse in pulses: - results[pulse.id] = result + results[pulse.id] = result return results result = self.execute_program(experiment) diff --git a/src/qibolab/instruments/qm/program/instructions.py b/src/qibolab/instruments/qm/program/instructions.py index b4e1616d57..57120ae111 100644 --- a/src/qibolab/instruments/qm/program/instructions.py +++ b/src/qibolab/instruments/qm/program/instructions.py @@ -18,7 +18,7 @@ def _delay(pulse: Delay, element: str, parameters: Parameters): # TODO: How to play delays on multiple elements? if parameters.duration is None: - duration = pulse.duration // 4 + 1 + duration = int(pulse.duration) // 4 + 1 else: duration = parameters.duration qua.wait(duration, element) @@ -50,15 +50,14 @@ def play(args: ExecutionArguments): Should be used inside a ``program()`` context. """ qua.align() - for element, pulses in args.sequence.items(): - for pulse in pulses: - op = operation(pulse) - params = args.parameters[op] - if isinstance(pulse, Delay): - _delay(pulse, element, params) - else: - acquisition = args.acquisitions.get((op, element)) - _play(op, element, params, acquisition) + for element, pulse in args.sequence: + op = operation(pulse) + params = args.parameters[op] + if isinstance(pulse, Delay): + _delay(pulse, element, params) + else: + acquisition = args.acquisitions.get((op, element)) + _play(op, element, params, acquisition) if args.relaxation_time > 0: qua.wait(args.relaxation_time // 4) From c31903c3705b9ddab5dcc7c456d09f39808eb0b7 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 13 Aug 2024 14:18:33 +0400 Subject: [PATCH 0562/1006] chore: drop find_max function as it is not used --- src/qibolab/compilers/compiler.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/qibolab/compilers/compiler.py b/src/qibolab/compilers/compiler.py index 6a2496676f..06bbba2636 100644 --- a/src/qibolab/compilers/compiler.py +++ b/src/qibolab/compilers/compiler.py @@ -15,7 +15,6 @@ rz_rule, z_rule, ) -from qibolab.components import Channel from qibolab.platform import Platform from qibolab.pulses import Delay, PulseSequence from qibolab.qubits import QubitId @@ -151,12 +150,6 @@ def compile( measurement_map = {} channel_clock = defaultdict(float) - def find_max(channels: list[Channel]): - return max(channel_clock[ch.name] for ch in channels) - - def find_max(channels: list[Channel]): - return max(channel_clock[ch.name] for ch in channels) - def qubit_clock(el: QubitId): elements = platform.qubits if el in platform.qubits else platform.couplers return max(channel_clock[ch.name] for ch in elements[el].channels) From 5d9423184576ec811a7078facf217ce69d3924d6 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 16 Aug 2024 16:45:05 +0200 Subject: [PATCH 0563/1006] chore: Poetry lock --- poetry.lock | 714 +++++++++++++++++++++++++++------------------------- 1 file changed, 375 insertions(+), 339 deletions(-) diff --git a/poetry.lock b/poetry.lock index 469d2da859..31ed3766a9 100644 --- a/poetry.lock +++ b/poetry.lock @@ -24,13 +24,13 @@ files = [ [[package]] name = "antlr4-python3-runtime" -version = "4.11.1" -description = "ANTLR 4.11.1 runtime for Python 3" +version = "4.13.2" +description = "ANTLR 4.13.2 runtime for Python 3" optional = false python-versions = "*" files = [ - {file = "antlr4-python3-runtime-4.11.1.tar.gz", hash = "sha256:a53de701312f9bdacc5258a6872cd6c62b90d3a90ae25e494026f76267333b60"}, - {file = "antlr4_python3_runtime-4.11.1-py3-none-any.whl", hash = "sha256:ff1954eda1ca9072c02bf500387d0c86cb549bef4dbb3b64f39468b547ec5f6b"}, + {file = "antlr4_python3_runtime-4.13.2-py3-none-any.whl", hash = "sha256:fe3835eb8d33daece0e799090eda89719dbccee7aa39ef94eed3818cafa5a7e8"}, + {file = "antlr4_python3_runtime-4.13.2.tar.gz", hash = "sha256:909b647e1d2fc2b70180ac586df3933e38919c85f98ccc656a96cd3f25ef3916"}, ] [[package]] @@ -103,13 +103,13 @@ test = ["pytest", "uvloop"] [[package]] name = "attrs" -version = "24.1.0" +version = "24.2.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.7" files = [ - {file = "attrs-24.1.0-py3-none-any.whl", hash = "sha256:377b47448cb61fea38533f671fba0d0f8a96fd58facd4dc518e3dac9dbea0905"}, - {file = "attrs-24.1.0.tar.gz", hash = "sha256:adbdec84af72d38be7628e353a09b6a6790d15cd71819f6e9d7b0faa8a125745"}, + {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, + {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, ] [package.extras] @@ -159,13 +159,13 @@ typing-extensions = ">=4.0.0" [[package]] name = "babel" -version = "2.15.0" +version = "2.16.0" description = "Internationalization utilities" optional = false python-versions = ">=3.8" files = [ - {file = "Babel-2.15.0-py3-none-any.whl", hash = "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb"}, - {file = "babel-2.15.0.tar.gz", hash = "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413"}, + {file = "babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b"}, + {file = "babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"}, ] [package.extras] @@ -302,63 +302,78 @@ files = [ [[package]] name = "cffi" -version = "1.16.0" +version = "1.17.0" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" files = [ - {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, - {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, - {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, - {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, - {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, - {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, - {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, - {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, - {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, - {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, - {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, - {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, - {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, - {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, - {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, + {file = "cffi-1.17.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f9338cc05451f1942d0d8203ec2c346c830f8e86469903d5126c1f0a13a2bcbb"}, + {file = "cffi-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0ce71725cacc9ebf839630772b07eeec220cbb5f03be1399e0457a1464f8e1a"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c815270206f983309915a6844fe994b2fa47e5d05c4c4cef267c3b30e34dbe42"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6bdcd415ba87846fd317bee0774e412e8792832e7805938987e4ede1d13046d"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a98748ed1a1df4ee1d6f927e151ed6c1a09d5ec21684de879c7ea6aa96f58f2"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0a048d4f6630113e54bb4b77e315e1ba32a5a31512c31a273807d0027a7e69ab"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24aa705a5f5bd3a8bcfa4d123f03413de5d86e497435693b638cbffb7d5d8a1b"}, + {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:856bf0924d24e7f93b8aee12a3a1095c34085600aa805693fb7f5d1962393206"}, + {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:4304d4416ff032ed50ad6bb87416d802e67139e31c0bde4628f36a47a3164bfa"}, + {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:331ad15c39c9fe9186ceaf87203a9ecf5ae0ba2538c9e898e3a6967e8ad3db6f"}, + {file = "cffi-1.17.0-cp310-cp310-win32.whl", hash = "sha256:669b29a9eca6146465cc574659058ed949748f0809a2582d1f1a324eb91054dc"}, + {file = "cffi-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:48b389b1fd5144603d61d752afd7167dfd205973a43151ae5045b35793232aa2"}, + {file = "cffi-1.17.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c5d97162c196ce54af6700949ddf9409e9833ef1003b4741c2b39ef46f1d9720"}, + {file = "cffi-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5ba5c243f4004c750836f81606a9fcb7841f8874ad8f3bf204ff5e56332b72b9"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bb9333f58fc3a2296fb1d54576138d4cf5d496a2cc118422bd77835e6ae0b9cb"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:435a22d00ec7d7ea533db494da8581b05977f9c37338c80bc86314bec2619424"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1df34588123fcc88c872f5acb6f74ae59e9d182a2707097f9e28275ec26a12d"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df8bb0010fdd0a743b7542589223a2816bdde4d94bb5ad67884348fa2c1c67e8"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8b5b9712783415695663bd463990e2f00c6750562e6ad1d28e072a611c5f2a6"}, + {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ffef8fd58a36fb5f1196919638f73dd3ae0db1a878982b27a9a5a176ede4ba91"}, + {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e67d26532bfd8b7f7c05d5a766d6f437b362c1bf203a3a5ce3593a645e870b8"}, + {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:45f7cd36186db767d803b1473b3c659d57a23b5fa491ad83c6d40f2af58e4dbb"}, + {file = "cffi-1.17.0-cp311-cp311-win32.whl", hash = "sha256:a9015f5b8af1bb6837a3fcb0cdf3b874fe3385ff6274e8b7925d81ccaec3c5c9"}, + {file = "cffi-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:b50aaac7d05c2c26dfd50c3321199f019ba76bb650e346a6ef3616306eed67b0"}, + {file = "cffi-1.17.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aec510255ce690d240f7cb23d7114f6b351c733a74c279a84def763660a2c3bc"}, + {file = "cffi-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2770bb0d5e3cc0e31e7318db06efcbcdb7b31bcb1a70086d3177692a02256f59"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db9a30ec064129d605d0f1aedc93e00894b9334ec74ba9c6bdd08147434b33eb"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a47eef975d2b8b721775a0fa286f50eab535b9d56c70a6e62842134cf7841195"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f3e0992f23bbb0be00a921eae5363329253c3b86287db27092461c887b791e5e"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6107e445faf057c118d5050560695e46d272e5301feffda3c41849641222a828"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb862356ee9391dc5a0b3cbc00f416b48c1b9a52d252d898e5b7696a5f9fe150"}, + {file = "cffi-1.17.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c1c13185b90bbd3f8b5963cd8ce7ad4ff441924c31e23c975cb150e27c2bf67a"}, + {file = "cffi-1.17.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:17c6d6d3260c7f2d94f657e6872591fe8733872a86ed1345bda872cfc8c74885"}, + {file = "cffi-1.17.0-cp312-cp312-win32.whl", hash = "sha256:c3b8bd3133cd50f6b637bb4322822c94c5ce4bf0d724ed5ae70afce62187c492"}, + {file = "cffi-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:dca802c8db0720ce1c49cce1149ff7b06e91ba15fa84b1d59144fef1a1bc7ac2"}, + {file = "cffi-1.17.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6ce01337d23884b21c03869d2f68c5523d43174d4fc405490eb0091057943118"}, + {file = "cffi-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cab2eba3830bf4f6d91e2d6718e0e1c14a2f5ad1af68a89d24ace0c6b17cced7"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14b9cbc8f7ac98a739558eb86fabc283d4d564dafed50216e7f7ee62d0d25377"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b00e7bcd71caa0282cbe3c90966f738e2db91e64092a877c3ff7f19a1628fdcb"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:41f4915e09218744d8bae14759f983e466ab69b178de38066f7579892ff2a555"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4760a68cab57bfaa628938e9c2971137e05ce48e762a9cb53b76c9b569f1204"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:011aff3524d578a9412c8b3cfaa50f2c0bd78e03eb7af7aa5e0df59b158efb2f"}, + {file = "cffi-1.17.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:a003ac9edc22d99ae1286b0875c460351f4e101f8c9d9d2576e78d7e048f64e0"}, + {file = "cffi-1.17.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ef9528915df81b8f4c7612b19b8628214c65c9b7f74db2e34a646a0a2a0da2d4"}, + {file = "cffi-1.17.0-cp313-cp313-win32.whl", hash = "sha256:70d2aa9fb00cf52034feac4b913181a6e10356019b18ef89bc7c12a283bf5f5a"}, + {file = "cffi-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:b7b6ea9e36d32582cda3465f54c4b454f62f23cb083ebc7a94e2ca6ef011c3a7"}, + {file = "cffi-1.17.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:964823b2fc77b55355999ade496c54dde161c621cb1f6eac61dc30ed1b63cd4c"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:516a405f174fd3b88829eabfe4bb296ac602d6a0f68e0d64d5ac9456194a5b7e"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dec6b307ce928e8e112a6bb9921a1cb00a0e14979bf28b98e084a4b8a742bd9b"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4094c7b464cf0a858e75cd14b03509e84789abf7b79f8537e6a72152109c76e"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2404f3de742f47cb62d023f0ba7c5a916c9c653d5b368cc966382ae4e57da401"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3aa9d43b02a0c681f0bfbc12d476d47b2b2b6a3f9287f11ee42989a268a1833c"}, + {file = "cffi-1.17.0-cp38-cp38-win32.whl", hash = "sha256:0bb15e7acf8ab35ca8b24b90af52c8b391690ef5c4aec3d31f38f0d37d2cc499"}, + {file = "cffi-1.17.0-cp38-cp38-win_amd64.whl", hash = "sha256:93a7350f6706b31f457c1457d3a3259ff9071a66f312ae64dc024f049055f72c"}, + {file = "cffi-1.17.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1a2ddbac59dc3716bc79f27906c010406155031a1c801410f1bafff17ea304d2"}, + {file = "cffi-1.17.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6327b572f5770293fc062a7ec04160e89741e8552bf1c358d1a23eba68166759"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbc183e7bef690c9abe5ea67b7b60fdbca81aa8da43468287dae7b5c046107d4"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bdc0f1f610d067c70aa3737ed06e2726fd9d6f7bfee4a351f4c40b6831f4e82"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6d872186c1617d143969defeadac5a904e6e374183e07977eedef9c07c8953bf"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d46ee4764b88b91f16661a8befc6bfb24806d885e27436fdc292ed7e6f6d058"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f76a90c345796c01d85e6332e81cab6d70de83b829cf1d9762d0a3da59c7932"}, + {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0e60821d312f99d3e1569202518dddf10ae547e799d75aef3bca3a2d9e8ee693"}, + {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:eb09b82377233b902d4c3fbeeb7ad731cdab579c6c6fda1f763cd779139e47c3"}, + {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:24658baf6224d8f280e827f0a50c46ad819ec8ba380a42448e24459daf809cf4"}, + {file = "cffi-1.17.0-cp39-cp39-win32.whl", hash = "sha256:0fdacad9e0d9fc23e519efd5ea24a70348305e8d7d85ecbb1a5fa66dc834e7fb"}, + {file = "cffi-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:7cbc78dc018596315d4e7841c8c3a7ae31cc4d638c9b627f87d52e8abaaf2d29"}, + {file = "cffi-1.17.0.tar.gz", hash = "sha256:f3157624b7558b914cb039fd1af735e5e8049a87c817cc215109ad1c8779df76"}, ] [package.dependencies] @@ -871,13 +886,13 @@ files = [ [[package]] name = "datadog-api-client" -version = "2.26.0" +version = "2.27.0" description = "Collection of all Datadog Public endpoints" optional = false python-versions = ">=3.7" files = [ - {file = "datadog_api_client-2.26.0-py3-none-any.whl", hash = "sha256:47a94516df51bae0c0556a6d6d7a0f43557afb4fef081e00a264aa0483b7f817"}, - {file = "datadog_api_client-2.26.0.tar.gz", hash = "sha256:3f376f1300984cbb2f51b3eceadfbb30c93938cadb5e93e60563781e07d67e6c"}, + {file = "datadog_api_client-2.27.0-py3-none-any.whl", hash = "sha256:8d0d96fa6930e7556644a1d6f6f8cde4102055851c5f55d4e5c0e7ea54e2206b"}, + {file = "datadog_api_client-2.27.0.tar.gz", hash = "sha256:902dd264feaf74fd8749897497f01d7f47e2190dc4362765fec805c197e498cc"}, ] [package.dependencies] @@ -1250,13 +1265,13 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-auth" -version = "2.32.0" +version = "2.33.0" description = "Google Authentication Library" optional = false python-versions = ">=3.7" files = [ - {file = "google_auth-2.32.0-py2.py3-none-any.whl", hash = "sha256:53326ea2ebec768070a94bee4e1b9194c9646ea0c2bd72422785bd0f9abfad7b"}, - {file = "google_auth-2.32.0.tar.gz", hash = "sha256:49315be72c55a6a37d62819e3573f6b416aca00721f7e3e31a008d928bf64022"}, + {file = "google_auth-2.33.0-py2.py3-none-any.whl", hash = "sha256:8eff47d0d4a34ab6265c50a106a3362de6a9975bb08998700e389f857e4d39df"}, + {file = "google_auth-2.33.0.tar.gz", hash = "sha256:d6a52342160d7290e334b4d47ba390767e4438ad0d45b7630774533e82655b95"}, ] [package.dependencies] @@ -1588,21 +1603,21 @@ test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "p [[package]] name = "importlib-resources" -version = "6.4.0" +version = "6.4.2" description = "Read resources from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_resources-6.4.0-py3-none-any.whl", hash = "sha256:50d10f043df931902d4194ea07ec57960f66a80449ff867bfe782b4c486ba78c"}, - {file = "importlib_resources-6.4.0.tar.gz", hash = "sha256:cdb2b453b8046ca4e3798eb1d84f3cce1446a0e8e7b5ef4efb600f19fc398145"}, + {file = "importlib_resources-6.4.2-py3-none-any.whl", hash = "sha256:8bba8c54a8a3afaa1419910845fa26ebd706dc716dd208d9b158b4b6966f5c5c"}, + {file = "importlib_resources-6.4.2.tar.gz", hash = "sha256:6cbfbefc449cc6e2095dd184691b7a12a04f40bc75dd4c55d31c34f174cdf57a"}, ] [package.dependencies] zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["jaraco.test (>=5.4)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)", "zipp (>=3.17)"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +test = ["jaraco.test (>=5.4)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)", "zipp (>=3.17)"] [[package]] name = "iniconfig" @@ -2245,40 +2260,51 @@ marshmallow = ">=3.0.0b10" [[package]] name = "matplotlib" -version = "3.9.0" +version = "3.9.2" description = "Python plotting package" optional = false python-versions = ">=3.9" files = [ - {file = "matplotlib-3.9.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2bcee1dffaf60fe7656183ac2190bd630842ff87b3153afb3e384d966b57fe56"}, - {file = "matplotlib-3.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3f988bafb0fa39d1074ddd5bacd958c853e11def40800c5824556eb630f94d3b"}, - {file = "matplotlib-3.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe428e191ea016bb278758c8ee82a8129c51d81d8c4bc0846c09e7e8e9057241"}, - {file = "matplotlib-3.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaf3978060a106fab40c328778b148f590e27f6fa3cd15a19d6892575bce387d"}, - {file = "matplotlib-3.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2e7f03e5cbbfacdd48c8ea394d365d91ee8f3cae7e6ec611409927b5ed997ee4"}, - {file = "matplotlib-3.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:13beb4840317d45ffd4183a778685e215939be7b08616f431c7795276e067463"}, - {file = "matplotlib-3.9.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:063af8587fceeac13b0936c42a2b6c732c2ab1c98d38abc3337e430e1ff75e38"}, - {file = "matplotlib-3.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9a2fa6d899e17ddca6d6526cf6e7ba677738bf2a6a9590d702c277204a7c6152"}, - {file = "matplotlib-3.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:550cdda3adbd596078cca7d13ed50b77879104e2e46392dcd7c75259d8f00e85"}, - {file = "matplotlib-3.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76cce0f31b351e3551d1f3779420cf8f6ec0d4a8cf9c0237a3b549fd28eb4abb"}, - {file = "matplotlib-3.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c53aeb514ccbbcbab55a27f912d79ea30ab21ee0531ee2c09f13800efb272674"}, - {file = "matplotlib-3.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:a5be985db2596d761cdf0c2eaf52396f26e6a64ab46bd8cd810c48972349d1be"}, - {file = "matplotlib-3.9.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:c79f3a585f1368da6049318bdf1f85568d8d04b2e89fc24b7e02cc9b62017382"}, - {file = "matplotlib-3.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bdd1ecbe268eb3e7653e04f451635f0fb0f77f07fd070242b44c076c9106da84"}, - {file = "matplotlib-3.9.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d38e85a1a6d732f645f1403ce5e6727fd9418cd4574521d5803d3d94911038e5"}, - {file = "matplotlib-3.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a490715b3b9984fa609116481b22178348c1a220a4499cda79132000a79b4db"}, - {file = "matplotlib-3.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8146ce83cbc5dc71c223a74a1996d446cd35cfb6a04b683e1446b7e6c73603b7"}, - {file = "matplotlib-3.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:d91a4ffc587bacf5c4ce4ecfe4bcd23a4b675e76315f2866e588686cc97fccdf"}, - {file = "matplotlib-3.9.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:616fabf4981a3b3c5a15cd95eba359c8489c4e20e03717aea42866d8d0465956"}, - {file = "matplotlib-3.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cd53c79fd02f1c1808d2cfc87dd3cf4dbc63c5244a58ee7944497107469c8d8a"}, - {file = "matplotlib-3.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06a478f0d67636554fa78558cfbcd7b9dba85b51f5c3b5a0c9be49010cf5f321"}, - {file = "matplotlib-3.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81c40af649d19c85f8073e25e5806926986806fa6d54be506fbf02aef47d5a89"}, - {file = "matplotlib-3.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52146fc3bd7813cc784562cb93a15788be0b2875c4655e2cc6ea646bfa30344b"}, - {file = "matplotlib-3.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:0fc51eaa5262553868461c083d9adadb11a6017315f3a757fc45ec6ec5f02888"}, - {file = "matplotlib-3.9.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bd4f2831168afac55b881db82a7730992aa41c4f007f1913465fb182d6fb20c0"}, - {file = "matplotlib-3.9.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:290d304e59be2b33ef5c2d768d0237f5bd132986bdcc66f80bc9bcc300066a03"}, - {file = "matplotlib-3.9.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ff2e239c26be4f24bfa45860c20ffccd118d270c5b5d081fa4ea409b5469fcd"}, - {file = "matplotlib-3.9.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:af4001b7cae70f7eaacfb063db605280058246de590fa7874f00f62259f2df7e"}, - {file = "matplotlib-3.9.0.tar.gz", hash = "sha256:e6d29ea6c19e34b30fb7d88b7081f869a03014f66fe06d62cc77d5a6ea88ed7a"}, + {file = "matplotlib-3.9.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:9d78bbc0cbc891ad55b4f39a48c22182e9bdaea7fc0e5dbd364f49f729ca1bbb"}, + {file = "matplotlib-3.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c375cc72229614632c87355366bdf2570c2dac01ac66b8ad048d2dabadf2d0d4"}, + {file = "matplotlib-3.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d94ff717eb2bd0b58fe66380bd8b14ac35f48a98e7c6765117fe67fb7684e64"}, + {file = "matplotlib-3.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab68d50c06938ef28681073327795c5db99bb4666214d2d5f880ed11aeaded66"}, + {file = "matplotlib-3.9.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:65aacf95b62272d568044531e41de26285d54aec8cb859031f511f84bd8b495a"}, + {file = "matplotlib-3.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:3fd595f34aa8a55b7fc8bf9ebea8aa665a84c82d275190a61118d33fbc82ccae"}, + {file = "matplotlib-3.9.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d8dd059447824eec055e829258ab092b56bb0579fc3164fa09c64f3acd478772"}, + {file = "matplotlib-3.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c797dac8bb9c7a3fd3382b16fe8f215b4cf0f22adccea36f1545a6d7be310b41"}, + {file = "matplotlib-3.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d719465db13267bcef19ea8954a971db03b9f48b4647e3860e4bc8e6ed86610f"}, + {file = "matplotlib-3.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8912ef7c2362f7193b5819d17dae8629b34a95c58603d781329712ada83f9447"}, + {file = "matplotlib-3.9.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7741f26a58a240f43bee74965c4882b6c93df3e7eb3de160126d8c8f53a6ae6e"}, + {file = "matplotlib-3.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:ae82a14dab96fbfad7965403c643cafe6515e386de723e498cf3eeb1e0b70cc7"}, + {file = "matplotlib-3.9.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ac43031375a65c3196bee99f6001e7fa5bdfb00ddf43379d3c0609bdca042df9"}, + {file = "matplotlib-3.9.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:be0fc24a5e4531ae4d8e858a1a548c1fe33b176bb13eff7f9d0d38ce5112a27d"}, + {file = "matplotlib-3.9.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf81de2926c2db243c9b2cbc3917619a0fc85796c6ba4e58f541df814bbf83c7"}, + {file = "matplotlib-3.9.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6ee45bc4245533111ced13f1f2cace1e7f89d1c793390392a80c139d6cf0e6c"}, + {file = "matplotlib-3.9.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:306c8dfc73239f0e72ac50e5a9cf19cc4e8e331dd0c54f5e69ca8758550f1e1e"}, + {file = "matplotlib-3.9.2-cp312-cp312-win_amd64.whl", hash = "sha256:5413401594cfaff0052f9d8b1aafc6d305b4bd7c4331dccd18f561ff7e1d3bd3"}, + {file = "matplotlib-3.9.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:18128cc08f0d3cfff10b76baa2f296fc28c4607368a8402de61bb3f2eb33c7d9"}, + {file = "matplotlib-3.9.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4876d7d40219e8ae8bb70f9263bcbe5714415acfdf781086601211335e24f8aa"}, + {file = "matplotlib-3.9.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d9f07a80deab4bb0b82858a9e9ad53d1382fd122be8cde11080f4e7dfedb38b"}, + {file = "matplotlib-3.9.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7c0410f181a531ec4e93bbc27692f2c71a15c2da16766f5ba9761e7ae518413"}, + {file = "matplotlib-3.9.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:909645cce2dc28b735674ce0931a4ac94e12f5b13f6bb0b5a5e65e7cea2c192b"}, + {file = "matplotlib-3.9.2-cp313-cp313-win_amd64.whl", hash = "sha256:f32c7410c7f246838a77d6d1eff0c0f87f3cb0e7c4247aebea71a6d5a68cab49"}, + {file = "matplotlib-3.9.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:37e51dd1c2db16ede9cfd7b5cabdfc818b2c6397c83f8b10e0e797501c963a03"}, + {file = "matplotlib-3.9.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b82c5045cebcecd8496a4d694d43f9cc84aeeb49fe2133e036b207abe73f4d30"}, + {file = "matplotlib-3.9.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f053c40f94bc51bc03832a41b4f153d83f2062d88c72b5e79997072594e97e51"}, + {file = "matplotlib-3.9.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbe196377a8248972f5cede786d4c5508ed5f5ca4a1e09b44bda889958b33f8c"}, + {file = "matplotlib-3.9.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5816b1e1fe8c192cbc013f8f3e3368ac56fbecf02fb41b8f8559303f24c5015e"}, + {file = "matplotlib-3.9.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:cef2a73d06601437be399908cf13aee74e86932a5ccc6ccdf173408ebc5f6bb2"}, + {file = "matplotlib-3.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e0830e188029c14e891fadd99702fd90d317df294c3298aad682739c5533721a"}, + {file = "matplotlib-3.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ba9c1299c920964e8d3857ba27173b4dbb51ca4bab47ffc2c2ba0eb5e2cbc5"}, + {file = "matplotlib-3.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1cd93b91ab47a3616b4d3c42b52f8363b88ca021e340804c6ab2536344fad9ca"}, + {file = "matplotlib-3.9.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6d1ce5ed2aefcdce11904fc5bbea7d9c21fff3d5f543841edf3dea84451a09ea"}, + {file = "matplotlib-3.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:b2696efdc08648536efd4e1601b5fd491fd47f4db97a5fbfd175549a7365c1b2"}, + {file = "matplotlib-3.9.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:d52a3b618cb1cbb769ce2ee1dcdb333c3ab6e823944e9a2d36e37253815f9556"}, + {file = "matplotlib-3.9.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:039082812cacd6c6bec8e17a9c1e6baca230d4116d522e81e1f63a74d01d2e21"}, + {file = "matplotlib-3.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6758baae2ed64f2331d4fd19be38b7b4eae3ecec210049a26b6a4f3ae1c85dcc"}, + {file = "matplotlib-3.9.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:050598c2b29e0b9832cde72bcf97627bf00262adbc4a54e2b856426bb2ef0697"}, + {file = "matplotlib-3.9.2.tar.gz", hash = "sha256:96ab43906269ca64a6366934106fa01534454a69e471b7bf3d79083981aaab92"}, ] [package.dependencies] @@ -2587,13 +2613,13 @@ test = ["pep440", "pre-commit", "pytest", "testpath"] [[package]] name = "nbsphinx" -version = "0.9.4" +version = "0.9.5" description = "Jupyter Notebook Tools for Sphinx" optional = false python-versions = ">=3.6" files = [ - {file = "nbsphinx-0.9.4-py3-none-any.whl", hash = "sha256:22cb1d974a8300e8118ca71aea1f649553743c0c5830a54129dcd446e6a8ba17"}, - {file = "nbsphinx-0.9.4.tar.gz", hash = "sha256:042a60806fc23d519bc5bef59d95570713913fe442fda759d53e3aaf62104794"}, + {file = "nbsphinx-0.9.5-py3-none-any.whl", hash = "sha256:d82f71084425db1f48e72515f15c25b4de8652ceaab513ee462ac05f1b8eae0a"}, + {file = "nbsphinx-0.9.5.tar.gz", hash = "sha256:736916e7b0dab28fc904f4a9ae3b53a9a50c29fccc6329c052fcc7485abcf2b7"}, ] [package.dependencies] @@ -2725,19 +2751,19 @@ requests = ">=2.19.0" [[package]] name = "openpulse" -version = "0.5.0" +version = "1.0.0" description = "Reference OpenPulse AST in Python" optional = false python-versions = "*" files = [ - {file = "openpulse-0.5.0-py3-none-any.whl", hash = "sha256:c91b69633366381f3fdbc0c9be8c37c114b2d8e469f667ff9b0f78632e00c395"}, - {file = "openpulse-0.5.0.tar.gz", hash = "sha256:d7b1d940c0e081975f5ebdad2b378d24e4a612b73fce1bc2e26948d907f5db1c"}, + {file = "openpulse-1.0.0-py3-none-any.whl", hash = "sha256:5abf56758cadd0ad39035511b280bb1ef916d2fc60ec914566559425eef832f8"}, + {file = "openpulse-1.0.0.tar.gz", hash = "sha256:f46021d953f5ee84a4ad62fb166a11bad73fa235531c4f10be486ed9f4eca33d"}, ] [package.dependencies] -antlr4-python3-runtime = ">=4.7,<4.12" +antlr4-python3-runtime = ">=4.7,<4.14" importlib-metadata = {version = "*", markers = "python_version < \"3.10\""} -openqasm3 = {version = ">=0.5.0", extras = ["parser"]} +openqasm3 = {version = ">=1.0.0,<2.0", extras = ["parser"]} [package.extras] all = ["pytest (>=6.0)", "pyyaml"] @@ -2765,62 +2791,68 @@ tests = ["pytest (>=6.0)", "pyyaml"] [[package]] name = "orjson" -version = "3.10.6" +version = "3.10.7" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" optional = false python-versions = ">=3.8" files = [ - {file = "orjson-3.10.6-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:fb0ee33124db6eaa517d00890fc1a55c3bfe1cf78ba4a8899d71a06f2d6ff5c7"}, - {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c1c4b53b24a4c06547ce43e5fee6ec4e0d8fe2d597f4647fc033fd205707365"}, - {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eadc8fd310edb4bdbd333374f2c8fec6794bbbae99b592f448d8214a5e4050c0"}, - {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:61272a5aec2b2661f4fa2b37c907ce9701e821b2c1285d5c3ab0207ebd358d38"}, - {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57985ee7e91d6214c837936dc1608f40f330a6b88bb13f5a57ce5257807da143"}, - {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:633a3b31d9d7c9f02d49c4ab4d0a86065c4a6f6adc297d63d272e043472acab5"}, - {file = "orjson-3.10.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1c680b269d33ec444afe2bdc647c9eb73166fa47a16d9a75ee56a374f4a45f43"}, - {file = "orjson-3.10.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f759503a97a6ace19e55461395ab0d618b5a117e8d0fbb20e70cfd68a47327f2"}, - {file = "orjson-3.10.6-cp310-none-win32.whl", hash = "sha256:95a0cce17f969fb5391762e5719575217bd10ac5a189d1979442ee54456393f3"}, - {file = "orjson-3.10.6-cp310-none-win_amd64.whl", hash = "sha256:df25d9271270ba2133cc88ee83c318372bdc0f2cd6f32e7a450809a111efc45c"}, - {file = "orjson-3.10.6-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:b1ec490e10d2a77c345def52599311849fc063ae0e67cf4f84528073152bb2ba"}, - {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55d43d3feb8f19d07e9f01e5b9be4f28801cf7c60d0fa0d279951b18fae1932b"}, - {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac3045267e98fe749408eee1593a142e02357c5c99be0802185ef2170086a863"}, - {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c27bc6a28ae95923350ab382c57113abd38f3928af3c80be6f2ba7eb8d8db0b0"}, - {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d27456491ca79532d11e507cadca37fb8c9324a3976294f68fb1eff2dc6ced5a"}, - {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05ac3d3916023745aa3b3b388e91b9166be1ca02b7c7e41045da6d12985685f0"}, - {file = "orjson-3.10.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1335d4ef59ab85cab66fe73fd7a4e881c298ee7f63ede918b7faa1b27cbe5212"}, - {file = "orjson-3.10.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4bbc6d0af24c1575edc79994c20e1b29e6fb3c6a570371306db0993ecf144dc5"}, - {file = "orjson-3.10.6-cp311-none-win32.whl", hash = "sha256:450e39ab1f7694465060a0550b3f6d328d20297bf2e06aa947b97c21e5241fbd"}, - {file = "orjson-3.10.6-cp311-none-win_amd64.whl", hash = "sha256:227df19441372610b20e05bdb906e1742ec2ad7a66ac8350dcfd29a63014a83b"}, - {file = "orjson-3.10.6-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:ea2977b21f8d5d9b758bb3f344a75e55ca78e3ff85595d248eee813ae23ecdfb"}, - {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b6f3d167d13a16ed263b52dbfedff52c962bfd3d270b46b7518365bcc2121eed"}, - {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f710f346e4c44a4e8bdf23daa974faede58f83334289df80bc9cd12fe82573c7"}, - {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7275664f84e027dcb1ad5200b8b18373e9c669b2a9ec33d410c40f5ccf4b257e"}, - {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0943e4c701196b23c240b3d10ed8ecd674f03089198cf503105b474a4f77f21f"}, - {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:446dee5a491b5bc7d8f825d80d9637e7af43f86a331207b9c9610e2f93fee22a"}, - {file = "orjson-3.10.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:64c81456d2a050d380786413786b057983892db105516639cb5d3ee3c7fd5148"}, - {file = "orjson-3.10.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:960db0e31c4e52fa0fc3ecbaea5b2d3b58f379e32a95ae6b0ebeaa25b93dfd34"}, - {file = "orjson-3.10.6-cp312-none-win32.whl", hash = "sha256:a6ea7afb5b30b2317e0bee03c8d34c8181bc5a36f2afd4d0952f378972c4efd5"}, - {file = "orjson-3.10.6-cp312-none-win_amd64.whl", hash = "sha256:874ce88264b7e655dde4aeaacdc8fd772a7962faadfb41abe63e2a4861abc3dc"}, - {file = "orjson-3.10.6-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:66680eae4c4e7fc193d91cfc1353ad6d01b4801ae9b5314f17e11ba55e934183"}, - {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:caff75b425db5ef8e8f23af93c80f072f97b4fb3afd4af44482905c9f588da28"}, - {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3722fddb821b6036fd2a3c814f6bd9b57a89dc6337b9924ecd614ebce3271394"}, - {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2c116072a8533f2fec435fde4d134610f806bdac20188c7bd2081f3e9e0133f"}, - {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6eeb13218c8cf34c61912e9df2de2853f1d009de0e46ea09ccdf3d757896af0a"}, - {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:965a916373382674e323c957d560b953d81d7a8603fbeee26f7b8248638bd48b"}, - {file = "orjson-3.10.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:03c95484d53ed8e479cade8628c9cea00fd9d67f5554764a1110e0d5aa2de96e"}, - {file = "orjson-3.10.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:e060748a04cccf1e0a6f2358dffea9c080b849a4a68c28b1b907f272b5127e9b"}, - {file = "orjson-3.10.6-cp38-none-win32.whl", hash = "sha256:738dbe3ef909c4b019d69afc19caf6b5ed0e2f1c786b5d6215fbb7539246e4c6"}, - {file = "orjson-3.10.6-cp38-none-win_amd64.whl", hash = "sha256:d40f839dddf6a7d77114fe6b8a70218556408c71d4d6e29413bb5f150a692ff7"}, - {file = "orjson-3.10.6-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:697a35a083c4f834807a6232b3e62c8b280f7a44ad0b759fd4dce748951e70db"}, - {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd502f96bf5ea9a61cbc0b2b5900d0dd68aa0da197179042bdd2be67e51a1e4b"}, - {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f215789fb1667cdc874c1b8af6a84dc939fd802bf293a8334fce185c79cd359b"}, - {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2debd8ddce948a8c0938c8c93ade191d2f4ba4649a54302a7da905a81f00b56"}, - {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5410111d7b6681d4b0d65e0f58a13be588d01b473822483f77f513c7f93bd3b2"}, - {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb1f28a137337fdc18384079fa5726810681055b32b92253fa15ae5656e1dddb"}, - {file = "orjson-3.10.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bf2fbbce5fe7cd1aa177ea3eab2b8e6a6bc6e8592e4279ed3db2d62e57c0e1b2"}, - {file = "orjson-3.10.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:79b9b9e33bd4c517445a62b90ca0cc279b0f1f3970655c3df9e608bc3f91741a"}, - {file = "orjson-3.10.6-cp39-none-win32.whl", hash = "sha256:30b0a09a2014e621b1adf66a4f705f0809358350a757508ee80209b2d8dae219"}, - {file = "orjson-3.10.6-cp39-none-win_amd64.whl", hash = "sha256:49e3bc615652617d463069f91b867a4458114c5b104e13b7ae6872e5f79d0844"}, - {file = "orjson-3.10.6.tar.gz", hash = "sha256:e54b63d0a7c6c54a5f5f726bc93a2078111ef060fec4ecbf34c5db800ca3b3a7"}, + {file = "orjson-3.10.7-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:74f4544f5a6405b90da8ea724d15ac9c36da4d72a738c64685003337401f5c12"}, + {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34a566f22c28222b08875b18b0dfbf8a947e69df21a9ed5c51a6bf91cfb944ac"}, + {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bf6ba8ebc8ef5792e2337fb0419f8009729335bb400ece005606336b7fd7bab7"}, + {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac7cf6222b29fbda9e3a472b41e6a5538b48f2c8f99261eecd60aafbdb60690c"}, + {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de817e2f5fc75a9e7dd350c4b0f54617b280e26d1631811a43e7e968fa71e3e9"}, + {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:348bdd16b32556cf8d7257b17cf2bdb7ab7976af4af41ebe79f9796c218f7e91"}, + {file = "orjson-3.10.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:479fd0844ddc3ca77e0fd99644c7fe2de8e8be1efcd57705b5c92e5186e8a250"}, + {file = "orjson-3.10.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:fdf5197a21dd660cf19dfd2a3ce79574588f8f5e2dbf21bda9ee2d2b46924d84"}, + {file = "orjson-3.10.7-cp310-none-win32.whl", hash = "sha256:d374d36726746c81a49f3ff8daa2898dccab6596864ebe43d50733275c629175"}, + {file = "orjson-3.10.7-cp310-none-win_amd64.whl", hash = "sha256:cb61938aec8b0ffb6eef484d480188a1777e67b05d58e41b435c74b9d84e0b9c"}, + {file = "orjson-3.10.7-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:7db8539039698ddfb9a524b4dd19508256107568cdad24f3682d5773e60504a2"}, + {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:480f455222cb7a1dea35c57a67578848537d2602b46c464472c995297117fa09"}, + {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8a9c9b168b3a19e37fe2778c0003359f07822c90fdff8f98d9d2a91b3144d8e0"}, + {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8de062de550f63185e4c1c54151bdddfc5625e37daf0aa1e75d2a1293e3b7d9a"}, + {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6b0dd04483499d1de9c8f6203f8975caf17a6000b9c0c54630cef02e44ee624e"}, + {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b58d3795dafa334fc8fd46f7c5dc013e6ad06fd5b9a4cc98cb1456e7d3558bd6"}, + {file = "orjson-3.10.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:33cfb96c24034a878d83d1a9415799a73dc77480e6c40417e5dda0710d559ee6"}, + {file = "orjson-3.10.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e724cebe1fadc2b23c6f7415bad5ee6239e00a69f30ee423f319c6af70e2a5c0"}, + {file = "orjson-3.10.7-cp311-none-win32.whl", hash = "sha256:82763b46053727a7168d29c772ed5c870fdae2f61aa8a25994c7984a19b1021f"}, + {file = "orjson-3.10.7-cp311-none-win_amd64.whl", hash = "sha256:eb8d384a24778abf29afb8e41d68fdd9a156cf6e5390c04cc07bbc24b89e98b5"}, + {file = "orjson-3.10.7-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:44a96f2d4c3af51bfac6bc4ef7b182aa33f2f054fd7f34cc0ee9a320d051d41f"}, + {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76ac14cd57df0572453543f8f2575e2d01ae9e790c21f57627803f5e79b0d3c3"}, + {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bdbb61dcc365dd9be94e8f7df91975edc9364d6a78c8f7adb69c1cdff318ec93"}, + {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b48b3db6bb6e0a08fa8c83b47bc169623f801e5cc4f24442ab2b6617da3b5313"}, + {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23820a1563a1d386414fef15c249040042b8e5d07b40ab3fe3efbfbbcbcb8864"}, + {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0c6a008e91d10a2564edbb6ee5069a9e66df3fbe11c9a005cb411f441fd2c09"}, + {file = "orjson-3.10.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d352ee8ac1926d6193f602cbe36b1643bbd1bbcb25e3c1a657a4390f3000c9a5"}, + {file = "orjson-3.10.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d2d9f990623f15c0ae7ac608103c33dfe1486d2ed974ac3f40b693bad1a22a7b"}, + {file = "orjson-3.10.7-cp312-none-win32.whl", hash = "sha256:7c4c17f8157bd520cdb7195f75ddbd31671997cbe10aee559c2d613592e7d7eb"}, + {file = "orjson-3.10.7-cp312-none-win_amd64.whl", hash = "sha256:1d9c0e733e02ada3ed6098a10a8ee0052dd55774de3d9110d29868d24b17faa1"}, + {file = "orjson-3.10.7-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:77d325ed866876c0fa6492598ec01fe30e803272a6e8b10e992288b009cbe149"}, + {file = "orjson-3.10.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ea2c232deedcb605e853ae1db2cc94f7390ac776743b699b50b071b02bea6fe"}, + {file = "orjson-3.10.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3dcfbede6737fdbef3ce9c37af3fb6142e8e1ebc10336daa05872bfb1d87839c"}, + {file = "orjson-3.10.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:11748c135f281203f4ee695b7f80bb1358a82a63905f9f0b794769483ea854ad"}, + {file = "orjson-3.10.7-cp313-none-win32.whl", hash = "sha256:a7e19150d215c7a13f39eb787d84db274298d3f83d85463e61d277bbd7f401d2"}, + {file = "orjson-3.10.7-cp313-none-win_amd64.whl", hash = "sha256:eef44224729e9525d5261cc8d28d6b11cafc90e6bd0be2157bde69a52ec83024"}, + {file = "orjson-3.10.7-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:6ea2b2258eff652c82652d5e0f02bd5e0463a6a52abb78e49ac288827aaa1469"}, + {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:430ee4d85841e1483d487e7b81401785a5dfd69db5de01314538f31f8fbf7ee1"}, + {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4b6146e439af4c2472c56f8540d799a67a81226e11992008cb47e1267a9b3225"}, + {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:084e537806b458911137f76097e53ce7bf5806dda33ddf6aaa66a028f8d43a23"}, + {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4829cf2195838e3f93b70fd3b4292156fc5e097aac3739859ac0dcc722b27ac0"}, + {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1193b2416cbad1a769f868b1749535d5da47626ac29445803dae7cc64b3f5c98"}, + {file = "orjson-3.10.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:4e6c3da13e5a57e4b3dca2de059f243ebec705857522f188f0180ae88badd354"}, + {file = "orjson-3.10.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c31008598424dfbe52ce8c5b47e0752dca918a4fdc4a2a32004efd9fab41d866"}, + {file = "orjson-3.10.7-cp38-none-win32.whl", hash = "sha256:7122a99831f9e7fe977dc45784d3b2edc821c172d545e6420c375e5a935f5a1c"}, + {file = "orjson-3.10.7-cp38-none-win_amd64.whl", hash = "sha256:a763bc0e58504cc803739e7df040685816145a6f3c8a589787084b54ebc9f16e"}, + {file = "orjson-3.10.7-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:e76be12658a6fa376fcd331b1ea4e58f5a06fd0220653450f0d415b8fd0fbe20"}, + {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed350d6978d28b92939bfeb1a0570c523f6170efc3f0a0ef1f1df287cd4f4960"}, + {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:144888c76f8520e39bfa121b31fd637e18d4cc2f115727865fdf9fa325b10412"}, + {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09b2d92fd95ad2402188cf51573acde57eb269eddabaa60f69ea0d733e789fe9"}, + {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5b24a579123fa884f3a3caadaed7b75eb5715ee2b17ab5c66ac97d29b18fe57f"}, + {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591bcfe7512353bd609875ab38050efe3d55e18934e2f18950c108334b4ff"}, + {file = "orjson-3.10.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f4db56635b58cd1a200b0a23744ff44206ee6aa428185e2b6c4a65b3197abdcd"}, + {file = "orjson-3.10.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0fa5886854673222618638c6df7718ea7fe2f3f2384c452c9ccedc70b4a510a5"}, + {file = "orjson-3.10.7-cp39-none-win32.whl", hash = "sha256:8272527d08450ab16eb405f47e0f4ef0e5ff5981c3d82afe0efd25dcbef2bcd2"}, + {file = "orjson-3.10.7-cp39-none-win_amd64.whl", hash = "sha256:974683d4618c0c7dbf4f69c95a979734bf183d0658611760017f6e70a145af58"}, + {file = "orjson-3.10.7.tar.gz", hash = "sha256:75ef0640403f945f3a1f9f6400686560dbfb0fb5b16589ad62cd477043c4eee3"}, ] [[package]] @@ -2842,6 +2874,7 @@ optional = false python-versions = ">=3.9" files = [ {file = "pandas-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce"}, + {file = "pandas-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238"}, {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08"}, {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0"}, {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51"}, @@ -2855,12 +2888,14 @@ files = [ {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1"}, {file = "pandas-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24"}, {file = "pandas-2.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef"}, + {file = "pandas-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b79011ff7a0f4b1d6da6a61aa1aa604fb312d6647de5bad20013682d1429ce"}, {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad"}, {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad"}, {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76"}, {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32"}, {file = "pandas-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23"}, {file = "pandas-2.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2"}, + {file = "pandas-2.2.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd"}, {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863"}, {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921"}, {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a"}, @@ -4051,62 +4086,64 @@ files = [ [[package]] name = "pyyaml" -version = "6.0.1" +version = "6.0.2" description = "YAML parser and emitter for Python" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, - {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, - {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, - {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, - {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, - {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, - {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, - {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, - {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, - {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, - {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, - {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, - {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, - {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] [[package]] @@ -4613,114 +4650,114 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "rpds-py" -version = "0.19.1" +version = "0.20.0" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.8" files = [ - {file = "rpds_py-0.19.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:aaf71f95b21f9dc708123335df22e5a2fef6307e3e6f9ed773b2e0938cc4d491"}, - {file = "rpds_py-0.19.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ca0dda0c5715efe2ab35bb83f813f681ebcd2840d8b1b92bfc6fe3ab382fae4a"}, - {file = "rpds_py-0.19.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81db2e7282cc0487f500d4db203edc57da81acde9e35f061d69ed983228ffe3b"}, - {file = "rpds_py-0.19.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1a8dfa125b60ec00c7c9baef945bb04abf8ac772d8ebefd79dae2a5f316d7850"}, - {file = "rpds_py-0.19.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:271accf41b02687cef26367c775ab220372ee0f4925591c6796e7c148c50cab5"}, - {file = "rpds_py-0.19.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9bc4161bd3b970cd6a6fcda70583ad4afd10f2750609fb1f3ca9505050d4ef3"}, - {file = "rpds_py-0.19.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0cf2a0dbb5987da4bd92a7ca727eadb225581dd9681365beba9accbe5308f7d"}, - {file = "rpds_py-0.19.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b5e28e56143750808c1c79c70a16519e9bc0a68b623197b96292b21b62d6055c"}, - {file = "rpds_py-0.19.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c7af6f7b80f687b33a4cdb0a785a5d4de1fb027a44c9a049d8eb67d5bfe8a687"}, - {file = "rpds_py-0.19.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e429fc517a1c5e2a70d576077231538a98d59a45dfc552d1ac45a132844e6dfb"}, - {file = "rpds_py-0.19.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d2dbd8f4990d4788cb122f63bf000357533f34860d269c1a8e90ae362090ff3a"}, - {file = "rpds_py-0.19.1-cp310-none-win32.whl", hash = "sha256:e0f9d268b19e8f61bf42a1da48276bcd05f7ab5560311f541d22557f8227b866"}, - {file = "rpds_py-0.19.1-cp310-none-win_amd64.whl", hash = "sha256:df7c841813f6265e636fe548a49664c77af31ddfa0085515326342a751a6ba51"}, - {file = "rpds_py-0.19.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:902cf4739458852fe917104365ec0efbea7d29a15e4276c96a8d33e6ed8ec137"}, - {file = "rpds_py-0.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f3d73022990ab0c8b172cce57c69fd9a89c24fd473a5e79cbce92df87e3d9c48"}, - {file = "rpds_py-0.19.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3837c63dd6918a24de6c526277910e3766d8c2b1627c500b155f3eecad8fad65"}, - {file = "rpds_py-0.19.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cdb7eb3cf3deb3dd9e7b8749323b5d970052711f9e1e9f36364163627f96da58"}, - {file = "rpds_py-0.19.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:26ab43b6d65d25b1a333c8d1b1c2f8399385ff683a35ab5e274ba7b8bb7dc61c"}, - {file = "rpds_py-0.19.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75130df05aae7a7ac171b3b5b24714cffeabd054ad2ebc18870b3aa4526eba23"}, - {file = "rpds_py-0.19.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c34f751bf67cab69638564eee34023909380ba3e0d8ee7f6fe473079bf93f09b"}, - {file = "rpds_py-0.19.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f2671cb47e50a97f419a02cd1e0c339b31de017b033186358db92f4d8e2e17d8"}, - {file = "rpds_py-0.19.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3c73254c256081704dba0a333457e2fb815364018788f9b501efe7c5e0ada401"}, - {file = "rpds_py-0.19.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4383beb4a29935b8fa28aca8fa84c956bf545cb0c46307b091b8d312a9150e6a"}, - {file = "rpds_py-0.19.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:dbceedcf4a9329cc665452db1aaf0845b85c666e4885b92ee0cddb1dbf7e052a"}, - {file = "rpds_py-0.19.1-cp311-none-win32.whl", hash = "sha256:f0a6d4a93d2a05daec7cb885157c97bbb0be4da739d6f9dfb02e101eb40921cd"}, - {file = "rpds_py-0.19.1-cp311-none-win_amd64.whl", hash = "sha256:c149a652aeac4902ecff2dd93c3b2681c608bd5208c793c4a99404b3e1afc87c"}, - {file = "rpds_py-0.19.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:56313be667a837ff1ea3508cebb1ef6681d418fa2913a0635386cf29cff35165"}, - {file = "rpds_py-0.19.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6d1d7539043b2b31307f2c6c72957a97c839a88b2629a348ebabe5aa8b626d6b"}, - {file = "rpds_py-0.19.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e1dc59a5e7bc7f44bd0c048681f5e05356e479c50be4f2c1a7089103f1621d5"}, - {file = "rpds_py-0.19.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b8f78398e67a7227aefa95f876481485403eb974b29e9dc38b307bb6eb2315ea"}, - {file = "rpds_py-0.19.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ef07a0a1d254eeb16455d839cef6e8c2ed127f47f014bbda64a58b5482b6c836"}, - {file = "rpds_py-0.19.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8124101e92c56827bebef084ff106e8ea11c743256149a95b9fd860d3a4f331f"}, - {file = "rpds_py-0.19.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08ce9c95a0b093b7aec75676b356a27879901488abc27e9d029273d280438505"}, - {file = "rpds_py-0.19.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0b02dd77a2de6e49078c8937aadabe933ceac04b41c5dde5eca13a69f3cf144e"}, - {file = "rpds_py-0.19.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4dd02e29c8cbed21a1875330b07246b71121a1c08e29f0ee3db5b4cfe16980c4"}, - {file = "rpds_py-0.19.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9c7042488165f7251dc7894cd533a875d2875af6d3b0e09eda9c4b334627ad1c"}, - {file = "rpds_py-0.19.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f809a17cc78bd331e137caa25262b507225854073fd319e987bd216bed911b7c"}, - {file = "rpds_py-0.19.1-cp312-none-win32.whl", hash = "sha256:3ddab996807c6b4227967fe1587febade4e48ac47bb0e2d3e7858bc621b1cace"}, - {file = "rpds_py-0.19.1-cp312-none-win_amd64.whl", hash = "sha256:32e0db3d6e4f45601b58e4ac75c6f24afbf99818c647cc2066f3e4b192dabb1f"}, - {file = "rpds_py-0.19.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:747251e428406b05fc86fee3904ee19550c4d2d19258cef274e2151f31ae9d38"}, - {file = "rpds_py-0.19.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dc733d35f861f8d78abfaf54035461e10423422999b360966bf1c443cbc42705"}, - {file = "rpds_py-0.19.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbda75f245caecff8faa7e32ee94dfaa8312a3367397975527f29654cd17a6ed"}, - {file = "rpds_py-0.19.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bd04d8cab16cab5b0a9ffc7d10f0779cf1120ab16c3925404428f74a0a43205a"}, - {file = "rpds_py-0.19.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2d66eb41ffca6cc3c91d8387509d27ba73ad28371ef90255c50cb51f8953301"}, - {file = "rpds_py-0.19.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fdf4890cda3b59170009d012fca3294c00140e7f2abe1910e6a730809d0f3f9b"}, - {file = "rpds_py-0.19.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1fa67ef839bad3815124f5f57e48cd50ff392f4911a9f3cf449d66fa3df62a5"}, - {file = "rpds_py-0.19.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b82c9514c6d74b89a370c4060bdb80d2299bc6857e462e4a215b4ef7aa7b090e"}, - {file = "rpds_py-0.19.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c7b07959866a6afb019abb9564d8a55046feb7a84506c74a6f197cbcdf8a208e"}, - {file = "rpds_py-0.19.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4f580ae79d0b861dfd912494ab9d477bea535bfb4756a2269130b6607a21802e"}, - {file = "rpds_py-0.19.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c6d20c8896c00775e6f62d8373aba32956aa0b850d02b5ec493f486c88e12859"}, - {file = "rpds_py-0.19.1-cp313-none-win32.whl", hash = "sha256:afedc35fe4b9e30ab240b208bb9dc8938cb4afe9187589e8d8d085e1aacb8309"}, - {file = "rpds_py-0.19.1-cp313-none-win_amd64.whl", hash = "sha256:1d4af2eb520d759f48f1073ad3caef997d1bfd910dc34e41261a595d3f038a94"}, - {file = "rpds_py-0.19.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:34bca66e2e3eabc8a19e9afe0d3e77789733c702c7c43cd008e953d5d1463fde"}, - {file = "rpds_py-0.19.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:24f8ae92c7fae7c28d0fae9b52829235df83f34847aa8160a47eb229d9666c7b"}, - {file = "rpds_py-0.19.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71157f9db7f6bc6599a852852f3389343bea34315b4e6f109e5cbc97c1fb2963"}, - {file = "rpds_py-0.19.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1d494887d40dc4dd0d5a71e9d07324e5c09c4383d93942d391727e7a40ff810b"}, - {file = "rpds_py-0.19.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7b3661e6d4ba63a094138032c1356d557de5b3ea6fd3cca62a195f623e381c76"}, - {file = "rpds_py-0.19.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97fbb77eaeb97591efdc654b8b5f3ccc066406ccfb3175b41382f221ecc216e8"}, - {file = "rpds_py-0.19.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cc4bc73e53af8e7a42c8fd7923bbe35babacfa7394ae9240b3430b5dcf16b2a"}, - {file = "rpds_py-0.19.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:35af5e4d5448fa179fd7fff0bba0fba51f876cd55212f96c8bbcecc5c684ae5c"}, - {file = "rpds_py-0.19.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:3511f6baf8438326e351097cecd137eb45c5f019944fe0fd0ae2fea2fd26be39"}, - {file = "rpds_py-0.19.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:57863d16187995c10fe9cf911b897ed443ac68189179541734502353af33e693"}, - {file = "rpds_py-0.19.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:9e318e6786b1e750a62f90c6f7fa8b542102bdcf97c7c4de2a48b50b61bd36ec"}, - {file = "rpds_py-0.19.1-cp38-none-win32.whl", hash = "sha256:53dbc35808c6faa2ce3e48571f8f74ef70802218554884787b86a30947842a14"}, - {file = "rpds_py-0.19.1-cp38-none-win_amd64.whl", hash = "sha256:8df1c283e57c9cb4d271fdc1875f4a58a143a2d1698eb0d6b7c0d7d5f49c53a1"}, - {file = "rpds_py-0.19.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:e76c902d229a3aa9d5ceb813e1cbcc69bf5bda44c80d574ff1ac1fa3136dea71"}, - {file = "rpds_py-0.19.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:de1f7cd5b6b351e1afd7568bdab94934d656abe273d66cda0ceea43bbc02a0c2"}, - {file = "rpds_py-0.19.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24fc5a84777cb61692d17988989690d6f34f7f95968ac81398d67c0d0994a897"}, - {file = "rpds_py-0.19.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:74129d5ffc4cde992d89d345f7f7d6758320e5d44a369d74d83493429dad2de5"}, - {file = "rpds_py-0.19.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e360188b72f8080fefa3adfdcf3618604cc8173651c9754f189fece068d2a45"}, - {file = "rpds_py-0.19.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13e6d4840897d4e4e6b2aa1443e3a8eca92b0402182aafc5f4ca1f5e24f9270a"}, - {file = "rpds_py-0.19.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f09529d2332264a902688031a83c19de8fda5eb5881e44233286b9c9ec91856d"}, - {file = "rpds_py-0.19.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0d4b52811dcbc1aba08fd88d475f75b4f6db0984ba12275d9bed1a04b2cae9b5"}, - {file = "rpds_py-0.19.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dd635c2c4043222d80d80ca1ac4530a633102a9f2ad12252183bcf338c1b9474"}, - {file = "rpds_py-0.19.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f35b34a5184d5e0cc360b61664c1c06e866aab077b5a7c538a3e20c8fcdbf90b"}, - {file = "rpds_py-0.19.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d4ec0046facab83012d821b33cead742a35b54575c4edfb7ed7445f63441835f"}, - {file = "rpds_py-0.19.1-cp39-none-win32.whl", hash = "sha256:f5b8353ea1a4d7dfb59a7f45c04df66ecfd363bb5b35f33b11ea579111d4655f"}, - {file = "rpds_py-0.19.1-cp39-none-win_amd64.whl", hash = "sha256:1fb93d3486f793d54a094e2bfd9cd97031f63fcb5bc18faeb3dd4b49a1c06523"}, - {file = "rpds_py-0.19.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7d5c7e32f3ee42f77d8ff1a10384b5cdcc2d37035e2e3320ded909aa192d32c3"}, - {file = "rpds_py-0.19.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:89cc8921a4a5028d6dd388c399fcd2eef232e7040345af3d5b16c04b91cf3c7e"}, - {file = "rpds_py-0.19.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bca34e913d27401bda2a6f390d0614049f5a95b3b11cd8eff80fe4ec340a1208"}, - {file = "rpds_py-0.19.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5953391af1405f968eb5701ebbb577ebc5ced8d0041406f9052638bafe52209d"}, - {file = "rpds_py-0.19.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:840e18c38098221ea6201f091fc5d4de6128961d2930fbbc96806fb43f69aec1"}, - {file = "rpds_py-0.19.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6d8b735c4d162dc7d86a9cf3d717f14b6c73637a1f9cd57fe7e61002d9cb1972"}, - {file = "rpds_py-0.19.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce757c7c90d35719b38fa3d4ca55654a76a40716ee299b0865f2de21c146801c"}, - {file = "rpds_py-0.19.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a9421b23c85f361a133aa7c5e8ec757668f70343f4ed8fdb5a4a14abd5437244"}, - {file = "rpds_py-0.19.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:3b823be829407393d84ee56dc849dbe3b31b6a326f388e171555b262e8456cc1"}, - {file = "rpds_py-0.19.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:5e58b61dcbb483a442c6239c3836696b79f2cd8e7eec11e12155d3f6f2d886d1"}, - {file = "rpds_py-0.19.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:39d67896f7235b2c886fb1ee77b1491b77049dcef6fbf0f401e7b4cbed86bbd4"}, - {file = "rpds_py-0.19.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:8b32cd4ab6db50c875001ba4f5a6b30c0f42151aa1fbf9c2e7e3674893fb1dc4"}, - {file = "rpds_py-0.19.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:1c32e41de995f39b6b315d66c27dea3ef7f7c937c06caab4c6a79a5e09e2c415"}, - {file = "rpds_py-0.19.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1a129c02b42d46758c87faeea21a9f574e1c858b9f358b6dd0bbd71d17713175"}, - {file = "rpds_py-0.19.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:346557f5b1d8fd9966059b7a748fd79ac59f5752cd0e9498d6a40e3ac1c1875f"}, - {file = "rpds_py-0.19.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:31e450840f2f27699d014cfc8865cc747184286b26d945bcea6042bb6aa4d26e"}, - {file = "rpds_py-0.19.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01227f8b3e6c8961490d869aa65c99653df80d2f0a7fde8c64ebddab2b9b02fd"}, - {file = "rpds_py-0.19.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:69084fd29bfeff14816666c93a466e85414fe6b7d236cfc108a9c11afa6f7301"}, - {file = "rpds_py-0.19.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d2b88efe65544a7d5121b0c3b003ebba92bfede2ea3577ce548b69c5235185"}, - {file = "rpds_py-0.19.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6ea961a674172ed2235d990d7edf85d15d8dfa23ab8575e48306371c070cda67"}, - {file = "rpds_py-0.19.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:5beffdbe766cfe4fb04f30644d822a1080b5359df7db3a63d30fa928375b2720"}, - {file = "rpds_py-0.19.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:720f3108fb1bfa32e51db58b832898372eb5891e8472a8093008010911e324c5"}, - {file = "rpds_py-0.19.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:c2087dbb76a87ec2c619253e021e4fb20d1a72580feeaa6892b0b3d955175a71"}, - {file = "rpds_py-0.19.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2ddd50f18ebc05ec29a0d9271e9dbe93997536da3546677f8ca00b76d477680c"}, - {file = "rpds_py-0.19.1.tar.gz", hash = "sha256:31dd5794837f00b46f4096aa8ccaa5972f73a938982e32ed817bb520c465e520"}, + {file = "rpds_py-0.20.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3ad0fda1635f8439cde85c700f964b23ed5fc2d28016b32b9ee5fe30da5c84e2"}, + {file = "rpds_py-0.20.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9bb4a0d90fdb03437c109a17eade42dfbf6190408f29b2744114d11586611d6f"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6377e647bbfd0a0b159fe557f2c6c602c159fc752fa316572f012fc0bf67150"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb851b7df9dda52dc1415ebee12362047ce771fc36914586b2e9fcbd7d293b3e"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e0f80b739e5a8f54837be5d5c924483996b603d5502bfff79bf33da06164ee2"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a8c94dad2e45324fc74dce25e1645d4d14df9a4e54a30fa0ae8bad9a63928e3"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8e604fe73ba048c06085beaf51147eaec7df856824bfe7b98657cf436623daf"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:df3de6b7726b52966edf29663e57306b23ef775faf0ac01a3e9f4012a24a4140"}, + {file = "rpds_py-0.20.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf258ede5bc22a45c8e726b29835b9303c285ab46fc7c3a4cc770736b5304c9f"}, + {file = "rpds_py-0.20.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:55fea87029cded5df854ca7e192ec7bdb7ecd1d9a3f63d5c4eb09148acf4a7ce"}, + {file = "rpds_py-0.20.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ae94bd0b2f02c28e199e9bc51485d0c5601f58780636185660f86bf80c89af94"}, + {file = "rpds_py-0.20.0-cp310-none-win32.whl", hash = "sha256:28527c685f237c05445efec62426d285e47a58fb05ba0090a4340b73ecda6dee"}, + {file = "rpds_py-0.20.0-cp310-none-win_amd64.whl", hash = "sha256:238a2d5b1cad28cdc6ed15faf93a998336eb041c4e440dd7f902528b8891b399"}, + {file = "rpds_py-0.20.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ac2f4f7a98934c2ed6505aead07b979e6f999389f16b714448fb39bbaa86a489"}, + {file = "rpds_py-0.20.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:220002c1b846db9afd83371d08d239fdc865e8f8c5795bbaec20916a76db3318"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d7919548df3f25374a1f5d01fbcd38dacab338ef5f33e044744b5c36729c8db"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:758406267907b3781beee0f0edfe4a179fbd97c0be2e9b1154d7f0a1279cf8e5"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3d61339e9f84a3f0767b1995adfb171a0d00a1185192718a17af6e124728e0f5"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1259c7b3705ac0a0bd38197565a5d603218591d3f6cee6e614e380b6ba61c6f6"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c1dc0f53856b9cc9a0ccca0a7cc61d3d20a7088201c0937f3f4048c1718a209"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7e60cb630f674a31f0368ed32b2a6b4331b8350d67de53c0359992444b116dd3"}, + {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dbe982f38565bb50cb7fb061ebf762c2f254ca3d8c20d4006878766e84266272"}, + {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:514b3293b64187172bc77c8fb0cdae26981618021053b30d8371c3a902d4d5ad"}, + {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d0a26ffe9d4dd35e4dfdd1e71f46401cff0181c75ac174711ccff0459135fa58"}, + {file = "rpds_py-0.20.0-cp311-none-win32.whl", hash = "sha256:89c19a494bf3ad08c1da49445cc5d13d8fefc265f48ee7e7556839acdacf69d0"}, + {file = "rpds_py-0.20.0-cp311-none-win_amd64.whl", hash = "sha256:c638144ce971df84650d3ed0096e2ae7af8e62ecbbb7b201c8935c370df00a2c"}, + {file = "rpds_py-0.20.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a84ab91cbe7aab97f7446652d0ed37d35b68a465aeef8fc41932a9d7eee2c1a6"}, + {file = "rpds_py-0.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:56e27147a5a4c2c21633ff8475d185734c0e4befd1c989b5b95a5d0db699b21b"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2580b0c34583b85efec8c5c5ec9edf2dfe817330cc882ee972ae650e7b5ef739"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b80d4a7900cf6b66bb9cee5c352b2d708e29e5a37fe9bf784fa97fc11504bf6c"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50eccbf054e62a7b2209b28dc7a22d6254860209d6753e6b78cfaeb0075d7bee"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:49a8063ea4296b3a7e81a5dfb8f7b2d73f0b1c20c2af401fb0cdf22e14711a96"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea438162a9fcbee3ecf36c23e6c68237479f89f962f82dae83dc15feeceb37e4"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:18d7585c463087bddcfa74c2ba267339f14f2515158ac4db30b1f9cbdb62c8ef"}, + {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d4c7d1a051eeb39f5c9547e82ea27cbcc28338482242e3e0b7768033cb083821"}, + {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e4df1e3b3bec320790f699890d41c59d250f6beda159ea3c44c3f5bac1976940"}, + {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2cf126d33a91ee6eedc7f3197b53e87a2acdac63602c0f03a02dd69e4b138174"}, + {file = "rpds_py-0.20.0-cp312-none-win32.whl", hash = "sha256:8bc7690f7caee50b04a79bf017a8d020c1f48c2a1077ffe172abec59870f1139"}, + {file = "rpds_py-0.20.0-cp312-none-win_amd64.whl", hash = "sha256:0e13e6952ef264c40587d510ad676a988df19adea20444c2b295e536457bc585"}, + {file = "rpds_py-0.20.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:aa9a0521aeca7d4941499a73ad7d4f8ffa3d1affc50b9ea11d992cd7eff18a29"}, + {file = "rpds_py-0.20.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a1f1d51eccb7e6c32ae89243cb352389228ea62f89cd80823ea7dd1b98e0b91"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a86a9b96070674fc88b6f9f71a97d2c1d3e5165574615d1f9168ecba4cecb24"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6c8ef2ebf76df43f5750b46851ed1cdf8f109d7787ca40035fe19fbdc1acc5a7"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b74b25f024b421d5859d156750ea9a65651793d51b76a2e9238c05c9d5f203a9"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57eb94a8c16ab08fef6404301c38318e2c5a32216bf5de453e2714c964c125c8"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1940dae14e715e2e02dfd5b0f64a52e8374a517a1e531ad9412319dc3ac7879"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d20277fd62e1b992a50c43f13fbe13277a31f8c9f70d59759c88f644d66c619f"}, + {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:06db23d43f26478303e954c34c75182356ca9aa7797d22c5345b16871ab9c45c"}, + {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b2a5db5397d82fa847e4c624b0c98fe59d2d9b7cf0ce6de09e4d2e80f8f5b3f2"}, + {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5a35df9f5548fd79cb2f52d27182108c3e6641a4feb0f39067911bf2adaa3e57"}, + {file = "rpds_py-0.20.0-cp313-none-win32.whl", hash = "sha256:fd2d84f40633bc475ef2d5490b9c19543fbf18596dcb1b291e3a12ea5d722f7a"}, + {file = "rpds_py-0.20.0-cp313-none-win_amd64.whl", hash = "sha256:9bc2d153989e3216b0559251b0c260cfd168ec78b1fac33dd485750a228db5a2"}, + {file = "rpds_py-0.20.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:f2fbf7db2012d4876fb0d66b5b9ba6591197b0f165db8d99371d976546472a24"}, + {file = "rpds_py-0.20.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1e5f3cd7397c8f86c8cc72d5a791071431c108edd79872cdd96e00abd8497d29"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce9845054c13696f7af7f2b353e6b4f676dab1b4b215d7fe5e05c6f8bb06f965"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c3e130fd0ec56cb76eb49ef52faead8ff09d13f4527e9b0c400307ff72b408e1"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b16aa0107ecb512b568244ef461f27697164d9a68d8b35090e9b0c1c8b27752"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aa7f429242aae2947246587d2964fad750b79e8c233a2367f71b554e9447949c"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af0fc424a5842a11e28956e69395fbbeab2c97c42253169d87e90aac2886d751"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b8c00a3b1e70c1d3891f0db1b05292747f0dbcfb49c43f9244d04c70fbc40eb8"}, + {file = "rpds_py-0.20.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:40ce74fc86ee4645d0a225498d091d8bc61f39b709ebef8204cb8b5a464d3c0e"}, + {file = "rpds_py-0.20.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:4fe84294c7019456e56d93e8ababdad5a329cd25975be749c3f5f558abb48253"}, + {file = "rpds_py-0.20.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:338ca4539aad4ce70a656e5187a3a31c5204f261aef9f6ab50e50bcdffaf050a"}, + {file = "rpds_py-0.20.0-cp38-none-win32.whl", hash = "sha256:54b43a2b07db18314669092bb2de584524d1ef414588780261e31e85846c26a5"}, + {file = "rpds_py-0.20.0-cp38-none-win_amd64.whl", hash = "sha256:a1862d2d7ce1674cffa6d186d53ca95c6e17ed2b06b3f4c476173565c862d232"}, + {file = "rpds_py-0.20.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:3fde368e9140312b6e8b6c09fb9f8c8c2f00999d1823403ae90cc00480221b22"}, + {file = "rpds_py-0.20.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9824fb430c9cf9af743cf7aaf6707bf14323fb51ee74425c380f4c846ea70789"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11ef6ce74616342888b69878d45e9f779b95d4bd48b382a229fe624a409b72c5"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c52d3f2f82b763a24ef52f5d24358553e8403ce05f893b5347098014f2d9eff2"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d35cef91e59ebbeaa45214861874bc6f19eb35de96db73e467a8358d701a96c"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d72278a30111e5b5525c1dd96120d9e958464316f55adb030433ea905866f4de"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4c29cbbba378759ac5786730d1c3cb4ec6f8ababf5c42a9ce303dc4b3d08cda"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6632f2d04f15d1bd6fe0eedd3b86d9061b836ddca4c03d5cf5c7e9e6b7c14580"}, + {file = "rpds_py-0.20.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d0b67d87bb45ed1cd020e8fbf2307d449b68abc45402fe1a4ac9e46c3c8b192b"}, + {file = "rpds_py-0.20.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ec31a99ca63bf3cd7f1a5ac9fe95c5e2d060d3c768a09bc1d16e235840861420"}, + {file = "rpds_py-0.20.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22e6c9976e38f4d8c4a63bd8a8edac5307dffd3ee7e6026d97f3cc3a2dc02a0b"}, + {file = "rpds_py-0.20.0-cp39-none-win32.whl", hash = "sha256:569b3ea770c2717b730b61998b6c54996adee3cef69fc28d444f3e7920313cf7"}, + {file = "rpds_py-0.20.0-cp39-none-win_amd64.whl", hash = "sha256:e6900ecdd50ce0facf703f7a00df12374b74bbc8ad9fe0f6559947fb20f82364"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:617c7357272c67696fd052811e352ac54ed1d9b49ab370261a80d3b6ce385045"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9426133526f69fcaba6e42146b4e12d6bc6c839b8b555097020e2b78ce908dcc"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:deb62214c42a261cb3eb04d474f7155279c1a8a8c30ac89b7dcb1721d92c3c02"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fcaeb7b57f1a1e071ebd748984359fef83ecb026325b9d4ca847c95bc7311c92"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d454b8749b4bd70dd0a79f428731ee263fa6995f83ccb8bada706e8d1d3ff89d"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d807dc2051abe041b6649681dce568f8e10668e3c1c6543ebae58f2d7e617855"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3c20f0ddeb6e29126d45f89206b8291352b8c5b44384e78a6499d68b52ae511"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b7f19250ceef892adf27f0399b9e5afad019288e9be756d6919cb58892129f51"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4f1ed4749a08379555cebf4650453f14452eaa9c43d0a95c49db50c18b7da075"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:dcedf0b42bcb4cfff4101d7771a10532415a6106062f005ab97d1d0ab5681c60"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:39ed0d010457a78f54090fafb5d108501b5aa5604cc22408fc1c0c77eac14344"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:bb273176be34a746bdac0b0d7e4e2c467323d13640b736c4c477881a3220a989"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f918a1a130a6dfe1d7fe0f105064141342e7dd1611f2e6a21cd2f5c8cb1cfb3e"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f60012a73aa396be721558caa3a6fd49b3dd0033d1675c6d59c4502e870fcf0c"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d2b1ad682a3dfda2a4e8ad8572f3100f95fad98cb99faf37ff0ddfe9cbf9d03"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:614fdafe9f5f19c63ea02817fa4861c606a59a604a77c8cdef5aa01d28b97921"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fa518bcd7600c584bf42e6617ee8132869e877db2f76bcdc281ec6a4113a53ab"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0475242f447cc6cb8a9dd486d68b2ef7fbee84427124c232bff5f63b1fe11e5"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f90a4cd061914a60bd51c68bcb4357086991bd0bb93d8aa66a6da7701370708f"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:def7400461c3a3f26e49078302e1c1b38f6752342c77e3cf72ce91ca69fb1bc1"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:65794e4048ee837494aea3c21a28ad5fc080994dfba5b036cf84de37f7ad5074"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:faefcc78f53a88f3076b7f8be0a8f8d35133a3ecf7f3770895c25f8813460f08"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:5b4f105deeffa28bbcdff6c49b34e74903139afa690e35d2d9e3c2c2fba18cec"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fdfc3a892927458d98f3d55428ae46b921d1f7543b89382fdb483f5640daaec8"}, + {file = "rpds_py-0.20.0.tar.gz", hash = "sha256:d72a210824facfdaf8768cf2d7ca25a042c30320b3020de2fa04640920d4e121"}, ] [[package]] @@ -4914,18 +4951,18 @@ test = ["array-api-strict", "asv", "gmpy2", "hypothesis (>=6.30)", "mpmath", "po [[package]] name = "setuptools" -version = "72.1.0" +version = "72.2.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-72.1.0-py3-none-any.whl", hash = "sha256:5a03e1860cf56bb6ef48ce186b0e557fdba433237481a9a625176c2831be15d1"}, - {file = "setuptools-72.1.0.tar.gz", hash = "sha256:8d243eff56d095e5817f796ede6ae32941278f542e0f941867cc05ae52b162ec"}, + {file = "setuptools-72.2.0-py3-none-any.whl", hash = "sha256:f11dd94b7bae3a156a95ec151f24e4637fb4fa19c878e4d191bfb8b2d82728c4"}, + {file = "setuptools-72.2.0.tar.gz", hash = "sha256:80aacbf633704e9c8bfa1d99fa5dd4dc59573efcf9e4042c13d3bcef91ac2ef9"}, ] [package.extras] core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.text (>=3.7)", "more-itertools (>=8.8)", "ordered-set (>=3.1.1)", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.11.*)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (<0.4)", "pytest-ruff (>=0.2.1)", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] [[package]] @@ -4988,13 +5025,13 @@ files = [ [[package]] name = "soupsieve" -version = "2.5" +version = "2.6" description = "A modern CSS selector implementation for Beautiful Soup." optional = false python-versions = ">=3.8" files = [ - {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, - {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, + {file = "soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9"}, + {file = "soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb"}, ] [[package]] @@ -5239,13 +5276,13 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] [[package]] name = "sympy" -version = "1.13.1" +version = "1.13.2" description = "Computer algebra system (CAS) in Python" optional = false python-versions = ">=3.8" files = [ - {file = "sympy-1.13.1-py3-none-any.whl", hash = "sha256:db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8"}, - {file = "sympy-1.13.1.tar.gz", hash = "sha256:9cebf7e04ff162015ce31c9c6c9144daa34a93bd082f54fd8f12deca4f47515f"}, + {file = "sympy-1.13.2-py3-none-any.whl", hash = "sha256:c51d75517712f1aed280d4ce58506a4a88d635d6b5dd48b39102a7ae1f3fcfe9"}, + {file = "sympy-1.13.2.tar.gz", hash = "sha256:401449d84d07be9d0c7a46a64bd54fe097667d5e7181bfe67ec777be9e01cb13"}, ] [package.dependencies] @@ -5336,13 +5373,13 @@ files = [ [[package]] name = "tomlkit" -version = "0.13.0" +version = "0.13.2" description = "Style preserving TOML library" optional = false python-versions = ">=3.8" files = [ - {file = "tomlkit-0.13.0-py3-none-any.whl", hash = "sha256:7075d3042d03b80f603482d69bf0c8f345c2b30e41699fd8883227f89972b264"}, - {file = "tomlkit-0.13.0.tar.gz", hash = "sha256:08ad192699734149f5b97b45f1f18dad7eb1b6d16bc72ad0c2335772650d7b72"}, + {file = "tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde"}, + {file = "tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79"}, ] [[package]] @@ -5838,13 +5875,13 @@ zhinst-timing-models = "*" [[package]] name = "zipp" -version = "3.19.2" +version = "3.20.0" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.19.2-py3-none-any.whl", hash = "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c"}, - {file = "zipp-3.19.2.tar.gz", hash = "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19"}, + {file = "zipp-3.20.0-py3-none-any.whl", hash = "sha256:58da6168be89f0be59beb194da1250516fdaa062ccebd30127ac65d30045e10d"}, + {file = "zipp-3.20.0.tar.gz", hash = "sha256:0145e43d89664cfe1a2e533adc75adafed82fe2da404b4bbb6b026c0157bdb31"}, ] [package.extras] @@ -5857,10 +5894,9 @@ los = ["pyvisa-py", "qcodes", "qcodes_contrib_drivers"] qblox = ["pyvisa-py", "qblox-instruments", "qcodes", "qcodes_contrib_drivers"] qm = ["qm-qua", "qualang-tools"] rfsoc = ["qibosoq"] -twpa = ["pyvisa-py", "qcodes", "qcodes_contrib_drivers"] zh = ["laboneq"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.12" -content-hash = "a5bf84cc1a4fa49d87dd8a53e5bc48949e4f1bef7c09fd73aca1f26aed3906cd" +content-hash = "30a7e1b0b8caa372b4076bce71583a537c7ad92555c5249a883c96b799f9cc5f" From aae3c8b403b3078ffcb5fe86ccb7ae604db9dd3b Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 9 Aug 2024 18:44:25 +0200 Subject: [PATCH 0564/1006] feat: Turn Pydantic to strict mode I.e. - strict typing, respecting those specified for the attributes - strict attributes, no extra silently allowed or ignored --- src/qibolab/serialize_.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibolab/serialize_.py b/src/qibolab/serialize_.py index eb8cceb0ab..0edae3e4c0 100644 --- a/src/qibolab/serialize_.py +++ b/src/qibolab/serialize_.py @@ -58,7 +58,7 @@ def eq(obj1: BaseModel, obj2: BaseModel) -> bool: class Model(BaseModel): """Global qibolab model, holding common configurations.""" - model_config = ConfigDict(arbitrary_types_allowed=True, frozen=True) + model_config = ConfigDict(extra="forbid", frozen=True) M = TypeVar("M", bound=BaseModel) From ac3b7e6db0e9ab461213f8b30d9ff3443c05865d Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 9 Aug 2024 18:51:45 +0200 Subject: [PATCH 0565/1006] fix: Reenable arbitrary types, to allow for custom Otherwise it seems to be impossible to even generate a schema. To be investigated... --- src/qibolab/serialize_.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibolab/serialize_.py b/src/qibolab/serialize_.py index 0edae3e4c0..bab6707e17 100644 --- a/src/qibolab/serialize_.py +++ b/src/qibolab/serialize_.py @@ -58,7 +58,7 @@ def eq(obj1: BaseModel, obj2: BaseModel) -> bool: class Model(BaseModel): """Global qibolab model, holding common configurations.""" - model_config = ConfigDict(extra="forbid", frozen=True) + model_config = ConfigDict(arbitrary_types_allowed=True, extra="forbid", frozen=True) M = TypeVar("M", bound=BaseModel) From bbbd2ff834d10f28ea39af0aeb3f422c2229d9b5 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 9 Aug 2024 19:27:07 +0200 Subject: [PATCH 0566/1006] test: Remove already dropped attributes from calls --- tests/pulses/test_envelope.py | 10 ---------- tests/test_instruments_zhinst.py | 24 ------------------------ 2 files changed, 34 deletions(-) diff --git a/tests/pulses/test_envelope.py b/tests/pulses/test_envelope.py index 72ca1d08fa..c29299e98d 100644 --- a/tests/pulses/test_envelope.py +++ b/tests/pulses/test_envelope.py @@ -26,7 +26,6 @@ def test_sampling_rate(shape): pulse = Pulse( duration=40, amplitude=0.9, - frequency=int(100e6), envelope=shape, relative_phase=0, ) @@ -38,7 +37,6 @@ def test_drag_shape(): pulse = Pulse( duration=2, amplitude=1, - frequency=int(4e9), envelope=Drag(rel_sigma=0.5, beta=1), relative_phase=0, ) @@ -75,11 +73,8 @@ def test_rectangular(): pulse = Pulse( duration=50, amplitude=1, - frequency=200_000_000, relative_phase=0, envelope=Rectangular(), - channel="1", - qubit=0, ) assert pulse.duration == 50 @@ -100,11 +95,8 @@ def test_gaussian(): pulse = Pulse( duration=50, amplitude=1, - frequency=200_000_000, relative_phase=0, envelope=Gaussian(rel_sigma=5), - channel="1", - qubit=0, ) assert pulse.duration == 50 @@ -130,10 +122,8 @@ def test_drag(): pulse = Pulse( duration=50, amplitude=1, - frequency=200_000_000, relative_phase=0, envelope=Drag(rel_sigma=0.2, beta=0.2), - qubit=0, ) assert pulse.duration == 50 diff --git a/tests/test_instruments_zhinst.py b/tests/test_instruments_zhinst.py index 9dc5536e9b..002d39a0af 100644 --- a/tests/test_instruments_zhinst.py +++ b/tests/test_instruments_zhinst.py @@ -28,58 +28,40 @@ Pulse( duration=40, amplitude=0.05, - frequency=int(3e9), relative_phase=0.0, envelope=Rectangular(), - channel="ch0", - qubit=0, ), Pulse( duration=40, amplitude=0.05, - frequency=int(3e9), relative_phase=0.0, envelope=Gaussian(rel_sigma=5), - channel="ch0", - qubit=0, ), Pulse( duration=40, amplitude=0.05, - frequency=int(3e9), relative_phase=0.0, envelope=Gaussian(rel_sigma=5), - channel="ch0", - qubit=0, ), Pulse( duration=40, amplitude=0.05, - frequency=int(3e9), relative_phase=0.0, envelope=Drag(rel_sigma=5, beta=0.4), - channel="ch0", - qubit=0, ), Pulse( duration=40, amplitude=0.05, - frequency=int(3e9), relative_phase=0.0, envelope=Snz(t_idling=10, b_amplitude=0.01), - channel="ch0", - qubit=0, ), Pulse( duration=40, amplitude=0.05, - frequency=int(3e9), relative_phase=0.0, envelope=Iir( a=np.array([10, 1]), b=np.array([0.4, 1]), target=Gaussian(rel_sigma=5) ), - channel="ch0", - qubit=0, ), ], ) @@ -100,13 +82,11 @@ def test_classify_sweepers(dummy_qrc): duration=40, amplitude=0.05, envelope=Gaussian(rel_sigma=5), - type=PulseType.DRIVE, ) pulse_2 = Pulse( duration=40, amplitude=0.05, envelope=Rectangular(), - type=PulseType.READOUT, ) amplitude_sweeper = Sweeper(Parameter.amplitude, np.array([1, 2, 3]), [pulse_1]) readout_amplitude_sweeper = Sweeper( @@ -133,13 +113,11 @@ def test_processed_sweeps_pulse_properties(dummy_qrc): duration=40, amplitude=0.05, envelope=Gaussian(rel_sigma=5), - type=PulseType.DRIVE, ) pulse_2 = Pulse( duration=40, amplitude=0.05, envelope=Gaussian(rel_sigma=5), - type=PulseType.DRIVE, ) sweeper_amplitude = Sweeper( Parameter.amplitude, np.array([1, 2, 3]), [pulse_1, pulse_2] @@ -323,7 +301,6 @@ def test_experiment_flow_coupler(dummy_qrc): duration=500, amplitude=1, envelope=Rectangular(), - type=PulseType.COUPLERFLUX, ) ) @@ -455,7 +432,6 @@ def test_experiment_sweep_single_coupler(dummy_qrc, parameter1): duration=500, amplitude=1, envelope=Rectangular(), - type=PulseType.COUPLERFLUX, ) ) From 5fb657fe17560734fabbafd2517b7c300d2c132d Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 9 Aug 2024 23:27:20 +0200 Subject: [PATCH 0567/1006] docs: Fix doctests Remove extra ignored attributes from Pydantic-based classes --- doc/source/main-documentation/qibolab.rst | 6 ------ doc/source/tutorials/lab.rst | 8 +------- doc/source/tutorials/pulses.rst | 2 +- 3 files changed, 2 insertions(+), 14 deletions(-) diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index 01921032c8..b33fd725c0 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -251,11 +251,8 @@ To illustrate, here are some examples of single pulses using the Qibolab API: pulse = Pulse( duration=40, # Pulse duration in ns amplitude=0.5, # Amplitude relative to instrument range - frequency=1e8, # Frequency in Hz relative_phase=0, # Phase in radians envelope=Rectangular(), - channel="channel", - qubit=0, ) In this way, we defined a rectangular drive pulse using the generic Pulse object. @@ -268,11 +265,8 @@ Alternatively, you can achieve the same result using the dedicated :class:`qibol pulse = Pulse( duration=40, # timing, in all qibolab, is expressed in ns amplitude=0.5, # this amplitude is relative to the range of the instrument - frequency=1e8, # frequency are in Hz relative_phase=0, # phases are in radians envelope=Rectangular(), - channel="channel", - qubit=0, ) Both the Pulses objects and the PulseShape object have useful plot functions and several different various helper methods. diff --git a/doc/source/tutorials/lab.rst b/doc/source/tutorials/lab.rst index 764a3775cb..24db261520 100644 --- a/doc/source/tutorials/lab.rst +++ b/doc/source/tutorials/lab.rst @@ -227,13 +227,7 @@ coupler but qibolab will take them into account when calling :class:`qibolab.nat [ ( coupler_01.flux.name, - Pulse( - duration=30, - amplitude=0.005, - frequency=1e9, - envelope=Rectangular(), - qubit=qubit1.name, - ), + Pulse(duration=30, amplitude=0.005, envelope=Rectangular()), ) ], ) diff --git a/doc/source/tutorials/pulses.rst b/doc/source/tutorials/pulses.rst index 303bd47046..a5945d1190 100644 --- a/doc/source/tutorials/pulses.rst +++ b/doc/source/tutorials/pulses.rst @@ -22,7 +22,7 @@ pulses (:class:`qibolab.pulses.Pulse`) through the envelope=Gaussian(rel_sigma=0.2), ), ), - ("channel_1", Delay(duration=100, channel="1")), + ("channel_1", Delay(duration=100)), ( "channel_1", Pulse( From c90229453ad60fa2dbe803ed61468164be2179b2 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 12 Aug 2024 15:48:23 +0200 Subject: [PATCH 0568/1006] feat!: Introduce runcard classes to replace previous functions --- src/qibolab/serialize.py | 82 ++++++++++++++++++---------------------- 1 file changed, 36 insertions(+), 46 deletions(-) diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index e72baed208..0aee124e54 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -10,7 +10,7 @@ from pathlib import Path from typing import Optional, Union -from pydantic import ConfigDict, TypeAdapter +from pydantic import TypeAdapter from qibolab.components import AcquisitionConfig from qibolab.execution_parameters import ConfigUpdate @@ -37,17 +37,41 @@ PLATFORM = "platform.py" -def load_runcard(path: Path) -> dict: - """Load runcard JSON to a dictionary.""" - return json.loads((path / RUNCARD).read_text()) +class NativeGates: + single_qubit: SingleQubitNatives + coupler: SingleQubitNatives + two_qubit: TwoQubitNatives + @classmethod + def load(cls, raw: dict): + """Load qubits, couplers and pairs from the runcard. -def load_settings(runcard: dict) -> Settings: - """Load platform settings section from the runcard.""" - return Settings(**runcard["settings"]) + Uses the native gate section of the runcard to parse the + corresponding :class: `qibolab.qubits.Qubit` and + :class: `qibolab.qubits.QubitPair` objects. + """ + qubits = _load_single_qubit_natives(raw["single_qubit"]) + couplers = _load_single_qubit_natives(raw["coupler"]) + pairs = _load_two_qubit_natives(raw["two_qubit"], qubits) + return cls(qubits, couplers, pairs) -def load_qubit_name(name: str) -> QubitId: +class Runcard: + settings: Settings + components: dict + native_gates: dict + + @classmethod + def load(cls, path: Path): + """Load runcard from JSON.""" + d = json.loads((path / RUNCARD).read_text()) + settings = Settings(**d["settings"]) + components = d["components"] + natives = NativeGates.load(d["native_gates"]) + return cls(settings=settings, components=components, native_gates=natives) + + +def _load_qubit_name(name: str) -> QubitId: """Convert qubit name from string to integer or string.""" try: return int(name) @@ -55,19 +79,8 @@ def load_qubit_name(name: str) -> QubitId: return name -_PulseLike = TypeAdapter(PulseLike, config=ConfigDict(extra="ignore")) -"""Parse a pulse-like object. - -.. note:: - - Extra arguments are ignored, in order to standardize the qubit handling, since the - :cls:`Delay` object has no `qubit` field. - This will be removed once there won't be any need for dedicated couplers handling. -""" - - def _load_pulse(pulse_kwargs: dict): - return _PulseLike.validate_python(pulse_kwargs) + return TypeAdapter(PulseLike).validate_python(pulse_kwargs) def _load_sequence(raw_sequence): @@ -83,7 +96,7 @@ def _load_single_qubit_natives(gates: dict) -> dict[QubitId, Qubit]: """ qubits = {} for q, gatedict in gates.items(): - name = load_qubit_name(q) + name = _load_qubit_name(q) native_gates = SingleQubitNatives( **{ gate_name: ( @@ -94,7 +107,7 @@ def _load_single_qubit_natives(gates: dict) -> dict[QubitId, Qubit]: for gate_name, raw_sequence in gatedict.items() } ) - qubits[name] = Qubit(load_qubit_name(q), native_gates=native_gates) + qubits[name] = Qubit(_load_qubit_name(q), native_gates=native_gates) return qubits @@ -103,7 +116,7 @@ def _load_two_qubit_natives( ) -> dict[QubitPairId, QubitPair]: pairs = {} for pair, gatedict in gates.items(): - q0, q1 = (load_qubit_name(q) for q in pair.split("-")) + q0, q1 = (_load_qubit_name(q) for q in pair.split("-")) native_gates = TwoQubitNatives( **{ gate_name: FixedSequenceFactory(_load_sequence(raw_sequence)) @@ -116,29 +129,6 @@ def _load_two_qubit_natives( return pairs -def load_qubits(runcard: dict) -> tuple[QubitMap, QubitMap, QubitPairMap]: - """Load qubits, couplers and pairs from the runcard. - - Uses the native gate section of the runcard to parse the - corresponding :class: `qibolab.qubits.Qubit` and - :class: `qibolab.qubits.QubitPair` objects. - """ - native_gates = runcard.get("native_gates", {}) - qubits = _load_single_qubit_natives(native_gates.get("single_qubit", {})) - couplers = _load_single_qubit_natives(native_gates.get("coupler", {})) - pairs = _load_two_qubit_natives(native_gates.get("two_qubit", {}), qubits) - return qubits, couplers, pairs - - -def load_instrument_settings( - runcard: dict, instruments: InstrumentMap -) -> InstrumentMap: - """Setup instruments according to the settings given in the runcard.""" - for name, settings in runcard.get("instruments", {}).items(): - instruments[name].setup(**settings) - return instruments - - def dump_qubit_name(name: QubitId) -> str: """Convert qubit name from integer or string to string.""" if isinstance(name, int): From 97e3187c6fa90fb5bbd5b6d4a83cb536a4e76d70 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 12 Aug 2024 15:53:30 +0200 Subject: [PATCH 0569/1006] fix: Fix some types in the runcard classes --- src/qibolab/serialize.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index 0aee124e54..9e10a2f79d 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -38,9 +38,9 @@ class NativeGates: - single_qubit: SingleQubitNatives - coupler: SingleQubitNatives - two_qubit: TwoQubitNatives + single_qubit: dict[QubitId, Qubit] + coupler: dict[QubitId, Qubit] + two_qubit: dict[QubitPairId, QubitPair] @classmethod def load(cls, raw: dict): @@ -59,7 +59,7 @@ def load(cls, raw: dict): class Runcard: settings: Settings components: dict - native_gates: dict + native_gates: NativeGates @classmethod def load(cls, path: Path): From cf2b02ee7ac4f3a7ec1cc318a1605b7c6e1f49e4 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 12 Aug 2024 16:34:15 +0200 Subject: [PATCH 0570/1006] fix: Propagate load classes usage --- src/qibolab/dummy/platform.py | 28 +++++++++------------------- src/qibolab/platform/platform.py | 9 +++------ src/qibolab/serialize.py | 12 +++++++++--- 3 files changed, 21 insertions(+), 28 deletions(-) diff --git a/src/qibolab/dummy/platform.py b/src/qibolab/dummy/platform.py index 05ef378dd4..bec17bce40 100644 --- a/src/qibolab/dummy/platform.py +++ b/src/qibolab/dummy/platform.py @@ -12,12 +12,7 @@ from qibolab.instruments.dummy import DummyInstrument, DummyLocalOscillator from qibolab.kernels import Kernels from qibolab.platform import Platform -from qibolab.serialize import ( - load_instrument_settings, - load_qubits, - load_runcard, - load_settings, -) +from qibolab.serialize import Runcard FOLDER = pathlib.Path(__file__).parent @@ -29,16 +24,13 @@ def create_dummy(): twpa_pump_name = "twpa_pump" twpa_pump = DummyLocalOscillator(twpa_pump_name, "0.0.0.0") - runcard = load_runcard(FOLDER) + runcard = Runcard.load(FOLDER) kernels = Kernels.load(FOLDER) - qubits, couplers, pairs = load_qubits(runcard) - settings = load_settings(runcard) - configs = {} - component_params = runcard["components"] + component_params = runcard.components configs[twpa_pump_name] = OscillatorConfig(**component_params[twpa_pump_name]) - for q, qubit in qubits.items(): + for q, qubit in runcard.native_gates.single_qubit.items(): acquisition_name = f"qubit_{q}/acquire" probe_name = f"qubit_{q}/probe" qubit.probe = IqChannel( @@ -64,20 +56,18 @@ def create_dummy(): qubit.flux = DcChannel(flux_name) configs[flux_name] = DcConfig(**component_params[flux_name]) - for c, coupler in couplers.items(): + for c, coupler in runcard.native_gates.coupler.items(): flux_name = f"coupler_{c}/flux" coupler.flux = DcChannel(flux_name) configs[flux_name] = DcConfig(**component_params[flux_name]) instruments = {instrument.name: instrument, twpa_pump.name: twpa_pump} - instruments = load_instrument_settings(runcard, instruments) return Platform( FOLDER.name, - qubits, - pairs, + runcard.native_gates.single_qubit, + runcard.native_gates.two_qubit, configs, instruments, - settings, - resonator_type="2D", - couplers=couplers, + runcard.settings, + couplers=runcard.native_gates.coupler, ) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 8e2072b994..ea13476361 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -4,7 +4,7 @@ from collections import defaultdict from dataclasses import asdict, dataclass, field from math import prod -from typing import Any, Optional, TypeVar, Union +from typing import Any, Literal, Optional, TypeVar, Union from qibo.config import log, raise_error @@ -143,11 +143,8 @@ class Platform: settings: Settings = field(default_factory=Settings) """Container with default execution settings.""" - resonator_type: Optional[str] = None - """Type of resonator (2D or 3D) in the used QPU. - - Default is 3D for single-qubit chips and 2D for multi-qubit. - """ + resonator_type: Literal["2D", "3D"] = "2D" + """Type of resonator (2D or 3D) in the used QPU.""" couplers: CouplerMap = field(default_factory=dict) """Mapping coupler names to :class:`qibolab.qubits.Qubit` objects.""" diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index 9e10a2f79d..0d3e5c99ed 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -6,7 +6,7 @@ """ import json -from dataclasses import asdict, fields +from dataclasses import asdict, dataclass, fields from pathlib import Path from typing import Optional, Union @@ -37,6 +37,7 @@ PLATFORM = "platform.py" +@dataclass class NativeGates: single_qubit: dict[QubitId, Qubit] coupler: dict[QubitId, Qubit] @@ -56,6 +57,7 @@ def load(cls, raw: dict): return cls(qubits, couplers, pairs) +@dataclass class Runcard: settings: Settings components: dict @@ -171,6 +173,12 @@ def dump_native_gates( } } + # couplers native gates + native_gates["coupler"] = { + dump_qubit_name(q): _dump_natives(qubit.native_gates) + for q, qubit in qubits.items() + } + # two-qubit native gates native_gates["two_qubit"] = {} for pair in pairs.values(): @@ -233,10 +241,8 @@ def dump_runcard( update_configs(configs, updates or []) settings = { - "nqubits": platform.nqubits, "settings": asdict(platform.settings), "qubits": list(platform.qubits), - "instruments": dump_instruments(platform.instruments), "components": dump_component_configs(configs), } From ff89d3c9c11a0f0edadf38ffd17f98719b55ee50 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 12 Aug 2024 16:34:53 +0200 Subject: [PATCH 0571/1006] fix: Propagate load classes usage --- tests/dummy_qrc/qblox/platform.py | 7 ------ tests/dummy_qrc/qm/platform.py | 7 ------ tests/dummy_qrc/qm_octave/platform.py | 7 ------ tests/dummy_qrc/rfsoc/platform.py | 7 ------ tests/dummy_qrc/zurich/parameters.json | 34 ++++++++++++++++++-------- tests/dummy_qrc/zurich/platform.py | 32 +++++++++++------------- tests/test_platform.py | 23 ++++++++--------- 7 files changed, 48 insertions(+), 69 deletions(-) diff --git a/tests/dummy_qrc/qblox/platform.py b/tests/dummy_qrc/qblox/platform.py index 10aa6c0360..1e70f50c4f 100644 --- a/tests/dummy_qrc/qblox/platform.py +++ b/tests/dummy_qrc/qblox/platform.py @@ -7,12 +7,6 @@ from qibolab.instruments.qblox.controller import QbloxController from qibolab.instruments.rohde_schwarz import SGS100A from qibolab.platform import Platform -from qibolab.serialize import ( - load_instrument_settings, - load_qubits, - load_runcard, - load_settings, -) ADDRESS = "192.168.0.6" TIME_OF_FLIGHT = 500 @@ -45,7 +39,6 @@ def create(): twpa_pump.name: twpa_pump, } instruments.update(modules) - instruments = load_instrument_settings(runcard, instruments) # Create channel objects channels = ChannelMap() diff --git a/tests/dummy_qrc/qm/platform.py b/tests/dummy_qrc/qm/platform.py index d0a4311433..2e715e7660 100644 --- a/tests/dummy_qrc/qm/platform.py +++ b/tests/dummy_qrc/qm/platform.py @@ -4,12 +4,6 @@ from qibolab.instruments.dummy import DummyLocalOscillator as LocalOscillator from qibolab.instruments.qm import OPXplus, QMController from qibolab.platform import Platform -from qibolab.serialize import ( - load_instrument_settings, - load_qubits, - load_runcard, - load_settings, -) FOLDER = pathlib.Path(__file__).parent @@ -91,5 +85,4 @@ def create(): instruments.update(controller.opxs) instruments.update({lo.name: lo for lo in local_oscillators}) settings = load_settings(runcard) - instruments = load_instrument_settings(runcard, instruments) return Platform("qm", qubits, pairs, instruments, settings, resonator_type="2D") diff --git a/tests/dummy_qrc/qm_octave/platform.py b/tests/dummy_qrc/qm_octave/platform.py index ac11a5fe8a..296381c807 100644 --- a/tests/dummy_qrc/qm_octave/platform.py +++ b/tests/dummy_qrc/qm_octave/platform.py @@ -4,12 +4,6 @@ from qibolab.instruments.dummy import DummyLocalOscillator as LocalOscillator from qibolab.instruments.qm import Octave, OPXplus, QMController from qibolab.platform import Platform -from qibolab.serialize import ( - load_instrument_settings, - load_qubits, - load_runcard, - load_settings, -) RUNCARD = pathlib.Path(__file__).parent @@ -76,7 +70,6 @@ def create(runcard_path=RUNCARD): instruments.update(controller.opxs) instruments.update(controller.octaves) settings = load_settings(runcard) - instruments = load_instrument_settings(runcard, instruments) return Platform( "qm_octave", qubits, pairs, instruments, settings, resonator_type="2D" ) diff --git a/tests/dummy_qrc/rfsoc/platform.py b/tests/dummy_qrc/rfsoc/platform.py index ef6f5da36c..b2311f6cac 100644 --- a/tests/dummy_qrc/rfsoc/platform.py +++ b/tests/dummy_qrc/rfsoc/platform.py @@ -5,12 +5,6 @@ from qibolab.instruments.rfsoc import RFSoC from qibolab.instruments.rohde_schwarz import SGS100A from qibolab.platform import Platform -from qibolab.serialize import ( - load_instrument_settings, - load_qubits, - load_runcard, - load_settings, -) FOLDER = pathlib.Path(__file__).parent @@ -45,7 +39,6 @@ def create(): instruments = {inst.name: inst for inst in [controller, lo_twpa, lo_era]} settings = load_settings(runcard) - instruments = load_instrument_settings(runcard, instruments) return Platform( str(FOLDER), qubits, pairs, instruments, settings, resonator_type="3D" ) diff --git a/tests/dummy_qrc/zurich/parameters.json b/tests/dummy_qrc/zurich/parameters.json index 5bcd3dec7f..659fd2e1bb 100644 --- a/tests/dummy_qrc/zurich/parameters.json +++ b/tests/dummy_qrc/zurich/parameters.json @@ -76,28 +76,38 @@ }, "qubit_0/acquire": { "delay": 0, + "iq_angle": null, "smearing": 0, - "power_range": 10 + "power_range": 10, + "threshold": null }, "qubit_1/acquire": { "delay": 0, + "iq_angle": null, "smearing": 0, - "power_range": 10 + "power_range": 10, + "threshold": null }, "qubit_2/acquire": { "delay": 0, + "iq_angle": null, "smearing": 0, - "power_range": 10 + "power_range": 10, + "threshold": null }, "qubit_3/acquire": { "delay": 0, + "iq_angle": null, "smearing": 0, - "power_range": 10 + "power_range": 10, + "threshold": null }, "qubit_4/acquire": { "delay": 0, + "iq_angle": null, "smearing": 0, - "power_range": 10 + "power_range": 10, + "threshold": null }, "coupler_0/flux": { "offset": 0.0, @@ -273,7 +283,8 @@ "coupler": { "0": { "CP": [ - ["coupler_0/flux", + [ + "coupler_0/flux", { "duration": 30.0, "amplitude": 0.05, @@ -288,7 +299,8 @@ }, "1": { "CP": [ - ["coupler_1/flux", + [ + "coupler_1/flux", { "duration": 30.0, "amplitude": 0.05, @@ -303,7 +315,8 @@ }, "3": { "CP": [ - ["coupler_3/flux", + [ + "coupler_3/flux", { "duration": 30.0, "amplitude": 0.05, @@ -313,12 +326,13 @@ "width": 0.75 } } - ] ] + ] }, "4": { "CP": [ - ["coupler_4/flux", + [ + "coupler_4/flux", { "duration": 30.0, "amplitude": 0.05, diff --git a/tests/dummy_qrc/zurich/platform.py b/tests/dummy_qrc/zurich/platform.py index a98c6859b1..41a0406fb9 100644 --- a/tests/dummy_qrc/zurich/platform.py +++ b/tests/dummy_qrc/zurich/platform.py @@ -14,12 +14,7 @@ Zurich, ) from qibolab.kernels import Kernels -from qibolab.serialize import ( - load_instrument_settings, - load_qubits, - load_runcard, - load_settings, -) +from qibolab.serialize import Runcard FOLDER = pathlib.Path(__file__).parent @@ -43,13 +38,16 @@ def create(): create_connection(to_instrument="device_shfqc", ports="ZSYNCS/2"), ) - runcard = load_runcard(FOLDER) + runcard = Runcard.load(FOLDER) kernels = Kernels.load(FOLDER) - qubits, couplers, pairs = load_qubits(runcard) - settings = load_settings(runcard) + qubits, couplers, pairs = ( + runcard.native_gates.single_qubit, + runcard.native_gates.coupler, + runcard.native_gates.two_qubit, + ) configs = {} - component_params = runcard["components"] + component_params = runcard.components readout_lo = "readout/lo" drive_los = { 0: "qubit_0_1/drive/lo", @@ -126,15 +124,13 @@ def create(): smearing=50, ) - instruments = {controller.name: controller} - instruments = load_instrument_settings(runcard, instruments) return Platform( - str(FOLDER), - qubits, - pairs, - configs, - instruments, - settings, + name=str(FOLDER), + qubits=qubits, + pairs=pairs, + configs=configs, + instruments={controller.name: controller}, + settings=runcard.settings, resonator_type="3D", couplers=couplers, ) diff --git a/tests/test_platform.py b/tests/test_platform.py index dd216c7033..6b16777d82 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -28,11 +28,10 @@ from qibolab.qubits import Qubit, QubitPair from qibolab.serialize import ( PLATFORM, + Runcard, dump_kernels, dump_platform, dump_runcard, - load_runcard, - load_settings, ) from .conftest import find_instrument @@ -152,17 +151,15 @@ def test_update_configs(platform): def test_dump_runcard(platform, tmp_path): dump_runcard(platform, tmp_path) - final_runcard = load_runcard(tmp_path) + final = Runcard.load(tmp_path) if platform.name == "dummy": - target_runcard = load_runcard(FOLDER) + target = Runcard.load(FOLDER) else: target_path = pathlib.Path(__file__).parent / "dummy_qrc" / f"{platform.name}" - target_runcard = load_runcard(target_path) + target = Runcard.load(target_path) - # assert instrument section is dumped properly in the runcard - target_instruments = target_runcard.pop("instruments") - final_instruments = final_runcard.pop("instruments") - assert final_instruments == target_instruments + # assert components section is dumped properly in the runcard + assert final.components == target.components def test_dump_runcard_with_updates(platform, tmp_path): @@ -174,9 +171,9 @@ def test_dump_runcard_with_updates(platform, tmp_path): qubit.acquisition.name: {"smearing": smearing}, } dump_runcard(platform, tmp_path, [update]) - final_runcard = load_runcard(tmp_path) - assert final_runcard["components"][qubit.drive.name]["frequency"] == frequency - assert final_runcard["components"][qubit.acquisition.name]["smearing"] == smearing + final = Runcard.load(tmp_path) + assert final.components[qubit.drive.name]["frequency"] == frequency + assert final.components[qubit.acquisition.name]["smearing"] == smearing @pytest.mark.parametrize("has_kernels", [False, True]) @@ -213,7 +210,7 @@ def test_dump_platform(tmp_path, has_kernels): dump_platform(platform, tmp_path) - settings = load_settings(load_runcard(tmp_path)) + settings = Runcard.load(tmp_path).settings if has_kernels: kernels = Kernels.load(tmp_path) for qubit in platform.qubits.values(): From b479da37ceccf412becccdcfb2b3dcbccf3e12e0 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 12 Aug 2024 16:42:05 +0200 Subject: [PATCH 0572/1006] docs: Drop usage of loader functions --- doc/source/getting-started/experiment.rst | 16 +++------- doc/source/tutorials/lab.rst | 37 +++++++++-------------- 2 files changed, 19 insertions(+), 34 deletions(-) diff --git a/doc/source/getting-started/experiment.rst b/doc/source/getting-started/experiment.rst index 3908d23f3d..691c492296 100644 --- a/doc/source/getting-started/experiment.rst +++ b/doc/source/getting-started/experiment.rst @@ -39,12 +39,7 @@ In this example, the qubit is controlled by a Zurich Instruments' SHFQC instrume ) from qibolab.instruments.zhinst import ZiChannel, Zurich from qibolab.platform import Platform - from qibolab.serialize import ( - load_instrument_settings, - load_qubits, - load_runcard, - load_settings, - ) + from qibolab.serialize import Runcard NAME = "my_platform" # name of the platform ADDRESS = "localhost" # ip address of the ZI data server @@ -61,8 +56,9 @@ In this example, the qubit is controlled by a Zurich Instruments' SHFQC instrume device_setup.add_instruments(SHFQC("device_shfqc", address="DEV12146")) # Load and parse the runcard (i.e. parameters.json) - runcard = load_runcard(FOLDER) - qubits, _, pairs = load_qubits(runcard) + runcard = Runcard.load(FOLDER) + qubits = runcard.native_gates.single_qubit + pairs = runcard.native_gates.pairs qubit = qubits[0] # define component names, and load their configurations @@ -90,15 +86,13 @@ In this example, the qubit is controlled by a Zurich Instruments' SHFQC instrume controller = Zurich(NAME, device_setup=device_setup, channels=zi_channels) - instruments = load_instrument_settings(runcard, {controller.name: controller}) - settings = load_settings(runcard) return Platform( NAME, qubits, pairs, configs, instruments, - settings, + settings=runcard.settings, resonator_type="3D", ) diff --git a/doc/source/tutorials/lab.rst b/doc/source/tutorials/lab.rst index 24db261520..f05a3a1754 100644 --- a/doc/source/tutorials/lab.rst +++ b/doc/source/tutorials/lab.rst @@ -489,11 +489,7 @@ the above runcard: DcConfig, IqConfig, ) - from qibolab.serialize import ( - load_runcard, - load_qubits, - load_settings, - ) + from qibolab.serialize import Runcard from qibolab.instruments.dummy import DummyInstrument FOLDER = Path.cwd() @@ -505,8 +501,9 @@ the above runcard: instrument = DummyInstrument("my_instrument", "0.0.0.0:0") # create ``Qubit`` and ``QubitPair`` objects by loading the runcard - runcard = load_runcard(folder) - qubits, _, pairs = load_qubits(runcard) + runcard = Runcard.load(folder) + qubits = runcard.native_gates.single_qubit + pairs = runcard.native_gates.pairs # define channels and load component configs configs = {} @@ -534,14 +531,13 @@ the above runcard: # create dictionary of instruments instruments = {instrument.name: instrument} # load ``settings`` from the runcard - settings = load_settings(runcard) return Platform( "my_platform", qubits, pairs, configs, instruments, - settings, + settings=runcard.settings, resonator_type="2D", ) @@ -557,8 +553,10 @@ With the following additions for coupler architectures: instrument = DummyInstrument("my_instrument", "0.0.0.0:0") # create ``Qubit`` and ``QubitPair`` objects by loading the runcard - runcard = load_runcard(folder) - qubits, couplers, pairs = load_qubits(runcard) + runcard = Runcard.load(folder) + qubits = runcard.native_gates.single_qubit + couplers = runcard.native_gates.coupler + pairs = runcard.native_gates.pairs # define channels and load component configs configs = {} @@ -656,11 +654,7 @@ in this case ``"twpa_pump"``. DcConfig, IqConfig, ) - from qibolab.serialize import ( - load_runcard, - load_qubits, - load_settings, - ) + from qibolab.serialize import Runcard from qibolab.instruments.dummy import DummyInstrument FOLDER = Path.cwd() @@ -672,8 +666,9 @@ in this case ``"twpa_pump"``. instrument = DummyInstrument("my_instrument", "0.0.0.0:0") # create ``Qubit`` and ``QubitPair`` objects by loading the runcard - runcard = load_runcard(folder) - qubits, _, pairs = load_qubits(runcard) + runcard = Runcard.load(folder) + qubits = runcard.native_gates.single_qubit + pairs = runcard.native_gates.pairs # define channels and load component configs configs = {} @@ -700,16 +695,12 @@ in this case ``"twpa_pump"``. # create dictionary of instruments instruments = {instrument.name: instrument} - # load instrument settings from the runcard - instruments = load_instrument_settings(runcard, instruments) - # load ``settings`` from the runcard - settings = load_settings(runcard) return Platform( "my_platform", qubits, pairs, configs, instruments, - settings, + settings=runcard.settings, resonator_type="2D", ) From bde2adedaa423da516ed1cd30d357da6a2b3a15a Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 12 Aug 2024 16:53:23 +0200 Subject: [PATCH 0573/1006] fix: Delegate qubit name validation to Pydantic --- src/qibolab/serialize.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index 0d3e5c99ed..07cfc1453b 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -8,9 +8,9 @@ import json from dataclasses import asdict, dataclass, fields from pathlib import Path -from typing import Optional, Union +from typing import Annotated, Optional, Union -from pydantic import TypeAdapter +from pydantic import Field, TypeAdapter from qibolab.components import AcquisitionConfig from qibolab.execution_parameters import ConfigUpdate @@ -75,10 +75,9 @@ def load(cls, path: Path): def _load_qubit_name(name: str) -> QubitId: """Convert qubit name from string to integer or string.""" - try: - return int(name) - except ValueError: - return name + return TypeAdapter( + Annotated[Union[int, str], Field(union_mode="left_to_right")] + ).validate_python(name) def _load_pulse(pulse_kwargs: dict): From 7abb40bc1f1529466fdc889d50641fcaed403e3b Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 12 Aug 2024 17:34:58 +0200 Subject: [PATCH 0574/1006] fix: Replace dump interface --- src/qibolab/serialize.py | 176 +++++++++++++++------------------------ tests/test_platform.py | 16 ++-- 2 files changed, 70 insertions(+), 122 deletions(-) diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index 07cfc1453b..d196135ca5 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -21,14 +21,7 @@ SingleQubitNatives, TwoQubitNatives, ) -from qibolab.platform.platform import ( - InstrumentMap, - Platform, - QubitMap, - QubitPairMap, - Settings, - update_configs, -) +from qibolab.platform.platform import Platform, Settings, update_configs from qibolab.pulses import PulseSequence from qibolab.pulses.pulse import PulseLike from qibolab.qubits import Qubit, QubitId, QubitPair, QubitPairId @@ -56,6 +49,32 @@ def load(cls, raw: dict): pairs = _load_two_qubit_natives(raw["two_qubit"], qubits) return cls(qubits, couplers, pairs) + def dump(self) -> dict: + """Serialize native gates section to dictionary. + + It follows the runcard format, using qubit and pair objects. + """ + native_gates = { + "single_qubit": { + dump_qubit_name(q): _dump_natives(qubit.native_gates) + for q, qubit in self.single_qubit.items() + } + } + + native_gates["coupler"] = { + dump_qubit_name(q): _dump_natives(qubit.native_gates) + for q, qubit in self.coupler.items() + } + + native_gates["two_qubit"] = {} + for pair in self.two_qubit.values(): + natives = _dump_natives(pair.native_gates) + if len(natives) > 0: + pair_name = f"{pair.qubit1}-{pair.qubit2}" + native_gates["two_qubit"][pair_name] = natives + + return native_gates + @dataclass class Runcard: @@ -72,6 +91,40 @@ def load(cls, path: Path): natives = NativeGates.load(d["native_gates"]) return cls(settings=settings, components=components, native_gates=natives) + @classmethod + def from_platform(cls, platform: Platform): + return cls( + settings=platform.settings, + components=platform.configs, + native_gates=NativeGates( + single_qubit=platform.qubits, + coupler=platform.couplers, + two_qubit=platform.pairs, + ), + ) + + def dump(self, path: Path, updates: Optional[list[ConfigUpdate]] = None): + """Platform serialization as runcard (json) and kernels (npz). + + The file saved follows the format explained in :ref:`Using runcards `. + + The requested ``path`` is the folder where the json and npz will be dumped. + + ``updates`` is an optional list if updates for platform configs. Later entries in the list take precedence over earlier ones (if they happen to update the same thing). + """ + _dump_kernels(self, path=path) + + configs = self.components.copy() + update_configs(configs, updates or []) + + settings = { + "settings": asdict(self.settings), + "components": _dump_component_configs(configs), + "native_gates": self.native_gates.dump(), + } + + (path / RUNCARD).write_text(json.dumps(settings, sort_keys=False, indent=4)) + def _load_qubit_name(name: str) -> QubitId: """Convert qubit name from string to integer or string.""" @@ -159,60 +212,7 @@ def _dump_natives(natives: Union[SingleQubitNatives, TwoQubitNatives]): return data -def dump_native_gates( - qubits: QubitMap, pairs: QubitPairMap, couplers: Optional[QubitMap] = None -) -> dict: - """Dump native gates section to dictionary following the runcard format, - using qubit and pair objects.""" - # single-qubit native gates - native_gates = { - "single_qubit": { - dump_qubit_name(q): _dump_natives(qubit.native_gates) - for q, qubit in qubits.items() - } - } - - # couplers native gates - native_gates["coupler"] = { - dump_qubit_name(q): _dump_natives(qubit.native_gates) - for q, qubit in qubits.items() - } - - # two-qubit native gates - native_gates["two_qubit"] = {} - for pair in pairs.values(): - natives = _dump_natives(pair.native_gates) - if len(natives) > 0: - pair_name = f"{pair.qubit1}-{pair.qubit2}" - native_gates["two_qubit"][pair_name] = natives - - return native_gates - - -def dump_instruments(instruments: InstrumentMap) -> dict: - """Dump instrument settings to a dictionary following the runcard - format.""" - # Qblox modules settings are dictionaries and not dataclasses - data = {} - for name, instrument in instruments.items(): - try: - # TODO: Migrate all instruments to this approach - # (I think it is also useful for qblox) - settings = instrument.dump() - if len(settings) > 0: - data[name] = settings - except AttributeError: - settings = instrument.settings - if settings is not None: - if isinstance(settings, dict): - data[name] = settings - else: - data[name] = settings.dump() - - return data - - -def dump_component_configs(component_configs) -> dict: +def _dump_component_configs(component_configs) -> dict: """Dump channel configs.""" components = {} for name, cfg in component_configs.items(): @@ -222,37 +222,7 @@ def dump_component_configs(component_configs) -> dict: return components -def dump_runcard( - platform: Platform, path: Path, updates: Optional[list[ConfigUpdate]] = None -): - """Serializes the platform and saves it as a json runcard file. - - The file saved follows the format explained in :ref:`Using runcards `. - - Args: - platform (qibolab.platform.Platform): The platform to be serialized. - path (pathlib.Path): Path that the json file will be saved. - updates: List if updates for platform configs. - Later entries in the list take precedence over earlier ones (if they happen to update the same thing). - """ - - configs = platform.configs.copy() - update_configs(configs, updates or []) - - settings = { - "settings": asdict(platform.settings), - "qubits": list(platform.qubits), - "components": dump_component_configs(configs), - } - - settings["native_gates"] = dump_native_gates( - platform.qubits, platform.pairs, platform.couplers - ) - - (path / RUNCARD).write_text(json.dumps(settings, sort_keys=False, indent=4)) - - -def dump_kernels(platform: Platform, path: Path): +def _dump_kernels(runcard: Runcard, path: Path): """Creates Kernels instance from platform and dumps as npz. Args: @@ -262,27 +232,11 @@ def dump_kernels(platform: Platform, path: Path): # create kernels kernels = Kernels() - for qubit in platform.qubits.values(): - kernel = platform.configs[qubit.acquisition.name].kernel + for qubit in runcard.native_gates.single_qubit.values(): + kernel = runcard.components[qubit.acquisition.name].kernel if kernel is not None: kernels[qubit.name] = kernel # dump only if not None if len(kernels) > 0: kernels.dump(path) - - -def dump_platform( - platform: Platform, path: Path, updates: Optional[list[ConfigUpdate]] = None -): - """Platform serialization as runcard (json) and kernels (npz). - - Args: - platform (qibolab.platform.Platform): The platform to be serialized. - path (pathlib.Path): Path where json and npz will be dumped. - updates: List if updates for platform configs. - Later entries in the list take precedence over earlier ones (if they happen to update the same thing). - """ - - dump_kernels(platform=platform, path=path) - dump_runcard(platform=platform, path=path, updates=updates) diff --git a/tests/test_platform.py b/tests/test_platform.py index 6b16777d82..4730561fa2 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -26,13 +26,7 @@ from qibolab.platform.platform import update_configs from qibolab.pulses import Delay, Gaussian, Pulse, PulseSequence, Rectangular from qibolab.qubits import Qubit, QubitPair -from qibolab.serialize import ( - PLATFORM, - Runcard, - dump_kernels, - dump_platform, - dump_runcard, -) +from qibolab.serialize import PLATFORM, Runcard, _dump_kernels from .conftest import find_instrument @@ -150,7 +144,7 @@ def test_update_configs(platform): def test_dump_runcard(platform, tmp_path): - dump_runcard(platform, tmp_path) + Runcard.from_platform(platform).dump(tmp_path) final = Runcard.load(tmp_path) if platform.name == "dummy": target = Runcard.load(FOLDER) @@ -170,7 +164,7 @@ def test_dump_runcard_with_updates(platform, tmp_path): qubit.drive.name: {"frequency": frequency}, qubit.acquisition.name: {"smearing": smearing}, } - dump_runcard(platform, tmp_path, [update]) + Runcard.from_platform(platform).dump(tmp_path, [update]) final = Runcard.load(tmp_path) assert final.components[qubit.drive.name]["frequency"] == frequency assert final.components[qubit.acquisition.name]["smearing"] == smearing @@ -186,7 +180,7 @@ def test_kernels(tmp_path, has_kernels): if isinstance(config, AcquisitionConfig): platform.configs[name] = replace(config, kernel=np.random.rand(10)) - dump_kernels(platform, tmp_path) + _dump_kernels(Runcard.from_platform(platform), tmp_path) if has_kernels: kernels = Kernels.load(tmp_path) @@ -208,7 +202,7 @@ def test_dump_platform(tmp_path, has_kernels): if isinstance(config, AcquisitionConfig): platform.configs[name] = replace(config, kernel=np.random.rand(10)) - dump_platform(platform, tmp_path) + Runcard.from_platform(platform).dump(tmp_path) settings = Runcard.load(tmp_path).settings if has_kernels: From a47c69b6127161febaf4f4f69d156194a9fd7d73 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 12 Aug 2024 18:47:37 +0200 Subject: [PATCH 0575/1006] fix: Nest runcard within platform --- src/qibolab/dummy/platform.py | 10 +--- src/qibolab/platform/platform.py | 89 ++++++++++-------------------- src/qibolab/serialize.py | 84 +++++++++++++++++++--------- tests/dummy_qrc/zurich/platform.py | 5 +- tests/test_backends.py | 6 +- tests/test_platform.py | 34 ++++++++---- 6 files changed, 117 insertions(+), 111 deletions(-) diff --git a/src/qibolab/dummy/platform.py b/src/qibolab/dummy/platform.py index bec17bce40..f106f0118f 100644 --- a/src/qibolab/dummy/platform.py +++ b/src/qibolab/dummy/platform.py @@ -61,13 +61,9 @@ def create_dummy(): coupler.flux = DcChannel(flux_name) configs[flux_name] = DcConfig(**component_params[flux_name]) - instruments = {instrument.name: instrument, twpa_pump.name: twpa_pump} return Platform( FOLDER.name, - runcard.native_gates.single_qubit, - runcard.native_gates.two_qubit, - configs, - instruments, - runcard.settings, - couplers=runcard.native_gates.coupler, + runcard=runcard, + configs=configs, + instruments={instrument.name: instrument, twpa_pump.name: twpa_pump}, ) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index ea13476361..f6ccc4c371 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -1,26 +1,22 @@ """A platform for executing quantum algorithms.""" -import dataclasses from collections import defaultdict -from dataclasses import asdict, dataclass, field +from dataclasses import asdict, dataclass from math import prod -from typing import Any, Literal, Optional, TypeVar, Union +from typing import Any, Literal, Optional, TypeVar from qibo.config import log, raise_error from qibolab.components import Config -from qibolab.execution_parameters import ConfigUpdate, ExecutionParameters +from qibolab.execution_parameters import ExecutionParameters from qibolab.instruments.abstract import Controller, Instrument, InstrumentId from qibolab.pulses import Delay, PulseSequence -from qibolab.qubits import Qubit, QubitId, QubitPair, QubitPairId -from qibolab.serialize_ import replace +from qibolab.qubits import QubitId, QubitPairId +from qibolab.serialize import QubitMap, QubitPairMap, Runcard, Settings, update_configs from qibolab.sweeper import ParallelSweepers from qibolab.unrolling import batch InstrumentMap = dict[InstrumentId, Instrument] -QubitMap = dict[QubitId, Qubit] -CouplerMap = dict[QubitId, Qubit] -QubitPairMap = dict[QubitPairId, QubitPair] NS_TO_SEC = 1e-9 @@ -64,23 +60,6 @@ def unroll_sequences( return total_sequence, readout_map -def update_configs(configs: dict[str, Config], updates: list[ConfigUpdate]): - """Apply updates to configs in place. - - Args: - configs: configs to update. Maps component name to respective config. - updates: list of config updates. Later entries in the list take precedence over earlier entries - (if they happen to update the same thing). - """ - for update in updates: - for name, changes in update.items(): - if name not in configs: - raise ValueError( - f"Cannot update configuration for unknown component {name}" - ) - configs[name] = dataclasses.replace(configs[name], **changes) - - def estimate_duration( sequences: list[PulseSequence], options: ExecutionParameters, @@ -98,28 +77,7 @@ def estimate_duration( ) -@dataclass -class Settings: - """Default execution settings read from the runcard.""" - - nshots: int = 1024 - """Default number of repetitions when executing a pulse sequence.""" - relaxation_time: int = int(1e5) - """Time in ns to wait for the qubit to relax to its ground state between - shots.""" - - def fill(self, options: ExecutionParameters): - """Use default values for missing execution options.""" - if options.nshots is None: - options = replace(options, nshots=self.nshots) - - if options.relaxation_time is None: - options = replace(options, relaxation_time=self.relaxation_time) - - return options - - -def _channels_map(elements: Union[QubitMap, CouplerMap]): +def _channels_map(elements: QubitMap): """Map channel names to element (qubit or coupler).""" return {ch.name: id for id, el in elements.items() for ch in el.channels} @@ -130,25 +88,15 @@ class Platform: name: str """Name of the platform.""" - qubits: QubitMap - """Mapping qubit names to :class:`qibolab.qubits.Qubit` objects.""" - pairs: QubitPairMap - """Mapping tuples of qubit names to :class:`qibolab.qubits.QubitPair` - objects.""" + runcard: Runcard + """...""" configs: dict[str, Config] """Mapping name of component to its default config.""" instruments: InstrumentMap """Mapping instrument names to :class:`qibolab.instruments.abstract.Instrument` objects.""" - - settings: Settings = field(default_factory=Settings) - """Container with default execution settings.""" resonator_type: Literal["2D", "3D"] = "2D" """Type of resonator (2D or 3D) in the used QPU.""" - - couplers: CouplerMap = field(default_factory=dict) - """Mapping coupler names to :class:`qibolab.qubits.Qubit` objects.""" - is_connected: bool = False """Flag for whether we are connected to the physical instruments.""" @@ -160,6 +108,27 @@ def __post_init__(self): def __str__(self): return self.name + @property + def qubits(self) -> QubitMap: + """Mapping qubit names to :class:`qibolab.qubits.Qubit` objects.""" + return self.runcard.native_gates.single_qubit + + @property + def couplers(self) -> QubitMap: + """Mapping coupler names to :class:`qibolab.qubits.Qubit` objects.""" + return self.runcard.native_gates.coupler + + @property + def pairs(self) -> QubitPairMap: + """Mapping tuples of qubit names to :class:`qibolab.qubits.QubitPair` + objects.""" + return self.runcard.native_gates.two_qubit + + @property + def settings(self) -> Settings: + """Container with default execution settings.""" + return self.runcard.settings + @property def nqubits(self) -> int: """Total number of usable qubits in the QPU.""" diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index d196135ca5..4d33de32ac 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -5,15 +5,16 @@ example for more details. """ +import dataclasses import json -from dataclasses import asdict, dataclass, fields +from dataclasses import asdict, dataclass, field, fields from pathlib import Path from typing import Annotated, Optional, Union from pydantic import Field, TypeAdapter -from qibolab.components import AcquisitionConfig -from qibolab.execution_parameters import ConfigUpdate +from qibolab.components import AcquisitionConfig, Config +from qibolab.execution_parameters import ConfigUpdate, ExecutionParameters from qibolab.kernels import Kernels from qibolab.native import ( FixedSequenceFactory, @@ -21,14 +22,55 @@ SingleQubitNatives, TwoQubitNatives, ) -from qibolab.platform.platform import Platform, Settings, update_configs from qibolab.pulses import PulseSequence from qibolab.pulses.pulse import PulseLike from qibolab.qubits import Qubit, QubitId, QubitPair, QubitPairId +from qibolab.serialize_ import replace RUNCARD = "parameters.json" PLATFORM = "platform.py" +QubitMap = dict[QubitId, Qubit] +QubitPairMap = dict[QubitPairId, QubitPair] + + +def update_configs(configs: dict[str, Config], updates: list[ConfigUpdate]): + """Apply updates to configs in place. + + Args: + configs: configs to update. Maps component name to respective config. + updates: list of config updates. Later entries in the list take precedence over earlier entries + (if they happen to update the same thing). + """ + for update in updates: + for name, changes in update.items(): + if name not in configs: + raise ValueError( + f"Cannot update configuration for unknown component {name}" + ) + configs[name] = dataclasses.replace(configs[name], **changes) + + +@dataclass +class Settings: + """Default execution settings read from the runcard.""" + + nshots: int = 1000 + """Default number of repetitions when executing a pulse sequence.""" + relaxation_time: int = int(1e5) + """Time in ns to wait for the qubit to relax to its ground state between + shots.""" + + def fill(self, options: ExecutionParameters): + """Use default values for missing execution options.""" + if options.nshots is None: + options = replace(options, nshots=self.nshots) + + if options.relaxation_time is None: + options = replace(options, relaxation_time=self.relaxation_time) + + return options + @dataclass class NativeGates: @@ -56,13 +98,13 @@ def dump(self) -> dict: """ native_gates = { "single_qubit": { - dump_qubit_name(q): _dump_natives(qubit.native_gates) + _dump_qubit_name(q): _dump_natives(qubit.native_gates) for q, qubit in self.single_qubit.items() } } native_gates["coupler"] = { - dump_qubit_name(q): _dump_natives(qubit.native_gates) + _dump_qubit_name(q): _dump_natives(qubit.native_gates) for q, qubit in self.coupler.items() } @@ -78,9 +120,10 @@ def dump(self) -> dict: @dataclass class Runcard: - settings: Settings - components: dict - native_gates: NativeGates + settings: Settings = field(default_factory=Settings) + components: dict = field(default_factory=dict) + # TODO: add gates template + native_gates: NativeGates = field(default_factory=dict) @classmethod def load(cls, path: Path): @@ -91,18 +134,6 @@ def load(cls, path: Path): natives = NativeGates.load(d["native_gates"]) return cls(settings=settings, components=components, native_gates=natives) - @classmethod - def from_platform(cls, platform: Platform): - return cls( - settings=platform.settings, - components=platform.configs, - native_gates=NativeGates( - single_qubit=platform.qubits, - coupler=platform.couplers, - two_qubit=platform.pairs, - ), - ) - def dump(self, path: Path, updates: Optional[list[ConfigUpdate]] = None): """Platform serialization as runcard (json) and kernels (npz). @@ -112,8 +143,6 @@ def dump(self, path: Path, updates: Optional[list[ConfigUpdate]] = None): ``updates`` is an optional list if updates for platform configs. Later entries in the list take precedence over earlier ones (if they happen to update the same thing). """ - _dump_kernels(self, path=path) - configs = self.components.copy() update_configs(configs, updates or []) @@ -183,7 +212,7 @@ def _load_two_qubit_natives( return pairs -def dump_qubit_name(name: QubitId) -> str: +def _dump_qubit_name(name: QubitId) -> str: """Convert qubit name from integer or string to string.""" if isinstance(name, int): return str(name) @@ -222,7 +251,8 @@ def _dump_component_configs(component_configs) -> dict: return components -def _dump_kernels(runcard: Runcard, path: Path): +# TODO: kernels are part of the parameters, they should not be dumped separately +def dump_kernels(platform: "Platform", path: Path): """Creates Kernels instance from platform and dumps as npz. Args: @@ -232,8 +262,8 @@ def _dump_kernels(runcard: Runcard, path: Path): # create kernels kernels = Kernels() - for qubit in runcard.native_gates.single_qubit.values(): - kernel = runcard.components[qubit.acquisition.name].kernel + for qubit in platform.qubits.values(): + kernel = platform.configs[qubit.acquisition.name].kernel if kernel is not None: kernels[qubit.name] = kernel diff --git a/tests/dummy_qrc/zurich/platform.py b/tests/dummy_qrc/zurich/platform.py index 41a0406fb9..63359e4ae2 100644 --- a/tests/dummy_qrc/zurich/platform.py +++ b/tests/dummy_qrc/zurich/platform.py @@ -126,11 +126,8 @@ def create(): return Platform( name=str(FOLDER), - qubits=qubits, - pairs=pairs, configs=configs, + runcard=runcard, instruments={controller.name: controller}, - settings=runcard.settings, resonator_type="3D", - couplers=couplers, ) diff --git a/tests/test_backends.py b/tests/test_backends.py index c7d7b90b3a..e33296daab 100644 --- a/tests/test_backends.py +++ b/tests/test_backends.py @@ -108,8 +108,10 @@ def dummy_string_qubit_names(): platform = create_platform("dummy") for q, qubit in platform.qubits.items(): qubit.name = f"A{q}" - platform.qubits = {qubit.name: qubit for qubit in platform.qubits.values()} - platform.pairs = { + platform.runcard.native_gates.single_qubit = { + qubit.name: qubit for qubit in platform.qubits.values() + } + platform.runcard.native_gates.two_qubit = { (f"A{q0}", f"A{q1}"): pair for (q0, q1), pair in platform.pairs.items() } return platform diff --git a/tests/test_platform.py b/tests/test_platform.py index 4730561fa2..f7706b80ee 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -26,7 +26,7 @@ from qibolab.platform.platform import update_configs from qibolab.pulses import Delay, Gaussian, Pulse, PulseSequence, Rectangular from qibolab.qubits import Qubit, QubitPair -from qibolab.serialize import PLATFORM, Runcard, _dump_kernels +from qibolab.serialize import PLATFORM, NativeGates, Runcard, dump_kernels from .conftest import find_instrument @@ -55,17 +55,29 @@ def test_create_platform_error(): def test_platform_basics(): - platform = Platform("ciao", {}, {}, {}, {}) + platform = Platform( + name="ciao", + runcard=Runcard(native_gates=NativeGates({}, {}, {})), + configs={}, + instruments={}, + ) assert str(platform) == "ciao" assert platform.topology == [] qs = {q: Qubit(q) for q in range(10)} platform2 = Platform( - "come va?", - qs, - {(q1, q2): QubitPair(q1, q2) for q1 in range(3) for q2 in range(4, 8)}, - {}, - {}, + name="come va?", + runcard=Runcard( + native_gates=NativeGates( + single_qubit=qs, + two_qubit={ + (q1, q2): QubitPair(q1, q2) for q1 in range(3) for q2 in range(4, 8) + }, + coupler={}, + ) + ), + instruments={}, + configs={}, ) assert str(platform2) == "come va?" assert (1, 6) in platform2.topology @@ -144,7 +156,7 @@ def test_update_configs(platform): def test_dump_runcard(platform, tmp_path): - Runcard.from_platform(platform).dump(tmp_path) + platform.runcard.dump(tmp_path) final = Runcard.load(tmp_path) if platform.name == "dummy": target = Runcard.load(FOLDER) @@ -164,7 +176,7 @@ def test_dump_runcard_with_updates(platform, tmp_path): qubit.drive.name: {"frequency": frequency}, qubit.acquisition.name: {"smearing": smearing}, } - Runcard.from_platform(platform).dump(tmp_path, [update]) + platform.runcard.dump(tmp_path, [update]) final = Runcard.load(tmp_path) assert final.components[qubit.drive.name]["frequency"] == frequency assert final.components[qubit.acquisition.name]["smearing"] == smearing @@ -180,7 +192,7 @@ def test_kernels(tmp_path, has_kernels): if isinstance(config, AcquisitionConfig): platform.configs[name] = replace(config, kernel=np.random.rand(10)) - _dump_kernels(Runcard.from_platform(platform), tmp_path) + dump_kernels(platform.runcard, tmp_path) if has_kernels: kernels = Kernels.load(tmp_path) @@ -202,7 +214,7 @@ def test_dump_platform(tmp_path, has_kernels): if isinstance(config, AcquisitionConfig): platform.configs[name] = replace(config, kernel=np.random.rand(10)) - Runcard.from_platform(platform).dump(tmp_path) + platform.runcard.dump(tmp_path) settings = Runcard.load(tmp_path).settings if has_kernels: From d7b867e732197fe89635f8222cd8dde9af32a2d1 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 12 Aug 2024 19:36:11 +0200 Subject: [PATCH 0576/1006] feat: Automate configs deserialization --- src/qibolab/components/configs.py | 38 ++++++++++++++-------- src/qibolab/dummy/parameters.json | 44 +++++++++++++++++++++++--- src/qibolab/dummy/platform.py | 24 +++----------- src/qibolab/platform/platform.py | 4 +-- src/qibolab/serialize.py | 31 +++++++++++------- tests/conftest.py | 2 +- tests/dummy_qrc/zurich/parameters.json | 28 ++++++++++++++++ tests/dummy_qrc/zurich/platform.py | 3 +- tests/test_platform.py | 29 +++++++++-------- 9 files changed, 135 insertions(+), 68 deletions(-) diff --git a/src/qibolab/components/configs.py b/src/qibolab/components/configs.py index 72f63a39ea..3609b1d7ad 100644 --- a/src/qibolab/components/configs.py +++ b/src/qibolab/components/configs.py @@ -7,10 +7,12 @@ configuration defined by these classes. """ -from dataclasses import dataclass, field -from typing import Optional, Union +from typing import Annotated, Literal, Optional, Union import numpy.typing as npt +from pydantic import Field + +from qibolab.serialize_ import Model __all__ = [ "DcConfig", @@ -22,25 +24,26 @@ ] -@dataclass(frozen=True) -class DcConfig: +class DcConfig(Model): """Configuration for a channel that can be used to send DC pulses (i.e. just envelopes without modulation).""" + kind: Literal["dc"] = "dc" + offset: float """DC offset/bias of the channel.""" -@dataclass(frozen=True) -class OscillatorConfig: +class OscillatorConfig(Model): """Configuration for an oscillator.""" + kind: Literal["oscillator"] = "oscillator" + frequency: float power: float -@dataclass(frozen=True) -class IqMixerConfig: +class IqMixerConfig(Model): """Configuration for IQ mixer. Mixers usually have various imperfections, and one needs to @@ -48,6 +51,8 @@ class IqMixerConfig: configuration. """ + kind: Literal["iq-mixer"] = "iq-mixer" + offset_i: float = 0.0 """DC offset for the I component.""" offset_q: float = 0.0 @@ -60,21 +65,23 @@ class IqMixerConfig: imbalance.""" -@dataclass(frozen=True) -class IqConfig: +class IqConfig(Model): """Configuration for an IQ channel.""" + kind: Literal["iq"] = "iq" + frequency: float """The carrier frequency of the channel.""" -@dataclass(frozen=True) -class AcquisitionConfig: +class AcquisitionConfig(Model): """Configuration for acquisition channel. Currently, in qibolab, acquisition channels are FIXME: """ + kind: Literal["acquisition"] = "acquisition" + delay: float """Delay between readout pulse start and acquisition start.""" smearing: float @@ -88,9 +95,12 @@ class AcquisitionConfig: iq_angle: Optional[float] = None """Signal angle in the IQ-plane for disciminating ground and excited states.""" - kernel: Optional[npt.NDArray] = field(default=None, repr=False) + kernel: Annotated[Optional[npt.NDArray], Field(default=None, repr=False)] """Integration weights to be used when post-processing the acquired signal.""" -Config = Union[DcConfig, IqMixerConfig, OscillatorConfig, IqConfig, AcquisitionConfig] +Config = Annotated[ + Union[DcConfig, IqMixerConfig, OscillatorConfig, IqConfig, AcquisitionConfig], + Field(discriminator="kind"), +] diff --git a/src/qibolab/dummy/parameters.json b/src/qibolab/dummy/parameters.json index d894f20dbd..60c98cc76f 100644 --- a/src/qibolab/dummy/parameters.json +++ b/src/qibolab/dummy/parameters.json @@ -19,108 +19,138 @@ }, "components": { "qubit_0/drive": { + "kind": "iq", "frequency": 4000000000 }, "qubit_1/drive": { + "kind": "iq", "frequency": 4200000000 }, "qubit_2/drive": { + "kind": "iq", "frequency": 4500000000 }, "qubit_3/drive": { + "kind": "iq", "frequency": 4150000000 }, "qubit_4/drive": { + "kind": "iq", "frequency": 4155663000 }, "qubit_0/drive12": { + "kind": "iq", "frequency": 4700000000 }, "qubit_1/drive12": { + "kind": "iq", "frequency": 4855663000 }, "qubit_2/drive12": { + "kind": "iq", "frequency": 2700000000 }, "qubit_3/drive12": { + "kind": "iq", "frequency": 5855663000 }, "qubit_4/drive12": { + "kind": "iq", "frequency": 5855663000 }, "qubit_0/flux": { + "kind": "dc", "offset": -0.1 }, "qubit_1/flux": { + "kind": "dc", "offset": 0.0 }, "qubit_2/flux": { + "kind": "dc", "offset": 0.1 }, "qubit_3/flux": { + "kind": "dc", "offset": 0.2 }, "qubit_4/flux": { + "kind": "dc", "offset": 0.15 }, "qubit_0/probe": { + "kind": "iq", "frequency": 5200000000 }, "qubit_1/probe": { + "kind": "iq", "frequency": 4900000000 }, "qubit_2/probe": { + "kind": "iq", "frequency": 6100000000 }, "qubit_3/probe": { + "kind": "iq", "frequency": 5800000000 }, "qubit_4/probe": { + "kind": "iq", "frequency": 5500000000 }, "qubit_0/acquire": { + "kind": "acquisition", "delay": 0, "smearing": 0, "threshold": 0.0, "iq_angle": 0.0 }, "qubit_1/acquire": { + "kind": "acquisition", "delay": 0, "smearing": 0, "threshold": 0.0, "iq_angle": 0.0 }, "qubit_2/acquire": { + "kind": "acquisition", "delay": 0, "smearing": 0, "threshold": 0.0, "iq_angle": 0.0 }, "qubit_3/acquire": { + "kind": "acquisition", "delay": 0, "smearing": 0, "threshold": 0.0, "iq_angle": 0.0 }, "qubit_4/acquire": { + "kind": "acquisition", "delay": 0, "smearing": 0, "threshold": 0.0, "iq_angle": 0.0 }, "coupler_0/flux": { + "kind": "dc", "offset": 0.0 }, "coupler_1/flux": { + "kind": "dc", "offset": 0.0 }, "coupler_3/flux": { + "kind": "dc", "offset": 0.0 }, "coupler_4/flux": { + "kind": "dc", "offset": 0.0 }, "twpa_pump": { + "kind": "oscillator", "power": 10, "frequency": 1000000000.0 } @@ -311,7 +341,8 @@ "coupler": { "0": { "CP": [ - ["coupler_0/flux", + [ + "coupler_0/flux", { "duration": 30.0, "amplitude": 0.05, @@ -326,7 +357,8 @@ }, "1": { "CP": [ - ["coupler_1/flux", + [ + "coupler_1/flux", { "duration": 30.0, "amplitude": 0.05, @@ -341,7 +373,8 @@ }, "3": { "CP": [ - ["coupler_3/flux", + [ + "coupler_3/flux", { "duration": 30.0, "amplitude": 0.05, @@ -356,7 +389,8 @@ }, "4": { "CP": [ - ["coupler_4/flux", + [ + "coupler_4/flux", { "duration": 30.0, "amplitude": 0.05, @@ -369,7 +403,7 @@ ] ] } - }, + }, "two_qubit": { "0-2": { "CZ": [ diff --git a/src/qibolab/dummy/platform.py b/src/qibolab/dummy/platform.py index f106f0118f..77d3bf9295 100644 --- a/src/qibolab/dummy/platform.py +++ b/src/qibolab/dummy/platform.py @@ -1,18 +1,11 @@ import pathlib -from qibolab.components import ( - AcquireChannel, - AcquisitionConfig, - DcChannel, - DcConfig, - IqChannel, - IqConfig, - OscillatorConfig, -) +from qibolab.components import AcquireChannel, DcChannel, IqChannel from qibolab.instruments.dummy import DummyInstrument, DummyLocalOscillator from qibolab.kernels import Kernels from qibolab.platform import Platform from qibolab.serialize import Runcard +from qibolab.serialize_ import replace FOLDER = pathlib.Path(__file__).parent @@ -27,9 +20,7 @@ def create_dummy(): runcard = Runcard.load(FOLDER) kernels = Kernels.load(FOLDER) - configs = {} - component_params = runcard.components - configs[twpa_pump_name] = OscillatorConfig(**component_params[twpa_pump_name]) + configs = runcard.configs for q, qubit in runcard.native_gates.single_qubit.items(): acquisition_name = f"qubit_{q}/acquire" probe_name = f"qubit_{q}/probe" @@ -39,27 +30,22 @@ def create_dummy(): qubit.acquisition = AcquireChannel( acquisition_name, twpa_pump=twpa_pump_name, probe=probe_name ) - configs[probe_name] = IqConfig(**component_params[probe_name]) - configs[acquisition_name] = AcquisitionConfig( - **component_params[acquisition_name], kernel=kernels.get(q) + configs[acquisition_name] = replace( + configs[acquisition_name], kernel=kernels.get(q) ) drive_name = f"qubit_{q}/drive" qubit.drive = IqChannel(drive_name, mixer=None, lo=None, acquisition=None) - configs[drive_name] = IqConfig(**component_params[drive_name]) drive_12_name = f"qubit_{q}/drive12" qubit.drive12 = IqChannel(drive_12_name, mixer=None, lo=None, acquisition=None) - configs[drive_12_name] = IqConfig(**component_params[drive_12_name]) flux_name = f"qubit_{q}/flux" qubit.flux = DcChannel(flux_name) - configs[flux_name] = DcConfig(**component_params[flux_name]) for c, coupler in runcard.native_gates.coupler.items(): flux_name = f"coupler_{c}/flux" coupler.flux = DcChannel(flux_name) - configs[flux_name] = DcConfig(**component_params[flux_name]) return Platform( FOLDER.name, diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index f6ccc4c371..e71ad6ca61 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -1,7 +1,7 @@ """A platform for executing quantum algorithms.""" from collections import defaultdict -from dataclasses import asdict, dataclass +from dataclasses import dataclass from math import prod from typing import Any, Literal, Optional, TypeVar @@ -273,7 +273,7 @@ def execute( # set the config directly for name, cfg in configs.items(): if name in self.instruments: - self.instruments[name].setup(**asdict(cfg)) + self.instruments[name].setup(**cfg.model_dump(exclude={"kind"})) results = defaultdict(list) for b in batch(sequences, self._controller.bounds): diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index 4d33de32ac..b2a5cf475f 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -5,9 +5,8 @@ example for more details. """ -import dataclasses import json -from dataclasses import asdict, dataclass, field, fields +from dataclasses import dataclass, field, fields from pathlib import Path from typing import Annotated, Optional, Union @@ -25,7 +24,7 @@ from qibolab.pulses import PulseSequence from qibolab.pulses.pulse import PulseLike from qibolab.qubits import Qubit, QubitId, QubitPair, QubitPairId -from qibolab.serialize_ import replace +from qibolab.serialize_ import Model, replace RUNCARD = "parameters.json" PLATFORM = "platform.py" @@ -48,11 +47,10 @@ def update_configs(configs: dict[str, Config], updates: list[ConfigUpdate]): raise ValueError( f"Cannot update configuration for unknown component {name}" ) - configs[name] = dataclasses.replace(configs[name], **changes) + configs[name] = replace(configs[name], **changes) -@dataclass -class Settings: +class Settings(Model): """Default execution settings read from the runcard.""" nshots: int = 1000 @@ -120,8 +118,10 @@ def dump(self) -> dict: @dataclass class Runcard: + """Serializable parameters.""" + settings: Settings = field(default_factory=Settings) - components: dict = field(default_factory=dict) + configs: dict[str, Config] = field(default_factory=dict) # TODO: add gates template native_gates: NativeGates = field(default_factory=dict) @@ -130,9 +130,9 @@ def load(cls, path: Path): """Load runcard from JSON.""" d = json.loads((path / RUNCARD).read_text()) settings = Settings(**d["settings"]) - components = d["components"] + configs = TypeAdapter(dict[str, Config]).validate_python(d["components"]) natives = NativeGates.load(d["native_gates"]) - return cls(settings=settings, components=components, native_gates=natives) + return cls(settings=settings, configs=configs, native_gates=natives) def dump(self, path: Path, updates: Optional[list[ConfigUpdate]] = None): """Platform serialization as runcard (json) and kernels (npz). @@ -143,11 +143,11 @@ def dump(self, path: Path, updates: Optional[list[ConfigUpdate]] = None): ``updates`` is an optional list if updates for platform configs. Later entries in the list take precedence over earlier ones (if they happen to update the same thing). """ - configs = self.components.copy() + configs = self.configs.copy() update_configs(configs, updates or []) settings = { - "settings": asdict(self.settings), + "settings": self.settings.model_dump(), "components": _dump_component_configs(configs), "native_gates": self.native_gates.dump(), } @@ -245,7 +245,7 @@ def _dump_component_configs(component_configs) -> dict: """Dump channel configs.""" components = {} for name, cfg in component_configs.items(): - components[name] = asdict(cfg) + components[name] = cfg.model_dump() if isinstance(cfg, AcquisitionConfig): del components[name]["kernel"] return components @@ -270,3 +270,10 @@ def dump_kernels(platform: "Platform", path: Path): # dump only if not None if len(kernels) > 0: kernels.dump(path) + + +# TODO: drop as soon as dump_kernels is reabsorbed in the runcard +def dump_platform(platform: "Platform", path: Path): + """Dump paltform.""" + platform.runcard.dump(path) + dump_kernels(platform, path) diff --git a/tests/conftest.py b/tests/conftest.py index 81d031c540..6b52a903cd 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -25,7 +25,7 @@ # "qm_octave", # "qblox", # "rfsoc", - "zurich", + # "zurich", ] """Platforms used for testing without access to real instruments.""" diff --git a/tests/dummy_qrc/zurich/parameters.json b/tests/dummy_qrc/zurich/parameters.json index 659fd2e1bb..ccf64499e9 100644 --- a/tests/dummy_qrc/zurich/parameters.json +++ b/tests/dummy_qrc/zurich/parameters.json @@ -15,66 +15,82 @@ }, "components": { "qubit_0/drive": { + "kind": "iq", "frequency": 4000000000, "power_range": 5 }, "qubit_1/drive": { + "kind": "iq", "frequency": 4200000000, "power_range": 0 }, "qubit_2/drive": { + "kind": "iq", "frequency": 4500000000, "power_range": -5 }, "qubit_3/drive": { + "kind": "iq", "frequency": 4150000000, "power_range": -10 }, "qubit_4/drive": { + "kind": "iq", "frequency": 4155663000, "power_range": 5 }, "qubit_0/flux": { + "kind": "dc", "offset": -0.1, "power_range": 0.2 }, "qubit_1/flux": { + "kind": "dc", "offset": 0.0, "power_range": 0.6 }, "qubit_2/flux": { + "kind": "dc", "offset": 0.1, "power_range": 0.4 }, "qubit_3/flux": { + "kind": "dc", "offset": 0.2, "power_range": 1 }, "qubit_4/flux": { + "kind": "dc", "offset": 0.15, "power_range": 5 }, "qubit_0/probe": { + "kind": "iq", "frequency": 5200000000, "power_range": -10 }, "qubit_1/probe": { + "kind": "iq", "frequency": 4900000000, "power_range": -10 }, "qubit_2/probe": { + "kind": "iq", "frequency": 6100000000, "power_range": -10 }, "qubit_3/probe": { + "kind": "iq", "frequency": 5800000000, "power_range": -10 }, "qubit_4/probe": { + "kind": "iq", "frequency": 5500000000, "power_range": -10 }, "qubit_0/acquire": { + "kind": "acquisition", "delay": 0, "iq_angle": null, "smearing": 0, @@ -82,6 +98,7 @@ "threshold": null }, "qubit_1/acquire": { + "kind": "acquisition", "delay": 0, "iq_angle": null, "smearing": 0, @@ -89,6 +106,7 @@ "threshold": null }, "qubit_2/acquire": { + "kind": "acquisition", "delay": 0, "iq_angle": null, "smearing": 0, @@ -96,6 +114,7 @@ "threshold": null }, "qubit_3/acquire": { + "kind": "acquisition", "delay": 0, "iq_angle": null, "smearing": 0, @@ -103,6 +122,7 @@ "threshold": null }, "qubit_4/acquire": { + "kind": "acquisition", "delay": 0, "iq_angle": null, "smearing": 0, @@ -110,34 +130,42 @@ "threshold": null }, "coupler_0/flux": { + "kind": "dc", "offset": 0.0, "power_range": 3 }, "coupler_1/flux": { + "kind": "dc", "offset": 0.0, "power_range": 1 }, "coupler_3/flux": { + "kind": "dc", "offset": 0.0, "power_range": 0.4 }, "coupler_4/flux": { + "kind": "dc", "offset": 0.0, "power_range": 0.4 }, "readout/lo": { + "kind": "oscillator", "power": 10, "frequency": 6000000000.0 }, "qubit_0_1/drive/lo": { + "kind": "oscillator", "power": 10, "frequency": 3000000000.0 }, "qubit_2_3/drive/lo": { + "kind": "oscillator", "power": 10, "frequency": 3500000000.0 }, "qubit_4/drive/lo": { + "kind": "oscillator", "power": 10, "frequency": 4000000000.0 } diff --git a/tests/dummy_qrc/zurich/platform.py b/tests/dummy_qrc/zurich/platform.py index 63359e4ae2..a55c5f2384 100644 --- a/tests/dummy_qrc/zurich/platform.py +++ b/tests/dummy_qrc/zurich/platform.py @@ -46,8 +46,7 @@ def create(): runcard.native_gates.two_qubit, ) - configs = {} - component_params = runcard.components + configs = runcard.configs readout_lo = "readout/lo" drive_los = { 0: "qubit_0_1/drive/lo", diff --git a/tests/test_platform.py b/tests/test_platform.py index f7706b80ee..f731fad23f 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -5,7 +5,6 @@ import os import pathlib import warnings -from dataclasses import replace from pathlib import Path import numpy as np @@ -26,7 +25,14 @@ from qibolab.platform.platform import update_configs from qibolab.pulses import Delay, Gaussian, Pulse, PulseSequence, Rectangular from qibolab.qubits import Qubit, QubitPair -from qibolab.serialize import PLATFORM, NativeGates, Runcard, dump_kernels +from qibolab.serialize import ( + PLATFORM, + NativeGates, + Runcard, + dump_kernels, + dump_platform, +) +from qibolab.serialize_ import replace from .conftest import find_instrument @@ -127,8 +133,8 @@ def test_update_configs(platform): drive_name = "q0/drive" pump_name = "twpa_pump" configs = { - drive_name: IqConfig(4.1e9), - pump_name: OscillatorConfig(3e9, -5), + drive_name: IqConfig(frequency=4.1e9), + pump_name: OscillatorConfig(frequency=3e9, power=-5), } updated = update_configs(configs, [{drive_name: {"frequency": 4.2e9}}]) @@ -151,9 +157,6 @@ def test_update_configs(platform): with pytest.raises(ValueError, match="unknown component"): update_configs(configs, [{"non existent": {"property": 1.0}}]) - with pytest.raises(TypeError, match="prprty"): - update_configs(configs, [{pump_name: {"prprty": 0.7}}]) - def test_dump_runcard(platform, tmp_path): platform.runcard.dump(tmp_path) @@ -164,8 +167,8 @@ def test_dump_runcard(platform, tmp_path): target_path = pathlib.Path(__file__).parent / "dummy_qrc" / f"{platform.name}" target = Runcard.load(target_path) - # assert components section is dumped properly in the runcard - assert final.components == target.components + # assert configs section is dumped properly in the runcard + assert final.configs == target.configs def test_dump_runcard_with_updates(platform, tmp_path): @@ -178,8 +181,8 @@ def test_dump_runcard_with_updates(platform, tmp_path): } platform.runcard.dump(tmp_path, [update]) final = Runcard.load(tmp_path) - assert final.components[qubit.drive.name]["frequency"] == frequency - assert final.components[qubit.acquisition.name]["smearing"] == smearing + assert final.configs[qubit.drive.name].frequency == frequency + assert final.configs[qubit.acquisition.name].smearing == smearing @pytest.mark.parametrize("has_kernels", [False, True]) @@ -192,7 +195,7 @@ def test_kernels(tmp_path, has_kernels): if isinstance(config, AcquisitionConfig): platform.configs[name] = replace(config, kernel=np.random.rand(10)) - dump_kernels(platform.runcard, tmp_path) + dump_kernels(platform, tmp_path) if has_kernels: kernels = Kernels.load(tmp_path) @@ -214,7 +217,7 @@ def test_dump_platform(tmp_path, has_kernels): if isinstance(config, AcquisitionConfig): platform.configs[name] = replace(config, kernel=np.random.rand(10)) - platform.runcard.dump(tmp_path) + dump_platform(platform, tmp_path) settings = Runcard.load(tmp_path).settings if has_kernels: From 8bf5cb4a4cc36619f610879a69428c82ecfbf501 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 12 Aug 2024 19:47:29 +0200 Subject: [PATCH 0577/1006] docs: Fix doctests to account for runcard deserialization --- doc/source/getting-started/experiment.rst | 17 +++-------------- doc/source/main-documentation/qibolab.rst | 2 +- 2 files changed, 4 insertions(+), 15 deletions(-) diff --git a/doc/source/getting-started/experiment.rst b/doc/source/getting-started/experiment.rst index 691c492296..4d2f81910b 100644 --- a/doc/source/getting-started/experiment.rst +++ b/doc/source/getting-started/experiment.rst @@ -70,14 +70,6 @@ In this example, the qubit is controlled by a Zurich Instruments' SHFQC instrume qubit.probe = IqChannel(name=probe, lo=readout_lo, mixer=None, acquisition=acquire) qubit.acquisition = AcquireChannel(name=acquire, probe=probe, twpa_pump=None) - configs = {} - component_params = runcard["components"] - configs[drive] = IqConfig(**component_params[drive]) - configs[probe] = IqConfig(**component_params[probe]) - configs[acquire] = AcquisitionConfig(**component_params[acquire]) - configs[drive_lo] = OscillatorConfig(**component_params[drive_lo]) - configs[readout_lo] = OscillatorConfig(**component_params[readout_lo]) - zi_channels = [ ZiChannel(qubit.drive, device="device_shfqc", path="SGCHANNELS/0/OUTPUT"), ZiChannel(qubit.probe, device="device_shfqc", path="QACHANNELS/0/OUTPUT"), @@ -87,12 +79,9 @@ In this example, the qubit is controlled by a Zurich Instruments' SHFQC instrume controller = Zurich(NAME, device_setup=device_setup, channels=zi_channels) return Platform( - NAME, - qubits, - pairs, - configs, - instruments, - settings=runcard.settings, + name=NAME, + runcard=runcard, + instruments={controller.name: controller}, resonator_type="3D", ) diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index b33fd725c0..b4933d631f 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -56,7 +56,7 @@ We can easily access the names of channels and other components, and based on th :hide: Drive channel name: qubit_0/drive - Drive frequency: 4000000000 + Drive frequency: 4000000000.0 Drive channel qubit_0/drive does not use an LO. Now we can create a simple sequence (again, without explicitly giving any qubit specific parameter, as these are loaded automatically from the platform, as defined in the runcard): From e483558b6e9b715f92fef5fa3e988e29de48bba6 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 12 Aug 2024 19:47:57 +0200 Subject: [PATCH 0578/1006] fix: Drop dataclass usage from zi configs --- src/qibolab/instruments/zhinst/components/configs.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/qibolab/instruments/zhinst/components/configs.py b/src/qibolab/instruments/zhinst/components/configs.py index d65a28dd8a..e85524bb8e 100644 --- a/src/qibolab/instruments/zhinst/components/configs.py +++ b/src/qibolab/instruments/zhinst/components/configs.py @@ -1,5 +1,3 @@ -from dataclasses import dataclass - from qibolab.components import AcquisitionConfig, DcConfig, IqConfig __all__ = [ @@ -9,7 +7,6 @@ ] -@dataclass(frozen=True) class ZiDcConfig(DcConfig): """DC channel config using ZI HDAWG.""" @@ -20,7 +17,6 @@ class ZiDcConfig(DcConfig): """ -@dataclass(frozen=True) class ZiIqConfig(IqConfig): """IQ channel config for ZI SHF* line instrument.""" @@ -31,7 +27,6 @@ class ZiIqConfig(IqConfig): """ -@dataclass(frozen=True) class ZiAcquisitionConfig(AcquisitionConfig): """Acquisition config for ZI SHF* line instrument.""" From 9dd8a2f565d06408c523d07413eaad46ca168f62 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 12 Aug 2024 19:50:42 +0200 Subject: [PATCH 0579/1006] docs: Temporarily prevent error generated by import --- doc/source/getting-started/experiment.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/source/getting-started/experiment.rst b/doc/source/getting-started/experiment.rst index 4d2f81910b..9d00688285 100644 --- a/doc/source/getting-started/experiment.rst +++ b/doc/source/getting-started/experiment.rst @@ -37,7 +37,9 @@ In this example, the qubit is controlled by a Zurich Instruments' SHFQC instrume AcquisitionConfig, OscillatorConfig, ) - from qibolab.instruments.zhinst import ZiChannel, Zurich + + # TODO: understand error generate by doctest + # from qibolab.instruments.zhinst import ZiChannel, Zurich from qibolab.platform import Platform from qibolab.serialize import Runcard From c423e92c334b59afd3a2f083157670f053acfe14 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 12 Aug 2024 19:57:34 +0200 Subject: [PATCH 0580/1006] fix: Dump kernels directly in json --- src/qibolab/components/configs.py | 5 ++--- src/qibolab/serialize.py | 4 +--- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/qibolab/components/configs.py b/src/qibolab/components/configs.py index 3609b1d7ad..c28e294e0c 100644 --- a/src/qibolab/components/configs.py +++ b/src/qibolab/components/configs.py @@ -9,10 +9,9 @@ from typing import Annotated, Literal, Optional, Union -import numpy.typing as npt from pydantic import Field -from qibolab.serialize_ import Model +from qibolab.serialize_ import Model, NdArray __all__ = [ "DcConfig", @@ -95,7 +94,7 @@ class AcquisitionConfig(Model): iq_angle: Optional[float] = None """Signal angle in the IQ-plane for disciminating ground and excited states.""" - kernel: Annotated[Optional[npt.NDArray], Field(default=None, repr=False)] + kernel: Annotated[Optional[NdArray], Field(repr=False)] = None """Integration weights to be used when post-processing the acquired signal.""" diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index b2a5cf475f..b888815b1b 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -12,7 +12,7 @@ from pydantic import Field, TypeAdapter -from qibolab.components import AcquisitionConfig, Config +from qibolab.components import Config from qibolab.execution_parameters import ConfigUpdate, ExecutionParameters from qibolab.kernels import Kernels from qibolab.native import ( @@ -246,8 +246,6 @@ def _dump_component_configs(component_configs) -> dict: components = {} for name, cfg in component_configs.items(): components[name] = cfg.model_dump() - if isinstance(cfg, AcquisitionConfig): - del components[name]["kernel"] return components From 940c3fc2972a0cc8f969350301e89f0554480753 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 12 Aug 2024 20:02:19 +0200 Subject: [PATCH 0581/1006] fix: Drop configs custom serialization --- src/qibolab/serialize.py | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index b888815b1b..b85e4b8a62 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -148,7 +148,7 @@ def dump(self, path: Path, updates: Optional[list[ConfigUpdate]] = None): settings = { "settings": self.settings.model_dump(), - "components": _dump_component_configs(configs), + "components": TypeAdapter(dict[str, Config]).dump_python(configs), "native_gates": self.native_gates.dump(), } @@ -241,14 +241,6 @@ def _dump_natives(natives: Union[SingleQubitNatives, TwoQubitNatives]): return data -def _dump_component_configs(component_configs) -> dict: - """Dump channel configs.""" - components = {} - for name, cfg in component_configs.items(): - components[name] = cfg.model_dump() - return components - - # TODO: kernels are part of the parameters, they should not be dumped separately def dump_kernels(platform: "Platform", path: Path): """Creates Kernels instance from platform and dumps as npz. From d9b3c81db499f4fb8b21dda8b0661a76b3a6dab6 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 12 Aug 2024 20:47:44 +0200 Subject: [PATCH 0582/1006] feat: Start adapting existing classes to automated serialization --- src/qibolab/native.py | 50 ++++++++++++++-------------------- src/qibolab/pulses/sequence.py | 16 ++++++++++- src/qibolab/qubits.py | 17 +++++++----- src/qibolab/serialize.py | 20 ++------------ 4 files changed, 48 insertions(+), 55 deletions(-) diff --git a/src/qibolab/native.py b/src/qibolab/native.py index 753c569108..ea41e9dd95 100644 --- a/src/qibolab/native.py +++ b/src/qibolab/native.py @@ -1,10 +1,9 @@ -from dataclasses import dataclass, field, fields -from typing import Optional +from typing import Annotated, Optional import numpy as np from .pulses import Drag, Gaussian, Pulse, PulseSequence -from .serialize_ import replace +from .serialize_ import Model, replace def _normalize_angles(theta, phi): @@ -15,7 +14,7 @@ def _normalize_angles(theta, phi): return theta, phi -class RxyFactory: +class RxyFactory(PulseSequence): """Factory for pulse sequences that generate single-qubit rotations around an axis in xy plane. @@ -27,17 +26,19 @@ class RxyFactory: sequence: The base sequence for the factory. """ - def __init__(self, sequence: PulseSequence): + @classmethod + def validate(cls, value): + sequence = PulseSequence(value) if len(sequence.channels) != 1: raise ValueError( f"Incompatible number of channels: {len(sequence.channels)}. " - f"{self.__class__} expects a sequence on exactly one channel." + f"{cls} expects a sequence on exactly one channel." ) if len(sequence) != 1: raise ValueError( f"Incompatible number of pulses: {len(sequence)}. " - f"{self.__class__} expects a sequence with exactly one pulse." + f"{cls} expects a sequence with exactly one pulse." ) pulse = sequence[0][1] @@ -46,10 +47,10 @@ def __init__(self, sequence: PulseSequence): if not isinstance(pulse.envelope, expected_envelopes): raise ValueError( f"Incompatible pulse envelope: {pulse.envelope.__class__}. " - f"{self.__class__} expects {expected_envelopes} envelope." + f"{cls} expects {expected_envelopes} envelope." ) - self._seq = sequence + return cls(value) def create_sequence(self, theta: float = np.pi, phi: float = 0.0) -> PulseSequence: """Create a sequence for single-qubit rotation. @@ -59,7 +60,7 @@ def create_sequence(self, theta: float = np.pi, phi: float = 0.0) -> PulseSequen phi: the angle that rotation axis forms with x axis. """ theta, phi = _normalize_angles(theta, phi) - ch, pulse = self._seq[0] + ch, pulse = self[0] assert isinstance(pulse, Pulse) new_amplitude = pulse.amplitude * theta / np.pi return PulseSequence( @@ -67,18 +68,14 @@ def create_sequence(self, theta: float = np.pi, phi: float = 0.0) -> PulseSequen ) -class FixedSequenceFactory: +class FixedSequenceFactory(PulseSequence): """Simple factory for a fixed arbitrary sequence.""" - def __init__(self, sequence: PulseSequence): - self._seq = sequence - def create_sequence(self) -> PulseSequence: - return self._seq.copy() + return self.copy() -@dataclass -class SingleQubitNatives: +class SingleQubitNatives(Model): """Container with the native single-qubit gates acting on a specific qubit.""" @@ -92,26 +89,19 @@ class SingleQubitNatives: """Pulse to activate coupler.""" -@dataclass -class TwoQubitNatives: +class TwoQubitNatives(Model): """Container with the native two-qubit gates acting on a specific pair of qubits.""" - CZ: Optional[FixedSequenceFactory] = field( - default=None, metadata={"symmetric": True} - ) - CNOT: Optional[FixedSequenceFactory] = field( - default=None, metadata={"symmetric": False} - ) - iSWAP: Optional[FixedSequenceFactory] = field( - default=None, metadata={"symmetric": True} - ) + CZ: Annotated[Optional[FixedSequenceFactory], {"symmetric": True}] = None + CNOT: Annotated[Optional[FixedSequenceFactory], {"symmetric": True}] = None + iSWAP: Annotated[Optional[FixedSequenceFactory], {"symmetric": True}] = None @property def symmetric(self): """Check if the defined two-qubit gates are symmetric between target and control qubits.""" return all( - fld.metadata["symmetric"] or getattr(self, fld.name) is None - for fld in fields(self) + info.metadata[0]["symmetric"] or getattr(self, fld) is None + for fld, info in self.model_fields.items() ) diff --git a/src/qibolab/pulses/sequence.py b/src/qibolab/pulses/sequence.py index 6ad5b4144a..331583e4ae 100644 --- a/src/qibolab/pulses/sequence.py +++ b/src/qibolab/pulses/sequence.py @@ -1,7 +1,10 @@ """PulseSequence class.""" from collections import UserList -from collections.abc import Iterable +from collections.abc import Callable, Iterable +from typing import Any + +from pydantic_core import core_schema from qibolab.components import ChannelId @@ -22,6 +25,17 @@ class PulseSequence(UserList[_Element]): the action, and the channel on which it should be performed. """ + @classmethod + def __get_pydantic_core_schema__( + cls, source_type: Any, handler: Callable[[Any], core_schema.CoreSchema] + ) -> core_schema.CoreSchema: + schema = handler(list[_Element]) + return core_schema.no_info_after_validator_function(cls.validate, schema) + + @classmethod + def validate(cls, value): + return cls(value) + @property def duration(self) -> float: """Duration of the entire sequence.""" diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index 645a1f3c1a..251a98b0c9 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -1,10 +1,13 @@ -from dataclasses import dataclass, field, fields -from typing import Optional, Union +from dataclasses import field, fields +from typing import Annotated, Optional, Union + +from pydantic import ConfigDict, Field from qibolab.components import AcquireChannel, DcChannel, IqChannel from qibolab.native import SingleQubitNatives, TwoQubitNatives +from qibolab.serialize_ import Model -QubitId = Union[str, int] +QubitId = Annotated[Union[str, int], Field(union_mode="left_to_right")] """Type for qubit names.""" CHANNEL_NAMES = ("probe", "acquisition", "drive", "drive12", "drive_cross", "flux") @@ -14,8 +17,7 @@ """ -@dataclass -class Qubit: +class Qubit(Model): """Representation of a physical qubit. Qubit objects are instantiated by :class:`qibolab.platforms.platform.Platform` @@ -31,6 +33,8 @@ class Qubit: send flux pulses to the qubit. """ + model_config = ConfigDict(frozen=False) + name: QubitId native_gates: SingleQubitNatives = field(default_factory=SingleQubitNatives) @@ -70,8 +74,7 @@ def mixer_frequencies(self): """Type for holding ``QubitPair``s in the ``platform.pairs`` dictionary.""" -@dataclass -class QubitPair: +class QubitPair(Model): """Data structure for holding the native two-qubit gates acting on a pair of qubits. diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index b85e4b8a62..55dbcc59eb 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -15,12 +15,7 @@ from qibolab.components import Config from qibolab.execution_parameters import ConfigUpdate, ExecutionParameters from qibolab.kernels import Kernels -from qibolab.native import ( - FixedSequenceFactory, - RxyFactory, - SingleQubitNatives, - TwoQubitNatives, -) +from qibolab.native import FixedSequenceFactory, SingleQubitNatives, TwoQubitNatives from qibolab.pulses import PulseSequence from qibolab.pulses.pulse import PulseLike from qibolab.qubits import Qubit, QubitId, QubitPair, QubitPairId @@ -180,17 +175,8 @@ def _load_single_qubit_natives(gates: dict) -> dict[QubitId, Qubit]: qubits = {} for q, gatedict in gates.items(): name = _load_qubit_name(q) - native_gates = SingleQubitNatives( - **{ - gate_name: ( - RxyFactory(_load_sequence(raw_sequence)) - if gate_name == "RX" - else FixedSequenceFactory(_load_sequence(raw_sequence)) - ) - for gate_name, raw_sequence in gatedict.items() - } - ) - qubits[name] = Qubit(_load_qubit_name(q), native_gates=native_gates) + native_gates = SingleQubitNatives(**gatedict) + qubits[name] = Qubit(name=name, native_gates=native_gates) return qubits From 477ada125ce676f5d343922ed0630bd34b359c4c Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 13 Aug 2024 12:09:16 +0200 Subject: [PATCH 0583/1006] fix: Rename runcard to parameters --- src/qibolab/dummy/platform.py | 12 ++++---- src/qibolab/platform/platform.py | 18 ++++++++---- src/qibolab/serialize.py | 46 +++++++++++------------------- tests/dummy_qrc/zurich/platform.py | 14 ++++----- tests/test_backends.py | 4 +-- tests/test_platform.py | 28 +++++++++--------- 6 files changed, 57 insertions(+), 65 deletions(-) diff --git a/src/qibolab/dummy/platform.py b/src/qibolab/dummy/platform.py index 77d3bf9295..8fbc318fa6 100644 --- a/src/qibolab/dummy/platform.py +++ b/src/qibolab/dummy/platform.py @@ -4,7 +4,7 @@ from qibolab.instruments.dummy import DummyInstrument, DummyLocalOscillator from qibolab.kernels import Kernels from qibolab.platform import Platform -from qibolab.serialize import Runcard +from qibolab.serialize import Parameters from qibolab.serialize_ import replace FOLDER = pathlib.Path(__file__).parent @@ -17,11 +17,11 @@ def create_dummy(): twpa_pump_name = "twpa_pump" twpa_pump = DummyLocalOscillator(twpa_pump_name, "0.0.0.0") - runcard = Runcard.load(FOLDER) + parameters = Parameters.load(FOLDER) kernels = Kernels.load(FOLDER) - configs = runcard.configs - for q, qubit in runcard.native_gates.single_qubit.items(): + configs = parameters.configs + for q, qubit in parameters.native_gates.single_qubit.items(): acquisition_name = f"qubit_{q}/acquire" probe_name = f"qubit_{q}/probe" qubit.probe = IqChannel( @@ -43,13 +43,13 @@ def create_dummy(): flux_name = f"qubit_{q}/flux" qubit.flux = DcChannel(flux_name) - for c, coupler in runcard.native_gates.coupler.items(): + for c, coupler in parameters.native_gates.coupler.items(): flux_name = f"coupler_{c}/flux" coupler.flux = DcChannel(flux_name) return Platform( FOLDER.name, - runcard=runcard, + parameters=parameters, configs=configs, instruments={instrument.name: instrument, twpa_pump.name: twpa_pump}, ) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index e71ad6ca61..911b21b97a 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -12,7 +12,13 @@ from qibolab.instruments.abstract import Controller, Instrument, InstrumentId from qibolab.pulses import Delay, PulseSequence from qibolab.qubits import QubitId, QubitPairId -from qibolab.serialize import QubitMap, QubitPairMap, Runcard, Settings, update_configs +from qibolab.serialize import ( + Parameters, + QubitMap, + QubitPairMap, + Settings, + update_configs, +) from qibolab.sweeper import ParallelSweepers from qibolab.unrolling import batch @@ -88,7 +94,7 @@ class Platform: name: str """Name of the platform.""" - runcard: Runcard + parameters: Parameters """...""" configs: dict[str, Config] """Mapping name of component to its default config.""" @@ -111,23 +117,23 @@ def __str__(self): @property def qubits(self) -> QubitMap: """Mapping qubit names to :class:`qibolab.qubits.Qubit` objects.""" - return self.runcard.native_gates.single_qubit + return self.parameters.native_gates.single_qubit @property def couplers(self) -> QubitMap: """Mapping coupler names to :class:`qibolab.qubits.Qubit` objects.""" - return self.runcard.native_gates.coupler + return self.parameters.native_gates.coupler @property def pairs(self) -> QubitPairMap: """Mapping tuples of qubit names to :class:`qibolab.qubits.QubitPair` objects.""" - return self.runcard.native_gates.two_qubit + return self.parameters.native_gates.two_qubit @property def settings(self) -> Settings: """Container with default execution settings.""" - return self.runcard.settings + return self.parameters.settings @property def nqubits(self) -> int: diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index 55dbcc59eb..d76d8c5ae9 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -1,8 +1,7 @@ -"""Helper methods for loading and saving to runcards. +"""Helper methods for (de)serializing parameters. -The format of runcards in the ``qiboteam/qibolab_platforms_qrc`` -repository is assumed here. See :ref:`Using runcards ` -example for more details. +The format is explained in the :ref:`Using parameters ` +example. """ import json @@ -21,7 +20,7 @@ from qibolab.qubits import Qubit, QubitId, QubitPair, QubitPairId from qibolab.serialize_ import Model, replace -RUNCARD = "parameters.json" +PARAMETERS = "parameters.json" PLATFORM = "platform.py" QubitMap = dict[QubitId, Qubit] @@ -46,7 +45,7 @@ def update_configs(configs: dict[str, Config], updates: list[ConfigUpdate]): class Settings(Model): - """Default execution settings read from the runcard.""" + """Default platform execution settings.""" nshots: int = 1000 """Default number of repetitions when executing a pulse sequence.""" @@ -73,22 +72,14 @@ class NativeGates: @classmethod def load(cls, raw: dict): - """Load qubits, couplers and pairs from the runcard. - - Uses the native gate section of the runcard to parse the - corresponding :class: `qibolab.qubits.Qubit` and - :class: `qibolab.qubits.QubitPair` objects. - """ + """Load qubits, couplers and pairs.""" qubits = _load_single_qubit_natives(raw["single_qubit"]) couplers = _load_single_qubit_natives(raw["coupler"]) pairs = _load_two_qubit_natives(raw["two_qubit"], qubits) return cls(qubits, couplers, pairs) def dump(self) -> dict: - """Serialize native gates section to dictionary. - - It follows the runcard format, using qubit and pair objects. - """ + """Serialize native gates section to dictionary.""" native_gates = { "single_qubit": { _dump_qubit_name(q): _dump_natives(qubit.native_gates) @@ -112,7 +103,7 @@ def dump(self) -> dict: @dataclass -class Runcard: +class Parameters: """Serializable parameters.""" settings: Settings = field(default_factory=Settings) @@ -122,17 +113,17 @@ class Runcard: @classmethod def load(cls, path: Path): - """Load runcard from JSON.""" - d = json.loads((path / RUNCARD).read_text()) + """Load parameters from JSON.""" + d = json.loads((path / PARAMETERS).read_text()) settings = Settings(**d["settings"]) configs = TypeAdapter(dict[str, Config]).validate_python(d["components"]) natives = NativeGates.load(d["native_gates"]) return cls(settings=settings, configs=configs, native_gates=natives) def dump(self, path: Path, updates: Optional[list[ConfigUpdate]] = None): - """Platform serialization as runcard (json) and kernels (npz). + """Platform serialization as parameters (json) and kernels (npz). - The file saved follows the format explained in :ref:`Using runcards `. + The file saved follows the format explained in :ref:`Using parameters `. The requested ``path`` is the folder where the json and npz will be dumped. @@ -147,7 +138,7 @@ def dump(self, path: Path, updates: Optional[list[ConfigUpdate]] = None): "native_gates": self.native_gates.dump(), } - (path / RUNCARD).write_text(json.dumps(settings, sort_keys=False, indent=4)) + (path / PARAMETERS).write_text(json.dumps(settings, sort_keys=False, indent=4)) def _load_qubit_name(name: str) -> QubitId: @@ -166,12 +157,7 @@ def _load_sequence(raw_sequence): def _load_single_qubit_natives(gates: dict) -> dict[QubitId, Qubit]: - """Parse native gates from the runcard. - - Args: - gates (dict): Dictionary with native gate pulse parameters as loaded - from the runcard. - """ + """Parse native gates.""" qubits = {} for q, gatedict in gates.items(): name = _load_qubit_name(q) @@ -248,8 +234,8 @@ def dump_kernels(platform: "Platform", path: Path): kernels.dump(path) -# TODO: drop as soon as dump_kernels is reabsorbed in the runcard +# TODO: drop as soon as dump_kernels is reabsorbed in the parameters def dump_platform(platform: "Platform", path: Path): """Dump paltform.""" - platform.runcard.dump(path) + platform.parameters.dump(path) dump_kernels(platform, path) diff --git a/tests/dummy_qrc/zurich/platform.py b/tests/dummy_qrc/zurich/platform.py index a55c5f2384..77d2a52f9e 100644 --- a/tests/dummy_qrc/zurich/platform.py +++ b/tests/dummy_qrc/zurich/platform.py @@ -14,7 +14,7 @@ Zurich, ) from qibolab.kernels import Kernels -from qibolab.serialize import Runcard +from qibolab.serialize import Parameters FOLDER = pathlib.Path(__file__).parent @@ -38,15 +38,15 @@ def create(): create_connection(to_instrument="device_shfqc", ports="ZSYNCS/2"), ) - runcard = Runcard.load(FOLDER) + parameters = Parameters.load(FOLDER) kernels = Kernels.load(FOLDER) qubits, couplers, pairs = ( - runcard.native_gates.single_qubit, - runcard.native_gates.coupler, - runcard.native_gates.two_qubit, + parameters.native_gates.single_qubit, + parameters.native_gates.coupler, + parameters.native_gates.two_qubit, ) - configs = runcard.configs + configs = parameters.configs readout_lo = "readout/lo" drive_los = { 0: "qubit_0_1/drive/lo", @@ -126,7 +126,7 @@ def create(): return Platform( name=str(FOLDER), configs=configs, - runcard=runcard, + parameters=parameters, instruments={controller.name: controller}, resonator_type="3D", ) diff --git a/tests/test_backends.py b/tests/test_backends.py index e33296daab..0e3bc2a673 100644 --- a/tests/test_backends.py +++ b/tests/test_backends.py @@ -108,10 +108,10 @@ def dummy_string_qubit_names(): platform = create_platform("dummy") for q, qubit in platform.qubits.items(): qubit.name = f"A{q}" - platform.runcard.native_gates.single_qubit = { + platform.parameters.native_gates.single_qubit = { qubit.name: qubit for qubit in platform.qubits.values() } - platform.runcard.native_gates.two_qubit = { + platform.parameters.native_gates.two_qubit = { (f"A{q0}", f"A{q1}"): pair for (q0, q1), pair in platform.pairs.items() } return platform diff --git a/tests/test_platform.py b/tests/test_platform.py index f731fad23f..60bf55960b 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -28,7 +28,7 @@ from qibolab.serialize import ( PLATFORM, NativeGates, - Runcard, + Parameters, dump_kernels, dump_platform, ) @@ -63,7 +63,7 @@ def test_create_platform_error(): def test_platform_basics(): platform = Platform( name="ciao", - runcard=Runcard(native_gates=NativeGates({}, {}, {})), + parameters=Parameters(native_gates=NativeGates({}, {}, {})), configs={}, instruments={}, ) @@ -73,7 +73,7 @@ def test_platform_basics(): qs = {q: Qubit(q) for q in range(10)} platform2 = Platform( name="come va?", - runcard=Runcard( + parameters=Parameters( native_gates=NativeGates( single_qubit=qs, two_qubit={ @@ -158,20 +158,20 @@ def test_update_configs(platform): update_configs(configs, [{"non existent": {"property": 1.0}}]) -def test_dump_runcard(platform, tmp_path): - platform.runcard.dump(tmp_path) - final = Runcard.load(tmp_path) +def test_dump_parameters(platform, tmp_path): + platform.parameters.dump(tmp_path) + final = Parameters.load(tmp_path) if platform.name == "dummy": - target = Runcard.load(FOLDER) + target = Parameters.load(FOLDER) else: target_path = pathlib.Path(__file__).parent / "dummy_qrc" / f"{platform.name}" - target = Runcard.load(target_path) + target = Parameters.load(target_path) - # assert configs section is dumped properly in the runcard + # assert configs section is dumped properly in the parameters assert final.configs == target.configs -def test_dump_runcard_with_updates(platform, tmp_path): +def test_dump_parameterswith_updates(platform, tmp_path): qubit = next(iter(platform.qubits.values())) frequency = platform.config(qubit.drive.name).frequency + 1.5e9 smearing = platform.config(qubit.acquisition.name).smearing + 10 @@ -179,8 +179,8 @@ def test_dump_runcard_with_updates(platform, tmp_path): qubit.drive.name: {"frequency": frequency}, qubit.acquisition.name: {"smearing": smearing}, } - platform.runcard.dump(tmp_path, [update]) - final = Runcard.load(tmp_path) + platform.parameters.dump(tmp_path, [update]) + final = Parameters.load(tmp_path) assert final.configs[qubit.drive.name].frequency == frequency assert final.configs[qubit.acquisition.name].smearing == smearing @@ -209,7 +209,7 @@ def test_kernels(tmp_path, has_kernels): @pytest.mark.parametrize("has_kernels", [False, True]) def test_dump_platform(tmp_path, has_kernels): - """Test platform dump and loading runcard and kernels.""" + """Test platform dump and loading parameters and kernels.""" platform = create_dummy() if has_kernels: @@ -219,7 +219,7 @@ def test_dump_platform(tmp_path, has_kernels): dump_platform(platform, tmp_path) - settings = Runcard.load(tmp_path).settings + settings = Parameters.load(tmp_path).settings if has_kernels: kernels = Kernels.load(tmp_path) for qubit in platform.qubits.values(): From 2f516f98bd835ad4ff43bc13db7fef367296107a Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 13 Aug 2024 12:15:08 +0200 Subject: [PATCH 0584/1006] fix: Fix two-qubit natives deserialization --- src/qibolab/serialize.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index d76d8c5ae9..1a9eeb81b9 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -14,7 +14,7 @@ from qibolab.components import Config from qibolab.execution_parameters import ConfigUpdate, ExecutionParameters from qibolab.kernels import Kernels -from qibolab.native import FixedSequenceFactory, SingleQubitNatives, TwoQubitNatives +from qibolab.native import SingleQubitNatives, TwoQubitNatives from qibolab.pulses import PulseSequence from qibolab.pulses.pulse import PulseLike from qibolab.qubits import Qubit, QubitId, QubitPair, QubitPairId @@ -172,13 +172,10 @@ def _load_two_qubit_natives( pairs = {} for pair, gatedict in gates.items(): q0, q1 = (_load_qubit_name(q) for q in pair.split("-")) - native_gates = TwoQubitNatives( - **{ - gate_name: FixedSequenceFactory(_load_sequence(raw_sequence)) - for gate_name, raw_sequence in gatedict.items() - } + native_gates = TwoQubitNatives(**gatedict) + pairs[(q0, q1)] = QubitPair( + **dict(qubit1=q0, qubit2=q1, native_gates=native_gates) ) - pairs[(q0, q1)] = QubitPair(q0, q1, native_gates=native_gates) if native_gates.symmetric: pairs[(q1, q0)] = pairs[(q0, q1)] return pairs From 990c5038270f0888e69bd1a88da35f215660561c Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 13 Aug 2024 12:23:50 +0200 Subject: [PATCH 0585/1006] fix: Remove unused loaders and serializers --- src/qibolab/serialize.py | 26 +++----------------------- 1 file changed, 3 insertions(+), 23 deletions(-) diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index 1a9eeb81b9..2fefd0e133 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -16,7 +16,6 @@ from qibolab.kernels import Kernels from qibolab.native import SingleQubitNatives, TwoQubitNatives from qibolab.pulses import PulseSequence -from qibolab.pulses.pulse import PulseLike from qibolab.qubits import Qubit, QubitId, QubitPair, QubitPairId from qibolab.serialize_ import Model, replace @@ -75,7 +74,7 @@ def load(cls, raw: dict): """Load qubits, couplers and pairs.""" qubits = _load_single_qubit_natives(raw["single_qubit"]) couplers = _load_single_qubit_natives(raw["coupler"]) - pairs = _load_two_qubit_natives(raw["two_qubit"], qubits) + pairs = _load_two_qubit_natives(raw["two_qubit"]) return cls(qubits, couplers, pairs) def dump(self) -> dict: @@ -148,14 +147,6 @@ def _load_qubit_name(name: str) -> QubitId: ).validate_python(name) -def _load_pulse(pulse_kwargs: dict): - return TypeAdapter(PulseLike).validate_python(pulse_kwargs) - - -def _load_sequence(raw_sequence): - return PulseSequence([(ch, _load_pulse(pulse)) for ch, pulse in raw_sequence]) - - def _load_single_qubit_natives(gates: dict) -> dict[QubitId, Qubit]: """Parse native gates.""" qubits = {} @@ -166,9 +157,7 @@ def _load_single_qubit_natives(gates: dict) -> dict[QubitId, Qubit]: return qubits -def _load_two_qubit_natives( - gates: dict, qubits: dict[QubitId, Qubit] -) -> dict[QubitPairId, QubitPair]: +def _load_two_qubit_natives(gates: dict) -> dict[QubitPairId, QubitPair]: pairs = {} for pair, gatedict in gates.items(): q0, q1 = (_load_qubit_name(q) for q in pair.split("-")) @@ -188,17 +177,8 @@ def _dump_qubit_name(name: QubitId) -> str: return name -def _dump_pulse(pulse: PulseLike): - data = pulse.model_dump() - if "channel" in data: - del data["channel"] - if "relative_phase" in data: - del data["relative_phase"] - return data - - def _dump_sequence(sequence: PulseSequence): - return [(ch, _dump_pulse(p)) for ch, p in sequence] + return [(ch, p.model_dump()) for ch, p in sequence] def _dump_natives(natives: Union[SingleQubitNatives, TwoQubitNatives]): From 27a90cf71213151bdd40681526a404e11db6822c Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 13 Aug 2024 12:28:09 +0200 Subject: [PATCH 0586/1006] fix: Use qubit id definition for names handling --- src/qibolab/qubits.py | 2 +- src/qibolab/serialize.py | 12 ++++-------- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index 251a98b0c9..f58d265695 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -7,7 +7,7 @@ from qibolab.native import SingleQubitNatives, TwoQubitNatives from qibolab.serialize_ import Model -QubitId = Annotated[Union[str, int], Field(union_mode="left_to_right")] +QubitId = Annotated[Union[int, str], Field(union_mode="left_to_right")] """Type for qubit names.""" CHANNEL_NAMES = ("probe", "acquisition", "drive", "drive12", "drive_cross", "flux") diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index 2fefd0e133..a725b2fe81 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -7,9 +7,9 @@ import json from dataclasses import dataclass, field, fields from pathlib import Path -from typing import Annotated, Optional, Union +from typing import Optional, Union -from pydantic import Field, TypeAdapter +from pydantic import TypeAdapter from qibolab.components import Config from qibolab.execution_parameters import ConfigUpdate, ExecutionParameters @@ -142,9 +142,7 @@ def dump(self, path: Path, updates: Optional[list[ConfigUpdate]] = None): def _load_qubit_name(name: str) -> QubitId: """Convert qubit name from string to integer or string.""" - return TypeAdapter( - Annotated[Union[int, str], Field(union_mode="left_to_right")] - ).validate_python(name) + return TypeAdapter(QubitId).validate_python(name) def _load_single_qubit_natives(gates: dict) -> dict[QubitId, Qubit]: @@ -172,9 +170,7 @@ def _load_two_qubit_natives(gates: dict) -> dict[QubitPairId, QubitPair]: def _dump_qubit_name(name: QubitId) -> str: """Convert qubit name from integer or string to string.""" - if isinstance(name, int): - return str(name) - return name + return TypeAdapter(QubitId).dump_python(name) def _dump_sequence(sequence: PulseSequence): From 7acfaf4229fac7cdacf50103bd4afe70d419c1c8 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 13 Aug 2024 13:39:02 +0200 Subject: [PATCH 0587/1006] fix: Fix pulse sequence deserialization And especially its derivatives --- src/qibolab/native.py | 20 +++++++++----------- src/qibolab/pulses/sequence.py | 4 ++-- tests/test_native.py | 3 ++- tests/test_platform.py | 6 ++++-- 4 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/qibolab/native.py b/src/qibolab/native.py index ea41e9dd95..ec21a52a59 100644 --- a/src/qibolab/native.py +++ b/src/qibolab/native.py @@ -26,22 +26,22 @@ class RxyFactory(PulseSequence): sequence: The base sequence for the factory. """ - @classmethod - def validate(cls, value): - sequence = PulseSequence(value) - if len(sequence.channels) != 1: + def __init__(self, iterable): + super().__init__(iterable) + cls = type(self) + if len(self.channels) != 1: raise ValueError( - f"Incompatible number of channels: {len(sequence.channels)}. " + f"Incompatible number of channels: {len(self.channels)}. " f"{cls} expects a sequence on exactly one channel." ) - if len(sequence) != 1: + if len(self) != 1: raise ValueError( - f"Incompatible number of pulses: {len(sequence)}. " + f"Incompatible number of pulses: {len(self)}. " f"{cls} expects a sequence with exactly one pulse." ) - pulse = sequence[0][1] + pulse = self[0][1] assert isinstance(pulse, Pulse) expected_envelopes = (Gaussian, Drag) if not isinstance(pulse.envelope, expected_envelopes): @@ -50,8 +50,6 @@ def validate(cls, value): f"{cls} expects {expected_envelopes} envelope." ) - return cls(value) - def create_sequence(self, theta: float = np.pi, phi: float = 0.0) -> PulseSequence: """Create a sequence for single-qubit rotation. @@ -94,7 +92,7 @@ class TwoQubitNatives(Model): qubits.""" CZ: Annotated[Optional[FixedSequenceFactory], {"symmetric": True}] = None - CNOT: Annotated[Optional[FixedSequenceFactory], {"symmetric": True}] = None + CNOT: Annotated[Optional[FixedSequenceFactory], {"symmetric": False}] = None iSWAP: Annotated[Optional[FixedSequenceFactory], {"symmetric": True}] = None @property diff --git a/src/qibolab/pulses/sequence.py b/src/qibolab/pulses/sequence.py index 331583e4ae..75a1b8a5cb 100644 --- a/src/qibolab/pulses/sequence.py +++ b/src/qibolab/pulses/sequence.py @@ -30,10 +30,10 @@ def __get_pydantic_core_schema__( cls, source_type: Any, handler: Callable[[Any], core_schema.CoreSchema] ) -> core_schema.CoreSchema: schema = handler(list[_Element]) - return core_schema.no_info_after_validator_function(cls.validate, schema) + return core_schema.no_info_after_validator_function(cls._validate, schema) @classmethod - def validate(cls, value): + def _validate(cls, value): return cls(value) @property diff --git a/tests/test_native.py b/tests/test_native.py index 160b24d24f..b852f16ef1 100644 --- a/tests/test_native.py +++ b/tests/test_native.py @@ -2,6 +2,7 @@ import numpy as np import pytest +from pydantic import TypeAdapter from qibolab.native import FixedSequenceFactory, RxyFactory, TwoQubitNatives from qibolab.pulses import ( @@ -141,7 +142,7 @@ def test_rxy_rotation_factory_envelopes(envelope): context = pytest.raises(ValueError, match="Incompatible pulse envelope") with context: - _ = RxyFactory(seq) + _ = TypeAdapter(RxyFactory).validate_python(seq) def test_two_qubit_natives_symmetric(): diff --git a/tests/test_platform.py b/tests/test_platform.py index 60bf55960b..42818e261e 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -70,14 +70,16 @@ def test_platform_basics(): assert str(platform) == "ciao" assert platform.topology == [] - qs = {q: Qubit(q) for q in range(10)} + qs = {q: Qubit(name=q) for q in range(10)} platform2 = Platform( name="come va?", parameters=Parameters( native_gates=NativeGates( single_qubit=qs, two_qubit={ - (q1, q2): QubitPair(q1, q2) for q1 in range(3) for q2 in range(4, 8) + (q1, q2): QubitPair(qubit1=q1, qubit2=q2) + for q1 in range(3) + for q2 in range(4, 8) }, coupler={}, ) From 440c475e780a224837de6416749691f3ef21ed2e Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 13 Aug 2024 14:00:19 +0200 Subject: [PATCH 0588/1006] fix: Fix pulse sequence serialization --- src/qibolab/pulses/sequence.py | 13 ++++++++++++- src/qibolab/serialize.py | 9 ++------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/qibolab/pulses/sequence.py b/src/qibolab/pulses/sequence.py index 75a1b8a5cb..b434b2a887 100644 --- a/src/qibolab/pulses/sequence.py +++ b/src/qibolab/pulses/sequence.py @@ -4,6 +4,7 @@ from collections.abc import Callable, Iterable from typing import Any +from pydantic import TypeAdapter from pydantic_core import core_schema from qibolab.components import ChannelId @@ -30,12 +31,22 @@ def __get_pydantic_core_schema__( cls, source_type: Any, handler: Callable[[Any], core_schema.CoreSchema] ) -> core_schema.CoreSchema: schema = handler(list[_Element]) - return core_schema.no_info_after_validator_function(cls._validate, schema) + return core_schema.no_info_after_validator_function( + cls._validate, + schema, + serialization=core_schema.plain_serializer_function_ser_schema( + cls._serialize, info_arg=False, return_schema=schema + ), + ) @classmethod def _validate(cls, value): return cls(value) + @staticmethod + def _serialize(value): + return TypeAdapter(list[_Element]).dump_python(list(value)) + @property def duration(self) -> float: """Duration of the entire sequence.""" diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index a725b2fe81..f662b88fb0 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -5,7 +5,7 @@ """ import json -from dataclasses import dataclass, field, fields +from dataclasses import dataclass, field from pathlib import Path from typing import Optional, Union @@ -178,12 +178,7 @@ def _dump_sequence(sequence: PulseSequence): def _dump_natives(natives: Union[SingleQubitNatives, TwoQubitNatives]): - data = {} - for fld in fields(natives): - factory = getattr(natives, fld.name) - if factory is not None: - data[fld.name] = _dump_sequence(factory._seq) - return data + return natives.model_dump() # TODO: kernels are part of the parameters, they should not be dumped separately From 9474be61cfb8511703783a8f79718312817d94c6 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 13 Aug 2024 14:07:00 +0200 Subject: [PATCH 0589/1006] docs: Fix doctests for natives deserialization --- doc/source/getting-started/experiment.rst | 4 +- doc/source/tutorials/lab.rst | 78 ++++++++++++----------- 2 files changed, 44 insertions(+), 38 deletions(-) diff --git a/doc/source/getting-started/experiment.rst b/doc/source/getting-started/experiment.rst index 9d00688285..53107a3972 100644 --- a/doc/source/getting-started/experiment.rst +++ b/doc/source/getting-started/experiment.rst @@ -41,7 +41,7 @@ In this example, the qubit is controlled by a Zurich Instruments' SHFQC instrume # TODO: understand error generate by doctest # from qibolab.instruments.zhinst import ZiChannel, Zurich from qibolab.platform import Platform - from qibolab.serialize import Runcard + from qibolab.serialize import Parameters NAME = "my_platform" # name of the platform ADDRESS = "localhost" # ip address of the ZI data server @@ -58,7 +58,7 @@ In this example, the qubit is controlled by a Zurich Instruments' SHFQC instrume device_setup.add_instruments(SHFQC("device_shfqc", address="DEV12146")) # Load and parse the runcard (i.e. parameters.json) - runcard = Runcard.load(FOLDER) + runcard = Parameters.load(FOLDER) qubits = runcard.native_gates.single_qubit pairs = runcard.native_gates.pairs qubit = qubits[0] diff --git a/doc/source/tutorials/lab.rst b/doc/source/tutorials/lab.rst index f05a3a1754..7ac001ca89 100644 --- a/doc/source/tutorials/lab.rst +++ b/doc/source/tutorials/lab.rst @@ -34,11 +34,11 @@ using different Qibolab primitives. instrument = DummyInstrument("my_instrument", "0.0.0.0:0") # create the qubit object - qubit = Qubit(0) + qubit = Qubit(name=0) # assign channels to the qubit qubit.probe = IqChannel(name="probe", mixer=None, lo=None, acquisition="acquire") - qubit.acquire = AcquireChannel(name="acquire", twpa_pump=None, probe="probe") + qubit.acquisition = AcquireChannel(name="acquire", twpa_pump=None, probe="probe") qubit.drive = Iqchannel(name="drive", mixer=None, lo=None) # define configuration for channels @@ -112,16 +112,16 @@ hold the parameters of the two-qubit gates. ) # create the qubit objects - qubit0 = Qubit(0) - qubit1 = Qubit(1) + qubit0 = Qubit(name=0) + qubit1 = Qubit(name=1) # assign channels to the qubits qubit0.probe = IqChannel(name="probe_0", mixer=None, lo=None, acquisition="acquire_0") - qubit0.acquire = AcquireChannel(name="acquire_0", twpa_pump=None, probe="probe_0") + qubit0.acquisition = AcquireChannel(name="acquire_0", twpa_pump=None, probe="probe_0") qubit0.drive = IqChannel(name="drive_0", mixer=None, lo=None) qubit0.flux = DcChannel(name="flux_0") qubit1.probe = IqChannel(name="probe_1", mixer=None, lo=None, acquisition="acquire_1") - qubit1.acquire = AcquireChannel(name="acquire_1", twpa_pump=None, probe="probe_1") + qubit1.acquisition = AcquireChannel(name="acquire_1", twpa_pump=None, probe="probe_1") qubit1.drive = IqChannel(name="drive_1", mixer=None, lo=None) # assign single-qubit native gates to each qubit @@ -177,18 +177,21 @@ hold the parameters of the two-qubit gates. ) # define the pair of qubits - pair = QubitPair(qubit0.name, qubit1.name) - pair.native_gates = TwoQubitNatives( - CZ=FixedSequenceFactory( - PulseSequence( - [ - ( - qubit0.flux.name, - Pulse(duration=30, amplitude=0.005, envelope=Rectangular()), - ), - ] + pair = QubitPair( + qubit1=qubit0.name, + qubit2=qubit1.name, + native_gates=TwoQubitNatives( + CZ=FixedSequenceFactory( + PulseSequence( + [ + ( + qubit0.flux.name, + Pulse(duration=30, amplitude=0.005, envelope=Rectangular()), + ), + ] + ) ) - ) + ), ) Some architectures may also have coupler qubits that mediate the interactions. @@ -209,9 +212,9 @@ coupler but qibolab will take them into account when calling :class:`qibolab.nat ) # create the qubit and coupler objects - qubit0 = Qubit(0) - qubit1 = Qubit(1) - coupler_01 = Qubit(100) + qubit0 = Qubit(name=0) + qubit1 = Qubit(name=1) + coupler_01 = Qubit(name=100) # assign channel(s) to the coupler coupler_01.flux = DcChannel(name="flux_coupler_01") @@ -220,18 +223,21 @@ coupler but qibolab will take them into account when calling :class:`qibolab.nat # Look above example # define the pair of qubits - pair = QubitPair(qubit0.name, qubit1.name) - pair.native_gates = TwoQubitNatives( - CZ=FixedSequenceFactory( - PulseSequence( - [ - ( - coupler_01.flux.name, - Pulse(duration=30, amplitude=0.005, envelope=Rectangular()), - ) - ], + pair = QubitPair( + qubit1=qubit0.name, + qubit2=qubit1.name, + native_gates=TwoQubitNatives( + CZ=FixedSequenceFactory( + PulseSequence( + [ + ( + coupler_01.flux.name, + Pulse(duration=30, amplitude=0.005, envelope=Rectangular()), + ) + ], + ) ) - ) + ), ) The platform automatically creates the connectivity graph of the given chip @@ -489,7 +495,7 @@ the above runcard: DcConfig, IqConfig, ) - from qibolab.serialize import Runcard + from qibolab.serialize import Parameters from qibolab.instruments.dummy import DummyInstrument FOLDER = Path.cwd() @@ -501,7 +507,7 @@ the above runcard: instrument = DummyInstrument("my_instrument", "0.0.0.0:0") # create ``Qubit`` and ``QubitPair`` objects by loading the runcard - runcard = Runcard.load(folder) + runcard = Parameters.load(folder) qubits = runcard.native_gates.single_qubit pairs = runcard.native_gates.pairs @@ -553,7 +559,7 @@ With the following additions for coupler architectures: instrument = DummyInstrument("my_instrument", "0.0.0.0:0") # create ``Qubit`` and ``QubitPair`` objects by loading the runcard - runcard = Runcard.load(folder) + runcard = Parameters.load(folder) qubits = runcard.native_gates.single_qubit couplers = runcard.native_gates.coupler pairs = runcard.native_gates.pairs @@ -654,7 +660,7 @@ in this case ``"twpa_pump"``. DcConfig, IqConfig, ) - from qibolab.serialize import Runcard + from qibolab.serialize import Parameters from qibolab.instruments.dummy import DummyInstrument FOLDER = Path.cwd() @@ -666,7 +672,7 @@ in this case ``"twpa_pump"``. instrument = DummyInstrument("my_instrument", "0.0.0.0:0") # create ``Qubit`` and ``QubitPair`` objects by loading the runcard - runcard = Runcard.load(folder) + runcard = Parameters.load(folder) qubits = runcard.native_gates.single_qubit pairs = runcard.native_gates.pairs From 948ab3d1947f03d6c60c66020c84e749487fc39a Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 13 Aug 2024 14:15:14 +0200 Subject: [PATCH 0590/1006] fix: Replace dataclasses' fields access and specification --- src/qibolab/qubits.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index f58d265695..08a5dbb7bd 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -1,4 +1,3 @@ -from dataclasses import field, fields from typing import Annotated, Optional, Union from pydantic import ConfigDict, Field @@ -37,7 +36,9 @@ class Qubit(Model): name: QubitId - native_gates: SingleQubitNatives = field(default_factory=SingleQubitNatives) + native_gates: Annotated[ + SingleQubitNatives, Field(default_factory=SingleQubitNatives) + ] probe: Optional[IqChannel] = None acquisition: Optional[AcquireChannel] = None @@ -60,13 +61,13 @@ def mixer_frequencies(self): Assumes RF = LO + IF. """ freqs = {} - for gate in fields(self.native_gates): - native = getattr(self.native_gates, gate.name) + for name in self.native_gates.model_fields: + native = getattr(self.native_gates, name) if native is not None: channel_type = native.pulse_type.name.lower() _lo = getattr(self, channel_type).lo_frequency _if = native.frequency - _lo - freqs[gate.name] = _lo, _if + freqs[name] = _lo, _if return freqs @@ -93,4 +94,4 @@ class QubitPair(Model): Acts as target on two-qubit gates. """ - native_gates: TwoQubitNatives = field(default_factory=TwoQubitNatives) + native_gates: Annotated[TwoQubitNatives, Field(default_factory=SingleQubitNatives)] From 3578d7aa7e1ce562c1fde772b554ecbdea177d83 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 13 Aug 2024 14:24:07 +0200 Subject: [PATCH 0591/1006] build: Ignore Pylint inspection for sequence subclass --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index c351e8bcfb..008a1e2784 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -101,6 +101,7 @@ test-docs = "make -C doc doctest" [tool.pylint.master] output-format = "colorized" disable = ["E1123", "E1120", "C0301"] +generated-members = ["qibolab.native.RxyFactory"] [tool.pytest.ini_options] testpaths = ['tests/'] From 6070089cb827bbdf0f8ddcd8c21abec39b4c3b04 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 13 Aug 2024 15:33:03 +0200 Subject: [PATCH 0592/1006] feat!: Drop last custom (de)serializers At the price of complex qubit/pairs handling, because the natives and channels will come from two different places, but they have to rejoin within the same objects. --- src/qibolab/dummy/platform.py | 17 +++--- src/qibolab/platform/platform.py | 36 +++++++++++-- src/qibolab/qubits.py | 10 +++- src/qibolab/serialize.py | 88 +++----------------------------- tests/test_backends.py | 28 +++++++--- 5 files changed, 75 insertions(+), 104 deletions(-) diff --git a/src/qibolab/dummy/platform.py b/src/qibolab/dummy/platform.py index 8fbc318fa6..5cf1e0a4c0 100644 --- a/src/qibolab/dummy/platform.py +++ b/src/qibolab/dummy/platform.py @@ -21,7 +21,13 @@ def create_dummy(): kernels = Kernels.load(FOLDER) configs = parameters.configs - for q, qubit in parameters.native_gates.single_qubit.items(): + platform = Platform( + FOLDER.name, + parameters=parameters, + configs=configs, + instruments={instrument.name: instrument, twpa_pump.name: twpa_pump}, + ) + for q, qubit in platform.qubits.items(): acquisition_name = f"qubit_{q}/acquire" probe_name = f"qubit_{q}/probe" qubit.probe = IqChannel( @@ -43,13 +49,8 @@ def create_dummy(): flux_name = f"qubit_{q}/flux" qubit.flux = DcChannel(flux_name) - for c, coupler in parameters.native_gates.coupler.items(): + for c, coupler in platform.couplers.items(): flux_name = f"coupler_{c}/flux" coupler.flux = DcChannel(flux_name) - return Platform( - FOLDER.name, - parameters=parameters, - configs=configs, - instruments={instrument.name: instrument, twpa_pump.name: twpa_pump}, - ) + return platform diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 911b21b97a..0af2c33c05 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -1,7 +1,7 @@ """A platform for executing quantum algorithms.""" from collections import defaultdict -from dataclasses import dataclass +from dataclasses import dataclass, field from math import prod from typing import Any, Literal, Optional, TypeVar @@ -11,7 +11,7 @@ from qibolab.execution_parameters import ExecutionParameters from qibolab.instruments.abstract import Controller, Instrument, InstrumentId from qibolab.pulses import Delay, PulseSequence -from qibolab.qubits import QubitId, QubitPairId +from qibolab.qubits import Qubit, QubitId, QubitPair, QubitPairId from qibolab.serialize import ( Parameters, QubitMap, @@ -105,6 +105,9 @@ class Platform: """Type of resonator (2D or 3D) in the used QPU.""" is_connected: bool = False """Flag for whether we are connected to the physical instruments.""" + _qubits: QubitMap = field(default_factory=dict) + _couplers: QubitMap = field(default_factory=dict) + _pairs: QubitPairMap = field(default_factory=dict) def __post_init__(self): log.info("Loading platform %s", self.name) @@ -117,18 +120,41 @@ def __str__(self): @property def qubits(self) -> QubitMap: """Mapping qubit names to :class:`qibolab.qubits.Qubit` objects.""" - return self.parameters.native_gates.single_qubit + if len(self._qubits) == 0: + for q, natives in self.parameters.native_gates.single_qubit.items(): + self._qubits[q] = Qubit(name=q, native_gates=natives) + + for q, natives in self.parameters.native_gates.single_qubit.items(): + self._qubits[q].native_gates = natives + + return self._qubits @property def couplers(self) -> QubitMap: """Mapping coupler names to :class:`qibolab.qubits.Qubit` objects.""" - return self.parameters.native_gates.coupler + if len(self._couplers) == 0: + for c, natives in self.parameters.native_gates.coupler.items(): + self._couplers[c] = Qubit(name=c, native_gates=natives) + + for c, natives in self.parameters.native_gates.coupler.items(): + self._couplers[c].native_gates = natives + + return self._couplers @property def pairs(self) -> QubitPairMap: """Mapping tuples of qubit names to :class:`qibolab.qubits.QubitPair` objects.""" - return self.parameters.native_gates.two_qubit + if len(self._pairs) == 0: + for p, natives in self.parameters.native_gates.two_qubit.items(): + self._pairs[p] = QubitPair( + qubit1=p[0], qubit2=p[1], native_gates=natives + ) + + for p, natives in self.parameters.native_gates.two_qubit.items(): + self._pairs[p].native_gates = natives + + return self._pairs @property def settings(self) -> Settings: diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index 08a5dbb7bd..be576a3d20 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -1,6 +1,6 @@ from typing import Annotated, Optional, Union -from pydantic import ConfigDict, Field +from pydantic import BeforeValidator, ConfigDict, Field, PlainSerializer from qibolab.components import AcquireChannel, DcChannel, IqChannel from qibolab.native import SingleQubitNatives, TwoQubitNatives @@ -71,7 +71,11 @@ def mixer_frequencies(self): return freqs -QubitPairId = tuple[QubitId, QubitId] +QubitPairId = Annotated[ + tuple[QubitId, QubitId], + BeforeValidator(lambda p: tuple(p.split("-"))), + PlainSerializer(lambda p: f"{p.qubit1}-{p.qubit2}"), +] """Type for holding ``QubitPair``s in the ``platform.pairs`` dictionary.""" @@ -83,6 +87,8 @@ class QubitPair(Model): :class:`qibolab.platforms.abstract.Qubit`. """ + model_config = ConfigDict(frozen=False) + qubit1: QubitId """First qubit of the pair. diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index f662b88fb0..c343b96d8d 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -7,7 +7,7 @@ import json from dataclasses import dataclass, field from pathlib import Path -from typing import Optional, Union +from typing import Optional from pydantic import TypeAdapter @@ -15,7 +15,6 @@ from qibolab.execution_parameters import ConfigUpdate, ExecutionParameters from qibolab.kernels import Kernels from qibolab.native import SingleQubitNatives, TwoQubitNatives -from qibolab.pulses import PulseSequence from qibolab.qubits import Qubit, QubitId, QubitPair, QubitPairId from qibolab.serialize_ import Model, replace @@ -63,42 +62,10 @@ def fill(self, options: ExecutionParameters): return options -@dataclass -class NativeGates: - single_qubit: dict[QubitId, Qubit] - coupler: dict[QubitId, Qubit] - two_qubit: dict[QubitPairId, QubitPair] - - @classmethod - def load(cls, raw: dict): - """Load qubits, couplers and pairs.""" - qubits = _load_single_qubit_natives(raw["single_qubit"]) - couplers = _load_single_qubit_natives(raw["coupler"]) - pairs = _load_two_qubit_natives(raw["two_qubit"]) - return cls(qubits, couplers, pairs) - - def dump(self) -> dict: - """Serialize native gates section to dictionary.""" - native_gates = { - "single_qubit": { - _dump_qubit_name(q): _dump_natives(qubit.native_gates) - for q, qubit in self.single_qubit.items() - } - } - - native_gates["coupler"] = { - _dump_qubit_name(q): _dump_natives(qubit.native_gates) - for q, qubit in self.coupler.items() - } - - native_gates["two_qubit"] = {} - for pair in self.two_qubit.values(): - natives = _dump_natives(pair.native_gates) - if len(natives) > 0: - pair_name = f"{pair.qubit1}-{pair.qubit2}" - native_gates["two_qubit"][pair_name] = natives - - return native_gates +class NativeGates(Model): + single_qubit: dict[QubitId, SingleQubitNatives] + coupler: dict[QubitId, SingleQubitNatives] + two_qubit: dict[QubitPairId, TwoQubitNatives] @dataclass @@ -114,9 +81,9 @@ class Parameters: def load(cls, path: Path): """Load parameters from JSON.""" d = json.loads((path / PARAMETERS).read_text()) - settings = Settings(**d["settings"]) + settings = Settings.model_validate(d["settings"]) configs = TypeAdapter(dict[str, Config]).validate_python(d["components"]) - natives = NativeGates.load(d["native_gates"]) + natives = NativeGates.model_validate(d["native_gates"]) return cls(settings=settings, configs=configs, native_gates=natives) def dump(self, path: Path, updates: Optional[list[ConfigUpdate]] = None): @@ -140,47 +107,6 @@ def dump(self, path: Path, updates: Optional[list[ConfigUpdate]] = None): (path / PARAMETERS).write_text(json.dumps(settings, sort_keys=False, indent=4)) -def _load_qubit_name(name: str) -> QubitId: - """Convert qubit name from string to integer or string.""" - return TypeAdapter(QubitId).validate_python(name) - - -def _load_single_qubit_natives(gates: dict) -> dict[QubitId, Qubit]: - """Parse native gates.""" - qubits = {} - for q, gatedict in gates.items(): - name = _load_qubit_name(q) - native_gates = SingleQubitNatives(**gatedict) - qubits[name] = Qubit(name=name, native_gates=native_gates) - return qubits - - -def _load_two_qubit_natives(gates: dict) -> dict[QubitPairId, QubitPair]: - pairs = {} - for pair, gatedict in gates.items(): - q0, q1 = (_load_qubit_name(q) for q in pair.split("-")) - native_gates = TwoQubitNatives(**gatedict) - pairs[(q0, q1)] = QubitPair( - **dict(qubit1=q0, qubit2=q1, native_gates=native_gates) - ) - if native_gates.symmetric: - pairs[(q1, q0)] = pairs[(q0, q1)] - return pairs - - -def _dump_qubit_name(name: QubitId) -> str: - """Convert qubit name from integer or string to string.""" - return TypeAdapter(QubitId).dump_python(name) - - -def _dump_sequence(sequence: PulseSequence): - return [(ch, p.model_dump()) for ch, p in sequence] - - -def _dump_natives(natives: Union[SingleQubitNatives, TwoQubitNatives]): - return natives.model_dump() - - # TODO: kernels are part of the parameters, they should not be dumped separately def dump_kernels(platform: "Platform", path: Path): """Creates Kernels instance from platform and dumps as npz. diff --git a/tests/test_backends.py b/tests/test_backends.py index 0e3bc2a673..017fdd2838 100644 --- a/tests/test_backends.py +++ b/tests/test_backends.py @@ -106,14 +106,26 @@ def test_multiple_measurements(): def dummy_string_qubit_names(): """Create dummy platform with string-named qubits.""" platform = create_platform("dummy") - for q, qubit in platform.qubits.items(): - qubit.name = f"A{q}" - platform.parameters.native_gates.single_qubit = { - qubit.name: qubit for qubit in platform.qubits.values() - } - platform.parameters.native_gates.two_qubit = { - (f"A{q0}", f"A{q1}"): pair for (q0, q1), pair in platform.pairs.items() - } + for q, qubit in platform.qubits.copy().items(): + name = f"A{q}" + qubit.name = name + platform._qubits[name] = qubit + del platform._qubits[q] + platform.parameters.native_gates.single_qubit[name] = ( + platform.parameters.native_gates.single_qubit[q] + ) + del platform.parameters.native_gates.single_qubit[q] + for (q0, q1), pair in platform.pairs.copy().items(): + name = (f"A{q0}", f"A{q1}") + pair.qubit1 = name[0] + pair.qubit2 = name[1] + platform._pairs[name] = pair + del platform._pairs[(q0, q1)] + platform.parameters.native_gates.two_qubit[name] = ( + platform.parameters.native_gates.two_qubit[(q0, q1)] + ) + del platform.parameters.native_gates.two_qubit[(q0, q1)] + return platform From fd44d00a6e32de0cba5f4433e334c81ca04d9a03 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 13 Aug 2024 15:58:26 +0200 Subject: [PATCH 0593/1006] fix: Fix scattered serialization bugs --- src/qibolab/qubits.py | 10 ++++------ src/qibolab/serialize.py | 13 ++++++------- tests/test_platform.py | 13 +++++-------- 3 files changed, 15 insertions(+), 21 deletions(-) diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index be576a3d20..26c7bb97c4 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -36,9 +36,7 @@ class Qubit(Model): name: QubitId - native_gates: Annotated[ - SingleQubitNatives, Field(default_factory=SingleQubitNatives) - ] + native_gates: SingleQubitNatives = Field(default_factory=SingleQubitNatives) probe: Optional[IqChannel] = None acquisition: Optional[AcquireChannel] = None @@ -73,8 +71,8 @@ def mixer_frequencies(self): QubitPairId = Annotated[ tuple[QubitId, QubitId], - BeforeValidator(lambda p: tuple(p.split("-"))), - PlainSerializer(lambda p: f"{p.qubit1}-{p.qubit2}"), + BeforeValidator(lambda p: tuple(p.split("-")) if isinstance(p, str) else p), + PlainSerializer(lambda p: f"{p[0]}-{p[1]}"), ] """Type for holding ``QubitPair``s in the ``platform.pairs`` dictionary.""" @@ -100,4 +98,4 @@ class QubitPair(Model): Acts as target on two-qubit gates. """ - native_gates: Annotated[TwoQubitNatives, Field(default_factory=SingleQubitNatives)] + native_gates: TwoQubitNatives = Field(default_factory=TwoQubitNatives) diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index c343b96d8d..37f9ac2b1a 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -9,7 +9,7 @@ from pathlib import Path from typing import Optional -from pydantic import TypeAdapter +from pydantic import Field, TypeAdapter from qibolab.components import Config from qibolab.execution_parameters import ConfigUpdate, ExecutionParameters @@ -63,9 +63,9 @@ def fill(self, options: ExecutionParameters): class NativeGates(Model): - single_qubit: dict[QubitId, SingleQubitNatives] - coupler: dict[QubitId, SingleQubitNatives] - two_qubit: dict[QubitPairId, TwoQubitNatives] + single_qubit: dict[QubitId, SingleQubitNatives] = Field(default_factory=dict) + coupler: dict[QubitId, SingleQubitNatives] = Field(default_factory=dict) + two_qubit: dict[QubitPairId, TwoQubitNatives] = Field(default_factory=dict) @dataclass @@ -74,8 +74,7 @@ class Parameters: settings: Settings = field(default_factory=Settings) configs: dict[str, Config] = field(default_factory=dict) - # TODO: add gates template - native_gates: NativeGates = field(default_factory=dict) + native_gates: NativeGates = field(default_factory=NativeGates) @classmethod def load(cls, path: Path): @@ -101,7 +100,7 @@ def dump(self, path: Path, updates: Optional[list[ConfigUpdate]] = None): settings = { "settings": self.settings.model_dump(), "components": TypeAdapter(dict[str, Config]).dump_python(configs), - "native_gates": self.native_gates.dump(), + "native_gates": self.native_gates.model_dump(), } (path / PARAMETERS).write_text(json.dumps(settings, sort_keys=False, indent=4)) diff --git a/tests/test_platform.py b/tests/test_platform.py index 42818e261e..cb92b32207 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -20,11 +20,11 @@ from qibolab.execution_parameters import ExecutionParameters from qibolab.instruments.qblox.controller import QbloxController from qibolab.kernels import Kernels +from qibolab.native import SingleQubitNatives, TwoQubitNatives from qibolab.platform import Platform, unroll_sequences from qibolab.platform.load import PLATFORMS from qibolab.platform.platform import update_configs from qibolab.pulses import Delay, Gaussian, Pulse, PulseSequence, Rectangular -from qibolab.qubits import Qubit, QubitPair from qibolab.serialize import ( PLATFORM, NativeGates, @@ -63,24 +63,21 @@ def test_create_platform_error(): def test_platform_basics(): platform = Platform( name="ciao", - parameters=Parameters(native_gates=NativeGates({}, {}, {})), + parameters=Parameters(native_gates=NativeGates()), configs={}, instruments={}, ) assert str(platform) == "ciao" assert platform.topology == [] - qs = {q: Qubit(name=q) for q in range(10)} + qs = {q: SingleQubitNatives() for q in range(10)} + ts = {(q1, q2): TwoQubitNatives() for q1 in range(3) for q2 in range(4, 8)} platform2 = Platform( name="come va?", parameters=Parameters( native_gates=NativeGates( single_qubit=qs, - two_qubit={ - (q1, q2): QubitPair(qubit1=q1, qubit2=q2) - for q1 in range(3) - for q2 in range(4, 8) - }, + two_qubit=ts, coupler={}, ) ), From 30dcab48005be478cf705aa98f314a336fbf7bd2 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 13 Aug 2024 16:15:57 +0200 Subject: [PATCH 0594/1006] fix: Fully automate parameters (de)serialization And abandon update during dump - it's not modular, and causing troubles --- src/qibolab/dummy/parameters.json | 16 +------------- src/qibolab/dummy/platform.py | 12 +++++++++++ src/qibolab/serialize.py | 36 +++++++++---------------------- tests/test_platform.py | 5 +++-- 4 files changed, 26 insertions(+), 43 deletions(-) diff --git a/src/qibolab/dummy/parameters.json b/src/qibolab/dummy/parameters.json index 60c98cc76f..828fd9ad9b 100644 --- a/src/qibolab/dummy/parameters.json +++ b/src/qibolab/dummy/parameters.json @@ -1,23 +1,9 @@ { - "nqubits": 5, "settings": { "nshots": 1024, "relaxation_time": 0 }, - "instruments": { - "dummy": { - "bounds": { - "waveforms": 0, - "readout": 0, - "instructions": 0 - } - }, - "twpa_pump": { - "power": 10, - "frequency": 1000000000.0 - } - }, - "components": { + "configs": { "qubit_0/drive": { "kind": "iq", "frequency": 4000000000 diff --git a/src/qibolab/dummy/platform.py b/src/qibolab/dummy/platform.py index 5cf1e0a4c0..544bd92bdf 100644 --- a/src/qibolab/dummy/platform.py +++ b/src/qibolab/dummy/platform.py @@ -54,3 +54,15 @@ def create_dummy(): coupler.flux = DcChannel(flux_name) return platform + + +# TODO: +# "instruments": { +# "dummy": { +# "bounds": { +# "waveforms": 0, +# "readout": 0, +# "instructions": 0 +# } +# }, +# }, diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index 37f9ac2b1a..9ab005407e 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -5,11 +5,9 @@ """ import json -from dataclasses import dataclass, field from pathlib import Path -from typing import Optional -from pydantic import Field, TypeAdapter +from pydantic import Field from qibolab.components import Config from qibolab.execution_parameters import ConfigUpdate, ExecutionParameters @@ -68,42 +66,28 @@ class NativeGates(Model): two_qubit: dict[QubitPairId, TwoQubitNatives] = Field(default_factory=dict) -@dataclass -class Parameters: +class Parameters(Model): """Serializable parameters.""" - settings: Settings = field(default_factory=Settings) - configs: dict[str, Config] = field(default_factory=dict) - native_gates: NativeGates = field(default_factory=NativeGates) + settings: Settings = Field(default_factory=Settings) + configs: dict[str, Config] = Field(default_factory=dict) + native_gates: NativeGates = Field(default_factory=NativeGates) @classmethod def load(cls, path: Path): """Load parameters from JSON.""" - d = json.loads((path / PARAMETERS).read_text()) - settings = Settings.model_validate(d["settings"]) - configs = TypeAdapter(dict[str, Config]).validate_python(d["components"]) - natives = NativeGates.model_validate(d["native_gates"]) - return cls(settings=settings, configs=configs, native_gates=natives) + return cls.model_validate(json.loads((path / PARAMETERS).read_text())) - def dump(self, path: Path, updates: Optional[list[ConfigUpdate]] = None): + def dump(self, path: Path): """Platform serialization as parameters (json) and kernels (npz). The file saved follows the format explained in :ref:`Using parameters `. The requested ``path`` is the folder where the json and npz will be dumped. - - ``updates`` is an optional list if updates for platform configs. Later entries in the list take precedence over earlier ones (if they happen to update the same thing). """ - configs = self.configs.copy() - update_configs(configs, updates or []) - - settings = { - "settings": self.settings.model_dump(), - "components": TypeAdapter(dict[str, Config]).dump_python(configs), - "native_gates": self.native_gates.model_dump(), - } - - (path / PARAMETERS).write_text(json.dumps(settings, sort_keys=False, indent=4)) + (path / PARAMETERS).write_text( + json.dumps(self.model_dump(), sort_keys=False, indent=4) + ) # TODO: kernels are part of the parameters, they should not be dumped separately diff --git a/tests/test_platform.py b/tests/test_platform.py index cb92b32207..f176b45fcd 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -170,7 +170,7 @@ def test_dump_parameters(platform, tmp_path): assert final.configs == target.configs -def test_dump_parameterswith_updates(platform, tmp_path): +def test_dump_parameters_with_updates(platform: Platform, tmp_path): qubit = next(iter(platform.qubits.values())) frequency = platform.config(qubit.drive.name).frequency + 1.5e9 smearing = platform.config(qubit.acquisition.name).smearing + 10 @@ -178,7 +178,8 @@ def test_dump_parameterswith_updates(platform, tmp_path): qubit.drive.name: {"frequency": frequency}, qubit.acquisition.name: {"smearing": smearing}, } - platform.parameters.dump(tmp_path, [update]) + update_configs(platform.parameters.configs, [update]) + platform.parameters.dump(tmp_path) final = Parameters.load(tmp_path) assert final.configs[qubit.drive.name].frequency == frequency assert final.configs[qubit.acquisition.name].smearing == smearing From f1d7666d1e0b64a6b8eea57adae5fe2c15c4783c Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 13 Aug 2024 16:18:49 +0200 Subject: [PATCH 0595/1006] test: Whitelist pydantic FieldInfo as well --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 008a1e2784..ea9a5cead3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -101,7 +101,7 @@ test-docs = "make -C doc doctest" [tool.pylint.master] output-format = "colorized" disable = ["E1123", "E1120", "C0301"] -generated-members = ["qibolab.native.RxyFactory"] +generated-members = ["qibolab.native.RxyFactory, pydantic.fields.FieldInfo"] [tool.pytest.ini_options] testpaths = ['tests/'] From 365ee2cc6746130bed4633c967da3cadb68d391f Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 13 Aug 2024 16:25:53 +0200 Subject: [PATCH 0596/1006] fix: Reintroduce extended support for symmetric two-qubit gates --- src/qibolab/platform/platform.py | 6 ++++++ tests/test_backends.py | 12 ++++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 0af2c33c05..3526af9e13 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -150,9 +150,15 @@ def pairs(self) -> QubitPairMap: self._pairs[p] = QubitPair( qubit1=p[0], qubit2=p[1], native_gates=natives ) + if natives.symmetric: + self._pairs[(p[1], p[0])] = QubitPair( + qubit1=p[0], qubit2=p[1], native_gates=natives + ) for p, natives in self.parameters.native_gates.two_qubit.items(): self._pairs[p].native_gates = natives + if natives.symmetric: + self._pairs[(p[1], p[0])].native_gates = natives return self._pairs diff --git a/tests/test_backends.py b/tests/test_backends.py index 017fdd2838..27528aa458 100644 --- a/tests/test_backends.py +++ b/tests/test_backends.py @@ -121,10 +121,14 @@ def dummy_string_qubit_names(): pair.qubit2 = name[1] platform._pairs[name] = pair del platform._pairs[(q0, q1)] - platform.parameters.native_gates.two_qubit[name] = ( - platform.parameters.native_gates.two_qubit[(q0, q1)] - ) - del platform.parameters.native_gates.two_qubit[(q0, q1)] + try: + platform.parameters.native_gates.two_qubit[name] = ( + platform.parameters.native_gates.two_qubit[(q0, q1)] + ) + del platform.parameters.native_gates.two_qubit[(q0, q1)] + except KeyError: + # the symmetrized pair is only present in pairs, not in the natives + pass return platform From 858eb48398a5237cb2b0405be219dc26f78fbda9 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 13 Aug 2024 16:38:20 +0200 Subject: [PATCH 0597/1006] feat!: Rename serialize module to parameters Move explicit dump methods to platform --- doc/source/getting-started/experiment.rst | 2 +- doc/source/tutorials/lab.rst | 10 +++--- src/qibolab/dummy/platform.py | 2 +- src/qibolab/{serialize.py => parameters.py} | 35 +----------------- src/qibolab/platform/load.py | 3 +- src/qibolab/platform/platform.py | 40 +++++++++++++++++---- tests/dummy_qrc/zurich/platform.py | 2 +- tests/test_platform.py | 12 ++----- 8 files changed, 46 insertions(+), 60 deletions(-) rename src/qibolab/{serialize.py => parameters.py} (72%) diff --git a/doc/source/getting-started/experiment.rst b/doc/source/getting-started/experiment.rst index 53107a3972..b3152f77db 100644 --- a/doc/source/getting-started/experiment.rst +++ b/doc/source/getting-started/experiment.rst @@ -40,8 +40,8 @@ In this example, the qubit is controlled by a Zurich Instruments' SHFQC instrume # TODO: understand error generate by doctest # from qibolab.instruments.zhinst import ZiChannel, Zurich + from qibolab.parameters import Parameters from qibolab.platform import Platform - from qibolab.serialize import Parameters NAME = "my_platform" # name of the platform ADDRESS = "localhost" # ip address of the ZI data server diff --git a/doc/source/tutorials/lab.rst b/doc/source/tutorials/lab.rst index 7ac001ca89..d3fdb596a5 100644 --- a/doc/source/tutorials/lab.rst +++ b/doc/source/tutorials/lab.rst @@ -277,7 +277,7 @@ since ``create()`` is part of a Python module, is is possible to load parameters from an external file or database. Qibolab provides some utility functions, accessible through -:py:mod:`qibolab.serialize`, for loading calibration parameters stored in a JSON +:py:mod:`qibolab.parameters`, for loading calibration parameters stored in a JSON file with a specific format. We call such file a runcard. Here is a runcard for a two-qubit system: @@ -476,7 +476,7 @@ however the pulses under ``native_gates`` should comply with the Providing the above runcard is not sufficient to instantiate a :class:`qibolab.platform.Platform`. This should still be done using a ``create()`` method, however this is significantly simplified by -``qibolab.serialize``. The ``create()`` method should be put in a +``qibolab.parameters``. The ``create()`` method should be put in a file named ``platform.py`` inside the ``my_platform`` directory. Here is the ``create()`` method that loads the parameters of the above runcard: @@ -495,7 +495,7 @@ the above runcard: DcConfig, IqConfig, ) - from qibolab.serialize import Parameters + from qibolab.parameters import Parameters from qibolab.instruments.dummy import DummyInstrument FOLDER = Path.cwd() @@ -642,7 +642,7 @@ The runcard can contain an ``instruments`` section that provides these parameter } -These settings are loaded when creating the platform using :meth:`qibolab.serialize.load_instrument_settings`. +These settings are loaded when creating the platform using :meth:`qibolab.parameters.load_instrument_settings`. Note that the key used in the runcard should be the same with the name used when instantiating the instrument, in this case ``"twpa_pump"``. @@ -660,7 +660,7 @@ in this case ``"twpa_pump"``. DcConfig, IqConfig, ) - from qibolab.serialize import Parameters + from qibolab.parameters import Parameters from qibolab.instruments.dummy import DummyInstrument FOLDER = Path.cwd() diff --git a/src/qibolab/dummy/platform.py b/src/qibolab/dummy/platform.py index 544bd92bdf..65213e4e4c 100644 --- a/src/qibolab/dummy/platform.py +++ b/src/qibolab/dummy/platform.py @@ -3,8 +3,8 @@ from qibolab.components import AcquireChannel, DcChannel, IqChannel from qibolab.instruments.dummy import DummyInstrument, DummyLocalOscillator from qibolab.kernels import Kernels +from qibolab.parameters import Parameters from qibolab.platform import Platform -from qibolab.serialize import Parameters from qibolab.serialize_ import replace FOLDER = pathlib.Path(__file__).parent diff --git a/src/qibolab/serialize.py b/src/qibolab/parameters.py similarity index 72% rename from src/qibolab/serialize.py rename to src/qibolab/parameters.py index 9ab005407e..bd5b47fa4c 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/parameters.py @@ -11,16 +11,11 @@ from qibolab.components import Config from qibolab.execution_parameters import ConfigUpdate, ExecutionParameters -from qibolab.kernels import Kernels from qibolab.native import SingleQubitNatives, TwoQubitNatives -from qibolab.qubits import Qubit, QubitId, QubitPair, QubitPairId +from qibolab.qubits import QubitId, QubitPairId from qibolab.serialize_ import Model, replace PARAMETERS = "parameters.json" -PLATFORM = "platform.py" - -QubitMap = dict[QubitId, Qubit] -QubitPairMap = dict[QubitPairId, QubitPair] def update_configs(configs: dict[str, Config], updates: list[ConfigUpdate]): @@ -88,31 +83,3 @@ def dump(self, path: Path): (path / PARAMETERS).write_text( json.dumps(self.model_dump(), sort_keys=False, indent=4) ) - - -# TODO: kernels are part of the parameters, they should not be dumped separately -def dump_kernels(platform: "Platform", path: Path): - """Creates Kernels instance from platform and dumps as npz. - - Args: - platform (qibolab.platform.Platform): The platform to be serialized. - path (pathlib.Path): Path that the kernels file will be saved. - """ - - # create kernels - kernels = Kernels() - for qubit in platform.qubits.values(): - kernel = platform.configs[qubit.acquisition.name].kernel - if kernel is not None: - kernels[qubit.name] = kernel - - # dump only if not None - if len(kernels) > 0: - kernels.dump(path) - - -# TODO: drop as soon as dump_kernels is reabsorbed in the parameters -def dump_platform(platform: "Platform", path: Path): - """Dump paltform.""" - platform.parameters.dump(path) - dump_kernels(platform, path) diff --git a/src/qibolab/platform/load.py b/src/qibolab/platform/load.py index d5b514fb85..c9b95aa587 100644 --- a/src/qibolab/platform/load.py +++ b/src/qibolab/platform/load.py @@ -4,10 +4,9 @@ from qibo.config import raise_error -from qibolab.serialize import PLATFORM - from .platform import Platform +PLATFORM = "platform.py" PLATFORMS = "QIBOLAB_PLATFORMS" diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 3526af9e13..497c3044b4 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -3,6 +3,7 @@ from collections import defaultdict from dataclasses import dataclass, field from math import prod +from pathlib import Path from typing import Any, Literal, Optional, TypeVar from qibo.config import log, raise_error @@ -10,18 +11,15 @@ from qibolab.components import Config from qibolab.execution_parameters import ExecutionParameters from qibolab.instruments.abstract import Controller, Instrument, InstrumentId +from qibolab.kernels import Kernels +from qibolab.parameters import Parameters, Settings, update_configs from qibolab.pulses import Delay, PulseSequence from qibolab.qubits import Qubit, QubitId, QubitPair, QubitPairId -from qibolab.serialize import ( - Parameters, - QubitMap, - QubitPairMap, - Settings, - update_configs, -) from qibolab.sweeper import ParallelSweepers from qibolab.unrolling import batch +QubitMap = dict[QubitId, Qubit] +QubitPairMap = dict[QubitPairId, QubitPair] InstrumentMap = dict[InstrumentId, Instrument] NS_TO_SEC = 1e-9 @@ -344,3 +342,31 @@ def get_coupler(self, coupler): return self.couplers[coupler] except KeyError: return list(self.couplers.values())[coupler] + + +# TODO: kernels are part of the parameters, they should not be dumped separately +def dump_kernels(platform: Platform, path: Path): + """Creates Kernels instance from platform and dumps as npz. + + Args: + platform (qibolab.platform.Platform): The platform to be serialized. + path (pathlib.Path): Path that the kernels file will be saved. + """ + + # create kernels + kernels = Kernels() + for qubit in platform.qubits.values(): + kernel = platform.configs[qubit.acquisition.name].kernel + if kernel is not None: + kernels[qubit.name] = kernel + + # dump only if not None + if len(kernels) > 0: + kernels.dump(path) + + +# TODO: drop as soon as dump_kernels is reabsorbed in the parameters +def dump_platform(platform: Platform, path: Path): + """Dump paltform.""" + platform.parameters.dump(path) + dump_kernels(platform, path) diff --git a/tests/dummy_qrc/zurich/platform.py b/tests/dummy_qrc/zurich/platform.py index 77d2a52f9e..f391e66634 100644 --- a/tests/dummy_qrc/zurich/platform.py +++ b/tests/dummy_qrc/zurich/platform.py @@ -14,7 +14,7 @@ Zurich, ) from qibolab.kernels import Kernels -from qibolab.serialize import Parameters +from qibolab.parameters import Parameters FOLDER = pathlib.Path(__file__).parent diff --git a/tests/test_platform.py b/tests/test_platform.py index f176b45fcd..71f331e922 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -21,17 +21,11 @@ from qibolab.instruments.qblox.controller import QbloxController from qibolab.kernels import Kernels from qibolab.native import SingleQubitNatives, TwoQubitNatives +from qibolab.parameters import NativeGates, Parameters, update_configs from qibolab.platform import Platform, unroll_sequences -from qibolab.platform.load import PLATFORMS -from qibolab.platform.platform import update_configs +from qibolab.platform.load import PLATFORM, PLATFORMS +from qibolab.platform.platform import dump_kernels, dump_platform from qibolab.pulses import Delay, Gaussian, Pulse, PulseSequence, Rectangular -from qibolab.serialize import ( - PLATFORM, - NativeGates, - Parameters, - dump_kernels, - dump_platform, -) from qibolab.serialize_ import replace from .conftest import find_instrument From 1681a41ac0140f7820b4f481b286c2055a3e1d90 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 13 Aug 2024 16:41:49 +0200 Subject: [PATCH 0598/1006] feat!: Rename the new serialize module to default serialize --- doc/source/tutorials/calibration.rst | 2 +- src/qibolab/components/configs.py | 2 +- src/qibolab/dummy/platform.py | 2 +- src/qibolab/execution_parameters.py | 2 +- src/qibolab/native.py | 2 +- src/qibolab/parameters.py | 2 +- src/qibolab/pulses/envelope.py | 2 +- src/qibolab/pulses/pulse.py | 2 +- src/qibolab/qubits.py | 2 +- src/qibolab/{serialize_.py => serialize.py} | 0 tests/test_platform.py | 2 +- tests/test_serialize.py | 2 +- 12 files changed, 11 insertions(+), 11 deletions(-) rename src/qibolab/{serialize_.py => serialize.py} (100%) diff --git a/doc/source/tutorials/calibration.rst b/doc/source/tutorials/calibration.rst index 001284b626..fbebca7331 100644 --- a/doc/source/tutorials/calibration.rst +++ b/doc/source/tutorials/calibration.rst @@ -118,7 +118,7 @@ complex pulse sequence. Therefore with start with that: AveragingMode, AcquisitionType, ) - from qibolab.serialize_ import replace + from qibolab.serialize import replace # allocate platform platform = create_platform("dummy") diff --git a/src/qibolab/components/configs.py b/src/qibolab/components/configs.py index c28e294e0c..dfd73c490f 100644 --- a/src/qibolab/components/configs.py +++ b/src/qibolab/components/configs.py @@ -11,7 +11,7 @@ from pydantic import Field -from qibolab.serialize_ import Model, NdArray +from qibolab.serialize import Model, NdArray __all__ = [ "DcConfig", diff --git a/src/qibolab/dummy/platform.py b/src/qibolab/dummy/platform.py index 65213e4e4c..292bff1a2b 100644 --- a/src/qibolab/dummy/platform.py +++ b/src/qibolab/dummy/platform.py @@ -5,7 +5,7 @@ from qibolab.kernels import Kernels from qibolab.parameters import Parameters from qibolab.platform import Platform -from qibolab.serialize_ import replace +from qibolab.serialize import replace FOLDER = pathlib.Path(__file__).parent diff --git a/src/qibolab/execution_parameters.py b/src/qibolab/execution_parameters.py index f9117f32b5..646c806aa9 100644 --- a/src/qibolab/execution_parameters.py +++ b/src/qibolab/execution_parameters.py @@ -1,7 +1,7 @@ from enum import Enum, auto from typing import Any, Optional -from qibolab.serialize_ import Model +from qibolab.serialize import Model from qibolab.sweeper import ParallelSweepers diff --git a/src/qibolab/native.py b/src/qibolab/native.py index ec21a52a59..3b028e3678 100644 --- a/src/qibolab/native.py +++ b/src/qibolab/native.py @@ -3,7 +3,7 @@ import numpy as np from .pulses import Drag, Gaussian, Pulse, PulseSequence -from .serialize_ import Model, replace +from .serialize import Model, replace def _normalize_angles(theta, phi): diff --git a/src/qibolab/parameters.py b/src/qibolab/parameters.py index bd5b47fa4c..f7e1180af4 100644 --- a/src/qibolab/parameters.py +++ b/src/qibolab/parameters.py @@ -13,7 +13,7 @@ from qibolab.execution_parameters import ConfigUpdate, ExecutionParameters from qibolab.native import SingleQubitNatives, TwoQubitNatives from qibolab.qubits import QubitId, QubitPairId -from qibolab.serialize_ import Model, replace +from qibolab.serialize import Model, replace PARAMETERS = "parameters.json" diff --git a/src/qibolab/pulses/envelope.py b/src/qibolab/pulses/envelope.py index cda3581bec..2a1eff6203 100644 --- a/src/qibolab/pulses/envelope.py +++ b/src/qibolab/pulses/envelope.py @@ -9,7 +9,7 @@ from scipy.signal import lfilter from scipy.signal.windows import gaussian -from qibolab.serialize_ import Model, NdArray, eq +from qibolab.serialize import Model, NdArray, eq __all__ = [ "Waveform", diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index 45d7b12f25..e380f6fdaf 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -4,7 +4,7 @@ import numpy as np -from qibolab.serialize_ import Model +from qibolab.serialize import Model from .envelope import Envelope, IqWaveform, Waveform diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index 26c7bb97c4..112c039dda 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -4,7 +4,7 @@ from qibolab.components import AcquireChannel, DcChannel, IqChannel from qibolab.native import SingleQubitNatives, TwoQubitNatives -from qibolab.serialize_ import Model +from qibolab.serialize import Model QubitId = Annotated[Union[int, str], Field(union_mode="left_to_right")] """Type for qubit names.""" diff --git a/src/qibolab/serialize_.py b/src/qibolab/serialize.py similarity index 100% rename from src/qibolab/serialize_.py rename to src/qibolab/serialize.py diff --git a/tests/test_platform.py b/tests/test_platform.py index 71f331e922..1d7d1c2726 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -26,7 +26,7 @@ from qibolab.platform.load import PLATFORM, PLATFORMS from qibolab.platform.platform import dump_kernels, dump_platform from qibolab.pulses import Delay, Gaussian, Pulse, PulseSequence, Rectangular -from qibolab.serialize_ import replace +from qibolab.serialize import replace from .conftest import find_instrument diff --git a/tests/test_serialize.py b/tests/test_serialize.py index 6fcccc3ef1..8a6d4bd7ee 100644 --- a/tests/test_serialize.py +++ b/tests/test_serialize.py @@ -1,7 +1,7 @@ import numpy as np from pydantic import BaseModel, ConfigDict -from qibolab.serialize_ import NdArray, eq +from qibolab.serialize import NdArray, eq class ArrayModel(BaseModel): From dfe6a4a9b2401430634a4a5e8377d18e0ea7235f Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 13 Aug 2024 18:27:01 +0200 Subject: [PATCH 0599/1006] feat!: Serialize kernels together with parameters --- src/qibolab/components/configs.py | 10 + src/qibolab/dummy/parameters.json | 1466 +++++++++++++++-------------- src/qibolab/dummy/platform.py | 16 +- src/qibolab/kernels.py | 39 - src/qibolab/parameters.py | 21 - src/qibolab/platform/platform.py | 59 +- tests/test_platform.py | 74 +- 7 files changed, 850 insertions(+), 835 deletions(-) delete mode 100644 src/qibolab/kernels.py diff --git a/src/qibolab/components/configs.py b/src/qibolab/components/configs.py index dfd73c490f..630fc343c3 100644 --- a/src/qibolab/components/configs.py +++ b/src/qibolab/components/configs.py @@ -98,6 +98,16 @@ class AcquisitionConfig(Model): """Integration weights to be used when post-processing the acquired signal.""" + def __eq__(self, other) -> bool: + """Explicit configuration equality.""" + return ( + (self.delay == other.delay) + and (self.smearing == other.smearing) + and (self.threshold == other.threshold) + and (self.iq_angle == other.iq_angle) + and (self.kernel == other.kernel).all() + ) + Config = Annotated[ Union[DcConfig, IqMixerConfig, OscillatorConfig, IqConfig, AcquisitionConfig], diff --git a/src/qibolab/dummy/parameters.json b/src/qibolab/dummy/parameters.json index 828fd9ad9b..3ecca9b557 100644 --- a/src/qibolab/dummy/parameters.json +++ b/src/qibolab/dummy/parameters.json @@ -1,688 +1,788 @@ { - "settings": { - "nshots": 1024, - "relaxation_time": 0 - }, - "configs": { - "qubit_0/drive": { - "kind": "iq", - "frequency": 4000000000 + "settings": { + "nshots": 1024, + "relaxation_time": 0 }, - "qubit_1/drive": { - "kind": "iq", - "frequency": 4200000000 + "configs": { + "qubit_0/drive": { + "kind": "iq", + "frequency": 4000000000.0 + }, + "qubit_1/drive": { + "kind": "iq", + "frequency": 4200000000.0 + }, + "qubit_2/drive": { + "kind": "iq", + "frequency": 4500000000.0 + }, + "qubit_3/drive": { + "kind": "iq", + "frequency": 4150000000.0 + }, + "qubit_4/drive": { + "kind": "iq", + "frequency": 4155663000.0 + }, + "qubit_0/drive12": { + "kind": "iq", + "frequency": 4700000000.0 + }, + "qubit_1/drive12": { + "kind": "iq", + "frequency": 4855663000.0 + }, + "qubit_2/drive12": { + "kind": "iq", + "frequency": 2700000000.0 + }, + "qubit_3/drive12": { + "kind": "iq", + "frequency": 5855663000.0 + }, + "qubit_4/drive12": { + "kind": "iq", + "frequency": 5855663000.0 + }, + "qubit_0/flux": { + "kind": "dc", + "offset": -0.1 + }, + "qubit_1/flux": { + "kind": "dc", + "offset": 0.0 + }, + "qubit_2/flux": { + "kind": "dc", + "offset": 0.1 + }, + "qubit_3/flux": { + "kind": "dc", + "offset": 0.2 + }, + "qubit_4/flux": { + "kind": "dc", + "offset": 0.15 + }, + "qubit_0/probe": { + "kind": "iq", + "frequency": 5200000000.0 + }, + "qubit_1/probe": { + "kind": "iq", + "frequency": 4900000000.0 + }, + "qubit_2/probe": { + "kind": "iq", + "frequency": 6100000000.0 + }, + "qubit_3/probe": { + "kind": "iq", + "frequency": 5800000000.0 + }, + "qubit_4/probe": { + "kind": "iq", + "frequency": 5500000000.0 + }, + "qubit_0/acquire": { + "kind": "acquisition", + "delay": 0.0, + "smearing": 0.0, + "threshold": 0.0, + "iq_angle": 0.0, + "kernel": "k05VTVBZAQB2AHsnZGVzY3InOiAnPGY4JywgJ2ZvcnRyYW5fb3JkZXInOiBGYWxzZSwgJ3NoYXBlJzogKDEwLCksIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAp5sDfS7uHlP2DIMKNvnKc/gCqN8KV/pT94FQCYYJC3PzSbwfi/894/APwg6C61rj8MSN3blizAP2ha9unQYsM/+BFjHTxcwT+gXaJazvbpPw==" + }, + "qubit_1/acquire": { + "kind": "acquisition", + "delay": 0.0, + "smearing": 0.0, + "threshold": 0.0, + "iq_angle": 0.0, + "kernel": "k05VTVBZAQB2AHsnZGVzY3InOiAnPGY4JywgJ2ZvcnRyYW5fb3JkZXInOiBGYWxzZSwgJ3NoYXBlJzogKDEwLCksIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAr4dT6V5tHrP1w+JhHImN8/sPePZeSUuj/4yTKrD5fRP/ysonZip98/6GJMAPV9xD/LTiJo4k7oP96aWXpxduU/6fUxETe/7z9GXEBNGebWPw==" + }, + "qubit_2/acquire": { + "kind": "acquisition", + "delay": 0.0, + "smearing": 0.0, + "threshold": 0.0, + "iq_angle": 0.0, + "kernel": "k05VTVBZAQB2AHsnZGVzY3InOiAnPGY4JywgJ2ZvcnRyYW5fb3JkZXInOiBGYWxzZSwgJ3NoYXBlJzogKDEwLCksIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApUtcFdBpTsPzzwG8Xkbts/OAvkS0qo4z+OUcJpZ8HlP/jsO9cUwso/s6DVM7e/4T/NL4JYzUXvP9CibqEg98M/AENJ8QPkcD8wAOtI4pHNPw==" + }, + "qubit_3/acquire": { + "kind": "acquisition", + "delay": 0.0, + "smearing": 0.0, + "threshold": 0.0, + "iq_angle": 0.0, + "kernel": "k05VTVBZAQB2AHsnZGVzY3InOiAnPGY4JywgJ2ZvcnRyYW5fb3JkZXInOiBGYWxzZSwgJ3NoYXBlJzogKDEwLCksIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogk3D0+DqsP1ry/LSlMuM/ydJYpPk/6D8BJMdYs+zsP1CqhVqYz+o/1A3srA5z7j8CUqCE6lvqPwjNySZ1DuA/YHGvVmuFsz+XwaQKz/bqPw==" + }, + "qubit_4/acquire": { + "kind": "acquisition", + "delay": 0.0, + "smearing": 0.0, + "threshold": 0.0, + "iq_angle": 0.0, + "kernel": "k05VTVBZAQB2AHsnZGVzY3InOiAnPGY4JywgJ2ZvcnRyYW5fb3JkZXInOiBGYWxzZSwgJ3NoYXBlJzogKDEwLCksIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIArIY+/UbVjMP+yH0UH5xOU/YDXeTaxK4j/Au9mGjGjBPx1R4v/zy+Q/+OxfZT0Vzj/5ng1s2GzkP64nr91FXOk/9/ggMXmG4D+6NjR7dMHtPw==" + }, + "coupler_0/flux": { + "kind": "dc", + "offset": 0.0 + }, + "coupler_1/flux": { + "kind": "dc", + "offset": 0.0 + }, + "coupler_3/flux": { + "kind": "dc", + "offset": 0.0 + }, + "coupler_4/flux": { + "kind": "dc", + "offset": 0.0 + }, + "twpa_pump": { + "kind": "oscillator", + "frequency": 1000000000.0, + "power": 10.0 + } }, - "qubit_2/drive": { - "kind": "iq", - "frequency": 4500000000 - }, - "qubit_3/drive": { - "kind": "iq", - "frequency": 4150000000 - }, - "qubit_4/drive": { - "kind": "iq", - "frequency": 4155663000 - }, - "qubit_0/drive12": { - "kind": "iq", - "frequency": 4700000000 - }, - "qubit_1/drive12": { - "kind": "iq", - "frequency": 4855663000 - }, - "qubit_2/drive12": { - "kind": "iq", - "frequency": 2700000000 - }, - "qubit_3/drive12": { - "kind": "iq", - "frequency": 5855663000 - }, - "qubit_4/drive12": { - "kind": "iq", - "frequency": 5855663000 - }, - "qubit_0/flux": { - "kind": "dc", - "offset": -0.1 - }, - "qubit_1/flux": { - "kind": "dc", - "offset": 0.0 - }, - "qubit_2/flux": { - "kind": "dc", - "offset": 0.1 - }, - "qubit_3/flux": { - "kind": "dc", - "offset": 0.2 - }, - "qubit_4/flux": { - "kind": "dc", - "offset": 0.15 - }, - "qubit_0/probe": { - "kind": "iq", - "frequency": 5200000000 - }, - "qubit_1/probe": { - "kind": "iq", - "frequency": 4900000000 - }, - "qubit_2/probe": { - "kind": "iq", - "frequency": 6100000000 - }, - "qubit_3/probe": { - "kind": "iq", - "frequency": 5800000000 - }, - "qubit_4/probe": { - "kind": "iq", - "frequency": 5500000000 - }, - "qubit_0/acquire": { - "kind": "acquisition", - "delay": 0, - "smearing": 0, - "threshold": 0.0, - "iq_angle": 0.0 - }, - "qubit_1/acquire": { - "kind": "acquisition", - "delay": 0, - "smearing": 0, - "threshold": 0.0, - "iq_angle": 0.0 - }, - "qubit_2/acquire": { - "kind": "acquisition", - "delay": 0, - "smearing": 0, - "threshold": 0.0, - "iq_angle": 0.0 - }, - "qubit_3/acquire": { - "kind": "acquisition", - "delay": 0, - "smearing": 0, - "threshold": 0.0, - "iq_angle": 0.0 - }, - "qubit_4/acquire": { - "kind": "acquisition", - "delay": 0, - "smearing": 0, - "threshold": 0.0, - "iq_angle": 0.0 - }, - "coupler_0/flux": { - "kind": "dc", - "offset": 0.0 - }, - "coupler_1/flux": { - "kind": "dc", - "offset": 0.0 - }, - "coupler_3/flux": { - "kind": "dc", - "offset": 0.0 - }, - "coupler_4/flux": { - "kind": "dc", - "offset": 0.0 - }, - "twpa_pump": { - "kind": "oscillator", - "power": 10, - "frequency": 1000000000.0 - } - }, - "native_gates": { - "single_qubit": { - "0": { - "RX": [ - [ - "qubit_0/drive", - { - "duration": 40.0, - "amplitude": 0.1, - "envelope": { "kind": "gaussian", "rel_sigma": 5.0 } - } - ] - ], - "RX12": [ - [ - "qubit_0/drive12", - { - "duration": 40.0, - "amplitude": 0.005, - "envelope": { "kind": "gaussian", "rel_sigma": 5.0 } - } - ] - ], - "MZ": [ - [ - "qubit_0/probe", - { - "duration": 2000.0, - "amplitude": 0.1, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - } - } - ] - ] - }, - "1": { - "RX": [ - [ - "qubit_1/drive", - { - "duration": 40.0, - "amplitude": 0.3, - "envelope": { "kind": "drag", "rel_sigma": 5.0, "beta": 0.02 } - } - ] - ], - "RX12": [ - [ - "qubit_1/drive12", - { - "duration": 40.0, - "amplitude": 0.0484, - "envelope": { "kind": "drag", "rel_sigma": 5.0, "beta": 0.02 } - } - ] - ], - "MZ": [ - [ - "qubit_1/probe", - { - "duration": 2000.0, - "amplitude": 0.1, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - } - } - ] - ] - }, - "2": { - "RX": [ - [ - "qubit_2/drive", - { - "duration": 40.0, - "amplitude": 0.3, - "envelope": { "kind": "drag", "rel_sigma": 5.0, "beta": 0.02 } - } - ] - ], - "RX12": [ - [ - "qubit_2/drive12", - { - "duration": 40.0, - "amplitude": 0.005, - "envelope": { "kind": "gaussian", "rel_sigma": 5.0 } - } - ] - ], - "MZ": [ - [ - "qubit_2/probe", - { - "duration": 2000.0, - "amplitude": 0.1, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - } - } - ] - ] - }, - "3": { - "RX": [ - [ - "qubit_3/drive", - { - "duration": 40.0, - "amplitude": 0.3, - "envelope": { "kind": "drag", "rel_sigma": 5.0, "beta": 0.02 } - } - ] - ], - "RX12": [ - [ - "qubit_3/drive12", - { - "duration": 40.0, - "amplitude": 0.0484, - "envelope": { "kind": "drag", "rel_sigma": 5.0, "beta": 0.02 } - } - ] - ], - "MZ": [ - [ - "qubit_3/probe", - { - "duration": 2000.0, - "amplitude": 0.1, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - } - } - ] - ] - }, - "4": { - "RX": [ - [ - "qubit_4/drive", - { - "duration": 40.0, - "amplitude": 0.3, - "envelope": { "kind": "drag", "rel_sigma": 5.0, "beta": 0.02 } - } - ] - ], - "RX12": [ - [ - "qubit_4/drive12", - { - "duration": 40.0, - "amplitude": 0.0484, - "envelope": { "kind": "drag", "rel_sigma": 5.0, "beta": 0.02 } - } - ] - ], - "MZ": [ - [ - "qubit_4/probe", - { - "duration": 2000.0, - "amplitude": 0.1, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - } - } - ] - ] - } - }, - "coupler": { - "0": { - "CP": [ - [ - "coupler_0/flux", - { - "duration": 30.0, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - } - } - ] - ] - }, - "1": { - "CP": [ - [ - "coupler_1/flux", - { - "duration": 30.0, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - } - } - ] - ] - }, - "3": { - "CP": [ - [ - "coupler_3/flux", - { - "duration": 30.0, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - } - } - ] - ] - }, - "4": { - "CP": [ - [ - "coupler_4/flux", - { - "duration": 30.0, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - } - } - ] - ] - } - }, - "two_qubit": { - "0-2": { - "CZ": [ - [ - "qubit_2/flux", - { - "duration": 30.0, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - } - } - ], - [ - "qubit_0/drive", - { - "phase": 0.0 - } - ], - [ - "qubit_2/drive", - { - "phase": 0.0 - } - ], - [ - "coupler_0/flux", - { - "duration": 30.0, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - } - } - ] - ], - "iSWAP": [ - [ - "qubit_2/flux", - { - "duration": 30.0, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - } - } - ], - [ - "qubit_0/drive", - { - "phase": 0.0 - } - ], - [ - "qubit_2/drive", - { - "phase": 0.0 - } - ], - [ - "coupler_0/flux", - { - "duration": 30.0, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - } - } - ] - ] - }, - "1-2": { - "CZ": [ - [ - "qubit_2/flux", - { - "duration": 30.0, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - } - } - ], - [ - "qubit_1/drive", - { - "phase": 0.0 - } - ], - [ - "qubit_2/drive", - { - "phase": 0.0 - } - ], - [ - "coupler_1/flux", - { - "duration": 30.0, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - } - } - ] - ], - "iSWAP": [ - [ - "qubit_2/flux", - { - "duration": 30.0, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - } - } - ], - [ - "qubit_1/drive", - { - "phase": 0.0 - } - ], - [ - "qubit_2/drive", - { - "phase": 0.0 - } - ], - [ - "coupler_1/flux", - { - "duration": 30.0, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - } - } - ] - ] - }, - "2-3": { - "CZ": [ - [ - "qubit_2/flux", - { - "duration": 30.0, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - } - } - ], - [ - "qubit_2/drive", - { - "phase": 0.0 - } - ], - [ - "qubit_3/drive", - { - "phase": 0.0 - } - ] - ], - "iSWAP": [ - [ - "qubit_2/flux", - { - "duration": 30.0, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - } - } - ], - [ - "qubit_2/drive", - { - "phase": 0.0 - } - ], - [ - "qubit_3/drive", - { - "phase": 0.0 - } - ] - ], - "CNOT": [ - [ - "qubit_2/drive", - { - "duration": 40.0, - "amplitude": 0.3, - "envelope": { "kind": "drag", "rel_sigma": 5.0, "beta": 0.02 } - } - ] - ] - }, - "2-4": { - "CZ": [ - [ - "qubit_2/flux", - { - "duration": 30.0, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - } - } - ], - [ - "qubit_4/drive", - { - "phase": 0.0 - } - ], - [ - "coupler_4/flux", - { - "duration": 30.0, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - } - } - ] - ], - "iSWAP": [ - [ - "qubit_2/flux", - { - "duration": 30.0, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - } - } - ], - [ - "qubit_2/drive", - { - "phase": 0.0 - } - ], - [ - "qubit_4/drive", - { - "phase": 0.0 - } - ], - [ - "coupler_4/flux", - { - "duration": 30.0, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - } - } - ] - ] - } + "native_gates": { + "single_qubit": { + "0": { + "RX": [ + [ + "qubit_0/drive", + { + "duration": 40.0, + "amplitude": 0.1, + "envelope": { + "kind": "gaussian", + "rel_sigma": 5.0 + }, + "relative_phase": 0.0 + } + ] + ], + "RX12": [ + [ + "qubit_0/drive12", + { + "duration": 40.0, + "amplitude": 0.005, + "envelope": { + "kind": "gaussian", + "rel_sigma": 5.0 + }, + "relative_phase": 0.0 + } + ] + ], + "MZ": [ + [ + "qubit_0/probe", + { + "duration": 2000.0, + "amplitude": 0.1, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0 + } + ] + ], + "CP": null + }, + "1": { + "RX": [ + [ + "qubit_1/drive", + { + "duration": 40.0, + "amplitude": 0.3, + "envelope": { + "kind": "drag", + "rel_sigma": 5.0, + "beta": 0.02 + }, + "relative_phase": 0.0 + } + ] + ], + "RX12": [ + [ + "qubit_1/drive12", + { + "duration": 40.0, + "amplitude": 0.0484, + "envelope": { + "kind": "drag", + "rel_sigma": 5.0, + "beta": 0.02 + }, + "relative_phase": 0.0 + } + ] + ], + "MZ": [ + [ + "qubit_1/probe", + { + "duration": 2000.0, + "amplitude": 0.1, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0 + } + ] + ], + "CP": null + }, + "2": { + "RX": [ + [ + "qubit_2/drive", + { + "duration": 40.0, + "amplitude": 0.3, + "envelope": { + "kind": "drag", + "rel_sigma": 5.0, + "beta": 0.02 + }, + "relative_phase": 0.0 + } + ] + ], + "RX12": [ + [ + "qubit_2/drive12", + { + "duration": 40.0, + "amplitude": 0.005, + "envelope": { + "kind": "gaussian", + "rel_sigma": 5.0 + }, + "relative_phase": 0.0 + } + ] + ], + "MZ": [ + [ + "qubit_2/probe", + { + "duration": 2000.0, + "amplitude": 0.1, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0 + } + ] + ], + "CP": null + }, + "3": { + "RX": [ + [ + "qubit_3/drive", + { + "duration": 40.0, + "amplitude": 0.3, + "envelope": { + "kind": "drag", + "rel_sigma": 5.0, + "beta": 0.02 + }, + "relative_phase": 0.0 + } + ] + ], + "RX12": [ + [ + "qubit_3/drive12", + { + "duration": 40.0, + "amplitude": 0.0484, + "envelope": { + "kind": "drag", + "rel_sigma": 5.0, + "beta": 0.02 + }, + "relative_phase": 0.0 + } + ] + ], + "MZ": [ + [ + "qubit_3/probe", + { + "duration": 2000.0, + "amplitude": 0.1, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0 + } + ] + ], + "CP": null + }, + "4": { + "RX": [ + [ + "qubit_4/drive", + { + "duration": 40.0, + "amplitude": 0.3, + "envelope": { + "kind": "drag", + "rel_sigma": 5.0, + "beta": 0.02 + }, + "relative_phase": 0.0 + } + ] + ], + "RX12": [ + [ + "qubit_4/drive12", + { + "duration": 40.0, + "amplitude": 0.0484, + "envelope": { + "kind": "drag", + "rel_sigma": 5.0, + "beta": 0.02 + }, + "relative_phase": 0.0 + } + ] + ], + "MZ": [ + [ + "qubit_4/probe", + { + "duration": 2000.0, + "amplitude": 0.1, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0 + } + ] + ], + "CP": null + } + }, + "coupler": { + "0": { + "RX": null, + "RX12": null, + "MZ": null, + "CP": [ + [ + "coupler_0/flux", + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0 + } + ] + ] + }, + "1": { + "RX": null, + "RX12": null, + "MZ": null, + "CP": [ + [ + "coupler_1/flux", + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0 + } + ] + ] + }, + "3": { + "RX": null, + "RX12": null, + "MZ": null, + "CP": [ + [ + "coupler_3/flux", + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0 + } + ] + ] + }, + "4": { + "RX": null, + "RX12": null, + "MZ": null, + "CP": [ + [ + "coupler_4/flux", + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0 + } + ] + ] + } + }, + "two_qubit": { + "0-2": { + "CZ": [ + [ + "qubit_2/flux", + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0 + } + ], + [ + "qubit_0/drive", + { + "phase": 0.0 + } + ], + [ + "qubit_2/drive", + { + "phase": 0.0 + } + ], + [ + "coupler_0/flux", + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0 + } + ] + ], + "CNOT": null, + "iSWAP": [ + [ + "qubit_2/flux", + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0 + } + ], + [ + "qubit_0/drive", + { + "phase": 0.0 + } + ], + [ + "qubit_2/drive", + { + "phase": 0.0 + } + ], + [ + "coupler_0/flux", + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0 + } + ] + ] + }, + "1-2": { + "CZ": [ + [ + "qubit_2/flux", + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0 + } + ], + [ + "qubit_1/drive", + { + "phase": 0.0 + } + ], + [ + "qubit_2/drive", + { + "phase": 0.0 + } + ], + [ + "coupler_1/flux", + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0 + } + ] + ], + "CNOT": null, + "iSWAP": [ + [ + "qubit_2/flux", + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0 + } + ], + [ + "qubit_1/drive", + { + "phase": 0.0 + } + ], + [ + "qubit_2/drive", + { + "phase": 0.0 + } + ], + [ + "coupler_1/flux", + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0 + } + ] + ] + }, + "2-3": { + "CZ": [ + [ + "qubit_2/flux", + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0 + } + ], + [ + "qubit_2/drive", + { + "phase": 0.0 + } + ], + [ + "qubit_3/drive", + { + "phase": 0.0 + } + ] + ], + "CNOT": [ + [ + "qubit_2/drive", + { + "duration": 40.0, + "amplitude": 0.3, + "envelope": { + "kind": "drag", + "rel_sigma": 5.0, + "beta": 0.02 + }, + "relative_phase": 0.0 + } + ] + ], + "iSWAP": [ + [ + "qubit_2/flux", + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0 + } + ], + [ + "qubit_2/drive", + { + "phase": 0.0 + } + ], + [ + "qubit_3/drive", + { + "phase": 0.0 + } + ] + ] + }, + "2-4": { + "CZ": [ + [ + "qubit_2/flux", + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0 + } + ], + [ + "qubit_4/drive", + { + "phase": 0.0 + } + ], + [ + "coupler_4/flux", + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0 + } + ] + ], + "CNOT": null, + "iSWAP": [ + [ + "qubit_2/flux", + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0 + } + ], + [ + "qubit_2/drive", + { + "phase": 0.0 + } + ], + [ + "qubit_4/drive", + { + "phase": 0.0 + } + ], + [ + "coupler_4/flux", + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0 + } + ] + ] + } + } } - } } diff --git a/src/qibolab/dummy/platform.py b/src/qibolab/dummy/platform.py index 292bff1a2b..e61a1bfa46 100644 --- a/src/qibolab/dummy/platform.py +++ b/src/qibolab/dummy/platform.py @@ -2,10 +2,7 @@ from qibolab.components import AcquireChannel, DcChannel, IqChannel from qibolab.instruments.dummy import DummyInstrument, DummyLocalOscillator -from qibolab.kernels import Kernels -from qibolab.parameters import Parameters from qibolab.platform import Platform -from qibolab.serialize import replace FOLDER = pathlib.Path(__file__).parent @@ -17,14 +14,8 @@ def create_dummy(): twpa_pump_name = "twpa_pump" twpa_pump = DummyLocalOscillator(twpa_pump_name, "0.0.0.0") - parameters = Parameters.load(FOLDER) - kernels = Kernels.load(FOLDER) - - configs = parameters.configs - platform = Platform( - FOLDER.name, - parameters=parameters, - configs=configs, + platform = Platform.load( + path=FOLDER, instruments={instrument.name: instrument, twpa_pump.name: twpa_pump}, ) for q, qubit in platform.qubits.items(): @@ -36,9 +27,6 @@ def create_dummy(): qubit.acquisition = AcquireChannel( acquisition_name, twpa_pump=twpa_pump_name, probe=probe_name ) - configs[acquisition_name] = replace( - configs[acquisition_name], kernel=kernels.get(q) - ) drive_name = f"qubit_{q}/drive" qubit.drive = IqChannel(drive_name, mixer=None, lo=None, acquisition=None) diff --git a/src/qibolab/kernels.py b/src/qibolab/kernels.py deleted file mode 100644 index 9ee1ae60d8..0000000000 --- a/src/qibolab/kernels.py +++ /dev/null @@ -1,39 +0,0 @@ -import json -from pathlib import Path - -import numpy as np - -from qibolab.qubits import QubitId - -KERNELS = "kernels.npz" - - -class Kernels(dict[QubitId, np.ndarray]): - """A dictionary subclass for handling Qubit Kernels. - - This class extends the built-in dict class and maps QubitId to numpy - arrays. It provides methods to load and dump the kernels from and to - a file. - """ - - @classmethod - def load(cls, path: Path): - """Class method to load kernels from a file. - - The file should contain a serialized dictionary where keys are - serialized QubitId and values are numpy arrays. - """ - return cls( - {json.loads(key): value for key, value in np.load(path / KERNELS).items()} - ) - - def dump(self, path: Path): - """Instance method to dump the kernels to a file. - - The keys (QubitId) are serialized to strings and the values - (numpy arrays) are kept as is. - """ - np.savez( - path / KERNELS, - **{json.dumps(qubit_id): value for qubit_id, value in self.items()} - ) diff --git a/src/qibolab/parameters.py b/src/qibolab/parameters.py index f7e1180af4..ac2f086887 100644 --- a/src/qibolab/parameters.py +++ b/src/qibolab/parameters.py @@ -4,9 +4,6 @@ example. """ -import json -from pathlib import Path - from pydantic import Field from qibolab.components import Config @@ -15,8 +12,6 @@ from qibolab.qubits import QubitId, QubitPairId from qibolab.serialize import Model, replace -PARAMETERS = "parameters.json" - def update_configs(configs: dict[str, Config], updates: list[ConfigUpdate]): """Apply updates to configs in place. @@ -67,19 +62,3 @@ class Parameters(Model): settings: Settings = Field(default_factory=Settings) configs: dict[str, Config] = Field(default_factory=dict) native_gates: NativeGates = Field(default_factory=NativeGates) - - @classmethod - def load(cls, path: Path): - """Load parameters from JSON.""" - return cls.model_validate(json.loads((path / PARAMETERS).read_text())) - - def dump(self, path: Path): - """Platform serialization as parameters (json) and kernels (npz). - - The file saved follows the format explained in :ref:`Using parameters `. - - The requested ``path`` is the folder where the json and npz will be dumped. - """ - (path / PARAMETERS).write_text( - json.dumps(self.model_dump(), sort_keys=False, indent=4) - ) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 497c3044b4..9224dd8336 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -1,5 +1,6 @@ """A platform for executing quantum algorithms.""" +import json from collections import defaultdict from dataclasses import dataclass, field from math import prod @@ -11,7 +12,6 @@ from qibolab.components import Config from qibolab.execution_parameters import ExecutionParameters from qibolab.instruments.abstract import Controller, Instrument, InstrumentId -from qibolab.kernels import Kernels from qibolab.parameters import Parameters, Settings, update_configs from qibolab.pulses import Delay, PulseSequence from qibolab.qubits import Qubit, QubitId, QubitPair, QubitPairId @@ -23,6 +23,7 @@ InstrumentMap = dict[InstrumentId, Instrument] NS_TO_SEC = 1e-9 +PARAMETERS = "parameters.json" # TODO: replace with https://docs.python.org/3/reference/compound_stmts.html#type-params T = TypeVar("T") @@ -94,8 +95,6 @@ class Platform: """Name of the platform.""" parameters: Parameters """...""" - configs: dict[str, Config] - """Mapping name of component to its default config.""" instruments: InstrumentMap """Mapping instrument names to :class:`qibolab.instruments.abstract.Instrument` objects.""" @@ -191,7 +190,7 @@ def sampling_rate(self): @property def components(self) -> set[str]: """Names of all components available in the platform.""" - return set(self.configs.keys()) + return set(self.parameters.configs.keys()) @property def channels(self) -> list[str]: @@ -205,7 +204,7 @@ def channels_map(self) -> dict[str, QubitId]: def config(self, name: str) -> Config: """Returns configuration of given component.""" - return self.configs[name] + return self.parameters.configs[name] def connect(self): """Connect to all instruments.""" @@ -302,7 +301,7 @@ def execute( time = estimate_duration(sequences, options, sweepers) log.info(f"Minimal execution time: {time}") - configs = self.configs.copy() + configs = self.parameters.configs.copy() update_configs(configs, options.updates) # for components that represent aux external instruments (e.g. lo) to the main control instrument @@ -319,6 +318,26 @@ def execute( return results + @classmethod + def load(cls, path: Path, instruments: InstrumentMap, name: Optional[str] = None): + """Dump platform.""" + if name is None: + name = path.name + + return cls( + name=name, + parameters=Parameters.model_validate( + json.loads((path / PARAMETERS).read_text()) + ), + instruments=instruments, + ) + + def dump(self, path: Path): + """Dump platform.""" + (path / PARAMETERS).write_text( + json.dumps(self.parameters.model_dump(), sort_keys=False, indent=4) + ) + def get_qubit(self, qubit): """Return the name of the physical qubit corresponding to a logical qubit. @@ -342,31 +361,3 @@ def get_coupler(self, coupler): return self.couplers[coupler] except KeyError: return list(self.couplers.values())[coupler] - - -# TODO: kernels are part of the parameters, they should not be dumped separately -def dump_kernels(platform: Platform, path: Path): - """Creates Kernels instance from platform and dumps as npz. - - Args: - platform (qibolab.platform.Platform): The platform to be serialized. - path (pathlib.Path): Path that the kernels file will be saved. - """ - - # create kernels - kernels = Kernels() - for qubit in platform.qubits.values(): - kernel = platform.configs[qubit.acquisition.name].kernel - if kernel is not None: - kernels[qubit.name] = kernel - - # dump only if not None - if len(kernels) > 0: - kernels.dump(path) - - -# TODO: drop as soon as dump_kernels is reabsorbed in the parameters -def dump_platform(platform: Platform, path: Path): - """Dump paltform.""" - platform.parameters.dump(path) - dump_kernels(platform, path) diff --git a/tests/test_platform.py b/tests/test_platform.py index 1d7d1c2726..44965b0e67 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -19,12 +19,11 @@ from qibolab.dummy.platform import FOLDER from qibolab.execution_parameters import ExecutionParameters from qibolab.instruments.qblox.controller import QbloxController -from qibolab.kernels import Kernels from qibolab.native import SingleQubitNatives, TwoQubitNatives from qibolab.parameters import NativeGates, Parameters, update_configs from qibolab.platform import Platform, unroll_sequences from qibolab.platform.load import PLATFORM, PLATFORMS -from qibolab.platform.platform import dump_kernels, dump_platform +from qibolab.platform.platform import PARAMETERS from qibolab.pulses import Delay, Gaussian, Pulse, PulseSequence, Rectangular from qibolab.serialize import replace @@ -58,7 +57,6 @@ def test_platform_basics(): platform = Platform( name="ciao", parameters=Parameters(native_gates=NativeGates()), - configs={}, instruments={}, ) assert str(platform) == "ciao" @@ -76,7 +74,6 @@ def test_platform_basics(): ) ), instruments={}, - configs={}, ) assert str(platform2) == "come va?" assert (1, 6) in platform2.topology @@ -151,20 +148,20 @@ def test_update_configs(platform): update_configs(configs, [{"non existent": {"property": 1.0}}]) -def test_dump_parameters(platform, tmp_path): - platform.parameters.dump(tmp_path) - final = Parameters.load(tmp_path) +def test_dump_parameters(platform: Platform, tmp_path: Path): + (tmp_path / PARAMETERS).write_text(platform.parameters.model_dump_json()) + final = Parameters.model_validate_json((tmp_path / PARAMETERS).read_text()) if platform.name == "dummy": - target = Parameters.load(FOLDER) + target = Parameters.model_validate_json((FOLDER / PARAMETERS).read_text()) else: target_path = pathlib.Path(__file__).parent / "dummy_qrc" / f"{platform.name}" - target = Parameters.load(target_path) + target = Parameters.model_validate_json((target_path / PARAMETERS).read_text()) # assert configs section is dumped properly in the parameters assert final.configs == target.configs -def test_dump_parameters_with_updates(platform: Platform, tmp_path): +def test_dump_parameters_with_updates(platform: Platform, tmp_path: Path): qubit = next(iter(platform.qubits.values())) frequency = platform.config(qubit.drive.name).frequency + 1.5e9 smearing = platform.config(qubit.acquisition.name).smearing + 10 @@ -173,52 +170,41 @@ def test_dump_parameters_with_updates(platform: Platform, tmp_path): qubit.acquisition.name: {"smearing": smearing}, } update_configs(platform.parameters.configs, [update]) - platform.parameters.dump(tmp_path) - final = Parameters.load(tmp_path) + (tmp_path / PARAMETERS).write_text(platform.parameters.model_dump_json()) + final = Parameters.model_validate_json((tmp_path / PARAMETERS).read_text()) assert final.configs[qubit.drive.name].frequency == frequency assert final.configs[qubit.acquisition.name].smearing == smearing -@pytest.mark.parametrize("has_kernels", [False, True]) -def test_kernels(tmp_path, has_kernels): +def test_kernels(tmp_path: Path): """Test dumping and loading of `Kernels`.""" platform = create_dummy() - if has_kernels: - for name, config in platform.configs.items(): - if isinstance(config, AcquisitionConfig): - platform.configs[name] = replace(config, kernel=np.random.rand(10)) - - dump_kernels(platform, tmp_path) - - if has_kernels: - kernels = Kernels.load(tmp_path) - for qubit in platform.qubits.values(): - kernel = platform.configs[qubit.acquisition.name].kernel - np.testing.assert_array_equal(kernel, kernels[qubit.name]) - else: - with pytest.raises(FileNotFoundError): - Kernels.load(tmp_path) + for name, config in platform.parameters.configs.items(): + if isinstance(config, AcquisitionConfig): + platform.parameters.configs[name] = replace( + config, kernel=np.random.rand(10) + ) + + platform.dump(tmp_path) + reloaded = Platform.load(tmp_path, instruments=platform.instruments) + for qubit in platform.qubits.values(): + orig = platform.parameters.configs[qubit.acquisition.name].kernel + load = reloaded.parameters.configs[qubit.acquisition.name].kernel + np.testing.assert_array_equal(orig, load) -@pytest.mark.parametrize("has_kernels", [False, True]) -def test_dump_platform(tmp_path, has_kernels): + +def test_dump_platform(tmp_path): """Test platform dump and loading parameters and kernels.""" platform = create_dummy() - if has_kernels: - for name, config in platform.configs.items(): - if isinstance(config, AcquisitionConfig): - platform.configs[name] = replace(config, kernel=np.random.rand(10)) - - dump_platform(platform, tmp_path) - - settings = Parameters.load(tmp_path).settings - if has_kernels: - kernels = Kernels.load(tmp_path) - for qubit in platform.qubits.values(): - kernel = platform.configs[qubit.acquisition.name].kernel - np.testing.assert_array_equal(kernel, kernels[qubit.name]) + + platform.dump(tmp_path) + + settings = Parameters.model_validate_json( + (tmp_path / PARAMETERS).read_text() + ).settings assert settings == platform.settings From ccb75ff893433f7c9dfe07e8c6444b280375f7c5 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 13 Aug 2024 18:27:31 +0200 Subject: [PATCH 0600/1006] docs: Add note about explicit comparison --- src/qibolab/components/configs.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/qibolab/components/configs.py b/src/qibolab/components/configs.py index 630fc343c3..ae3bc4bd84 100644 --- a/src/qibolab/components/configs.py +++ b/src/qibolab/components/configs.py @@ -99,7 +99,13 @@ class AcquisitionConfig(Model): signal.""" def __eq__(self, other) -> bool: - """Explicit configuration equality.""" + """Explicit configuration equality. + + .. note:: + + the expliciti definition is required in order to solve the ambiguity about + the arrays equality + """ return ( (self.delay == other.delay) and (self.smearing == other.smearing) From aa203626f2a1f9acd82a9712610a96c0af113e68 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 13 Aug 2024 18:33:30 +0200 Subject: [PATCH 0601/1006] chore: Fix pyproject format --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index ea9a5cead3..92d4251a28 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -101,7 +101,7 @@ test-docs = "make -C doc doctest" [tool.pylint.master] output-format = "colorized" disable = ["E1123", "E1120", "C0301"] -generated-members = ["qibolab.native.RxyFactory, pydantic.fields.FieldInfo"] +generated-members = ["qibolab.native.RxyFactory", "pydantic.fields.FieldInfo"] [tool.pytest.ini_options] testpaths = ['tests/'] From beb5a6a2fb27dca1c3f4e99237efbfa2e98c9175 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 13 Aug 2024 18:36:22 +0200 Subject: [PATCH 0602/1006] test: Disable pylint warning It is getting confused through Pydantic, but I've not been able to locate the class to whitelist... --- src/qibolab/platform/platform.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 9224dd8336..b1d38778dd 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -204,6 +204,7 @@ def channels_map(self) -> dict[str, QubitId]: def config(self, name: str) -> Config: """Returns configuration of given component.""" + # pylint: disable=unsubscriptable-object return self.parameters.configs[name] def connect(self): From ca775135d3b34378a21fc759bd11644b8127cb3f Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 13 Aug 2024 23:10:29 +0200 Subject: [PATCH 0603/1006] feat!: Move instruments settings to components --- src/qibolab/components/configs.py | 22 ++++++++++++- src/qibolab/dummy/parameters.json | 6 ++++ src/qibolab/dummy/platform.py | 12 ------- src/qibolab/instruments/abstract.py | 11 +------ src/qibolab/instruments/dummy.py | 8 ++++- .../instruments/emulator/pulse_simulator.py | 2 +- src/qibolab/instruments/qm/controller.py | 15 ++++----- src/qibolab/platform/platform.py | 6 ++-- src/qibolab/unrolling.py | 32 ++++++++++++------- tests/test_unrolling.py | 14 ++++---- 10 files changed, 75 insertions(+), 53 deletions(-) diff --git a/src/qibolab/components/configs.py b/src/qibolab/components/configs.py index ae3bc4bd84..12e719b259 100644 --- a/src/qibolab/components/configs.py +++ b/src/qibolab/components/configs.py @@ -115,7 +115,27 @@ def __eq__(self, other) -> bool: ) +class BoundsConfig(Model): + """Instument memory limitations proxies.""" + + kind: Literal["bounds"] = "bounds" + + waveforms: int + """Waveforms estimated size.""" + readout: int + """Number of readouts.""" + instructions: int + """Instructions estimated size.""" + + Config = Annotated[ - Union[DcConfig, IqMixerConfig, OscillatorConfig, IqConfig, AcquisitionConfig], + Union[ + DcConfig, + IqMixerConfig, + OscillatorConfig, + IqConfig, + AcquisitionConfig, + BoundsConfig, + ], Field(discriminator="kind"), ] diff --git a/src/qibolab/dummy/parameters.json b/src/qibolab/dummy/parameters.json index 3ecca9b557..9c17c54350 100644 --- a/src/qibolab/dummy/parameters.json +++ b/src/qibolab/dummy/parameters.json @@ -4,6 +4,12 @@ "relaxation_time": 0 }, "configs": { + "dummy/bounds": { + "kind": "bounds", + "waveforms": 0, + "readout": 0, + "instructions": 0 + }, "qubit_0/drive": { "kind": "iq", "frequency": 4000000000.0 diff --git a/src/qibolab/dummy/platform.py b/src/qibolab/dummy/platform.py index e61a1bfa46..26a2e6e58a 100644 --- a/src/qibolab/dummy/platform.py +++ b/src/qibolab/dummy/platform.py @@ -42,15 +42,3 @@ def create_dummy(): coupler.flux = DcChannel(flux_name) return platform - - -# TODO: -# "instruments": { -# "dummy": { -# "bounds": { -# "waveforms": 0, -# "readout": 0, -# "instructions": 0 -# } -# }, -# }, diff --git a/src/qibolab/instruments/abstract.py b/src/qibolab/instruments/abstract.py index 1824f58fb2..bee8f98cac 100644 --- a/src/qibolab/instruments/abstract.py +++ b/src/qibolab/instruments/abstract.py @@ -8,7 +8,6 @@ from qibolab.execution_parameters import ExecutionParameters from qibolab.pulses.sequence import PulseSequence from qibolab.sweeper import ParallelSweepers -from qibolab.unrolling import Bounds InstrumentId = str @@ -61,17 +60,9 @@ class Controller(Instrument): def __init__(self, name, address): super().__init__(name, address) - self.bounds: Bounds = Bounds(0, 0, 0) + self.bounds: str """Estimated limitations of the device memory.""" - def setup(self, bounds): - """Set unrolling batch bounds.""" - self.bounds = Bounds(**bounds) - - def dump(self): - """Dump unrolling batch bounds.""" - return {"bounds": asdict(self.bounds)} - @property @abstractmethod def sampling_rate(self) -> int: diff --git a/src/qibolab/instruments/dummy.py b/src/qibolab/instruments/dummy.py index 30f38d8c33..5e2774b4b1 100644 --- a/src/qibolab/instruments/dummy.py +++ b/src/qibolab/instruments/dummy.py @@ -1,3 +1,5 @@ +from dataclasses import dataclass + import numpy as np from qibo.config import log @@ -12,6 +14,7 @@ from .oscillator import LocalOscillator SAMPLING_RATE = 1 +BOUNDS = Bounds(waveforms=1, readout=1, instructions=1) class DummyDevice: @@ -47,6 +50,7 @@ def create(self): return DummyDevice() +@dataclass class DummyInstrument(Controller): """Dummy instrument that returns random voltage values. @@ -60,7 +64,9 @@ class DummyInstrument(Controller): instruments. """ - BOUNDS = Bounds(1, 1, 1) + name: str + address: str + bounds: str = "dummy/bounds" @property def sampling_rate(self) -> int: diff --git a/src/qibolab/instruments/emulator/pulse_simulator.py b/src/qibolab/instruments/emulator/pulse_simulator.py index 851177557a..f985f0fb5d 100644 --- a/src/qibolab/instruments/emulator/pulse_simulator.py +++ b/src/qibolab/instruments/emulator/pulse_simulator.py @@ -93,7 +93,7 @@ def disconnect(self): pass def dump(self): - return self.settings | super().dump() + return self.settings def run_pulse_simulation( self, diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 5bafbf8153..4f63f643d8 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -30,6 +30,12 @@ __all__ = ["QmController", "Octave"] +BOUNDS = Bounds( + waveforms=int(4e4), + readout=30, + instructions=int(1e6), +) + @dataclass(frozen=True) class Octave: @@ -132,7 +138,7 @@ class QmController(Controller): used.""" channels: dict[str, QmChannel] - bounds: Bounds = Bounds(0, 0, 0) + bounds: str = "qm/bounds" """Maximum bounds used for batching in sequence unrolling.""" calibration_path: Optional[str] = None """Path to the JSON file that contains the mixer calibration.""" @@ -182,13 +188,6 @@ def __post_init__(self): self.channels = { channel.logical_channel.name: channel for channel in self.channels } - # redefine bounds because abstract instrument overwrites them - # FIXME: This overwrites the ``bounds`` given in the runcard! - self.bounds = Bounds( - waveforms=int(4e4), - readout=30, - instructions=int(1e6), - ) if self.simulation_duration is not None: # convert simulation duration from ns to clock cycles diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index b1d38778dd..4fbb27611a 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -16,7 +16,7 @@ from qibolab.pulses import Delay, PulseSequence from qibolab.qubits import Qubit, QubitId, QubitPair, QubitPairId from qibolab.sweeper import ParallelSweepers -from qibolab.unrolling import batch +from qibolab.unrolling import Bounds, batch QubitMap = dict[QubitId, Qubit] QubitPairMap = dict[QubitPairId, QubitPair] @@ -312,7 +312,9 @@ def execute( self.instruments[name].setup(**cfg.model_dump(exclude={"kind"})) results = defaultdict(list) - for b in batch(sequences, self._controller.bounds): + # pylint: disable=unsubscriptable-object + bounds = Bounds.from_config(self.parameters.configs[self._controller.bounds]) + for b in batch(sequences, bounds): result = self._execute(b, options, configs, sweepers) for serial, data in result.items(): results[serial].append(data) diff --git a/src/qibolab/unrolling.py b/src/qibolab/unrolling.py index c8eb888f80..56d33bad4e 100644 --- a/src/qibolab/unrolling.py +++ b/src/qibolab/unrolling.py @@ -3,8 +3,11 @@ May be reused by different instruments. """ -from dataclasses import asdict, dataclass, field, fields from functools import total_ordering +from typing import Annotated + +from qibolab.components.configs import BoundsConfig +from qibolab.serialize import Model from .pulses import Pulse, PulseSequence from .pulses.envelope import Rectangular @@ -35,36 +38,43 @@ def _instructions(sequence: PulseSequence): @total_ordering -@dataclass(frozen=True, eq=True) -class Bounds: +class Bounds(Model): """Instument memory limitations proxies.""" - waveforms: int = field(metadata={"count": _waveform}) + waveforms: Annotated[int, {"count": _waveform}] """Waveforms estimated size.""" - readout: int = field(metadata={"count": _readout}) + readout: Annotated[int, {"count": _readout}] """Number of readouts.""" - instructions: int = field(metadata={"count": _instructions}) + instructions: Annotated[int, {"count": _instructions}] """Instructions estimated size.""" + @classmethod + def from_config(cls, config: BoundsConfig): + d = config.model_dump() + del d["kind"] + return cls(**d) + @classmethod def update(cls, sequence: PulseSequence): up = {} - for f in fields(cls): - up[f.name] = f.metadata["count"](sequence) + for name, info in cls.model_fields.items(): + up[name] = info.metadata[0]["count"](sequence) return cls(**up) def __add__(self, other: "Bounds") -> "Bounds": """Sum bounds element by element.""" new = {} - for (k, x), (_, y) in zip(asdict(self).items(), asdict(other).items()): + for (k, x), (_, y) in zip( + self.model_dump().items(), other.model_dump().items() + ): new[k] = x + y return type(self)(**new) def __gt__(self, other: "Bounds") -> bool: """Define ordering as exceeding any bound.""" - return any(getattr(self, f.name) > getattr(other, f.name) for f in fields(self)) + return any(getattr(self, f) > getattr(other, f) for f in self.model_fields) def batch(sequences: list[PulseSequence], bounds: Bounds): @@ -73,7 +83,7 @@ def batch(sequences: list[PulseSequence], bounds: Bounds): Takes into account the various limitations throught the mechanics defined in :cls:`Bounds`, and the numerical limitations specified by the `bounds` argument. """ - counters = Bounds(0, 0, 0) + counters = Bounds(waveforms=0, readout=0, instructions=0) batch = [] for sequence in sequences: update = Bounds.update(sequence) diff --git a/tests/test_unrolling.py b/tests/test_unrolling.py index 6d16404d77..2d36f770f3 100644 --- a/tests/test_unrolling.py +++ b/tests/test_unrolling.py @@ -44,8 +44,8 @@ def test_bounds_update(): def test_bounds_add(): - bounds1 = Bounds(2, 1, 3) - bounds2 = Bounds(1, 2, 1) + bounds1 = Bounds(waveforms=2, readout=1, instructions=3) + bounds2 = Bounds(waveforms=1, readout=2, instructions=1) bounds_sum = bounds1 + bounds2 @@ -55,8 +55,8 @@ def test_bounds_add(): def test_bounds_comparison(): - bounds1 = Bounds(2, 1, 3) - bounds2 = Bounds(1, 2, 1) + bounds1 = Bounds(waveforms=2, readout=1, instructions=3) + bounds2 = Bounds(waveforms=1, readout=2, instructions=1) assert bounds1 > bounds2 assert not bounds2 < bounds1 @@ -65,9 +65,9 @@ def test_bounds_comparison(): @pytest.mark.parametrize( "bounds", [ - Bounds(150, int(10e6), int(10e6)), - Bounds(int(10e6), 10, int(10e6)), - Bounds(int(10e6), int(10e6), 20), + Bounds(waveforms=150, readout=int(10e6), instructions=int(10e6)), + Bounds(waveforms=int(10e6), readout=10, instructions=int(10e6)), + Bounds(waveforms=int(10e6), readout=int(10e6), instructions=20), ], ) def test_batch(bounds): From 20fe920249ea3a1bda6e0ff2aa21ded9aee95530 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 14 Aug 2024 00:12:23 +0200 Subject: [PATCH 0604/1006] fix: Drop useless return schema Saving also a lot of warnings --- src/qibolab/pulses/sequence.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibolab/pulses/sequence.py b/src/qibolab/pulses/sequence.py index b434b2a887..27122f13df 100644 --- a/src/qibolab/pulses/sequence.py +++ b/src/qibolab/pulses/sequence.py @@ -35,7 +35,7 @@ def __get_pydantic_core_schema__( cls._validate, schema, serialization=core_schema.plain_serializer_function_ser_schema( - cls._serialize, info_arg=False, return_schema=schema + cls._serialize, info_arg=False ), ) From 0ba2bf9a959e010a4397bdc6eaf0a12913eff1aa Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 14 Aug 2024 00:12:52 +0200 Subject: [PATCH 0605/1006] docs: Extend docs, alias type --- src/qibolab/parameters.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/qibolab/parameters.py b/src/qibolab/parameters.py index ac2f086887..e7bc71c4b3 100644 --- a/src/qibolab/parameters.py +++ b/src/qibolab/parameters.py @@ -51,14 +51,22 @@ def fill(self, options: ExecutionParameters): class NativeGates(Model): + """Native gates parameters. + + This is a container for the parameters of the whole platform. + """ + single_qubit: dict[QubitId, SingleQubitNatives] = Field(default_factory=dict) coupler: dict[QubitId, SingleQubitNatives] = Field(default_factory=dict) two_qubit: dict[QubitPairId, TwoQubitNatives] = Field(default_factory=dict) +ComponentId = str + + class Parameters(Model): """Serializable parameters.""" settings: Settings = Field(default_factory=Settings) - configs: dict[str, Config] = Field(default_factory=dict) + configs: dict[ComponentId, Config] = Field(default_factory=dict) native_gates: NativeGates = Field(default_factory=NativeGates) From cbba54a65f8c95ef9759dceccf43a03c04c2e8b6 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 14 Aug 2024 01:37:26 +0200 Subject: [PATCH 0606/1006] docs: Replace workaround with a less intrusive one --- doc/source/conf.py | 5 +++++ doc/source/getting-started/experiment.rst | 3 +-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/doc/source/conf.py b/doc/source/conf.py index a874daf96a..45478d986b 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -18,6 +18,11 @@ import qibolab +# TODO: the following is a workaround for Sphinx doctest, cf. +# - https://github.com/qiboteam/qibolab/commit/e04a6ab +# - https://github.com/pydantic/pydantic/discussions/7763 +import qibolab.instruments.zhinst + # -- Project information ----------------------------------------------------- project = "qibolab" diff --git a/doc/source/getting-started/experiment.rst b/doc/source/getting-started/experiment.rst index b3152f77db..5e80369be7 100644 --- a/doc/source/getting-started/experiment.rst +++ b/doc/source/getting-started/experiment.rst @@ -38,8 +38,7 @@ In this example, the qubit is controlled by a Zurich Instruments' SHFQC instrume OscillatorConfig, ) - # TODO: understand error generate by doctest - # from qibolab.instruments.zhinst import ZiChannel, Zurich + from qibolab.instruments.zhinst import ZiChannel, Zurich from qibolab.parameters import Parameters from qibolab.platform import Platform From 6128c374e5531a7d86a0fb58c04bb5fafa2da7e5 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 14 Aug 2024 01:45:35 +0200 Subject: [PATCH 0607/1006] fix: Remove discontinued kernels file --- src/qibolab/dummy/kernels.npz | Bin 22 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/qibolab/dummy/kernels.npz diff --git a/src/qibolab/dummy/kernels.npz b/src/qibolab/dummy/kernels.npz deleted file mode 100644 index 15cb0ecb3e219d1701294bfdf0fe3f5cb5d208e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22 NcmWIWW@Tf*000g10H*)| From d90b1b49b795df2fda6421579e9050f6f0396921 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 14 Aug 2024 01:56:59 +0200 Subject: [PATCH 0608/1006] feat: Allow instruments to report their names to the platform --- src/qibolab/dummy/platform.py | 12 +++++------- src/qibolab/platform/platform.py | 12 ++++++++++-- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/qibolab/dummy/platform.py b/src/qibolab/dummy/platform.py index 26a2e6e58a..c524301116 100644 --- a/src/qibolab/dummy/platform.py +++ b/src/qibolab/dummy/platform.py @@ -9,15 +9,13 @@ def create_dummy(): """Create a dummy platform using the dummy instrument.""" + # register the instruments instrument = DummyInstrument("dummy", "0.0.0.0") + twpa_pump = DummyLocalOscillator("twpa_pump", "0.0.0.0") - twpa_pump_name = "twpa_pump" - twpa_pump = DummyLocalOscillator(twpa_pump_name, "0.0.0.0") + platform = Platform.load(path=FOLDER, instruments=[instrument, twpa_pump]) - platform = Platform.load( - path=FOLDER, - instruments={instrument.name: instrument, twpa_pump.name: twpa_pump}, - ) + # attach the channels for q, qubit in platform.qubits.items(): acquisition_name = f"qubit_{q}/acquire" probe_name = f"qubit_{q}/probe" @@ -25,7 +23,7 @@ def create_dummy(): probe_name, mixer=None, lo=None, acquisition=acquisition_name ) qubit.acquisition = AcquireChannel( - acquisition_name, twpa_pump=twpa_pump_name, probe=probe_name + acquisition_name, twpa_pump=twpa_pump.name, probe=probe_name ) drive_name = f"qubit_{q}/drive" diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 4fbb27611a..d6343a56b3 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -2,10 +2,11 @@ import json from collections import defaultdict +from collections.abc import Iterable from dataclasses import dataclass, field from math import prod from pathlib import Path -from typing import Any, Literal, Optional, TypeVar +from typing import Any, Literal, Optional, TypeVar, Union from qibo.config import log, raise_error @@ -322,10 +323,17 @@ def execute( return results @classmethod - def load(cls, path: Path, instruments: InstrumentMap, name: Optional[str] = None): + def load( + cls, + path: Path, + instruments: Union[InstrumentMap, Iterable[Instrument]], + name: Optional[str] = None, + ): """Dump platform.""" if name is None: name = path.name + if not isinstance(instruments, dict): + instruments = {i.name: i for i in instruments} return cls( name=name, From da8ba2cf32f76432a7da7b0081703336618548ce Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 14 Aug 2024 01:58:00 +0200 Subject: [PATCH 0609/1006] fix: Tiny dummy platform simplification --- src/qibolab/dummy/platform.py | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/qibolab/dummy/platform.py b/src/qibolab/dummy/platform.py index c524301116..5507fc5d3b 100644 --- a/src/qibolab/dummy/platform.py +++ b/src/qibolab/dummy/platform.py @@ -26,17 +26,11 @@ def create_dummy(): acquisition_name, twpa_pump=twpa_pump.name, probe=probe_name ) - drive_name = f"qubit_{q}/drive" - qubit.drive = IqChannel(drive_name, mixer=None, lo=None, acquisition=None) - - drive_12_name = f"qubit_{q}/drive12" - qubit.drive12 = IqChannel(drive_12_name, mixer=None, lo=None, acquisition=None) - - flux_name = f"qubit_{q}/flux" - qubit.flux = DcChannel(flux_name) + qubit.drive = IqChannel(f"qubit_{q}/drive", mixer=None, lo=None) + qubit.drive12 = IqChannel(f"qubit_{q}/drive12", mixer=None, lo=None) + qubit.flux = DcChannel(f"qubit_{q}/flux") for c, coupler in platform.couplers.items(): - flux_name = f"coupler_{c}/flux" - coupler.flux = DcChannel(flux_name) + coupler.flux = DcChannel(f"coupler_{c}/flux") return platform From 83a667957ae773ab7ea70f896714b1ccb566967f Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 16 Aug 2024 16:55:04 +0200 Subject: [PATCH 0610/1006] build: Fix rebase leftover --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 92d4251a28..f5785ef5af 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -87,6 +87,7 @@ qm = ["qm-qua", "qualang-tools"] zh = ["laboneq"] rfsoc = ["qibosoq"] los = ["qcodes", "qcodes_contrib_drivers", "pyvisa-py"] +twpa = ["qcodes", "qcodes_contrib_drivers", "pyvisa-py"] emulator = ["qutip"] From 4b5b7d7d256608a4299a136a6cac90493a690268 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 16 Aug 2024 17:02:31 +0200 Subject: [PATCH 0611/1006] chore: Poetry lock --- poetry.lock | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index 31ed3766a9..df6c1e5e05 100644 --- a/poetry.lock +++ b/poetry.lock @@ -5894,9 +5894,10 @@ los = ["pyvisa-py", "qcodes", "qcodes_contrib_drivers"] qblox = ["pyvisa-py", "qblox-instruments", "qcodes", "qcodes_contrib_drivers"] qm = ["qm-qua", "qualang-tools"] rfsoc = ["qibosoq"] +twpa = ["pyvisa-py", "qcodes", "qcodes_contrib_drivers"] zh = ["laboneq"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.12" -content-hash = "30a7e1b0b8caa372b4076bce71583a537c7ad92555c5249a883c96b799f9cc5f" +content-hash = "a5bf84cc1a4fa49d87dd8a53e5bc48949e4f1bef7c09fd73aca1f26aed3906cd" From cfaf95f6cc6e6f19bcac32825631a43497c88db8 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 14 Aug 2024 18:29:01 +0200 Subject: [PATCH 0612/1006] fix: Restore previous objects, cut the natives out And fully deprecate the qubit pair object --- src/qibolab/platform/platform.py | 62 ++++++-------------------------- src/qibolab/qubits.py | 27 -------------- 2 files changed, 10 insertions(+), 79 deletions(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index d6343a56b3..20b4fe3e2e 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -15,12 +15,12 @@ from qibolab.instruments.abstract import Controller, Instrument, InstrumentId from qibolab.parameters import Parameters, Settings, update_configs from qibolab.pulses import Delay, PulseSequence -from qibolab.qubits import Qubit, QubitId, QubitPair, QubitPairId +from qibolab.qubits import Qubit, QubitId, QubitPairId from qibolab.sweeper import ParallelSweepers from qibolab.unrolling import Bounds, batch QubitMap = dict[QubitId, Qubit] -QubitPairMap = dict[QubitPairId, QubitPair] +QubitPairMap = list[QubitPairId] InstrumentMap = dict[InstrumentId, Instrument] NS_TO_SEC = 1e-9 @@ -103,9 +103,9 @@ class Platform: """Type of resonator (2D or 3D) in the used QPU.""" is_connected: bool = False """Flag for whether we are connected to the physical instruments.""" - _qubits: QubitMap = field(default_factory=dict) - _couplers: QubitMap = field(default_factory=dict) - _pairs: QubitPairMap = field(default_factory=dict) + qubits: QubitMap = field(default_factory=dict) + couplers: QubitMap = field(default_factory=dict) + pairs: list[QubitPairId] = field(default_factory=list) def __post_init__(self): log.info("Loading platform %s", self.name) @@ -115,51 +115,6 @@ def __post_init__(self): def __str__(self): return self.name - @property - def qubits(self) -> QubitMap: - """Mapping qubit names to :class:`qibolab.qubits.Qubit` objects.""" - if len(self._qubits) == 0: - for q, natives in self.parameters.native_gates.single_qubit.items(): - self._qubits[q] = Qubit(name=q, native_gates=natives) - - for q, natives in self.parameters.native_gates.single_qubit.items(): - self._qubits[q].native_gates = natives - - return self._qubits - - @property - def couplers(self) -> QubitMap: - """Mapping coupler names to :class:`qibolab.qubits.Qubit` objects.""" - if len(self._couplers) == 0: - for c, natives in self.parameters.native_gates.coupler.items(): - self._couplers[c] = Qubit(name=c, native_gates=natives) - - for c, natives in self.parameters.native_gates.coupler.items(): - self._couplers[c].native_gates = natives - - return self._couplers - - @property - def pairs(self) -> QubitPairMap: - """Mapping tuples of qubit names to :class:`qibolab.qubits.QubitPair` - objects.""" - if len(self._pairs) == 0: - for p, natives in self.parameters.native_gates.two_qubit.items(): - self._pairs[p] = QubitPair( - qubit1=p[0], qubit2=p[1], native_gates=natives - ) - if natives.symmetric: - self._pairs[(p[1], p[0])] = QubitPair( - qubit1=p[0], qubit2=p[1], native_gates=natives - ) - - for p, natives in self.parameters.native_gates.two_qubit.items(): - self._pairs[p].native_gates = natives - if natives.symmetric: - self._pairs[(p[1], p[0])].native_gates = natives - - return self._pairs - @property def settings(self) -> Settings: """Container with default execution settings.""" @@ -177,8 +132,11 @@ def ordered_pairs(self): @property def topology(self) -> list[QubitPairId]: - """Graph representing the qubit connectivity in the quantum chip.""" - return list(self.pairs) + """Graph representing the qubit connectivity in the quantum chip. + + Synonym of :attr:`pairs`. + """ + return self.pairs @property def sampling_rate(self): diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index 112c039dda..c604ecf1b6 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -3,7 +3,6 @@ from pydantic import BeforeValidator, ConfigDict, Field, PlainSerializer from qibolab.components import AcquireChannel, DcChannel, IqChannel -from qibolab.native import SingleQubitNatives, TwoQubitNatives from qibolab.serialize import Model QubitId = Annotated[Union[int, str], Field(union_mode="left_to_right")] @@ -36,8 +35,6 @@ class Qubit(Model): name: QubitId - native_gates: SingleQubitNatives = Field(default_factory=SingleQubitNatives) - probe: Optional[IqChannel] = None acquisition: Optional[AcquireChannel] = None drive: Optional[IqChannel] = None @@ -75,27 +72,3 @@ def mixer_frequencies(self): PlainSerializer(lambda p: f"{p[0]}-{p[1]}"), ] """Type for holding ``QubitPair``s in the ``platform.pairs`` dictionary.""" - - -class QubitPair(Model): - """Data structure for holding the native two-qubit gates acting on a pair - of qubits. - - This is needed for symmetry to the single-qubit gates which are storred in the - :class:`qibolab.platforms.abstract.Qubit`. - """ - - model_config = ConfigDict(frozen=False) - - qubit1: QubitId - """First qubit of the pair. - - Acts as control on two-qubit gates. - """ - qubit2: QubitId - """Second qubit of the pair. - - Acts as target on two-qubit gates. - """ - - native_gates: TwoQubitNatives = Field(default_factory=TwoQubitNatives) From 9ea9319611d63794c3977eb974f13d20a3298fea Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 14 Aug 2024 18:32:30 +0200 Subject: [PATCH 0613/1006] docs: Describe the role of the restored attributes --- src/qibolab/platform/platform.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 20b4fe3e2e..890d6e253a 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -104,8 +104,19 @@ class Platform: is_connected: bool = False """Flag for whether we are connected to the physical instruments.""" qubits: QubitMap = field(default_factory=dict) + """Qubit controllers. + + The mapped objects hold the :class:`qubit.components.channels.Channel` instances + required to send pulses addressing the desired qubits. + """ couplers: QubitMap = field(default_factory=dict) + """Coupler controllers. + + Fully analogue to :attr:`qubits`. Only the flux channel is expected to be populated + in the mapped objects. + """ pairs: list[QubitPairId] = field(default_factory=list) + """Available pairs in thee platform.""" def __post_init__(self): log.info("Loading platform %s", self.name) From 0026a20594188473e15fa0155a5c31b96dc2e44a Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 14 Aug 2024 19:22:44 +0200 Subject: [PATCH 0614/1006] fix: Rely on natives for compilation --- src/qibolab/compilers/compiler.py | 56 ++++++++++++++++++------------- src/qibolab/compilers/default.py | 37 ++++++++++---------- 2 files changed, 52 insertions(+), 41 deletions(-) diff --git a/src/qibolab/compilers/compiler.py b/src/qibolab/compilers/compiler.py index 06bbba2636..c8cd523fed 100644 --- a/src/qibolab/compilers/compiler.py +++ b/src/qibolab/compilers/compiler.py @@ -1,8 +1,8 @@ from collections import defaultdict +from collections.abc import Callable from dataclasses import dataclass, field from qibo import Circuit, gates -from qibo.config import raise_error from qibolab.compilers.default import ( align_rule, @@ -41,7 +41,7 @@ class Compiler: See :class:`qibolab.compilers.default` for an example of a compiler implementation. """ - rules: dict = field(default_factory=dict) + rules: dict[type[gates.Gate], Callable] = field(default_factory=dict) """Map from gates to compilation rules.""" @classmethod @@ -60,29 +60,26 @@ def default(cls): } ) - def __setitem__(self, key, rule): - """Sets a new rule to the compiler. + def __setitem__(self, key: type[gates.Gate], rule: Callable): + """Set a new rule to the compiler. If a rule already exists for the gate, it will be overwritten. """ self.rules[key] = rule - def __getitem__(self, item): + def __getitem__(self, item: type[gates.Gate]) -> Callable: """Get an existing rule for a given gate.""" try: return self.rules[item] except KeyError: - raise_error(KeyError, f"Compiler rule not available for {item}.") + raise KeyError(f"Compiler rule not available for {item}.") - def __delitem__(self, item): + def __delitem__(self, item: type[gates.Gate]): """Remove rule for the given gate.""" try: del self.rules[item] except KeyError: - raise_error( - KeyError, - f"Cannot remove {item} from compiler because it does not exist.", - ) + KeyError(f"Cannot remove {item} from compiler because it does not exist.") def register(self, gate_cls): """Decorator for registering a function as a rule in the compiler. @@ -100,7 +97,7 @@ def inner(func): return inner - def get_sequence(self, gate, platform): + def get_sequence(self, gate: gates.Gate, platform: Platform): """Get pulse sequence implementing the given gate using the registered rules. @@ -110,20 +107,31 @@ def get_sequence(self, gate, platform): """ # get local sequence for the current gate rule = self[type(gate)] - if isinstance(gate, (gates.M, gates.Align)): + + natives = platform.parameters.native_gates + + if isinstance(gate, (gates.M)): + qubits = [natives.single_qubit[q] for q in gate.qubits] + return rule(gate, qubits) + + if isinstance(gate, (gates.Align)): qubits = [platform.get_qubit(q) for q in gate.qubits] - gate_sequence = rule(gate, qubits) - elif len(gate.qubits) == 1: + return rule(gate, qubits) + + if isinstance(gate, (gates.Z, gates.RZ)): qubit = platform.get_qubit(gate.target_qubits[0]) - gate_sequence = rule(gate, qubit) - elif len(gate.qubits) == 2: - pair = platform.pairs[ - tuple(platform.get_qubit(q).name for q in gate.qubits) - ] - gate_sequence = rule(gate, pair) - else: - raise NotImplementedError(f"{type(gate)} is not a native gate.") - return gate_sequence + return rule(gate, qubit) + + if len(gate.qubits) == 1: + qubit = gate.target_qubits[0] + return rule(gate, natives.single_qubit[qubit]) + + if len(gate.qubits) == 2: + pair = tuple(platform.get_qubit(q).name for q in gate.qubits) + assert len(pair) == 2 + return rule(gate, natives.two_qubit[pair]) + + raise NotImplementedError(f"{type(gate)} is not a native gate.") # FIXME: pulse.qubit and pulse.channel do not exist anymore def compile( diff --git a/src/qibolab/compilers/default.py b/src/qibolab/compilers/default.py index de1fb8f1c1..91426812d6 100644 --- a/src/qibolab/compilers/default.py +++ b/src/qibolab/compilers/default.py @@ -8,13 +8,9 @@ import numpy as np from qibo.gates import Align, Gate +from qibolab.native import SingleQubitNatives, TwoQubitNatives from qibolab.pulses import Delay, PulseSequence, VirtualZ -from qibolab.qubits import Qubit, QubitPair - - -def identity_rule(gate: Gate, qubit: Qubit) -> PulseSequence: - """Identity gate skipped.""" - return PulseSequence() +from qibolab.qubits import Qubit def z_rule(gate: Gate, qubit: Qubit) -> PulseSequence: @@ -27,11 +23,15 @@ def rz_rule(gate: Gate, qubit: Qubit) -> PulseSequence: return PulseSequence([(qubit.drive.name, VirtualZ(phase=gate.parameters[0]))]) -def gpi2_rule(gate: Gate, qubit: Qubit) -> PulseSequence: +def identity_rule(gate: Gate, qubit: SingleQubitNatives) -> PulseSequence: + """Identity gate skipped.""" + return PulseSequence() + + +def gpi2_rule(gate: Gate, qubit: SingleQubitNatives) -> PulseSequence: """Rule for GPI2.""" - return qubit.native_gates.RX.create_sequence( - theta=np.pi / 2, phi=gate.parameters[0] - ) + assert qubit.RX is not None + return qubit.RX.create_sequence(theta=np.pi / 2, phi=gate.parameters[0]) def gpi_rule(gate: Gate, qubit: Qubit) -> PulseSequence: @@ -40,28 +40,31 @@ def gpi_rule(gate: Gate, qubit: Qubit) -> PulseSequence: # to the matrix representation. See # https://github.com/qiboteam/qibolab/pull/804#pullrequestreview-1890205509 # for more detail. - return qubit.native_gates.RX.create_sequence(theta=np.pi, phi=gate.parameters[0]) + return qubit.RX.create_sequence(theta=np.pi, phi=gate.parameters[0]) -def cz_rule(gate: Gate, pair: QubitPair) -> PulseSequence: +def cz_rule(gate: Gate, pair: TwoQubitNatives) -> PulseSequence: """CZ applied as defined in the platform runcard. Applying the CZ gate may involve sending pulses on qubits that the gate is not directly acting on. """ - return pair.native_gates.CZ.create_sequence() + assert pair.CZ is not None + return pair.CZ.create_sequence() -def cnot_rule(gate: Gate, pair: QubitPair) -> PulseSequence: +def cnot_rule(gate: Gate, pair: TwoQubitNatives) -> PulseSequence: """CNOT applied as defined in the platform runcard.""" - return pair.native_gates.CNOT.create_sequence() + assert pair.CNOT is not None + return pair.CNOT.create_sequence() -def measurement_rule(gate: Gate, qubits: list[Qubit]) -> PulseSequence: +def measurement_rule(gate: Gate, qubits: list[SingleQubitNatives]) -> PulseSequence: """Measurement gate applied using the platform readout pulse.""" seq = PulseSequence() for qubit in qubits: - seq.concatenate(qubit.native_gates.MZ.create_sequence()) + assert qubit.MZ is not None + seq.concatenate(qubit.MZ.create_sequence()) return seq From 044545304025fb8ffc213b2908bfa6e119daeefe Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 14 Aug 2024 19:25:06 +0200 Subject: [PATCH 0615/1006] fix: Fully rely on natives for pairs --- src/qibolab/platform/platform.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 890d6e253a..c9379ba414 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -115,8 +115,6 @@ class Platform: Fully analogue to :attr:`qubits`. Only the flux channel is expected to be populated in the mapped objects. """ - pairs: list[QubitPairId] = field(default_factory=list) - """Available pairs in thee platform.""" def __post_init__(self): log.info("Loading platform %s", self.name) @@ -136,6 +134,11 @@ def nqubits(self) -> int: """Total number of usable qubits in the QPU.""" return len(self.qubits) + @property + def pairs(self) -> list[QubitPairId]: + """Available pairs in thee platform.""" + return list(self.parameters.native_gates.two_qubit) + @property def ordered_pairs(self): """List of qubit pairs that are connected in the QPU.""" @@ -318,7 +321,7 @@ def dump(self, path: Path): json.dumps(self.parameters.model_dump(), sort_keys=False, indent=4) ) - def get_qubit(self, qubit): + def get_qubit(self, qubit: QubitId) -> Qubit: """Return the name of the physical qubit corresponding to a logical qubit. @@ -330,7 +333,7 @@ def get_qubit(self, qubit): except KeyError: return list(self.qubits.values())[qubit] - def get_coupler(self, coupler): + def get_coupler(self, coupler: QubitId) -> Qubit: """Return the name of the physical coupler corresponding to a logical coupler. From ea41a400683d44b985f4c820d0f2c4c11592217e Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 14 Aug 2024 19:42:57 +0200 Subject: [PATCH 0616/1006] feat!: Upgrade load, to decouple effictively decouple channels creation --- src/qibolab/dummy/platform.py | 39 ++++++++++++++++---------------- src/qibolab/platform/platform.py | 8 ++++++- 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/src/qibolab/dummy/platform.py b/src/qibolab/dummy/platform.py index 5507fc5d3b..be47fe2aaa 100644 --- a/src/qibolab/dummy/platform.py +++ b/src/qibolab/dummy/platform.py @@ -3,34 +3,35 @@ from qibolab.components import AcquireChannel, DcChannel, IqChannel from qibolab.instruments.dummy import DummyInstrument, DummyLocalOscillator from qibolab.platform import Platform +from qibolab.qubits import Qubit FOLDER = pathlib.Path(__file__).parent -def create_dummy(): +def create_dummy() -> Platform: """Create a dummy platform using the dummy instrument.""" # register the instruments instrument = DummyInstrument("dummy", "0.0.0.0") - twpa_pump = DummyLocalOscillator("twpa_pump", "0.0.0.0") - - platform = Platform.load(path=FOLDER, instruments=[instrument, twpa_pump]) + pump = DummyLocalOscillator("twpa_pump", "0.0.0.0") + qubits = {} # attach the channels - for q, qubit in platform.qubits.items(): - acquisition_name = f"qubit_{q}/acquire" - probe_name = f"qubit_{q}/probe" - qubit.probe = IqChannel( - probe_name, mixer=None, lo=None, acquisition=acquisition_name - ) - qubit.acquisition = AcquireChannel( - acquisition_name, twpa_pump=twpa_pump.name, probe=probe_name + for q in range(5): + acquisition = f"qubit_{q}/acquire" + probe = f"qubit_{q}/probe" + qubits[q] = Qubit( + name=q, + probe=IqChannel(probe, mixer=None, lo=None, acquisition=acquisition), + acquisition=AcquireChannel(acquisition, twpa_pump=pump.name, probe=probe), + drive=IqChannel(f"qubit_{q}/drive", mixer=None, lo=None), + drive12=IqChannel(f"qubit_{q}/drive12", mixer=None, lo=None), + flux=DcChannel(f"qubit_{q}/flux"), ) - qubit.drive = IqChannel(f"qubit_{q}/drive", mixer=None, lo=None) - qubit.drive12 = IqChannel(f"qubit_{q}/drive12", mixer=None, lo=None) - qubit.flux = DcChannel(f"qubit_{q}/flux") - - for c, coupler in platform.couplers.items(): - coupler.flux = DcChannel(f"coupler_{c}/flux") + couplers = {} + for c in (0, 1, 3, 4): + couplers[c] = Qubit(name=c, flux=DcChannel(f"coupler_{c}/flux")) - return platform + return Platform.load( + path=FOLDER, instruments=[instrument, pump], qubits=qubits, couplers=couplers + ) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index c9379ba414..3b69c3ccb7 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -299,13 +299,17 @@ def load( cls, path: Path, instruments: Union[InstrumentMap, Iterable[Instrument]], + qubits: QubitMap, + couplers: Optional[QubitMap] = None, name: Optional[str] = None, - ): + ) -> "Platform": """Dump platform.""" if name is None: name = path.name if not isinstance(instruments, dict): instruments = {i.name: i for i in instruments} + if couplers is None: + couplers = {} return cls( name=name, @@ -313,6 +317,8 @@ def load( json.loads((path / PARAMETERS).read_text()) ), instruments=instruments, + qubits=qubits, + couplers=couplers, ) def dump(self, path: Path): From d8ec24614f32d7c1c4a8dbcf191b2c1aa841f2d9 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 14 Aug 2024 19:57:40 +0200 Subject: [PATCH 0617/1006] test: Fix dummy tests --- tests/test_dummy.py | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/tests/test_dummy.py b/tests/test_dummy.py index 1a3b5265cc..10266a656b 100644 --- a/tests/test_dummy.py +++ b/tests/test_dummy.py @@ -24,11 +24,12 @@ def test_dummy_initialization(platform: Platform): ) def test_dummy_execute_pulse_sequence(platform: Platform, acquisition): nshots = 100 - probe_seq = platform.qubits[0].native_gates.MZ.create_sequence() + natives = platform.parameters.native_gates.single_qubit[0] + probe_seq = natives.MZ.create_sequence() probe_pulse = probe_seq[0][1] sequence = PulseSequence() sequence.concatenate(probe_seq) - sequence.concatenate(platform.qubits[0].native_gates.RX12.create_sequence()) + sequence.concatenate(natives.RX12.create_sequence()) options = ExecutionParameters(nshots=100, acquisition_type=acquisition) result = platform.execute([sequence], options) if acquisition is AcquisitionType.INTEGRATION: @@ -56,20 +57,22 @@ def test_dummy_execute_pulse_sequence_couplers(): platform = create_platform("dummy") sequence = PulseSequence() - cz = platform.pairs[(1, 2)].native_gates.CZ.create_sequence() + natives = platform.parameters.native_gates + cz = natives.two_qubit[(1, 2)].CZ.create_sequence() sequence.concatenate(cz) sequence.append((platform.qubits[0].probe.name, Delay(duration=40))) sequence.append((platform.qubits[2].probe.name, Delay(duration=40))) - sequence.concatenate(platform.qubits[0].native_gates.MZ.create_sequence()) - sequence.concatenate(platform.qubits[2].native_gates.MZ.create_sequence()) + sequence.concatenate(natives.single_qubit[0].MZ.create_sequence()) + sequence.concatenate(natives.single_qubit[2].MZ.create_sequence()) options = ExecutionParameters(nshots=None) _ = platform.execute([sequence], options) def test_dummy_execute_pulse_sequence_fast_reset(platform: Platform): + natives = platform.parameters.native_gates sequence = PulseSequence() - sequence.concatenate(platform.qubits[0].native_gates.MZ.create_sequence()) + sequence.concatenate(natives.single_qubit[0].MZ.create_sequence()) options = ExecutionParameters(nshots=None, fast_reset=True) _ = platform.execute([sequence], options) @@ -84,9 +87,10 @@ def test_dummy_execute_pulse_sequence_unrolling( nshots = 100 nsequences = 10 platform.instruments["dummy"].UNROLLING_BATCH_SIZE = batch_size + natives = platform.parameters.native_gates sequences = [] sequence = PulseSequence() - sequence.concatenate(platform.qubits[0].native_gates.MZ.create_sequence()) + sequence.concatenate(natives.single_qubit[0].MZ.create_sequence()) for _ in range(nsequences): sequences.append(sequence) options = ExecutionParameters(nshots=nshots, acquisition_type=acquisition) @@ -101,7 +105,8 @@ def test_dummy_execute_pulse_sequence_unrolling( def test_dummy_single_sweep_raw(platform: Platform): sequence = PulseSequence() - probe_seq = platform.qubits[0].native_gates.MZ.create_sequence() + natives = platform.parameters.native_gates + probe_seq = natives.single_qubit[0].MZ.create_sequence() pulse = probe_seq[0][1] parameter_range = np.random.randint(SWEPT_POINTS, size=SWEPT_POINTS) @@ -136,7 +141,8 @@ def test_dummy_single_sweep_coupler( ): platform = create_platform("dummy") sequence = PulseSequence() - probe_seq = platform.qubits[0].native_gates.MZ.create_sequence() + natives = platform.parameters.native_gates + probe_seq = natives.single_qubit[0].MZ.create_sequence() probe_pulse = probe_seq[0][1] coupler_pulse = Pulse.flux( duration=40, @@ -196,7 +202,8 @@ def test_dummy_single_sweep( platform: Platform, fast_reset, parameter, average, acquisition, nshots ): sequence = PulseSequence() - probe_seq = platform.qubits[0].native_gates.MZ.create_sequence() + natives = platform.parameters.native_gates + probe_seq = natives.single_qubit[0].MZ.create_sequence() pulse = probe_seq[0][1] if parameter is Parameter.amplitude: parameter_range = np.random.rand(SWEPT_POINTS) @@ -254,7 +261,8 @@ def test_dummy_double_sweep( ): sequence = PulseSequence() pulse = Pulse(duration=40, amplitude=0.1, envelope=Gaussian(rel_sigma=5)) - probe_seq = platform.qubits[0].native_gates.MZ.create_sequence() + natives = platform.parameters.native_gates + probe_seq = natives.single_qubit[0].MZ.create_sequence() probe_pulse = probe_seq[0][1] sequence.append((platform.get_qubit(0).drive.name, pulse)) sequence.append((platform.qubits[0].probe.name, Delay(duration=pulse.duration))) @@ -327,8 +335,9 @@ def test_dummy_single_sweep_multiplex( ): sequence = PulseSequence() probe_pulses = {} + natives = platform.parameters.native_gates for qubit in platform.qubits: - probe_seq = platform.qubits[qubit].native_gates.MZ.create_sequence() + probe_seq = natives.single_qubit[qubit].MZ.create_sequence() probe_pulses[qubit] = probe_seq[0][1] sequence.concatenate(probe_seq) parameter_range = ( From a6900104574ea3576d4c62238df9dcbcd4819de3 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 14 Aug 2024 20:06:35 +0200 Subject: [PATCH 0618/1006] test: Fix compiler tests --- tests/test_compilers_default.py | 39 +++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/tests/test_compilers_default.py b/tests/test_compilers_default.py index 5bd41393ed..e34794d9f5 100644 --- a/tests/test_compilers_default.py +++ b/tests/test_compilers_default.py @@ -6,6 +6,7 @@ from qibolab import create_platform from qibolab.compilers import Compiler +from qibolab.platform import Platform from qibolab.pulses import Delay, PulseSequence @@ -86,26 +87,28 @@ def test_rz_to_sequence(platform): assert len(sequence) == 2 -def test_gpi_to_sequence(platform): +def test_gpi_to_sequence(platform: Platform): + natives = platform.parameters.native_gates + circuit = Circuit(1) circuit.add(gates.GPI(0, phi=0.2)) sequence = compile_circuit(circuit, platform) assert len(sequence.channels) == 1 - rx_seq = platform.qubits[0].native_gates.RX.create_sequence(phi=0.2) + rx_seq = natives.single_qubit[0].RX.create_sequence(phi=0.2) np.testing.assert_allclose(sequence.duration, rx_seq.duration) def test_gpi2_to_sequence(platform): + natives = platform.parameters.native_gates + circuit = Circuit(1) circuit.add(gates.GPI2(0, phi=0.2)) sequence = compile_circuit(circuit, platform) assert len(sequence.channels) == 1 - rx90_seq = platform.qubits[0].native_gates.RX.create_sequence( - theta=np.pi / 2, phi=0.2 - ) + rx90_seq = natives.single_qubit[0].RX.create_sequence(theta=np.pi / 2, phi=0.2) np.testing.assert_allclose(sequence.duration, rx90_seq.duration) assert sequence == rx90_seq @@ -113,25 +116,31 @@ def test_gpi2_to_sequence(platform): def test_cz_to_sequence(): platform = create_platform("dummy") + natives = platform.parameters.native_gates + circuit = Circuit(3) circuit.add(gates.CZ(1, 2)) sequence = compile_circuit(circuit, platform) - test_sequence = platform.pairs[(2, 1)].native_gates.CZ.create_sequence() + test_sequence = natives.two_qubit[(2, 1)].CZ.create_sequence() assert sequence == test_sequence def test_cnot_to_sequence(): platform = create_platform("dummy") + natives = platform.parameters.native_gates + circuit = Circuit(4) circuit.add(gates.CNOT(2, 3)) sequence = compile_circuit(circuit, platform) - test_sequence = platform.pairs[(2, 3)].native_gates.CNOT.create_sequence() + test_sequence = natives.two_qubit[(2, 3)].CNOT.create_sequence() assert sequence == test_sequence -def test_add_measurement_to_sequence(platform): +def test_add_measurement_to_sequence(platform: Platform): + natives = platform.parameters.native_gates + circuit = Circuit(1) circuit.add(gates.GPI2(0, 0.1)) circuit.add(gates.GPI2(0, 0.2)) @@ -144,16 +153,18 @@ def test_add_measurement_to_sequence(platform): assert len(list(sequence.channel(qubit.probe.name))) == 2 # include delay s = PulseSequence() - s.concatenate(qubit.native_gates.RX.create_sequence(theta=np.pi / 2, phi=0.1)) - s.concatenate(qubit.native_gates.RX.create_sequence(theta=np.pi / 2, phi=0.2)) + s.concatenate(natives.single_qubit[0].RX.create_sequence(theta=np.pi / 2, phi=0.1)) + s.concatenate(natives.single_qubit[0].RX.create_sequence(theta=np.pi / 2, phi=0.2)) s.append((qubit.probe.name, Delay(duration=s.duration))) - s.concatenate(qubit.native_gates.MZ.create_sequence()) + s.concatenate(natives.single_qubit[0].MZ.create_sequence()) assert sequence == s @pytest.mark.parametrize("delay", [0, 100]) -def test_align_delay_measurement(platform, delay): +def test_align_delay_measurement(platform: Platform, delay): + natives = platform.parameters.native_gates + circuit = Circuit(1) circuit.add(gates.Align(0, delay=delay)) circuit.add(gates.M(0)) @@ -162,12 +173,12 @@ def test_align_delay_measurement(platform, delay): target_sequence = PulseSequence() if delay > 0: target_sequence.append((platform.qubits[0].probe.name, Delay(duration=delay))) - target_sequence.concatenate(platform.qubits[0].native_gates.MZ.create_sequence()) + target_sequence.concatenate(natives.single_qubit[0].MZ.create_sequence()) assert sequence == target_sequence assert len(sequence.probe_pulses) == 1 -def test_align_multiqubit(platform): +def test_align_multiqubit(platform: Platform): main, coupled = 0, 2 circuit = Circuit(3) circuit.add(gates.GPI2(main, phi=0.2)) From 6ef8bea218772e147e337b604df9a735288a870e Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 14 Aug 2024 20:08:58 +0200 Subject: [PATCH 0619/1006] test: Fix platform and results tests --- tests/conftest.py | 5 +++-- tests/test_platform.py | 14 ++++++++++---- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 6b52a903cd..f93a46cbb9 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -149,10 +149,11 @@ def wrapped( ) qubit = next(iter(connected_platform.qubits.values())) + natives = connected_platform.parameters.native_gates.single_qubit[0] if sequence is None: - qd_seq = qubit.native_gates.RX.create_sequence() - probe_seq = qubit.native_gates.MZ.create_sequence() + qd_seq = natives.RX.create_sequence() + probe_seq = natives.MZ.create_sequence() probe_pulse = probe_seq[0][1] sequence = PulseSequence() sequence.concatenate(qd_seq) diff --git a/tests/test_platform.py b/tests/test_platform.py index 44965b0e67..4ad4680f6f 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -32,12 +32,13 @@ nshots = 1024 -def test_unroll_sequences(platform): +def test_unroll_sequences(platform: Platform): qubit = next(iter(platform.qubits.values())) + natives = platform.parameters.native_gates.single_qubit[0] sequence = PulseSequence() - sequence.concatenate(qubit.native_gates.RX.create_sequence()) + sequence.concatenate(natives.RX.create_sequence()) sequence.append((qubit.probe.name, Delay(duration=sequence.duration))) - sequence.concatenate(qubit.native_gates.MZ.create_sequence()) + sequence.concatenate(natives.MZ.create_sequence()) total_sequence, readouts = unroll_sequences(10 * [sequence], relaxation_time=10000) assert len(total_sequence.probe_pulses) == 10 assert len(readouts) == 1 @@ -187,7 +188,12 @@ def test_kernels(tmp_path: Path): ) platform.dump(tmp_path) - reloaded = Platform.load(tmp_path, instruments=platform.instruments) + reloaded = Platform.load( + tmp_path, + instruments=platform.instruments, + qubits=platform.qubits, + couplers=platform.couplers, + ) for qubit in platform.qubits.values(): orig = platform.parameters.configs[qubit.acquisition.name].kernel From 86b5b7172025bb6854bab4d62f712086d8d2a2d0 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 14 Aug 2024 20:18:22 +0200 Subject: [PATCH 0620/1006] fix: Always pass through qubit retrieval during compilation --- src/qibolab/compilers/compiler.py | 8 +++++--- tests/test_backends.py | 10 +++------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/qibolab/compilers/compiler.py b/src/qibolab/compilers/compiler.py index c8cd523fed..5909114a38 100644 --- a/src/qibolab/compilers/compiler.py +++ b/src/qibolab/compilers/compiler.py @@ -111,7 +111,9 @@ def get_sequence(self, gate: gates.Gate, platform: Platform): natives = platform.parameters.native_gates if isinstance(gate, (gates.M)): - qubits = [natives.single_qubit[q] for q in gate.qubits] + qubits = [ + natives.single_qubit[platform.get_qubit(q).name] for q in gate.qubits + ] return rule(gate, qubits) if isinstance(gate, (gates.Align)): @@ -123,8 +125,8 @@ def get_sequence(self, gate: gates.Gate, platform: Platform): return rule(gate, qubit) if len(gate.qubits) == 1: - qubit = gate.target_qubits[0] - return rule(gate, natives.single_qubit[qubit]) + qubit = platform.get_qubit(gate.target_qubits[0]) + return rule(gate, natives.single_qubit[qubit.name]) if len(gate.qubits) == 2: pair = tuple(platform.get_qubit(q).name for q in gate.qubits) diff --git a/tests/test_backends.py b/tests/test_backends.py index 27528aa458..25ac6cfbad 100644 --- a/tests/test_backends.py +++ b/tests/test_backends.py @@ -109,18 +109,14 @@ def dummy_string_qubit_names(): for q, qubit in platform.qubits.copy().items(): name = f"A{q}" qubit.name = name - platform._qubits[name] = qubit - del platform._qubits[q] + platform.qubits[name] = qubit + del platform.qubits[q] platform.parameters.native_gates.single_qubit[name] = ( platform.parameters.native_gates.single_qubit[q] ) del platform.parameters.native_gates.single_qubit[q] - for (q0, q1), pair in platform.pairs.copy().items(): + for q0, q1 in platform.pairs: name = (f"A{q0}", f"A{q1}") - pair.qubit1 = name[0] - pair.qubit2 = name[1] - platform._pairs[name] = pair - del platform._pairs[(q0, q1)] try: platform.parameters.native_gates.two_qubit[name] = ( platform.parameters.native_gates.two_qubit[(q0, q1)] From e285656a406cb87215b7e6e6dd7204f70b7691fb Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 15 Aug 2024 12:56:55 +0200 Subject: [PATCH 0621/1006] fix: Add two-qubit gates container to provide access to symmetric gates --- src/qibolab/parameters.py | 49 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/src/qibolab/parameters.py b/src/qibolab/parameters.py index e7bc71c4b3..d7b58a140d 100644 --- a/src/qibolab/parameters.py +++ b/src/qibolab/parameters.py @@ -4,7 +4,9 @@ example. """ -from pydantic import Field +from collections.abc import Iterable + +from pydantic import Field, TypeAdapter, model_serializer, model_validator from qibolab.components import Config from qibolab.execution_parameters import ConfigUpdate, ExecutionParameters @@ -50,6 +52,49 @@ def fill(self, options: ExecutionParameters): return options +class TwoQubitContainer(Model): + pairs: dict[QubitPairId, TwoQubitNatives] = Field(default_factory=dict) + + @model_validator(mode="before") + @classmethod + def wrap(cls, data: dict) -> dict: + return {"pairs": data} + + @model_serializer + def unwrap(self) -> dict: + return TypeAdapter(dict[QubitPairId, TwoQubitNatives]).dump_python(self.pairs) + + def __getitem__(self, key: QubitPairId): + try: + return self.pairs[key] + except KeyError as e: + value = self.pairs[(key[1], key[0])] + if value.symmetric: + return value + raise e + + def __setitem__(self, key: QubitPairId, value: TwoQubitNatives): + self.pairs[key] = value + + def __delitem__(self, key: QubitPairId): + del self.pairs[key] + + def __contains__(self, key: QubitPairId) -> bool: + return key in self.pairs + + def __iter__(self) -> Iterable[QubitPairId]: + return iter(self.pairs) + + def keys(self) -> Iterable[QubitPairId]: + return self.pairs.keys() + + def values(self) -> Iterable[TwoQubitNatives]: + return self.pairs.values() + + def items(self) -> Iterable[tuple[QubitPairId, TwoQubitNatives]]: + return self.pairs.items() + + class NativeGates(Model): """Native gates parameters. @@ -58,7 +103,7 @@ class NativeGates(Model): single_qubit: dict[QubitId, SingleQubitNatives] = Field(default_factory=dict) coupler: dict[QubitId, SingleQubitNatives] = Field(default_factory=dict) - two_qubit: dict[QubitPairId, TwoQubitNatives] = Field(default_factory=dict) + two_qubit: TwoQubitContainer = Field(default_factory=TwoQubitContainer) ComponentId = str From 4c712cc15f07899f3fb012bf43a93261c1d179e9 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 15 Aug 2024 13:09:38 +0200 Subject: [PATCH 0622/1006] fix: Subclass dict, instead of wrapping it --- src/qibolab/parameters.py | 59 +++++++++++++++++---------------------- 1 file changed, 25 insertions(+), 34 deletions(-) diff --git a/src/qibolab/parameters.py b/src/qibolab/parameters.py index d7b58a140d..19f726ce74 100644 --- a/src/qibolab/parameters.py +++ b/src/qibolab/parameters.py @@ -4,9 +4,11 @@ example. """ -from collections.abc import Iterable +from collections.abc import Callable +from typing import Any -from pydantic import Field, TypeAdapter, model_serializer, model_validator +from pydantic import Field, TypeAdapter +from pydantic_core import core_schema from qibolab.components import Config from qibolab.execution_parameters import ConfigUpdate, ExecutionParameters @@ -52,48 +54,37 @@ def fill(self, options: ExecutionParameters): return options -class TwoQubitContainer(Model): - pairs: dict[QubitPairId, TwoQubitNatives] = Field(default_factory=dict) +class TwoQubitContainer(dict[QubitPairId, TwoQubitNatives]): + @classmethod + def __get_pydantic_core_schema__( + cls, source_type: Any, handler: Callable[[Any], core_schema.CoreSchema] + ) -> core_schema.CoreSchema: + schema = handler(dict[QubitPairId, TwoQubitNatives]) + return core_schema.no_info_after_validator_function( + cls._validate, + schema, + serialization=core_schema.plain_serializer_function_ser_schema( + cls._serialize, info_arg=False + ), + ) - @model_validator(mode="before") @classmethod - def wrap(cls, data: dict) -> dict: - return {"pairs": data} + def _validate(cls, value): + return cls(value) - @model_serializer - def unwrap(self) -> dict: - return TypeAdapter(dict[QubitPairId, TwoQubitNatives]).dump_python(self.pairs) + @staticmethod + def _serialize(value): + return TypeAdapter(dict[QubitPairId, TwoQubitNatives]).dump_python(value) def __getitem__(self, key: QubitPairId): try: - return self.pairs[key] + return super().__getitem__(key) except KeyError as e: - value = self.pairs[(key[1], key[0])] + value = super().__getitem__((key[1], key[0])) if value.symmetric: return value raise e - def __setitem__(self, key: QubitPairId, value: TwoQubitNatives): - self.pairs[key] = value - - def __delitem__(self, key: QubitPairId): - del self.pairs[key] - - def __contains__(self, key: QubitPairId) -> bool: - return key in self.pairs - - def __iter__(self) -> Iterable[QubitPairId]: - return iter(self.pairs) - - def keys(self) -> Iterable[QubitPairId]: - return self.pairs.keys() - - def values(self) -> Iterable[TwoQubitNatives]: - return self.pairs.values() - - def items(self) -> Iterable[tuple[QubitPairId, TwoQubitNatives]]: - return self.pairs.items() - class NativeGates(Model): """Native gates parameters. @@ -103,7 +94,7 @@ class NativeGates(Model): single_qubit: dict[QubitId, SingleQubitNatives] = Field(default_factory=dict) coupler: dict[QubitId, SingleQubitNatives] = Field(default_factory=dict) - two_qubit: TwoQubitContainer = Field(default_factory=TwoQubitContainer) + two_qubit: TwoQubitContainer = Field(default_factory=dict) ComponentId = str From ec79d9ec98f64678966e52e7244b9fe28a52dbc0 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 15 Aug 2024 15:11:56 +0200 Subject: [PATCH 0623/1006] fix: Use automatic reraising --- src/qibolab/parameters.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qibolab/parameters.py b/src/qibolab/parameters.py index 19f726ce74..288a8f6960 100644 --- a/src/qibolab/parameters.py +++ b/src/qibolab/parameters.py @@ -79,11 +79,11 @@ def _serialize(value): def __getitem__(self, key: QubitPairId): try: return super().__getitem__(key) - except KeyError as e: + except KeyError: value = super().__getitem__((key[1], key[0])) if value.symmetric: return value - raise e + raise class NativeGates(Model): From 237e6eae7c3764c3d6501eab80cc44dcd200d735 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 15 Aug 2024 15:56:35 +0200 Subject: [PATCH 0624/1006] docs: Fix doctests for symmetric And also platform creation, which is actually untested, though running --- doc/source/getting-started/experiment.rst | 3 +- doc/source/main-documentation/qibolab.rst | 30 ++-- doc/source/tutorials/calibration.rst | 13 +- doc/source/tutorials/compiler.rst | 2 +- doc/source/tutorials/lab.rst | 166 ++++++++-------------- 5 files changed, 90 insertions(+), 124 deletions(-) diff --git a/doc/source/getting-started/experiment.rst b/doc/source/getting-started/experiment.rst index 5e80369be7..eb132aeb71 100644 --- a/doc/source/getting-started/experiment.rst +++ b/doc/source/getting-started/experiment.rst @@ -216,8 +216,9 @@ We leave to the dedicated tutorial a full explanation of the experiment, but her platform = create_platform("dummy") qubit = platform.qubits[0] + natives = platform.parameters.native_gates.single_qubit[0] # define the pulse sequence - sequence = qubit.native_gates.MZ.create_sequence() + sequence = natives.MZ.create_sequence() # define a sweeper for a frequency scan sweeper = Sweeper( diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index b4933d631f..9f0d83c02c 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -68,10 +68,11 @@ Now we can create a simple sequence (again, without explicitly giving any qubit ps = PulseSequence() qubit = platform.qubits[0] - ps.concatenate(qubit.native_gates.RX.create_sequence()) - ps.concatenate(qubit.native_gates.RX.create_sequence(phi=np.pi / 2)) + natives = platform.parameters.native_gates.single_qubit[0] + ps.concatenate(natives.RX.create_sequence()) + ps.concatenate(natives.RX.create_sequence(phi=np.pi / 2)) ps.append((qubit.probe.name, Delay(duration=200))) - ps.concatenate(qubit.native_gates.MZ.create_sequence()) + ps.concatenate(natives.MZ.create_sequence()) Now we can execute the sequence on hardware: @@ -335,15 +336,16 @@ Typical experiments may include both pre-defined pulses and new ones: from qibolab.pulses import Rectangular + natives = platform.parameters.native_gates.single_qubit[0] sequence = PulseSequence() - sequence.concatenate(platform.qubits[0].native_gates.RX.create_sequence()) + sequence.concatenate(natives.RX.create_sequence()) sequence.append( ( "some_channel", Pulse(duration=10, amplitude=0.5, relative_phase=0, envelope=Rectangular()), ) ) - sequence.concatenate(platform.qubits[0].native_gates.MZ.create_sequence()) + sequence.concatenate(natives.MZ.create_sequence()) results = platform.execute([sequence], options=options) @@ -414,15 +416,17 @@ A tipical resonator spectroscopy experiment could be defined with: from qibolab.sweeper import Parameter, Sweeper, SweeperType + natives = platform.parameters.native_gates.single_qubit + sequence = PulseSequence() sequence.concatenate( - platform.qubits[0].native_gates.MZ.create_sequence() + natives[0].MZ.create_sequence() ) # readout pulse for qubit 0 at 4 GHz sequence.concatenate( - platform.qubits[1].native_gates.MZ.create_sequence() + natives[1].MZ.create_sequence() ) # readout pulse for qubit 1 at 5 GHz sequence.concatenate( - platform.qubits[2].native_gates.MZ.create_sequence() + natives[2].MZ.create_sequence() ) # readout pulse for qubit 2 at 6 GHz sweeper = Sweeper( @@ -459,10 +463,11 @@ For example: from qibolab.pulses import PulseSequence, Delay qubit = platform.qubits[0] + natives = platform.parameters.native_gates.single_qubit[0] sequence = PulseSequence() - sequence.concatenate(qubit.native_gates.RX.create_sequence()) + sequence.concatenate(natives.RX.create_sequence()) sequence.append((qubit.probe.name, Delay(duration=sequence.duration))) - sequence.concatenate(qubit.native_gates.MZ.create_sequence()) + sequence.concatenate(natives.MZ.create_sequence()) sweeper_freq = Sweeper( parameter=Parameter.frequency, @@ -555,11 +560,12 @@ Let's now delve into a typical use case for result objects within the qibolab fr .. testcode:: python qubit = platform.qubits[0] + natives = platform.parameters.native_gates.single_qubit[0] sequence = PulseSequence() - sequence.concatenate(qubit.native_gates.RX.create_sequence()) + sequence.concatenate(natives.RX.create_sequence()) sequence.append((qubit.probe.name, Delay(duration=sequence.duration))) - sequence.concatenate(qubit.native_gates.MZ.create_sequence()) + sequence.concatenate(natives.MZ.create_sequence()) options = ExecutionParameters( nshots=1000, diff --git a/doc/source/tutorials/calibration.rst b/doc/source/tutorials/calibration.rst index fbebca7331..8bc1ba78b6 100644 --- a/doc/source/tutorials/calibration.rst +++ b/doc/source/tutorials/calibration.rst @@ -43,7 +43,8 @@ around the pre-defined frequency. platform = create_platform("dummy") qubit = platform.qubits[0] - sequence = qubit.native_gates.MZ.create_sequence() + natives = platform.parameters.native_gates.single_qubit[0] + sequence = natives.MZ.create_sequence() # allocate frequency sweeper sweeper = Sweeper( @@ -124,6 +125,7 @@ complex pulse sequence. Therefore with start with that: platform = create_platform("dummy") qubit = platform.qubits[0] + natives = platform.parameters.native_gates.single_qubit[0] # create pulse sequence and add pulses sequence = PulseSequence( @@ -135,7 +137,7 @@ complex pulse sequence. Therefore with start with that: (qubit.probe.name, Delay(duration=sequence.duration)), ] ) - sequence.concatenate(qubit.native_gates.MZ.create_sequence()) + sequence.concatenate(natives.MZ.create_sequence()) # allocate frequency sweeper sweeper = Sweeper( @@ -226,15 +228,16 @@ and its impact on qubit states in the IQ plane. platform = create_platform("dummy") qubit = platform.qubits[0] + natives = platform.parameters.native_gates.single_qubit[0] # create pulse sequence 1 and add pulses one_sequence = PulseSequence() - one_sequence.concatenate(qubit.native_gates.RX.create_sequence()) + one_sequence.concatenate(natives.RX.create_sequence()) one_sequence.append((qubit.probe.name, Delay(duration=one_sequence.duration))) - one_sequence.concatenate(qubit.native_gates.MZ.create_sequence()) + one_sequence.concatenate(natives.MZ.create_sequence()) # create pulse sequence 2 and add pulses - zero_sequence = qubit.native_gates.MZ.create_sequence() + zero_sequence = natives.MZ.create_sequence() options = ExecutionParameters( nshots=1000, diff --git a/doc/source/tutorials/compiler.rst b/doc/source/tutorials/compiler.rst index dd335fe4ce..af9ad152de 100644 --- a/doc/source/tutorials/compiler.rst +++ b/doc/source/tutorials/compiler.rst @@ -82,7 +82,7 @@ The following example shows how to modify the compiler in order to execute a cir # define a compiler rule that translates X to the pi-pulse def x_rule(gate, qubit): """X gate applied with a single pi-pulse.""" - return qubit.native_gates.RX.create_sequence() + return qubit.RX.create_sequence() # the empty dictionary is needed because the X gate does not require any virtual Z-phases diff --git a/doc/source/tutorials/lab.rst b/doc/source/tutorials/lab.rst index d3fdb596a5..2b6e3a555c 100644 --- a/doc/source/tutorials/lab.rst +++ b/doc/source/tutorials/lab.rst @@ -26,6 +26,7 @@ using different Qibolab primitives. from qibolab.qubits import Qubit from qibolab.pulses import Gaussian, Pulse, Rectangular from qibolab.native import RxyFactory, FixedSequenceFactory, SingleQubitNatives + from qibolab.parameters import NativeGates, Parameters from qibolab.instruments.dummy import DummyInstrument @@ -67,20 +68,22 @@ using different Qibolab primitives. ) # assign native gates to the qubit - qubit.native_gates = SingleQubitNatives( + native_gates = SingleQubitNatives( RX=RxyFactory(drive_seq), MZ=FixedSequenceFactory(probe_seq), ) + # create a parameters instance + parameters = Parameters( + native_gates=NativeGates(single_qubit=native_gates), configs=configs + ) + # create dictionaries of the different objects qubits = {qubit.name: qubit} - pairs = {} # empty as for single qubit we have no qubit pairs instruments = {instrument.name: instrument} # allocate and return Platform object - return Platform( - "my_platform", qubits, pairs, configs, instruments, resonator_type="3D" - ) + return Platform("my_platform", qubits, configs, instruments) This code creates a platform with a single qubit that is controlled by the @@ -95,14 +98,14 @@ control instrument and we assigned two native gates to the qubit. These can be passed when defining the :class:`qibolab.qubits.Qubit` objects. When the QPU contains more than one qubit, some of the qubits are connected so -that two-qubit gates can be applied. For such connected pairs of qubits one -needs to additionally define :class:`qibolab.qubits.QubitPair` objects, which -hold the parameters of the two-qubit gates. +that two-qubit gates can be applied. These are called in a single dictionary, within +the native gates, but separately from the single-qubit ones. .. testcode:: python from qibolab.components import IqChannel, AcquireChannel, DcChannel, IqConfig - from qibolab.qubits import Qubit, QubitPair + from qibolab.qubits import Qubit + from qibolab.parameters import Parameters, TwoQubitContainer from qibolab.pulses import Gaussian, Pulse, PulseSequence, Rectangular from qibolab.native import ( RxyFactory, @@ -125,7 +128,8 @@ hold the parameters of the two-qubit gates. qubit1.drive = IqChannel(name="drive_1", mixer=None, lo=None) # assign single-qubit native gates to each qubit - qubit0.native_gates = SingleQubitNatives( + single_qubit = {} + single_qubit[qubit0.name] = SingleQubitNatives( RX=RxyFactory( PulseSequence( [ @@ -151,7 +155,7 @@ hold the parameters of the two-qubit gates. ) ), ) - qubit1.native_gates = SingleQubitNatives( + single_qubit[qubit1.name] = SingleQubitNatives( RX=RxyFactory( PulseSequence( [ @@ -177,33 +181,32 @@ hold the parameters of the two-qubit gates. ) # define the pair of qubits - pair = QubitPair( - qubit1=qubit0.name, - qubit2=qubit1.name, - native_gates=TwoQubitNatives( - CZ=FixedSequenceFactory( - PulseSequence( - [ - ( - qubit0.flux.name, - Pulse(duration=30, amplitude=0.005, envelope=Rectangular()), - ), - ] + two_qubit = TwoQubitContainer( + { + f"{qubit0.name}-{qubit1.name}": TwoQubitNatives( + CZ=FixedSequenceFactory( + PulseSequence( + [ + ( + qubit0.flux.name, + Pulse(duration=30, amplitude=0.005, envelope=Rectangular()), + ), + ] + ) ) ) - ), + } ) Some architectures may also have coupler qubits that mediate the interactions. -Then we add them to their corresponding :class:`qibolab.qubits.QubitPair` objects according -to the chip topology. We neglected characterization parameters associated to the -coupler but qibolab will take them into account when calling :class:`qibolab.native.TwoQubitNatives`. +We neglected characterization parameters associated to the coupler but qibolab +will take them into account when calling :class:`qibolab.native.TwoQubitNatives`. .. testcode:: python from qibolab.components import DcChannel - from qibolab.qubits import Qubit, QubitPair + from qibolab.qubits import Qubit from qibolab.pulses import Pulse, PulseSequence from qibolab.native import ( FixedSequenceFactory, @@ -223,25 +226,25 @@ coupler but qibolab will take them into account when calling :class:`qibolab.nat # Look above example # define the pair of qubits - pair = QubitPair( - qubit1=qubit0.name, - qubit2=qubit1.name, - native_gates=TwoQubitNatives( - CZ=FixedSequenceFactory( - PulseSequence( - [ - ( - coupler_01.flux.name, - Pulse(duration=30, amplitude=0.005, envelope=Rectangular()), - ) - ], + two_qubit = TwoQubitContainer( + { + f"{qubit0.name}-{qubit1.name}": TwoQubitNatives( + CZ=FixedSequenceFactory( + PulseSequence( + [ + ( + coupler_01.flux.name, + Pulse(duration=30, amplitude=0.005, envelope=Rectangular()), + ) + ], + ) ) - ) - ), + ), + } ) -The platform automatically creates the connectivity graph of the given chip -using the dictionary of :class:`qibolab.qubits.QubitPair` objects. +The platform automatically creates the connectivity graph of the given chip, +using the keys of :class:`qibolab.parameters.TwoQubitContainer` map. Registering platforms ^^^^^^^^^^^^^^^^^^^^^ @@ -495,7 +498,6 @@ the above runcard: DcConfig, IqConfig, ) - from qibolab.parameters import Parameters from qibolab.instruments.dummy import DummyInstrument FOLDER = Path.cwd() @@ -503,33 +505,23 @@ the above runcard: def create(): - # Create a controller instrument + # create a controller instrument instrument = DummyInstrument("my_instrument", "0.0.0.0:0") - # create ``Qubit`` and ``QubitPair`` objects by loading the runcard - runcard = Parameters.load(folder) - qubits = runcard.native_gates.single_qubit - pairs = runcard.native_gates.pairs - # define channels and load component configs - configs = {} - component_params = runcard["components"] + qubits = {} for q in range(2): drive_name = f"qubit_{q}/drive" - configs[drive_name] = IqConfig(**component_params[drive_name]) qubits[q].drive = IqChannel(drive_name, mixer=None, lo=None) flux_name = f"qubit_{q}/flux" - configs[flux_name] = DcConfig(**component_params[flux_name]) qubits[q].flux = DcChannel(flux_name) probe_name, acquire_name = f"qubit_{q}/probe", f"qubit_{q}/acquire" - configs[probe_name] = IqConfig(**component_params[probe_name]) qubits[q].probe = IqChannel( probe_name, mixer=None, lo=None, acquistion=acquire_name ) - configs[acquire_name] = AcquisitionConfig(**component_params[acquire_name]) quibts[q].acquisition = AcquireChannel( acquire_name, twpa_pump=None, probe=probe_name ) @@ -537,15 +529,7 @@ the above runcard: # create dictionary of instruments instruments = {instrument.name: instrument} # load ``settings`` from the runcard - return Platform( - "my_platform", - qubits, - pairs, - configs, - instruments, - settings=runcard.settings, - resonator_type="2D", - ) + return Platform.load(FOLDER, instruments, qubits) With the following additions for coupler architectures: @@ -553,58 +537,30 @@ With the following additions for coupler architectures: # my_platform / platform.py + FOLDER = Path.cwd() + def create(): # Create a controller instrument instrument = DummyInstrument("my_instrument", "0.0.0.0:0") - # create ``Qubit`` and ``QubitPair`` objects by loading the runcard - runcard = Parameters.load(folder) - qubits = runcard.native_gates.single_qubit - couplers = runcard.native_gates.coupler - pairs = runcard.native_gates.pairs - + qubits = {} # define channels and load component configs - configs = {} - component_params = runcard["components"] for q in range(2): - drive_name = f"qubit_{q}/drive" - configs[drive_name] = IqConfig(**component_params[drive_name]) - qubits[q].drive = IqChannel(drive_name, mixer=None, lo=None) - - flux_name = f"qubit_{q}/flux" - configs[flux_name] = DcConfig(**component_params[flux_name]) - qubits[q].flux = DcChannel(flux_name) - probe_name, acquire_name = f"qubit_{q}/probe", f"qubit_{q}/acquire" - configs[probe_name] = IqConfig(**component_params[probe_name]) - qubits[q].probe = IqChannel( - probe_name, mixer=None, lo=None, acquistion=acquire_name + qubits[q] = Qubit( + name=q, + drive=IqChannel(f"qubit_{q}/drive", mixer=None, lo=None), + flux=DcChannel(f"qubit_{q}/flux"), + probe=IqChannel(probe_name, mixer=None, lo=None, acquistion=acquire_name), + acquisition=AcquireChannel(acquire_name, twpa_pump=None, probe=probe_name), ) - configs[acquire_name] = AcquisitionConfig(**component_params[acquire_name]) - quibts[q].acquisition = AcquireChannel( - acquire_name, twpa_pump=None, probe=probe_name - ) - - coupler_flux_name = "coupler_0/flux" - configs[coupler_flux_name] = DcConfig(**component_params[coupler_flux_name]) - couplers[0].flux = DcChannel(coupler_flux_name) + couplers = {0: Qubit(name=0, flux=DcChannel("coupler_0/flux"))} # create dictionary of instruments instruments = {instrument.name: instrument} - # load ``settings`` from the runcard - settings = load_settings(runcard) - return Platform( - "my_platform", - qubits, - pairs, - configs, - instruments, - settings, - resonator_type="2D", - couplers=couplers, - ) + return Platform.load(FOLDER, instruments, qubits, couplers=couplers) Note that this assumes that the runcard is saved as ``/parameters.json`` where ```` is the directory containing ``platform.py``. From d3bc2a5fdd1043a77ed7ad1fbb2d9f9f9fac14fc Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 15 Aug 2024 16:51:00 +0200 Subject: [PATCH 0625/1006] fix: Fix docstring snippets --- src/qibolab/dummy/platform.py | 3 +-- src/qibolab/platform/platform.py | 13 +++++++------ src/qibolab/sweeper.py | 3 ++- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/qibolab/dummy/platform.py b/src/qibolab/dummy/platform.py index be47fe2aaa..c725a3c9ad 100644 --- a/src/qibolab/dummy/platform.py +++ b/src/qibolab/dummy/platform.py @@ -17,8 +17,7 @@ def create_dummy() -> Platform: qubits = {} # attach the channels for q in range(5): - acquisition = f"qubit_{q}/acquire" - probe = f"qubit_{q}/probe" + probe, acquisition = f"qubit_{q}/probe", f"qubit_{q}/acquire" qubits[q] = Qubit( name=q, probe=IqChannel(probe, mixer=None, lo=None, acquisition=acquisition), diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 3b69c3ccb7..3622083c67 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -99,11 +99,7 @@ class Platform: instruments: InstrumentMap """Mapping instrument names to :class:`qibolab.instruments.abstract.Instrument` objects.""" - resonator_type: Literal["2D", "3D"] = "2D" - """Type of resonator (2D or 3D) in the used QPU.""" - is_connected: bool = False - """Flag for whether we are connected to the physical instruments.""" - qubits: QubitMap = field(default_factory=dict) + qubits: QubitMap """Qubit controllers. The mapped objects hold the :class:`qubit.components.channels.Channel` instances @@ -115,6 +111,10 @@ class Platform: Fully analogue to :attr:`qubits`. Only the flux channel is expected to be populated in the mapped objects. """ + resonator_type: Literal["2D", "3D"] = "2D" + """Type of resonator (2D or 3D) in the used QPU.""" + is_connected: bool = False + """Flag for whether we are connected to the physical instruments.""" def __post_init__(self): log.info("Loading platform %s", self.name) @@ -261,7 +261,8 @@ def execute( platform = create_dummy() qubit = platform.qubits[0] - sequence = qubit.native_gates.MZ.create_sequence() + natives = platform.parameters.native_gates.single_qubit[0] + sequence = natives.MZ.create_sequence() parameter = Parameter.frequency parameter_range = np.random.randint(10, size=10) sweeper = [Sweeper(parameter, parameter_range, channels=[qubit.probe.name])] diff --git a/src/qibolab/sweeper.py b/src/qibolab/sweeper.py index 91107aef6c..f6ab9b4655 100644 --- a/src/qibolab/sweeper.py +++ b/src/qibolab/sweeper.py @@ -66,7 +66,8 @@ class Sweeper: platform = create_dummy() qubit = platform.qubits[0] - sequence = qubit.native_gates.MZ.create_sequence() + natives = platform.parameters.native_gates.single_qubit[0] + sequence = natives.MZ.create_sequence() parameter = Parameter.frequency parameter_range = np.random.randint(10, size=10) sweeper = Sweeper(parameter, parameter_range, channels=[qubit.probe.name]) From 0eb64a8dda7e0cbcbacacedb79b84aa62b68d7a8 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 15 Aug 2024 16:58:36 +0200 Subject: [PATCH 0626/1006] docs: Fix platforms creation in the docs Best effort, cf. https://github.com/qiboteam/qibolab/issues/984 --- doc/source/tutorials/lab.rst | 66 +++++++++--------------------------- 1 file changed, 16 insertions(+), 50 deletions(-) diff --git a/doc/source/tutorials/lab.rst b/doc/source/tutorials/lab.rst index 2b6e3a555c..781e688d86 100644 --- a/doc/source/tutorials/lab.rst +++ b/doc/source/tutorials/lab.rst @@ -83,7 +83,7 @@ using different Qibolab primitives. instruments = {instrument.name: instrument} # allocate and return Platform object - return Platform("my_platform", qubits, configs, instruments) + return Platform("my_platform", parameters, instruments, qubits) This code creates a platform with a single qubit that is controlled by the @@ -287,14 +287,11 @@ a two-qubit system: .. code-block:: json { - "nqubits": 2, - "qubits": [0, 1], "settings": { "nshots": 1024, "sampling_rate": 1000000000, "relaxation_time": 50000 }, - "topology": [[0, 1]], "components": { "drive_0": { "frequency": 4855663000 @@ -511,19 +508,13 @@ the above runcard: # define channels and load component configs qubits = {} for q in range(2): - drive_name = f"qubit_{q}/drive" - qubits[q].drive = IqChannel(drive_name, mixer=None, lo=None) - - flux_name = f"qubit_{q}/flux" - qubits[q].flux = DcChannel(flux_name) - probe_name, acquire_name = f"qubit_{q}/probe", f"qubit_{q}/acquire" - qubits[q].probe = IqChannel( - probe_name, mixer=None, lo=None, acquistion=acquire_name - ) - - quibts[q].acquisition = AcquireChannel( - acquire_name, twpa_pump=None, probe=probe_name + qubits[q] = Qubit( + name=q, + drive=IqChannel(f"qubit_{q}/drive", mixer=None, lo=None), + flux=DcChannel(f"qubit_{q}/flux"), + probe=IqChannel(probe_name, mixer=None, lo=None, acquistion=acquire_name), + acquisition=AcquireChannel(acquire_name, twpa_pump=None, probe=probe_name), ) # create dictionary of instruments @@ -579,13 +570,12 @@ The runcard can contain an ``instruments`` section that provides these parameter .. code-block:: json { - "nqubits": 2, "settings": { "nshots": 1024, "sampling_rate": 1000000000, "relaxation_time": 50000 }, - "instruments": { + "configs": { "twpa_pump": { "frequency": 4600000000, "power": 5 @@ -627,42 +617,18 @@ in this case ``"twpa_pump"``. # Create a controller instrument instrument = DummyInstrument("my_instrument", "0.0.0.0:0") - # create ``Qubit`` and ``QubitPair`` objects by loading the runcard - runcard = Parameters.load(folder) - qubits = runcard.native_gates.single_qubit - pairs = runcard.native_gates.pairs - # define channels and load component configs - configs = {} - component_params = runcard["components"] + qubits = {} for q in range(2): - drive_name = f"qubit_{q}/drive" - configs[drive_name] = IqConfig(**component_params[drive_name]) - qubits[q].drive = IqChannel(drive_name, mixer=None, lo=None) - - flux_name = f"qubit_{q}/flux" - configs[flux_name] = DcConfig(**component_params[flux_name]) - qubits[q].flux = DcChannel(flux_name) - probe_name, acquire_name = f"qubit_{q}/probe", f"qubit_{q}/acquire" - configs[probe_name] = IqConfig(**component_params[probe_name]) - qubits[q].probe = IqChannel( - probe_name, mixer=None, lo=None, acquistion=acquire_name - ) - - configs[acquire_name] = AcquisitionConfig(**component_params[acquire_name]) - quibts[q].acquisition = AcquireChannel( - acquire_name, twpa_pump=None, probe=probe_name + qubits[q] = Qubit( + name=q, + drive=IqChannel(f"qubit_{q}/drive", mixer=None, lo=None), + flux=DcChannel(f"qubit_{q}/flux"), + probe=IqChannel(probe_name, mixer=None, lo=None, acquistion=acquire_name), + acquisition=AcquireChannel(acquire_name, twpa_pump=None, probe=probe_name), ) # create dictionary of instruments instruments = {instrument.name: instrument} - return Platform( - "my_platform", - qubits, - pairs, - configs, - instruments, - settings=runcard.settings, - resonator_type="2D", - ) + return Platform.load(FOLDER, instruments, qubits) From 2171caa4e7822cc58c1074c0d4a14fc01afa55ec Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 15 Aug 2024 16:59:46 +0200 Subject: [PATCH 0627/1006] test: Fix minimal platform creation --- tests/test_platform.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/test_platform.py b/tests/test_platform.py index 4ad4680f6f..f2df2cc18d 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -59,6 +59,7 @@ def test_platform_basics(): name="ciao", parameters=Parameters(native_gates=NativeGates()), instruments={}, + qubits={}, ) assert str(platform) == "ciao" assert platform.topology == [] @@ -75,6 +76,7 @@ def test_platform_basics(): ) ), instruments={}, + qubits=qs, ) assert str(platform2) == "come va?" assert (1, 6) in platform2.topology From 5b58c4c80838e239b17f6a8ab1dae3876449ca9b Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Sat, 17 Aug 2024 15:11:14 +0200 Subject: [PATCH 0628/1006] refactor: Clarify variable names in default compiler rules --- src/qibolab/compilers/default.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/qibolab/compilers/default.py b/src/qibolab/compilers/default.py index 91426812d6..55288f5e71 100644 --- a/src/qibolab/compilers/default.py +++ b/src/qibolab/compilers/default.py @@ -23,15 +23,15 @@ def rz_rule(gate: Gate, qubit: Qubit) -> PulseSequence: return PulseSequence([(qubit.drive.name, VirtualZ(phase=gate.parameters[0]))]) -def identity_rule(gate: Gate, qubit: SingleQubitNatives) -> PulseSequence: +def identity_rule(gate: Gate, natives: SingleQubitNatives) -> PulseSequence: """Identity gate skipped.""" return PulseSequence() -def gpi2_rule(gate: Gate, qubit: SingleQubitNatives) -> PulseSequence: +def gpi2_rule(gate: Gate, natives: SingleQubitNatives) -> PulseSequence: """Rule for GPI2.""" - assert qubit.RX is not None - return qubit.RX.create_sequence(theta=np.pi / 2, phi=gate.parameters[0]) + assert natives.RX is not None + return natives.RX.create_sequence(theta=np.pi / 2, phi=gate.parameters[0]) def gpi_rule(gate: Gate, qubit: Qubit) -> PulseSequence: @@ -43,26 +43,26 @@ def gpi_rule(gate: Gate, qubit: Qubit) -> PulseSequence: return qubit.RX.create_sequence(theta=np.pi, phi=gate.parameters[0]) -def cz_rule(gate: Gate, pair: TwoQubitNatives) -> PulseSequence: +def cz_rule(gate: Gate, natives: TwoQubitNatives) -> PulseSequence: """CZ applied as defined in the platform runcard. Applying the CZ gate may involve sending pulses on qubits that the gate is not directly acting on. """ - assert pair.CZ is not None - return pair.CZ.create_sequence() + assert natives.CZ is not None + return natives.CZ.create_sequence() -def cnot_rule(gate: Gate, pair: TwoQubitNatives) -> PulseSequence: +def cnot_rule(gate: Gate, natives: TwoQubitNatives) -> PulseSequence: """CNOT applied as defined in the platform runcard.""" - assert pair.CNOT is not None - return pair.CNOT.create_sequence() + assert natives.CNOT is not None + return natives.CNOT.create_sequence() -def measurement_rule(gate: Gate, qubits: list[SingleQubitNatives]) -> PulseSequence: +def measurement_rule(gate: Gate, natives: list[SingleQubitNatives]) -> PulseSequence: """Measurement gate applied using the platform readout pulse.""" seq = PulseSequence() - for qubit in qubits: + for qubit in natives: assert qubit.MZ is not None seq.concatenate(qubit.MZ.create_sequence()) return seq From 8b2c7d8d37b6803b9825d614b9437570bee90b4c Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Sat, 17 Aug 2024 15:16:38 +0200 Subject: [PATCH 0629/1006] feat: Shortcut native gates with platform property --- doc/source/getting-started/experiment.rst | 2 +- doc/source/main-documentation/qibolab.rst | 10 +++++----- doc/source/tutorials/calibration.rst | 6 +++--- src/qibolab/compilers/compiler.py | 2 +- src/qibolab/platform/platform.py | 19 ++++++++++++------- src/qibolab/sweeper.py | 2 +- tests/conftest.py | 2 +- tests/test_backends.py | 12 ++++-------- tests/test_compilers_default.py | 12 ++++++------ tests/test_dummy.py | 18 +++++++++--------- tests/test_platform.py | 2 +- 11 files changed, 44 insertions(+), 43 deletions(-) diff --git a/doc/source/getting-started/experiment.rst b/doc/source/getting-started/experiment.rst index eb132aeb71..40f6d2a392 100644 --- a/doc/source/getting-started/experiment.rst +++ b/doc/source/getting-started/experiment.rst @@ -216,7 +216,7 @@ We leave to the dedicated tutorial a full explanation of the experiment, but her platform = create_platform("dummy") qubit = platform.qubits[0] - natives = platform.parameters.native_gates.single_qubit[0] + natives = platform.natives.single_qubit[0] # define the pulse sequence sequence = natives.MZ.create_sequence() diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index 9f0d83c02c..ec4b3758b7 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -68,7 +68,7 @@ Now we can create a simple sequence (again, without explicitly giving any qubit ps = PulseSequence() qubit = platform.qubits[0] - natives = platform.parameters.native_gates.single_qubit[0] + natives = platform.natives.single_qubit[0] ps.concatenate(natives.RX.create_sequence()) ps.concatenate(natives.RX.create_sequence(phi=np.pi / 2)) ps.append((qubit.probe.name, Delay(duration=200))) @@ -336,7 +336,7 @@ Typical experiments may include both pre-defined pulses and new ones: from qibolab.pulses import Rectangular - natives = platform.parameters.native_gates.single_qubit[0] + natives = platform.natives.single_qubit[0] sequence = PulseSequence() sequence.concatenate(natives.RX.create_sequence()) sequence.append( @@ -416,7 +416,7 @@ A tipical resonator spectroscopy experiment could be defined with: from qibolab.sweeper import Parameter, Sweeper, SweeperType - natives = platform.parameters.native_gates.single_qubit + natives = platform.natives.single_qubit sequence = PulseSequence() sequence.concatenate( @@ -463,7 +463,7 @@ For example: from qibolab.pulses import PulseSequence, Delay qubit = platform.qubits[0] - natives = platform.parameters.native_gates.single_qubit[0] + natives = platform.natives.single_qubit[0] sequence = PulseSequence() sequence.concatenate(natives.RX.create_sequence()) sequence.append((qubit.probe.name, Delay(duration=sequence.duration))) @@ -560,7 +560,7 @@ Let's now delve into a typical use case for result objects within the qibolab fr .. testcode:: python qubit = platform.qubits[0] - natives = platform.parameters.native_gates.single_qubit[0] + natives = platform.natives.single_qubit[0] sequence = PulseSequence() sequence.concatenate(natives.RX.create_sequence()) diff --git a/doc/source/tutorials/calibration.rst b/doc/source/tutorials/calibration.rst index 8bc1ba78b6..71fd99c6fe 100644 --- a/doc/source/tutorials/calibration.rst +++ b/doc/source/tutorials/calibration.rst @@ -43,7 +43,7 @@ around the pre-defined frequency. platform = create_platform("dummy") qubit = platform.qubits[0] - natives = platform.parameters.native_gates.single_qubit[0] + natives = platform.natives.single_qubit[0] sequence = natives.MZ.create_sequence() # allocate frequency sweeper @@ -125,7 +125,7 @@ complex pulse sequence. Therefore with start with that: platform = create_platform("dummy") qubit = platform.qubits[0] - natives = platform.parameters.native_gates.single_qubit[0] + natives = platform.natives.single_qubit[0] # create pulse sequence and add pulses sequence = PulseSequence( @@ -228,7 +228,7 @@ and its impact on qubit states in the IQ plane. platform = create_platform("dummy") qubit = platform.qubits[0] - natives = platform.parameters.native_gates.single_qubit[0] + natives = platform.natives.single_qubit[0] # create pulse sequence 1 and add pulses one_sequence = PulseSequence() diff --git a/src/qibolab/compilers/compiler.py b/src/qibolab/compilers/compiler.py index 5909114a38..a0954d05b8 100644 --- a/src/qibolab/compilers/compiler.py +++ b/src/qibolab/compilers/compiler.py @@ -108,7 +108,7 @@ def get_sequence(self, gate: gates.Gate, platform: Platform): # get local sequence for the current gate rule = self[type(gate)] - natives = platform.parameters.native_gates + natives = platform.natives if isinstance(gate, (gates.M)): qubits = [ diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 3622083c67..6c0a1c7832 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -13,7 +13,7 @@ from qibolab.components import Config from qibolab.execution_parameters import ExecutionParameters from qibolab.instruments.abstract import Controller, Instrument, InstrumentId -from qibolab.parameters import Parameters, Settings, update_configs +from qibolab.parameters import NativeGates, Parameters, Settings, update_configs from qibolab.pulses import Delay, PulseSequence from qibolab.qubits import Qubit, QubitId, QubitPairId from qibolab.sweeper import ParallelSweepers @@ -124,11 +124,6 @@ def __post_init__(self): def __str__(self): return self.name - @property - def settings(self) -> Settings: - """Container with default execution settings.""" - return self.parameters.settings - @property def nqubits(self) -> int: """Total number of usable qubits in the QPU.""" @@ -152,6 +147,16 @@ def topology(self) -> list[QubitPairId]: """ return self.pairs + @property + def settings(self) -> Settings: + """Container with default execution settings.""" + return self.parameters.settings + + @property + def natives(self) -> NativeGates: + """Native gates containers.""" + return self.parameters.native_gates + @property def sampling_rate(self): """Sampling rate of control electronics in giga samples per second @@ -261,7 +266,7 @@ def execute( platform = create_dummy() qubit = platform.qubits[0] - natives = platform.parameters.native_gates.single_qubit[0] + natives = platform.natives.single_qubit[0] sequence = natives.MZ.create_sequence() parameter = Parameter.frequency parameter_range = np.random.randint(10, size=10) diff --git a/src/qibolab/sweeper.py b/src/qibolab/sweeper.py index f6ab9b4655..4db5b2b6c2 100644 --- a/src/qibolab/sweeper.py +++ b/src/qibolab/sweeper.py @@ -66,7 +66,7 @@ class Sweeper: platform = create_dummy() qubit = platform.qubits[0] - natives = platform.parameters.native_gates.single_qubit[0] + natives = platform.natives.single_qubit[0] sequence = natives.MZ.create_sequence() parameter = Parameter.frequency parameter_range = np.random.randint(10, size=10) diff --git a/tests/conftest.py b/tests/conftest.py index f93a46cbb9..2fb51d3079 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -149,7 +149,7 @@ def wrapped( ) qubit = next(iter(connected_platform.qubits.values())) - natives = connected_platform.parameters.native_gates.single_qubit[0] + natives = connected_platform.natives.single_qubit[0] if sequence is None: qd_seq = natives.RX.create_sequence() diff --git a/tests/test_backends.py b/tests/test_backends.py index 25ac6cfbad..48e82905d5 100644 --- a/tests/test_backends.py +++ b/tests/test_backends.py @@ -111,17 +111,13 @@ def dummy_string_qubit_names(): qubit.name = name platform.qubits[name] = qubit del platform.qubits[q] - platform.parameters.native_gates.single_qubit[name] = ( - platform.parameters.native_gates.single_qubit[q] - ) - del platform.parameters.native_gates.single_qubit[q] + platform.natives.single_qubit[name] = platform.natives.single_qubit[q] + del platform.natives.single_qubit[q] for q0, q1 in platform.pairs: name = (f"A{q0}", f"A{q1}") try: - platform.parameters.native_gates.two_qubit[name] = ( - platform.parameters.native_gates.two_qubit[(q0, q1)] - ) - del platform.parameters.native_gates.two_qubit[(q0, q1)] + platform.natives.two_qubit[name] = platform.natives.two_qubit[(q0, q1)] + del platform.natives.two_qubit[(q0, q1)] except KeyError: # the symmetrized pair is only present in pairs, not in the natives pass diff --git a/tests/test_compilers_default.py b/tests/test_compilers_default.py index e34794d9f5..0a9e0e106d 100644 --- a/tests/test_compilers_default.py +++ b/tests/test_compilers_default.py @@ -88,7 +88,7 @@ def test_rz_to_sequence(platform): def test_gpi_to_sequence(platform: Platform): - natives = platform.parameters.native_gates + natives = platform.natives circuit = Circuit(1) circuit.add(gates.GPI(0, phi=0.2)) @@ -101,7 +101,7 @@ def test_gpi_to_sequence(platform: Platform): def test_gpi2_to_sequence(platform): - natives = platform.parameters.native_gates + natives = platform.natives circuit = Circuit(1) circuit.add(gates.GPI2(0, phi=0.2)) @@ -116,7 +116,7 @@ def test_gpi2_to_sequence(platform): def test_cz_to_sequence(): platform = create_platform("dummy") - natives = platform.parameters.native_gates + natives = platform.natives circuit = Circuit(3) circuit.add(gates.CZ(1, 2)) @@ -128,7 +128,7 @@ def test_cz_to_sequence(): def test_cnot_to_sequence(): platform = create_platform("dummy") - natives = platform.parameters.native_gates + natives = platform.natives circuit = Circuit(4) circuit.add(gates.CNOT(2, 3)) @@ -139,7 +139,7 @@ def test_cnot_to_sequence(): def test_add_measurement_to_sequence(platform: Platform): - natives = platform.parameters.native_gates + natives = platform.natives circuit = Circuit(1) circuit.add(gates.GPI2(0, 0.1)) @@ -163,7 +163,7 @@ def test_add_measurement_to_sequence(platform: Platform): @pytest.mark.parametrize("delay", [0, 100]) def test_align_delay_measurement(platform: Platform, delay): - natives = platform.parameters.native_gates + natives = platform.natives circuit = Circuit(1) circuit.add(gates.Align(0, delay=delay)) diff --git a/tests/test_dummy.py b/tests/test_dummy.py index 10266a656b..7aa8782fdd 100644 --- a/tests/test_dummy.py +++ b/tests/test_dummy.py @@ -24,7 +24,7 @@ def test_dummy_initialization(platform: Platform): ) def test_dummy_execute_pulse_sequence(platform: Platform, acquisition): nshots = 100 - natives = platform.parameters.native_gates.single_qubit[0] + natives = platform.natives.single_qubit[0] probe_seq = natives.MZ.create_sequence() probe_pulse = probe_seq[0][1] sequence = PulseSequence() @@ -57,7 +57,7 @@ def test_dummy_execute_pulse_sequence_couplers(): platform = create_platform("dummy") sequence = PulseSequence() - natives = platform.parameters.native_gates + natives = platform.natives cz = natives.two_qubit[(1, 2)].CZ.create_sequence() sequence.concatenate(cz) @@ -70,7 +70,7 @@ def test_dummy_execute_pulse_sequence_couplers(): def test_dummy_execute_pulse_sequence_fast_reset(platform: Platform): - natives = platform.parameters.native_gates + natives = platform.natives sequence = PulseSequence() sequence.concatenate(natives.single_qubit[0].MZ.create_sequence()) options = ExecutionParameters(nshots=None, fast_reset=True) @@ -87,7 +87,7 @@ def test_dummy_execute_pulse_sequence_unrolling( nshots = 100 nsequences = 10 platform.instruments["dummy"].UNROLLING_BATCH_SIZE = batch_size - natives = platform.parameters.native_gates + natives = platform.natives sequences = [] sequence = PulseSequence() sequence.concatenate(natives.single_qubit[0].MZ.create_sequence()) @@ -105,7 +105,7 @@ def test_dummy_execute_pulse_sequence_unrolling( def test_dummy_single_sweep_raw(platform: Platform): sequence = PulseSequence() - natives = platform.parameters.native_gates + natives = platform.natives probe_seq = natives.single_qubit[0].MZ.create_sequence() pulse = probe_seq[0][1] @@ -141,7 +141,7 @@ def test_dummy_single_sweep_coupler( ): platform = create_platform("dummy") sequence = PulseSequence() - natives = platform.parameters.native_gates + natives = platform.natives probe_seq = natives.single_qubit[0].MZ.create_sequence() probe_pulse = probe_seq[0][1] coupler_pulse = Pulse.flux( @@ -202,7 +202,7 @@ def test_dummy_single_sweep( platform: Platform, fast_reset, parameter, average, acquisition, nshots ): sequence = PulseSequence() - natives = platform.parameters.native_gates + natives = platform.natives probe_seq = natives.single_qubit[0].MZ.create_sequence() pulse = probe_seq[0][1] if parameter is Parameter.amplitude: @@ -261,7 +261,7 @@ def test_dummy_double_sweep( ): sequence = PulseSequence() pulse = Pulse(duration=40, amplitude=0.1, envelope=Gaussian(rel_sigma=5)) - natives = platform.parameters.native_gates + natives = platform.natives probe_seq = natives.single_qubit[0].MZ.create_sequence() probe_pulse = probe_seq[0][1] sequence.append((platform.get_qubit(0).drive.name, pulse)) @@ -335,7 +335,7 @@ def test_dummy_single_sweep_multiplex( ): sequence = PulseSequence() probe_pulses = {} - natives = platform.parameters.native_gates + natives = platform.natives for qubit in platform.qubits: probe_seq = natives.single_qubit[qubit].MZ.create_sequence() probe_pulses[qubit] = probe_seq[0][1] diff --git a/tests/test_platform.py b/tests/test_platform.py index f2df2cc18d..4572b07dd8 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -34,7 +34,7 @@ def test_unroll_sequences(platform: Platform): qubit = next(iter(platform.qubits.values())) - natives = platform.parameters.native_gates.single_qubit[0] + natives = platform.natives.single_qubit[0] sequence = PulseSequence() sequence.concatenate(natives.RX.create_sequence()) sequence.append((qubit.probe.name, Delay(duration=sequence.duration))) From e6e4927be2d25f9f6e11f9be5072ff50752d0a06 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Sat, 17 Aug 2024 15:28:25 +0200 Subject: [PATCH 0630/1006] feat!: Drop compiler's pseudo-dictionary interface --- src/qibolab/compilers/compiler.py | 38 ++++++++----------------------- 1 file changed, 10 insertions(+), 28 deletions(-) diff --git a/src/qibolab/compilers/compiler.py b/src/qibolab/compilers/compiler.py index a0954d05b8..833057ecfb 100644 --- a/src/qibolab/compilers/compiler.py +++ b/src/qibolab/compilers/compiler.py @@ -19,6 +19,9 @@ from qibolab.pulses import Delay, PulseSequence from qibolab.qubits import QubitId +Rule = Callable[..., PulseSequence] +"""Compiler rule.""" + @dataclass class Compiler: @@ -41,7 +44,7 @@ class Compiler: See :class:`qibolab.compilers.default` for an example of a compiler implementation. """ - rules: dict[type[gates.Gate], Callable] = field(default_factory=dict) + rules: dict[type[gates.Gate], Rule] = field(default_factory=dict) """Map from gates to compilation rules.""" @classmethod @@ -60,28 +63,7 @@ def default(cls): } ) - def __setitem__(self, key: type[gates.Gate], rule: Callable): - """Set a new rule to the compiler. - - If a rule already exists for the gate, it will be overwritten. - """ - self.rules[key] = rule - - def __getitem__(self, item: type[gates.Gate]) -> Callable: - """Get an existing rule for a given gate.""" - try: - return self.rules[item] - except KeyError: - raise KeyError(f"Compiler rule not available for {item}.") - - def __delitem__(self, item: type[gates.Gate]): - """Remove rule for the given gate.""" - try: - del self.rules[item] - except KeyError: - KeyError(f"Cannot remove {item} from compiler because it does not exist.") - - def register(self, gate_cls): + def register(self, gate_cls: type[gates.Gate]) -> Callable[[Rule], Rule]: """Decorator for registering a function as a rule in the compiler. Using this decorator is optional. Alternatively the user can set the rules directly @@ -91,13 +73,13 @@ def register(self, gate_cls): gate_cls: Qibo gate object that the rule will be assigned to. """ - def inner(func): - self[gate_cls] = func + def inner(func: Rule) -> Rule: + self.rules[gate_cls] = func return func return inner - def get_sequence(self, gate: gates.Gate, platform: Platform): + def get_sequence(self, gate: gates.Gate, platform: Platform) -> PulseSequence: """Get pulse sequence implementing the given gate using the registered rules. @@ -106,7 +88,7 @@ def get_sequence(self, gate: gates.Gate, platform: Platform): platform (:class:`qibolab.platform.Platform`): Qibolab platform to read the native gates from. """ # get local sequence for the current gate - rule = self[type(gate)] + rule = self.rules[type(gate)] natives = platform.natives @@ -138,7 +120,7 @@ def get_sequence(self, gate: gates.Gate, platform: Platform): # FIXME: pulse.qubit and pulse.channel do not exist anymore def compile( self, circuit: Circuit, platform: Platform - ) -> tuple[PulseSequence, dict]: + ) -> tuple[PulseSequence, dict[gates.M, PulseSequence]]: """Transforms a circuit to pulse sequence. Args: From 33dc96b4d81d56b9003623a4314dea2a39f9abce Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Sat, 17 Aug 2024 15:34:57 +0200 Subject: [PATCH 0631/1006] docs: Fix doctest for compiler getitem removal --- doc/source/tutorials/compiler.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/tutorials/compiler.rst b/doc/source/tutorials/compiler.rst index af9ad152de..8283c2eb4f 100644 --- a/doc/source/tutorials/compiler.rst +++ b/doc/source/tutorials/compiler.rst @@ -89,7 +89,7 @@ The following example shows how to modify the compiler in order to execute a cir backend = QibolabBackend(platform="dummy") # register the new X rule in the compiler - backend.compiler[gates.X] = x_rule + backend.compiler.rules[gates.X] = x_rule # execute the circuit result = backend.execute_circuit(circuit, nshots=1000) From c52467f4a489349fe943b0808bd9c0931e1ae5c1 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Sat, 17 Aug 2024 18:42:15 +0200 Subject: [PATCH 0632/1006] fix: Simplify missing gates handling --- src/qibolab/compilers/default.py | 16 ++++++---------- src/qibolab/native.py | 30 ++++++++++++++++++++++++++---- 2 files changed, 32 insertions(+), 14 deletions(-) diff --git a/src/qibolab/compilers/default.py b/src/qibolab/compilers/default.py index 55288f5e71..5884ed038c 100644 --- a/src/qibolab/compilers/default.py +++ b/src/qibolab/compilers/default.py @@ -30,17 +30,16 @@ def identity_rule(gate: Gate, natives: SingleQubitNatives) -> PulseSequence: def gpi2_rule(gate: Gate, natives: SingleQubitNatives) -> PulseSequence: """Rule for GPI2.""" - assert natives.RX is not None - return natives.RX.create_sequence(theta=np.pi / 2, phi=gate.parameters[0]) + return natives.ensure("RX").create_sequence(theta=np.pi / 2, phi=gate.parameters[0]) -def gpi_rule(gate: Gate, qubit: Qubit) -> PulseSequence: +def gpi_rule(gate: Gate, natives: SingleQubitNatives) -> PulseSequence: """Rule for GPI.""" # the following definition has a global phase difference compare to # to the matrix representation. See # https://github.com/qiboteam/qibolab/pull/804#pullrequestreview-1890205509 # for more detail. - return qubit.RX.create_sequence(theta=np.pi, phi=gate.parameters[0]) + return natives.ensure("RX").create_sequence(theta=np.pi, phi=gate.parameters[0]) def cz_rule(gate: Gate, natives: TwoQubitNatives) -> PulseSequence: @@ -49,22 +48,19 @@ def cz_rule(gate: Gate, natives: TwoQubitNatives) -> PulseSequence: Applying the CZ gate may involve sending pulses on qubits that the gate is not directly acting on. """ - assert natives.CZ is not None - return natives.CZ.create_sequence() + return natives.ensure("CZ").create_sequence() def cnot_rule(gate: Gate, natives: TwoQubitNatives) -> PulseSequence: """CNOT applied as defined in the platform runcard.""" - assert natives.CNOT is not None - return natives.CNOT.create_sequence() + return natives.ensure("CNOT").create_sequence() def measurement_rule(gate: Gate, natives: list[SingleQubitNatives]) -> PulseSequence: """Measurement gate applied using the platform readout pulse.""" seq = PulseSequence() for qubit in natives: - assert qubit.MZ is not None - seq.concatenate(qubit.MZ.create_sequence()) + seq.concatenate(qubit.ensure("MZ").create_sequence()) return seq diff --git a/src/qibolab/native.py b/src/qibolab/native.py index 3b028e3678..ded928963d 100644 --- a/src/qibolab/native.py +++ b/src/qibolab/native.py @@ -1,3 +1,4 @@ +from abc import ABC, abstractmethod from typing import Annotated, Optional import numpy as np @@ -14,7 +15,13 @@ def _normalize_angles(theta, phi): return theta, phi -class RxyFactory(PulseSequence): +class Native(ABC, PulseSequence): + @abstractmethod + def create_sequence(self, *args, **kwargs) -> PulseSequence: + """Create a sequence for single-qubit rotation.""" + + +class RxyFactory(Native): """Factory for pulse sequences that generate single-qubit rotations around an axis in xy plane. @@ -66,14 +73,29 @@ def create_sequence(self, theta: float = np.pi, phi: float = 0.0) -> PulseSequen ) -class FixedSequenceFactory(PulseSequence): +class FixedSequenceFactory(Native): """Simple factory for a fixed arbitrary sequence.""" def create_sequence(self) -> PulseSequence: return self.copy() -class SingleQubitNatives(Model): +class MissingNative(RuntimeError): + """Missing native gate.""" + + def __init__(self, gate: str): + super().__init__(f"Native gate definition not found, for gate {gate}") + + +class NativeContainer(Model): + def ensure(self, name: str) -> Native: + value = getattr(self, name) + if value is None: + raise MissingNative(value) + return value + + +class SingleQubitNatives(NativeContainer): """Container with the native single-qubit gates acting on a specific qubit.""" @@ -87,7 +109,7 @@ class SingleQubitNatives(Model): """Pulse to activate coupler.""" -class TwoQubitNatives(Model): +class TwoQubitNatives(NativeContainer): """Container with the native two-qubit gates acting on a specific pair of qubits.""" From 4f4e6fcc20da4e83f6a0743f093603f3c6949a9f Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Sat, 17 Aug 2024 19:18:45 +0200 Subject: [PATCH 0633/1006] feat!: Drop topology, in favor of pairs --- src/qibolab/platform/platform.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 6c0a1c7832..e9b82330e7 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -139,14 +139,6 @@ def ordered_pairs(self): """List of qubit pairs that are connected in the QPU.""" return sorted({tuple(sorted(pair)) for pair in self.pairs}) - @property - def topology(self) -> list[QubitPairId]: - """Graph representing the qubit connectivity in the quantum chip. - - Synonym of :attr:`pairs`. - """ - return self.pairs - @property def settings(self) -> Settings: """Container with default execution settings.""" From caa8da772b2128a62c84068751476aded6d20484 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Sat, 17 Aug 2024 19:29:28 +0200 Subject: [PATCH 0634/1006] test: Switch from topology to pairs --- tests/test_platform.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_platform.py b/tests/test_platform.py index 4572b07dd8..7e30fc0878 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -62,7 +62,7 @@ def test_platform_basics(): qubits={}, ) assert str(platform) == "ciao" - assert platform.topology == [] + assert platform.pairs == [] qs = {q: SingleQubitNatives() for q in range(10)} ts = {(q1, q2): TwoQubitNatives() for q1 in range(3) for q2 in range(4, 8)} @@ -79,7 +79,7 @@ def test_platform_basics(): qubits=qs, ) assert str(platform2) == "come va?" - assert (1, 6) in platform2.topology + assert (1, 6) in platform2.pairs def test_create_platform_multipath(tmp_path: Path): From 703bd1929fe4697200ba8ecc5f17b1977c30a25d Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 16 Aug 2024 19:21:41 +0400 Subject: [PATCH 0635/1006] fix: update QM configs to pydantic --- src/qibolab/instruments/qm/components/configs.py | 12 ++++++++---- src/qibolab/instruments/qm/controller.py | 6 ++++++ src/qibolab/serialize.py | 2 +- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/qibolab/instruments/qm/components/configs.py b/src/qibolab/instruments/qm/components/configs.py index 6f6fbc9422..5585dd2491 100644 --- a/src/qibolab/instruments/qm/components/configs.py +++ b/src/qibolab/instruments/qm/components/configs.py @@ -1,4 +1,6 @@ -from dataclasses import dataclass, field +from typing import Literal + +from pydantic import Field from qibolab.components import AcquisitionConfig, DcConfig @@ -8,16 +10,17 @@ ] -@dataclass(frozen=True) class OpxOutputConfig(DcConfig): """DC channel config using QM OPX+.""" + kind: Literal["opx-output"] = "opx-output" + offset: float = 0.0 """DC offset to be applied in V. Possible values are -0.5V to 0.5V. """ - filter: dict[str, float] = field(default_factory=dict) + filter: dict[str, float] = Field(default_factory=dict) """FIR and IIR filters to be applied for correcting signal distortions. See @@ -27,10 +30,11 @@ class OpxOutputConfig(DcConfig): """ -@dataclass(frozen=True) class QmAcquisitionConfig(AcquisitionConfig): """Acquisition config for QM OPX+.""" + kind: Literal["qm-acquisition"] = "qm-acquisition" + gain: int = 0 """Input gain in dB. diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 4f63f643d8..5d0400cdb0 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -215,6 +215,12 @@ def _reset_temporary_calibration(self): shutil.rmtree(self._calibration_path) self._calibration_path = None + def setup(self, *args, **kwargs): + """Complying with abstract instrument interface. + + Not needed for this instrument. + """ + def connect(self): """Connect to the Quantum Machines manager.""" host, port = self.address.split(":") diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index bab6707e17..ed68c9bab4 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -58,7 +58,7 @@ def eq(obj1: BaseModel, obj2: BaseModel) -> bool: class Model(BaseModel): """Global qibolab model, holding common configurations.""" - model_config = ConfigDict(arbitrary_types_allowed=True, extra="forbid", frozen=True) + model_config = ConfigDict(arbitrary_types_allowed=True, extra="allow", frozen=True) M = TypeVar("M", bound=BaseModel) From b0ba6e47afbea8dfe0f181001d4518d015f1c708 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 16 Aug 2024 19:53:54 +0400 Subject: [PATCH 0636/1006] fix: create AnalogOutput because OpxOutputConfig stopped working with asdict --- src/qibolab/instruments/qm/config/config.py | 2 +- src/qibolab/instruments/qm/config/devices.py | 20 +++++++++++++++++--- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/qibolab/instruments/qm/config/config.py b/src/qibolab/instruments/qm/config/config.py index 09abf2375f..7f915d30bb 100644 --- a/src/qibolab/instruments/qm/config/config.py +++ b/src/qibolab/instruments/qm/config/config.py @@ -50,7 +50,7 @@ def add_octave(self, device: str, connectivity: str): def configure_dc_line(self, channel: QmChannel, config: OpxOutputConfig): controller = self.controllers[channel.device] - controller.analog_outputs[channel.port] = config + controller.analog_outputs[channel.port] = AnalogOutput.from_config(config) self.elements[channel.logical_channel.name] = DcElement.from_channel(channel) def configure_iq_line( diff --git a/src/qibolab/instruments/qm/config/devices.py b/src/qibolab/instruments/qm/config/devices.py index 6b088640f0..598b3d1b02 100644 --- a/src/qibolab/instruments/qm/config/devices.py +++ b/src/qibolab/instruments/qm/config/devices.py @@ -5,6 +5,7 @@ from ..components import OpxOutputConfig, QmAcquisitionConfig __all__ = [ + "AnalogOutput", "OctaveOutput", "OctaveInput", "Controller", @@ -31,6 +32,19 @@ def __setitem__(self, key, value): super().__setitem__(str(key), value) +@dataclass(frozen=True) +class AnalogOutput: + offset: float = 0.0 + filter: dict[str, float] = field(default_factory=dict) + + @classmethod + def from_config(cls, config: OpxOutputConfig): + return cls( + offset=config.offset, + filter=config.filter, + ) + + @dataclass(frozen=True) class AnalogInput: offset: float = 0.0 @@ -69,7 +83,7 @@ class OctaveInput: @dataclass class Controller: - analog_outputs: PortDict[str, dict[str, OpxOutputConfig]] = field( + analog_outputs: PortDict[str, dict[str, AnalogOutput]] = field( default_factory=PortDict ) digital_outputs: PortDict[str, dict[str, dict]] = field(default_factory=PortDict) @@ -79,8 +93,8 @@ class Controller: def add_octave_output(self, port: int): # TODO: Add offset here? - self.analog_outputs[2 * port - 1] = OpxOutputConfig() - self.analog_outputs[2 * port] = OpxOutputConfig() + self.analog_outputs[2 * port - 1] = AnalogOutput() + self.analog_outputs[2 * port] = AnalogOutput() self.digital_outputs[2 * port - 1] = {} From 4631ca6c484f215d89b40fcc745c80edcf374b75 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 8 Aug 2024 18:52:42 +0200 Subject: [PATCH 0637/1006] feat: Remove probe filter from sequence --- src/qibolab/pulses/sequence.py | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/qibolab/pulses/sequence.py b/src/qibolab/pulses/sequence.py index 27122f13df..bff37584b8 100644 --- a/src/qibolab/pulses/sequence.py +++ b/src/qibolab/pulses/sequence.py @@ -9,7 +9,7 @@ from qibolab.components import ChannelId -from .pulse import Delay, Pulse, PulseLike +from .pulse import Delay, PulseLike __all__ = ["PulseSequence"] @@ -96,11 +96,3 @@ def trim(self) -> "PulseSequence": terminated.add(ch) new.append((ch, pulse)) return type(self)(reversed(new)) - - @property - def probe_pulses(self) -> list[Pulse]: - """Return list of the readout pulses in this sequence.""" - # pulse filter needed to exclude delays - return [ - pulse for (ch, pulse) in self if isinstance(pulse, Pulse) if "probe" in ch - ] From 42676c790b93ecdab82a187427517879ec6721ed Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 8 Aug 2024 20:27:55 +0200 Subject: [PATCH 0638/1006] fix: Define replacement for probe pulses filter --- src/qibolab/backends.py | 7 +++++-- src/qibolab/instruments/dummy.py | 5 ++++- src/qibolab/platform/__init__.py | 4 ++-- src/qibolab/platform/platform.py | 14 ++++++++++++-- 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/qibolab/backends.py b/src/qibolab/backends.py index b57c69ee9c..d9b5f357cb 100644 --- a/src/qibolab/backends.py +++ b/src/qibolab/backends.py @@ -9,7 +9,7 @@ from qibolab.compilers import Compiler from qibolab.execution_parameters import ExecutionParameters -from qibolab.platform import Platform, create_platform +from qibolab.platform import Platform, create_platform, probe_pulses from qibolab.platform.load import available_platforms from qibolab.version import __version__ as qibolab_version @@ -69,7 +69,10 @@ def assign_measurements(self, measurement_map, readout): containing the readout measurement shots. This is created in ``execute_circuit``. """ for gate, sequence in measurement_map.items(): - _samples = (readout[pulse.id] for pulse in sequence.probe_pulses) + _samples = ( + readout[pulse.id] + for pulse in probe_pulses(sequence, self.platform.configs) + ) samples = list(filter(lambda x: x is not None, _samples)) gate.result.backend = self gate.result.register_samples(np.array(samples).T) diff --git a/src/qibolab/instruments/dummy.py b/src/qibolab/instruments/dummy.py index 5e2774b4b1..1f6c344b2f 100644 --- a/src/qibolab/instruments/dummy.py +++ b/src/qibolab/instruments/dummy.py @@ -4,6 +4,7 @@ from qibo.config import log from qibolab import AcquisitionType, AveragingMode, ExecutionParameters +from qibolab.platform import probe_pulses from qibolab.pulses import PulseSequence from qibolab.pulses.pulse import Pulse from qibolab.sweeper import ParallelSweepers @@ -101,4 +102,6 @@ def values(pulse: Pulse): self.values(options, options.results_shape(sweepers, samples)) ) - return {ro.id: values(ro) for seq in sequences for ro in seq.probe_pulses} + return { + ro.id: values(ro) for seq in sequences for ro in probe_pulses(seq, configs) + } diff --git a/src/qibolab/platform/__init__.py b/src/qibolab/platform/__init__.py index 0b4565f39a..1ab530ce92 100644 --- a/src/qibolab/platform/__init__.py +++ b/src/qibolab/platform/__init__.py @@ -1,4 +1,4 @@ from .load import create_platform -from .platform import Platform, unroll_sequences +from .platform import Platform, probe_pulses, unroll_sequences -__all__ = ["Platform", "create_platform", "unroll_sequences"] +__all__ = ["Platform", "create_platform", "probe_pulses", "unroll_sequences"] diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index e9b82330e7..615653933e 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -10,11 +10,11 @@ from qibo.config import log, raise_error -from qibolab.components import Config +from qibolab.components import Config, AcquireChannel from qibolab.execution_parameters import ExecutionParameters from qibolab.instruments.abstract import Controller, Instrument, InstrumentId from qibolab.parameters import NativeGates, Parameters, Settings, update_configs -from qibolab.pulses import Delay, PulseSequence +from qibolab.pulses import Delay, Pulse, PulseSequence from qibolab.qubits import Qubit, QubitId, QubitPairId from qibolab.sweeper import ParallelSweepers from qibolab.unrolling import Bounds, batch @@ -88,6 +88,16 @@ def _channels_map(elements: QubitMap): return {ch.name: id for id, el in elements.items() for ch in el.channels} +def probe_pulses( + sequence: PulseSequence, configs: dict[str, Config] +) -> Iterable[Pulse]: + """Filter probe pulses.""" + for ch, pulse in sequence: + if isinstance(configs[ch], AcquireChannel): + assert isinstance(pulse, Pulse) + yield pulse + + @dataclass class Platform: """Platform for controlling quantum devices.""" From 68c0a75fb0e53dd06c8a867e8fc3540223567421 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 8 Aug 2024 20:29:20 +0200 Subject: [PATCH 0639/1006] fix: Use bad patch as probe filter for unrolling --- src/qibolab/platform/platform.py | 2 +- src/qibolab/unrolling.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 615653933e..ed9305262a 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -10,7 +10,7 @@ from qibo.config import log, raise_error -from qibolab.components import Config, AcquireChannel +from qibolab.components import AcquireChannel, Config from qibolab.execution_parameters import ExecutionParameters from qibolab.instruments.abstract import Controller, Instrument, InstrumentId from qibolab.parameters import NativeGates, Parameters, Settings, update_configs diff --git a/src/qibolab/unrolling.py b/src/qibolab/unrolling.py index 56d33bad4e..ae3eb88a8b 100644 --- a/src/qibolab/unrolling.py +++ b/src/qibolab/unrolling.py @@ -30,7 +30,8 @@ def _waveform(sequence: PulseSequence): def _readout(sequence: PulseSequence): # TODO: Do we count 1 readout per pulse or 1 readout per multiplexed readout ? - return len(sequence.probe_pulses) + # FIXME: exploitation of non-standard convention for channel names + return sum(1 for ch, p in sequence if "probe" in ch) def _instructions(sequence: PulseSequence): From 7ab470f6a991fa4649472b7e983d0e3b16535184 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 15 Aug 2024 19:38:34 +0200 Subject: [PATCH 0640/1006] revert: Undo probe pulses split In favor of channel ids --- src/qibolab/backends.py | 7 ++----- src/qibolab/instruments/dummy.py | 5 +---- src/qibolab/platform/__init__.py | 4 ++-- src/qibolab/platform/platform.py | 14 ++------------ src/qibolab/pulses/sequence.py | 10 +++++++++- src/qibolab/unrolling.py | 3 +-- 6 files changed, 17 insertions(+), 26 deletions(-) diff --git a/src/qibolab/backends.py b/src/qibolab/backends.py index d9b5f357cb..b57c69ee9c 100644 --- a/src/qibolab/backends.py +++ b/src/qibolab/backends.py @@ -9,7 +9,7 @@ from qibolab.compilers import Compiler from qibolab.execution_parameters import ExecutionParameters -from qibolab.platform import Platform, create_platform, probe_pulses +from qibolab.platform import Platform, create_platform from qibolab.platform.load import available_platforms from qibolab.version import __version__ as qibolab_version @@ -69,10 +69,7 @@ def assign_measurements(self, measurement_map, readout): containing the readout measurement shots. This is created in ``execute_circuit``. """ for gate, sequence in measurement_map.items(): - _samples = ( - readout[pulse.id] - for pulse in probe_pulses(sequence, self.platform.configs) - ) + _samples = (readout[pulse.id] for pulse in sequence.probe_pulses) samples = list(filter(lambda x: x is not None, _samples)) gate.result.backend = self gate.result.register_samples(np.array(samples).T) diff --git a/src/qibolab/instruments/dummy.py b/src/qibolab/instruments/dummy.py index 1f6c344b2f..5e2774b4b1 100644 --- a/src/qibolab/instruments/dummy.py +++ b/src/qibolab/instruments/dummy.py @@ -4,7 +4,6 @@ from qibo.config import log from qibolab import AcquisitionType, AveragingMode, ExecutionParameters -from qibolab.platform import probe_pulses from qibolab.pulses import PulseSequence from qibolab.pulses.pulse import Pulse from qibolab.sweeper import ParallelSweepers @@ -102,6 +101,4 @@ def values(pulse: Pulse): self.values(options, options.results_shape(sweepers, samples)) ) - return { - ro.id: values(ro) for seq in sequences for ro in probe_pulses(seq, configs) - } + return {ro.id: values(ro) for seq in sequences for ro in seq.probe_pulses} diff --git a/src/qibolab/platform/__init__.py b/src/qibolab/platform/__init__.py index 1ab530ce92..0b4565f39a 100644 --- a/src/qibolab/platform/__init__.py +++ b/src/qibolab/platform/__init__.py @@ -1,4 +1,4 @@ from .load import create_platform -from .platform import Platform, probe_pulses, unroll_sequences +from .platform import Platform, unroll_sequences -__all__ = ["Platform", "create_platform", "probe_pulses", "unroll_sequences"] +__all__ = ["Platform", "create_platform", "unroll_sequences"] diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index ed9305262a..e9b82330e7 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -10,11 +10,11 @@ from qibo.config import log, raise_error -from qibolab.components import AcquireChannel, Config +from qibolab.components import Config from qibolab.execution_parameters import ExecutionParameters from qibolab.instruments.abstract import Controller, Instrument, InstrumentId from qibolab.parameters import NativeGates, Parameters, Settings, update_configs -from qibolab.pulses import Delay, Pulse, PulseSequence +from qibolab.pulses import Delay, PulseSequence from qibolab.qubits import Qubit, QubitId, QubitPairId from qibolab.sweeper import ParallelSweepers from qibolab.unrolling import Bounds, batch @@ -88,16 +88,6 @@ def _channels_map(elements: QubitMap): return {ch.name: id for id, el in elements.items() for ch in el.channels} -def probe_pulses( - sequence: PulseSequence, configs: dict[str, Config] -) -> Iterable[Pulse]: - """Filter probe pulses.""" - for ch, pulse in sequence: - if isinstance(configs[ch], AcquireChannel): - assert isinstance(pulse, Pulse) - yield pulse - - @dataclass class Platform: """Platform for controlling quantum devices.""" diff --git a/src/qibolab/pulses/sequence.py b/src/qibolab/pulses/sequence.py index bff37584b8..27122f13df 100644 --- a/src/qibolab/pulses/sequence.py +++ b/src/qibolab/pulses/sequence.py @@ -9,7 +9,7 @@ from qibolab.components import ChannelId -from .pulse import Delay, PulseLike +from .pulse import Delay, Pulse, PulseLike __all__ = ["PulseSequence"] @@ -96,3 +96,11 @@ def trim(self) -> "PulseSequence": terminated.add(ch) new.append((ch, pulse)) return type(self)(reversed(new)) + + @property + def probe_pulses(self) -> list[Pulse]: + """Return list of the readout pulses in this sequence.""" + # pulse filter needed to exclude delays + return [ + pulse for (ch, pulse) in self if isinstance(pulse, Pulse) if "probe" in ch + ] diff --git a/src/qibolab/unrolling.py b/src/qibolab/unrolling.py index ae3eb88a8b..56d33bad4e 100644 --- a/src/qibolab/unrolling.py +++ b/src/qibolab/unrolling.py @@ -30,8 +30,7 @@ def _waveform(sequence: PulseSequence): def _readout(sequence: PulseSequence): # TODO: Do we count 1 readout per pulse or 1 readout per multiplexed readout ? - # FIXME: exploitation of non-standard convention for channel names - return sum(1 for ch, p in sequence if "probe" in ch) + return len(sequence.probe_pulses) def _instructions(sequence: PulseSequence): From 0ac22609b94234a7c70ab753e614ccf2d36ef087 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 15 Aug 2024 20:12:06 +0200 Subject: [PATCH 0641/1006] refactor: Lift sequence out of the pulses module --- doc/source/getting-started/experiment.rst | 2 +- doc/source/main-documentation/qibolab.rst | 8 +++++--- doc/source/tutorials/calibration.rst | 8 +++++--- doc/source/tutorials/compiler.rst | 2 +- doc/source/tutorials/lab.rst | 6 ++++-- doc/source/tutorials/pulses.rst | 3 ++- examples/minimum_working_example.py | 3 ++- extras/test819.py | 2 +- src/qibolab/compilers/compiler.py | 3 ++- src/qibolab/compilers/default.py | 3 ++- src/qibolab/instruments/abstract.py | 2 +- src/qibolab/instruments/dummy.py | 4 ++-- src/qibolab/instruments/emulator/pulse_simulator.py | 2 +- src/qibolab/instruments/icarusqfpga.py | 3 ++- src/qibolab/instruments/qblox/cluster_qcm_bb.py | 3 ++- src/qibolab/instruments/qblox/cluster_qcm_rf.py | 3 ++- src/qibolab/instruments/qblox/cluster_qrm_rf.py | 3 ++- src/qibolab/instruments/qblox/controller.py | 2 +- src/qibolab/instruments/qblox/sequencer.py | 3 ++- src/qibolab/instruments/qm/controller.py | 3 ++- src/qibolab/instruments/qm/program/arguments.py | 2 +- src/qibolab/instruments/qm/program/instructions.py | 3 ++- src/qibolab/instruments/rfsoc/convert.py | 3 ++- src/qibolab/instruments/rfsoc/driver.py | 2 +- src/qibolab/instruments/zhinst/executor.py | 3 ++- src/qibolab/native.py | 3 ++- src/qibolab/platform/platform.py | 5 +++-- src/qibolab/pulses/__init__.py | 3 +-- src/qibolab/pulses/plot.py | 3 ++- src/qibolab/{pulses => }/sequence.py | 2 +- src/qibolab/sweeper.py | 2 +- src/qibolab/unrolling.py | 3 ++- tests/conftest.py | 2 +- tests/pulses/test_plot.py | 2 +- tests/pulses/test_sequence.py | 3 ++- tests/test_compilers_default.py | 3 ++- tests/test_dummy.py | 3 ++- tests/test_emulator.py | 2 +- tests/test_instruments_qblox_cluster_qcm_bb.py | 2 +- tests/test_instruments_qblox_cluster_qcm_rf.py | 2 +- tests/test_instruments_qblox_cluster_qrm_rf.py | 2 +- tests/test_instruments_qblox_controller.py | 3 ++- tests/test_instruments_qm.py | 3 ++- tests/test_instruments_qmsim.py | 3 ++- tests/test_instruments_rfsoc.py | 3 ++- tests/test_instruments_zhinst.py | 12 ++---------- tests/test_native.py | 2 +- tests/test_platform.py | 3 ++- tests/test_unrolling.py | 3 ++- 49 files changed, 89 insertions(+), 66 deletions(-) rename src/qibolab/{pulses => }/sequence.py (98%) diff --git a/doc/source/getting-started/experiment.rst b/doc/source/getting-started/experiment.rst index 40f6d2a392..f3c3dd04c2 100644 --- a/doc/source/getting-started/experiment.rst +++ b/doc/source/getting-started/experiment.rst @@ -203,7 +203,7 @@ We leave to the dedicated tutorial a full explanation of the experiment, but her import matplotlib.pyplot as plt from qibolab import create_platform - from qibolab.pulses import PulseSequence + from qibolab.sequence import PulseSequence from qibolab.result import magnitude from qibolab.sweeper import Sweeper, SweeperType, Parameter from qibolab.execution_parameters import ( diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index ec4b3758b7..44cb96fc47 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -63,7 +63,8 @@ Now we can create a simple sequence (again, without explicitly giving any qubit .. testcode:: python - from qibolab.pulses import PulseSequence, Delay + from qibolab.pulses import Delay + from qibolab.sequence import PulseSequence import numpy as np ps = PulseSequence() @@ -276,7 +277,7 @@ To organize pulses into sequences, Qibolab provides the :class:`qibolab.pulses.P .. testcode:: python - from qibolab.pulses import PulseSequence + from qibolab.sequence import PulseSequence pulse1 = Pulse( @@ -460,7 +461,8 @@ For example: .. testcode:: python - from qibolab.pulses import PulseSequence, Delay + from qibolab.pulses import Delay + from qibolab.sequence import PulseSequence qubit = platform.qubits[0] natives = platform.natives.single_qubit[0] diff --git a/doc/source/tutorials/calibration.rst b/doc/source/tutorials/calibration.rst index 71fd99c6fe..560ae59a2b 100644 --- a/doc/source/tutorials/calibration.rst +++ b/doc/source/tutorials/calibration.rst @@ -30,7 +30,7 @@ around the pre-defined frequency. import numpy as np from qibolab import create_platform - from qibolab.pulses import PulseSequence + from qibolab.sequence import PulseSequence from qibolab.result import magnitude from qibolab.sweeper import Sweeper, SweeperType, Parameter from qibolab.execution_parameters import ( @@ -111,7 +111,8 @@ complex pulse sequence. Therefore with start with that: import numpy as np import matplotlib.pyplot as plt from qibolab import create_platform - from qibolab.pulses import Pulse, PulseSequence, Delay, Gaussian + from qibolab.pulses import Pulse, Delay, Gaussian + from qibolab.sequence import PulseSequence from qibolab.result import magnitude from qibolab.sweeper import Sweeper, SweeperType, Parameter from qibolab.execution_parameters import ( @@ -215,7 +216,8 @@ and its impact on qubit states in the IQ plane. import numpy as np import matplotlib.pyplot as plt from qibolab import create_platform - from qibolab.pulses import PulseSequence, Delay + from qibolab.pulses import Delay + from qibolab.sequence import PulseSequence from qibolab.result import unpack from qibolab.sweeper import Sweeper, SweeperType, Parameter from qibolab.execution_parameters import ( diff --git a/doc/source/tutorials/compiler.rst b/doc/source/tutorials/compiler.rst index 8283c2eb4f..1396188c06 100644 --- a/doc/source/tutorials/compiler.rst +++ b/doc/source/tutorials/compiler.rst @@ -71,7 +71,7 @@ The following example shows how to modify the compiler in order to execute a cir from qibo import gates from qibo.models import Circuit from qibolab.backends import QibolabBackend - from qibolab.pulses import PulseSequence + from qibolab.sequence import PulseSequence # define the circuit circuit = Circuit(1) diff --git a/doc/source/tutorials/lab.rst b/doc/source/tutorials/lab.rst index 781e688d86..22fcfb8b72 100644 --- a/doc/source/tutorials/lab.rst +++ b/doc/source/tutorials/lab.rst @@ -106,7 +106,8 @@ the native gates, but separately from the single-qubit ones. from qibolab.components import IqChannel, AcquireChannel, DcChannel, IqConfig from qibolab.qubits import Qubit from qibolab.parameters import Parameters, TwoQubitContainer - from qibolab.pulses import Gaussian, Pulse, PulseSequence, Rectangular + from qibolab.pulses import Gaussian, Pulse, Rectangular + from qibolab.sequence import PulseSequence from qibolab.native import ( RxyFactory, FixedSequenceFactory, @@ -207,7 +208,8 @@ will take them into account when calling :class:`qibolab.native.TwoQubitNatives` from qibolab.components import DcChannel from qibolab.qubits import Qubit - from qibolab.pulses import Pulse, PulseSequence + from qibolab.pulses import Pulse + from qibolab.sequence import PulseSequence from qibolab.native import ( FixedSequenceFactory, SingleQubitNatives, diff --git a/doc/source/tutorials/pulses.rst b/doc/source/tutorials/pulses.rst index a5945d1190..76cfae4f9b 100644 --- a/doc/source/tutorials/pulses.rst +++ b/doc/source/tutorials/pulses.rst @@ -8,7 +8,8 @@ pulses (:class:`qibolab.pulses.Pulse`) through the .. testcode:: python - from qibolab.pulses import Pulse, PulseSequence, Rectangular, Gaussian, Delay + from qibolab.pulses import Pulse, Rectangular, Gaussian, Delay + from qibolab.sequence import PulseSequence # Define PulseSequence sequence = PulseSequence( diff --git a/examples/minimum_working_example.py b/examples/minimum_working_example.py index 58c8f367ae..b33cdf6629 100644 --- a/examples/minimum_working_example.py +++ b/examples/minimum_working_example.py @@ -1,6 +1,7 @@ from qibolab import create_platform from qibolab.paths import qibolab_folder -from qibolab.pulses import Pulse, PulseSequence, ReadoutPulse +from qibolab.pulses import Pulse, ReadoutPulse +from qibolab.sequence import PulseSequence # Define PulseSequence sequence = PulseSequence() diff --git a/extras/test819.py b/extras/test819.py index 6d0ce15ef1..b4f43cdfc1 100644 --- a/extras/test819.py +++ b/extras/test819.py @@ -9,7 +9,7 @@ ) from qibolab.instruments.qblox.controller import QbloxController from qibolab.platform import NS_TO_SEC -from qibolab.pulses import PulseSequence +from qibolab.sequence import PulseSequence from qibolab.sweeper import Parameter, Sweeper, SweeperType GlobalBackend.set_backend("qibolab", "spinq10q") diff --git a/src/qibolab/compilers/compiler.py b/src/qibolab/compilers/compiler.py index 833057ecfb..c1347b5f6c 100644 --- a/src/qibolab/compilers/compiler.py +++ b/src/qibolab/compilers/compiler.py @@ -16,8 +16,9 @@ z_rule, ) from qibolab.platform import Platform -from qibolab.pulses import Delay, PulseSequence +from qibolab.pulses import Delay from qibolab.qubits import QubitId +from qibolab.sequence import PulseSequence Rule = Callable[..., PulseSequence] """Compiler rule.""" diff --git a/src/qibolab/compilers/default.py b/src/qibolab/compilers/default.py index 5884ed038c..06b3f6c3b9 100644 --- a/src/qibolab/compilers/default.py +++ b/src/qibolab/compilers/default.py @@ -9,8 +9,9 @@ from qibo.gates import Align, Gate from qibolab.native import SingleQubitNatives, TwoQubitNatives -from qibolab.pulses import Delay, PulseSequence, VirtualZ +from qibolab.pulses import Delay, VirtualZ from qibolab.qubits import Qubit +from qibolab.sequence import PulseSequence def z_rule(gate: Gate, qubit: Qubit) -> PulseSequence: diff --git a/src/qibolab/instruments/abstract.py b/src/qibolab/instruments/abstract.py index bee8f98cac..2b6a278de6 100644 --- a/src/qibolab/instruments/abstract.py +++ b/src/qibolab/instruments/abstract.py @@ -6,7 +6,7 @@ from qibolab.components import Config from qibolab.execution_parameters import ExecutionParameters -from qibolab.pulses.sequence import PulseSequence +from qibolab.sequence import PulseSequence from qibolab.sweeper import ParallelSweepers InstrumentId = str diff --git a/src/qibolab/instruments/dummy.py b/src/qibolab/instruments/dummy.py index 5e2774b4b1..f5629764c6 100644 --- a/src/qibolab/instruments/dummy.py +++ b/src/qibolab/instruments/dummy.py @@ -4,8 +4,8 @@ from qibo.config import log from qibolab import AcquisitionType, AveragingMode, ExecutionParameters -from qibolab.pulses import PulseSequence -from qibolab.pulses.pulse import Pulse +from qibolab.pulses import Pulse +from qibolab.sequence import PulseSequence from qibolab.sweeper import ParallelSweepers from qibolab.unrolling import Bounds diff --git a/src/qibolab/instruments/emulator/pulse_simulator.py b/src/qibolab/instruments/emulator/pulse_simulator.py index f985f0fb5d..35d848ef21 100644 --- a/src/qibolab/instruments/emulator/pulse_simulator.py +++ b/src/qibolab/instruments/emulator/pulse_simulator.py @@ -12,9 +12,9 @@ from qibolab.instruments.abstract import Controller from qibolab.instruments.emulator.engines.qutip_engine import QutipSimulator from qibolab.instruments.emulator.models import general_no_coupler_model -from qibolab.pulses import PulseSequence from qibolab.qubits import Qubit, QubitId from qibolab.result import average, collect +from qibolab.sequence import PulseSequence from qibolab.sweeper import Parameter, Sweeper, SweeperType AVAILABLE_SWEEP_PARAMETERS = { diff --git a/src/qibolab/instruments/icarusqfpga.py b/src/qibolab/instruments/icarusqfpga.py index 148ba0d307..ab620d4a92 100644 --- a/src/qibolab/instruments/icarusqfpga.py +++ b/src/qibolab/instruments/icarusqfpga.py @@ -13,9 +13,10 @@ ExecutionParameters, ) from qibolab.instruments.abstract import Controller -from qibolab.pulses import Pulse, PulseSequence +from qibolab.pulses import Pulse from qibolab.qubits import Qubit, QubitId from qibolab.result import average, average_iq, collect +from qibolab.sequence import PulseSequence from qibolab.sweeper import Parameter, Sweeper, SweeperType DAC_SAMPLNG_RATE_MHZ = 5898.24 diff --git a/src/qibolab/instruments/qblox/cluster_qcm_bb.py b/src/qibolab/instruments/qblox/cluster_qcm_bb.py index 7677b8ef48..cfe9761fad 100644 --- a/src/qibolab/instruments/qblox/cluster_qcm_bb.py +++ b/src/qibolab/instruments/qblox/cluster_qcm_bb.py @@ -18,7 +18,8 @@ ) from qibolab.instruments.qblox.sequencer import Sequencer, WaveformsBuffer from qibolab.instruments.qblox.sweeper import QbloxSweeper, QbloxSweeperType -from qibolab.pulses import Pulse, PulseSequence +from qibolab.pulses import Pulse +from qibolab.sequence import PulseSequence from qibolab.sweeper import Parameter, Sweeper, SweeperType diff --git a/src/qibolab/instruments/qblox/cluster_qcm_rf.py b/src/qibolab/instruments/qblox/cluster_qcm_rf.py index e0ba55dd17..2cdb4ea67b 100644 --- a/src/qibolab/instruments/qblox/cluster_qcm_rf.py +++ b/src/qibolab/instruments/qblox/cluster_qcm_rf.py @@ -18,7 +18,8 @@ ) from qibolab.instruments.qblox.sequencer import Sequencer, WaveformsBuffer from qibolab.instruments.qblox.sweeper import QbloxSweeper, QbloxSweeperType -from qibolab.pulses import Pulse, PulseSequence +from qibolab.pulses import Pulse +from qibolab.sequence import PulseSequence from qibolab.sweeper import Parameter, Sweeper, SweeperType diff --git a/src/qibolab/instruments/qblox/cluster_qrm_rf.py b/src/qibolab/instruments/qblox/cluster_qrm_rf.py index 97783324d0..4c70faff72 100644 --- a/src/qibolab/instruments/qblox/cluster_qrm_rf.py +++ b/src/qibolab/instruments/qblox/cluster_qrm_rf.py @@ -10,7 +10,8 @@ from qblox_instruments.qcodes_drivers.module import Module from qibo.config import log -from qibolab.pulses import Pulse, PulseSequence +from qibolab.pulses import Pulse +from qibolab.sequence import PulseSequence from qibolab.sweeper import Parameter, Sweeper, SweeperType from .acquisition import AveragedAcquisition, DemodulatedAcquisition diff --git a/src/qibolab/instruments/qblox/controller.py b/src/qibolab/instruments/qblox/controller.py index 35fc17fb20..a1ccc32c8b 100644 --- a/src/qibolab/instruments/qblox/controller.py +++ b/src/qibolab/instruments/qblox/controller.py @@ -11,7 +11,7 @@ from qibolab.instruments.qblox.cluster_qcm_rf import QcmRf from qibolab.instruments.qblox.cluster_qrm_rf import QrmRf from qibolab.instruments.qblox.sequencer import SAMPLING_RATE -from qibolab.pulses import PulseSequence +from qibolab.sequence import PulseSequence from qibolab.sweeper import Parameter, Sweeper, SweeperType from qibolab.unrolling import Bounds diff --git a/src/qibolab/instruments/qblox/sequencer.py b/src/qibolab/instruments/qblox/sequencer.py index 706f2d2e86..f52945813a 100644 --- a/src/qibolab/instruments/qblox/sequencer.py +++ b/src/qibolab/instruments/qblox/sequencer.py @@ -4,8 +4,9 @@ from qblox_instruments.qcodes_drivers.sequencer import Sequencer as QbloxSequencer from qibolab.instruments.qblox.q1asm import Program -from qibolab.pulses import Pulse, PulseSequence +from qibolab.pulses import Pulse from qibolab.pulses.modulation import modulate +from qibolab.sequence import PulseSequence from qibolab.sweeper import Parameter, Sweeper SAMPLING_RATE = 1 diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 5d0400cdb0..38ad2ad541 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -14,7 +14,8 @@ from qibolab.components import Channel, ChannelId, Config, DcChannel, IqChannel from qibolab.execution_parameters import ExecutionParameters from qibolab.instruments.abstract import Controller -from qibolab.pulses import Delay, Pulse, PulseSequence, VirtualZ +from qibolab.pulses import Delay, Pulse, VirtualZ +from qibolab.sequence import PulseSequence from qibolab.sweeper import ParallelSweepers, Parameter from qibolab.unrolling import Bounds diff --git a/src/qibolab/instruments/qm/program/arguments.py b/src/qibolab/instruments/qm/program/arguments.py index efd3869759..f0059c1499 100644 --- a/src/qibolab/instruments/qm/program/arguments.py +++ b/src/qibolab/instruments/qm/program/arguments.py @@ -4,7 +4,7 @@ from qm.qua._dsl import _Variable # for type declaration only -from qibolab.pulses import PulseSequence +from qibolab.sequence import PulseSequence from .acquisition import Acquisition diff --git a/src/qibolab/instruments/qm/program/instructions.py b/src/qibolab/instruments/qm/program/instructions.py index 57120ae111..e689e5b55a 100644 --- a/src/qibolab/instruments/qm/program/instructions.py +++ b/src/qibolab/instruments/qm/program/instructions.py @@ -6,7 +6,8 @@ from qibolab.components import Config from qibolab.execution_parameters import AcquisitionType, ExecutionParameters -from qibolab.pulses import Delay, PulseSequence +from qibolab.pulses import Delay +from qibolab.sequence import PulseSequence from qibolab.sweeper import ParallelSweepers from ..config import operation diff --git a/src/qibolab/instruments/rfsoc/convert.py b/src/qibolab/instruments/rfsoc/convert.py index c858e46f70..9d23c37308 100644 --- a/src/qibolab/instruments/rfsoc/convert.py +++ b/src/qibolab/instruments/rfsoc/convert.py @@ -8,8 +8,9 @@ import qibosoq.components.base as rfsoc import qibosoq.components.pulses as rfsoc_pulses -from qibolab.pulses import Envelope, Pulse, PulseSequence +from qibolab.pulses import Envelope, Pulse from qibolab.qubits import Qubit +from qibolab.sequence import PulseSequence from qibolab.sweeper import BIAS, DURATION, Parameter, Sweeper HZ_TO_MHZ = 1e-6 diff --git a/src/qibolab/instruments/rfsoc/driver.py b/src/qibolab/instruments/rfsoc/driver.py index 397216e5fd..fdfa81c3e6 100644 --- a/src/qibolab/instruments/rfsoc/driver.py +++ b/src/qibolab/instruments/rfsoc/driver.py @@ -11,8 +11,8 @@ from qibolab import AcquisitionType, AveragingMode, ExecutionParameters from qibolab.instruments.abstract import Controller -from qibolab.pulses import PulseSequence from qibolab.qubits import Qubit +from qibolab.sequence import PulseSequence from qibolab.sweeper import BIAS, Sweeper from .convert import convert, convert_units_sweeper diff --git a/src/qibolab/instruments/zhinst/executor.py b/src/qibolab/instruments/zhinst/executor.py index 33cf8c858a..c6e000b3de 100644 --- a/src/qibolab/instruments/zhinst/executor.py +++ b/src/qibolab/instruments/zhinst/executor.py @@ -10,7 +10,8 @@ from qibolab import AcquisitionType, AveragingMode, ExecutionParameters from qibolab.instruments.abstract import Controller -from qibolab.pulses import Delay, Pulse, PulseSequence +from qibolab.pulses import Delay, Pulse +from qibolab.sequence import PulseSequence from qibolab.sweeper import Parameter, Sweeper from qibolab.unrolling import Bounds diff --git a/src/qibolab/native.py b/src/qibolab/native.py index ded928963d..a2bed8eee1 100644 --- a/src/qibolab/native.py +++ b/src/qibolab/native.py @@ -3,7 +3,8 @@ import numpy as np -from .pulses import Drag, Gaussian, Pulse, PulseSequence +from .pulses import Drag, Gaussian, Pulse +from .sequence import PulseSequence from .serialize import Model, replace diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index e9b82330e7..13b8c87238 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -14,8 +14,9 @@ from qibolab.execution_parameters import ExecutionParameters from qibolab.instruments.abstract import Controller, Instrument, InstrumentId from qibolab.parameters import NativeGates, Parameters, Settings, update_configs -from qibolab.pulses import Delay, PulseSequence +from qibolab.pulses import Delay from qibolab.qubits import Qubit, QubitId, QubitPairId +from qibolab.sequence import PulseSequence from qibolab.sweeper import ParallelSweepers from qibolab.unrolling import Bounds, batch @@ -252,7 +253,7 @@ def execute( import numpy as np from qibolab.dummy import create_dummy from qibolab.sweeper import Sweeper, Parameter - from qibolab.pulses import PulseSequence + from qibolab.sequence import PulseSequence from qibolab.execution_parameters import ExecutionParameters diff --git a/src/qibolab/pulses/__init__.py b/src/qibolab/pulses/__init__.py index 2eac3de07f..658eac19ce 100644 --- a/src/qibolab/pulses/__init__.py +++ b/src/qibolab/pulses/__init__.py @@ -1,3 +1,2 @@ from .envelope import * -from .pulse import Delay, Pulse, VirtualZ -from .sequence import PulseSequence +from .pulse import Delay, Pulse, PulseLike, VirtualZ diff --git a/src/qibolab/pulses/plot.py b/src/qibolab/pulses/plot.py index 7b3926a464..bf881d9728 100644 --- a/src/qibolab/pulses/plot.py +++ b/src/qibolab/pulses/plot.py @@ -6,10 +6,11 @@ import matplotlib.pyplot as plt import numpy as np +from qibolab.sequence import PulseSequence + from .envelope import Waveform from .modulation import modulate from .pulse import Delay, Pulse, VirtualZ -from .sequence import PulseSequence SAMPLING_RATE = 1 """Default sampling rate in gigasamples per second (GSps). diff --git a/src/qibolab/pulses/sequence.py b/src/qibolab/sequence.py similarity index 98% rename from src/qibolab/pulses/sequence.py rename to src/qibolab/sequence.py index 27122f13df..2134b4931d 100644 --- a/src/qibolab/pulses/sequence.py +++ b/src/qibolab/sequence.py @@ -9,7 +9,7 @@ from qibolab.components import ChannelId -from .pulse import Delay, Pulse, PulseLike +from .pulses import Delay, Pulse, PulseLike __all__ = ["PulseSequence"] diff --git a/src/qibolab/sweeper.py b/src/qibolab/sweeper.py index 4db5b2b6c2..b0792c4b56 100644 --- a/src/qibolab/sweeper.py +++ b/src/qibolab/sweeper.py @@ -60,7 +60,7 @@ class Sweeper: import numpy as np from qibolab.dummy import create_dummy from qibolab.sweeper import Sweeper, Parameter - from qibolab.pulses import PulseSequence + from qibolab.sequence import PulseSequence from qibolab import ExecutionParameters diff --git a/src/qibolab/unrolling.py b/src/qibolab/unrolling.py index 56d33bad4e..8eefafbbe6 100644 --- a/src/qibolab/unrolling.py +++ b/src/qibolab/unrolling.py @@ -9,8 +9,9 @@ from qibolab.components.configs import BoundsConfig from qibolab.serialize import Model -from .pulses import Pulse, PulseSequence +from .pulses import Pulse from .pulses.envelope import Rectangular +from .sequence import PulseSequence def _waveform(sequence: PulseSequence): diff --git a/tests/conftest.py b/tests/conftest.py index 2fb51d3079..eea497b27f 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -15,7 +15,7 @@ create_platform, ) from qibolab.platform.load import PLATFORMS -from qibolab.pulses import PulseSequence +from qibolab.sequence import PulseSequence from qibolab.sweeper import ParallelSweepers, Parameter, Sweeper ORIGINAL_PLATFORMS = os.environ.get(PLATFORMS, "") diff --git a/tests/pulses/test_plot.py b/tests/pulses/test_plot.py index ec1150c834..baf542b910 100644 --- a/tests/pulses/test_plot.py +++ b/tests/pulses/test_plot.py @@ -10,12 +10,12 @@ GaussianSquare, Iir, Pulse, - PulseSequence, Rectangular, Snz, plot, ) from qibolab.pulses.modulation import modulate +from qibolab.sequence import PulseSequence HERE = pathlib.Path(__file__).parent SAMPLING_RATE = 1 diff --git a/tests/pulses/test_sequence.py b/tests/pulses/test_sequence.py index 718b526f24..71de22f40a 100644 --- a/tests/pulses/test_sequence.py +++ b/tests/pulses/test_sequence.py @@ -1,5 +1,6 @@ -from qibolab.pulses import Delay, Drag, Gaussian, Pulse, PulseSequence, Rectangular +from qibolab.pulses import Delay, Drag, Gaussian, Pulse, Rectangular from qibolab.pulses.pulse import VirtualZ +from qibolab.sequence import PulseSequence def test_init(): diff --git a/tests/test_compilers_default.py b/tests/test_compilers_default.py index 0a9e0e106d..e667e45acb 100644 --- a/tests/test_compilers_default.py +++ b/tests/test_compilers_default.py @@ -7,7 +7,8 @@ from qibolab import create_platform from qibolab.compilers import Compiler from qibolab.platform import Platform -from qibolab.pulses import Delay, PulseSequence +from qibolab.pulses import Delay +from qibolab.sequence import PulseSequence def generate_circuit_with_gate(nqubits, gate, *params, **kwargs): diff --git a/tests/test_dummy.py b/tests/test_dummy.py index 7aa8782fdd..ac929731b4 100644 --- a/tests/test_dummy.py +++ b/tests/test_dummy.py @@ -3,7 +3,8 @@ from qibolab import AcquisitionType, AveragingMode, ExecutionParameters, create_platform from qibolab.platform.platform import Platform -from qibolab.pulses import Delay, Gaussian, GaussianSquare, Pulse, PulseSequence +from qibolab.pulses import Delay, Gaussian, GaussianSquare, Pulse +from qibolab.sequence import PulseSequence from qibolab.sweeper import ChannelParameter, Parameter, Sweeper SWEPT_POINTS = 5 diff --git a/tests/test_emulator.py b/tests/test_emulator.py index 9c32d40f00..f2f2bbca90 100644 --- a/tests/test_emulator.py +++ b/tests/test_emulator.py @@ -18,7 +18,7 @@ ) from qibolab.instruments.emulator.pulse_simulator import AVAILABLE_SWEEP_PARAMETERS from qibolab.platform.load import PLATFORMS -from qibolab.pulses import PulseSequence +from qibolab.sequence import PulseSequence from qibolab.sweeper import ChannelParameter, Parameter, Sweeper os.environ[PLATFORMS] = str(pathlib.Path(__file__).parent / "emulators/") diff --git a/tests/test_instruments_qblox_cluster_qcm_bb.py b/tests/test_instruments_qblox_cluster_qcm_bb.py index cf1c8d6430..17215e3289 100644 --- a/tests/test_instruments_qblox_cluster_qcm_bb.py +++ b/tests/test_instruments_qblox_cluster_qcm_bb.py @@ -6,7 +6,7 @@ from qibolab.instruments.abstract import Instrument from qibolab.instruments.qblox.cluster_qcm_bb import QcmBb from qibolab.instruments.qblox.port import QbloxOutputPort -from qibolab.pulses import PulseSequence +from qibolab.sequence import PulseSequence from qibolab.sweeper import Parameter, Sweeper, SweeperType from .qblox_fixtures import connected_controller, controller diff --git a/tests/test_instruments_qblox_cluster_qcm_rf.py b/tests/test_instruments_qblox_cluster_qcm_rf.py index 468eadd350..3c387c6a45 100644 --- a/tests/test_instruments_qblox_cluster_qcm_rf.py +++ b/tests/test_instruments_qblox_cluster_qcm_rf.py @@ -4,7 +4,7 @@ from qibolab.instruments.abstract import Instrument from qibolab.instruments.qblox.cluster_qcm_rf import QcmRf from qibolab.instruments.qblox.port import QbloxOutputPort -from qibolab.pulses import PulseSequence +from qibolab.sequence import PulseSequence from qibolab.sweeper import Parameter, Sweeper, SweeperType from .qblox_fixtures import connected_controller, controller diff --git a/tests/test_instruments_qblox_cluster_qrm_rf.py b/tests/test_instruments_qblox_cluster_qrm_rf.py index 86199ab603..158c2c1afd 100644 --- a/tests/test_instruments_qblox_cluster_qrm_rf.py +++ b/tests/test_instruments_qblox_cluster_qrm_rf.py @@ -4,7 +4,7 @@ from qibolab.instruments.abstract import Instrument from qibolab.instruments.qblox.cluster_qrm_rf import QrmRf from qibolab.instruments.qblox.port import QbloxInputPort, QbloxOutputPort -from qibolab.pulses import PulseSequence +from qibolab.sequence import PulseSequence from qibolab.sweeper import Parameter, Sweeper, SweeperType from .qblox_fixtures import connected_controller, controller diff --git a/tests/test_instruments_qblox_controller.py b/tests/test_instruments_qblox_controller.py index 601154d312..9fd211d6e8 100644 --- a/tests/test_instruments_qblox_controller.py +++ b/tests/test_instruments_qblox_controller.py @@ -5,7 +5,8 @@ from qibolab import AveragingMode, ExecutionParameters from qibolab.instruments.qblox.controller import MAX_NUM_BINS, QbloxController -from qibolab.pulses import Gaussian, Pulse, PulseSequence, Rectangular +from qibolab.pulses import Gaussian, Pulse, Rectangular +from qibolab.sequence import PulseSequence from qibolab.sweeper import Parameter, Sweeper from .qblox_fixtures import connected_controller, controller diff --git a/tests/test_instruments_qm.py b/tests/test_instruments_qm.py index b089800ee4..e9aa0964e6 100644 --- a/tests/test_instruments_qm.py +++ b/tests/test_instruments_qm.py @@ -6,8 +6,9 @@ from qibolab import AcquisitionType, ExecutionParameters, create_platform from qibolab.instruments.qm import QmController -from qibolab.pulses import Pulse, PulseSequence, Rectangular +from qibolab.pulses import Pulse, Rectangular from qibolab.qubits import Qubit +from qibolab.sequence import PulseSequence from qibolab.sweeper import Parameter, Sweeper from .conftest import set_platform_profile diff --git a/tests/test_instruments_qmsim.py b/tests/test_instruments_qmsim.py index ceea34f9d8..e3dd2b4ae4 100644 --- a/tests/test_instruments_qmsim.py +++ b/tests/test_instruments_qmsim.py @@ -23,7 +23,8 @@ from qibolab import AcquisitionType, AveragingMode, ExecutionParameters, create_platform from qibolab.backends import QibolabBackend -from qibolab.pulses import Pulse, PulseSequence, Rectangular, Snz +from qibolab.pulses import Pulse, Rectangular, Snz +from qibolab.sequence import PulseSequence from qibolab.sweeper import Parameter, Sweeper from .conftest import set_platform_profile diff --git a/tests/test_instruments_rfsoc.py b/tests/test_instruments_rfsoc.py index 470a2a3767..bbec421629 100644 --- a/tests/test_instruments_rfsoc.py +++ b/tests/test_instruments_rfsoc.py @@ -14,8 +14,9 @@ convert_units_sweeper, replace_pulse_shape, ) -from qibolab.pulses import Drag, Gaussian, Pulse, PulseSequence, Rectangular +from qibolab.pulses import Drag, Gaussian, Pulse, Rectangular from qibolab.qubits import Qubit +from qibolab.sequence import PulseSequence from qibolab.sweeper import Parameter, Sweeper, SweeperType from .conftest import get_instrument diff --git a/tests/test_instruments_zhinst.py b/tests/test_instruments_zhinst.py index 002d39a0af..b1f9eacb1e 100644 --- a/tests/test_instruments_zhinst.py +++ b/tests/test_instruments_zhinst.py @@ -6,16 +6,8 @@ from qibolab import AcquisitionType, AveragingMode, ExecutionParameters, create_platform from qibolab.instruments.zhinst import ProcessedSweeps, Zurich, classify_sweepers from qibolab.instruments.zhinst.pulse import select_pulse -from qibolab.pulses import ( - Delay, - Drag, - Gaussian, - Iir, - Pulse, - PulseSequence, - Rectangular, - Snz, -) +from qibolab.pulses import Delay, Drag, Gaussian, Iir, Pulse, Rectangular, Snz +from qibolab.sequence import PulseSequence from qibolab.sweeper import Parameter, Sweeper from qibolab.unrolling import batch diff --git a/tests/test_native.py b/tests/test_native.py index b852f16ef1..b6f41ed198 100644 --- a/tests/test_native.py +++ b/tests/test_native.py @@ -11,9 +11,9 @@ Gaussian, GaussianSquare, Pulse, - PulseSequence, Rectangular, ) +from qibolab.sequence import PulseSequence def test_fixed_sequence_factory(): diff --git a/tests/test_platform.py b/tests/test_platform.py index 7e30fc0878..2dcf181ce4 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -24,7 +24,8 @@ from qibolab.platform import Platform, unroll_sequences from qibolab.platform.load import PLATFORM, PLATFORMS from qibolab.platform.platform import PARAMETERS -from qibolab.pulses import Delay, Gaussian, Pulse, PulseSequence, Rectangular +from qibolab.pulses import Delay, Gaussian, Pulse, Rectangular +from qibolab.sequence import PulseSequence from qibolab.serialize import replace from .conftest import find_instrument diff --git a/tests/test_unrolling.py b/tests/test_unrolling.py index 2d36f770f3..1f3dcd4be7 100644 --- a/tests/test_unrolling.py +++ b/tests/test_unrolling.py @@ -2,7 +2,8 @@ import pytest -from qibolab.pulses import Drag, Pulse, PulseSequence, Rectangular +from qibolab.pulses import Drag, Pulse, Rectangular +from qibolab.sequence import PulseSequence from qibolab.unrolling import Bounds, batch From 4af12735b7e3ef36b314c4dafa4e5157d42adf65 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 8 Aug 2024 20:27:55 +0200 Subject: [PATCH 0642/1006] fix: Define replacement for probe pulses filter --- src/qibolab/backends.py | 7 +++++-- src/qibolab/instruments/dummy.py | 5 ++++- src/qibolab/platform/__init__.py | 4 ++-- src/qibolab/platform/platform.py | 14 ++++++++++++-- 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/qibolab/backends.py b/src/qibolab/backends.py index b57c69ee9c..d9b5f357cb 100644 --- a/src/qibolab/backends.py +++ b/src/qibolab/backends.py @@ -9,7 +9,7 @@ from qibolab.compilers import Compiler from qibolab.execution_parameters import ExecutionParameters -from qibolab.platform import Platform, create_platform +from qibolab.platform import Platform, create_platform, probe_pulses from qibolab.platform.load import available_platforms from qibolab.version import __version__ as qibolab_version @@ -69,7 +69,10 @@ def assign_measurements(self, measurement_map, readout): containing the readout measurement shots. This is created in ``execute_circuit``. """ for gate, sequence in measurement_map.items(): - _samples = (readout[pulse.id] for pulse in sequence.probe_pulses) + _samples = ( + readout[pulse.id] + for pulse in probe_pulses(sequence, self.platform.configs) + ) samples = list(filter(lambda x: x is not None, _samples)) gate.result.backend = self gate.result.register_samples(np.array(samples).T) diff --git a/src/qibolab/instruments/dummy.py b/src/qibolab/instruments/dummy.py index f5629764c6..1ba31b749d 100644 --- a/src/qibolab/instruments/dummy.py +++ b/src/qibolab/instruments/dummy.py @@ -4,6 +4,7 @@ from qibo.config import log from qibolab import AcquisitionType, AveragingMode, ExecutionParameters +from qibolab.platform import probe_pulses from qibolab.pulses import Pulse from qibolab.sequence import PulseSequence from qibolab.sweeper import ParallelSweepers @@ -101,4 +102,6 @@ def values(pulse: Pulse): self.values(options, options.results_shape(sweepers, samples)) ) - return {ro.id: values(ro) for seq in sequences for ro in seq.probe_pulses} + return { + ro.id: values(ro) for seq in sequences for ro in probe_pulses(seq, configs) + } diff --git a/src/qibolab/platform/__init__.py b/src/qibolab/platform/__init__.py index 0b4565f39a..1ab530ce92 100644 --- a/src/qibolab/platform/__init__.py +++ b/src/qibolab/platform/__init__.py @@ -1,4 +1,4 @@ from .load import create_platform -from .platform import Platform, unroll_sequences +from .platform import Platform, probe_pulses, unroll_sequences -__all__ = ["Platform", "create_platform", "unroll_sequences"] +__all__ = ["Platform", "create_platform", "probe_pulses", "unroll_sequences"] diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 13b8c87238..8199697d04 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -10,11 +10,11 @@ from qibo.config import log, raise_error -from qibolab.components import Config +from qibolab.components import Config, AcquireChannel from qibolab.execution_parameters import ExecutionParameters from qibolab.instruments.abstract import Controller, Instrument, InstrumentId from qibolab.parameters import NativeGates, Parameters, Settings, update_configs -from qibolab.pulses import Delay +from qibolab.pulses import Delay, Pulse from qibolab.qubits import Qubit, QubitId, QubitPairId from qibolab.sequence import PulseSequence from qibolab.sweeper import ParallelSweepers @@ -89,6 +89,16 @@ def _channels_map(elements: QubitMap): return {ch.name: id for id, el in elements.items() for ch in el.channels} +def probe_pulses( + sequence: PulseSequence, configs: dict[str, Config] +) -> Iterable[Pulse]: + """Filter probe pulses.""" + for ch, pulse in sequence: + if isinstance(configs[ch], AcquireChannel): + assert isinstance(pulse, Pulse) + yield pulse + + @dataclass class Platform: """Platform for controlling quantum devices.""" From b0b5c7b1278e5d3037bfcabd3f31333e6c81bd95 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 8 Aug 2024 20:29:20 +0200 Subject: [PATCH 0643/1006] fix: Use bad patch as probe filter for unrolling --- src/qibolab/platform/platform.py | 2 +- src/qibolab/unrolling.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 8199697d04..cd9ba61905 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -10,7 +10,7 @@ from qibo.config import log, raise_error -from qibolab.components import Config, AcquireChannel +from qibolab.components import AcquireChannel, Config from qibolab.execution_parameters import ExecutionParameters from qibolab.instruments.abstract import Controller, Instrument, InstrumentId from qibolab.parameters import NativeGates, Parameters, Settings, update_configs diff --git a/src/qibolab/unrolling.py b/src/qibolab/unrolling.py index 8eefafbbe6..090dd3777f 100644 --- a/src/qibolab/unrolling.py +++ b/src/qibolab/unrolling.py @@ -31,7 +31,8 @@ def _waveform(sequence: PulseSequence): def _readout(sequence: PulseSequence): # TODO: Do we count 1 readout per pulse or 1 readout per multiplexed readout ? - return len(sequence.probe_pulses) + # FIXME: exploitation of non-standard convention for channel names + return sum(1 for ch, p in sequence if "probe" in ch) def _instructions(sequence: PulseSequence): From a75617e8320aea07341de14c3b22f41262727843 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 15 Aug 2024 19:38:34 +0200 Subject: [PATCH 0644/1006] revert: Undo probe pulses split In favor of channel ids --- src/qibolab/backends.py | 7 ++----- src/qibolab/instruments/dummy.py | 5 +---- src/qibolab/platform/__init__.py | 4 ++-- src/qibolab/platform/platform.py | 14 ++------------ src/qibolab/unrolling.py | 3 +-- 5 files changed, 8 insertions(+), 25 deletions(-) diff --git a/src/qibolab/backends.py b/src/qibolab/backends.py index d9b5f357cb..b57c69ee9c 100644 --- a/src/qibolab/backends.py +++ b/src/qibolab/backends.py @@ -9,7 +9,7 @@ from qibolab.compilers import Compiler from qibolab.execution_parameters import ExecutionParameters -from qibolab.platform import Platform, create_platform, probe_pulses +from qibolab.platform import Platform, create_platform from qibolab.platform.load import available_platforms from qibolab.version import __version__ as qibolab_version @@ -69,10 +69,7 @@ def assign_measurements(self, measurement_map, readout): containing the readout measurement shots. This is created in ``execute_circuit``. """ for gate, sequence in measurement_map.items(): - _samples = ( - readout[pulse.id] - for pulse in probe_pulses(sequence, self.platform.configs) - ) + _samples = (readout[pulse.id] for pulse in sequence.probe_pulses) samples = list(filter(lambda x: x is not None, _samples)) gate.result.backend = self gate.result.register_samples(np.array(samples).T) diff --git a/src/qibolab/instruments/dummy.py b/src/qibolab/instruments/dummy.py index 1ba31b749d..f5629764c6 100644 --- a/src/qibolab/instruments/dummy.py +++ b/src/qibolab/instruments/dummy.py @@ -4,7 +4,6 @@ from qibo.config import log from qibolab import AcquisitionType, AveragingMode, ExecutionParameters -from qibolab.platform import probe_pulses from qibolab.pulses import Pulse from qibolab.sequence import PulseSequence from qibolab.sweeper import ParallelSweepers @@ -102,6 +101,4 @@ def values(pulse: Pulse): self.values(options, options.results_shape(sweepers, samples)) ) - return { - ro.id: values(ro) for seq in sequences for ro in probe_pulses(seq, configs) - } + return {ro.id: values(ro) for seq in sequences for ro in seq.probe_pulses} diff --git a/src/qibolab/platform/__init__.py b/src/qibolab/platform/__init__.py index 1ab530ce92..0b4565f39a 100644 --- a/src/qibolab/platform/__init__.py +++ b/src/qibolab/platform/__init__.py @@ -1,4 +1,4 @@ from .load import create_platform -from .platform import Platform, probe_pulses, unroll_sequences +from .platform import Platform, unroll_sequences -__all__ = ["Platform", "create_platform", "probe_pulses", "unroll_sequences"] +__all__ = ["Platform", "create_platform", "unroll_sequences"] diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index cd9ba61905..13b8c87238 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -10,11 +10,11 @@ from qibo.config import log, raise_error -from qibolab.components import AcquireChannel, Config +from qibolab.components import Config from qibolab.execution_parameters import ExecutionParameters from qibolab.instruments.abstract import Controller, Instrument, InstrumentId from qibolab.parameters import NativeGates, Parameters, Settings, update_configs -from qibolab.pulses import Delay, Pulse +from qibolab.pulses import Delay from qibolab.qubits import Qubit, QubitId, QubitPairId from qibolab.sequence import PulseSequence from qibolab.sweeper import ParallelSweepers @@ -89,16 +89,6 @@ def _channels_map(elements: QubitMap): return {ch.name: id for id, el in elements.items() for ch in el.channels} -def probe_pulses( - sequence: PulseSequence, configs: dict[str, Config] -) -> Iterable[Pulse]: - """Filter probe pulses.""" - for ch, pulse in sequence: - if isinstance(configs[ch], AcquireChannel): - assert isinstance(pulse, Pulse) - yield pulse - - @dataclass class Platform: """Platform for controlling quantum devices.""" diff --git a/src/qibolab/unrolling.py b/src/qibolab/unrolling.py index 090dd3777f..8eefafbbe6 100644 --- a/src/qibolab/unrolling.py +++ b/src/qibolab/unrolling.py @@ -31,8 +31,7 @@ def _waveform(sequence: PulseSequence): def _readout(sequence: PulseSequence): # TODO: Do we count 1 readout per pulse or 1 readout per multiplexed readout ? - # FIXME: exploitation of non-standard convention for channel names - return sum(1 for ch, p in sequence if "probe" in ch) + return len(sequence.probe_pulses) def _instructions(sequence: PulseSequence): From d87cda42714a54028b3f6000911c4460b184f0a8 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 15 Aug 2024 20:24:26 +0200 Subject: [PATCH 0645/1006] feat!: Start structuring the channel ids --- src/qibolab/components/channels.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/qibolab/components/channels.py b/src/qibolab/components/channels.py index cf66e38b8f..cdf3f58f28 100644 --- a/src/qibolab/components/channels.py +++ b/src/qibolab/components/channels.py @@ -15,7 +15,9 @@ """ from dataclasses import dataclass -from typing import Optional +from typing import Literal, Optional + +from qibolab.qubits import QubitId __all__ = [ "Channel", @@ -25,7 +27,11 @@ "AcquireChannel", ] -ChannelId = str +ChannelId = tuple[ + QubitId, + Literal["drive", "flux", "probe", "acquisition", "drive12", "drive_cross"], + Optional[str], +] """Unique identifier for a channel.""" From a21894dfb6f7f164cdf32dd097b1f1d0a0b74f8d Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 15 Aug 2024 20:29:36 +0200 Subject: [PATCH 0646/1006] fix: Avoid circular import --- src/qibolab/components/channels.py | 12 +----------- src/qibolab/instruments/qm/controller.py | 3 ++- src/qibolab/qubits.py | 9 ++++++++- src/qibolab/sequence.py | 3 +-- 4 files changed, 12 insertions(+), 15 deletions(-) diff --git a/src/qibolab/components/channels.py b/src/qibolab/components/channels.py index cdf3f58f28..ef7bae1b2d 100644 --- a/src/qibolab/components/channels.py +++ b/src/qibolab/components/channels.py @@ -15,25 +15,15 @@ """ from dataclasses import dataclass -from typing import Literal, Optional - -from qibolab.qubits import QubitId +from typing import Optional __all__ = [ "Channel", - "ChannelId", "DcChannel", "IqChannel", "AcquireChannel", ] -ChannelId = tuple[ - QubitId, - Literal["drive", "flux", "probe", "acquisition", "drive12", "drive_cross"], - Optional[str], -] -"""Unique identifier for a channel.""" - @dataclass(frozen=True) class Channel: diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 38ad2ad541..7562299273 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -11,10 +11,11 @@ from qm.simulate.credentials import create_credentials from qualang_tools.simulator_tools import create_simulator_controller_connections -from qibolab.components import Channel, ChannelId, Config, DcChannel, IqChannel +from qibolab.components import Channel, Config, DcChannel, IqChannel from qibolab.execution_parameters import ExecutionParameters from qibolab.instruments.abstract import Controller from qibolab.pulses import Delay, Pulse, VirtualZ +from qibolab.qubits import ChannelId from qibolab.sequence import PulseSequence from qibolab.sweeper import ParallelSweepers, Parameter from qibolab.unrolling import Bounds diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index c604ecf1b6..a0d1937287 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -1,4 +1,4 @@ -from typing import Annotated, Optional, Union +from typing import Annotated, Literal, Optional, Union from pydantic import BeforeValidator, ConfigDict, Field, PlainSerializer @@ -14,6 +14,13 @@ Not all channels are required to operate a qubit. """ +ChannelId = tuple[ + QubitId, + Literal["drive", "flux", "probe", "acquisition", "drive12", "drive_cross"], + Optional[str], +] +"""Unique identifier for a channel.""" + class Qubit(Model): """Representation of a physical qubit. diff --git a/src/qibolab/sequence.py b/src/qibolab/sequence.py index 2134b4931d..dc3c0b00ed 100644 --- a/src/qibolab/sequence.py +++ b/src/qibolab/sequence.py @@ -7,9 +7,8 @@ from pydantic import TypeAdapter from pydantic_core import core_schema -from qibolab.components import ChannelId - from .pulses import Delay, Pulse, PulseLike +from .qubits import ChannelId __all__ = ["PulseSequence"] From 3c9040c50e4aa1f1aef5d5de009f12256b44facd Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 15 Aug 2024 20:37:30 +0200 Subject: [PATCH 0647/1006] fix: Deduplicate channel names' listings --- src/qibolab/qubits.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index a0d1937287..c4cf10eedd 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -1,4 +1,4 @@ -from typing import Annotated, Literal, Optional, Union +from typing import Annotated, Literal, Optional, Union, get_args from pydantic import BeforeValidator, ConfigDict, Field, PlainSerializer @@ -8,17 +8,13 @@ QubitId = Annotated[Union[int, str], Field(union_mode="left_to_right")] """Type for qubit names.""" -CHANNEL_NAMES = ("probe", "acquisition", "drive", "drive12", "drive_cross", "flux") +ChannelName = Literal["probe", "acquisition", "drive", "drive12", "drive_cross", "flux"] """Names of channels that belong to a qubit. Not all channels are required to operate a qubit. """ -ChannelId = tuple[ - QubitId, - Literal["drive", "flux", "probe", "acquisition", "drive12", "drive_cross"], - Optional[str], -] +ChannelId = tuple[QubitId, ChannelName, Optional[str]] """Unique identifier for a channel.""" @@ -51,7 +47,7 @@ class Qubit(Model): @property def channels(self): - for name in CHANNEL_NAMES: + for name in get_args(ChannelName): channel = getattr(self, name) if channel is not None: yield channel From 0a3a2da8cf6ba7e248d65ccc505cc3175109c38a Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 16 Aug 2024 11:22:18 +0200 Subject: [PATCH 0648/1006] feat: Replace channel names list with enumeration --- src/qibolab/qubits.py | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index c4cf10eedd..c63a91c51e 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -1,4 +1,5 @@ -from typing import Annotated, Literal, Optional, Union, get_args +from enum import Enum +from typing import Annotated, Optional, Union from pydantic import BeforeValidator, ConfigDict, Field, PlainSerializer @@ -8,13 +9,24 @@ QubitId = Annotated[Union[int, str], Field(union_mode="left_to_right")] """Type for qubit names.""" -ChannelName = Literal["probe", "acquisition", "drive", "drive12", "drive_cross", "flux"] -"""Names of channels that belong to a qubit. -Not all channels are required to operate a qubit. -""" +# TODO: replace with StrEnum, once py3.10 will be abandoned +# at which point, it will also be possible to replace values with auto() +class ChannelType(str, Enum): + """Names of channels that belong to a qubit. -ChannelId = tuple[QubitId, ChannelName, Optional[str]] + Not all channels are required to operate a qubit. + """ + + PROBE = "probe" + ACQUISITION = "acquisition" + DRIVE = "drive" + DRIVE12 = "drive12" + DRIVE_CROSS = "drive_cross" + FLUX = "flux" + + +ChannelId = tuple[QubitId, ChannelType, Optional[str]] """Unique identifier for a channel.""" @@ -47,8 +59,8 @@ class Qubit(Model): @property def channels(self): - for name in get_args(ChannelName): - channel = getattr(self, name) + for ct in ChannelType: + channel = getattr(self, ct.value) if channel is not None: yield channel From 7763b68d886792ab05bd988e6256a8f4f8607870 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 16 Aug 2024 11:39:49 +0200 Subject: [PATCH 0649/1006] feat: Provide (de)serialization for channel id --- src/qibolab/qubits.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index c63a91c51e..d727ac4691 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -1,7 +1,7 @@ from enum import Enum from typing import Annotated, Optional, Union -from pydantic import BeforeValidator, ConfigDict, Field, PlainSerializer +from pydantic import BeforeValidator, ConfigDict, Field, PlainSerializer, TypeAdapter from qibolab.components import AcquireChannel, DcChannel, IqChannel from qibolab.serialize import Model @@ -26,7 +26,22 @@ class ChannelType(str, Enum): FLUX = "flux" -ChannelId = tuple[QubitId, ChannelType, Optional[str]] +def _str_to_chid(ch: str) -> "ChannelId": + elements = ch.split("/") + # TODO: replace with pattern matching, once py3.9 will be abandoned + if len(elements) > 3: + raise ValueError() + q = TypeAdapter(QubitId).validate_python(elements[0]) + ct = ChannelType(elements[1]) + cross = elements[2] if len(elements) == 3 else None + return (q, ct, cross) + + +ChannelId = Annotated[ + tuple[QubitId, ChannelType, Optional[str]], + BeforeValidator(_str_to_chid), + PlainSerializer(lambda ch: "/".join(str(el) for el in ch)), +] """Unique identifier for a channel.""" From 272a17ba63f13aa97b2f2b5b3198e01d7fbc1f83 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 16 Aug 2024 13:01:56 +0200 Subject: [PATCH 0650/1006] feat: Turn channel ids into a full-blown class --- src/qibolab/qubits.py | 60 ++++++++++++++++++++++++++++++------------- 1 file changed, 42 insertions(+), 18 deletions(-) diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index d727ac4691..f7e766358b 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -1,7 +1,15 @@ from enum import Enum from typing import Annotated, Optional, Union -from pydantic import BeforeValidator, ConfigDict, Field, PlainSerializer, TypeAdapter +from pydantic import ( + BeforeValidator, + ConfigDict, + Field, + PlainSerializer, + TypeAdapter, + model_serializer, + model_validator, +) from qibolab.components import AcquireChannel, DcChannel, IqChannel from qibolab.serialize import Model @@ -26,23 +34,39 @@ class ChannelType(str, Enum): FLUX = "flux" -def _str_to_chid(ch: str) -> "ChannelId": - elements = ch.split("/") - # TODO: replace with pattern matching, once py3.9 will be abandoned - if len(elements) > 3: - raise ValueError() - q = TypeAdapter(QubitId).validate_python(elements[0]) - ct = ChannelType(elements[1]) - cross = elements[2] if len(elements) == 3 else None - return (q, ct, cross) - - -ChannelId = Annotated[ - tuple[QubitId, ChannelType, Optional[str]], - BeforeValidator(_str_to_chid), - PlainSerializer(lambda ch: "/".join(str(el) for el in ch)), -] -"""Unique identifier for a channel.""" +class ChannelId(Model): + """Unique identifier for a channel.""" + + qubit: QubitId + channel_type: ChannelType + cross: Optional[str] + + @model_validator(mode="before") + @classmethod + def _load(cls, ch: str) -> dict: + elements = ch.split("/") + # TODO: replace with pattern matching, once py3.9 will be abandoned + if len(elements) > 3: + raise ValueError() + q = TypeAdapter(QubitId).validate_python(elements[0]) + ct = ChannelType(elements[1]) + assert len(elements) == 2 or ct is ChannelType.DRIVE_CROSS + dc = elements[2] if len(elements) == 3 else None + return dict(qubit=q, channel_type=ct, cross=dc) + + @classmethod + def load(cls, value: str): + """Unpack from string.""" + return cls.model_validate(value) + + def __str__(self): + """Represent as its joint components.""" + return "/".join(str(el[1]) for el in self if el is not None) + + @model_serializer + def _dump(self) -> str: + """Prepare for serialization.""" + return str(self) class Qubit(Model): From f0c518147db7aba6b393980ed364b9b45de06862 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 16 Aug 2024 13:04:21 +0200 Subject: [PATCH 0651/1006] docs: Document the role of the compoent identifier --- src/qibolab/parameters.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/qibolab/parameters.py b/src/qibolab/parameters.py index 288a8f6960..e6713a1614 100644 --- a/src/qibolab/parameters.py +++ b/src/qibolab/parameters.py @@ -98,6 +98,10 @@ class NativeGates(Model): ComponentId = str +"""Identifier of a generic component. + +This is assumed to always be in its serialized form. +""" class Parameters(Model): From 9c5565552e9067d1939bf296810020220330df5c Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 16 Aug 2024 16:12:06 +0200 Subject: [PATCH 0652/1006] feat!: Move identifier to their module And fix channel id stringification --- src/qibolab/identifier.py | 63 ++++++++++++++++++++++++++++++++++ src/qibolab/qubits.py | 72 +++------------------------------------ 2 files changed, 68 insertions(+), 67 deletions(-) create mode 100644 src/qibolab/identifier.py diff --git a/src/qibolab/identifier.py b/src/qibolab/identifier.py new file mode 100644 index 0000000000..0fc5a4399a --- /dev/null +++ b/src/qibolab/identifier.py @@ -0,0 +1,63 @@ +from enum import Enum +from typing import Annotated, Optional, Union + +from pydantic import Field, TypeAdapter, model_serializer, model_validator + +from .serialize import Model + +QubitId = Annotated[Union[int, str], Field(union_mode="left_to_right")] +"""Type for qubit names.""" + + +# TODO: replace with StrEnum, once py3.10 will be abandoned +# at which point, it will also be possible to replace values with auto() +class ChannelType(str, Enum): + """Names of channels that belong to a qubit. + + Not all channels are required to operate a qubit. + """ + + PROBE = "probe" + ACQUISITION = "acquisition" + DRIVE = "drive" + DRIVE12 = "drive12" + DRIVE_CROSS = "drive_cross" + FLUX = "flux" + + def __str__(self) -> str: + return str(self.value) + + +class ChannelId(Model): + """Unique identifier for a channel.""" + + qubit: QubitId + channel_type: ChannelType + cross: Optional[str] + + @model_validator(mode="before") + @classmethod + def _load(cls, ch: str) -> dict: + elements = ch.split("/") + # TODO: replace with pattern matching, once py3.9 will be abandoned + if len(elements) > 3: + raise ValueError() + q = TypeAdapter(QubitId).validate_python(elements[0]) + ct = ChannelType(elements[1]) + assert len(elements) == 2 or ct is ChannelType.DRIVE_CROSS + dc = elements[2] if len(elements) == 3 else None + return dict(qubit=q, channel_type=ct, cross=dc) + + @classmethod + def load(cls, value: str): + """Unpack from string.""" + return cls.model_validate(value) + + def __str__(self): + """Represent as its joint components.""" + return "/".join(str(el[1]) for el in self if el[1] is not None) + + @model_serializer + def _dump(self) -> str: + """Prepare for serialization.""" + return str(self) diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index f7e766358b..774a4f5c02 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -1,72 +1,10 @@ -from enum import Enum -from typing import Annotated, Optional, Union +from typing import Annotated, Optional -from pydantic import ( - BeforeValidator, - ConfigDict, - Field, - PlainSerializer, - TypeAdapter, - model_serializer, - model_validator, -) +from pydantic import BeforeValidator, ConfigDict, PlainSerializer -from qibolab.components import AcquireChannel, DcChannel, IqChannel -from qibolab.serialize import Model - -QubitId = Annotated[Union[int, str], Field(union_mode="left_to_right")] -"""Type for qubit names.""" - - -# TODO: replace with StrEnum, once py3.10 will be abandoned -# at which point, it will also be possible to replace values with auto() -class ChannelType(str, Enum): - """Names of channels that belong to a qubit. - - Not all channels are required to operate a qubit. - """ - - PROBE = "probe" - ACQUISITION = "acquisition" - DRIVE = "drive" - DRIVE12 = "drive12" - DRIVE_CROSS = "drive_cross" - FLUX = "flux" - - -class ChannelId(Model): - """Unique identifier for a channel.""" - - qubit: QubitId - channel_type: ChannelType - cross: Optional[str] - - @model_validator(mode="before") - @classmethod - def _load(cls, ch: str) -> dict: - elements = ch.split("/") - # TODO: replace with pattern matching, once py3.9 will be abandoned - if len(elements) > 3: - raise ValueError() - q = TypeAdapter(QubitId).validate_python(elements[0]) - ct = ChannelType(elements[1]) - assert len(elements) == 2 or ct is ChannelType.DRIVE_CROSS - dc = elements[2] if len(elements) == 3 else None - return dict(qubit=q, channel_type=ct, cross=dc) - - @classmethod - def load(cls, value: str): - """Unpack from string.""" - return cls.model_validate(value) - - def __str__(self): - """Represent as its joint components.""" - return "/".join(str(el[1]) for el in self if el is not None) - - @model_serializer - def _dump(self) -> str: - """Prepare for serialization.""" - return str(self) +from .components import AcquireChannel, DcChannel, IqChannel +from .identifier import ChannelType, QubitId +from .serialize import Model class Qubit(Model): From 21c27929c7dca815e0bb839ea91a650b7911e2af Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 16 Aug 2024 16:12:55 +0200 Subject: [PATCH 0653/1006] feat: Turn channels into models Rather than dataclasses --- src/qibolab/components/channels.py | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/src/qibolab/components/channels.py b/src/qibolab/components/channels.py index ef7bae1b2d..ecd66b8239 100644 --- a/src/qibolab/components/channels.py +++ b/src/qibolab/components/channels.py @@ -14,29 +14,23 @@ share a component, because channels will refer to the same name for the component under discussion. """ -from dataclasses import dataclass from typing import Optional -__all__ = [ - "Channel", - "DcChannel", - "IqChannel", - "AcquireChannel", -] +from qibolab.identifier import ChannelId +from qibolab.serialize import Model +__all__ = ["Channel", "DcChannel", "IqChannel", "AcquireChannel"] -@dataclass(frozen=True) -class Channel: - name: str + +class Channel(Model): + name: ChannelId """Name of the channel.""" -@dataclass(frozen=True) class DcChannel(Channel): """Channel that can be used to send DC pulses.""" -@dataclass(frozen=True) class IqChannel(Channel): """Channel that can be used to send IQ pulses.""" @@ -60,7 +54,6 @@ class IqChannel(Channel): """ -@dataclass(frozen=True) class AcquireChannel(Channel): twpa_pump: Optional[str] """Name of the TWPA pump component. From 5173ec73ad8ce5512d42cdb88359a7841464e65f Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 16 Aug 2024 16:14:12 +0200 Subject: [PATCH 0654/1006] fix: Fix acquisition channels names And channel creation in dummy platform, since they now require kwargs only --- src/qibolab/dummy/parameters.json | 10 +++++----- src/qibolab/dummy/platform.py | 16 +++++++++------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/qibolab/dummy/parameters.json b/src/qibolab/dummy/parameters.json index 9c17c54350..5f708b7533 100644 --- a/src/qibolab/dummy/parameters.json +++ b/src/qibolab/dummy/parameters.json @@ -90,7 +90,7 @@ "kind": "iq", "frequency": 5500000000.0 }, - "qubit_0/acquire": { + "qubit_0/acquisition": { "kind": "acquisition", "delay": 0.0, "smearing": 0.0, @@ -98,7 +98,7 @@ "iq_angle": 0.0, "kernel": "k05VTVBZAQB2AHsnZGVzY3InOiAnPGY4JywgJ2ZvcnRyYW5fb3JkZXInOiBGYWxzZSwgJ3NoYXBlJzogKDEwLCksIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAp5sDfS7uHlP2DIMKNvnKc/gCqN8KV/pT94FQCYYJC3PzSbwfi/894/APwg6C61rj8MSN3blizAP2ha9unQYsM/+BFjHTxcwT+gXaJazvbpPw==" }, - "qubit_1/acquire": { + "qubit_1/acquisition": { "kind": "acquisition", "delay": 0.0, "smearing": 0.0, @@ -106,7 +106,7 @@ "iq_angle": 0.0, "kernel": "k05VTVBZAQB2AHsnZGVzY3InOiAnPGY4JywgJ2ZvcnRyYW5fb3JkZXInOiBGYWxzZSwgJ3NoYXBlJzogKDEwLCksIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAr4dT6V5tHrP1w+JhHImN8/sPePZeSUuj/4yTKrD5fRP/ysonZip98/6GJMAPV9xD/LTiJo4k7oP96aWXpxduU/6fUxETe/7z9GXEBNGebWPw==" }, - "qubit_2/acquire": { + "qubit_2/acquisition": { "kind": "acquisition", "delay": 0.0, "smearing": 0.0, @@ -114,7 +114,7 @@ "iq_angle": 0.0, "kernel": "k05VTVBZAQB2AHsnZGVzY3InOiAnPGY4JywgJ2ZvcnRyYW5fb3JkZXInOiBGYWxzZSwgJ3NoYXBlJzogKDEwLCksIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApUtcFdBpTsPzzwG8Xkbts/OAvkS0qo4z+OUcJpZ8HlP/jsO9cUwso/s6DVM7e/4T/NL4JYzUXvP9CibqEg98M/AENJ8QPkcD8wAOtI4pHNPw==" }, - "qubit_3/acquire": { + "qubit_3/acquisition": { "kind": "acquisition", "delay": 0.0, "smearing": 0.0, @@ -122,7 +122,7 @@ "iq_angle": 0.0, "kernel": "k05VTVBZAQB2AHsnZGVzY3InOiAnPGY4JywgJ2ZvcnRyYW5fb3JkZXInOiBGYWxzZSwgJ3NoYXBlJzogKDEwLCksIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogk3D0+DqsP1ry/LSlMuM/ydJYpPk/6D8BJMdYs+zsP1CqhVqYz+o/1A3srA5z7j8CUqCE6lvqPwjNySZ1DuA/YHGvVmuFsz+XwaQKz/bqPw==" }, - "qubit_4/acquire": { + "qubit_4/acquisition": { "kind": "acquisition", "delay": 0.0, "smearing": 0.0, diff --git a/src/qibolab/dummy/platform.py b/src/qibolab/dummy/platform.py index c725a3c9ad..d3d12bc235 100644 --- a/src/qibolab/dummy/platform.py +++ b/src/qibolab/dummy/platform.py @@ -17,19 +17,21 @@ def create_dummy() -> Platform: qubits = {} # attach the channels for q in range(5): - probe, acquisition = f"qubit_{q}/probe", f"qubit_{q}/acquire" + probe, acquisition = f"qubit_{q}/probe", f"qubit_{q}/acquisition" qubits[q] = Qubit( name=q, - probe=IqChannel(probe, mixer=None, lo=None, acquisition=acquisition), - acquisition=AcquireChannel(acquisition, twpa_pump=pump.name, probe=probe), - drive=IqChannel(f"qubit_{q}/drive", mixer=None, lo=None), - drive12=IqChannel(f"qubit_{q}/drive12", mixer=None, lo=None), - flux=DcChannel(f"qubit_{q}/flux"), + probe=IqChannel(name=probe, mixer=None, lo=None, acquisition=acquisition), + acquisition=AcquireChannel( + name=acquisition, twpa_pump=pump.name, probe=probe + ), + drive=IqChannel(name=f"qubit_{q}/drive", mixer=None, lo=None), + drive12=IqChannel(name=f"qubit_{q}/drive12", mixer=None, lo=None), + flux=DcChannel(name=f"qubit_{q}/flux"), ) couplers = {} for c in (0, 1, 3, 4): - couplers[c] = Qubit(name=c, flux=DcChannel(f"coupler_{c}/flux")) + couplers[c] = Qubit(name=c, flux=DcChannel(name=f"coupler_{c}/flux")) return Platform.load( path=FOLDER, instruments=[instrument, pump], qubits=qubits, couplers=couplers From a130febfe7facb6693f3dfb949121c2b09012bcc Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 16 Aug 2024 16:16:47 +0200 Subject: [PATCH 0655/1006] fix: Fix channel id imports --- src/qibolab/instruments/qm/controller.py | 2 +- src/qibolab/sequence.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 7562299273..17d421c648 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -13,9 +13,9 @@ from qibolab.components import Channel, Config, DcChannel, IqChannel from qibolab.execution_parameters import ExecutionParameters +from qibolab.identifier import ChannelId from qibolab.instruments.abstract import Controller from qibolab.pulses import Delay, Pulse, VirtualZ -from qibolab.qubits import ChannelId from qibolab.sequence import PulseSequence from qibolab.sweeper import ParallelSweepers, Parameter from qibolab.unrolling import Bounds diff --git a/src/qibolab/sequence.py b/src/qibolab/sequence.py index dc3c0b00ed..225ac8cb87 100644 --- a/src/qibolab/sequence.py +++ b/src/qibolab/sequence.py @@ -7,8 +7,8 @@ from pydantic import TypeAdapter from pydantic_core import core_schema +from .identifier import ChannelId from .pulses import Delay, Pulse, PulseLike -from .qubits import ChannelId __all__ = ["PulseSequence"] From 087aeba8d242e19ab74faa2ad6b5558a5d56a702 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 16 Aug 2024 16:17:34 +0200 Subject: [PATCH 0656/1006] feat: Load sequences from bare channel names --- src/qibolab/sequence.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/qibolab/sequence.py b/src/qibolab/sequence.py index 225ac8cb87..4d3934e31f 100644 --- a/src/qibolab/sequence.py +++ b/src/qibolab/sequence.py @@ -2,7 +2,7 @@ from collections import UserList from collections.abc import Callable, Iterable -from typing import Any +from typing import Any, Union from pydantic import TypeAdapter from pydantic_core import core_schema @@ -46,6 +46,10 @@ def _validate(cls, value): def _serialize(value): return TypeAdapter(list[_Element]).dump_python(list(value)) + @classmethod + def load(cls, value: list[tuple[str, PulseLike]]): + return TypeAdapter(cls).validate_python(value) + @property def duration(self) -> float: """Duration of the entire sequence.""" From b4092344d167b43a8f8933abb0f5f623ab2322f2 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 16 Aug 2024 16:18:01 +0200 Subject: [PATCH 0657/1006] fix: Filter probe pulses with a reliable criterion --- src/qibolab/sequence.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/qibolab/sequence.py b/src/qibolab/sequence.py index 4d3934e31f..02292c9616 100644 --- a/src/qibolab/sequence.py +++ b/src/qibolab/sequence.py @@ -2,7 +2,7 @@ from collections import UserList from collections.abc import Callable, Iterable -from typing import Any, Union +from typing import Any from pydantic import TypeAdapter from pydantic_core import core_schema @@ -105,5 +105,8 @@ def probe_pulses(self) -> list[Pulse]: """Return list of the readout pulses in this sequence.""" # pulse filter needed to exclude delays return [ - pulse for (ch, pulse) in self if isinstance(pulse, Pulse) if "probe" in ch + pulse + for (ch, pulse) in self + if isinstance(pulse, Pulse) + if ch.channel_type is ChannelType.PROBE ] From 471b2bb4ea659334362c67de38981146f8607102 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 16 Aug 2024 16:18:55 +0200 Subject: [PATCH 0658/1006] test: Fix channel id usage in tests --- tests/pulses/test_sequence.py | 26 +++++++++---------- tests/test_compilers_default.py | 5 ++-- tests/test_native.py | 46 ++++++++++++++++++--------------- tests/test_platform.py | 16 ++++++------ tests/test_unrolling.py | 4 +-- 5 files changed, 50 insertions(+), 47 deletions(-) diff --git a/tests/pulses/test_sequence.py b/tests/pulses/test_sequence.py index 71de22f40a..0ff7aca231 100644 --- a/tests/pulses/test_sequence.py +++ b/tests/pulses/test_sequence.py @@ -1,5 +1,5 @@ -from qibolab.pulses import Delay, Drag, Gaussian, Pulse, Rectangular -from qibolab.pulses.pulse import VirtualZ +from qibolab.identifier import ChannelId +from qibolab.pulses import Delay, Drag, Gaussian, Pulse, Rectangular, VirtualZ from qibolab.sequence import PulseSequence @@ -9,22 +9,20 @@ def test_init(): def test_init_with_iterable(): + sc = ChannelId.load("some/probe") + oc = ChannelId.load("other/drive") + c5 = ChannelId.load("5/drive") seq = PulseSequence( [ - ("some channel", p) + (sc, p) for p in [ Pulse(duration=20, amplitude=0.1, envelope=Gaussian(rel_sigma=3)), Pulse(duration=30, amplitude=0.5, envelope=Gaussian(rel_sigma=3)), ] ] + + [(oc, Pulse(duration=40, amplitude=0.2, envelope=Gaussian(rel_sigma=3)))] + [ - ( - "other channel", - Pulse(duration=40, amplitude=0.2, envelope=Gaussian(rel_sigma=3)), - ) - ] - + [ - ("chanel #5", p) + (c5, p) for p in [ Pulse(duration=45, amplitude=1.0, envelope=Gaussian(rel_sigma=3)), Pulse(duration=50, amplitude=0.7, envelope=Gaussian(rel_sigma=3)), @@ -34,10 +32,10 @@ def test_init_with_iterable(): ) assert len(seq) == 6 - assert set(seq.channels) == {"some channel", "other channel", "chanel #5"} - assert len(list(seq.channel("some channel"))) == 2 - assert len(list(seq.channel("other channel"))) == 1 - assert len(list(seq.channel("chanel #5"))) == 3 + assert set(seq.channels) == {sc, oc, c5} + assert len(list(seq.channel(sc))) == 2 + assert len(list(seq.channel(oc))) == 1 + assert len(list(seq.channel(c5))) == 3 def test_durations(): diff --git a/tests/test_compilers_default.py b/tests/test_compilers_default.py index e667e45acb..1d5c9a4281 100644 --- a/tests/test_compilers_default.py +++ b/tests/test_compilers_default.py @@ -6,6 +6,7 @@ from qibolab import create_platform from qibolab.compilers import Compiler +from qibolab.identifier import ChannelId from qibolab.platform import Platform from qibolab.pulses import Delay from qibolab.sequence import PulseSequence @@ -187,8 +188,8 @@ def test_align_multiqubit(platform: Platform): circuit.add(gates.M(main, coupled)) sequence = compile_circuit(circuit, platform) - flux_duration = sequence.channel_duration(f"qubit_{coupled}/flux") + flux_duration = sequence.channel_duration(ChannelId.load(f"qubit_{coupled}/flux")) for q in (main, coupled): - probe_delay = next(iter(sequence.channel(f"qubit_{q}/probe"))) + probe_delay = next(iter(sequence.channel(ChannelId.load(f"qubit_{q}/probe")))) assert isinstance(probe_delay, Delay) assert flux_duration == probe_delay.duration diff --git a/tests/test_native.py b/tests/test_native.py index b6f41ed198..37cae537c7 100644 --- a/tests/test_native.py +++ b/tests/test_native.py @@ -4,6 +4,7 @@ import pytest from pydantic import TypeAdapter +from qibolab.identifier import ChannelId from qibolab.native import FixedSequenceFactory, RxyFactory, TwoQubitNatives from qibolab.pulses import ( Drag, @@ -17,13 +18,16 @@ def test_fixed_sequence_factory(): - seq = PulseSequence( + seq = PulseSequence.load( [ ( - "channel_1", + "channel_1/probe", Pulse(duration=40, amplitude=0.3, envelope=Gaussian(rel_sigma=3.0)), ), - ("channel_17", Pulse(duration=125, amplitude=1.0, envelope=Rectangular())), + ( + "channel_17/drive", + Pulse(duration=125, amplitude=1.0, envelope=Rectangular()), + ), ] ) factory = FixedSequenceFactory(seq) @@ -33,14 +37,15 @@ def test_fixed_sequence_factory(): assert fseq1 == seq assert fseq2 == seq + np = ChannelId.load("new/probe") fseq1.append( ( - "new channel", + np, Pulse(duration=30, amplitude=0.04, envelope=Drag(rel_sigma=4.0, beta=0.02)), ) ) - assert "new channel" not in seq.channels - assert "new channel" not in fseq2.channels + assert np not in seq.channels + assert np not in fseq2.channels @pytest.mark.parametrize( @@ -57,10 +62,10 @@ def test_fixed_sequence_factory(): ], ) def test_rxy_rotation_factory(args, amplitude, phase): - seq = PulseSequence( + seq = PulseSequence.load( [ ( - "channel_1", + "1/drive", Pulse(duration=40, amplitude=1.0, envelope=Gaussian(rel_sigma=3.0)), ) ] @@ -70,25 +75,24 @@ def test_rxy_rotation_factory(args, amplitude, phase): fseq1 = factory.create_sequence(**args) fseq2 = factory.create_sequence(**args) assert fseq1 == fseq2 - fseq2.append( - ("new channel", Pulse(duration=56, amplitude=0.43, envelope=Rectangular())) - ) - assert "new channel" not in fseq1.channels + np = ChannelId.load("new/probe") + fseq2.append((np, Pulse(duration=56, amplitude=0.43, envelope=Rectangular()))) + assert np not in fseq1.channels - pulse = next(iter(fseq1.channel("channel_1"))) + pulse = next(iter(fseq1.channel(ChannelId.load("1/drive")))) assert pulse.amplitude == pytest.approx(amplitude) assert pulse.relative_phase == pytest.approx(phase) def test_rxy_factory_multiple_channels(): - seq = PulseSequence( + seq = PulseSequence.load( [ ( - "channel_1", + "1/drive", Pulse(duration=40, amplitude=0.7, envelope=Gaussian(rel_sigma=5.0)), ), ( - "channel_2", + "2/drive", Pulse(duration=30, amplitude=1.0, envelope=Gaussian(rel_sigma=3.0)), ), ] @@ -99,14 +103,14 @@ def test_rxy_factory_multiple_channels(): def test_rxy_factory_multiple_pulses(): - seq = PulseSequence( + seq = PulseSequence.load( [ ( - "channel_1", + "1/drive", Pulse(duration=40, amplitude=0.08, envelope=Gaussian(rel_sigma=4.0)), ), ( - "channel_1", + "1/drive", Pulse(duration=80, amplitude=0.76, envelope=Gaussian(rel_sigma=4.0)), ), ] @@ -127,10 +131,10 @@ def test_rxy_factory_multiple_pulses(): ], ) def test_rxy_rotation_factory_envelopes(envelope): - seq = PulseSequence( + seq = PulseSequence.load( [ ( - "channel_1", + "1/drive", Pulse(duration=100, amplitude=1.0, envelope=envelope), ) ] diff --git a/tests/test_platform.py b/tests/test_platform.py index 2dcf181ce4..2a8bea5e95 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -167,17 +167,17 @@ def test_dump_parameters(platform: Platform, tmp_path: Path): def test_dump_parameters_with_updates(platform: Platform, tmp_path: Path): qubit = next(iter(platform.qubits.values())) - frequency = platform.config(qubit.drive.name).frequency + 1.5e9 - smearing = platform.config(qubit.acquisition.name).smearing + 10 + frequency = platform.config(str(qubit.drive.name)).frequency + 1.5e9 + smearing = platform.config(str(qubit.acquisition.name)).smearing + 10 update = { - qubit.drive.name: {"frequency": frequency}, - qubit.acquisition.name: {"smearing": smearing}, + str(qubit.drive.name): {"frequency": frequency}, + str(qubit.acquisition.name): {"smearing": smearing}, } update_configs(platform.parameters.configs, [update]) (tmp_path / PARAMETERS).write_text(platform.parameters.model_dump_json()) final = Parameters.model_validate_json((tmp_path / PARAMETERS).read_text()) - assert final.configs[qubit.drive.name].frequency == frequency - assert final.configs[qubit.acquisition.name].smearing == smearing + assert final.configs[str(qubit.drive.name)].frequency == frequency + assert final.configs[str(qubit.acquisition.name)].smearing == smearing def test_kernels(tmp_path: Path): @@ -199,8 +199,8 @@ def test_kernels(tmp_path: Path): ) for qubit in platform.qubits.values(): - orig = platform.parameters.configs[qubit.acquisition.name].kernel - load = reloaded.parameters.configs[qubit.acquisition.name].kernel + orig = platform.parameters.configs[str(qubit.acquisition.name)].kernel + load = reloaded.parameters.configs[str(qubit.acquisition.name)].kernel np.testing.assert_array_equal(orig, load) diff --git a/tests/test_unrolling.py b/tests/test_unrolling.py index 1f3dcd4be7..9487b040be 100644 --- a/tests/test_unrolling.py +++ b/tests/test_unrolling.py @@ -8,7 +8,7 @@ def test_bounds_update(): - ps = PulseSequence( + ps = PulseSequence.load( [ ( "ch3/drive", @@ -72,7 +72,7 @@ def test_bounds_comparison(): ], ) def test_batch(bounds): - ps = PulseSequence( + ps = PulseSequence.load( [ ( "ch3/drive", From d426b288de22bf4af7a616eae1c08100a4480f11 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 16 Aug 2024 16:34:50 +0200 Subject: [PATCH 0659/1006] fix: Fix doctests and import --- doc/source/getting-started/experiment.rst | 4 +- doc/source/main-documentation/qibolab.rst | 17 ++++--- doc/source/tutorials/calibration.rst | 8 ++- doc/source/tutorials/lab.rst | 60 ++++++++++++++--------- doc/source/tutorials/pulses.rst | 8 +-- src/qibolab/sequence.py | 2 +- 6 files changed, 59 insertions(+), 40 deletions(-) diff --git a/doc/source/getting-started/experiment.rst b/doc/source/getting-started/experiment.rst index f3c3dd04c2..99e7524357 100644 --- a/doc/source/getting-started/experiment.rst +++ b/doc/source/getting-started/experiment.rst @@ -241,7 +241,9 @@ We leave to the dedicated tutorial a full explanation of the experiment, but her # plot the results amplitudes = magnitude(results[probe_pulse.id][0]) - frequencies = np.arange(-2e8, +2e8, 1e6) + platform.config(qubit.probe.name).frequency + frequencies = ( + np.arange(-2e8, +2e8, 1e6) + platform.config(str(qubit.probe.name)).frequency + ) plt.title("Resonator Spectroscopy") plt.xlabel("Frequencies [Hz]") diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index 44cb96fc47..b15d103b0b 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -43,14 +43,14 @@ We can easily access the names of channels and other components, and based on th drive_channel = platform.qubits[0].drive print(f"Drive channel name: {drive_channel.name}") - print(f"Drive frequency: {platform.config(drive_channel.name).frequency}") + print(f"Drive frequency: {platform.config(str(drive_channel.name)).frequency}") drive_lo = drive_channel.lo if drive_lo is None: print(f"Drive channel {drive_channel.name} does not use an LO.") else: print(f"Name of LO for channel {drive_channel.name} is {drive_lo}") - print(f"LO frequency: {platform.config(drive_lo).frequency}") + print(f"LO frequency: {platform.config(str(drive_lo)).frequency}") .. testoutput:: python :hide: @@ -304,12 +304,12 @@ To organize pulses into sequences, Qibolab provides the :class:`qibolab.pulses.P relative_phase=0, # phases are in radians envelope=Rectangular(), ) - sequence = PulseSequence( + sequence = PulseSequence.load( [ - ("channel", pulse1), - ("channel", pulse2), - ("channel", pulse3), - ("channel", pulse4), + ("qubit/drive", pulse1), + ("qubit/drive", pulse2), + ("qubit/drive", pulse3), + ("qubit/drive", pulse4), ], ) @@ -336,13 +336,14 @@ Typical experiments may include both pre-defined pulses and new ones: .. testcode:: python from qibolab.pulses import Rectangular + from qibolab.identifier import ChannelId natives = platform.natives.single_qubit[0] sequence = PulseSequence() sequence.concatenate(natives.RX.create_sequence()) sequence.append( ( - "some_channel", + ChannelId.load("some/drive"), Pulse(duration=10, amplitude=0.5, relative_phase=0, envelope=Rectangular()), ) ) diff --git a/doc/source/tutorials/calibration.rst b/doc/source/tutorials/calibration.rst index 560ae59a2b..8ce20d3fc1 100644 --- a/doc/source/tutorials/calibration.rst +++ b/doc/source/tutorials/calibration.rst @@ -75,7 +75,9 @@ In few seconds, the experiment will be finished and we can proceed to plot it. probe_pulse = sequence.probe_pulses[0] amplitudes = magnitude(results[probe_pulse.id][0]) - frequencies = np.arange(-2e8, +2e8, 1e6) + platform.config(qubit.probe.name).frequency + frequencies = ( + np.arange(-2e8, +2e8, 1e6) + platform.config(str(qubit.probe.name)).frequency + ) plt.title("Resonator Spectroscopy") plt.xlabel("Frequencies [Hz]") @@ -166,7 +168,9 @@ We can now proceed to launch on hardware: probe_pulse = next(iter(sequence.probe_pulses)) amplitudes = magnitude(results[probe_pulse.id][0]) - frequencies = np.arange(-2e8, +2e8, 1e6) + platform.config(qubit.drive.name).frequency + frequencies = ( + np.arange(-2e8, +2e8, 1e6) + platform.config(str(qubit.drive.name)).frequency + ) plt.title("Resonator Spectroscopy") plt.xlabel("Frequencies [Hz]") diff --git a/doc/source/tutorials/lab.rst b/doc/source/tutorials/lab.rst index 22fcfb8b72..8d254c65f1 100644 --- a/doc/source/tutorials/lab.rst +++ b/doc/source/tutorials/lab.rst @@ -38,14 +38,18 @@ using different Qibolab primitives. qubit = Qubit(name=0) # assign channels to the qubit - qubit.probe = IqChannel(name="probe", mixer=None, lo=None, acquisition="acquire") - qubit.acquisition = AcquireChannel(name="acquire", twpa_pump=None, probe="probe") - qubit.drive = Iqchannel(name="drive", mixer=None, lo=None) + qubit.probe = IqChannel( + name="0/probe", mixer=None, lo=None, acquisition="0/acquisition" + ) + qubit.acquisition = AcquireChannel( + name="0/acquisition", twpa_pump=None, probe="probe" + ) + qubit.drive = Iqchannel(name="0/drive", mixer=None, lo=None) # define configuration for channels configs = {} - configs[qubit.drive.name] = IqConfig(frequency=3e9) - configs[qubit.probe.name] = IqConfig(frequency=7e9) + configs[str(qubit.drive.name)] = IqConfig(frequency=3e9) + configs[str(qubit.probe.name)] = IqConfig(frequency=7e9) # create sequence that drives qubit from state 0 to 1 drive_seq = PulseSequence( @@ -120,13 +124,21 @@ the native gates, but separately from the single-qubit ones. qubit1 = Qubit(name=1) # assign channels to the qubits - qubit0.probe = IqChannel(name="probe_0", mixer=None, lo=None, acquisition="acquire_0") - qubit0.acquisition = AcquireChannel(name="acquire_0", twpa_pump=None, probe="probe_0") - qubit0.drive = IqChannel(name="drive_0", mixer=None, lo=None) - qubit0.flux = DcChannel(name="flux_0") - qubit1.probe = IqChannel(name="probe_1", mixer=None, lo=None, acquisition="acquire_1") - qubit1.acquisition = AcquireChannel(name="acquire_1", twpa_pump=None, probe="probe_1") - qubit1.drive = IqChannel(name="drive_1", mixer=None, lo=None) + qubit0.probe = IqChannel( + name="0/probe", mixer=None, lo=None, acquisition="0/acquisition" + ) + qubit0.acquisition = AcquireChannel( + name="0/acquisition", twpa_pump=None, probe="probe_0" + ) + qubit0.drive = IqChannel(name="0/drive", mixer=None, lo=None) + qubit0.flux = DcChannel(name="0/flux") + qubit1.probe = IqChannel( + name="1/probe", mixer=None, lo=None, acquisition="1/acquisition" + ) + qubit1.acquisition = AcquireChannel( + name="1/acquisition", twpa_pump=None, probe="probe_1" + ) + qubit1.drive = IqChannel(name="1/drive", mixer=None, lo=None) # assign single-qubit native gates to each qubit single_qubit = {} @@ -219,10 +231,10 @@ will take them into account when calling :class:`qibolab.native.TwoQubitNatives` # create the qubit and coupler objects qubit0 = Qubit(name=0) qubit1 = Qubit(name=1) - coupler_01 = Qubit(name=100) + coupler_01 = Qubit(name="c01") # assign channel(s) to the coupler - coupler_01.flux = DcChannel(name="flux_coupler_01") + coupler_01.flux = DcChannel(name="c01/flux") # assign single-qubit native gates to each qubit # Look above example @@ -295,26 +307,26 @@ a two-qubit system: "relaxation_time": 50000 }, "components": { - "drive_0": { + "0/drive": { "frequency": 4855663000 }, - "drive_1": { + "1/drive": { "frequency": 5800563000 }, - "flux_0": { + "0/flux": { "bias": 0.0 }, - "probe_0": { + "0/probe": { "frequency": 7453265000 }, - "probe_1": { + "1/probe": { "frequency": 7655107000 }, - "acquire_0": { + "0/acquisition": { "delay": 0, "smearing": 0 }, - "acquire_1": { + "1/acquisition": { "delay": 0, "smearing": 0 } @@ -510,7 +522,7 @@ the above runcard: # define channels and load component configs qubits = {} for q in range(2): - probe_name, acquire_name = f"qubit_{q}/probe", f"qubit_{q}/acquire" + probe_name, acquire_name = f"qubit_{q}/probe", f"qubit_{q}/acquisition" qubits[q] = Qubit( name=q, drive=IqChannel(f"qubit_{q}/drive", mixer=None, lo=None), @@ -540,7 +552,7 @@ With the following additions for coupler architectures: qubits = {} # define channels and load component configs for q in range(2): - probe_name, acquire_name = f"qubit_{q}/probe", f"qubit_{q}/acquire" + probe_name, acquire_name = f"qubit_{q}/probe", f"qubit_{q}/acquisition" qubits[q] = Qubit( name=q, drive=IqChannel(f"qubit_{q}/drive", mixer=None, lo=None), @@ -622,7 +634,7 @@ in this case ``"twpa_pump"``. # define channels and load component configs qubits = {} for q in range(2): - probe_name, acquire_name = f"qubit_{q}/probe", f"qubit_{q}/acquire" + probe_name, acquire_name = f"qubit_{q}/probe", f"qubit_{q}/acquisition" qubits[q] = Qubit( name=q, drive=IqChannel(f"qubit_{q}/drive", mixer=None, lo=None), diff --git a/doc/source/tutorials/pulses.rst b/doc/source/tutorials/pulses.rst index 76cfae4f9b..0c330d2a83 100644 --- a/doc/source/tutorials/pulses.rst +++ b/doc/source/tutorials/pulses.rst @@ -12,10 +12,10 @@ pulses (:class:`qibolab.pulses.Pulse`) through the from qibolab.sequence import PulseSequence # Define PulseSequence - sequence = PulseSequence( + sequence = PulseSequence.load( [ ( - "channel_0", + "0/drive", Pulse( amplitude=0.3, duration=60, @@ -23,9 +23,9 @@ pulses (:class:`qibolab.pulses.Pulse`) through the envelope=Gaussian(rel_sigma=0.2), ), ), - ("channel_1", Delay(duration=100)), + ("1/drive", Delay(duration=100)), ( - "channel_1", + "1/drive", Pulse( amplitude=0.5, duration=3000, relative_phase=0, envelope=Rectangular() ), diff --git a/src/qibolab/sequence.py b/src/qibolab/sequence.py index 02292c9616..1cfdc35725 100644 --- a/src/qibolab/sequence.py +++ b/src/qibolab/sequence.py @@ -7,7 +7,7 @@ from pydantic import TypeAdapter from pydantic_core import core_schema -from .identifier import ChannelId +from .identifier import ChannelId, ChannelType from .pulses import Delay, Pulse, PulseLike __all__ = ["PulseSequence"] From 1243019b82e71e8ee9bb894b08314e83a9908b5a Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 16 Aug 2024 18:32:44 +0200 Subject: [PATCH 0660/1006] feat: Add acquisition instruction --- src/qibolab/pulses/pulse.py | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index e380f6fdaf..4715f0adac 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -61,11 +61,13 @@ def envelopes(self, sampling_rate: float) -> IqWaveform: class Delay(_PulseLike): - """A wait instruction during which we are not sending any pulses to the - QPU.""" + """Wait instruction. + + During its length no pulse is sent on the same channel. + """ duration: float - """Delay duration in ns.""" + """Duration in ns.""" class VirtualZ(_PulseLike): @@ -80,4 +82,15 @@ def duration(self): return 0 -PulseLike = Union[Pulse, Delay, VirtualZ] +class Acquisition(_PulseLike): + """Acquisition instruction. + + This event instructs the device to acquire samples for the event + span. + """ + + duration: float + """Duration in ns.""" + + +PulseLike = Union[Pulse, Delay, VirtualZ, Acquisition] From ee35c33f02169621f3e4b7fafd330825b991eea1 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 16 Aug 2024 18:33:03 +0200 Subject: [PATCH 0661/1006] docs: Specify the validity of each instruction --- src/qibolab/pulses/pulse.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index 4715f0adac..fa9b19dbe0 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -16,7 +16,10 @@ def id(self) -> int: class Pulse(_PulseLike): - """A pulse to be sent to the QPU.""" + """A pulse to be sent to the QPU. + + Valid on any channel, except acquisition ones. + """ duration: float """Pulse duration.""" @@ -64,6 +67,8 @@ class Delay(_PulseLike): """Wait instruction. During its length no pulse is sent on the same channel. + + Valid on any channel. """ duration: float @@ -71,7 +76,10 @@ class Delay(_PulseLike): class VirtualZ(_PulseLike): - """Implementation of Z-rotations using virtual phase.""" + """Implementation of Z-rotations using virtual phase. + + Only valid on a drive channel. + """ phase: float """Phase that implements the rotation.""" @@ -87,6 +95,8 @@ class Acquisition(_PulseLike): This event instructs the device to acquire samples for the event span. + + Only valid on an acquisition channel. """ duration: float From f6ee6d9acd706f7f763be2c70fca90c2f1936ce2 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 16 Aug 2024 19:29:25 +0200 Subject: [PATCH 0662/1006] feat!: Switch from probe pulses to acquisition events --- src/qibolab/sequence.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/qibolab/sequence.py b/src/qibolab/sequence.py index 1cfdc35725..99205845e5 100644 --- a/src/qibolab/sequence.py +++ b/src/qibolab/sequence.py @@ -7,8 +7,10 @@ from pydantic import TypeAdapter from pydantic_core import core_schema -from .identifier import ChannelId, ChannelType -from .pulses import Delay, Pulse, PulseLike +from qibolab.pulses.pulse import Acquisition + +from .identifier import ChannelId +from .pulses import Delay, PulseLike __all__ = ["PulseSequence"] @@ -101,12 +103,7 @@ def trim(self) -> "PulseSequence": return type(self)(reversed(new)) @property - def probe_pulses(self) -> list[Pulse]: + def acquisitions(self) -> list[tuple[ChannelId, Acquisition]]: """Return list of the readout pulses in this sequence.""" # pulse filter needed to exclude delays - return [ - pulse - for (ch, pulse) in self - if isinstance(pulse, Pulse) - if ch.channel_type is ChannelType.PROBE - ] + return [el for el in self if isinstance(el[1], Acquisition)] From 94ecd063a67d0b99075bf4135056ef0e01874601 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 16 Aug 2024 19:29:51 +0200 Subject: [PATCH 0663/1006] fix: Propagate acquisitions usage --- src/qibolab/backends.py | 6 ++---- src/qibolab/instruments/dummy.py | 10 ++++++---- src/qibolab/instruments/emulator/pulse_simulator.py | 10 +++++----- src/qibolab/instruments/icarusqfpga.py | 4 ++-- src/qibolab/instruments/qblox/cluster_qrm_rf.py | 12 ++++++------ src/qibolab/instruments/qblox/controller.py | 12 ++++++------ src/qibolab/instruments/rfsoc/driver.py | 10 +++++----- src/qibolab/platform/platform.py | 4 ++-- src/qibolab/unrolling.py | 2 +- 9 files changed, 35 insertions(+), 35 deletions(-) diff --git a/src/qibolab/backends.py b/src/qibolab/backends.py index b57c69ee9c..11185800c6 100644 --- a/src/qibolab/backends.py +++ b/src/qibolab/backends.py @@ -69,7 +69,7 @@ def assign_measurements(self, measurement_map, readout): containing the readout measurement shots. This is created in ``execute_circuit``. """ for gate, sequence in measurement_map.items(): - _samples = (readout[pulse.id] for pulse in sequence.probe_pulses) + _samples = (readout[acq.id] for acq in sequence.acquisitions) samples = list(filter(lambda x: x is not None, _samples)) gate.result.backend = self gate.result.register_samples(np.array(samples).T) @@ -159,9 +159,7 @@ def execute_circuits(self, circuits, initial_states=None, nshots=1000): MeasurementOutcomes(circuit.measurements, self, nshots=nshots) ) for gate, sequence in measurement_map.items(): - samples = [ - readout[pulse.id].popleft() for pulse in sequence.probe_pulses - ] + samples = [readout[acq.id].popleft() for acq in sequence.acquisitions] gate.result.backend = self gate.result.register_samples(np.array(samples).T) return results diff --git a/src/qibolab/instruments/dummy.py b/src/qibolab/instruments/dummy.py index f5629764c6..36c678f238 100644 --- a/src/qibolab/instruments/dummy.py +++ b/src/qibolab/instruments/dummy.py @@ -4,7 +4,7 @@ from qibo.config import log from qibolab import AcquisitionType, AveragingMode, ExecutionParameters -from qibolab.pulses import Pulse +from qibolab.pulses.pulse import Acquisition from qibolab.sequence import PulseSequence from qibolab.sweeper import ParallelSweepers from qibolab.unrolling import Bounds @@ -95,10 +95,12 @@ def play( options: ExecutionParameters, sweepers: list[ParallelSweepers], ): - def values(pulse: Pulse): - samples = int(pulse.duration * self.sampling_rate) + def values(acq: Acquisition): + samples = int(acq.duration * self.sampling_rate) return np.array( self.values(options, options.results_shape(sweepers, samples)) ) - return {ro.id: values(ro) for seq in sequences for ro in seq.probe_pulses} + return { + acq.id: values(acq) for seq in sequences for (_, acq) in seq.acquisitions + } diff --git a/src/qibolab/instruments/emulator/pulse_simulator.py b/src/qibolab/instruments/emulator/pulse_simulator.py index 35d848ef21..3e40b1b5ba 100644 --- a/src/qibolab/instruments/emulator/pulse_simulator.py +++ b/src/qibolab/instruments/emulator/pulse_simulator.py @@ -154,7 +154,7 @@ def play( Qibolab results object, as well as simulation-related time and states data. """ nshots = execution_parameters.nshots - ro_pulse_list = sequence.probe_pulses + ro_pulse_list = sequence.acquisitions times_dict, output_states, ro_reduced_dm, rdm_qubit_list = ( self.run_pulse_simulation(sequence, self.instant_measurement) ) @@ -249,7 +249,7 @@ def sweep( # reshape and reformat samples to results format results = get_results_from_samples( - sequence.probe_pulses, sweep_samples, execution_parameters, sweeper_shape + sequence.acquisitions, sweep_samples, execution_parameters, sweeper_shape ) # Reset pulse values back to original values (following icarusqfpga) @@ -359,7 +359,7 @@ def _sweep_play( dict: A tuple with dictionary containing simulation-related time data, a list of states at each time step in the simulation, and a dictionary mapping the qubit indices to list of sampled values. """ nshots = execution_parameters.nshots - ro_pulse_list = sequence.probe_pulses + ro_pulse_list = sequence.acquisitions # run pulse simulation times_dict, state_history, ro_reduced_dm, rdm_qubit_list = ( @@ -753,7 +753,7 @@ def truncate_ro_pulses( `qibolab.pulses.PulseSequence`: Modified pulse sequence with one time step readout pulses. """ sequence = copy.deepcopy(sequence) - for pulse in sequence.probe_pulses: - pulse.duration = 1 + for _, acq in sequence.acquisitions: + acq.duration = 1 return sequence diff --git a/src/qibolab/instruments/icarusqfpga.py b/src/qibolab/instruments/icarusqfpga.py index ab620d4a92..87f00c16bf 100644 --- a/src/qibolab/instruments/icarusqfpga.py +++ b/src/qibolab/instruments/icarusqfpga.py @@ -250,8 +250,8 @@ def play( """ super().play(qubits, couplers, sequence, options) self.device.set_adc_trigger_repetition_rate(int(options.relaxation_time / 1e3)) - readout_pulses = sequence.probe_pulses - readout_qubits = [pulse.qubit for pulse in readout_pulses] + readout_pulses = sequence.acquisitions + readout_qubits = [acq.qubit for (_, acq) in readout_pulses] if options.acquisition_type is AcquisitionType.RAW: self.device.set_adc_trigger_mode(0) diff --git a/src/qibolab/instruments/qblox/cluster_qrm_rf.py b/src/qibolab/instruments/qblox/cluster_qrm_rf.py index 4c70faff72..5fd8254475 100644 --- a/src/qibolab/instruments/qblox/cluster_qrm_rf.py +++ b/src/qibolab/instruments/qblox/cluster_qrm_rf.py @@ -617,7 +617,7 @@ def process_pulse_sequence( # Acquisitions pulse = None for acquisition_index, pulse in enumerate( - sequencer.pulses.probe_pulses + sequencer.pulses.acquisitions ): sequencer.acquisitions[pulse.id] = { "num_bins": num_bins, @@ -766,14 +766,14 @@ def process_pulse_sequence( # Prepare acquire instruction: acquire acquisition_index, bin_index, delay_next_instruction if active_reset: pulses_block.append( - f"acquire {pulses.probe_pulses.index(pulses[n])},{bin_n},4" + f"acquire {pulses.acquisitions.index(pulses[n])},{bin_n},4" ) pulses_block.append( f"latch_rst {delay_after_acquire + 300 - 4}" ) else: pulses_block.append( - f"acquire {pulses.probe_pulses.index(pulses[n])},{bin_n},{delay_after_acquire}" + f"acquire {pulses.acquisitions.index(pulses[n])},{bin_n},{delay_after_acquire}" ) else: @@ -999,8 +999,8 @@ def acquire(self): "scope_acquisition" ] if not hardware_demod_enabled: # Software Demodulation - if len(sequencer.pulses.probe_pulses) == 1: - pulse = sequencer.pulses.probe_pulses[0] + if len(sequencer.pulses.acquisitions) == 1: + pulse = sequencer.pulses.acquisitions[0] frequency = self.get_if(pulse) acquisitions[pulse.qubit] = acquisitions[pulse.id] = ( AveragedAcquisition(scope, duration, frequency) @@ -1012,7 +1012,7 @@ def acquire(self): ) else: # Hardware Demodulation results = self.device.get_acquisitions(sequencer.number) - for pulse in sequencer.pulses.probe_pulses: + for pulse in sequencer.pulses.acquisitions: bins = results[pulse.id]["acquisition"]["bins"] acquisitions[pulse.qubit] = acquisitions[pulse.id] = ( DemodulatedAcquisition(scope, bins, duration) diff --git a/src/qibolab/instruments/qblox/controller.py b/src/qibolab/instruments/qblox/controller.py index a1ccc32c8b..0db1841302 100644 --- a/src/qibolab/instruments/qblox/controller.py +++ b/src/qibolab/instruments/qblox/controller.py @@ -197,7 +197,7 @@ def _execute_pulse_sequence( for name, module in self.modules.items(): if ( isinstance(module, QrmRf) - and not module_pulses[name].probe_pulses.is_empty + and not module_pulses[name].acquisitions.is_empty ): results = module.acquire() for key, value in results.items(): @@ -205,7 +205,7 @@ def _execute_pulse_sequence( # TODO: move to QRM_RF.acquire() shape = tuple(len(sweeper.values) for sweeper in reversed(sweepers)) shots_shape = (nshots,) + shape - for ro_pulse in sequence.probe_pulses: + for ro_pulse in sequence.acquisitions: if options.acquisition_type is AcquisitionType.DISCRIMINATION: _res = acquisition_results[ro_pulse.id].classified _res = np.reshape(_res, shots_shape) @@ -286,7 +286,7 @@ def sweep( sweepers_copy.reverse() # create a map between the pulse id, which never changes, and the original serial - for pulse in sequence_copy.probe_pulses: + for pulse in sequence_copy.acquisitions: map_id_serial[pulse.id] = pulse.id id_results[pulse.id] = None id_results[pulse.qubit] = None @@ -302,7 +302,7 @@ def sweep( # return the results using the original serials serial_results = {} - for pulse in sequence_copy.probe_pulses: + for pulse in sequence_copy.acquisitions: serial_results[map_id_serial[pulse.id]] = id_results[pulse.id] serial_results[pulse.qubit] = id_results[pulse.id] return serial_results @@ -400,7 +400,7 @@ def _sweep_recursion( result = self._execute_pulse_sequence( qubits=qubits, sequence=sequence, options=options ) - for pulse in sequence.probe_pulses: + for pulse in sequence.acquisitions: if results[pulse.id]: results[pulse.id] += result[pulse.id] else: @@ -534,7 +534,7 @@ def _combine_result_chunks(chunks): @staticmethod def _add_to_results(sequence, results, results_to_add): - for pulse in sequence.probe_pulses: + for pulse in sequence.acquisitions: if results[pulse.id]: results[pulse.id] += results_to_add[pulse.id] else: diff --git a/src/qibolab/instruments/rfsoc/driver.py b/src/qibolab/instruments/rfsoc/driver.py index fdfa81c3e6..d134f3e4e7 100644 --- a/src/qibolab/instruments/rfsoc/driver.py +++ b/src/qibolab/instruments/rfsoc/driver.py @@ -105,7 +105,7 @@ def validate_input_command( raise NotImplementedError( "Raw data acquisition is not compatible with sweepers" ) - if len(sequence.probe_pulses) != 1: + if len(sequence.acquisitions) != 1: raise NotImplementedError( "Raw data acquisition is compatible only with a single readout" ) @@ -244,10 +244,10 @@ def play( toti, totq = self._execute_pulse_sequence(sequence, qubits, opcode) results = {} - probed_qubits = np.unique([p.qubit for p in sequence.probe_pulses]) + probed_qubits = np.unique([p.qubit for p in sequence.acquisitions]) for j, qubit in enumerate(probed_qubits): - for i, ro_pulse in enumerate(sequence.probe_pulses.get_qubit_pulses(qubit)): + for i, ro_pulse in enumerate(sequence.acquisitions.get_qubit_pulses(qubit)): i_pulse = np.array(toti[j][i]) q_pulse = np.array(totq[j][i]) @@ -313,7 +313,7 @@ def play_sequence_in_sweep_recursion( """ res = self.play(qubits, couplers, sequence, execution_parameters) newres = {} - serials = [pulse.id for pulse in or_sequence.probe_pulses] + serials = [acq.id for (_, acq) in or_sequence.acquisitions] for idx, key in enumerate(res): if idx % 2 == 1: newres[serials[idx // 2]] = res[key] @@ -588,7 +588,7 @@ def sweep( qubits, couplers, sweepsequence, - sequence.probe_pulses, + sequence.acquisitions, *rfsoc_sweepers, execution_parameters=execution_parameters, ) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 13b8c87238..179046437f 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -56,8 +56,8 @@ def unroll_sequences( for sequence in sequences: total_sequence.concatenate(sequence) # TODO: Fix unrolling results - for pulse in sequence.probe_pulses: - readout_map[pulse.id].append(pulse.id) + for _, acq in sequence.acquisitions: + readout_map[acq.id].append(acq.id) length = sequence.duration + relaxation_time for channel in sequence.channels: diff --git a/src/qibolab/unrolling.py b/src/qibolab/unrolling.py index 8eefafbbe6..d05deb71a6 100644 --- a/src/qibolab/unrolling.py +++ b/src/qibolab/unrolling.py @@ -31,7 +31,7 @@ def _waveform(sequence: PulseSequence): def _readout(sequence: PulseSequence): # TODO: Do we count 1 readout per pulse or 1 readout per multiplexed readout ? - return len(sequence.probe_pulses) + return len(sequence.acquisitions) def _instructions(sequence: PulseSequence): From a03a425f3e968e1343f21eaef643434d871822bf Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 16 Aug 2024 19:36:04 +0200 Subject: [PATCH 0664/1006] fix: Add kind to distinguish delay and acquisitions --- src/qibolab/pulses/pulse.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index fa9b19dbe0..15c2fef76e 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -1,8 +1,9 @@ """Pulse class.""" -from typing import Union +from typing import Annotated, Literal, Union import numpy as np +from pydantic import Field from qibolab.serialize import Model @@ -21,6 +22,8 @@ class Pulse(_PulseLike): Valid on any channel, except acquisition ones. """ + kind: Literal["pulse"] = "pulse" + duration: float """Pulse duration.""" @@ -71,6 +74,8 @@ class Delay(_PulseLike): Valid on any channel. """ + kind: Literal["delay"] = "delay" + duration: float """Duration in ns.""" @@ -81,6 +86,8 @@ class VirtualZ(_PulseLike): Only valid on a drive channel. """ + kind: Literal["virtualz"] = "virtualz" + phase: float """Phase that implements the rotation.""" @@ -99,8 +106,12 @@ class Acquisition(_PulseLike): Only valid on an acquisition channel. """ + kind: Literal["acquisition"] = "acquisition" + duration: float """Duration in ns.""" -PulseLike = Union[Pulse, Delay, VirtualZ, Acquisition] +PulseLike = Annotated[ + Union[Pulse, Delay, VirtualZ, Acquisition], Field(discriminator="kind") +] From 7806cc9ebdee130da2005ac5ce6902b993800ef8 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 16 Aug 2024 19:50:40 +0200 Subject: [PATCH 0665/1006] fix: Upgrade dummy to use acquisitions --- src/qibolab/dummy/parameters.json | 1666 +++++++++++++++-------------- 1 file changed, 875 insertions(+), 791 deletions(-) diff --git a/src/qibolab/dummy/parameters.json b/src/qibolab/dummy/parameters.json index 5f708b7533..e427c9ca1e 100644 --- a/src/qibolab/dummy/parameters.json +++ b/src/qibolab/dummy/parameters.json @@ -1,794 +1,878 @@ { - "settings": { - "nshots": 1024, - "relaxation_time": 0 - }, - "configs": { - "dummy/bounds": { - "kind": "bounds", - "waveforms": 0, - "readout": 0, - "instructions": 0 - }, - "qubit_0/drive": { - "kind": "iq", - "frequency": 4000000000.0 - }, - "qubit_1/drive": { - "kind": "iq", - "frequency": 4200000000.0 - }, - "qubit_2/drive": { - "kind": "iq", - "frequency": 4500000000.0 - }, - "qubit_3/drive": { - "kind": "iq", - "frequency": 4150000000.0 - }, - "qubit_4/drive": { - "kind": "iq", - "frequency": 4155663000.0 - }, - "qubit_0/drive12": { - "kind": "iq", - "frequency": 4700000000.0 - }, - "qubit_1/drive12": { - "kind": "iq", - "frequency": 4855663000.0 - }, - "qubit_2/drive12": { - "kind": "iq", - "frequency": 2700000000.0 - }, - "qubit_3/drive12": { - "kind": "iq", - "frequency": 5855663000.0 - }, - "qubit_4/drive12": { - "kind": "iq", - "frequency": 5855663000.0 - }, - "qubit_0/flux": { - "kind": "dc", - "offset": -0.1 - }, - "qubit_1/flux": { - "kind": "dc", - "offset": 0.0 - }, - "qubit_2/flux": { - "kind": "dc", - "offset": 0.1 - }, - "qubit_3/flux": { - "kind": "dc", - "offset": 0.2 - }, - "qubit_4/flux": { - "kind": "dc", - "offset": 0.15 - }, - "qubit_0/probe": { - "kind": "iq", - "frequency": 5200000000.0 - }, - "qubit_1/probe": { - "kind": "iq", - "frequency": 4900000000.0 - }, - "qubit_2/probe": { - "kind": "iq", - "frequency": 6100000000.0 - }, - "qubit_3/probe": { - "kind": "iq", - "frequency": 5800000000.0 - }, - "qubit_4/probe": { - "kind": "iq", - "frequency": 5500000000.0 - }, - "qubit_0/acquisition": { - "kind": "acquisition", - "delay": 0.0, - "smearing": 0.0, - "threshold": 0.0, - "iq_angle": 0.0, - "kernel": "k05VTVBZAQB2AHsnZGVzY3InOiAnPGY4JywgJ2ZvcnRyYW5fb3JkZXInOiBGYWxzZSwgJ3NoYXBlJzogKDEwLCksIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAp5sDfS7uHlP2DIMKNvnKc/gCqN8KV/pT94FQCYYJC3PzSbwfi/894/APwg6C61rj8MSN3blizAP2ha9unQYsM/+BFjHTxcwT+gXaJazvbpPw==" - }, - "qubit_1/acquisition": { - "kind": "acquisition", - "delay": 0.0, - "smearing": 0.0, - "threshold": 0.0, - "iq_angle": 0.0, - "kernel": "k05VTVBZAQB2AHsnZGVzY3InOiAnPGY4JywgJ2ZvcnRyYW5fb3JkZXInOiBGYWxzZSwgJ3NoYXBlJzogKDEwLCksIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAr4dT6V5tHrP1w+JhHImN8/sPePZeSUuj/4yTKrD5fRP/ysonZip98/6GJMAPV9xD/LTiJo4k7oP96aWXpxduU/6fUxETe/7z9GXEBNGebWPw==" - }, - "qubit_2/acquisition": { - "kind": "acquisition", - "delay": 0.0, - "smearing": 0.0, - "threshold": 0.0, - "iq_angle": 0.0, - "kernel": "k05VTVBZAQB2AHsnZGVzY3InOiAnPGY4JywgJ2ZvcnRyYW5fb3JkZXInOiBGYWxzZSwgJ3NoYXBlJzogKDEwLCksIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApUtcFdBpTsPzzwG8Xkbts/OAvkS0qo4z+OUcJpZ8HlP/jsO9cUwso/s6DVM7e/4T/NL4JYzUXvP9CibqEg98M/AENJ8QPkcD8wAOtI4pHNPw==" - }, - "qubit_3/acquisition": { - "kind": "acquisition", - "delay": 0.0, - "smearing": 0.0, - "threshold": 0.0, - "iq_angle": 0.0, - "kernel": "k05VTVBZAQB2AHsnZGVzY3InOiAnPGY4JywgJ2ZvcnRyYW5fb3JkZXInOiBGYWxzZSwgJ3NoYXBlJzogKDEwLCksIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogk3D0+DqsP1ry/LSlMuM/ydJYpPk/6D8BJMdYs+zsP1CqhVqYz+o/1A3srA5z7j8CUqCE6lvqPwjNySZ1DuA/YHGvVmuFsz+XwaQKz/bqPw==" - }, - "qubit_4/acquisition": { - "kind": "acquisition", - "delay": 0.0, - "smearing": 0.0, - "threshold": 0.0, - "iq_angle": 0.0, - "kernel": "k05VTVBZAQB2AHsnZGVzY3InOiAnPGY4JywgJ2ZvcnRyYW5fb3JkZXInOiBGYWxzZSwgJ3NoYXBlJzogKDEwLCksIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIArIY+/UbVjMP+yH0UH5xOU/YDXeTaxK4j/Au9mGjGjBPx1R4v/zy+Q/+OxfZT0Vzj/5ng1s2GzkP64nr91FXOk/9/ggMXmG4D+6NjR7dMHtPw==" - }, - "coupler_0/flux": { - "kind": "dc", - "offset": 0.0 - }, - "coupler_1/flux": { - "kind": "dc", - "offset": 0.0 - }, - "coupler_3/flux": { - "kind": "dc", - "offset": 0.0 - }, - "coupler_4/flux": { - "kind": "dc", - "offset": 0.0 - }, - "twpa_pump": { - "kind": "oscillator", - "frequency": 1000000000.0, - "power": 10.0 - } - }, - "native_gates": { - "single_qubit": { - "0": { - "RX": [ - [ - "qubit_0/drive", - { - "duration": 40.0, - "amplitude": 0.1, - "envelope": { - "kind": "gaussian", - "rel_sigma": 5.0 - }, - "relative_phase": 0.0 - } - ] - ], - "RX12": [ - [ - "qubit_0/drive12", - { - "duration": 40.0, - "amplitude": 0.005, - "envelope": { - "kind": "gaussian", - "rel_sigma": 5.0 - }, - "relative_phase": 0.0 - } - ] - ], - "MZ": [ - [ - "qubit_0/probe", - { - "duration": 2000.0, - "amplitude": 0.1, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - }, - "relative_phase": 0.0 - } - ] - ], - "CP": null - }, - "1": { - "RX": [ - [ - "qubit_1/drive", - { - "duration": 40.0, - "amplitude": 0.3, - "envelope": { - "kind": "drag", - "rel_sigma": 5.0, - "beta": 0.02 - }, - "relative_phase": 0.0 - } - ] - ], - "RX12": [ - [ - "qubit_1/drive12", - { - "duration": 40.0, - "amplitude": 0.0484, - "envelope": { - "kind": "drag", - "rel_sigma": 5.0, - "beta": 0.02 - }, - "relative_phase": 0.0 - } - ] - ], - "MZ": [ - [ - "qubit_1/probe", - { - "duration": 2000.0, - "amplitude": 0.1, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - }, - "relative_phase": 0.0 - } - ] - ], - "CP": null - }, - "2": { - "RX": [ - [ - "qubit_2/drive", - { - "duration": 40.0, - "amplitude": 0.3, - "envelope": { - "kind": "drag", - "rel_sigma": 5.0, - "beta": 0.02 - }, - "relative_phase": 0.0 - } - ] - ], - "RX12": [ - [ - "qubit_2/drive12", - { - "duration": 40.0, - "amplitude": 0.005, - "envelope": { - "kind": "gaussian", - "rel_sigma": 5.0 - }, - "relative_phase": 0.0 - } - ] - ], - "MZ": [ - [ - "qubit_2/probe", - { - "duration": 2000.0, - "amplitude": 0.1, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - }, - "relative_phase": 0.0 - } - ] - ], - "CP": null - }, - "3": { - "RX": [ - [ - "qubit_3/drive", - { - "duration": 40.0, - "amplitude": 0.3, - "envelope": { - "kind": "drag", - "rel_sigma": 5.0, - "beta": 0.02 - }, - "relative_phase": 0.0 - } - ] - ], - "RX12": [ - [ - "qubit_3/drive12", - { - "duration": 40.0, - "amplitude": 0.0484, - "envelope": { - "kind": "drag", - "rel_sigma": 5.0, - "beta": 0.02 - }, - "relative_phase": 0.0 - } - ] - ], - "MZ": [ - [ - "qubit_3/probe", - { - "duration": 2000.0, - "amplitude": 0.1, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - }, - "relative_phase": 0.0 - } - ] - ], - "CP": null - }, - "4": { - "RX": [ - [ - "qubit_4/drive", - { - "duration": 40.0, - "amplitude": 0.3, - "envelope": { - "kind": "drag", - "rel_sigma": 5.0, - "beta": 0.02 - }, - "relative_phase": 0.0 - } - ] - ], - "RX12": [ - [ - "qubit_4/drive12", - { - "duration": 40.0, - "amplitude": 0.0484, - "envelope": { - "kind": "drag", - "rel_sigma": 5.0, - "beta": 0.02 - }, - "relative_phase": 0.0 - } - ] - ], - "MZ": [ - [ - "qubit_4/probe", - { - "duration": 2000.0, - "amplitude": 0.1, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - }, - "relative_phase": 0.0 - } - ] - ], - "CP": null - } - }, - "coupler": { - "0": { - "RX": null, - "RX12": null, - "MZ": null, - "CP": [ - [ - "coupler_0/flux", - { - "duration": 30.0, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - }, - "relative_phase": 0.0 - } - ] - ] - }, - "1": { - "RX": null, - "RX12": null, - "MZ": null, - "CP": [ - [ - "coupler_1/flux", - { - "duration": 30.0, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - }, - "relative_phase": 0.0 - } - ] - ] - }, - "3": { - "RX": null, - "RX12": null, - "MZ": null, - "CP": [ - [ - "coupler_3/flux", - { - "duration": 30.0, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - }, - "relative_phase": 0.0 - } - ] - ] - }, - "4": { - "RX": null, - "RX12": null, - "MZ": null, - "CP": [ - [ - "coupler_4/flux", - { - "duration": 30.0, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - }, - "relative_phase": 0.0 - } - ] - ] - } - }, - "two_qubit": { - "0-2": { - "CZ": [ - [ - "qubit_2/flux", - { - "duration": 30.0, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - }, - "relative_phase": 0.0 - } - ], - [ - "qubit_0/drive", - { - "phase": 0.0 - } - ], - [ - "qubit_2/drive", - { - "phase": 0.0 - } - ], - [ - "coupler_0/flux", - { - "duration": 30.0, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - }, - "relative_phase": 0.0 - } - ] - ], - "CNOT": null, - "iSWAP": [ - [ - "qubit_2/flux", - { - "duration": 30.0, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - }, - "relative_phase": 0.0 - } - ], - [ - "qubit_0/drive", - { - "phase": 0.0 - } - ], - [ - "qubit_2/drive", - { - "phase": 0.0 - } - ], - [ - "coupler_0/flux", - { - "duration": 30.0, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - }, - "relative_phase": 0.0 - } - ] - ] - }, - "1-2": { - "CZ": [ - [ - "qubit_2/flux", - { - "duration": 30.0, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - }, - "relative_phase": 0.0 - } - ], - [ - "qubit_1/drive", - { - "phase": 0.0 - } - ], - [ - "qubit_2/drive", - { - "phase": 0.0 - } - ], - [ - "coupler_1/flux", - { - "duration": 30.0, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - }, - "relative_phase": 0.0 - } - ] - ], - "CNOT": null, - "iSWAP": [ - [ - "qubit_2/flux", - { - "duration": 30.0, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - }, - "relative_phase": 0.0 - } - ], - [ - "qubit_1/drive", - { - "phase": 0.0 - } - ], - [ - "qubit_2/drive", - { - "phase": 0.0 - } - ], - [ - "coupler_1/flux", - { - "duration": 30.0, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - }, - "relative_phase": 0.0 - } - ] - ] - }, - "2-3": { - "CZ": [ - [ - "qubit_2/flux", - { - "duration": 30.0, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - }, - "relative_phase": 0.0 - } - ], - [ - "qubit_2/drive", - { - "phase": 0.0 - } - ], - [ - "qubit_3/drive", - { - "phase": 0.0 - } - ] - ], - "CNOT": [ - [ - "qubit_2/drive", - { - "duration": 40.0, - "amplitude": 0.3, - "envelope": { - "kind": "drag", - "rel_sigma": 5.0, - "beta": 0.02 - }, - "relative_phase": 0.0 - } - ] - ], - "iSWAP": [ - [ - "qubit_2/flux", - { - "duration": 30.0, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - }, - "relative_phase": 0.0 - } - ], - [ - "qubit_2/drive", - { - "phase": 0.0 - } - ], - [ - "qubit_3/drive", - { - "phase": 0.0 - } - ] - ] - }, - "2-4": { - "CZ": [ - [ - "qubit_2/flux", - { - "duration": 30.0, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - }, - "relative_phase": 0.0 - } - ], - [ - "qubit_4/drive", - { - "phase": 0.0 - } - ], - [ - "coupler_4/flux", - { - "duration": 30.0, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - }, - "relative_phase": 0.0 - } - ] - ], - "CNOT": null, - "iSWAP": [ - [ - "qubit_2/flux", - { - "duration": 30.0, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - }, - "relative_phase": 0.0 - } - ], - [ - "qubit_2/drive", - { - "phase": 0.0 - } - ], - [ - "qubit_4/drive", - { - "phase": 0.0 - } - ], - [ - "coupler_4/flux", - { - "duration": 30.0, - "amplitude": 0.05, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - }, - "relative_phase": 0.0 - } - ] - ] - } - } + "settings": { + "nshots": 1024, + "relaxation_time": 0 + }, + "configs": { + "dummy/bounds": { + "kind": "bounds", + "waveforms": 0, + "readout": 0, + "instructions": 0 + }, + "qubit_0/drive": { + "kind": "iq", + "frequency": 4000000000.0 + }, + "qubit_1/drive": { + "kind": "iq", + "frequency": 4200000000.0 + }, + "qubit_2/drive": { + "kind": "iq", + "frequency": 4500000000.0 + }, + "qubit_3/drive": { + "kind": "iq", + "frequency": 4150000000.0 + }, + "qubit_4/drive": { + "kind": "iq", + "frequency": 4155663000.0 + }, + "qubit_0/drive12": { + "kind": "iq", + "frequency": 4700000000.0 + }, + "qubit_1/drive12": { + "kind": "iq", + "frequency": 4855663000.0 + }, + "qubit_2/drive12": { + "kind": "iq", + "frequency": 2700000000.0 + }, + "qubit_3/drive12": { + "kind": "iq", + "frequency": 5855663000.0 + }, + "qubit_4/drive12": { + "kind": "iq", + "frequency": 5855663000.0 + }, + "qubit_0/flux": { + "kind": "dc", + "offset": -0.1 + }, + "qubit_1/flux": { + "kind": "dc", + "offset": 0.0 + }, + "qubit_2/flux": { + "kind": "dc", + "offset": 0.1 + }, + "qubit_3/flux": { + "kind": "dc", + "offset": 0.2 + }, + "qubit_4/flux": { + "kind": "dc", + "offset": 0.15 + }, + "qubit_0/probe": { + "kind": "iq", + "frequency": 5200000000.0 + }, + "qubit_1/probe": { + "kind": "iq", + "frequency": 4900000000.0 + }, + "qubit_2/probe": { + "kind": "iq", + "frequency": 6100000000.0 + }, + "qubit_3/probe": { + "kind": "iq", + "frequency": 5800000000.0 + }, + "qubit_4/probe": { + "kind": "iq", + "frequency": 5500000000.0 + }, + "qubit_0/acquisition": { + "kind": "acquisition", + "delay": 0.0, + "smearing": 0.0, + "threshold": 0.0, + "iq_angle": 0.0, + "kernel": "k05VTVBZAQB2AHsnZGVzY3InOiAnPGY4JywgJ2ZvcnRyYW5fb3JkZXInOiBGYWxzZSwgJ3NoYXBlJzogKDEwLCksIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAp5sDfS7uHlP2DIMKNvnKc/gCqN8KV/pT94FQCYYJC3PzSbwfi/894/APwg6C61rj8MSN3blizAP2ha9unQYsM/+BFjHTxcwT+gXaJazvbpPw==" + }, + "qubit_1/acquisition": { + "kind": "acquisition", + "delay": 0.0, + "smearing": 0.0, + "threshold": 0.0, + "iq_angle": 0.0, + "kernel": "k05VTVBZAQB2AHsnZGVzY3InOiAnPGY4JywgJ2ZvcnRyYW5fb3JkZXInOiBGYWxzZSwgJ3NoYXBlJzogKDEwLCksIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAr4dT6V5tHrP1w+JhHImN8/sPePZeSUuj/4yTKrD5fRP/ysonZip98/6GJMAPV9xD/LTiJo4k7oP96aWXpxduU/6fUxETe/7z9GXEBNGebWPw==" + }, + "qubit_2/acquisition": { + "kind": "acquisition", + "delay": 0.0, + "smearing": 0.0, + "threshold": 0.0, + "iq_angle": 0.0, + "kernel": "k05VTVBZAQB2AHsnZGVzY3InOiAnPGY4JywgJ2ZvcnRyYW5fb3JkZXInOiBGYWxzZSwgJ3NoYXBlJzogKDEwLCksIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApUtcFdBpTsPzzwG8Xkbts/OAvkS0qo4z+OUcJpZ8HlP/jsO9cUwso/s6DVM7e/4T/NL4JYzUXvP9CibqEg98M/AENJ8QPkcD8wAOtI4pHNPw==" + }, + "qubit_3/acquisition": { + "kind": "acquisition", + "delay": 0.0, + "smearing": 0.0, + "threshold": 0.0, + "iq_angle": 0.0, + "kernel": "k05VTVBZAQB2AHsnZGVzY3InOiAnPGY4JywgJ2ZvcnRyYW5fb3JkZXInOiBGYWxzZSwgJ3NoYXBlJzogKDEwLCksIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogk3D0+DqsP1ry/LSlMuM/ydJYpPk/6D8BJMdYs+zsP1CqhVqYz+o/1A3srA5z7j8CUqCE6lvqPwjNySZ1DuA/YHGvVmuFsz+XwaQKz/bqPw==" + }, + "qubit_4/acquisition": { + "kind": "acquisition", + "delay": 0.0, + "smearing": 0.0, + "threshold": 0.0, + "iq_angle": 0.0, + "kernel": "k05VTVBZAQB2AHsnZGVzY3InOiAnPGY4JywgJ2ZvcnRyYW5fb3JkZXInOiBGYWxzZSwgJ3NoYXBlJzogKDEwLCksIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIArIY+/UbVjMP+yH0UH5xOU/YDXeTaxK4j/Au9mGjGjBPx1R4v/zy+Q/+OxfZT0Vzj/5ng1s2GzkP64nr91FXOk/9/ggMXmG4D+6NjR7dMHtPw==" + }, + "coupler_0/flux": { + "kind": "dc", + "offset": 0.0 + }, + "coupler_1/flux": { + "kind": "dc", + "offset": 0.0 + }, + "coupler_3/flux": { + "kind": "dc", + "offset": 0.0 + }, + "coupler_4/flux": { + "kind": "dc", + "offset": 0.0 + }, + "twpa_pump": { + "kind": "oscillator", + "frequency": 1000000000.0, + "power": 10.0 + } + }, + "native_gates": { + "single_qubit": { + "0": { + "RX": [ + [ + "qubit_0/drive", + { + "duration": 40.0, + "amplitude": 0.1, + "envelope": { + "kind": "gaussian", + "rel_sigma": 5.0 + }, + "relative_phase": 0.0, + "kind": "pulse" + } + ] + ], + "RX12": [ + [ + "qubit_0/drive12", + { + "duration": 40.0, + "amplitude": 0.005, + "envelope": { + "kind": "gaussian", + "rel_sigma": 5.0 + }, + "relative_phase": 0.0, + "kind": "pulse" + } + ] + ], + "MZ": [ + [ + "qubit_0/probe", + { + "duration": 2000.0, + "amplitude": 0.1, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0, + "kind": "pulse" + } + ], + [ + "qubit_0/acquisition", + { + "kind": "acquisition", + "duration": 2000.0 + } + ] + ], + "CP": null + }, + "1": { + "RX": [ + [ + "qubit_1/drive", + { + "duration": 40.0, + "amplitude": 0.3, + "envelope": { + "kind": "drag", + "rel_sigma": 5.0, + "beta": 0.02 + }, + "relative_phase": 0.0, + "kind": "pulse" + } + ] + ], + "RX12": [ + [ + "qubit_1/drive12", + { + "duration": 40.0, + "amplitude": 0.0484, + "envelope": { + "kind": "drag", + "rel_sigma": 5.0, + "beta": 0.02 + }, + "relative_phase": 0.0, + "kind": "pulse" + } + ] + ], + "MZ": [ + [ + "qubit_1/probe", + { + "duration": 2000.0, + "amplitude": 0.1, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0, + "kind": "pulse" + } + ], + [ + "qubit_1/acquisition", + { + "kind": "acquisition", + "duration": 2000.0 + } + ] + ], + "CP": null + }, + "2": { + "RX": [ + [ + "qubit_2/drive", + { + "duration": 40.0, + "amplitude": 0.3, + "envelope": { + "kind": "drag", + "rel_sigma": 5.0, + "beta": 0.02 + }, + "relative_phase": 0.0, + "kind": "pulse" + } + ] + ], + "RX12": [ + [ + "qubit_2/drive12", + { + "duration": 40.0, + "amplitude": 0.005, + "envelope": { + "kind": "gaussian", + "rel_sigma": 5.0 + }, + "relative_phase": 0.0, + "kind": "pulse" + } + ] + ], + "MZ": [ + [ + "qubit_2/probe", + { + "duration": 2000.0, + "amplitude": 0.1, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0, + "kind": "pulse" + } + ], + [ + "qubit_2/acquisition", + { + "kind": "acquisition", + "duration": 2000.0 + } + ] + ], + "CP": null + }, + "3": { + "RX": [ + [ + "qubit_3/drive", + { + "duration": 40.0, + "amplitude": 0.3, + "envelope": { + "kind": "drag", + "rel_sigma": 5.0, + "beta": 0.02 + }, + "relative_phase": 0.0, + "kind": "pulse" + } + ] + ], + "RX12": [ + [ + "qubit_3/drive12", + { + "duration": 40.0, + "amplitude": 0.0484, + "envelope": { + "kind": "drag", + "rel_sigma": 5.0, + "beta": 0.02 + }, + "relative_phase": 0.0, + "kind": "pulse" + } + ] + ], + "MZ": [ + [ + "qubit_3/probe", + { + "duration": 2000.0, + "amplitude": 0.1, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0, + "kind": "pulse" + } + ], + [ + "qubit_3/acquisition", + { + "kind": "acquisition", + "duration": 2000.0 + } + ] + ], + "CP": null + }, + "4": { + "RX": [ + [ + "qubit_4/drive", + { + "duration": 40.0, + "amplitude": 0.3, + "envelope": { + "kind": "drag", + "rel_sigma": 5.0, + "beta": 0.02 + }, + "relative_phase": 0.0, + "kind": "pulse" + } + ] + ], + "RX12": [ + [ + "qubit_4/drive12", + { + "duration": 40.0, + "amplitude": 0.0484, + "envelope": { + "kind": "drag", + "rel_sigma": 5.0, + "beta": 0.02 + }, + "relative_phase": 0.0, + "kind": "pulse" + } + ] + ], + "MZ": [ + [ + "qubit_4/probe", + { + "duration": 2000.0, + "amplitude": 0.1, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0, + "kind": "pulse" + } + ], + [ + "qubit_4/acquisition", + { + "kind": "acquisition", + "duration": 2000.0 + } + ] + ], + "CP": null + } + }, + "coupler": { + "0": { + "RX": null, + "RX12": null, + "MZ": null, + "CP": [ + [ + "coupler_0/flux", + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0, + "kind": "pulse" + } + ] + ] + }, + "1": { + "RX": null, + "RX12": null, + "MZ": null, + "CP": [ + [ + "coupler_1/flux", + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0, + "kind": "pulse" + } + ] + ] + }, + "3": { + "RX": null, + "RX12": null, + "MZ": null, + "CP": [ + [ + "coupler_3/flux", + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0, + "kind": "pulse" + } + ] + ] + }, + "4": { + "RX": null, + "RX12": null, + "MZ": null, + "CP": [ + [ + "coupler_4/flux", + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0, + "kind": "pulse" + } + ] + ] + } + }, + "two_qubit": { + "0-2": { + "CZ": [ + [ + "qubit_2/flux", + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0, + "kind": "pulse" + } + ], + [ + "qubit_0/drive", + { + "phase": 0.0, + "kind": "virtualz" + } + ], + [ + "qubit_2/drive", + { + "phase": 0.0, + "kind": "virtualz" + } + ], + [ + "coupler_0/flux", + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0, + "kind": "pulse" + } + ] + ], + "CNOT": null, + "iSWAP": [ + [ + "qubit_2/flux", + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0, + "kind": "pulse" + } + ], + [ + "qubit_0/drive", + { + "phase": 0.0, + "kind": "virtualz" + } + ], + [ + "qubit_2/drive", + { + "phase": 0.0, + "kind": "virtualz" + } + ], + [ + "coupler_0/flux", + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0, + "kind": "pulse" + } + ] + ] + }, + "1-2": { + "CZ": [ + [ + "qubit_2/flux", + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0, + "kind": "pulse" + } + ], + [ + "qubit_1/drive", + { + "phase": 0.0, + "kind": "virtualz" + } + ], + [ + "qubit_2/drive", + { + "phase": 0.0, + "kind": "virtualz" + } + ], + [ + "coupler_1/flux", + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0, + "kind": "pulse" + } + ] + ], + "CNOT": null, + "iSWAP": [ + [ + "qubit_2/flux", + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0, + "kind": "pulse" + } + ], + [ + "qubit_1/drive", + { + "phase": 0.0, + "kind": "virtualz" + } + ], + [ + "qubit_2/drive", + { + "phase": 0.0, + "kind": "virtualz" + } + ], + [ + "coupler_1/flux", + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0, + "kind": "pulse" + } + ] + ] + }, + "2-3": { + "CZ": [ + [ + "qubit_2/flux", + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0, + "kind": "pulse" + } + ], + [ + "qubit_2/drive", + { + "phase": 0.0, + "kind": "virtualz" + } + ], + [ + "qubit_3/drive", + { + "phase": 0.0, + "kind": "virtualz" + } + ] + ], + "CNOT": [ + [ + "qubit_2/drive", + { + "duration": 40.0, + "amplitude": 0.3, + "envelope": { + "kind": "drag", + "rel_sigma": 5.0, + "beta": 0.02 + }, + "relative_phase": 0.0, + "kind": "pulse" + } + ] + ], + "iSWAP": [ + [ + "qubit_2/flux", + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0, + "kind": "pulse" + } + ], + [ + "qubit_2/drive", + { + "phase": 0.0, + "kind": "virtualz" + } + ], + [ + "qubit_3/drive", + { + "phase": 0.0, + "kind": "virtualz" + } + ] + ] + }, + "2-4": { + "CZ": [ + [ + "qubit_2/flux", + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0, + "kind": "pulse" + } + ], + [ + "qubit_4/drive", + { + "phase": 0.0, + "kind": "virtualz" + } + ], + [ + "coupler_4/flux", + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0, + "kind": "pulse" + } + ] + ], + "CNOT": null, + "iSWAP": [ + [ + "qubit_2/flux", + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0, + "kind": "pulse" + } + ], + [ + "qubit_2/drive", + { + "phase": 0.0, + "kind": "virtualz" + } + ], + [ + "qubit_4/drive", + { + "phase": 0.0, + "kind": "virtualz" + } + ], + [ + "coupler_4/flux", + { + "duration": 30.0, + "amplitude": 0.05, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0, + "kind": "pulse" + } + ] + ] + } } + } } From c22b102b965e1b1d8f5e640d07d4f24b230c3d69 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 16 Aug 2024 20:17:32 +0200 Subject: [PATCH 0666/1006] fix: Fix acquisition pulses iterator usage --- src/qibolab/backends.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/qibolab/backends.py b/src/qibolab/backends.py index 11185800c6..4b460849b9 100644 --- a/src/qibolab/backends.py +++ b/src/qibolab/backends.py @@ -69,7 +69,7 @@ def assign_measurements(self, measurement_map, readout): containing the readout measurement shots. This is created in ``execute_circuit``. """ for gate, sequence in measurement_map.items(): - _samples = (readout[acq.id] for acq in sequence.acquisitions) + _samples = (readout[acq.id] for _, acq in sequence.acquisitions) samples = list(filter(lambda x: x is not None, _samples)) gate.result.backend = self gate.result.register_samples(np.array(samples).T) @@ -159,7 +159,9 @@ def execute_circuits(self, circuits, initial_states=None, nshots=1000): MeasurementOutcomes(circuit.measurements, self, nshots=nshots) ) for gate, sequence in measurement_map.items(): - samples = [readout[acq.id].popleft() for acq in sequence.acquisitions] + samples = [ + readout[acq.id].popleft() for _, acq in sequence.acquisitions + ] gate.result.backend = self gate.result.register_samples(np.array(samples).T) return results From 7becd0832265c3e9042394f513798229b2bf2ccf Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 16 Aug 2024 20:20:08 +0200 Subject: [PATCH 0667/1006] fix: Fix readout map type hint --- src/qibolab/platform/platform.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 179046437f..8386299b30 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -39,7 +39,7 @@ def default(value: Optional[T], default: T) -> T: def unroll_sequences( sequences: list[PulseSequence], relaxation_time: int -) -> tuple[PulseSequence, dict[str, list[str]]]: +) -> tuple[PulseSequence, dict[int, list[int]]]: """Unrolls a list of pulse sequences to a single sequence. The resulting sequence may contain multiple measurements. From a69a30c536f1645c4cb8d651562d8fe34bf71d75 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 16 Aug 2024 20:23:13 +0200 Subject: [PATCH 0668/1006] test: Fix test sequences for unrolling --- tests/test_unrolling.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tests/test_unrolling.py b/tests/test_unrolling.py index 9487b040be..da7147540f 100644 --- a/tests/test_unrolling.py +++ b/tests/test_unrolling.py @@ -3,6 +3,7 @@ import pytest from qibolab.pulses import Drag, Pulse, Rectangular +from qibolab.pulses.pulse import Acquisition from qibolab.sequence import PulseSequence from qibolab.unrolling import Bounds, batch @@ -34,13 +35,17 @@ def test_bounds_update(): "ch1/probe", Pulse(duration=1000, amplitude=0.9, envelope=Rectangular()), ), + ( + "ch1/acquisition", + Acquisition(duration=3000), + ), ] ) bounds = Bounds.update(ps) assert bounds.waveforms >= 40 - assert bounds.readout == 3 + assert bounds.readout == 1 assert bounds.instructions > 1 @@ -87,8 +92,11 @@ def test_batch(bounds): Pulse(duration=40, amplitude=0.9, envelope=Drag(rel_sigma=0.2, beta=1)), ), ("ch3/probe", Pulse(duration=1000, amplitude=0.9, envelope=Rectangular())), + ("ch3/acquisition", Acquisition(duration=1000)), ("ch2/probe", Pulse(duration=1000, amplitude=0.9, envelope=Rectangular())), + ("ch2/acquisition", Acquisition(duration=1000)), ("ch1/probe", Pulse(duration=1000, amplitude=0.9, envelope=Rectangular())), + ("ch1/acquisition", Acquisition(duration=1000)), ] ) From 55411df1f2afd1fe7ba131489eaf9ce87918c3e2 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 16 Aug 2024 20:34:06 +0200 Subject: [PATCH 0669/1006] test: Fix channel counting and delays sorting --- tests/test_compilers_default.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/tests/test_compilers_default.py b/tests/test_compilers_default.py index 1d5c9a4281..98f3d2647a 100644 --- a/tests/test_compilers_default.py +++ b/tests/test_compilers_default.py @@ -52,7 +52,7 @@ def test_compile(platform, gateargs): nqubits = platform.nqubits circuit = generate_circuit_with_gate(nqubits, *gateargs) sequence = compile_circuit(circuit, platform) - assert len(sequence.channels) == nqubits * int(gateargs[0] != gates.I) + nqubits + assert len(sequence.channels) == nqubits * int(gateargs[0] != gates.I) + nqubits * 2 def test_compile_two_gates(platform): @@ -64,7 +64,7 @@ def test_compile_two_gates(platform): sequence = compile_circuit(circuit, platform) qubit = platform.qubits[0] - assert len(sequence.channels) == 2 + assert len(sequence.channels) == 3 assert len(list(sequence.channel(qubit.drive.name))) == 2 assert len(list(sequence.channel(qubit.probe.name))) == 2 # includes delay @@ -76,8 +76,8 @@ def test_measurement(platform): circuit.add(gates.M(*qubits)) sequence = compile_circuit(circuit, platform) - assert len(sequence.channels) == 1 * nqubits - assert len(sequence.probe_pulses) == 1 * nqubits + assert len(sequence.channels) == 2 * nqubits + assert len(sequence.acquisitions) == 1 * nqubits def test_rz_to_sequence(platform): @@ -150,7 +150,7 @@ def test_add_measurement_to_sequence(platform: Platform): sequence = compile_circuit(circuit, platform) qubit = platform.qubits[0] - assert len(sequence.channels) == 2 + assert len(sequence.channels) == 3 assert len(list(sequence.channel(qubit.drive.name))) == 2 assert len(list(sequence.channel(qubit.probe.name))) == 2 # include delay @@ -158,6 +158,7 @@ def test_add_measurement_to_sequence(platform: Platform): s.concatenate(natives.single_qubit[0].RX.create_sequence(theta=np.pi / 2, phi=0.1)) s.concatenate(natives.single_qubit[0].RX.create_sequence(theta=np.pi / 2, phi=0.2)) s.append((qubit.probe.name, Delay(duration=s.duration))) + s.append((qubit.acquisition.name, Delay(duration=s.duration))) s.concatenate(natives.single_qubit[0].MZ.create_sequence()) assert sequence == s @@ -177,7 +178,7 @@ def test_align_delay_measurement(platform: Platform, delay): target_sequence.append((platform.qubits[0].probe.name, Delay(duration=delay))) target_sequence.concatenate(natives.single_qubit[0].MZ.create_sequence()) assert sequence == target_sequence - assert len(sequence.probe_pulses) == 1 + assert len(sequence.acquisitions) == 1 def test_align_multiqubit(platform: Platform): From 5f2f0ede0cf0d45866f907fd520872d4aa147ff7 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 16 Aug 2024 20:35:15 +0200 Subject: [PATCH 0670/1006] test: Fix probe pulse usage in results Replacing them with acquisitions --- tests/conftest.py | 3 +- tests/test_dummy.py | 62 ++++++++++++++++++++++-------------------- tests/test_platform.py | 4 +-- 3 files changed, 37 insertions(+), 32 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index eea497b27f..b3c61f115e 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -155,6 +155,7 @@ def wrapped( qd_seq = natives.RX.create_sequence() probe_seq = natives.MZ.create_sequence() probe_pulse = probe_seq[0][1] + acq = probe_seq[1][1] sequence = PulseSequence() sequence.concatenate(qd_seq) sequence.concatenate(probe_seq) @@ -169,7 +170,7 @@ def wrapped( ) sweepers = [[sweeper1], [sweeper2]] if target is None: - target = (probe_pulse.id, 0) + target = (acq.id, 0) # default target and sweepers only supported for default sequence assert target is not None diff --git a/tests/test_dummy.py b/tests/test_dummy.py index ac929731b4..42ee19a6c4 100644 --- a/tests/test_dummy.py +++ b/tests/test_dummy.py @@ -27,16 +27,16 @@ def test_dummy_execute_pulse_sequence(platform: Platform, acquisition): nshots = 100 natives = platform.natives.single_qubit[0] probe_seq = natives.MZ.create_sequence() - probe_pulse = probe_seq[0][1] + acq = probe_seq[1][1] sequence = PulseSequence() sequence.concatenate(probe_seq) sequence.concatenate(natives.RX12.create_sequence()) options = ExecutionParameters(nshots=100, acquisition_type=acquisition) result = platform.execute([sequence], options) if acquisition is AcquisitionType.INTEGRATION: - assert result[probe_pulse.id][0].shape == (nshots, 2) + assert result[acq.id][0].shape == (nshots, 2) elif acquisition is AcquisitionType.RAW: - assert result[probe_pulse.id][0].shape == (nshots, int(probe_seq.duration), 2) + assert result[acq.id][0].shape == (nshots, int(acq.duration), 2) def test_dummy_execute_coupler_pulse(platform: Platform): @@ -108,7 +108,7 @@ def test_dummy_single_sweep_raw(platform: Platform): sequence = PulseSequence() natives = platform.natives probe_seq = natives.single_qubit[0].MZ.create_sequence() - pulse = probe_seq[0][1] + acq = probe_seq[1][1] parameter_range = np.random.randint(SWEPT_POINTS, size=SWEPT_POINTS) sequence.concatenate(probe_seq) @@ -123,9 +123,9 @@ def test_dummy_single_sweep_raw(platform: Platform): acquisition_type=AcquisitionType.RAW, ) results = platform.execute([sequence], options, [[sweeper]]) - assert pulse.id in results - shape = results[pulse.id][0].shape - assert shape == (SWEPT_POINTS, int(pulse.duration), 2) + assert acq.id in results + shape = results[acq.id][0].shape + assert shape == (SWEPT_POINTS, int(acq.duration), 2) @pytest.mark.parametrize("fast_reset", [True, False]) @@ -144,7 +144,7 @@ def test_dummy_single_sweep_coupler( sequence = PulseSequence() natives = platform.natives probe_seq = natives.single_qubit[0].MZ.create_sequence() - probe_pulse = probe_seq[0][1] + acq = probe_seq[1][1] coupler_pulse = Pulse.flux( duration=40, amplitude=0.5, @@ -170,18 +170,18 @@ def test_dummy_single_sweep_coupler( ) results = platform.execute([sequence], options, [[sweeper]]) - assert probe_pulse.id in results + assert acq.id in results if not options.averaging_mode.average: results_shape = ( - results[probe_pulse.id][0].shape + results[acq.id][0].shape if acquisition is AcquisitionType.INTEGRATION - else results[probe_pulse.id][0].shape + else results[acq.id][0].shape ) else: results_shape = ( - results[probe_pulse.id][0].shape + results[acq.id][0].shape if acquisition is AcquisitionType.INTEGRATION - else results[probe_pulse.id][0].shape + else results[acq.id][0].shape ) expected_shape = (SWEPT_POINTS,) @@ -206,6 +206,7 @@ def test_dummy_single_sweep( natives = platform.natives probe_seq = natives.single_qubit[0].MZ.create_sequence() pulse = probe_seq[0][1] + acq = probe_seq[1][1] if parameter is Parameter.amplitude: parameter_range = np.random.rand(SWEPT_POINTS) else: @@ -228,18 +229,18 @@ def test_dummy_single_sweep( ) results = platform.execute([sequence], options, [[sweeper]]) - assert pulse.id in results + assert acq.id in results if options.averaging_mode.average: results_shape = ( - results[pulse.id][0].shape + results[acq.id][0].shape if acquisition is AcquisitionType.INTEGRATION - else results[pulse.id][0].shape + else results[acq.id][0].shape ) else: results_shape = ( - results[pulse.id][0].shape + results[acq.id][0].shape if acquisition is AcquisitionType.INTEGRATION - else results[pulse.id][0].shape + else results[acq.id][0].shape ) expected_shape = (SWEPT_POINTS,) @@ -265,6 +266,7 @@ def test_dummy_double_sweep( natives = platform.natives probe_seq = natives.single_qubit[0].MZ.create_sequence() probe_pulse = probe_seq[0][1] + acq = probe_seq[1][1] sequence.append((platform.get_qubit(0).drive.name, pulse)) sequence.append((platform.qubits[0].probe.name, Delay(duration=pulse.duration))) sequence.concatenate(probe_seq) @@ -302,19 +304,19 @@ def test_dummy_double_sweep( ) results = platform.execute([sequence], options, [[sweeper1], [sweeper2]]) - assert probe_pulse.id in results + assert acq.id in results if options.averaging_mode.average: results_shape = ( - results[probe_pulse.id][0].shape + results[acq.id][0].shape if acquisition is AcquisitionType.INTEGRATION - else results[probe_pulse.id][0].shape + else results[acq.id][0].shape ) else: results_shape = ( - results[probe_pulse.id][0].shape + results[acq.id][0].shape if acquisition is AcquisitionType.INTEGRATION - else results[probe_pulse.id][0].shape + else results[acq.id][0].shape ) expected_shape = (SWEPT_POINTS, SWEPT_POINTS) @@ -336,10 +338,12 @@ def test_dummy_single_sweep_multiplex( ): sequence = PulseSequence() probe_pulses = {} + acqs = {} natives = platform.natives for qubit in platform.qubits: probe_seq = natives.single_qubit[qubit].MZ.create_sequence() probe_pulses[qubit] = probe_seq[0][1] + acqs[qubit] = probe_seq[1][1] sequence.concatenate(probe_seq) parameter_range = ( np.random.rand(SWEPT_POINTS) @@ -367,19 +371,19 @@ def test_dummy_single_sweep_multiplex( ) results = platform.execute([sequence], options, [[sweeper1]]) - for pulse in probe_pulses.values(): - assert pulse.id in results + for acq in acqs.values(): + assert acq.id in results if not options.averaging_mode.average: results_shape = ( - results[pulse.id][0].shape + results[acq.id][0].shape if acquisition is AcquisitionType.INTEGRATION - else results[pulse.id][0].shape + else results[acq.id][0].shape ) else: results_shape = ( - results[pulse.id][0].shape + results[acq.id][0].shape if acquisition is AcquisitionType.INTEGRATION - else results[pulse.id][0].shape + else results[acq.id][0].shape ) expected_shape = (SWEPT_POINTS,) diff --git a/tests/test_platform.py b/tests/test_platform.py index 2a8bea5e95..0d1b065ca8 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -41,9 +41,9 @@ def test_unroll_sequences(platform: Platform): sequence.append((qubit.probe.name, Delay(duration=sequence.duration))) sequence.concatenate(natives.MZ.create_sequence()) total_sequence, readouts = unroll_sequences(10 * [sequence], relaxation_time=10000) - assert len(total_sequence.probe_pulses) == 10 + assert len(total_sequence.acquisitions) == 10 assert len(readouts) == 1 - assert all(len(readouts[pulse.id]) == 10 for pulse in sequence.probe_pulses) + assert all(len(readouts[acq.id]) == 10 for _, acq in sequence.acquisitions) def test_create_platform(platform): From 90b6246d49fa91e524a3582143058eab8840d11f Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 16 Aug 2024 20:38:47 +0200 Subject: [PATCH 0671/1006] docs: Propagate acquisitions usage to doctests --- doc/source/getting-started/experiment.rst | 4 ++-- doc/source/tutorials/calibration.rst | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/doc/source/getting-started/experiment.rst b/doc/source/getting-started/experiment.rst index 99e7524357..0f960a60e5 100644 --- a/doc/source/getting-started/experiment.rst +++ b/doc/source/getting-started/experiment.rst @@ -237,10 +237,10 @@ We leave to the dedicated tutorial a full explanation of the experiment, but her ) results = platform.execute([sequence], options, [[sweeper]]) - probe_pulse = next(iter(sequence.probe_pulses)) + _, acq = next(iter(sequence.acquisitions)) # plot the results - amplitudes = magnitude(results[probe_pulse.id][0]) + amplitudes = magnitude(results[acq.id][0]) frequencies = ( np.arange(-2e8, +2e8, 1e6) + platform.config(str(qubit.probe.name)).frequency ) diff --git a/doc/source/tutorials/calibration.rst b/doc/source/tutorials/calibration.rst index 8ce20d3fc1..4d0d86ce50 100644 --- a/doc/source/tutorials/calibration.rst +++ b/doc/source/tutorials/calibration.rst @@ -73,8 +73,8 @@ In few seconds, the experiment will be finished and we can proceed to plot it. import matplotlib.pyplot as plt - probe_pulse = sequence.probe_pulses[0] - amplitudes = magnitude(results[probe_pulse.id][0]) + acq = sequence.acquisitions[0][1] + amplitudes = magnitude(results[acq.id][0]) frequencies = ( np.arange(-2e8, +2e8, 1e6) + platform.config(str(qubit.probe.name)).frequency ) @@ -166,8 +166,8 @@ We can now proceed to launch on hardware: results = platform.execute([sequence], options, [[sweeper]]) - probe_pulse = next(iter(sequence.probe_pulses)) - amplitudes = magnitude(results[probe_pulse.id][0]) + _, acq = next(iter(sequence.acquisitions)) + amplitudes = magnitude(results[acq.id][0]) frequencies = ( np.arange(-2e8, +2e8, 1e6) + platform.config(str(qubit.drive.name)).frequency ) @@ -255,19 +255,19 @@ and its impact on qubit states in the IQ plane. results_one = platform.execute([one_sequence], options) results_zero = platform.execute([zero_sequence], options) - probe_pulse1 = next(iter(one_sequence.probe_pulses)) - probe_pulse2 = next(iter(zero_sequence.probe_pulses)) + _, acq1 = next(iter(one_sequence.acquisitions)) + _, acq0 = next(iter(zero_sequence.acquisitions)) plt.title("Single shot classification") plt.xlabel("I [a.u.]") plt.ylabel("Q [a.u.]") plt.scatter( - results_one[probe_pulse1.id][0], - results_one[probe_pulse1.id][0], + results_one[acq1.id][0], + results_one[acq1.id][0], label="One state", ) plt.scatter( - *unpack(results_zero[probe_pulse2.id][0]), + *unpack(results_zero[acq0.id][0]), label="Zero state", ) plt.show() From ce2edb5a06d909dd6faa6ec2d58f80c480e488fd Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Sat, 17 Aug 2024 19:48:43 +0200 Subject: [PATCH 0672/1006] test: Compare sequences with unsorted delays --- tests/test_compilers_default.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/tests/test_compilers_default.py b/tests/test_compilers_default.py index 98f3d2647a..cf2c1027e4 100644 --- a/tests/test_compilers_default.py +++ b/tests/test_compilers_default.py @@ -161,7 +161,16 @@ def test_add_measurement_to_sequence(platform: Platform): s.append((qubit.acquisition.name, Delay(duration=s.duration))) s.concatenate(natives.single_qubit[0].MZ.create_sequence()) - assert sequence == s + # the delay sorting depends on PulseSequence.channels, which is a set, and it's + # order is not guaranteed + def without_delays(seq: PulseSequence) -> PulseSequence: + return [el for el in seq if not isinstance(el[1], Delay)] + + def delays(seq: PulseSequence) -> set[tuple[ChannelId, Delay]]: + return {el for el in seq if isinstance(el[1], Delay)} + + assert without_delays(sequence) == without_delays(s) + assert delays(sequence) == delays(s) @pytest.mark.parametrize("delay", [0, 100]) From fd95bb52dafff20d9f21c090958b474b7e301ff3 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Sat, 17 Aug 2024 21:37:17 +0200 Subject: [PATCH 0673/1006] feat: Add readouts grouping --- src/qibolab/pulses/__init__.py | 2 +- src/qibolab/pulses/pulse.py | 28 +++++++++++++++++++++++++++- src/qibolab/sequence.py | 34 +++++++++++++++++++++++++++++++--- 3 files changed, 59 insertions(+), 5 deletions(-) diff --git a/src/qibolab/pulses/__init__.py b/src/qibolab/pulses/__init__.py index 658eac19ce..d88234dad7 100644 --- a/src/qibolab/pulses/__init__.py +++ b/src/qibolab/pulses/__init__.py @@ -1,2 +1,2 @@ from .envelope import * -from .pulse import Delay, Pulse, PulseLike, VirtualZ +from .pulse import Acquisition, Delay, Pulse, PulseLike, VirtualZ diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index 15c2fef76e..fb1b6b40aa 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -13,6 +13,7 @@ class _PulseLike(Model): @property def id(self) -> int: + """Instruction identifier.""" return id(self) @@ -112,6 +113,31 @@ class Acquisition(_PulseLike): """Duration in ns.""" +class _Readout(_PulseLike): + """Readout instruction. + + This event instructs the device to acquire samples for the event + span. + + Only valid on an acquisition channel. + """ + + kind: Literal["readout"] = "readout" + + acquisition: Acquisition + probe: Pulse + + @property + def duration(self) -> float: + """Duration in ns.""" + return self.acquisition.duration + + @property + def id(self) -> int: + """Instruction identifier.""" + return self.acquisition.id + + PulseLike = Annotated[ - Union[Pulse, Delay, VirtualZ, Acquisition], Field(discriminator="kind") + Union[Pulse, Delay, VirtualZ, Acquisition, _Readout], Field(discriminator="kind") ] diff --git a/src/qibolab/sequence.py b/src/qibolab/sequence.py index 99205845e5..310b13e4db 100644 --- a/src/qibolab/sequence.py +++ b/src/qibolab/sequence.py @@ -2,15 +2,16 @@ from collections import UserList from collections.abc import Callable, Iterable +from itertools import zip_longest from typing import Any from pydantic import TypeAdapter from pydantic_core import core_schema -from qibolab.pulses.pulse import Acquisition +from qibolab.pulses.pulse import Pulse, _Readout -from .identifier import ChannelId -from .pulses import Delay, PulseLike +from .identifier import ChannelId, ChannelType +from .pulses import Acquisition, Delay, PulseLike __all__ = ["PulseSequence"] @@ -107,3 +108,30 @@ def acquisitions(self) -> list[tuple[ChannelId, Acquisition]]: """Return list of the readout pulses in this sequence.""" # pulse filter needed to exclude delays return [el for el in self if isinstance(el[1], Acquisition)] + + @property + def to_readouts(self): + new = [] + skip = False + for (ch, p), (nch, np) in zip_longest(self, self[1:], fillvalue=(None, None)): + if skip: + continue + + # TODO: replace with pattern matching, once py3.9 will be abandoned + assert ch is not None + if ch.channel_type is ChannelType.ACQUISITION: + raise ValueError("") + if ch.channel_type is ChannelType.PROBE and isinstance(p, Pulse): + if ( + nch is not None + and nch.channel_type is ChannelType.ACQUISITION + and isinstance(np, Acquisition) + ): + new.append((ch, _Readout(acquisition=np, probe=p))) + skip = True + else: + raise ValueError("") + else: + new.append((ch, p)) + + return new From d87bf3127e2e065a4489a6afd996095af5241a98 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Sat, 17 Aug 2024 21:40:01 +0200 Subject: [PATCH 0674/1006] fix: Accept spare acquisition delays during grouping --- src/qibolab/sequence.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/qibolab/sequence.py b/src/qibolab/sequence.py index 310b13e4db..4e38e34f0e 100644 --- a/src/qibolab/sequence.py +++ b/src/qibolab/sequence.py @@ -119,8 +119,8 @@ def to_readouts(self): # TODO: replace with pattern matching, once py3.9 will be abandoned assert ch is not None - if ch.channel_type is ChannelType.ACQUISITION: - raise ValueError("") + if ch.channel_type is ChannelType.ACQUISITION and not isinstance(p, Delay): + raise ValueError("Acquisition not preceded by probe.") if ch.channel_type is ChannelType.PROBE and isinstance(p, Pulse): if ( nch is not None @@ -130,7 +130,7 @@ def to_readouts(self): new.append((ch, _Readout(acquisition=np, probe=p))) skip = True else: - raise ValueError("") + raise ValueError("Probe not followed by acquisition.") else: new.append((ch, p)) From fe0bd6fc25acd1e031f8073fe305bf9f22a067de Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Sat, 17 Aug 2024 23:35:35 +0200 Subject: [PATCH 0675/1006] test: Lift sequences test to mirror module in source --- tests/{pulses => }/test_sequence.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tests/{pulses => }/test_sequence.py (100%) diff --git a/tests/pulses/test_sequence.py b/tests/test_sequence.py similarity index 100% rename from tests/pulses/test_sequence.py rename to tests/test_sequence.py From e9d1526e1c9bfea6cfd322388549c44a600c4a46 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Sat, 17 Aug 2024 23:55:09 +0200 Subject: [PATCH 0676/1006] fix: Reset skip after acquisition processing --- src/qibolab/sequence.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/qibolab/sequence.py b/src/qibolab/sequence.py index 4e38e34f0e..7cbd0f3683 100644 --- a/src/qibolab/sequence.py +++ b/src/qibolab/sequence.py @@ -115,6 +115,7 @@ def to_readouts(self): skip = False for (ch, p), (nch, np) in zip_longest(self, self[1:], fillvalue=(None, None)): if skip: + skip = False continue # TODO: replace with pattern matching, once py3.9 will be abandoned From 12362f114c82d0beaf13958ffe6f958e9cb909e2 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Sat, 17 Aug 2024 23:55:31 +0200 Subject: [PATCH 0677/1006] test: Test readout grouping --- tests/test_sequence.py | 60 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/tests/test_sequence.py b/tests/test_sequence.py index 0ff7aca231..fadb448e12 100644 --- a/tests/test_sequence.py +++ b/tests/test_sequence.py @@ -1,5 +1,16 @@ +import pytest + from qibolab.identifier import ChannelId -from qibolab.pulses import Delay, Drag, Gaussian, Pulse, Rectangular, VirtualZ +from qibolab.pulses import ( + Acquisition, + Delay, + Drag, + Gaussian, + Pulse, + Rectangular, + VirtualZ, +) +from qibolab.pulses.pulse import _Readout from qibolab.sequence import PulseSequence @@ -169,3 +180,50 @@ def test_trim(): assert len(list(trimmed.channel("c"))) == 2 # the order is preserved assert isinstance(next(iter(trimmed.channel("d"))), Pulse) + + +def test_readouts(): + probe = Pulse(duration=10, amplitude=1, envelope=Rectangular()) + acq = Acquisition(duration=10) + sequence = PulseSequence.load([("1/probe", probe), ("1/acquisition", acq)]) + ros = sequence.to_readouts + assert len(ros) == 1 + ro = ros[0][1] + assert isinstance(ro, _Readout) + assert ro.duration == acq.duration + assert ro.id == acq.id + + sequence = PulseSequence.load( + [ + ("1/drive", VirtualZ(phase=0.7)), + ("1/probe", Delay(duration=15)), + ("1/acquisition", Delay(duration=20)), + ("1/probe", probe), + ("1/acquisition", acq), + ("1/flux", probe), + ] + ) + ros = sequence.to_readouts + assert len(ros) == 5 + + sequence = PulseSequence.load([("1/probe", probe)]) + with pytest.raises(ValueError, match="(?i)probe"): + sequence.to_readouts + + sequence = PulseSequence.load([("1/acquisition", acq)]) + with pytest.raises(ValueError, match="(?i)acquisition"): + sequence.to_readouts + + sequence = PulseSequence.load([("1/acquisition", acq), ("1/probe", probe)]) + with pytest.raises(ValueError): + sequence.to_readouts + + sequence = PulseSequence.load( + [ + ("1/probe", probe), + ("1/acquisition", Delay(duration=20)), + ("1/acquisition", acq), + ] + ) + with pytest.raises(ValueError): + sequence.to_readouts From a6e7b577c4cf2db819052a760191f704d6efcca5 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Sun, 18 Aug 2024 00:28:17 +0200 Subject: [PATCH 0678/1006] test: Add test for acquisition filter --- src/qibolab/sequence.py | 2 +- tests/test_sequence.py | 30 ++++++++++++++++++++++++------ 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/qibolab/sequence.py b/src/qibolab/sequence.py index 7cbd0f3683..f6f254cd22 100644 --- a/src/qibolab/sequence.py +++ b/src/qibolab/sequence.py @@ -110,7 +110,7 @@ def acquisitions(self) -> list[tuple[ChannelId, Acquisition]]: return [el for el in self if isinstance(el[1], Acquisition)] @property - def to_readouts(self): + def as_readouts(self): new = [] skip = False for (ch, p), (nch, np) in zip_longest(self, self[1:], fillvalue=(None, None)): diff --git a/tests/test_sequence.py b/tests/test_sequence.py index fadb448e12..144a0cd09b 100644 --- a/tests/test_sequence.py +++ b/tests/test_sequence.py @@ -182,11 +182,29 @@ def test_trim(): assert isinstance(next(iter(trimmed.channel("d"))), Pulse) +def test_acquisitions(): + probe = Pulse(duration=10, amplitude=1, envelope=Rectangular()) + acq = Acquisition(duration=10) + sequence = PulseSequence.load( + [ + ("1/drive", VirtualZ(phase=0.7)), + ("1/probe", Delay(duration=15)), + ("1/acquisition", Delay(duration=20)), + ("1/probe", probe), + ("1/acquisition", acq), + ("1/flux", probe), + ] + ) + acqs = sequence.acquisitions + assert len(acqs) == 1 + assert acqs[0][1] is acq + + def test_readouts(): probe = Pulse(duration=10, amplitude=1, envelope=Rectangular()) acq = Acquisition(duration=10) sequence = PulseSequence.load([("1/probe", probe), ("1/acquisition", acq)]) - ros = sequence.to_readouts + ros = sequence.as_readouts assert len(ros) == 1 ro = ros[0][1] assert isinstance(ro, _Readout) @@ -203,20 +221,20 @@ def test_readouts(): ("1/flux", probe), ] ) - ros = sequence.to_readouts + ros = sequence.as_readouts assert len(ros) == 5 sequence = PulseSequence.load([("1/probe", probe)]) with pytest.raises(ValueError, match="(?i)probe"): - sequence.to_readouts + sequence.as_readouts sequence = PulseSequence.load([("1/acquisition", acq)]) with pytest.raises(ValueError, match="(?i)acquisition"): - sequence.to_readouts + sequence.as_readouts sequence = PulseSequence.load([("1/acquisition", acq), ("1/probe", probe)]) with pytest.raises(ValueError): - sequence.to_readouts + sequence.as_readouts sequence = PulseSequence.load( [ @@ -226,4 +244,4 @@ def test_readouts(): ] ) with pytest.raises(ValueError): - sequence.to_readouts + sequence.as_readouts From db28692f878d0ced5032565aa7b8f1b4be910c85 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Sun, 18 Aug 2024 00:28:47 +0200 Subject: [PATCH 0679/1006] docs: Clarify the role of the acquisition filter --- src/qibolab/sequence.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/qibolab/sequence.py b/src/qibolab/sequence.py index f6f254cd22..3009041297 100644 --- a/src/qibolab/sequence.py +++ b/src/qibolab/sequence.py @@ -105,7 +105,14 @@ def trim(self) -> "PulseSequence": @property def acquisitions(self) -> list[tuple[ChannelId, Acquisition]]: - """Return list of the readout pulses in this sequence.""" + """Return list of the readout pulses in this sequence. + + .. note:: + + This selects only the :cls:`Acquisition` events, and not all the + instructions directed to an acquistion channel (i.e. + :attr:`ChannelType.ACQUISITION`) + """ # pulse filter needed to exclude delays return [el for el in self if isinstance(el[1], Acquisition)] From f783821ecc463a92c10fd77f2138bcbf53a0f281 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Sun, 18 Aug 2024 15:08:28 +0200 Subject: [PATCH 0680/1006] test: Test sequence serialization --- tests/test_sequence.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/tests/test_sequence.py b/tests/test_sequence.py index 144a0cd09b..fa305d92c4 100644 --- a/tests/test_sequence.py +++ b/tests/test_sequence.py @@ -1,4 +1,5 @@ import pytest +from pydantic import TypeAdapter from qibolab.identifier import ChannelId from qibolab.pulses import ( @@ -49,6 +50,28 @@ def test_init_with_iterable(): assert len(list(seq.channel(c5))) == 3 +def test_serialization(): + sp = ChannelId.load("some/probe") + sa = ChannelId.load("some/acquisition") + od = ChannelId.load("other/drive") + of = ChannelId.load("other/flux") + + seq = PulseSequence( + [ + (sp, Delay(duration=10)), + (sa, Delay(duration=20)), + (of, Pulse(duration=10, amplitude=1, envelope=Rectangular())), + (od, VirtualZ(phase=0.6)), + (od, Pulse(duration=10, amplitude=1, envelope=Rectangular())), + (sp, Pulse(duration=100, amplitude=0.3, envelope=Gaussian(rel_sigma=0.1))), + (sa, Acquisition(duration=150)), + ] + ) + + aslist = TypeAdapter(PulseSequence).dump_python(seq) + assert PulseSequence.load(aslist) == seq + + def test_durations(): sequence = PulseSequence() sequence.append(("ch1/probe", Delay(duration=20))) From 8727bf8c68f4154af5f526fa767f5195afa621b2 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Sun, 18 Aug 2024 15:24:21 +0200 Subject: [PATCH 0681/1006] test: Provide readout test, simplify pulses' tests --- tests/pulses/test_pulse.py | 163 ++++++------------------------------- 1 file changed, 24 insertions(+), 139 deletions(-) diff --git a/tests/pulses/test_pulse.py b/tests/pulses/test_pulse.py index b591b470ea..0c6408b5ee 100644 --- a/tests/pulses/test_pulse.py +++ b/tests/pulses/test_pulse.py @@ -3,158 +3,43 @@ import numpy as np import pytest -from qibolab.pulses import ( - BaseEnvelope, - Custom, - Drag, - ECap, - Gaussian, - GaussianSquare, - Iir, - Pulse, - Rectangular, - Snz, -) +from qibolab.pulses import Acquisition, Custom, Pulse, Rectangular, VirtualZ +from qibolab.pulses.pulse import _Readout -def test_init(): - # standard initialisation - p0 = Pulse( - duration=50, - amplitude=0.9, - relative_phase=0.0, - envelope=Rectangular(), - ) - assert p0.relative_phase == 0.0 +def test_flux(): + p = Pulse.flux(duration=5, amplitude=0.9, envelope=Rectangular()) + assert p.relative_phase == 0 - p1 = Pulse( - duration=50, - amplitude=0.9, - relative_phase=0.0, - envelope=Rectangular(), - ) - assert p1.amplitude == 0.9 + p1 = Pulse.flux(duration=5, amplitude=0.9, relative_phase=1, envelope=Rectangular()) + assert p1.relative_phase == 0 - # initialisation with non float (int) relative_phase - p2 = Pulse( - duration=50, - amplitude=0.9, - relative_phase=1.0, - envelope=Rectangular(), - ) - assert isinstance(p2.relative_phase, float) and p2.relative_phase == 1.0 - # initialisation with different shapes and types - p6 = Pulse( - duration=40, - amplitude=0.9, - envelope=Rectangular(), - relative_phase=0, - ) - p7 = Pulse( - duration=40, - amplitude=0.9, - envelope=Rectangular(), - relative_phase=0, - ) - p8 = Pulse( - duration=40, - amplitude=0.9, - envelope=Gaussian(rel_sigma=0.2), - relative_phase=0, - ) - p9 = Pulse( - duration=40, - amplitude=0.9, - envelope=Drag(rel_sigma=0.2, beta=2), - relative_phase=0, - ) - p10 = Pulse.flux( - duration=40, - amplitude=0.9, - envelope=Iir( - a=np.array([-1, 1]), b=np.array([-0.1, 0.1001]), target=Rectangular() - ), - ) - p11 = Pulse.flux( - duration=40, - amplitude=0.9, - envelope=Snz(t_idling=10, b_amplitude=0.5), - ) - p13 = Pulse( - duration=40, - amplitude=0.9, - envelope=ECap(alpha=2), - relative_phase=0, - ) - p14 = Pulse( - duration=40, - amplitude=0.9, - envelope=GaussianSquare(rel_sigma=0.2, width=0.9), - relative_phase=0, - ) +def test_virtual_z(): + vz = VirtualZ(phase=-0.3) + assert vz.duration == 0 - # initialisation with float duration - p12 = Pulse( - duration=34.33, - amplitude=0.9, - relative_phase=1, - envelope=Rectangular(), - ) - assert isinstance(p12.duration, float) - assert p12.duration == 34.33 - -def test_attributes(): - p = Pulse( - duration=50, - amplitude=0.9, - relative_phase=0.0, - envelope=Rectangular(), - ) - - assert isinstance(p.duration, float) and p.duration == 50 - assert isinstance(p.amplitude, float) and p.amplitude == 0.9 - assert isinstance(p.relative_phase, float) and p.relative_phase == 0.0 - assert isinstance(p.envelope, BaseEnvelope) - - -def test_pulse(): - duration = 50 - rel_sigma = 5 - beta = 2 - pulse = Pulse( - amplitude=1, - duration=duration, - relative_phase=0, - envelope=Drag(rel_sigma=rel_sigma, beta=beta), - ) - - assert pulse.duration == duration - - -def test_readout_pulse(): - duration = 2000 - pulse = Pulse( - amplitude=1, - duration=duration, - relative_phase=0, - envelope=Rectangular(), - ) - - assert pulse.duration == duration +def test_readout(): + p = Pulse(duration=5, amplitude=0.9, envelope=Rectangular()) + a = Acquisition(duration=60) + r = _Readout(acquisition=a, probe=p) + assert r.duration == a.duration + assert r.id == a.id def test_envelope_waveform_i_q(): + d = 1000 + p = Pulse(duration=d, amplitude=1, envelope=Rectangular()) + assert pytest.approx(p.i(1)) == np.ones(d) + assert pytest.approx(p.i(2)) == np.ones(2 * d) + assert pytest.approx(p.q(1)) == np.zeros(d) + assert pytest.approx(p.envelopes(1)) == np.stack([np.ones(d), np.zeros(d)]) + envelope_i = np.cos(np.arange(0, 10, 0.01)) envelope_q = np.sin(np.arange(0, 10, 0.01)) custom_shape_pulse = Custom(i_=envelope_i, q_=envelope_q) - pulse = Pulse( - duration=1000, - amplitude=1, - relative_phase=0, - envelope=Rectangular(), - ) + pulse = Pulse(duration=1000, amplitude=1, relative_phase=0, envelope=Rectangular()) custom_shape_pulse = custom_shape_pulse.model_copy(update={"i_": pulse.i(1)}) with pytest.raises(ValueError): From 1940ba26d42f75a62ac083d8bcaa5b28f0b6545d Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Sun, 18 Aug 2024 15:33:13 +0200 Subject: [PATCH 0682/1006] test: Test channel identifiers --- tests/test_identifier.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 tests/test_identifier.py diff --git a/tests/test_identifier.py b/tests/test_identifier.py new file mode 100644 index 0000000000..e6d6273927 --- /dev/null +++ b/tests/test_identifier.py @@ -0,0 +1,28 @@ +import pytest +from pydantic import ValidationError + +from qibolab.identifier import ChannelId, ChannelType + + +def test_channel_type(): + assert str(ChannelType.ACQUISITION) == "acquisition" + + +def test_channel_id(): + name = "1/probe" + ch = ChannelId.load(name) + assert ch.qubit == 1 + assert ch.channel_type is ChannelType.PROBE + assert ch.cross is None + assert str(ch) == name == ch.model_dump() + + chd = ChannelId.load("10/drive_cross/3") + assert chd.qubit == 10 + assert chd.channel_type is ChannelType.DRIVE_CROSS + assert chd.cross == "3" + + with pytest.raises(ValidationError): + ChannelId.load("1/probe/3") + + with pytest.raises(ValueError): + ChannelId.load("ciao/come/va/bene") From e266751959b3d6ddb37af03c4eb0b5e260104710 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Sun, 18 Aug 2024 20:45:59 +0200 Subject: [PATCH 0683/1006] feat: Pad 'inactive' qubits involved in interactions on the drive channel --- src/qibolab/compilers/compiler.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/qibolab/compilers/compiler.py b/src/qibolab/compilers/compiler.py index c1347b5f6c..8d78a34d26 100644 --- a/src/qibolab/compilers/compiler.py +++ b/src/qibolab/compilers/compiler.py @@ -149,23 +149,25 @@ def qubit_clock(el: QubitId): # process circuit gates for moment in circuit.queue.moments: - for gate in set(filter(lambda x: x is not None, moment)): + for gate in {x for x in moment if x is not None}: delay_sequence = PulseSequence() gate_sequence = self.get_sequence(gate, platform) - increment = defaultdict(int) - start = max( - ( - qubit_clock(el) - for el in {ch_to_qb[ch] for ch in gate_sequence.channels} - ), - default=0.0, - ) + increment = defaultdict(float) + active_qubits = {ch_to_qb[ch] for ch in gate_sequence.channels} + start = max((qubit_clock(el) for el in active_qubits), default=0.0) for ch in gate_sequence.channels: delay = start - channel_clock[ch] if delay > 0: delay_sequence.append((ch, Delay(duration=delay))) channel_clock[ch] += delay increment[ch] = gate_sequence.channel_duration(ch) + for q in gate.qubits: + qubit = platform.get_qubit(q) + if qubit not in active_qubits: + increment[qubit.drive] = ( + start + gate_sequence.duration - channel_clock[qubit.drive] + ) + # add the increment only after computing them, since multiple channels # are related to each other because belonging to the same qubit for ch, inc in increment.items(): From b25493aeab0cbbf08d726148c056332c3024f803 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Sun, 18 Aug 2024 21:07:15 +0200 Subject: [PATCH 0684/1006] test: Add test to check inactive qubit padding --- tests/test_compilers_default.py | 42 ++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/tests/test_compilers_default.py b/tests/test_compilers_default.py index cf2c1027e4..e9363bf140 100644 --- a/tests/test_compilers_default.py +++ b/tests/test_compilers_default.py @@ -6,9 +6,12 @@ from qibolab import create_platform from qibolab.compilers import Compiler -from qibolab.identifier import ChannelId +from qibolab.identifier import ChannelId, ChannelType +from qibolab.native import FixedSequenceFactory, TwoQubitNatives from qibolab.platform import Platform from qibolab.pulses import Delay +from qibolab.pulses.envelope import Rectangular +from qibolab.pulses.pulse import Pulse from qibolab.sequence import PulseSequence @@ -203,3 +206,40 @@ def test_align_multiqubit(platform: Platform): probe_delay = next(iter(sequence.channel(ChannelId.load(f"qubit_{q}/probe")))) assert isinstance(probe_delay, Delay) assert flux_duration == probe_delay.duration + + +def test_inactive_qubits(platform: Platform): + main, coupled = 0, 1 + circuit = Circuit(2) + circuit.add(gates.CZ(main, coupled)) + circuit.add(gates.M(main, coupled)) + + natives = platform.natives.two_qubit[(main, coupled)] = TwoQubitNatives( + CZ=FixedSequenceFactory([]) + ) + assert natives.CZ is not None + natives.CZ.clear() + sequence = compile_circuit(circuit, platform) + + def no_measurement(seq: PulseSequence): + return [ + el + for el in seq + if el[0].channel_type not in (ChannelType.PROBE, ChannelType.ACQUISITION) + ] + + assert len(no_measurement(sequence)) == 0 + + duration = 200 + natives.CZ.extend( + PulseSequence.load( + [ + ( + f"qubit_{main}/flux", + Pulse(duration=duration, amplitude=0.42, envelope=Rectangular()), + ) + ] + ) + ) + padded_seq = compile_circuit(circuit, platform) + assert len(no_measurement(padded_seq)) == 2 From bf25e898c89d28648405e9e1e896dbfe31ce1f3a Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Sun, 18 Aug 2024 21:30:12 +0200 Subject: [PATCH 0685/1006] test: Add gpi gate to prevent delay drop The sequence is trimmed of delays at the end of the compilation --- tests/test_compilers_default.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/test_compilers_default.py b/tests/test_compilers_default.py index e9363bf140..dd630c773b 100644 --- a/tests/test_compilers_default.py +++ b/tests/test_compilers_default.py @@ -212,6 +212,7 @@ def test_inactive_qubits(platform: Platform): main, coupled = 0, 1 circuit = Circuit(2) circuit.add(gates.CZ(main, coupled)) + circuit.add(gates.GPI2(coupled, phi=0.15)) circuit.add(gates.M(main, coupled)) natives = platform.natives.two_qubit[(main, coupled)] = TwoQubitNatives( @@ -228,7 +229,7 @@ def no_measurement(seq: PulseSequence): if el[0].channel_type not in (ChannelType.PROBE, ChannelType.ACQUISITION) ] - assert len(no_measurement(sequence)) == 0 + assert len(no_measurement(sequence)) == 1 duration = 200 natives.CZ.extend( @@ -242,4 +243,4 @@ def no_measurement(seq: PulseSequence): ) ) padded_seq = compile_circuit(circuit, platform) - assert len(no_measurement(padded_seq)) == 2 + assert len(no_measurement(padded_seq)) == 3 From 4b798ddb414954e5d5a5bf572e422b4ac6c5103d Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Sun, 18 Aug 2024 21:30:55 +0200 Subject: [PATCH 0686/1006] fix: Append delay pulses, instead of adding useless increments --- src/qibolab/compilers/compiler.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/qibolab/compilers/compiler.py b/src/qibolab/compilers/compiler.py index 8d78a34d26..9b7b0259ad 100644 --- a/src/qibolab/compilers/compiler.py +++ b/src/qibolab/compilers/compiler.py @@ -161,17 +161,22 @@ def qubit_clock(el: QubitId): delay_sequence.append((ch, Delay(duration=delay))) channel_clock[ch] += delay increment[ch] = gate_sequence.channel_duration(ch) - for q in gate.qubits: - qubit = platform.get_qubit(q) - if qubit not in active_qubits: - increment[qubit.drive] = ( - start + gate_sequence.duration - channel_clock[qubit.drive] - ) - # add the increment only after computing them, since multiple channels # are related to each other because belonging to the same qubit for ch, inc in increment.items(): channel_clock[ch] += inc + + end = start + gate_sequence.duration + for q in gate.qubits: + if q not in active_qubits: + qubit = platform.get_qubit(q) + delay = end - channel_clock[qubit.drive] + if delay > 0: + delay_sequence.append( + (qubit.drive.name, Delay(duration=delay)) + ) + channel_clock[qubit.drive.name] += delay + sequence.concatenate(delay_sequence) sequence.concatenate(gate_sequence) From 694fe1057eb4c5f48991841e992af159700f57f5 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 19 Aug 2024 00:17:46 +0200 Subject: [PATCH 0687/1006] test: Add further assertions about inactive padding --- tests/test_compilers_default.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/tests/test_compilers_default.py b/tests/test_compilers_default.py index dd630c773b..11fdcffb7c 100644 --- a/tests/test_compilers_default.py +++ b/tests/test_compilers_default.py @@ -212,6 +212,7 @@ def test_inactive_qubits(platform: Platform): main, coupled = 0, 1 circuit = Circuit(2) circuit.add(gates.CZ(main, coupled)) + # another gate on drive is needed, to prevent trimming the delay, if alone circuit.add(gates.GPI2(coupled, phi=0.15)) circuit.add(gates.M(main, coupled)) @@ -231,12 +232,14 @@ def no_measurement(seq: PulseSequence): assert len(no_measurement(sequence)) == 1 + mflux = f"qubit_{main}/flux" + cdrive = f"qubit_{coupled}/drive" duration = 200 natives.CZ.extend( PulseSequence.load( [ ( - f"qubit_{main}/flux", + mflux, Pulse(duration=duration, amplitude=0.42, envelope=Rectangular()), ) ] @@ -244,3 +247,9 @@ def no_measurement(seq: PulseSequence): ) padded_seq = compile_circuit(circuit, platform) assert len(no_measurement(padded_seq)) == 3 + cdrive_delay = next(iter(padded_seq.channel(ChannelId.load(cdrive)))) + assert isinstance(cdrive_delay, Delay) + assert ( + cdrive_delay.duration + == next(iter(padded_seq.channel(ChannelId.load(mflux)))).duration + ) From c60cfed3316ec9d7fd3503e1afde88aa863a831f Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 19 Aug 2024 00:18:48 +0200 Subject: [PATCH 0688/1006] refactor: Fix return types involving channel ids --- src/qibolab/platform/platform.py | 7 ++++--- src/qibolab/qubits.py | 4 +++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 8386299b30..44942ed0ec 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -12,6 +12,7 @@ from qibolab.components import Config from qibolab.execution_parameters import ExecutionParameters +from qibolab.identifier import ChannelId from qibolab.instruments.abstract import Controller, Instrument, InstrumentId from qibolab.parameters import NativeGates, Parameters, Settings, update_configs from qibolab.pulses import Delay @@ -84,7 +85,7 @@ def estimate_duration( ) -def _channels_map(elements: QubitMap): +def _channels_map(elements: QubitMap) -> dict[ChannelId, QubitId]: """Map channel names to element (qubit or coupler).""" return {ch.name: id for id, el in elements.items() for ch in el.channels} @@ -164,12 +165,12 @@ def components(self) -> set[str]: return set(self.parameters.configs.keys()) @property - def channels(self) -> list[str]: + def channels(self) -> list[ChannelId]: """Channels in the platform.""" return list(self.channels_map) @property - def channels_map(self) -> dict[str, QubitId]: + def channels_map(self) -> dict[ChannelId, QubitId]: """Channel to element map.""" return _channels_map(self.qubits) | _channels_map(self.couplers) diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index 774a4f5c02..abbd71a3f8 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -1,8 +1,10 @@ +from collections.abc import Iterable from typing import Annotated, Optional from pydantic import BeforeValidator, ConfigDict, PlainSerializer from .components import AcquireChannel, DcChannel, IqChannel +from .components.channels import Channel from .identifier import ChannelType, QubitId from .serialize import Model @@ -35,7 +37,7 @@ class Qubit(Model): flux: Optional[DcChannel] = None @property - def channels(self): + def channels(self) -> Iterable[Channel]: for ct in ChannelType: channel = getattr(self, ct.value) if channel is not None: From 53c52964f42bb565dfad0ab62d9b315220783482 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 19 Aug 2024 00:19:20 +0200 Subject: [PATCH 0689/1006] docs: Fix compiler docstrings --- src/qibolab/compilers/compiler.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/qibolab/compilers/compiler.py b/src/qibolab/compilers/compiler.py index 9b7b0259ad..3a5f4f8d66 100644 --- a/src/qibolab/compilers/compiler.py +++ b/src/qibolab/compilers/compiler.py @@ -26,8 +26,9 @@ @dataclass class Compiler: - """Compiler that transforms a :class:`qibo.models.Circuit` to a - :class:`qibolab.pulses.PulseSequence`. + """Compile native circuits into pulse sequences. + + It transforms a :class:`qibo.models.Circuit` to a :class:`qibolab.pulses.PulseSequence`. The transformation is done using a dictionary of rules which map each Qibo gate to a pulse sequence and some virtual Z-phases. @@ -65,7 +66,7 @@ def default(cls): ) def register(self, gate_cls: type[gates.Gate]) -> Callable[[Rule], Rule]: - """Decorator for registering a function as a rule in the compiler. + """Register a function as a rule in the compiler. Using this decorator is optional. Alternatively the user can set the rules directly via ``__setitem__``. @@ -81,8 +82,9 @@ def inner(func: Rule) -> Rule: return inner def get_sequence(self, gate: gates.Gate, platform: Platform) -> PulseSequence: - """Get pulse sequence implementing the given gate using the registered - rules. + """Get pulse sequence implementing the given gate. + + The sequence is obtained using the registered rules. Args: gate (:class:`qibo.gates.Gate`): Qibo gate to convert to pulses. @@ -122,7 +124,7 @@ def get_sequence(self, gate: gates.Gate, platform: Platform) -> PulseSequence: def compile( self, circuit: Circuit, platform: Platform ) -> tuple[PulseSequence, dict[gates.M, PulseSequence]]: - """Transforms a circuit to pulse sequence. + """Transform a circuit to pulse sequence. Args: circuit (qibo.models.Circuit): Qibo circuit that respects the platform's @@ -170,6 +172,9 @@ def qubit_clock(el: QubitId): for q in gate.qubits: if q not in active_qubits: qubit = platform.get_qubit(q) + # all actual qubits have a non-null drive channel, and couplers + # are not explicitedly listed in gates + assert qubit.drive is not None delay = end - channel_clock[qubit.drive] if delay > 0: delay_sequence.append( From 74ff37a514bdf1d0789161a98599309ce6559296 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 19 Aug 2024 12:46:19 +0200 Subject: [PATCH 0690/1006] build: Extend qibolab support to py3.12 --- poetry.lock | 399 ++++++++++++++++++++++++++----------------------- pyproject.toml | 14 +- 2 files changed, 216 insertions(+), 197 deletions(-) diff --git a/poetry.lock b/poetry.lock index df6c1e5e05..66b773aceb 100644 --- a/poetry.lock +++ b/poetry.lock @@ -280,13 +280,13 @@ test = ["black (>=22.3.0)", "coverage[toml] (>=6.2)", "hypothesis (>=5.49.0)", " [[package]] name = "cachetools" -version = "5.4.0" +version = "5.5.0" description = "Extensible memoizing collections and decorators" optional = false python-versions = ">=3.7" files = [ - {file = "cachetools-5.4.0-py3-none-any.whl", hash = "sha256:3ae3b49a3d5e28a77a0be2b37dbcb89005058959cb2323858c2657c4a8cab474"}, - {file = "cachetools-5.4.0.tar.gz", hash = "sha256:b8adc2e7c07f105ced7bc56dbb6dfbe7c4a00acce20e2227b3f355be89bc6827"}, + {file = "cachetools-5.5.0-py3-none-any.whl", hash = "sha256:02134e8439cdc2ffb62023ce1debca2944c3f289d66bb17ead3ab3dede74b292"}, + {file = "cachetools-5.5.0.tar.gz", hash = "sha256:2cc24fb4cbe39633fb7badd9db9ca6295d766d9c2995f245725a46715d050f2a"}, ] [[package]] @@ -1265,13 +1265,13 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-auth" -version = "2.33.0" +version = "2.34.0" description = "Google Authentication Library" optional = false python-versions = ">=3.7" files = [ - {file = "google_auth-2.33.0-py2.py3-none-any.whl", hash = "sha256:8eff47d0d4a34ab6265c50a106a3362de6a9975bb08998700e389f857e4d39df"}, - {file = "google_auth-2.33.0.tar.gz", hash = "sha256:d6a52342160d7290e334b4d47ba390767e4438ad0d45b7630774533e82655b95"}, + {file = "google_auth-2.34.0-py2.py3-none-any.whl", hash = "sha256:72fd4733b80b6d777dcde515628a9eb4a577339437012874ea286bca7261ee65"}, + {file = "google_auth-2.34.0.tar.gz", hash = "sha256:8eb87396435c19b20d32abd2f984e31c191a15284af72eb922f10e5bde9c04cc"}, ] [package.dependencies] @@ -1281,7 +1281,7 @@ rsa = ">=3.1.4,<5" [package.extras] aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] -enterprise-cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] +enterprise-cert = ["cryptography", "pyopenssl"] pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] reauth = ["pyu2f (>=0.1.5)"] requests = ["requests (>=2.20.0,<3.0.0.dev0)"] @@ -1305,61 +1305,61 @@ grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] [[package]] name = "grpcio" -version = "1.65.4" +version = "1.65.5" description = "HTTP/2-based RPC framework" optional = false python-versions = ">=3.8" files = [ - {file = "grpcio-1.65.4-cp310-cp310-linux_armv7l.whl", hash = "sha256:0e85c8766cf7f004ab01aff6a0393935a30d84388fa3c58d77849fcf27f3e98c"}, - {file = "grpcio-1.65.4-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:e4a795c02405c7dfa8affd98c14d980f4acea16ea3b539e7404c645329460e5a"}, - {file = "grpcio-1.65.4-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:d7b984a8dd975d949c2042b9b5ebcf297d6d5af57dcd47f946849ee15d3c2fb8"}, - {file = "grpcio-1.65.4-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:644a783ce604a7d7c91412bd51cf9418b942cf71896344b6dc8d55713c71ce82"}, - {file = "grpcio-1.65.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5764237d751d3031a36fafd57eb7d36fd2c10c658d2b4057c516ccf114849a3e"}, - {file = "grpcio-1.65.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ee40d058cf20e1dd4cacec9c39e9bce13fedd38ce32f9ba00f639464fcb757de"}, - {file = "grpcio-1.65.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4482a44ce7cf577a1f8082e807a5b909236bce35b3e3897f839f2fbd9ae6982d"}, - {file = "grpcio-1.65.4-cp310-cp310-win32.whl", hash = "sha256:66bb051881c84aa82e4f22d8ebc9d1704b2e35d7867757f0740c6ef7b902f9b1"}, - {file = "grpcio-1.65.4-cp310-cp310-win_amd64.whl", hash = "sha256:870370524eff3144304da4d1bbe901d39bdd24f858ce849b7197e530c8c8f2ec"}, - {file = "grpcio-1.65.4-cp311-cp311-linux_armv7l.whl", hash = "sha256:85e9c69378af02e483bc626fc19a218451b24a402bdf44c7531e4c9253fb49ef"}, - {file = "grpcio-1.65.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2bd672e005afab8bf0d6aad5ad659e72a06dd713020554182a66d7c0c8f47e18"}, - {file = "grpcio-1.65.4-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:abccc5d73f5988e8f512eb29341ed9ced923b586bb72e785f265131c160231d8"}, - {file = "grpcio-1.65.4-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:886b45b29f3793b0c2576201947258782d7e54a218fe15d4a0468d9a6e00ce17"}, - {file = "grpcio-1.65.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be952436571dacc93ccc7796db06b7daf37b3b56bb97e3420e6503dccfe2f1b4"}, - {file = "grpcio-1.65.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8dc9ddc4603ec43f6238a5c95400c9a901b6d079feb824e890623da7194ff11e"}, - {file = "grpcio-1.65.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ade1256c98cba5a333ef54636095f2c09e6882c35f76acb04412f3b1aa3c29a5"}, - {file = "grpcio-1.65.4-cp311-cp311-win32.whl", hash = "sha256:280e93356fba6058cbbfc6f91a18e958062ef1bdaf5b1caf46c615ba1ae71b5b"}, - {file = "grpcio-1.65.4-cp311-cp311-win_amd64.whl", hash = "sha256:d2b819f9ee27ed4e3e737a4f3920e337e00bc53f9e254377dd26fc7027c4d558"}, - {file = "grpcio-1.65.4-cp312-cp312-linux_armv7l.whl", hash = "sha256:926a0750a5e6fb002542e80f7fa6cab8b1a2ce5513a1c24641da33e088ca4c56"}, - {file = "grpcio-1.65.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:2a1d4c84d9e657f72bfbab8bedf31bdfc6bfc4a1efb10b8f2d28241efabfaaf2"}, - {file = "grpcio-1.65.4-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:17de4fda50967679677712eec0a5c13e8904b76ec90ac845d83386b65da0ae1e"}, - {file = "grpcio-1.65.4-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3dee50c1b69754a4228e933696408ea87f7e896e8d9797a3ed2aeed8dbd04b74"}, - {file = "grpcio-1.65.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74c34fc7562bdd169b77966068434a93040bfca990e235f7a67cdf26e1bd5c63"}, - {file = "grpcio-1.65.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:24a2246e80a059b9eb981e4c2a6d8111b1b5e03a44421adbf2736cc1d4988a8a"}, - {file = "grpcio-1.65.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:18c10f0d054d2dce34dd15855fcca7cc44ec3b811139437543226776730c0f28"}, - {file = "grpcio-1.65.4-cp312-cp312-win32.whl", hash = "sha256:d72962788b6c22ddbcdb70b10c11fbb37d60ae598c51eb47ec019db66ccfdff0"}, - {file = "grpcio-1.65.4-cp312-cp312-win_amd64.whl", hash = "sha256:7656376821fed8c89e68206a522522317787a3d9ed66fb5110b1dff736a5e416"}, - {file = "grpcio-1.65.4-cp38-cp38-linux_armv7l.whl", hash = "sha256:4934077b33aa6fe0b451de8b71dabde96bf2d9b4cb2b3187be86e5adebcba021"}, - {file = "grpcio-1.65.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0cef8c919a3359847c357cb4314e50ed1f0cca070f828ee8f878d362fd744d52"}, - {file = "grpcio-1.65.4-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:a925446e6aa12ca37114840d8550f308e29026cdc423a73da3043fd1603a6385"}, - {file = "grpcio-1.65.4-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf53e6247f1e2af93657e62e240e4f12e11ee0b9cef4ddcb37eab03d501ca864"}, - {file = "grpcio-1.65.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdb34278e4ceb224c89704cd23db0d902e5e3c1c9687ec9d7c5bb4c150f86816"}, - {file = "grpcio-1.65.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e6cbdd107e56bde55c565da5fd16f08e1b4e9b0674851d7749e7f32d8645f524"}, - {file = "grpcio-1.65.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:626319a156b1f19513156a3b0dbfe977f5f93db63ca673a0703238ebd40670d7"}, - {file = "grpcio-1.65.4-cp38-cp38-win32.whl", hash = "sha256:3d1bbf7e1dd1096378bd83c83f554d3b93819b91161deaf63e03b7022a85224a"}, - {file = "grpcio-1.65.4-cp38-cp38-win_amd64.whl", hash = "sha256:a99e6dffefd3027b438116f33ed1261c8d360f0dd4f943cb44541a2782eba72f"}, - {file = "grpcio-1.65.4-cp39-cp39-linux_armv7l.whl", hash = "sha256:874acd010e60a2ec1e30d5e505b0651ab12eb968157cd244f852b27c6dbed733"}, - {file = "grpcio-1.65.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b07f36faf01fca5427d4aa23645e2d492157d56c91fab7e06fe5697d7e171ad4"}, - {file = "grpcio-1.65.4-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:b81711bf4ec08a3710b534e8054c7dcf90f2edc22bebe11c1775a23f145595fe"}, - {file = "grpcio-1.65.4-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88fcabc332a4aef8bcefadc34a02e9ab9407ab975d2c7d981a8e12c1aed92aa1"}, - {file = "grpcio-1.65.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9ba3e63108a8749994f02c7c0e156afb39ba5bdf755337de8e75eb685be244b"}, - {file = "grpcio-1.65.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8eb485801957a486bf5de15f2c792d9f9c897a86f2f18db8f3f6795a094b4bb2"}, - {file = "grpcio-1.65.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:075f3903bc1749ace93f2b0664f72964ee5f2da5c15d4b47e0ab68e4f442c257"}, - {file = "grpcio-1.65.4-cp39-cp39-win32.whl", hash = "sha256:0a0720299bdb2cc7306737295d56e41ce8827d5669d4a3cd870af832e3b17c4d"}, - {file = "grpcio-1.65.4-cp39-cp39-win_amd64.whl", hash = "sha256:a146bc40fa78769f22e1e9ff4f110ef36ad271b79707577bf2a31e3e931141b9"}, - {file = "grpcio-1.65.4.tar.gz", hash = "sha256:2a4f476209acffec056360d3e647ae0e14ae13dcf3dfb130c227ae1c594cbe39"}, + {file = "grpcio-1.65.5-cp310-cp310-linux_armv7l.whl", hash = "sha256:b67d450f1e008fedcd81e097a3a400a711d8be1a8b20f852a7b8a73fead50fe3"}, + {file = "grpcio-1.65.5-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:a70a20eed87bba647a38bedd93b3ce7db64b3f0e8e0952315237f7f5ca97b02d"}, + {file = "grpcio-1.65.5-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:f79c87c114bf37adf408026b9e2e333fe9ff31dfc9648f6f80776c513145c813"}, + {file = "grpcio-1.65.5-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f17f9fa2d947dbfaca01b3ab2c62eefa8240131fdc67b924eb42ce6032e3e5c1"}, + {file = "grpcio-1.65.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32d60e18ff7c34fe3f6db3d35ad5c6dc99f5b43ff3982cb26fad4174462d10b1"}, + {file = "grpcio-1.65.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fe6505376f5b00bb008e4e1418152e3ad3d954b629da286c7913ff3cfc0ff740"}, + {file = "grpcio-1.65.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:33158e56c6378063923c417e9fbdb28660b6e0e2835af42e67f5a7793f587af7"}, + {file = "grpcio-1.65.5-cp310-cp310-win32.whl", hash = "sha256:1cbc208edb9acf1cc339396a1a36b83796939be52f34e591c90292045b579fbf"}, + {file = "grpcio-1.65.5-cp310-cp310-win_amd64.whl", hash = "sha256:bc74f3f745c37e2c5685c9d2a2d5a94de00f286963f5213f763ae137bf4f2358"}, + {file = "grpcio-1.65.5-cp311-cp311-linux_armv7l.whl", hash = "sha256:3207ae60d07e5282c134b6e02f9271a2cb523c6d7a346c6315211fe2bf8d61ed"}, + {file = "grpcio-1.65.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a2f80510f99f82d4eb825849c486df703f50652cea21c189eacc2b84f2bde764"}, + {file = "grpcio-1.65.5-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:a80e9a5e3f93c54f5eb82a3825ea1fc4965b2fa0026db2abfecb139a5c4ecdf1"}, + {file = "grpcio-1.65.5-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b2944390a496567de9e70418f3742b477d85d8ca065afa90432edc91b4bb8ad"}, + {file = "grpcio-1.65.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3655139d7be213c32c79ef6fb2367cae28e56ef68e39b1961c43214b457f257"}, + {file = "grpcio-1.65.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:05f02d68fc720e085f061b704ee653b181e6d5abfe315daef085719728d3d1fd"}, + {file = "grpcio-1.65.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1c4caafe71aef4dabf53274bbf4affd6df651e9f80beedd6b8e08ff438ed3260"}, + {file = "grpcio-1.65.5-cp311-cp311-win32.whl", hash = "sha256:84c901cdec16a092099f251ef3360d15e29ef59772150fa261d94573612539b5"}, + {file = "grpcio-1.65.5-cp311-cp311-win_amd64.whl", hash = "sha256:11f8b16121768c1cb99d7dcb84e01510e60e6a206bf9123e134118802486f035"}, + {file = "grpcio-1.65.5-cp312-cp312-linux_armv7l.whl", hash = "sha256:ee6ed64a27588a2c94e8fa84fe8f3b5c89427d4d69c37690903d428ec61ca7e4"}, + {file = "grpcio-1.65.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:76991b7a6fb98630a3328839755181ce7c1aa2b1842aa085fd4198f0e5198960"}, + {file = "grpcio-1.65.5-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:89c00a18801b1ed9cc441e29b521c354725d4af38c127981f2c950c796a09b6e"}, + {file = "grpcio-1.65.5-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:078038e150a897e5e402ed3d57f1d31ebf604cbed80f595bd281b5da40762a92"}, + {file = "grpcio-1.65.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c97962720489ef31b5ad8a916e22bc31bba3664e063fb9f6702dce056d4aa61b"}, + {file = "grpcio-1.65.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:b8270b15b99781461b244f5c81d5c2bc9696ab9189fb5ff86c841417fb3b39fe"}, + {file = "grpcio-1.65.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8e5c4c15ac3fe1eb68e46bc51e66ad29be887479f231f8237cf8416058bf0cc1"}, + {file = "grpcio-1.65.5-cp312-cp312-win32.whl", hash = "sha256:f5b5970341359341d0e4c789da7568264b2a89cd976c05ea476036852b5950cd"}, + {file = "grpcio-1.65.5-cp312-cp312-win_amd64.whl", hash = "sha256:238a625f391a1b9f5f069bdc5930f4fd71b74426bea52196fc7b83f51fa97d34"}, + {file = "grpcio-1.65.5-cp38-cp38-linux_armv7l.whl", hash = "sha256:6c4e62bcf297a1568f627f39576dbfc27f1e5338a691c6dd5dd6b3979da51d1c"}, + {file = "grpcio-1.65.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:d7df567b67d16d4177835a68d3f767bbcbad04da9dfb52cbd19171f430c898bd"}, + {file = "grpcio-1.65.5-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:b7ca419f1462390851eec395b2089aad1e49546b52d4e2c972ceb76da69b10f8"}, + {file = "grpcio-1.65.5-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fa36dd8496d3af0d40165252a669fa4f6fd2db4b4026b9a9411cbf060b9d6a15"}, + {file = "grpcio-1.65.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a101696f9ece90a0829988ff72f1b1ea2358f3df035bdf6d675dd8b60c2c0894"}, + {file = "grpcio-1.65.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2a6d8169812932feac514b420daffae8ab8e36f90f3122b94ae767e633296b17"}, + {file = "grpcio-1.65.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:47d0aaaab82823f0aa6adea5184350b46e2252e13a42a942db84da5b733f2e05"}, + {file = "grpcio-1.65.5-cp38-cp38-win32.whl", hash = "sha256:85ae8f8517d5bcc21fb07dbf791e94ed84cc28f84c903cdc2bd7eaeb437c8f45"}, + {file = "grpcio-1.65.5-cp38-cp38-win_amd64.whl", hash = "sha256:770bd4bd721961f6dd8049bc27338564ba8739913f77c0f381a9815e465ff965"}, + {file = "grpcio-1.65.5-cp39-cp39-linux_armv7l.whl", hash = "sha256:ab5ec837d8cee8dbce9ef6386125f119b231e4333cc6b6d57b6c5c7c82a72331"}, + {file = "grpcio-1.65.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cabd706183ee08d8026a015af5819a0b3a8959bdc9d1f6fdacd1810f09200f2a"}, + {file = "grpcio-1.65.5-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:ec71fc5b39821ad7d80db7473c8f8c2910f3382f0ddadfbcfc2c6c437107eb67"}, + {file = "grpcio-1.65.5-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3a9e35bcb045e39d7cac30464c285389b9a816ac2067e4884ad2c02e709ef8e"}, + {file = "grpcio-1.65.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d750e9330eb14236ca11b78d0c494eed13d6a95eb55472298f0e547c165ee324"}, + {file = "grpcio-1.65.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2b91ce647b6307f25650872454a4d02a2801f26a475f90d0b91ed8110baae589"}, + {file = "grpcio-1.65.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8da58ff80bc4556cf29bc03f5fff1f03b8387d6aaa7b852af9eb65b2cf833be4"}, + {file = "grpcio-1.65.5-cp39-cp39-win32.whl", hash = "sha256:7a412959aa5f08c5ac04aa7b7c3c041f5e4298cadd4fcc2acff195b56d185ebc"}, + {file = "grpcio-1.65.5-cp39-cp39-win_amd64.whl", hash = "sha256:55714ea852396ec9568f45f487639945ab674de83c12bea19d5ddbc3ae41ada3"}, + {file = "grpcio-1.65.5.tar.gz", hash = "sha256:ec6f219fb5d677a522b0deaf43cea6697b16f338cb68d009e30930c4aa0d2209"}, ] [package.extras] -protobuf = ["grpcio-tools (>=1.65.4)"] +protobuf = ["grpcio-tools (>=1.65.5)"] [[package]] name = "grpclib" @@ -1603,13 +1603,13 @@ test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "p [[package]] name = "importlib-resources" -version = "6.4.2" +version = "6.4.3" description = "Read resources from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_resources-6.4.2-py3-none-any.whl", hash = "sha256:8bba8c54a8a3afaa1419910845fa26ebd706dc716dd208d9b158b4b6966f5c5c"}, - {file = "importlib_resources-6.4.2.tar.gz", hash = "sha256:6cbfbefc449cc6e2095dd184691b7a12a04f40bc75dd4c55d31c34f174cdf57a"}, + {file = "importlib_resources-6.4.3-py3-none-any.whl", hash = "sha256:2d6dfe3b9e055f72495c2085890837fc8c758984e209115c8792bddcb762cd93"}, + {file = "importlib_resources-6.4.3.tar.gz", hash = "sha256:4a202b9b9d38563b46da59221d77bb73862ab5d79d461307bcb826d725448b98"}, ] [package.dependencies] @@ -2119,13 +2119,13 @@ test = ["pytest (>=7.4)", "pytest-cov (>=4.1)"] [[package]] name = "markdown" -version = "3.6" +version = "3.7" description = "Python implementation of John Gruber's Markdown." optional = false python-versions = ">=3.8" files = [ - {file = "Markdown-3.6-py3-none-any.whl", hash = "sha256:48f276f4d8cfb8ce6527c8f79e2ee29708508bf4d40aa410fbc3b4ee832c850f"}, - {file = "Markdown-3.6.tar.gz", hash = "sha256:ed4f41f6daecbeeb96e576ce414c41d2d876daa9a16cb35fa8ed8c2ddfad0224"}, + {file = "Markdown-3.7-py3-none-any.whl", hash = "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803"}, + {file = "markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2"}, ] [package.dependencies] @@ -2874,7 +2874,6 @@ optional = false python-versions = ">=3.9" files = [ {file = "pandas-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce"}, - {file = "pandas-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238"}, {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08"}, {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0"}, {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51"}, @@ -2888,14 +2887,12 @@ files = [ {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1"}, {file = "pandas-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24"}, {file = "pandas-2.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef"}, - {file = "pandas-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b79011ff7a0f4b1d6da6a61aa1aa604fb312d6647de5bad20013682d1429ce"}, {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad"}, {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad"}, {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76"}, {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32"}, {file = "pandas-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23"}, {file = "pandas-2.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2"}, - {file = "pandas-2.2.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd"}, {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863"}, {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921"}, {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a"}, @@ -2908,6 +2905,7 @@ files = [ numpy = [ {version = ">=1.22.4", markers = "python_version < \"3.11\""}, {version = ">=1.23.2", markers = "python_version == \"3.11\""}, + {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, ] python-dateutil = ">=2.8.2" pytz = ">=2020.1" @@ -3242,6 +3240,26 @@ files = [ {file = "protobuf-4.25.4.tar.gz", hash = "sha256:0dc4a62cc4052a036ee2204d26fe4d835c62827c855c8a03f29fe6da146b380d"}, ] +[[package]] +name = "protobuf" +version = "5.27.3" +description = "" +optional = false +python-versions = ">=3.8" +files = [ + {file = "protobuf-5.27.3-cp310-abi3-win32.whl", hash = "sha256:dcb307cd4ef8fec0cf52cb9105a03d06fbb5275ce6d84a6ae33bc6cf84e0a07b"}, + {file = "protobuf-5.27.3-cp310-abi3-win_amd64.whl", hash = "sha256:16ddf3f8c6c41e1e803da7abea17b1793a97ef079a912e42351eabb19b2cffe7"}, + {file = "protobuf-5.27.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:68248c60d53f6168f565a8c76dc58ba4fa2ade31c2d1ebdae6d80f969cdc2d4f"}, + {file = "protobuf-5.27.3-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:b8a994fb3d1c11156e7d1e427186662b64694a62b55936b2b9348f0a7c6625ce"}, + {file = "protobuf-5.27.3-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:a55c48f2a2092d8e213bd143474df33a6ae751b781dd1d1f4d953c128a415b25"}, + {file = "protobuf-5.27.3-cp38-cp38-win32.whl", hash = "sha256:043853dcb55cc262bf2e116215ad43fa0859caab79bb0b2d31b708f128ece035"}, + {file = "protobuf-5.27.3-cp38-cp38-win_amd64.whl", hash = "sha256:c2a105c24f08b1e53d6c7ffe69cb09d0031512f0b72f812dd4005b8112dbe91e"}, + {file = "protobuf-5.27.3-cp39-cp39-win32.whl", hash = "sha256:c84eee2c71ed83704f1afbf1a85c3171eab0fd1ade3b399b3fad0884cbcca8bf"}, + {file = "protobuf-5.27.3-cp39-cp39-win_amd64.whl", hash = "sha256:af7c0b7cfbbb649ad26132e53faa348580f844d9ca46fd3ec7ca48a1ea5db8a1"}, + {file = "protobuf-5.27.3-py3-none-any.whl", hash = "sha256:8572c6533e544ebf6899c360e91d6bcbbee2549251643d32c52cf8a5de295ba5"}, + {file = "protobuf-5.27.3.tar.gz", hash = "sha256:82460903e640f2b7e34ee81a947fdaad89de796d324bcbc38ff5430bcdead82c"}, +] + [[package]] name = "psutil" version = "6.0.0" @@ -3770,7 +3788,8 @@ astroid = ">=3.1.0,<=3.2.0-dev0" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} dill = [ {version = ">=0.2", markers = "python_version < \"3.11\""}, - {version = ">=0.3.6", markers = "python_version >= \"3.11\""}, + {version = ">=0.3.6", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, + {version = ">=0.3.7", markers = "python_version >= \"3.12\""}, ] isort = ">=4.2.5,<5.13.0 || >5.13.0,<6" mccabe = ">=0.6,<0.8" @@ -4148,120 +4167,120 @@ files = [ [[package]] name = "pyzmq" -version = "26.1.0" +version = "26.1.1" description = "Python bindings for 0MQ" optional = false python-versions = ">=3.7" files = [ - {file = "pyzmq-26.1.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:263cf1e36862310bf5becfbc488e18d5d698941858860c5a8c079d1511b3b18e"}, - {file = "pyzmq-26.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d5c8b17f6e8f29138678834cf8518049e740385eb2dbf736e8f07fc6587ec682"}, - {file = "pyzmq-26.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75a95c2358fcfdef3374cb8baf57f1064d73246d55e41683aaffb6cfe6862917"}, - {file = "pyzmq-26.1.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f99de52b8fbdb2a8f5301ae5fc0f9e6b3ba30d1d5fc0421956967edcc6914242"}, - {file = "pyzmq-26.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bcbfbab4e1895d58ab7da1b5ce9a327764f0366911ba5b95406c9104bceacb0"}, - {file = "pyzmq-26.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:77ce6a332c7e362cb59b63f5edf730e83590d0ab4e59c2aa5bd79419a42e3449"}, - {file = "pyzmq-26.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ba0a31d00e8616149a5ab440d058ec2da621e05d744914774c4dde6837e1f545"}, - {file = "pyzmq-26.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8b88641384e84a258b740801cd4dbc45c75f148ee674bec3149999adda4a8598"}, - {file = "pyzmq-26.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2fa76ebcebe555cce90f16246edc3ad83ab65bb7b3d4ce408cf6bc67740c4f88"}, - {file = "pyzmq-26.1.0-cp310-cp310-win32.whl", hash = "sha256:fbf558551cf415586e91160d69ca6416f3fce0b86175b64e4293644a7416b81b"}, - {file = "pyzmq-26.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:a7b8aab50e5a288c9724d260feae25eda69582be84e97c012c80e1a5e7e03fb2"}, - {file = "pyzmq-26.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:08f74904cb066e1178c1ec706dfdb5c6c680cd7a8ed9efebeac923d84c1f13b1"}, - {file = "pyzmq-26.1.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:46d6800b45015f96b9d92ece229d92f2aef137d82906577d55fadeb9cf5fcb71"}, - {file = "pyzmq-26.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5bc2431167adc50ba42ea3e5e5f5cd70d93e18ab7b2f95e724dd8e1bd2c38120"}, - {file = "pyzmq-26.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3bb34bebaa1b78e562931a1687ff663d298013f78f972a534f36c523311a84d"}, - {file = "pyzmq-26.1.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd3f6329340cef1c7ba9611bd038f2d523cea79f09f9c8f6b0553caba59ec562"}, - {file = "pyzmq-26.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:471880c4c14e5a056a96cd224f5e71211997d40b4bf5e9fdded55dafab1f98f2"}, - {file = "pyzmq-26.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:ce6f2b66799971cbae5d6547acefa7231458289e0ad481d0be0740535da38d8b"}, - {file = "pyzmq-26.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0a1f6ea5b1d6cdbb8cfa0536f0d470f12b4b41ad83625012e575f0e3ecfe97f0"}, - {file = "pyzmq-26.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b45e6445ac95ecb7d728604bae6538f40ccf4449b132b5428c09918523abc96d"}, - {file = "pyzmq-26.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:94c4262626424683feea0f3c34951d39d49d354722db2745c42aa6bb50ecd93b"}, - {file = "pyzmq-26.1.0-cp311-cp311-win32.whl", hash = "sha256:a0f0ab9df66eb34d58205913f4540e2ad17a175b05d81b0b7197bc57d000e829"}, - {file = "pyzmq-26.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:8efb782f5a6c450589dbab4cb0f66f3a9026286333fe8f3a084399149af52f29"}, - {file = "pyzmq-26.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:f133d05aaf623519f45e16ab77526e1e70d4e1308e084c2fb4cedb1a0c764bbb"}, - {file = "pyzmq-26.1.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:3d3146b1c3dcc8a1539e7cc094700b2be1e605a76f7c8f0979b6d3bde5ad4072"}, - {file = "pyzmq-26.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d9270fbf038bf34ffca4855bcda6e082e2c7f906b9eb8d9a8ce82691166060f7"}, - {file = "pyzmq-26.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:995301f6740a421afc863a713fe62c0aaf564708d4aa057dfdf0f0f56525294b"}, - {file = "pyzmq-26.1.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7eca8b89e56fb8c6c26dd3e09bd41b24789022acf1cf13358e96f1cafd8cae3"}, - {file = "pyzmq-26.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d4feb2e83dfe9ace6374a847e98ee9d1246ebadcc0cb765482e272c34e5820"}, - {file = "pyzmq-26.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d4fafc2eb5d83f4647331267808c7e0c5722c25a729a614dc2b90479cafa78bd"}, - {file = "pyzmq-26.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:58c33dc0e185dd97a9ac0288b3188d1be12b756eda67490e6ed6a75cf9491d79"}, - {file = "pyzmq-26.1.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:68a0a1d83d33d8367ddddb3e6bb4afbb0f92bd1dac2c72cd5e5ddc86bdafd3eb"}, - {file = "pyzmq-26.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2ae7c57e22ad881af78075e0cea10a4c778e67234adc65c404391b417a4dda83"}, - {file = "pyzmq-26.1.0-cp312-cp312-win32.whl", hash = "sha256:347e84fc88cc4cb646597f6d3a7ea0998f887ee8dc31c08587e9c3fd7b5ccef3"}, - {file = "pyzmq-26.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:9f136a6e964830230912f75b5a116a21fe8e34128dcfd82285aa0ef07cb2c7bd"}, - {file = "pyzmq-26.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:a4b7a989c8f5a72ab1b2bbfa58105578753ae77b71ba33e7383a31ff75a504c4"}, - {file = "pyzmq-26.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d416f2088ac8f12daacffbc2e8918ef4d6be8568e9d7155c83b7cebed49d2322"}, - {file = "pyzmq-26.1.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:ecb6c88d7946166d783a635efc89f9a1ff11c33d680a20df9657b6902a1d133b"}, - {file = "pyzmq-26.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:471312a7375571857a089342beccc1a63584315188560c7c0da7e0a23afd8a5c"}, - {file = "pyzmq-26.1.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e6cea102ffa16b737d11932c426f1dc14b5938cf7bc12e17269559c458ac334"}, - {file = "pyzmq-26.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec7248673ffc7104b54e4957cee38b2f3075a13442348c8d651777bf41aa45ee"}, - {file = "pyzmq-26.1.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:0614aed6f87d550b5cecb03d795f4ddbb1544b78d02a4bd5eecf644ec98a39f6"}, - {file = "pyzmq-26.1.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:e8746ce968be22a8a1801bf4a23e565f9687088580c3ed07af5846580dd97f76"}, - {file = "pyzmq-26.1.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:7688653574392d2eaeef75ddcd0b2de5b232d8730af29af56c5adf1df9ef8d6f"}, - {file = "pyzmq-26.1.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:8d4dac7d97f15c653a5fedcafa82626bd6cee1450ccdaf84ffed7ea14f2b07a4"}, - {file = "pyzmq-26.1.0-cp313-cp313-win32.whl", hash = "sha256:ccb42ca0a4a46232d716779421bbebbcad23c08d37c980f02cc3a6bd115ad277"}, - {file = "pyzmq-26.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e1e5d0a25aea8b691a00d6b54b28ac514c8cc0d8646d05f7ca6cb64b97358250"}, - {file = "pyzmq-26.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:fc82269d24860cfa859b676d18850cbb8e312dcd7eada09e7d5b007e2f3d9eb1"}, - {file = "pyzmq-26.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:416ac51cabd54f587995c2b05421324700b22e98d3d0aa2cfaec985524d16f1d"}, - {file = "pyzmq-26.1.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:ff832cce719edd11266ca32bc74a626b814fff236824aa1aeaad399b69fe6eae"}, - {file = "pyzmq-26.1.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:393daac1bcf81b2a23e696b7b638eedc965e9e3d2112961a072b6cd8179ad2eb"}, - {file = "pyzmq-26.1.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9869fa984c8670c8ab899a719eb7b516860a29bc26300a84d24d8c1b71eae3ec"}, - {file = "pyzmq-26.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b3b8e36fd4c32c0825b4461372949ecd1585d326802b1321f8b6dc1d7e9318c"}, - {file = "pyzmq-26.1.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:3ee647d84b83509b7271457bb428cc347037f437ead4b0b6e43b5eba35fec0aa"}, - {file = "pyzmq-26.1.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:45cb1a70eb00405ce3893041099655265fabcd9c4e1e50c330026e82257892c1"}, - {file = "pyzmq-26.1.0-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:5cca7b4adb86d7470e0fc96037771981d740f0b4cb99776d5cb59cd0e6684a73"}, - {file = "pyzmq-26.1.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:91d1a20bdaf3b25f3173ff44e54b1cfbc05f94c9e8133314eb2962a89e05d6e3"}, - {file = "pyzmq-26.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c0665d85535192098420428c779361b8823d3d7ec4848c6af3abb93bc5c915bf"}, - {file = "pyzmq-26.1.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:96d7c1d35ee4a495df56c50c83df7af1c9688cce2e9e0edffdbf50889c167595"}, - {file = "pyzmq-26.1.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b281b5ff5fcc9dcbfe941ac5c7fcd4b6c065adad12d850f95c9d6f23c2652384"}, - {file = "pyzmq-26.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5384c527a9a004445c5074f1e20db83086c8ff1682a626676229aafd9cf9f7d1"}, - {file = "pyzmq-26.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:754c99a9840839375ee251b38ac5964c0f369306eddb56804a073b6efdc0cd88"}, - {file = "pyzmq-26.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9bdfcb74b469b592972ed881bad57d22e2c0acc89f5e8c146782d0d90fb9f4bf"}, - {file = "pyzmq-26.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bd13f0231f4788db619347b971ca5f319c5b7ebee151afc7c14632068c6261d3"}, - {file = "pyzmq-26.1.0-cp37-cp37m-win32.whl", hash = "sha256:c5668dac86a869349828db5fc928ee3f58d450dce2c85607067d581f745e4fb1"}, - {file = "pyzmq-26.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ad875277844cfaeca7fe299ddf8c8d8bfe271c3dc1caf14d454faa5cdbf2fa7a"}, - {file = "pyzmq-26.1.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:65c6e03cc0222eaf6aad57ff4ecc0a070451e23232bb48db4322cc45602cede0"}, - {file = "pyzmq-26.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:038ae4ffb63e3991f386e7fda85a9baab7d6617fe85b74a8f9cab190d73adb2b"}, - {file = "pyzmq-26.1.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:bdeb2c61611293f64ac1073f4bf6723b67d291905308a7de9bb2ca87464e3273"}, - {file = "pyzmq-26.1.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:61dfa5ee9d7df297c859ac82b1226d8fefaf9c5113dc25c2c00ecad6feeeb04f"}, - {file = "pyzmq-26.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3292d384537b9918010769b82ab3e79fca8b23d74f56fc69a679106a3e2c2cf"}, - {file = "pyzmq-26.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f9499c70c19ff0fbe1007043acb5ad15c1dec7d8e84ab429bca8c87138e8f85c"}, - {file = "pyzmq-26.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d3dd5523ed258ad58fed7e364c92a9360d1af8a9371e0822bd0146bdf017ef4c"}, - {file = "pyzmq-26.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baba2fd199b098c5544ef2536b2499d2e2155392973ad32687024bd8572a7d1c"}, - {file = "pyzmq-26.1.0-cp38-cp38-win32.whl", hash = "sha256:ddbb2b386128d8eca92bd9ca74e80f73fe263bcca7aa419f5b4cbc1661e19741"}, - {file = "pyzmq-26.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:79e45a4096ec8388cdeb04a9fa5e9371583bcb826964d55b8b66cbffe7b33c86"}, - {file = "pyzmq-26.1.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:add52c78a12196bc0fda2de087ba6c876ea677cbda2e3eba63546b26e8bf177b"}, - {file = "pyzmq-26.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:98c03bd7f3339ff47de7ea9ac94a2b34580a8d4df69b50128bb6669e1191a895"}, - {file = "pyzmq-26.1.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dcc37d9d708784726fafc9c5e1232de655a009dbf97946f117aefa38d5985a0f"}, - {file = "pyzmq-26.1.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5a6ed52f0b9bf8dcc64cc82cce0607a3dfed1dbb7e8c6f282adfccc7be9781de"}, - {file = "pyzmq-26.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:451e16ae8bea3d95649317b463c9f95cd9022641ec884e3d63fc67841ae86dfe"}, - {file = "pyzmq-26.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:906e532c814e1d579138177a00ae835cd6becbf104d45ed9093a3aaf658f6a6a"}, - {file = "pyzmq-26.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:05bacc4f94af468cc82808ae3293390278d5f3375bb20fef21e2034bb9a505b6"}, - {file = "pyzmq-26.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:57bb2acba798dc3740e913ffadd56b1fcef96f111e66f09e2a8db3050f1f12c8"}, - {file = "pyzmq-26.1.0-cp39-cp39-win32.whl", hash = "sha256:f774841bb0e8588505002962c02da420bcfb4c5056e87a139c6e45e745c0e2e2"}, - {file = "pyzmq-26.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:359c533bedc62c56415a1f5fcfd8279bc93453afdb0803307375ecf81c962402"}, - {file = "pyzmq-26.1.0-cp39-cp39-win_arm64.whl", hash = "sha256:7907419d150b19962138ecec81a17d4892ea440c184949dc29b358bc730caf69"}, - {file = "pyzmq-26.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b24079a14c9596846bf7516fe75d1e2188d4a528364494859106a33d8b48be38"}, - {file = "pyzmq-26.1.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59d0acd2976e1064f1b398a00e2c3e77ed0a157529779e23087d4c2fb8aaa416"}, - {file = "pyzmq-26.1.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:911c43a4117915203c4cc8755e0f888e16c4676a82f61caee2f21b0c00e5b894"}, - {file = "pyzmq-26.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b10163e586cc609f5f85c9b233195554d77b1e9a0801388907441aaeb22841c5"}, - {file = "pyzmq-26.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:28a8b2abb76042f5fd7bd720f7fea48c0fd3e82e9de0a1bf2c0de3812ce44a42"}, - {file = "pyzmq-26.1.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bef24d3e4ae2c985034439f449e3f9e06bf579974ce0e53d8a507a1577d5b2ab"}, - {file = "pyzmq-26.1.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2cd0f4d314f4a2518e8970b6f299ae18cff7c44d4a1fc06fc713f791c3a9e3ea"}, - {file = "pyzmq-26.1.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fa25a620eed2a419acc2cf10135b995f8f0ce78ad00534d729aa761e4adcef8a"}, - {file = "pyzmq-26.1.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef3b048822dca6d231d8a8ba21069844ae38f5d83889b9b690bf17d2acc7d099"}, - {file = "pyzmq-26.1.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:9a6847c92d9851b59b9f33f968c68e9e441f9a0f8fc972c5580c5cd7cbc6ee24"}, - {file = "pyzmq-26.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c9b9305004d7e4e6a824f4f19b6d8f32b3578aad6f19fc1122aaf320cbe3dc83"}, - {file = "pyzmq-26.1.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:63c1d3a65acb2f9c92dce03c4e1758cc552f1ae5c78d79a44e3bb88d2fa71f3a"}, - {file = "pyzmq-26.1.0-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d36b8fffe8b248a1b961c86fbdfa0129dfce878731d169ede7fa2631447331be"}, - {file = "pyzmq-26.1.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67976d12ebfd61a3bc7d77b71a9589b4d61d0422282596cf58c62c3866916544"}, - {file = "pyzmq-26.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:998444debc8816b5d8d15f966e42751032d0f4c55300c48cc337f2b3e4f17d03"}, - {file = "pyzmq-26.1.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e5c88b2f13bcf55fee78ea83567b9fe079ba1a4bef8b35c376043440040f7edb"}, - {file = "pyzmq-26.1.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d906d43e1592be4b25a587b7d96527cb67277542a5611e8ea9e996182fae410"}, - {file = "pyzmq-26.1.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80b0c9942430d731c786545da6be96d824a41a51742e3e374fedd9018ea43106"}, - {file = "pyzmq-26.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:314d11564c00b77f6224d12eb3ddebe926c301e86b648a1835c5b28176c83eab"}, - {file = "pyzmq-26.1.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:093a1a3cae2496233f14b57f4b485da01b4ff764582c854c0f42c6dd2be37f3d"}, - {file = "pyzmq-26.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3c397b1b450f749a7e974d74c06d69bd22dd362142f370ef2bd32a684d6b480c"}, - {file = "pyzmq-26.1.0.tar.gz", hash = "sha256:6c5aeea71f018ebd3b9115c7cb13863dd850e98ca6b9258509de1246461a7e7f"}, + {file = "pyzmq-26.1.1-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:b1bb952d1e407463c9333ea7e0c0600001e54e08ce836d4f0aff1fb3f902cf63"}, + {file = "pyzmq-26.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:65e2a18e845c6ea7ab849c70db932eaeadee5edede9e379eb21c0a44cf523b2e"}, + {file = "pyzmq-26.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:def7ae3006924b8a0c146a89ab4008310913fa903beedb95e25dea749642528e"}, + {file = "pyzmq-26.1.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a8234571df7816f99dde89c3403cb396d70c6554120b795853a8ea56fcc26cd3"}, + {file = "pyzmq-26.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18da8e84dbc30688fd2baefd41df7190607511f916be34f9a24b0e007551822e"}, + {file = "pyzmq-26.1.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:c70dab93d98b2bf3f0ac1265edbf6e7f83acbf71dabcc4611889bb0dea45bed7"}, + {file = "pyzmq-26.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:fcb90592c5d5c562e1b1a1ceccf6f00036d73c51db0271bf4d352b8d6b31d468"}, + {file = "pyzmq-26.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cf4be7460a0c1bc71e9b0e64ecdd75a86386ca6afaa36641686f5542d0314e9d"}, + {file = "pyzmq-26.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4cbecda4ddbfc1e309c3be04d333f9be3fc6178b8b6592b309676f929767a15"}, + {file = "pyzmq-26.1.1-cp310-cp310-win32.whl", hash = "sha256:583f73b113b8165713b6ce028d221402b1b69483055b5aa3f991937e34dd1ead"}, + {file = "pyzmq-26.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:5e6f39ecb8eb7bfcb976c49262e8cf83ff76e082b77ca23ba90c9b6691a345be"}, + {file = "pyzmq-26.1.1-cp310-cp310-win_arm64.whl", hash = "sha256:8d042d6446cab3a1388b38596f5acabb9926b0b95c3894c519356b577a549458"}, + {file = "pyzmq-26.1.1-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:362cac2423e36966d336d79d3ec3eafeabc153ee3e7a5cf580d7e74a34b3d912"}, + {file = "pyzmq-26.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0841633446cb1539a832a19bb24c03a20c00887d0cedd1d891b495b07e5c5cb5"}, + {file = "pyzmq-26.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e1fcdc333afbf9918d0a614a6e10858aede7da49a60f6705a77e343fe86a317"}, + {file = "pyzmq-26.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc8d655627d775475eafdcf0e49e74bcc1e5e90afd9ab813b4da98f092ed7b93"}, + {file = "pyzmq-26.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32de51744820857a6f7c3077e620ab3f607d0e4388dfead885d5124ab9bcdc5e"}, + {file = "pyzmq-26.1.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a880240597010914ffb1d6edd04d3deb7ce6a2abf79a0012751438d13630a671"}, + {file = "pyzmq-26.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:26131b1cec02f941ed2d2b4b8cc051662b1c248b044eff5069df1f500bbced56"}, + {file = "pyzmq-26.1.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ce05841322b58510607f9508a573138d995a46c7928887bc433de9cb760fd2ad"}, + {file = "pyzmq-26.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:32123ff0a6db521aadf2b95201e967a4e0d11fb89f73663a99d2f54881c07214"}, + {file = "pyzmq-26.1.1-cp311-cp311-win32.whl", hash = "sha256:e790602d7ea1d6c7d8713d571226d67de7ffe47b1e22ae2c043ebd537de1bccb"}, + {file = "pyzmq-26.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:717960855f2d6fdc2dba9df49dff31c414187bb11c76af36343a57d1f7083d9a"}, + {file = "pyzmq-26.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:08956c26dbcd4fd8835cb777a16e21958ed2412317630e19f0018d49dbeeb470"}, + {file = "pyzmq-26.1.1-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:e80345900ae241c2c51bead7c9fa247bba6d4b2a83423e9791bae8b0a7f12c52"}, + {file = "pyzmq-26.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ec8fe214fcc45dfb0c32e4a7ad1db20244ba2d2fecbf0cbf9d5242d81ca0a375"}, + {file = "pyzmq-26.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf4e283f97688d993cb7a8acbc22889effbbb7cbaa19ee9709751f44be928f5d"}, + {file = "pyzmq-26.1.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2508bdc8ab246e5ed7c92023d4352aaad63020ca3b098a4e3f1822db202f703d"}, + {file = "pyzmq-26.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:741bdb4d96efe8192616abdc3671931d51a8bcd38c71da2d53fb3127149265d1"}, + {file = "pyzmq-26.1.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:76154943e4c4054b2591792eb3484ef1dd23d59805759f9cebd2f010aa30ee8c"}, + {file = "pyzmq-26.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9498ac427d20d0e0ef0e4bbd6200841e91640dfdf619f544ceec7f464cfb6070"}, + {file = "pyzmq-26.1.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f34453ef3496ca3462f30435bf85f535f9550392987341f9ccc92c102825a79"}, + {file = "pyzmq-26.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:50f0669324e27cc2091ef6ab76ca7112f364b6249691790b4cffce31e73fda28"}, + {file = "pyzmq-26.1.1-cp312-cp312-win32.whl", hash = "sha256:3ee5cbf2625b94de21c68d0cefd35327c8dfdbd6a98fcc41682b4e8bb00d841f"}, + {file = "pyzmq-26.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:75bd448a28b1001b6928679015bc95dd5f172703ed30135bb9e34fc9cda0a3e7"}, + {file = "pyzmq-26.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:4350233569b4bbef88595c5e77ee38995a6f1f1790fae148b578941bfffd1c24"}, + {file = "pyzmq-26.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6c8087a3281c20b1d11042d372ed5a47734af05975d78e4d1d6e7bd1018535f3"}, + {file = "pyzmq-26.1.1-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:ebef7d3fe11fe4c688f08bc0211a976c3318c097057f258428200737b9fff4da"}, + {file = "pyzmq-26.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a5342110510045a47de1e87f5f1dcc1d9d90109522316dc9830cfc6157c800f"}, + {file = "pyzmq-26.1.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:af690ea4be6ca92a67c2b44a779a023bf0838e92d48497a2268175dc4a505691"}, + {file = "pyzmq-26.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc994e220c1403ae087d7f0fa45129d583e46668a019e389060da811a5a9320e"}, + {file = "pyzmq-26.1.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:b8e153f5dffb0310af71fc6fc9cd8174f4c8ea312c415adcb815d786fee78179"}, + {file = "pyzmq-26.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:0065026e624052a51033857e5cd45a94b52946b44533f965f0bdf182460e965d"}, + {file = "pyzmq-26.1.1-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:63351392f948b5d50b9f55161994bc4feedbfb3f3cfe393d2f503dea2c3ec445"}, + {file = "pyzmq-26.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ffecc43b3c18e36b62fcec995761829b6ac325d8dd74a4f2c5c1653afbb4495a"}, + {file = "pyzmq-26.1.1-cp313-cp313-win32.whl", hash = "sha256:6ff14c2fae6c0c2c1c02590c5c5d75aa1db35b859971b3ca2fcd28f983d9f2b6"}, + {file = "pyzmq-26.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:85f2d2ee5ea9a8f1de86a300e1062fbab044f45b5ce34d20580c0198a8196db0"}, + {file = "pyzmq-26.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:cc09b1de8b985ca5a0ca343dd7fb007267c6b329347a74e200f4654268084239"}, + {file = "pyzmq-26.1.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:bc904e86de98f8fc5bd41597da5d61232d2d6d60c4397f26efffabb961b2b245"}, + {file = "pyzmq-26.1.1-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:00f39c367bbd6aa8e4bc36af6510561944c619b58eb36199fa334b594a18f615"}, + {file = "pyzmq-26.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de6f384864a959866b782e6a3896538d1424d183f2d3c7ef079f71dcecde7284"}, + {file = "pyzmq-26.1.1-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3abb15df0c763339edb27a644c19381b2425ddd1aea3dbd77c1601a3b31867b8"}, + {file = "pyzmq-26.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40908ec2dd3b29bbadc0916a0d3c87f8dbeebbd8fead8e618539f09e0506dec4"}, + {file = "pyzmq-26.1.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:c11a95d3f6fc7e714ccd1066f68f9c1abd764a8b3596158be92f46dd49f41e03"}, + {file = "pyzmq-26.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:4437af9fee7a58302dbd511cc49f0cc2b35c112a33a1111fb123cf0be45205ca"}, + {file = "pyzmq-26.1.1-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:76390d3d66406cb01b9681c382874400e9dfd77f30ecdea4bd1bf5226dd4aff0"}, + {file = "pyzmq-26.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:4d4c7fe5e50e269f9c63a260638488fec194a73993008618a59b54c47ef6ae72"}, + {file = "pyzmq-26.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:25d128524207f53f7aae7c5abdc2b63f8957a060b00521af5ffcd20986b5d8f4"}, + {file = "pyzmq-26.1.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d74b925d997e4f92b042bdd7085cd0a309ee0fd7cb4dc376059bbff6b32ff34f"}, + {file = "pyzmq-26.1.1-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:732f957441e5b1c65a7509395e6b6cafee9e12df9aa5f4bf92ed266fe0ba70ee"}, + {file = "pyzmq-26.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0a45102ad7ed9f9ddf2bd699cc5df37742cf7301111cba06001b927efecb120"}, + {file = "pyzmq-26.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9f380d5333fc7cd17423f486125dcc073918676e33db70a6a8172b19fc78d23d"}, + {file = "pyzmq-26.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:8eaffcd6bf6a9d00b66a2052a33fa7e6a6575427e9644395f13c3d070f2918dc"}, + {file = "pyzmq-26.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:f1483d4975ae1b387b39bb8e23d1ff32fe5621aa9e4ed3055d05e9c5613fea53"}, + {file = "pyzmq-26.1.1-cp37-cp37m-win32.whl", hash = "sha256:a83653c6bbe5887caea55e49fbd2909c14b73acf43bcc051eb60b2d514bbd46e"}, + {file = "pyzmq-26.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9763a8d3f5f74ef679989b373c37cc22e8d07e56d26439205cb83edb7722357f"}, + {file = "pyzmq-26.1.1-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:2b045647caf620ce0ed6c8fd9fb6a73116f99aceed966b152a5ba1b416d25311"}, + {file = "pyzmq-26.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f66dcb6625c002f209cdc12cae1a1fec926493cd2262efe37dc6b25a30cea863"}, + {file = "pyzmq-26.1.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0cf1d980c969fb9e538f52abd2227f09e015096bc5c3ef7aa26e0d64051c1db8"}, + {file = "pyzmq-26.1.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:443ebf5e261a95ee9725693f2a5a71401f89b89df0e0ea58844b074067aac2f1"}, + {file = "pyzmq-26.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29de77ba1b1877fe7defc1b9140e65cbd35f72a63bc501e56c2eae55bde5fff4"}, + {file = "pyzmq-26.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f6071ec95af145d7b659dae6786871cd85f0acc599286b6f8ba0c74592d83dd"}, + {file = "pyzmq-26.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6f0512fc87629ad968889176bf2165d721cd817401a281504329e2a2ed0ca6a3"}, + {file = "pyzmq-26.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5ccfcf13e80719f6a2d9c0a021d9e47d4550907a29253554be2c09582f6d7963"}, + {file = "pyzmq-26.1.1-cp38-cp38-win32.whl", hash = "sha256:809673947e95752e407aaaaf03f205ee86ebfff9ca51db6d4003dfd87b8428d1"}, + {file = "pyzmq-26.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:62b5180e23e6f581600459cd983473cd723fdc64350f606d21407c99832aaf5f"}, + {file = "pyzmq-26.1.1-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:fe73d7c89d6f803bed122135ff5783364e8cdb479cf6fe2d764a44b6349e7e0f"}, + {file = "pyzmq-26.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db1b7e2b50ef21f398036786da4c153db63203a402396d9f21e08ea61f3f8dba"}, + {file = "pyzmq-26.1.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7c506a51cb01bb997a3f6440db0d121e5e7a32396e9948b1fdb6a7bfa67243f4"}, + {file = "pyzmq-26.1.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:92eca4f80e8a748d880e55d3cf57ef487692e439f12d5c5a2e1cce84aaa7f6cb"}, + {file = "pyzmq-26.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14bdbae02f72f4716b0ffe7500e9da303d719ddde1f3dcfb4c4f6cc1cf73bb02"}, + {file = "pyzmq-26.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e03be7ed17836c9434cce0668ac1e2cc9143d7169f90f46a0167f6155e176e32"}, + {file = "pyzmq-26.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc5df31e36e4fddd4c8b5c42daee8d54d7b529e898ac984be97bf5517de166a7"}, + {file = "pyzmq-26.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f218179c90a12d660906e04b25a340dd63e9743000ba16232ddaf46888f269da"}, + {file = "pyzmq-26.1.1-cp39-cp39-win32.whl", hash = "sha256:7dfabc180a4da422a4b349c63077347392463a75fa07aa3be96712ed6d42c547"}, + {file = "pyzmq-26.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:c5248e6e0fcbbbc912982e99cdd51c342601f495b0fa5bd667f3bdbdbf3e170f"}, + {file = "pyzmq-26.1.1-cp39-cp39-win_arm64.whl", hash = "sha256:2ae7aa1408778dc74582a1226052b930f9083b54b64d7e6ef6ec0466cfdcdec2"}, + {file = "pyzmq-26.1.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:be3fc2b11c0c384949cf1f01f9a48555039408b0f3e877863b1754225635953e"}, + {file = "pyzmq-26.1.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48dee75c2a9fa4f4a583d4028d564a0453447ee1277a29b07acc3743c092e259"}, + {file = "pyzmq-26.1.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:23f2fe4fb567e8098ebaa7204819658195b10ddd86958a97a6058eed2901eed3"}, + {file = "pyzmq-26.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:472cacd16f627c06d3c8b2d374345ab74446bae913584a6245e2aa935336d929"}, + {file = "pyzmq-26.1.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:8285b25aa20fcc46f1ca4afbc39fd3d5f2fe4c4bbf7f2c7f907a214e87a70024"}, + {file = "pyzmq-26.1.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2067e63fd9d5c13cfe12624dab0366053e523b37a7a01678ce4321f839398939"}, + {file = "pyzmq-26.1.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cc109be2ee3638035d276e18eaf66a1e1f44201c0c4bea4ee0c692766bbd3570"}, + {file = "pyzmq-26.1.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d0da97e65ee73261dba70469cc8f63d8da3a8a825337a2e3d246b9e95141cdd0"}, + {file = "pyzmq-26.1.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa79c528706561306938b275f89bb2c6985ce08469c27e5de05bc680df5e826f"}, + {file = "pyzmq-26.1.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:3ddbd851a3a2651fdc5065a2804d50cf2f4b13b1bcd66de8e9e855d0217d4fcd"}, + {file = "pyzmq-26.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d3df226ab7464684ae6706e20a5cbab717c3735a7e409b3fa598b754d49f1946"}, + {file = "pyzmq-26.1.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:abad7b897e960d577eb4a0f3f789c1780bc3ffe2e7c27cf317e7c90ad26acf12"}, + {file = "pyzmq-26.1.1-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c513d829a548c2d5c88983167be2b3aa537f6d1191edcdc6fcd8999e18bdd994"}, + {file = "pyzmq-26.1.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70af4c9c991714ef1c65957605a8de42ef0d0620dd5f125953c8e682281bdb80"}, + {file = "pyzmq-26.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:8d4234f335b0d0842f7d661d8cd50cbad0729be58f1c4deb85cd96b38fe95025"}, + {file = "pyzmq-26.1.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:2c0fdb7b758e0e1605157e480b00b3a599073068a37091a1c75ec65bf7498645"}, + {file = "pyzmq-26.1.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc657577f057d60dd3642c9f95f28b432889b73143140061f7c1331d02f03df6"}, + {file = "pyzmq-26.1.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3e3b66fe6131b4f33d239f7d4c3bfb2f8532d8644bae3b3da4f3987073edac55"}, + {file = "pyzmq-26.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59b57e912feef6951aec8bb03fe0faa5ad5f36962883c72a30a9c965e6d988fd"}, + {file = "pyzmq-26.1.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:146956aec7d947c5afc5e7da0841423d7a53f84fd160fff25e682361dcfb32cb"}, + {file = "pyzmq-26.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:9521b874fd489495865172f344e46e0159095d1f161858e3fc6e28e43ca15160"}, + {file = "pyzmq-26.1.1.tar.gz", hash = "sha256:a7db05d8b7cd1a8c6610e9e9aa55d525baae7a44a43e18bc3260eb3f92de96c6"}, ] [package.dependencies] @@ -4355,13 +4374,13 @@ test = ["coverage[toml] (>=6.2)", "mypy (>=0.940)", "pytest (>=6.2.2)", "pytest- [[package]] name = "qibo" -version = "0.2.7" +version = "0.2.11" description = "A framework for quantum computing with hardware acceleration." optional = false -python-versions = "<3.12,>=3.9" +python-versions = "<3.13,>=3.9" files = [ - {file = "qibo-0.2.7-py3-none-any.whl", hash = "sha256:20e42ad27f7a9795f84565ab5645e3b24d4af62a0a8c6de5110b5ae6894b35a2"}, - {file = "qibo-0.2.7.tar.gz", hash = "sha256:a57e98a3eccfc3c43c4a697448a4618c9a158f72645d5c93b0b2bdd3ace882ef"}, + {file = "qibo-0.2.11-py3-none-any.whl", hash = "sha256:67e900364e62642c0c8c3c69fbfaea3e81bef5da53b4547b67516a11dcbe099d"}, + {file = "qibo-0.2.11.tar.gz", hash = "sha256:312037020ddfc82bcb92d698e960e5c3749fbbd61d16944b91d0ba15d6cc7931"}, ] [package.dependencies] @@ -4372,13 +4391,14 @@ networkx = ">=3.2.1,<4.0.0" numpy = ">=1.26.4,<2.0.0" openqasm3 = {version = ">=0.5.0", extras = ["parser"]} scipy = ">=1.10.1,<2.0.0" +setuptools = ">=69.1.1,<71.0.0" sympy = ">=1.11.1,<2.0.0" tabulate = ">=0.9.0,<0.10.0" [package.extras] -qinfo = ["cvxpy (>=1.4.2,<2.0.0)"] -tensorflow = ["tensorflow (>=2.14.1,<2.16)"] -torch = ["torch (>=2.1.1,<3.0.0)"] +qulacs = ["qulacs (>=0.6.4,<0.7.0)"] +tensorflow = ["tensorflow (>=2.16.1,<3.0.0)"] +torch = ["torch (>=2.1.1,<2.4)"] [[package]] name = "qibosoq" @@ -4951,19 +4971,18 @@ test = ["array-api-strict", "asv", "gmpy2", "hypothesis (>=6.30)", "mpmath", "po [[package]] name = "setuptools" -version = "72.2.0" +version = "70.3.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-72.2.0-py3-none-any.whl", hash = "sha256:f11dd94b7bae3a156a95ec151f24e4637fb4fa19c878e4d191bfb8b2d82728c4"}, - {file = "setuptools-72.2.0.tar.gz", hash = "sha256:80aacbf633704e9c8bfa1d99fa5dd4dc59573efcf9e4042c13d3bcef91ac2ef9"}, + {file = "setuptools-70.3.0-py3-none-any.whl", hash = "sha256:fe384da74336c398e0d956d1cae0669bc02eed936cdb1d49b57de1990dc11ffc"}, + {file = "setuptools-70.3.0.tar.gz", hash = "sha256:f171bab1dfbc86b132997f26a119f6056a57950d058587841a0082e8830f9dc5"}, ] [package.extras] -core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.text (>=3.7)", "more-itertools (>=8.8)", "ordered-set (>=3.1.1)", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.11.*)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (<0.4)", "pytest-ruff (>=0.2.1)", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.10.0)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "six" @@ -5899,5 +5918,5 @@ zh = ["laboneq"] [metadata] lock-version = "2.0" -python-versions = ">=3.9,<3.12" -content-hash = "a5bf84cc1a4fa49d87dd8a53e5bc48949e4f1bef7c09fd73aca1f26aed3906cd" +python-versions = ">=3.9,<3.13" +content-hash = "bde6cb86d4fe55b5f91310f5d3995640d5e16bedc86bfb4dfb6e5625c2bdcae1" diff --git a/pyproject.toml b/pyproject.toml index f5785ef5af..8bb2e1ad6c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,8 +21,8 @@ packages = [{ include = "qibolab", from = "src" }] include = ["*.out", "*.yml"] [tool.poetry.dependencies] -python = ">=3.9,<3.12" -qibo = ">=0.2.6" +python = ">=3.9,<3.13" +qibo = "^0.2.6" numpy = "^1.26.4" scipy = "^1.13.0" more-itertools = "^9.1.0" @@ -31,11 +31,11 @@ qblox-instruments = { version = "0.12.0", optional = true } qcodes = { version = "^0.37.0", optional = true } qcodes_contrib_drivers = { version = "0.18.0", optional = true } pyvisa-py = { version = "0.5.3", optional = true } -qm-qua = { version = "==1.1.6", optional = true } -qualang-tools = { version = "^0.15.0", optional = true } +qm-qua = { version = "==1.1.6", python = "<3.12", optional = true } +qualang-tools = { version = "^0.15.0", python = "<3.12", optional = true } setuptools = { version = ">67.0.0", optional = true } laboneq = { version = "==2.25.0", optional = true } -qibosoq = { version = ">=0.1.2,<0.2", optional = true } +qibosoq = { version = ">=0.1.2,<0.2", python = "<3.12", optional = true } qutip = { version = "^5.0.2", optional = true } [tool.poetry.group.dev] @@ -61,8 +61,8 @@ sphinx-copybutton = "^0.5.1" qblox-instruments = "0.12.0" qcodes = "^0.37.0" qcodes_contrib_drivers = "0.18.0" -qibosoq = ">=0.1.2,<0.2" -qualang-tools = "^0.15.0" +qibosoq = { version = "^0.1.2", python = "<3.12" } +qualang-tools = { version = "^0.15.0", python = "<3.12" } laboneq = "==2.25.0" qutip = "^5.0.2" From 5fba7c068055f74ffda911e1f44de062d1e31719 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 19 Aug 2024 12:50:22 +0200 Subject: [PATCH 0691/1006] fix: Fix compiler to use aligned as parametrized Breaks the compatibility with Qibo<0.2.8 --- poetry.lock | 2 +- pyproject.toml | 2 +- src/qibolab/compilers/default.py | 9 +++------ 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/poetry.lock b/poetry.lock index 66b773aceb..42d09f107e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -5919,4 +5919,4 @@ zh = ["laboneq"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.13" -content-hash = "bde6cb86d4fe55b5f91310f5d3995640d5e16bedc86bfb4dfb6e5625c2bdcae1" +content-hash = "ef38aec46ecd9f84cad3b7eca72b289b15d6495fc3388d5ba26c64f29ddc3390" diff --git a/pyproject.toml b/pyproject.toml index 8bb2e1ad6c..3dc47a3427 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,7 +22,7 @@ include = ["*.out", "*.yml"] [tool.poetry.dependencies] python = ">=3.9,<3.13" -qibo = "^0.2.6" +qibo = "^0.2.8" numpy = "^1.26.4" scipy = "^1.13.0" more-itertools = "^9.1.0" diff --git a/src/qibolab/compilers/default.py b/src/qibolab/compilers/default.py index 06b3f6c3b9..89824cfa4f 100644 --- a/src/qibolab/compilers/default.py +++ b/src/qibolab/compilers/default.py @@ -67,12 +67,9 @@ def measurement_rule(gate: Gate, natives: list[SingleQubitNatives]) -> PulseSequ def align_rule(gate: Align, qubits: list[Qubit]) -> PulseSequence: """Measurement gate applied using the platform readout pulse.""" - if gate.delay == 0.0: + delay = gate.parameters[0] + if delay == 0.0: return PulseSequence() return PulseSequence( - [ - (ch.name, Delay(duration=gate.delay)) - for qubit in qubits - for ch in qubit.channels - ] + [(ch.name, Delay(duration=delay)) for qubit in qubits for ch in qubit.channels] ) From 97293d532249187b8c63941b1d68153cbbc853bc Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 19 Aug 2024 12:55:47 +0200 Subject: [PATCH 0692/1006] chore: Nix upgrade --- flake.lock | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/flake.lock b/flake.lock index 0178efdcfd..d0eb4e76ff 100644 --- a/flake.lock +++ b/flake.lock @@ -41,11 +41,11 @@ "pre-commit-hooks": "pre-commit-hooks" }, "locked": { - "lastModified": 1719323427, - "narHash": "sha256-f4ppP2MBPJzkuy/q+PIfyyTWX9OzqgPV1XSphX71tdA=", + "lastModified": 1723898192, + "narHash": "sha256-MXIK60F11Tc7B+vRcLOWPx6IweAu3u54YpdByM/9OuA=", "owner": "cachix", "repo": "devenv", - "rev": "f810f8d8cb4e674d7e635107510bcbbabaa755a3", + "rev": "64bb347c3b0cee39da55ec6f52a5bef8d833c431", "type": "github" }, "original": { @@ -93,11 +93,11 @@ "rust-analyzer-src": "rust-analyzer-src" }, "locked": { - "lastModified": 1719296889, - "narHash": "sha256-rX9GzfrzvjfqrjfyKnX+zmXTYNRZXqEUWUX2u+LBdi0=", + "lastModified": 1724049063, + "narHash": "sha256-aTnh9Ar40OaT2MTULeJMR9EIrylKeKUYWP61QEZBu0Q=", "owner": "nix-community", "repo": "fenix", - "rev": "049a6ecec1da711d3d84072732e4b14f98e0edd4", + "rev": "94c18bf5acb3966b07cc863bd00f4f959c0c5ec4", "type": "github" }, "original": { @@ -339,11 +339,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1719075281, - "narHash": "sha256-CyyxvOwFf12I91PBWz43iGT1kjsf5oi6ax7CrvaMyAo=", + "lastModified": 1723637854, + "narHash": "sha256-med8+5DSWa2UnOqtdICndjDAEjxr5D7zaIiK4pn0Q7c=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "a71e967ef3694799d0c418c98332f7ff4cc5f6af", + "rev": "c3aa7b8938b17aebd2deecf7be0636000d62a2b9", "type": "github" }, "original": { @@ -417,11 +417,11 @@ "rust-analyzer-src": { "flake": false, "locked": { - "lastModified": 1719233333, - "narHash": "sha256-+BgWRK3bWVIFwdn43DGRVscnu9P63Mndyhte/hgEwUA=", + "lastModified": 1723915239, + "narHash": "sha256-x/RXN/ougJ1IEoBKrY0UijB530OfOfICK4KPa3Kj9Bk=", "owner": "rust-lang", "repo": "rust-analyzer", - "rev": "7b11fdeb681c12002861b9804a388efde81c9647", + "rev": "fa003262474185fd62168379500fe906b331824b", "type": "github" }, "original": { From 99da89e1a767b5de65a8fe6df8687de32305c398 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 19 Aug 2024 12:57:32 +0200 Subject: [PATCH 0693/1006] ci: Extend workflows to py3.12 --- .github/workflows/deploy.yml | 4 ++-- .github/workflows/rules.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index fabee8daf6..c1ee242dae 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -12,11 +12,11 @@ jobs: strategy: matrix: os: [ubuntu-latest, macos-latest, windows-latest] - python-version: [3.9, "3.10", "3.11"] + python-version: ["3.9", "3.10", "3.11", "3.12"] uses: qiboteam/workflows/.github/workflows/deploy-pip-poetry.yml@v1 with: os: ${{ matrix.os }} python-version: ${{ matrix.python-version }} - publish: ${{ github.event_name == 'release' && github.event.action == 'published' && matrix.os == 'ubuntu-latest' && matrix.python-version == '3.9' }} + publish: ${{ github.event_name == 'release' && github.event.action == 'published' && matrix.os == 'ubuntu-latest' && matrix.python-version == '3.10' }} poetry-extras: "--with docs,tests,analysis --all-extras" secrets: inherit diff --git a/.github/workflows/rules.yml b/.github/workflows/rules.yml index 4e6b11f357..c16024774e 100644 --- a/.github/workflows/rules.yml +++ b/.github/workflows/rules.yml @@ -12,7 +12,7 @@ jobs: strategy: matrix: os: [ubuntu-latest, macos-latest, windows-latest] - python-version: [3.9, "3.10", "3.11"] + python-version: ["3.9", "3.10", "3.11", "3.12"] uses: qiboteam/workflows/.github/workflows/rules-poetry.yml@v1 with: os: ${{ matrix.os }} From d19da3cc586a1f4eeeb794f639a028de41209ee1 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 19 Aug 2024 13:15:40 +0200 Subject: [PATCH 0694/1006] test: Skip tests when dependencies are not available In particular, in py3.12 --- tests/test_instruments_qm.py | 4 +++- tests/test_instruments_rfsoc.py | 6 ++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/tests/test_instruments_qm.py b/tests/test_instruments_qm.py index e9aa0964e6..ff5ec223e2 100644 --- a/tests/test_instruments_qm.py +++ b/tests/test_instruments_qm.py @@ -2,8 +2,10 @@ import numpy as np import pytest -from qm import qua +qua = pytest.importorskip("qm").qua + +# ruff: noqa: E402 from qibolab import AcquisitionType, ExecutionParameters, create_platform from qibolab.instruments.qm import QmController from qibolab.pulses import Pulse, Rectangular diff --git a/tests/test_instruments_rfsoc.py b/tests/test_instruments_rfsoc.py index bbec421629..a3f69b4e5f 100644 --- a/tests/test_instruments_rfsoc.py +++ b/tests/test_instruments_rfsoc.py @@ -4,9 +4,11 @@ import numpy as np import pytest -import qibosoq.components.base as rfsoc -import qibosoq.components.pulses as rfsoc_pulses +rfsoc = pytest.importorskip("qibosoq").components.base +rfsoc_pulses = pytest.importorskip("qibosoq").components.pulses + +# ruff: noqa: E402 from qibolab import AcquisitionType, AveragingMode, ExecutionParameters, create_platform from qibolab.instruments.rfsoc import RFSoC from qibolab.instruments.rfsoc.convert import ( From 199f982bbb78ab886ac65fe514f484cf6966bb7a Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 19 Aug 2024 13:24:53 +0200 Subject: [PATCH 0695/1006] build: Exclude missing py3.12 dependencies from Pylint analysis --- pyproject.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 3dc47a3427..d82939bf94 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -103,6 +103,9 @@ test-docs = "make -C doc doctest" output-format = "colorized" disable = ["E1123", "E1120", "C0301"] generated-members = ["qibolab.native.RxyFactory", "pydantic.fields.FieldInfo"] +# TODO: restore analysis when the support will cover the entier Python range, i.e. it +# will include py3.12 as well +ignored-modules = ["qm", "qualang_tools", "qibosoq"] [tool.pytest.ini_options] testpaths = ['tests/'] From 28519db2bec65aa470362ee3eb502a6475b2482d Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 19 Aug 2024 13:30:35 +0200 Subject: [PATCH 0696/1006] test: Import specific module, instead of accessing as parent's attribue Since it could be possibly unregistered there --- tests/test_instruments_qm.py | 2 +- tests/test_instruments_rfsoc.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_instruments_qm.py b/tests/test_instruments_qm.py index ff5ec223e2..658a64abeb 100644 --- a/tests/test_instruments_qm.py +++ b/tests/test_instruments_qm.py @@ -3,7 +3,7 @@ import numpy as np import pytest -qua = pytest.importorskip("qm").qua +qua = pytest.importorskip("qm.qua") # ruff: noqa: E402 from qibolab import AcquisitionType, ExecutionParameters, create_platform diff --git a/tests/test_instruments_rfsoc.py b/tests/test_instruments_rfsoc.py index a3f69b4e5f..d6957a6e9c 100644 --- a/tests/test_instruments_rfsoc.py +++ b/tests/test_instruments_rfsoc.py @@ -5,8 +5,8 @@ import numpy as np import pytest -rfsoc = pytest.importorskip("qibosoq").components.base -rfsoc_pulses = pytest.importorskip("qibosoq").components.pulses +rfsoc = pytest.importorskip("qibosoq.components.base") +rfsoc_pulses = pytest.importorskip("qibosoq.components.pulses") # ruff: noqa: E402 from qibolab import AcquisitionType, AveragingMode, ExecutionParameters, create_platform From 063bc0e34eb50829bde249e3455921b9f4fc960a Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 19 Aug 2024 13:36:16 +0200 Subject: [PATCH 0697/1006] docs: Fix mistyped class roles --- src/qibolab/instruments/abstract.py | 2 +- src/qibolab/pulses/pulse.py | 4 ++-- src/qibolab/result.py | 2 +- src/qibolab/sequence.py | 2 +- src/qibolab/unrolling.py | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/qibolab/instruments/abstract.py b/src/qibolab/instruments/abstract.py index 2b6a278de6..10c7f0db24 100644 --- a/src/qibolab/instruments/abstract.py +++ b/src/qibolab/instruments/abstract.py @@ -79,7 +79,7 @@ def play( ) -> dict[int, npt.NDArray]: """Play a pulse sequence and retrieve feedback. - If :cls:`qibolab.sweeper.Sweeper` objects are passed as arguments, they are + If :class:`qibolab.sweeper.Sweeper` objects are passed as arguments, they are executed in real-time. If not possible, an error is raised. Returns a mapping with the id of the probe pulses used to acquired data. diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index fb1b6b40aa..2c3fc4d90d 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -37,7 +37,7 @@ class Pulse(_PulseLike): """The pulse envelope shape. See - :cls:`qibolab.pulses.envelope.Envelopes` for list of available shapes. + :class:`qibolab.pulses.envelope.Envelopes` for list of available shapes. """ relative_phase: float = 0.0 """Relative phase of the pulse, in radians.""" @@ -46,7 +46,7 @@ class Pulse(_PulseLike): def flux(cls, **kwargs): """Construct a flux pulse. - It provides a simplified syntax for the :cls:`Pulse` constructor, by applying + It provides a simplified syntax for the :class:`Pulse` constructor, by applying suitable defaults. """ kwargs["relative_phase"] = 0 diff --git a/src/qibolab/result.py b/src/qibolab/result.py index 5d5ecdaf96..675b8091ec 100644 --- a/src/qibolab/result.py +++ b/src/qibolab/result.py @@ -53,7 +53,7 @@ def average(values: npt.NDArray) -> tuple[npt.NDArray, npt.NDArray]: It returns both the average estimator itself, and its standard deviation estimator. - Use this also for I and Q values in the *standard layout*, cf. :cls:`IQ`. + Use this also for I and Q values in the *standard layout*, cf. :class:`IQ`. """ mean = np.mean(values, axis=0) std = np.std(values, axis=0, ddof=1) / np.sqrt(values.shape[0]) diff --git a/src/qibolab/sequence.py b/src/qibolab/sequence.py index 3009041297..7254c3bc22 100644 --- a/src/qibolab/sequence.py +++ b/src/qibolab/sequence.py @@ -109,7 +109,7 @@ def acquisitions(self) -> list[tuple[ChannelId, Acquisition]]: .. note:: - This selects only the :cls:`Acquisition` events, and not all the + This selects only the :class:`Acquisition` events, and not all the instructions directed to an acquistion channel (i.e. :attr:`ChannelType.ACQUISITION`) """ diff --git a/src/qibolab/unrolling.py b/src/qibolab/unrolling.py index d05deb71a6..efab4d8eb2 100644 --- a/src/qibolab/unrolling.py +++ b/src/qibolab/unrolling.py @@ -82,7 +82,7 @@ def batch(sequences: list[PulseSequence], bounds: Bounds): """Split a list of sequences to batches. Takes into account the various limitations throught the mechanics defined in - :cls:`Bounds`, and the numerical limitations specified by the `bounds` argument. + :class:`Bounds`, and the numerical limitations specified by the `bounds` argument. """ counters = Bounds(waveforms=0, readout=0, instructions=0) batch = [] From 1d58793b5789bd3067f992d263602f91e9472168 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 19 Aug 2024 13:42:13 +0200 Subject: [PATCH 0698/1006] docs: Fix blank lines around list --- src/qibolab/components/channels.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/qibolab/components/channels.py b/src/qibolab/components/channels.py index ecd66b8239..d42469ed51 100644 --- a/src/qibolab/components/channels.py +++ b/src/qibolab/components/channels.py @@ -1,13 +1,17 @@ -"""Channels are a specific type of component, that are responsible for +"""Define channels, representing the physical components handling signals. + +Channels are a specific type of component, that are responsible for generating signals. A channel has a name, and it can refer to the names of other components as needed. The default configuration of components should be stored elsewhere (in Platform). By dissecting configuration in smaller pieces and storing them externally (as opposed to storing the channel configuration inside the channel itself) has multiple benefits, that. -all revolve around the fact that channels may have shared components, e.g. - - Some instruments use one LO for more than one channel, - - For some use cases (like qutrit experiments, or CNOT gates), we need to define multiple channels that point to the same physical wire. +All revolve around the fact that channels may have shared components, e.g. + +- some instruments use one LO for more than one channel, +- for some use cases (like qutrit experiments, or CNOT gates), we need to define multiple channels that point to the same physical wire. + If channels contain their configuration, it becomes cumbersome to make sure that user can easily see that some channels have shared components, and changing configuration for one may affect the other as well. By storing component configurations externally we make sure that there is only one copy of configuration for a component, plus users can clearly see when two different channels From 23659ee5580cbcc155f16d918361b5600d7c5660 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 19 Aug 2024 13:54:36 +0200 Subject: [PATCH 0699/1006] docs: Extend mock imports, for missing py3.12 dependencies --- doc/source/conf.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/doc/source/conf.py b/doc/source/conf.py index 45478d986b..f6b12a04a9 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -37,7 +37,15 @@ # https://stackoverflow.com/questions/56336234/build-fail-sphinx-error-contents-rst-not-found # master_doc = "index" -autodoc_mock_imports = ["qm"] +autodoc_mock_imports = ["icarusq_rfsoc_driver"] +try: + import qibolab.instruments.qm +except ModuleNotFoundError: + autodoc_mock_imports.extend(["qm", "qualang_tools"]) +try: + import qibolab.instruments.rfsoc +except ModuleNotFoundError: + autodoc_mock_imports.extend(["qibosoq"]) # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom From f310266553c2c4789e10d5c226b92a66de96e242 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 19 Aug 2024 14:13:46 +0200 Subject: [PATCH 0700/1006] docs: Fix docs warnings and errors --- doc/source/conf.py | 1 + doc/source/index.rst | 12 ++--- src/qibolab/instruments/bluefors.py | 24 +++++---- src/qibolab/instruments/icarusqfpga.py | 4 +- src/qibolab/instruments/qblox/module.py | 20 ++++---- src/qibolab/instruments/qm/controller.py | 4 +- src/qibolab/pulses/envelope.py | 64 ++++++++++++++++++++---- 7 files changed, 90 insertions(+), 39 deletions(-) diff --git a/doc/source/conf.py b/doc/source/conf.py index f6b12a04a9..3e292c9150 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -58,6 +58,7 @@ "sphinx.ext.intersphinx", "recommonmark", "sphinx_copybutton", + "sphinx.ext.todo", "sphinx.ext.viewcode", ] diff --git a/doc/source/index.rst b/doc/source/index.rst index 7a0b2f9069..334386a602 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -12,12 +12,12 @@ Qibolab is the dedicated `Qibo `_ backend for quantum hardware control. This module automates the implementation of quantum circuits on quantum hardware. Qibolab includes: -1. :ref:`Platform API `: support custom allocation of quantum hardware platforms / lab setup. -2. :ref:`Drivers `: supports commercial and open-source firmware for hardware control. -3. :ref:`Arbitrary pulse API `: provide a library of custom pulses for execution through instruments. -4. :ref:`Compiler `: compiles quantum circuits into pulse sequences. -5. :ref:`Quantum Circuit Deployment `: seamlessly deploys quantum circuit models on quantum hardware. -5. :ref:`Emulator `: seamless emulation of quantum hardware based on a emulator backend equipped with various quantum dynamics simulation engines. +#. :ref:`Platform API `: support custom allocation of quantum hardware platforms / lab setup. +#. :ref:`Drivers `: supports commercial and open-source firmware for hardware control. +#. :ref:`Arbitrary pulse API `: provide a library of custom pulses for execution through instruments. +#. :ref:`Compiler `: compiles quantum circuits into pulse sequences. +#. :ref:`Quantum Circuit Deployment `: seamlessly deploys quantum circuit models on quantum hardware. +#. :ref:`Emulator `: seamless emulation of quantum hardware based on a emulator backend equipped with various quantum dynamics simulation engines. Components ---------- diff --git a/src/qibolab/instruments/bluefors.py b/src/qibolab/instruments/bluefors.py index feea38f7b4..b38442ca46 100644 --- a/src/qibolab/instruments/bluefors.py +++ b/src/qibolab/instruments/bluefors.py @@ -9,15 +9,14 @@ class TemperatureController(Instrument): """Bluefors temperature controller. - ``` - # Example usage - if __name__ == "__main__": - tc = TemperatureController("XLD1000_Temperature_Controller", "192.168.0.114", 8888) - tc.connect() - temperature_values = tc.read_data() - for temperature_value in temperature_values: - print(temperature_value) - ``` + Example usage:: + + if __name__ == "__main__": + tc = TemperatureController("XLD1000_Temperature_Controller", "192.168.0.114", 8888) + tc.connect() + temperature_values = tc.read_data() + for temperature_value in temperature_values: + print(temperature_value) """ def __init__(self, name: str, address: str, port: int = 8888): @@ -53,9 +52,12 @@ def setup(self): def get_data(self) -> dict[str, dict[str, float]]: """Connect to the socket and get temperature data. - The typical message looks like this: + The typical message looks like this:: + flange_name: {'temperature':12.345678, 'timestamp':1234567890.123456} - `timestamp` can be converted to datetime using `datetime.fromtimestamp`. + + ``timestamp`` can be converted to datetime using ``datetime.fromtimestamp``. + Returns: message (dict[str, dict[str, float]]): socket message in this format: {"flange_name": {'temperature': , 'timestamp':}} diff --git a/src/qibolab/instruments/icarusqfpga.py b/src/qibolab/instruments/icarusqfpga.py index 87f00c16bf..50120ca2b3 100644 --- a/src/qibolab/instruments/icarusqfpga.py +++ b/src/qibolab/instruments/icarusqfpga.py @@ -79,7 +79,7 @@ def play( Arguments: qubits (dict): Dictionary of qubit IDs mapped to qubit objects. sequence (PulseSequence): Pulse sequence to be played on this instrument. - options (ExecutionParameters): Execution parameters for readout and repetition. + options (qibolab.ExecutionParameters): Execution parameters for readout and repetition. """ waveform_array = {dac.id: np.zeros(dac.max_samples) for dac in self.device.dac} @@ -246,7 +246,7 @@ def play( Arguments: qubits (dict): Dictionary of qubit IDs mapped to qubit objects. sequence (PulseSequence): Pulse sequence to be played on this instrument. - options (ExecutionParameters): Object representing acquisition type and number of shots. + options (qibolab.ExecutionParameters): Object representing acquisition type and number of shots. """ super().play(qubits, couplers, sequence, options) self.device.set_adc_trigger_repetition_rate(int(options.relaxation_time / 1e3)) diff --git a/src/qibolab/instruments/qblox/module.py b/src/qibolab/instruments/qblox/module.py index 10b2c8b4fe..7e6f25b8e3 100644 --- a/src/qibolab/instruments/qblox/module.py +++ b/src/qibolab/instruments/qblox/module.py @@ -42,15 +42,17 @@ def ports(self, name: str, out: bool = True): Returns this port object. - Example: - >>> qrm_module = QrmRf("qrm_rf", f"{IP_ADDRESS}:{SLOT_IDX}") - >>> output_port = qrm_module.add_port("o1") - >>> input_port = qrm_module.add_port("i1", out=False) - >>> qrm_module.ports - { - 'o1': QbloxOutputPort(module=qrm_module, port_number=0, port_name='o1'), - 'i1': QbloxInputPort(module=qrm_module, port_number=0, port_name='i1') - } + Example:: + + qrm_module = QrmRf("qrm_rf", f"{IP_ADDRESS}:{SLOT_IDX}") + output_port = qrm_module.add_port("o1") + input_port = qrm_module.add_port("i1", out=False) + qrm_module.ports + + # { + # 'o1': QbloxOutputPort(module=qrm_module, port_number=0, port_name='o1'), + # 'i1': QbloxInputPort(module=qrm_module, port_number=0, port_name='i1') + # } """ def count(cls): diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 17d421c648..663fe623f4 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -120,8 +120,8 @@ class QmController(Controller): Playing pulses on QM controllers requires a ``config`` dictionary and a program written in QUA language. The ``config`` file is generated using the ``dataclass`` objects defined in - :py_mod:`qibolab.instruments.qm.config`. - The QUA program is generated using the methods in :py_mod:`qibolab.instruments.qm.program`. + :mod:`qibolab.instruments.qm.config`. + The QUA program is generated using the methods in :mod:`qibolab.instruments.qm.program`. Controllers, elements and pulses are added in the ``config`` after a pulse sequence is given, so that only elements related to the participating channels are registered. """ diff --git a/src/qibolab/pulses/envelope.py b/src/qibolab/pulses/envelope.py index 2a1eff6203..0eb06cae3b 100644 --- a/src/qibolab/pulses/envelope.py +++ b/src/qibolab/pulses/envelope.py @@ -177,7 +177,12 @@ class Drag(BaseEnvelope): In units of the interval duration. """ beta: float - """.. todo::""" + """Beta. + + .. todo:: + + Add docstring + """ def i(self, samples: int) -> Waveform: """Generate a Gaussian envelope.""" @@ -187,6 +192,8 @@ def q(self, samples: int) -> Waveform: """Generate ... .. todo:: + + Add docstring """ ts = np.arange(samples) mu = (samples - 1) / 2 @@ -221,15 +228,29 @@ def _data(self, target: npt.NDArray) -> npt.NDArray: return data def i(self, samples: int) -> Waveform: - """.. todo::""" + """I. + + .. todo:: + + Add docstring + """ return self._data(self.target.i(samples)) def q(self, samples: int) -> Waveform: - """.. todo::""" + """Q. + .. todo:: + + Add docstring + """ return self._data(self.target.q(samples)) def __eq__(self, other) -> bool: - """.. todo::""" + """Eq. + + .. todo:: + + Add docstring + """ return eq(self, other) @@ -252,7 +273,12 @@ class Snz(BaseEnvelope): """Relative B amplitude (wrt A).""" def i(self, samples: int) -> Waveform: - """.. todo::""" + """I. + + .. todo:: + + Add docstring + """ # convert timings to samples half_pulse_duration = (1 - self.t_idling) * samples / 2 aspan = np.sum(np.arange(samples) < half_pulse_duration) @@ -285,7 +311,12 @@ class ECap(BaseEnvelope): """In units of the inverse interval duration.""" def i(self, samples: int) -> Waveform: - """.. todo::""" + """I. + + .. todo:: + + Add docstring + """ ss = np.arange(samples) x = ss / samples return ( @@ -310,21 +341,36 @@ class Custom(BaseEnvelope): q_: npt.NDArray def i(self, samples: int) -> Waveform: - """.. todo::""" + """I. + + .. todo:: + + Add docstring + """ if len(self.i_) != samples: raise ValueError return self.i_ def q(self, samples: int) -> Waveform: - """.. todo::""" + """Q. + + .. todo:: + + Add docstring + """ if len(self.q_) != samples: raise ValueError return self.q_ def __eq__(self, other) -> bool: - """.. todo::""" + """Eq. + + .. todo:: + + Add docstring + """ return eq(self, other) From fcf1e579c6c436aaac9d17a73c4bccb7e53aedef Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 20 Aug 2024 20:26:16 +0300 Subject: [PATCH 0701/1006] chore: update QM driver for new ChannelId --- src/qibolab/instruments/qm/config/config.py | 8 +- src/qibolab/instruments/qm/controller.py | 113 ++++++++++-------- .../instruments/qm/program/instructions.py | 3 +- .../instruments/qm/program/sweepers.py | 16 +-- src/qibolab/sequence.py | 2 +- 5 files changed, 77 insertions(+), 65 deletions(-) diff --git a/src/qibolab/instruments/qm/config/config.py b/src/qibolab/instruments/qm/config/config.py index 7f915d30bb..3e53a8d64a 100644 --- a/src/qibolab/instruments/qm/config/config.py +++ b/src/qibolab/instruments/qm/config/config.py @@ -51,7 +51,9 @@ def add_octave(self, device: str, connectivity: str): def configure_dc_line(self, channel: QmChannel, config: OpxOutputConfig): controller = self.controllers[channel.device] controller.analog_outputs[channel.port] = AnalogOutput.from_config(config) - self.elements[channel.logical_channel.name] = DcElement.from_channel(channel) + self.elements[str(channel.logical_channel.name)] = DcElement.from_channel( + channel + ) def configure_iq_line( self, channel: QmChannel, config: IqConfig, lo_config: OscillatorConfig @@ -62,7 +64,7 @@ def configure_iq_line( self.controllers[octave.connectivity].add_octave_output(port) intermediate_frequency = config.frequency - lo_config.frequency - self.elements[channel.logical_channel.name] = RfOctaveElement.from_channel( + self.elements[str(channel.logical_channel.name)] = RfOctaveElement.from_channel( channel, octave.connectivity, intermediate_frequency ) @@ -85,7 +87,7 @@ def configure_acquire_line( self.controllers[octave.connectivity].add_octave_output(port) intermediate_frequency = probe_config.frequency - lo_config.frequency - self.elements[probe_channel.logical_channel.name] = ( + self.elements[str(probe_channel.logical_channel.name)] = ( AcquireOctaveElement.from_channel( probe_channel, acquire_channel, diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 663fe623f4..93169c3cd1 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -11,11 +11,11 @@ from qm.simulate.credentials import create_credentials from qualang_tools.simulator_tools import create_simulator_controller_connections -from qibolab.components import Channel, Config, DcChannel, IqChannel +from qibolab.components import Config, DcChannel, IqChannel from qibolab.execution_parameters import ExecutionParameters from qibolab.identifier import ChannelId from qibolab.instruments.abstract import Controller -from qibolab.pulses import Delay, Pulse, VirtualZ +from qibolab.pulses import Acquisition, Delay, VirtualZ from qibolab.sequence import PulseSequence from qibolab.sweeper import ParallelSweepers, Parameter from qibolab.unrolling import Bounds @@ -188,7 +188,7 @@ def __post_init__(self): super().__init__(self.name, self.address) # convert ``channels`` from list to dict self.channels = { - channel.logical_channel.name: channel for channel in self.channels + str(channel.logical_channel.name): channel for channel in self.channels } if self.simulation_duration is not None: @@ -254,7 +254,7 @@ def configure_device(self, device: str): def configure_channel(self, channel: QmChannel, configs: dict[str, Config]): """Add element (QM version of channel) in the config.""" logical_channel = channel.logical_channel - channel_config = configs[logical_channel.name] + channel_config = configs[str(logical_channel.name)] self.configure_device(channel.device) if isinstance(logical_channel, DcChannel): @@ -287,65 +287,71 @@ def configure_channels( ): """Register channels participating in the sequence in the QM ``config``.""" - for channel_name in channels: - channel = self.channels[channel_name] + for channel_id in channels: + channel = self.channels[str(channel_id)] self.configure_channel(channel, configs) - def register_pulse(self, channel: Channel, pulse: Pulse): - """Add pulse in the QM ``config``.""" - # if ( - # pulse.duration % 4 != 0 - # or pulse.duration < 16 - # or pulse.id in pulses_to_bake - # ): - # qmpulse = BakedPulse(pulse, element) - # qmpulse.bake(self.config, durations=[pulse.duration]) - # else: - if isinstance(channel, DcChannel): - return self.config.register_dc_pulse(channel.name, pulse) - if channel.acquisition is None: - return self.config.register_iq_pulse(channel.name, pulse) - return self.config.register_acquisition_pulse(channel.name, pulse) - - def register_pulses( + def register_pulses(self, configs: dict[str, Config], sequence: PulseSequence): + """Adds all pulses except measurements of a given sequence in the QM + ``config``. + + Returns: + acquisitions (dict): Map from measurement instructions to acquisition objects. + """ + for channel_id, pulse in sequence: + if not isinstance(pulse, (Acquisition, Delay, VirtualZ)): + name = str(channel_id) + channel = self.channels[name].logical_channel + # if ( + # pulse.duration % 4 != 0 + # or pulse.duration < 16 + # or pulse.id in pulses_to_bake + # ): + # qmpulse = BakedPulse(pulse, element) + # qmpulse.bake(self.config, durations=[pulse.duration]) + # else: + if isinstance(channel, DcChannel): + self.config.register_dc_pulse(name, pulse) + elif channel.acquisition is None: + self.config.register_iq_pulse(name, pulse) + + def register_acquisitions( self, configs: dict[str, Config], sequence: PulseSequence, options: ExecutionParameters, ): - """Adds all pulses of a given sequence in the QM ``config``. + """Adds all measurements of a given sequence in the QM ``config``. Returns: acquisitions (dict): Map from measurement instructions to acquisition objects. """ acquisitions = {} - for channel_name, pulse in sequence: - if isinstance(pulse, (Delay, VirtualZ)): - continue - - channel = self.channels[channel_name] - logical_channel = channel.logical_channel - op = self.register_pulse(logical_channel, pulse) - - if ( - isinstance(logical_channel, IqChannel) - and logical_channel.acquisition is not None - ): - acq_config = configs[logical_channel.acquisition] - self.config.register_integration_weights( - channel_name, pulse.duration, acq_config.kernel + for channel_id, readout in sequence.as_readouts: + if readout.probe.duration != readout.acquisition.duration: + raise ValueError( + "Quantum Machines does not support acquisition with different duration than probe." + ) + + channel_name = str(channel_id) + channel = self.channels[channel_name].logical_channel + op = self.config.register_acquisition_pulse(channel_name, readout.probe) + + acq_config = configs[channel.acquisition] + self.config.register_integration_weights( + channel_name, readout.duration, acq_config.kernel + ) + if (op, channel_name) in acquisitions: + acquisition = acquisitions[(op, channel_name)] + else: + acquisition = acquisitions[(op, channel_name)] = create_acquisition( + op, + channel_name, + options, + acq_config.threshold, + acq_config.iq_angle, ) - if (op, channel_name) in acquisitions: - acquisition = acquisitions[(op, channel_name)] - else: - acquisition = acquisitions[(op, channel_name)] = create_acquisition( - op, - channel_name, - options, - acq_config.threshold, - acq_config.iq_angle, - ) - acquisition.keys.append(pulse.id) + acquisition.keys.append(readout.acquisition.id) return acquisitions @@ -384,7 +390,8 @@ def play( sequence = sequences[0] self.configure_channels(configs, sequence.channels) - acquisitions = self.register_pulses(configs, sequence, options) + self.register_pulses(configs, sequence) + acquisitions = self.register_acquisitions(configs, sequence, options) experiment = program(configs, sequence, options, acquisitions, sweepers) if self.manager is None: @@ -403,8 +410,8 @@ def play( if self.simulation_duration is not None: result = self.simulate_program(experiment) results = {} - for channel_name, pulse in sequence: - if self.channels[channel_name].logical_channel.acquisition is not None: + for _, pulse in sequence: + if isinstance(pulse, Acquisition): results[pulse.id] = result return results diff --git a/src/qibolab/instruments/qm/program/instructions.py b/src/qibolab/instruments/qm/program/instructions.py index e689e5b55a..2a25f2c0fe 100644 --- a/src/qibolab/instruments/qm/program/instructions.py +++ b/src/qibolab/instruments/qm/program/instructions.py @@ -51,7 +51,8 @@ def play(args: ExecutionArguments): Should be used inside a ``program()`` context. """ qua.align() - for element, pulse in args.sequence: + for channel_id, pulse in args.sequence: + element = str(channel_id) op = operation(pulse) params = args.parameters[op] if isinstance(pulse, Delay): diff --git a/src/qibolab/instruments/qm/program/sweepers.py b/src/qibolab/instruments/qm/program/sweepers.py index e101e4b9cb..ab608051a9 100644 --- a/src/qibolab/instruments/qm/program/sweepers.py +++ b/src/qibolab/instruments/qm/program/sweepers.py @@ -70,17 +70,18 @@ def _frequency( args: ExecutionArguments, ): for channel in channels: + name = str(channel.name) lo_frequency = configs[channel.lo].frequency # convert to IF frequency for readout and drive pulses - f0 = math.floor(configs[channel.name].frequency - lo_frequency) + f0 = math.floor(configs[name].frequency - lo_frequency) # check if sweep is within the supported bandwidth [-400, 400] MHz max_freq = maximum_sweep_value(values, f0) if max_freq > 4e8: raise_error( ValueError, - f"Frequency {max_freq} for channel {channel.name} is beyond instrument bandwidth.", + f"Frequency {max_freq} for channel {name} is beyond instrument bandwidth.", ) - qua.update_frequency(channel.name, variable + f0) + qua.update_frequency(name, variable + f0) def _amplitude( @@ -124,16 +125,17 @@ def _bias( args: ExecutionArguments, ): for channel in channels: - offset = configs[channel.name].offset + name = str(channel.name) + offset = configs[name].offset max_value = maximum_sweep_value(values, offset) check_max_offset(max_value, MAX_OFFSET) b0 = declare(fixed, value=offset) with qua.if_((variable + b0) >= 0.49): - qua.set_dc_offset(f"flux{channel.name}", "single", 0.49) + qua.set_dc_offset(f"flux{name}", "single", 0.49) with qua.elif_((variable + b0) <= -0.49): - qua.set_dc_offset(f"flux{channel.name}", "single", -0.49) + qua.set_dc_offset(f"flux{name}", "single", -0.49) with qua.else_(): - qua.set_dc_offset(f"flux{channel.name}", "single", (variable + b0)) + qua.set_dc_offset(f"flux{name}", "single", (variable + b0)) def _duration( diff --git a/src/qibolab/sequence.py b/src/qibolab/sequence.py index 7254c3bc22..35a50d6ce1 100644 --- a/src/qibolab/sequence.py +++ b/src/qibolab/sequence.py @@ -117,7 +117,7 @@ def acquisitions(self) -> list[tuple[ChannelId, Acquisition]]: return [el for el in self if isinstance(el[1], Acquisition)] @property - def as_readouts(self): + def as_readouts(self) -> list[_Element]: new = [] skip = False for (ch, p), (nch, np) in zip_longest(self, self[1:], fillvalue=(None, None)): From 1613268e9465b0f1e56fec3335569f2772d960bd Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 20 Aug 2024 21:49:36 +0400 Subject: [PATCH 0702/1006] fix: missing pieces --- src/qibolab/instruments/qm/controller.py | 11 +++++++---- src/qibolab/instruments/qm/program/instructions.py | 4 ++-- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 93169c3cd1..fda8cccd27 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -11,11 +11,11 @@ from qm.simulate.credentials import create_credentials from qualang_tools.simulator_tools import create_simulator_controller_connections -from qibolab.components import Config, DcChannel, IqChannel +from qibolab.components import AcquireChannel, Config, DcChannel, IqChannel from qibolab.execution_parameters import ExecutionParameters from qibolab.identifier import ChannelId from qibolab.instruments.abstract import Controller -from qibolab.pulses import Acquisition, Delay, VirtualZ +from qibolab.pulses.pulse import Acquisition, Delay, VirtualZ, _Readout from qibolab.sequence import PulseSequence from qibolab.sweeper import ParallelSweepers, Parameter from qibolab.unrolling import Bounds @@ -277,8 +277,8 @@ def configure_channel(self, channel: QmChannel, configs: dict[str, Config]): lo_config, ) - else: - raise TypeError(f"Unknown channel type: {type(channel)}.") + elif not isinstance(logical_channel, AcquireChannel): + raise TypeError(f"Unknown channel type: {type(logical_channel)}.") def configure_channels( self, @@ -328,6 +328,9 @@ def register_acquisitions( """ acquisitions = {} for channel_id, readout in sequence.as_readouts: + if not isinstance(readout, _Readout): + continue + if readout.probe.duration != readout.acquisition.duration: raise ValueError( "Quantum Machines does not support acquisition with different duration than probe." diff --git a/src/qibolab/instruments/qm/program/instructions.py b/src/qibolab/instruments/qm/program/instructions.py index 2a25f2c0fe..dbc1fead84 100644 --- a/src/qibolab/instruments/qm/program/instructions.py +++ b/src/qibolab/instruments/qm/program/instructions.py @@ -6,7 +6,7 @@ from qibolab.components import Config from qibolab.execution_parameters import AcquisitionType, ExecutionParameters -from qibolab.pulses import Delay +from qibolab.pulses import Delay, Pulse from qibolab.sequence import PulseSequence from qibolab.sweeper import ParallelSweepers @@ -57,7 +57,7 @@ def play(args: ExecutionArguments): params = args.parameters[op] if isinstance(pulse, Delay): _delay(pulse, element, params) - else: + elif isinstance(pulse, Pulse): acquisition = args.acquisitions.get((op, element)) _play(op, element, params, acquisition) From 6870a40282b8dc42210d7de3baa15af32932e778 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 21 Aug 2024 20:21:44 +0200 Subject: [PATCH 0703/1006] fix: Streamline the compiler as much as possible, fix qubits/couplers mixing --- src/qibolab/compilers/compiler.py | 101 +++++++++++++++++------------- src/qibolab/platform/platform.py | 13 ++-- 2 files changed, 68 insertions(+), 46 deletions(-) diff --git a/src/qibolab/compilers/compiler.py b/src/qibolab/compilers/compiler.py index 3a5f4f8d66..a5ae62085b 100644 --- a/src/qibolab/compilers/compiler.py +++ b/src/qibolab/compilers/compiler.py @@ -15,6 +15,7 @@ rz_rule, z_rule, ) +from qibolab.identifier import ChannelId from qibolab.platform import Platform from qibolab.pulses import Delay from qibolab.qubits import QubitId @@ -120,7 +121,62 @@ def get_sequence(self, gate: gates.Gate, platform: Platform) -> PulseSequence: raise NotImplementedError(f"{type(gate)} is not a native gate.") - # FIXME: pulse.qubit and pulse.channel do not exist anymore + def _compile_gate( + self, + gate: gates.Gate, + platform: Platform, + channel_clock: defaultdict[ChannelId, float], + ) -> PulseSequence: + def qubit_clock(el: QubitId): + return max(channel_clock[ch.name] for ch in platform.qubits[el].channels) + + def coupler_clock(el: QubitId): + return max(channel_clock[ch.name] for ch in platform.couplers[el].channels) + + gate_seq = self.get_sequence(gate, platform) + # qubits receiving pulses + qubits = { + q + for q in [platform.qubit_channels.get(ch) for ch in gate_seq.channels] + if q is not None + } + # couplers receiving pulses + couplers = { + c + for c in [platform.coupler_channels.get(ch) for ch in gate_seq.channels] + if c is not None + } + + # add delays to pad all involved channels to begin at the same time + start = max( + [qubit_clock(q) for q in qubits] + [coupler_clock(c) for c in couplers], + default=0.0, + ) + initial = PulseSequence() + for ch in gate_seq.channels: + delay = start - channel_clock[ch] + if delay > 0: + initial.append((ch, Delay(duration=delay))) + channel_clock[ch] = start + gate_seq.channel_duration(ch) + + # pad all qubits to have at least one channel busy for the duration of the gate + # (drive arbitrarily chosen, as always present) + end = start + gate_seq.duration + final = PulseSequence() + for q in gate.qubits: + qubit = platform.get_qubit(q) + # all actual qubits have a non-null drive channel, and couplers are not + # explicitedly listed in gates + assert qubit.drive is not None + delay = end - channel_clock[qubit.drive.name] + if delay > 0: + final.append((qubit.drive.name, Delay(duration=delay))) + channel_clock[qubit.drive.name] += delay + # couplers do not require individual padding, because they do are only + # involved in gates where both of the other qubits are involved + + return initial + gate_seq + final + def compile( self, circuit: Circuit, platform: Platform ) -> tuple[PulseSequence, dict[gates.M, PulseSequence]]: @@ -136,58 +192,19 @@ def compile( sequence (qibolab.pulses.PulseSequence): Pulse sequence that implements the circuit. measurement_map (dict): Map from each measurement gate to the sequence of readout pulse implementing it. """ - ch_to_qb = platform.channels_map - sequence = PulseSequence() - # FIXME: This will not work with qubits that have string names - # TODO: Implement a mapping between circuit qubit ids and platform ``Qubit``s measurement_map = {} channel_clock = defaultdict(float) - def qubit_clock(el: QubitId): - elements = platform.qubits if el in platform.qubits else platform.couplers - return max(channel_clock[ch.name] for ch in elements[el].channels) - # process circuit gates for moment in circuit.queue.moments: for gate in {x for x in moment if x is not None}: - delay_sequence = PulseSequence() - gate_sequence = self.get_sequence(gate, platform) - increment = defaultdict(float) - active_qubits = {ch_to_qb[ch] for ch in gate_sequence.channels} - start = max((qubit_clock(el) for el in active_qubits), default=0.0) - for ch in gate_sequence.channels: - delay = start - channel_clock[ch] - if delay > 0: - delay_sequence.append((ch, Delay(duration=delay))) - channel_clock[ch] += delay - increment[ch] = gate_sequence.channel_duration(ch) - # add the increment only after computing them, since multiple channels - # are related to each other because belonging to the same qubit - for ch, inc in increment.items(): - channel_clock[ch] += inc - - end = start + gate_sequence.duration - for q in gate.qubits: - if q not in active_qubits: - qubit = platform.get_qubit(q) - # all actual qubits have a non-null drive channel, and couplers - # are not explicitedly listed in gates - assert qubit.drive is not None - delay = end - channel_clock[qubit.drive] - if delay > 0: - delay_sequence.append( - (qubit.drive.name, Delay(duration=delay)) - ) - channel_clock[qubit.drive.name] += delay - - sequence.concatenate(delay_sequence) - sequence.concatenate(gate_sequence) + sequence += self._compile_gate(gate, platform, channel_clock) # register readout sequences to ``measurement_map`` so that we can # properly map acquisition results to measurement gates if isinstance(gate, gates.M): - measurement_map[gate] = gate_sequence + measurement_map[gate] = self.get_sequence(gate, platform) return sequence.trim(), measurement_map diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 44942ed0ec..d168bc115c 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -167,12 +167,17 @@ def components(self) -> set[str]: @property def channels(self) -> list[ChannelId]: """Channels in the platform.""" - return list(self.channels_map) + return list(self.qubit_channels) + list(self.coupler_channels) @property - def channels_map(self) -> dict[ChannelId, QubitId]: - """Channel to element map.""" - return _channels_map(self.qubits) | _channels_map(self.couplers) + def qubit_channels(self) -> dict[ChannelId, QubitId]: + """Channel to qubit map.""" + return _channels_map(self.qubits) + + @property + def coupler_channels(self): + """Channel to coupler map.""" + return _channels_map(self.couplers) def config(self, name: str) -> Config: """Returns configuration of given component.""" From e8625c7daa4eb3f426c7d5ebf1f32350a11b8165 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 22 Aug 2024 13:14:15 +0200 Subject: [PATCH 0704/1006] test: Extend joint measurement test to split ones --- tests/test_compilers_default.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tests/test_compilers_default.py b/tests/test_compilers_default.py index 11fdcffb7c..d4a84b922b 100644 --- a/tests/test_compilers_default.py +++ b/tests/test_compilers_default.py @@ -208,13 +208,18 @@ def test_align_multiqubit(platform: Platform): assert flux_duration == probe_delay.duration -def test_inactive_qubits(platform: Platform): +@pytest.mark.parametrize("joint", [True, False]) +def test_inactive_qubits(platform: Platform, joint: bool): main, coupled = 0, 1 circuit = Circuit(2) circuit.add(gates.CZ(main, coupled)) # another gate on drive is needed, to prevent trimming the delay, if alone circuit.add(gates.GPI2(coupled, phi=0.15)) - circuit.add(gates.M(main, coupled)) + if joint: + circuit.add(gates.M(main, coupled)) + else: + circuit.add(gates.M(main)) + circuit.add(gates.M(coupled)) natives = platform.natives.two_qubit[(main, coupled)] = TwoQubitNatives( CZ=FixedSequenceFactory([]) From 34cb2fcb3e7dcece7f183ecd58d5777118e065b2 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 22 Aug 2024 13:14:51 +0200 Subject: [PATCH 0705/1006] test: Test joint/split measurements' equivalence in specific scenario --- tests/test_compilers_default.py | 41 +++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/tests/test_compilers_default.py b/tests/test_compilers_default.py index d4a84b922b..4ba4e2b821 100644 --- a/tests/test_compilers_default.py +++ b/tests/test_compilers_default.py @@ -258,3 +258,44 @@ def no_measurement(seq: PulseSequence): cdrive_delay.duration == next(iter(padded_seq.channel(ChannelId.load(mflux)))).duration ) + + +def test_joint_split_equivalence(platform: Platform): + """Test joint-split equivalence after 2q gate. + + Joint measurements are only equivalent to split in specific + circumstances. When the two qubits involved are just coming out of a + mutual interaction is one of those cases. + + Cf. + https://github.com/qiboteam/qibolab/pull/992#issuecomment-2302708439 + """ + circuit = Circuit(3) + circuit.add(gates.CZ(1, 2)) + circuit.add(gates.GPI2(2, phi=0.15)) + circuit.add(gates.CZ(0, 2)) + + joint = Circuit(3) + joint.add(gates.M(0, 2)) + + joint_seq = compile_circuit(circuit + joint, platform) + + split = Circuit(3) + split.add(gates.M(0)) + split.add(gates.M(2)) + + split_seq = compile_circuit(circuit + split, platform) + + # the inter-channel sorting is unreliable, and mostly irrelevant (unless align + # instructions are involved, which is not the case) + assert not any( + isinstance(p, gates.Align) for seq in (joint_seq, split_seq) for _, p in seq + ) # TODO: gates.Align is just a placeholder, replace with the pulse-like when available + for ch in ( + "qubit_0/acquisition", + "qubit_2/acquisition", + "qubit_0/probe", + "qubit_2/probe", + ): + chid = ChannelId.load(ch) + assert list(joint_seq.channel(chid)) == list(split_seq.channel(chid)) From 420fd4245212724dfcf13ba93f35581c0b962640 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 19 Aug 2024 12:46:19 +0200 Subject: [PATCH 0706/1006] build: Extend qibolab support to py3.12 --- poetry.lock | 399 ++++++++++++++++++++++++++----------------------- pyproject.toml | 14 +- 2 files changed, 216 insertions(+), 197 deletions(-) diff --git a/poetry.lock b/poetry.lock index df6c1e5e05..66b773aceb 100644 --- a/poetry.lock +++ b/poetry.lock @@ -280,13 +280,13 @@ test = ["black (>=22.3.0)", "coverage[toml] (>=6.2)", "hypothesis (>=5.49.0)", " [[package]] name = "cachetools" -version = "5.4.0" +version = "5.5.0" description = "Extensible memoizing collections and decorators" optional = false python-versions = ">=3.7" files = [ - {file = "cachetools-5.4.0-py3-none-any.whl", hash = "sha256:3ae3b49a3d5e28a77a0be2b37dbcb89005058959cb2323858c2657c4a8cab474"}, - {file = "cachetools-5.4.0.tar.gz", hash = "sha256:b8adc2e7c07f105ced7bc56dbb6dfbe7c4a00acce20e2227b3f355be89bc6827"}, + {file = "cachetools-5.5.0-py3-none-any.whl", hash = "sha256:02134e8439cdc2ffb62023ce1debca2944c3f289d66bb17ead3ab3dede74b292"}, + {file = "cachetools-5.5.0.tar.gz", hash = "sha256:2cc24fb4cbe39633fb7badd9db9ca6295d766d9c2995f245725a46715d050f2a"}, ] [[package]] @@ -1265,13 +1265,13 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-auth" -version = "2.33.0" +version = "2.34.0" description = "Google Authentication Library" optional = false python-versions = ">=3.7" files = [ - {file = "google_auth-2.33.0-py2.py3-none-any.whl", hash = "sha256:8eff47d0d4a34ab6265c50a106a3362de6a9975bb08998700e389f857e4d39df"}, - {file = "google_auth-2.33.0.tar.gz", hash = "sha256:d6a52342160d7290e334b4d47ba390767e4438ad0d45b7630774533e82655b95"}, + {file = "google_auth-2.34.0-py2.py3-none-any.whl", hash = "sha256:72fd4733b80b6d777dcde515628a9eb4a577339437012874ea286bca7261ee65"}, + {file = "google_auth-2.34.0.tar.gz", hash = "sha256:8eb87396435c19b20d32abd2f984e31c191a15284af72eb922f10e5bde9c04cc"}, ] [package.dependencies] @@ -1281,7 +1281,7 @@ rsa = ">=3.1.4,<5" [package.extras] aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] -enterprise-cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] +enterprise-cert = ["cryptography", "pyopenssl"] pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] reauth = ["pyu2f (>=0.1.5)"] requests = ["requests (>=2.20.0,<3.0.0.dev0)"] @@ -1305,61 +1305,61 @@ grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] [[package]] name = "grpcio" -version = "1.65.4" +version = "1.65.5" description = "HTTP/2-based RPC framework" optional = false python-versions = ">=3.8" files = [ - {file = "grpcio-1.65.4-cp310-cp310-linux_armv7l.whl", hash = "sha256:0e85c8766cf7f004ab01aff6a0393935a30d84388fa3c58d77849fcf27f3e98c"}, - {file = "grpcio-1.65.4-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:e4a795c02405c7dfa8affd98c14d980f4acea16ea3b539e7404c645329460e5a"}, - {file = "grpcio-1.65.4-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:d7b984a8dd975d949c2042b9b5ebcf297d6d5af57dcd47f946849ee15d3c2fb8"}, - {file = "grpcio-1.65.4-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:644a783ce604a7d7c91412bd51cf9418b942cf71896344b6dc8d55713c71ce82"}, - {file = "grpcio-1.65.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5764237d751d3031a36fafd57eb7d36fd2c10c658d2b4057c516ccf114849a3e"}, - {file = "grpcio-1.65.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ee40d058cf20e1dd4cacec9c39e9bce13fedd38ce32f9ba00f639464fcb757de"}, - {file = "grpcio-1.65.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4482a44ce7cf577a1f8082e807a5b909236bce35b3e3897f839f2fbd9ae6982d"}, - {file = "grpcio-1.65.4-cp310-cp310-win32.whl", hash = "sha256:66bb051881c84aa82e4f22d8ebc9d1704b2e35d7867757f0740c6ef7b902f9b1"}, - {file = "grpcio-1.65.4-cp310-cp310-win_amd64.whl", hash = "sha256:870370524eff3144304da4d1bbe901d39bdd24f858ce849b7197e530c8c8f2ec"}, - {file = "grpcio-1.65.4-cp311-cp311-linux_armv7l.whl", hash = "sha256:85e9c69378af02e483bc626fc19a218451b24a402bdf44c7531e4c9253fb49ef"}, - {file = "grpcio-1.65.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2bd672e005afab8bf0d6aad5ad659e72a06dd713020554182a66d7c0c8f47e18"}, - {file = "grpcio-1.65.4-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:abccc5d73f5988e8f512eb29341ed9ced923b586bb72e785f265131c160231d8"}, - {file = "grpcio-1.65.4-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:886b45b29f3793b0c2576201947258782d7e54a218fe15d4a0468d9a6e00ce17"}, - {file = "grpcio-1.65.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be952436571dacc93ccc7796db06b7daf37b3b56bb97e3420e6503dccfe2f1b4"}, - {file = "grpcio-1.65.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8dc9ddc4603ec43f6238a5c95400c9a901b6d079feb824e890623da7194ff11e"}, - {file = "grpcio-1.65.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ade1256c98cba5a333ef54636095f2c09e6882c35f76acb04412f3b1aa3c29a5"}, - {file = "grpcio-1.65.4-cp311-cp311-win32.whl", hash = "sha256:280e93356fba6058cbbfc6f91a18e958062ef1bdaf5b1caf46c615ba1ae71b5b"}, - {file = "grpcio-1.65.4-cp311-cp311-win_amd64.whl", hash = "sha256:d2b819f9ee27ed4e3e737a4f3920e337e00bc53f9e254377dd26fc7027c4d558"}, - {file = "grpcio-1.65.4-cp312-cp312-linux_armv7l.whl", hash = "sha256:926a0750a5e6fb002542e80f7fa6cab8b1a2ce5513a1c24641da33e088ca4c56"}, - {file = "grpcio-1.65.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:2a1d4c84d9e657f72bfbab8bedf31bdfc6bfc4a1efb10b8f2d28241efabfaaf2"}, - {file = "grpcio-1.65.4-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:17de4fda50967679677712eec0a5c13e8904b76ec90ac845d83386b65da0ae1e"}, - {file = "grpcio-1.65.4-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3dee50c1b69754a4228e933696408ea87f7e896e8d9797a3ed2aeed8dbd04b74"}, - {file = "grpcio-1.65.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74c34fc7562bdd169b77966068434a93040bfca990e235f7a67cdf26e1bd5c63"}, - {file = "grpcio-1.65.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:24a2246e80a059b9eb981e4c2a6d8111b1b5e03a44421adbf2736cc1d4988a8a"}, - {file = "grpcio-1.65.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:18c10f0d054d2dce34dd15855fcca7cc44ec3b811139437543226776730c0f28"}, - {file = "grpcio-1.65.4-cp312-cp312-win32.whl", hash = "sha256:d72962788b6c22ddbcdb70b10c11fbb37d60ae598c51eb47ec019db66ccfdff0"}, - {file = "grpcio-1.65.4-cp312-cp312-win_amd64.whl", hash = "sha256:7656376821fed8c89e68206a522522317787a3d9ed66fb5110b1dff736a5e416"}, - {file = "grpcio-1.65.4-cp38-cp38-linux_armv7l.whl", hash = "sha256:4934077b33aa6fe0b451de8b71dabde96bf2d9b4cb2b3187be86e5adebcba021"}, - {file = "grpcio-1.65.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0cef8c919a3359847c357cb4314e50ed1f0cca070f828ee8f878d362fd744d52"}, - {file = "grpcio-1.65.4-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:a925446e6aa12ca37114840d8550f308e29026cdc423a73da3043fd1603a6385"}, - {file = "grpcio-1.65.4-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf53e6247f1e2af93657e62e240e4f12e11ee0b9cef4ddcb37eab03d501ca864"}, - {file = "grpcio-1.65.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdb34278e4ceb224c89704cd23db0d902e5e3c1c9687ec9d7c5bb4c150f86816"}, - {file = "grpcio-1.65.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e6cbdd107e56bde55c565da5fd16f08e1b4e9b0674851d7749e7f32d8645f524"}, - {file = "grpcio-1.65.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:626319a156b1f19513156a3b0dbfe977f5f93db63ca673a0703238ebd40670d7"}, - {file = "grpcio-1.65.4-cp38-cp38-win32.whl", hash = "sha256:3d1bbf7e1dd1096378bd83c83f554d3b93819b91161deaf63e03b7022a85224a"}, - {file = "grpcio-1.65.4-cp38-cp38-win_amd64.whl", hash = "sha256:a99e6dffefd3027b438116f33ed1261c8d360f0dd4f943cb44541a2782eba72f"}, - {file = "grpcio-1.65.4-cp39-cp39-linux_armv7l.whl", hash = "sha256:874acd010e60a2ec1e30d5e505b0651ab12eb968157cd244f852b27c6dbed733"}, - {file = "grpcio-1.65.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b07f36faf01fca5427d4aa23645e2d492157d56c91fab7e06fe5697d7e171ad4"}, - {file = "grpcio-1.65.4-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:b81711bf4ec08a3710b534e8054c7dcf90f2edc22bebe11c1775a23f145595fe"}, - {file = "grpcio-1.65.4-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88fcabc332a4aef8bcefadc34a02e9ab9407ab975d2c7d981a8e12c1aed92aa1"}, - {file = "grpcio-1.65.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9ba3e63108a8749994f02c7c0e156afb39ba5bdf755337de8e75eb685be244b"}, - {file = "grpcio-1.65.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8eb485801957a486bf5de15f2c792d9f9c897a86f2f18db8f3f6795a094b4bb2"}, - {file = "grpcio-1.65.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:075f3903bc1749ace93f2b0664f72964ee5f2da5c15d4b47e0ab68e4f442c257"}, - {file = "grpcio-1.65.4-cp39-cp39-win32.whl", hash = "sha256:0a0720299bdb2cc7306737295d56e41ce8827d5669d4a3cd870af832e3b17c4d"}, - {file = "grpcio-1.65.4-cp39-cp39-win_amd64.whl", hash = "sha256:a146bc40fa78769f22e1e9ff4f110ef36ad271b79707577bf2a31e3e931141b9"}, - {file = "grpcio-1.65.4.tar.gz", hash = "sha256:2a4f476209acffec056360d3e647ae0e14ae13dcf3dfb130c227ae1c594cbe39"}, + {file = "grpcio-1.65.5-cp310-cp310-linux_armv7l.whl", hash = "sha256:b67d450f1e008fedcd81e097a3a400a711d8be1a8b20f852a7b8a73fead50fe3"}, + {file = "grpcio-1.65.5-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:a70a20eed87bba647a38bedd93b3ce7db64b3f0e8e0952315237f7f5ca97b02d"}, + {file = "grpcio-1.65.5-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:f79c87c114bf37adf408026b9e2e333fe9ff31dfc9648f6f80776c513145c813"}, + {file = "grpcio-1.65.5-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f17f9fa2d947dbfaca01b3ab2c62eefa8240131fdc67b924eb42ce6032e3e5c1"}, + {file = "grpcio-1.65.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32d60e18ff7c34fe3f6db3d35ad5c6dc99f5b43ff3982cb26fad4174462d10b1"}, + {file = "grpcio-1.65.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fe6505376f5b00bb008e4e1418152e3ad3d954b629da286c7913ff3cfc0ff740"}, + {file = "grpcio-1.65.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:33158e56c6378063923c417e9fbdb28660b6e0e2835af42e67f5a7793f587af7"}, + {file = "grpcio-1.65.5-cp310-cp310-win32.whl", hash = "sha256:1cbc208edb9acf1cc339396a1a36b83796939be52f34e591c90292045b579fbf"}, + {file = "grpcio-1.65.5-cp310-cp310-win_amd64.whl", hash = "sha256:bc74f3f745c37e2c5685c9d2a2d5a94de00f286963f5213f763ae137bf4f2358"}, + {file = "grpcio-1.65.5-cp311-cp311-linux_armv7l.whl", hash = "sha256:3207ae60d07e5282c134b6e02f9271a2cb523c6d7a346c6315211fe2bf8d61ed"}, + {file = "grpcio-1.65.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a2f80510f99f82d4eb825849c486df703f50652cea21c189eacc2b84f2bde764"}, + {file = "grpcio-1.65.5-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:a80e9a5e3f93c54f5eb82a3825ea1fc4965b2fa0026db2abfecb139a5c4ecdf1"}, + {file = "grpcio-1.65.5-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b2944390a496567de9e70418f3742b477d85d8ca065afa90432edc91b4bb8ad"}, + {file = "grpcio-1.65.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3655139d7be213c32c79ef6fb2367cae28e56ef68e39b1961c43214b457f257"}, + {file = "grpcio-1.65.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:05f02d68fc720e085f061b704ee653b181e6d5abfe315daef085719728d3d1fd"}, + {file = "grpcio-1.65.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1c4caafe71aef4dabf53274bbf4affd6df651e9f80beedd6b8e08ff438ed3260"}, + {file = "grpcio-1.65.5-cp311-cp311-win32.whl", hash = "sha256:84c901cdec16a092099f251ef3360d15e29ef59772150fa261d94573612539b5"}, + {file = "grpcio-1.65.5-cp311-cp311-win_amd64.whl", hash = "sha256:11f8b16121768c1cb99d7dcb84e01510e60e6a206bf9123e134118802486f035"}, + {file = "grpcio-1.65.5-cp312-cp312-linux_armv7l.whl", hash = "sha256:ee6ed64a27588a2c94e8fa84fe8f3b5c89427d4d69c37690903d428ec61ca7e4"}, + {file = "grpcio-1.65.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:76991b7a6fb98630a3328839755181ce7c1aa2b1842aa085fd4198f0e5198960"}, + {file = "grpcio-1.65.5-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:89c00a18801b1ed9cc441e29b521c354725d4af38c127981f2c950c796a09b6e"}, + {file = "grpcio-1.65.5-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:078038e150a897e5e402ed3d57f1d31ebf604cbed80f595bd281b5da40762a92"}, + {file = "grpcio-1.65.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c97962720489ef31b5ad8a916e22bc31bba3664e063fb9f6702dce056d4aa61b"}, + {file = "grpcio-1.65.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:b8270b15b99781461b244f5c81d5c2bc9696ab9189fb5ff86c841417fb3b39fe"}, + {file = "grpcio-1.65.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8e5c4c15ac3fe1eb68e46bc51e66ad29be887479f231f8237cf8416058bf0cc1"}, + {file = "grpcio-1.65.5-cp312-cp312-win32.whl", hash = "sha256:f5b5970341359341d0e4c789da7568264b2a89cd976c05ea476036852b5950cd"}, + {file = "grpcio-1.65.5-cp312-cp312-win_amd64.whl", hash = "sha256:238a625f391a1b9f5f069bdc5930f4fd71b74426bea52196fc7b83f51fa97d34"}, + {file = "grpcio-1.65.5-cp38-cp38-linux_armv7l.whl", hash = "sha256:6c4e62bcf297a1568f627f39576dbfc27f1e5338a691c6dd5dd6b3979da51d1c"}, + {file = "grpcio-1.65.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:d7df567b67d16d4177835a68d3f767bbcbad04da9dfb52cbd19171f430c898bd"}, + {file = "grpcio-1.65.5-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:b7ca419f1462390851eec395b2089aad1e49546b52d4e2c972ceb76da69b10f8"}, + {file = "grpcio-1.65.5-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fa36dd8496d3af0d40165252a669fa4f6fd2db4b4026b9a9411cbf060b9d6a15"}, + {file = "grpcio-1.65.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a101696f9ece90a0829988ff72f1b1ea2358f3df035bdf6d675dd8b60c2c0894"}, + {file = "grpcio-1.65.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2a6d8169812932feac514b420daffae8ab8e36f90f3122b94ae767e633296b17"}, + {file = "grpcio-1.65.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:47d0aaaab82823f0aa6adea5184350b46e2252e13a42a942db84da5b733f2e05"}, + {file = "grpcio-1.65.5-cp38-cp38-win32.whl", hash = "sha256:85ae8f8517d5bcc21fb07dbf791e94ed84cc28f84c903cdc2bd7eaeb437c8f45"}, + {file = "grpcio-1.65.5-cp38-cp38-win_amd64.whl", hash = "sha256:770bd4bd721961f6dd8049bc27338564ba8739913f77c0f381a9815e465ff965"}, + {file = "grpcio-1.65.5-cp39-cp39-linux_armv7l.whl", hash = "sha256:ab5ec837d8cee8dbce9ef6386125f119b231e4333cc6b6d57b6c5c7c82a72331"}, + {file = "grpcio-1.65.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cabd706183ee08d8026a015af5819a0b3a8959bdc9d1f6fdacd1810f09200f2a"}, + {file = "grpcio-1.65.5-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:ec71fc5b39821ad7d80db7473c8f8c2910f3382f0ddadfbcfc2c6c437107eb67"}, + {file = "grpcio-1.65.5-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3a9e35bcb045e39d7cac30464c285389b9a816ac2067e4884ad2c02e709ef8e"}, + {file = "grpcio-1.65.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d750e9330eb14236ca11b78d0c494eed13d6a95eb55472298f0e547c165ee324"}, + {file = "grpcio-1.65.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2b91ce647b6307f25650872454a4d02a2801f26a475f90d0b91ed8110baae589"}, + {file = "grpcio-1.65.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8da58ff80bc4556cf29bc03f5fff1f03b8387d6aaa7b852af9eb65b2cf833be4"}, + {file = "grpcio-1.65.5-cp39-cp39-win32.whl", hash = "sha256:7a412959aa5f08c5ac04aa7b7c3c041f5e4298cadd4fcc2acff195b56d185ebc"}, + {file = "grpcio-1.65.5-cp39-cp39-win_amd64.whl", hash = "sha256:55714ea852396ec9568f45f487639945ab674de83c12bea19d5ddbc3ae41ada3"}, + {file = "grpcio-1.65.5.tar.gz", hash = "sha256:ec6f219fb5d677a522b0deaf43cea6697b16f338cb68d009e30930c4aa0d2209"}, ] [package.extras] -protobuf = ["grpcio-tools (>=1.65.4)"] +protobuf = ["grpcio-tools (>=1.65.5)"] [[package]] name = "grpclib" @@ -1603,13 +1603,13 @@ test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "p [[package]] name = "importlib-resources" -version = "6.4.2" +version = "6.4.3" description = "Read resources from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_resources-6.4.2-py3-none-any.whl", hash = "sha256:8bba8c54a8a3afaa1419910845fa26ebd706dc716dd208d9b158b4b6966f5c5c"}, - {file = "importlib_resources-6.4.2.tar.gz", hash = "sha256:6cbfbefc449cc6e2095dd184691b7a12a04f40bc75dd4c55d31c34f174cdf57a"}, + {file = "importlib_resources-6.4.3-py3-none-any.whl", hash = "sha256:2d6dfe3b9e055f72495c2085890837fc8c758984e209115c8792bddcb762cd93"}, + {file = "importlib_resources-6.4.3.tar.gz", hash = "sha256:4a202b9b9d38563b46da59221d77bb73862ab5d79d461307bcb826d725448b98"}, ] [package.dependencies] @@ -2119,13 +2119,13 @@ test = ["pytest (>=7.4)", "pytest-cov (>=4.1)"] [[package]] name = "markdown" -version = "3.6" +version = "3.7" description = "Python implementation of John Gruber's Markdown." optional = false python-versions = ">=3.8" files = [ - {file = "Markdown-3.6-py3-none-any.whl", hash = "sha256:48f276f4d8cfb8ce6527c8f79e2ee29708508bf4d40aa410fbc3b4ee832c850f"}, - {file = "Markdown-3.6.tar.gz", hash = "sha256:ed4f41f6daecbeeb96e576ce414c41d2d876daa9a16cb35fa8ed8c2ddfad0224"}, + {file = "Markdown-3.7-py3-none-any.whl", hash = "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803"}, + {file = "markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2"}, ] [package.dependencies] @@ -2874,7 +2874,6 @@ optional = false python-versions = ">=3.9" files = [ {file = "pandas-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce"}, - {file = "pandas-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238"}, {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08"}, {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0"}, {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51"}, @@ -2888,14 +2887,12 @@ files = [ {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1"}, {file = "pandas-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24"}, {file = "pandas-2.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef"}, - {file = "pandas-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b79011ff7a0f4b1d6da6a61aa1aa604fb312d6647de5bad20013682d1429ce"}, {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad"}, {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad"}, {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76"}, {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32"}, {file = "pandas-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23"}, {file = "pandas-2.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2"}, - {file = "pandas-2.2.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd"}, {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863"}, {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921"}, {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a"}, @@ -2908,6 +2905,7 @@ files = [ numpy = [ {version = ">=1.22.4", markers = "python_version < \"3.11\""}, {version = ">=1.23.2", markers = "python_version == \"3.11\""}, + {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, ] python-dateutil = ">=2.8.2" pytz = ">=2020.1" @@ -3242,6 +3240,26 @@ files = [ {file = "protobuf-4.25.4.tar.gz", hash = "sha256:0dc4a62cc4052a036ee2204d26fe4d835c62827c855c8a03f29fe6da146b380d"}, ] +[[package]] +name = "protobuf" +version = "5.27.3" +description = "" +optional = false +python-versions = ">=3.8" +files = [ + {file = "protobuf-5.27.3-cp310-abi3-win32.whl", hash = "sha256:dcb307cd4ef8fec0cf52cb9105a03d06fbb5275ce6d84a6ae33bc6cf84e0a07b"}, + {file = "protobuf-5.27.3-cp310-abi3-win_amd64.whl", hash = "sha256:16ddf3f8c6c41e1e803da7abea17b1793a97ef079a912e42351eabb19b2cffe7"}, + {file = "protobuf-5.27.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:68248c60d53f6168f565a8c76dc58ba4fa2ade31c2d1ebdae6d80f969cdc2d4f"}, + {file = "protobuf-5.27.3-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:b8a994fb3d1c11156e7d1e427186662b64694a62b55936b2b9348f0a7c6625ce"}, + {file = "protobuf-5.27.3-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:a55c48f2a2092d8e213bd143474df33a6ae751b781dd1d1f4d953c128a415b25"}, + {file = "protobuf-5.27.3-cp38-cp38-win32.whl", hash = "sha256:043853dcb55cc262bf2e116215ad43fa0859caab79bb0b2d31b708f128ece035"}, + {file = "protobuf-5.27.3-cp38-cp38-win_amd64.whl", hash = "sha256:c2a105c24f08b1e53d6c7ffe69cb09d0031512f0b72f812dd4005b8112dbe91e"}, + {file = "protobuf-5.27.3-cp39-cp39-win32.whl", hash = "sha256:c84eee2c71ed83704f1afbf1a85c3171eab0fd1ade3b399b3fad0884cbcca8bf"}, + {file = "protobuf-5.27.3-cp39-cp39-win_amd64.whl", hash = "sha256:af7c0b7cfbbb649ad26132e53faa348580f844d9ca46fd3ec7ca48a1ea5db8a1"}, + {file = "protobuf-5.27.3-py3-none-any.whl", hash = "sha256:8572c6533e544ebf6899c360e91d6bcbbee2549251643d32c52cf8a5de295ba5"}, + {file = "protobuf-5.27.3.tar.gz", hash = "sha256:82460903e640f2b7e34ee81a947fdaad89de796d324bcbc38ff5430bcdead82c"}, +] + [[package]] name = "psutil" version = "6.0.0" @@ -3770,7 +3788,8 @@ astroid = ">=3.1.0,<=3.2.0-dev0" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} dill = [ {version = ">=0.2", markers = "python_version < \"3.11\""}, - {version = ">=0.3.6", markers = "python_version >= \"3.11\""}, + {version = ">=0.3.6", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, + {version = ">=0.3.7", markers = "python_version >= \"3.12\""}, ] isort = ">=4.2.5,<5.13.0 || >5.13.0,<6" mccabe = ">=0.6,<0.8" @@ -4148,120 +4167,120 @@ files = [ [[package]] name = "pyzmq" -version = "26.1.0" +version = "26.1.1" description = "Python bindings for 0MQ" optional = false python-versions = ">=3.7" files = [ - {file = "pyzmq-26.1.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:263cf1e36862310bf5becfbc488e18d5d698941858860c5a8c079d1511b3b18e"}, - {file = "pyzmq-26.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d5c8b17f6e8f29138678834cf8518049e740385eb2dbf736e8f07fc6587ec682"}, - {file = "pyzmq-26.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75a95c2358fcfdef3374cb8baf57f1064d73246d55e41683aaffb6cfe6862917"}, - {file = "pyzmq-26.1.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f99de52b8fbdb2a8f5301ae5fc0f9e6b3ba30d1d5fc0421956967edcc6914242"}, - {file = "pyzmq-26.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bcbfbab4e1895d58ab7da1b5ce9a327764f0366911ba5b95406c9104bceacb0"}, - {file = "pyzmq-26.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:77ce6a332c7e362cb59b63f5edf730e83590d0ab4e59c2aa5bd79419a42e3449"}, - {file = "pyzmq-26.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ba0a31d00e8616149a5ab440d058ec2da621e05d744914774c4dde6837e1f545"}, - {file = "pyzmq-26.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8b88641384e84a258b740801cd4dbc45c75f148ee674bec3149999adda4a8598"}, - {file = "pyzmq-26.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2fa76ebcebe555cce90f16246edc3ad83ab65bb7b3d4ce408cf6bc67740c4f88"}, - {file = "pyzmq-26.1.0-cp310-cp310-win32.whl", hash = "sha256:fbf558551cf415586e91160d69ca6416f3fce0b86175b64e4293644a7416b81b"}, - {file = "pyzmq-26.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:a7b8aab50e5a288c9724d260feae25eda69582be84e97c012c80e1a5e7e03fb2"}, - {file = "pyzmq-26.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:08f74904cb066e1178c1ec706dfdb5c6c680cd7a8ed9efebeac923d84c1f13b1"}, - {file = "pyzmq-26.1.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:46d6800b45015f96b9d92ece229d92f2aef137d82906577d55fadeb9cf5fcb71"}, - {file = "pyzmq-26.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5bc2431167adc50ba42ea3e5e5f5cd70d93e18ab7b2f95e724dd8e1bd2c38120"}, - {file = "pyzmq-26.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3bb34bebaa1b78e562931a1687ff663d298013f78f972a534f36c523311a84d"}, - {file = "pyzmq-26.1.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd3f6329340cef1c7ba9611bd038f2d523cea79f09f9c8f6b0553caba59ec562"}, - {file = "pyzmq-26.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:471880c4c14e5a056a96cd224f5e71211997d40b4bf5e9fdded55dafab1f98f2"}, - {file = "pyzmq-26.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:ce6f2b66799971cbae5d6547acefa7231458289e0ad481d0be0740535da38d8b"}, - {file = "pyzmq-26.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0a1f6ea5b1d6cdbb8cfa0536f0d470f12b4b41ad83625012e575f0e3ecfe97f0"}, - {file = "pyzmq-26.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b45e6445ac95ecb7d728604bae6538f40ccf4449b132b5428c09918523abc96d"}, - {file = "pyzmq-26.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:94c4262626424683feea0f3c34951d39d49d354722db2745c42aa6bb50ecd93b"}, - {file = "pyzmq-26.1.0-cp311-cp311-win32.whl", hash = "sha256:a0f0ab9df66eb34d58205913f4540e2ad17a175b05d81b0b7197bc57d000e829"}, - {file = "pyzmq-26.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:8efb782f5a6c450589dbab4cb0f66f3a9026286333fe8f3a084399149af52f29"}, - {file = "pyzmq-26.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:f133d05aaf623519f45e16ab77526e1e70d4e1308e084c2fb4cedb1a0c764bbb"}, - {file = "pyzmq-26.1.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:3d3146b1c3dcc8a1539e7cc094700b2be1e605a76f7c8f0979b6d3bde5ad4072"}, - {file = "pyzmq-26.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d9270fbf038bf34ffca4855bcda6e082e2c7f906b9eb8d9a8ce82691166060f7"}, - {file = "pyzmq-26.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:995301f6740a421afc863a713fe62c0aaf564708d4aa057dfdf0f0f56525294b"}, - {file = "pyzmq-26.1.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7eca8b89e56fb8c6c26dd3e09bd41b24789022acf1cf13358e96f1cafd8cae3"}, - {file = "pyzmq-26.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d4feb2e83dfe9ace6374a847e98ee9d1246ebadcc0cb765482e272c34e5820"}, - {file = "pyzmq-26.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d4fafc2eb5d83f4647331267808c7e0c5722c25a729a614dc2b90479cafa78bd"}, - {file = "pyzmq-26.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:58c33dc0e185dd97a9ac0288b3188d1be12b756eda67490e6ed6a75cf9491d79"}, - {file = "pyzmq-26.1.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:68a0a1d83d33d8367ddddb3e6bb4afbb0f92bd1dac2c72cd5e5ddc86bdafd3eb"}, - {file = "pyzmq-26.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2ae7c57e22ad881af78075e0cea10a4c778e67234adc65c404391b417a4dda83"}, - {file = "pyzmq-26.1.0-cp312-cp312-win32.whl", hash = "sha256:347e84fc88cc4cb646597f6d3a7ea0998f887ee8dc31c08587e9c3fd7b5ccef3"}, - {file = "pyzmq-26.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:9f136a6e964830230912f75b5a116a21fe8e34128dcfd82285aa0ef07cb2c7bd"}, - {file = "pyzmq-26.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:a4b7a989c8f5a72ab1b2bbfa58105578753ae77b71ba33e7383a31ff75a504c4"}, - {file = "pyzmq-26.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d416f2088ac8f12daacffbc2e8918ef4d6be8568e9d7155c83b7cebed49d2322"}, - {file = "pyzmq-26.1.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:ecb6c88d7946166d783a635efc89f9a1ff11c33d680a20df9657b6902a1d133b"}, - {file = "pyzmq-26.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:471312a7375571857a089342beccc1a63584315188560c7c0da7e0a23afd8a5c"}, - {file = "pyzmq-26.1.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e6cea102ffa16b737d11932c426f1dc14b5938cf7bc12e17269559c458ac334"}, - {file = "pyzmq-26.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec7248673ffc7104b54e4957cee38b2f3075a13442348c8d651777bf41aa45ee"}, - {file = "pyzmq-26.1.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:0614aed6f87d550b5cecb03d795f4ddbb1544b78d02a4bd5eecf644ec98a39f6"}, - {file = "pyzmq-26.1.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:e8746ce968be22a8a1801bf4a23e565f9687088580c3ed07af5846580dd97f76"}, - {file = "pyzmq-26.1.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:7688653574392d2eaeef75ddcd0b2de5b232d8730af29af56c5adf1df9ef8d6f"}, - {file = "pyzmq-26.1.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:8d4dac7d97f15c653a5fedcafa82626bd6cee1450ccdaf84ffed7ea14f2b07a4"}, - {file = "pyzmq-26.1.0-cp313-cp313-win32.whl", hash = "sha256:ccb42ca0a4a46232d716779421bbebbcad23c08d37c980f02cc3a6bd115ad277"}, - {file = "pyzmq-26.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e1e5d0a25aea8b691a00d6b54b28ac514c8cc0d8646d05f7ca6cb64b97358250"}, - {file = "pyzmq-26.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:fc82269d24860cfa859b676d18850cbb8e312dcd7eada09e7d5b007e2f3d9eb1"}, - {file = "pyzmq-26.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:416ac51cabd54f587995c2b05421324700b22e98d3d0aa2cfaec985524d16f1d"}, - {file = "pyzmq-26.1.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:ff832cce719edd11266ca32bc74a626b814fff236824aa1aeaad399b69fe6eae"}, - {file = "pyzmq-26.1.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:393daac1bcf81b2a23e696b7b638eedc965e9e3d2112961a072b6cd8179ad2eb"}, - {file = "pyzmq-26.1.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9869fa984c8670c8ab899a719eb7b516860a29bc26300a84d24d8c1b71eae3ec"}, - {file = "pyzmq-26.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b3b8e36fd4c32c0825b4461372949ecd1585d326802b1321f8b6dc1d7e9318c"}, - {file = "pyzmq-26.1.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:3ee647d84b83509b7271457bb428cc347037f437ead4b0b6e43b5eba35fec0aa"}, - {file = "pyzmq-26.1.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:45cb1a70eb00405ce3893041099655265fabcd9c4e1e50c330026e82257892c1"}, - {file = "pyzmq-26.1.0-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:5cca7b4adb86d7470e0fc96037771981d740f0b4cb99776d5cb59cd0e6684a73"}, - {file = "pyzmq-26.1.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:91d1a20bdaf3b25f3173ff44e54b1cfbc05f94c9e8133314eb2962a89e05d6e3"}, - {file = "pyzmq-26.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c0665d85535192098420428c779361b8823d3d7ec4848c6af3abb93bc5c915bf"}, - {file = "pyzmq-26.1.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:96d7c1d35ee4a495df56c50c83df7af1c9688cce2e9e0edffdbf50889c167595"}, - {file = "pyzmq-26.1.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b281b5ff5fcc9dcbfe941ac5c7fcd4b6c065adad12d850f95c9d6f23c2652384"}, - {file = "pyzmq-26.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5384c527a9a004445c5074f1e20db83086c8ff1682a626676229aafd9cf9f7d1"}, - {file = "pyzmq-26.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:754c99a9840839375ee251b38ac5964c0f369306eddb56804a073b6efdc0cd88"}, - {file = "pyzmq-26.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9bdfcb74b469b592972ed881bad57d22e2c0acc89f5e8c146782d0d90fb9f4bf"}, - {file = "pyzmq-26.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bd13f0231f4788db619347b971ca5f319c5b7ebee151afc7c14632068c6261d3"}, - {file = "pyzmq-26.1.0-cp37-cp37m-win32.whl", hash = "sha256:c5668dac86a869349828db5fc928ee3f58d450dce2c85607067d581f745e4fb1"}, - {file = "pyzmq-26.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ad875277844cfaeca7fe299ddf8c8d8bfe271c3dc1caf14d454faa5cdbf2fa7a"}, - {file = "pyzmq-26.1.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:65c6e03cc0222eaf6aad57ff4ecc0a070451e23232bb48db4322cc45602cede0"}, - {file = "pyzmq-26.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:038ae4ffb63e3991f386e7fda85a9baab7d6617fe85b74a8f9cab190d73adb2b"}, - {file = "pyzmq-26.1.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:bdeb2c61611293f64ac1073f4bf6723b67d291905308a7de9bb2ca87464e3273"}, - {file = "pyzmq-26.1.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:61dfa5ee9d7df297c859ac82b1226d8fefaf9c5113dc25c2c00ecad6feeeb04f"}, - {file = "pyzmq-26.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3292d384537b9918010769b82ab3e79fca8b23d74f56fc69a679106a3e2c2cf"}, - {file = "pyzmq-26.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f9499c70c19ff0fbe1007043acb5ad15c1dec7d8e84ab429bca8c87138e8f85c"}, - {file = "pyzmq-26.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d3dd5523ed258ad58fed7e364c92a9360d1af8a9371e0822bd0146bdf017ef4c"}, - {file = "pyzmq-26.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baba2fd199b098c5544ef2536b2499d2e2155392973ad32687024bd8572a7d1c"}, - {file = "pyzmq-26.1.0-cp38-cp38-win32.whl", hash = "sha256:ddbb2b386128d8eca92bd9ca74e80f73fe263bcca7aa419f5b4cbc1661e19741"}, - {file = "pyzmq-26.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:79e45a4096ec8388cdeb04a9fa5e9371583bcb826964d55b8b66cbffe7b33c86"}, - {file = "pyzmq-26.1.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:add52c78a12196bc0fda2de087ba6c876ea677cbda2e3eba63546b26e8bf177b"}, - {file = "pyzmq-26.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:98c03bd7f3339ff47de7ea9ac94a2b34580a8d4df69b50128bb6669e1191a895"}, - {file = "pyzmq-26.1.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dcc37d9d708784726fafc9c5e1232de655a009dbf97946f117aefa38d5985a0f"}, - {file = "pyzmq-26.1.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5a6ed52f0b9bf8dcc64cc82cce0607a3dfed1dbb7e8c6f282adfccc7be9781de"}, - {file = "pyzmq-26.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:451e16ae8bea3d95649317b463c9f95cd9022641ec884e3d63fc67841ae86dfe"}, - {file = "pyzmq-26.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:906e532c814e1d579138177a00ae835cd6becbf104d45ed9093a3aaf658f6a6a"}, - {file = "pyzmq-26.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:05bacc4f94af468cc82808ae3293390278d5f3375bb20fef21e2034bb9a505b6"}, - {file = "pyzmq-26.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:57bb2acba798dc3740e913ffadd56b1fcef96f111e66f09e2a8db3050f1f12c8"}, - {file = "pyzmq-26.1.0-cp39-cp39-win32.whl", hash = "sha256:f774841bb0e8588505002962c02da420bcfb4c5056e87a139c6e45e745c0e2e2"}, - {file = "pyzmq-26.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:359c533bedc62c56415a1f5fcfd8279bc93453afdb0803307375ecf81c962402"}, - {file = "pyzmq-26.1.0-cp39-cp39-win_arm64.whl", hash = "sha256:7907419d150b19962138ecec81a17d4892ea440c184949dc29b358bc730caf69"}, - {file = "pyzmq-26.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b24079a14c9596846bf7516fe75d1e2188d4a528364494859106a33d8b48be38"}, - {file = "pyzmq-26.1.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59d0acd2976e1064f1b398a00e2c3e77ed0a157529779e23087d4c2fb8aaa416"}, - {file = "pyzmq-26.1.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:911c43a4117915203c4cc8755e0f888e16c4676a82f61caee2f21b0c00e5b894"}, - {file = "pyzmq-26.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b10163e586cc609f5f85c9b233195554d77b1e9a0801388907441aaeb22841c5"}, - {file = "pyzmq-26.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:28a8b2abb76042f5fd7bd720f7fea48c0fd3e82e9de0a1bf2c0de3812ce44a42"}, - {file = "pyzmq-26.1.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bef24d3e4ae2c985034439f449e3f9e06bf579974ce0e53d8a507a1577d5b2ab"}, - {file = "pyzmq-26.1.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2cd0f4d314f4a2518e8970b6f299ae18cff7c44d4a1fc06fc713f791c3a9e3ea"}, - {file = "pyzmq-26.1.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fa25a620eed2a419acc2cf10135b995f8f0ce78ad00534d729aa761e4adcef8a"}, - {file = "pyzmq-26.1.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef3b048822dca6d231d8a8ba21069844ae38f5d83889b9b690bf17d2acc7d099"}, - {file = "pyzmq-26.1.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:9a6847c92d9851b59b9f33f968c68e9e441f9a0f8fc972c5580c5cd7cbc6ee24"}, - {file = "pyzmq-26.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c9b9305004d7e4e6a824f4f19b6d8f32b3578aad6f19fc1122aaf320cbe3dc83"}, - {file = "pyzmq-26.1.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:63c1d3a65acb2f9c92dce03c4e1758cc552f1ae5c78d79a44e3bb88d2fa71f3a"}, - {file = "pyzmq-26.1.0-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d36b8fffe8b248a1b961c86fbdfa0129dfce878731d169ede7fa2631447331be"}, - {file = "pyzmq-26.1.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67976d12ebfd61a3bc7d77b71a9589b4d61d0422282596cf58c62c3866916544"}, - {file = "pyzmq-26.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:998444debc8816b5d8d15f966e42751032d0f4c55300c48cc337f2b3e4f17d03"}, - {file = "pyzmq-26.1.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e5c88b2f13bcf55fee78ea83567b9fe079ba1a4bef8b35c376043440040f7edb"}, - {file = "pyzmq-26.1.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d906d43e1592be4b25a587b7d96527cb67277542a5611e8ea9e996182fae410"}, - {file = "pyzmq-26.1.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80b0c9942430d731c786545da6be96d824a41a51742e3e374fedd9018ea43106"}, - {file = "pyzmq-26.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:314d11564c00b77f6224d12eb3ddebe926c301e86b648a1835c5b28176c83eab"}, - {file = "pyzmq-26.1.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:093a1a3cae2496233f14b57f4b485da01b4ff764582c854c0f42c6dd2be37f3d"}, - {file = "pyzmq-26.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3c397b1b450f749a7e974d74c06d69bd22dd362142f370ef2bd32a684d6b480c"}, - {file = "pyzmq-26.1.0.tar.gz", hash = "sha256:6c5aeea71f018ebd3b9115c7cb13863dd850e98ca6b9258509de1246461a7e7f"}, + {file = "pyzmq-26.1.1-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:b1bb952d1e407463c9333ea7e0c0600001e54e08ce836d4f0aff1fb3f902cf63"}, + {file = "pyzmq-26.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:65e2a18e845c6ea7ab849c70db932eaeadee5edede9e379eb21c0a44cf523b2e"}, + {file = "pyzmq-26.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:def7ae3006924b8a0c146a89ab4008310913fa903beedb95e25dea749642528e"}, + {file = "pyzmq-26.1.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a8234571df7816f99dde89c3403cb396d70c6554120b795853a8ea56fcc26cd3"}, + {file = "pyzmq-26.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18da8e84dbc30688fd2baefd41df7190607511f916be34f9a24b0e007551822e"}, + {file = "pyzmq-26.1.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:c70dab93d98b2bf3f0ac1265edbf6e7f83acbf71dabcc4611889bb0dea45bed7"}, + {file = "pyzmq-26.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:fcb90592c5d5c562e1b1a1ceccf6f00036d73c51db0271bf4d352b8d6b31d468"}, + {file = "pyzmq-26.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cf4be7460a0c1bc71e9b0e64ecdd75a86386ca6afaa36641686f5542d0314e9d"}, + {file = "pyzmq-26.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4cbecda4ddbfc1e309c3be04d333f9be3fc6178b8b6592b309676f929767a15"}, + {file = "pyzmq-26.1.1-cp310-cp310-win32.whl", hash = "sha256:583f73b113b8165713b6ce028d221402b1b69483055b5aa3f991937e34dd1ead"}, + {file = "pyzmq-26.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:5e6f39ecb8eb7bfcb976c49262e8cf83ff76e082b77ca23ba90c9b6691a345be"}, + {file = "pyzmq-26.1.1-cp310-cp310-win_arm64.whl", hash = "sha256:8d042d6446cab3a1388b38596f5acabb9926b0b95c3894c519356b577a549458"}, + {file = "pyzmq-26.1.1-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:362cac2423e36966d336d79d3ec3eafeabc153ee3e7a5cf580d7e74a34b3d912"}, + {file = "pyzmq-26.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0841633446cb1539a832a19bb24c03a20c00887d0cedd1d891b495b07e5c5cb5"}, + {file = "pyzmq-26.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e1fcdc333afbf9918d0a614a6e10858aede7da49a60f6705a77e343fe86a317"}, + {file = "pyzmq-26.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc8d655627d775475eafdcf0e49e74bcc1e5e90afd9ab813b4da98f092ed7b93"}, + {file = "pyzmq-26.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32de51744820857a6f7c3077e620ab3f607d0e4388dfead885d5124ab9bcdc5e"}, + {file = "pyzmq-26.1.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a880240597010914ffb1d6edd04d3deb7ce6a2abf79a0012751438d13630a671"}, + {file = "pyzmq-26.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:26131b1cec02f941ed2d2b4b8cc051662b1c248b044eff5069df1f500bbced56"}, + {file = "pyzmq-26.1.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ce05841322b58510607f9508a573138d995a46c7928887bc433de9cb760fd2ad"}, + {file = "pyzmq-26.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:32123ff0a6db521aadf2b95201e967a4e0d11fb89f73663a99d2f54881c07214"}, + {file = "pyzmq-26.1.1-cp311-cp311-win32.whl", hash = "sha256:e790602d7ea1d6c7d8713d571226d67de7ffe47b1e22ae2c043ebd537de1bccb"}, + {file = "pyzmq-26.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:717960855f2d6fdc2dba9df49dff31c414187bb11c76af36343a57d1f7083d9a"}, + {file = "pyzmq-26.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:08956c26dbcd4fd8835cb777a16e21958ed2412317630e19f0018d49dbeeb470"}, + {file = "pyzmq-26.1.1-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:e80345900ae241c2c51bead7c9fa247bba6d4b2a83423e9791bae8b0a7f12c52"}, + {file = "pyzmq-26.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ec8fe214fcc45dfb0c32e4a7ad1db20244ba2d2fecbf0cbf9d5242d81ca0a375"}, + {file = "pyzmq-26.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf4e283f97688d993cb7a8acbc22889effbbb7cbaa19ee9709751f44be928f5d"}, + {file = "pyzmq-26.1.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2508bdc8ab246e5ed7c92023d4352aaad63020ca3b098a4e3f1822db202f703d"}, + {file = "pyzmq-26.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:741bdb4d96efe8192616abdc3671931d51a8bcd38c71da2d53fb3127149265d1"}, + {file = "pyzmq-26.1.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:76154943e4c4054b2591792eb3484ef1dd23d59805759f9cebd2f010aa30ee8c"}, + {file = "pyzmq-26.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9498ac427d20d0e0ef0e4bbd6200841e91640dfdf619f544ceec7f464cfb6070"}, + {file = "pyzmq-26.1.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f34453ef3496ca3462f30435bf85f535f9550392987341f9ccc92c102825a79"}, + {file = "pyzmq-26.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:50f0669324e27cc2091ef6ab76ca7112f364b6249691790b4cffce31e73fda28"}, + {file = "pyzmq-26.1.1-cp312-cp312-win32.whl", hash = "sha256:3ee5cbf2625b94de21c68d0cefd35327c8dfdbd6a98fcc41682b4e8bb00d841f"}, + {file = "pyzmq-26.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:75bd448a28b1001b6928679015bc95dd5f172703ed30135bb9e34fc9cda0a3e7"}, + {file = "pyzmq-26.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:4350233569b4bbef88595c5e77ee38995a6f1f1790fae148b578941bfffd1c24"}, + {file = "pyzmq-26.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6c8087a3281c20b1d11042d372ed5a47734af05975d78e4d1d6e7bd1018535f3"}, + {file = "pyzmq-26.1.1-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:ebef7d3fe11fe4c688f08bc0211a976c3318c097057f258428200737b9fff4da"}, + {file = "pyzmq-26.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a5342110510045a47de1e87f5f1dcc1d9d90109522316dc9830cfc6157c800f"}, + {file = "pyzmq-26.1.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:af690ea4be6ca92a67c2b44a779a023bf0838e92d48497a2268175dc4a505691"}, + {file = "pyzmq-26.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc994e220c1403ae087d7f0fa45129d583e46668a019e389060da811a5a9320e"}, + {file = "pyzmq-26.1.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:b8e153f5dffb0310af71fc6fc9cd8174f4c8ea312c415adcb815d786fee78179"}, + {file = "pyzmq-26.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:0065026e624052a51033857e5cd45a94b52946b44533f965f0bdf182460e965d"}, + {file = "pyzmq-26.1.1-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:63351392f948b5d50b9f55161994bc4feedbfb3f3cfe393d2f503dea2c3ec445"}, + {file = "pyzmq-26.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ffecc43b3c18e36b62fcec995761829b6ac325d8dd74a4f2c5c1653afbb4495a"}, + {file = "pyzmq-26.1.1-cp313-cp313-win32.whl", hash = "sha256:6ff14c2fae6c0c2c1c02590c5c5d75aa1db35b859971b3ca2fcd28f983d9f2b6"}, + {file = "pyzmq-26.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:85f2d2ee5ea9a8f1de86a300e1062fbab044f45b5ce34d20580c0198a8196db0"}, + {file = "pyzmq-26.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:cc09b1de8b985ca5a0ca343dd7fb007267c6b329347a74e200f4654268084239"}, + {file = "pyzmq-26.1.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:bc904e86de98f8fc5bd41597da5d61232d2d6d60c4397f26efffabb961b2b245"}, + {file = "pyzmq-26.1.1-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:00f39c367bbd6aa8e4bc36af6510561944c619b58eb36199fa334b594a18f615"}, + {file = "pyzmq-26.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de6f384864a959866b782e6a3896538d1424d183f2d3c7ef079f71dcecde7284"}, + {file = "pyzmq-26.1.1-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3abb15df0c763339edb27a644c19381b2425ddd1aea3dbd77c1601a3b31867b8"}, + {file = "pyzmq-26.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40908ec2dd3b29bbadc0916a0d3c87f8dbeebbd8fead8e618539f09e0506dec4"}, + {file = "pyzmq-26.1.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:c11a95d3f6fc7e714ccd1066f68f9c1abd764a8b3596158be92f46dd49f41e03"}, + {file = "pyzmq-26.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:4437af9fee7a58302dbd511cc49f0cc2b35c112a33a1111fb123cf0be45205ca"}, + {file = "pyzmq-26.1.1-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:76390d3d66406cb01b9681c382874400e9dfd77f30ecdea4bd1bf5226dd4aff0"}, + {file = "pyzmq-26.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:4d4c7fe5e50e269f9c63a260638488fec194a73993008618a59b54c47ef6ae72"}, + {file = "pyzmq-26.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:25d128524207f53f7aae7c5abdc2b63f8957a060b00521af5ffcd20986b5d8f4"}, + {file = "pyzmq-26.1.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d74b925d997e4f92b042bdd7085cd0a309ee0fd7cb4dc376059bbff6b32ff34f"}, + {file = "pyzmq-26.1.1-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:732f957441e5b1c65a7509395e6b6cafee9e12df9aa5f4bf92ed266fe0ba70ee"}, + {file = "pyzmq-26.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0a45102ad7ed9f9ddf2bd699cc5df37742cf7301111cba06001b927efecb120"}, + {file = "pyzmq-26.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9f380d5333fc7cd17423f486125dcc073918676e33db70a6a8172b19fc78d23d"}, + {file = "pyzmq-26.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:8eaffcd6bf6a9d00b66a2052a33fa7e6a6575427e9644395f13c3d070f2918dc"}, + {file = "pyzmq-26.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:f1483d4975ae1b387b39bb8e23d1ff32fe5621aa9e4ed3055d05e9c5613fea53"}, + {file = "pyzmq-26.1.1-cp37-cp37m-win32.whl", hash = "sha256:a83653c6bbe5887caea55e49fbd2909c14b73acf43bcc051eb60b2d514bbd46e"}, + {file = "pyzmq-26.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9763a8d3f5f74ef679989b373c37cc22e8d07e56d26439205cb83edb7722357f"}, + {file = "pyzmq-26.1.1-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:2b045647caf620ce0ed6c8fd9fb6a73116f99aceed966b152a5ba1b416d25311"}, + {file = "pyzmq-26.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f66dcb6625c002f209cdc12cae1a1fec926493cd2262efe37dc6b25a30cea863"}, + {file = "pyzmq-26.1.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0cf1d980c969fb9e538f52abd2227f09e015096bc5c3ef7aa26e0d64051c1db8"}, + {file = "pyzmq-26.1.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:443ebf5e261a95ee9725693f2a5a71401f89b89df0e0ea58844b074067aac2f1"}, + {file = "pyzmq-26.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29de77ba1b1877fe7defc1b9140e65cbd35f72a63bc501e56c2eae55bde5fff4"}, + {file = "pyzmq-26.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f6071ec95af145d7b659dae6786871cd85f0acc599286b6f8ba0c74592d83dd"}, + {file = "pyzmq-26.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6f0512fc87629ad968889176bf2165d721cd817401a281504329e2a2ed0ca6a3"}, + {file = "pyzmq-26.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5ccfcf13e80719f6a2d9c0a021d9e47d4550907a29253554be2c09582f6d7963"}, + {file = "pyzmq-26.1.1-cp38-cp38-win32.whl", hash = "sha256:809673947e95752e407aaaaf03f205ee86ebfff9ca51db6d4003dfd87b8428d1"}, + {file = "pyzmq-26.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:62b5180e23e6f581600459cd983473cd723fdc64350f606d21407c99832aaf5f"}, + {file = "pyzmq-26.1.1-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:fe73d7c89d6f803bed122135ff5783364e8cdb479cf6fe2d764a44b6349e7e0f"}, + {file = "pyzmq-26.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db1b7e2b50ef21f398036786da4c153db63203a402396d9f21e08ea61f3f8dba"}, + {file = "pyzmq-26.1.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7c506a51cb01bb997a3f6440db0d121e5e7a32396e9948b1fdb6a7bfa67243f4"}, + {file = "pyzmq-26.1.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:92eca4f80e8a748d880e55d3cf57ef487692e439f12d5c5a2e1cce84aaa7f6cb"}, + {file = "pyzmq-26.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14bdbae02f72f4716b0ffe7500e9da303d719ddde1f3dcfb4c4f6cc1cf73bb02"}, + {file = "pyzmq-26.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e03be7ed17836c9434cce0668ac1e2cc9143d7169f90f46a0167f6155e176e32"}, + {file = "pyzmq-26.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc5df31e36e4fddd4c8b5c42daee8d54d7b529e898ac984be97bf5517de166a7"}, + {file = "pyzmq-26.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f218179c90a12d660906e04b25a340dd63e9743000ba16232ddaf46888f269da"}, + {file = "pyzmq-26.1.1-cp39-cp39-win32.whl", hash = "sha256:7dfabc180a4da422a4b349c63077347392463a75fa07aa3be96712ed6d42c547"}, + {file = "pyzmq-26.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:c5248e6e0fcbbbc912982e99cdd51c342601f495b0fa5bd667f3bdbdbf3e170f"}, + {file = "pyzmq-26.1.1-cp39-cp39-win_arm64.whl", hash = "sha256:2ae7aa1408778dc74582a1226052b930f9083b54b64d7e6ef6ec0466cfdcdec2"}, + {file = "pyzmq-26.1.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:be3fc2b11c0c384949cf1f01f9a48555039408b0f3e877863b1754225635953e"}, + {file = "pyzmq-26.1.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48dee75c2a9fa4f4a583d4028d564a0453447ee1277a29b07acc3743c092e259"}, + {file = "pyzmq-26.1.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:23f2fe4fb567e8098ebaa7204819658195b10ddd86958a97a6058eed2901eed3"}, + {file = "pyzmq-26.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:472cacd16f627c06d3c8b2d374345ab74446bae913584a6245e2aa935336d929"}, + {file = "pyzmq-26.1.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:8285b25aa20fcc46f1ca4afbc39fd3d5f2fe4c4bbf7f2c7f907a214e87a70024"}, + {file = "pyzmq-26.1.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2067e63fd9d5c13cfe12624dab0366053e523b37a7a01678ce4321f839398939"}, + {file = "pyzmq-26.1.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cc109be2ee3638035d276e18eaf66a1e1f44201c0c4bea4ee0c692766bbd3570"}, + {file = "pyzmq-26.1.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d0da97e65ee73261dba70469cc8f63d8da3a8a825337a2e3d246b9e95141cdd0"}, + {file = "pyzmq-26.1.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa79c528706561306938b275f89bb2c6985ce08469c27e5de05bc680df5e826f"}, + {file = "pyzmq-26.1.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:3ddbd851a3a2651fdc5065a2804d50cf2f4b13b1bcd66de8e9e855d0217d4fcd"}, + {file = "pyzmq-26.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d3df226ab7464684ae6706e20a5cbab717c3735a7e409b3fa598b754d49f1946"}, + {file = "pyzmq-26.1.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:abad7b897e960d577eb4a0f3f789c1780bc3ffe2e7c27cf317e7c90ad26acf12"}, + {file = "pyzmq-26.1.1-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c513d829a548c2d5c88983167be2b3aa537f6d1191edcdc6fcd8999e18bdd994"}, + {file = "pyzmq-26.1.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70af4c9c991714ef1c65957605a8de42ef0d0620dd5f125953c8e682281bdb80"}, + {file = "pyzmq-26.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:8d4234f335b0d0842f7d661d8cd50cbad0729be58f1c4deb85cd96b38fe95025"}, + {file = "pyzmq-26.1.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:2c0fdb7b758e0e1605157e480b00b3a599073068a37091a1c75ec65bf7498645"}, + {file = "pyzmq-26.1.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc657577f057d60dd3642c9f95f28b432889b73143140061f7c1331d02f03df6"}, + {file = "pyzmq-26.1.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3e3b66fe6131b4f33d239f7d4c3bfb2f8532d8644bae3b3da4f3987073edac55"}, + {file = "pyzmq-26.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59b57e912feef6951aec8bb03fe0faa5ad5f36962883c72a30a9c965e6d988fd"}, + {file = "pyzmq-26.1.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:146956aec7d947c5afc5e7da0841423d7a53f84fd160fff25e682361dcfb32cb"}, + {file = "pyzmq-26.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:9521b874fd489495865172f344e46e0159095d1f161858e3fc6e28e43ca15160"}, + {file = "pyzmq-26.1.1.tar.gz", hash = "sha256:a7db05d8b7cd1a8c6610e9e9aa55d525baae7a44a43e18bc3260eb3f92de96c6"}, ] [package.dependencies] @@ -4355,13 +4374,13 @@ test = ["coverage[toml] (>=6.2)", "mypy (>=0.940)", "pytest (>=6.2.2)", "pytest- [[package]] name = "qibo" -version = "0.2.7" +version = "0.2.11" description = "A framework for quantum computing with hardware acceleration." optional = false -python-versions = "<3.12,>=3.9" +python-versions = "<3.13,>=3.9" files = [ - {file = "qibo-0.2.7-py3-none-any.whl", hash = "sha256:20e42ad27f7a9795f84565ab5645e3b24d4af62a0a8c6de5110b5ae6894b35a2"}, - {file = "qibo-0.2.7.tar.gz", hash = "sha256:a57e98a3eccfc3c43c4a697448a4618c9a158f72645d5c93b0b2bdd3ace882ef"}, + {file = "qibo-0.2.11-py3-none-any.whl", hash = "sha256:67e900364e62642c0c8c3c69fbfaea3e81bef5da53b4547b67516a11dcbe099d"}, + {file = "qibo-0.2.11.tar.gz", hash = "sha256:312037020ddfc82bcb92d698e960e5c3749fbbd61d16944b91d0ba15d6cc7931"}, ] [package.dependencies] @@ -4372,13 +4391,14 @@ networkx = ">=3.2.1,<4.0.0" numpy = ">=1.26.4,<2.0.0" openqasm3 = {version = ">=0.5.0", extras = ["parser"]} scipy = ">=1.10.1,<2.0.0" +setuptools = ">=69.1.1,<71.0.0" sympy = ">=1.11.1,<2.0.0" tabulate = ">=0.9.0,<0.10.0" [package.extras] -qinfo = ["cvxpy (>=1.4.2,<2.0.0)"] -tensorflow = ["tensorflow (>=2.14.1,<2.16)"] -torch = ["torch (>=2.1.1,<3.0.0)"] +qulacs = ["qulacs (>=0.6.4,<0.7.0)"] +tensorflow = ["tensorflow (>=2.16.1,<3.0.0)"] +torch = ["torch (>=2.1.1,<2.4)"] [[package]] name = "qibosoq" @@ -4951,19 +4971,18 @@ test = ["array-api-strict", "asv", "gmpy2", "hypothesis (>=6.30)", "mpmath", "po [[package]] name = "setuptools" -version = "72.2.0" +version = "70.3.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-72.2.0-py3-none-any.whl", hash = "sha256:f11dd94b7bae3a156a95ec151f24e4637fb4fa19c878e4d191bfb8b2d82728c4"}, - {file = "setuptools-72.2.0.tar.gz", hash = "sha256:80aacbf633704e9c8bfa1d99fa5dd4dc59573efcf9e4042c13d3bcef91ac2ef9"}, + {file = "setuptools-70.3.0-py3-none-any.whl", hash = "sha256:fe384da74336c398e0d956d1cae0669bc02eed936cdb1d49b57de1990dc11ffc"}, + {file = "setuptools-70.3.0.tar.gz", hash = "sha256:f171bab1dfbc86b132997f26a119f6056a57950d058587841a0082e8830f9dc5"}, ] [package.extras] -core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.text (>=3.7)", "more-itertools (>=8.8)", "ordered-set (>=3.1.1)", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.11.*)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (<0.4)", "pytest-ruff (>=0.2.1)", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.10.0)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "six" @@ -5899,5 +5918,5 @@ zh = ["laboneq"] [metadata] lock-version = "2.0" -python-versions = ">=3.9,<3.12" -content-hash = "a5bf84cc1a4fa49d87dd8a53e5bc48949e4f1bef7c09fd73aca1f26aed3906cd" +python-versions = ">=3.9,<3.13" +content-hash = "bde6cb86d4fe55b5f91310f5d3995640d5e16bedc86bfb4dfb6e5625c2bdcae1" diff --git a/pyproject.toml b/pyproject.toml index f5785ef5af..8bb2e1ad6c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,8 +21,8 @@ packages = [{ include = "qibolab", from = "src" }] include = ["*.out", "*.yml"] [tool.poetry.dependencies] -python = ">=3.9,<3.12" -qibo = ">=0.2.6" +python = ">=3.9,<3.13" +qibo = "^0.2.6" numpy = "^1.26.4" scipy = "^1.13.0" more-itertools = "^9.1.0" @@ -31,11 +31,11 @@ qblox-instruments = { version = "0.12.0", optional = true } qcodes = { version = "^0.37.0", optional = true } qcodes_contrib_drivers = { version = "0.18.0", optional = true } pyvisa-py = { version = "0.5.3", optional = true } -qm-qua = { version = "==1.1.6", optional = true } -qualang-tools = { version = "^0.15.0", optional = true } +qm-qua = { version = "==1.1.6", python = "<3.12", optional = true } +qualang-tools = { version = "^0.15.0", python = "<3.12", optional = true } setuptools = { version = ">67.0.0", optional = true } laboneq = { version = "==2.25.0", optional = true } -qibosoq = { version = ">=0.1.2,<0.2", optional = true } +qibosoq = { version = ">=0.1.2,<0.2", python = "<3.12", optional = true } qutip = { version = "^5.0.2", optional = true } [tool.poetry.group.dev] @@ -61,8 +61,8 @@ sphinx-copybutton = "^0.5.1" qblox-instruments = "0.12.0" qcodes = "^0.37.0" qcodes_contrib_drivers = "0.18.0" -qibosoq = ">=0.1.2,<0.2" -qualang-tools = "^0.15.0" +qibosoq = { version = "^0.1.2", python = "<3.12" } +qualang-tools = { version = "^0.15.0", python = "<3.12" } laboneq = "==2.25.0" qutip = "^5.0.2" From 86a669b55b292afea80e2d733cfb32a384e561b2 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 19 Aug 2024 12:50:22 +0200 Subject: [PATCH 0707/1006] fix: Fix compiler to use aligned as parametrized Breaks the compatibility with Qibo<0.2.8 --- poetry.lock | 2 +- pyproject.toml | 2 +- src/qibolab/compilers/default.py | 9 +++------ 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/poetry.lock b/poetry.lock index 66b773aceb..42d09f107e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -5919,4 +5919,4 @@ zh = ["laboneq"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.13" -content-hash = "bde6cb86d4fe55b5f91310f5d3995640d5e16bedc86bfb4dfb6e5625c2bdcae1" +content-hash = "ef38aec46ecd9f84cad3b7eca72b289b15d6495fc3388d5ba26c64f29ddc3390" diff --git a/pyproject.toml b/pyproject.toml index 8bb2e1ad6c..3dc47a3427 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,7 +22,7 @@ include = ["*.out", "*.yml"] [tool.poetry.dependencies] python = ">=3.9,<3.13" -qibo = "^0.2.6" +qibo = "^0.2.8" numpy = "^1.26.4" scipy = "^1.13.0" more-itertools = "^9.1.0" diff --git a/src/qibolab/compilers/default.py b/src/qibolab/compilers/default.py index 06b3f6c3b9..89824cfa4f 100644 --- a/src/qibolab/compilers/default.py +++ b/src/qibolab/compilers/default.py @@ -67,12 +67,9 @@ def measurement_rule(gate: Gate, natives: list[SingleQubitNatives]) -> PulseSequ def align_rule(gate: Align, qubits: list[Qubit]) -> PulseSequence: """Measurement gate applied using the platform readout pulse.""" - if gate.delay == 0.0: + delay = gate.parameters[0] + if delay == 0.0: return PulseSequence() return PulseSequence( - [ - (ch.name, Delay(duration=gate.delay)) - for qubit in qubits - for ch in qubit.channels - ] + [(ch.name, Delay(duration=delay)) for qubit in qubits for ch in qubit.channels] ) From 4eec6d4aa7077e183b8c24b1874d01da9ffc6584 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 19 Aug 2024 12:55:47 +0200 Subject: [PATCH 0708/1006] chore: Nix upgrade --- flake.lock | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/flake.lock b/flake.lock index 0178efdcfd..d0eb4e76ff 100644 --- a/flake.lock +++ b/flake.lock @@ -41,11 +41,11 @@ "pre-commit-hooks": "pre-commit-hooks" }, "locked": { - "lastModified": 1719323427, - "narHash": "sha256-f4ppP2MBPJzkuy/q+PIfyyTWX9OzqgPV1XSphX71tdA=", + "lastModified": 1723898192, + "narHash": "sha256-MXIK60F11Tc7B+vRcLOWPx6IweAu3u54YpdByM/9OuA=", "owner": "cachix", "repo": "devenv", - "rev": "f810f8d8cb4e674d7e635107510bcbbabaa755a3", + "rev": "64bb347c3b0cee39da55ec6f52a5bef8d833c431", "type": "github" }, "original": { @@ -93,11 +93,11 @@ "rust-analyzer-src": "rust-analyzer-src" }, "locked": { - "lastModified": 1719296889, - "narHash": "sha256-rX9GzfrzvjfqrjfyKnX+zmXTYNRZXqEUWUX2u+LBdi0=", + "lastModified": 1724049063, + "narHash": "sha256-aTnh9Ar40OaT2MTULeJMR9EIrylKeKUYWP61QEZBu0Q=", "owner": "nix-community", "repo": "fenix", - "rev": "049a6ecec1da711d3d84072732e4b14f98e0edd4", + "rev": "94c18bf5acb3966b07cc863bd00f4f959c0c5ec4", "type": "github" }, "original": { @@ -339,11 +339,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1719075281, - "narHash": "sha256-CyyxvOwFf12I91PBWz43iGT1kjsf5oi6ax7CrvaMyAo=", + "lastModified": 1723637854, + "narHash": "sha256-med8+5DSWa2UnOqtdICndjDAEjxr5D7zaIiK4pn0Q7c=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "a71e967ef3694799d0c418c98332f7ff4cc5f6af", + "rev": "c3aa7b8938b17aebd2deecf7be0636000d62a2b9", "type": "github" }, "original": { @@ -417,11 +417,11 @@ "rust-analyzer-src": { "flake": false, "locked": { - "lastModified": 1719233333, - "narHash": "sha256-+BgWRK3bWVIFwdn43DGRVscnu9P63Mndyhte/hgEwUA=", + "lastModified": 1723915239, + "narHash": "sha256-x/RXN/ougJ1IEoBKrY0UijB530OfOfICK4KPa3Kj9Bk=", "owner": "rust-lang", "repo": "rust-analyzer", - "rev": "7b11fdeb681c12002861b9804a388efde81c9647", + "rev": "fa003262474185fd62168379500fe906b331824b", "type": "github" }, "original": { From 1261bb4b981269d5282c669615cb36d8d8690fc3 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 19 Aug 2024 12:57:32 +0200 Subject: [PATCH 0709/1006] ci: Extend workflows to py3.12 --- .github/workflows/deploy.yml | 4 ++-- .github/workflows/rules.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index fabee8daf6..c1ee242dae 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -12,11 +12,11 @@ jobs: strategy: matrix: os: [ubuntu-latest, macos-latest, windows-latest] - python-version: [3.9, "3.10", "3.11"] + python-version: ["3.9", "3.10", "3.11", "3.12"] uses: qiboteam/workflows/.github/workflows/deploy-pip-poetry.yml@v1 with: os: ${{ matrix.os }} python-version: ${{ matrix.python-version }} - publish: ${{ github.event_name == 'release' && github.event.action == 'published' && matrix.os == 'ubuntu-latest' && matrix.python-version == '3.9' }} + publish: ${{ github.event_name == 'release' && github.event.action == 'published' && matrix.os == 'ubuntu-latest' && matrix.python-version == '3.10' }} poetry-extras: "--with docs,tests,analysis --all-extras" secrets: inherit diff --git a/.github/workflows/rules.yml b/.github/workflows/rules.yml index 4e6b11f357..c16024774e 100644 --- a/.github/workflows/rules.yml +++ b/.github/workflows/rules.yml @@ -12,7 +12,7 @@ jobs: strategy: matrix: os: [ubuntu-latest, macos-latest, windows-latest] - python-version: [3.9, "3.10", "3.11"] + python-version: ["3.9", "3.10", "3.11", "3.12"] uses: qiboteam/workflows/.github/workflows/rules-poetry.yml@v1 with: os: ${{ matrix.os }} From 253b97200d2b4a3f4fd74a5ae997f830c24f137c Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 19 Aug 2024 13:15:40 +0200 Subject: [PATCH 0710/1006] test: Skip tests when dependencies are not available In particular, in py3.12 --- tests/test_instruments_qm.py | 4 +++- tests/test_instruments_rfsoc.py | 6 ++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/tests/test_instruments_qm.py b/tests/test_instruments_qm.py index e9aa0964e6..ff5ec223e2 100644 --- a/tests/test_instruments_qm.py +++ b/tests/test_instruments_qm.py @@ -2,8 +2,10 @@ import numpy as np import pytest -from qm import qua +qua = pytest.importorskip("qm").qua + +# ruff: noqa: E402 from qibolab import AcquisitionType, ExecutionParameters, create_platform from qibolab.instruments.qm import QmController from qibolab.pulses import Pulse, Rectangular diff --git a/tests/test_instruments_rfsoc.py b/tests/test_instruments_rfsoc.py index bbec421629..a3f69b4e5f 100644 --- a/tests/test_instruments_rfsoc.py +++ b/tests/test_instruments_rfsoc.py @@ -4,9 +4,11 @@ import numpy as np import pytest -import qibosoq.components.base as rfsoc -import qibosoq.components.pulses as rfsoc_pulses +rfsoc = pytest.importorskip("qibosoq").components.base +rfsoc_pulses = pytest.importorskip("qibosoq").components.pulses + +# ruff: noqa: E402 from qibolab import AcquisitionType, AveragingMode, ExecutionParameters, create_platform from qibolab.instruments.rfsoc import RFSoC from qibolab.instruments.rfsoc.convert import ( From 7a7750c7f1705182cf78835b4a5e2f6c7e2e23d5 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 19 Aug 2024 13:24:53 +0200 Subject: [PATCH 0711/1006] build: Exclude missing py3.12 dependencies from Pylint analysis --- pyproject.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 3dc47a3427..d82939bf94 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -103,6 +103,9 @@ test-docs = "make -C doc doctest" output-format = "colorized" disable = ["E1123", "E1120", "C0301"] generated-members = ["qibolab.native.RxyFactory", "pydantic.fields.FieldInfo"] +# TODO: restore analysis when the support will cover the entier Python range, i.e. it +# will include py3.12 as well +ignored-modules = ["qm", "qualang_tools", "qibosoq"] [tool.pytest.ini_options] testpaths = ['tests/'] From e0dff77cc0c5c6aa957db1c8c6778a7cb69c219b Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 19 Aug 2024 13:30:35 +0200 Subject: [PATCH 0712/1006] test: Import specific module, instead of accessing as parent's attribue Since it could be possibly unregistered there --- tests/test_instruments_qm.py | 2 +- tests/test_instruments_rfsoc.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_instruments_qm.py b/tests/test_instruments_qm.py index ff5ec223e2..658a64abeb 100644 --- a/tests/test_instruments_qm.py +++ b/tests/test_instruments_qm.py @@ -3,7 +3,7 @@ import numpy as np import pytest -qua = pytest.importorskip("qm").qua +qua = pytest.importorskip("qm.qua") # ruff: noqa: E402 from qibolab import AcquisitionType, ExecutionParameters, create_platform diff --git a/tests/test_instruments_rfsoc.py b/tests/test_instruments_rfsoc.py index a3f69b4e5f..d6957a6e9c 100644 --- a/tests/test_instruments_rfsoc.py +++ b/tests/test_instruments_rfsoc.py @@ -5,8 +5,8 @@ import numpy as np import pytest -rfsoc = pytest.importorskip("qibosoq").components.base -rfsoc_pulses = pytest.importorskip("qibosoq").components.pulses +rfsoc = pytest.importorskip("qibosoq.components.base") +rfsoc_pulses = pytest.importorskip("qibosoq.components.pulses") # ruff: noqa: E402 from qibolab import AcquisitionType, AveragingMode, ExecutionParameters, create_platform From 646c3224c761fc4db89464d46c3a943f43f253f3 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 19 Aug 2024 13:36:16 +0200 Subject: [PATCH 0713/1006] docs: Fix mistyped class roles --- src/qibolab/instruments/abstract.py | 2 +- src/qibolab/pulses/pulse.py | 4 ++-- src/qibolab/result.py | 2 +- src/qibolab/sequence.py | 2 +- src/qibolab/unrolling.py | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/qibolab/instruments/abstract.py b/src/qibolab/instruments/abstract.py index 2b6a278de6..10c7f0db24 100644 --- a/src/qibolab/instruments/abstract.py +++ b/src/qibolab/instruments/abstract.py @@ -79,7 +79,7 @@ def play( ) -> dict[int, npt.NDArray]: """Play a pulse sequence and retrieve feedback. - If :cls:`qibolab.sweeper.Sweeper` objects are passed as arguments, they are + If :class:`qibolab.sweeper.Sweeper` objects are passed as arguments, they are executed in real-time. If not possible, an error is raised. Returns a mapping with the id of the probe pulses used to acquired data. diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index fb1b6b40aa..2c3fc4d90d 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -37,7 +37,7 @@ class Pulse(_PulseLike): """The pulse envelope shape. See - :cls:`qibolab.pulses.envelope.Envelopes` for list of available shapes. + :class:`qibolab.pulses.envelope.Envelopes` for list of available shapes. """ relative_phase: float = 0.0 """Relative phase of the pulse, in radians.""" @@ -46,7 +46,7 @@ class Pulse(_PulseLike): def flux(cls, **kwargs): """Construct a flux pulse. - It provides a simplified syntax for the :cls:`Pulse` constructor, by applying + It provides a simplified syntax for the :class:`Pulse` constructor, by applying suitable defaults. """ kwargs["relative_phase"] = 0 diff --git a/src/qibolab/result.py b/src/qibolab/result.py index 5d5ecdaf96..675b8091ec 100644 --- a/src/qibolab/result.py +++ b/src/qibolab/result.py @@ -53,7 +53,7 @@ def average(values: npt.NDArray) -> tuple[npt.NDArray, npt.NDArray]: It returns both the average estimator itself, and its standard deviation estimator. - Use this also for I and Q values in the *standard layout*, cf. :cls:`IQ`. + Use this also for I and Q values in the *standard layout*, cf. :class:`IQ`. """ mean = np.mean(values, axis=0) std = np.std(values, axis=0, ddof=1) / np.sqrt(values.shape[0]) diff --git a/src/qibolab/sequence.py b/src/qibolab/sequence.py index 3009041297..7254c3bc22 100644 --- a/src/qibolab/sequence.py +++ b/src/qibolab/sequence.py @@ -109,7 +109,7 @@ def acquisitions(self) -> list[tuple[ChannelId, Acquisition]]: .. note:: - This selects only the :cls:`Acquisition` events, and not all the + This selects only the :class:`Acquisition` events, and not all the instructions directed to an acquistion channel (i.e. :attr:`ChannelType.ACQUISITION`) """ diff --git a/src/qibolab/unrolling.py b/src/qibolab/unrolling.py index d05deb71a6..efab4d8eb2 100644 --- a/src/qibolab/unrolling.py +++ b/src/qibolab/unrolling.py @@ -82,7 +82,7 @@ def batch(sequences: list[PulseSequence], bounds: Bounds): """Split a list of sequences to batches. Takes into account the various limitations throught the mechanics defined in - :cls:`Bounds`, and the numerical limitations specified by the `bounds` argument. + :class:`Bounds`, and the numerical limitations specified by the `bounds` argument. """ counters = Bounds(waveforms=0, readout=0, instructions=0) batch = [] From 637ec9015ed4d936c8b1bb256aca05f6a6466f90 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 19 Aug 2024 13:42:13 +0200 Subject: [PATCH 0714/1006] docs: Fix blank lines around list --- src/qibolab/components/channels.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/qibolab/components/channels.py b/src/qibolab/components/channels.py index ecd66b8239..d42469ed51 100644 --- a/src/qibolab/components/channels.py +++ b/src/qibolab/components/channels.py @@ -1,13 +1,17 @@ -"""Channels are a specific type of component, that are responsible for +"""Define channels, representing the physical components handling signals. + +Channels are a specific type of component, that are responsible for generating signals. A channel has a name, and it can refer to the names of other components as needed. The default configuration of components should be stored elsewhere (in Platform). By dissecting configuration in smaller pieces and storing them externally (as opposed to storing the channel configuration inside the channel itself) has multiple benefits, that. -all revolve around the fact that channels may have shared components, e.g. - - Some instruments use one LO for more than one channel, - - For some use cases (like qutrit experiments, or CNOT gates), we need to define multiple channels that point to the same physical wire. +All revolve around the fact that channels may have shared components, e.g. + +- some instruments use one LO for more than one channel, +- for some use cases (like qutrit experiments, or CNOT gates), we need to define multiple channels that point to the same physical wire. + If channels contain their configuration, it becomes cumbersome to make sure that user can easily see that some channels have shared components, and changing configuration for one may affect the other as well. By storing component configurations externally we make sure that there is only one copy of configuration for a component, plus users can clearly see when two different channels From 946446d65e0660df4010ea9dc8e0420221c8cde4 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 19 Aug 2024 13:54:36 +0200 Subject: [PATCH 0715/1006] docs: Extend mock imports, for missing py3.12 dependencies --- doc/source/conf.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/doc/source/conf.py b/doc/source/conf.py index 45478d986b..f6b12a04a9 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -37,7 +37,15 @@ # https://stackoverflow.com/questions/56336234/build-fail-sphinx-error-contents-rst-not-found # master_doc = "index" -autodoc_mock_imports = ["qm"] +autodoc_mock_imports = ["icarusq_rfsoc_driver"] +try: + import qibolab.instruments.qm +except ModuleNotFoundError: + autodoc_mock_imports.extend(["qm", "qualang_tools"]) +try: + import qibolab.instruments.rfsoc +except ModuleNotFoundError: + autodoc_mock_imports.extend(["qibosoq"]) # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom From 3e0ed807b1467726ae1c8683e189e6896279270e Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 19 Aug 2024 14:13:46 +0200 Subject: [PATCH 0716/1006] docs: Fix docs warnings and errors --- doc/source/conf.py | 1 + doc/source/index.rst | 12 ++--- src/qibolab/instruments/bluefors.py | 24 +++++---- src/qibolab/instruments/icarusqfpga.py | 4 +- src/qibolab/instruments/qblox/module.py | 20 ++++---- src/qibolab/instruments/qm/controller.py | 4 +- src/qibolab/pulses/envelope.py | 64 ++++++++++++++++++++---- 7 files changed, 90 insertions(+), 39 deletions(-) diff --git a/doc/source/conf.py b/doc/source/conf.py index f6b12a04a9..3e292c9150 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -58,6 +58,7 @@ "sphinx.ext.intersphinx", "recommonmark", "sphinx_copybutton", + "sphinx.ext.todo", "sphinx.ext.viewcode", ] diff --git a/doc/source/index.rst b/doc/source/index.rst index 7a0b2f9069..334386a602 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -12,12 +12,12 @@ Qibolab is the dedicated `Qibo `_ backend for quantum hardware control. This module automates the implementation of quantum circuits on quantum hardware. Qibolab includes: -1. :ref:`Platform API `: support custom allocation of quantum hardware platforms / lab setup. -2. :ref:`Drivers `: supports commercial and open-source firmware for hardware control. -3. :ref:`Arbitrary pulse API `: provide a library of custom pulses for execution through instruments. -4. :ref:`Compiler `: compiles quantum circuits into pulse sequences. -5. :ref:`Quantum Circuit Deployment `: seamlessly deploys quantum circuit models on quantum hardware. -5. :ref:`Emulator `: seamless emulation of quantum hardware based on a emulator backend equipped with various quantum dynamics simulation engines. +#. :ref:`Platform API `: support custom allocation of quantum hardware platforms / lab setup. +#. :ref:`Drivers `: supports commercial and open-source firmware for hardware control. +#. :ref:`Arbitrary pulse API `: provide a library of custom pulses for execution through instruments. +#. :ref:`Compiler `: compiles quantum circuits into pulse sequences. +#. :ref:`Quantum Circuit Deployment `: seamlessly deploys quantum circuit models on quantum hardware. +#. :ref:`Emulator `: seamless emulation of quantum hardware based on a emulator backend equipped with various quantum dynamics simulation engines. Components ---------- diff --git a/src/qibolab/instruments/bluefors.py b/src/qibolab/instruments/bluefors.py index feea38f7b4..b38442ca46 100644 --- a/src/qibolab/instruments/bluefors.py +++ b/src/qibolab/instruments/bluefors.py @@ -9,15 +9,14 @@ class TemperatureController(Instrument): """Bluefors temperature controller. - ``` - # Example usage - if __name__ == "__main__": - tc = TemperatureController("XLD1000_Temperature_Controller", "192.168.0.114", 8888) - tc.connect() - temperature_values = tc.read_data() - for temperature_value in temperature_values: - print(temperature_value) - ``` + Example usage:: + + if __name__ == "__main__": + tc = TemperatureController("XLD1000_Temperature_Controller", "192.168.0.114", 8888) + tc.connect() + temperature_values = tc.read_data() + for temperature_value in temperature_values: + print(temperature_value) """ def __init__(self, name: str, address: str, port: int = 8888): @@ -53,9 +52,12 @@ def setup(self): def get_data(self) -> dict[str, dict[str, float]]: """Connect to the socket and get temperature data. - The typical message looks like this: + The typical message looks like this:: + flange_name: {'temperature':12.345678, 'timestamp':1234567890.123456} - `timestamp` can be converted to datetime using `datetime.fromtimestamp`. + + ``timestamp`` can be converted to datetime using ``datetime.fromtimestamp``. + Returns: message (dict[str, dict[str, float]]): socket message in this format: {"flange_name": {'temperature': , 'timestamp':}} diff --git a/src/qibolab/instruments/icarusqfpga.py b/src/qibolab/instruments/icarusqfpga.py index 87f00c16bf..50120ca2b3 100644 --- a/src/qibolab/instruments/icarusqfpga.py +++ b/src/qibolab/instruments/icarusqfpga.py @@ -79,7 +79,7 @@ def play( Arguments: qubits (dict): Dictionary of qubit IDs mapped to qubit objects. sequence (PulseSequence): Pulse sequence to be played on this instrument. - options (ExecutionParameters): Execution parameters for readout and repetition. + options (qibolab.ExecutionParameters): Execution parameters for readout and repetition. """ waveform_array = {dac.id: np.zeros(dac.max_samples) for dac in self.device.dac} @@ -246,7 +246,7 @@ def play( Arguments: qubits (dict): Dictionary of qubit IDs mapped to qubit objects. sequence (PulseSequence): Pulse sequence to be played on this instrument. - options (ExecutionParameters): Object representing acquisition type and number of shots. + options (qibolab.ExecutionParameters): Object representing acquisition type and number of shots. """ super().play(qubits, couplers, sequence, options) self.device.set_adc_trigger_repetition_rate(int(options.relaxation_time / 1e3)) diff --git a/src/qibolab/instruments/qblox/module.py b/src/qibolab/instruments/qblox/module.py index 10b2c8b4fe..7e6f25b8e3 100644 --- a/src/qibolab/instruments/qblox/module.py +++ b/src/qibolab/instruments/qblox/module.py @@ -42,15 +42,17 @@ def ports(self, name: str, out: bool = True): Returns this port object. - Example: - >>> qrm_module = QrmRf("qrm_rf", f"{IP_ADDRESS}:{SLOT_IDX}") - >>> output_port = qrm_module.add_port("o1") - >>> input_port = qrm_module.add_port("i1", out=False) - >>> qrm_module.ports - { - 'o1': QbloxOutputPort(module=qrm_module, port_number=0, port_name='o1'), - 'i1': QbloxInputPort(module=qrm_module, port_number=0, port_name='i1') - } + Example:: + + qrm_module = QrmRf("qrm_rf", f"{IP_ADDRESS}:{SLOT_IDX}") + output_port = qrm_module.add_port("o1") + input_port = qrm_module.add_port("i1", out=False) + qrm_module.ports + + # { + # 'o1': QbloxOutputPort(module=qrm_module, port_number=0, port_name='o1'), + # 'i1': QbloxInputPort(module=qrm_module, port_number=0, port_name='i1') + # } """ def count(cls): diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 17d421c648..663fe623f4 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -120,8 +120,8 @@ class QmController(Controller): Playing pulses on QM controllers requires a ``config`` dictionary and a program written in QUA language. The ``config`` file is generated using the ``dataclass`` objects defined in - :py_mod:`qibolab.instruments.qm.config`. - The QUA program is generated using the methods in :py_mod:`qibolab.instruments.qm.program`. + :mod:`qibolab.instruments.qm.config`. + The QUA program is generated using the methods in :mod:`qibolab.instruments.qm.program`. Controllers, elements and pulses are added in the ``config`` after a pulse sequence is given, so that only elements related to the participating channels are registered. """ diff --git a/src/qibolab/pulses/envelope.py b/src/qibolab/pulses/envelope.py index 2a1eff6203..0eb06cae3b 100644 --- a/src/qibolab/pulses/envelope.py +++ b/src/qibolab/pulses/envelope.py @@ -177,7 +177,12 @@ class Drag(BaseEnvelope): In units of the interval duration. """ beta: float - """.. todo::""" + """Beta. + + .. todo:: + + Add docstring + """ def i(self, samples: int) -> Waveform: """Generate a Gaussian envelope.""" @@ -187,6 +192,8 @@ def q(self, samples: int) -> Waveform: """Generate ... .. todo:: + + Add docstring """ ts = np.arange(samples) mu = (samples - 1) / 2 @@ -221,15 +228,29 @@ def _data(self, target: npt.NDArray) -> npt.NDArray: return data def i(self, samples: int) -> Waveform: - """.. todo::""" + """I. + + .. todo:: + + Add docstring + """ return self._data(self.target.i(samples)) def q(self, samples: int) -> Waveform: - """.. todo::""" + """Q. + .. todo:: + + Add docstring + """ return self._data(self.target.q(samples)) def __eq__(self, other) -> bool: - """.. todo::""" + """Eq. + + .. todo:: + + Add docstring + """ return eq(self, other) @@ -252,7 +273,12 @@ class Snz(BaseEnvelope): """Relative B amplitude (wrt A).""" def i(self, samples: int) -> Waveform: - """.. todo::""" + """I. + + .. todo:: + + Add docstring + """ # convert timings to samples half_pulse_duration = (1 - self.t_idling) * samples / 2 aspan = np.sum(np.arange(samples) < half_pulse_duration) @@ -285,7 +311,12 @@ class ECap(BaseEnvelope): """In units of the inverse interval duration.""" def i(self, samples: int) -> Waveform: - """.. todo::""" + """I. + + .. todo:: + + Add docstring + """ ss = np.arange(samples) x = ss / samples return ( @@ -310,21 +341,36 @@ class Custom(BaseEnvelope): q_: npt.NDArray def i(self, samples: int) -> Waveform: - """.. todo::""" + """I. + + .. todo:: + + Add docstring + """ if len(self.i_) != samples: raise ValueError return self.i_ def q(self, samples: int) -> Waveform: - """.. todo::""" + """Q. + + .. todo:: + + Add docstring + """ if len(self.q_) != samples: raise ValueError return self.q_ def __eq__(self, other) -> bool: - """.. todo::""" + """Eq. + + .. todo:: + + Add docstring + """ return eq(self, other) From c287813f7a5e7bb20e2176eef51d48a959bfe890 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 13 Aug 2024 15:21:18 +0400 Subject: [PATCH 0717/1006] feat: find channel from pulse.id --- src/qibolab/sequence.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/qibolab/sequence.py b/src/qibolab/sequence.py index 35a50d6ce1..306ccff2a0 100644 --- a/src/qibolab/sequence.py +++ b/src/qibolab/sequence.py @@ -71,6 +71,13 @@ def channel_duration(self, channel: ChannelId) -> float: """Duration of the given channel.""" return sum(pulse.duration for pulse in self.channel(channel)) + def pulse_channel(self, pulse_id: int) -> ChannelId: + """Find channel on which a pulse with a given id plays.""" + for channel, pulse in self: + if pulse.id == pulse_id: + return channel + raise ValueError(f"Pulse with id {pulse_id} does not exist in the sequence.") + def concatenate(self, other: "PulseSequence") -> None: """Juxtapose two sequences. From b348c85d84e95f0ea518b3dc7009b6859b2a2b41 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 13 Aug 2024 15:21:57 +0400 Subject: [PATCH 0718/1006] refactor: modify QM duration sweeps to upload multiple waveforms --- src/qibolab/instruments/qm/controller.py | 75 ++++++++++++------- .../instruments/qm/program/__init__.py | 1 + .../instruments/qm/program/arguments.py | 5 +- .../instruments/qm/program/instructions.py | 30 +++++--- 4 files changed, 71 insertions(+), 40 deletions(-) diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index fda8cccd27..8942faf738 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -17,12 +17,12 @@ from qibolab.instruments.abstract import Controller from qibolab.pulses.pulse import Acquisition, Delay, VirtualZ, _Readout from qibolab.sequence import PulseSequence -from qibolab.sweeper import ParallelSweepers, Parameter +from qibolab.sweeper import ParallelSweepers, Parameter, Sweeper from qibolab.unrolling import Bounds from .components import QmChannel from .config import SAMPLING_RATE, QmConfig, operation -from .program import create_acquisition, program +from .program import ExecutionArguments, create_acquisition, program OCTAVE_ADDRESS_OFFSET = 11000 """Offset to be added to Octave addresses, because they must be 11xxx, where @@ -112,6 +112,11 @@ def fetch_results(result, acquisitions): } +def find_duration_sweepers(sweepers: list[ParallelSweepers]) -> list[Sweeper]: + """Find duration sweepers in order to register multiple pulses.""" + return [s for ps in sweepers for s in ps if s.parameter is Parameter.duration] + + @dataclass class QmController(Controller): """:class:`qibolab.instruments.abstract.Controller` object for controlling @@ -291,31 +296,41 @@ def configure_channels( channel = self.channels[str(channel_id)] self.configure_channel(channel, configs) - def register_pulses(self, configs: dict[str, Config], sequence: PulseSequence): - """Adds all pulses except measurements of a given sequence in the QM - ``config``. + def register_pulse(self, channel: Channel, pulse: Pulse) -> str: + """Add pulse in the QM ``config`` and return corresponding + operation.""" + # if ( + # pulse.duration % 4 != 0 + # or pulse.duration < 16 + # or pulse.id in pulses_to_bake + # ): + # qmpulse = BakedPulse(pulse, element) + # qmpulse.bake(self.config, durations=[pulse.duration]) + # else: + if isinstance(channel, DcChannel): + return self.config.register_dc_pulse(channel.name, pulse) + if channel.acquisition is None: + return self.config.register_iq_pulse(channel.name, pulse) + return self.config.register_acquisition_pulse(channel.name, pulse) + + def register_duration_sweeper_pulses( + self, args: ExecutionArguments, sweeper: Sweeper + ): + """Register pulse with many different durations, in order to sweep + duration.""" + for pulse in sweeper.pulses: + if isinstance(pulse, Delay): + continue - Returns: - acquisitions (dict): Map from measurement instructions to acquisition objects. - """ - for channel_id, pulse in sequence: - if not isinstance(pulse, (Acquisition, Delay, VirtualZ)): - name = str(channel_id) - channel = self.channels[name].logical_channel - # if ( - # pulse.duration % 4 != 0 - # or pulse.duration < 16 - # or pulse.id in pulses_to_bake - # ): - # qmpulse = BakedPulse(pulse, element) - # qmpulse.bake(self.config, durations=[pulse.duration]) - # else: - if isinstance(channel, DcChannel): - self.config.register_dc_pulse(name, pulse) - elif channel.acquisition is None: - self.config.register_iq_pulse(name, pulse) - - def register_acquisitions( + op = operation(pulse) + channel_name = args.sequence.pulse_channel(pulse.id) + channel = self.channels[channel_name].logical_channel + for value in sweeper.values: + sweep_pulse = pulse.model_copy(updates={"duration": value}) + sweep_op = self.register_pulse(channel, new_pulse) + args.parameters[op].pulses.append((value, sweep_op)) + + def register_pulses( self, configs: dict[str, Config], sequence: PulseSequence, @@ -395,7 +410,13 @@ def play( self.configure_channels(configs, sequence.channels) self.register_pulses(configs, sequence) acquisitions = self.register_acquisitions(configs, sequence, options) - experiment = program(configs, sequence, options, acquisitions, sweepers) + + args = ExecutionArguments(sequence, acquisitions, options.relaxation_time) + + for sweeper in find_duration_sweepers(sweepers): + self.register_duration_sweeper_pulses(args, sweeper) + + experiment = program(configs, args, options, sweepers) if self.manager is None: warnings.warn( diff --git a/src/qibolab/instruments/qm/program/__init__.py b/src/qibolab/instruments/qm/program/__init__.py index 98e99fbe59..e4fc749212 100644 --- a/src/qibolab/instruments/qm/program/__init__.py +++ b/src/qibolab/instruments/qm/program/__init__.py @@ -1,2 +1,3 @@ from .acquisition import Acquisitions, create_acquisition +from .arguments import ExecutionArguments from .instructions import program diff --git a/src/qibolab/instruments/qm/program/arguments.py b/src/qibolab/instruments/qm/program/arguments.py index f0059c1499..b6c9788c50 100644 --- a/src/qibolab/instruments/qm/program/arguments.py +++ b/src/qibolab/instruments/qm/program/arguments.py @@ -6,7 +6,7 @@ from qibolab.sequence import PulseSequence -from .acquisition import Acquisition +from .acquisition import Acquisitions @dataclass @@ -16,6 +16,7 @@ class Parameters: duration: Optional[_Variable] = None amplitude: Optional[_Variable] = None phase: Optional[_Variable] = None + pulses: list[str] = field(default_factory=list) @dataclass @@ -27,7 +28,7 @@ class ExecutionArguments: """ sequence: PulseSequence - acquisitions: dict[tuple[str, str], Acquisition] + acquisitions: Acquisitions relaxation_time: int = 0 parameters: dict[str, Parameters] = field( default_factory=lambda: defaultdict(Parameters) diff --git a/src/qibolab/instruments/qm/program/instructions.py b/src/qibolab/instruments/qm/program/instructions.py index dbc1fead84..e82e26db99 100644 --- a/src/qibolab/instruments/qm/program/instructions.py +++ b/src/qibolab/instruments/qm/program/instructions.py @@ -6,12 +6,11 @@ from qibolab.components import Config from qibolab.execution_parameters import AcquisitionType, ExecutionParameters -from qibolab.pulses import Delay, Pulse -from qibolab.sequence import PulseSequence +from qibolab.pulses import Delay from qibolab.sweeper import ParallelSweepers from ..config import operation -from .acquisition import Acquisition, Acquisitions +from .acquisition import Acquisition from .arguments import ExecutionArguments, Parameters from .sweepers import INT_TYPE, NORMALIZERS, SWEEPER_METHODS @@ -25,6 +24,14 @@ def _delay(pulse: Delay, element: str, parameters: Parameters): qua.wait(duration, element) +def _play_multiple_waveforms(element: str, parameters: Parameters): + """Sweeping pulse duration using distinctly uploaded waveforms.""" + with qua.switch_(parameters.duration): + for value, sweep_op in parameters.pulses: + with qua.case_(value): + qua.play(sweep_op, element) + + def _play( op: str, element: str, @@ -36,10 +43,13 @@ def _play( if parameters.amplitude is not None: op = op * parameters.amplitude - if acquisition is not None: - acquisition.measure(op) + if len(parameters.pulses) > 0: + _play_multiple_waveforms(element, parameters) else: - qua.play(op, element, duration=parameters.duration) + if acquisition is not None: + acquisition.measure(op) + else: + qua.play(op, element, duration=parameters.duration) if parameters.phase is not None: qua.reset_frame(element) @@ -110,25 +120,23 @@ def sweep( def program( configs: dict[str, Config], - sequence: PulseSequence, + args: ExecutionArguments, options: ExecutionParameters, - acquisitions: Acquisitions, sweepers: list[ParallelSweepers], ): """QUA program implementing the required experiment.""" with qua.program() as experiment: n = declare(int) # declare acquisition variables - for acquisition in acquisitions.values(): + for acquisition in args.acquisitions.values(): acquisition.declare() # execute pulses - args = ExecutionArguments(sequence, acquisitions, options.relaxation_time) with for_(n, 0, n < options.nshots, n + 1): sweep(list(sweepers), configs, args) # download acquisitions has_iq = options.acquisition_type is AcquisitionType.INTEGRATION buffer_dims = options.results_shape(sweepers)[::-1][int(has_iq) :] with qua.stream_processing(): - for acquisition in acquisitions.values(): + for acquisition in args.acquisitions.values(): acquisition.download(*buffer_dims) return experiment From fb34c91adfc8697cb649029671018c38555cad01 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 13 Aug 2024 15:27:08 +0400 Subject: [PATCH 0719/1006] fix: pylint --- src/qibolab/instruments/qm/controller.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 8942faf738..c5b274d39a 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -327,7 +327,7 @@ def register_duration_sweeper_pulses( channel = self.channels[channel_name].logical_channel for value in sweeper.values: sweep_pulse = pulse.model_copy(updates={"duration": value}) - sweep_op = self.register_pulse(channel, new_pulse) + sweep_op = self.register_pulse(channel, sweep_pulse) args.parameters[op].pulses.append((value, sweep_op)) def register_pulses( From 49b2a965e26fcdd91d1f28687bdfb9725752ab72 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 13 Aug 2024 18:32:05 +0400 Subject: [PATCH 0720/1006] fix: updates to update --- src/qibolab/instruments/qm/controller.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index c5b274d39a..9baa970f17 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -326,7 +326,7 @@ def register_duration_sweeper_pulses( channel_name = args.sequence.pulse_channel(pulse.id) channel = self.channels[channel_name].logical_channel for value in sweeper.values: - sweep_pulse = pulse.model_copy(updates={"duration": value}) + sweep_pulse = pulse.model_copy(update={"duration": value}) sweep_op = self.register_pulse(channel, sweep_pulse) args.parameters[op].pulses.append((value, sweep_op)) From 21f2eeb77c7d1d3e52b957cae860c609564b5475 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 13 Aug 2024 20:35:49 +0400 Subject: [PATCH 0721/1006] chore: drop hash replacement in debug script --- src/qibolab/instruments/qm/controller.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 9baa970f17..b8b70568b2 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -426,8 +426,6 @@ def play( if self.script_file_name is not None: script = generate_qua_script(experiment, asdict(self.config)) - for _, pulse in sequence: - script = script.replace(operation(pulse), str(pulse)) with open(self.script_file_name, "w") as file: file.write(script) From eea337ba9b6948f56ef38386be1702d4a772469a Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 13 Aug 2024 20:36:05 +0400 Subject: [PATCH 0722/1006] fix: pad delays with one clock cycle --- src/qibolab/instruments/qm/program/instructions.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/qibolab/instruments/qm/program/instructions.py b/src/qibolab/instruments/qm/program/instructions.py index e82e26db99..2811ecf95a 100644 --- a/src/qibolab/instruments/qm/program/instructions.py +++ b/src/qibolab/instruments/qm/program/instructions.py @@ -18,17 +18,17 @@ def _delay(pulse: Delay, element: str, parameters: Parameters): # TODO: How to play delays on multiple elements? if parameters.duration is None: - duration = int(pulse.duration) // 4 + 1 + duration = int(pulse.duration) // 4 else: duration = parameters.duration - qua.wait(duration, element) + qua.wait(duration + 1, element) def _play_multiple_waveforms(element: str, parameters: Parameters): """Sweeping pulse duration using distinctly uploaded waveforms.""" - with qua.switch_(parameters.duration): + with qua.switch_(parameters.duration, unsafe=True): for value, sweep_op in parameters.pulses: - with qua.case_(value): + with qua.case_(value // 4): qua.play(sweep_op, element) From 66a078fc9c82ef87900af0102516885652ba88dc Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 13 Aug 2024 20:54:15 +0400 Subject: [PATCH 0723/1006] fix: type of Parameters.pulses list --- src/qibolab/instruments/qm/program/arguments.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibolab/instruments/qm/program/arguments.py b/src/qibolab/instruments/qm/program/arguments.py index b6c9788c50..13637e2be2 100644 --- a/src/qibolab/instruments/qm/program/arguments.py +++ b/src/qibolab/instruments/qm/program/arguments.py @@ -16,7 +16,7 @@ class Parameters: duration: Optional[_Variable] = None amplitude: Optional[_Variable] = None phase: Optional[_Variable] = None - pulses: list[str] = field(default_factory=list) + pulses: list[tuple[float, str]] = field(default_factory=list) @dataclass From 0c84474374426a37217252103d87fe64fbc0e001 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Wed, 21 Aug 2024 14:35:27 +0300 Subject: [PATCH 0724/1006] feat: Implement Align command for sequence --- .../instruments/qm/program/instructions.py | 16 ++++++- .../instruments/qm/program/sweepers.py | 7 ++- src/qibolab/pulses/__init__.py | 2 +- src/qibolab/pulses/pulse.py | 6 ++- src/qibolab/sequence.py | 43 ++++++++++++++++++- 5 files changed, 68 insertions(+), 6 deletions(-) diff --git a/src/qibolab/instruments/qm/program/instructions.py b/src/qibolab/instruments/qm/program/instructions.py index 2811ecf95a..04480af8a5 100644 --- a/src/qibolab/instruments/qm/program/instructions.py +++ b/src/qibolab/instruments/qm/program/instructions.py @@ -6,13 +6,13 @@ from qibolab.components import Config from qibolab.execution_parameters import AcquisitionType, ExecutionParameters -from qibolab.pulses import Delay +from qibolab.pulses import Align, Delay, Pulse, VirtualZ from qibolab.sweeper import ParallelSweepers from ..config import operation from .acquisition import Acquisition from .arguments import ExecutionArguments, Parameters -from .sweepers import INT_TYPE, NORMALIZERS, SWEEPER_METHODS +from .sweepers import INT_TYPE, NORMALIZERS, SWEEPER_METHODS, normalize_phase def _delay(pulse: Delay, element: str, parameters: Parameters): @@ -61,6 +61,12 @@ def play(args: ExecutionArguments): Should be used inside a ``program()`` context. """ qua.align() + + # keep track of ``Align`` command that were already played + # because the same ``Align`` will appear on multiple channels + # in the sequence + played_aligns = set() + for channel_id, pulse in args.sequence: element = str(channel_id) op = operation(pulse) @@ -70,6 +76,12 @@ def play(args: ExecutionArguments): elif isinstance(pulse, Pulse): acquisition = args.acquisitions.get((op, element)) _play(op, element, params, acquisition) + elif isinstance(pulse, VirtualZ): + qua.frame_rotation_2pi(normalize_phase(pulse.phase), element) + elif isinstance(pulse, Align) and pulse.id not in played_aligns: + elements = args.sequence.pulse_channels(pulse.id) + qua.align(*elements) + played_aligns.add(pulse.id) if args.relaxation_time > 0: qua.wait(args.relaxation_time // 4) diff --git a/src/qibolab/instruments/qm/program/sweepers.py b/src/qibolab/instruments/qm/program/sweepers.py index ab608051a9..0d0177a641 100644 --- a/src/qibolab/instruments/qm/program/sweepers.py +++ b/src/qibolab/instruments/qm/program/sweepers.py @@ -150,6 +150,11 @@ def _duration( args.parameters[operation(pulse)].duration = variable +def normalize_phase(phase): + """Normalize phase from [0, 2pi] to [0, 1].""" + return phase / (2 * np.pi) + + INT_TYPE = {Parameter.frequency, Parameter.duration} """Sweeper parameters for which we need ``int`` variable type. @@ -157,7 +162,7 @@ def _duration( """ NORMALIZERS = { - Parameter.relative_phase: lambda values: values / (2 * np.pi), + Parameter.relative_phase: normalize_phase, Parameter.duration: lambda values: (values // 4).astype(int), } """Functions to normalize sweeper values. diff --git a/src/qibolab/pulses/__init__.py b/src/qibolab/pulses/__init__.py index d88234dad7..9f7efc42cb 100644 --- a/src/qibolab/pulses/__init__.py +++ b/src/qibolab/pulses/__init__.py @@ -1,2 +1,2 @@ from .envelope import * -from .pulse import Acquisition, Delay, Pulse, PulseLike, VirtualZ +from .pulse import Align, Acquisition, Delay, Pulse, PulseLike, VirtualZ diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index 2c3fc4d90d..d7017a019d 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -138,6 +138,10 @@ def id(self) -> int: return self.acquisition.id +class Align(_PulseLike): + """Brings different channels at the same point in time.""" + + PulseLike = Annotated[ - Union[Pulse, Delay, VirtualZ, Acquisition, _Readout], Field(discriminator="kind") + Union[Align, Pulse, Delay, VirtualZ, Acquisition, _Readout], Field(discriminator="kind") ] diff --git a/src/qibolab/sequence.py b/src/qibolab/sequence.py index 306ccff2a0..43080ab06d 100644 --- a/src/qibolab/sequence.py +++ b/src/qibolab/sequence.py @@ -11,7 +11,7 @@ from qibolab.pulses.pulse import Pulse, _Readout from .identifier import ChannelId, ChannelType -from .pulses import Acquisition, Delay, PulseLike +from .pulses import Align, Acquisition, Delay, PulseLike __all__ = ["PulseSequence"] @@ -71,6 +71,7 @@ def channel_duration(self, channel: ChannelId) -> float: """Duration of the given channel.""" return sum(pulse.duration for pulse in self.channel(channel)) + # TODO: Drop ``pulse_channel`` in favor of ``pulse_channels`` def pulse_channel(self, pulse_id: int) -> ChannelId: """Find channel on which a pulse with a given id plays.""" for channel, pulse in self: @@ -78,6 +79,15 @@ def pulse_channel(self, pulse_id: int) -> ChannelId: return channel raise ValueError(f"Pulse with id {pulse_id} does not exist in the sequence.") + def pulse_channels(self, pulse_id: int) -> ChannelId: + """Find channels on which a pulse with a given id plays.""" + channels = [channel for channel, pulse in self if pulse.id == pulse_id] + if len(channels) == 0: + raise ValueError( + f"Pulse with id {pulse_id} does not exist in the sequence." + ) + return channels + def concatenate(self, other: "PulseSequence") -> None: """Juxtapose two sequences. @@ -94,6 +104,37 @@ def concatenate(self, other: "PulseSequence") -> None: self.append((ch, Delay(duration=delay))) self.extend(other) + def align(self, channels: list[ChannelId]) -> Align: + """Introduce align commands to the sequence.""" + align = Align() + for channel in channels: + self.append((channel, align)) + return align + + def align_to_delays(self) -> "PulseSequence": + """Compile align commands to delays.""" + + # keep track of ``Align`` command that were already played + # because the same ``Align`` will appear on multiple channels + # in the sequence + processed_aligns = set() + + new = type(self)() + for channel, pulse in self: + if isinstance(pulse, Align): + if pulse.id not in processed_aligns: + channels = self.pulse_channels(pulse.id) + durations = {ch: new.channel_duration(ch) for ch in channels} + max_duration = max(durations.values(), default=0.0) + for ch, duration in durations.items(): + delay = max_duration - duration + if delay > 0: + new.append((ch, Delay(delay))) + processed_aligns.add(pulse.id) + else: + new.append((channel, pulse)) + return new + def trim(self) -> "PulseSequence": """Drop final delays. From 427f48d2b1aaf0e0afed58ee491891c43d065c40 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Wed, 21 Aug 2024 15:01:10 +0300 Subject: [PATCH 0725/1006] chore: reduce code repetition and add test --- src/qibolab/instruments/qm/controller.py | 2 +- .../instruments/qm/program/instructions.py | 6 +-- src/qibolab/sequence.py | 35 ++++++------- tests/test_sequence.py | 50 +++++++++++++++++++ 4 files changed, 69 insertions(+), 24 deletions(-) diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index b8b70568b2..d63a733d42 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -323,7 +323,7 @@ def register_duration_sweeper_pulses( continue op = operation(pulse) - channel_name = args.sequence.pulse_channel(pulse.id) + channel_name = args.sequence.pulse_channels(pulse.id)[0] channel = self.channels[channel_name].logical_channel for value in sweeper.values: sweep_pulse = pulse.model_copy(update={"duration": value}) diff --git a/src/qibolab/instruments/qm/program/instructions.py b/src/qibolab/instruments/qm/program/instructions.py index 04480af8a5..f663681d91 100644 --- a/src/qibolab/instruments/qm/program/instructions.py +++ b/src/qibolab/instruments/qm/program/instructions.py @@ -65,7 +65,7 @@ def play(args: ExecutionArguments): # keep track of ``Align`` command that were already played # because the same ``Align`` will appear on multiple channels # in the sequence - played_aligns = set() + processed_aligns = set() for channel_id, pulse in args.sequence: element = str(channel_id) @@ -78,10 +78,10 @@ def play(args: ExecutionArguments): _play(op, element, params, acquisition) elif isinstance(pulse, VirtualZ): qua.frame_rotation_2pi(normalize_phase(pulse.phase), element) - elif isinstance(pulse, Align) and pulse.id not in played_aligns: + elif isinstance(pulse, Align) and pulse.id not in processed_aligns: elements = args.sequence.pulse_channels(pulse.id) qua.align(*elements) - played_aligns.add(pulse.id) + processed_aligns.add(pulse.id) if args.relaxation_time > 0: qua.wait(args.relaxation_time // 4) diff --git a/src/qibolab/sequence.py b/src/qibolab/sequence.py index 43080ab06d..35168a88d2 100644 --- a/src/qibolab/sequence.py +++ b/src/qibolab/sequence.py @@ -18,6 +18,19 @@ _Element = tuple[ChannelId, PulseLike] +def _synchronize(sequence: "PulseSequence", channels: Iterable[ChannelId]) -> None: + """Helper for ``concatenate`` and ``align_to_delays``. + + Modifies given ``sequence`` in-place! + """ + durations = {ch: sequence.channel_duration(ch) for ch in channels} + max_duration = max(durations.values(), default=0.0) + for ch, duration in durations.items(): + delay = max_duration - duration + if delay > 0: + sequence.append((ch, Delay(duration=delay))) + + class PulseSequence(UserList[_Element]): """Synchronized sequence of control instructions across multiple channels. @@ -71,14 +84,6 @@ def channel_duration(self, channel: ChannelId) -> float: """Duration of the given channel.""" return sum(pulse.duration for pulse in self.channel(channel)) - # TODO: Drop ``pulse_channel`` in favor of ``pulse_channels`` - def pulse_channel(self, pulse_id: int) -> ChannelId: - """Find channel on which a pulse with a given id plays.""" - for channel, pulse in self: - if pulse.id == pulse_id: - return channel - raise ValueError(f"Pulse with id {pulse_id} does not exist in the sequence.") - def pulse_channels(self, pulse_id: int) -> ChannelId: """Find channels on which a pulse with a given id plays.""" channels = [channel for channel, pulse in self if pulse.id == pulse_id] @@ -96,12 +101,7 @@ def concatenate(self, other: "PulseSequence") -> None: - necessary delays to synchronize channels - ``other`` """ - durations = {ch: self.channel_duration(ch) for ch in other.channels} - max_duration = max(durations.values(), default=0.0) - for ch, duration in durations.items(): - delay = max_duration - duration - if delay > 0: - self.append((ch, Delay(duration=delay))) + _synchronize(self, other.channels) self.extend(other) def align(self, channels: list[ChannelId]) -> Align: @@ -124,12 +124,7 @@ def align_to_delays(self) -> "PulseSequence": if isinstance(pulse, Align): if pulse.id not in processed_aligns: channels = self.pulse_channels(pulse.id) - durations = {ch: new.channel_duration(ch) for ch in channels} - max_duration = max(durations.values(), default=0.0) - for ch, duration in durations.items(): - delay = max_duration - duration - if delay > 0: - new.append((ch, Delay(delay))) + _synchronize(new, channels) processed_aligns.add(pulse.id) else: new.append((channel, pulse)) diff --git a/tests/test_sequence.py b/tests/test_sequence.py index fa305d92c4..708c88fcc1 100644 --- a/tests/test_sequence.py +++ b/tests/test_sequence.py @@ -178,6 +178,56 @@ def test_copy(): assert "ch3" not in sequence +def test_align_to_delay(): + sequence = PulseSequence( + [ + ( + "ch1", + Pulse(duration=40, amplitude=0.9, envelope=Drag(rel_sigma=0.2, beta=1)), + ), + ( + "ch1", + Delay(duration=20), + ), + ( + "ch1", + Pulse(duration=40, amplitude=0.9, envelope=Drag(rel_sigma=0.2, beta=1)), + ), + ( + "ch2", + Pulse(duration=60, amplitude=0.9, envelope=Drag(rel_sigma=0.2, beta=1)), + ), + ( + "ch2", + Pulse(duration=80, amplitude=0.9, envelope=Drag(rel_sigma=0.2, beta=1)), + ), + ] + ) + sequence.align(["ch1", "ch2"]) + sequence.append( + ( + "ch1", + Pulse(duration=20, amplitude=0.1, envelope=Gaussian(rel_sigma=3)), + ) + ) + sequence.append( + ( + "ch2", + Pulse(duration=30, amplitude=0.1, envelope=Gaussian(rel_sigma=3)), + ) + ) + + delay_sequence = sequence.align_to_delays() + assert len(delay_sequence) == len(sequence) - 1 + for (ch1, p1), (ch2, p2) in zip(sequence[:5], delay_sequence[:5]): + assert ch1 == ch2 + assert p1 is p2 + assert delay_sequence[5] == ("ch1", Delay(duration=40)) + for (ch1, p1), (ch2, p2) in zip(sequence[7:], delay_sequence[6:]): + assert ch1 == ch2 + assert p1 is p2 + + def test_trim(): p = Pulse(duration=40, amplitude=0.9, envelope=Rectangular()) d = Delay(duration=10) From 431ed6e85be4d652e9c7fa9720a323b297eb5915 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Wed, 21 Aug 2024 20:10:05 +0300 Subject: [PATCH 0726/1006] chore: review comments --- src/qibolab/pulses/plot.py | 2 ++ src/qibolab/sequence.py | 9 ++------- tests/test_sequence.py | 5 +++++ 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/qibolab/pulses/plot.py b/src/qibolab/pulses/plot.py index bf881d9728..e3c802c315 100644 --- a/src/qibolab/pulses/plot.py +++ b/src/qibolab/pulses/plot.py @@ -143,6 +143,8 @@ def sequence(ps: PulseSequence, freq: dict[str, float], filename=None): import matplotlib.pyplot as plt from matplotlib import gridspec + # compile ``Align`` to delays as it is not supported here + ps = ps.align_to_delays() num_pulses = len(ps) _ = plt.figure(figsize=(14, 2 * num_pulses), dpi=200) gs = gridspec.GridSpec(ncols=1, nrows=num_pulses) diff --git a/src/qibolab/sequence.py b/src/qibolab/sequence.py index 35168a88d2..55983989b5 100644 --- a/src/qibolab/sequence.py +++ b/src/qibolab/sequence.py @@ -84,14 +84,9 @@ def channel_duration(self, channel: ChannelId) -> float: """Duration of the given channel.""" return sum(pulse.duration for pulse in self.channel(channel)) - def pulse_channels(self, pulse_id: int) -> ChannelId: + def pulse_channels(self, pulse_id: int) -> list[ChannelId]: """Find channels on which a pulse with a given id plays.""" - channels = [channel for channel, pulse in self if pulse.id == pulse_id] - if len(channels) == 0: - raise ValueError( - f"Pulse with id {pulse_id} does not exist in the sequence." - ) - return channels + return [channel for channel, pulse in self if pulse.id == pulse_id] def concatenate(self, other: "PulseSequence") -> None: """Juxtapose two sequences. diff --git a/tests/test_sequence.py b/tests/test_sequence.py index 708c88fcc1..5fafb0f8bf 100644 --- a/tests/test_sequence.py +++ b/tests/test_sequence.py @@ -226,6 +226,11 @@ def test_align_to_delay(): for (ch1, p1), (ch2, p2) in zip(sequence[7:], delay_sequence[6:]): assert ch1 == ch2 assert p1 is p2 + # assert that pulses after align start simultaneously + sequence_without_last = PulseSequence(delay_sequence[:-2]) + ch1_start = sequence_without_last.channel_duration("ch1") + ch2_start = sequence_without_last.channel_duration("ch2") + assert ch1_start == ch2_start def test_trim(): From b4fc45c22f6175f0886918f135a6ce99cecd20ff Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 22 Aug 2024 18:48:30 +0300 Subject: [PATCH 0727/1006] chore: drop `PulseSequence` when slicing Co-authored-by: Alessandro Candido --- tests/test_sequence.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_sequence.py b/tests/test_sequence.py index 5fafb0f8bf..6fc25df0eb 100644 --- a/tests/test_sequence.py +++ b/tests/test_sequence.py @@ -227,7 +227,7 @@ def test_align_to_delay(): assert ch1 == ch2 assert p1 is p2 # assert that pulses after align start simultaneously - sequence_without_last = PulseSequence(delay_sequence[:-2]) + sequence_without_last = delay_sequence[:-2] ch1_start = sequence_without_last.channel_duration("ch1") ch2_start = sequence_without_last.channel_duration("ch2") assert ch1_start == ch2_start From 46d1a8bb1662b3cd66c9609d82bc849b121eb416 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 22 Aug 2024 19:18:49 +0300 Subject: [PATCH 0728/1006] feat: add duration interpolated sweeper --- src/qibolab/instruments/qm/program/sweepers.py | 1 + src/qibolab/sweeper.py | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/qibolab/instruments/qm/program/sweepers.py b/src/qibolab/instruments/qm/program/sweepers.py index 0d0177a641..e27daecc4d 100644 --- a/src/qibolab/instruments/qm/program/sweepers.py +++ b/src/qibolab/instruments/qm/program/sweepers.py @@ -174,6 +174,7 @@ def normalize_phase(phase): Parameter.frequency: _frequency, Parameter.amplitude: _amplitude, Parameter.duration: _duration, + Parameter.duration_interpolated: _duration, Parameter.relative_phase: _relative_phase, Parameter.bias: _bias, } diff --git a/src/qibolab/sweeper.py b/src/qibolab/sweeper.py index b0792c4b56..12daf5502e 100644 --- a/src/qibolab/sweeper.py +++ b/src/qibolab/sweeper.py @@ -13,6 +13,7 @@ class Parameter(Enum): frequency = auto() amplitude = auto() duration = auto() + duration_interpolated = auto() relative_phase = auto() attenuation = auto() @@ -24,6 +25,7 @@ class Parameter(Enum): FREQUENCY = Parameter.frequency AMPLITUDE = Parameter.amplitude DURATION = Parameter.duration +DURATION_INTERPOLATED = Parameter.duration_interpolated RELATIVE_PHASE = Parameter.relative_phase ATTENUATION = Parameter.attenuation GAIN = Parameter.gain From 704ed63aa98c4d19976d7084a230e859e735281b Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 22 Aug 2024 20:33:37 +0400 Subject: [PATCH 0729/1006] fix: normalization and variable type for interpolated duration sweep --- src/qibolab/instruments/qm/program/sweepers.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/qibolab/instruments/qm/program/sweepers.py b/src/qibolab/instruments/qm/program/sweepers.py index e27daecc4d..342a048ec6 100644 --- a/src/qibolab/instruments/qm/program/sweepers.py +++ b/src/qibolab/instruments/qm/program/sweepers.py @@ -150,12 +150,17 @@ def _duration( args.parameters[operation(pulse)].duration = variable -def normalize_phase(phase): +def normalize_phase(values): """Normalize phase from [0, 2pi] to [0, 1].""" - return phase / (2 * np.pi) + return values / (2 * np.pi) -INT_TYPE = {Parameter.frequency, Parameter.duration} +def normalize_duration(values): + """Convert duration from ns to clock cycles (clock cycle = 4ns).""" + return (values // 4).astype(int) + + +INT_TYPE = {Parameter.frequency, Parameter.duration, Parameter.duration_interpolated} """Sweeper parameters for which we need ``int`` variable type. The rest parameters need ``fixed`` type. @@ -163,7 +168,8 @@ def normalize_phase(phase): NORMALIZERS = { Parameter.relative_phase: normalize_phase, - Parameter.duration: lambda values: (values // 4).astype(int), + Parameter.duration: normalize_duration, + Parameter.duration_interpolated: normalize_duration, } """Functions to normalize sweeper values. From 36cdf08eb81c21ee8a3f8751dabb4230ac79ee3a Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 22 Aug 2024 20:45:23 +0400 Subject: [PATCH 0730/1006] fix: PulseSequence.channel_duration when Align is present --- src/qibolab/sequence.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/qibolab/sequence.py b/src/qibolab/sequence.py index 55983989b5..746d34b2ae 100644 --- a/src/qibolab/sequence.py +++ b/src/qibolab/sequence.py @@ -82,7 +82,12 @@ def channel(self, channel: ChannelId) -> Iterable[PulseLike]: def channel_duration(self, channel: ChannelId) -> float: """Duration of the given channel.""" - return sum(pulse.duration for pulse in self.channel(channel)) + sequence = self + for _, pulse in self: + if isinstance(pulse, Align): + sequence = self.align_to_delays() + break + return sum(pulse.duration for pulse in sequence.channel(channel)) def pulse_channels(self, pulse_id: int) -> list[ChannelId]: """Find channels on which a pulse with a given id plays.""" From b0b122714d6e28295e24d2efbcdf60afce8d753d Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 22 Aug 2024 21:03:43 +0300 Subject: [PATCH 0731/1006] fix: rebase leftovers --- src/qibolab/instruments/qm/controller.py | 27 ++++++++++++++++++------ 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index d63a733d42..613cbf8084 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -11,11 +11,11 @@ from qm.simulate.credentials import create_credentials from qualang_tools.simulator_tools import create_simulator_controller_connections -from qibolab.components import AcquireChannel, Config, DcChannel, IqChannel +from qibolab.components import AcquireChannel, Channel, Config, DcChannel, IqChannel from qibolab.execution_parameters import ExecutionParameters from qibolab.identifier import ChannelId from qibolab.instruments.abstract import Controller -from qibolab.pulses.pulse import Acquisition, Delay, VirtualZ, _Readout +from qibolab.pulses.pulse import Acquisition, Delay, Pulse, VirtualZ, _Readout from qibolab.sequence import PulseSequence from qibolab.sweeper import ParallelSweepers, Parameter, Sweeper from qibolab.unrolling import Bounds @@ -307,11 +307,24 @@ def register_pulse(self, channel: Channel, pulse: Pulse) -> str: # qmpulse = BakedPulse(pulse, element) # qmpulse.bake(self.config, durations=[pulse.duration]) # else: + name = str(channel.name) if isinstance(channel, DcChannel): - return self.config.register_dc_pulse(channel.name, pulse) + return self.config.register_dc_pulse(name, pulse) if channel.acquisition is None: - return self.config.register_iq_pulse(channel.name, pulse) - return self.config.register_acquisition_pulse(channel.name, pulse) + return self.config.register_iq_pulse(name, pulse) + return self.config.register_acquisition_pulse(name, pulse) + + def register_pulses(self, configs: dict[str, Config], sequence: PulseSequence): + """Adds all pulses except measurements of a given sequence in the QM + ``config``. + + Returns: + acquisitions (dict): Map from measurement instructions to acquisition objects. + """ + for channel_id, pulse in sequence: + if not isinstance(pulse, (Acquisition, Delay, VirtualZ)): + channel = self.channels[str(channel_id)].logical_channel + self.register_pulse(channel, pulse) def register_duration_sweeper_pulses( self, args: ExecutionArguments, sweeper: Sweeper @@ -323,14 +336,14 @@ def register_duration_sweeper_pulses( continue op = operation(pulse) - channel_name = args.sequence.pulse_channels(pulse.id)[0] + channel_name = str(args.sequence.pulse_channels(pulse.id)[0]) channel = self.channels[channel_name].logical_channel for value in sweeper.values: sweep_pulse = pulse.model_copy(update={"duration": value}) sweep_op = self.register_pulse(channel, sweep_pulse) args.parameters[op].pulses.append((value, sweep_op)) - def register_pulses( + def register_acquisitions( self, configs: dict[str, Config], sequence: PulseSequence, From 2fffca746c49b028f981d6a7ec9dfaa3a6b31849 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 22 Aug 2024 18:04:50 +0000 Subject: [PATCH 0732/1006] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/qibolab/pulses/__init__.py | 2 +- src/qibolab/pulses/pulse.py | 3 ++- src/qibolab/sequence.py | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/qibolab/pulses/__init__.py b/src/qibolab/pulses/__init__.py index 9f7efc42cb..ff630e9950 100644 --- a/src/qibolab/pulses/__init__.py +++ b/src/qibolab/pulses/__init__.py @@ -1,2 +1,2 @@ from .envelope import * -from .pulse import Align, Acquisition, Delay, Pulse, PulseLike, VirtualZ +from .pulse import Acquisition, Align, Delay, Pulse, PulseLike, VirtualZ diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index d7017a019d..3bc5a5b5ad 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -143,5 +143,6 @@ class Align(_PulseLike): PulseLike = Annotated[ - Union[Align, Pulse, Delay, VirtualZ, Acquisition, _Readout], Field(discriminator="kind") + Union[Align, Pulse, Delay, VirtualZ, Acquisition, _Readout], + Field(discriminator="kind"), ] diff --git a/src/qibolab/sequence.py b/src/qibolab/sequence.py index 746d34b2ae..b72dd6a74d 100644 --- a/src/qibolab/sequence.py +++ b/src/qibolab/sequence.py @@ -11,7 +11,7 @@ from qibolab.pulses.pulse import Pulse, _Readout from .identifier import ChannelId, ChannelType -from .pulses import Align, Acquisition, Delay, PulseLike +from .pulses import Acquisition, Align, Delay, PulseLike __all__ = ["PulseSequence"] From 433a2c2497ebb585166bc6f1806cea6d6e6bc941 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 22 Aug 2024 22:25:20 +0400 Subject: [PATCH 0733/1006] fix: missing kind and conversions to str --- src/qibolab/instruments/qm/controller.py | 6 +++--- src/qibolab/instruments/qm/program/instructions.py | 4 ++-- src/qibolab/pulses/pulse.py | 2 ++ 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 613cbf8084..f3578b78e0 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -15,7 +15,7 @@ from qibolab.execution_parameters import ExecutionParameters from qibolab.identifier import ChannelId from qibolab.instruments.abstract import Controller -from qibolab.pulses.pulse import Acquisition, Delay, Pulse, VirtualZ, _Readout +from qibolab.pulses.pulse import Acquisition, Align, Delay, Pulse, _Readout from qibolab.sequence import PulseSequence from qibolab.sweeper import ParallelSweepers, Parameter, Sweeper from qibolab.unrolling import Bounds @@ -322,7 +322,7 @@ def register_pulses(self, configs: dict[str, Config], sequence: PulseSequence): acquisitions (dict): Map from measurement instructions to acquisition objects. """ for channel_id, pulse in sequence: - if not isinstance(pulse, (Acquisition, Delay, VirtualZ)): + if isinstance(pulse, Pulse): channel = self.channels[str(channel_id)].logical_channel self.register_pulse(channel, pulse) @@ -332,7 +332,7 @@ def register_duration_sweeper_pulses( """Register pulse with many different durations, in order to sweep duration.""" for pulse in sweeper.pulses: - if isinstance(pulse, Delay): + if isinstance(pulse, (Align, Delay)): continue op = operation(pulse) diff --git a/src/qibolab/instruments/qm/program/instructions.py b/src/qibolab/instruments/qm/program/instructions.py index f663681d91..83a438c9c4 100644 --- a/src/qibolab/instruments/qm/program/instructions.py +++ b/src/qibolab/instruments/qm/program/instructions.py @@ -79,8 +79,8 @@ def play(args: ExecutionArguments): elif isinstance(pulse, VirtualZ): qua.frame_rotation_2pi(normalize_phase(pulse.phase), element) elif isinstance(pulse, Align) and pulse.id not in processed_aligns: - elements = args.sequence.pulse_channels(pulse.id) - qua.align(*elements) + channel_ids = args.sequence.pulse_channels(pulse.id) + qua.align(*(str(ch) for ch in channel_ids)) processed_aligns.add(pulse.id) if args.relaxation_time > 0: diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index 3bc5a5b5ad..ce9bc2f334 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -141,6 +141,8 @@ def id(self) -> int: class Align(_PulseLike): """Brings different channels at the same point in time.""" + kind: Literal["align"] = "align" + PulseLike = Annotated[ Union[Align, Pulse, Delay, VirtualZ, Acquisition, _Readout], From 4e4c2a5253efe823e5e1f7f1074eb316e164939d Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 23 Aug 2024 18:22:46 +0300 Subject: [PATCH 0734/1006] chore: use any in channel_duration --- src/qibolab/sequence.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/qibolab/sequence.py b/src/qibolab/sequence.py index b72dd6a74d..fd9f89e2c1 100644 --- a/src/qibolab/sequence.py +++ b/src/qibolab/sequence.py @@ -82,11 +82,11 @@ def channel(self, channel: ChannelId) -> Iterable[PulseLike]: def channel_duration(self, channel: ChannelId) -> float: """Duration of the given channel.""" - sequence = self - for _, pulse in self: - if isinstance(pulse, Align): - sequence = self.align_to_delays() - break + sequence = ( + self.align_to_delays() + if any(isinstance(pulse, Align) for _, pulse in self) + else self + ) return sum(pulse.duration for pulse in sequence.channel(channel)) def pulse_channels(self, pulse_id: int) -> list[ChannelId]: From 539c59152b4020fdc5718523095cea0811c8e5ba Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Sun, 25 Aug 2024 12:59:42 +0300 Subject: [PATCH 0735/1006] feat: handle waveforms that are not multiple of 4ns --- src/qibolab/instruments/qm/config/pulses.py | 29 ++++++++++++++++++--- src/qibolab/instruments/qm/controller.py | 8 ------ 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/src/qibolab/instruments/qm/config/pulses.py b/src/qibolab/instruments/qm/config/pulses.py index 3b808ace3e..0d53931a14 100644 --- a/src/qibolab/instruments/qm/config/pulses.py +++ b/src/qibolab/instruments/qm/config/pulses.py @@ -2,6 +2,7 @@ from typing import Union import numpy as np +import numpy.typing as npt from qibolab.pulses import Pulse, Rectangular from qibolab.pulses.modulation import rotate, wrap_phase @@ -24,6 +25,25 @@ def operation(pulse): return str(hash(pulse)) +def baked_duration(duration: int) -> int: + if duration < 16: + return 16 + elif duration % 4 != 0: + return duration - (duration % 4) + 4 + return duration + + +def bake(waveforms: npt.NDArray) -> npt.NDArray: + """Handle waveforms with length that is not multiple of 4.""" + ncomponents, duration = waveforms.shape + new_duration = baked_duration(duration) + if new_duration == duration: + return waveforms + pad_len = new_duration - duration + padding = np.zeros((ncomponents, pad_len), dtype=waveforms.dtype) + return np.concatenate((waveforms, padding), axis=1) + + @dataclass(frozen=True) class ConstantWaveform: sample: float @@ -47,9 +67,10 @@ class ArbitraryWaveform: def from_pulse(cls, pulse: Pulse): original_waveforms = pulse.envelopes(SAMPLING_RATE) rotated_waveforms = rotate(original_waveforms, pulse.relative_phase) + baked_waveforms = bake(rotated_waveforms) return { - "I": cls(rotated_waveforms[0]), - "Q": cls(rotated_waveforms[1]), + "I": cls(baked_waveforms[0]), + "Q": cls(baked_waveforms[1]), } @@ -87,7 +108,7 @@ class QmPulse: def from_pulse(cls, pulse: Pulse): op = operation(pulse) return cls( - length=pulse.duration, + length=baked_duration(pulse.duration), waveforms=Waveforms.from_op(op), ) @@ -95,7 +116,7 @@ def from_pulse(cls, pulse: Pulse): def from_dc_pulse(cls, pulse: Pulse): op = operation(pulse) return cls( - length=pulse.duration, + length=baked_duration(pulse.duration), waveforms={"single": op}, ) diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index f3578b78e0..b50cca7c9e 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -299,14 +299,6 @@ def configure_channels( def register_pulse(self, channel: Channel, pulse: Pulse) -> str: """Add pulse in the QM ``config`` and return corresponding operation.""" - # if ( - # pulse.duration % 4 != 0 - # or pulse.duration < 16 - # or pulse.id in pulses_to_bake - # ): - # qmpulse = BakedPulse(pulse, element) - # qmpulse.bake(self.config, durations=[pulse.duration]) - # else: name = str(channel.name) if isinstance(channel, DcChannel): return self.config.register_dc_pulse(name, pulse) From eb2c7418c8cb724d51b0fc525e711cd5847b9202 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Sun, 25 Aug 2024 14:44:05 +0400 Subject: [PATCH 0736/1006] fix: divisions with 4 and drop dead code --- src/qibolab/instruments/qm/controller.py | 17 ------------- .../instruments/qm/program/instructions.py | 4 +-- .../instruments/qm/program/sweepers.py | 25 +++---------------- 3 files changed, 6 insertions(+), 40 deletions(-) diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index b50cca7c9e..d242bd0ccb 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -71,23 +71,6 @@ def declare_octaves(octaves, host, calibration_path=None): return config -def find_baking_pulses(sweepers): - """Find pulses that require baking because we are sweeping their duration. - - Args: - sweepers (list): List of :class:`qibolab.sweeper.Sweeper` objects. - """ - to_bake = set() - for sweeper in sweepers: - values = sweeper.values - step = values[1] - values[0] if len(values) > 0 else values[0] - if sweeper.parameter is Parameter.duration and step % 4 != 0: - for pulse in sweeper.pulses: - to_bake.add(pulse.id) - - return to_bake - - def fetch_results(result, acquisitions): """Fetches results from an executed experiment. diff --git a/src/qibolab/instruments/qm/program/instructions.py b/src/qibolab/instruments/qm/program/instructions.py index 83a438c9c4..c413466673 100644 --- a/src/qibolab/instruments/qm/program/instructions.py +++ b/src/qibolab/instruments/qm/program/instructions.py @@ -20,7 +20,7 @@ def _delay(pulse: Delay, element: str, parameters: Parameters): if parameters.duration is None: duration = int(pulse.duration) // 4 else: - duration = parameters.duration + duration = parameters.duration / 4 qua.wait(duration + 1, element) @@ -28,7 +28,7 @@ def _play_multiple_waveforms(element: str, parameters: Parameters): """Sweeping pulse duration using distinctly uploaded waveforms.""" with qua.switch_(parameters.duration, unsafe=True): for value, sweep_op in parameters.pulses: - with qua.case_(value // 4): + with qua.case_(value): qua.play(sweep_op, element) diff --git a/src/qibolab/instruments/qm/program/sweepers.py b/src/qibolab/instruments/qm/program/sweepers.py index 342a048ec6..9343587006 100644 --- a/src/qibolab/instruments/qm/program/sweepers.py +++ b/src/qibolab/instruments/qm/program/sweepers.py @@ -46,22 +46,6 @@ def check_max_offset(offset: Optional[float], max_offset: float = MAX_OFFSET): ) -# def _update_baked_pulses(sweeper, qmsequence, config): -# """Updates baked pulse if duration sweeper is used.""" -# qmpulse = qmsequence.pulse_to_qmpulse[sweeper.pulses[0].id] -# is_baked = isinstance(qmpulse, BakedPulse) -# for pulse in sweeper.pulses: -# qmpulse = qmsequence.pulse_to_qmpulse[pulse.id] -# if isinstance(qmpulse, BakedPulse): -# if not is_baked: -# raise_error( -# TypeError, -# "Duration sweeper cannot contain both baked and not baked pulses.", -# ) -# values = np.array(sweeper.values).astype(int) -# qmpulse.bake(config, values) - - def _frequency( channels: list[Channel], values: npt.NDArray, @@ -100,9 +84,6 @@ def _amplitude( raise_error(ValueError, "Amplitude sweep values are >2 which is not supported.") for pulse in pulses: - # if isinstance(instruction, Bake): - # instructions.update_kwargs(instruction, amplitude=a) - # else: args.parameters[operation(pulse)].amplitude = qua.amp(variable) @@ -145,7 +126,6 @@ def _duration( configs: dict[str, Config], args: ExecutionArguments, ): - # TODO: Handle baked pulses for pulse in pulses: args.parameters[operation(pulse)].duration = variable @@ -157,6 +137,10 @@ def normalize_phase(values): def normalize_duration(values): """Convert duration from ns to clock cycles (clock cycle = 4ns).""" + if not all(values % 4 == 0): + raise ValueError( + "Cannot use interpolated duration sweeper for durations that are not multiple of 4ns. Please use normal duration sweeper." + ) return (values // 4).astype(int) @@ -168,7 +152,6 @@ def normalize_duration(values): NORMALIZERS = { Parameter.relative_phase: normalize_phase, - Parameter.duration: normalize_duration, Parameter.duration_interpolated: normalize_duration, } """Functions to normalize sweeper values. From 4b75906732bd599033a586df5043a490d539e117 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Sun, 25 Aug 2024 14:51:45 +0400 Subject: [PATCH 0737/1006] chore: raise error for non-integer durations --- src/qibolab/instruments/qm/controller.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index d242bd0ccb..c07c24c54e 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -297,6 +297,11 @@ def register_pulses(self, configs: dict[str, Config], sequence: PulseSequence): acquisitions (dict): Map from measurement instructions to acquisition objects. """ for channel_id, pulse in sequence: + if hasattr(pulse, "duration") and not pulse.duration.is_integer(): + raise ValueError( + f"Quantum Machines cannot play pulse with duration {pulse.duration}. " + "Only integer duration in ns is supported." + ) if isinstance(pulse, Pulse): channel = self.channels[str(channel_id)].logical_channel self.register_pulse(channel, pulse) From a9a135c3a3d51a22bd273a0f1372ee0fcedd4f39 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Sun, 25 Aug 2024 14:57:22 +0400 Subject: [PATCH 0738/1006] chore: update error --- src/qibolab/instruments/qm/controller.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index c07c24c54e..b5672ad3d4 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -297,7 +297,11 @@ def register_pulses(self, configs: dict[str, Config], sequence: PulseSequence): acquisitions (dict): Map from measurement instructions to acquisition objects. """ for channel_id, pulse in sequence: - if hasattr(pulse, "duration") and not pulse.duration.is_integer(): + if ( + hasattr(pulse, "duration") + and isinstance(pulse.duration, float) + and not pulse.duration.is_integer() + ): raise ValueError( f"Quantum Machines cannot play pulse with duration {pulse.duration}. " "Only integer duration in ns is supported." From 4c1be639b73379a514f41542fd83470e7da6e200 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Sun, 25 Aug 2024 21:17:47 +0400 Subject: [PATCH 0739/1006] fix: not devide by 4 twice when interpolated --- src/qibolab/instruments/qm/program/arguments.py | 1 + .../instruments/qm/program/instructions.py | 2 ++ src/qibolab/instruments/qm/program/sweepers.py | 15 ++++++++++++++- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/qibolab/instruments/qm/program/arguments.py b/src/qibolab/instruments/qm/program/arguments.py index 13637e2be2..571e1a3cca 100644 --- a/src/qibolab/instruments/qm/program/arguments.py +++ b/src/qibolab/instruments/qm/program/arguments.py @@ -17,6 +17,7 @@ class Parameters: amplitude: Optional[_Variable] = None phase: Optional[_Variable] = None pulses: list[tuple[float, str]] = field(default_factory=list) + interpolated: bool = False @dataclass diff --git a/src/qibolab/instruments/qm/program/instructions.py b/src/qibolab/instruments/qm/program/instructions.py index c413466673..43db71b0b9 100644 --- a/src/qibolab/instruments/qm/program/instructions.py +++ b/src/qibolab/instruments/qm/program/instructions.py @@ -19,6 +19,8 @@ def _delay(pulse: Delay, element: str, parameters: Parameters): # TODO: How to play delays on multiple elements? if parameters.duration is None: duration = int(pulse.duration) // 4 + elif parameters.interpolated: + duration = parameters.duration else: duration = parameters.duration / 4 qua.wait(duration + 1, element) diff --git a/src/qibolab/instruments/qm/program/sweepers.py b/src/qibolab/instruments/qm/program/sweepers.py index 9343587006..0c882d9b2b 100644 --- a/src/qibolab/instruments/qm/program/sweepers.py +++ b/src/qibolab/instruments/qm/program/sweepers.py @@ -130,6 +130,19 @@ def _duration( args.parameters[operation(pulse)].duration = variable +def _duration_interpolated( + pulses: list[Pulse], + values: npt.NDArray, + variable: _Variable, + configs: dict[str, Config], + args: ExecutionArguments, +): + for pulse in pulses: + params = args.parameters[operation(pulse)] + params.duration = variable + params.interpolated = True + + def normalize_phase(values): """Normalize phase from [0, 2pi] to [0, 1].""" return values / (2 * np.pi) @@ -163,7 +176,7 @@ def normalize_duration(values): Parameter.frequency: _frequency, Parameter.amplitude: _amplitude, Parameter.duration: _duration, - Parameter.duration_interpolated: _duration, + Parameter.duration_interpolated: _duration_interpolated, Parameter.relative_phase: _relative_phase, Parameter.bias: _bias, } From 3a4ae0e5b805eec89a2ec8905565280c73e95704 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Sun, 25 Aug 2024 22:19:18 +0400 Subject: [PATCH 0740/1006] fix: play flux pulse --- src/qibolab/instruments/qm/config/config.py | 8 +++++--- src/qibolab/instruments/qm/program/instructions.py | 4 ++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/qibolab/instruments/qm/config/config.py b/src/qibolab/instruments/qm/config/config.py index 3e53a8d64a..e850332522 100644 --- a/src/qibolab/instruments/qm/config/config.py +++ b/src/qibolab/instruments/qm/config/config.py @@ -109,9 +109,11 @@ def register_waveforms( else: qmpulse = QmAcquisition.from_pulse(pulse, element) waveforms = waveforms_from_pulse(pulse) - modes = ["I"] if dc else ["I", "Q"] - for mode in modes: - self.waveforms[getattr(qmpulse.waveforms, mode)] = waveforms[mode] + if dc: + self.waveforms[qmpulse.waveforms["single"]] = waveforms["I"] + else: + for mode in ["I", "Q"]: + self.waveforms[getattr(qmpulse.waveforms, mode)] = waveforms[mode] return qmpulse def register_iq_pulse(self, element: str, pulse: Pulse): diff --git a/src/qibolab/instruments/qm/program/instructions.py b/src/qibolab/instruments/qm/program/instructions.py index 43db71b0b9..e4c659941c 100644 --- a/src/qibolab/instruments/qm/program/instructions.py +++ b/src/qibolab/instruments/qm/program/instructions.py @@ -6,6 +6,7 @@ from qibolab.components import Config from qibolab.execution_parameters import AcquisitionType, ExecutionParameters +from qibolab.identifier import ChannelType from qibolab.pulses import Align, Delay, Pulse, VirtualZ from qibolab.sweeper import ParallelSweepers @@ -70,6 +71,9 @@ def play(args: ExecutionArguments): processed_aligns = set() for channel_id, pulse in args.sequence: + if channel_id.channel_type is ChannelType.ACQUISITION: + continue + element = str(channel_id) op = operation(pulse) params = args.parameters[op] From 7e03145c7b60b98c3a7e13300b6411b6722a074f Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 27 Aug 2024 19:22:37 +0400 Subject: [PATCH 0741/1006] chore: simplify baking helper methods --- src/qibolab/instruments/qm/config/pulses.py | 26 +++++++-------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/src/qibolab/instruments/qm/config/pulses.py b/src/qibolab/instruments/qm/config/pulses.py index 0d53931a14..069b613d3b 100644 --- a/src/qibolab/instruments/qm/config/pulses.py +++ b/src/qibolab/instruments/qm/config/pulses.py @@ -2,7 +2,6 @@ from typing import Union import numpy as np -import numpy.typing as npt from qibolab.pulses import Pulse, Rectangular from qibolab.pulses.modulation import rotate, wrap_phase @@ -26,22 +25,13 @@ def operation(pulse): def baked_duration(duration: int) -> int: - if duration < 16: - return 16 - elif duration % 4 != 0: - return duration - (duration % 4) + 4 - return duration + """Calculate waveform length after pulse baking. - -def bake(waveforms: npt.NDArray) -> npt.NDArray: - """Handle waveforms with length that is not multiple of 4.""" - ncomponents, duration = waveforms.shape - new_duration = baked_duration(duration) - if new_duration == duration: - return waveforms - pad_len = new_duration - duration - padding = np.zeros((ncomponents, pad_len), dtype=waveforms.dtype) - return np.concatenate((waveforms, padding), axis=1) + QM can only play pulses with length that is >16ns and multiple of + 4ns. Waveforms that don't satisfy these constraints are padded with + zeros. + """ + return int(np.maximum((duration + 3) // 4 * 4, 16)) @dataclass(frozen=True) @@ -67,7 +57,9 @@ class ArbitraryWaveform: def from_pulse(cls, pulse: Pulse): original_waveforms = pulse.envelopes(SAMPLING_RATE) rotated_waveforms = rotate(original_waveforms, pulse.relative_phase) - baked_waveforms = bake(rotated_waveforms) + new_duration = baked_duration(pulse.duration) + pad_len = new_duration - int(pulse.duration) + baked_waveforms = np.pad(rotated_waveforms, ((0, 0), (0, pad_len))) return { "I": cls(baked_waveforms[0]), "Q": cls(baked_waveforms[1]), From dbd35989b67325ed71831ceb373f47daeddc819c Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 27 Aug 2024 19:24:43 +0400 Subject: [PATCH 0742/1006] chore: drop check if duration is float --- src/qibolab/instruments/qm/controller.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index b5672ad3d4..c07c24c54e 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -297,11 +297,7 @@ def register_pulses(self, configs: dict[str, Config], sequence: PulseSequence): acquisitions (dict): Map from measurement instructions to acquisition objects. """ for channel_id, pulse in sequence: - if ( - hasattr(pulse, "duration") - and isinstance(pulse.duration, float) - and not pulse.duration.is_integer() - ): + if hasattr(pulse, "duration") and not pulse.duration.is_integer(): raise ValueError( f"Quantum Machines cannot play pulse with duration {pulse.duration}. " "Only integer duration in ns is supported." From 60580cea7149c597afe59f73a234a1a6030ad97f Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 27 Aug 2024 19:58:10 +0400 Subject: [PATCH 0743/1006] fix: force delays to be at least 16ns --- src/qibolab/instruments/qm/config/pulses.py | 3 ++- src/qibolab/instruments/qm/program/instructions.py | 11 ++++++++--- src/qibolab/instruments/qm/program/sweepers.py | 4 ++-- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/qibolab/instruments/qm/config/pulses.py b/src/qibolab/instruments/qm/config/pulses.py index 069b613d3b..1940838be5 100644 --- a/src/qibolab/instruments/qm/config/pulses.py +++ b/src/qibolab/instruments/qm/config/pulses.py @@ -71,9 +71,10 @@ def from_pulse(cls, pulse: Pulse): def waveforms_from_pulse(pulse: Pulse) -> Waveform: """Register QM waveforms for a given pulse.""" + needs_baking = pulse.duration < 16 or pulse.duration % 4 != 0 wvtype = ( ConstantWaveform - if isinstance(pulse.envelope, Rectangular) + if isinstance(pulse.envelope, Rectangular) and not needs_baking else ArbitraryWaveform ) return wvtype.from_pulse(pulse) diff --git a/src/qibolab/instruments/qm/program/instructions.py b/src/qibolab/instruments/qm/program/instructions.py index e4c659941c..8a7d264088 100644 --- a/src/qibolab/instruments/qm/program/instructions.py +++ b/src/qibolab/instruments/qm/program/instructions.py @@ -19,12 +19,17 @@ def _delay(pulse: Delay, element: str, parameters: Parameters): # TODO: How to play delays on multiple elements? if parameters.duration is None: - duration = int(pulse.duration) // 4 + duration = max(int(pulse.duration) // 4 + 1, 4) + qua.wait(duration, element) elif parameters.interpolated: - duration = parameters.duration + duration = parameters.duration + 1 + qua.wait(duration, element) else: duration = parameters.duration / 4 - qua.wait(duration + 1, element) + with qua.if_(duration < 4): + qua.wait(4, element) + with qua.else_(): + qua.wait(duration, element) def _play_multiple_waveforms(element: str, parameters: Parameters): diff --git a/src/qibolab/instruments/qm/program/sweepers.py b/src/qibolab/instruments/qm/program/sweepers.py index 0c882d9b2b..efaac0401e 100644 --- a/src/qibolab/instruments/qm/program/sweepers.py +++ b/src/qibolab/instruments/qm/program/sweepers.py @@ -150,9 +150,9 @@ def normalize_phase(values): def normalize_duration(values): """Convert duration from ns to clock cycles (clock cycle = 4ns).""" - if not all(values % 4 == 0): + if any(values < 16) and not all(values % 4 == 0): raise ValueError( - "Cannot use interpolated duration sweeper for durations that are not multiple of 4ns. Please use normal duration sweeper." + "Cannot use interpolated duration sweeper for durations that are not multiple of 4ns or are less than 16ns. Please use normal duration sweeper." ) return (values // 4).astype(int) From ccd94f88ac5d8f0bce11d09e25bd3d5455d440c2 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Wed, 28 Aug 2024 14:05:26 +0300 Subject: [PATCH 0744/1006] fix: rescale QM pulse amplitude to [-1, 1] --- src/qibolab/instruments/qm/config/pulses.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/qibolab/instruments/qm/config/pulses.py b/src/qibolab/instruments/qm/config/pulses.py index 1940838be5..0635865a1f 100644 --- a/src/qibolab/instruments/qm/config/pulses.py +++ b/src/qibolab/instruments/qm/config/pulses.py @@ -7,7 +7,9 @@ from qibolab.pulses.modulation import rotate, wrap_phase SAMPLING_RATE = 1 -"""Sampling rate of Quantum Machines OPX in GSps.""" +"""Sampling rate of Quantum Machines OPX+ in GSps.""" +MAX_VOLTAGE_OUTPUT = 0.5 +"""Maximum output of Quantum Machines OPX+ in Volts.""" __all__ = [ "operation", @@ -42,9 +44,10 @@ class ConstantWaveform: @classmethod def from_pulse(cls, pulse: Pulse): phase = wrap_phase(pulse.relative_phase) + voltage_amp = pulse.amplitude * MAX_VOLTAGE_OUTPUT return { - "I": cls(pulse.amplitude * np.cos(phase)), - "Q": cls(pulse.amplitude * np.sin(phase)), + "I": cls(voltage_amp * np.cos(phase)), + "Q": cls(voltage_amp * np.sin(phase)), } @@ -55,7 +58,7 @@ class ArbitraryWaveform: @classmethod def from_pulse(cls, pulse: Pulse): - original_waveforms = pulse.envelopes(SAMPLING_RATE) + original_waveforms = pulse.envelopes(SAMPLING_RATE) * MAX_VOLTAGE_OUTPUT rotated_waveforms = rotate(original_waveforms, pulse.relative_phase) new_duration = baked_duration(pulse.duration) pad_len = new_duration - int(pulse.duration) From dd4774603804dba682205e47e2e303cc01a96a9d Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 27 Aug 2024 21:04:10 +0400 Subject: [PATCH 0745/1006] refactor: move unroll_sequences in unrolling.py --- src/qibolab/platform/__init__.py | 4 ++-- src/qibolab/platform/platform.py | 31 ------------------------------ src/qibolab/unrolling.py | 33 +++++++++++++++++++++++++++++++- 3 files changed, 34 insertions(+), 34 deletions(-) diff --git a/src/qibolab/platform/__init__.py b/src/qibolab/platform/__init__.py index 0b4565f39a..2302ab60e8 100644 --- a/src/qibolab/platform/__init__.py +++ b/src/qibolab/platform/__init__.py @@ -1,4 +1,4 @@ from .load import create_platform -from .platform import Platform, unroll_sequences +from .platform import Platform -__all__ = ["Platform", "create_platform", "unroll_sequences"] +__all__ = ["Platform", "create_platform"] diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index d168bc115c..38bdfc3fc0 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -15,7 +15,6 @@ from qibolab.identifier import ChannelId from qibolab.instruments.abstract import Controller, Instrument, InstrumentId from qibolab.parameters import NativeGates, Parameters, Settings, update_configs -from qibolab.pulses import Delay from qibolab.qubits import Qubit, QubitId, QubitPairId from qibolab.sequence import PulseSequence from qibolab.sweeper import ParallelSweepers @@ -38,36 +37,6 @@ def default(value: Optional[T], default: T) -> T: return value if value is not None else default -def unroll_sequences( - sequences: list[PulseSequence], relaxation_time: int -) -> tuple[PulseSequence, dict[int, list[int]]]: - """Unrolls a list of pulse sequences to a single sequence. - - The resulting sequence may contain multiple measurements. - - `relaxation_time` is the time in ns to wait for the qubit to relax between playing - different sequences. - - It returns both the unrolled pulse sequence, and the map from original readout pulse - serials to the unrolled readout pulse serials. Required to construct the results - dictionary that is returned after execution. - """ - total_sequence = PulseSequence() - readout_map = defaultdict(list) - for sequence in sequences: - total_sequence.concatenate(sequence) - # TODO: Fix unrolling results - for _, acq in sequence.acquisitions: - readout_map[acq.id].append(acq.id) - - length = sequence.duration + relaxation_time - for channel in sequence.channels: - delay = length - sequence.channel_duration(channel) - total_sequence.append((channel, Delay(duration=delay))) - - return total_sequence, readout_map - - def estimate_duration( sequences: list[PulseSequence], options: ExecutionParameters, diff --git a/src/qibolab/unrolling.py b/src/qibolab/unrolling.py index efab4d8eb2..1a07ad1790 100644 --- a/src/qibolab/unrolling.py +++ b/src/qibolab/unrolling.py @@ -3,13 +3,14 @@ May be reused by different instruments. """ +from collections import defaultdict from functools import total_ordering from typing import Annotated from qibolab.components.configs import BoundsConfig from qibolab.serialize import Model -from .pulses import Pulse +from .pulses import Delay, Pulse from .pulses.envelope import Rectangular from .sequence import PulseSequence @@ -95,3 +96,33 @@ def batch(sequences: list[PulseSequence], bounds: Bounds): batch.append(sequence) counters += update yield batch + + +def unroll_sequences( + sequences: list[PulseSequence], relaxation_time: int +) -> tuple[PulseSequence, dict[int, list[int]]]: + """Unrolls a list of pulse sequences to a single sequence. + + The resulting sequence may contain multiple measurements. + + `relaxation_time` is the time in ns to wait for the qubit to relax between playing + different sequences. + + It returns both the unrolled pulse sequence, and the map from original readout pulse + serials to the unrolled readout pulse serials. Required to construct the results + dictionary that is returned after execution. + """ + total_sequence = PulseSequence() + readout_map = defaultdict(list) + for sequence in sequences: + total_sequence.concatenate(sequence) + # TODO: Fix unrolling results + for _, acq in sequence.acquisitions: + readout_map[acq.id].append(acq.id) + + length = sequence.duration + relaxation_time + for channel in sequence.channels: + delay = length - sequence.channel_duration(channel) + total_sequence.append((channel, Delay(duration=delay))) + + return total_sequence, readout_map From 9181058c4a38aa0d99b8b46278b53a0e9a8a0763 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 27 Aug 2024 21:04:26 +0400 Subject: [PATCH 0746/1006] feat: use unroll_sequences in QM driver --- src/qibolab/instruments/qm/controller.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index c07c24c54e..9e5c0bfd08 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -18,7 +18,7 @@ from qibolab.pulses.pulse import Acquisition, Align, Delay, Pulse, _Readout from qibolab.sequence import PulseSequence from qibolab.sweeper import ParallelSweepers, Parameter, Sweeper -from qibolab.unrolling import Bounds +from qibolab.unrolling import Bounds, unroll_sequences from .components import QmChannel from .config import SAMPLING_RATE, QmConfig, operation @@ -388,9 +388,14 @@ def play( options: ExecutionParameters, sweepers: list[ParallelSweepers], ): - if len(sequences) > 1: - raise NotImplementedError - elif len(sequences) == 0 or len(sequences[0]) == 0: + if len(sequences) == 0: + return {} + elif len(sequences) == 1: + sequence = sequences[0] + else: + sequence, _ = unroll_sequences(sequences, options.relaxation_time) + + if len(sequence) == 0: return {} # register DC elements so that all qubits are @@ -399,7 +404,6 @@ def play( if isinstance(channel.logical_channel, DcChannel): self.configure_channel(channel, configs) - sequence = sequences[0] self.configure_channels(configs, sequence.channels) self.register_pulses(configs, sequence) acquisitions = self.register_acquisitions(configs, sequence, options) From faa6f06f21e388ce64560c0cf19429b22828b1fa Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 27 Aug 2024 21:30:26 +0400 Subject: [PATCH 0747/1006] feat: implement parallel sweeps for QM --- .../instruments/qm/program/instructions.py | 72 ++++++++++--------- 1 file changed, 39 insertions(+), 33 deletions(-) diff --git a/src/qibolab/instruments/qm/program/instructions.py b/src/qibolab/instruments/qm/program/instructions.py index 8a7d264088..cf07f05f40 100644 --- a/src/qibolab/instruments/qm/program/instructions.py +++ b/src/qibolab/instruments/qm/program/instructions.py @@ -8,7 +8,7 @@ from qibolab.execution_parameters import AcquisitionType, ExecutionParameters from qibolab.identifier import ChannelType from qibolab.pulses import Align, Delay, Pulse, VirtualZ -from qibolab.sweeper import ParallelSweepers +from qibolab.sweeper import ParallelSweepers, Sweeper from ..config import operation from .acquisition import Acquisition @@ -98,35 +98,17 @@ def play(args: ExecutionArguments): qua.wait(args.relaxation_time // 4) -def _sweep_recursion(sweepers, configs, args): - """Unrolls a list of qibolab sweepers to the corresponding QUA for loops - using recursion.""" - if len(sweepers) > 0: - parallel_sweepers = sweepers[0] - if len(parallel_sweepers) > 1: - raise NotImplementedError - - sweeper = parallel_sweepers[0] - parameter = sweeper.parameter - if parameter not in SWEEPER_METHODS: - raise NotImplementedError(f"Sweeper for {parameter} is not implemented.") - - variable = declare(int) if parameter in INT_TYPE else declare(fixed) - values = sweeper.values - if parameter in NORMALIZERS: - values = NORMALIZERS[parameter](sweeper.values) +def _process_sweeper(sweeper: Sweeper): + parameter = sweeper.parameter + if parameter not in SWEEPER_METHODS: + raise NotImplementedError(f"Sweeper for {parameter} is not implemented.") - method = SWEEPER_METHODS[parameter] - with for_(*from_array(variable, values)): - if sweeper.pulses is not None: - method(sweeper.pulses, values, variable, configs, args) - else: - method(sweeper.channels, values, variable, configs, args) + variable = declare(int) if parameter in INT_TYPE else declare(fixed) + values = sweeper.values + if parameter in NORMALIZERS: + values = NORMALIZERS[parameter](sweeper.values) - _sweep_recursion(sweepers[1:], configs, args) - - else: - play(args) + return variable, values def sweep( @@ -134,11 +116,35 @@ def sweep( configs: dict[str, Config], args: ExecutionArguments, ): - """Public sweep function that is called by the driver.""" - # for sweeper in sweepers: - # if sweeper.parameter is Parameter.duration: - # _update_baked_pulses(sweeper, instructions, config) - _sweep_recursion(sweepers, configs, args) + """Unrolls a list of qibolab sweepers to the corresponding QUA for loops. + + Uses recursion to handle nested sweepers. + """ + if len(sweepers) > 0: + parallel_sweepers = sweepers[0] + + variables, all_values = zip( + *(_process_sweeper(sweeper) for sweeper in parallel_sweepers) + ) + if len(parallel_sweepers) > 1: + loop = qua.for_each_(variables, all_values) + else: + loop = for_(*from_array(variables[0], all_values[0])) + + with loop: + for sweeper, variable, values in zip( + parallel_sweepers, variables, all_values + ): + method = SWEEPER_METHODS[sweeper.parameter] + if sweeper.pulses is not None: + method(sweeper.pulses, values, variable, configs, args) + else: + method(sweeper.channels, values, variable, configs, args) + + sweep(sweepers[1:], configs, args) + + else: + play(args) def program( From a242a1245adbe711adb0d127f77892d70c15dde4 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Wed, 28 Aug 2024 01:24:18 +0300 Subject: [PATCH 0748/1006] test: update tests after unroll_sequences move --- tests/test_platform.py | 15 +-------------- tests/test_unrolling.py | 18 ++++++++++++++++-- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/tests/test_platform.py b/tests/test_platform.py index 0d1b065ca8..ee68c75e7c 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -21,7 +21,7 @@ from qibolab.instruments.qblox.controller import QbloxController from qibolab.native import SingleQubitNatives, TwoQubitNatives from qibolab.parameters import NativeGates, Parameters, update_configs -from qibolab.platform import Platform, unroll_sequences +from qibolab.platform import Platform from qibolab.platform.load import PLATFORM, PLATFORMS from qibolab.platform.platform import PARAMETERS from qibolab.pulses import Delay, Gaussian, Pulse, Rectangular @@ -33,19 +33,6 @@ nshots = 1024 -def test_unroll_sequences(platform: Platform): - qubit = next(iter(platform.qubits.values())) - natives = platform.natives.single_qubit[0] - sequence = PulseSequence() - sequence.concatenate(natives.RX.create_sequence()) - sequence.append((qubit.probe.name, Delay(duration=sequence.duration))) - sequence.concatenate(natives.MZ.create_sequence()) - total_sequence, readouts = unroll_sequences(10 * [sequence], relaxation_time=10000) - assert len(total_sequence.acquisitions) == 10 - assert len(readouts) == 1 - assert all(len(readouts[acq.id]) == 10 for _, acq in sequence.acquisitions) - - def test_create_platform(platform): assert isinstance(platform, Platform) diff --git a/tests/test_unrolling.py b/tests/test_unrolling.py index da7147540f..a87e3d7d8b 100644 --- a/tests/test_unrolling.py +++ b/tests/test_unrolling.py @@ -2,10 +2,11 @@ import pytest -from qibolab.pulses import Drag, Pulse, Rectangular +from qibolab.platform import Platform +from qibolab.pulses import Delay, Drag, Pulse, Rectangular from qibolab.pulses.pulse import Acquisition from qibolab.sequence import PulseSequence -from qibolab.unrolling import Bounds, batch +from qibolab.unrolling import Bounds, batch, unroll_sequences def test_bounds_update(): @@ -104,3 +105,16 @@ def test_batch(bounds): batches = list(batch(sequences, bounds)) assert len(batches) > 1 + + +def test_unroll_sequences(platform: Platform): + qubit = next(iter(platform.qubits.values())) + natives = platform.natives.single_qubit[0] + sequence = PulseSequence() + sequence.concatenate(natives.RX.create_sequence()) + sequence.append((qubit.probe.name, Delay(duration=sequence.duration))) + sequence.concatenate(natives.MZ.create_sequence()) + total_sequence, readouts = unroll_sequences(10 * [sequence], relaxation_time=10000) + assert len(total_sequence.acquisitions) == 10 + assert len(readouts) == 1 + assert all(len(readouts[acq.id]) == 10 for _, acq in sequence.acquisitions) From 294e817737e6ffd4289287b553924baf2101cbd3 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Wed, 28 Aug 2024 01:25:02 +0300 Subject: [PATCH 0749/1006] chore: patch to dump the qua program script without instrument connection --- src/qibolab/instruments/qm/controller.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 9e5c0bfd08..112ace50a9 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -415,17 +415,20 @@ def play( experiment = program(configs, args, options, sweepers) + if self.script_file_name is not None: + script_config = ( + {"version": 1} if self.manager is None else asdict(self.config) + ) + script = generate_qua_script(experiment, script_config) + with open(self.script_file_name, "w") as file: + file.write(script) + if self.manager is None: warnings.warn( "Not connected to Quantum Machines. Returning program and config." ) return {"program": experiment, "config": asdict(self.config)} - if self.script_file_name is not None: - script = generate_qua_script(experiment, asdict(self.config)) - with open(self.script_file_name, "w") as file: - file.write(script) - if self.simulation_duration is not None: result = self.simulate_program(experiment) results = {} From 2230ad8cecb946897cad1858ad4e994b25343561 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Wed, 28 Aug 2024 01:55:16 +0300 Subject: [PATCH 0750/1006] fix: baking and nested sweepers --- .../instruments/qm/program/instructions.py | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/qibolab/instruments/qm/program/instructions.py b/src/qibolab/instruments/qm/program/instructions.py index cf07f05f40..dfab9e2f2a 100644 --- a/src/qibolab/instruments/qm/program/instructions.py +++ b/src/qibolab/instruments/qm/program/instructions.py @@ -36,10 +36,26 @@ def _play_multiple_waveforms(element: str, parameters: Parameters): """Sweeping pulse duration using distinctly uploaded waveforms.""" with qua.switch_(parameters.duration, unsafe=True): for value, sweep_op in parameters.pulses: + if parameters.amplitude is not None: + sweep_op = sweep_op * parameters.amplitude with qua.case_(value): qua.play(sweep_op, element) +def _play_single_waveform( + op: str, + element: str, + parameters: Parameters, + acquisition: Optional[Acquisition] = None, +): + if parameters.amplitude is not None: + op = op * parameters.amplitude + if acquisition is not None: + acquisition.measure(op) + else: + qua.play(op, element, duration=parameters.duration) + + def _play( op: str, element: str, @@ -48,16 +64,11 @@ def _play( ): if parameters.phase is not None: qua.frame_rotation_2pi(parameters.phase, element) - if parameters.amplitude is not None: - op = op * parameters.amplitude if len(parameters.pulses) > 0: _play_multiple_waveforms(element, parameters) else: - if acquisition is not None: - acquisition.measure(op) - else: - qua.play(op, element, duration=parameters.duration) + _play_single_waveform(op, element, parameters, acquisition) if parameters.phase is not None: qua.reset_frame(element) From fa456b97889a38b49e05ad97bd1211d5dd1a8212 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Wed, 28 Aug 2024 17:10:58 +0300 Subject: [PATCH 0751/1006] chore: remove outdated drivers --- .../instruments/emulator/engines/generic.py | 163 --- .../emulator/engines/qutip_engine.py | 527 --------- .../models/general_no_coupler_model.py | 156 --- .../instruments/emulator/models/methods.py | 20 - .../emulator/models/models_template.py | 178 --- .../instruments/emulator/pulse_simulator.py | 759 ------------ src/qibolab/instruments/icarusq.py | 39 - src/qibolab/instruments/icarusqfpga.py | 438 ------- src/qibolab/instruments/qblox/__init__.py | 0 src/qibolab/instruments/qblox/acquisition.py | 124 -- .../instruments/qblox/cluster_qcm_bb.py | 764 ------------ .../instruments/qblox/cluster_qcm_rf.py | 763 ------------ .../instruments/qblox/cluster_qrm_rf.py | 1043 ----------------- src/qibolab/instruments/qblox/controller.py | 542 --------- src/qibolab/instruments/qblox/debug.py | 57 - src/qibolab/instruments/qblox/module.py | 63 - src/qibolab/instruments/qblox/port.py | 282 ----- src/qibolab/instruments/qblox/q1asm.py | 370 ------ src/qibolab/instruments/qblox/sequencer.py | 238 ---- src/qibolab/instruments/qblox/sweeper.py | 396 ------- src/qibolab/instruments/rfsoc/__init__.py | 3 - src/qibolab/instruments/rfsoc/convert.py | 196 ---- src/qibolab/instruments/rfsoc/driver.py | 601 ---------- tests/dummy_qrc/qblox/parameters.json | 272 ----- tests/dummy_qrc/qblox/platform.py | 98 -- tests/dummy_qrc/rfsoc/parameters.json | 54 - tests/dummy_qrc/rfsoc/platform.py | 44 - tests/emulators/default_q0/parameters.json | 76 -- tests/emulators/default_q0/platform.py | 49 - .../ibmfakebelem_q01/parameters.json | 252 ---- tests/emulators/ibmfakebelem_q01/platform.py | 52 - tests/qblox_fixtures.py | 20 - tests/test_emulator.py | 350 ------ tests/test_instruments_qblox.py | 313 ----- .../test_instruments_qblox_cluster_qcm_bb.py | 176 --- .../test_instruments_qblox_cluster_qcm_rf.py | 246 ---- .../test_instruments_qblox_cluster_qrm_rf.py | 226 ---- tests/test_instruments_qblox_controller.py | 86 -- tests/test_instruments_qblox_debug.py | 0 tests/test_instruments_qblox_port.py | 0 tests/test_instruments_qblox_q1asm.py | 0 tests/test_instruments_qblox_sequencer.py | 0 tests/test_instruments_qm.py | 507 -------- tests/test_instruments_qmsim.py | 531 --------- tests/test_instruments_rfsoc.py | 937 --------------- tests/test_platform.py | 15 +- tests/test_port.py | 32 - 47 files changed, 2 insertions(+), 12056 deletions(-) delete mode 100644 src/qibolab/instruments/emulator/engines/generic.py delete mode 100644 src/qibolab/instruments/emulator/engines/qutip_engine.py delete mode 100644 src/qibolab/instruments/emulator/models/general_no_coupler_model.py delete mode 100644 src/qibolab/instruments/emulator/models/methods.py delete mode 100644 src/qibolab/instruments/emulator/models/models_template.py delete mode 100644 src/qibolab/instruments/emulator/pulse_simulator.py delete mode 100644 src/qibolab/instruments/icarusq.py delete mode 100644 src/qibolab/instruments/icarusqfpga.py delete mode 100644 src/qibolab/instruments/qblox/__init__.py delete mode 100644 src/qibolab/instruments/qblox/acquisition.py delete mode 100644 src/qibolab/instruments/qblox/cluster_qcm_bb.py delete mode 100644 src/qibolab/instruments/qblox/cluster_qcm_rf.py delete mode 100644 src/qibolab/instruments/qblox/cluster_qrm_rf.py delete mode 100644 src/qibolab/instruments/qblox/controller.py delete mode 100644 src/qibolab/instruments/qblox/debug.py delete mode 100644 src/qibolab/instruments/qblox/module.py delete mode 100644 src/qibolab/instruments/qblox/port.py delete mode 100644 src/qibolab/instruments/qblox/q1asm.py delete mode 100644 src/qibolab/instruments/qblox/sequencer.py delete mode 100644 src/qibolab/instruments/qblox/sweeper.py delete mode 100644 src/qibolab/instruments/rfsoc/__init__.py delete mode 100644 src/qibolab/instruments/rfsoc/convert.py delete mode 100644 src/qibolab/instruments/rfsoc/driver.py delete mode 100644 tests/dummy_qrc/qblox/parameters.json delete mode 100644 tests/dummy_qrc/qblox/platform.py delete mode 100644 tests/dummy_qrc/rfsoc/parameters.json delete mode 100644 tests/dummy_qrc/rfsoc/platform.py delete mode 100644 tests/emulators/default_q0/parameters.json delete mode 100644 tests/emulators/default_q0/platform.py delete mode 100644 tests/emulators/ibmfakebelem_q01/parameters.json delete mode 100644 tests/emulators/ibmfakebelem_q01/platform.py delete mode 100644 tests/qblox_fixtures.py delete mode 100644 tests/test_emulator.py delete mode 100644 tests/test_instruments_qblox.py delete mode 100644 tests/test_instruments_qblox_cluster_qcm_bb.py delete mode 100644 tests/test_instruments_qblox_cluster_qcm_rf.py delete mode 100644 tests/test_instruments_qblox_cluster_qrm_rf.py delete mode 100644 tests/test_instruments_qblox_controller.py delete mode 100644 tests/test_instruments_qblox_debug.py delete mode 100644 tests/test_instruments_qblox_port.py delete mode 100644 tests/test_instruments_qblox_q1asm.py delete mode 100644 tests/test_instruments_qblox_sequencer.py delete mode 100644 tests/test_instruments_qm.py delete mode 100644 tests/test_instruments_qmsim.py delete mode 100644 tests/test_instruments_rfsoc.py delete mode 100644 tests/test_port.py diff --git a/src/qibolab/instruments/emulator/engines/generic.py b/src/qibolab/instruments/emulator/engines/generic.py deleted file mode 100644 index a8686a0dfe..0000000000 --- a/src/qibolab/instruments/emulator/engines/generic.py +++ /dev/null @@ -1,163 +0,0 @@ -from collections import OrderedDict -from typing import Optional - -import numpy as np - - -def specify_hilbert_space(model_config: dict, little_endian: bool) -> tuple: - """Creates a tuple that specifies the Hilbert Space to be used by the - quantum dynamics simulation. - - Args: - model_config (dict): Model configuration dictionary. - little_endian (bool): Flag to indicate if Hilbert Space is in little endian (True) or big endian (False). - - Returns: - tuple: Contains the ordered list of qubit and coupler indices and the corresponding ordered list of nlevels. - """ - - nlevels_q = model_config["nlevels_q"] # as per runcard, big endian - nlevels_c = model_config["nlevels_c"] # as per runcard, big endian - qubits_list = model_config["qubits_list"] # as per runcard, big endian - couplers_list = model_config["couplers_list"] # as per runcard, big endian - - nlevels_HS = np.flip( - nlevels_c + nlevels_q - ).tolist() # little endian, qubits first then couplers - HS_list = np.flip( - couplers_list + qubits_list - ) # little endian, qubits first then couplers - - return HS_list, nlevels_HS - - -def function_from_array(y: np.ndarray, x: np.ndarray): - """Return function given a data array y and time array x.""" - - if y.shape[0] != x.shape[0]: - raise ValueError("y and x must have the same first dimension") - - yx = np.column_stack((y, x)) - yx = yx[yx[:, -1].argsort()] - - def func(t, args): - idx = np.searchsorted(yx[1:, -1], t, side="right") - return yx[idx, 0] - - return func - - -def dec_to_basis_string(x: int, nlevels: list = [2]) -> list: - """Converts an integer to a generalized bitstring in the computation basis - of the full Hilbert space. - - Args: - x (int): The integer (decimal number) to be converted. - nlevels (list): The list of nlevels to convert the decimal number to. Defaults to [2]. - - Returns: - list: Generalized bitstring of x. - """ - nqubits = len(nlevels) - output_list = [] - y = x - subdims_ = np.multiply.accumulate(nlevels) - subdims = (subdims_[-1] / subdims_).astype(int) - - for sub_dim in subdims: - coeff = np.divmod(y, sub_dim)[0] - output_list.append(coeff) - y -= coeff * sub_dim - - return output_list - - -def op_from_instruction( - inst: tuple[float, str, list], - op_dict: Optional[dict] = None, - op_connectors_dict: Optional[dict] = None, - multiply_coeff: bool = True, -): - """Converts an instruction tuple into a quantum operator. - - Args: - inst (tuple): The instruction tuple. - op_dict (dict, optional): Dictionary mapping operator names to strings. Defaults to None. - op_connectors_dict (dict, optional): Dictionary mapping operator connectors to operations. Defaults to None. - multiply_coeff (bool): Multiplies coefficient to final quantum operator if True, or keep them separate in a tuple otherwise. Defaults to True. - - Returns: - The quantum operator if multiply_coeff is True, or a tuple containing the coefficient and operator string otherwise. - """ - coeff, s, op_qid_list = inst - - # construct op_dict and op_connectors_dict check dictionaries (involves strings and string operations) - if op_dict is None: - op_dict_check = { - "b": {}, - "bdag": {}, - "O": {}, - "X": {}, - "Z01": {}, - "sp01": {}, - } - for k in op_qid_list: - op_dict_check["b"].update({k: f"op_b_{k}"}) - op_dict_check["bdag"].update({k: f"op_bdag_{k}"}) - op_dict_check["O"].update({k: f"op_O_{k}"}) - op_dict_check["X"].update({k: f"op_X_{k}"}) - op_dict_check["Z01"].update({k: f"op_Z01_{k}"}) - op_dict_check["sp01"].update({k: f"op_sp01_{k}"}) - op_dict = op_dict_check - - if op_connectors_dict is None: - op_connectors_dict_check = OrderedDict( - [ - ("^", lambda a, b: f"tensor({a},{b})"), - ("*", lambda a, b: f"times({a},{b})"), - ("+", lambda a, b: f"plus({a},{b})"), - ("-", lambda a, b: f"minus({a},{b})"), - ] - ) - op_connectors_dict = op_connectors_dict_check - - def process_op(op_list: list, connector_list: list[str], connector: str) -> list: - """Implements connectors between operators.""" - index_list = [] - for i in range(connector_list.count(connector)): - ind = connector_list.index(connector) - index_list.append(ind + len(index_list)) - connector_list.pop(ind) - - new_op_list = [] - for i, op in enumerate(op_list): - if i in index_list: - next_op = op_list[i + 1] - if i - 1 in index_list: - new_op_list[-1] = op_connectors_dict[connector]( - new_op_list[-1], next_op - ) - else: - new_op_list.append(op_connectors_dict[connector](op, next_op)) - elif i - 1 in index_list: - pass - else: - new_op_list.append(op) - return new_op_list, connector_list - - # convert operator instruction strings into list of components - split_inst = s.split(" ") - op_list = [] - # implement operators - for op_key in split_inst[::2]: - op_name, qid = op_key.split("_") - op_list.append(op_dict[op_name][qid]) - # implement operator connections - connector_list = split_inst[1::2] - for connector in list(op_connectors_dict.keys()): - op_list, connector_list = process_op(op_list, connector_list, connector) - - if multiply_coeff: - return coeff * op_list[0] - else: - return coeff, op_list[0] diff --git a/src/qibolab/instruments/emulator/engines/qutip_engine.py b/src/qibolab/instruments/emulator/engines/qutip_engine.py deleted file mode 100644 index 80234265c7..0000000000 --- a/src/qibolab/instruments/emulator/engines/qutip_engine.py +++ /dev/null @@ -1,527 +0,0 @@ -""" -qutip_engine.py ----------------- -This module provides a engine for Quantum Toolbox in Python (QuTiP) to simulate QPUs. -""" - -from collections import OrderedDict -from timeit import default_timer as timer -from typing import Optional - -import numpy as np -from qutip import Options, Qobj, basis, expect, ket2dm, mesolve, ptrace -from qutip.core.operators import identity as Id -from qutip.core.tensor import tensor -from qutip.ui.progressbar import EnhancedTextProgressBar - -from qibolab.instruments.emulator.engines.generic import ( - dec_to_basis_string, - function_from_array, - op_from_instruction, - specify_hilbert_space, -) - -LITTLE_ENDIAN = True - - -def get_default_qutip_sim_opts(): - """Returns the default simulation options for the Qutip engine. - - Returns: - Options: The default simulation options. - """ - sim_opts = Options(atol=1e-11, rtol=1e-9, nsteps=int(1e6)) - sim_opts.normalize_output = False # mesolve is x3 faster if this is False - - return sim_opts - - -class QutipSimulator: - """Builds pulse simulator components in qutip engine. Pulse simulation is - implemented by `qevolve` method. QutipSimulator does not interact with - Qibolab. - - Note that objects have either little or big endian order. - Little endian: decreasing order of qubit/coupler index (smallest index = 0). - Big endian: increasing order of qubit index/coupler index. - Full system Hilbert space structure: little endian, qubits first then couplers. - """ - - def __init__(self, model_config: dict, sim_opts: Optional[Options] = None): - """Initializes with qutip simulation engine with model_config and qutip - simulation options. - - Args: - model_config (dict): Model configuration dictionary. - sim_opts (`qutip.Options`, optional): Qutip simulation options. If None, default - options are used. - """ - self.model_config = model_config - if sim_opts is None: - sim_opts = get_default_qutip_sim_opts() - self.sim_opts = sim_opts - self.update() - - def update(self): - """Updates the simulation engine by loading all parameters from - `self.model_config` and `self.sim_opts`.""" - ### from model_config ### - self.nlevels_q = self.model_config["nlevels_q"] # as per runcard, big endian - self.nlevels_c = self.model_config["nlevels_c"] # as per runcard, big endian - self.qubits_list = self.model_config[ - "qubits_list" - ] # as per runcard, big endian - self.couplers_list = self.model_config[ - "couplers_list" - ] # as per runcard, big endian - self.HS_list, self.nlevels_HS = specify_hilbert_space( - self.model_config, LITTLE_ENDIAN - ) - - self.topology = self.model_config["topology"] - self.nqubits = len(self.qubits_list) - self.ncouplers = len(self.couplers_list) - self.sim_method = self.model_config["method"] - - ### derived parameters ### - self.qid_nlevels_map = {} # coupler and qubit cannot have the same label - for i, c in enumerate(self.couplers_list): - self.qid_nlevels_map.update({c: self.nlevels_c[i]}) - for i, q in enumerate(self.qubits_list): - self.qid_nlevels_map.update({q: self.nlevels_q[i]}) - - ### n-level qubit/coupler base operators ### - self.op_dict = {"basis": {}, "sig": {}, "pm1_matrix": {}, "id": {}} - for qid, nlevels in self.qid_nlevels_map.items(): - basis_list = [basis(nlevels, i) for i in range(nlevels)] - sig = [ - [basis_list[i] * basis_list[j].dag() for j in range(nlevels)] - for i in range(nlevels) - ] - self.op_dict["basis"].update({qid: basis_list}) - self.op_dict["sig"].update({qid: sig}) - self.op_dict["pm1_matrix"].update( - {qid: [(sig[i][i + 1] + sig[i + 1][i]) / 2 for i in range(nlevels - 1)]} - ) - Id = sig[0][0] - for i in range(1, nlevels): - Id += sig[i][i] - self.op_dict["id"].update({qid: Id}) - - ### operator connector dictionary ### - self.op_connectors_dict = OrderedDict( - [ - ("^", lambda a, b: tensor(a, b)), - ("*", lambda a, b: a * b), - ("+", lambda a, b: a + b), - ("-", lambda a, b: a - b), - ] - ) - - ### multi-qubit qubit-coupler up-state ### - self.basis_list = self.op_dict["basis"] - self.psi0 = Qobj(1) - for i, qind in enumerate(self.HS_list): - if i == 0: - self.psi0 = self.basis_list[qind][0] - else: - self.psi0 = tensor(self.psi0, self.basis_list[qind][0]) - - ### build dictionary of base qutip operators ### - self.op_dict.update( - { - "b": {}, - "bdag": {}, - "O": {}, - "X": {}, - "Z01": {}, - "sp01": {}, - } - ) - - ### Construct qutip op_dict for each qubit and coupler ### - for qid, nlevels in self.qid_nlevels_map.items(): - sig = self.op_dict["sig"][qid] - b = sig[0][1] - for i in range(nlevels - 2): - b += np.sqrt(i + 2) * sig[i + 1][i + 2] - bdag = b.dag() - O = bdag * b - X = b + bdag - Z01 = sig[0][0] - sig[1][1] - sp01 = sig[0][1] - - self.op_dict["b"].update({qid: b}) - self.op_dict["bdag"].update({qid: bdag}) - self.op_dict["O"].update({qid: O}) - self.op_dict["X"].update({qid: X}) - self.op_dict["Z01"].update({qid: Z01}) - self.op_dict["sp01"].update({qid: sp01}) - - ## initialize operators ## - self.drift = Qobj(dims=[self.nlevels_HS, self.nlevels_HS]) - self.operators = {} - self.static_dissipators = [] - - ### drift ### - for op_instruction in self.model_config["drift"]["one_body"]: - self.drift += self.make_operator(op_instruction) - for op_instruction in self.model_config["drift"]["two_body"]: - self.drift += self.make_operator(op_instruction) - - ### drive ### - for channel_name, op_instruction_list in self.model_config["drive"].items(): - channel_op = Qobj(dims=[self.nlevels_HS, self.nlevels_HS]) - for op_instruction in op_instruction_list: - channel_op += self.make_operator(op_instruction) - self.operators.update({channel_name: channel_op}) - - ### dissipation ### - for op_instruction in self.model_config["dissipation"]["t1"]: - self.static_dissipators += [self.make_operator(op_instruction)] - for op_instruction in self.model_config["dissipation"]["t2"]: - self.static_dissipators += [self.make_operator(op_instruction)] - - def make_arbitrary_state( - self, statedata: np.ndarray, is_qibo_state_vector: bool = False - ) -> Qobj: - """Creates a quantum state object of the full system Hilbert space - using the given state data. - - Args: - statedata (np.ndarray): The state data, in little endian order for compatibility with pulse simulation. - is_qibo_state_vector (bool): Flag to change statedata from big endian (qibo convention) to little endian order. - - Returns: - `qutip.Qobj`: The quantum state object. - """ - if len(statedata.shape) == 1: # statevector - dims = [self.nlevels_HS, np.ones(len(self.nlevels_HS), dtype=int).tolist()] - else: # density matrix - dims = [self.nlevels_HS, self.nlevels_HS] - arbitrary_state = make_arbitrary_state(statedata, dims) - if is_qibo_state_vector is True: - arbitrary_state = self.flip_HS(arbitrary_state) - - return arbitrary_state - - def extend_op_dim( - self, op_qobj: Qobj, op_indices_q: list[int] = [0], op_indices_c: list[int] = [] - ) -> Qobj: - """Extends the dimension of an operator from its local Hilbert space to - the full system Hilbert space. - - Args: - op_qobj (`qutip.Qobj`): The quantum object representation of the operator in the local Hilbert space. - op_indices_q (list): List of qubit indices involved in the operator, in little endian order. - op_indices_c (list): List of coupler indices involved in the operator, in little endian order. - - Returns: - `qutip.Qobj`: The quantum object representation of the operator in the full system Hilbert space. - """ - return extend_op_dim( - op_qobj, - op_indices_q, - op_indices_c, - nlevels_q=self.nlevels_q, - nlevels_c=self.nlevels_c, - ) - - def make_operator(self, op_instruction) -> Qobj: - """Constructs the operator specified by op_instruction as a Qobj and - extends it to the full system Hilbert space. - - Args: - op_instruction (tuple): The instruction tuple containing the coefficient, operator string, and a list of qubit IDs that the operator acts on. The operator string and the qubit ID list are required to be in little endian order, and should have consistent qubit IDs. - - Returns: - `qutip.Qobj`: The quantum object representation of the operator in the full system Hibert space. - """ - coeff, s, op_qid_list = op_instruction - op_localHS = op_from_instruction( - op_instruction, - op_dict=self.op_dict, - op_connectors_dict=self.op_connectors_dict, - ) - - op_indices_q = [] - op_indices_c = [] - for k in op_qid_list: - if k in self.qubits_list: - op_indices_q.append(self.qubits_list.index(k)) - if k in self.couplers_list: - op_indices_c.append(self.couplers_list.index(k)) - - op_fullHS = self.extend_op_dim( - op_localHS, op_indices_q=op_indices_q, op_indices_c=op_indices_c - ) - return op_fullHS - - def flip_HS(self, state: Qobj): - """Changes state from little endian ordering (qubits, couplers) to big - endian (qubits, couplers) and vice versa, while retaining the same - Hilbert space structure with qubits first followed by couplers.""" - nqubits_total = self.nqubits + self.ncouplers - flipped_q_indices = np.flip(range(nqubits_total)[: self.nqubits]) - flipped_c_indices = np.flip(range(nqubits_total)[self.nqubits :]) - reordering_flip = np.append(flipped_q_indices, flipped_c_indices).astype(int) - - return state.permute(reordering_flip) - - def qevolve( - self, - channel_waveforms: dict, - simulate_dissipation: bool = False, - ) -> tuple[np.ndarray, list[int]]: - """Performs the quantum dynamics simulation. - - Args: - channel_waveforms (dict): The dictionary containing the list of discretized time steps and the corresponding channel waveform amplitudes labelled by the respective channel names. - simulate_dissipation (bool): Flag to add (True) or not (False) the dissipation terms associated with T1 and T2 times. - - Returns: - tuple: A tuple containing a dictionary of time-related information (sequence duration, simulation time step, and simulation time), the reduced density matrix of the quantum state at the end of simulation in the Hilbert space specified by the qubits present in the readout channels (little endian), as well as the corresponding list of qubit indices. - """ - full_time_list = channel_waveforms["time"] - channel_names = list(channel_waveforms["channels"].keys()) - - fp_list = [] - for channel_name in channel_names: - fp_list.append( - function_from_array( - channel_waveforms["channels"][channel_name], full_time_list - ) - ) - - drift = self.drift - scheduled_operators = [] - ro_qubit_list = [] - - # add corresponding operators for non-readout channels to scheduled_operators; add qubit indices of readout channels to ro_qubit_list - for channel_name in channel_names: - if channel_name[:2] != "R-": - scheduled_operators.append(self.operators[channel_name]) - else: - ro_qubit_list.append(int(channel_name[2:])) - ro_qubit_list = np.flip(np.sort(ro_qubit_list)) - - if simulate_dissipation is True: - static_dissipators = self.static_dissipators - else: - static_dissipators = [] - - H = [drift] - for i, op in enumerate(scheduled_operators): - H.append([op, fp_list[i]]) - - sim_start_time = timer() - if self.sim_method == "master_equation": - result = mesolve( - H, - self.psi0, - full_time_list, - c_ops=static_dissipators, - options=self.sim_opts, - progress_bar=EnhancedTextProgressBar( - len(full_time_list), int(len(full_time_list) / 100) - ), - ) - - sim_end_time = timer() - sim_time = sim_end_time - sim_start_time - - final_state = result.states[ - -1 - ] # result.states in little endian, opposite to qibo convention - - times_dict = { - "sequence_duration": full_time_list[-1], - "simulation_dt": full_time_list[1], - "simulation_time": sim_time, - } - - return ( - times_dict, - result.states, - *self.qobj_to_reduced_dm(final_state, ro_qubit_list), - ) - - def qobj_to_reduced_dm( - self, emu_qstate: Qobj, qubit_list: list[int] - ) -> tuple[np.ndarray, list[int]]: - """Computes the reduced density matrix of the emulator quantum state - specified by `qubit_list`. - - Args: - emu_qstate (`qutip.Qobj`): Quantum state (full system Hilbert space). - qubit_list (list): List of target qubit indices to keep in the reduced density matrix. Order of qubit indices is not important. - - Returns: - tuple: The resulting reduced density matrix and the little endian ordered list of qubit indices specifying the Hilbert space of the reduced density matrix. - """ - hilbert_space_ind_list = [] - for qubit_ind in qubit_list: - hilbert_space_ind_list.append( - self.nqubits - 1 - qubit_ind - ) # based on little endian order of HS, qubits only; independent of couplers - reduced_dm = ptrace(emu_qstate, hilbert_space_ind_list).full() - rdm_qubit_list = np.flip(np.sort(qubit_list)).tolist() - - return reduced_dm, rdm_qubit_list - - def state_from_basis_vector( - self, basis_vector: list[int], cbasis_vector: list[int] = None - ) -> Qobj: - """Constructs the corresponding computational basis state of the - generalized Hilbert space specified by qubit_list. - - Args: - basis_vector (list[int]): Generalized bitstring that specifies the computational basis state corresponding to the qubits in big endian order. - cbasis_vector (list[int]): Generalized bitstring that specifies the computational basis state corresponding to the couplers in big endian order. - - Returns: - `qutip.Qobj`: Computational basis state consistent with Hilbert space - structure: little endian, qubits first then couplers. - Raises: - Exception: If the length of basis_vector is not equal to `self.nqubits` or the length of cbasis_vector is not equal to `self.ncouplers`. - """ - # checks - if len(basis_vector) != self.nqubits: - raise Exception("length of basis_vector does not match number of qubits!") - if cbasis_vector is None: - cbasis_vector = [0 for c in range(self.ncouplers)] - else: - if len(cbasis_vector) != self.ncouplers: - raise Exception( - "length of cbasis_vector does not match number of couplers!" - ) - - basis_list = self.op_dict["basis"] - fullstate = Qobj(1) - - combined_basis_vector = cbasis_vector + basis_vector - combined_list = self.couplers_list + self.qubits_list - for ind, coeff in enumerate(combined_basis_vector): - qind = combined_list[ind] - fullstate = tensor( - basis_list[qind][coeff], fullstate - ) # constructs little endian HS, qubits first then couplers, as per evolution - - return fullstate - - def compute_overlaps( - self, - target_states: list[Qobj], - reference_states: Optional[dict[str, Qobj]] = None, - ) -> dict: - """Calculates the overlaps between a list of target device states, with - respect to a list of reference device states. - - Args: - target_states (list): List of target states (`qutip.Qobj`) of interest. - reference_states (dict, optional): Reference states labelled by their respective keys to compare `target_states` with. If not provided, all basis states of the full device Hilbert space labelled by their generalized bitstrings will be used. - - Returns: - dict: Overlaps for each target state with each reference state. - """ - if reference_states is None: - reference_states = {} - - full_HS_dim = np.prod(self.nlevels_HS) - for state_id in range(full_HS_dim): - basis_string = dec_to_basis_string(state_id, self.nlevels_HS) - basis_state = self.state_from_basis_vector( - basis_string[: self.nqubits], basis_string[self.nqubits :] - ) - psi = ket2dm(basis_state) - reference_states.update({str(basis_string): psi}) - - total_samples = len(target_states) - all_overlaps = {} - for label, ref_state in reference_states.items(): - fid_list = [expect(ref_state, state) for state in target_states] - all_overlaps.update({label: fid_list}) - - return all_overlaps - - -def make_arbitrary_state(statedata: np.ndarray, dims: list[int]) -> Qobj: - """Create a quantum state object using the given state data and dimensions. - - Args: - statedata (np.ndarray): The state data. - dims (list): The dimensions of the state. - - Returns: - `qutip.Qobj`: The quantum state object. - """ - shape = (np.prod(dims[0]), np.prod(dims[1])) - if shape[1] == 1: - statetype = "ket" - elif shape[0] == shape[1]: - statetype = "oper" - - return Qobj(statedata, dims=dims, shape=shape, type=statetype) - - -def extend_op_dim( - op_qobj: Qobj, - op_indices_q: list[int] = [0], - op_indices_c: list[int] = [], - nlevels_q: list[int] = [2], - nlevels_c: list[int] = [], -) -> Qobj: - """Extenda the dimension of the input operator from its local Hilbert space - to a larger n-body Hilbert space. - - Args: - op_qobj (`qutip.Qobj`): The quantum object representation of the operator in the local Hilbert space. - op_indices_q (list): List of qubit indices involved in the operator, in little endian order. Defaults to [0]. - op_indices_c (list): List of coupler indices involved in the operator, in little endian order. Defaults to []. - nlevels_q (list): List of the number of levels for each qubit, in big endian order. Defaults to [2]. - nlevels_c (list): List of the number of levels for each coupler, in big endian order. Defaults to []. - - Returns: - `qutip.Qobj`: The quantum object representation of the operator in the Hilbert space with extended dimensions. Hilbert space structure: little endian, qubits first then couplers. - - Raises: - Exception: If the length of op_qobj.dims[0] does not match the sum of the lengths of op_indices_q and op_indices_c, or if nlevels_q and nlevels_c inputs do not support op_indices_q and op_indices_c, or if dimensions of local Hilbert space operator do not match the nlevels of op_indices_q and op_indices_c. - """ - - ncouplers = len(nlevels_c) - nqubits = len(nlevels_q) - nlevels_cq = nlevels_c + nlevels_q # reverse order from Hilbert space structure - op_indices_q_shifted = [ind + ncouplers for ind in op_indices_q] - op_indices_full = op_indices_q_shifted + op_indices_c - - full_index_list = np.flip(range(nqubits + ncouplers)) - missing_indices = list(full_index_list.copy()) - for ind in full_index_list: - if ind in op_indices_full: - pos = np.where(ind == missing_indices)[0][0] - missing_indices.pop(pos) - - unordered_index_list = op_indices_full + missing_indices - - # checks - if len(op_qobj.dims[0]) != len(op_indices_q) + len(op_indices_c): - raise Exception("op indices and op mismatch!") - try: - nlevels_HS_local = [] - for ind_q in op_indices_q: - nlevels_HS_local.append(nlevels_q[ind_q]) - for ind_c in op_indices_c: - nlevels_HS_local.append(nlevels_c[ind_c]) - except: - raise Exception("op indices dim and nlevels mismatch!") - for ind, nlevel in enumerate(nlevels_HS_local): - if nlevel != op_qobj.dims[0][ind]: - raise Exception(f"mismatch in op dim: index {ind}!") - - full_qobj = op_qobj - for ind in missing_indices: - full_qobj = tensor(full_qobj, Id(nlevels_cq[ind])) - - inverse_qubit_order = np.flip(np.argsort(unordered_index_list)) - - return full_qobj.permute(inverse_qubit_order) diff --git a/src/qibolab/instruments/emulator/models/general_no_coupler_model.py b/src/qibolab/instruments/emulator/models/general_no_coupler_model.py deleted file mode 100644 index c7b37aa1d9..0000000000 --- a/src/qibolab/instruments/emulator/models/general_no_coupler_model.py +++ /dev/null @@ -1,156 +0,0 @@ -from typing import Optional - -import numpy as np - -from qibolab.instruments.emulator.models.methods import ( - default_noflux_platform_to_simulator_channels, -) - - -# model template for 0-1 system -def generate_default_params(): - # all time in ns and frequency in GHz - """Returns template model parameters dictionary.""" - model_params = { - "model_name": "general_no_coupler_model", - "topology": [[0, 1]], - "nqubits": 2, - "ncouplers": 0, - "qubits_list": ["0", "1"], - "couplers_list": [], - "nlevels_q": [2, 2], - "nlevels_c": [], - "readout_error": { - # same key datatype as per runcard - 0: [0.01, 0.02], - 1: [0.01, 0.02], - }, - "drive_freq": { - "0": 5.0, - "1": 5.1, - }, - "T1": { - "0": 0.0, - "1": 0.0, - }, - "T2": { - "0": 0.0, - "1": 0.0, - }, - "lo_freq": { - "0": 5.0, - "1": 5.1, - }, - "rabi_freq": { - "0": 0.2, - "1": 0.2, - }, - "anharmonicity": { - "0": -0.20, - "1": -0.21, - }, - "coupling_strength": { - "1_0": 5.0e-3, - }, - } - return model_params - - -def generate_model_config( - model_params: dict = None, - nlevels_q: Optional[list] = None, - topology: Optional[list] = None, -) -> dict: - """Generates the model configuration dictionary. - - Args: - model_params(dict): Dictionary containing the model parameters. - nlevels_q(list, optional): List of the dimensions of each qubit to be simulated, in big endian order. Defaults to None, in which case it will use the values of model_params['nlevels_q'] will be used. - topology(list, optional): List containing all pairs of qubit indices that are nearest neighbours. Defaults to none, in which case the value of model_params['topology'] will be used. - - Returns: - dict: Model configuration dictionary with all frequencies in GHz and times in ns. - """ - if model_params is None: - model_params = generate_default_params() - - # allows for user to overwrite topology in model_params for quick test - if topology is None: - topology = model_params["topology"] - - model_name = model_params["model_name"] - readout_error = model_params["readout_error"] - qubits_list = model_params["qubits_list"] - - rabi_freq_dict = model_params["rabi_freq"] - - if nlevels_q is None: - nlevels_q = model_params["nlevels_q"] - - drift_hamiltonian_dict = {"one_body": [], "two_body": []} - drive_hamiltonian_dict = {} - - dissipation_dict = {"t1": [], "t2": []} - - # generate instructions - # single qubit terms - for i, q in enumerate(qubits_list): - # drift Hamiltonian terms (constant in time) - drift_hamiltonian_dict["one_body"].append( - (2 * np.pi * model_params["lo_freq"][q], f"O_{q}", [q]) - ) - drift_hamiltonian_dict["one_body"].append( - ( - np.pi * model_params["anharmonicity"][q], - f"O_{q} * O_{q} - O_{q}", - [q], - ) - ) - - # drive Hamiltonian terms (amplitude determined by pulse sequence) - drive_hamiltonian_dict.update({f"D-{qubits_list[i]}": []}) - drive_hamiltonian_dict[f"D-{qubits_list[i]}"].append( - (2 * np.pi * model_params["rabi_freq"][q], f"X_{q}", [q]) - ) - - # dissipation terms (one qubit, constant in time) - t1 = model_params["T1"][q] - g1 = 0 if t1 == 0 else 1.0 / t1 * 2 * np.pi - t2 = model_params["T2"][q] - g2 = 0 if t1 == 0 else 1.0 / t2 * 2 * np.pi - - dissipation_dict["t1"].append((np.sqrt(g1 / 2), f"sp01_{q}", [q])) - dissipation_dict["t2"].append((np.sqrt(g2 / 2), f"Z01_{q}", [q])) - - # two-body terms (couplings) - for key in list(model_params["coupling_strength"].keys()): - ind2, ind1 = key.split( - "_" - ) # ind2 > ind1 with ind_qubit > ind_coupler as per Hilbert space ordering - coupling = model_params["coupling_strength"][key] - drift_hamiltonian_dict["two_body"].append( - ( - 2 * np.pi * coupling, - f"bdag_{ind2} ^ b_{ind1} + b_{ind2} ^ bdag_{ind1}", - [ind2, ind1], - ) - ) - - model_config = { - "model_name": model_name, - "topology": topology, - "qubits_list": qubits_list, - "nlevels_q": nlevels_q, - "couplers_list": [], - "nlevels_c": [], - "drift": drift_hamiltonian_dict, - "drive": drive_hamiltonian_dict, - "dissipation": dissipation_dict, - "method": "master_equation", - "readout_error": readout_error, - "platform_to_simulator_channels": default_noflux_platform_to_simulator_channels( - qubits_list, couplers_list=[] - ), - } - - return model_config diff --git a/src/qibolab/instruments/emulator/models/methods.py b/src/qibolab/instruments/emulator/models/methods.py deleted file mode 100644 index 1ab27f4d1d..0000000000 --- a/src/qibolab/instruments/emulator/models/methods.py +++ /dev/null @@ -1,20 +0,0 @@ -import operator -from functools import reduce - - -def default_noflux_platform_to_simulator_channels( - qubits_list: list, couplers_list: list -) -> dict: - """Returns the default dictionary that maps platform channel names to simulator channel names. - Args: - qubits_list (list): List of qubit names to be included in the simulation. - couplers_list (list): List of coupler names to be included in the simulation. - - Returns: - dict: Mapping between platform channel names to simulator chanel names. - """ - return reduce( - operator.or_, - [{f"drive-{q}": f"D-{q}", f"readout-{q}": f"R-{q}"} for q in qubits_list] - + [{f"drive-{c}": f"D-{c}"} for c in couplers_list], - ) diff --git a/src/qibolab/instruments/emulator/models/models_template.py b/src/qibolab/instruments/emulator/models/models_template.py deleted file mode 100644 index 2efed9b8da..0000000000 --- a/src/qibolab/instruments/emulator/models/models_template.py +++ /dev/null @@ -1,178 +0,0 @@ -import numpy as np - -from qibolab.instruments.emulator.models.methods import ( - default_noflux_platform_to_simulator_channels, -) - - -# model template for 0-c1-1 system -def generate_default_params(): - # all time in ns and frequency in GHz - """Returns template model parameters dictionary.""" - model_params = { - "model_name": "models_template", - "topology": [[0, 1]], - "nqubits": 2, - "ncouplers": 1, - "qubits_list": ["0", "1"], - "couplers_list": ["c1"], - "sampling_rate": 2.0, # units of samples/ns - "readout_error": { - # same key datatype as per runcard - 0: [0.01, 0.02], - 1: [0.01, 0.02], - }, - "drive_freq": { - "0": 5.0, - "1": 5.1, - }, - "T1": { - "0": 0.0, - "1": 0.0, - }, - "T2": { - "0": 0.0, - "1": 0.0, - }, - "lo_freq": { - "0": 5.0, - "1": 5.1, - "c1": 6.5, - }, - "rabi_freq": { - "0": 0.2, - "1": 0.2, - }, - "anharmonicity": { - "0": -0.20, - "1": -0.21, - "c1": -0.1, - }, - "coupling_strength": { - "1_c1": 101.0e-3, - "0_c1": 100.0e-3, - "1_0": 5.0e-3, - }, - } - return model_params - - -# template for general (no flux) model -def generate_model_config( - model_params: dict = None, - nlevels_q: list = None, - nlevels_c: list = None, - topology: list = None, -) -> dict: - """Generates a template model configuration dictionary. - - Args: - model_params(dict): Dictionary containing the model parameters. - nlevels_q(list, optional): List of the dimensions of each qubit to be simulated, in big endian order. Defaults to none, in which case a list of 2s with the same length as model_params['qubits_list'] will be used. - nlevels_c(list, optional): List of the dimensions of each coupler to be simulated, in big endian order. Defaults to none, in which case a list of 2s with the same length as model_params['couplers_list'] will be used. - topology(list, optional): List containing all pairs of qubit indices that are nearest neighbours. Defaults to none, in which case the value of model_params['topology'] will be used. - - Returns: - dict: Model configuration dictionary with all frequencies in GHz and times in ns. - """ - if model_params is None: - model_params = generate_default_params() - - # allows for user to overwrite topology in model_params for quick test - if topology is None: - topology = model_params["topology"] - - model_name = model_params["model_name"] - sampling_rate = model_params["sampling_rate"] - readout_error = model_params["readout_error"] - qubits_list = model_params["qubits_list"] - couplers_list = model_params["couplers_list"] - - if nlevels_q is None: - nlevels_q = [2 for q in qubits_list] - if nlevels_c is None: - nlevels_c = [2 for c in couplers_list] - - rabi_freq_dict = model_params["rabi_freq"] - - drift_hamiltonian_dict = {"one_body": [], "two_body": []} - drive_hamiltonian_dict = {} - - dissipation_dict = {"t1": [], "t2": []} - - # generate instructions - # single qubit terms - for i, q in enumerate(qubits_list): - # drift Hamiltonian terms (constant in time) - drift_hamiltonian_dict["one_body"].append( - (2 * np.pi * model_params["lo_freq"][q], f"O_{q}", [q]) - ) - drift_hamiltonian_dict["one_body"].append( - ( - np.pi * model_params["anharmonicity"][q], - f"O_{q} * O_{q} - O_{q}", - [q], - ) - ) - - # drive Hamiltonian terms (amplitude determined by pulse sequence) - drive_hamiltonian_dict.update({f"D-{qubits_list[i]}": []}) - drive_hamiltonian_dict[f"D-{qubits_list[i]}"].append( - (2 * np.pi * model_params["rabi_freq"][q], f"X_{q}", [q]) - ) - - # dissipation terms (one qubit, constant in time) - t1 = model_params["T1"][q] - g1 = 0 if t1 == 0 else 1.0 / t1 - t2 = model_params["T2"][q] - g2 = 0 if t1 == 0 else 1.0 / t2 - - dissipation_dict["t1"].append((np.sqrt(g1), f"sp01_{q}", [q])) - dissipation_dict["t2"].append((np.sqrt(g2), f"Z01_{q}", [q])) - - # single coupler terms - for i, c in enumerate(couplers_list): - # drift Hamiltonian terms (constant in time) - drift_hamiltonian_dict["one_body"].append( - (2 * np.pi * model_params["lo_freq"][c], f"O_{c}", [c]) - ) - drift_hamiltonian_dict["one_body"].append( - ( - np.pi * model_params["anharmonicity"][c], - f"O_{c} * O_{c} - O_{c}", - [c], - ) - ) - - ## two-body terms (couplings) - for key in list(model_params["coupling_strength"].keys()): - ind2, ind1 = key.split( - "_" - ) # ind2 > ind1 with ind_qubit > ind_coupler as per Hilbert space ordering - coupling = model_params["coupling_strength"][key] - drift_hamiltonian_dict["two_body"].append( - ( - 2 * np.pi * coupling, - f"bdag_{ind2} ^ b_{ind1} + b_{ind2} ^ bdag_{ind1}", - [ind2, ind1], - ) - ) - - model_config = { - "model_name": model_name, - "topology": topology, - "qubits_list": qubits_list, - "nlevels_q": nlevels_q, - "couplers_list": couplers_list, - "nlevels_c": nlevels_c, - "drift": drift_hamiltonian_dict, - "drive": drive_hamiltonian_dict, - "dissipation": dissipation_dict, - "method": "master_equation", - "readout_error": readout_error, - "platform_to_simulator_channels": default_noflux_platform_to_simulator_channels( - qubits_list, couplers_list - ), - } - - return model_config diff --git a/src/qibolab/instruments/emulator/pulse_simulator.py b/src/qibolab/instruments/emulator/pulse_simulator.py deleted file mode 100644 index 3e40b1b5ba..0000000000 --- a/src/qibolab/instruments/emulator/pulse_simulator.py +++ /dev/null @@ -1,759 +0,0 @@ -"""Pulse simulator module for running quantum dynamics simulation of model of -device.""" - -import copy -import operator -from typing import Union - -import numpy as np -import numpy.typing as npt - -from qibolab import AcquisitionType, AveragingMode, ExecutionParameters -from qibolab.instruments.abstract import Controller -from qibolab.instruments.emulator.engines.qutip_engine import QutipSimulator -from qibolab.instruments.emulator.models import general_no_coupler_model -from qibolab.qubits import Qubit, QubitId -from qibolab.result import average, collect -from qibolab.sequence import PulseSequence -from qibolab.sweeper import Parameter, Sweeper, SweeperType - -AVAILABLE_SWEEP_PARAMETERS = { - Parameter.amplitude, - Parameter.duration, - Parameter.frequency, - Parameter.relative_phase, -} - -SIMULATION_ENGINES = { - "Qutip": QutipSimulator, -} - -MODELS = { - "general_no_coupler_model": general_no_coupler_model, -} - -GHZ = 1e9 - - -class PulseSimulator(Controller): - """Runs quantum dynamics simulation of model of device. - - Interfaces with Qibolab. Useful for testing code without requiring - access to hardware. - """ - - PortType = None - - def __init__(self): - super().__init__(name=None, address=None) - - @property - def sampling_rate(self): - return self._sampling_rate - - def setup(self, **kwargs): - """Updates the pulse simulator by loading all parameters from - `model_config` and `simulation_config`.""" - super().setup(kwargs["bounds"]) - self.settings = kwargs - - simulation_config = kwargs["simulation_config"] - model_params = kwargs["model_params"] - sim_opts = kwargs["sim_opts"] - - model_name = model_params["model_name"] - model_config = MODELS[model_name].generate_model_config(model_params) - - simulation_engine_name = simulation_config["simulation_engine_name"] - self.simulation_engine = SIMULATION_ENGINES[simulation_engine_name]( - model_config, sim_opts - ) - - # Settings for pulse processing - self._sampling_rate = simulation_config["sampling_rate"] - self.sim_sampling_boost = simulation_config["sim_sampling_boost"] - self.runcard_duration_in_dt_units = simulation_config[ - "runcard_duration_in_dt_units" - ] - self.instant_measurement = simulation_config["instant_measurement"] - self.platform_to_simulator_channels = model_config[ - "platform_to_simulator_channels" - ] - - self.readout_error = { - int(k): v for k, v in model_config["readout_error"].items() - } - self.simulate_dissipation = simulation_config["simulate_dissipation"] - self.output_state_history = simulation_config["output_state_history"] - - def connect(self): - pass - - def disconnect(self): - pass - - def dump(self): - return self.settings - - def run_pulse_simulation( - self, - sequence: PulseSequence, - instant_measurement: bool = True, - ) -> tuple[np.ndarray, list]: - """Simulates the input pulse sequence. - - Args: - sequence (`qibolab.pulses.PulseSequence`): Pulse sequece to simulate. - instant_measurement (bool): Collapses readout pulses to duration of 1 if True. Defaults to True. - - Returns: - tuple: A tuple containing a dictionary of time-related information (sequence duration, simulation time step, and simulation time), the reduced density matrix of the quantum state at the end of simulation in the Hilbert space specified by the qubits present in the readout channels (little endian), as well as the corresponding list of qubit indices. - """ - # reduces measurement time to 1 dt to save simulation time - if instant_measurement: - sequence = truncate_ro_pulses(sequence) - - # extract waveforms from pulse sequence - channel_waveforms = ps_to_waveform_dict( - sequence, - self.platform_to_simulator_channels, - self.sampling_rate, - self.sim_sampling_boost, - self.runcard_duration_in_dt_units, - ) - - # execute pulse simulation in emulator - simulation_results = self.simulation_engine.qevolve( - channel_waveforms, self.simulate_dissipation - ) - - return simulation_results - - def play( - self, - qubits: dict[QubitId, Qubit], - couplers: dict[QubitId, Qubit], - sequence: PulseSequence, - execution_parameters: ExecutionParameters, - ) -> dict[str, npt.NDArray]: - """Executes the sequence of instructions and generates readout results, - as well as simulation-related time and states data. - - Args: - qubits (dict): Qubits involved in the device. Does not affect emulator. - couplers (dict): Couplers involved in the device. Does not affect emulator. - sequence (`qibolab.pulses.PulseSequence`): Pulse sequence to simulate. - execution_parameters (`qibolab.ExecutionParameters`): Parameters (nshots, - relaxation_time, - fast_reset, - acquisition_type, - averaging_mode) - - Returns: - dict: A dictionary mapping the readout pulses serial and respective qubits to - Qibolab results object, as well as simulation-related time and states data. - """ - nshots = execution_parameters.nshots - ro_pulse_list = sequence.acquisitions - times_dict, output_states, ro_reduced_dm, rdm_qubit_list = ( - self.run_pulse_simulation(sequence, self.instant_measurement) - ) - if not self.output_state_history: - output_states = output_states[-1] - - samples = get_samples( - nshots, - ro_reduced_dm, - rdm_qubit_list, - self.simulation_engine.qid_nlevels_map, - ) - # apply default readout noise - if self.readout_error is not None: - samples = apply_readout_noise(samples, self.readout_error) - # generate result object - results = get_results_from_samples(ro_pulse_list, samples, execution_parameters) - results["simulation"] = { - "sequence_duration": times_dict["sequence_duration"], - "simulation_dt": times_dict["simulation_dt"], - "simulation_time": times_dict["simulation_time"], - "output_states": output_states, - } - - return results - - ### sweeper adapted from icarusqfpga ### - def sweep( - self, - qubits: dict[QubitId, Qubit], - couplers: dict[QubitId, Qubit], - sequence: PulseSequence, - execution_parameters: ExecutionParameters, - *sweeper: list[Sweeper], - ) -> dict[str, Union[npt.NDArray, dict]]: - """Executes the sweep and generates readout results, as well as - simulation-related time and states data. - - Args: - qubits (dict): Qubits involved in the device. Does not affect emulator. - couplers (dict): Couplers involved in the device. Does not affect emulator. - sequence (`qibolab.pulses.PulseSequence`): Pulse sequence to simulate. - execution_parameters (`qibolab.ExecutionParameters`): Parameters (nshots, - relaxation_time, - fast_reset, - acquisition_type, - averaging_mode) - *sweepers (`qibolab.Sweeper`): Sweeper objects. - - Returns: - dict: A dictionary mapping the readout pulses serial and respective qubits to - Qibolab results objects, as well as simulation-related time and states data. - - Raises: - NotImplementedError: If sweep.parameter is not in AVAILABLE_SWEEP_PARAMETERS. - """ - sweeper_shape = [len(sweep.values) for sweep in sweeper] - - # Record pulse values before sweeper modification - bsv = [] - for sweep in sweeper: - param_name = sweep.parameter.name.lower() - if sweep.parameter not in AVAILABLE_SWEEP_PARAMETERS: - raise NotImplementedError( - "Sweep parameter requested not available", param_name - ) - base_sweeper_values = [getattr(pulse, param_name) for pulse in sweep.pulses] - bsv.append(base_sweeper_values) - - sweep_samples = self._sweep_recursion( - qubits, couplers, sequence, execution_parameters, *sweeper - ) - output_states_list = sweep_samples.pop("output_states") - sequence_duration_array = sweep_samples.pop("sequence_duration") - simulation_dt_array = sweep_samples.pop("simulation_dt") - simulation_time_array = sweep_samples.pop("simulation_time") - - # reshape output_states to sweeper dimensions - output_states_array = np.ndarray(sweeper_shape, dtype=list) - listlen = len(output_states_list) // np.prod(sweeper_shape) - array_indices = make_array_index_list(sweeper_shape) - for index in array_indices: - output_states_array[tuple(index)] = output_states_list[:listlen] - output_states_list = output_states_list[listlen:] - - # reshape time data to sweeper dimensions - sequence_duration_array = np.array(sequence_duration_array).reshape( - sweeper_shape - ) - simulation_dt_array = np.array(simulation_dt_array).reshape(sweeper_shape) - simulation_time_array = np.array(simulation_time_array).reshape(sweeper_shape) - - # reshape and reformat samples to results format - results = get_results_from_samples( - sequence.acquisitions, sweep_samples, execution_parameters, sweeper_shape - ) - - # Reset pulse values back to original values (following icarusqfpga) - for sweep, base_sweeper_values in zip(sweeper, bsv): - param_name = sweep.parameter.name.lower() - for pulse, value in zip(sweep.pulses, base_sweeper_values): - setattr(pulse, param_name, value) - # FIXME: this is copy-pasted from IcarusQ, check the comment in there - # Since the sweeper will modify the readout pulse serial, we collate the results with the qubit number. - # This is only for qibocal compatiability and will be removed with IcarusQ v2. - # if pulse.type is PulseType.READOUT: - # results[pulse.serial] = results[pulse.qubit] - - results.update( - { - "simulation": { - "sequence_duration": sequence_duration_array, - "simulation_dt": simulation_dt_array, - "simulation_time": simulation_time_array, - "output_states": output_states_array, - } - } - ) - - return results - - def _sweep_recursion( - self, - qubits: dict[QubitId, Qubit], - couplers: dict[QubitId, Qubit], - sequence: PulseSequence, - execution_parameters: ExecutionParameters, - *sweeper: Sweeper, - ) -> dict[Union[str, int], list]: - """Performs sweep by recursion. Appends sampled lists and other - simulation data obtained from each call of `self._sweep_play`. - - Args: - qubits (dict): Qubits involved in the device. Does not affect emulator. - couplers (dict): Couplers involved in the device. Does not affect emulator. - sequence (`qibolab.pulses.PulseSequence`): Pulse sequence to simulate. - execution_parameters (`qibolab.ExecutionParameters`): Parameters (nshots, - relaxation_time, - fast_reset, - acquisition_type, - averaging_mode) - *sweepers (`qibolab.Sweeper`): Sweeper objects. - - Returns: - dict: A dictionary mapping the qubit indices to list of sampled values, simulation-related time data, and simulated states data. - """ - - if len(sweeper) == 0: - times_dict, output_states, samples = self._sweep_play( - qubits, couplers, sequence, execution_parameters - ) - if not self.output_state_history: - output_states = [output_states[-1]] - samples.update({"output_states": output_states}) - for k, v in times_dict.items(): - samples.update({k: [v]}) - return samples - - sweep = sweeper[0] - param = sweep.parameter - param_name = param.name.lower() - - base_sweeper_values = [getattr(pulse, param_name) for pulse in sweep.pulses] - sweeper_op = _sweeper_operation.get(sweep.type) - ret = {} - - for value in sweep.values: - for idx, pulse in enumerate(sweep.pulses): - base = base_sweeper_values[idx] - setattr(pulse, param_name, sweeper_op(value, base)) - - self.merge_sweep_results( - ret, - self._sweep_recursion( - qubits, couplers, sequence, execution_parameters, *sweeper[1:] - ), - ) - - return ret - - def _sweep_play( - self, - qubits: dict[QubitId, Qubit], - couplers: dict[QubitId, Qubit], - sequence: PulseSequence, - execution_parameters: ExecutionParameters, - ) -> dict[Union[str, int], list]: - """Generates simulation-related time data, simulated states data, and - samples list labelled by qubit index. - - Args: - qubits (dict): Qubits involved in the device. Does not affect emulator. - couplers (dict): Couplers involved in the device. Does not affect emulator. - sequence (`qibolab.pulses.PulseSequence`): Pulse sequence to simulate. - execution_parameters (`qibolab.ExecutionParameters`): Parameters (nshots, - relaxation_time, - fast_reset, - acquisition_type, - averaging_mode) - - Returns: - dict: A tuple with dictionary containing simulation-related time data, a list of states at each time step in the simulation, and a dictionary mapping the qubit indices to list of sampled values. - """ - nshots = execution_parameters.nshots - ro_pulse_list = sequence.acquisitions - - # run pulse simulation - times_dict, state_history, ro_reduced_dm, rdm_qubit_list = ( - self.run_pulse_simulation(sequence, self.instant_measurement) - ) - # generate samples - samples = get_samples( - nshots, - ro_reduced_dm, - rdm_qubit_list, - self.simulation_engine.qid_nlevels_map, - ) - # apply default readout noise - if self.readout_error is not None: - samples = apply_readout_noise(samples, self.readout_error) - - return times_dict, state_history, samples - - @staticmethod - def merge_sweep_results( - dict_a: """dict[str, Union[npt.NDArray, list]]""", - dict_b: """dict[str, Union[npt.NDArray, list]]""", - ) -> """dict[str, Union[npt.NDArray, list]]""": - """Merges two dictionary mapping pulse serial to Qibolab results - object. - - If dict_b has a key (serial) that dict_a does not have, simply add it, - otherwise sum the two results - - Args: - dict_a (dict): dict mapping ro pulses serial to qibolab res objects - dict_b (dict): dict mapping ro pulses serial to qibolab res objects - Returns: - A dict mapping the readout pulses serial to Qibolab results objects - """ - for serial in dict_b: - if serial in dict_a: - dict_a[serial] = dict_a[serial] + dict_b[serial] - else: - dict_a[serial] = dict_b[serial] - return dict_a - - -_sweeper_operation = { - SweeperType.ABSOLUTE: lambda value, base: value, - SweeperType.OFFSET: operator.add, - SweeperType.FACTOR: operator.mul, -} - - -def ps_to_waveform_dict( - sequence: PulseSequence, - platform_to_simulator_channels: dict, - sampling_rate: float = 1.0, - sim_sampling_boost: int = 1, - runcard_duration_in_dt_units: bool = False, -) -> dict[str, Union[np.ndarray, dict[str, np.ndarray]]]: - """Converts pulse sequence to dictionary of time and channel separated - waveforms. - - Args: - sequence (`qibolab.pulses.PulseSequence`): Pulse sequence to simulate. - platform_to_simulator_channels (dict): A dictionary that maps platform channel names to simulator channel names. - sampling_rate (float): Sampling rate in units of samples/ns. Defaults to 1. - sim_sampling_boost (int): Additional factor multiplied to sampling_rate for improving numerical accuracy in simulation. Defaults to 1. - runcard_duration_in_dt_units (bool): If True, assumes that all time-related quantities in the runcard are expressed in units of inverse sampling rate and implements the necessary routines to account for that. If False, assumes that runcard time units are in ns. Defaults to False. - - Returns: - dict: A dictionary containing the full list of simulation time steps, as well as the corresponding discretized channel waveforms labelled by their respective simulation channel names. - """ - times_list = [] - signals_list = [] - emulator_channel_name_list = [] - - def channel_translator(platform_channel_name, frequency): - """Option to add frequency specific channel operators.""" - try: - # frequency dependent channel operation - return platform_to_simulator_channels[platform_channel_name + frequency] - except: - # frequency independent channel operation (default) - return platform_to_simulator_channels[platform_channel_name] - - if runcard_duration_in_dt_units: - """Assumes pulse duration in runcard is in units of dt=1/sampling_rate, - i.e. time interval between samples. - - Pulse duration in this case is simply the total number of time - samples; pulse.start and pulse.duration are therefore integers, - and sampling_rate is only used to construct the value of dt in - ns. - """ - for qubit in sequence.qubits: - qubit_pulses = sequence.get_qubit_pulses(qubit) - for channel in qubit_pulses.channels: - channel_pulses = qubit_pulses.get_channel_pulses(channel) - for i, pulse in enumerate(channel_pulses): - start = int(pulse.start * sim_sampling_boost) - actual_pulse_frequency = ( - pulse.frequency - ) # store actual pulse frequency for channel_translator - # rescale frequency to be compatible with sampling_rate = 1 - pulse.frequency = pulse.frequency / sampling_rate - # need to first set pulse._if in GHz to use modulated_waveform_i method - pulse._if = pulse.frequency / GHZ - - i_env = pulse.envelope_waveform_i(sim_sampling_boost).data - q_env = pulse.envelope_waveform_q(sim_sampling_boost).data - - # Qubit drive microwave signals - end = start + len(i_env) - t = np.arange(start, end) / sampling_rate / sim_sampling_boost - cosalpha = np.cos( - 2 * np.pi * pulse._if * sampling_rate * t + pulse.relative_phase - ) - sinalpha = np.sin( - 2 * np.pi * pulse._if * sampling_rate * t + pulse.relative_phase - ) - pulse_signal = i_env * sinalpha + q_env * cosalpha - # pulse_signal = pulse_signal/np.sqrt(2) # uncomment for ibm runcard - - times_list.append(t) - signals_list.append(pulse_signal) - - if pulse.type.value == "qd": - platform_channel_name = f"drive-{qubit}" - # TODO: to add during flux pulse update - # elif pulse.type.value == "qf": - # platform_channel_name = f"flux-{qubit}" - elif pulse.type.value == "ro": - platform_channel_name = f"readout-{qubit}" - - # restore pulse frequency values - pulse.frequency = actual_pulse_frequency - pulse._if = pulse.frequency / GHZ - - emulator_channel_name_list.append( - channel_translator(platform_channel_name, pulse._if) - ) - - tmin, tmax = [], [] - for times in times_list: - tmin.append(np.amin(times)) - tmax.append(np.amax(times)) - - tmin = np.amin(tmin) - tmax = np.amax(tmax) - Nt = int(np.round((tmax - tmin) * sampling_rate * sim_sampling_boost) + 1) - full_time_list = np.linspace(tmin, tmax, Nt) - - else: - """Assumes pulse duration in runcard is in ns.""" - for qubit in sequence.qubits: - qubit_pulses = sequence.get_qubit_pulses(qubit) - for channel in qubit_pulses.channels: - channel_pulses = qubit_pulses.get_channel_pulses(channel) - for i, pulse in enumerate(channel_pulses): - sim_sampling_rate = sampling_rate * sim_sampling_boost - - start = int(pulse.start * sim_sampling_rate) - # need to first set pulse._if in GHz to use modulated_waveform_i method - pulse._if = pulse.frequency / GHZ - - i_env = pulse.envelope_waveform_i(sim_sampling_rate).data - q_env = pulse.envelope_waveform_q(sim_sampling_rate).data - - # Qubit drive microwave signals - end = start + len(i_env) - t = np.arange(start, end) / sim_sampling_rate - cosalpha = np.cos(2 * np.pi * pulse._if * t + pulse.relative_phase) - sinalpha = np.sin(2 * np.pi * pulse._if * t + pulse.relative_phase) - pulse_signal = i_env * sinalpha + q_env * cosalpha - # pulse_signal = pulse_signal/np.sqrt(2) # uncomment for ibm runcard - - times_list.append(t) - signals_list.append(pulse_signal) - - if pulse.type.value == "qd": - platform_channel_name = f"drive-{qubit}" - # TODO: add during flux pulse update - # elif pulse.type.value == "qf": - # platform_channel_name = f"flux-{qubit}" - elif pulse.type.value == "ro": - platform_channel_name = f"readout-{qubit}" - - emulator_channel_name_list.append( - channel_translator(platform_channel_name, pulse._if) - ) - - tmin, tmax = [], [] - for times in times_list: - tmin.append(np.amin(times)) - tmax.append(np.amax(times)) - - tmin = np.amin(tmin) - tmax = np.amax(tmax) - Nt = int(np.round((tmax - tmin) * sampling_rate * sim_sampling_boost) + 1) - full_time_list = np.linspace(tmin, tmax, Nt) - - channel_waveforms = {"time": full_time_list, "channels": {}} - - unique_channel_names = np.unique(emulator_channel_name_list) - for channel_name in unique_channel_names: - waveform = np.zeros(len(full_time_list)) - - for i, pulse_signal in enumerate(signals_list): - if emulator_channel_name_list[i] == channel_name: - for t_ind, t in enumerate(times_list[i]): - full_t_ind = int( - np.round((t - tmin) * sampling_rate * sim_sampling_boost) - ) - waveform[full_t_ind] += pulse_signal[t_ind] - - channel_waveforms["channels"].update({channel_name: waveform}) - - return channel_waveforms - - -def apply_readout_noise( - samples: dict[Union[str, int], list], - readout_error: dict[Union[int, str], list], -) -> dict[Union[str, int], list]: - """Applies readout noise to samples. - - Args: - samples (dict): Samples generated from get_samples. - readout_error (dict): Dictionary specifying the readout noise for each qubit. Readout noise is specified by a list containing probabilities of prepare 0 measure 1, and prepare 1 measure 0. - - Returns: - dict: The noisy sampled qubit values for each qubit labelled by its index. - - Raises: - ValueError: If the readout qubits given by samples.keys() is not a subset of the qubits with readout errors specified in readout_error. - """ - # check if readout error is specified for all ro qubits - ro_qubit_list = list(samples.keys()) - if not set(ro_qubit_list).issubset(readout_error.keys()): - raise ValueError(f"Not all readout qubits are present in readout_error!") - noisy_samples = {} - for ro_qubit in ro_qubit_list: # samples.keys(): - noisy_samples.update({ro_qubit: []}) - p0m1, p1m0 = readout_error[ro_qubit] - qubit_values = samples[ro_qubit] - - for i, v in enumerate(qubit_values): - if v == 0: - noisy_samples[ro_qubit].append( - np.random.choice([0, 1], p=[1 - p0m1, p0m1]) - ) - else: - noisy_samples[ro_qubit].append( - np.random.choice([0, 1], p=[p1m0, 1 - p1m0]) - ) - - return noisy_samples - - -def make_comp_basis( - qubit_list: list[Union[int, str]], qid_nlevels_map: dict[Union[int, str], int] -) -> np.ndarray: - """Generates the computational basis states of the Hilbert space. - - Args: - qubit_list (list): List of target qubit indices to generate the local Hilbert space of the qubits that respects the order given by qubit_list. - qid_nlevels_map (dict): Dictionary mapping the qubit IDs given in qubit_list to their respective Hilbert space dimensions. - - Returns: - `np.ndarray`: The list of computation basis states of the local Hilbert space in a numpy array. - """ - nqubits = len(qubit_list) - qid_list = [str(qubit) for qubit in qubit_list] - nlevels = [qid_nlevels_map[qid] for qid in qid_list] - - return make_array_index_list(nlevels) - - -def make_array_index_list(array_shape: list): - """Generates all indices of an array of arbitrary shape in ascending - order.""" - return np.indices(array_shape).reshape(len(array_shape), -1).T - - -def get_results_from_samples( - ro_pulse_list: list, - samples: dict[Union[str, int], list], - execution_parameters: ExecutionParameters, - prepend_to_shape: list = [], -) -> dict[str, npt.NDArray]: - """Converts samples into Qibolab results format. - - Args: - ro_pulse_list (list): List of readout pulse sequences. - samples (dict): Samples generated by get_samples. - append_to_shape (list): Specifies additional dimensions for the shape of the results. Defaults to empty list. - execution_parameters (`qibolab.ExecutionParameters`): Parameters (nshots, - relaxation_time, - fast_reset, - acquisition_type, - averaging_mode) - - Returns: - dict: Qibolab result data. - - Raises: - ValueError: If execution_parameters.acquisition_type is not supported. - """ - shape = prepend_to_shape + [execution_parameters.nshots] - tshape = [-1] + list(range(len(prepend_to_shape))) - - results = {} - for ro_pulse in ro_pulse_list: - values = np.array(samples[ro_pulse.qubit]).reshape(shape).transpose(tshape) - - if execution_parameters.acquisition_type is AcquisitionType.DISCRIMINATION: - processed_values = values - - elif execution_parameters.acquisition_type is AcquisitionType.INTEGRATION: - vals = values.astype(np.complex128) - processed_values = collect(vals.real, vals.imag) - - else: - raise ValueError( - f"Current emulator does not support requested AcquisitionType {execution_parameters.acquisition_type}" - ) - - if execution_parameters.averaging_mode is AveragingMode.CYCLIC: - processed_values = average(processed_values) - - results[ro_pulse.qubit] = results[ro_pulse.serial] = processed_values - return results - - -def get_samples( - nshots: int, - ro_reduced_dm: np.ndarray, - ro_qubit_list: list, - qid_nlevels_map: dict[Union[int, str], int], -) -> dict[Union[str, int], list]: - """Gets samples from the density matrix corresponding to the system or - subsystem specified by the ordered qubit indices. - - Args: - nshots (int): Number of shots corresponding to the number of samples in the output. - ro_reduced_dm (np.ndarray): Input density matrix. - ro_qubit_list (list): Qubit indices corresponding to the Hilbert space structure of the reduced density matrix (ro_reduced_dm). - qid_nlevels_map (dict): Dictionary mapping the qubit IDs given in qubit_list to their respective Hilbert space dimensions. - - Returns: - dict: The sampled qubit values for each qubit labelled by its index. - """ - # use the real diagonal part of the reduced density matrix as the probability distribution - ro_probability_distribution = np.diag(ro_reduced_dm).real - - # preprocess distribution - ro_probability_distribution = np.maximum( - ro_probability_distribution, 0 - ) # to remove small negative values - ro_probability_sum = np.sum(ro_probability_distribution) - ro_probability_distribution = ro_probability_distribution / ro_probability_sum - ro_qubits_dim = len(ro_probability_distribution) - - # create array of computational basis states of the reduced (measured) Hilbert space - reduced_computation_basis = make_comp_basis(ro_qubit_list, qid_nlevels_map) - - # sample computation basis index nshots times from distribution - sample_all_ro_list = np.random.choice( - ro_qubits_dim, nshots, True, ro_probability_distribution - ) - - samples = {} - for ind, ro_qubit in enumerate(ro_qubit_list): - # extracts sampled values for each readout qubit from sample_all_ro_list - outcomes = [ - reduced_computation_basis[outcome][ind] for outcome in sample_all_ro_list - ] - samples[ro_qubit] = outcomes - - return samples - - -def truncate_ro_pulses( - sequence: PulseSequence, -) -> PulseSequence: - """Creates a deepcopy of the original sequence with truncated readout - pulses to one time step. - - Args: - sequence (`qibolab.pulses.PulseSequence`): Pulse sequence. - - Returns: - `qibolab.pulses.PulseSequence`: Modified pulse sequence with one time step readout pulses. - """ - sequence = copy.deepcopy(sequence) - for _, acq in sequence.acquisitions: - acq.duration = 1 - - return sequence diff --git a/src/qibolab/instruments/icarusq.py b/src/qibolab/instruments/icarusq.py deleted file mode 100644 index ac4e681762..0000000000 --- a/src/qibolab/instruments/icarusq.py +++ /dev/null @@ -1,39 +0,0 @@ -import urllib3 -from icarusq_rfsoc_driver.quicsyn import QuicSyn as LO_QuicSyn # pylint: disable=E0401 - -from qibolab.instruments.abstract import Instrument -from qibolab.instruments.oscillator import LocalOscillator - - -class MCAttenuator(Instrument): - """Driver for the MiniCircuit RCDAT-8000-30 variable attenuator.""" - - def connect(self): - pass - - @property - def attenuation(self): - http = urllib3.PoolManager() - res = http.request("GET", f"http://{self.address}/GETATT?") - return float(res._body) - - @attenuation.setter - def attenuation(self, attenuation: float): - http = urllib3.PoolManager() - http.request("GET", f"http://{self.address}/SETATT={attenuation}") - - def setup(self): - pass - - def disconnect(self): - pass - - -class QuicSyn(LocalOscillator): - """Driver for the National Instrument QuicSyn Lite local oscillator.""" - - def create(self): - return LO_QuicSyn(self.name, self.address) - - def __del__(self): - self.disconnect() diff --git a/src/qibolab/instruments/icarusqfpga.py b/src/qibolab/instruments/icarusqfpga.py deleted file mode 100644 index 50120ca2b3..0000000000 --- a/src/qibolab/instruments/icarusqfpga.py +++ /dev/null @@ -1,438 +0,0 @@ -import operator -from dataclasses import dataclass -from typing import Union - -import numpy as np -from icarusq_rfsoc_driver import IcarusQRFSoC # pylint: disable=E0401 -from icarusq_rfsoc_driver.rfsoc_settings import TRIGGER_MODE # pylint: disable=E0401 -from qibo.config import log - -from qibolab.execution_parameters import ( - AcquisitionType, - AveragingMode, - ExecutionParameters, -) -from qibolab.instruments.abstract import Controller -from qibolab.pulses import Pulse -from qibolab.qubits import Qubit, QubitId -from qibolab.result import average, average_iq, collect -from qibolab.sequence import PulseSequence -from qibolab.sweeper import Parameter, Sweeper, SweeperType - -DAC_SAMPLNG_RATE_MHZ = 5898.24 -ADC_SAMPLNG_RATE_MHZ = 1966.08 -ICARUSQ_PORT = 8080 - - -@dataclass -class RFSOCPort: - name: str - dac: int = None - adc: int = None - - -class RFSOC(Controller): - """Driver for the IcarusQ RFSoC socket-based implementation.""" - - PortType = RFSOCPort - - def __init__( - self, - name, - address, - delay_samples_offset_dac: int = 0, - delay_samples_offset_adc: int = 0, - ): - super().__init__(name, address) - - self.channel_delay_offset_dac = delay_samples_offset_dac - self.channel_delay_offset_adc = delay_samples_offset_adc - - def connect(self): - self.device = IcarusQRFSoC(self.address, ICARUSQ_PORT) - - for dac in range(self.device.dac_nchannels): - self.device.dac[dac].delay = self.channel_delay_offset_dac - for adc in range(self.device.adc_nchannels): - self.device.adc[adc].delay = self.channel_delay_offset_adc - - self.device.set_adc_trigger_mode(TRIGGER_MODE.SLAVE) - ver = self.device.get_server_version() - log.info(f"Connected to {self.name}, version: {ver}") - - def setup(self): - pass - - @property - def sampling_rate(self): - return self.device.dac_sampling_rate / 1e3 # MHz to GHz - - def play( - self, - qubits: dict[QubitId, Qubit], - couplers, - sequence: PulseSequence, - options: ExecutionParameters, - ): - """Plays the given pulse sequence without acquisition. - - Arguments: - qubits (dict): Dictionary of qubit IDs mapped to qubit objects. - sequence (PulseSequence): Pulse sequence to be played on this instrument. - options (qibolab.ExecutionParameters): Execution parameters for readout and repetition. - """ - - waveform_array = {dac.id: np.zeros(dac.max_samples) for dac in self.device.dac} - - dac_end_addr = {dac.id: 0 for dac in self.device.dac} - dac_sampling_rate = self.device.dac_sampling_rate * 1e6 - dac_sr_ghz = dac_sampling_rate / 1e9 - - # We iterate over the seuence of pulses and generate the waveforms for each type of pulses - for ch, seq in sequence.items(): - for pulse in seq: - # pylint: disable=no-member - # FIXME: ignore complaint about non-existent ports and _ports properties, until we upgrade this driver to qibolab 0.2 - if pulse.channel not in self._ports: - continue - - dac = self.ports(pulse.channel).dac - start = int(pulse.start * 1e-9 * dac_sampling_rate) - i_env = pulse.envelope_waveform_i(dac_sr_ghz).data - q_env = pulse.envelope_waveform_q(dac_sr_ghz).data - - # FIXME: since pulse types have been deprecated, now channel types - # should be used instead. In the following, the code is relying on a - # non-standard channels naming convention, and thus fragile (or just - # broken) - # instead, the channel object should be retrieved from the platform - # configuration, and its type should be inspected - - # Flux pulses - # TODO: Add envelope support for flux pulses - if "flux" in ch: - wfm = i_env - end = start + len(wfm) - - # Qubit drive microwave signals - elif "drive" in ch: - end = start + len(i_env) - t = np.arange(start, end) / dac_sampling_rate - cosalpha = np.cos( - 2 * np.pi * pulse.frequency * t + pulse.relative_phase - ) - sinalpha = np.sin( - 2 * np.pi * pulse.frequency * t + pulse.relative_phase - ) - wfm = i_env * sinalpha + q_env * cosalpha - - elif "probe" in ch: - # For readout pulses, we move the corresponding DAC/ADC pair to the start of the pulse to save memory - # This locks the phase of the readout in the demodulation - adc = self.ports(pulse.channel).adc - start = 0 - - end = start + len(i_env) - t = np.arange(start, end) / dac_sampling_rate - cosalpha = np.cos( - 2 * np.pi * pulse.frequency * t + pulse.relative_phase - ) - sinalpha = np.sin( - 2 * np.pi * pulse.frequency * t + pulse.relative_phase - ) - wfm = i_env * sinalpha + q_env * cosalpha - - # First we convert the pulse starting time to number of ADC samples - # Then, we convert this number to the number of ADC clock cycles (8 samples per clock cycle) - # Next, we raise it to the next nearest integer to prevent an overlap between drive and readout pulses - # Finally, we ensure that the number is even for the DAC delay conversion - delay_start_adc = int( - int( - np.ceil( - self.device.adc_sampling_rate - * 1e6 - * pulse.start - * 1e-9 - / 8 - ) - / 2 - ) - * 2 - ) - - # For the DAC, currently the sampling rate is 3x higher than the ADC - # The number of clock cycles is 16 samples per clock cycle - # Hence, we multiply the adc delay clock cycles by 1.5x to align the DAC/ADC pair - delay_start_dac = int(delay_start_adc * 1.5) - - self.device.dac[dac].delay = ( - delay_start_dac + self.channel_delay_offset_dac - ) - self.device.adc[adc].delay = ( - delay_start_adc + self.channel_delay_offset_adc - ) - # ADC0 complete marks the end of acquisition, so we also need to move ADC0 - self.device.adc[0].delay = ( - delay_start_adc + self.channel_delay_offset_adc - ) - - if ( - options.acquisition_type is AcquisitionType.DISCRIMINATION - or AcquisitionType.INTEGRATION - ): - self.device.program_qunit( - readout_frequency=pulse.frequency, - readout_time=pulse.duration * 1e-9, - qunit=pulse.qubit, - ) - - end = start + len(wfm) - waveform_array[dac][start:end] += self.device.dac_max_amplitude * wfm - dac_end_addr[dac] = max(end >> 4, dac_end_addr[dac]) - - payload = [ - (dac, wfm, dac_end_addr[dac]) - for dac, wfm in waveform_array.items() - if dac_end_addr[dac] != 0 - ] - self.device.upload_waveform(payload) - - def disconnect(self): - if self.is_connected: - self.device.sock.close() - - def sweep(self): - pass - - -class RFSOC_RO(RFSOC): - """IcarusQ RFSoC attached with readout capability.""" - - available_sweep_parameters = { - Parameter.amplitude, - Parameter.duration, - Parameter.frequency, - Parameter.relative_phase, - } - - def __init__( - self, - name, - address, - delay_samples_offset_dac: int = 0, - delay_samples_offset_adc: int = 0, - adcs_to_read: list[int] = [], - ): - super().__init__( - name, address, delay_samples_offset_dac, delay_samples_offset_adc - ) - self.adcs_to_read = adcs_to_read - - def connect(self): - super().connect() - self.device.init_qunit() - self.device.set_adc_trigger_mode(TRIGGER_MODE.MASTER) - - def play( - self, - qubits: dict[QubitId, Qubit], - couplers, - sequence: PulseSequence, - options: ExecutionParameters, - ): - """Plays the pulse sequence on the IcarusQ RFSoC and awaits acquisition - at the end. - - Arguments: - qubits (dict): Dictionary of qubit IDs mapped to qubit objects. - sequence (PulseSequence): Pulse sequence to be played on this instrument. - options (qibolab.ExecutionParameters): Object representing acquisition type and number of shots. - """ - super().play(qubits, couplers, sequence, options) - self.device.set_adc_trigger_repetition_rate(int(options.relaxation_time / 1e3)) - readout_pulses = sequence.acquisitions - readout_qubits = [acq.qubit for (_, acq) in readout_pulses] - - if options.acquisition_type is AcquisitionType.RAW: - self.device.set_adc_trigger_mode(0) - self.device.arm_adc(self.adcs_to_read, options.nshots) - raw = self.device.result() - return self.process_readout_signal(raw, readout_pulses, qubits, options) - - # Currently qunit only supports single qubit readout demodulation - elif options.acquisition_type is AcquisitionType.INTEGRATION: - self.device.set_adc_trigger_mode(1) - self.device.set_qunit_mode(0) - raw = self.device.start_qunit_acquisition(options.nshots, readout_qubits) - - qunit_mapping = { - ro_pulse.qubit: ro_pulse.serial for ro_pulse in readout_pulses - } - - if options.averaging_mode is not AveragingMode.SINGLESHOT: - res = { - qunit_mapping[qunit]: average_iq(i, q) - for qunit, (i, q) in raw.items() - } - else: - res = { - qunit_mapping[qunit]: average_iq(i, q) - for qunit, (i, q) in raw.items() - } - # Temp fix for readout pulse sweepers, to be removed with IcarusQ v2 - for ro_pulse in readout_pulses: - res[ro_pulse.qubit] = res[ro_pulse.serial] - return res - - elif options.acquisition_type is AcquisitionType.DISCRIMINATION: - self.device.set_adc_trigger_mode(1) - self.device.set_qunit_mode(1) - res = self.device.start_qunit_acquisition(options.nshots, readout_qubits) - # Temp fix for readout pulse sweepers, to be removed with IcarusQ v2 - for ro_pulse in readout_pulses: - res[ro_pulse.qubit] = res[ro_pulse.serial] - return res - - def process_readout_signal( - self, - adc_raw_data: dict[int, np.ndarray], - sequence: list[Pulse], - qubits: dict[QubitId, Qubit], - options: ExecutionParameters, - ): - """Processes the raw signal from the ADC into IQ values.""" - - adc_sampling_rate = self.device.adc_sampling_rate * 1e6 - t = np.arange(self.device.adc_sample_size) / adc_sampling_rate - results = {} - - for readout_pulse in sequence: - qubit = qubits[readout_pulse.qubit] - _, adc = qubit.readout.ports - - raw_signal = adc_raw_data[adc] - sin = np.sin(2 * np.pi * readout_pulse.frequency * t) - cos = np.sin(2 * np.pi * readout_pulse.frequency * t) - - i = np.dot(raw_signal, cos) - q = np.dot(raw_signal, sin) - singleshot = collect(i, q) - results[readout_pulse.serial] = ( - average(singleshot) - if options.averaging_mode is not AveragingMode.SINGLESHOT - else singleshot - ) - # Temp fix for readout pulse sweepers, to be removed with IcarusQ v2 - results[readout_pulse.qubit] = results[readout_pulse.serial] - - return results - - def sweep( - self, - qubits: dict[QubitId, Qubit], - couplers, - sequence: PulseSequence, - options: ExecutionParameters, - *sweeper: Sweeper, - ): - # Record pulse values before sweeper modification - bsv = [] - for sweep in sweeper: - if sweep.parameter not in self.available_sweep_parameters: - raise NotImplementedError( - "Sweep parameter requested not available", param_name - ) - - param_name = sweep.parameter.name.lower() - base_sweeper_values = [getattr(pulse, param_name) for pulse in sweep.pulses] - bsv.append(base_sweeper_values) - - res = self._sweep_recursion(qubits, couplers, sequence, options, *sweeper) - - # Reset pulse values back to original values - for sweep, base_sweeper_values in zip(sweeper, bsv): - param_name = sweep.parameter.name.lower() - for pulse, value in zip(sweep.pulses, base_sweeper_values): - setattr(pulse, param_name, value) - - # Since the sweeper will modify the readout pulse serial, we collate the results with the qubit number. - # This is only for qibocal compatiability and will be removed with IcarusQ v2. - # FIXME: if this was required, now it's completely broken, since it - # isn't possible to identify the pulse channel from the pulse itself - # (nor it should be needed) - # it should be possible to retrieve the information looking for the - # channel type - # if pulse.type is PulseType.READOUT: - # res[pulse.serial] = res[pulse.qubit] - - return res - - def _sweep_recursion( - self, - qubits: dict[QubitId, Qubit], - couplers, - sequence: PulseSequence, - options: ExecutionParameters, - *sweeper: Sweeper, - ): - """Recursive python-based sweeper functionaltiy for the IcarusQ - RFSoC.""" - if len(sweeper) == 0: - return self.play(qubits, couplers, sequence, options) - - sweep = sweeper[0] - param = sweep.parameter - param_name = param.name.lower() - - if param not in self.available_sweep_parameters: - raise NotImplementedError( - "Sweep parameter requested not available", param_name - ) - - base_sweeper_values = [getattr(pulse, param_name) for pulse in sweep.pulses] - sweeper_op = _sweeper_operation.get(sweep.type) - ret = {} - - for value in sweep.values: - for idx, pulse in enumerate(sweep.pulses): - base = base_sweeper_values[idx] - setattr(pulse, param_name, sweeper_op(value, base)) - - self.merge_sweep_results( - ret, - self._sweep_recursion( - qubits, couplers, sequence, options, *sweeper[1:] - ), - ) - - return ret - - @staticmethod - def merge_sweep_results( - dict_a: """dict[str, Union[IntegratedResults, SampleResults]]""", - dict_b: """dict[str, Union[IntegratedResults, SampleResults]]""", - ) -> """dict[str, Union[IntegratedResults, SampleResults]]""": - """Merge two dictionary mapping pulse serial to Results object. - - If dict_b has a key (serial) that dict_a does not have, simply add it, - otherwise sum the two results - - Args: - dict_a (dict): dict mapping ro pulses serial to qibolab res objects - dict_b (dict): dict mapping ro pulses serial to qibolab res objects - Returns: - A dict mapping the readout pulses serial to qibolab results objects - """ - for serial in dict_b: - if serial in dict_a: - dict_a[serial] = dict_a[serial] + dict_b[serial] - else: - dict_a[serial] = dict_b[serial] - return dict_a - - -_sweeper_operation = { - SweeperType.ABSOLUTE: lambda value, base: value, - SweeperType.OFFSET: operator.add, - SweeperType.FACTOR: operator.mul, -} diff --git a/src/qibolab/instruments/qblox/__init__.py b/src/qibolab/instruments/qblox/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/qibolab/instruments/qblox/acquisition.py b/src/qibolab/instruments/qblox/acquisition.py deleted file mode 100644 index e38b174336..0000000000 --- a/src/qibolab/instruments/qblox/acquisition.py +++ /dev/null @@ -1,124 +0,0 @@ -from dataclasses import dataclass -from typing import Optional - -import numpy as np - -from qibolab.pulses.modulation import demodulate - -SAMPLING_RATE = 1 - - -@dataclass -class AveragedAcquisition: - """Software Demodulation. - - Every readout pulse triggers an acquisition, where the 16384 i and q - samples of the waveform acquired by the ADC are saved into a - dedicated memory within the FPGA. This is what qblox calls *scoped - acquisition*. The results of multiple shots are averaged in this - memory, and cannot be retrieved independently. The resulting - waveforms averages (i and q) are then demodulated and integrated in - software (and finally divided by the number of samples). Since - Software Demodulation relies on the data of the scoped acquisition - and that data is the average of all acquisitions, **only one readout - pulse per qubit is supported**, so that the averages all correspond - to reading the same quantum state. - """ - - results: dict - """Data returned by qblox acquisition.""" - duration: int - """Duration of the readout pulse.""" - frequency: int - """Frequency of the readout pulse used for demodulation.""" - - i: Optional[list[float]] = None - q: Optional[list[float]] = None - - @property - def scope(self): - return self.results["acquisition"]["scope"] - - @property - def raw_i(self): - """Average of the i waveforms for every readout pulse.""" - return np.array(self.scope["path0"]["data"][0 : self.duration]) - - @property - def raw_q(self): - """Average of the q waveforms for every readout pulse.""" - return np.array(self.scope["path1"]["data"][0 : self.duration]) - - @property - def data(self): - """Acquisition data to be returned to the platform. - - Ignores the data available in acquisition results and returns - only i and q voltages. - """ - # TODO: to be updated once the functionality of ExecutionResults is extended - if self.i is None or self.q is None: - self.i, self.q = demodulate( - np.array((self.raw_i, self.raw_q)), self.frequency - ).mean(axis=1) - return (self.i, self.q) - - -@dataclass -class DemodulatedAcquisition: - """Hardware Demodulation. - - With hardware demodulation activated, the FPGA can demodulate, - integrate (average over time), and classify each shot individually, - saving the results on separate bins. The raw data of each - acquisition continues to be averaged as with software modulation, so - there is no way to access the raw data of each shot (unless executed - one shot at a time). The FPGA uses fixed point arithmetic for the - demodulation and integration; if the power level of the signal at - the input port is low (the minimum resolution of the ADC is 240uV) - rounding precission errors can accumulate and render wrong results. - It is advisable to have a power level at least higher than 5mV. - """ - - scope: dict - """Data returned by scope qblox acquisition.""" - bins: dict - """Binned acquisition data returned by qblox.""" - duration: int - """Duration of the readout pulse.""" - - @property - def raw(self): - return self.scope["acquisition"]["scope"] - - @property - def integration(self): - return self.bins["integration"] - - @property - def shots_i(self): - """I-component after demodulating and integrating every shot - waveform.""" - return np.array(self.integration["path0"]) / self.duration - - @property - def shots_q(self): - """Q-component after demodulating and integrating every shot - waveform.""" - return np.array(self.integration["path1"]) / self.duration - - @property - def raw_i(self): - """Average of the raw i waveforms for every readout pulse.""" - return np.array(self.raw["path0"]["data"][0 : self.duration]) - - @property - def raw_q(self): - """Average of the raw q waveforms for every readout pulse.""" - return np.array(self.raw["path1"]["data"][0 : self.duration]) - - @property - def classified(self): - """List with the results of demodulating, integrating and classifying - every shot.""" - return np.array(self.bins["threshold"]) diff --git a/src/qibolab/instruments/qblox/cluster_qcm_bb.py b/src/qibolab/instruments/qblox/cluster_qcm_bb.py deleted file mode 100644 index cfe9761fad..0000000000 --- a/src/qibolab/instruments/qblox/cluster_qcm_bb.py +++ /dev/null @@ -1,764 +0,0 @@ -"""Qblox Cluster QCM driver.""" - -import copy -import json - -from qblox_instruments.native.generic_func import SequencerStates -from qblox_instruments.qcodes_drivers.cluster import Cluster -from qblox_instruments.qcodes_drivers.module import Module -from qibo.config import log - -from qibolab.instruments.qblox.module import ClusterModule -from qibolab.instruments.qblox.q1asm import ( - Block, - Register, - convert_phase, - loop_block, - wait_block, -) -from qibolab.instruments.qblox.sequencer import Sequencer, WaveformsBuffer -from qibolab.instruments.qblox.sweeper import QbloxSweeper, QbloxSweeperType -from qibolab.pulses import Pulse -from qibolab.sequence import PulseSequence -from qibolab.sweeper import Parameter, Sweeper, SweeperType - - -class QcmBb(ClusterModule): - """Qblox Cluster Qubit Control Module Baseband driver. - - Qubit Control Module (QCM) is an arbitratry wave generator with two DACs connected to - four output ports. It can sinthesise either four independent real signals or two - complex signals, using ports 0 and 2 to output the i(in-phase) component and - ports 1 and 3 the q(quadrature) component. The sampling rate of its DAC is 1 GSPS. - https://www.qblox.com/cluster - - The class aims to simplify the configuration of the instrument, exposing only - those parameters most frequencly used and hiding other more complex components. - - A reference to the underlying `qblox_instruments.qcodes_drivers.qcm_qrm.QRM_QCM` - object is provided via the attribute `device`, allowing the advanced user to gain - access to the features that are not exposed directly by the class. - - In order to accelerate the execution, the instrument settings are cached, so that - the communication with the instrument only happens when the parameters change. - This caching is done with the method `_set_device_parameter(target, *parameters, value)`. - - .. code-block:: text - - ports: - o1: - channel : L4-1 - gain : 0.2 # -1.0<=v<=1.0 - offset : 0 # -2.5<=v<=2.5 - o2: - channel : L4-2 - gain : 0.2 # -1.0<=v<=1.0 - offset : 0 # -2.5<=v<=2.5 - o3: - channel : L4-3 - gain : 0.2 # -1.0<=v<=1.0 - offset : 0 # -2.5<=v<=2.5 - o4: - channel : L4-4 - gain : 0.2 # -1.0<=v<=1.0 - offset : 0 # -2.5<=v<=2.5 - - Attributes: - name (str): A unique name given to the instrument. - address (str): IP_address:module_number (the IP address of the cluster and - the module number) - device (QbloxQrmQcm): A reference to the underlying - `qblox_instruments.qcodes_drivers.qcm_qrm.QcmQrm` object. It can be used to access other - features not directly exposed by this wrapper. - https://qblox-qblox-instruments.readthedocs-hosted.com/en/master/api_reference/qcm_qrm.html - ports = A dictionary giving access to the output ports objects. - - - ports['o1'] - - ports['o2'] - - ports['o3'] - - ports['o4'] - - - ports['oX'].channel (int | str): the id of the refrigerator channel the port is connected to. - - ports['oX'].gain (float): (mapped to qrm.sequencers[0].gain_awg_path0 and qrm.sequencers[0].gain_awg_path1) - Sets the gain on both paths of the output port. - - ports['oX'].offset (float): (mapped to qrm.outX_offset) - Sets the offset on the output port. - - ports['oX'].hardware_mod_en (bool): (mapped to qrm.sequencers[0].mod_en_awg) Enables pulse - modulation in hardware. When set to False, pulse modulation is done at the host computer - and a modulated pulse waveform should be uploaded to the instrument. When set to True, - the envelope of the pulse should be uploaded to the instrument and it modulates it in - real time by its FPGA using the sequencer nco (numerically controlled oscillator). - - ports['oX'].nco_freq (int): (mapped to qrm.sequencers[0].nco_freq) # TODO mapped, but not configurable from the runcard - - ports['oX'].nco_phase_offs = (mapped to qrm.sequencers[0].nco_phase_offs) # TODO mapped, but not configurable from the runcard - - - Sequencer 0 is always the first sequencer used to synthesise pulses on port o1. - - Sequencer 1 is always the first sequencer used to synthesise pulses on port o2. - - Sequencer 2 is always the first sequencer used to synthesise pulses on port o3. - - Sequencer 3 is always the first sequencer used to synthesise pulses on port o4. - - Sequencer 4 to 6 are used as needed to sinthesise simultaneous pulses on the same channel - or when the memory of the default sequencers rans out. - """ - - DEFAULT_SEQUENCERS = {"o1": 0, "o2": 1, "o3": 2, "o4": 3} - FREQUENCY_LIMIT = 500e6 - OUT_PORT_PATH = {0: "I", 1: "Q", 2: "I", 3: "Q"} - - def __init__(self, name: str, address: str): - """Initialize a Qblox QCM baseband module. - - Parameters: - - name: An arbitrary name to identify the module. - - address: The network address of the instrument, specified as "cluster_IP:module_slot_idx". - - cluster: The Cluster object to which the QCM baseband module is connected. - - Example: - To create a QcmBb instance named 'qcm_bb' connected to slot 2 of a Cluster at address '192.168.0.100': - >>> cluster_instance = Cluster("cluster","192.168.1.100", settings) - >>> qcm_module = QcmBb(name="qcm_bb", address="192.168.1.100:2", cluster=cluster_instance) - """ - super().__init__(name, address) - self._ports: dict = {} - self.device: Module = None - - self._debug_folder: str = "" - self._sequencers: dict[Sequencer] = {} - self.channel_map: dict = {} - self._device_num_output_ports = 2 - self._device_num_sequencers: int - self._free_sequencers_numbers: list[int] = ( - [] - ) # TODO: we can create only list and put three flags: free, used, unused - self._used_sequencers_numbers: list[int] = [] - self._unused_sequencers_numbers: list[int] = [] - - def _set_default_values(self): - # disable all sequencer connections - self.device.disconnect_outputs() - - # set offset to zero on all ports. Default values after reboot = 0 - [self.device.set(f"out{idx}_offset", value=0) for idx in range(4)] - - # initialise the parameters of the default sequencers to the default values, - # the rest of the sequencers are disconnected, but will be configured - # with the same parameters as the default in process_pulse_sequence() - default_sequencers = [ - self.device.sequencers[i] for i in self.DEFAULT_SEQUENCERS.values() - ] - for target in default_sequencers: - for name, value in self.DEFAULT_SEQUENCERS_VALUES.items(): - target.set(name, value) - - # connect the default sequencers to the out ports - for port_num, value in self.OUT_PORT_PATH.items(): - self.device.sequencers[port_num].set(f"connect_out{port_num}", value) - - def connect(self, cluster: Cluster = None): - """Connects to the instrument using the instrument settings in the - runcard. - - Once connected, it creates port classes with properties mapped - to various instrument parameters, and initialises the the - underlying device parameters. It uploads to the module the port - settings loaded from the runcard. - """ - if self.is_connected: - return - - elif cluster is not None: - self.device = cluster.modules[int(self.address.split(":")[1]) - 1] - # test connection with module - if not self.device.present(): - raise ConnectionError( - f"Module {self.device.name} not connected to cluster {cluster.name}" - ) - # once connected, initialise the parameters of the device to the default values - self._device_num_sequencers = len(self.device.sequencers) - self._set_default_values() - # then set the value loaded from the runcard - try: - for port in self._ports: - self._sequencers[port] = [] - self._ports[port].hardware_mod_en = True - self._ports[port].nco_freq = 0 - self._ports[port].nco_phase_offs = 0 - self._ports[port].offset = self._ports[port].offset - except Exception as error: - raise RuntimeError( - f"Unable to initialize port parameters on module {self.name}: {error}" - ) - - self.is_connected = True - - def setup(self, **settings): - """Cache the settings of the runcard and instantiate the ports of the - module. - - Args: - **settings: dict = A dictionary of settings loaded from the runcard: - - - settings[oX]['offset'] (float): [-2.5 - 2.5 V] offset in volts applied to the output port. - - settings[oX]['hardware_mod_en'] (bool): enables Hardware Modulation. In this mode, pulses are modulated to the intermediate frequency - using the numerically controlled oscillator within the fpga. It only requires the upload of the pulse envelope waveform. - At the moment this param is not loaded but is always set to True. - """ - pass - - def _get_next_sequencer(self, port, frequency, qubits: dict): - """Retrieves and configures the next avaliable sequencer. - - The parameters of the new sequencer are copied from those of the default sequencer, except for the - intermediate frequency and classification parameters. - Args: - port (str): - frequency (): - qubit (): - Raises: - Exception = If attempting to set a parameter without a connection to the instrument. - """ - # select the qubit with flux line, if present, connected to the specific port - qubit = None - for _qubit in qubits.values(): - name = _qubit.flux.port.name - module = _qubit.flux.port.module - if _qubit.flux is not None and (name, module) == (port, self): - qubit = _qubit - - # select a new sequencer and configure it as required - next_sequencer_number = self._free_sequencers_numbers.pop(0) - if next_sequencer_number != self.DEFAULT_SEQUENCERS[port]: - for parameter in self.device.sequencers[ - self.DEFAULT_SEQUENCERS[port] - ].parameters: - # exclude read-only parameter `sequence` - if parameter not in ["sequence"]: - value = self.device.sequencers[self.DEFAULT_SEQUENCERS[port]].get( - param_name=parameter - ) - if value: - target = self.device.sequencers[next_sequencer_number] - target.set(parameter, value) - - # if hardware modulation is enabled configure nco_frequency - if self._ports[port].hardware_mod_en: - self.device.sequencers[next_sequencer_number].set("nco_freq", frequency) - # Assumes all pulses in non_overlapping_pulses set - # have the same frequency. Non-overlapping pulses of different frequencies on the same - # qubit channel with hardware_demod_en would lead to wrong results. - # TODO: Throw error in that event or implement for non_overlapping_same_frequency_pulses - # Even better, set the frequency before each pulse is played (would work with hardware modulation only) - - # create sequencer wrapper - sequencer = Sequencer(next_sequencer_number) - sequencer.qubit = qubit.name if qubit else None - return sequencer - - def get_if(self, pulse): - """Returns the intermediate frequency needed to synthesise a pulse - based on the port lo frequency.""" - - _rf = pulse.frequency - _lo = 0 # QCMs do not have local oscillator - _if = _rf - _lo - if abs(_if) > self.FREQUENCY_LIMIT: - raise RuntimeError( - f""" - Pulse frequency {_rf:_} cannot be synthesised, it exceeds the maximum frequency of {self.FREQUENCY_LIMIT:_}""" - ) - return _if - - def process_pulse_sequence( - self, - qubits: dict, - instrument_pulses: PulseSequence, - navgs: int, - nshots: int, - repetition_duration: int, - sweepers=None, - ): - """Processes a list of pulses, generating the waveforms and sequence - program required by the instrument to synthesise them. - - The output of the process is a list of sequencers used for each port, configured with the information - required to play the sequence. - The following features are supported: - - - overlapping pulses - - hardware modulation - - software modulation, with support for arbitrary pulses - - real-time sweepers of - - - pulse frequency (requires hardware modulation) - - pulse relative phase (requires hardware modulation) - - pulse amplitude - - pulse start - - pulse duration - - port gain - - port offset - - - sequencer memory optimisation (waveforms cache) - - extended waveform memory with the use of multiple sequencers - - pulses of up to 8192 pairs of i, q samples - - intrument parameters cache - - Args: - instrument_pulses (PulseSequence): A collection of Pulse objects to be played by the instrument. - navgs (int): The number of times the sequence of pulses should be executed averaging the results. - nshots (int): The number of times the sequence of pulses should be executed without averaging. - repetition_duration (int): The total duration of the pulse sequence execution plus the reset/relaxation time. - sweepers (list(Sweeper)): A list of Sweeper objects to be implemented. - """ - if sweepers is None: - sweepers = [] - sequencer: Sequencer - sweeper: Sweeper - - self._free_sequencers_numbers = list(range(len(self._ports), 6)) - - # process the pulses for every port - for port in self._ports: - # split the collection of instruments pulses by ports - port_channel = [ - chan.name - for chan in self.channel_map.values() - if chan.port.name == port - ] - port_pulses: PulseSequence = instrument_pulses.get_channel_pulses( - *port_channel - ) - - # initialise the list of sequencers required by the port - self._sequencers[port] = [] - - # initialise the list of free sequencer numbers to include the default for each port {'o1': 0, 'o2': 1, 'o3': 2, 'o4': 3} - self._free_sequencers_numbers = [ - self.DEFAULT_SEQUENCERS[port] - ] + self._free_sequencers_numbers - - if not port_pulses.is_empty: - # split the collection of port pulses in non overlapping pulses - non_overlapping_pulses: PulseSequence - for non_overlapping_pulses in port_pulses.separate_overlapping_pulses(): - # TODO: for non_overlapping_same_frequency_pulses in non_overlapping_pulses.separate_different_frequency_pulses(): - - # each set of not overlapping pulses will be played by a separate sequencer - # check sequencer availability - if len(self._free_sequencers_numbers) == 0: - raise Exception( - f"The number of sequencers requried to play the sequence exceeds the number available {self._device_num_sequencers}." - ) - # get next sequencer - sequencer = self._get_next_sequencer( - port=port, - frequency=self.get_if(non_overlapping_pulses[0]), - qubits=qubits, - ) - # add the sequencer to the list of sequencers required by the port - self._sequencers[port].append(sequencer) - - # make a temporary copy of the pulses to be processed - pulses_to_be_processed = copy.copy(non_overlapping_pulses) - while not pulses_to_be_processed.is_empty: - pulse: Pulse = pulses_to_be_processed[0] - # attempt to save the waveforms to the sequencer waveforms buffer - try: - sequencer.waveforms_buffer.add_waveforms( - pulse, self._ports[port].hardware_mod_en, sweepers - ) - sequencer.pulses.append(pulse) - pulses_to_be_processed.remove(pulse) - - # if there is not enough memory in the current sequencer, use another one - except WaveformsBuffer.NotEnoughMemory: - if ( - len(pulse.waveform_i) + len(pulse.waveform_q) - > WaveformsBuffer.SIZE - ): - raise NotImplementedError( - f"Pulses with waveforms longer than the memory of a sequencer ({WaveformsBuffer.SIZE // 2}) are not supported." - ) - if len(self._free_sequencers_numbers) == 0: - raise Exception( - f"The number of sequencers requried to play the sequence exceeds the number available {self._device_num_sequencers}." - ) - # get next sequencer - sequencer = self._get_next_sequencer( - port=port, - frequency=self.get_if(non_overlapping_pulses[0]), - qubits=qubits, - ) - # add the sequencer to the list of sequencers required by the port - self._sequencers[port].append(sequencer) - else: - sequencer = self._get_next_sequencer( - port=port, frequency=0, qubits=qubits - ) - # add the sequencer to the list of sequencers required by the port - self._sequencers[port].append(sequencer) - - # update the lists of used and unused sequencers that will be needed later on - self._used_sequencers_numbers = [] - for port in self._ports: - for sequencer in self._sequencers[port]: - self._used_sequencers_numbers.append(sequencer.number) - self._unused_sequencers_numbers = [] - for n in range(self._device_num_sequencers): - if not n in self._used_sequencers_numbers: - self._unused_sequencers_numbers.append(n) - - # generate and store the Waveforms dictionary, the Acquisitions dictionary, the Weights and the Program - for port in self._ports: - for sequencer in self._sequencers[port]: - pulses = sequencer.pulses - program = sequencer.program - - ## pre-process sweepers ## - # TODO: move qibolab sweepers preprocessing to qblox controller - - # attach a sweeper attribute to the pulse so that it is easily accesible by the code that generates - # the pseudo-assembly program - pulse = None - for pulse in pulses: - pulse.sweeper = None - - pulse_sweeper_parameters = [ - Parameter.frequency, - Parameter.amplitude, - Parameter.duration, - Parameter.relative_phase, - ] - - for sweeper in sweepers: - if sweeper.parameter in pulse_sweeper_parameters: - # check if this sequencer takes an active role in the sweep - if sweeper.pulses and set(sequencer.pulses) & set( - sweeper.pulses - ): - # plays an active role - reference_value = None - if ( - sweeper.parameter == Parameter.frequency - and sequencer.pulses - ): - reference_value = self.get_if(sequencer.pulses[0]) - if sweeper.parameter == Parameter.amplitude: - for pulse in pulses: - if pulse in sweeper.pulses: - reference_value = ( - pulse.amplitude - ) # uses the amplitude of the first pulse - if ( - sweeper.parameter == Parameter.duration - and pulse in sweeper.pulses - ): - # for duration sweepers bake waveforms - sweeper.qs = QbloxSweeper( - program=program, - type=QbloxSweeperType.duration, - rel_values=pulse.idx_range, - ) - else: - # create QbloxSweepers and attach them to qibolab sweeper - if ( - sweeper.type == SweeperType.OFFSET - and reference_value - ): - sweeper.qs = QbloxSweeper.from_sweeper( - program=program, - sweeper=sweeper, - add_to=reference_value, - ) - elif ( - sweeper.type == SweeperType.FACTOR - and reference_value - ): - sweeper.qs = QbloxSweeper.from_sweeper( - program=program, - sweeper=sweeper, - multiply_to=reference_value, - ) - else: - sweeper.qs = QbloxSweeper.from_sweeper( - program=program, sweeper=sweeper - ) - - # finally attach QbloxSweepers to the pulses being swept - sweeper.qs.update_parameters = True - pulse.sweeper = sweeper.qs - else: - # does not play an active role - sweeper.qs = QbloxSweeper( - program=program, - type=QbloxSweeperType.number, - rel_values=range(len(sweeper.values)), - name=sweeper.parameter.name, - ) - - else: # qubit_sweeper_parameters - if sequencer.qubit in [qubit.name for qubit in sweeper.qubits]: - # plays an active role - if sweeper.parameter == Parameter.bias: - reference_value = self._ports[port].offset - # create QbloxSweepers and attach them to qibolab sweeper - if sweeper.type == SweeperType.ABSOLUTE: - sweeper.qs = QbloxSweeper.from_sweeper( - program=program, - sweeper=sweeper, - add_to=-reference_value, - ) - elif sweeper.type == SweeperType.OFFSET: - sweeper.qs = QbloxSweeper.from_sweeper( - program=program, sweeper=sweeper - ) - elif sweeper.type == SweeperType.FACTOR: - raise Exception( - "SweeperType.FACTOR for Parameter.bias not supported" - ) - sweeper.qs.update_parameters = True - else: - # does not play an active role - sweeper.qs = QbloxSweeper( - program=program, - type=QbloxSweeperType.number, - rel_values=range(len(sweeper.values)), - name=sweeper.parameter.name, - ) - - # FIXME: for qubit sweepers (Parameter.bias, Parameter.attenuation, Parameter.gain), the qubit - # information alone is not enough to determine what instrument parameter is to be swept. - # For example port gain, both the drive and readout ports have gain parameters. - # Until this is resolved, and since bias is only implemented with QCMs offset, this instrument will - # never take an active role in those sweeps. - - # Waveforms - for index, waveform in enumerate( - sequencer.waveforms_buffer.unique_waveforms - ): - sequencer.waveforms[waveform.serial] = { - "data": waveform.tolist(), - "index": index, - } - - # Program - minimum_delay_between_instructions = 4 - - sequence_total_duration = ( - pulses.finish - ) # the minimum delay between instructions is 4ns - time_between_repetitions = repetition_duration - sequence_total_duration - assert time_between_repetitions > minimum_delay_between_instructions - # TODO: currently relaxation_time needs to be greater than acquisition_hold_off - # so that the time_between_repetitions is equal to the sequence_total_duration + relaxation_time - # to be compatible with th erest of the platforms, change it so that time_between_repetitions - # is equal to pulsesequence duration + acquisition_hold_off if relaxation_time < acquisition_hold_off - - # create registers for key variables - # nshots is used in the loop that iterates over the number of shots - nshots_register = Register(program, "nshots") - # navgs is used in the loop of hardware averages - navgs_register = Register(program, "navgs") - - header_block = Block("setup") - - body_block = Block() - - body_block.append(f"wait_sync {minimum_delay_between_instructions}") - if self._ports[port].hardware_mod_en: - body_block.append("reset_ph") - body_block.append_spacer() - - pulses_block = Block("play") - # Add an initial wait instruction for the first pulse of the sequence - initial_wait_block = wait_block( - wait_time=pulses.start, - register=Register(program), - force_multiples_of_four=False, - ) - pulses_block += initial_wait_block - - for n in range(pulses.count): - if ( - pulses[n].sweeper - and pulses[n].sweeper.type == QbloxSweeperType.start - ): - pulses_block.append(f"wait {pulses[n].sweeper.register}") - - if self._ports[port].hardware_mod_en: - # # Set frequency - # _if = self.get_if(pulses[n]) - # pulses_block.append(f"set_freq {convert_frequency(_if)}", f"set intermediate frequency to {_if} Hz") - - # Set phase - if ( - pulses[n].sweeper - and pulses[n].sweeper.type - == QbloxSweeperType.relative_phase - ): - pulses_block.append(f"set_ph {pulses[n].sweeper.register}") - else: - pulses_block.append( - f"set_ph {convert_phase(pulses[n].relative_phase)}", - comment=f"set relative phase {pulses[n].relative_phase} rads", - ) - - # Calculate the delay_after_play that is to be used as an argument to the play instruction - if len(pulses) > n + 1: - # If there are more pulses to be played, the delay is the time between the pulse end and the next pulse start - delay_after_play = pulses[n + 1].start - pulses[n].start - else: - delay_after_play = sequence_total_duration - pulses[n].start - - if delay_after_play < minimum_delay_between_instructions: - raise Exception( - f"The minimum delay between the start of two pulses in the same channel is {minimum_delay_between_instructions}ns." - ) - - if ( - pulses[n].sweeper - and pulses[n].sweeper.type == QbloxSweeperType.duration - ): - RI = pulses[n].sweeper.register - # FIXME: - # if pulses[n].type == PulseType.FLUX: - if True: - RQ = pulses[n].sweeper.register - else: - RQ = pulses[n].sweeper.aux_register - - pulses_block.append( - f"play {RI},{RQ},{delay_after_play}", # FIXME delay_after_play won't work as the duration increases - comment=f"play pulse {pulses[n]} sweeping its duration", - ) - else: - # Prepare play instruction: play wave_i_index, wave_q_index, delay_next_instruction - pulses_block.append( - f"play {sequencer.waveforms_buffer.unique_waveforms.index(pulses[n].waveform_i)},{sequencer.waveforms_buffer.unique_waveforms.index(pulses[n].waveform_q)},{delay_after_play}", - comment=f"play waveforms {pulses[n]}", - ) - - body_block += pulses_block - body_block.append_spacer() - - final_reset_block = wait_block( - wait_time=time_between_repetitions, - register=Register(program), - force_multiples_of_four=False, - ) - body_block += final_reset_block - - footer_block = Block("cleanup") - footer_block.append(f"stop") - - # wrap pulses block in sweepers loop blocks - for sweeper in sweepers: - body_block = sweeper.qs.block(inner_block=body_block) - - nshots_block: Block = loop_block( - start=0, - stop=nshots, - step=1, - register=nshots_register, - block=body_block, - ) - navgs_block = loop_block( - start=0, - stop=navgs, - step=1, - register=navgs_register, - block=nshots_block, - ) - program.add_blocks(header_block, navgs_block, footer_block) - - sequencer.program = repr(program) - - def upload(self): - """Uploads waveforms and programs of all sequencers and arms them in - preparation for execution. - - This method should be called after `process_pulse_sequence()`. - It configures certain parameters of the instrument based on the - needs of resources determined while processing the pulse - sequence. - """ - # Setup - for sequencer_number in self._used_sequencers_numbers: - target = self.device.sequencers[sequencer_number] - target.set("sync_en", True) - target.set("marker_ovr_en", True) # Default after reboot = False - target.set("marker_ovr_value", 15) # Default after reboot = 0 - - for sequencer_number in self._unused_sequencers_numbers: - target = self.device.sequencers[sequencer_number] - target.set("sync_en", False) - target.set("marker_ovr_en", True) # Default after reboot = False - target.set("marker_ovr_value", 0) # Default after reboot = 0 - if sequencer_number >= 4: # Never disconnect default sequencers - target.set("connect_out0", "off") - target.set("connect_out1", "off") - target.set("connect_out2", "off") - target.set("connect_out3", "off") - - # Upload waveforms and program - qblox_dict = {} - sequencer: Sequencer - for port in self._ports: - for sequencer in self._sequencers[port]: - # Add sequence program and waveforms to single dictionary - qblox_dict[sequencer] = { - "waveforms": sequencer.waveforms, - "weights": sequencer.weights, - "acquisitions": sequencer.acquisitions, - "program": sequencer.program, - } - - # Upload dictionary to the device sequencers - self.device.sequencers[sequencer.number].sequence(qblox_dict[sequencer]) - - # DEBUG: QCM Save sequence to file - if self._debug_folder != "": - filename = ( - self._debug_folder - + f"Z_{self.name}_sequencer{sequencer.number}_sequence.json" - ) - with open(filename, "w", encoding="utf-8") as file: - json.dump(qblox_dict[sequencer], file, indent=4) - file.write(sequencer.program) - - # Arm sequencers - for sequencer_number in self._used_sequencers_numbers: - self.device.arm_sequencer(sequencer_number) - - # DEBUG: QCM Print Readable Snapshot - # print(self.name) - # self.device.print_readable_snapshot(update=True) - - # DEBUG: QCM Save Readable Snapshot - from qibolab.instruments.qblox.debug import print_readable_snapshot - - if self._debug_folder != "": - filename = self._debug_folder + f"Z_{self.name}_snapshot.json" - with open(filename, "w", encoding="utf-8") as file: - print_readable_snapshot(self.device, file, update=True) - - def play_sequence(self): - """Executes the sequence of instructions.""" - - for sequencer_number in self._used_sequencers_numbers: - # Start used sequencers - self.device.start_sequencer(sequencer_number) - - def disconnect(self): - """Stops all sequencers, disconnect all the outputs from the AWG paths - of the sequencers.""" - if not self.is_connected: - return - for sequencer_number in self._used_sequencers_numbers: - status = self.device.get_sequencer_status(sequencer_number) - if status.state is not SequencerStates.STOPPED: - log.warning( - f"Device {self.device.sequencers[sequencer_number].name} did not stop normally\nstatus: {status}" - ) - - self.device.stop_sequencer() - self.device.disconnect_outputs() - self.is_connected = False - self.device = None diff --git a/src/qibolab/instruments/qblox/cluster_qcm_rf.py b/src/qibolab/instruments/qblox/cluster_qcm_rf.py deleted file mode 100644 index 2cdb4ea67b..0000000000 --- a/src/qibolab/instruments/qblox/cluster_qcm_rf.py +++ /dev/null @@ -1,763 +0,0 @@ -"""Qblox Cluster QCM-RF driver.""" - -import copy -import json - -from qblox_instruments.native.generic_func import SequencerStates -from qblox_instruments.qcodes_drivers.cluster import Cluster -from qblox_instruments.qcodes_drivers.module import Module -from qibo.config import log - -from qibolab.instruments.qblox.module import ClusterModule -from qibolab.instruments.qblox.q1asm import ( - Block, - Register, - convert_phase, - loop_block, - wait_block, -) -from qibolab.instruments.qblox.sequencer import Sequencer, WaveformsBuffer -from qibolab.instruments.qblox.sweeper import QbloxSweeper, QbloxSweeperType -from qibolab.pulses import Pulse -from qibolab.sequence import PulseSequence -from qibolab.sweeper import Parameter, Sweeper, SweeperType - - -class QcmRf(ClusterModule): - """Qblox Cluster Qubit Control Module RF driver. - - Qubit Control Module RF (QCM-RF) is an instrument that integrates an arbitratry - wave generator, with a local oscillator and a mixer. It has two output ports - Each port has a path0 and path1 for the i(in-phase) and q(quadrature) components - of the RF signal. The sampling rate of its ADC/DAC is 1 GSPS. - https://www.qblox.com/cluster - - The class aims to simplify the configuration of the instrument, exposing only - those parameters most frequencly used and hiding other more complex components. - - A reference to the underlying `qblox_instruments.qcodes_drivers.qcm_qrm.QRM_QCM` - object is provided via the attribute `device`, allowing the advanced user to gain - access to the features that are not exposed directly by the class. - - In order to accelerate the execution, the instrument settings are cached, so that - the communication with the instrument only happens when the parameters change. - This caching is done with the method `_set_device_parameter(target, *parameters, value)`. - - .. code-block:: text - - ports: - o1: # output port settings - channel : L3-11 - attenuation : 24 # (dB) 0 to 60, must be multiple of 2 - lo_enabled : true - lo_frequency : 4_042_590_000 # (Hz) from 2e9 to 18e9 - gain : 0.17 # for path0 and path1 -1.0<=v<=1.0 - o2: - channel : L3-12 - attenuation : 24 # (dB) 0 to 60, must be multiple of 2 - lo_enabled : true - lo_frequency : 5_091_155_529 # (Hz) from 2e9 to 18e9 - gain : 0.28 # for path0 and path1 -1.0<=v<=1.0 - - Attributes: - name (str): A unique name given to the instrument. - address (str): IP_address:module_number (the IP address of the cluster and - the module number) - device (QcmQrm): A reference to the underlying - `qblox_instruments.qcodes_drivers.qcm_qrm.QcmQrm` object. It can be used to access other - features not directly exposed by this wrapper. - https://qblox-qblox-instruments.readthedocs-hosted.com/en/master/api_reference/qcm_qrm.html - - ports = A dictionary giving access to the output ports objects. - - - ports['o1'] - - ports['o2'] - - - ports['o1'].channel (int | str): the id of the refrigerator channel the port is connected to. - - ports['o1'].attenuation (int): (mapped to qrm.out0_att) Controls the attenuation applied to - the output port. Must be a multiple of 2 - - ports['o1'].lo_enabled (bool): (mapped to qrm.out0_in0_lo_en) Enables or disables the - local oscillator. - - ports['o1'].lo_frequency (int): (mapped to qrm.out0_in0_lo_freq) Sets the frequency of the - local oscillator. - - ports['o1'].gain (float): (mapped to qrm.sequencers[0].gain_awg_path0 and qrm.sequencers[0].gain_awg_path1) - Sets the gain on both paths of the output port. - - ports['o1'].hardware_mod_en (bool): (mapped to qrm.sequencers[0].mod_en_awg) Enables pulse - modulation in hardware. When set to False, pulse modulation is done at the host computer - and a modulated pulse waveform should be uploaded to the instrument. When set to True, - the envelope of the pulse should be uploaded to the instrument and it modulates it in - real time by its FPGA using the sequencer nco (numerically controlled oscillator). - - ports['o1'].nco_freq (int): (mapped to qrm.sequencers[0].nco_freq) # TODO mapped, but not configurable from the runcard - - ports['o1'].nco_phase_offs = (mapped to qrm.sequencers[0].nco_phase_offs) # TODO mapped, but not configurable from the runcard - - - ports['o2'].channel (int | str): the id of the refrigerator channel the port is connected to. - - ports['o2'].attenuation (int): (mapped to qrm.out1_att) Controls the attenuation applied to - the output port. Must be a multiple of 2 - - ports['o2'].lo_enabled (bool): (mapped to qrm.out1_lo_en) Enables or disables the - local oscillator. - - ports['o2'].lo_frequency (int): (mapped to qrm.out1_lo_freq) Sets the frequency of the - local oscillator. - - ports['o2'].gain (float): (mapped to qrm.sequencers[1].gain_awg_path0 and qrm.sequencers[0].gain_awg_path1) - Sets the gain on both paths of the output port. - - ports['o2'].hardware_mod_en (bool): (mapped to qrm.sequencers[1].mod_en_awg) Enables pulse - modulation in hardware. When set to False, pulse modulation is done at the host computer - and a modulated pulse waveform should be uploaded to the instrument. When set to True, - the envelope of the pulse should be uploaded to the instrument and it modulates it in - real time by its FPGA using the sequencer nco (numerically controlled oscillator). - - ports['o2'].nco_freq (int): (mapped to qrm.sequencers[1].nco_freq) # TODO mapped, but not configurable from the runcard - - ports['o2'].nco_phase_offs = (mapped to qrm.sequencers[1].nco_phase_offs) # TODO mapped, but not configurable from the runcard - - - Sequencer 0 is always the first sequencer used to synthesise pulses on port o1. - - Sequencer 1 is always the first sequencer used to synthesise pulses on port o2. - - Sequencer 2 to 6 are used as needed to sinthesise simultaneous pulses on the same channel - or when the memory of the default sequencers rans out. - - - channels (list): A list of the channels to which the instrument is connected. - """ - - DEFAULT_SEQUENCERS = {"o1": 0, "o2": 1} - FREQUENCY_LIMIT = 500e6 - - def __init__(self, name: str, address: str): - """Initialize a Qblox QCM-RF module. - - Parameters: - - name: An arbitrary name to identify the module. - - address: The network address of the instrument, specified as "cluster_IP:module_slot_idx". - - cluster: The Cluster object to which the QCM-RF module is connected. - - Example: - To create a QcmRf instance named 'qcm_rf' connected to slot 2 of a Cluster at address '192.168.0.100': - >>> cluster_instance = Cluster("cluster","192.168.1.100", settings) - >>> qcm_module = QcmRf(name="qcm_rf", address="192.168.1.100:2", cluster=cluster_instance) - """ - super().__init__(name, address) - self.device: Module = None - self.settings = {} - - self._debug_folder: str = "" - self._sequencers: dict[Sequencer] = {} - self.channel_map: dict = {} - self._device_num_output_ports = 2 - self._device_num_sequencers: int - self._free_sequencers_numbers: list[int] = [] - self._used_sequencers_numbers: list[int] = [] - self._unused_sequencers_numbers: list[int] = [] - - def _set_default_values(self): - # disable all sequencer connections - self.device.disconnect_outputs() - # set I (path0) and Q (path1) offset to zero on output port 0 and 1. Default values after reboot = 7.625 - for i in range(2): - [self.device.set(f"out{i}_offset_path{j}", 0) for j in range(2)] - - # initialise the parameters of the default sequencers to the default values, - # the rest of the sequencers are disconnected but will be configured - # with the same parameters as the default in process_pulse_sequence() - default_sequencers = [ - self.device.sequencers[i] for i in self.DEFAULT_SEQUENCERS.values() - ] - for target in default_sequencers: - for name, value in self.DEFAULT_SEQUENCERS_VALUES.items(): - target.set(name, value) - - # connect the default sequencers to the out port - self.device.sequencers[self.DEFAULT_SEQUENCERS["o1"]].set("connect_out0", "IQ") - self.device.sequencers[self.DEFAULT_SEQUENCERS["o1"]].set("connect_out1", "off") - self.device.sequencers[self.DEFAULT_SEQUENCERS["o2"]].set("connect_out1", "IQ") - self.device.sequencers[self.DEFAULT_SEQUENCERS["o2"]].set("connect_out0", "off") - - def connect(self, cluster: Cluster = None): - """Connects to the instrument using the instrument settings in the - runcard. - - Once connected, it creates port classes with properties mapped - to various instrument parameters, and initialises the the - underlying device parameters. It uploads to the module the port - settings loaded from the runcard. - """ - if self.is_connected: - return - - elif cluster is not None: - self.device = cluster.modules[int(self.address.split(":")[1]) - 1] - # test connection with module - if not self.device.present(): - raise ConnectionError( - f"Module {self.device.name} not connected to cluster {cluster.name}" - ) - # once connected, initialise the parameters of the device to the default values - self._device_num_sequencers = len(self.device.sequencers) - self._set_default_values() - # then set the value loaded from the runcard - try: - for port in self.settings: - self._sequencers[port] = [] - if self.settings[port]["lo_frequency"]: - self._ports[port].lo_enabled = True - self._ports[port].lo_frequency = self.settings[port][ - "lo_frequency" - ] - self._ports[port].attenuation = self.settings[port]["attenuation"] - self._ports[port].hardware_mod_en = True - self._ports[port].nco_freq = 0 - self._ports[port].nco_phase_offs = 0 - except Exception as error: - raise RuntimeError( - f"Unable to initialize port parameters on module {self.name}: {error}" - ) - self.is_connected = True - - def setup(self, **settings): - """Cache the settings of the runcard and instantiate the ports of the - module. - - Args: - **settings: dict = A dictionary of settings loaded from the runcard: - - - settings['o1']['attenuation'] (int): [0 to 60 dBm, in multiples of 2] attenuation at the output. - - settings['o1']['lo_frequency'] (int): [2_000_000_000 to 18_000_000_000 Hz] local oscillator frequency. - - settings['o1']['hardware_mod_en'] (bool): enables Hardware Modulation. In this mode, pulses are modulated to the intermediate frequency - using the numerically controlled oscillator within the fpga. It only requires the upload of the pulse envelope waveform. - At the moment this param is not loaded but is always set to True. - - - settings['o2']['attenuation'] (int): [0 to 60 dBm, in multiples of 2] attenuation at the output. - - settings['o2']['lo_frequency'] (int): [2_000_000_000 to 18_000_000_000 Hz] local oscillator frequency. - - settings['o2']['hardware_mod_en'] (bool): enables Hardware Modulation. In this mode, pulses are modulated to the intermediate frequency - using the numerically controlled oscillator within the fpga. It only requires the upload of the pulse envelope waveform. - At the moment this param is not loaded but is always set to True. - """ - self.settings = settings if settings else self.settings - - def _get_next_sequencer(self, port, frequency, qubit: None): - """Retrieves and configures the next avaliable sequencer. - - The parameters of the new sequencer are copied from those of the default sequencer, except for the - intermediate frequency and classification parameters. - Args: - port (str): - frequency (): - qubit (): - Raises: - Exception = If attempting to set a parameter without a connection to the instrument. - """ - - # select a new sequencer and configure it as required - next_sequencer_number = self._free_sequencers_numbers.pop(0) - if next_sequencer_number != self.DEFAULT_SEQUENCERS[port]: - for parameter in self.device.sequencers[ - self.DEFAULT_SEQUENCERS[port] - ].parameters: - # exclude read-only parameter `sequence` - if parameter not in ["sequence"]: - value = self.device.sequencers[self.DEFAULT_SEQUENCERS[port]].get( - param_name=parameter - ) - if value: - target = self.device.sequencers[next_sequencer_number] - target.set(parameter, value) - - # if hardware modulation is enabled configure nco_frequency - if self._ports[port].hardware_mod_en: - self.device.sequencers[next_sequencer_number].set("nco_freq", frequency) - # Assumes all pulses in non_overlapping_pulses set - # have the same frequency. Non-overlapping pulses of different frequencies on the same - # qubit channel with hardware_demod_en would lead to wrong results. - # TODO: Throw error in that event or implement for non_overlapping_same_frequency_pulses - # Even better, set the frequency before each pulse is played (would work with hardware modulation only) - - # create sequencer wrapper - sequencer = Sequencer(next_sequencer_number) - sequencer.qubit = qubit - return sequencer - - def get_if(self, pulse): - """Returns the intermediate frequency needed to synthesise a pulse - based on the port lo frequency.""" - - _rf = pulse.frequency - _lo = self.channel_map[pulse.channel].lo_frequency - _if = _rf - _lo - if abs(_if) > self.FREQUENCY_LIMIT: - raise Exception( - f""" - Pulse frequency {_rf:_} cannot be synthesised with current lo frequency {_lo:_}. - The intermediate frequency {_if:_} would exceed the maximum frequency of {self.FREQUENCY_LIMIT:_} - """ - ) - return _if - - def process_pulse_sequence( - self, - qubits: dict, - instrument_pulses: PulseSequence, - navgs: int, - nshots: int, - repetition_duration: int, - sweepers=None, - ): - """Processes a sequence of pulses and sweepers, generating the - waveforms and program required by the instrument to synthesise them. - - The output of the process is a list of sequencers used for each port, configured with the information - required to play the sequence. - The following features are supported: - - - overlapping pulses - - hardware modulation - - software modulation, with support for arbitrary pulses - - real-time sweepers of - - - pulse frequency (requires hardware modulation) - - pulse relative phase (requires hardware modulation) - - pulse amplitude - - pulse start - - pulse duration - - port gain - - port offset - - - sequencer memory optimisation (waveforms cache) - - extended waveform memory with the use of multiple sequencers - - pulses of up to 8192 pairs of i, q samples - - intrument parameters cache - - Args: - instrument_pulses (PulseSequence): A collection of Pulse objects to be played by the instrument. - navgs (int): The number of times the sequence of pulses should be executed averaging the results. - nshots (int): The number of times the sequence of pulses should be executed without averaging. - repetition_duration (int): The total duration of the pulse sequence execution plus the reset/relaxation time. - sweepers (list(Sweeper)): A list of Sweeper objects to be implemented. - """ - if sweepers is None: - sweepers = [] - sequencer: Sequencer - sweeper: Sweeper - - self._free_sequencers_numbers = list(range(len(self._ports), 6)) - - # process the pulses for every port - for port in self._ports: - # split the collection of instruments pulses by ports - port_channel = [ - chan.name - for chan in self.channel_map.values() - if chan.port.name == port - ] - port_pulses: PulseSequence = instrument_pulses.get_channel_pulses( - *port_channel - ) - - # initialise the list of sequencers required by the port - self._sequencers[port] = [] - - if not port_pulses.is_empty: - # initialise the list of free sequencer numbers to include the default for each port {'o1': 0, 'o2': 1} - self._free_sequencers_numbers = [ - self.DEFAULT_SEQUENCERS[port] - ] + self._free_sequencers_numbers - - # split the collection of port pulses in non overlapping pulses - non_overlapping_pulses: PulseSequence - for non_overlapping_pulses in port_pulses.separate_overlapping_pulses(): - # each set of not overlapping pulses will be played by a separate sequencer - # check sequencer availability - if len(self._free_sequencers_numbers) == 0: - raise Exception( - f"The number of sequencers requried to play the sequence exceeds the number available {self._device_num_sequencers}." - ) - - # get next sequencer - sequencer = self._get_next_sequencer( - port=port, - frequency=self.get_if(non_overlapping_pulses[0]), - qubit=non_overlapping_pulses[0].qubit, - ) - # add the sequencer to the list of sequencers required by the port - self._sequencers[port].append(sequencer) - - # make a temporary copy of the pulses to be processed - pulses_to_be_processed = copy.copy(non_overlapping_pulses) - while not pulses_to_be_processed.is_empty: - pulse: Pulse = pulses_to_be_processed[0] - # attempt to save the waveforms to the sequencer waveforms buffer - try: - sequencer.waveforms_buffer.add_waveforms( - pulse, self._ports[port].hardware_mod_en, sweepers - ) - sequencer.pulses.append(pulse) - pulses_to_be_processed.remove(pulse) - - # if there is not enough memory in the current sequencer, use another one - except WaveformsBuffer.NotEnoughMemory: - if ( - len(pulse.waveform_i) + len(pulse.waveform_q) - > WaveformsBuffer.SIZE - ): - raise NotImplementedError( - f"Pulses with waveforms longer than the memory of a sequencer ({WaveformsBuffer.SIZE // 2}) are not supported." - ) - if len(self._free_sequencers_numbers) == 0: - raise Exception( - f"The number of sequencers requried to play the sequence exceeds the number available {self._device_num_sequencers}." - ) - # get next sequencer - sequencer = self._get_next_sequencer( - port=port, - frequency=self.get_if(non_overlapping_pulses[0]), - qubit=non_overlapping_pulses[0].qubit, - ) - # add the sequencer to the list of sequencers required by the port - self._sequencers[port].append(sequencer) - - # update the lists of used and unused sequencers that will be needed later on - self._used_sequencers_numbers = [] - for port in self._ports: - for sequencer in self._sequencers[port]: - self._used_sequencers_numbers.append(sequencer.number) - self._unused_sequencers_numbers = [] - for n in range(self._device_num_sequencers): - if not n in self._used_sequencers_numbers: - self._unused_sequencers_numbers.append(n) - - # generate and store the Waveforms dictionary, the Acquisitions dictionary, the Weights and the Program - for port in self._ports: - for sequencer in self._sequencers[port]: - pulses = sequencer.pulses - program = sequencer.program - - ## pre-process sweepers ## - # TODO: move qibolab sweepers preprocessing to qblox controller - - # attach a sweeper attribute to the pulse so that it is easily accesible by the code that generates - # the pseudo-assembly program - pulse = None - for pulse in pulses: - pulse.sweeper = None - - pulse_sweeper_parameters = [ - Parameter.frequency, - Parameter.amplitude, - Parameter.duration, - Parameter.relative_phase, - ] - - for sweeper in sweepers: - if sweeper.parameter in pulse_sweeper_parameters: - # check if this sequencer takes an active role in the sweep - if sweeper.pulses and set(sequencer.pulses) & set( - sweeper.pulses - ): - # plays an active role - reference_value = None - if ( - sweeper.parameter == Parameter.frequency - and sequencer.pulses - ): - reference_value = self.get_if(sequencer.pulses[0]) - if sweeper.parameter == Parameter.amplitude: - for pulse in pulses: - if pulse in sweeper.pulses: - reference_value = ( - pulse.amplitude - ) # uses the amplitude of the first pulse - if ( - sweeper.parameter == Parameter.duration - and pulse in sweeper.pulses - ): - # for duration sweepers bake waveforms - sweeper.qs = QbloxSweeper( - program=program, - type=QbloxSweeperType.duration, - rel_values=pulse.idx_range, - ) - else: - # create QbloxSweepers and attach them to qibolab sweeper - if ( - sweeper.type == SweeperType.OFFSET - and reference_value - ): - sweeper.qs = QbloxSweeper.from_sweeper( - program=program, - sweeper=sweeper, - add_to=reference_value, - ) - elif ( - sweeper.type == SweeperType.FACTOR - and reference_value - ): - sweeper.qs = QbloxSweeper.from_sweeper( - program=program, - sweeper=sweeper, - multiply_to=reference_value, - ) - else: - sweeper.qs = QbloxSweeper.from_sweeper( - program=program, sweeper=sweeper - ) - - # finally attach QbloxSweepers to the pulses being swept - sweeper.qs.update_parameters = True - pulse.sweeper = sweeper.qs - else: - # does not play an active role - sweeper.qs = QbloxSweeper( - program=program, - type=QbloxSweeperType.number, - rel_values=range(len(sweeper.values)), - name=sweeper.parameter.name, - ) - - else: - # does not play an active role - sweeper.qs = QbloxSweeper( - program=program, - type=QbloxSweeperType.number, - rel_values=range(len(sweeper.values)), - name=sweeper.parameter.name, - ) - - # # FIXME: for qubit sweepers (Parameter.bias, Parameter.attenuation, Parameter.gain), the qubit - # # information alone is not enough to determine what instrument parameter is to be swept. - # # For example port gain, both the drive and readout ports have gain parameters. - # # Until this is resolved, and since bias is only implemented with QCMs offset, this instrument will - # # never take an active role in those sweeps. - - # Waveforms - for index, waveform in enumerate( - sequencer.waveforms_buffer.unique_waveforms - ): - sequencer.waveforms[waveform.serial] = { - "data": waveform.tolist(), - "index": index, - } - - # Program - minimum_delay_between_instructions = 4 - - sequence_total_duration = ( - pulses.finish - ) # the minimum delay between instructions is 4ns - time_between_repetitions = repetition_duration - sequence_total_duration - assert time_between_repetitions > minimum_delay_between_instructions - # TODO: currently relaxation_time needs to be greater than acquisition_hold_off - # so that the time_between_repetitions is equal to the sequence_total_duration + relaxation_time - # to be compatible with th erest of the platforms, change it so that time_between_repetitions - # is equal to pulsesequence duration + acquisition_hold_off if relaxation_time < acquisition_hold_off - - # create registers for key variables - # nshots is used in the loop that iterates over the number of shots - nshots_register = Register(program, "nshots") - # navgs is used in the loop of hardware averages - navgs_register = Register(program, "navgs") - - header_block = Block("setup") - - body_block = Block() - - body_block.append(f"wait_sync {minimum_delay_between_instructions}") - if self._ports[port].hardware_mod_en: - body_block.append("reset_ph") - body_block.append_spacer() - - pulses_block = Block("play") - # Add an initial wait instruction for the first pulse of the sequence - initial_wait_block = wait_block( - wait_time=pulses[0].start, - register=Register(program), - force_multiples_of_four=False, - ) - pulses_block += initial_wait_block - - for n in range(pulses.count): - if ( - pulses[n].sweeper - and pulses[n].sweeper.type == QbloxSweeperType.start - ): - pulses_block.append(f"wait {pulses[n].sweeper.register}") - - if self._ports[port].hardware_mod_en: - # # Set frequency - # _if = self.get_if(pulses[n]) - # pulses_block.append(f"set_freq {convert_frequency(_if)}", f"set intermediate frequency to {_if} Hz") - - # Set phase - if ( - pulses[n].sweeper - and pulses[n].sweeper.type - == QbloxSweeperType.relative_phase - ): - pulses_block.append(f"set_ph {pulses[n].sweeper.register}") - else: - pulses_block.append( - f"set_ph {convert_phase(pulses[n].relative_phase)}", - comment=f"set relative phase {pulses[n].relative_phase} rads", - ) - - # Calculate the delay_after_play that is to be used as an argument to the play instruction - if len(pulses) > n + 1: - # If there are more pulses to be played, the delay is the time between the pulse end and the next pulse start - delay_after_play = pulses[n + 1].start - pulses[n].start - else: - delay_after_play = sequence_total_duration - pulses[n].start - - if delay_after_play < minimum_delay_between_instructions: - raise Exception( - f"The minimum delay between the start of two pulses in the same channel is {minimum_delay_between_instructions}ns." - ) - - if ( - pulses[n].sweeper - and pulses[n].sweeper.type == QbloxSweeperType.duration - ): - RI = pulses[n].sweeper.register - # FIXME: - # if pulses[n].type == PulseType.FLUX: - if True: - RQ = pulses[n].sweeper.register - else: - RQ = pulses[n].sweeper.aux_register - - pulses_block.append( - f"play {RI},{RQ},{delay_after_play}", # FIXME delay_after_play won't work as the duration increases - comment=f"play pulse {pulses[n]} sweeping its duration", - ) - else: - # Prepare play instruction: play wave_i_index, wave_q_index, delay_next_instruction - pulses_block.append( - f"play {sequencer.waveforms_buffer.unique_waveforms.index(pulses[n].waveform_i)},{sequencer.waveforms_buffer.unique_waveforms.index(pulses[n].waveform_q)},{delay_after_play}", - comment=f"play waveforms {pulses[n]}", - ) - - body_block += pulses_block - body_block.append_spacer() - - final_reset_block = wait_block( - wait_time=time_between_repetitions, - register=Register(program), - force_multiples_of_four=False, - ) - - body_block += final_reset_block - - footer_block = Block("cleanup") - footer_block.append(f"stop") - - # wrap pulses block in sweepers loop blocks - for sweeper in sweepers: - body_block = sweeper.qs.block(inner_block=body_block) - - nshots_block: Block = loop_block( - start=0, - stop=nshots, - step=1, - register=nshots_register, - block=body_block, - ) - - navgs_block = loop_block( - start=0, - stop=navgs, - step=1, - register=navgs_register, - block=nshots_block, - ) - program.add_blocks(header_block, navgs_block, footer_block) - - sequencer.program = repr(program) - - def upload(self): - """Uploads waveforms and programs of all sequencers and arms them in - preparation for execution. - - This method should be called after `process_pulse_sequence()`. - It configures certain parameters of the instrument based on the - needs of resources determined while processing the pulse - sequence. - """ - # Setup - for sequencer_number in self._used_sequencers_numbers: - target = self.device.sequencers[sequencer_number] - - target.set("sync_en", True) - target.set("marker_ovr_en", True) - target.set("marker_ovr_value", 15) # Default after reboot = 0 - for sequencer_number in self._unused_sequencers_numbers: - target = self.device.sequencers[sequencer_number] - - target.set("marker_ovr_value", 0) # Default after reboot = 0 - target.set("marker_ovr_en", True) # Default after reboot = False - target.set("sync_en", False) - if sequencer_number >= 2: # Never disconnect default sequencers - target.set("connect_out0", "off") - target.set("connect_out1", "off") - - # Upload waveforms and program - qblox_dict = {} - sequencer: Sequencer - for port in self._ports: - for sequencer in self._sequencers[port]: - # Add sequence program and waveforms to single dictionary - qblox_dict[sequencer] = { - "waveforms": sequencer.waveforms, - "weights": sequencer.weights, - "acquisitions": sequencer.acquisitions, - "program": sequencer.program, - } - - # Upload dictionary to the device sequencers - self.device.sequencers[sequencer.number].sequence(qblox_dict[sequencer]) - - # DEBUG: QCM RF Save sequence to file - if self._debug_folder != "": - filename = ( - self._debug_folder - + f"Z_{self.name}_sequencer{sequencer.number}_sequence.json" - ) - with open(filename, "w", encoding="utf-8") as file: - json.dump(qblox_dict[sequencer], file, indent=4) - file.write(sequencer.program) - - # Arm sequencers - for sequencer_number in self._used_sequencers_numbers: - self.device.arm_sequencer(sequencer_number) - - # DEBUG: QCM RF Print Readable Snapshot - # print(self.name) - # self.device.print_readable_snapshot(update=True) - - # DEBUG: QCM RF Save Readable Snapshot - from qibolab.instruments.qblox.debug import print_readable_snapshot - - if self._debug_folder != "": - filename = self._debug_folder + f"Z_{self.name}_snapshot.json" - with open(filename, "w", encoding="utf-8") as file: - print_readable_snapshot(self.device, file, update=True) - - def play_sequence(self): - """Plays the sequence of pulses. - - Starts the sequencers needed to play the sequence of pulses. - """ - - for sequencer_number in self._used_sequencers_numbers: - # Start used sequencers - self.device.start_sequencer(sequencer_number) - - def disconnect(self): - """Stops all sequencers, disconnect all the outputs from the AWG paths - of the sequencers.""" - if not self.is_connected: - return - for sequencer_number in self._used_sequencers_numbers: - status = self.device.get_sequencer_status(sequencer_number) - if status.state is not SequencerStates.STOPPED: - log.warning( - f"Device {self.device.sequencers[sequencer_number].name} did not stop normally\nstate: {status}" - ) - - self.device.stop_sequencer() - self.device.disconnect_outputs() - - self.is_connected = False - self.device = None diff --git a/src/qibolab/instruments/qblox/cluster_qrm_rf.py b/src/qibolab/instruments/qblox/cluster_qrm_rf.py deleted file mode 100644 index 5fd8254475..0000000000 --- a/src/qibolab/instruments/qblox/cluster_qrm_rf.py +++ /dev/null @@ -1,1043 +0,0 @@ -"""Qblox Cluster QRM-RF driver.""" - -import copy -import json -import time - -import numpy as np -from qblox_instruments.native.generic_func import SequencerStates -from qblox_instruments.qcodes_drivers.cluster import Cluster -from qblox_instruments.qcodes_drivers.module import Module -from qibo.config import log - -from qibolab.pulses import Pulse -from qibolab.sequence import PulseSequence -from qibolab.sweeper import Parameter, Sweeper, SweeperType - -from .acquisition import AveragedAcquisition, DemodulatedAcquisition -from .module import ClusterModule -from .q1asm import Block, Register, convert_phase, loop_block, wait_block -from .sequencer import Sequencer, WaveformsBuffer -from .sweeper import QbloxSweeper, QbloxSweeperType - - -class QrmRf(ClusterModule): - """Qblox Cluster Qubit Readout Module RF driver. - - Qubit Readout Module RF (QRM-RF) is an instrument that integrates an arbitrary wave generator, a digitizer, - a local oscillator and a mixer. It has one output and one input port. Each port has a path0 and path1 for the - i(in-phase) and q(quadrature) components of the RF signal. The sampling rate of its ADC/DAC is 1 GSPS. - https://www.qblox.com/cluster - - The class aims to simplify the configuration of the instrument, exposing only those parameters most frequently - used and hiding other more complex settings. - - A reference to the underlying `qblox_instruments.qcodes_drivers.qcm_qrm.QRM_QCM` object is provided via the - attribute `device`, allowing the advanced user to gain access to the features that are not exposed directly - by the class. - - In order to accelerate the execution, the instrument settings are cached, so that the communication with the - instrument only happens when the parameters change. This caching is done with the method - `_set_device_parameter(target, *parameters, value)`. - - .. code-block:: text - - ports: - o1: # output port settings - channel : L3-25a - attenuation : 30 # (dB) 0 to 60, must be multiple of 2 - lo_enabled : true - lo_frequency : 6_000_000_000 # (Hz) from 2e9 to 18e9 - gain : 1 # for path0 and path1 -1.0<=v<=1.0 - i1: # input port settings - channel : L2-5a - acquisition_hold_off : 130 # minimum 4ns - acquisition_duration : 1800 - - classification_parameters: - 0: # qubit id - rotation_angle : 0 # in degrees 0.0<=v<=360.0 - threshold : 0 # in V - 1: - rotation_angle : 194.272 - threshold : 0.011197 - 2: - rotation_angle : 104.002 - threshold : 0.012745 - - Attributes: - name (str): A unique name given to the instrument. - address (str): IP_address:module_number; the IP address of the cluster and - the module number. - device (QcmQrm): A reference to the underlying `qblox_instruments.qcodes_drivers.qcm_qrm.QcmQrm` object. - It can be used to access other features not directly exposed by this wrapper. - https://qblox-qblox-instruments.readthedocs-hosted.com/en/master/api_reference/qcm_qrm.html - - ports = A dictionary giving access to the input and output ports objects. - - - ports['o1']: Output port - - ports['i1']: Input port - - - ports['o1'].channel (int | str): the id of the refrigerator channel the output port o1 is connected to. - - ports['o1'].attenuation (int): (mapped to qrm.out0_att) Controls the attenuation applied to the output - port. It must be a multiple of 2. - - ports['o1'].lo_enabled (bool): (mapped to qrm.out0_in0_lo_en) Enables or disables the local oscillator. - - ports['o1'].lo_frequency (int): (mapped to qrm.out0_in0_lo_freq) Sets the frequency of the local oscillator. - - ports['o1'].gain (float): (mapped to qrm.sequencers[0].gain_awg_path0 and qrm.sequencers[0].gain_awg_path1) - Sets the gain on both paths of the output port. - - ports['o1'].hardware_mod_en (bool): (mapped to qrm.sequencers[0].mod_en_awg) Enables pulse modulation - in hardware. When set to False, pulse modulation is done in software, at the host computer, and the - modulated pulse waveform is uploaded to the instrument. When set to True, the envelope of the pulse - is uploaded to the instrument and it is modulated in real time by the FPGA of the instrument, using - the sequencer nco (numerically controlled oscillator). - - ports['o1'].nco_freq (int): (mapped to qrm.sequencers[0].nco_freq). Mapped, but not configurable from - the runcard. - - ports['o1'].nco_phase_offs = (mapped to qrm.sequencers[0].nco_phase_offs). Mapped, but not configurable - from the runcard. - - - ports['i1'].channel (int | str): the id of the refrigerator channel the input port o1 is connected to. - - ports['i1'].acquisition_hold_off (int): Delay between the moment the readout pulse starts to be played and - the start of the acquisition, in ns. It must be > 0 and multiple of 4. - - ports['i1'].acquisition_duration (int): (mapped to qrm.sequencers[0].integration_length_acq) Duration - of the pulse acquisition, in ns. It must be > 0 and multiple of 4. - - ports['i1'].hardware_demod_en (bool): (mapped to qrm.sequencers[0].demod_en_acq) Enables demodulation - and integration of the acquired pulses in hardware. When set to False, the filtration, demodulation - and integration of the acquired pulses is done at the host computer. When set to True, the - demodulation, integration and discretization of the pulse is done in real time at the FPGA of the - instrument. - - - Sequencer 0 is used always for acquisitions and it is the first sequencer used to synthesise pulses. - - Sequencer 1 to 6 are used as needed to synthesise simultaneous pulses on the same channel (required in - multiplexed readout) or when the memory of the default sequencers rans out. - - classification_parameters (dict): A dictionary containing the parameters needed classify the state of each qubit. - from a single shot measurement: - qubit_id (dict): the id of the qubit - rotation_angle (float): 0 # in degrees 0.0<=v<=360.0. The angle of the rotation applied at the - origin of the i q plane, that put the centroids of the state ``|0>`` and state ``|1>`` in a horizontal line. - The rotation puts the centroid of state ``|1>`` to the right side of centroid of state ``|0>``. - threshold (float): 0 # in V. The real component of the point along the horizontal line - connecting both state centroids (after being rotated), that maximises the fidelity of the - classification. - - channels (list): A list of the channels to which the instrument is connected. - """ - - DEFAULT_SEQUENCERS: dict = {"o1": 0, "i1": 0} - FREQUENCY_LIMIT = 500e6 # 500 MHz - - def __init__(self, name: str, address: str): - """Initialize a Qblox QRM-RF module. - - Parameters: - - name: An arbitrary name to identify the module. - - address: The network address of the instrument, specified as "cluster_IP:module_slot_idx". - - cluster: The Cluster object to which the QRM-RF module is connected. - - Example: - To create a QrmRf instance named 'qrm_rf' connected to slot 2 of a Cluster at address '192.168.0.100': - >>> cluster_instance = Cluster("cluster","192.168.1.100", settings) - >>> qrm_module = QrmRf(name="qrm_rf", address="192.168.1.100:2", cluster=cluster_instance) - """ - - super().__init__(name, address) - self.device: Module = None - self.classification_parameters: dict = {} - self.settings: dict = {} - - self._debug_folder: str = "" - self._input_ports_keys = ["i1"] - self._output_ports_keys = ["o1"] - self._sequencers: dict[Sequencer] = {"o1": []} - self.channel_map: dict = {} - self._device_num_output_ports = 1 - self._device_num_sequencers: int - self._free_sequencers_numbers: list[int] = [] - self._used_sequencers_numbers: list[int] = [] - self._unused_sequencers_numbers: list[int] = [] - self._execution_time: float = 0 - - def _set_default_values(self): - # disable all sequencer connections - self.device.disconnect_outputs() - self.device.disconnect_inputs() - - # set I (path0) and Q (path1) offset to zero on output port 0. Default values after reboot = 7.625 - [self.device.set(f"out0_offset_path{i}", 0) for i in range(2)] - # set input port parameters to default - self.device.set("in0_att", 0) - self.device.set("scope_acq_avg_mode_en_path0", True) - self.device.set("scope_acq_avg_mode_en_path1", True) - self.device.set("scope_acq_sequencer_select", self.DEFAULT_SEQUENCERS["i1"]) - self.device.set("scope_acq_trigger_level_path0", 0) - self.device.set("scope_acq_trigger_level_path1", 0) - self.device.set("scope_acq_trigger_mode_path0", "sequencer") - self.device.set("scope_acq_trigger_mode_path1", "sequencer") - # initialise the parameters of the default sequencer to the default values, - # the rest of the sequencers are disconnected, but will be configured - # with the same parameters as the default in process_pulse_sequence() - target = self.device.sequencers[self.DEFAULT_SEQUENCERS["o1"]] - for name, value in self.DEFAULT_SEQUENCERS_VALUES.items(): - target.set(name, value) - - # connect sequencer to out/in ports - target.set("connect_out0", "IQ") - target.set("connect_acq", "in0") - - def connect(self, cluster: Cluster = None): - """Connects to the instrument using the instrument settings in the - runcard. - - Once connected, it creates port classes with properties mapped - to various instrument parameters, and initialises the the - underlying device parameters. It uploads to the module the port - settings loaded from the runcard. - """ - if self.is_connected: - return - - elif cluster is not None: - self.device = cluster.modules[int(self.address.split(":")[1]) - 1] - # test connection with module - if not self.device.present(): - raise ConnectionError( - f"Module {self.device.name} not connected to cluster {cluster.name}" - ) - # once connected, initialise the parameters of the device to the default values - self._device_num_sequencers = len(self.device.sequencers) - self._set_default_values() - # then set the value loaded from the runcard - try: - if "o1" in self.settings: - self._ports["o1"].attenuation = self.settings["o1"]["attenuation"] - if self.settings["o1"]["lo_frequency"]: - self._ports["o1"].lo_enabled = True - self._ports["o1"].lo_frequency = self.settings["o1"][ - "lo_frequency" - ] - self._ports["o1"].hardware_mod_en = True - self._ports["o1"].nco_freq = 0 - self._ports["o1"].nco_phase_offs = 0 - - if "i1" in self.settings: - self._ports["i1"].hardware_demod_en = True - self._ports["i1"].acquisition_hold_off = self.settings["i1"][ - "acquisition_hold_off" - ] - self._ports["i1"].acquisition_duration = self.settings["i1"][ - "acquisition_duration" - ] - except Exception as error: - raise RuntimeError( - f"Unable to initialize port parameters on module {self.name}: {error}" - ) - self.is_connected = True - - def setup(self, **settings): - """Cache the settings of the runcard and instantiate the ports of the - module. - - Args: - **settings: dict = A dictionary of settings loaded from the runcard: - - - settings['o1']['attenuation'] (int): [0 to 60 dBm, in multiples of 2] attenuation at the output. - - settings['o1']['lo_enabled'] (bool): enable or disable local oscillator for up-conversion. - - settings['o1']['lo_frequency'] (int): [2_000_000_000 to 18_000_000_000 Hz] local oscillator - frequency. - - settings['o1']['hardware_mod_en'] (bool): enables Hardware Modulation. In this mode, pulses are - modulated to the intermediate frequency using the numerically controlled oscillator within the - fpga. It only requires the upload of the pulse envelope waveform. - At the moment this param is not loaded but is always set to True. - - - settings['i1']['hardware_demod_en'] (bool): enables Hardware Demodulation. In this mode, the - sequencers of the fpga demodulate, integrate and classify the results for every shot. Once - integrated, the i and q values and the result of the classification requires much less memory, - so they can be stored for every shot in separate `bins` and retrieved later. Hardware Demodulation - also allows making multiple readouts on the same qubit at different points in the circuit, which is - not possible with Software Demodulation. At the moment this param is not loaded but is always set to True. - - settings['i1']['acquisition_hold_off'] (int): [0 to 16834 ns, in multiples of 4] the time between the moment - the start of the readout pulse begins to be played, and the start of the acquisition. This is used - to account for the time of flight of the pulses from the output port to the input port. - - settings['i1']['acquisition_duration'] (int): [0 to 8192 ns] the duration of the acquisition. It is limited by - the amount of memory available in the fpga to store i q samples. - """ - self.settings = settings if settings else self.settings - - def _get_next_sequencer(self, port: str, frequency: int, qubits: dict, qubit: None): - """Retrieves and configures the next avaliable sequencer. - - The parameters of the new sequencer are copied from those of the default sequencer, except for the intermediate - frequency and classification parameters. - - Args: - port (str): - frequency (int): - qubit (str|int): - Raises: - Exception = If attempting to set a parameter without a connection to the instrument. - """ - - # select a new sequencer and configure it as required - next_sequencer_number = self._free_sequencers_numbers.pop(0) - if next_sequencer_number != self.DEFAULT_SEQUENCERS[port]: - for parameter in self.device.sequencers[ - self.DEFAULT_SEQUENCERS[port] - ].parameters: - # exclude read-only parameter `sequence` and others that have wrong default values (qblox bug) - if not parameter in [ - "sequence", - "thresholded_acq_marker_address", - "thresholded_acq_trigger_address", - ]: - value = self.device.sequencers[self.DEFAULT_SEQUENCERS[port]].get( - param_name=parameter - ) - if value: - target = self.device.sequencers[next_sequencer_number] - target.set(parameter, value) - - # if hardware demodulation is enabled, configure nco_frequency and classification parameters - if self._ports["i1"].hardware_demod_en or self._ports["o1"].hardware_mod_en: - self.device.sequencers[next_sequencer_number].set("nco_freq", frequency) - # It assumes all pulses in non_overlapping_pulses set have the same frequency. - # Non-overlapping pulses of different frequencies on the same qubit channel, with hardware_demod_en - # would lead to wrong results. - # TODO: Throw error in that event or implement non_overlapping_same_frequency_pulses - # Even better, set the frequency before each pulse is played (would work with hardware modulation only) - - # if self._ports["i1"].hardware_demod_en and qubit in self.classification_parameters: - if self._ports["i1"].hardware_demod_en and not qubits[qubit].threshold is None: - self.device.sequencers[next_sequencer_number].set( - "thresholded_acq_rotation", - (qubits[qubit].iq_angle * 360 / (2 * np.pi)) % 360, - ) - self.device.sequencers[next_sequencer_number].set( - "thresholded_acq_threshold", - qubits[qubit].threshold * self._ports["i1"].acquisition_duration, - ) - # create sequencer wrapper - sequencer = Sequencer(next_sequencer_number) - sequencer.qubit = qubit - return sequencer - - def get_if(self, pulse: Pulse): - """Returns the intermediate frequency needed to synthesise a pulse - based on the port lo frequency.""" - - _rf = pulse.frequency - _lo = self.channel_map[pulse.channel].lo_frequency - _if = _rf - _lo - if abs(_if) > self.FREQUENCY_LIMIT: - raise Exception( - f""" - Pulse frequency {_rf:_} cannot be synthesised with current lo frequency {_lo:_}. - The intermediate frequency {_if:_} would exceed the maximum frequency of {self.FREQUENCY_LIMIT:_} - """ - ) - return _if - - def process_pulse_sequence( - self, - qubits: dict, - instrument_pulses: PulseSequence, - navgs: int, - nshots: int, - repetition_duration: int, - sweepers=None, - ): - """Processes a sequence of pulses and sweepers, generating the - waveforms and program required by the instrument to synthesise them. - - The output of the process is a list of sequencers used for each port, configured with the information - required to play the sequence. - The following features are supported: - - - multiplexed readout of up to 6 qubits - - overlapping pulses - - hardware modulation, demodulation, and classification - - software modulation, with support for arbitrary pulses - - software demodulation - - binned acquisition - - real-time sweepers of - - - pulse frequency (requires hardware modulation) - - pulse relative phase (requires hardware modulation) - - pulse amplitude - - pulse start - - pulse duration - - port gain - - port offset - - - multiple readouts for the same qubit (sequence unrolling) - - pulses of up to 8192 pairs of i, q samples - - sequencer memory optimisation (waveforms cache) - - extended waveform memory with the use of multiple sequencers - - intrument parameters cache - - Args: - instrument_pulses (PulseSequence): A collection of Pulse objects to be played by the instrument. - navgs (int): The number of times the sequence of pulses should be executed averaging the results. - nshots (int): The number of times the sequence of pulses should be executed without averaging. - repetition_duration (int): The total duration of the pulse sequence execution plus the reset/relaxation time. - sweepers (list(Sweeper)): A list of Sweeper objects to be implemented. - """ - if sweepers is None: - sweepers = [] - sequencer: Sequencer - sweeper: Sweeper - # calculate the number of bins - num_bins = nshots - for sweeper in sweepers: - num_bins *= len(sweeper.values) - - # estimate the execution time - self._execution_time = ( - navgs * num_bins * ((repetition_duration + 1000 * len(sweepers)) * 1e-9) - ) - - port = "o1" - # initialise the list of free sequencer numbers to include the default for each port {'o1': 0} - self._free_sequencers_numbers = [self.DEFAULT_SEQUENCERS[port]] + [ - 1, - 2, - 3, - 4, - 5, - ] - - # split the collection of instruments pulses by ports - # ro_channel = None - # feed_channel = None - port_channel = [ - chan.name for chan in self.channel_map.values() if chan.port.name == port - ] - port_pulses: PulseSequence = instrument_pulses.get_channel_pulses(*port_channel) - - # initialise the list of sequencers required by the port - self._sequencers[port] = [] - - if not port_pulses.is_empty: - # split the collection of port pulses in non overlapping pulses - non_overlapping_pulses: PulseSequence - for non_overlapping_pulses in port_pulses.separate_overlapping_pulses(): - # each set of not overlapping pulses will be played by a separate sequencer - # check sequencer availability - if len(self._free_sequencers_numbers) == 0: - raise Exception( - f"The number of sequencers requried to play the sequence exceeds the number available {self._device_num_sequencers}." - ) - # get next sequencer - sequencer = self._get_next_sequencer( - port=port, - frequency=self.get_if(non_overlapping_pulses[0]), - qubits=qubits, - qubit=non_overlapping_pulses[0].qubit, - ) - # add the sequencer to the list of sequencers required by the port - self._sequencers[port].append(sequencer) - - # make a temporary copy of the pulses to be processed - pulses_to_be_processed = copy.copy(non_overlapping_pulses) - while not pulses_to_be_processed.is_empty: - pulse: Pulse = pulses_to_be_processed[0] - # attempt to save the waveforms to the sequencer waveforms buffer - try: - sequencer.waveforms_buffer.add_waveforms( - pulse, self._ports[port].hardware_mod_en, sweepers - ) - sequencer.pulses.append(pulse) - pulses_to_be_processed.remove(pulse) - - # if there is not enough memory in the current sequencer, use another one - except WaveformsBuffer.NotEnoughMemory: - if ( - len(pulse.waveform_i) + len(pulse.waveform_q) - > WaveformsBuffer.SIZE - ): - raise NotImplementedError( - f"Pulses with waveforms longer than the memory of a sequencer ({WaveformsBuffer.SIZE // 2}) are not supported." - ) - if len(self._free_sequencers_numbers) == 0: - raise Exception( - f"The number of sequencers requried to play the sequence exceeds the number available {self._device_num_sequencers}." - ) - # get next sequencer - sequencer = self._get_next_sequencer( - port=port, - frequency=self.get_if(non_overlapping_pulses[0]), - qubits=qubits, - qubit=non_overlapping_pulses[0].qubit, - ) - # add the sequencer to the list of sequencers required by the port - self._sequencers[port].append(sequencer) - - # update the lists of used and unused sequencers that will be needed later on - self._used_sequencers_numbers = [] - for port in self._output_ports_keys: - for sequencer in self._sequencers[port]: - self._used_sequencers_numbers.append(sequencer.number) - self._unused_sequencers_numbers = [] - for n in range(self._device_num_sequencers): - if not n in self._used_sequencers_numbers: - self._unused_sequencers_numbers.append(n) - - # generate and store the Waveforms dictionary, the Acquisitions dictionary, the Weights and the Program - for port in self._output_ports_keys: - for sequencer in self._sequencers[port]: - pulses = sequencer.pulses - program = sequencer.program - - ## pre-process sweepers ## - # TODO: move qibolab sweepers preprocessing to qblox controller - - # attach a sweeper attribute to the pulse so that it is easily accesible by the code that generates - # the pseudo-assembly program - pulse = None - for pulse in pulses: - pulse.sweeper = None - - pulse_sweeper_parameters = [ - Parameter.frequency, - Parameter.amplitude, - Parameter.duration, - Parameter.relative_phase, - ] - - for sweeper in sweepers: - if sweeper.parameter in pulse_sweeper_parameters: - # check if this sequencer takes an active role in the sweep - if sweeper.pulses and set(sequencer.pulses) & set( - sweeper.pulses - ): - # plays an active role - reference_value = None - if sweeper.parameter == Parameter.frequency: - if sequencer.pulses: - reference_value = self.get_if( - sequencer.pulses[0] - ) # uses the frequency of the first pulse (assuming all same freq) - if sweeper.parameter == Parameter.amplitude: - for pulse in pulses: - if pulse in sweeper.pulses: - reference_value = ( - pulse.amplitude - ) # uses the amplitude of the first pulse - if ( - sweeper.parameter == Parameter.duration - and pulse in sweeper.pulses - ): - # for duration sweepers bake waveforms - sweeper.qs = QbloxSweeper( - program=program, - type=QbloxSweeperType.duration, - rel_values=pulse.idx_range, - ) - else: - # create QbloxSweepers and attach them to qibolab sweeper - if ( - sweeper.type == SweeperType.OFFSET - and reference_value - ): - sweeper.qs = QbloxSweeper.from_sweeper( - program=program, - sweeper=sweeper, - add_to=reference_value, - ) - elif ( - sweeper.type == SweeperType.FACTOR - and reference_value - ): - sweeper.qs = QbloxSweeper.from_sweeper( - program=program, - sweeper=sweeper, - multiply_to=reference_value, - ) - else: - sweeper.qs = QbloxSweeper.from_sweeper( - program=program, sweeper=sweeper - ) - - # finally attach QbloxSweepers to the pulses being swept - sweeper.qs.update_parameters = True - pulse.sweeper = sweeper.qs - else: - # does not play an active role - sweeper.qs = QbloxSweeper( - program=program, - type=QbloxSweeperType.number, - rel_values=range(len(sweeper.values)), - name=sweeper.parameter.name, - ) - - # else: # qubit_sweeper_parameters - # if sweeper.qubits and sequencer.qubit in [_.name for _ in sweeper.qubits]: - # # plays an active role - # if sweeper.parameter == Parameter.bias: - # reference_value = self._ports[port].offset - # # create QbloxSweepers and attach them to qibolab sweeper - # if sweeper.type == SweeperType.ABSOLUTE: - # sweeper.qs = QbloxSweeper.from_sweeper( - # program=program, sweeper=sweeper, add_to=-reference_value - # ) - # elif sweeper.type == SweeperType.OFFSET: - # sweeper.qs = QbloxSweeper.from_sweeper(program=program, sweeper=sweeper) - # elif sweeper.type == SweeperType.FACTOR: - # raise Exception("SweeperType.FACTOR for Parameter.bias not supported") - # sweeper.qs.update_parameters = True - # else: - # # does not play an active role - # sweeper.qs = QbloxSweeper( - # program=program, type=QbloxSweeperType.number, rel_values=range(len(sweeper.values)), - # name = sweeper.parameter.name - # ) - else: - # does not play an active role - sweeper.qs = QbloxSweeper( - program=program, - type=QbloxSweeperType.number, - rel_values=range(len(sweeper.values)), - name=sweeper.parameter.name, - ) - - # # FIXME: for qubit sweepers (Parameter.bias, Parameter.attenuation, Parameter.gain), the qubit - # # information alone is not enough to determine what instrument parameter is to be swept. - # # For example port gain, both the drive and readout ports have gain parameters. - # # Until this is resolved, and since bias is only implemented with QCMs offset, this instrument will - # # never take an active role in those sweeps. - - # Waveforms - for index, waveform in enumerate( - sequencer.waveforms_buffer.unique_waveforms - ): - sequencer.waveforms[waveform.serial] = { - "data": waveform.tolist(), - "index": index, - } - - # Acquisitions - pulse = None - for acquisition_index, pulse in enumerate( - sequencer.pulses.acquisitions - ): - sequencer.acquisitions[pulse.id] = { - "num_bins": num_bins, - "index": acquisition_index, - } - - # Add scope_acquisition to default sequencer - if ( - sequencer.number == self.DEFAULT_SEQUENCERS[port] - and pulse is not None - ): - sequencer.acquisitions["scope_acquisition"] = { - "num_bins": 1, - "index": acquisition_index + 1, - } - - # Program - minimum_delay_between_instructions = 4 - - # Active reset is not fully tested yet - active_reset = False - active_reset_address = 1 - active_reset_pulse_idx_I = 1 - active_reset_pulse_idx_Q = 1 - - sequence_total_duration = ( - pulses.finish - ) # the minimum delay between instructions is 4ns - time_between_repetitions = repetition_duration - sequence_total_duration - assert time_between_repetitions > minimum_delay_between_instructions - # TODO: currently relaxation_time needs to be greater than acquisition_hold_off - # so that the time_between_repetitions is equal to the sequence_total_duration + relaxation_time - # to be compatible with th erest of the platforms, change it so that time_between_repetitions - # is equal to pulsesequence duration + acquisition_hold_off if relaxation_time < acquisition_hold_off - - # create registers for key variables - # nshots is used in the loop that iterates over the number of shots - nshots_register = Register(program, "nshots") - # during a sweep, each shot is saved in the bin bin_n - bin_n = Register(program, "bin_n") - # navgs is used in the loop of hardware averages - navgs_register = Register(program, "navgs") - - header_block = Block("setup") - if active_reset: - header_block.append( - f"set_latch_en {active_reset_address}, 4", - f"monitor triggers on address {active_reset_address}", - ) - - body_block = Block() - - body_block.append(f"wait_sync {minimum_delay_between_instructions}") - if ( - self._ports["i1"].hardware_demod_en - or self._ports["o1"].hardware_mod_en - ): - body_block.append("reset_ph") - body_block.append_spacer() - - pulses_block = Block("play_and_acquire") - # Add an initial wait instruction for the first pulse of the sequence - initial_wait_block = wait_block( - wait_time=pulses[0].start, - register=Register(program), - force_multiples_of_four=True, - ) - pulses_block += initial_wait_block - - for n in range(pulses.count): - if ( - pulses[n].sweeper - and pulses[n].sweeper.type == QbloxSweeperType.start - ): - pulses_block.append(f"wait {pulses[n].sweeper.register}") - - if self._ports["o1"].hardware_mod_en: - # # Set frequency - # _if = self.get_if(pulses[n]) - # pulses_block.append(f"set_freq {convert_frequency(_if)}", f"set intermediate frequency to {_if} Hz") - - # Set phase - if ( - pulses[n].sweeper - and pulses[n].sweeper.type - == QbloxSweeperType.relative_phase - ): - pulses_block.append(f"set_ph {pulses[n].sweeper.register}") - else: - pulses_block.append( - f"set_ph {convert_phase(pulses[n].relative_phase)}", - comment=f"set relative phase {pulses[n].relative_phase} rads", - ) - - # FIXME: - # if pulses[n].type == PulseType.READOUT: - if True: - delay_after_play = self._ports["i1"].acquisition_hold_off - - if len(pulses) > n + 1: - # If there are more pulses to be played, the delay is the time between the pulse end and the next pulse start - delay_after_acquire = ( - pulses[n + 1].start - - pulses[n].start - - self._ports["i1"].acquisition_hold_off - ) - else: - delay_after_acquire = ( - sequence_total_duration - pulses[n].start - ) - time_between_repetitions = ( - repetition_duration - - sequence_total_duration - - self._ports["i1"].acquisition_hold_off - ) - assert time_between_repetitions > 0 - - if delay_after_acquire < minimum_delay_between_instructions: - raise Exception( - f"The minimum delay after starting acquisition is {minimum_delay_between_instructions}ns." - ) - - if ( - pulses[n].sweeper - and pulses[n].sweeper.type == QbloxSweeperType.duration - ): - RI = pulses[n].sweeper.register - # FIXME: - # if pulses[n].type == PulseType.FLUX: - if True: - RQ = pulses[n].sweeper.register - else: - RQ = pulses[n].sweeper.aux_register - - pulses_block.append( - f"play {RI},{RQ},{delay_after_play}", # FIXME delay_after_play won't work as the duration increases - comment=f"play pulse {pulses[n]} sweeping its duration", - ) - else: - # Prepare play instruction: play wave_i_index, wave_q_index, delay_next_instruction - pulses_block.append( - f"play {sequencer.waveforms_buffer.unique_waveforms.index(pulses[n].waveform_i)},{sequencer.waveforms_buffer.unique_waveforms.index(pulses[n].waveform_q)},{delay_after_play}", - comment=f"play waveforms {pulses[n]}", - ) - - # Prepare acquire instruction: acquire acquisition_index, bin_index, delay_next_instruction - if active_reset: - pulses_block.append( - f"acquire {pulses.acquisitions.index(pulses[n])},{bin_n},4" - ) - pulses_block.append( - f"latch_rst {delay_after_acquire + 300 - 4}" - ) - else: - pulses_block.append( - f"acquire {pulses.acquisitions.index(pulses[n])},{bin_n},{delay_after_acquire}" - ) - - else: - # Calculate the delay_after_play that is to be used as an argument to the play instruction - if len(pulses) > n + 1: - # If there are more pulses to be played, the delay is the time between the pulse end and the next pulse start - delay_after_play = pulses[n + 1].start - pulses[n].start - else: - delay_after_play = sequence_total_duration - pulses[n].start - - if delay_after_play < minimum_delay_between_instructions: - raise Exception( - f"The minimum delay between the start of two pulses in the same channel is {minimum_delay_between_instructions}ns." - ) - - if ( - pulses[n].sweeper - and pulses[n].sweeper.type == QbloxSweeperType.duration - ): - RI = pulses[n].sweeper.register - # FIXME: - # if pulses[n].type == PulseType.FLUX: - if True: - RQ = pulses[n].sweeper.register - else: - RQ = pulses[n].sweeper.aux_register - - pulses_block.append( - f"play {RI},{RQ},{delay_after_play}", # FIXME delay_after_play won't work as the duration increases - comment=f"play pulse {pulses[n]} sweeping its duration", - ) - else: - # Prepare play instruction: play wave_i_index, wave_q_index, delay_next_instruction - pulses_block.append( - f"play {sequencer.waveforms_buffer.unique_waveforms.index(pulses[n].waveform_i)},{sequencer.waveforms_buffer.unique_waveforms.index(pulses[n].waveform_q)},{delay_after_play}", - comment=f"play waveforms {pulses[n]}", - ) - - body_block += pulses_block - body_block.append_spacer() - - if active_reset: - final_reset_block = Block() - final_reset_block.append( - f"set_cond 1, {active_reset_address}, 0, 4", - comment="active reset", - ) - final_reset_block.append( - f"play {active_reset_pulse_idx_I}, {active_reset_pulse_idx_Q}, 4", - level=1, - ) - final_reset_block.append( - f"set_cond 0, {active_reset_address}, 0, 4" - ) - else: - final_reset_block = wait_block( - wait_time=time_between_repetitions, - register=Register(program), - force_multiples_of_four=False, - ) - final_reset_block.append_spacer() - final_reset_block.append( - f"add {bin_n}, 1, {bin_n}", "increase bin counter" - ) - - body_block += final_reset_block - - footer_block = Block("cleanup") - footer_block.append(f"stop") - - # wrap pulses block in sweepers loop blocks - for sweeper in sweepers: - body_block = sweeper.qs.block(inner_block=body_block) - - nshots_block: Block = loop_block( - start=0, - stop=nshots, - step=1, - register=nshots_register, - block=body_block, - ) - nshots_block.prepend(f"move 0, {bin_n}", "reset bin counter") - nshots_block.append_spacer() - - navgs_block = loop_block( - start=0, - stop=navgs, - step=1, - register=navgs_register, - block=nshots_block, - ) - program.add_blocks(header_block, navgs_block, footer_block) - - sequencer.program = repr(program) - - def upload(self): - """Uploads waveforms and programs of all sequencers and arms them in - preparation for execution. - - This method should be called after `process_pulse_sequence()`. - It configures certain parameters of the instrument based on the - needs of resources determined while processing the pulse - sequence. - """ - # Setup - for sequencer_number in self._used_sequencers_numbers: - target = self.device.sequencers[sequencer_number] - target.set("sync_en", True) - target.set("marker_ovr_en", True) # Default after reboot = False - target.set("marker_ovr_value", 15) # Default after reboot = 0 - for sequencer_number in self._unused_sequencers_numbers: - target = self.device.sequencers[sequencer_number] - target.set("sync_en", False) - target.set("marker_ovr_en", False) # Default after reboot = False - target.set("marker_ovr_value", 0) # Default after reboot = 0 - if sequencer_number >= 1: # Never disconnect default sequencers - target.set("connect_out0", "off") - target.set("connect_acq", "in0") - - # Upload waveforms and program - qblox_dict = {} - sequencer: Sequencer - for port in self._output_ports_keys: - for sequencer in self._sequencers[port]: - # Add sequence program and waveforms to single dictionary - qblox_dict[sequencer] = { - "waveforms": sequencer.waveforms, - "weights": sequencer.weights, - "acquisitions": sequencer.acquisitions, - "program": sequencer.program, - } - - # Upload dictionary to the device sequencers - self.device.sequencers[sequencer.number].sequence(qblox_dict[sequencer]) - # DEBUG: QRM RF Save sequence to file - if self._debug_folder != "": - filename = ( - self._debug_folder - + f"Z_{self.name}_sequencer{sequencer.number}_sequence.json" - ) - with open(filename, "w", encoding="utf-8") as file: - json.dump(qblox_dict[sequencer], file, indent=4) - file.write(sequencer.program) - - # Clear acquisition memory and arm sequencers - for sequencer_number in self._used_sequencers_numbers: - self.device.sequencers[sequencer_number].delete_acquisition_data(all=True) - self.device.arm_sequencer(sequencer_number) - - # DEBUG: QRM RF Print Readable Snapshot - # print(self.name) - # self.device.print_readable_snapshot(update=True) - - # DEBUG: QRM RF Save Readable Snapshot - from qibolab.instruments.qblox.debug import print_readable_snapshot - - if self._debug_folder != "": - filename = self._debug_folder + f"Z_{self.name}_snapshot.json" - with open(filename, "w", encoding="utf-8") as file: - print_readable_snapshot(self.device, file, update=True) - - def play_sequence(self): - """Plays the sequence of pulses. - - Starts the sequencers needed to play the sequence of pulses. - """ - - # Start used sequencers - for sequencer_number in self._used_sequencers_numbers: - self.device.start_sequencer(sequencer_number) - - def acquire(self): - """Retrieves the readout results. - - The results returned vary depending on whether demodulation is performed in software or hardware. - See :class:`qibolab.instruments.qblox.acquisition.AveragedAcquisition` and - :class:`qibolab.instruments.qblox.acquisition.DemodulatedAcquisition` for - more details - """ - # wait until all sequencers stop - time_out = int(self._execution_time) + 60 - t = time.time() - for sequencer_number in self._used_sequencers_numbers: - while True: - status = self.device.get_sequencer_status(sequencer_number) - if status.state is SequencerStates.STOPPED: - # TODO: check flags for errors - break - elif time.time() - t > time_out: - log.info( - f"Timeout - {self.device.sequencers[sequencer_number].name} status: {status}" - ) - self.device.stop_sequencer(sequencer_number) - break - time.sleep(0.5) - - # Qblox qrm modules only have one memory for scope acquisition. - # Only one sequencer can save data to that memory. - # Several acquisitions at different points in the circuit will result in the undesired averaging - # of the results. - # Scope Acquisition should only be used with one acquisition per module. - # Several readout pulses are supported for as long as they take place symultaneously. - # Scope Acquisition data should be ignored with more than one acquisition or with Hardware Demodulation. - - # Software Demodulation requires the data from Scope Acquisition, therefore Software Demodulation only works - # with one acquisition per module. - - # The data is retrieved by storing it first in one of the acquisitions of one of the sequencers. - # Any could be used, but we always use 'scope_acquisition' acquisition of the default sequencer to store it. - - acquisitions = {} - duration = self._ports["i1"].acquisition_duration - hardware_demod_enabled = self._ports["i1"].hardware_demod_en - for port in self._output_ports_keys: - for sequencer in self._sequencers[port]: - # Store scope acquisition data on 'scope_acquisition' acquisition of the default sequencer - # TODO: Maybe this store_scope can be done only if needed to optimize the process! - if sequencer.number == self.DEFAULT_SEQUENCERS[port]: - self.device.store_scope_acquisition( - sequencer.number, "scope_acquisition" - ) - scope = self.device.get_acquisitions(sequencer.number)[ - "scope_acquisition" - ] - if not hardware_demod_enabled: # Software Demodulation - if len(sequencer.pulses.acquisitions) == 1: - pulse = sequencer.pulses.acquisitions[0] - frequency = self.get_if(pulse) - acquisitions[pulse.qubit] = acquisitions[pulse.id] = ( - AveragedAcquisition(scope, duration, frequency) - ) - else: - raise RuntimeError( - "Software Demodulation only supports one acquisition per channel. " - "Multiple readout pulses are supported as long as they are symultaneous (requiring one acquisition)." - ) - else: # Hardware Demodulation - results = self.device.get_acquisitions(sequencer.number) - for pulse in sequencer.pulses.acquisitions: - bins = results[pulse.id]["acquisition"]["bins"] - acquisitions[pulse.qubit] = acquisitions[pulse.id] = ( - DemodulatedAcquisition(scope, bins, duration) - ) - - # TODO: to be updated once the functionality of ExecutionResults is extended - return {key: acquisition for key, acquisition in acquisitions.items()} - - def disconnect(self): - """Stops all sequencers, disconnect all the outputs from the AWG paths - of the sequencers and disconnect all the inputs from the acquisition - paths of the sequencers.""" - - if not self.is_connected: - return - - for sequencer_number in self._used_sequencers_numbers: - status = self.device.get_sequencer_status(sequencer_number) - if status.state is not SequencerStates.STOPPED: - log.warning( - f"Device {self.device.sequencers[sequencer_number].name} did not stop normally\nstatus: {status}" - ) - self.device.stop_sequencer() - self.device.disconnect_outputs() - self.device.disconnect_inputs() - - self.is_connected = False - self.device = None diff --git a/src/qibolab/instruments/qblox/controller.py b/src/qibolab/instruments/qblox/controller.py deleted file mode 100644 index 0db1841302..0000000000 --- a/src/qibolab/instruments/qblox/controller.py +++ /dev/null @@ -1,542 +0,0 @@ -import signal -from dataclasses import replace - -import numpy as np -from qblox_instruments.qcodes_drivers.cluster import Cluster as QbloxCluster -from qibo.config import log, raise_error - -from qibolab import AcquisitionType, AveragingMode, ExecutionParameters -from qibolab.instruments.abstract import Controller -from qibolab.instruments.qblox.cluster_qcm_bb import QcmBb -from qibolab.instruments.qblox.cluster_qcm_rf import QcmRf -from qibolab.instruments.qblox.cluster_qrm_rf import QrmRf -from qibolab.instruments.qblox.sequencer import SAMPLING_RATE -from qibolab.sequence import PulseSequence -from qibolab.sweeper import Parameter, Sweeper, SweeperType -from qibolab.unrolling import Bounds - -MAX_NUM_BINS = 98304 -"""Maximum number of bins that should be used per sequencer in a readout -module. - -One sequencer can have up to 2 ** 17 bins, however the 6 sequencers in -module allocate bins from a shared memory, and this memory is smaller -than 6 * 2 ** 17. Hence, if all sequencers are used at once, each cannot -support 2 ** 17 bins. In fact, the total bin memory for the module is 3 -* (2 ** 17 + 2 ** 16). This means up to three sequencers used at once -can support 2 ** 17 bins each, but four or more sequencers cannot. So -the limitation on the number of bins technically depends on the number -of sequencers used, but to keep things simple we limit ourselves to max -number of bins that works regardless of situation. -""" - - -class QbloxController(Controller): - """A controller to manage qblox devices. - - Attributes: - is_connected (bool): . - modules (dict): A dictionay with the qblox modules connected to the experiment. - """ - - def __init__( - self, name, address: str, modules, internal_reference_clock: bool = True - ): - """Initialises the controller.""" - super().__init__(name=name, address=address) - self.is_connected = False - self.cluster: QbloxCluster = None - self.modules: dict = modules - self._reference_clock = "internal" if internal_reference_clock else "external" - self.bounds = Bounds( - waveforms=int( - 4e4 - ), # Translate SEQUENCER_MEMORY = 2**17 into pulse duration - readout=int(1e6), - instructions=int(1e6), - ) - signal.signal(signal.SIGTERM, self._termination_handler) - - @property - def sampling_rate(self): - return SAMPLING_RATE - - def connect(self): - """Connects to the modules.""" - - if self.is_connected: - return - try: - # Connect cluster - QbloxCluster.close_all() - self.cluster = QbloxCluster(self.name, self.address) - self.cluster.reset() - self.cluster.set("reference_source", self._reference_clock) - # Connect modules - for module in self.modules.values(): - module.connect(self.cluster) - self.is_connected = True - log.info("QbloxController: all modules connected.") - - except Exception as exception: - raise ConnectionError(f"Unable to connect:\n{str(exception)}\n") - # TODO: check for exception 'The module qrm_rf0 does not have parameters in0_att' and reboot the cluster - - def disconnect(self): - """Disconnects all modules.""" - if self.is_connected: - for module in self.modules.values(): - module.disconnect() - self.cluster.close() - self.is_connected = False - - def _termination_handler(self, signum, frame): - """Calls all modules to stop if the program receives a termination - signal.""" - - log.warning("Termination signal received, disconnecting modules.") - if self.is_connected: - for name in self.modules: - self.modules[name].disconnect() - log.warning("QbloxController: all modules are disconnected.") - exit(0) - - def _set_module_channel_map(self, module: QrmRf, qubits: dict): - """Retrieve all the channels connected to a specific Qblox module. - - This method updates the `channel_port_map` attribute of the - specified Qblox module based on the information contained in the - provided qubits dictionary (dict of `qubit` objects). - - Return the list of channels connected to module_name - """ - for qubit in qubits.values(): - for channel in qubit.channels: - if channel.port and channel.port.module.name == module.name: - module.channel_map[channel.name] = channel - return list(module.channel_map) - - def _execute_pulse_sequence( - self, - qubits: dict, - sequence: PulseSequence, - options: ExecutionParameters, - sweepers: list() = [], # list(Sweeper) = [] - **kwargs, - # nshots=None, - # navgs=None, - # relaxation_time=None, - ): - """Executes a sequence of pulses or a sweep. - - Args: - sequence (:class:`qibolab.pulses.PulseSequence`): The sequence of pulses to execute. - options (:class:`qibolab.platforms.platform.ExecutionParameters`): Object holding the execution options. - sweepers (list(Sweeper)): A list of Sweeper objects defining parameter sweeps. - """ - if not self.is_connected: - raise_error( - RuntimeError, "Execution failed because modules are not connected." - ) - - if options.averaging_mode is AveragingMode.SINGLESHOT: - nshots = options.nshots - navgs = 1 - else: - navgs = options.nshots - nshots = 1 - - relaxation_time = options.relaxation_time - repetition_duration = sequence.finish + relaxation_time - - # shots results are stored in separate bins - # calculate number of shots - num_bins = nshots - for sweeper in sweepers: - num_bins *= len(sweeper.values) - - # DEBUG: Plot Pulse Sequence - # sequence.plot('plot.png') - # DEBUG: sync_en - # from qblox_instruments.qcodes_drivers.cluster import Cluster - # cluster:Cluster = self.modules['cluster'].device - # for module in cluster.modules: - # if module.get("present"): - # for sequencer in module.sequencers: - # if sequencer.get('sync_en'): - # print(f"type: {module.module_type}, sequencer: {sequencer.name}, sync_en: True") - - # Process Pulse Sequence. Assign pulses to modules and generate waveforms & program - module_pulses = {} - data = {} - for name, module in self.modules.items(): - # from the pulse sequence, select those pulses to be synthesised by the module - module_channels = self._set_module_channel_map(module, qubits) - module_pulses[name] = sequence.get_channel_pulses(*module_channels) - - # ask each module to generate waveforms & program and upload them to the device - module.process_pulse_sequence( - qubits, - module_pulses[name], - navgs, - nshots, - repetition_duration, - sweepers, - ) - - # log.info(f"{self.modules[name]}: Uploading pulse sequence") - module.upload() - - # play the sequence or sweep - for module in self.modules.values(): - if isinstance(module, (QrmRf, QcmRf, QcmBb)): - module.play_sequence() - - # retrieve the results - acquisition_results = {} - for name, module in self.modules.items(): - if ( - isinstance(module, QrmRf) - and not module_pulses[name].acquisitions.is_empty - ): - results = module.acquire() - for key, value in results.items(): - acquisition_results[key] = value - # TODO: move to QRM_RF.acquire() - shape = tuple(len(sweeper.values) for sweeper in reversed(sweepers)) - shots_shape = (nshots,) + shape - for ro_pulse in sequence.acquisitions: - if options.acquisition_type is AcquisitionType.DISCRIMINATION: - _res = acquisition_results[ro_pulse.id].classified - _res = np.reshape(_res, shots_shape) - if options.averaging_mode is not AveragingMode.SINGLESHOT: - _res = np.mean(_res, axis=0) - elif options.acquisition_type is AcquisitionType.RAW: - i_raw = acquisition_results[ro_pulse.id].raw_i - q_raw = acquisition_results[ro_pulse.id].raw_q - _res = i_raw + 1j * q_raw - elif options.acquisition_type is AcquisitionType.INTEGRATION: - ires = acquisition_results[ro_pulse.id].shots_i - qres = acquisition_results[ro_pulse.id].shots_q - _res = ires + 1j * qres - if options.averaging_mode is AveragingMode.SINGLESHOT: - _res = np.reshape(_res, shots_shape) - else: - _res = np.reshape(_res, shape) - - acquisition = options.results_type(np.squeeze(_res)) - data[ro_pulse.id] = data[ro_pulse.qubit] = acquisition - - return data - - def play(self, qubits, couplers, sequence, options): - return self._execute_pulse_sequence(qubits, sequence, options) - - def sweep( - self, - qubits: dict, - couplers: dict, - sequence: PulseSequence, - options: ExecutionParameters, - *sweepers, - ): - """Executes a sequence of pulses while sweeping one or more parameters. - - The parameters to be swept are defined in :class:`qibolab.sweeper.Sweeper` object. - Args: - sequence (:class:`qibolab.pulses.PulseSequence`): The sequence of pulses to execute. - options (:class:`qibolab.platforms.platform.ExecutionParameters`): Object holding the execution options. - sweepers (list(Sweeper)): A list of Sweeper objects defining parameter sweeps. - """ - id_results = {} - map_id_serial = {} - - # during the sweep, pulse parameters need to be changed - # to avoid affecting the user, make a copy of the pulse sequence - # and the sweepers, as they contain references to pulses - sequence_copy = sequence.copy() - sweepers_copy = [] - for sweeper in sweepers: - if sweeper.pulses: - ps = [ - sequence_copy[sequence_copy.index(pulse)] - for pulse in sweeper.pulses - if pulse in sequence_copy - ] - else: - ps = None - sweepers_copy.append( - Sweeper( - parameter=sweeper.parameter, - values=sweeper.values, - pulses=ps, - qubits=sweeper.qubits, - type=sweeper.type, - ) - ) - - # reverse sweepers exept for res punchout att - contains_attenuation_frequency = any( - sweepers_copy[i].parameter == Parameter.attenuation - and sweepers_copy[i + 1].parameter == Parameter.frequency - for i in range(len(sweepers_copy) - 1) - ) - - if not contains_attenuation_frequency: - sweepers_copy.reverse() - - # create a map between the pulse id, which never changes, and the original serial - for pulse in sequence_copy.acquisitions: - map_id_serial[pulse.id] = pulse.id - id_results[pulse.id] = None - id_results[pulse.qubit] = None - - # execute the each sweeper recursively - self._sweep_recursion( - qubits, - sequence_copy, - options, - *tuple(sweepers_copy), - results=id_results, - ) - - # return the results using the original serials - serial_results = {} - for pulse in sequence_copy.acquisitions: - serial_results[map_id_serial[pulse.id]] = id_results[pulse.id] - serial_results[pulse.qubit] = id_results[pulse.id] - return serial_results - - def _sweep_recursion( - self, - qubits, - sequence, - options: ExecutionParameters, - *sweepers, - results, - ): - """Executes a sweep recursively. - - Args: - sequence (:class:`qibolab.pulses.PulseSequence`): The sequence of pulses to execute. - sweepers (list(Sweeper)): A list of Sweeper objects defining parameter sweeps. - results (:class:`qibolab.results.ExecutionResults`): A results object to update with the reults of the execution. - nshots (int): The number of times the sequence of pulses should be executed. - average (bool): A flag to indicate if the results of the shots should be averaged. - relaxation_time (int): The the time to wait between repetitions to allow the qubit relax to ground state. - """ - - for_loop_sweepers = [Parameter.attenuation, Parameter.lo_frequency] - sweeper: Sweeper = sweepers[0] - - # until sweeper contains the information to determine whether the sweep should be relative or - # absolute: - - # elif sweeper.parameter is Parameter.relative_phase: - # initial = {} - # for pulse in sweeper.pulses: - # initial[pulse.id] = pulse.relative_phase - - # elif sweeper.parameter is Parameter.frequency: - # initial = {} - # for pulse in sweeper.pulses: - # initial[pulse.id] = pulse.frequency - - if sweeper.parameter in for_loop_sweepers: - # perform sweep recursively - for value in sweeper.values: - if sweeper.parameter is Parameter.attenuation: - initial = {} - for qubit in sweeper.qubits: - initial[qubit.name] = qubits[qubit.name].readout.attenuation - if sweeper.type == SweeperType.ABSOLUTE: - qubit.readout.attenuation = value - elif sweeper.type == SweeperType.OFFSET: - qubit.readout.attenuation = initial[qubit.name] + value - elif sweeper.type == SweeperType.FACTOR: - qubit.readout.attenuation = initial[qubit.name] * value - - elif sweeper.parameter is Parameter.lo_frequency: - initial = {} - for pulse in sweeper.pulses: - # FIXME: - # if pulse.type == PulseType.READOUT: - if True: - initial[pulse.id] = qubits[pulse.qubit].readout.lo_frequency - if sweeper.type == SweeperType.ABSOLUTE: - qubits[pulse.qubit].readout.lo_frequency = value - elif sweeper.type == SweeperType.OFFSET: - qubits[pulse.qubit].readout.lo_frequency = ( - initial[pulse.id] + value - ) - elif sweeper.type == SweeperType.FACTOR: - qubits[pulse.qubit].readout.lo_frequency = ( - initial[pulse.id] * value - ) - # FIXME: - # elif pulse.type == PulseType.DRIVE: - elif True: - initial[pulse.id] = qubits[pulse.qubit].drive.lo_frequency - if sweeper.type == SweeperType.ABSOLUTE: - qubits[pulse.qubit].drive.lo_frequency = value - elif sweeper.type == SweeperType.OFFSET: - qubits[pulse.qubit].drive.lo_frequency = ( - initial[pulse.id] + value - ) - elif sweeper.type == SweeperType.FACTOR: - qubits[pulse.qubit].drive.lo_frequency = ( - initial[pulse.id] * value - ) - - if len(sweepers) > 1: - self._sweep_recursion( - qubits, - sequence, - options, - *sweepers[1:], - results=results, - ) - else: - result = self._execute_pulse_sequence( - qubits=qubits, sequence=sequence, options=options - ) - for pulse in sequence.acquisitions: - if results[pulse.id]: - results[pulse.id] += result[pulse.id] - else: - results[pulse.id] = result[pulse.id] - results[pulse.qubit] = results[pulse.id] - else: - # rt sweeps - # relative phase sweeps that cross 0 need to be split in two separate sweeps - split_relative_phase = False - rt_sweepers = [ - Parameter.frequency, - Parameter.gain, - Parameter.bias, - Parameter.amplitude, - Parameter.duration, - Parameter.relative_phase, - ] - - if sweeper.parameter == Parameter.relative_phase: - if sweeper.type != SweeperType.ABSOLUTE: - raise_error( - ValueError, - "relative_phase sweeps other than ABSOLUTE are not supported by qblox yet", - ) - from qibolab.instruments.qblox.q1asm import convert_phase - - c_values = np.array([convert_phase(v) for v in sweeper.values]) - if any(np.diff(c_values) < 0): - split_relative_phase = True - _from = 0 - for idx in np.append( - np.where(np.diff(c_values) < 0), len(c_values) - 1 - ): - _to = idx + 1 - _values = sweeper.values[_from:_to] - split_sweeper = Sweeper( - parameter=sweeper.parameter, - values=_values, - pulses=sweeper.pulses, - qubits=sweeper.qubits, - ) - self._sweep_recursion( - qubits, - sequence, - options, - *((split_sweeper,) + sweepers[1:]), - results=results, - ) - _from = _to - - if not split_relative_phase: - if any(s.parameter not in rt_sweepers for s in sweepers): - # TODO: reorder the sequence of the sweepers and the results - raise Exception( - "cannot execute a for-loop sweeper nested inside of a rt sweeper" - ) - nshots = ( - options.nshots - if options.averaging_mode == AveragingMode.SINGLESHOT - else 1 - ) - navgs = ( - options.nshots - if options.averaging_mode != AveragingMode.SINGLESHOT - else 1 - ) - num_bins = nshots - for sweeper in sweepers: - num_bins *= len(sweeper.values) - - # split the sweep if the number of bins is larget than the memory of the sequencer (2**17) - if num_bins < MAX_NUM_BINS: - # for sweeper in sweepers: - # if sweeper.parameter is Parameter.amplitude: - # # qblox cannot sweep amplitude in real time, but sweeping gain is quivalent - # for pulse in sweeper.pulses: - # pulse.amplitude = 1 - - # elif sweeper.parameter is Parameter.gain: - # for pulse in sweeper.pulses: - # # qblox has an external and an internal gains - # # when sweeping the internal, set the external to 1 - # # TODO check if it needs to be restored after execution - # if pulse.type == PulseType.READOUT: - # qubits[pulse.qubit].readout.gain = 1 - # elif pulse.type == PulseType.DRIVE: - # qubits[pulse.qubit].drive.gain = 1 - - result = self._execute_pulse_sequence( - qubits, sequence, options, sweepers - ) - self._add_to_results(sequence, results, result) - else: - sweepers_repetitions = 1 - for sweeper in sweepers: - sweepers_repetitions *= len(sweeper.values) - if sweepers_repetitions > MAX_NUM_BINS: - raise ValueError( - f"Requested sweep has {sweepers_repetitions} total number of sweep points. " - f"Maximum supported is {MAX_NUM_BINS}" - ) - - max_rt_nshots = MAX_NUM_BINS // sweepers_repetitions - num_full_sft_iterations = nshots // max_rt_nshots - result_chunks = [] - for sft_iteration in range(num_full_sft_iterations + 1): - _nshots = min( - max_rt_nshots, nshots - sft_iteration * max_rt_nshots - ) - - res = self._execute_pulse_sequence( - qubits, - sequence, - replace(options, nshots=_nshots), - sweepers, - ) - result_chunks.append(res) - result = self._combine_result_chunks(result_chunks) - self._add_to_results(sequence, results, result) - - @staticmethod - def _combine_result_chunks(chunks): - some_chunk = next(iter(chunks)) - some_result = next(iter(some_chunk.values())) - return { - key: some_result.__class__( - np.concatenate([chunk[key] for chunk in chunks], axis=0) - ) - for key in some_chunk.keys() - } - - @staticmethod - def _add_to_results(sequence, results, results_to_add): - for pulse in sequence.acquisitions: - if results[pulse.id]: - results[pulse.id] += results_to_add[pulse.id] - else: - results[pulse.id] = results_to_add[pulse.id] - results[pulse.qubit] = results[pulse.id] diff --git a/src/qibolab/instruments/qblox/debug.py b/src/qibolab/instruments/qblox/debug.py deleted file mode 100644 index e2d582ca8c..0000000000 --- a/src/qibolab/instruments/qblox/debug.py +++ /dev/null @@ -1,57 +0,0 @@ -import numpy as np - - -def print_readable_snapshot( - device, file, update: bool = False, max_chars: int = 80 -) -> None: - """Prints a readable version of the snapshot. The readable snapshot - includes the name, value and unit of each parameter. A convenience function - to quickly get an overview of the status of an instrument. - - Args: - update: If ``True``, update the state by querying the - instrument. If ``False``, just use the latest values in memory. - This argument gets passed to the snapshot function. - max_chars: the maximum number of characters per line. The - readable snapshot will be cropped if this value is exceeded. - Defaults to 80 to be consistent with default terminal width. - """ - floating_types = (float, np.integer, np.floating) - snapshot = device.snapshot(update=update) - - par_lengths = [len(p) for p in snapshot["parameters"]] - - # Min of 50 is to prevent a super long parameter name to break this - # function - par_field_len = min(max(par_lengths) + 1, 50) - - file.write(device.name + ":" + "\n") - file.write("{0:<{1}}".format("\tparameter ", par_field_len) + "value" + "\n") - file.write("-" * max_chars + "\n") - for par in sorted(snapshot["parameters"]): - name = snapshot["parameters"][par]["name"] - msg = "{0:<{1}}:".format(name, par_field_len) - - # in case of e.g. ArrayParameters, that usually have - # snapshot_value == False, the parameter may not have - # a value in the snapshot - val = snapshot["parameters"][par].get("value", "Not available") - - unit = snapshot["parameters"][par].get("unit", None) - if unit is None: - # this may be a multi parameter - unit = snapshot["parameters"][par].get("units", None) - if isinstance(val, floating_types): - msg += f"\t{val:.5g} " - # numpy float and int types format like builtins - else: - msg += f"\t{val} " - if unit != "": # corresponds to no unit - msg += f"({unit})" - # Truncate the message if it is longer than max length - if len(msg) > max_chars and not max_chars == -1: - msg = msg[0 : max_chars - 3] + "..." - file.write(msg + "\n") - - for submodule in device.submodules.values(): - print_readable_snapshot(submodule, file, update=update, max_chars=max_chars) diff --git a/src/qibolab/instruments/qblox/module.py b/src/qibolab/instruments/qblox/module.py deleted file mode 100644 index 7e6f25b8e3..0000000000 --- a/src/qibolab/instruments/qblox/module.py +++ /dev/null @@ -1,63 +0,0 @@ -"""Qblox Cluster QCM driver.""" - -from qibolab.instruments.abstract import Instrument -from qibolab.instruments.qblox.port import QbloxInputPort, QbloxOutputPort - - -class ClusterModule(Instrument): - """This class defines common features shared by all Qblox modules (QCM-BB, - QCM-RF, QRM-RF). - - It serves as a foundational class, unifying the behavior of the - three distinct modules. All module-specific classes are intended to - inherit from this base class. - """ - - DEFAULT_SEQUENCERS_VALUES = { - "cont_mode_en_awg_path0": False, - "cont_mode_en_awg_path1": False, - "cont_mode_waveform_idx_awg_path0": 0, - "cont_mode_waveform_idx_awg_path1": 0, - "marker_ovr_en": True, # Default after reboot = False - "marker_ovr_value": 15, # Default after reboot = 0 - "mixer_corr_gain_ratio": 1, - "mixer_corr_phase_offset_degree": 0, - "offset_awg_path0": 0, - "offset_awg_path1": 0, - "sync_en": False, # Default after reboot = False - "upsample_rate_awg_path0": 0, - "upsample_rate_awg_path1": 0, - } - - def __init__(self, name: str, address: str): - super().__init__(name, address) - self._ports: dict = {} - - def ports(self, name: str, out: bool = True): - """Adds an entry to the dictionary `self._ports` with key 'name' and - value a `QbloxOutputPort` (or `QbloxInputPort` if `out=False`) object. - To the object is assigned the provided name, and the `port_number` is - automatically determined based on the number of ports of the same type - inside `self._ports`. - - Returns this port object. - - Example:: - - qrm_module = QrmRf("qrm_rf", f"{IP_ADDRESS}:{SLOT_IDX}") - output_port = qrm_module.add_port("o1") - input_port = qrm_module.add_port("i1", out=False) - qrm_module.ports - - # { - # 'o1': QbloxOutputPort(module=qrm_module, port_number=0, port_name='o1'), - # 'i1': QbloxInputPort(module=qrm_module, port_number=0, port_name='i1') - # } - """ - - def count(cls): - return len(list(filter(lambda x: isinstance(x, cls), self._ports.values()))) - - port_cls = QbloxOutputPort if out else QbloxInputPort - self._ports[name] = port_cls(self, port_number=count(port_cls), port_name=name) - return self._ports[name] diff --git a/src/qibolab/instruments/qblox/port.py b/src/qibolab/instruments/qblox/port.py deleted file mode 100644 index 9eb19f9572..0000000000 --- a/src/qibolab/instruments/qblox/port.py +++ /dev/null @@ -1,282 +0,0 @@ -from dataclasses import dataclass - -import numpy as np -from qibo.config import log, raise_error - -FREQUENCY_LIMIT = 500e6 -MAX_OFFSET = 2.5 -MIN_PULSE_DURATION = 4 - - -@dataclass -class QbloxOutputPort_Settings: - attenuation: int = 60 - offset: float = 0.0 - hardware_mod_en: bool = True - nco_freq: int = 0 - nco_phase_offs: float = 0 - lo_enabled: bool = True - lo_frequency: int = 2_000_000_000 - - -@dataclass -class QbloxInputPort_Settings: - channel: str = None - acquisition_hold_off: int = 0 - acquisition_duration: int = 1000 - hardware_demod_en: bool = True - - -class QbloxOutputPort: - """qibolab.instruments.port.Port interface implementation for Qblox - instruments.""" - - def __init__(self, module, port_number: int, port_name: str = None): - self.name = port_name - self.module = module - self.sequencer_number: int = port_number - self.port_number: int = port_number - self._settings = QbloxOutputPort_Settings() - - @property - def attenuation(self) -> str: - """Attenuation that is applied to this port.""" - return self._settings.attenuation - - @attenuation.setter - def attenuation(self, value): - if isinstance(value, (float, np.floating)): - value = int(value) - if isinstance(value, (int, np.integer)): - if value > 60: - log.warning( - f"Qblox attenuation needs to be between 0 and 60 dB. Adjusting {value} to 60dB" - ) - value = 60 - - elif value < 0: - log.warning( - f"Qblox attenuation needs to be between 0 and 60 dB. Adjusting {value} to 0" - ) - value = 0 - - if (value % 2) != 0: - log.warning( - f"Qblox attenuation needs to be a multiple of 2 dB. Adjusting {value} to {round(value/2) * 2}" - ) - value = round(value / 2) * 2 - else: - raise_error(ValueError, f"Invalid attenuation {value}") - - self._settings.attenuation = value - if self.module.device: - self.module.device.set(f"out{self.port_number}_att", value=value) - - @property - def offset(self): - """DC offset that is applied to this port.""" - return self._settings.offset - - @offset.setter - def offset(self, value): - if isinstance(value, (int, np.integer)): - value = float(value) - if isinstance(value, (float, np.floating)): - if value > MAX_OFFSET: - log.warning( - f"Qblox offset needs to be between -2.5 and 2.5 V. Adjusting {value} to 2.5 V" - ) - value = MAX_OFFSET - - elif value < -MAX_OFFSET: - log.warning( - f"Qblox offset needs to be between -2.5 and 2.5 V. Adjusting {value} to -2.5 V" - ) - value = -MAX_OFFSET - else: - raise_error(ValueError, f"Invalid offset {value}") - - self._settings.offset = value - if self.module.device: - self.module.device.set(f"out{self.port_number}_offset", value=value) - - # Additional attributes needed by the driver - @property - def hardware_mod_en(self): - """Flag to enable hardware modulation.""" - return self._settings.hardware_mod_en - - @hardware_mod_en.setter - def hardware_mod_en(self, value): - if not isinstance(value, bool): - raise_error(ValueError, f"Invalid hardware_mod_en {value}") - - self._settings.hardware_mod_en = value - if self.module.device: - self.module.device.sequencers[self.sequencer_number].set( - "mod_en_awg", value=value - ) - - @property - def nco_freq(self): - """nco_freq that is applied to this port.""" - return self._settings.nco_freq - - @nco_freq.setter - def nco_freq(self, value): - if isinstance(value, (float, np.floating)): - value = int(value) - if isinstance(value, (int, np.integer)): - if value > FREQUENCY_LIMIT: - log.warning( - f"Qblox nco_freq needs to be between -{FREQUENCY_LIMIT} and {FREQUENCY_LIMIT} MHz. Adjusting {value} to {FREQUENCY_LIMIT} MHz" - ) - value = int(FREQUENCY_LIMIT) - - elif value < -FREQUENCY_LIMIT: - log.warning( - f"Qblox nco_freq needs to be between -{FREQUENCY_LIMIT} and {FREQUENCY_LIMIT} MHz. Adjusting {value} to -{FREQUENCY_LIMIT} MHz" - ) - value = int(-FREQUENCY_LIMIT) - else: - raise_error(ValueError, f"Invalid nco_freq {value}") - - self._settings.nco_freq = value - if self.module.device: - self.module.device.sequencers[self.sequencer_number].set( - "nco_freq", value=value - ) - - @property - def nco_phase_offs(self): - """nco_phase_offs that is applied to this port.""" - return self._settings.nco_phase_offs - - @nco_phase_offs.setter - def nco_phase_offs(self, value): - if isinstance(value, (int, np.integer)): - value = float(value) - if isinstance(value, (float, np.floating)): - value = value % 360 - else: - raise_error(ValueError, f"Invalid nco_phase_offs {value}") - - self._settings.nco_phase_offs = value - if self.module.device: - self.module.device.sequencers[self.sequencer_number].set( - "nco_phase_offs", value=value - ) - - @property - def lo_enabled(self): - """Flag to enable local oscillator.""" - return self._settings.lo_enabled - - @lo_enabled.setter - def lo_enabled(self, value): - if not isinstance(value, bool): - raise_error(ValueError, f"Invalid lo_enabled {value}") - - self._settings.lo_enabled = value - if self.module.device: - if self.module.device.is_qrm_type: - self.module.device.set( - f"out{self.port_number}_in{self.port_number}_lo_en", value=value - ) - elif self.module.device.is_qcm_type: - self.module.device.set(f"out{self.port_number}_lo_en", value=value) - - @property - def lo_frequency(self): - """Local oscillator frequency for the given port.""" - return self._settings.lo_frequency - - @lo_frequency.setter - def lo_frequency(self, value): - if isinstance(value, (float, np.floating)): - value = int(value) - if isinstance(value, (int, np.integer)): - if value > 18e9: - log.warning( - f"Qblox lo_frequency needs to be between 2e9 and 18e9 Hz. Adjusting {value} to 18e9 Hz" - ) - value = int(18e9) - - elif value < 2e9: - log.warning( - f"Qblox lo_frequency needs to be between 2e9 and 18e9 Hz. Adjusting {value} to 2e9 Hz" - ) - value = int(2e9) - else: - raise_error(ValueError, f"Invalid lo-frequency {value}") - - self._settings.lo_frequency = value - if self.module.device: - if self.module.device.is_qrm_type: - self.module.device.set( - f"out{self.port_number}_in{self.port_number}_lo_freq", value=value - ) - elif self.module.device.is_qcm_type: - self.module.device.set(f"out{self.port_number}_lo_freq", value=value) - - -class QbloxInputPort: - def __init__(self, module, port_number: int, port_name: str = None): - self.name = port_name - self.module = module - self.output_sequencer_number: int = 0 # output_sequencer_number - self.input_sequencer_number: int = 0 # input_sequencer_number - self.port_number: int = port_number - - self.acquisition_hold_off = 4 # To be discontinued - - self._settings = QbloxInputPort_Settings() - - @property - def hardware_demod_en(self): - """Flag to enable hardware demodulation.""" - return self._settings.hardware_demod_en - - @hardware_demod_en.setter - def hardware_demod_en(self, value): - if not isinstance(value, bool): - raise_error(ValueError, f"Invalid hardware_demod_en {value}") - - self._settings.hardware_demod_en = value - if self.module.device: - self.module.device.sequencers[self.input_sequencer_number].set( - "demod_en_acq", value=value - ) - - @property - def acquisition_duration(self): - """Duration of the pulse acquisition, in ns. - - It must be > 0 and multiple of 4. - """ - return self._settings.acquisition_duration - - @acquisition_duration.setter - def acquisition_duration(self, value): - if isinstance(value, (float, np.floating)): - value = int(value) - if isinstance(value, (int, np.integer)): - if value < MIN_PULSE_DURATION: - log.warning( - f"Qblox hardware_demod_en needs to be > 4ns. Adjusting {value} to {MIN_PULSE_DURATION} ns" - ) - value = MIN_PULSE_DURATION - if (value % MIN_PULSE_DURATION) != 0: - log.warning( - f"Qblox hardware_demod_en needs to be a multiple of 4 ns. Adjusting {value} to {round(value/MIN_PULSE_DURATION) * MIN_PULSE_DURATION}" - ) - value = round(value / MIN_PULSE_DURATION) * MIN_PULSE_DURATION - - else: - raise_error(ValueError, f"Invalid acquisition_duration {value}") - - self._settings.acquisition_duration = value - if self.module.device: - self.module.device.sequencers[self.output_sequencer_number].set( - "integration_length_acq", value=value - ) diff --git a/src/qibolab/instruments/qblox/q1asm.py b/src/qibolab/instruments/qblox/q1asm.py deleted file mode 100644 index 1b0327b88f..0000000000 --- a/src/qibolab/instruments/qblox/q1asm.py +++ /dev/null @@ -1,370 +0,0 @@ -"""A library to support generating qblox q1asm programs.""" - -import numpy as np - -END_OF_LINE = "\n" - - -class Program: - """A class to represent a sequencer q1asm assembly program. - - A q1asm program is made of blocks of code (:class:`qibolab.instruments.qblox.qblox_q1asm.Block`). - Real time registers (variables) are necessary to implement sweeps in real time. - This class keeps track of the registers used and has a method to provide the next available register. - """ - - MAX_REGISTERS = 64 - - def next_register(self): - """Provides the number of the next available register.""" - self._next_register_number += 1 - if self._next_register_number >= Program.MAX_REGISTERS: - raise RuntimeError("There are no more registers available.") - return self._next_register_number - - def __init__(self): - self._blocks: list = [] - self._next_register_number: int = -1 - - def add_blocks(self, *blocks): - """Adds a :class:`qibolab.instruments.qblox.qblox_q1asm.Block` of code - to the list of blocks.""" - for block in blocks: - self._blocks.append(block) - - def __repr__(self) -> str: - """Returns the program.""" - block_str: str = "" - for block in self._blocks: - block_str += repr(block) + END_OF_LINE - return block_str - - -class Block: - """A class to represent a block of q1asm assembly code. - - A block is comprised of code lines. - Attributes: - name (str): A name for the block of code. - lines (list(tupple)): A list of lines of code (code, comment, indentation level). - """ - - # TODO: replace tupples used for code lines with a Line object - - GLOBAL_INDENTATION_LEVEL = 3 - SPACES_PER_LEVEL = 4 - SPACES_BEFORE_COMMENT = 4 - - def __init__(self, name=""): - self.name = name - self.lines: list = [] - self._indentation = 0 - - def _indentation_string(self, level): - return " " * Block.SPACES_PER_LEVEL * level - - @property - def indentation(self): - return self._indentation - - @indentation.setter - def indentation(self, value): - if not isinstance(value, int): - raise TypeError( - f"indentation type should be int, got {type(value).__name__}" - ) - - diff = value - self._indentation - self._indentation = value - self.lines = [ - (line, comment, level + diff) for (line, comment, level) in self.lines - ] - - def append(self, line, comment="", level=0): - self.lines = self.lines + [(line, comment, self._indentation + level)] - - def prepend(self, line, comment="", level=0): - self.lines = [(line, comment, self._indentation + level)] + self.lines - - def append_spacer(self): - self.lines = self.lines + [("", "", self._indentation)] - - def __repr__(self) -> str: - """Returns a string with the block of code, taking care of the - indentation of instructions and comments.""" - - def comment_col(line, level): - col = Block.SPACES_PER_LEVEL * (level + Block.GLOBAL_INDENTATION_LEVEL) - col += len(line) - return col - - max_col: int = 0 - for line, comment, level in self.lines: - if comment: - max_col = max(max_col, comment_col(line, level)) - - block_str: str = "" - if self.name: - block_str += ( - self._indentation_string( - self._indentation + Block.GLOBAL_INDENTATION_LEVEL - ) - + "# " - + self.name - + END_OF_LINE - ) - - for line, comment, level in self.lines: - block_str += ( - self._indentation_string(level + Block.GLOBAL_INDENTATION_LEVEL) + line - ) - if comment: - block_str += ( - " " - * (max_col - comment_col(line, level) + Block.SPACES_BEFORE_COMMENT) - + " # " - + comment - ) - block_str += END_OF_LINE - - return block_str - - def __add__(self, other): - if isinstance(other, Block): - block = Block() - for line, comment, level in self.lines: - block.append(line, comment, level) - for line, comment, level in other.lines: - block.append(line, comment, level) - else: - raise TypeError(f"Expected Block, got {type(other).__name__}") - return block - - def __radd__(self, other): - if isinstance(other, Block): - block = Block() - for line, comment, level in other.lines: - block.append(line, comment, level) - for line, comment, level in self.lines: - block.append(line, comment, level) - else: - raise TypeError(f"Expected Block, got {type(other).__name__}") - return block - - def __iadd__(self, other): - if isinstance(other, Block): - for line, comment, level in other.lines: - self.append(line, comment, level) - else: - raise TypeError(f"Expected Block, got {type(other).__name__}") - return self - - -class Register: - """A class to represent a q1asm program register. - - Registers are used as variables in real time FPGA code. - Attributes: - name (str): a name to identify the register - """ - - def __init__(self, program: Program, name: str = ""): - self._number = program.next_register() - self._name = name - self._type = type - - def __repr__(self) -> str: - return "R" + str(self._number) - - @property - def name(self): - return self._name - - @name.setter - def name(self, value): - self._name = value - - -def wait_block( - wait_time: int, register: Register, force_multiples_of_four: bool = False -): - """Generates blocks of code to implement long delays. - - Arguments: - wait_time (int): the total time to wait. - register (:class:`qibolab.instruments.qblox.qblox_q1asm.Register`): the register used to loop - force_multiples_of_four (bool): a flag that forces the delay to be a multiple of 4(ns) - """ - n_loops: int - loop_wait: int - wait: int - block = Block() - - # constrains - # extra_wait and wait_loop_step need to be within (4,65535) (2**16 bits variable) - # extra_wait and wait_loop_step need to be multiples of 4ns * - - if wait_time < 0: - raise ValueError("wait_time must be positive.") - - elif wait_time == 0: - n_loops = 0 - loop_wait = 0 - wait = 0 - - elif wait_time > 0 and wait_time < 4: - # TODO: log("wait_time > 0 and wait_time < 4 is not supported by the instrument, wait_time changed to 4ns") - n_loops = 0 - loop_wait = 0 - wait = 4 - - elif wait_time >= 4 and wait_time < 2**16: # 65536ns - n_loops = 0 - loop_wait = 0 - wait = wait_time - elif wait_time >= 2**16 and wait_time < 2**32: # 4.29s - loop_wait = 2**16 - 4 - n_loops = wait_time // loop_wait - wait = wait_time % loop_wait - - while loop_wait >= 4 and (wait > 0 and wait < 4): - loop_wait -= 4 - n_loops = wait_time // loop_wait - wait = wait_time % loop_wait - - if loop_wait < 4 or (wait > 0 and wait < 4): - raise ValueError( - f"Unable to decompose {wait_time} into valid (n_loops * loop_wait + wait)" - ) - else: - raise ValueError("wait_time > 65535**2 is not supported yet.") - - if force_multiples_of_four: - wait = int(np.ceil(wait / 4)) * 4 - - wait_time = n_loops * loop_wait + wait - - if n_loops > 0: - block.append(f"# wait {wait_time} ns") - block.append(f"move {n_loops}, {register}") - block.append(f"wait_loop_{register}:") - block.append(f"wait {loop_wait}", level=1) - block.append(f"loop {register}, @wait_loop_{register}", level=1) - if wait > 0: - block.append(f"wait {wait}") - - return block - - -def loop_block( - start: int, stop: int, step: int, register: Register, block: Block -): # validate values - """Generates blocks of code to implement loops. - - Its behaviour is similar to range(): it includes the first value, but never the last. - - Arguments: - start (int): the initial value. - stop (int): the final value (excluded). - step (int): the step in which the register is incremented. - register (:class:`qibolab.instruments.qblox.qblox_q1asm.Register`): the register modified within the loop. - block (:class:`qibolab.instruments.qblox.qblox_q1asm.Register`): the block of code to be iterated. - """ - - if not (isinstance(start, int) and isinstance(stop, int) and isinstance(step, int)): - raise ValueError("begin, end and step must be int") - if stop != start and step == 0: - raise ValueError("step must not be 0") - if (stop > start and not step > 0) or (stop < start and not step < 0): - raise ValueError("invalid step") - if start < 0 or stop < 0: - raise ValueError("sweep possitive values only") - - header_block = Block() - # same behaviour as range() includes the first but never the last - header_block.append(f"move {start}, {register}", comment=register.name + " loop") - header_block.append("nop") - header_block.append(f"loop_{register}:") - header_block.append_spacer() - - body_block = Block() - body_block.indentation = 1 - body_block += block - - footer_block = Block() - footer_block.append_spacer() - if stop > start: - footer_block.append(f"add {register}, {step}, {register}") - footer_block.append("nop") - footer_block.append( - f"jlt {register}, {stop}, @loop_{register}", comment=register.name + " loop" - ) - elif stop < start: - footer_block.append(f"sub {register}, {abs(step)}, {register}") - footer_block.append("nop") - footer_block.append( - f"jge {register}, {stop + 1}, @loop_{register}", - comment=register.name + " loop", - ) - - return header_block + body_block + footer_block - - -def convert_phase(phase_rad: float): - """Converts phase values in radiants to the encoding used in qblox FPGAs. - - The phase is divided into 1e9 steps between 0° and 360°, expressed - as an integer between 0 and 1e9 (e.g 45°=125e6). - https://qblox-qblox-instruments.readthedocs-hosted.com/en/master/api_reference/sequencer.html - """ - phase_deg = (phase_rad * 360 / (2 * np.pi)) % 360 - return int(phase_deg * 1e9 / 360) - - -def convert_frequency(freq: float): - """Converts frequency values to the encoding used in qblox FPGAs. - - The frequency is divided into 4e9 steps between -500 and 500 MHz and - expressed as an integer between -2e9 and 2e9. (e.g. 1 MHz=4e6). - https://qblox-qblox-instruments.readthedocs-hosted.com/en/master/api_reference/sequencer.html - """ - if not (freq >= -500e6 and freq <= 500e6): - raise ValueError("frequency must be a float between -500e6 and 500e6 Hz") - return int(freq * 4) % 2**32 # two's complement of 18? TODO: confirm with qblox - - -def convert_gain(gain: float): - """Converts gain values to the encoding used in qblox FPGAs. - - Both gain values are divided in 2**sample path width steps. QCM DACs - resolution 16bits, QRM DACs and ADCs 12 bit - https://qblox-qblox-instruments.readthedocs-hosted.com/en/master/api_reference/sequencer.html - """ - if not (gain >= -1 and gain <= 1): - raise ValueError("gain must be a float between -1 and 1") - if gain == 1: - return 2**15 - 1 - else: - return int(np.floor(gain * 2**15)) % 2**32 # two's complement 32 bit number - - -def convert_offset(offset: float): - """Converts offset values to the encoding used in qblox FPGAs. - - Both offset values are divided in 2**sample path width steps. QCM - DACs resolution 16bits, QRM DACs and ADCs 12 bit QCM 5Vpp, QRM 2Vpp - https://qblox-qblox-instruments.readthedocs-hosted.com/en/master/api_reference/sequencer.html - """ - scale_factor = 1.25 * np.sqrt(2) - normalised_offset = offset / scale_factor - - if not (normalised_offset >= -1 and normalised_offset <= 1): - raise ValueError( - f"offset must be a float between {-scale_factor:.3f} and {scale_factor:.3f} V" - ) - if normalised_offset == 1: - return 2**15 - 1 - else: - return ( - int(np.floor(normalised_offset * 2**15)) % 2**32 - ) # two's complement 32 bit number? or 12 or 24? diff --git a/src/qibolab/instruments/qblox/sequencer.py b/src/qibolab/instruments/qblox/sequencer.py deleted file mode 100644 index f52945813a..0000000000 --- a/src/qibolab/instruments/qblox/sequencer.py +++ /dev/null @@ -1,238 +0,0 @@ -import copy - -import numpy as np -from qblox_instruments.qcodes_drivers.sequencer import Sequencer as QbloxSequencer - -from qibolab.instruments.qblox.q1asm import Program -from qibolab.pulses import Pulse -from qibolab.pulses.modulation import modulate -from qibolab.sequence import PulseSequence -from qibolab.sweeper import Parameter, Sweeper - -SAMPLING_RATE = 1 -"""Sampling rate for qblox instruments in GSps.""" - - -def _modulated_waveforms(pulse: Pulse, hardware: bool = True): - envelopes = pulse.envelope_waveforms(SAMPLING_RATE) - return ( - envelopes - if hardware - else modulate(np.array(envelopes), pulse.frequency, SAMPLING_RATE) - ) - - -class WaveformsBuffer: - """A class to represent a buffer that holds the unique waveforms used by a - sequencer. - - Attributes: - unique_waveforms (list): A list of unique Waveform objects. - available_memory (int): The amount of memory available expressed in numbers of samples. - """ - - SIZE: int = 16383 - - class NotEnoughMemory(Exception): - """An error raised when there is not enough memory left to add more - waveforms.""" - - class NotEnoughMemoryForBaking(Exception): - """An error raised when there is not enough memory left to bake - pulses.""" - - def __init__(self): - """Initialises the buffer with an empty list of unique waveforms.""" - self.unique_waveforms: list = [] # Waveform - self.available_memory: int = WaveformsBuffer.SIZE - - def add_waveforms( - self, pulse: Pulse, hardware_mod_en: bool, sweepers: list[Sweeper] - ): - """Adds a pair of i and q waveforms to the list of unique waveforms. - - Waveforms are added to the list if they were not there before. - Each of the waveforms (i and q) is processed individually. - - Args: - waveform_i (Waveform): A Waveform object containing the samples of the real component of the pulse wave. - waveform_q (Waveform): A Waveform object containing the samples of the imaginary component of the pulse wave. - - Raises: - NotEnoughMemory: If the memory needed to store the waveforms in more than the memory avalible. - """ - pulse_copy = copy.deepcopy(pulse) - for sweeper in sweepers: - if sweeper.pulses and sweeper.parameter == Parameter.amplitude: - if pulse in sweeper.pulses: - pulse_copy.amplitude = 1 - - baking_required = False - for sweeper in sweepers: - if sweeper.pulses and sweeper.parameter == Parameter.duration: - if pulse in sweeper.pulses: - baking_required = True - values = sweeper.get_values(pulse.duration) - - if not baking_required: - waveform_i, waveform_q = _modulated_waveforms(pulse_copy, hardware_mod_en) - - pulse.waveform_i = waveform_i - pulse.waveform_q = waveform_q - - if ( - waveform_i not in self.unique_waveforms - or waveform_q not in self.unique_waveforms - ): - memory_needed = 0 - if not waveform_i in self.unique_waveforms: - memory_needed += len(waveform_i) - if not waveform_q in self.unique_waveforms: - memory_needed += len(waveform_q) - - if self.available_memory >= memory_needed: - if not waveform_i in self.unique_waveforms: - self.unique_waveforms.append(waveform_i) - if not waveform_q in self.unique_waveforms: - self.unique_waveforms.append(waveform_q) - self.available_memory -= memory_needed - else: - raise WaveformsBuffer.NotEnoughMemory - else: - pulse.idx_range = self.bake_pulse_waveforms( - pulse_copy, values, hardware_mod_en - ) - - def bake_pulse_waveforms( - self, pulse: Pulse, values: list(), hardware_mod_en: bool - ): # bake_pulse_waveforms(self, pulse: Pulse, values: list(int), hardware_mod_en: bool): - """Generates and stores a set of i and q waveforms required for a pulse - duration sweep. - - These waveforms are generated and stored in a predefined order so that they can later be retrieved within the - sweeper q1asm code. It bakes pulses from as short as 1ns, padding them at the end with 0s if required so that - their length is a multiple of 4ns. It also supports the modulation of the pulse both in hardware (default) - or software. - With no other pulses stored in the sequencer memory, it supports values up to range(1, 126) for regular pulses and - range(1, 180) for flux pulses. - - Args: - pulse (:class:`qibolab.pulses.Pulse`): The pulse to be swept. - values (list(int)): The list of values to sweep the pulse duration with. - hardware_mod_en (bool): If set to True the pulses are assumed to be modulated in hardware and their - envelope waveforms are uploaded; if False, software modulated waveforms are uploaded. - - Returns: - idx_range (numpy.ndarray): An array with the indices of the set of pulses. For each pulse duration in - `values` the i component is saved in the next avalable index, followed by the q component. For flux - pulses, since both i and q components are equal, they are only saved once. - - Raises: - NotEnoughMemory: If the memory needed to store the waveforms in more than the memory avalible. - """ - # In order to generate waveforms for each duration value, the pulse will need to be modified. - # To avoid any conflicts, make a copy of the pulse first. - pulse_copy = copy.deepcopy(pulse) - - # there may be other waveforms stored already, set first index as the next available - first_idx = len(self.unique_waveforms) - - # FIXME: - # if pulses.type == PulseType.FLUX: - if True: - # for flux pulses, store i waveforms - idx_range = np.arange(first_idx, first_idx + len(values), 1) - - for duration in values: - pulse_copy.duration = duration - waveform = _modulated_waveforms(pulse_copy, hardware_mod_en) - - padded_duration = int(np.ceil(duration / 4)) * 4 - memory_needed = padded_duration - padding = np.zeros(padded_duration - duration) - waveform = np.append(waveform, padding) - - if self.available_memory >= memory_needed: - self.unique_waveforms.append(waveform) - self.available_memory -= memory_needed - else: - raise WaveformsBuffer.NotEnoughMemoryForBaking - else: - # for any other pulse type, store both i and q waveforms - idx_range = np.arange(first_idx, first_idx + len(values) * 2, 2) - - for duration in values: - pulse_copy.duration = duration - waveform_i, waveform_q = _modulated_waveforms( - pulse_copy, hardware_mod_en - ) - - padded_duration = int(np.ceil(duration / 4)) * 4 - memory_needed = padded_duration * 2 - padding = np.zeros(padded_duration - duration) - waveform_i = np.append(waveform_i, padding) - waveform_q = np.append(waveform_q, padding) - - if self.available_memory >= memory_needed: - self.unique_waveforms.append(waveform_i) - self.unique_waveforms.append(waveform_q) - self.available_memory -= memory_needed - else: - raise WaveformsBuffer.NotEnoughMemoryForBaking - - return idx_range - - -class Sequencer: - """A class to extend the functionality of qblox_instruments Sequencer. - - A sequencer is a hardware component synthesised in the instrument FPGA, responsible for fetching waveforms from - memory, pre-processing them, sending them to the DACs, and processing the acquisitions from the ADCs (QRM modules). - https://qblox-qblox-instruments.readthedocs-hosted.com/en/master/documentation/sequencer.html - - This class extends the sequencer functionality by holding additional data required when - processing a pulse sequence: - - - the sequencer number, - - the sequence of pulses to be played, - - a buffer of unique waveforms, and - - the four components of the sequence file: - - - waveforms dictionary - - acquisition dictionary - - weights dictionary - - program - - Attributes: - device (QbloxSequencer): A reference to the underlying `qblox_instruments.qcodes_drivers.sequencer.Sequencer` - object. It can be used to access other features not directly exposed by this wrapper. - https://qblox-qblox-instruments.readthedocs-hosted.com/en/master/documentation/sequencer.html - number (int): An integer between 0 and 5 that identifies the number of the sequencer. - pulses (PulseSequence): The sequence of pulses to be played by the sequencer. - waveforms_buffer (WaveformsBuffer): A buffer of unique waveforms to be played by the sequencer. - waveforms (dict): A dictionary containing the waveforms to be played by the sequencer in qblox format. - acquisitions (dict): A dictionary containing the list of acquisitions to be made by the sequencer in qblox - format. - weights (dict): A dictionary containing the list of weights to be used by the sequencer when demodulating - and integrating the response, in qblox format. - program (str): The pseudo assembly (q1asm) program to be executed by the sequencer. - https://qblox-qblox-instruments.readthedocs-hosted.com/en/master/documentation/sequencer.html#instructions - - qubit (str): The id of the qubit associated with the sequencer, if there is only one. - """ - - def __init__(self, number: int): - """Initialises the sequencer. - - All class attributes are defined and initialised. - """ - - self.device: QbloxSequencer = None - self.number: int = number - self.pulses: PulseSequence = PulseSequence() - self.waveforms_buffer: WaveformsBuffer = WaveformsBuffer() - self.waveforms: dict = {} - self.acquisitions: dict = {} - self.weights: dict = {} - self.program: Program = Program() - self.qubit = None # self.qubit: int | str = None diff --git a/src/qibolab/instruments/qblox/sweeper.py b/src/qibolab/instruments/qblox/sweeper.py deleted file mode 100644 index 9a37f17203..0000000000 --- a/src/qibolab/instruments/qblox/sweeper.py +++ /dev/null @@ -1,396 +0,0 @@ -from enum import Enum, auto - -import numpy as np - -from qibolab.instruments.qblox.q1asm import ( - Block, - Program, - Register, - convert_frequency, - convert_gain, - convert_offset, - convert_phase, -) -from qibolab.sweeper import Parameter, Sweeper - - -class QbloxSweeperType(Enum): - """An enumeration for the different types of sweepers supported by qblox. - - - frequency: sweeps pulse frequency by adjusting the sequencer `nco_freq` with q1asm command `set_freq`. - - gain: sweeps sequencer gain by adjusting the sequencer `gain_awg_path0` and `gain_awg_path1` with q1asm command - `set_awg_gain`. Since the gain is a parameter between -1 and 1 that multiplies the samples of the waveforms - before they are fed to the DACs, it can be used to sweep the pulse amplitude. - - offset: sweeps sequencer offset by adjusting the sequencer `offset_awg_path0` and `offset_awg_path1` with q1asm - command `set_awg_offs` - - start: sweeps pulse start. - - duration: sweeps pulse duration. - """ - - frequency = auto() - gain = auto() - offset = auto() - start = auto() - duration = auto() - - number = auto() # internal - relative_phase = auto() # not implemented yet - time = auto() # not implemented yet - - -class QbloxSweeper: - """A custom sweeper object with the data and functionality required by - qblox instruments. - - It is responsible for generating the q1asm code required to execute sweeps in a sequencer. The object can be - initialised with either: - - - a :class:`qibolab.sweepers.Sweeper` using the :func:`qibolab.instruments.qblox.QbloxSweeper.from_sweeper`, or - - a range of values and a sweeper type (:class:`qibolab.instruments.qblox.QbloxSweeperType`) - - Like most FPGAs, qblox FPGAs do not support floating point arithmetics. All parameters that can be manipulated in - real time within the FPGA are represented as two's complement integers. - - Attributes: - type (:class:`qibolab.instruments.qblox.QbloxSweeperType`): the type of sweeper - name (str): a name given for the sweep that is later used within the q1asm code to identify the loops. - register (:class:`qibolab.instruments.qblox_q1asm.Register`): the main Register (q1asm variable) used in the loop. - aux_register (:class:`qibolab.instruments.qblox_q1asm.Register`): an auxialiry Register requried in duration - sweeps. - update_parameters (Bool): a flag to instruct the sweeper to update the paramters or not depending on whether - a parameter of the sequencer needs to be swept or not. - - Methods: - block(inner_block: :class:`qibolab.instruments.qblox_q1asm.Block`): generates the block of q1asm code that implements - the sweep. - """ - - FREQUENCY_LIMIT = 500e6 - - def __init__( - self, - program: Program, - rel_values: list, - type: QbloxSweeperType = QbloxSweeperType.number, - add_to: float = 0, - multiply_to: float = 1, - name: str = "", - ): - """Creates an instance from a range of values and a sweeper type - (:class:`qibolab.instruments.qblox.QbloxSweeperType`). - - Args: - program (:class:`qibolab.instruments.qblox_q1asm.Program`): a program object representing the q1asm program - of a sequencer. - rel_values (list): a list of values to iterate over. Currently qblox only supports a list of equally spaced - values, like those created with `np.arange(start, stop, step)`. These values are considered relative - values. They will later be added to the `add_to` parameter and multiplied to the `multiply_to` - parameter. - type (:class:`qibolab.instruments.qblox.QbloxSweeperType`): the type of sweeper. - add_to (float): a value to be added to each value of the range of values defined in `sweeper.values` or - `rel_values`. - multiply_to (float): a value to be multiplied by each value of the range of values defined in - `sweeper.values` or `rel_values`. - name (str): a name given for the sweep that is later used within the q1as m code to identify the loops. - """ - - self.type: QbloxSweeperType = type - self.name: str = None - self.register: Register = None - self.aux_register: Register = None - self.update_parameters: bool = False - - # Number of iterations in the loop - self._n: int = None - - # Absolute values - self._abs_start = None - self._abs_step = None - self._abs_stop = None - self._abs_values: np.ndarray = None - - # Converted values (converted to q1asm values, two's complement) - self._con_start: int = None - self._con_step: int = None - self._con_stop: int = None - self._con_values: np.ndarray = None - - # Validate input parameters - if not len(rel_values) > 1: - raise ValueError("values must contain at least 2 elements.") - elif rel_values[1] == rel_values[0]: - raise ValueError("values must contain different elements.") - - self._n = len(rel_values) - 1 - rel_start = rel_values[0] - rel_step = rel_values[1] - rel_values[0] - - if name != "": - self.name = name - else: - self.name = self.type.name - - # create the registers (variables) to be used in the loop - self.register: Register = Register(program, self.name) - if type == QbloxSweeperType.duration: - self.aux_register: Register = Register(program, self.name + "_aux") - - # Calculate absolute values - self._abs_start = (rel_start + add_to) * multiply_to - self._abs_step = rel_step * multiply_to - self._abs_stop = self._abs_start + self._abs_step * (self._n) - self._abs_values = np.arange(self._abs_start, self._abs_stop, self._abs_step) - - # Verify that all values are within acceptable ranges - check_values = { - QbloxSweeperType.frequency: ( - lambda v: all( - (-self.FREQUENCY_LIMIT <= x and x <= self.FREQUENCY_LIMIT) - for x in v - ) - ), - QbloxSweeperType.gain: (lambda v: all((-1 <= x and x <= 1) for x in v)), - QbloxSweeperType.offset: ( - lambda v: all( - (-1.25 * np.sqrt(2) <= x and x <= 1.25 * np.sqrt(2)) for x in v - ) - ), - QbloxSweeperType.relative_phase: (lambda v: True), - QbloxSweeperType.start: (lambda v: all((4 <= x and x < 2**16) for x in v)), - QbloxSweeperType.duration: ( - lambda v: all((0 <= x and x < 2**16) for x in v) - ), - QbloxSweeperType.number: ( - lambda v: all((-(2**16) < x and x < 2**16) for x in v) - ), - } - - if not check_values[type](np.append(self._abs_values, [self._abs_stop])): - raise ValueError( - f"Sweeper {self.name} values are not within the allowed range" - ) - - # Convert absolute values to q1asm values - convert = { - QbloxSweeperType.frequency: convert_frequency, - QbloxSweeperType.gain: convert_gain, - QbloxSweeperType.offset: convert_offset, - QbloxSweeperType.relative_phase: convert_phase, - QbloxSweeperType.start: (lambda x: int(x) % 2**16), - QbloxSweeperType.duration: (lambda x: int(x) % 2**16), - QbloxSweeperType.number: (lambda x: int(x) % 2**32), - } - - self._con_start = convert[type](self._abs_start) - self._con_step = convert[type](self._abs_step) - self._con_stop = (self._con_start + self._con_step * (self._n) + 1) % 2**32 - self._con_values = np.array( - [(self._con_start + self._con_step * m) % 2**32 for m in range(self._n + 1)] - ) - - # log.info(f"Qblox sweeper converted values: {self._con_values}") - - if not ( - isinstance(self._con_start, int) - and isinstance(self._con_stop, int) - and isinstance(self._con_step, int) - ): - raise ValueError("start, stop and step must be int") - - @classmethod - def from_sweeper( - cls, - program: Program, - sweeper: Sweeper, - add_to: float = 0, - multiply_to: float = 1, - name: str = "", - ): - """Creates an instance form a :class:`qibolab.sweepers.Sweeper` object. - - Args: - program (:class:`qibolab.instruments.qblox_q1asm.Program`): a program object representing the q1asm program of a - sequencer. - sweeper (:class:`qibolab.sweepers.Sweeper`): the original qibolab sweeper. - associated with the sweep. If no name is provided it uses the sweeper type as name. - add_to (float): a value to be added to each value of the range of values defined in `sweeper.values`, - `rel_values`. - multiply_to (float): a value to be multiplied by each value of the range of values defined in `sweeper.values`, - `rel_values`. - name (str): a name given for the sweep that is later used within the q1asm code to identify the loops. - """ - type_c = { - Parameter.frequency: QbloxSweeperType.frequency, - Parameter.gain: QbloxSweeperType.gain, - Parameter.amplitude: QbloxSweeperType.gain, - Parameter.bias: QbloxSweeperType.offset, - Parameter.duration: QbloxSweeperType.duration, - Parameter.relative_phase: QbloxSweeperType.relative_phase, - } - if sweeper.parameter in type_c: - type = type_c[sweeper.parameter] - rel_values = sweeper.values - else: - raise ValueError( - f"Sweeper parameter {sweeper.parameter} is not supported by qblox driver yet." - ) - return cls( - program=program, - rel_values=rel_values, - type=type, - add_to=add_to, - multiply_to=multiply_to, - name=name, - ) - - def block(self, inner_block: Block): - """Generates the block of q1asm code that implements the sweep. - - The q1asm code for a sweeper has the following structure: - - .. code-block:: text - - # header_block - # initialise register with start value - move 0, R0 # 0 = start value, R0 = register name - nop # wait an instruction cycle (4ns) for the register to be updated with its value - loop_R0: # loop label - - # update_parameter_block - # update parameters, in this case pulse frequency - set_freq R0 # sets the frequency of the sequencer nco to the value stored in R0 - upd_param 100 # makes the change effective and wait 100ns - - # inner block - play 0,1,4 # play waveforms with index 0 and 1 (i and q) and wait 4ns - - # footer_block - # increment or decrement register with step value - add R0, 2500, R0 # R0 = R0 + 2500 - nop # wait an instruction cycle (4ns) for the register to be updated with its value - # check condition and loop - jlt R0, 10001, @loop_R0 # while R0 is less than the stop value loop to loop_R0 - # in this example it would loop 5 times - # with R0 values of 0, 2500, 5000, 7500 and 10000 - - Args: - inner_block (:class:`qibolab.instruments.qblox_q1asm.Block`): the block of q1asm code to be repeated within - the loop. - """ - # Initialisation - header_block = Block() - header_block.append( - f"move {self._con_start}, {self.register}", - comment=f"{self.register.name} loop, start: {round(self._abs_start, 6):_}", - ) - header_block.append("nop") - header_block.append(f"loop_{self.register}:") - - # Parameter update - if self.update_parameters: - update_parameter_block = Block() - update_time = 1000 - if self.type == QbloxSweeperType.frequency: - update_parameter_block.append( - f"set_freq {self.register}" - ) # TODO: move to pulse - update_parameter_block.append(f"upd_param {update_time}") - if self.type == QbloxSweeperType.gain: - update_parameter_block.append( - f"set_awg_gain {self.register}, {self.register}" - ) # TODO: move to pulse - update_parameter_block.append(f"upd_param {update_time}") - if self.type == QbloxSweeperType.offset: - update_parameter_block.append( - f"set_awg_offs {self.register}, {self.register}" - ) - update_parameter_block.append(f"upd_param {update_time}") - - if self.type == QbloxSweeperType.start: - pass - if self.type == QbloxSweeperType.duration: - update_parameter_block.append( - f"add {self.register}, 1, {self.aux_register}" - ) - if self.type == QbloxSweeperType.time: - pass - if self.type == QbloxSweeperType.number: - pass - if self.type == QbloxSweeperType.relative_phase: - pass - header_block += update_parameter_block - header_block.append_spacer() - - # Main code - body_block = Block() - body_block.indentation = 1 - body_block += inner_block - - # Loop instructions - footer_block = Block() - footer_block.append_spacer() - - footer_block.append( - f"add {self.register}, {self._con_step}, {self.register}", - comment=f"{self.register.name} loop, step: {round(self._abs_step, 6):_}", - ) - footer_block.append("nop") - - # Qblox fpgas implement negative numbers using two's complement however their conditional jump instructions - # (jlt and jge) only work with unsigned integers. Negative numbers (from 2**31 to 2**32) are greater than - # possitive numbers (0 to 2**31). There is therefore a discontinuity between negative and possitive numbers. - # Depending on whether the sweep increases or decreases the register, and on whether it crosses the - # discontinuity or not, there are 4 scenarios: - - if self._abs_step > 0: # increasing - if (self._abs_start < 0 and self._abs_stop < 0) or ( - self._abs_stop > 0 and self._abs_start >= 0 - ): # no crossing 0 - footer_block.append( - f"jlt {self.register}, {self._con_stop}, @loop_{self.register}", - comment=f"{self.register.name} loop, stop: {round(self._abs_stop, 6):_}", - ) - elif self._abs_start < 0 and self._abs_stop >= 0: # crossing 0 - # wait until the register crosses 0 to possitive values - footer_block.append( - f"jge {self.register}, {2**31}, @loop_{self.register}", - ) - # loop if the register is less than the stop value - footer_block.append( - f"jlt {self.register}, {self._con_stop}, @loop_{self.register}", - comment=f"{self.register.name} loop, stop: {round(self._abs_stop, 6):_}", - ) - else: - raise ValueError( - f"incorrect values for abs_start: {self._abs_start}, abs_stop: {self._abs_stop}, abs_step: {self._abs_step}" - ) - elif self._abs_step < 0: # decreasing - if (self._abs_start < 0 and self._abs_stop < 0) or ( - self._abs_stop >= 0 and self._abs_start > 0 - ): # no crossing 0 - footer_block.append( - f"jge {self.register}, {self._con_stop + 1}, @loop_{self.register}", - comment=f"{self.register.name} loop, stop: {round(self._abs_stop, 6):_}", - ) - elif self._abs_start >= 0 and self._abs_stop < 0: # crossing 0 - if self._con_stop + 1 != 2**32: - # wait until the register crosses 0 to negative values - footer_block.append( - f"jlt {self.register}, {2**31}, @loop_{self.register}", - ) - # loop if the register is greater than the stop value - footer_block.append( - f"jge {self.register}, {self._con_stop + 1}, @loop_{self.register}", - comment=f"{self.register.name} loop, stop: {round(self._abs_stop, 6):_}", - ) - else: # special case when stopping at -1 - footer_block.append( - f"jlt {self.register}, {2**31}, @loop_{self.register}", - comment=f"{self.register.name} loop, stop: {round(self._abs_stop, 6):_}", - ) - else: - raise ValueError( - f"incorrect values for abs_start: {self._abs_start}, abs_stop: {self._abs_stop}, abs_step: {self._abs_step}" - ) - - return header_block + body_block + footer_block diff --git a/src/qibolab/instruments/rfsoc/__init__.py b/src/qibolab/instruments/rfsoc/__init__.py deleted file mode 100644 index 4b2ba2f1b3..0000000000 --- a/src/qibolab/instruments/rfsoc/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -"""RFSoC module driver for qibosoq.""" - -from .driver import RFSoC diff --git a/src/qibolab/instruments/rfsoc/convert.py b/src/qibolab/instruments/rfsoc/convert.py deleted file mode 100644 index 9d23c37308..0000000000 --- a/src/qibolab/instruments/rfsoc/convert.py +++ /dev/null @@ -1,196 +0,0 @@ -"""Convert helper functions for rfsoc driver.""" - -from copy import deepcopy -from dataclasses import asdict -from functools import singledispatch - -import numpy as np -import qibosoq.components.base as rfsoc -import qibosoq.components.pulses as rfsoc_pulses - -from qibolab.pulses import Envelope, Pulse -from qibolab.qubits import Qubit -from qibolab.sequence import PulseSequence -from qibolab.sweeper import BIAS, DURATION, Parameter, Sweeper - -HZ_TO_MHZ = 1e-6 -NS_TO_US = 1e-3 - - -def replace_pulse_shape( - rfsoc_pulse: rfsoc_pulses.Pulse, shape: Envelope, sampling_rate: float -) -> rfsoc_pulses.Pulse: - """Set pulse shape parameters in rfsoc_pulses pulse object.""" - if shape.name not in {"Gaussian", "Drag", "Rectangular", "Exponential"}: - new_pulse = rfsoc_pulses.Arbitrary( - **asdict(rfsoc_pulse), - i_values=shape.envelope_waveform_i(sampling_rate), - q_values=shape.envelope_waveform_q(sampling_rate), - ) - return new_pulse - new_pulse_cls = getattr(rfsoc_pulses, shape.name) - if shape.name == "Rectangular": - return new_pulse_cls(**asdict(rfsoc_pulse)) - if shape.name == "Gaussian": - return new_pulse_cls(**asdict(rfsoc_pulse), rel_sigma=shape.rel_sigma) - if shape.name == "Drag": - return new_pulse_cls( - **asdict(rfsoc_pulse), rel_sigma=shape.rel_sigma, beta=shape.beta - ) - if shape.name == "Exponential": - return new_pulse_cls( - **asdict(rfsoc_pulse), tau=shape.tau, upsilon=shape.upsilon, weight=shape.g - ) - - -def pulse_lo_frequency(pulse: Pulse, qubits: dict[int, Qubit]) -> int: - """Return local_oscillator frequency (HZ) of a pulse.""" - pulse_type = pulse.type.name.lower() - try: - lo_frequency = getattr( - qubits[pulse.qubit], pulse_type - ).local_oscillator.frequency - except AttributeError: - lo_frequency = 0 - return lo_frequency - - -def convert_units_sweeper( - sweeper: rfsoc.Sweeper, sequence: PulseSequence, qubits: dict[int, Qubit] -) -> rfsoc.Sweeper: - """Convert units for `qibosoq.abstract.Sweeper` considering also LOs.""" - sweeper = deepcopy(sweeper) - for idx, jdx in enumerate(sweeper.indexes): - parameter = sweeper.parameters[idx] - if parameter is rfsoc.Parameter.FREQUENCY: - pulse = sequence[jdx] - lo_frequency = pulse_lo_frequency(pulse, qubits) - sweeper.starts[idx] = (sweeper.starts[idx] - lo_frequency) * HZ_TO_MHZ - sweeper.stops[idx] = (sweeper.stops[idx] - lo_frequency) * HZ_TO_MHZ - elif parameter is rfsoc.Parameter.DELAY: - sweeper.starts[idx] *= NS_TO_US - sweeper.stops[idx] *= NS_TO_US - elif parameter is rfsoc.Parameter.RELATIVE_PHASE: - sweeper.starts[idx] = np.degrees(sweeper.starts[idx]) - sweeper.stops[idx] = np.degrees(sweeper.stops[idx]) - return sweeper - - -@singledispatch -def convert(*args): - """Convert from qibolab obj to qibosoq obj, overloaded.""" - raise ValueError(f"Convert function received bad parameters ({type(args[0])}).") - - -@convert.register -def _(qubit: Qubit) -> rfsoc.Qubit: - """Convert `qibolab.platforms.abstract.Qubit` to - `qibosoq.abstract.Qubit`.""" - if qubit.flux: - return rfsoc.Qubit(qubit.flux.offset, qubit.flux.port.name) - return rfsoc.Qubit(0.0, None) - - -@convert.register -def _( - sequence: PulseSequence, qubits: dict[int, Qubit], sampling_rate: float -) -> list[rfsoc_pulses.Pulse]: - """Convert PulseSequence to list of rfosc pulses with relative time.""" - last_pulse_start = 0 - list_sequence = [] - for pulse in sorted(sequence, key=lambda item: item.start): - start_delay = (pulse.start - last_pulse_start) * NS_TO_US - pulse_dict = asdict(convert(pulse, qubits, start_delay, sampling_rate)) - list_sequence.append(pulse_dict) - - last_pulse_start = pulse.start - return list_sequence - - -@convert.register -def _( - pulse: Pulse, qubits: dict[int, Qubit], start_delay: float, sampling_rate: float -) -> rfsoc_pulses.Pulse: - """Convert `qibolab.pulses.pulse` to `qibosoq.abstract.Pulse`.""" - pulse_type = pulse.type.name.lower() - dac = getattr(qubits[pulse.qubit], pulse_type).port.name - adc = qubits[pulse.qubit].feedback.port.name if pulse_type == "readout" else None - lo_frequency = pulse_lo_frequency(pulse, qubits) - - rfsoc_pulse = rfsoc_pulses.Pulse( - frequency=(pulse.frequency - lo_frequency) * HZ_TO_MHZ, - amplitude=pulse.amplitude, - relative_phase=np.degrees(pulse.relative_phase), - start_delay=start_delay, - duration=pulse.duration * NS_TO_US, - dac=dac, - adc=adc, - name=pulse.id, - type=pulse_type, - ) - return replace_pulse_shape(rfsoc_pulse, pulse.shape, sampling_rate) - - -@convert.register -def _(par: Parameter) -> rfsoc.Parameter: - """Convert a qibolab sweeper.Parameter into a qibosoq.Parameter.""" - return getattr(rfsoc.Parameter, par.name.upper()) - - -@convert.register -def _( - sweeper: Sweeper, sequence: PulseSequence, qubits: dict[int, Qubit] -) -> rfsoc.Sweeper: - """Convert `qibolab.sweeper.Sweeper` to `qibosoq.abstract.Sweeper`. - - Note that any unit conversion is not done in this function (to avoid - to do it multiple times). Conversion will be done in - `convert_units_sweeper`. - """ - parameters = [] - starts = [] - stops = [] - indexes = [] - - if sweeper.parameter is BIAS: - for qubit in sweeper.qubits: - parameters.append(rfsoc.Parameter.BIAS) - indexes.append(list(qubits.values()).index(qubit)) - base_value = qubit.flux.offset - values = sweeper.get_values(base_value) - starts.append(values[0]) - stops.append(values[-1]) - - if max(np.abs(starts)) > 1 or max(np.abs(stops)) > 1: - raise ValueError("Sweeper amplitude is set to reach values higher than 1") - else: - for pulse in sweeper.pulses: - idx_sweep = sequence.index(pulse) - indexes.append(idx_sweep) - base_value = getattr(pulse, sweeper.parameter.name) - values = sweeper.get_values(base_value) - starts.append(values[0]) - stops.append(values[-1]) - - if sweeper.parameter is DURATION: - parameters.append(rfsoc.Parameter.DURATION) - delta_start = values[0] - base_value - delta_stop = values[-1] - base_value - - if len(sequence) > idx_sweep + 1: - # if duration-swept pulse is not last - indexes.append(idx_sweep + 1) - t_start = sequence[idx_sweep + 1].start - sequence[idx_sweep].start - parameters.append(rfsoc.Parameter.DELAY) - starts.append(t_start + delta_start) - stops.append(t_start + delta_stop) - else: - parameters.append(convert(sweeper.parameter)) - - return rfsoc.Sweeper( - parameters=parameters, - indexes=indexes, - starts=starts, - stops=stops, - expts=len(sweeper.values), - ) diff --git a/src/qibolab/instruments/rfsoc/driver.py b/src/qibolab/instruments/rfsoc/driver.py deleted file mode 100644 index d134f3e4e7..0000000000 --- a/src/qibolab/instruments/rfsoc/driver.py +++ /dev/null @@ -1,601 +0,0 @@ -"""RFSoC FPGA driver.""" - -import re -from dataclasses import asdict, dataclass - -import numpy as np -import numpy.typing as npt -import qibosoq.components.base as rfsoc -from qibo.config import log -from qibosoq import client - -from qibolab import AcquisitionType, AveragingMode, ExecutionParameters -from qibolab.instruments.abstract import Controller -from qibolab.qubits import Qubit -from qibolab.sequence import PulseSequence -from qibolab.sweeper import BIAS, Sweeper - -from .convert import convert, convert_units_sweeper - -HZ_TO_MHZ = 1e-6 -NS_TO_US = 1e-3 - - -@dataclass -class RFSoCPort: - """Port object of the RFSoC.""" - - name: int - """DAC number.""" - offset: float = 0.0 - """Amplitude factor for biasing.""" - - -class RFSoC(Controller): - """Instrument object for controlling RFSoC FPGAs. - - The two way of executing pulses are with ``play`` (for arbitrary - qibolab ``PulseSequence``) or with ``sweep`` that execute a - ``PulseSequence`` object with one or more ``Sweeper``. - - Attributes: - cfg (rfsoc.Config): Configuration dictionary required for pulse execution. - """ - - PortType = RFSoCPort - - def __init__(self, name: str, address: str, port: int, sampling_rate: float = 1.0): - """Set server information and base configuration. - - Args: - name (str): Name of the instrument instance. - address (str): IP and port of the server (ex. 192.168.0.10) - port (int): Port of the server (ex.6000) - """ - super().__init__(name, address=address) - self.host = address - self.port = port - self.cfg = rfsoc.Config() - self._sampling_rate = sampling_rate - - @property - def sampling_rate(self): - return self._sampling_rate - - def connect(self): - """Empty method to comply with Instrument interface.""" - - def disconnect(self): - """Empty method to comply with Instrument interface.""" - - @staticmethod - def _try_to_execute(server_commands, host, port): - try: - return client.connect(server_commands, host, port) - except RuntimeError as e: - if "exception in readout loop" in str(e): - log.warning( - "%s %s", - "Exception in readout loop. Attempting again", - "You may want to increase the relaxation time.", - ) - return client.connect(server_commands, host, port) - buffer_overflow = r"buffer length must be \d+ samples or less" - if re.search(buffer_overflow, str(e)) is not None: - log.warning("Buffer full! Use shorter pulses.") - raise e - - @staticmethod - def convert_and_discriminate_samples(discriminated_shots, execution_parameters): - if execution_parameters.averaging_mode is AveragingMode.CYCLIC: - _, counts = np.unique(discriminated_shots, return_counts=True, axis=0) - freqs = counts / discriminated_shots.shape[0] - result = execution_parameters.results_type(freqs, discriminated_shots) - else: - result = execution_parameters.results_type(discriminated_shots) - return result - - @staticmethod - def validate_input_command( - sequence: PulseSequence, execution_parameters: ExecutionParameters, sweep: bool - ): - """Check if sequence and execution_parameters are supported.""" - if execution_parameters.acquisition_type is AcquisitionType.RAW: - if sweep: - raise NotImplementedError( - "Raw data acquisition is not compatible with sweepers" - ) - if len(sequence.acquisitions) != 1: - raise NotImplementedError( - "Raw data acquisition is compatible only with a single readout" - ) - if execution_parameters.averaging_mode is not AveragingMode.CYCLIC: - raise NotImplementedError("Raw data acquisition can only be averaged") - if execution_parameters.fast_reset: - raise NotImplementedError("Fast reset is not supported") - - @staticmethod - def merge_sweep_results( - dict_a: dict[str, npt.NDArray], - dict_b: dict[str, npt.NDArray], - ) -> dict[str, npt.NDArray]: - """Merge two dictionary mapping pulse serial to Results object. - - If dict_b has a key (serial) that dict_a does not have, simply add it, - otherwise sum the two results - - Args: - dict_a (dict): dict mapping ro pulses serial to qibolab res objects - dict_b (dict): dict mapping ro pulses serial to qibolab res objects - Returns: - A dict mapping the readout pulses serial to qibolab results objects - """ - for serial in dict_b: - if serial in dict_a: - dict_a[serial] = np.append(dict_a[serial], dict_b[serial]) - else: - dict_a[serial] = dict_b[serial] - return dict_a - - @staticmethod - def reshape_sweep_results( - results, sweepers, execution_parameters: ExecutionParameters - ): - # TODO: pay attention: the following will not work in raw waveform acquisition - # modes, in which case the number of samples taken should be passed as an - # explicit parameter - shape = execution_parameters.results_shape(sweepers) - return {key: value.reshape(shape) for key, value in results.items()} - - def _execute_pulse_sequence( - self, - sequence: PulseSequence, - qubits: dict[int, Qubit], - opcode: rfsoc.OperationCode, - ) -> tuple[list, list]: - """Prepare the commands dictionary to send to the qibosoq server. - - Args: - sequence (`qibolab.pulses.PulseSequence`): arbitrary PulseSequence object to execute - qubits: list of qubits (`qibolab.platforms.abstract.Qubit`) of the platform in the form of a dictionary - opcode: can be `rfsoc.OperationCode.EXECUTE_PULSE_SEQUENCE` or `rfsoc.OperationCode.EXECUTE_PULSE_SEQUENCE_RAW` - Returns: - Lists of I and Q value measured - """ - server_commands = { - "operation_code": opcode, - "cfg": asdict(self.cfg), - "sequence": convert(sequence, qubits, self.sampling_rate), - "qubits": [asdict(convert(qubits[idx])) for idx in qubits], - } - return self._try_to_execute(server_commands, self.host, self.port) - - def _execute_sweeps( - self, - sequence: PulseSequence, - qubits: dict[int, Qubit], - sweepers: list[rfsoc.Sweeper], - ) -> tuple[list, list]: - """Prepare the commands dictionary to send to the qibosoq server. - - Args: - sequence (`qibolab.pulses.PulseSequence`): arbitrary PulseSequence object to execute - qubits: list of qubits (`qibolab.platforms.abstract.Qubit`) of the platform in the form of a dictionary - sweepers: list of `qibosoq.abstract.Sweeper` objects - Returns: - Lists of I and Q value measured - """ - converted_sweepers = [ - convert_units_sweeper(sweeper, sequence, qubits) for sweeper in sweepers - ] - server_commands = { - "operation_code": rfsoc.OperationCode.EXECUTE_SWEEPS, - "cfg": asdict(self.cfg), - "sequence": convert(sequence, qubits, self.sampling_rate), - "qubits": [asdict(convert(qubits[idx])) for idx in qubits], - "sweepers": [sweeper.serialized for sweeper in converted_sweepers], - } - return self._try_to_execute(server_commands, self.host, self.port) - - def play( - self, - qubits: dict[int, Qubit], - couplers: dict[int, Qubit], - sequence: PulseSequence, - execution_parameters: ExecutionParameters, - ) -> dict[str, npt.NDArray]: - """Execute the sequence of instructions and retrieves readout results. - - Each readout pulse generates a separate acquisition. - The relaxation_time and the number of shots have default values. - - Args: - qubits (dict): List of `qibolab.platforms.utils.Qubit` objects - passed from the platform. - execution_parameters (`qibolab.ExecutionParameters`): Parameters (nshots, - relaxation_time, - fast_reset, - acquisition_type, - averaging_mode) - sequence (`qibolab.pulses.PulseSequence`): Pulse sequence to play. - Returns: - A dictionary mapping the readout pulses serial and respective qubits to - qibolab results objects - """ - if couplers != {}: - raise NotImplementedError( - "The RFSoC driver currently does not support couplers." - ) - - self.validate_input_command(sequence, execution_parameters, sweep=False) - self.update_cfg(execution_parameters) - - if execution_parameters.acquisition_type is AcquisitionType.DISCRIMINATION: - self.cfg.average = False - else: - self.cfg.average = ( - execution_parameters.averaging_mode is AveragingMode.CYCLIC - ) - - if execution_parameters.acquisition_type is AcquisitionType.RAW: - opcode = rfsoc.OperationCode.EXECUTE_PULSE_SEQUENCE_RAW - else: - opcode = rfsoc.OperationCode.EXECUTE_PULSE_SEQUENCE - toti, totq = self._execute_pulse_sequence(sequence, qubits, opcode) - - results = {} - probed_qubits = np.unique([p.qubit for p in sequence.acquisitions]) - - for j, qubit in enumerate(probed_qubits): - for i, ro_pulse in enumerate(sequence.acquisitions.get_qubit_pulses(qubit)): - i_pulse = np.array(toti[j][i]) - q_pulse = np.array(totq[j][i]) - - if ( - execution_parameters.acquisition_type - is AcquisitionType.DISCRIMINATION - ): - discriminated_shots = self.classify_shots( - i_pulse, q_pulse, qubits[ro_pulse.qubit] - ) - result = self.convert_and_discriminate_samples( - discriminated_shots, execution_parameters - ) - else: - result = execution_parameters.results_type(i_pulse + 1j * q_pulse) - results[ro_pulse.qubit] = results[ro_pulse.id] = result - - return results - - def update_cfg(self, execution_parameters: ExecutionParameters): - """Update rfsoc.Config object with new parameters.""" - if execution_parameters.nshots is not None: - self.cfg.reps = execution_parameters.nshots - if execution_parameters.relaxation_time is not None: - self.cfg.relaxation_time = execution_parameters.relaxation_time * NS_TO_US - - def classify_shots( - self, - i_values: npt.NDArray[np.float64], - q_values: npt.NDArray[np.float64], - qubit: Qubit, - ) -> npt.NDArray[np.float64]: - """Classify IQ values using qubit threshold and rotation_angle if - available in runcard.""" - if qubit.iq_angle is None or qubit.threshold is None: - raise ValueError("Classification parameters were not provided") - angle = qubit.iq_angle - threshold = qubit.threshold - - rotated = np.cos(angle) * np.array(i_values) - np.sin(angle) * np.array( - q_values - ) - shots = np.heaviside(np.array(rotated) - threshold, 0) - if isinstance(shots, float): - return np.array([shots]) - return shots - - def play_sequence_in_sweep_recursion( - self, - qubits: dict[int, Qubit], - couplers: dict[int, Qubit], - sequence: PulseSequence, - or_sequence: PulseSequence, - execution_parameters: ExecutionParameters, - ) -> dict[str, npt.NDArray]: - """Last recursion layer, if no sweeps are present. - - After playing the sequence, the resulting dictionary keys need - to be converted to the correct values. Even indexes correspond - to qubit number and are not changed. Odd indexes correspond to - readout pulses serials and are convert to match the original - sequence (of the sweep) and not the one just executed. - """ - res = self.play(qubits, couplers, sequence, execution_parameters) - newres = {} - serials = [acq.id for (_, acq) in or_sequence.acquisitions] - for idx, key in enumerate(res): - if idx % 2 == 1: - newres[serials[idx // 2]] = res[key] - else: - newres[key] = res[key] - - return newres - - def recursive_python_sweep( - self, - qubits: dict[int, Qubit], - couplers: dict[int, Qubit], - sequence: PulseSequence, - or_sequence: PulseSequence, - *sweepers: rfsoc.Sweeper, - execution_parameters: ExecutionParameters, - ) -> dict[str, npt.NDArray]: - """Execute a sweep of an arbitrary number of Sweepers via recursion. - - Args: - qubits (list): List of `qibolab.platforms.utils.Qubit` objects - passed from the platform. - sequence (`qibolab.pulses.PulseSequence`): Pulse sequence to play. - This object is a deep copy of the original - sequence and gets modified. - or_sequence (`qibolab.pulses.PulseSequence`): Reference to original - sequence to not modify. - *sweepers (`qibolab.Sweeper`): Sweeper objects. - execution_parameters (`qibolab.ExecutionParameters`): Parameters (nshots, - relaxation_time, - fast_reset, - acquisition_type, - averaging_mode) - Returns: - A dictionary mapping the readout pulses serial and respective qubits to - results objects - """ - # If there are no sweepers run ExecutePulseSequence acquisition. - # Last layer for recursion. - - if len(sweepers) == 0: - return self.play_sequence_in_sweep_recursion( - qubits, couplers, sequence, or_sequence, execution_parameters - ) - - if not self.get_if_python_sweep(sequence, *sweepers): - toti, totq = self._execute_sweeps(sequence, qubits, sweepers) - res = self.convert_sweep_results( - or_sequence, qubits, toti, totq, execution_parameters - ) - return res - - sweeper = sweepers[0] - values = [] - for idx, _ in enumerate(sweeper.indexes): - val = np.linspace(sweeper.starts[idx], sweeper.stops[idx], sweeper.expts) - if sweeper.parameters[idx] in rfsoc.Parameter.variants( - {"duration", "delay"} - ): - val = val.astype(int) - values.append(val) - - results: dict[str, npt.NDArray] = {} - for idx in range(sweeper.expts): - # update values - for jdx, kdx in enumerate(sweeper.indexes): - sweeper_parameter = sweeper.parameters[jdx] - if sweeper_parameter is rfsoc.Parameter.BIAS: - qubits[list(qubits)[kdx]].flux.offset = values[jdx][idx] - elif sweeper_parameter in rfsoc.Parameter.variants( - { - "amplitude", - "frequency", - "relative_phase", - "duration", - } - ): - setattr( - sequence[kdx], sweeper_parameter.name.lower(), values[jdx][idx] - ) - if sweeper_parameter is rfsoc.Parameter.DURATION: - for pulse_idx in range( - kdx + 1, - len(sequence.get_qubit_pulses(sequence[kdx].qubit)), - ): - # TODO: this is a patch and works just for simple experiments - sequence[pulse_idx].start = sequence[pulse_idx - 1].finish - elif sweeper_parameter is rfsoc.Parameter.DELAY: - sequence[kdx].start_delay = values[jdx][idx] - - res = self.recursive_python_sweep( - qubits, - couplers, - sequence, - or_sequence, - *sweepers[1:], - execution_parameters=execution_parameters, - ) - results = self.merge_sweep_results(results, res) - return results - - def get_if_python_sweep( - self, sequence: PulseSequence, *sweepers: rfsoc.Sweeper - ) -> bool: - """Check if a sweeper must be run with python loop or on hardware. - - To be run on qick internal loop a sweep must: - * not be on the readout frequency - * not be a duration sweeper - * only one pulse per channel supported - * flux pulses are not compatible with sweepers - - Args: - sequence (`qibolab.pulses.PulseSequence`). Pulse sequence to play. - *sweepers (`qibosoq.abstract.Sweeper`): Sweeper objects. - Returns: - A boolean value true if the sweeper must be executed by python - loop, false otherwise - """ - # FIXME: since pulse types have been deprecated, now channel types should be - # used instead. In the following, the code is relying on a non-standard channels - # naming convention, and thus fragile (or just broken) - # instead, the channel object should be retrieved from the platform - # configuration, and its type should be inspected - if any("flux" in ch for ch in sequence): - return True - for sweeper in sweepers: - if all( - parameter is rfsoc.Parameter.BIAS for parameter in sweeper.parameters - ): - continue - if all( - parameter is rfsoc.Parameter.DELAY for parameter in sweeper.parameters - ): - continue - if any( - parameter is rfsoc.Parameter.DURATION - for parameter in sweeper.parameters - ): - return True - - for sweep_idx, parameter in enumerate(sweeper.parameters): - is_freq = parameter is rfsoc.Parameter.FREQUENCY - # FIXME: the sequence can not even be indexed like this any longer - # is_ro = sequence[sweeper.indexes[sweep_idx]].type == PulseType.READOUT - is_ro = False - # if it's a sweep on the readout freq do a python sweep - if is_freq and is_ro: - return True - - for idx in sweeper.indexes: - sweep_pulse = sequence[idx] - channel = sweep_pulse.channel - ch_pulses = sequence.get_channel_pulses(channel) - if len(ch_pulses) > 1: - return True - # if all passed, do a firmware sweep - return False - - def convert_sweep_results( - self, - original_ro: PulseSequence, - qubits: dict[int, Qubit], - toti: list[list[list[float]]], - totq: list[list[list[float]]], - execution_parameters: ExecutionParameters, - ) -> dict[str, npt.NDArray]: - """Convert sweep res to qibolab dict res. - - Args: - original_ro (`qibolab.pulses.PulseSequence`): Original PulseSequence - qubits (list): List of `qibolab.platforms.utils.Qubit` objects - passed from the platform. - toti (list): i values - totq (list): q values - results_type: qibolab results object - execution_parameters (`qibolab.ExecutionParameters`): Parameters (nshots, - relaxation_time, - fast_reset, - acquisition_type, - averaging_mode) - Returns: - A dict mapping the readout pulses serial to qibolab results objects - """ - results = {} - - adcs = np.unique([qubits[p.qubit].feedback.port.name for p in original_ro]) - for k, k_val in enumerate(adcs): - adc_ro = [ - pulse - for pulse in original_ro - if qubits[pulse.qubit].feedback.port.name == k_val - ] - for i, ro_pulse in enumerate(adc_ro): - i_vals = np.array(toti[k][i]) - q_vals = np.array(totq[k][i]) - - if not self.cfg.average: - i_vals = np.reshape(i_vals, (self.cfg.reps, *i_vals.shape[:-1])) - q_vals = np.reshape(q_vals, (self.cfg.reps, *q_vals.shape[:-1])) - - if ( - execution_parameters.acquisition_type - is AcquisitionType.DISCRIMINATION - ): - qubit = qubits[ro_pulse.qubit] - discriminated_shots = self.classify_shots(i_vals, q_vals, qubit) - result = self.convert_and_discriminate_samples( - discriminated_shots, execution_parameters - ) - - else: - result = execution_parameters.results_type(i_vals + 1j * q_vals) - - results[ro_pulse.qubit] = results[ro_pulse.id] = result - return results - - def sweep( - self, - qubits: dict[int, Qubit], - couplers: dict[int, Qubit], - sequence: PulseSequence, - execution_parameters: ExecutionParameters, - *sweepers: Sweeper, - ) -> dict[str, npt.NDArray]: - """Execute the sweep and retrieves the readout results. - - Each readout pulse generates a separate acquisition. - The relaxation_time and the number of shots have default values. - - Args: - qubits (list): List of `qibolab.platforms.utils.Qubit` objects - passed from the platform. - execution_parameters (`qibolab.ExecutionParameters`): Parameters (nshots, - relaxation_time, - fast_reset, - acquisition_type, - averaging_mode) - sequence (`qibolab.pulses.PulseSequence`). Pulse sequence to play. - *sweepers (`qibolab.Sweeper`): Sweeper objects. - Returns: - A dictionary mapping the readout pulses serial and respective qubits to - results objects - """ - if couplers != {}: - raise NotImplementedError( - "The RFSoC driver currently does not support couplers." - ) - - self.validate_input_command(sequence, execution_parameters, sweep=True) - self.update_cfg(execution_parameters) - - if execution_parameters.acquisition_type is AcquisitionType.DISCRIMINATION: - self.cfg.average = False - else: - self.cfg.average = ( - execution_parameters.averaging_mode is AveragingMode.CYCLIC - ) - - rfsoc_sweepers = [convert(sweep, sequence, qubits) for sweep in sweepers] - - sweepsequence = sequence.copy() - - bias_change = any(sweep.parameter is BIAS for sweep in sweepers) - if bias_change: - initial_biases = [ - qubits[idx].flux.offset if qubits[idx].flux is not None else None - for idx in qubits - ] - - results = self.recursive_python_sweep( - qubits, - couplers, - sweepsequence, - sequence.acquisitions, - *rfsoc_sweepers, - execution_parameters=execution_parameters, - ) - - if bias_change: - for idx, qubit in enumerate(qubits.values()): - if qubit.flux is not None: - qubit.flux.offset = initial_biases[idx] - - return self.reshape_sweep_results(results, sweepers, execution_parameters) diff --git a/tests/dummy_qrc/qblox/parameters.json b/tests/dummy_qrc/qblox/parameters.json deleted file mode 100644 index 8a4997512a..0000000000 --- a/tests/dummy_qrc/qblox/parameters.json +++ /dev/null @@ -1,272 +0,0 @@ -{ - "nqubits": 5, - "settings": { - "nshots": 1024, - "relaxation_time": 20000 - }, - "qubits": [0, 1, 2, 3, 4], - "topology": [ - [0, 2], - [1, 2], - [2, 3], - [2, 4] - ], - "instruments": { - "qblox_controller": { - "bounds": { - "instructions": 1000000, - "readout": 250, - "waveforms": 40000 - } - }, - "twpa_pump": { - "frequency": 6535900000, - "power": 4 - }, - "qcm_rf0": { - "o1": { - "attenuation": 20, - "lo_frequency": 5252833073, - "gain": 0.47 - }, - "o2": { - "attenuation": 20, - "lo_frequency": 5652833073, - "gain": 0.57 - } - }, - "qcm_rf1": { - "o1": { - "attenuation": 20, - "lo_frequency": 5995371914, - "gain": 0.55 - }, - "o2": { - "attenuation": 20, - "lo_frequency": 6961018001, - "gain": 0.596 - } - }, - "qcm_rf2": { - "o1": { - "attenuation": 20, - "lo_frequency": 6786543060, - "gain": 0.47 - } - }, - "qrm_rf_a": { - "o1": { - "attenuation": 36, - "lo_frequency": 7300000000, - "gain": 0.6 - }, - "i1": { - "acquisition_hold_off": 500, - "acquisition_duration": 900 - } - }, - "qrm_rf_b": { - "o1": { - "attenuation": 36, - "lo_frequency": 7850000000, - "gain": 0.6 - }, - "i1": { - "acquisition_hold_off": 500, - "acquisition_duration": 900 - } - } - }, - "native_gates": { - "single_qubit": { - "0": { - "RX": { - "duration": 40, - "amplitude": 0.5028, - "frequency": 5050304836, - "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, - "type": "qd" - }, - "RX12": { - "duration": 40, - "amplitude": 0.5028, - "frequency": 5050304836, - "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, - "type": "qd" - }, - "MZ": { - "duration": 2000, - "amplitude": 0.1, - "frequency": 7213299307, - "envelope": { "kind": "rectangular" }, - "type": "ro" - } - }, - "1": { - "RX": { - "duration": 40, - "amplitude": 0.5078, - "frequency": 4852833073, - "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, - "type": "qd" - }, - "RX12": { - "duration": 40, - "amplitude": 0.5078, - "frequency": 4852833073, - "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, - "type": "qd" - }, - "MZ": { - "duration": 2000, - "amplitude": 0.2, - "frequency": 7452990931, - "envelope": { "kind": "rectangular" }, - "type": "ro" - } - }, - "2": { - "RX": { - "duration": 40, - "amplitude": 0.5016, - "frequency": 5795371914, - "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, - "type": "qd" - }, - "RX12": { - "duration": 40, - "amplitude": 0.5016, - "frequency": 5795371914, - "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, - "type": "qd" - }, - "MZ": { - "duration": 2000, - "amplitude": 0.25, - "frequency": 7655083068, - "envelope": { "kind": "rectangular" }, - "type": "ro" - } - }, - "3": { - "RX": { - "duration": 40, - "amplitude": 0.5026, - "frequency": 6761018001, - "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, - "type": "qd" - }, - "RX12": { - "duration": 40, - "amplitude": 0.5026, - "frequency": 6761018001, - "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, - "type": "qd" - }, - "MZ": { - "duration": 2000, - "amplitude": 0.2, - "frequency": 7803441221, - "envelope": { "kind": "rectangular" }, - "type": "ro" - } - }, - "4": { - "RX": { - "duration": 40, - "amplitude": 0.5172, - "frequency": 6586543060, - "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, - "type": "qd" - }, - "RX12": { - "duration": 40, - "amplitude": 0.5172, - "frequency": 6586543060, - "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, - "type": "qd" - }, - "MZ": { - "duration": 2000, - "amplitude": 0.4, - "frequency": 8058947261, - "envelope": { "kind": "rectangular" }, - "type": "ro" - } - } - }, - "two_qubit": { - "2-3": { - "CZ": [ - { - "duration": 32, - "amplitude": -0.6025, - "envelope": { - "kind": "exponential", - "tau": 12, - "upsilon": 5000, - "g": 0.1 - }, - "qubit": 3, - "frequency": 0, - "type": "qf" - }, - { - "type": "vz", - "phase": -3.63, - "qubit": 3 - }, - { - "type": "vz", - "phase": -0.041, - "qubit": 2 - } - ] - }, - "0-2": { - "CZ": [ - { - "duration": 28, - "amplitude": -0.142, - "envelope": { - "kind": "exponential", - "tau": 12, - "upsilon": 5000, - "g": 0.1 - }, - "qubit": 2, - "frequency": 0, - "type": "qf" - } - ] - }, - "1-2": { - "CZ": [ - { - "duration": 32, - "amplitude": -0.6025, - "envelope": { - "kind": "exponential", - "tau": 12, - "upsilon": 5000, - "g": 0.1 - }, - "qubit": 2, - "frequency": 0, - "type": "qf" - }, - { - "type": "vz", - "phase": -3.63, - "qubit": 1 - }, - { - "type": "vz", - "phase": -0.041, - "qubit": 2 - } - ] - } - } - } -} diff --git a/tests/dummy_qrc/qblox/platform.py b/tests/dummy_qrc/qblox/platform.py deleted file mode 100644 index 1e70f50c4f..0000000000 --- a/tests/dummy_qrc/qblox/platform.py +++ /dev/null @@ -1,98 +0,0 @@ -import pathlib - -from qibolab.channel import Channel, ChannelMap -from qibolab.instruments.qblox.cluster_qcm_bb import QcmBb -from qibolab.instruments.qblox.cluster_qcm_rf import QcmRf -from qibolab.instruments.qblox.cluster_qrm_rf import QrmRf -from qibolab.instruments.qblox.controller import QbloxController -from qibolab.instruments.rohde_schwarz import SGS100A -from qibolab.platform import Platform - -ADDRESS = "192.168.0.6" -TIME_OF_FLIGHT = 500 -FOLDER = pathlib.Path(__file__).parent - - -def create(): - """QuantWare 5q-chip controlled using qblox cluster. - - Args: - runcard_path (str): Path to the runcard file. - """ - - runcard = load_runcard(FOLDER) - modules = { - "qcm_bb0": QcmBb("qcm_bb0", f"{ADDRESS}:2"), - "qcm_bb1": QcmBb("qcm_bb1", f"{ADDRESS}:4"), - "qcm_rf0": QcmRf("qcm_rf0", f"{ADDRESS}:6"), - "qcm_rf1": QcmRf("qcm_rf1", f"{ADDRESS}:8"), - "qcm_rf2": QcmRf("qcm_rf2", f"{ADDRESS}:10"), - "qrm_rf_a": QrmRf("qrm_rf_a", f"{ADDRESS}:16"), - "qrm_rf_b": QrmRf("qrm_rf_b", f"{ADDRESS}:18"), - } - - controller = QbloxController("qblox_controller", ADDRESS, modules) - twpa_pump = SGS100A(name="twpa_pump", address="192.168.0.36") - - instruments = { - controller.name: controller, - twpa_pump.name: twpa_pump, - } - instruments.update(modules) - - # Create channel objects - channels = ChannelMap() - # Readout - channels |= Channel(name="L3-25_a", port=modules["qrm_rf_a"].ports("o1")) - channels |= Channel(name="L3-25_b", port=modules["qrm_rf_b"].ports("o1")) - # Feedback - channels |= Channel(name="L2-5_a", port=modules["qrm_rf_a"].ports("i1", out=False)) - channels |= Channel(name="L2-5_b", port=modules["qrm_rf_b"].ports("i1", out=False)) - # Drive - channels |= Channel(name="L3-15", port=modules["qcm_rf0"].ports("o1")) - channels |= Channel(name="L3-11", port=modules["qcm_rf0"].ports("o2")) - channels |= Channel(name="L3-12", port=modules["qcm_rf1"].ports("o1")) - channels |= Channel(name="L3-13", port=modules["qcm_rf1"].ports("o2")) - channels |= Channel(name="L3-14", port=modules["qcm_rf2"].ports("o1")) - # Flux - channels |= Channel(name="L4-5", port=modules["qcm_bb0"].ports("o1")) - channels |= Channel(name="L4-1", port=modules["qcm_bb0"].ports("o2")) - channels |= Channel(name="L4-2", port=modules["qcm_bb0"].ports("o3")) - channels |= Channel(name="L4-3", port=modules["qcm_bb0"].ports("o4")) - channels |= Channel(name="L4-4", port=modules["qcm_bb1"].ports("o1")) - # TWPA - channels |= Channel(name="L3-28", port=None) - channels["L3-28"].local_oscillator = twpa_pump - - # create qubit objects - - qubits, couplers, pairs = load_qubits(runcard) - # remove witness qubit - # del qubits[5] - # assign channels to qubits - for q in [0, 1]: - qubits[q].readout = channels["L3-25_a"] - qubits[q].feedback = channels["L2-5_a"] - qubits[q].twpa = channels["L3-28"] - for q in [2, 3, 4]: - qubits[q].readout = channels["L3-25_b"] - qubits[q].feedback = channels["L2-5_b"] - qubits[q].twpa = channels["L3-28"] - - qubits[0].drive = channels["L3-15"] - qubits[0].flux = channels["L4-5"] - channels["L4-5"].qubit = qubits[0] - for q in range(1, 5): - qubits[q].drive = channels[f"L3-{10 + q}"] - qubits[q].flux = channels[f"L4-{q}"] - channels[f"L4-{q}"].qubit = qubits[q] - - # set maximum allowed bias - for q in range(5): - qubits[q].flux.max_bias = 2.5 - - settings = load_settings(runcard) - - return Platform( - str(FOLDER), qubits, pairs, instruments, settings, resonator_type="2D" - ) diff --git a/tests/dummy_qrc/rfsoc/parameters.json b/tests/dummy_qrc/rfsoc/parameters.json deleted file mode 100644 index 505673d25b..0000000000 --- a/tests/dummy_qrc/rfsoc/parameters.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "nqubits": 1, - "qubits": [0], - "topology": [], - "settings": { - "nshots": 1024, - "relaxation_time": 100000 - }, - "instruments": { - "tii_rfsoc4x2": { - "bounds": { - "waveforms": 0, - "readout": 0, - "instructions": 0 - } - }, - "twpa_a": { - "frequency": 6200000000, - "power": -1 - }, - "ErasynthLO": { - "frequency": 0, - "power": 0 - } - }, - "native_gates": { - "single_qubit": { - "0": { - "RX": { - "duration": 30, - "amplitude": 0.05284168507293318, - "frequency": 5542341844, - "envelope": { "kind": "rectangular" }, - "type": "qd" - }, - "RX12": { - "duration": 30, - "amplitude": 0.05284168507293318, - "frequency": 5542341844, - "envelope": { "kind": "rectangular" }, - "type": "qd" - }, - "MZ": { - "duration": 600, - "amplitude": 0.03, - "frequency": 7371258599, - "envelope": { "kind": "rectangular" }, - "type": "ro" - } - } - }, - "two_qubit": {} - } -} diff --git a/tests/dummy_qrc/rfsoc/platform.py b/tests/dummy_qrc/rfsoc/platform.py deleted file mode 100644 index b2311f6cac..0000000000 --- a/tests/dummy_qrc/rfsoc/platform.py +++ /dev/null @@ -1,44 +0,0 @@ -import pathlib - -from qibolab.channel import Channel, ChannelMap -from qibolab.instruments.erasynth import ERA -from qibolab.instruments.rfsoc import RFSoC -from qibolab.instruments.rohde_schwarz import SGS100A -from qibolab.platform import Platform - -FOLDER = pathlib.Path(__file__).parent - - -def create(): - """Dummy platform using QICK project on the RFSoC4x2 board. - - Used in ``test_instruments_rfsoc.py``. - """ - # Instantiate QICK instruments - controller = RFSoC("tii_rfsoc4x2", "0.0.0.0", 0, sampling_rate=9.8304) - - # Create channel objects and map to instrument controllers - channels = ChannelMap() - channels |= Channel("L3-18_ro", port=controller.ports(0)) # readout (DAC) - channels |= Channel("L2-RO", port=controller.ports(0)) # feedback (readout DAC) - channels |= Channel("L3-18_qd", port=controller.ports(1)) # drive - channels |= Channel("L2-22_qf", port=controller.ports(2)) # flux - - lo_twpa = SGS100A("twpa_a", "192.168.0.32") - lo_era = ERA("ErasynthLO", "192.168.0.212", ethernet=True) - channels["L3-18_ro"].local_oscillator = lo_era - - runcard = load_runcard(FOLDER) - qubits, couplers, pairs = load_qubits(runcard) - - # assign channels to qubits - qubits[0].readout = channels["L3-18_ro"] - qubits[0].feedback = channels["L2-RO"] - qubits[0].drive = channels["L3-18_qd"] - qubits[0].flux = channels["L2-22_qf"] - - instruments = {inst.name: inst for inst in [controller, lo_twpa, lo_era]} - settings = load_settings(runcard) - return Platform( - str(FOLDER), qubits, pairs, instruments, settings, resonator_type="3D" - ) diff --git a/tests/emulators/default_q0/parameters.json b/tests/emulators/default_q0/parameters.json deleted file mode 100644 index 42f2f45bb6..0000000000 --- a/tests/emulators/default_q0/parameters.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "device_name": "default_q0", - "nqubits": 1, - "ncouplers": 0, - "description": "IBM 5-qubit device FakeBelem, q0 only", - "settings": { - "nshots": 4096, - "relaxation_time": 300000 - }, - "instruments": { - "pulse_simulator": { - "model_params": { - "model_name": "general_no_coupler_model", - "topology": [], - "nqubits": 1, - "ncouplers": 0, - "qubits_list": ["0"], - "couplers_list": [], - "nlevels_q": [3], - "nlevels_c": [], - "readout_error": {"0": [0.01, 0.02]}, - "drive_freq": {"0": 5.090167234445013}, - "T1": {"0": 88578.48970762537}, - "T2": {"0": 106797.94866226273}, - "lo_freq": {"0": 5.090167234445013}, - "rabi_freq": {"0": 0.333}, - "anharmonicity": {"0": -0.3361230051821652}, - "coupling_strength": {} - }, - "simulation_config": { - "simulation_engine_name": "Qutip", - "sampling_rate": 4.5, - "sim_sampling_boost": 10, - "runcard_duration_in_dt_units": false, - "instant_measurement": true, - "simulate_dissipation": true, - "output_state_history": true - }, - "sim_opts": null, - "bounds": { - "waveforms": 1, - "readout": 1, - "instructions": 1 - } - } - }, - "qubits": [ - 0 - ], - "couplers": [], - "topology": [], - "native_gates": { - "single_qubit": { - "0": { - "RX": { - "duration": 25.687, - "amplitude":0.1, - "frequency": 5090167234.445013, - "shape": "Drag(4, -4)", - "type": "qd", - "start": 0, - "phase": 0 - }, - "MZ": { - "duration": 4977.777777777777, - "amplitude": 0.03, - "frequency": 7301661824.000001, - "shape": "Rectangular()", - "type": "ro", - "start": 0, - "phase": 1.5636758979377372 - } - } - } - } -} diff --git a/tests/emulators/default_q0/platform.py b/tests/emulators/default_q0/platform.py deleted file mode 100644 index b1d8498416..0000000000 --- a/tests/emulators/default_q0/platform.py +++ /dev/null @@ -1,49 +0,0 @@ -import pathlib - -from qibolab.components import AcquireChannel, IqChannel -from qibolab.instruments.emulator.pulse_simulator import PulseSimulator -from qibolab.platform import Platform -from qibolab.serialize import ( - load_instrument_settings, - load_qubits, - load_runcard, - load_settings, -) - -FOLDER = pathlib.Path(__file__).parent - - -def create(): - """Create a one qubit emulator platform.""" - - # load runcard and model params - runcard = load_runcard(FOLDER) - device_name = runcard["device_name"] - - # Specify emulator controller - pulse_simulator = PulseSimulator() - instruments = {"pulse_simulator": pulse_simulator} - instruments = load_instrument_settings(runcard, instruments) - - # extract quantities from runcard for platform declaration - qubits, couplers, pairs = load_qubits(runcard) - settings = load_settings(runcard) - - # define channels for qubits - for q, qubit in qubits.items(): - qubit.probe = IqChannel( - "probe-{q}", mixer=None, lo=None, acquisition="acquire-{q}" - ) - qubit.acquisition = AcquireChannel( - "acquire-{q}", mixer=None, lo=None, twpa_pump=None, probe="probe-{q}" - ) - - return Platform( - device_name, - qubits, - pairs, - {}, - instruments, - settings, - resonator_type="2D", - ) diff --git a/tests/emulators/ibmfakebelem_q01/parameters.json b/tests/emulators/ibmfakebelem_q01/parameters.json deleted file mode 100644 index 16811bda9c..0000000000 --- a/tests/emulators/ibmfakebelem_q01/parameters.json +++ /dev/null @@ -1,252 +0,0 @@ -{ - "device_name": "ibmfakebelem_q01", - "nqubits": 2, - "ncouplers": 0, - "description": "IBM 5-qubit device FakeBelem, q0 and q1 only", - "settings": { - "nshots": 4096, - "relaxation_time": 300000 - }, - "instruments": { - "pulse_simulator": { - "model_params": { - "model_name": "general_no_coupler_model", - "topology": [ - [0, 1] - ], - "nqubits": 2, - "ncouplers": 0, - "qubits_list": ["0", "1"], - "couplers_list": [], - "nlevels_q": [2, 2], - "nlevels_c": [], - "readout_error": { - "0": [0.01, 0.02], - "1": [0.01, 0.02] - }, - "drive_freq": { - "0": 5.090167234445013, - "1": 5.245306068285918 - }, - "T1": { - "0": 88578.48970762537, - "1": 78050.43996837796 - }, - "T2": { - "0": 106797.94866226273, - "1": 63765.78004446571 - }, - "lo_freq": { - "0": 5.090167234445013, - "1": 5.245306068285918 - }, - "rabi_freq": { - "0": 0.12545753819061986, - "1": 0.12144270034090286 - }, - "anharmonicity": { - "0": -0.3361230051821652, - "1": -0.316572131412737 - }, - "coupling_strength": { - "1_0": 0.0018736137364449845 - } - }, - "simulation_config": { - "simulation_engine_name": "Qutip", - "sampling_rate": 4.5, - "sim_sampling_boost": 10, - "runcard_duration_in_dt_units": true, - "instant_measurement": true, - "simulate_dissipation": true, - "output_state_history": true - }, - "sim_opts": null, - "bounds": { - "waveforms": 1, - "readout": 1, - "instructions": 1 - } - } - }, - "qubits": [0, 1], - "couplers": [], - "topology": [ - [0, 1] - ], - "native_gates": { - "single_qubit": { - "0": { - "RX": { - "duration": 61.117, - "amplitude": 0.5, - "frequency": 5090167234.445013, - "shape": "Drag(4, -2.4305800297101414)", - "type": "qd", - "start": 0, - "phase": 0 - }, - "MZ": { - "duration": 22400, - "amplitude": 0.03, - "frequency": 7301661824.000001, - "shape": "Rectangular()", - "type": "ro", - "start": 0, - "phase": 1.5636758979377372 - } - }, - "1": { - "RX": { - "duration": 63.394, - "amplitude": 0.5, - "frequency": 5245306068.285917, - "shape": "Drag(4, 0.6571522139248822)", - "type": "qd", - "start": 0, - "phase": 0 - }, - "MZ": { - "duration": 22400, - "amplitude": 0.056500000000000015, - "frequency": 7393428047.0, - "shape": "Rectangular()", - "type": "ro", - "start": 0, - "phase": -3.022547221302854 - } - } - }, - "two_qubit": { - "0-1": { - "CNOT": [ - { - "type": "virtual_z", - "phase": -3.141592653589793, - "qubit": 0 - }, - { - "type": "virtual_z", - "phase": -1.5707963267948966, - "qubit": 1 - }, - { - "duration": 160, - "amplitude": 0.11622814090041741, - "frequency": 5090167234.445013, - "shape": "Drag(4, -2.4030014266125312)", - "type": "qd", - "relative_start": 0, - "phase": 1.6155738267853115, - "qubit": 0 - }, - { - "duration": 160, - "amplitude": 0.11976666126366188, - "frequency": 5245306068.285917, - "shape": "Drag(4, 0.6889687213780946)", - "type": "qd", - "relative_start": 0, - "phase": 0.02175043021781017, - "qubit": 1 - }, - { - "duration": 1584, - "amplitude": 0.023676707660000004, - "frequency": 5090167234.445013, - "shape": "GaussianSquare(6.4, 1328)", - "type": "qd", - "relative_start": 160, - "phase": 0.16645972884560645, - "qubit": 0 - }, - { - "type": "virtual_z", - "phase": -1.5707963267948966, - "qubit": 1 - }, - { - "duration": 1584, - "amplitude": 0.14343084605450945, - "frequency": 5090167234.445013, - "shape": "GaussianSquare(6.4, 1328)", - "type": "qd", - "relative_start": 160, - "phase": -2.9352017171062608, - "qubit": 1 - }, - { - "type": "virtual_z", - "phase": 1.5707963267948966, - "qubit": 1 - }, - { - "duration": 160, - "amplitude": 0.24840043468596693, - "frequency": 5245306068.285917, - "shape": "Drag(4, 0.6571522139248822)", - "type": "qd", - "relative_start": 1744, - "phase": 0.0, - "qubit": 1 - }, - { - "duration": 1584, - "amplitude": 0.023676707660000004, - "frequency": 5090167234.445013, - "shape": "GaussianSquare(6.4, 1328)", - "type": "qd", - "relative_start": 1904, - "phase": -2.975132924744187, - "qubit": 0 - }, - { - "type": "virtual_z", - "phase": -1.5707963267948966, - "qubit": 1 - }, - { - "duration": 1584, - "amplitude": 0.14343084605450945, - "frequency": 5090167234.445013, - "shape": "GaussianSquare(6.4, 1328)", - "type": "qd", - "relative_start": 1904, - "phase": 0.20639093648353235, - "qubit": 1 - }, - { - "type": "virtual_z", - "phase": -1.5707963267948966, - "qubit": 0 - }, - { - "type": "virtual_z", - "phase": 1.5707963267948966, - "qubit": 1 - }, - { - "duration": 160, - "amplitude": 0.11622814090041741, - "frequency": 5090167234.445013, - "shape": "Drag(4, -2.4030014266125312)", - "type": "qd", - "relative_start": 3488, - "phase": 0.04477749999041481, - "qubit": 0 - }, - { - "duration": 160, - "amplitude": 0.11976666126366188, - "frequency": 5245306068.285917, - "shape": "Drag(4, 0.6889687213780946)", - "type": "qd", - "relative_start": 3488, - "phase": -1.549045896577087, - "qubit": 1 - } - ] - } - } - } -} diff --git a/tests/emulators/ibmfakebelem_q01/platform.py b/tests/emulators/ibmfakebelem_q01/platform.py deleted file mode 100644 index 136350a805..0000000000 --- a/tests/emulators/ibmfakebelem_q01/platform.py +++ /dev/null @@ -1,52 +0,0 @@ -import pathlib - -from qibolab.channels import ChannelMap -from qibolab.instruments.emulator.pulse_simulator import PulseSimulator -from qibolab.platform import Platform -from qibolab.serialize import ( - load_instrument_settings, - load_qubits, - load_runcard, - load_settings, -) - -FOLDER = pathlib.Path(__file__).parent - - -def create(): - """Create a one qubit emulator platform.""" - - # load runcard and model params - runcard = load_runcard(FOLDER) - device_name = runcard["device_name"] - - # Specify emulator controller - pulse_simulator = PulseSimulator() - instruments = {"pulse_simulator": pulse_simulator} - instruments = load_instrument_settings(runcard, instruments) - - # extract quantities from runcard for platform declaration - qubits, couplers, pairs = load_qubits(runcard) - settings = load_settings(runcard) - - # Create channel object - channels = ChannelMap() - channels |= (f"readout-{q}" for q in qubits) - channels |= (f"drive-{q}" for q in qubits) - - # map channels to qubits - for q, qubit in qubits.items(): - qubit.readout = channels[f"readout-{q}"] - qubit.drive = channels[f"drive-{q}"] - - channels[f"drive-{q}"].qubit = qubit - qubit.sweetspot = 0 # not used - - return Platform( - device_name, - qubits, - pairs, - instruments, - settings, - resonator_type="2D", - ) diff --git a/tests/qblox_fixtures.py b/tests/qblox_fixtures.py deleted file mode 100644 index 98c6dcd934..0000000000 --- a/tests/qblox_fixtures.py +++ /dev/null @@ -1,20 +0,0 @@ -import pytest - -from qibolab.instruments.qblox.controller import QbloxController - - -def get_controller(platform): - for instrument in platform.instruments.values(): - if isinstance(instrument, QbloxController): - return instrument - pytest.skip(f"Skipping qblox test for {platform.name}.") - - -@pytest.fixture(scope="module") -def controller(platform): - return get_controller(platform) - - -@pytest.fixture(scope="module") -def connected_controller(connected_platform): - return get_controller(connected_platform) diff --git a/tests/test_emulator.py b/tests/test_emulator.py deleted file mode 100644 index f2f2bbca90..0000000000 --- a/tests/test_emulator.py +++ /dev/null @@ -1,350 +0,0 @@ -import os -import pathlib - -import numpy as np -import pytest -from qutip import Options, identity, tensor - -from qibolab import AcquisitionType, AveragingMode, ExecutionParameters, create_platform -from qibolab.instruments.emulator.engines.generic import op_from_instruction -from qibolab.instruments.emulator.engines.qutip_engine import ( - QutipSimulator, - extend_op_dim, - function_from_array, -) -from qibolab.instruments.emulator.models import ( - general_no_coupler_model, - models_template, -) -from qibolab.instruments.emulator.pulse_simulator import AVAILABLE_SWEEP_PARAMETERS -from qibolab.platform.load import PLATFORMS -from qibolab.sequence import PulseSequence -from qibolab.sweeper import ChannelParameter, Parameter, Sweeper - -os.environ[PLATFORMS] = str(pathlib.Path(__file__).parent / "emulators/") - -SWEPT_POINTS = 2 -EMULATORS = ["default_q0"] -MODELS = [models_template, general_no_coupler_model] - - -@pytest.mark.parametrize("emulator", EMULATORS) -def test_emulator_initialization(emulators, emulator): - platform = create_platform(emulator) - platform.connect() - platform.disconnect() - - -@pytest.mark.parametrize("emulator", EMULATORS) -@pytest.mark.parametrize( - "acquisition", - [AcquisitionType.DISCRIMINATION, AcquisitionType.INTEGRATION, AcquisitionType.RAW], -) -def test_emulator_execute_compute_overlaps(emulators, emulator, acquisition): - nshots = 10 # 100 - platform = create_platform(emulator) - pulse_simulator = platform.instruments["pulse_simulator"] - sequence = PulseSequence() - sequence.add(platform.create_RX_pulse(0, 0)) - sequence.add(platform.create_qubit_readout_pulse(0, 0)) - options = ExecutionParameters(nshots=nshots, acquisition_type=acquisition) - if ( - acquisition is AcquisitionType.DISCRIMINATION - or acquisition is AcquisitionType.INTEGRATION - ): - results = platform.execute([sequence], options) - simulated_states = results["simulation"]["output_states"] - overlaps = pulse_simulator.simulation_engine.compute_overlaps(simulated_states) - if acquisition is AcquisitionType.DISCRIMINATION: - assert results[0][0].samples.shape == (nshots,) - else: - assert results[0][0].voltage.shape == (nshots,) - else: - with pytest.raises(ValueError) as excinfo: - platform.execute(sequence, options) - assert "Current emulator does not support requested AcquisitionType" in str( - excinfo.value - ) - - -@pytest.mark.parametrize("emulator", EMULATORS) -def test_emulator_execute_fast_reset(emulators, emulator): - platform = create_platform(emulator) - sequence = PulseSequence() - sequence.add(platform.create_qubit_readout_pulse(0, 0)) - options = ExecutionParameters( - nshots=None, fast_reset=True - ) # fast_reset does nothing in emulator - result = platform.execute([sequence], options) - - -@pytest.mark.parametrize("emulator", EMULATORS) -@pytest.mark.parametrize("fast_reset", [True, False]) -@pytest.mark.parametrize("parameter", Parameter) -@pytest.mark.parametrize("average", [AveragingMode.SINGLESHOT, AveragingMode.CYCLIC]) -@pytest.mark.parametrize("acquisition", [AcquisitionType.DISCRIMINATION]) -@pytest.mark.parametrize("nshots", [10, 20]) -def test_emulator_single_sweep( - emulators, emulator, fast_reset, parameter, average, acquisition, nshots -): - platform = create_platform(emulator) - sequence = PulseSequence() - pulse = platform.create_qubit_readout_pulse(qubit=0, start=0) - if parameter is Parameter.amplitude: - parameter_range = np.random.rand(SWEPT_POINTS) - else: - parameter_range = np.random.randint(1, 4, size=SWEPT_POINTS) - sequence.add(pulse) - if parameter in ChannelParameter: - sweeper = Sweeper(parameter, parameter_range, qubits=[platform.qubits[0]]) - else: - sweeper = Sweeper(parameter, parameter_range, pulses=[pulse]) - - options = ExecutionParameters( - nshots=nshots, - averaging_mode=average, - acquisition_type=acquisition, - fast_reset=fast_reset, - ) - average = not options.averaging_mode is AveragingMode.SINGLESHOT - if parameter in AVAILABLE_SWEEP_PARAMETERS: - results = platform.execute([sequence], options, sweeper) - - assert pulse.serial and pulse.qubit in results - if average: - results_shape = results[pulse.qubit][0].statistical_frequency.shape - else: - results_shape = results[pulse.qubit][0].samples.shape - assert results_shape == (SWEPT_POINTS,) if average else (nshots, SWEPT_POINTS) - else: - with pytest.raises(NotImplementedError) as excinfo: - platform.execute([sequence], options, sweeper) - assert "Sweep parameter requested not available" in str(excinfo.value) - - -@pytest.mark.parametrize("emulator", EMULATORS) -@pytest.mark.parametrize("parameter1", Parameter) -@pytest.mark.parametrize("parameter2", Parameter) -@pytest.mark.parametrize("average", [AveragingMode.SINGLESHOT, AveragingMode.CYCLIC]) -@pytest.mark.parametrize("acquisition", [AcquisitionType.DISCRIMINATION]) -@pytest.mark.parametrize("nshots", [10, 20]) -def test_emulator_double_sweep_false_history( - emulators, emulator, parameter1, parameter2, average, acquisition, nshots -): - platform = create_platform(emulator) - pulse_simulator = platform.instruments["pulse_simulator"] - pulse_simulator.output_state_history = False - sequence = PulseSequence() - pulse = platform.create_qubit_drive_pulse(qubit=0, start=0, duration=2) - ro_pulse = platform.create_qubit_readout_pulse(qubit=0, start=pulse.finish) - sequence.add(pulse) - sequence.add(ro_pulse) - parameter_range_1 = ( - np.random.rand(SWEPT_POINTS) - if parameter1 is Parameter.amplitude - else np.random.randint(1, 4, size=SWEPT_POINTS) - ) - parameter_range_2 = ( - np.random.rand(SWEPT_POINTS) - if parameter2 is Parameter.amplitude - else np.random.randint(1, 4, size=SWEPT_POINTS) - ) - if parameter1 in ChannelParameter: - sweeper1 = Sweeper(parameter1, parameter_range_1, qubits=[platform.qubits[0]]) - else: - sweeper1 = Sweeper(parameter1, parameter_range_1, pulses=[ro_pulse]) - if parameter2 in ChannelParameter: - sweeper2 = Sweeper(parameter2, parameter_range_2, qubits=[platform.qubits[0]]) - else: - sweeper2 = Sweeper(parameter2, parameter_range_2, pulses=[pulse]) - - options = ExecutionParameters( - nshots=nshots, - averaging_mode=average, - acquisition_type=acquisition, - ) - average = not options.averaging_mode is AveragingMode.SINGLESHOT - - if ( - parameter1 in AVAILABLE_SWEEP_PARAMETERS - and parameter2 in AVAILABLE_SWEEP_PARAMETERS - ): - results = platform.execute([sequence], options, sweeper1, sweeper2) - - assert ro_pulse.serial and ro_pulse.qubit in results - - if average: - results_shape = results[pulse.qubit][0].statistical_frequency.shape - else: - results_shape = results[pulse.qubit][0].samples.shape - - assert ( - results_shape == (SWEPT_POINTS, SWEPT_POINTS) - if average - else (nshots, SWEPT_POINTS, SWEPT_POINTS) - ) - - -@pytest.mark.parametrize("emulator", EMULATORS) -@pytest.mark.parametrize("parameter", Parameter) -@pytest.mark.parametrize("average", [AveragingMode.SINGLESHOT, AveragingMode.CYCLIC]) -@pytest.mark.parametrize("acquisition", [AcquisitionType.DISCRIMINATION]) -@pytest.mark.parametrize("nshots", [10, 20]) -def test_emulator_single_sweep_multiplex( - emulators, emulator, parameter, average, acquisition, nshots -): - platform = create_platform(emulator) - sequence = PulseSequence() - ro_pulses = {} - for qubit in platform.qubits: - ro_pulses[qubit] = platform.create_qubit_readout_pulse(qubit=qubit, start=0) - sequence.add(ro_pulses[qubit]) - parameter_range = ( - np.random.rand(SWEPT_POINTS) - if parameter is Parameter.amplitude - else np.random.randint(1, 4, size=SWEPT_POINTS) - ) - - if parameter in ChannelParameter: - sweeper1 = Sweeper( - parameter, - parameter_range, - qubits=[platform.qubits[qubit] for qubit in platform.qubits], - ) - else: - sweeper1 = Sweeper( - parameter, - parameter_range, - pulses=[ro_pulses[qubit] for qubit in platform.qubits], - ) - - options = ExecutionParameters( - nshots=nshots, - averaging_mode=average, - acquisition_type=acquisition, - ) - average = not options.averaging_mode is AveragingMode.SINGLESHOT - if parameter in AVAILABLE_SWEEP_PARAMETERS: - results = platform.execute([sequence], options, sweeper1) - - for ro_pulse in ro_pulses.values(): - assert ro_pulse.serial and ro_pulse.qubit in results - if average: - results_shape = results[ro_pulse.qubit][0].statistical_frequency.shape - else: - results_shape = results[ro_pulse.qubit][0].samples.shape - assert ( - results_shape == (SWEPT_POINTS,) if average else (nshots, SWEPT_POINTS) - ) - - -# pulse_simulator -def test_pulse_simulator_initialization(emulators): - emulator = "default_q0" - platform = create_platform(emulator) - sim_opts = Options(atol=1e-11, rtol=1e-9, nsteps=int(1e6)) - pulse_simulator = platform.instruments["pulse_simulator"] - pulse_simulator.connect() - pulse_simulator.disconnect() - pulse_simulator.dump() - - -def test_pulse_simulator_play_no_dissipation_dt_units_false_history_ro_exception( - emulators, -): - emulator = "default_q0" - platform = create_platform(emulator) - pulse_simulator = platform.instruments["pulse_simulator"] - pulse_simulator.readout_error = {1: [0.1, 0.1]} - pulse_simulator.runcard_duration_in_dt_units = True - pulse_simulator.simulate_dissipation = False - pulse_simulator.output_state_history = False - sequence = PulseSequence() - sequence.add(platform.create_RX_pulse(0, 0)) - sequence.add(platform.create_qubit_readout_pulse(0, 0)) - execution_parameters = ExecutionParameters(nshots=10) - with pytest.raises(ValueError) as excinfo: - pulse_simulator.play({0: 0}, {}, sequence, execution_parameters) - assert "Not all readout qubits are present in readout_error!" in str(excinfo.value) - - -# models.methods -def test_op_from_instruction(): - model = models_template - model_config = model.generate_model_config() - test_inst = model_config["drift"]["one_body"][1] - test_inst2 = model_config["drift"]["two_body"][0] - test_inst3 = (1.0, "b_2 ^ b_1 ^ b_0", ["2", "1", "0"]) - op_from_instruction(test_inst, multiply_coeff=False) - op_from_instruction(test_inst2, multiply_coeff=False) - op_from_instruction(test_inst3, multiply_coeff=False) - - -# engines.qutip_engine -@pytest.mark.parametrize("model", MODELS) -def test_update_sim_opts(model): - model_config = model.generate_model_config() - simulation_engine = QutipSimulator(model_config) - sim_opts = Options(atol=1e-11, rtol=1e-9, nsteps=int(1e6)) - - -@pytest.mark.parametrize("model", MODELS) -def test_make_arbitrary_state(model): - model_config = model.generate_model_config() - simulation_engine = QutipSimulator(model_config) - zerostate = simulation_engine.psi0.copy() - dim = zerostate.shape[0] - qibo_statevector = np.zeros(dim) - qibo_statevector[2] = 1 - qibo_statevector = np.array(qibo_statevector.tolist()) - qibo_statedm = np.kron( - qibo_statevector.reshape([dim, 1]), qibo_statevector.reshape([1, dim]) - ) - teststate = simulation_engine.make_arbitrary_state( - qibo_statevector, is_qibo_state_vector=True - ) - teststatedm = simulation_engine.make_arbitrary_state( - qibo_statedm, is_qibo_state_vector=True - ) - - -@pytest.mark.parametrize("model", MODELS) -def test_state_from_basis_vector_exception(model): - model_config = model.generate_model_config() - simulation_engine = QutipSimulator(model_config) - basis_vector0 = [0 for i in range(simulation_engine.nqubits)] - cbasis_vector0 = [0 for i in range(simulation_engine.ncouplers)] - simulation_engine.state_from_basis_vector(basis_vector0, None) - combined_vector_list = [ - [basis_vector0 + [0], cbasis_vector0, "basis_vector"], - [basis_vector0, cbasis_vector0 + [0], "cbasis_vector"], - ] - for combined_vector in combined_vector_list: - with pytest.raises(Exception) as excinfo: - basis_vector, cbasis_vector, error_vector = combined_vector - simulation_engine.state_from_basis_vector(basis_vector, cbasis_vector) - assert f"length of {error_vector} does not match" in str(excinfo.value) - - -def test_function_from_array_exception(): - y = np.ones([2, 2]) - x = np.ones([3, 2]) - with pytest.raises(ValueError) as excinfo: - function_from_array(y, x) - assert "y and x must have the same" in str(excinfo.value) - - -def test_extend_op_dim_exceptions(): - I2 = identity(2) - I4 = identity(4) - op_qobj = tensor(I2, I4) - - index_list1 = [[0], [0, 1], [2, 3], [4, 5, 6]] - index_list2 = [[0], [4], [2, 3], [4, 5]] - index_list3 = [[0], [0], [2, 3], [5, 4]] - index_lists = [index_list1, index_list2, index_list3] - - for index_list in index_lists: - with pytest.raises(Exception) as excinfo: - extend_op_dim(op_qobj, *index_list) - assert "mismatch" in str(excinfo.value) diff --git a/tests/test_instruments_qblox.py b/tests/test_instruments_qblox.py deleted file mode 100644 index b743fd7024..0000000000 --- a/tests/test_instruments_qblox.py +++ /dev/null @@ -1,313 +0,0 @@ -"""Qblox instruments driver. - -Supports the following Instruments: - Cluster - Cluster QRM-RF - Cluster QCM-RF - Cluster QCM -Compatible with qblox-instruments driver 0.9.0 (28/2/2023). -It supports: - - multiplexed readout of up to 6 qubits - - hardware modulation, demodulation, and classification - - software modulation, with support for arbitrary pulses - - software demodulation - - binned acquisition - - real-time sweepers of - - pulse frequency (requires hardware modulation) - - pulse relative phase (requires hardware modulation) - - pulse amplitude - - pulse start - - pulse duration - - port gain - - port offset - - multiple readouts for the same qubit (sequence unrolling) - - max iq pulse length 8_192ns - - waveforms cache, uses additional free sequencers if the memory of one sequencer (16384) is exhausted - - instrument parameters cache - - safe disconnection of offsets on termination -""" - -# from .conftest import load_from_platform - -# INSTRUMENTS_LIST = ["Cluster", "ClusterQRM_RF", "ClusterQCM_RF"] - -# instruments = {} -# instruments_settings = {} - - -# @pytest.mark.qpu -# @pytest.mark.parametrize("name", INSTRUMENTS_LIST) -# def test_instruments_qublox_init(platform_name, name): -# platform = create_platform(platform_name) -# settings = platform.settings -# # Instantiate instrument -# instance, instr_settings = load_from_platform(create_platform(platform_name), name) -# instruments[name] = instance -# instruments_settings[name] = instr_settings -# assert instance.name == name -# assert instance.is_connected == False -# assert instance.device == None -# assert instance.data_folder == INSTRUMENTS_DATA_FOLDER / instance.tmp_folder.name.split("/")[-1] - - -# @pytest.mark.qpu -# @pytest.mark.parametrize("name", INSTRUMENTS_LIST) -# def test_instruments_qublox_connect(name): -# instruments[name].connect() - - -# @pytest.mark.qpu -# @pytest.mark.parametrize("name", INSTRUMENTS_LIST) -# def test_instruments_qublox_setup(platform_name, name): -# settings = create_platform(platform_name).settings -# instruments[name].setup(**settings["settings"], **instruments_settings[name]) -# for parameter in instruments_settings[name]: -# if parameter == "ports": -# for port in instruments_settings[name]["ports"]: -# for sub_parameter in instruments_settings[name]["ports"][port]: -# # assert getattr(instruments[name].ports[port], sub_parameter) == settings["instruments"][name]["settings"]["ports"][port][sub_parameter] -# np.testing.assert_allclose( -# getattr(instruments[name].ports[port], sub_parameter), -# instruments_settings[name]["ports"][port][sub_parameter], -# atol=1e-4, -# ) -# else: -# assert getattr(instruments[name], parameter) == instruments_settings[name][parameter] - - -# def instrument_test_property_wrapper( -# origin_object, origin_attribute, destination_object, *destination_parameters, values -# ): -# for value in values: -# setattr(origin_object, origin_attribute, value) -# for destination_parameter in destination_parameters: -# assert (destination_object.get(destination_parameter) == value) or ( -# np.testing.assert_allclose(destination_object.get(destination_parameter), value, rtol=1e-1) == None -# ) - - -# @pytest.mark.qpu -# @pytest.mark.parametrize("name", INSTRUMENTS_LIST) -# def test_instruments_qublox_set_property_wrappers(name): -# instrument = instruments[name] -# device = instruments[name].device -# if instrument.__class__.__name__ == "Cluster": -# instrument_test_property_wrapper( -# instrument, "reference_clock_source", device, "reference_source", values=["external", "internal"] -# ) -# if instrument.__class__.__name__ == "ClusterQRM_RF": -# port = instruments[name].ports["o1"] -# sequencer = device.sequencers[instrument.DEFAULT_SEQUENCERS["o1"]] -# instrument_test_property_wrapper(port, "attenuation", device, "out0_att", values=np.arange(0, 60 + 2, 2)) -# instrument_test_property_wrapper(port, "lo_enabled", device, "out0_in0_lo_en", values=[True, False]) -# instrument_test_property_wrapper( -# port, "lo_frequency", device, "out0_in0_lo_freq", values=np.linspace(2e9, 18e9, 20) -# ) -# instrument_test_property_wrapper( -# port, "gain", sequencer, "gain_awg_path0", "gain_awg_path1", values=np.linspace(-1, 1, 20) -# ) -# instrument_test_property_wrapper(port, "hardware_mod_en", sequencer, "mod_en_awg", values=[True, False]) -# instrument_test_property_wrapper(port, "nco_freq", sequencer, "nco_freq", values=np.linspace(-500e6, 500e6, 20)) -# instrument_test_property_wrapper( -# port, "nco_phase_offs", sequencer, "nco_phase_offs", values=np.linspace(0, 359, 20) -# ) -# port = instruments[name].ports["i1"] -# sequencer = device.sequencers[instrument.DEFAULT_SEQUENCERS["i1"]] -# instrument_test_property_wrapper(port, "hardware_demod_en", sequencer, "demod_en_acq", values=[True, False]) -# instrument_test_property_wrapper( -# instrument, -# "acquisition_duration", -# sequencer, -# "integration_length_acq", -# values=np.arange(4, 16777212 + 4, 729444), -# ) -# # FIXME: I don't know why this is failing -# instrument_test_property_wrapper( -# instrument, -# "thresholded_acq_threshold", -# sequencer, -# "thresholded_acq_threshold", -# # values=np.linspace(-16777212.0, 16777212.0, 20), -# values=np.zeros(1), -# ) -# instrument_test_property_wrapper( -# instrument, -# "thresholded_acq_rotation", -# sequencer, -# "thresholded_acq_rotation", -# values=np.zeros(1), -# # values=np.linspace(0, 359, 20) -# ) -# if instrument.__class__.__name__ == "ClusterQCM_RF": -# port = instruments[name].ports["o1"] -# sequencer = device.sequencers[instrument.DEFAULT_SEQUENCERS["o1"]] -# instrument_test_property_wrapper(port, "attenuation", device, "out0_att", values=np.arange(0, 60 + 2, 2)) -# instrument_test_property_wrapper(port, "lo_enabled", device, "out0_lo_en", values=[True, False]) -# instrument_test_property_wrapper( -# port, "lo_frequency", device, "out0_lo_freq", values=np.linspace(2e9, 18e9, 20) -# ) -# instrument_test_property_wrapper( -# port, "gain", sequencer, "gain_awg_path0", "gain_awg_path1", values=np.linspace(-1, 1, 20) -# ) -# instrument_test_property_wrapper(port, "hardware_mod_en", sequencer, "mod_en_awg", values=[True, False]) -# instrument_test_property_wrapper(port, "nco_freq", sequencer, "nco_freq", values=np.linspace(-500e6, 500e6, 20)) -# instrument_test_property_wrapper( -# port, "nco_phase_offs", sequencer, "nco_phase_offs", values=np.linspace(0, 359, 20) -# ) -# port = instruments[name].ports["o2"] -# sequencer = device.sequencers[instrument.DEFAULT_SEQUENCERS["o2"]] -# instrument_test_property_wrapper(port, "attenuation", device, "out1_att", values=np.arange(0, 60 + 2, 2)) -# instrument_test_property_wrapper(port, "lo_enabled", device, "out1_lo_en", values=[True, False]) -# instrument_test_property_wrapper( -# port, "lo_frequency", device, "out1_lo_freq", values=np.linspace(2e9, 18e9, 20) -# ) -# instrument_test_property_wrapper( -# port, "gain", sequencer, "gain_awg_path0", "gain_awg_path1", values=np.linspace(-1, 1, 20) -# ) -# instrument_test_property_wrapper(port, "hardware_mod_en", sequencer, "mod_en_awg", values=[True, False]) -# instrument_test_property_wrapper(port, "nco_freq", sequencer, "nco_freq", values=np.linspace(-500e6, 500e6, 20)) -# instrument_test_property_wrapper( -# port, "nco_phase_offs", sequencer, "nco_phase_offs", values=np.linspace(0, 359, 20) -# ) - - -# def instrument_set_and_test_parameter_values(instrument, target, parameter, values): -# for value in values: -# instrument._set_device_parameter(target, parameter, value) -# np.testing.assert_allclose(target.get(parameter), value) - - -# @pytest.mark.parametrize("name", INSTRUMENTS_LIST) -# def test_instruments_qublox_set_device_paramters(name): -# """ # TODO: add attitional paramter tests -# qrm -# platform.instruments['qrm_rf'].device.print_readable_snapshot(update=True) -# cluster_module16: -# parameter value -# -------------------------------------------------------------------------------- -# in0_att : 0 (dB) -# out0_att : 34 (dB) -# out0_in0_lo_en : True -# out0_in0_lo_freq : 7537724144 (Hz) -# out0_offset_path0 : 34 (mV) -# out0_offset_path1 : 0 (mV) -# present : True -# scope_acq_avg_mode_en_path0 : True -# scope_acq_avg_mode_en_path1 : True -# scope_acq_sequencer_select : 0 -# scope_acq_trigger_level_path0 : 0 -# scope_acq_trigger_level_path1 : 0 -# scope_acq_trigger_mode_path0 : sequencer -# scope_acq_trigger_mode_path1 : sequencer -# cluster_module16_sequencer0: -# parameter value -# -------------------------------------------------------------------------------- -# channel_map_path0_out0_en : True -# channel_map_path1_out1_en : True -# cont_mode_en_awg_path0 : False -# cont_mode_en_awg_path1 : False -# cont_mode_waveform_idx_awg_path0 : 0 -# cont_mode_waveform_idx_awg_path1 : 0 -# demod_en_acq : False -# thresholded_acq_threshold : 0 -# gain_awg_path0 : 1 -# gain_awg_path1 : 1 -# integration_length_acq : 2000 -# marker_ovr_en : True -# marker_ovr_value : 15 -# mixer_corr_gain_ratio : 1 -# mixer_corr_phase_offset_degree : -0 -# mod_en_awg : False -# nco_freq : 0 (Hz) -# nco_phase_offs : 0 (Degrees) -# offset_awg_path0 : 0 -# offset_awg_path1 : 0 -# thresholded_acq_rotation : 0 (Degrees) -# sequence : /nfs/users/alvaro.orgaz/qibolab/src/qibola... -# sync_en : True -# upsample_rate_awg_path0 : 0 -# upsample_rate_awg_path1 : 0 - -# qcm: -# platform.instruments['qcm_rf2'].device.print_readable_snapshot(update=True) -# cluster_module12: -# parameter value -# -------------------------------------------------------------------------------- -# out0_att : 24 (dB) -# out0_lo_en : True -# out0_lo_freq : 5325473000 (Hz) -# out0_offset_path0 : 24 (mV) -# out0_offset_path1 : 24 (mV) -# out1_att : 24 (dB) -# out1_lo_en : True -# out1_lo_freq : 6212286000 (Hz) -# out1_offset_path0 : 0 (mV) -# out1_offset_path1 : 0 (mV) -# present : True -# cluster_module12_sequencer0: -# parameter value -# -------------------------------------------------------------------------------- -# channel_map_path0_out0_en : True -# channel_map_path0_out2_en : False -# channel_map_path1_out1_en : True -# channel_map_path1_out3_en : False -# cont_mode_en_awg_path0 : False -# cont_mode_en_awg_path1 : False -# cont_mode_waveform_idx_awg_path0 : 0 -# cont_mode_waveform_idx_awg_path1 : 0 -# gain_awg_path0 : 0.33998 -# gain_awg_path1 : 0.33998 -# marker_ovr_en : True -# marker_ovr_value : 15 -# mixer_corr_gain_ratio : 1 -# mixer_corr_phase_offset_degree : -0 -# mod_en_awg : False -# nco_freq : -2e+08 (Hz) -# nco_phase_offs : 0 (Degrees) -# offset_awg_path0 : 0 -# offset_awg_path1 : 0 -# sequence : /nfs/users/alvaro.orgaz/qibolab/src/qibola... -# sync_en : True -# upsample_rate_awg_path0 : 0 -# upsample_rate_awg_path1 : 0 -# """ - - -# @pytest.mark.qpu -# @pytest.mark.parametrize("name", INSTRUMENTS_LIST) -# def test_instruments_process_pulse_sequence_upload_play(platform_name, name): -# instrument = instruments[name] -# settings = create_platform(platform_name).settings -# instrument.setup(**settings["settings"], **instruments_settings[name]) -# relaxation_time = settings["settings"]["relaxation_time"] -# instrument_pulses = {} -# instrument_pulses[name] = PulseSequence() -# if "QCM" in instrument.__class__.__name__: -# for channel in instrument.channel_port_map: -# instrument_pulses[name].append(Pulse(0, 200, 1, 10e6, np.pi / 2, "Gaussian(5)", str(channel))) -# instrument.process_pulse_sequence(instrument_pulses[name], nshots=5, relaxation_time=relaxation_time) -# instrument.upload() -# instrument.play_sequence() -# if "QRM" in instrument.__class__.__name__: -# channel = instrument._port_channel_map["o1"] -# instrument_pulses[name].append( -# Pulse(0, 200, 1, 10e6, np.pi / 2, "Gaussian(5)", channel), -# ReadoutPulse(200, 2000, 1, 10e6, np.pi / 2, "Rectangular()", channel), -# ) -# instrument.device.sequencers[0].sync_en( -# False -# ) # TODO: Check why this is necessary here and not when playing a PS of only one readout pulse -# instrument.process_pulse_sequence(instrument_pulses[name], nshots=5, relaxation_time=relaxation_time) -# instrument.upload() -# instrument.play_sequence() -# acquisition_results = instrument.acquire() - - -# @pytest.mark.qpu -# @pytest.mark.parametrize("name", INSTRUMENTS_LIST) -# def test_instruments_qublox_start_stop_disconnect(name): -# instrument = instruments[name] -# instrument.start() -# instrument.stop() -# instrument.disconnect() -# assert instrument.is_connected == False diff --git a/tests/test_instruments_qblox_cluster_qcm_bb.py b/tests/test_instruments_qblox_cluster_qcm_bb.py deleted file mode 100644 index 17215e3289..0000000000 --- a/tests/test_instruments_qblox_cluster_qcm_bb.py +++ /dev/null @@ -1,176 +0,0 @@ -import math - -import numpy as np -import pytest - -from qibolab.instruments.abstract import Instrument -from qibolab.instruments.qblox.cluster_qcm_bb import QcmBb -from qibolab.instruments.qblox.port import QbloxOutputPort -from qibolab.sequence import PulseSequence -from qibolab.sweeper import Parameter, Sweeper, SweeperType - -from .qblox_fixtures import connected_controller, controller - -O1_OUTPUT_CHANNEL = "L4-5" -O2_OUTPUT_CHANNEL = "L4-1" -O3_OUTPUT_CHANNEL = "L4-2" -O4_OUTPUT_CHANNEL = "L4-3" - -PORT_SETTINGS = ["o1", "o2", "o3", "o4"] - - -def get_qcm_bb(controller): - for module in controller.modules.values(): - if isinstance(module, QcmBb): - return QcmBb(module.name, module.address) - - -@pytest.fixture(scope="module") -def qcm_bb(controller): - return get_qcm_bb(controller) - - -@pytest.fixture(scope="module") -def connected_qcm_bb(connected_controller): - qcm_bb = get_qcm_bb(connected_controller) - for port in PORT_SETTINGS: - qcm_bb.ports(port) - qcm_bb.connect(connected_controller.cluster) - yield qcm_bb - qcm_bb.disconnect() - connected_controller.disconnect() - - -def test_instrument_interface(qcm_bb: QcmBb): - # Test compliance with :class:`qibolab.instruments.abstract.Instrument` interface - for abstract_method in Instrument.__abstractmethods__: - assert hasattr(qcm_bb, abstract_method) - - for attribute in [ - "name", - "address", - "is_connected", - ]: - assert hasattr(qcm_bb, attribute) - - -def test_init(qcm_bb: QcmBb): - assert qcm_bb.device == None - - -def test_setup(qcm_bb: QcmBb): - qcm_bb.setup() - - -@pytest.mark.qpu -def test_connect(connected_qcm_bb: QcmBb): - qcm_bb = connected_qcm_bb - - assert qcm_bb.is_connected - assert not qcm_bb is None - for idx, port in enumerate(qcm_bb._ports): - assert type(qcm_bb._ports[port]) == QbloxOutputPort - assert qcm_bb._ports[port].sequencer_number == idx - - o1_default_sequencer = qcm_bb.device.sequencers[qcm_bb.DEFAULT_SEQUENCERS["o1"]] - o2_default_sequencer = qcm_bb.device.sequencers[qcm_bb.DEFAULT_SEQUENCERS["o2"]] - o3_default_sequencer = qcm_bb.device.sequencers[qcm_bb.DEFAULT_SEQUENCERS["o3"]] - o4_default_sequencer = qcm_bb.device.sequencers[qcm_bb.DEFAULT_SEQUENCERS["o4"]] - for default_sequencer in [ - o1_default_sequencer, - o2_default_sequencer, - o3_default_sequencer, - o4_default_sequencer, - ]: - assert default_sequencer.get("cont_mode_en_awg_path0") == False - assert default_sequencer.get("cont_mode_en_awg_path1") == False - assert default_sequencer.get("cont_mode_waveform_idx_awg_path0") == 0 - assert default_sequencer.get("cont_mode_waveform_idx_awg_path1") == 0 - assert default_sequencer.get("marker_ovr_en") == True - assert default_sequencer.get("marker_ovr_value") == 15 - assert default_sequencer.get("mixer_corr_gain_ratio") == 1 - assert default_sequencer.get("mixer_corr_phase_offset_degree") == 0 - assert default_sequencer.get("offset_awg_path0") == 0 - assert default_sequencer.get("offset_awg_path1") == 0 - assert default_sequencer.get("sync_en") == False - assert default_sequencer.get("upsample_rate_awg_path0") == 0 - assert default_sequencer.get("upsample_rate_awg_path1") == 0 - - assert o1_default_sequencer.get("connect_out0") == "I" - assert o2_default_sequencer.get("connect_out1") == "Q" - assert o3_default_sequencer.get("connect_out2") == "I" - assert o4_default_sequencer.get("connect_out3") == "Q" - - _device_num_sequencers = len(qcm_bb.device.sequencers) - for s in range(4, _device_num_sequencers): - assert qcm_bb.device.sequencers[s].get("connect_out0") == "off" - assert qcm_bb.device.sequencers[s].get("connect_out1") == "off" - assert qcm_bb.device.sequencers[s].get("connect_out2") == "off" - assert qcm_bb.device.sequencers[s].get("connect_out3") == "off" - - o1_default_sequencer = qcm_bb.device.sequencers[qcm_bb.DEFAULT_SEQUENCERS["o1"]] - assert math.isclose(o1_default_sequencer.get("gain_awg_path1"), 1, rel_tol=1e-4) - assert o1_default_sequencer.get("mod_en_awg") == True - assert qcm_bb._ports["o1"].nco_freq == 0 - assert qcm_bb._ports["o1"].nco_phase_offs == 0 - - o2_default_sequencer = qcm_bb.device.sequencers[qcm_bb.DEFAULT_SEQUENCERS["o2"]] - assert math.isclose(o2_default_sequencer.get("gain_awg_path1"), 1, rel_tol=1e-4) - assert o2_default_sequencer.get("mod_en_awg") == True - assert qcm_bb._ports["o2"].nco_freq == 0 - assert qcm_bb._ports["o2"].nco_phase_offs == 0 - - o3_default_sequencer = qcm_bb.device.sequencers[qcm_bb.DEFAULT_SEQUENCERS["o3"]] - assert math.isclose(o3_default_sequencer.get("gain_awg_path1"), 1, rel_tol=1e-4) - assert o3_default_sequencer.get("mod_en_awg") == True - assert qcm_bb._ports["o3"].nco_freq == 0 - assert qcm_bb._ports["o3"].nco_phase_offs == 0 - - o4_default_sequencer = qcm_bb.device.sequencers[qcm_bb.DEFAULT_SEQUENCERS["o4"]] - assert math.isclose(o4_default_sequencer.get("gain_awg_path1"), 1, rel_tol=1e-4) - assert o1_default_sequencer.get("mod_en_awg") == True - assert qcm_bb._ports["o4"].nco_freq == 0 - assert qcm_bb._ports["o4"].nco_phase_offs == 0 - - -@pytest.mark.qpu -def test_pulse_sequence(connected_platform, connected_qcm_bb: QcmBb): - ps = PulseSequence() - ps.append(FluxPulse(40, 70, 0.5, "Rectangular", O1_OUTPUT_CHANNEL)) - ps.append(FluxPulse(0, 50, 0.3, "Rectangular", O2_OUTPUT_CHANNEL)) - ps.append(FluxPulse(20, 100, 0.02, "Rectangular", O3_OUTPUT_CHANNEL)) - ps.append(FluxPulse(32, 48, 0.4, "Rectangular", O4_OUTPUT_CHANNEL)) - qubits = connected_platform.qubits - connected_qcm_bb._ports["o2"].hardware_mod_en = True - connected_qcm_bb.process_pulse_sequence(qubits, ps, 1000, 1, 10000) - connected_qcm_bb.upload() - connected_qcm_bb.play_sequence() - - connected_qcm_bb._ports["o2"].hardware_mod_en = False - connected_qcm_bb.process_pulse_sequence(qubits, ps, 1000, 1, 10000) - connected_qcm_bb.upload() - connected_qcm_bb.play_sequence() - - -@pytest.mark.qpu -def test_sweepers(connected_platform, connected_qcm_bb: QcmBb): - ps = PulseSequence() - ps.append(FluxPulse(40, 70, 0.5, "Rectangular", O1_OUTPUT_CHANNEL)) - ps.append(FluxPulse(0, 50, 0.3, "Rectangular", O2_OUTPUT_CHANNEL)) - ps.append(FluxPulse(20, 100, 0.02, "Rectangular", O3_OUTPUT_CHANNEL)) - ps.append(FluxPulse(32, 48, 0.4, "Rectangular", O4_OUTPUT_CHANNEL)) - qubits = connected_platform.qubits - - amplitude_range = np.linspace(0, 0.25, 50) - sweeper = Sweeper( - Parameter.amplitude, - amplitude_range, - pulses=ps.pulses, - type=SweeperType.OFFSET, - ) - - connected_qcm_bb.process_pulse_sequence( - qubits, ps, 1000, 1, 10000, sweepers=[sweeper] - ) - connected_qcm_bb.upload() - connected_qcm_bb.play_sequence() diff --git a/tests/test_instruments_qblox_cluster_qcm_rf.py b/tests/test_instruments_qblox_cluster_qcm_rf.py deleted file mode 100644 index 3c387c6a45..0000000000 --- a/tests/test_instruments_qblox_cluster_qcm_rf.py +++ /dev/null @@ -1,246 +0,0 @@ -import numpy as np -import pytest - -from qibolab.instruments.abstract import Instrument -from qibolab.instruments.qblox.cluster_qcm_rf import QcmRf -from qibolab.instruments.qblox.port import QbloxOutputPort -from qibolab.sequence import PulseSequence -from qibolab.sweeper import Parameter, Sweeper, SweeperType - -from .qblox_fixtures import connected_controller, controller - -O1_OUTPUT_CHANNEL = "L3-15" -O1_ATTENUATION = 20 -O1_LO_FREQUENCY = 5_052_833_073 - -O2_OUTPUT_CHANNEL = "L3-11" -O2_ATTENUATION = 20 -O2_LO_FREQUENCY = 5_995_371_914 -SETTINGS = { - "o1": { - "attenuation": O1_ATTENUATION, - "lo_frequency": O1_LO_FREQUENCY, - }, - "o2": { - "attenuation": O2_ATTENUATION, - "lo_frequency": O2_LO_FREQUENCY, - }, -} - - -def get_qcm_rf(controller): - for module in controller.modules.values(): - if isinstance(module, QcmRf): - return QcmRf(module.name, module.address) - - -@pytest.fixture(scope="module") -def qcm_rf(controller): - return get_qcm_rf(controller) - - -@pytest.fixture(scope="module") -def connected_qcm_rf(connected_controller): - qcm_rf = get_qcm_rf(connected_controller) - qcm_rf.setup(**SETTINGS) - for port in SETTINGS: - qcm_rf.ports(port) - qcm_rf.connect(connected_controller.cluster) - yield qcm_rf - - qcm_rf.disconnect() - connected_controller.disconnect() - - -def test_instrument_interface(qcm_rf: QcmRf): - # Test compliance with :class:`qibolab.instruments.abstract.Instrument` interface - for abstract_method in Instrument.__abstractmethods__: - assert hasattr(qcm_rf, abstract_method) - - for attribute in [ - "name", - "address", - "is_connected", - ]: - assert hasattr(qcm_rf, attribute) - - -def test_init(qcm_rf: QcmRf): - assert qcm_rf.device == None - assert type(qcm_rf._ports) == dict - - -def test_setup(qcm_rf: QcmRf): - qcm_rf.setup(**SETTINGS) - assert qcm_rf.settings == SETTINGS - - -@pytest.mark.qpu -def test_connect(connected_qcm_rf: QcmRf): - qcm_rf = connected_qcm_rf - - assert qcm_rf.is_connected - assert not qcm_rf is None - # test configuration after connection - assert qcm_rf.device.get("out0_offset_path0") == 0 - assert qcm_rf.device.get("out0_offset_path1") == 0 - assert qcm_rf.device.get("out1_offset_path0") == 0 - assert qcm_rf.device.get("out1_offset_path1") == 0 - - o1_default_sequencer = qcm_rf.device.sequencers[qcm_rf.DEFAULT_SEQUENCERS["o1"]] - o2_default_sequencer = qcm_rf.device.sequencers[qcm_rf.DEFAULT_SEQUENCERS["o2"]] - for default_sequencer in [o1_default_sequencer, o2_default_sequencer]: - assert default_sequencer.get("cont_mode_en_awg_path0") == False - assert default_sequencer.get("cont_mode_en_awg_path1") == False - assert default_sequencer.get("cont_mode_waveform_idx_awg_path0") == 0 - assert default_sequencer.get("cont_mode_waveform_idx_awg_path1") == 0 - assert default_sequencer.get("marker_ovr_en") == True - assert default_sequencer.get("marker_ovr_value") == 15 - assert default_sequencer.get("mixer_corr_gain_ratio") == 1 - assert default_sequencer.get("mixer_corr_phase_offset_degree") == 0 - assert default_sequencer.get("offset_awg_path0") == 0 - assert default_sequencer.get("offset_awg_path1") == 0 - assert default_sequencer.get("sync_en") == False - assert default_sequencer.get("upsample_rate_awg_path0") == 0 - assert default_sequencer.get("upsample_rate_awg_path1") == 0 - - assert o1_default_sequencer.get("connect_out0") == "IQ" - assert o1_default_sequencer.get("connect_out1") == "off" - - assert o2_default_sequencer.get("connect_out1") == "IQ" - assert o2_default_sequencer.get("connect_out0") == "off" - - _device_num_sequencers = len(qcm_rf.device.sequencers) - for s in range(2, _device_num_sequencers): - assert qcm_rf.device.sequencers[s].get("connect_out0") == "off" - assert qcm_rf.device.sequencers[s].get("connect_out1") == "off" - - assert qcm_rf.device.get("out0_att") == O1_ATTENUATION - assert qcm_rf.device.get("out0_lo_en") == True - assert qcm_rf.device.get("out0_lo_freq") == O1_LO_FREQUENCY - assert qcm_rf.device.get("out0_lo_freq") == O1_LO_FREQUENCY - - o1_default_sequencer = qcm_rf.device.sequencers[qcm_rf.DEFAULT_SEQUENCERS["o1"]] - - assert o1_default_sequencer.get("mod_en_awg") == True - - assert qcm_rf._ports["o1"].nco_freq == 0 - assert qcm_rf._ports["o1"].nco_phase_offs == 0 - - assert qcm_rf.device.get("out1_att") == O2_ATTENUATION - assert qcm_rf.device.get("out1_lo_en") == True - assert qcm_rf.device.get("out1_lo_freq") == O2_LO_FREQUENCY - assert qcm_rf.device.get("out1_lo_freq") == O2_LO_FREQUENCY - - o2_default_sequencer = qcm_rf.device.sequencers[qcm_rf.DEFAULT_SEQUENCERS["o2"]] - - assert o2_default_sequencer.get("mod_en_awg") == True - - assert qcm_rf._ports["o2"].nco_freq == 0 - assert qcm_rf._ports["o2"].nco_phase_offs == 0 - - for port in qcm_rf.settings: - assert type(qcm_rf._ports[port]) == QbloxOutputPort - assert type(qcm_rf._sequencers[port]) == list - o1_output_port: QbloxOutputPort = qcm_rf._ports["o1"] - o2_output_port: QbloxOutputPort = qcm_rf._ports["o2"] - assert o1_output_port.sequencer_number == 0 - assert o2_output_port.sequencer_number == 1 - - -@pytest.mark.qpu -def test_pulse_sequence(connected_platform, connected_qcm_rf: QcmRf): - ps = PulseSequence() - ps.append( - DrivePulse( - 0, - 200, - 1, - O1_LO_FREQUENCY - 200e6, - np.pi / 2, - "Gaussian(5)", - O1_OUTPUT_CHANNEL, - ) - ) - ps.append( - DrivePulse( - 0, - 200, - 1, - O2_LO_FREQUENCY - 200e6, - np.pi / 2, - "Gaussian(5)", - O2_OUTPUT_CHANNEL, - ) - ) - - qubits = connected_platform.qubits - connected_qcm_rf._ports["o2"].hardware_mod_en = True - connected_qcm_rf.process_pulse_sequence(qubits, ps, 1000, 1, 10000) - connected_qcm_rf.upload() - connected_qcm_rf.play_sequence() - - connected_qcm_rf._ports["o2"].hardware_mod_en = False - connected_qcm_rf.process_pulse_sequence(qubits, ps, 1000, 1, 10000) - connected_qcm_rf.upload() - connected_qcm_rf.play_sequence() - - -@pytest.mark.qpu -def test_sweepers(connected_platform, connected_qcm_rf: QcmRf): - ps = PulseSequence() - ps.append( - DrivePulse( - 0, - 200, - 1, - O1_LO_FREQUENCY - 200e6, - np.pi / 2, - "Gaussian(5)", - O1_OUTPUT_CHANNEL, - ) - ) - ps.append( - DrivePulse( - 0, - 200, - 1, - O2_LO_FREQUENCY - 200e6, - np.pi / 2, - "Gaussian(5)", - O2_OUTPUT_CHANNEL, - ) - ) - - qubits = connected_platform.qubits - - freq_width = 300e6 * 2 - freq_step = freq_width // 100 - - delta_frequency_range = np.arange(-freq_width // 2, freq_width // 2, freq_step) - sweeper = Sweeper( - Parameter.frequency, - delta_frequency_range, - pulses=ps.pulses, - type=SweeperType.OFFSET, - ) - - connected_qcm_rf.process_pulse_sequence( - qubits, ps, 1000, 1, 10000, sweepers=[sweeper] - ) - connected_qcm_rf.upload() - connected_qcm_rf.play_sequence() - - amplitude_range = np.linspace(0, 1, 50) - sweeper = Sweeper( - Parameter.amplitude, - amplitude_range, - pulses=ps.pulses, - type=SweeperType.ABSOLUTE, - ) - - connected_qcm_rf.process_pulse_sequence( - qubits, ps, 1000, 1, 10000, sweepers=[sweeper] - ) - connected_qcm_rf.upload() - connected_qcm_rf.play_sequence() diff --git a/tests/test_instruments_qblox_cluster_qrm_rf.py b/tests/test_instruments_qblox_cluster_qrm_rf.py deleted file mode 100644 index 158c2c1afd..0000000000 --- a/tests/test_instruments_qblox_cluster_qrm_rf.py +++ /dev/null @@ -1,226 +0,0 @@ -import numpy as np -import pytest - -from qibolab.instruments.abstract import Instrument -from qibolab.instruments.qblox.cluster_qrm_rf import QrmRf -from qibolab.instruments.qblox.port import QbloxInputPort, QbloxOutputPort -from qibolab.sequence import PulseSequence -from qibolab.sweeper import Parameter, Sweeper, SweeperType - -from .qblox_fixtures import connected_controller, controller - -OUTPUT_CHANNEL = "L3-25_a" -INPUT_CHANNEL = "L2-5_a" -ATTENUATION = 38 -LO_FREQUENCY = 7_000_000_000 -TIME_OF_FLIGHT = 500 -ACQUISITION_DURATION = 900 -SETTINGS = { - "o1": { - "attenuation": ATTENUATION, - "lo_frequency": LO_FREQUENCY, - }, - "i1": { - "acquisition_hold_off": TIME_OF_FLIGHT, - "acquisition_duration": ACQUISITION_DURATION, - }, -} - - -def get_qrm_rf(controller): - for module in controller.modules.values(): - if isinstance(module, QrmRf): - return QrmRf(module.name, module.address) - - -@pytest.fixture(scope="module") -def qrm_rf(controller): - return get_qrm_rf(controller) - - -@pytest.fixture(scope="module") -def connected_qrm_rf(connected_controller): - qrm_rf = get_qrm_rf(connected_controller) - qrm_rf.setup(**SETTINGS) - qrm_rf.ports("o1") - qrm_rf.ports("i1", out=False) - qrm_rf.connect(connected_controller.cluster) - - yield qrm_rf - qrm_rf.disconnect() - connected_controller.disconnect() - - -def test_instrument_interface(qrm_rf: QrmRf): - # Test compliance with :class:`qibolab.instruments.abstract.Instrument` interface - for abstract_method in Instrument.__abstractmethods__: - assert hasattr(qrm_rf, abstract_method) - - for attribute in [ - "name", - "address", - "is_connected", - ]: - assert hasattr(qrm_rf, attribute) - - -def test_init(qrm_rf: QrmRf): - assert qrm_rf.device == None - - -def test_setup(qrm_rf: QrmRf): - qrm_rf.setup(**SETTINGS) - assert qrm_rf.settings == SETTINGS - - -@pytest.mark.qpu -def test_connect(connected_qrm_rf: QrmRf): - qrm_rf = connected_qrm_rf - - assert qrm_rf.is_connected - assert not qrm_rf is None - # test configuration after connection - assert qrm_rf.device.get("in0_att") == 0 - assert qrm_rf.device.get("out0_offset_path0") == 0 - assert qrm_rf.device.get("out0_offset_path1") == 0 - assert qrm_rf.device.get("scope_acq_avg_mode_en_path0") == True - assert qrm_rf.device.get("scope_acq_avg_mode_en_path1") == True - assert ( - qrm_rf.device.get("scope_acq_sequencer_select") - == qrm_rf.DEFAULT_SEQUENCERS["i1"] - ) - assert qrm_rf.device.get("scope_acq_trigger_level_path0") == 0 - assert qrm_rf.device.get("scope_acq_trigger_level_path1") == 0 - assert qrm_rf.device.get("scope_acq_trigger_mode_path0") == "sequencer" - assert qrm_rf.device.get("scope_acq_trigger_mode_path1") == "sequencer" - - default_sequencer = qrm_rf.device.sequencers[qrm_rf.DEFAULT_SEQUENCERS["o1"]] - assert default_sequencer.get("connect_out0") == "IQ" - assert default_sequencer.get("connect_acq") == "in0" - assert default_sequencer.get("cont_mode_en_awg_path0") == False - assert default_sequencer.get("cont_mode_en_awg_path1") == False - assert default_sequencer.get("cont_mode_waveform_idx_awg_path0") == 0 - assert default_sequencer.get("cont_mode_waveform_idx_awg_path1") == 0 - assert default_sequencer.get("marker_ovr_en") == True - assert default_sequencer.get("marker_ovr_value") == 15 - assert default_sequencer.get("mixer_corr_gain_ratio") == 1 - assert default_sequencer.get("mixer_corr_phase_offset_degree") == 0 - assert default_sequencer.get("offset_awg_path0") == 0 - assert default_sequencer.get("offset_awg_path1") == 0 - assert default_sequencer.get("sync_en") == False - assert default_sequencer.get("upsample_rate_awg_path0") == 0 - assert default_sequencer.get("upsample_rate_awg_path1") == 0 - - _device_num_sequencers = len(qrm_rf.device.sequencers) - for s in range(1, _device_num_sequencers): - assert qrm_rf.device.sequencers[s].get("connect_out0") == "off" - assert qrm_rf.device.sequencers[s].get("connect_acq") == "off" - - assert qrm_rf.device.get("out0_att") == ATTENUATION - assert qrm_rf.device.get("out0_in0_lo_en") == True - assert qrm_rf.device.get("out0_in0_lo_freq") == LO_FREQUENCY - assert qrm_rf.device.get("out0_in0_lo_freq") == LO_FREQUENCY - - default_sequencer = qrm_rf.device.sequencers[qrm_rf.DEFAULT_SEQUENCERS["o1"]] - - assert default_sequencer.get("mod_en_awg") == True - - assert qrm_rf._ports["o1"].nco_freq == 0 - assert qrm_rf._ports["o1"].nco_phase_offs == 0 - - assert default_sequencer.get("demod_en_acq") == True - - assert qrm_rf._ports["i1"].acquisition_hold_off == TIME_OF_FLIGHT - assert qrm_rf._ports["i1"].acquisition_duration == ACQUISITION_DURATION - assert type(qrm_rf._ports["o1"]) == QbloxOutputPort - assert type(qrm_rf._ports["i1"]) == QbloxInputPort - output_port: QbloxOutputPort = qrm_rf._ports["o1"] - assert output_port.sequencer_number == 0 - input_port: QbloxInputPort = qrm_rf._ports["i1"] - assert input_port.input_sequencer_number == 0 - assert input_port.output_sequencer_number == 0 - - -@pytest.mark.qpu -def test_pulse_sequence(connected_platform, connected_qrm_rf: QrmRf): - ps = PulseSequence() - for channel in connected_qrm_rf.channel_map: - ps.append(DrivePulse(0, 200, 1, 6.8e9, np.pi / 2, "Gaussian(5)", channel)) - ps.append( - ReadoutPulse( - 200, 2000, 1, 7.1e9, np.pi / 2, "Rectangular()", channel, qubit=0 - ) - ) - ps.append( - ReadoutPulse( - 200, 2000, 1, 7.2e9, np.pi / 2, "Rectangular()", channel, qubit=1 - ) - ) - qubits = connected_platform.qubits - connected_qrm_rf._ports["i1"].hardware_demod_en = True - connected_qrm_rf.process_pulse_sequence(qubits, ps, 1000, 1, 10000) - connected_qrm_rf.upload() - connected_qrm_rf.play_sequence() - results = connected_qrm_rf.acquire() - connected_qrm_rf._ports["i1"].hardware_demod_en = False - connected_qrm_rf.process_pulse_sequence(qubits, ps, 1000, 1, 10000) - connected_qrm_rf.upload() - connected_qrm_rf.play_sequence() - results = connected_qrm_rf.acquire() - - -@pytest.mark.qpu -def test_sweepers(connected_platform, connected_qrm_rf: QrmRf): - ps = PulseSequence() - qd_pulses = {} - ro_pulses = {} - for channel in connected_qrm_rf.channel_map: - qd_pulses[0] = DrivePulse( - 0, 200, 1, 7e9, np.pi / 2, "Gaussian(5)", channel, qubit=0 - ) - ro_pulses[0] = ReadoutPulse( - 200, 2000, 1, 7.1e9, np.pi / 2, "Rectangular()", channel, qubit=0 - ) - ro_pulses[1] = ReadoutPulse( - 200, 2000, 1, 7.2e9, np.pi / 2, "Rectangular()", channel, qubit=1 - ) - ps.append(qd_pulses[0], ro_pulses[0], ro_pulses[1]) - - qubits = connected_platform.qubits - - freq_width = 300e6 * 2 - freq_step = freq_width // 100 - - delta_frequency_range = np.arange(-freq_width // 2, freq_width // 2, freq_step) - sweeper = Sweeper( - Parameter.frequency, - delta_frequency_range, - pulses=ro_pulses, - type=SweeperType.OFFSET, - ) - - connected_qrm_rf.process_pulse_sequence( - qubits, ps, 1000, 1, 10000, sweepers=[sweeper] - ) - connected_qrm_rf.upload() - connected_qrm_rf.play_sequence() - results = connected_qrm_rf.acquire() - - delta_duration_range = np.arange(0, 140, 1) - sweeper = Sweeper( - Parameter.duration, - delta_duration_range, - pulses=qd_pulses, - type=SweeperType.ABSOLUTE, - ) - - connected_qrm_rf.process_pulse_sequence( - qubits, ps, 1000, 1, 10000, sweepers=[sweeper] - ) - connected_qrm_rf.upload() - connected_qrm_rf.play_sequence() - results = connected_qrm_rf.acquire() - - -def test_process_acquisition_results(): - pass diff --git a/tests/test_instruments_qblox_controller.py b/tests/test_instruments_qblox_controller.py deleted file mode 100644 index 9fd211d6e8..0000000000 --- a/tests/test_instruments_qblox_controller.py +++ /dev/null @@ -1,86 +0,0 @@ -from unittest.mock import Mock - -import numpy as np -import pytest - -from qibolab import AveragingMode, ExecutionParameters -from qibolab.instruments.qblox.controller import MAX_NUM_BINS, QbloxController -from qibolab.pulses import Gaussian, Pulse, Rectangular -from qibolab.sequence import PulseSequence -from qibolab.sweeper import Parameter, Sweeper - -from .qblox_fixtures import connected_controller, controller - - -def test_init(controller: QbloxController): - assert controller.is_connected is False - assert type(controller.modules) == dict - assert controller.cluster == None - assert controller._reference_clock in ["internal", "external"] - - -def test_sweep_too_many_bins(platform, controller): - """Sweeps that require more bins than the hardware supports should be split - and executed.""" - qubit = platform.qubits[0] - pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Gaussian(5), qubit.drive.name, qubit=0) - ro_pulse = Pulse( - 0, - 40, - 0.05, - int(3e9), - 0.0, - Rectangular(), - qubit.readout.name, - PulseType.READOUT, - qubit=0, - ) - sequence = PulseSequence([pulse, ro_pulse]) - - # These values shall result into execution in two rounds - shots = 128 - sweep_len = (MAX_NUM_BINS + 431) // shots - - mock_data = np.array([1, 2, 3, 4]) - sweep_ampl = Sweeper(Parameter.amplitude, np.random.rand(sweep_len), pulses=[pulse]) - params = ExecutionParameters( - nshots=shots, relaxation_time=10, averaging_mode=AveragingMode.SINGLESHOT - ) - controller._execute_pulse_sequence = Mock( - return_value={ro_pulse.id: IntegratedResults(mock_data)} - ) - res = controller.sweep( - {0: platform.qubits[0]}, platform.couplers, sequence, params, sweep_ampl - ) - expected_data = np.append(mock_data, mock_data) # - assert np.array_equal(res[ro_pulse.id].voltage, expected_data) - - -def test_sweep_too_many_sweep_points(platform, controller): - """Sweeps that require too many bins because simply the number of sweep - points is too large should be rejected.""" - qubit = platform.qubits[0] - pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Gaussian(5), qubit.drive.name, qubit=0) - sweep = Sweeper( - Parameter.amplitude, np.random.rand(MAX_NUM_BINS + 17), pulses=[pulse] - ) - params = ExecutionParameters(nshots=12, relaxation_time=10) - with pytest.raises(ValueError, match="total number of sweep points"): - controller.sweep({0: qubit}, {}, PulseSequence([pulse]), params, sweep) - - -@pytest.mark.qpu -def connect(connected_controller: QbloxController): - connected_controller.connect() - assert connected_controller.is_connected - for module in connected_controller.modules.values(): - assert module.is_connected - - -@pytest.mark.qpu -def disconnect(connected_controller: QbloxController): - connected_controller.connect() - connected_controller.disconnect() - assert connected_controller.is_connected is False - for module in connected_controller.modules.values(): - assert module.is_connected is False diff --git a/tests/test_instruments_qblox_debug.py b/tests/test_instruments_qblox_debug.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/test_instruments_qblox_port.py b/tests/test_instruments_qblox_port.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/test_instruments_qblox_q1asm.py b/tests/test_instruments_qblox_q1asm.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/test_instruments_qblox_sequencer.py b/tests/test_instruments_qblox_sequencer.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/test_instruments_qm.py b/tests/test_instruments_qm.py deleted file mode 100644 index 658a64abeb..0000000000 --- a/tests/test_instruments_qm.py +++ /dev/null @@ -1,507 +0,0 @@ -from unittest.mock import patch - -import numpy as np -import pytest - -qua = pytest.importorskip("qm.qua") - -# ruff: noqa: E402 -from qibolab import AcquisitionType, ExecutionParameters, create_platform -from qibolab.instruments.qm import QmController -from qibolab.pulses import Pulse, Rectangular -from qibolab.qubits import Qubit -from qibolab.sequence import PulseSequence -from qibolab.sweeper import Parameter, Sweeper - -from .conftest import set_platform_profile - - -def test_qmpulse(): - pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), "ch0", qubit=0) - qmpulse = QMPulse(pulse) - assert qmpulse.operation == "drive(40, 0.05, Rectangular())" - assert qmpulse.relative_phase == 0 - - -@pytest.mark.parametrize("acquisition_type", AcquisitionType) -def test_qmpulse_declare_output(acquisition_type): - options = ExecutionParameters(acquisition_type=acquisition_type) - pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), "ch0", qubit=0) - qmpulse = QMPulse(pulse) - qubits = {0: Qubit(0, threshold=0.1, iq_angle=0.2)} - if acquisition_type is AcquisitionType.SPECTROSCOPY: - with pytest.raises(KeyError): - with qua.program() as _: - declare_acquisitions([qmpulse], qubits, options) - else: - with qua.program() as _: - declare_acquisitions([qmpulse], qubits, options) - acquisition = qmpulse.acquisition - assert isinstance(acquisition, Acquisition) - if acquisition_type is AcquisitionType.DISCRIMINATION: - assert acquisition.threshold == 0.1 - assert acquisition.cos == np.cos(0.2) - assert acquisition.sin == np.sin(0.2) - assert isinstance(acquisition.shot, qua._dsl._Variable) - assert isinstance(acquisition.shots, qua._dsl._ResultSource) - elif acquisition_type is AcquisitionType.INTEGRATION: - assert isinstance(acquisition.i, qua._dsl._Variable) - assert isinstance(acquisition.q, qua._dsl._Variable) - assert isinstance(acquisition.istream, qua._dsl._ResultSource) - assert isinstance(acquisition.qstream, qua._dsl._ResultSource) - elif acquisition_type is AcquisitionType.RAW: - assert isinstance(acquisition.adc_stream, qua._dsl._ResultSource) - - -def test_qmsequence(): - qd_pulse = Pulse( - 0, 40, 0.05, int(3e9), 0.0, Rectangular(), "ch0", PulseType.DRIVE, qubit=0 - ) - ro_pulse = Pulse( - 0, 40, 0.05, int(3e9), 0.0, Rectangular(), "ch1", PulseType.READOUT, qubit=0 - ) - qmsequence = Sequence() - with pytest.raises(AttributeError): - qmsequence.add("test") - qmsequence.add(QMPulse(qd_pulse)) - qmsequence.add(QMPulse(ro_pulse)) - assert len(qmsequence.pulse_to_qmpulse) == 2 - assert len(qmsequence.qmpulses) == 2 - - -def test_qmpulse_previous_and_next(): - nqubits = 5 - qmsequence = Sequence() - qd_qmpulses = [] - ro_qmpulses = [] - for qubit in range(nqubits): - qd_pulse = QMPulse( - Pulse( - 0, 40, 0.05, int(3e9), 0.0, Rectangular(), f"drive{qubit}", qubit=qubit - ) - ) - qd_qmpulses.append(qd_pulse) - qmsequence.add(qd_pulse) - for qubit in range(nqubits): - ro_pulse = QMPulse( - Pulse( - 40, - 100, - 0.05, - int(3e9), - 0.0, - Rectangular(), - f"readout{qubit}", - PulseType.READOUT, - qubit=qubit, - ) - ) - ro_qmpulses.append(ro_pulse) - qmsequence.add(ro_pulse) - - for qd_qmpulse, ro_qmpulse in zip(qd_qmpulses, ro_qmpulses): - assert len(qd_qmpulse.next_) == 1 - assert len(ro_qmpulse.next_) == 0 - - -def test_qmpulse_previous_and_next_flux(): - y90_pulse = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), f"drive1", qubit=1) - x_pulse_start = Pulse(0, 40, 0.05, int(3e9), 0.0, Rectangular(), f"drive2", qubit=2) - flux_pulse = Pulse.flux( - start=y90_pulse.finish, - duration=30, - amplitude=0.055, - shape=Rectangular(), - channel="flux2", - qubit=2, - ) - theta_pulse = Pulse(70, 40, 0.05, int(3e9), 0.0, Rectangular(), f"drive1", qubit=1) - x_pulse_end = Pulse(70, 40, 0.05, int(3e9), 0.0, Rectangular(), f"drive2", qubit=2) - - measure_lowfreq = Pulse( - 110, - 100, - 0.05, - int(3e9), - 0.0, - Rectangular(), - "readout1", - PulseType.READOUT, - qubit=1, - ) - measure_highfreq = Pulse( - 110, - 100, - 0.05, - int(3e9), - 0.0, - Rectangular(), - "readout2", - PulseType.READOUT, - qubit=2, - ) - - drive11 = QMPulse(y90_pulse) - drive21 = QMPulse(x_pulse_start) - flux2 = QMPulse(flux_pulse) - drive12 = QMPulse(theta_pulse) - drive22 = QMPulse(x_pulse_end) - measure1 = QMPulse(measure_lowfreq) - measure2 = QMPulse(measure_highfreq) - - qmsequence = Sequence() - qmsequence.add(drive11) - qmsequence.add(drive21) - qmsequence.add(flux2) - qmsequence.add(drive12) - qmsequence.add(drive22) - qmsequence.add(measure1) - qmsequence.add(measure2) - assert drive11.next_ == set() - assert drive21.next_ == {flux2} - assert flux2.next_ == {drive12, drive22} - assert drive12.next_ == {measure1} - assert drive22.next_ == {measure2} - - -@pytest.fixture -def qmcontroller(): - name = "test" - address = "0.0.0.0:0" - return QmController(name, address) - - -@pytest.mark.parametrize("offset", [0.0, 0.005]) -def test_qm_register_port(qmcontroller, offset): - port = qmcontroller.ports((("con1", 1),)) - port.offset = offset - qmcontroller.config.register_port(port) - controllers = qmcontroller.config.controllers - assert controllers == { - "con1": { - "analog_inputs": {1: {}, 2: {}}, - "analog_outputs": {1: {"offset": offset, "filter": {}}}, - "digital_outputs": {}, - } - } - - -def test_qm_register_port_filter(qmcontroller): - port = qmcontroller.ports((("con1", 2),)) - port.offset = 0.005 - port.filter = {"feedforward": [1, -1], "feedback": [0.95]} - qmcontroller.config.register_port(port) - controllers = qmcontroller.config.controllers - assert controllers == { - "con1": { - "analog_inputs": {1: {}, 2: {}}, - "analog_outputs": { - 2: { - "filter": {"feedback": [0.95], "feedforward": [1, -1]}, - "offset": 0.005, - } - }, - "digital_outputs": {}, - } - } - - -@pytest.fixture(params=["qm", "qm_octave"]) -def qmplatform(request): - set_platform_profile() - return create_platform(request.param) - - -# TODO: Test connect/disconnect - - -def test_qm_setup(qmplatform): - platform = qmplatform - controller = platform.instruments["qm"] - assert controller.time_of_flight == 280 - - -def test_qm_register_drive_element(qmplatform): - platform = qmplatform - controller = platform.instruments["qm"] - controller.config.register_drive_element( - platform.qubits[0], intermediate_frequency=int(1e6) - ) - assert "drive0" in controller.config.elements - if platform.name == "qm": - target_element = { - "mixInputs": { - "I": ("con3", 2), - "Q": ("con3", 1), - "lo_frequency": 4700000000, - "mixer": "mixer_drive0", - }, - "intermediate_frequency": 1000000, - "operations": {}, - } - assert controller.config.elements["drive0"] == target_element - target_mixer = [ - { - "intermediate_frequency": 1000000, - "lo_frequency": 4700000000, - "correction": [1.0, 0.0, 0.0, 1.0], - } - ] - assert controller.config.mixers["mixer_drive0"] == target_mixer - else: - target_element = { - "RF_inputs": {"port": ("octave3", 1)}, - "digitalInputs": { - "output_switch": {"buffer": 18, "delay": 57, "port": ("con3", 1)} - }, - "intermediate_frequency": 1000000, - "operations": {}, - } - assert controller.config.elements["drive0"] == target_element - assert "mixer_drive0" not in controller.config.mixers - - -def test_qm_register_readout_element(qmplatform): - platform = qmplatform - controller = platform.instruments["qm"] - controller.config.register_readout_element( - platform.qubits[2], int(1e6), controller.time_of_flight, controller.smearing - ) - assert "readout2" in controller.config.elements - if platform.name == "qm": - target_element = { - "mixInputs": { - "I": ("con2", 10), - "Q": ("con2", 9), - "lo_frequency": 7900000000, - "mixer": "mixer_readout2", - }, - "intermediate_frequency": 1000000, - "operations": {}, - "outputs": { - "out1": ("con2", 2), - "out2": ("con2", 1), - }, - "time_of_flight": 280, - "smearing": 0, - } - assert controller.config.elements["readout2"] == target_element - target_mixer = [ - { - "intermediate_frequency": 1000000, - "lo_frequency": 7900000000, - "correction": [1.0, 0.0, 0.0, 1.0], - } - ] - assert controller.config.mixers["mixer_readout2"] == target_mixer - else: - target_element = { - "RF_inputs": {"port": ("octave2", 5)}, - "RF_outputs": {"port": ("octave2", 1)}, - "digitalInputs": { - "output_switch": {"buffer": 18, "delay": 57, "port": ("con2", 9)} - }, - "intermediate_frequency": 1000000, - "operations": {}, - "time_of_flight": 280, - "smearing": 0, - } - assert controller.config.elements["readout2"] == target_element - assert "mixer_readout2" not in controller.config.mixers - - -@pytest.mark.parametrize("pulse_type,qubit", [("drive", 2), ("readout", 1)]) -def test_qm_register_pulse(qmplatform, pulse_type, qubit): - platform = qmplatform - controller = platform.instruments["qm"] - if pulse_type == "drive": - pulse = platform.create_RX_pulse(qubit, start=0) - target_pulse = { - "operation": "control", - "length": pulse.duration, - "digital_marker": "ON", - "waveforms": { - "I": hash(pulse.envelope_waveform_i().tobytes()), - "Q": hash(pulse.envelope_waveform_q().tobytes()), - }, - } - - else: - pulse = platform.create_MZ_pulse(qubit, start=0) - target_pulse = { - "operation": "measurement", - "length": pulse.duration, - "waveforms": {"I": "constant_wf0.003575", "Q": "zero_wf"}, - "digital_marker": "ON", - "integration_weights": { - "cos": "cosine_weights1", - "minus_sin": "minus_sine_weights1", - "sin": "sine_weights1", - }, - } - - controller.config.register_element( - platform.qubits[qubit], pulse, controller.time_of_flight, controller.smearing - ) - qmpulse = QMPulse(pulse) - controller.config.register_pulse(platform.qubits[qubit], qmpulse) - assert controller.config.pulses[qmpulse.operation] == target_pulse - assert target_pulse["waveforms"]["I"] in controller.config.waveforms - assert target_pulse["waveforms"]["Q"] in controller.config.waveforms - - -def test_qm_register_flux_pulse(qmplatform): - qubit = 2 - platform = qmplatform - controller = platform.instruments["qm"] - pulse = Pulse.flux( - 0, - 30, - 0.005, - Rectangular(), - channel=platform.qubits[qubit].flux.name, - qubit=qubit, - ) - target_pulse = { - "operation": "control", - "length": pulse.duration, - "waveforms": {"single": "constant_wf0.005"}, - } - qmpulse = QMPulse(pulse) - controller.config.register_element(platform.qubits[qubit], pulse) - controller.config.register_pulse(platform.qubits[qubit], qmpulse) - assert controller.config.pulses[qmpulse.operation] == target_pulse - assert target_pulse["waveforms"]["single"] in controller.config.waveforms - - -def test_qm_register_pulses_with_different_frequencies(qmplatform): - platform = qmplatform - controller = platform.instruments["qm"] - qubit = next(iter(platform.qubits.keys())) - qd_pulse1 = platform.create_RX_pulse(qubit, start=0) - qd_pulse2 = platform.create_RX_pulse(qubit, start=qd_pulse1.finish) - qd_pulse2.frequency = qd_pulse2.frequency - int(5e6) - ro_pulse1 = platform.create_MZ_pulse(qubit, start=qd_pulse2.finish) - ro_pulse2 = platform.create_MZ_pulse(qubit, start=qd_pulse2.finish) - ro_pulse2.frequency = ro_pulse2.frequency + int(5e6) - - sequence = PulseSequence() - sequence.add(qd_pulse1) - sequence.add(qd_pulse2) - sequence.add(ro_pulse1) - sequence.add(ro_pulse2) - - if qmplatform.name == "qm_octave": - qmsequence, ro_pulses = controller.create_sequence( - platform.qubits, sequence, [] - ) - assert len(qmsequence.qmpulses) == 4 - elements = {qmpulse.element for qmpulse in qmsequence.qmpulses} - assert len(elements) == 4 - for element in elements: - if "readout" in element: - assert ( - controller.config.elements[element]["RF_inputs"] - == controller.config.elements["readout0"]["RF_inputs"] - ) - assert ( - controller.config.elements[element]["RF_outputs"] - == controller.config.elements["readout0"]["RF_outputs"] - ) - else: - assert ( - controller.config.elements[element]["RF_inputs"] - == controller.config.elements["drive0"]["RF_inputs"] - ) - else: - with pytest.raises(NotImplementedError): - qmsequence, ro_pulses = controller.create_sequence( - platform.qubits, sequence, [] - ) - - -@pytest.mark.parametrize("duration", [0, 30]) -def test_qm_register_baked_pulse(qmplatform, duration): - platform = qmplatform - qubit = platform.qubits[3] - controller = platform.instruments["qm"] - controller.config.register_flux_element(qubit) - pulse = Pulse.flux( - 3, duration, 0.05, Rectangular(), channel=qubit.flux.name, qubit=qubit.name - ) - qmpulse = BakedPulse(pulse) - config = controller.config - qmpulse.bake(config, [pulse.duration]) - - assert config.elements["flux3"]["operations"] == { - "baked_Op_0": "flux3_baked_pulse_0" - } - if duration == 0: - assert config.pulses["flux3_baked_pulse_0"] == { - "operation": "control", - "length": 16, - "waveforms": {"single": "flux3_baked_wf_0"}, - } - assert config.waveforms["flux3_baked_wf_0"] == { - "type": "arbitrary", - "samples": 16 * [0], - "is_overridable": False, - } - else: - assert config.pulses["flux3_baked_pulse_0"] == { - "operation": "control", - "length": 32, - "waveforms": {"single": "flux3_baked_wf_0"}, - } - assert config.waveforms["flux3_baked_wf_0"] == { - "type": "arbitrary", - "samples": 30 * [0.05] + 2 * [0], - "is_overridable": False, - } - - -@patch("qibolab.instruments.qm.QmController.execute_program") -def test_qm_qubit_spectroscopy(mocker, qmplatform): - platform = qmplatform - controller = platform.instruments["qm"] - # disable program dump otherwise it will fail if we don't connect - controller.script_file_name = None - sequence = PulseSequence() - qd_pulses = {} - ro_pulses = {} - for qubit in [1, 2, 3]: - qd_pulses[qubit] = platform.create_qubit_drive_pulse( - qubit, start=0, duration=500 - ) - ro_pulses[qubit] = platform.create_qubit_readout_pulse( - qubit, start=qd_pulses[qubit].finish - ) - sequence.append(qd_pulses[qubit]) - sequence.append(ro_pulses[qubit]) - options = ExecutionParameters(nshots=1024, relaxation_time=100000) - result = controller.play(platform.qubits, platform.couplers, sequence, options) - - -@patch("qibolab.instruments.qm.QmController.execute_program") -def test_qm_duration_sweeper(mocker, qmplatform): - platform = qmplatform - controller = platform.instruments["qm"] - # disable program dump otherwise it will fail if we don't connect - controller.script_file_name = None - qubit = 1 - sequence = PulseSequence() - qd_pulse = platform.create_RX_pulse(qubit, start=0) - sequence.append(qd_pulse) - sequence.append(platform.create_MZ_pulse(qubit, start=qd_pulse.finish)) - sweeper = Sweeper(Parameter.duration, np.arange(2, 12, 2), pulses=[qd_pulse]) - options = ExecutionParameters(nshots=1024, relaxation_time=100000) - if platform.name == "qm": - result = controller.sweep( - platform.qubits, platform.couplers, sequence, options, sweeper - ) - else: - with pytest.raises(ValueError): - # TODO: Figure what is wrong with baking and Octaves - result = controller.sweep( - platform.qubits, platform.couplers, sequence, options, sweeper - ) diff --git a/tests/test_instruments_qmsim.py b/tests/test_instruments_qmsim.py deleted file mode 100644 index e3dd2b4ae4..0000000000 --- a/tests/test_instruments_qmsim.py +++ /dev/null @@ -1,531 +0,0 @@ -"""Test compilation of different pulse sequences using the Quantum Machines -simulator. - -In order to run these tests, provide the following options through the ``pytest`` parser: - address (str): token for the QM simulator - simulation-duration (int): Duration for the simulation in ns. - folder (str): Optional folder to save the generated waveforms for each test. -If a folder is provided the waveforms will be generated and saved during the first run. -For every other run, the generated waveforms will be compared with the saved ones and errors -will be raised if there is disagreement. -If an error is raised or a waveform is generated for the first time, a plot will also be -created so that the user can check if the waveform looks as expected. -""" - -import os - -import h5py -import matplotlib.pyplot as plt -import numpy as np -import pytest -from qibo import gates -from qibo.models import Circuit - -from qibolab import AcquisitionType, AveragingMode, ExecutionParameters, create_platform -from qibolab.backends import QibolabBackend -from qibolab.pulses import Pulse, Rectangular, Snz -from qibolab.sequence import PulseSequence -from qibolab.sweeper import Parameter, Sweeper - -from .conftest import set_platform_profile - - -@pytest.fixture(scope="module") -def simulator(request): - """Platform using the QM cloud simulator. - - Requires the address for connecting to the simulator, which is - provided via command line. If an address is not provided these tests - are skipped. - """ - set_platform_profile() - address = request.config.getoption("--address") - if address is None: - pytest.skip("Skipping QM simulator tests because address was not provided.") - - platform = create_platform("qm") - controller = platform.instruments["qm"] - controller.simulation_duration = request.config.getoption("--simulation-duration") - controller.time_of_flight = 280 - # controller.cloud = True - - platform.connect() - yield platform - platform.disconnect() - - -@pytest.fixture(scope="module") -def folder(request): - return request.config.getoption("--folder") - - -def assert_regression(samples, folder=None, filename=None): - """Assert that simulated data agree with the saved regression. - - If a regression does not exist it is created and the corresponding - waveforms are plotted, so that the user can confirm that they look - as expected. - - Args: - samples (dict): Dictionary holding the waveforms as returned by the QM simulator. - filename (str): Name of the file that contains the regressions to compare with. - """ - - def plot(): - plt.figure() - plt.title(filename) - for con in ["con1", "con2", "con3"]: - if hasattr(samples, con): - sample = getattr(samples, con) - sample.plot() - plt.show() - - if folder is None: - plot() - else: - path = os.path.join(folder, f"{filename}.hdf5") - if os.path.exists(path): - file = h5py.File(path, "r") - for con, target_data in file.items(): - sample = getattr(samples, con) - for port, target_waveform in target_data.items(): - waveform = sample.analog[port] - try: - np.testing.assert_allclose(waveform, target_waveform[:]) - except AssertionError as exception: - np.savetxt(os.path.join(folder, "waveform.txt"), waveform) - np.savetxt( - os.path.join(folder, "target_waveform.txt"), - target_waveform[:], - ) - plot() - raise exception - - else: - plot() - if not os.path.exists(folder): - os.mkdir(folder) - file = h5py.File(path, "w") - # TODO: Generalize for arbitrary number of controllers - for con in ["con1", "con2", "con3"]: - if hasattr(samples, con): - sample = getattr(samples, con) - group = file.create_group(con) - for port, waveform in sample.analog.items(): - group.create_dataset(port, data=waveform, compression="gzip") - - -def test_qmsim_resonator_spectroscopy(simulator, folder): - qubits = list(range(simulator.nqubits)) - sequence = PulseSequence() - ro_pulses = {} - for qubit in qubits: - ro_pulses[qubit] = simulator.create_qubit_readout_pulse(qubit, start=0) - sequence.append(ro_pulses[qubit]) - options = ExecutionParameters(nshots=1) - result = simulator.execute_pulse_sequence(sequence, options) - samples = result.get_simulated_samples() - assert_regression(samples, folder, "resonator_spectroscopy") - - -def test_qmsim_qubit_spectroscopy(simulator, folder): - qubits = list(range(simulator.nqubits)) - sequence = PulseSequence() - qd_pulses = {} - ro_pulses = {} - for qubit in qubits: - qd_pulses[qubit] = simulator.create_qubit_drive_pulse( - qubit, start=0, duration=500 - ) - qd_pulses[qubit].amplitude = 0.05 - ro_pulses[qubit] = simulator.create_qubit_readout_pulse( - qubit, start=qd_pulses[qubit].finish - ) - sequence.append(qd_pulses[qubit]) - sequence.append(ro_pulses[qubit]) - options = ExecutionParameters(nshots=1) - result = simulator.execute_pulse_sequence(sequence, options) - samples = result.get_simulated_samples() - assert_regression(samples, folder, "qubit_spectroscopy") - - -@pytest.mark.parametrize( - "parameter,values", - [ - (Parameter.frequency, np.array([0, 1e6])), - (Parameter.amplitude, np.array([0.5, 1.0])), - (Parameter.relative_phase, np.array([0, 1.0])), - ], -) -def test_qmsim_sweep(simulator, folder, parameter, values): - qubits = list(range(simulator.nqubits)) - sequence = PulseSequence() - qd_pulses = {} - ro_pulses = {} - for qubit in qubits: - qd_pulses[qubit] = simulator.create_RX_pulse(qubit, start=0) - ro_pulses[qubit] = simulator.create_MZ_pulse( - qubit, start=qd_pulses[qubit].finish - ) - sequence.append(qd_pulses[qubit]) - sequence.append(ro_pulses[qubit]) - pulses = [qd_pulses[qubit] for qubit in qubits] - sweeper = Sweeper(parameter, values, pulses) - options = ExecutionParameters( - nshots=1, - relaxation_time=20, - acquisition_type=AcquisitionType.INTEGRATION, - averaging_mode=AveragingMode.CYCLIC, - ) - result = simulator.sweep(sequence, options, sweeper) - samples = result.get_simulated_samples() - assert_regression(samples, folder, f"sweep_{parameter.name}") - - -def test_qmsim_sweep_bias(simulator, folder): - qubits = list(range(simulator.nqubits)) - sequence = PulseSequence() - ro_pulses = {} - for qubit in qubits: - ro_pulses[qubit] = simulator.create_MZ_pulse(qubit, start=0) - sequence.append(ro_pulses[qubit]) - values = [0, 0.005] - sweeper = Sweeper( - Parameter.bias, values, qubits=[simulator.qubits[q] for q in qubits] - ) - options = ExecutionParameters( - nshots=1, - relaxation_time=20, - acquisition_type=AcquisitionType.INTEGRATION, - averaging_mode=AveragingMode.CYCLIC, - ) - result = simulator.sweep(sequence, options, sweeper) - samples = result.get_simulated_samples() - assert_regression(samples, folder, "sweep_bias") - - -def test_qmsim_sweep_start(simulator, folder): - qubits = list(range(simulator.nqubits)) - sequence = PulseSequence() - qd_pulses = {} - ro_pulses = {} - for qubit in qubits: - qd_pulses[qubit] = simulator.create_RX_pulse(qubit, start=0) - ro_pulses[qubit] = simulator.create_MZ_pulse( - qubit, start=qd_pulses[qubit].finish - ) - sequence.append(qd_pulses[qubit]) - sequence.append(ro_pulses[qubit]) - values = [20, 40] - pulses = [ro_pulses[qubit] for qubit in qubits] - sweeper = Sweeper(Parameter.start, values, pulses=pulses) - options = ExecutionParameters( - nshots=1, - relaxation_time=0, - acquisition_type=AcquisitionType.INTEGRATION, - averaging_mode=AveragingMode.CYCLIC, - ) - result = simulator.sweep(sequence, options, sweeper) - samples = result.get_simulated_samples() - assert_regression(samples, folder, "sweep_start") - - -def test_qmsim_sweep_start_two_pulses(simulator, folder): - qubits = list(range(simulator.nqubits)) - sequence = PulseSequence() - qd_pulses1 = {} - qd_pulses2 = {} - ro_pulses = {} - for qubit in qubits: - qd_pulses1[qubit] = simulator.create_RX_pulse(qubit, start=0) - qd_pulses2[qubit] = simulator.create_RX_pulse( - qubit, start=qd_pulses1[qubit].finish - ) - ro_pulses[qubit] = simulator.create_MZ_pulse( - qubit, start=qd_pulses2[qubit].finish - ) - sequence.append(qd_pulses1[qubit]) - sequence.append(qd_pulses2[qubit]) - sequence.append(ro_pulses[qubit]) - values = [20, 60] - pulses = [qd_pulses2[qubit] for qubit in qubits] - sweeper = Sweeper(Parameter.start, values, pulses=pulses) - options = ExecutionParameters( - nshots=1, - relaxation_time=0, - acquisition_type=AcquisitionType.INTEGRATION, - averaging_mode=AveragingMode.CYCLIC, - ) - result = simulator.sweep(sequence, options, sweeper) - samples = result.get_simulated_samples() - assert_regression(samples, folder, "sweep_start_two_pulses") - - -def test_qmsim_sweep_duration(simulator, folder): - controller = simulator.instruments["qmopx"] - original_duration = controller.simulation_duration - controller.simulation_duration = 1250 - qubits = list(range(simulator.nqubits)) - sequence = PulseSequence() - qd_pulses = {} - ro_pulses = {} - for qubit in qubits: - qd_pulses[qubit] = simulator.create_RX_pulse(qubit, start=0) - ro_pulses[qubit] = simulator.create_MZ_pulse( - qubit, start=qd_pulses[qubit].finish - ) - sequence.append(qd_pulses[qubit]) - sequence.append(ro_pulses[qubit]) - values = [20, 60] - pulses = [qd_pulses[qubit] for qubit in qubits] - sweeper = Sweeper(Parameter.duration, values, pulses=pulses) - options = ExecutionParameters( - nshots=1, - relaxation_time=0, - acquisition_type=AcquisitionType.INTEGRATION, - averaging_mode=AveragingMode.CYCLIC, - ) - result = simulator.sweep(sequence, options, sweeper) - samples = result.get_simulated_samples() - assert_regression(samples, folder, "sweep_duration") - controller.simulation_duration = original_duration - - -def test_qmsim_sweep_duration_two_pulses(simulator, folder): - controller = simulator.instruments["qmopx"] - original_duration = controller.simulation_duration - controller.simulation_duration = 1250 - qubits = list(range(simulator.nqubits)) - sequence = PulseSequence() - qd_pulses1 = {} - qd_pulses2 = {} - ro_pulses = {} - for qubit in qubits: - qd_pulses1[qubit] = simulator.create_RX_pulse(qubit, start=0) - qd_pulses2[qubit] = simulator.create_RX_pulse( - qubit, start=qd_pulses1[qubit].finish - ) - ro_pulses[qubit] = simulator.create_MZ_pulse( - qubit, start=qd_pulses2[qubit].finish - ) - sequence.append(qd_pulses1[qubit]) - sequence.append(qd_pulses2[qubit]) - sequence.append(ro_pulses[qubit]) - values = [20, 60] - pulses = [qd_pulses1[qubit] for qubit in qubits] - sweeper = Sweeper(Parameter.duration, values, pulses=pulses) - options = ExecutionParameters( - nshots=1, - relaxation_time=0, - acquisition_type=AcquisitionType.INTEGRATION, - averaging_mode=AveragingMode.CYCLIC, - ) - result = simulator.sweep(sequence, options, sweeper) - samples = result.get_simulated_samples() - assert_regression(samples, folder, "sweep_duration_two_pulses") - controller.simulation_duration = original_duration - - -gatelist = [ - ["I", "I"], - ["RX(pi)", "RX(pi)"], - ["RY(pi)", "RY(pi)"], - ["RX(pi)", "RY(pi)"], - ["RY(pi)", "RX(pi)"], - ["RX(pi/2)", "I"], - ["RY(pi/2)", "I"], - ["RX(pi/2)", "RY(pi/2)"], - ["RY(pi/2)", "RX(pi/2)"], - ["RX(pi/2)", "RY(pi)"], - ["RY(pi/2)", "RX(pi)"], - ["RX(pi)", "RY(pi/2)"], - ["RY(pi)", "RX(pi/2)"], - ["RX(pi/2)", "RX(pi)"], - ["RX(pi)", "RX(pi/2)"], - ["RY(pi/2)", "RY(pi)"], - ["RY(pi)", "RY(pi/2)"], - ["RX(pi)", "I"], - ["RY(pi)", "I"], - ["RX(pi/2)", "RX(pi/2)"], - ["RY(pi/2)", "RY(pi/2)"], -] - - -@pytest.mark.parametrize("count,gate_pair", enumerate(gatelist)) -def test_qmsim_allxy(simulator, folder, count, gate_pair): - qubits = [1, 2, 3, 4] - allxy_pulses = { - "I": lambda qubit, start: None, - "RX(pi)": lambda qubit, start: simulator.create_RX_pulse(qubit, start=start), - "RX(pi/2)": lambda qubit, start: simulator.create_RX90_pulse( - qubit, start=start - ), - "RY(pi)": lambda qubit, start: simulator.create_RX_pulse( - qubit, start=start, relative_phase=np.pi / 2 - ), - "RY(pi/2)": lambda qubit, start: simulator.create_RX90_pulse( - qubit, start=start, relative_phase=np.pi / 2 - ), - } - - sequence = PulseSequence() - for qubit in qubits: - start = 0 - for gate in gate_pair: - pulse = allxy_pulses[gate](qubit, start) - if pulse is not None: - sequence.append(pulse) - start += pulse.duration - sequence.append(simulator.create_MZ_pulse(qubit, start=start)) - - options = ExecutionParameters(nshots=1) - result = simulator.execute_pulse_sequence(sequence, options) - samples = result.get_simulated_samples() - assert_regression(samples, folder, f"allxy{count}") - - -@pytest.mark.parametrize("sweep", [None, "1D", "2D"]) -def test_qmsim_chevron(simulator, folder, sweep): - lowfreq, highfreq = 1, 2 - initialize_1 = simulator.create_RX_pulse(lowfreq, start=0, relative_phase=0) - initialize_2 = simulator.create_RX_pulse(highfreq, start=0, relative_phase=0) - flux_pulse = Pulse.flux( - start=initialize_2.finish, - duration=31, - amplitude=0.05, - shape=Rectangular(), - channel=simulator.qubits[highfreq].flux.name, - qubit=highfreq, - ) - measure_lowfreq = simulator.create_qubit_readout_pulse( - lowfreq, start=flux_pulse.finish - ) - measure_highfreq = simulator.create_qubit_readout_pulse( - highfreq, start=flux_pulse.finish - ) - sequence = PulseSequence() - sequence.append(initialize_1) - sequence.append(initialize_2) - sequence.append(flux_pulse) - sequence.append(measure_lowfreq) - sequence.append(measure_highfreq) - - options = ExecutionParameters( - nshots=1, - relaxation_time=0, - acquisition_type=AcquisitionType.INTEGRATION, - averaging_mode=AveragingMode.CYCLIC, - ) - if sweep is None: - result = simulator.execute_pulse_sequence(sequence, options) - elif sweep == "1D": - sweeper = Sweeper(Parameter.duration, [10, 60], pulses=[flux_pulse]) - result = simulator.sweep(sequence, options, sweeper) - elif sweep == "2D": - duration_sweeper = Sweeper(Parameter.duration, [10, 40], pulses=[flux_pulse]) - amplitude_sweeper = Sweeper(Parameter.amplitude, [0.5, 2], pulses=[flux_pulse]) - result = simulator.sweep(sequence, options, duration_sweeper, amplitude_sweeper) - samples = result.get_simulated_samples() - if sweep is None: - assert_regression(samples, folder, "chevron") - else: - assert_regression(samples, folder, f"chevron_sweep_{sweep}") - - -@pytest.mark.parametrize("qubits", [[1, 2], [2, 3]]) -@pytest.mark.parametrize("use_flux_pulse", [True, False]) -def test_qmsim_tune_landscape(simulator, folder, qubits, use_flux_pulse): - lowfreq, highfreq = min(qubits), max(qubits) - - y90_pulse = simulator.create_RX90_pulse(lowfreq, start=0, relative_phase=np.pi / 2) - x_pulse_start = simulator.create_RX_pulse(highfreq, start=0, relative_phase=0) - if use_flux_pulse: - flux_pulse = Pulse.flux( - start=y90_pulse.finish, - duration=30, - amplitude=0.055, - shape=Rectangular(), - channel=simulator.qubits[highfreq].flux.name, - qubit=highfreq, - ) - theta_pulse = simulator.create_RX90_pulse( - lowfreq, start=flux_pulse.finish, relative_phase=np.pi / 3 - ) - x_pulse_end = simulator.create_RX_pulse( - highfreq, start=flux_pulse.finish, relative_phase=0 - ) - else: - theta_pulse = simulator.create_RX90_pulse( - lowfreq, start=y90_pulse.finish, relative_phase=np.pi / 3 - ) - x_pulse_end = simulator.create_RX_pulse( - highfreq, start=x_pulse_start.finish, relative_phase=0 - ) - - measure_lowfreq = simulator.create_qubit_readout_pulse( - lowfreq, start=theta_pulse.finish - ) - measure_highfreq = simulator.create_qubit_readout_pulse( - highfreq, start=x_pulse_end.finish - ) - - sequence = x_pulse_start + y90_pulse - if use_flux_pulse: - sequence += flux_pulse - sequence += theta_pulse + x_pulse_end - sequence += measure_lowfreq + measure_highfreq - - options = ExecutionParameters(nshots=1) - result = simulator.execute_pulse_sequence(sequence, options) - samples = result.get_simulated_samples() - qubitstr = "".join(str(q) for q in qubits) - if use_flux_pulse: - assert_regression(samples, folder, f"tune_landscape_{qubitstr}") - else: - assert_regression(samples, folder, f"tune_landscape_noflux_{qubitstr}") - - -@pytest.mark.parametrize("qubit", [2, 3]) -def test_qmsim_snz_pulse(simulator, folder, qubit): - duration = 30 - amplitude = 0.01 - sequence = PulseSequence() - shape = Snz(t_half_flux_pulse=duration // 2, b_amplitude=2) - channel = simulator.qubits[qubit].flux.name - qd_pulse = simulator.create_RX_pulse(qubit, start=0) - flux_pulse = Pulse.flux(qd_pulse.finish, duration, amplitude, shape, channel, qubit) - ro_pulse = simulator.create_MZ_pulse(qubit, start=flux_pulse.finish) - sequence.append(qd_pulse) - sequence.append(flux_pulse) - sequence.append(ro_pulse) - options = ExecutionParameters(nshots=1) - result = simulator.execute_pulse_sequence(sequence, options) - samples = result.get_simulated_samples() - assert_regression(samples, folder, f"snz_pulse_{qubit}") - - -@pytest.mark.parametrize("qubits", [[1, 2], [2, 3]]) -def test_qmsim_bell_circuit(simulator, folder, qubits): - backend = QibolabBackend(simulator) - circuit = Circuit(5) - circuit.append(gates.H(qubits[0])) - circuit.append(gates.CNOT(*qubits)) - circuit.append(gates.M(*qubits)) - result = backend.execute_circuit(circuit, nshots=1) - result = result.execution_result - samples = result.get_simulated_samples() - qubitstr = "".join(str(q) for q in qubits) - assert_regression(samples, folder, f"bell_circuit_{qubitstr}") - - -def test_qmsim_ghz_circuit(simulator, folder): - backend = QibolabBackend(simulator) - circuit = Circuit(5) - circuit.append(gates.H(2)) - circuit.append(gates.CNOT(2, 1)) - circuit.append(gates.CNOT(2, 3)) - circuit.append(gates.M(1, 2, 3)) - result = backend.execute_circuit(circuit, nshots=1) - result = result.execution_result - samples = result.get_simulated_samples() - assert_regression(samples, folder, "ghz_circuit_123") diff --git a/tests/test_instruments_rfsoc.py b/tests/test_instruments_rfsoc.py deleted file mode 100644 index d6957a6e9c..0000000000 --- a/tests/test_instruments_rfsoc.py +++ /dev/null @@ -1,937 +0,0 @@ -"""Tests for RFSoC driver.""" - -from dataclasses import asdict - -import numpy as np -import pytest - -rfsoc = pytest.importorskip("qibosoq.components.base") -rfsoc_pulses = pytest.importorskip("qibosoq.components.pulses") - -# ruff: noqa: E402 -from qibolab import AcquisitionType, AveragingMode, ExecutionParameters, create_platform -from qibolab.instruments.rfsoc import RFSoC -from qibolab.instruments.rfsoc.convert import ( - convert, - convert_units_sweeper, - replace_pulse_shape, -) -from qibolab.pulses import Drag, Gaussian, Pulse, Rectangular -from qibolab.qubits import Qubit -from qibolab.sequence import PulseSequence -from qibolab.sweeper import Parameter, Sweeper, SweeperType - -from .conftest import get_instrument - - -def test_convert_default(dummy_qrc): - """Test convert function raises errors when parameter have wrong types.""" - platform = create_platform("rfsoc") - integer = 12 - qubits = platform.qubits - sequence = PulseSequence() - sequence.append(Pulse(0, 40, 0.9, 50e6, 0, Drag(5, 2), 0, PulseType.DRIVE, 0)) - parameter = Parameter.frequency - - with pytest.raises(ValueError): - res = convert(integer) # this conversion does not exist - - with pytest.raises(ValueError): - res = convert(qubits, sequence) # the order is wrong - - with pytest.raises(TypeError): - # functools understand that is a convert_parameter and raises an error for the int - _ = convert(parameter, integer) - - -def test_convert_qubit(dummy_qrc): - """Tests conversion from `qibolab.platforms.abstract.Qubit` to - `rfsoc.Qubit`. - - Test conversion for flux qubit and for non-flux qubit. - """ - platform = create_platform("rfsoc") - qubit = platform.qubits[0] - qubit.flux.port = platform.instruments["tii_rfsoc4x2"].ports(4) - qubit.flux.offset = 0.05 - qubit = convert(qubit) - targ = rfsoc.Qubit(0.05, 4) - - assert qubit == targ - - platform = create_platform("rfsoc") - qubit = platform.qubits[0] - qubit.flux = None - qubit = convert(qubit) - targ = rfsoc.Qubit(0.0, None) - - assert qubit == targ - - -def test_replace_pulse_shape(dummy_qrc): - """Test rfsoc pulse conversions.""" - - pulse = rfsoc_pulses.Pulse(50, 0.9, 0, 0, 0.04, "name", "drive", 4, None) - - new_pulse = replace_pulse_shape(pulse, Rectangular(), sampling_rate=1) - assert isinstance(new_pulse, rfsoc_pulses.Rectangular) - for key in asdict(pulse): - assert asdict(pulse)[key] == asdict(new_pulse)[key] - - new_pulse = replace_pulse_shape(pulse, Gaussian(5), sampling_rate=1) - assert isinstance(new_pulse, rfsoc_pulses.Gaussian) - assert new_pulse.rel_sigma == 5 - for key in asdict(pulse): - assert asdict(pulse)[key] == asdict(new_pulse)[key] - - new_pulse = replace_pulse_shape(pulse, Drag(5, 7), sampling_rate=1) - assert isinstance(new_pulse, rfsoc_pulses.Drag) - assert new_pulse.rel_sigma == 5 - assert new_pulse.beta == 7 - for key in asdict(pulse): - assert asdict(pulse)[key] == asdict(new_pulse)[key] - - -def test_convert_pulse(dummy_qrc): - """Tests conversion from `qibolab.pulses.Pulse` to `rfsoc.Pulse`. - - Test drive pulse (gaussian and drag), and readout with LO. - """ - platform = create_platform("rfsoc") - controller = platform.instruments["tii_rfsoc4x2"] - qubit = platform.qubits[0] - qubit.drive.port = controller.ports(4) - qubit.readout.port = controller.ports(2) - qubit.feedback.port = controller.ports(1) - qubit.readout.local_oscillator.frequency = 1e6 - - pulse = Pulse( - start=0, - duration=40, - amplitude=0.9, - frequency=50e6, - relative_phase=0, - shape=Drag(5, 2), - channel=0, - type=PulseType.DRIVE, - qubit=0, - ) - targ = rfsoc_pulses.Drag( - type="drive", - frequency=50, - amplitude=0.9, - start_delay=0, - duration=0.04, - adc=None, - dac=4, - name=pulse.id, - relative_phase=0, - rel_sigma=5, - beta=2, - ) - assert convert(pulse, platform.qubits, 0, sampling_rate=1) == targ - - pulse = Pulse( - start=0, - duration=40, - amplitude=0.9, - frequency=50e6, - relative_phase=0, - shape=Gaussian(2), - channel=0, - type=PulseType.DRIVE, - qubit=0, - ) - targ = rfsoc_pulses.Gaussian( - frequency=50, - amplitude=0.9, - start_delay=0, - relative_phase=0, - duration=0.04, - name=pulse.id, - type="drive", - dac=4, - adc=None, - rel_sigma=2, - ) - assert convert(pulse, platform.qubits, 0, sampling_rate=1) == targ - - pulse = Pulse( - start=0, - duration=40, - amplitude=0.9, - frequency=50e6, - relative_phase=0, - shape=Rectangular(), - channel=0, - type=PulseType.READOUT, - qubit=0, - ) - targ = rfsoc_pulses.Rectangular( - frequency=49, - amplitude=0.9, - start_delay=0, - relative_phase=0, - duration=0.04, - name=pulse.id, - type="readout", - dac=2, - adc=1, - ) - assert convert(pulse, platform.qubits, 0, sampling_rate=1) == targ - - -def test_convert_units_sweeper(dummy_qrc): - """Tests units conversion for `rfsoc.Sweeper` objects. - - Test frequency conversion (with and without LO), start and relative - phase sweepers. - """ - platform = create_platform("rfsoc") - qubit = platform.qubits[0] - qubit.drive.ports = [("name", 4)] - qubit.readout.ports = [("name", 2)] - qubit.feedback.ports = [("name", 1)] - qubit.readout.local_oscillator.frequency = 1e6 - - seq = PulseSequence() - pulse0 = Pulse(0, 40, 0.9, 50e6, 0, Gaussian(2), 0, PulseType.DRIVE, 0) - pulse1 = Pulse(40, 40, 0.9, 50e6, 0, Rectangular(), 0, PulseType.READOUT, 0) - seq.append(pulse0) - seq.append(pulse1) - - # frequency sweeper - sweeper = rfsoc.Sweeper( - parameters=[rfsoc.Parameter.FREQUENCY], - indexes=[1], - starts=[0], - stops=[10e6], - expts=100, - ) - sweeper = convert_units_sweeper(sweeper, seq, platform.qubits) - - assert sweeper.starts == [-1] - assert sweeper.stops == [9] - - qubit.readout.local_oscillator.frequency = 0 - sweeper = rfsoc.Sweeper( - parameters=[rfsoc.Parameter.FREQUENCY], - indexes=[1], - starts=[0], - stops=[10e6], - expts=100, - ) - sweeper = convert_units_sweeper(sweeper, seq, platform.qubits) - assert sweeper.starts == [0] - assert sweeper.stops == [10] - - # start sweeper - sweeper = rfsoc.Sweeper( - parameters=[rfsoc.Parameter.DELAY, rfsoc.Parameter.DELAY], - indexes=[0, 1], - starts=[0, 40], - stops=[100, 140], - expts=100, - ) - sweeper = convert_units_sweeper(sweeper, seq, platform.qubits) - assert (sweeper.starts == [0, 0.04]).all() - assert (sweeper.stops == [0.1, 0.14]).all() - - # phase sweeper - sweeper = rfsoc.Sweeper( - parameters=[rfsoc.Parameter.RELATIVE_PHASE], - indexes=[0], - starts=[0], - stops=[np.pi], - expts=180, - ) - sweeper = convert_units_sweeper(sweeper, seq, platform.qubits) - assert sweeper.starts == [0] - assert sweeper.stops == [180] - - -def test_convert_sweep(dummy_qrc): - """Test conversion between `Sweeper` and `rfsoc.Sweeper` objects. - - Test bias sweep, amplitude error, frequency sweep, duration, start. - """ - platform = create_platform("rfsoc") - qubit = platform.qubits[0] - qubit.flux.offset = 0.05 - qubit.flux.ports = [("name", 4)] - qubit.drive.ports = [("name", 4)] - qubit.readout.ports = [("name", 2)] - - seq = PulseSequence() - pulse0 = Pulse(0, 40, 0.9, 50e6, 0, Gaussian(2), 0, PulseType.DRIVE, 0) - pulse1 = Pulse(40, 40, 0.9, 50e6, 0, Rectangular(), 0, PulseType.READOUT, 0) - seq.append(pulse0) - seq.append(pulse1) - - sweeper = Sweeper( - parameter=Parameter.bias, values=np.arange(-0.5, +0.5, 0.1), qubits=[qubit] - ) - rfsoc_sweeper = convert(sweeper, seq, platform.qubits) - targ = rfsoc.Sweeper( - expts=10, - parameters=[rfsoc.Parameter.BIAS], - starts=[-0.5], - stops=[0.4], - indexes=[0], - ) - assert targ.expts == rfsoc_sweeper.expts - assert targ.parameters == rfsoc_sweeper.parameters - assert targ.starts == rfsoc_sweeper.starts - assert targ.stops == np.round(rfsoc_sweeper.stops, 2) - assert targ.indexes == rfsoc_sweeper.indexes - sweeper = Sweeper( - parameter=Parameter.bias, - values=np.arange(-0.5, +0.5, 0.1), - qubits=[qubit], - type=SweeperType.OFFSET, - ) - rfsoc_sweeper = convert(sweeper, seq, platform.qubits) - targ = rfsoc.Sweeper( - expts=10, - parameters=[rfsoc.Parameter.BIAS], - starts=[-0.45], - stops=[0.45], - indexes=[0], - ) - assert targ.expts == rfsoc_sweeper.expts - assert targ.parameters == rfsoc_sweeper.parameters - assert targ.starts == rfsoc_sweeper.starts - assert targ.stops == np.round(rfsoc_sweeper.stops, 2) - assert targ.indexes == rfsoc_sweeper.indexes - - qubit.flux.offset = 0.5 - sweeper = Sweeper( - parameter=Parameter.bias, - values=np.arange(0, +1, 0.1), - qubits=[qubit], - type=SweeperType.OFFSET, - ) - with pytest.raises(ValueError): - rfsoc_sweeper = convert(sweeper, seq, platform.qubits) - - sweeper = Sweeper( - parameter=Parameter.frequency, values=np.arange(0, 100, 1), pulses=[pulse0] - ) - rfsoc_sweeper = convert(sweeper, seq, platform.qubits) - targ = rfsoc.Sweeper( - expts=100, - parameters=[rfsoc.Parameter.FREQUENCY], - starts=[0], - stops=[99], - indexes=[0], - ) - assert rfsoc_sweeper == targ - - sweeper = Sweeper( - parameter=Parameter.duration, values=np.arange(40, 100, 1), pulses=[pulse0] - ) - rfsoc_sweeper = convert(sweeper, seq, platform.qubits) - targ = rfsoc.Sweeper( - expts=60, - parameters=[rfsoc.Parameter.DURATION, rfsoc.Parameter.DELAY], - starts=[40, 40], - stops=[99, 99], - indexes=[0, 1], - ) - assert (rfsoc_sweeper.starts == targ.starts).all() - assert (rfsoc_sweeper.stops == targ.stops).all() - assert rfsoc_sweeper.expts == targ.expts - assert rfsoc_sweeper.parameters == targ.parameters - assert rfsoc_sweeper.indexes == targ.indexes - - sweeper = Sweeper( - parameter=Parameter.start, values=np.arange(0, 10, 1), pulses=[pulse0] - ) - rfsoc_sweeper = convert(sweeper, seq, platform.qubits) - targ = rfsoc.Sweeper( - expts=10, - parameters=[rfsoc.Parameter.DELAY], - starts=[0], - stops=[9], - indexes=[0], - ) - assert rfsoc_sweeper == targ - - -def test_rfsoc_init(dummy_qrc): - """Tests instrument can initilize and its attribute are assigned.""" - platform = create_platform("rfsoc") - instrument = platform.instruments["tii_rfsoc4x2"] - - assert instrument.host == "0.0.0.0" - assert instrument.port == 0 - assert isinstance(instrument.cfg, rfsoc.Config) - - -def test_play(mocker, dummy_qrc): - platform = create_platform("rfsoc") - instrument = platform.instruments["tii_rfsoc4x2"] - - seq = PulseSequence() - pulse0 = Pulse(0, 40, 0.9, 50e6, 0, Gaussian(2), 0, PulseType.DRIVE, 0) - pulse1 = Pulse(40, 40, 0.9, 50e6, 0, Rectangular(), 0, PulseType.READOUT, 0) - seq.append(pulse0) - seq.append(pulse1) - - nshots = 100 - server_results = ([[np.random.rand(nshots)]], [[np.random.rand(nshots)]]) - mocker.patch("qibosoq.client.connect", return_value=server_results) - parameters = ExecutionParameters( - nshots=nshots, - acquisition_type=AcquisitionType.DISCRIMINATION, - averaging_mode=AveragingMode.SINGLESHOT, - ) - results = instrument.play(platform.qubits, platform.couplers, seq, parameters) - assert pulse1.id in results.keys() - - parameters = ExecutionParameters( - nshots=nshots, - acquisition_type=AcquisitionType.INTEGRATION, - averaging_mode=AveragingMode.SINGLESHOT, - ) - results = instrument.play(platform.qubits, platform.couplers, seq, parameters) - assert pulse1.id in results.keys() - - parameters = ExecutionParameters( - nshots=nshots, - acquisition_type=AcquisitionType.DISCRIMINATION, - averaging_mode=AveragingMode.CYCLIC, - ) - results = instrument.play(platform.qubits, platform.couplers, seq, parameters) - assert pulse1.id in results.keys() - - -def test_sweep(mocker, dummy_qrc): - platform = create_platform("rfsoc") - instrument = platform.instruments["tii_rfsoc4x2"] - qubit = platform.qubits[0] - qubit.flux.offset = 0.05 - qubit.flux.ports = [("name", 4)] - - seq = PulseSequence() - pulse0 = Pulse(0, 40, 0.9, 50e6, 0, Gaussian(2), 0, PulseType.DRIVE, 0) - pulse1 = Pulse(40, 40, 0.9, 50e6, 0, Rectangular(), 0, PulseType.READOUT, 0) - seq.append(pulse0) - seq.append(pulse1) - sweeper0 = Sweeper( - parameter=Parameter.frequency, values=np.arange(0, 100, 1), pulses=[pulse0] - ) - sweeper1 = Sweeper( - parameter=Parameter.bias, values=np.arange(0, 0.1, 0.01), qubits=[qubit] - ) - - nshots = 100 - server_results = ( - [[[np.random.rand(nshots)] * 10]], - [[[np.random.rand(nshots)] * 10]], - ) - mocker.patch("qibosoq.client.connect", return_value=server_results) - parameters = ExecutionParameters( - nshots=nshots, - acquisition_type=AcquisitionType.DISCRIMINATION, - averaging_mode=AveragingMode.SINGLESHOT, - ) - results = instrument.sweep( - platform.qubits, platform.couplers, seq, parameters, sweeper0, sweeper1 - ) - assert pulse1.id in results.keys() - - parameters = ExecutionParameters( - nshots=nshots, - acquisition_type=AcquisitionType.INTEGRATION, - averaging_mode=AveragingMode.SINGLESHOT, - ) - results = instrument.sweep( - platform.qubits, platform.couplers, seq, parameters, sweeper0, sweeper1 - ) - assert pulse1.id in results.keys() - - parameters = ExecutionParameters( - nshots=nshots, - acquisition_type=AcquisitionType.DISCRIMINATION, - averaging_mode=AveragingMode.CYCLIC, - ) - results = instrument.sweep( - platform.qubits, platform.couplers, seq, parameters, sweeper0, sweeper1 - ) - assert pulse1.id in results.keys() - - -def test_validate_input_command(dummy_qrc): - platform = create_platform("rfsoc") - instrument = platform.instruments["tii_rfsoc4x2"] - - seq = PulseSequence() - pulse0 = Pulse(0, 40, 0.9, 50e6, 0, Gaussian(2), 0, PulseType.DRIVE, 0) - pulse1 = Pulse(40, 40, 0.9, 50e6, 0, Rectangular(), 0, PulseType.READOUT, 0) - seq.append(pulse0) - seq.append(pulse1) - - parameters = ExecutionParameters(acquisition_type=AcquisitionType.RAW) - with pytest.raises(NotImplementedError): - results = instrument.play(platform.qubits, platform.couplers, seq, parameters) - - parameters = ExecutionParameters(fast_reset=True) - with pytest.raises(NotImplementedError): - results = instrument.play(platform.qubits, platform.couplers, seq, parameters) - - -def test_update_cfg(mocker, dummy_qrc): - platform = create_platform("rfsoc") - instrument = platform.instruments["tii_rfsoc4x2"] - - seq = PulseSequence() - pulse0 = Pulse(0, 40, 0.9, 50e6, 0, Gaussian(2), 0, PulseType.DRIVE, 0) - pulse1 = Pulse(40, 40, 0.9, 50e6, 0, Rectangular(), 0, PulseType.READOUT, 0) - seq.append(pulse0) - seq.append(pulse1) - - nshots = 333 - relax_time = 1e6 - server_results = ([[np.random.rand(nshots)]], [[np.random.rand(nshots)]]) - mocker.patch("qibosoq.client.connect", return_value=server_results) - parameters = ExecutionParameters( - nshots=nshots, - acquisition_type=AcquisitionType.DISCRIMINATION, - averaging_mode=AveragingMode.SINGLESHOT, - relaxation_time=relax_time, - ) - results = instrument.play(platform.qubits, platform.couplers, seq, parameters) - assert instrument.cfg.reps == nshots - relax_time = relax_time * 1e-3 - assert instrument.cfg.relaxation_time == relax_time - - -def test_classify_shots(dummy_qrc): - """Creates fake IQ values and check classification works as expected.""" - qubit0 = Qubit(name="q0", threshold=1, iq_angle=np.pi / 2) - qubit1 = Qubit( - name="q1", - ) - i_val = [0] * 7 - q_val = [-5, -1.5, -0.5, 0, 0.5, 1.5, 5] - - platform = create_platform("rfsoc") - instrument = platform.instruments["tii_rfsoc4x2"] - - shots = instrument.classify_shots(i_val, q_val, qubit0) - target_shots = np.array([1, 1, 0, 0, 0, 0, 0]) - - assert (target_shots == shots).all() - shots = instrument.classify_shots(i_val, q_val, qubit1) - assert shots.shape == (7,) - - -def test_merge_sweep_results(dummy_qrc): - """Creates fake dictionary of results and check merging works as - expected.""" - dict_a = {"serial1": AveragedIntegratedResults(np.array([0 + 1j * 1]))} - dict_b = { - "serial1": AveragedIntegratedResults(np.array([4 + 1j * 4])), - "serial2": AveragedIntegratedResults(np.array([5 + 1j * 5])), - } - dict_c = {} - targ_dict = { - "serial1": AveragedIntegratedResults(np.array([0 + 1j * 1, 4 + 1j * 4])), - "serial2": AveragedIntegratedResults(np.array([5 + 1j * 5])), - } - - platform = create_platform("rfsoc") - instrument = platform.instruments["tii_rfsoc4x2"] - - out_dict1 = instrument.merge_sweep_results(dict_a, dict_b) - out_dict2 = instrument.merge_sweep_results(dict_c, dict_a) - - assert targ_dict.keys() == out_dict1.keys() - assert ( - out_dict1["serial1"].serialize["MSR[V]"] - == targ_dict["serial1"].serialize["MSR[V]"] - ).all() - assert ( - out_dict1["serial1"].serialize["MSR[V]"] - == targ_dict["serial1"].serialize["MSR[V]"] - ).all() - - assert dict_a.keys() == out_dict2.keys() - assert ( - out_dict2["serial1"].serialize["MSR[V]"] - == dict_a["serial1"].serialize["MSR[V]"] - ).all() - assert ( - out_dict2["serial1"].serialize["MSR[V]"] - == dict_a["serial1"].serialize["MSR[V]"] - ).all() - - -def test_get_if_python_sweep(dummy_qrc): - """Creates pulse sequences and check if they can be swept by the firmware. - - Qibosoq does not support sweep on readout frequency, more than one - sweep at the same time, sweep on channels where multiple pulses are - sent. If Qibosoq does not support the sweep, the driver will use a - python loop - """ - - platform = create_platform("rfsoc") - instrument = platform.instruments["tii_rfsoc4x2"] - - sequence_1 = PulseSequence() - sequence_1.append(platform.create_RX_pulse(qubit=0, start=0)) - sequence_1.append(platform.create_MZ_pulse(qubit=0, start=100)) - - sweep1 = Sweeper( - parameter=Parameter.frequency, - values=np.arange(10, 100, 10), - pulses=[sequence_1[0]], - ) - sweep2 = Sweeper( - parameter=Parameter.frequency, - values=np.arange(10, 100, 10), - pulses=[sequence_1[1]], - ) - sweep3 = Sweeper( - parameter=Parameter.amplitude, - values=np.arange(0.01, 0.5, 0.1), - pulses=[sequence_1[1]], - ) - sweep1 = convert(sweep1, sequence_1, platform.qubits) - sweep2 = convert(sweep2, sequence_1, platform.qubits) - sweep3 = convert(sweep3, sequence_1, platform.qubits) - - assert instrument.get_if_python_sweep(sequence_1, sweep2) - assert not instrument.get_if_python_sweep(sequence_1, sweep1) - assert not instrument.get_if_python_sweep(sequence_1, sweep3) - - sequence_2 = PulseSequence() - sequence_2.append(platform.create_RX_pulse(qubit=0, start=0)) - - sweep1 = Sweeper( - parameter=Parameter.frequency, - values=np.arange(10, 100, 10), - pulses=[sequence_2[0]], - ) - sweep2 = Sweeper( - parameter=Parameter.amplitude, - values=np.arange(0.01, 0.5, 0.1), - pulses=[sequence_2[0]], - ) - sweep1 = convert(sweep1, sequence_2, platform.qubits) - sweep2 = convert(sweep2, sequence_2, platform.qubits) - - assert not instrument.get_if_python_sweep(sequence_2, sweep1) - assert not instrument.get_if_python_sweep(sequence_2, sweep1, sweep2) - - # TODO repetition - platform = create_platform("rfsoc") - instrument = platform.instruments["tii_rfsoc4x2"] - - sequence_1 = PulseSequence() - sequence_1.append(platform.create_RX_pulse(qubit=0, start=0)) - sweep1 = Sweeper( - parameter=Parameter.frequency, - values=np.arange(10, 100, 10), - pulses=[sequence_1[0]], - ) - sweep2 = Sweeper( - parameter=Parameter.relative_phase, - values=np.arange(0, 1, 0.01), - pulses=[sequence_1[0]], - ) - sweep3 = Sweeper( - parameter=Parameter.bias, - values=np.arange(-0.1, 0.1, 0.001), - qubits=[platform.qubits[0]], - ) - sweep1 = convert(sweep1, sequence_1, platform.qubits) - sweep2 = convert(sweep2, sequence_1, platform.qubits) - sweep3 = convert(sweep3, sequence_1, platform.qubits) - assert not instrument.get_if_python_sweep(sequence_1, sweep1, sweep2, sweep3) - - platform.qubits[0].flux.offset = 0.5 - sweep1 = Sweeper(parameter=Parameter.bias, values=np.arange(-1, 1, 0.1), qubits=[0]) - with pytest.raises(ValueError): - sweep1 = convert(sweep1, sequence_1, platform.qubits) - - -def test_convert_av_sweep_results(dummy_qrc): - """Qibosoq sends results using nested lists, check if the conversion to - dictionary of AveragedResults, for averaged sweep, works as expected.""" - - platform = create_platform("rfsoc") - instrument = platform.instruments["tii_rfsoc4x2"] - - sequence = PulseSequence() - sequence.append(platform.create_RX_pulse(qubit=0, start=0)) - sequence.append(platform.create_MZ_pulse(qubit=0, start=100)) - sequence.append(platform.create_MZ_pulse(qubit=0, start=200)) - sweep1 = Sweeper( - parameter=Parameter.frequency, - values=np.arange(10, 35, 10), - pulses=[sequence[0]], - ) - sweep1 = convert(sweep1, sequence, platform.qubits) - serial1 = sequence[1].id - serial2 = sequence[2].id - - avgi = [[[1, 2, 3], [4, 1, 2]]] - avgq = [[[7, 8, 9], [-1, -2, -3]]] - - execution_parameters = ExecutionParameters( - acquisition_type=AcquisitionType.INTEGRATION, - averaging_mode=AveragingMode.CYCLIC, - ) - out_dict = instrument.convert_sweep_results( - sequence.probe_pulses, platform.qubits, avgi, avgq, execution_parameters - ) - targ_dict = { - serial1: AveragedIntegratedResults( - np.array([1, 2, 3]) + 1j * np.array([7, 8, 9]) - ), - serial2: AveragedIntegratedResults( - np.array([4, 1, 2]) + 1j * np.array([-1, -2, -3]) - ), - } - - assert ( - out_dict[serial1].serialize["i[V]"] == targ_dict[serial1].serialize["i[V]"] - ).all() - assert ( - out_dict[serial1].serialize["q[V]"] == targ_dict[serial1].serialize["q[V]"] - ).all() - assert ( - out_dict[serial2].serialize["i[V]"] == targ_dict[serial2].serialize["i[V]"] - ).all() - assert ( - out_dict[serial2].serialize["q[V]"] == targ_dict[serial2].serialize["q[V]"] - ).all() - - -def test_convert_nav_sweep_results(dummy_qrc): - """Qibosoq sends results using nested lists, check if the conversion to - dictionary of ExecutionResults, for not averaged sweep, works as - expected.""" - platform = create_platform("rfsoc") - instrument = platform.instruments["tii_rfsoc4x2"] - - sequence = PulseSequence() - sequence.append(platform.create_RX_pulse(qubit=0, start=0)) - sequence.append(platform.create_MZ_pulse(qubit=0, start=100)) - sequence.append(platform.create_MZ_pulse(qubit=0, start=200)) - sweep1 = Sweeper( - parameter=Parameter.frequency, - values=np.arange(10, 35, 10), - pulses=[sequence[0]], - ) - sweep1 = convert(sweep1, sequence, platform.qubits) - serial1 = sequence[1].id - serial2 = sequence[2].id - - avgi = [[[[1, 1], [2, 2], [3, 3]], [[4, 4], [1, 1], [2, 2]]]] - avgq = [[[[7, 7], [8, 8], [9, 9]], [[-1, -1], [-2, -2], [-3, -3]]]] - - execution_parameters = ExecutionParameters( - acquisition_type=AcquisitionType.INTEGRATION, - averaging_mode=AveragingMode.CYCLIC, - ) - out_dict = instrument.convert_sweep_results( - sequence.probe_pulses, platform.qubits, avgi, avgq, execution_parameters - ) - targ_dict = { - serial1: AveragedIntegratedResults( - np.array([1, 1, 2, 2, 3, 3]) + 1j * np.array([7, 7, 8, 8, 9, 9]) - ), - serial2: AveragedIntegratedResults( - np.array([4, 4, 1, 1, 2, 2]) + 1j * np.array([-1, -1, -2, -2, -3, -3]) - ), - } - - assert ( - out_dict[serial1].serialize["i[V]"] == targ_dict[serial1].serialize["i[V]"] - ).all() - assert ( - out_dict[serial1].serialize["q[V]"] == targ_dict[serial1].serialize["q[V]"] - ).all() - assert ( - out_dict[serial2].serialize["i[V]"] == targ_dict[serial2].serialize["i[V]"] - ).all() - assert ( - out_dict[serial2].serialize["q[V]"] == targ_dict[serial2].serialize["q[V]"] - ).all() - - -@pytest.fixture(scope="module") -def instrument(connected_platform): - return get_instrument(connected_platform, RFSoC) - - -@pytest.mark.qpu -def test_call_executepulsesequence(connected_platform, instrument): - """Executes a PulseSequence and check if result shape is as expected. - - Both for averaged results and not averaged results. - """ - platform = connected_platform - instrument = platform.instruments["tii_rfsoc4x2"] - - sequence = PulseSequence() - sequence.append(platform.create_RX_pulse(qubit=0, start=0)) - sequence.append(platform.create_MZ_pulse(qubit=0, start=100)) - - instrument.cfg.average = False - i_vals_nav, q_vals_nav = instrument._execute_pulse_sequence( - sequence, platform.qubits, rfsoc.OperationCode.EXECUTE_PULSE_SEQUENCE - ) - instrument.cfg.average = True - i_vals_av, q_vals_av = instrument._execute_pulse_sequence( - sequence, platform.qubits, rfsoc.OperationCode.EXECUTE_PULSE_SEQUENCE - ) - - assert np.shape(i_vals_nav) == (1, 1, 1000) - assert np.shape(q_vals_nav) == (1, 1, 1000) - assert np.shape(i_vals_av) == (1, 1) - assert np.shape(q_vals_av) == (1, 1) - - -@pytest.mark.qpu -def test_call_execute_sweeps(connected_platform, instrument): - """Execute a firmware sweep and check if result shape is as expected. - - Both for averaged results and not averaged results. - """ - platform = connected_platform - instrument = platform.instruments["tii_rfsoc4x2"] - - sequence = PulseSequence() - sequence.append(platform.create_RX_pulse(qubit=0, start=0)) - sequence.append(platform.create_MZ_pulse(qubit=0, start=100)) - sweep = Sweeper( - parameter=Parameter.frequency, - values=np.arange(10, 35, 10), - pulses=[sequence[0]], - ) - expts = len(sweep.values) - - sweep = [convert(sweep, sequence, platform.qubits)] - instrument.cfg.average = False - i_vals_nav, q_vals_nav = instrument._execute_sweeps( - sequence, platform.qubits, sweep - ) - instrument.cfg.average = True - i_vals_av, q_vals_av = instrument._execute_sweeps(sequence, platform.qubits, sweep) - - assert np.shape(i_vals_nav) == (1, 1, expts, 1000) - assert np.shape(q_vals_nav) == (1, 1, expts, 1000) - assert np.shape(i_vals_av) == (1, 1, expts) - assert np.shape(q_vals_av) == (1, 1, expts) - - -@pytest.mark.qpu -def test_play_qpu(connected_platform, instrument): - """Sends a PulseSequence using `play` and check results are what - expected.""" - platform = connected_platform - instrument = platform.instruments["tii_rfsoc4x2"] - - sequence = PulseSequence() - sequence.append(platform.create_RX_pulse(qubit=0, start=0)) - sequence.append(platform.create_MZ_pulse(qubit=0, start=100)) - - out_dict = instrument.play( - platform.qubits, - sequence, - ExecutionParameters(acquisition_type=AcquisitionType.INTEGRATION), - ) - - assert sequence[1].id in out_dict - assert isinstance(out_dict[sequence[1].id], IntegratedResults) - assert np.shape(out_dict[sequence[1].id].voltage_i) == (1000,) - - -@pytest.mark.qpu -def test_sweep_qpu(connected_platform, instrument): - """Sends a PulseSequence using `sweep` and check results are what - expected.""" - platform = connected_platform - instrument = platform.instruments["tii_rfsoc4x2"] - - sequence = PulseSequence() - sequence.append(platform.create_RX_pulse(qubit=0, start=0)) - sequence.append(platform.create_MZ_pulse(qubit=0, start=100)) - sweep = Sweeper( - parameter=Parameter.frequency, - values=np.arange(10, 35, 10), - pulses=[sequence[0]], - ) - - out_dict1 = instrument.sweep( - platform.qubits, - platform.couplers, - sequence, - ExecutionParameters( - relaxation_time=100_000, averaging_mode=AveragingMode.CYCLIC - ), - sweep, - ) - out_dict2 = instrument.sweep( - platform.qubits, - platform.couplers, - sequence, - ExecutionParameters( - relaxation_time=100_000, - acquisition_type=AcquisitionType.INTEGRATION, - averaging_mode=AveragingMode.SINGLESHOT, - ), - sweep, - ) - - assert sequence[1].id in out_dict1 - assert sequence[1].id in out_dict2 - assert isinstance(out_dict1[sequence[1].id], AveragedSampleResults) - assert isinstance(out_dict2[sequence[1].id], IntegratedResults) - assert np.shape(out_dict2[sequence[1].id].voltage_i) == ( - 1000, - len(sweep.values), - ) - assert np.shape(out_dict1[sequence[1].id].statistical_frequency) == ( - len(sweep.values), - ) - - -@pytest.mark.qpu -def test_python_reqursive_sweep(connected_platform, instrument): - """Sends a PulseSequence directly to `python_reqursive_sweep` and check - results are what expected.""" - platform = connected_platform - instrument = platform.instruments["tii_rfsoc4x2"] - - sequence = PulseSequence() - sequence.append(platform.create_RX_pulse(qubit=0, start=0)) - sequence.append(platform.create_MZ_pulse(qubit=0, start=100)) - sweep1 = Sweeper( - parameter=Parameter.amplitude, - values=np.arange(0.01, 0.03, 10), - pulses=[sequence[0]], - ) - sweep2 = Sweeper( - parameter=Parameter.frequency, - values=np.arange(10, 35, 10), - pulses=[sequence[0]], - ) - - out_dict = instrument.sweep( - platform.qubits, - platform.couplers, - sequence, - ExecutionParameters( - relaxation_time=100_000, averaging_mode=AveragingMode.CYCLIC - ), - sweep1, - sweep2, - ) - - assert sequence[1].id in out_dict diff --git a/tests/test_platform.py b/tests/test_platform.py index ee68c75e7c..4367d2ce59 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -18,7 +18,6 @@ from qibolab.dummy import create_dummy from qibolab.dummy.platform import FOLDER from qibolab.execution_parameters import ExecutionParameters -from qibolab.instruments.qblox.controller import QbloxController from qibolab.native import SingleQubitNatives, TwoQubitNatives from qibolab.parameters import NativeGates, Parameters, update_configs from qibolab.platform import Platform @@ -28,8 +27,6 @@ from qibolab.sequence import PulseSequence from qibolab.serialize import replace -from .conftest import find_instrument - nshots = 1024 @@ -289,11 +286,7 @@ def test_platform_execute_one_long_drive_pulse(qpu_platform): pulse = Pulse(duration=8192 + 200, amplitude=0.12, envelope=Gaussian(5)) sequence = PulseSequence([(qubit.drive.name, pulse)]) options = ExecutionParameters(nshots=nshots) - if find_instrument(platform, QbloxController) is not None: - with pytest.raises(NotImplementedError): - platform.execute_pulse_sequence(sequence, options) - else: - platform.execute_pulse_sequence(sequence, options) + platform.execute_pulse_sequence(sequence, options) @pytest.mark.qpu @@ -304,11 +297,7 @@ def test_platform_execute_one_extralong_drive_pulse(qpu_platform): pulse = Pulse(duration=2 * 8192 + 200, amplitude=0.12, envelope=Gaussian(0.2)) sequence = PulseSequence([(qubit.drive.name, pulse)]) options = ExecutionParameters(nshots=nshots) - if find_instrument(platform, QbloxController) is not None: - with pytest.raises(NotImplementedError): - platform.execute_pulse_sequence(sequence, options) - else: - platform.execute_pulse_sequence(sequence, options) + platform.execute_pulse_sequence(sequence, options) @pytest.mark.qpu diff --git a/tests/test_port.py b/tests/test_port.py deleted file mode 100644 index 7341ec7997..0000000000 --- a/tests/test_port.py +++ /dev/null @@ -1,32 +0,0 @@ -from unittest.mock import Mock - -import pytest - -from qibolab.instruments.qblox.port import QbloxOutputPort - - -def test_set_attenuation(caplog): - module = Mock() - # module.device = None - port = QbloxOutputPort(module, 17) - - port.attenuation = 40 - assert port.attenuation == 40 - - port.attenuation = 40.1 - assert port.attenuation == 40 - - port.attenuation = 65 - assert port.attenuation == 60 - if caplog.messages: - assert "attenuation needs to be between 0 and 60 dB" in caplog.messages[0] - caplog.clear() - - port.attenuation = -10 - assert port.attenuation == 0 - if caplog.messages: - assert "attenuation needs to be between 0 and 60 dB" in caplog.messages[0] - caplog.clear() - - with pytest.raises(ValueError, match="Invalid"): - port.attenuation = "something" From 52014269c02ff0fbfa86c4a1d6e3dbea9258040d Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Wed, 28 Aug 2024 17:14:00 +0300 Subject: [PATCH 0752/1006] chore: remove zi tests --- tests/conftest.py | 6 - tests/test_instruments_zhinst.py | 754 ------------------------------- 2 files changed, 760 deletions(-) delete mode 100644 tests/test_instruments_zhinst.py diff --git a/tests/conftest.py b/tests/conftest.py index b3c61f115e..6c9708b08c 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -180,9 +180,3 @@ def wrapped( return results[target[0]][target[1]] return wrapped - - -def pytest_generate_tests(metafunc): - name = metafunc.module.__name__ - if "test_instruments" in name: - pytest.skip() diff --git a/tests/test_instruments_zhinst.py b/tests/test_instruments_zhinst.py deleted file mode 100644 index b1f9eacb1e..0000000000 --- a/tests/test_instruments_zhinst.py +++ /dev/null @@ -1,754 +0,0 @@ -import laboneq.dsl.experiment.pulse as laboneq_pulse -import laboneq.simple as lo -import numpy as np -import pytest - -from qibolab import AcquisitionType, AveragingMode, ExecutionParameters, create_platform -from qibolab.instruments.zhinst import ProcessedSweeps, Zurich, classify_sweepers -from qibolab.instruments.zhinst.pulse import select_pulse -from qibolab.pulses import Delay, Drag, Gaussian, Iir, Pulse, Rectangular, Snz -from qibolab.sequence import PulseSequence -from qibolab.sweeper import Parameter, Sweeper -from qibolab.unrolling import batch - -from .conftest import get_instrument - - -@pytest.mark.parametrize( - "pulse", - [ - Pulse( - duration=40, - amplitude=0.05, - relative_phase=0.0, - envelope=Rectangular(), - ), - Pulse( - duration=40, - amplitude=0.05, - relative_phase=0.0, - envelope=Gaussian(rel_sigma=5), - ), - Pulse( - duration=40, - amplitude=0.05, - relative_phase=0.0, - envelope=Gaussian(rel_sigma=5), - ), - Pulse( - duration=40, - amplitude=0.05, - relative_phase=0.0, - envelope=Drag(rel_sigma=5, beta=0.4), - ), - Pulse( - duration=40, - amplitude=0.05, - relative_phase=0.0, - envelope=Snz(t_idling=10, b_amplitude=0.01), - ), - Pulse( - duration=40, - amplitude=0.05, - relative_phase=0.0, - envelope=Iir( - a=np.array([10, 1]), b=np.array([0.4, 1]), target=Gaussian(rel_sigma=5) - ), - ), - ], -) -def test_pulse_conversion(pulse): - shape = pulse.shape - zhpulse = select_pulse(pulse) - assert isinstance(zhpulse, laboneq_pulse.Pulse) - if isinstance(shape, (Snz, Iir)): - assert len(zhpulse.samples) == 80 - else: - assert zhpulse.length == 40e-9 - - -def test_classify_sweepers(dummy_qrc): - platform = create_platform("zurich") - qubit = platform.qubits[0] - pulse_1 = Pulse( - duration=40, - amplitude=0.05, - envelope=Gaussian(rel_sigma=5), - ) - pulse_2 = Pulse( - duration=40, - amplitude=0.05, - envelope=Rectangular(), - ) - amplitude_sweeper = Sweeper(Parameter.amplitude, np.array([1, 2, 3]), [pulse_1]) - readout_amplitude_sweeper = Sweeper( - Parameter.amplitude, np.array([1, 2, 3, 4, 5]), [pulse_2] - ) - freq_sweeper = Sweeper(Parameter.frequency, np.array([4, 5, 6, 7]), [pulse_1]) - bias_sweeper = Sweeper( - Parameter.bias, np.array([3, 2, 1]), channels=[qubit.flux.name] - ) - nt_sweeps, rt_sweeps = classify_sweepers( - [amplitude_sweeper, readout_amplitude_sweeper, bias_sweeper, freq_sweeper] - ) - - assert amplitude_sweeper in rt_sweeps - assert freq_sweeper in rt_sweeps - assert bias_sweeper in nt_sweeps - assert readout_amplitude_sweeper in nt_sweeps - - -def test_processed_sweeps_pulse_properties(dummy_qrc): - platform = create_platform("zurich") - zi_instrument = platform.instruments["EL_ZURO"] - pulse_1 = Pulse( - duration=40, - amplitude=0.05, - envelope=Gaussian(rel_sigma=5), - ) - pulse_2 = Pulse( - duration=40, - amplitude=0.05, - envelope=Gaussian(rel_sigma=5), - ) - sweeper_amplitude = Sweeper( - Parameter.amplitude, np.array([1, 2, 3]), [pulse_1, pulse_2] - ) - sweeper_duration = Sweeper(Parameter.duration, np.array([1, 2, 3, 4]), [pulse_2]) - processed_sweeps = ProcessedSweeps( - [sweeper_duration, sweeper_amplitude], - zi_instrument.channels.values(), - platform.configs, - ) - - assert len(processed_sweeps.sweeps_for_pulse(pulse_1)) == 1 - assert processed_sweeps.sweeps_for_pulse(pulse_1)[0][0] == Parameter.amplitude - assert isinstance( - processed_sweeps.sweeps_for_pulse(pulse_1)[0][1], lo.SweepParameter - ) - assert len(processed_sweeps.sweeps_for_pulse(pulse_2)) == 2 - - assert len(processed_sweeps.sweeps_for_sweeper(sweeper_amplitude)) == 2 - parallel_sweep_ids = { - s.uid for s in processed_sweeps.sweeps_for_sweeper(sweeper_amplitude) - } - assert len(parallel_sweep_ids) == 2 - assert processed_sweeps.sweeps_for_pulse(pulse_1)[0][1].uid in parallel_sweep_ids - assert any( - s.uid in parallel_sweep_ids - for _, s in processed_sweeps.sweeps_for_pulse(pulse_2) - ) - - assert len(processed_sweeps.sweeps_for_sweeper(sweeper_duration)) == 1 - pulse_2_sweep_ids = {s.uid for _, s in processed_sweeps.sweeps_for_pulse(pulse_2)} - assert len(pulse_2_sweep_ids) == 2 - assert ( - processed_sweeps.sweeps_for_sweeper(sweeper_duration)[0].uid - in pulse_2_sweep_ids - ) - - assert processed_sweeps.channels_with_sweeps() == set() - - -# def test_processed_sweeps_readout_amplitude(dummy_qrc): -# platform = create_platform("zurich") -# qubit_id, qubit = 0, platform.qubits[0] -# readout_ch = measure_channel_name(qubit) -# pulse_readout = Pulse( -# 0, -# 40, -# 0.05, -# int(3e9), -# 0.0, -# Rectangular(), -# readout_ch, -# PulseType.READOUT, -# qubit_id, -# ) -# readout_amplitude_sweeper = Sweeper( -# Parameter.amplitude, np.array([1, 2, 3, 4]), [pulse_readout] -# ) -# processed_sweeps = ProcessedSweeps( -# [readout_amplitude_sweeper], qubits=platform.qubits -# ) -# -# # Readout amplitude should result into channel property (gain) sweep -# assert len(processed_sweeps.sweeps_for_pulse(pulse_readout)) == 0 -# assert processed_sweeps.channels_with_sweeps() == { -# readout_ch, -# } -# assert len(processed_sweeps.sweeps_for_channel(readout_ch)) == 1 - - -def test_zhinst_setup(dummy_qrc): - platform = create_platform("zurich") - zi_instrument = platform.instruments["EL_ZURO"] - assert zi_instrument.time_of_flight == 75 - - -def test_zhinst_configure_acquire_line(dummy_qrc): - platform = create_platform("zurich") - zi_instrument = platform.instruments["EL_ZURO"] - qubit = platform.qubits[0] - - zi_instrument.configure_acquire_line(qubit.acquisition.name, platform.configs) - - assert qubit.acquisition.name in zi_instrument.signal_map - assert ( - "/logical_signal_groups/q0/acquire_line" - in zi_instrument.calibration.calibration_items - ) - - -def test_zhinst_configure_iq_line(dummy_qrc): - platform = create_platform("zurich") - zi_instrument = platform.instruments["EL_ZURO"] - qubit = platform.qubits[0] - zi_instrument.configure_iq_line(qubit.drive.name, platform.configs) - zi_instrument.configure_iq_line(qubit.probe.name, platform.configs) - - assert qubit.drive.name in zi_instrument.signal_map - assert ( - "/logical_signal_groups/q0/drive_line" - in zi_instrument.calibration.calibration_items - ) - - assert qubit.probe.name in zi_instrument.signal_map - assert ( - "/logical_signal_groups/q0/measure_line" - in zi_instrument.calibration.calibration_items - ) - - -def test_zhinst_configure_dc_line(dummy_qrc): - platform = create_platform("zurich") - zi_instrument = platform.instruments["EL_ZURO"] - qubit = platform.qubits[0] - zi_instrument.configure_dc_line(qubit.flux.name, platform.configs) - - assert qubit.flux.name in zi_instrument.signal_map - assert ( - "/logical_signal_groups/q0/flux_line" - in zi_instrument.calibration.calibration_items - ) - - -def test_experiment_flow(dummy_qrc): - platform = create_platform("zurich") - zi_instrument = platform.instruments["EL_ZURO"] - - sequence = PulseSequence() - qubits = {0: platform.qubits[0], 2: platform.qubits[2]} - platform.qubits = qubits - couplers = {} - - for qubit in qubits.values(): - sequence[qubit.flux.name].append( - Pulse.flux( - duration=500, - amplitude=1, - envelope=Rectangular(), - ) - ) - sequence[qubit.probe.name].append(Delay(duration=sequence.duration)) - sequence.extend(qubit.native_gates.MZ.create_sequence()) - - options = ExecutionParameters( - relaxation_time=300e-6, - acquisition_type=AcquisitionType.INTEGRATION, - averaging_mode=AveragingMode.CYCLIC, - ) - - zi_instrument.experiment_flow(qubits, couplers, sequence, options) - - assert qubits[0].flux.name in zi_instrument.experiment.signals - assert qubits[0].probe.name in zi_instrument.experiment.signals - assert qubits[0].acquisition.name in zi_instrument.experiment.signals - - -def test_experiment_flow_coupler(dummy_qrc): - platform = create_platform("zurich") - zi_instrument = platform.instruments["EL_ZURO"] - - sequence = PulseSequence() - qubits = {0: platform.qubits[0], 2: platform.qubits[2]} - platform.qubits = qubits - couplers = {0: platform.couplers[0]} - platform.couplers = couplers - - for qubit in qubits.values(): - sequence[qubit.flux.name].append( - Pulse.flux( - duration=500, - amplitude=1, - envelope=Rectangular(), - ) - ) - sequence[qubit.probe.name].append(Delay(duration=sequence.duration)) - sequence.extend(qubit.native_gates.MZ.create_sequence()) - - for coupler in couplers.values(): - sequence[coupler.flux.name].append( - Pulse( - duration=500, - amplitude=1, - envelope=Rectangular(), - ) - ) - - options = ExecutionParameters( - relaxation_time=300e-6, - acquisition_type=AcquisitionType.INTEGRATION, - averaging_mode=AveragingMode.CYCLIC, - ) - - zi_instrument.experiment_flow(qubits, couplers, sequence, options) - - assert qubits[0].flux.name in zi_instrument.experiment.signals - assert qubits[0].probe.name in zi_instrument.experiment.signals - assert qubits[0].acquisition.name in zi_instrument.experiment.signals - - -def test_sweep_and_play_sim(dummy_qrc): - """Test end-to-end experiment run using ZI emulated connection.""" - platform = create_platform("zurich") - zi_instrument = platform.instruments["EL_ZURO"] - - sequence = PulseSequence() - qubits = {0: platform.qubits[0], 2: platform.qubits[2]} - platform.qubits = qubits - couplers = {} - - for qubit in qubits.values(): - sequence[qubit.flux.name].append( - Pulse.flux( - duration=500, - amplitude=1, - envelope=Rectangular(), - ) - ) - sequence[qubit.probe.name].append(Delay(duration=sequence.duration)) - sequence.extend(qubit.native_gates.MZ.create_sequence()) - - options = ExecutionParameters( - relaxation_time=300e-6, - acquisition_type=AcquisitionType.INTEGRATION, - averaging_mode=AveragingMode.CYCLIC, - nshots=12, - ) - - # check play - zi_instrument.session = lo.Session(zi_instrument.device_setup) - zi_instrument.session.connect(do_emulation=True) - res = zi_instrument.play(platform.configs, [sequence], options, {}) - assert res is not None - assert all(qubit in res for qubit in qubits) - - # check sweep with empty list of sweeps - res = zi_instrument.sweep(platform.configs, [sequence], options, {}) - assert res is not None - assert all(qubit in res for qubit in qubits) - - # check sweep with sweeps - sweep_1 = Sweeper( - Parameter.amplitude, - np.array([1, 2, 3, 4]), - pulses=[sequence[qubit.flux.name][0] for qubit in qubits.values()], - ) - sweep_2 = Sweeper( - Parameter.bias, np.array([1, 2, 3]), channels=[qubits[0].flux.name] - ) - res = zi_instrument.sweep( - platform.configs, [sequence], options, {}, sweep_1, sweep_2 - ) - assert res is not None - assert all(qubit in res for qubit in qubits) - - -@pytest.mark.parametrize("parameter1", [Parameter.duration]) -def test_experiment_sweep_single(dummy_qrc, parameter1): - platform = create_platform("zurich") - zi_instrument = platform.instruments["EL_ZURO"] - - qubit_id, qubit = 0, platform.qubits[0] - couplers = {} - - swept_points = 5 - sequence = PulseSequence() - sequence.extend(qubit.native_gates.RX.create_sequence(theta=np.pi, phi=0.0)) - sequence[qubit.probe.name].append(Delay(duration=sequence.duration)) - sequence.extend(qubit.native_gates.MZ.create_sequence()) - - parameter_range_1 = ( - np.random.rand(swept_points) - if parameter1 is Parameter.amplitude - else np.random.randint(swept_points, size=swept_points) - ) - - sweepers = [] - sweepers.append( - Sweeper(parameter1, parameter_range_1, pulses=[sequence[qubit.drive.name][0]]) - ) - - options = ExecutionParameters( - relaxation_time=300e-6, - acquisition_type=AcquisitionType.INTEGRATION, - averaging_mode=AveragingMode.CYCLIC, - ) - - zi_instrument.experiment_flow({qubit_id: qubit}, couplers, sequence, options) - - assert qubit.drive.name in zi_instrument.experiment.signals - assert qubit.probe.name in zi_instrument.experiment.signals - assert qubit.acquisition.name in zi_instrument.experiment.signals - - -@pytest.mark.parametrize("parameter1", [Parameter.duration]) -def test_experiment_sweep_single_coupler(dummy_qrc, parameter1): - platform = create_platform("zurich") - zi_instrument = platform.instruments["EL_ZURO"] - - qubits = {0: platform.qubits[0], 2: platform.qubits[2]} - couplers = {0: platform.couplers[0]} - - swept_points = 5 - sequence = PulseSequence() - for qubit in qubits.values(): - sequence.extend(qubit.native_gates.RX.create_sequence(theta=np.pi, phi=0.0)) - sequence[qubit.probe.name].append(Delay(duration=sequence.duration)) - sequence.extend(qubit.native_gates.MZ.create_sequence()) - - for coupler in couplers.values(): - sequence[coupler.flux.name].append( - Pulse( - duration=500, - amplitude=1, - envelope=Rectangular(), - ) - ) - - parameter_range_1 = ( - np.random.rand(swept_points) - if parameter1 is Parameter.amplitude - else np.random.randint(swept_points, size=swept_points) - ) - - sweepers = [] - sweepers.append( - Sweeper( - parameter1, - parameter_range_1, - pulses=[sequence[coupler.flux.name][0] for coupler in couplers.values()], - ) - ) - - options = ExecutionParameters( - relaxation_time=300e-6, - acquisition_type=AcquisitionType.INTEGRATION, - averaging_mode=AveragingMode.CYCLIC, - ) - - zi_instrument.experiment_flow(qubits, couplers, sequence, options) - - assert couplers[0].flux.name in zi_instrument.experiment.signals - assert qubits[0].drive.name in zi_instrument.experiment.signals - assert qubits[0].probe.name in zi_instrument.experiment.signals - assert qubits[0].acquisition.name in zi_instrument.experiment.signals - - -SweeperParameter = { - Parameter.frequency, - Parameter.amplitude, - Parameter.duration, - Parameter.relative_phase, -} - - -@pytest.mark.parametrize("parameter1", Parameter) -@pytest.mark.parametrize("parameter2", Parameter) -def test_experiment_sweep_2d_general(dummy_qrc, parameter1, parameter2): - platform = create_platform("zurich") - zi_instrument = platform.instruments["EL_ZURO"] - - qubits = {0: platform.qubits[0]} - couplers = {} - - swept_points = 5 - sequence = PulseSequence() - for qubit in qubits.values(): - sequence.extend(qubit.native_gates.RX.create_sequence(theta=np.pi, phi=0.0)) - sequence[qubit.probe.name].append(Delay(duration=sequence.duration)) - sequence.extend(qubit.native_gates.MZ.create_sequence()) - - parameter_range_1 = ( - np.random.rand(swept_points) - if parameter1 is Parameter.amplitude - else np.random.randint(swept_points, size=swept_points) - ) - - parameter_range_2 = ( - np.random.rand(swept_points) - if parameter2 is Parameter.amplitude - else np.random.randint(swept_points, size=swept_points) - ) - - sweepers = [] - if parameter1 in SweeperParameter: - if parameter1 is not Parameter.start: - sweepers.append( - Sweeper( - parameter1, - parameter_range_1, - pulses=[sequence[qubit.probe.name][0] for qubit in qubits.values()], - ) - ) - if parameter2 in SweeperParameter: - if parameter2 is Parameter.amplitude: - if parameter1 is not Parameter.amplitude: - sweepers.append( - Sweeper( - parameter2, - parameter_range_2, - pulses=[ - sequence[qubit.drive.name][0] for qubit in qubits.values() - ], - ) - ) - - options = ExecutionParameters( - relaxation_time=300e-6, - acquisition_type=AcquisitionType.INTEGRATION, - averaging_mode=AveragingMode.CYCLIC, - ) - - zi_instrument.experiment_flow(qubits, couplers, sequence, options) - - assert qubits[0].drive.name in zi_instrument.experiment.signals - assert qubits[0].probe.name in zi_instrument.experiment.signals - assert qubits[0].acquisition.name in zi_instrument.experiment.signals - - -def test_experiment_sweep_2d_specific(dummy_qrc): - platform = create_platform("zurich") - zi_instrument = platform.instruments["EL_ZURO"] - - qubits = {0: platform.qubits[0]} - couplers = {} - - swept_points = 5 - sequence = PulseSequence() - for qubit in qubits.values(): - sequence.extend(qubit.native_gates.RX.create_sequence(theta=np.pi, phi=0.0)) - sequence[qubit.probe.name].append(Delay(duration=sequence.duration)) - sequence.extend(qubit.native_gates.MZ.create_sequence()) - - parameter1 = Parameter.relative_phase - parameter2 = Parameter.frequency - - parameter_range_1 = ( - np.random.rand(swept_points) - if parameter1 is Parameter.amplitude - else np.random.randint(swept_points, size=swept_points) - ) - - parameter_range_2 = ( - np.random.rand(swept_points) - if parameter2 is Parameter.amplitude - else np.random.randint(swept_points, size=swept_points) - ) - - sweepers = [] - qd_pulses = [sequence[qubit.drive.name][0] for qubit in qubits.values()] - sweepers.append(Sweeper(parameter1, parameter_range_1, pulses=qd_pulses)) - sweepers.append(Sweeper(parameter2, parameter_range_2, pulses=qd_pulses)) - - options = ExecutionParameters( - relaxation_time=300e-6, - acquisition_type=AcquisitionType.INTEGRATION, - averaging_mode=AveragingMode.CYCLIC, - ) - - zi_instrument.experiment_flow(qubits, couplers, sequence, options) - - assert qubits[0].drive.name in zi_instrument.experiment.signals - assert qubits[0].probe.name in zi_instrument.experiment.signals - assert qubits[0].acquisition.name in zi_instrument.experiment.signals - - -@pytest.mark.parametrize( - "parameter", [Parameter.frequency, Parameter.amplitude, Parameter.bias] -) -def test_experiment_sweep_punchouts(dummy_qrc, parameter): - platform = create_platform("zurich") - zi_instrument = platform.instruments["EL_ZURO"] - - qubits = {0: platform.qubits[0]} - couplers = {} - - if parameter is Parameter.frequency: - parameter1 = Parameter.frequency - parameter2 = Parameter.amplitude - if parameter is Parameter.amplitude: - parameter1 = Parameter.amplitude - parameter2 = Parameter.frequency - if parameter is Parameter.bias: - parameter1 = Parameter.bias - parameter2 = Parameter.frequency - - swept_points = 5 - sequence = PulseSequence() - for qubit in qubits.values(): - sequence.extend(qubit.native_gates.MZ.create_sequence()) - - parameter_range_1 = ( - np.random.rand(swept_points) - if parameter1 in [Parameter.amplitude, Parameter.bias] - else np.random.randint(swept_points, size=swept_points) - ) - - parameter_range_2 = ( - np.random.rand(swept_points) - if parameter2 is Parameter.amplitude - else np.random.randint(swept_points, size=swept_points) - ) - - sweepers = [] - ro_pulses = [sequence[qubit.probe.name][0] for qubit in qubits.values()] - if parameter1 is Parameter.bias: - sweepers.append( - Sweeper( - parameter1, - parameter_range_1, - channels=[qubit.probe.name for qubit in qubits.values()], - ) - ) - else: - sweepers.append(Sweeper(parameter1, parameter_range_1, pulses=ro_pulses)) - sweepers.append(Sweeper(parameter2, parameter_range_2, pulses=ro_pulses)) - - options = ExecutionParameters( - relaxation_time=300e-6, - acquisition_type=AcquisitionType.INTEGRATION, - averaging_mode=AveragingMode.CYCLIC, - ) - - zi_instrument.experiment_flow(qubits, couplers, sequence, options) - - assert qubits[0].probe.name in zi_instrument.experiment.signals - assert qubits[0].acquisition.name in zi_instrument.experiment.signals - - -def test_batching(dummy_qrc): - platform = create_platform("zurich") - instrument = platform.instruments["EL_ZURO"] - - sequence = PulseSequence() - sequence.extend( - platform.qubits[0].native_gates.RX.create_sequence(theta=np.pi, phi=0.0) - ) - sequence.extend( - platform.qubits[1].native_gates.RX.create_sequence(theta=np.pi, phi=0.0) - ) - measurement_start = sequence.duration - sequence[platform.qubits[0].probe.name].append(Delay(duration=measurement_start)) - sequence[platform.qubits[1].probe.name].append(Delay(duration=measurement_start)) - sequence.extend(platform.qubits[0].native_gates.MZ.create_sequence()) - sequence.extend(platform.qubits[1].native_gates.MZ.create_sequence()) - - batches = list(batch(600 * [sequence], instrument.bounds)) - # These sequences get limited by the number of measuraments (600/250/2) - assert len(batches) == 5 - assert len(batches[0]) == 125 - assert len(batches[1]) == 125 - - -@pytest.fixture(scope="module") -def instrument(connected_platform): - return get_instrument(connected_platform, Zurich) - - -@pytest.mark.qpu -def test_connections(instrument): - instrument.start() - instrument.stop() - instrument.disconnect() - instrument.connect() - - -@pytest.mark.qpu -def test_experiment_execute_qpu(connected_platform, instrument): - platform = connected_platform - sequence = PulseSequence() - qubits = {0: platform.qubits[0], "c0": platform.qubits["c0"]} - platform.qubits = qubits - - for qubit in qubits.values(): - sequence[qubit.flux.name].append( - Pulse.flux( - duration=500, - amplitude=1, - envelope=Rectangular(), - ) - ) - if qubit.flux_coupler: - continue - - sequence[qubit.probe.name].append(Delay(duration=sequence.duration)) - sequence.extend(qubit.native_gates.MZ.create_sequence()) - - options = ExecutionParameters( - relaxation_time=300e-6, - acquisition_type=AcquisitionType.INTEGRATION, - averaging_mode=AveragingMode.CYCLIC, - ) - - results = platform.execute([sequence], options) - assert all(len(results[sequence.probe_pulses[q].id]) > 1 for q in qubits) - - -@pytest.mark.qpu -def test_experiment_sweep_2d_specific_qpu(connected_platform, instrument): - platform = connected_platform - qubits = {0: platform.qubits[0]} - - swept_points = 5 - sequence = PulseSequence() - for qubit in qubits.values(): - sequence.extend(qubit.native_gates.RX.create_sequence(theta=np.pi, phi=0.0)) - sequence[qubit.probe.name].append(Delay(duration=sequence.duration)) - sequence.extend(qubit.native_gates.MZ.create_sequence()) - - parameter1 = Parameter.relative_phase - parameter2 = Parameter.frequency - - parameter_range_1 = ( - np.random.rand(swept_points) - if parameter1 is Parameter.amplitude - else np.random.randint(swept_points, size=swept_points) - ) - - parameter_range_2 = ( - np.random.rand(swept_points) - if parameter2 is Parameter.amplitude - else np.random.randint(swept_points, size=swept_points) - ) - - sweepers = [] - qd_pulses = [sequence[qubit.drive.name][0] for qubit in qubits.values()] - sweepers.append(Sweeper(parameter1, parameter_range_1, pulses=qd_pulses)) - sweepers.append(Sweeper(parameter2, parameter_range_2, pulses=qd_pulses)) - - options = ExecutionParameters( - relaxation_time=300e-6, - acquisition_type=AcquisitionType.INTEGRATION, - averaging_mode=AveragingMode.CYCLIC, - ) - - results = platform.sweep( - sequence, - options, - sweepers[0], - sweepers[1], - ) - - assert all(len(results[sequence.probe_pulses[q].id]) for q in qubits) > 0 From 6608067b8af9253f16659ccabd31ce37e5bd992e Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Wed, 28 Aug 2024 18:04:22 +0300 Subject: [PATCH 0753/1006] chore: drop references to removed drivers from docs --- README.md | 1 - doc/source/index.rst | 1 - doc/source/main-documentation/qibolab.rst | 82 -- doc/source/tutorials/instrument.rst | 8 +- examples/fidelity_example.py | 16 - examples/minimum_working_example.py | 45 - .../qibolab_v017_1Q_emulator_test_QuTiP.ipynb | 964 ------------------ src/qibolab/platform/load.py | 2 +- tests/conftest.py | 9 +- 9 files changed, 3 insertions(+), 1125 deletions(-) delete mode 100644 examples/fidelity_example.py delete mode 100644 examples/minimum_working_example.py delete mode 100644 examples/qibolab_v017_1Q_emulator_test_QuTiP.ipynb diff --git a/README.md b/README.md index df04418f47..38ddce8130 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,6 @@ Some of the key features of Qibolab are: - Create custom experimental drivers for custom lab setup. - Support multiple heterogeneous platforms. - Use existing calibration procedures for experimentalists. -- Provide a emulator backend equipped with various quantum dynamics simulation engines (currently support: QuTiP) for seamless emulation of quantum hardware. ## Documentation diff --git a/doc/source/index.rst b/doc/source/index.rst index 334386a602..3c066e34ff 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -17,7 +17,6 @@ circuits on quantum hardware. Qibolab includes: #. :ref:`Arbitrary pulse API `: provide a library of custom pulses for execution through instruments. #. :ref:`Compiler `: compiles quantum circuits into pulse sequences. #. :ref:`Quantum Circuit Deployment `: seamlessly deploys quantum circuit models on quantum hardware. -#. :ref:`Emulator `: seamless emulation of quantum hardware based on a emulator backend equipped with various quantum dynamics simulation engines. Components ---------- diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index b15d103b0b..7593cd66b1 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -128,32 +128,6 @@ It is useful for testing parts of the code that do not necessarily require acces will create a dummy platform that also has coupler qubits. -.. _main_doc_emulator: - -Emulator platform -^^^^^^^^^^^^^^^^^ - -QiboLab supports the use of emulators to simulate the behavior of quantum devices. It uses :class:`qibolab.instruments.emulator.pulse_simulator.PulseSimulator`, which is a controller that utilizes a simulation engine to numerically solve the dynamics of the device in the presence of control pulse sequences specified by :class:`qibolab.pulses.PulseSequence`. The emulator platform for a specific device requires its own platform folder and can be initialized in the same way as any other real platforms:: - - # .. testcode:: python_emulator - - import os - from pathlib import Path - - path_to_emulator_runcard = str(Path.cwd().parent / "tests" / "emulators") - - emulator_runcard_name = "default_q0" - - os.environ["QIBOLAB_PLATFORMS"] = path_to_emulator_runcard # can also be set beforehand - - from qibolab import create_platform - - platform = create_platform(emulator_runcard_name) - -An emulator platform is equivalent to real platforms in terms of attributes and functions, but returns simulated results. -It is useful for testbedding and calibrating pulses, and testing calibration and characterization routines for the corresponding real device especially when access to the real device is limited or when it is unavailable. - - .. _main_doc_qubits: Qubits @@ -660,11 +634,8 @@ A list of all the supported instruments follows: Controllers (subclasses of :class:`qibolab.instruments.abstract.Controller`): - Dummy Instrument: :class:`qibolab.instruments.dummy.DummyInstrument` - - PulseSimulator Instrument: :class:`qibolab.instruments.emulator.pulse_simulator.PulseSimulator` - Zurich Instruments: :class:`qibolab.instruments.zhinst.Zurich` - Quantum Machines: :class:`qibolab.instruments.qm.controller.QMController` - - Qblox: :class:`qibolab.instruments.qblox.controller.QbloxCluster` - - Xilinx RFSoCs: :class:`qibolab.instruments.rfsoc.driver.RFSoC` Other Instruments (subclasses of :class:`qibolab.instruments.abstract.Instrument`): - Erasynth++: :class:`qibolab.instruments.erasynth.ERA` @@ -723,56 +694,3 @@ Quantum Machines Tested with a cluster of nine `OPX+ `_ controllers, using QOP213 and QOP220. Qibolab is communicating with the instruments using the `QUA `_ language, via the ``qm-qua`` and ``qualang-tools`` Python libraries. - -Qblox -^^^^^ - -Supports the following Instruments: - -- Cluster -- Cluster QRM-RF -- Cluster QCM-RF -- Cluster QCM - -Compatible with qblox-instruments driver 0.9.0 (28/2/2023). - -RFSoCs -^^^^^^ - -Compatible and tested with: - -- Xilinx RFSoC4x2 -- Xilinx ZCU111 -- Xilinx ZCU216 - -Technically compatible with any board running ``qibosoq``. - -Pulse Simulator -^^^^^^^^^^^^^^^ - -The simulation controller that is used exclusively by the emulator. It serves primarily to implement the device model using the selected quantum dynamics simulation library (engine), as well as translate and communicate between objects from ``qibolab`` and the selected engine. - -Available simulation engines: - -- ``qutip`` - -Currently ``AcquisitionType.DISCRIMINATION`` and ``AcquisitionType.INTEGRATION`` are supported. Note that for ``AcquistionType.INTEGRATION`` samples are projected onto the I component. - -Currently does not support: - -- Couplers -- Flux pulses - -.. admonition:: Qibocal compatibility - - The following protocols are currently compatible with the emulator platform (``default_q0``): - - - `1D Rabi experiments` - - `Ramsey experiments` - - `T1` - - `T2` - - `T2 echo` - - `Flipping experiments` - - `Single Qubit State Tomography` - - `AllXY` - - `Standard RB` diff --git a/doc/source/tutorials/instrument.rst b/doc/source/tutorials/instrument.rst index a0bc645ffc..8a1c36a67f 100644 --- a/doc/source/tutorials/instrument.rst +++ b/doc/source/tutorials/instrument.rst @@ -5,9 +5,7 @@ Currently, Qibolab support various instruments: as **controller**: * Quantum Machines -* QBlox * Zurich instruments -* Xilinx RFSoCs and as **local oscillators**: @@ -18,7 +16,7 @@ If you need to add a new driver, to support a new instruments in your setup, we In this section, anyway, a basic example will be given. For clarity, we divide the instruments in two different groups: the **controllers** and the standard **instruments**, where the controller is an instrument that can execute pulse sequences. -For example, a local oscillator is just an instrument, while QBlox is a controller. +For example, a local oscillator is just an instrument, while Quantum Machines is a controller. Add an instrument ----------------- @@ -105,10 +103,6 @@ The additional methods required are: * ``play_sequences()`` * ``sweep()`` -The simplest real example is the RFSoCs driver in -:class:`qibolab.instruments.rfsoc.driver.RFSoC`, but still the code is much more -complex than the local oscillator ones. - Let's see a minimal example: .. code-block:: python diff --git a/examples/fidelity_example.py b/examples/fidelity_example.py deleted file mode 100644 index a2f2e56127..0000000000 --- a/examples/fidelity_example.py +++ /dev/null @@ -1,16 +0,0 @@ -from qibolab import create_platform -from qibolab.paths import qibolab_folder - -# Define platform and load specific runcard -runcard = qibolab_folder / "runcards" / "tii5q.yml" -platform = create_platform("tii5q", runcard) - -# Connects to lab instruments using the details specified in the calibration settings. -platform.connect() -# Executes a pulse sequence. -results = platform.measure_fidelity(qubits=[1, 2, 3, 4], nshots=3000) -print( - f"results[qubit] (rotation_angle, threshold, fidelity, assignment_fidelity): {results}" -) -# Disconnect from the instruments -platform.disconnect() diff --git a/examples/minimum_working_example.py b/examples/minimum_working_example.py deleted file mode 100644 index b33cdf6629..0000000000 --- a/examples/minimum_working_example.py +++ /dev/null @@ -1,45 +0,0 @@ -from qibolab import create_platform -from qibolab.paths import qibolab_folder -from qibolab.pulses import Pulse, ReadoutPulse -from qibolab.sequence import PulseSequence - -# Define PulseSequence -sequence = PulseSequence() -# Add some pulses to the pulse sequence -sequence.append( - Pulse( - start=0, - amplitude=0.3, - duration=4000, - frequency=200_000_000, - relative_phase=0, - shape="Gaussian(5)", # Gaussian shape with std = duration / 5 - channel=1, - qubit=0, - ) -) - -sequence.append( - ReadoutPulse( - start=4004, - amplitude=0.9, - duration=2000, - frequency=20_000_000, - relative_phase=0, - shape="Rectangular", - channel=2, - qubit=0, - ) -) - -# Define platform and load specific runcard -runcard = qibolab_folder / "runcards" / "tii1q.yml" -platform = create_platform("tii1q", runcard) - -# Connects to lab instruments using the details specified in the calibration settings. -platform.connect() -# Executes a pulse sequence. -results = platform.execute([sequence], nshots=3000) -print(f"results (amplitude, phase, i, q): {results}") -# Disconnect from the instruments -platform.disconnect() diff --git a/examples/qibolab_v017_1Q_emulator_test_QuTiP.ipynb b/examples/qibolab_v017_1Q_emulator_test_QuTiP.ipynb deleted file mode 100644 index d72c27c56b..0000000000 --- a/examples/qibolab_v017_1Q_emulator_test_QuTiP.ipynb +++ /dev/null @@ -1,964 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "1472864f-98c4-422a-99ec-d0fd67d4bf9e", - "metadata": {}, - "source": [ - "# Qibolab v0.1.7 1Q emulator demo for QuTiP engine" - ] - }, - { - "cell_type": "markdown", - "id": "e2fcc40a", - "metadata": {}, - "source": [ - "Results updated on: 18 June 2024" - ] - }, - { - "cell_type": "markdown", - "id": "c281a2bf-dc45-441a-8869-4a0a7d3c35bc", - "metadata": { - "tags": [] - }, - "source": [ - "## Setting up and using the emulator platform" - ] - }, - { - "cell_type": "markdown", - "id": "2720e9bb-ed10-46a9-bb46-cfc1f487ab77", - "metadata": {}, - "source": [ - "The emulator is instantiated like any other device platform in Qibolab, by first adding the path to the emulator runcard to the `QIBOLAB_PLATFORMS` environment variable and then using `qibolab.create_platform`. In this tutorial, we will be using the test emulator `default_q0` that can be found in ``/qibolab/tests/emulators/``:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "4406fccb-60aa-415b-b264-d27c8a5b4eb7", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[Qibo 0.2.6|INFO|2024-06-18 02:01:41]: Loading platform default_q0\n", - "INFO:qibo.config:Loading platform default_q0\n" - ] - } - ], - "source": [ - "# add directory of emulator platform to QIBOLAB_PLATFORMS environment variable\n", - "import pathlib, os\n", - "emulator_path = pathlib.Path(os.path.abspath('')).parent/'tests/emulators/'\n", - "os.environ[\"QIBOLAB_PLATFORMS\"] = emulator_path.as_posix() \n", - "\n", - "# create emulator platform as per any other device platform\n", - "from qibolab import create_platform\n", - "emulator_platform = create_platform(\"default_q0\")" - ] - }, - { - "cell_type": "markdown", - "id": "7f1c6458-1276-4250-b67a-87a7ff0a7ac4", - "metadata": {}, - "source": [ - "Similarly, the emulator plays pulse sequences in the same way as any other device platforms. In this tutorial, we will play a simple RX pulse followed by a readout pulse as defined in the runcard on the 'default_q0' single-qubit emulator that we have just initialized:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "02588224-329c-4466-8486-29b8752faddc", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[Qibo 0.2.6|INFO|2024-06-18 02:01:41]: Minimal execution time (sequence): 0.30500777777777777\n", - "INFO:qibo.config:Minimal execution time (sequence): 0.30500777777777777\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - " Total run time: 1.19s*] Elapsed 1.19s / Remaining 00:00:00:00[*********72%***** ] Elapsed 0.91s / Remaining 00:00:00:00\n" - ] - } - ], - "source": [ - "from qibolab.pulses import PulseSequence\n", - "\n", - "# Extract preset pulses from runcard\n", - "pulse_x0 = emulator_platform.create_RX_pulse(qubit=0, start=0)\n", - "pulse_r0 = emulator_platform.create_qubit_readout_pulse(qubit=0, start=int(pulse_x0.duration + 5))\n", - "\n", - "# Add pulses to PulseSequence\n", - "sequence = PulseSequence()\n", - "sequence.add(pulse_x0)\n", - "sequence.add(pulse_r0)\n", - "\n", - "from qibolab.execution_parameters import ExecutionParameters\n", - "\n", - "# Execute the pulse sequence and save the output\n", - "options = ExecutionParameters(nshots=1000)\n", - "results = emulator_platform.execute([sequence], options=options)" - ] - }, - { - "cell_type": "markdown", - "id": "dfdf69bd-fd58-4eb7-a99a-764c22d18334", - "metadata": { - "tags": [] - }, - "source": [ - "## Pulse simulator and simulation engine" - ] - }, - { - "cell_type": "markdown", - "id": "af73d5f8-a126-4791-826b-a537c2610618", - "metadata": {}, - "source": [ - "The only instrument used by the emulator is the :class:`qibolab.instruments.emulator.pulse_simulator.PulseSimulator`" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "ef46ee8e-c1a2-4fc1-bd1f-c0d75cb6959f", - "metadata": {}, - "outputs": [], - "source": [ - "pulse_simulator = emulator_platform.instruments['pulse_simulator']" - ] - }, - { - "cell_type": "markdown", - "id": "9c1da6a3-2738-43c0-bf97-dd7664249ad9", - "metadata": {}, - "source": [ - "The information from the runcard used to initialized the `PulseSimulator` can be found under `'instruments'`, and is further grouped under `'model_params'` and `'simulations_config'`. " - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "3b72c4ef-d03c-43ea-93b5-41846281b39e", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'pulse_simulator': {'model_params': {'model_name': 'general_no_coupler_model',\n", - " 'topology': [],\n", - " 'nqubits': 1,\n", - " 'ncouplers': 0,\n", - " 'qubits_list': ['0'],\n", - " 'couplers_list': [],\n", - " 'nlevels_q': [3],\n", - " 'nlevels_c': [],\n", - " 'readout_error': {'0': [0.01, 0.02]},\n", - " 'drive_freq': {'0': 5.090167234445013},\n", - " 'T1': {'0': 88578.48970762537},\n", - " 'T2': {'0': 106797.94866226273},\n", - " 'lo_freq': {'0': 5.090167234445013},\n", - " 'rabi_freq': {'0': 0.333},\n", - " 'anharmonicity': {'0': -0.3361230051821652},\n", - " 'coupling_strength': {}},\n", - " 'simulation_config': {'simulation_engine_name': 'Qutip',\n", - " 'sampling_rate': 4.5,\n", - " 'sim_sampling_boost': 10,\n", - " 'runcard_duration_in_dt_units': False,\n", - " 'instant_measurement': True,\n", - " 'simulate_dissipation': True,\n", - " 'output_state_history': True},\n", - " 'sim_opts': None,\n", - " 'bounds': {'waveforms': 1, 'readout': 1, 'instructions': 1}}}" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from qibolab.serialize import load_runcard\n", - "\n", - "load_runcard(emulator_path/\"default_q0\")['instruments']" - ] - }, - { - "cell_type": "markdown", - "id": "290cc6ae-372a-4596-abb5-1d7313365385", - "metadata": {}, - "source": [ - "As indicated from 'model_params', this emulator simulates a single qubit as a 3-level quantum system with no couplers. All frequencies given are in units of GHz and all times in ns." - ] - }, - { - "cell_type": "markdown", - "id": "8e089478-44b0-4ad2-9ab2-2162414e94b0", - "metadata": {}, - "source": [ - "The PulseSimulator contains a `simulation_engine`, which in turn contains methods to simulate the dynamics of the pulse-device system, as well as process the results, using a specific quantum dynamics simulation library, which in this case is `QuTiP`:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "f8b38586-d48f-4ca3-b76f-feac1f332904", - "metadata": {}, - "outputs": [], - "source": [ - "simulation_engine = pulse_simulator.simulation_engine" - ] - }, - { - "cell_type": "markdown", - "id": "a3692ac5-2e5c-4806-b674-ed2720a12ed3", - "metadata": {}, - "source": [ - "To help visualize the model, we can use the `print_hamiltonian` function from `qibolab_visualization.emulator`:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "d70d80ac-21de-40db-82aa-f669372e7c06", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Dictionary\n" - ] - }, - { - "data": { - "text/latex": [ - "$O_i = b^{\\dagger}_i b_i$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$X_i = b^{\\dagger}_i + b_i$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "\n", - "---------------------\n", - "One-body drift terms:\n", - "---------------------\n" - ] - }, - { - "data": { - "text/latex": [ - "$O_0$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$5.090167234445013~\\text{GHz}$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$O_0O_0-O_0$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$-0.1680615025910826~\\text{GHz}$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "---------------------\n", - "Two-body drift terms:\n", - "---------------------\n", - "None\n", - "---------------------\n", - "One-body drive terms:\n", - "---------------------\n" - ] - }, - { - "data": { - "text/latex": [ - "$X_0$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$0.333~\\text{GHz}$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "---------------------\n", - "Dissipative terms:\n", - "---------------------\n", - ">> t1 Linblad operators:\n" - ] - }, - { - "data": { - "text/latex": [ - "$\\sigma^+_0$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$0.0023758601136844794~\\sqrt{{ \\text{GHz} }}$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - ">> t2 Linblad operators:\n" - ] - }, - { - "data": { - "text/latex": [ - "$\\sigma^Z_0$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$0.002163732391848669~\\sqrt{{ \\text{GHz} }}$" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "---------------------\n" - ] - } - ], - "source": [ - "from qibolab_visualization.emulator import print_hamiltonian\n", - "print_hamiltonian(simulation_engine.model_config)" - ] - }, - { - "cell_type": "markdown", - "id": "e779a202-96bd-4a40-a9a6-64c110fd51dd", - "metadata": { - "tags": [] - }, - "source": [ - "## Simulation results" - ] - }, - { - "cell_type": "markdown", - "id": "08e1c8ee-8076-47ee-a05a-bcc068d681d0", - "metadata": {}, - "source": [ - "The simulation results generated by the simulation engine are returned together with the usual outputs of `execute` for device platforms and are grouped under 'simulation'. \n", - "\n", - "Let us retrieve the simulation results obtained previously:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "9e45c3b1-1313-4fba-8dda-5810293369a7", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "dict_keys(['sequence_duration', 'simulation_dt', 'simulation_time', 'output_states'])" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "simulation_results = results['simulation']\n", - "simulation_results.keys()" - ] - }, - { - "cell_type": "markdown", - "id": "d1a09410-20f2-4797-9540-636f427a76cb", - "metadata": {}, - "source": [ - "The time taken to complete the simulation is:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "abfff213-828e-434c-b4c5-2de8c07d8ae5", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1.192088042" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "simulation_results['simulation_time']" - ] - }, - { - "cell_type": "markdown", - "id": "f499f704-f3da-4031-92c9-a9ef92d171ba", - "metadata": {}, - "source": [ - "In addition, one can generate the list of discretized times used in the simulation:" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "b6a08d7f-bd83-44b1-868f-9346e8cd21e2", - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "sequence_duration = simulation_results['sequence_duration']\n", - "simulation_dt = simulation_results['simulation_dt']\n", - "sim_time_list = np.linspace(0,sequence_duration,num=int(sequence_duration/simulation_dt)+1)" - ] - }, - { - "cell_type": "markdown", - "id": "79574a8f-d831-48d5-a47c-848392773fda", - "metadata": {}, - "source": [ - "When 'output_state_history' in `'simulation_config'` is set to 'True', the corresponding device quantum states obtained from simulation at each of these times are stored in 'output_states' as objects native to the simulation engine library. In this case, these are :class:`qutip.Qobj`. As an example, we see that the initial state is indeed the density matrix for a 3 level system corresponding to $\\ket{0}$:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "757e3e62-86d4-46c5-8ff4-8d0b62d3ca85", - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "Quantum object: dims = [[3], [3]], shape = (3, 3), type = oper, isherm = True $ \\\\ \\left(\\begin{matrix}1.0 & 0.0 & 0.0\\\\0.0 & 0.0 & 0.0\\\\0.0 & 0.0 & 0.0\\\\\\end{matrix}\\right)$" - ], - "text/plain": [ - "Quantum object: dims = [[3], [3]], shape = (3, 3), type = oper, isherm = True\n", - "Qobj data =\n", - "[[1. 0. 0.]\n", - " [0. 0. 0.]\n", - " [0. 0. 0.]]" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "simulated_states = simulation_results['output_states']\n", - "simulated_states[0]" - ] - }, - { - "cell_type": "markdown", - "id": "d8df8936-bd2c-4794-a392-2ff6816391c7", - "metadata": {}, - "source": [ - "One can call the `compute_overlaps` method in the simulation engine to compute the overlaps of the state with the different computational basis states for the entire simulation history. We can then visualize this with the plot_overlaps function from `qibolab_visualization.emulator`:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "d912711f-4618-421b-92c7-f5b61c4b853b", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Overlap of final state with basis states:\n", - "[0] 0.0016351326811553345\n", - "[1] 0.9982829949142029\n", - "[2] 8.187240463464329e-05\n" - ] - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "overlaps = simulation_engine.compute_overlaps(simulated_states)\n", - "\n", - "from qibolab_visualization.emulator import plot_overlaps\n", - "plot_overlaps(overlaps,sim_time_list,time_label='Time / ns');" - ] - }, - { - "cell_type": "markdown", - "id": "8e369387-8913-4e8d-8a21-b8970f358407", - "metadata": { - "tags": [] - }, - "source": [ - "## Sampling and applying readout noise" - ] - }, - { - "cell_type": "markdown", - "id": "5688f522-e408-4759-b951-74fa003b6be3", - "metadata": {}, - "source": [ - "By default, the 'readout_error' from the `'model_params'` dictionary is applied when generating the samples from simulation without noise:" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "bce5d664-de80-45cc-9611-71a138b3fbbf", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 983)" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "samples = results[0].samples\n", - "samples[:20].tolist(), np.sum(samples)" - ] - }, - { - "cell_type": "markdown", - "id": "24a8bb55-23ce-4c3d-a73c-bcced2ddaa6e", - "metadata": {}, - "source": [ - "Samples can be obtained from the final state of the simulation without applying readout error manually by the `get_samples` function:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "286e6c12-b87b-47cf-9d73-541194f5c185", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "text/plain": [ - "([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 999)" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "final_state = simulated_states[-1]\n", - "\n", - "from qibolab.instruments.emulator.pulse_simulator import get_samples\n", - "ro_qubit_list = [pulse_r0.qubit]\n", - "ro_reduced_dm, rdm_qubit_list = pulse_simulator.simulation_engine.qobj_to_reduced_dm(final_state, ro_qubit_list)\n", - "noiseless_samples = get_samples(1000, ro_reduced_dm, rdm_qubit_list, pulse_simulator.simulation_engine.qid_nlevels_map)\n", - "\n", - "noiseless_samples[0][:20], np.sum(noiseless_samples[0])" - ] - }, - { - "cell_type": "markdown", - "id": "97b760c6-01d4-43a1-96af-37e810247fa2", - "metadata": {}, - "source": [ - "The `readout_error` can be applied subsequently as well with the `apply_readout_noise` function:" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "4e6a91b6-3d27-4505-9f10-718b19fb6c0d", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "([1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 905)" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from qibolab.instruments.emulator.pulse_simulator import apply_readout_noise\n", - "\n", - "readout_error = {0: [0.1, 0.1], 1: [0.1, 0.1]}\n", - "noisy_samples = apply_readout_noise(noiseless_samples, readout_error)\n", - "noisy_samples[0][:20], np.sum(noisy_samples[0])" - ] - }, - { - "cell_type": "markdown", - "id": "24a9f3fe-93e3-4daa-87f7-272a8a016119", - "metadata": {}, - "source": [ - "## Returning only the final state of simulations" - ] - }, - { - "cell_type": "markdown", - "id": "7a877c1f-e780-4289-9351-0821593997b5", - "metadata": {}, - "source": [ - "In some cases, the entire history of the simulated states is not needed. One can save memory by setting `'output_state_history' = 'False'`in `'simulations_config'`. This is useful for instance when running sweepers:" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "e0690c99-11a0-45a0-87c2-f81ba39f3bf6", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "from qibolab.sweeper import Sweeper, Parameter\n", - "\n", - "parameter = Parameter.duration\n", - "parameter2 = Parameter.amplitude\n", - "parameter_range = np.linspace(pulse_x0.duration*.5, pulse_x0.duration*1.0, num=2)\n", - "parameter2_range = np.linspace(pulse_x0.amplitude*.95, pulse_x0.amplitude*1.05, num=3)\n", - "sweeper = Sweeper(parameter, parameter_range, [pulse_x0])\n", - "sweeper2 = Sweeper(parameter2, parameter2_range, [pulse_x0])" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "9012c9b0-74a2-420f-8c4c-2c1addb16803", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[Qibo 0.2.6|INFO|2024-06-18 02:01:43]: Minimal execution time (sweep): 7.4958711466666665\n", - "INFO:qibo.config:Minimal execution time (sweep): 7.4958711466666665\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - " Total run time: 0.89s*] Elapsed 0.89s / Remaining 00:00:00:00[****** 26% ] Elapsed 0.28s / Remaining 00:00:00:00\n", - " Total run time: 0.99s*] Elapsed 0.99s / Remaining 00:00:00:00[* 6% ] Elapsed 0.11s / Remaining 00:00:00:01\n", - " [ 1% ] Elapsed 0.01s / Remaining 00:00:00:01" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "IOPub message rate exceeded.\n", - "The Jupyter server will temporarily stop sending output\n", - "to the client in order to avoid crashing it.\n", - "To change this limit, set the config variable\n", - "`--ServerApp.iopub_msg_rate_limit`.\n", - "\n", - "Current values:\n", - "ServerApp.iopub_msg_rate_limit=1000.0 (msgs/sec)\n", - "ServerApp.rate_limit_window=3.0 (secs)\n", - "\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - " Total run time: 1.10s*] Elapsed 1.10s / Remaining 00:00:00:00\n", - " Total run time: 1.14s*] Elapsed 1.14s / Remaining 00:00:00:00[**** 18% ] Elapsed 0.25s / Remaining 00:00:00:01[*********75%***** ] Elapsed 0.88s / Remaining 00:00:00:00[*********98%***********] Elapsed 1.08s / Remaining 00:00:00:00\n", - " [*********48% ] Elapsed 0.55s / Remaining 00:00:00:00[* 3% ] Elapsed 0.05s / Remaining 00:00:00:01[* 4% ] Elapsed 0.06s / Remaining 00:00:00:01" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "IOPub message rate exceeded.\n", - "The Jupyter server will temporarily stop sending output\n", - "to the client in order to avoid crashing it.\n", - "To change this limit, set the config variable\n", - "`--ServerApp.iopub_msg_rate_limit`.\n", - "\n", - "Current values:\n", - "ServerApp.iopub_msg_rate_limit=1000.0 (msgs/sec)\n", - "ServerApp.rate_limit_window=3.0 (secs)\n", - "\n" - ] - } - ], - "source": [ - "# output only final state\n", - "emulator_platform.instruments['pulse_simulator'].output_state_history = False\n", - "sweep_results = emulator_platform.sweep(sequence, ExecutionParameters(), sweeper, sweeper2)" - ] - }, - { - "cell_type": "markdown", - "id": "a1fe5e3d-7619-480e-b3a8-e4b60e037092", - "metadata": {}, - "source": [ - "To help visualize the simulation results, we can once again look at its overlap with the basis states of the system. We use `make_array_index_list` function to generate a list of all possible index combinations of an array with arbitrary shape, in this case corresponding to all possible combinations of different sweeper parameters:" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "37ac5613-2c25-4344-b5bf-4604ed2859d1", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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vpyIiIgUY4aCiIhILVbRWJT24QYYUBAREalF5pMum+3DDTCgICIiUokEF6yhcMlI1Mc1FERERKQYMxRERERq6aAnZXYEBhREREQq4W2jRERERDIwQ0FERKQW3uVBRERESklCQFK4BkLp9u2FUx5ERESkGDMUREREarH+WpT24QYYUBAREamEUx5EREREMjBDQUREpBbe5UFERESK8UmZREREpBSflElEREQkAzMUREREauGUBxERESklWRuL0j7cAac8iIiISDFmKIiIiNTCKQ8iIiJSrBs9h4JTHkRERKQYMxREREQq6U7v8mBAQUREpJZutIaCUx5ERESkGDMUREREahEAlD5Hwj0SFAwoiIiI1MI1FERERKScgAvWULhkJKrjGgoiIiJSjBkKIiIitXSjuzwYUBAREanFCkByQR9ugFMeREREpFibAootW7YgODgYWq0WEREROHLkSLNtd+/ejWnTpuHaa6+Fr68voqOj8dFHH9m1ycrKgiRJDqW2trYtwyMiIuoUmu7yUFrcgeyAIjs7GytWrMDKlStRVFSE2NhYJCQkoLS01Gn7/Px8TJs2Dbm5uThx4gSmTJmCWbNmoaioyK6dr68vTCaTXdFqtW07KiIios6gaQ2F0uIGZK+hWL9+PZKTk7F48WIAQHp6Oj766CNkZGQgLS3NoX16errd5xdeeAH79u3Du+++i/DwcFu9JEnw9/eXOxwiIiLqBGRlKOrq6nDixAnEx8fb1cfHx+PYsWOt6sNqteL8+fPw8/Ozq79w4QICAwMxaNAgzJw50yGDcSWLxQKz2WxXiIiIOpVulKGQFVBUVVWhoaEBer3erl6v16OioqJVfbz88suoqanB3LlzbXXDhw9HVlYW9u/fj507d0Kr1WLixIn45ptvmu0nLS0NOp3OVgICAuQcChERkfoYULRMkuzvgRFCONQ5s3PnTqxevRrZ2dkYMGCArT4qKgrz5s1DWFgYYmNj8dZbb+GGG27AK6+80mxfqampqK6utpWysrK2HAoRERG5gKw1FP3794enp6dDNqKystIha3Gl7OxsJCcn4+2338bUqVNbbOvh4YFx48a1mKHQaDTQaDStHzwREVF743MonPP29kZERASMRqNdvdFoRExMTLPb7dy5EwsWLMDf/vY33HbbbVfdjxACxcXFMBgMcoZHRETUqXSn20Zl3+WR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pyteC0p15euhuroaAFp8i2R3uCZacx6adOXroaGhAbt27UJNTQ2io6OdtukO10N7cIuAoqqqCg0NDQ5vH9Xr9Q5vKW1SUVHhtH19fT2qqqpUG6ua2nIeDAYDtm7dipycHOzevRshISGIi4tDfn5+ewy5U+iK10JbdfXrQQiBlJQU3HTTTQgNDW22XVe/Jlp7Hrry9fDPf/4T11xzDTQaDZYsWYI9e/Zg5MiRTtt29euhvch+l0dHkiTJ7rMQwqHuau2d1bsbOechJCQEISEhts/R0dEoKyvDSy+9hEmTJqk6zs6kq14LcnX16+Hhhx/GF1980aoXC3bla6K156ErXw8hISEoLi7GuXPnkJOTg/nz5yMvL6/ZoKIrXw/txS0yFP3794enp6fDX+GVlZUOUWUTf39/p+179OiBfv36qTZWNbXlPDgTFRWFb775xtXD67S64rXgSl3lenjkkUewf/9+HDp0CIMGDWqxbVe+JuScB2e6yvXg7e2N66+/HpGRkUhLS0NYWBg2bNjgtG1Xvh7ak1sEFN7e3oiIiIDRaLSrNxqNiImJcbpNdHS0Q/sDBw4gMjISXl5eqo1VTW05D84UFRXBYDC4enidVle8FlzJ3a8HIQQefvhh7N69G5988gmCg4Ovuk1XvCbach6ccffroTlCCFgsFqc/64rXQ4fooMWgsu3atUt4eXmJzMxMcerUKbFixQrRq1cv8d133wkhhHjqqadEUlKSrf23334revbsKR577DFx6tQpkZmZKby8vMQ777zTUYfgEnLPw5/+9CexZ88e8fXXX4t//etf4qmnnhIARE5OTkcdgmLnz58XRUVFoqioSAAQ69evF0VFReL7778XQnSfa0EI+eeiK14PDz30kNDpdOLw4cPCZDLZysWLF21tusM10Zbz0BWvByGESE1NFfn5+aKkpER88cUX4umnnxYeHh7iwIEDQojucT10BLcJKIQQYvPmzSIwMFB4e3uLsWPH2t0ONX/+fHHzzTfbtT98+LAIDw8X3t7eIigoSGRkZLTziNUh5zysW7dODB06VGi1WtG3b19x0003iffff78DRu06Tbe6XVnmz58vhOhe14Lcc9EVrwdnxw9AbN++3damO1wTbTkPXfF6EEKIRYsW2X5HXnvttSIuLs4WTAjRPa6HjiAJ8evKEyIiIqI2cos1FERERNS5MaAgIiIixRhQEBERkWIMKIiIiEgxBhRERESkGAMKIiIiUowBBRERESnGgIKIiIgUY0BBREREijGgICIiIsUYUBAREZFi/w+/x+NQp2SlcwAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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1qwxxhhz9uxZExISYu666y5LuUcffdT4+/ubEydOGGOMycnJMZLMiy++aClXUFBg2rdvbx599FFX3qhRo4wk8+GHH9Zo16hRo8yoUaPqbHf1723JkiWmS5cult9vRESEcTgcJi8vz3LOuHHjTFBQkCktLa2z3qNHjxpJZv369cYYY/bs2WMkmUcffdRERkZa6oqLi3Md79q1y0gyu3btcuXNmzfP1PXPniQTEhJinE6nK6+4uNi0a9fOpKSk1Nk+Y/7z30d+fn695Ywxxul0mr59+5ru3bub77//vs62zJs374J1AXZhWAFuWb9+vfbv329JF+o5+MlPfmI5vvbaa1VWVqbjx4+78nJzc/WTn/xEXbp0kY+Pj/z8/HTPPfeosrJSf/vb39xq49VXX61OnTrpscce02uvvabPP//crfMl6bXXXtPgwYMVGBgoX19f+fn56cMPP9Rf//rXC55bVlamDz/8ULfddpsuueQSVVRUuNKECRNUVlamvXv31nn+Rx99JEmWIQrpXPd6hw4d9OGHH0o612Mzffp0bdq0yTVMU1lZqd/85jeaPHmyunTpIkn63e9+J4fDoenTp1vaEhoaqkGDBtVYbdGpUyfddNNNDbpP1b0WwcHBrt/bM888o5MnT1p+v5LUv39/DRo0yJJ31113yel06s9//nOdn9GrVy/17NlTO3fulCRlZmZq4MCBmj59uvLz8/Xll1+qvLxce/bssfSgNMaYMWPUsWNH13FISIi6deumr7/+2qN6q5WVlen//b//p6+//lq//e1vdemll3qlXnhXdna2Jk2apPDwcDkcDo9WNTVE9RDs+Sk0NNTWz7wQggO4pW/fvho6dKglXUj1l1S1gIAASdK//vUvSdKxY8c0YsQIFRYWasWKFfr444+1f/9+1/hwdbmGCg4OVlZWlq677jo98cQT6t+/v8LDw7Vw4cIGzWFYvny5HnjgAQ0bNkwZGRnau3ev9u/fr1tuuaVBbTl58qQqKir0yiuvyM/Pz5ImTJggSZalbrWd7+vr6xqiqFb9D8bJkyddebNnz1ZZWZk2btwoSfrggw9UVFSkWbNmucr885//lDFGISEhNdqzd+/eGm05v5u9Pn/6058UHx8vSXrjjTf0xz/+Ufv379eTTz4pqebvrbZ/7Krzzr+m2owdO9YVFO3cuVPjxo3TwIEDFRISop07d+qPf/yj/vWvf3kcHPz4WZXOPa/uPoO1KS8v12233aY9e/Zo27ZtGjZsmMd1wh6lpaUaNGiQVq5c2WSf2b9/fxUVFbnSX/7ylyb77Now5wDNbsuWLSotLdWmTZsUERHhys/Ly2t0nQMHDtTGjRtljNGnn36qtLQ0LVmyRO3bt9fjjz9e77lvvfWWRo8erdWrV1vyq+crXEinTp3k4+OjxMREzZs3r9YykZGRdZ7fpUsXVVRU6JtvvrEECMYYFRcX6/rrr3fl9evXTzfccIPWrVun+++/X+vWrVN4eLjrS1uSLr/8cjkcDn388ceuwOx8P85zOBwNus6NGzfKz89Pv/vd7xQYGOjKr+uvrOLi4jrzavtSPt/YsWO1du1a/elPf9K+fftcM/xvuukmZWZm6uuvv9all17aYlfMlJeXa8qUKdq1a5e2bt2qsWPHNneTUI+EhAQlJCTU+fMzZ87oqaee0v/+7//q1KlTGjBggJYtW+bRkmZfX99m7y04Hz0HaHbVX0bnf0kZY/TGG294pe5BgwbppZde0mWXXWbpvq7rL0KHw1HjC/PTTz+1TGI7v70/ruOSSy7RmDFjlJubq2uvvbZGT8vQoUPr/TKs/uJ46623LPkZGRkqLS2t8cUya9Ys7du3T3v27NF7772nGTNmyMfHx/XziRMnyhijwsLCWtsycODAOttSH4fDIV9fX8tn/etf/9JvfvObWst/9tlnOnTokCXv7bffVseOHS0rK2ozduxYORwOPf3002rXrp1Gjhwp6dxkxV27dikzM1MjR46Un59fvfXU9TuzU3WPwUcffaSMjAyNHz++yT4b9pg1a5b++Mc/auPGjfr00091xx136JZbbtGRI0caXeeRI0cUHh6uyMhI/exnP6uxkqip0XOAZjdu3Dj5+/vrzjvv1KOPPqqysjKtXr1a3333XaPq+93vfqdXX31VU6ZM0VVXXSVjjDZt2qRTp05p3LhxrnIDBw7U7t279d577yksLEwdO3ZUVFSUJk6cqGeffVYLFy7UqFGjdPjwYS1ZskSRkZGWlRodO3ZURESE6y/Bzp076/LLL1fPnj21YsUK3XjjjRoxYoQeeOAB9ezZU99//72OHj2q9957zzWvoK77MX78eD322GNyOp0aPny4a7VCdHS0EhMTLeXvvPNOJSUl6c4771R5eXmNuQrDhw/Xfffdp1mzZunAgQMaOXKkOnTooKKiIu3Zs0cDBw7UAw884PZ9vvXWW7V8+XLddddduu+++3Ty5Em98MILtfZOSOc2y/rJT36iRYsWKSwsTG+99ZYyMzO1bNmyC+6j0K1bNw0YMEA7duzQmDFjXOVvvvlmffvtt/r222+1fPnyC7a5OhBatmyZEhIS5OPjo2uvvVb+/v5uXn3D3X777Xr//ff15JNPqkuXLpb5JkFBQZZNmtDyffnll9qwYYP+8Y9/KDw8XJL0yCOP6A9/+IPWrVunpUuXul3nsGHDtH79el1zzTX65z//qeeee05xcXH67LPPLtirZpvmnA2J1qN6Nvb+/ftr/Xl9qxW++eabWus6f2b3e++9ZwYNGmQCAwPNFVdcYf7rv/7LvP/++zVmmzdktcIXX3xh7rzzTtOrVy/Tvn17ExwcbG644QaTlpZmKZeXl2eGDx9uLrnkEiPJNRO/vLzcPPLII+aKK64wgYGBZvDgwWbLli21fvbOnTtNdHS0CQgIMJIsqx/y8/PN7NmzzRVXXGH8/PxM165dTVxcnHnuuefqbb8xxvzrX/8yjz32mImIiDB+fn4mLCzMPPDAA+a7776rtfxdd91lJJnhw4fXWeebb75phg0bZjp06GDat29vevXqZe655x5z4MABV5lRo0aZ/v3713p+basV3nzzTRMVFWUCAgLMVVddZVJSUszatWtr/H4jIiLMrbfeat59913Tv39/4+/vb3r27GmWL19+wXtR7eGHHzaSzPPPP2/J7927t5FkPv30U0t+basVysvLzb333mu6du1qHA6HpZ2qY4VARETEBVe11LdaQXWs8jn/mavtHFYrtAySzObNm13H77zzjpFkOnToYEm+vr5m6tSpxpj//HtYX6rv93v69GkTEhJSY4VRU3IY86PdSgDAy3r27KkBAwZ4vKFQS5WWlqZZs2bp6NGjioiIuOAKnrpUVlbKGCM/Pz/NmzevSSfEoXYOh0ObN292bbOenp6uu+++W5999pllSE2SLr30UoWGhurs2bP68ssv6623U6dOlv1FfmzcuHG6+uqra8x9aioMKwCAl1x99dWSzu2yefnll7t9fpcuXWrsHoqWJTo6WpWVlTp+/LhGjBhRaxk/P78a76BxR3l5uf7617/WWX9TIDgAAA9NmjRJ+/fvdx2f/+Ild+zevds1r6W2bZfR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1/GpU6cUERGhY8eO2fKLbi2cTqe6d++ugoKCJut+aom4D+dwH87hPpzDffiPkpIS9ejRQ5072zPcFBgYqPz8fJ05c8Yr9fn7+yswMNArdTWEW8HB5ZdfLh8fnxp/0R8/frzGX/7VQkNDay3v6+urLl261FumrjolKSAgQAEBATXyg4ODL/qHXpKCgoK4D+I+VOM+nMN9OIf78B/t2tm33U9gYGCTfqF7k1t3xd/fX0OGDFFmZqYlPzMzU3FxcbWeExsbW6P8jh07NHToUPn5+dVbpq46AQCAfdweVkhKSlJiYqKGDh2q2NhYrVmzRseOHdPcuXMlnevuLyws1Pr16yWdW5mwcuVKJSUl6ec//7lycnK0du1ayyqE+fPna+TIkVq2bJkmT56srVu3aufOndqzZ4+XLhMAADSU28HBtGnTdPLkSS1ZskRFRUUaMGCAtm/froiICElSUVGRZc+DyMhIbd++XQ8//LBWrVql8PBwvfzyy/rpT3/qKhMXF6eNGzfqqaee0tNPP61evXopPT1dw4YNa3C7AgICtHDhwlqHGi4m3IdzuA/ncB/O4T6cw334D+5F/dze5wAAALRtvHgJAABYEBwAAAALggMAAGBBcAAAACwIDgAAgEWrCg5effVVRUZGKjAwUEOGDNHHH39cb/msrCwNGTJEgYGBuuqqq/Taa681UUvt5c592L17txwOR430xRdfNGGLvSs7O1uTJk1SeHi4HA6HtmzZcsFz2uqz4O69aIvPQ0pKiq6//np17NhR3bp105QpU3T48OELntfWnonG3Ie2+DxI0urVq3Xttde6doKMjY21vPW3Nm3tefBUqwkO0tPTtWDBAj355JPKzc3ViBEjlJCQYNlT4Xz5+fmaMGGCRowYodzcXD3xxBN66KGHlJGR0cQt9y5370O1w4cPq6ioyJV69+7dRC32vtLSUg0aNEgrV65sUPm2+ixI7t+Lam3pecjKytK8efO0d+9eZWZmqqKiQvHx8SotLa3znLb4TDTmPlRrS8+DJF155ZX67//+bx04cEAHDhzQTTfdpMmTJ+uzzz6rtXxbfB48ZlqJG264wcydO9eS16dPH/P444/XWv7RRx81ffr0seTdf//9JiYmxrY2NgV378OuXbuMJPPdd981QeuaniSzefPmesu01WfhxxpyL9r682CMMcePHzeSTFZWVp1lLoZnoiH34WJ4Hqp16tTJ/M///E+tP7sYngd3tYqegzNnzujgwYOKj4+35MfHx+uTTz6p9ZycnJwa5cePH68DBw7o7Nmmfze2NzTmPlSLjo5WWFiYxo4dq127dtnZzBanLT4LnmrLz0NJSYkk1fu2vYvhmWjIfajWlp+HyspKbdy4UaWlpYqNja21zMXwPLirVQQHJ06cUGVlZY23NIaEhNR4m2O14uLiWstXVFToxIkTtrXVTo25D2FhYVqzZo0yMjK0adMmRUVFaezYscrOzm6KJrcIbfFZaKy2/jwYY5SUlKQbb7xRAwYMqLNcW38mGnof2vLz8Je//EWXXnqpAgICNHfuXG3evFn9+vWrtWxbfx4aw+13KzQnh8NhOTbG1Mi7UPna8lsbd+5DVFSUoqKiXMexsbEqKCjQCy+8oJEjR9razpakrT4L7mrrz8ODDz6oTz/9tEEvbWvLz0RD70Nbfh6ioqKUl5enU6dOKSMjQzNmzFBWVladAUJbfh4ao1X0HFx++eXy8fGp8dfx8ePHa0R71UJDQ2st7+vrqy5dutjWVjs15j7UJiYmRkeOHPF281qstvgseFNbeR5++ctfatu2bdq1a5euvPLKesu25WfCnftQm7byPPj7++vqq6/W0KFDlZKSokGDBmnFihW1lm3Lz0NjtYrgwN/fX0OGDFFmZqYlPzMzU3FxcbWeExsbW6P8jh07NHToUPn5+dnWVjs15j7UJjc3V2FhYd5uXovVFp8Fb2rtz4MxRg8++KA2bdqkjz76SJGRkRc8py0+E425D7Vp7c9DXYwxKi8vr/VnbfF58FgzTYR028aNG42fn59Zu3at+fzzz82CBQtMhw4dzFdffWWMMebxxx83iYmJrvJ///vfzSWXXGIefvhh8/nnn5u1a9caPz8/8+677zbXJXiFu/fhpZdeMps3bzZ/+9vfzP/93/+Zxx9/3EgyGRkZzXUJHvv+++9Nbm6uyc3NNZLM8uXLTW5urvn666+NMRfPs2CM+/eiLT4PDzzwgAkODja7d+82RUVFrvTDDz+4ylwMz0Rj7kNbfB6MMSY5OdlkZ2eb/Px88+mnn5onnnjCtGvXzuzYscMYc3E8D55qNcGBMcasWrXKREREGH9/fzN48GDLEp0ZM2aYUaNGWcrv3r3bREdHG39/f9OzZ0+zevXqJm6xPdy5D8uWLTO9evUygYGBplOnTubGG280v//975uh1d5Tvfzqx2nGjBnGmIvrWXD3XrTF56G265dk1q1b5ypzMTwTjbkPbfF5MMaY2bNnu/6N7Nq1qxk7dqwrMDDm4ngePOUw5t+zLgAAANRK5hwAAICmQ3AAAAAsCA4AAIAFwQEAALAgOAAAABYEBwAAwILgAAAAWBAcAAAAC4IDAABgQXAAAAAsCA4AAIDF/wdZzTbu/IOwTgAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "from qibolab.instruments.emulator.pulse_simulator import make_array_index_list\n", - "\n", - "final_states_array = sweep_results['simulation']['output_states']\n", - "shape = final_states_array.shape\n", - "index_list = make_array_index_list(shape)\n", - "overlaps = {}\n", - "for index in index_list:\n", - " pulse_simulator.merge_sweep_results(overlaps, simulation_engine.compute_overlaps(final_states_array[tuple(index)]))\n", - "\n", - "import matplotlib.pyplot as plt\n", - "for label in overlaps.keys():\n", - " plt.figure()\n", - " plt.pcolormesh(np.array(overlaps[label]).reshape(shape))\n", - " plt.colorbar()\n", - " plt.title(f'Final state overlap with {label}')\n", - " plt.show()" - ] - }, - { - "cell_type": "markdown", - "id": "ed868b1f", - "metadata": {}, - "source": [ - "## --- Version information for major packages used in the current Qibolab emulator example ---" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "f78416d6-33a7-4350-86c1-c64fb3fe80ab", - "metadata": {}, - "outputs": [], - "source": [ - "%load_ext watermark" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "38340640-9e0b-40b3-9952-d4cabef2e277", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Python implementation: CPython\n", - "Python version : 3.9.18\n", - "IPython version : 8.15.0\n", - "\n", - "qibolab : 0.1.7\n", - "qibo : 0.2.6\n", - "qutip : 4.7.5\n", - "matplotlib: 3.8.0\n", - "numpy : 1.26.4\n", - "scipy : 1.12.0\n", - "\n" - ] - } - ], - "source": [ - "%watermark -v -p qibolab,qibo,qutip,matplotlib,numpy,scipy" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.18" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/src/qibolab/platform/load.py b/src/qibolab/platform/load.py index c9b95aa587..0827569d8c 100644 --- a/src/qibolab/platform/load.py +++ b/src/qibolab/platform/load.py @@ -50,7 +50,7 @@ def create_platform(name: str) -> Platform: It consists of a quantum processor QPU and a set of controlling instruments. Args: - name (str): name of the platform. Options are 'tiiq', 'qili' and 'icarusq'. + name (str): name of the platform. path (pathlib.Path): path with platform serialization Returns: The plaform class. diff --git a/tests/conftest.py b/tests/conftest.py index 6c9708b08c..0ace831064 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -19,14 +19,7 @@ from qibolab.sweeper import ParallelSweepers, Parameter, Sweeper ORIGINAL_PLATFORMS = os.environ.get(PLATFORMS, "") -TESTING_PLATFORM_NAMES = [ # FIXME: uncomment platforms as they get upgraded to 0.2 - "dummy", - # "qm", - # "qm_octave", - # "qblox", - # "rfsoc", - # "zurich", -] +TESTING_PLATFORM_NAMES = ["dummy"] """Platforms used for testing without access to real instruments.""" From 3cbcceeb0674b289ab1a55992cd6ec3211401d4b Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Wed, 28 Aug 2024 18:07:54 +0300 Subject: [PATCH 0754/1006] chore: remove extras --- extras/test819.py | 91 ----------------------------------------------- 1 file changed, 91 deletions(-) delete mode 100644 extras/test819.py diff --git a/extras/test819.py b/extras/test819.py deleted file mode 100644 index b4f43cdfc1..0000000000 --- a/extras/test819.py +++ /dev/null @@ -1,91 +0,0 @@ -import numpy as np -from qibo.backends import GlobalBackend - -from qibolab import Platform -from qibolab.execution_parameters import ( - AcquisitionType, - AveragingMode, - ExecutionParameters, -) -from qibolab.instruments.qblox.controller import QbloxController -from qibolab.platform import NS_TO_SEC -from qibolab.sequence import PulseSequence -from qibolab.sweeper import Parameter, Sweeper, SweeperType - -GlobalBackend.set_backend("qibolab", "spinq10q") -platform: Platform = GlobalBackend().platform -controller: QbloxController = platform.instruments["qblox_controller"] - -sequence = PulseSequence() -ro_pulses = {} - -qid = 0 -qubit = platform.qubits[qid] -qubits = {qid: qubit} - -ro_pulse = platform.create_qubit_readout_pulse(qid, start=0) -ro_pulse.frequency = int(2e9) -sequence.add(ro_pulse) - -freq_width = 2e7 -freq_step = 2e5 -bias_width = 0.8 -bias_step = 0.01 -nshots = 1024 -relaxation_time = 5000 - -navgs = nshots -repetition_duration = sequence.finish + relaxation_time - -# define the parameters to sweep and their range: -delta_frequency_range = np.arange(-freq_width // 2, freq_width // 2, freq_step) -freq_sweeper = Sweeper( - Parameter.frequency, delta_frequency_range, [ro_pulse], type=SweeperType.OFFSET -) - -delta_bias_range = np.arange(-bias_width / 2, bias_width / 2, bias_step) -bias_sweeper = Sweeper( - Parameter.bias, delta_bias_range, qubits=[qubit], type=SweeperType.OFFSET -) - -options = ExecutionParameters( - nshots=nshots, - relaxation_time=relaxation_time, - acquisition_type=AcquisitionType.INTEGRATION, - averaging_mode=AveragingMode.CYCLIC, -) -time = (sequence.duration + relaxation_time) * nshots * NS_TO_SEC -sweepers = (bias_sweeper, freq_sweeper) -for sweep in sweepers: - time *= len(sweep.values) - -# mock -controller.is_connected = True - - -class Sequencers: - def __getitem__(self, index): - return self - - def set(self, *args): - pass - - -class Device: - sequencers = Sequencers() - - -for mod in controller.modules.values(): - mod.device = Device() - mod._device_num_sequencers = 0 -# end mock - -# for name, mod in controller.modules.items(): -# if "qcm_rf" in name: -# continue - -mod = controller.modules["qcm_bb0"] -channels = controller._set_module_channel_map(mod, qubits) -pulses = sequence.get_channel_pulses(*channels) -mod.process_pulse_sequence(qubits, pulses, navgs, nshots, repetition_duration, sweepers) -print(mod._sequencers["o1"][0].program) From a6a395908a6bbffbe0eb6506de4e5652b714a6b2 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Wed, 28 Aug 2024 17:28:47 +0300 Subject: [PATCH 0755/1006] BREAKING CHANGE: drop SweeperType --- doc/source/getting-started/experiment.rst | 10 ++--- doc/source/main-documentation/qibolab.rst | 52 +++++++++-------------- doc/source/tutorials/calibration.rst | 22 ++++------ src/qibolab/sweeper.py | 15 ------- 4 files changed, 33 insertions(+), 66 deletions(-) diff --git a/doc/source/getting-started/experiment.rst b/doc/source/getting-started/experiment.rst index 0f960a60e5..86d4a00b38 100644 --- a/doc/source/getting-started/experiment.rst +++ b/doc/source/getting-started/experiment.rst @@ -205,7 +205,7 @@ We leave to the dedicated tutorial a full explanation of the experiment, but her from qibolab import create_platform from qibolab.sequence import PulseSequence from qibolab.result import magnitude - from qibolab.sweeper import Sweeper, SweeperType, Parameter + from qibolab.sweeper import Sweeper, Parameter from qibolab.execution_parameters import ( ExecutionParameters, AveragingMode, @@ -221,11 +221,11 @@ We leave to the dedicated tutorial a full explanation of the experiment, but her sequence = natives.MZ.create_sequence() # define a sweeper for a frequency scan + f0 = platform.config(str(qubit.probe.name)).frequency # center frequency sweeper = Sweeper( parameter=Parameter.frequency, - values=np.arange(-2e8, +2e8, 1e6), + values=f0 + np.arange(-2e8, +2e8, 1e6), channels=[qubit.probe.name], - type=SweeperType.OFFSET, ) # perform the experiment using specific options @@ -241,9 +241,7 @@ We leave to the dedicated tutorial a full explanation of the experiment, but her # plot the results amplitudes = magnitude(results[acq.id][0]) - frequencies = ( - np.arange(-2e8, +2e8, 1e6) + platform.config(str(qubit.probe.name)).frequency - ) + frequencies = sweeper.values plt.title("Resonator Spectroscopy") plt.xlabel("Frequencies [Hz]") diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index 7593cd66b1..d4c6f09d31 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -374,13 +374,7 @@ To designate the pulse(s) or channel(s) to which a sweeper is applied, you can u To effectively specify the sweeping behavior, Qibolab provides the ``values`` attribute along with the ``type`` attribute. -The ``values`` attribute comprises an array of numerical values that define the sweeper's progression. To facilitate multi-qubit execution, these numbers can be interpreted in three ways: - -- Absolute Values: Represented by `qibolab.sweeper.SweeperType.ABSOLUTE`, these values are used directly. -- Relative Values with Offset: Utilizing `qibolab.sweeper.SweeperType.OFFSET`, these values are relative to a designated base value, corresponding to the pulse or qubit value. -- Relative Values with Factor: Employing `qibolab.sweeper.SweeperType.FACTOR`, these values are scaled by a factor from the base value, akin to a multiplier. - -For offset and factor sweepers, the base value is determined by the respective pulse or qubit value. +The ``values`` attribute comprises an array of numerical values that define the sweeper's progression. Let's see some examples. Consider now a system with three qubits (qubit 0, qubit 1, qubit 2) with resonator frequency at 4 GHz, 5 GHz and 6 GHz. @@ -390,7 +384,7 @@ A tipical resonator spectroscopy experiment could be defined with: import numpy as np - from qibolab.sweeper import Parameter, Sweeper, SweeperType + from qibolab.sweeper import Parameter, Sweeper natives = platform.natives.single_qubit @@ -405,32 +399,27 @@ A tipical resonator spectroscopy experiment could be defined with: natives[2].MZ.create_sequence() ) # readout pulse for qubit 2 at 6 GHz - sweeper = Sweeper( - parameter=Parameter.frequency, - values=np.arange(-200_000, +200_000, 1), # define an interval of swept values - channels=[qubit.probe.name for qubit in platform.qubits.values()], - type=SweeperType.OFFSET, - ) + sweepers = [ + Sweeper( + parameter=Parameter.frequency, + values=platform.config(str(qubit.probe.name)).frequency + + np.arange(-200_000, +200_000, 1), # define an interval of swept values + channels=[qubit.probe.name], + ) + for qubit in platform.qubits.values() + ] - results = platform.execute([sequence], options, [[sweeper]]) + results = platform.execute([sequence], options, [sweepers]) .. note:: options is an :class:`qibolab.execution_parameters.ExecutionParameters` object, detailed in a separate section. -In this way, we first define a sweeper with an interval of 400 MHz (-200 MHz --- 200 MHz), assigning it to all three readout pulses and setting is as an offset sweeper. The resulting probed frequency will then be: +In this way, we first define three parallel sweepers with an interval of 400 MHz (-200 MHz --- 200 MHz). The resulting probed frequency will then be: - for qubit 0: [3.8 GHz, 4.2 GHz] - for qubit 1: [4.8 GHz, 5.2 GHz] - for qubit 2: [5.8 GHz, 6.2 GHz] -If we had used the :class:`qibolab.sweeper.SweeperType` absolute, we would have probed for all qubits the same frequencies [-200 MHz, 200 MHz]. - -.. note:: - - The default :class:`qibolab.sweeper.SweeperType` is absolute! - -For factor sweepers, usually useful when dealing with amplitudes, the base value is multipled by the values set. - It is possible to define and executes multiple sweepers at the same time. For example: @@ -448,15 +437,14 @@ For example: sweeper_freq = Sweeper( parameter=Parameter.frequency, - values=np.arange(-100_000, +100_000, 10_000), + values=platform.config(str(qubit.drive.name)).frequency + + np.arange(-100_000, +100_000, 10_000), channels=[qubit.drive.name], - type=SweeperType.OFFSET, ) sweeper_amp = Sweeper( parameter=Parameter.amplitude, - values=np.arange(0, 1.5, 0.1), + values=np.arange(0, 0.43, 0.3), pulses=[next(iter(sequence.channel(qubit.drive.name)))], - type=SweeperType.FACTOR, ) results = platform.execute([sequence], options, [[sweeper_freq], [sweeper_amp]]) @@ -567,15 +555,15 @@ The shape of the values of an integreted acquisition with 2 sweepers will be: sweeper1 = Sweeper( parameter=Parameter.frequency, - values=np.arange(-100_000, +100_000, 1), # define an interval of swept values + values=platform.config(str(qubit.drive.name)).frequency + + np.arange(-100_000, +100_000, 1), channels=[qubit.drive.name], - type=SweeperType.OFFSET, ) sweeper2 = Sweeper( parameter=Parameter.frequency, - values=np.arange(-200_000, +200_000, 1), # define an interval of swept values + values=platform.config(str(qubit.drive.name)).frequency + + np.arange(-200_000, +200_000, 1), channels=[qubit.probe.name], - type=SweeperType.OFFSET, ) shape = (options.nshots, len(sweeper1.values), len(sweeper2.values)) diff --git a/doc/source/tutorials/calibration.rst b/doc/source/tutorials/calibration.rst index 4d0d86ce50..e63452294e 100644 --- a/doc/source/tutorials/calibration.rst +++ b/doc/source/tutorials/calibration.rst @@ -32,7 +32,7 @@ around the pre-defined frequency. from qibolab import create_platform from qibolab.sequence import PulseSequence from qibolab.result import magnitude - from qibolab.sweeper import Sweeper, SweeperType, Parameter + from qibolab.sweeper import Sweeper, Parameter from qibolab.execution_parameters import ( ExecutionParameters, AveragingMode, @@ -47,11 +47,11 @@ around the pre-defined frequency. sequence = natives.MZ.create_sequence() # allocate frequency sweeper + f0 = platform.config(str(qubit.probe.name)).frequency sweeper = Sweeper( parameter=Parameter.frequency, - values=np.arange(-2e8, +2e8, 1e6), + values=f0 + np.arange(-2e8, +2e8, 1e6), channels=[qubit.probe.name], - type=SweeperType.OFFSET, ) We then define the execution parameters and launch the experiment. @@ -75,9 +75,7 @@ In few seconds, the experiment will be finished and we can proceed to plot it. acq = sequence.acquisitions[0][1] amplitudes = magnitude(results[acq.id][0]) - frequencies = ( - np.arange(-2e8, +2e8, 1e6) + platform.config(str(qubit.probe.name)).frequency - ) + frequencies = sweeper.values plt.title("Resonator Spectroscopy") plt.xlabel("Frequencies [Hz]") @@ -116,7 +114,7 @@ complex pulse sequence. Therefore with start with that: from qibolab.pulses import Pulse, Delay, Gaussian from qibolab.sequence import PulseSequence from qibolab.result import magnitude - from qibolab.sweeper import Sweeper, SweeperType, Parameter + from qibolab.sweeper import Sweeper, Parameter from qibolab.execution_parameters import ( ExecutionParameters, AveragingMode, @@ -143,11 +141,11 @@ complex pulse sequence. Therefore with start with that: sequence.concatenate(natives.MZ.create_sequence()) # allocate frequency sweeper + f0 = platform.config(str(qubit.probe.name)).frequency sweeper = Sweeper( parameter=Parameter.frequency, - values=np.arange(-2e8, +2e8, 1e6), + values=f0 + np.arange(-2e8, +2e8, 1e6), channels=[qubit.drive.name], - type=SweeperType.OFFSET, ) Note that the drive pulse has been changed to match the characteristics required @@ -168,9 +166,7 @@ We can now proceed to launch on hardware: _, acq = next(iter(sequence.acquisitions)) amplitudes = magnitude(results[acq.id][0]) - frequencies = ( - np.arange(-2e8, +2e8, 1e6) + platform.config(str(qubit.drive.name)).frequency - ) + frequencies = sweeper.values plt.title("Resonator Spectroscopy") plt.xlabel("Frequencies [Hz]") @@ -223,7 +219,7 @@ and its impact on qubit states in the IQ plane. from qibolab.pulses import Delay from qibolab.sequence import PulseSequence from qibolab.result import unpack - from qibolab.sweeper import Sweeper, SweeperType, Parameter + from qibolab.sweeper import Sweeper, Parameter from qibolab.execution_parameters import ( ExecutionParameters, AveragingMode, diff --git a/src/qibolab/sweeper.py b/src/qibolab/sweeper.py index 12daf5502e..b02ca2c3e7 100644 --- a/src/qibolab/sweeper.py +++ b/src/qibolab/sweeper.py @@ -1,7 +1,5 @@ -import operator from dataclasses import dataclass from enum import Enum, auto -from functools import partial from typing import Optional import numpy.typing as npt @@ -32,14 +30,6 @@ class Parameter(Enum): BIAS = Parameter.bias -class SweeperType(Enum): - """Type of the Sweeper.""" - - ABSOLUTE = partial(lambda x, y=None: x) - FACTOR = operator.mul - OFFSET = operator.add - - ChannelParameter = { Parameter.frequency, Parameter.bias, @@ -90,7 +80,6 @@ class Sweeper: values: npt.NDArray pulses: Optional[list] = None channels: Optional[list] = None - type: Optional[SweeperType] = SweeperType.ABSOLUTE def __post_init__(self): if self.pulses is not None and self.channels is not None: @@ -110,10 +99,6 @@ def __post_init__(self): "Cannot create a sweeper without specifying pulses or channels." ) - def get_values(self, base_value): - """Convert sweeper values depending on the sweeper type.""" - return self.type.value(self.values, base_value) - ParallelSweepers = list[Sweeper] """Sweepers that should be iterated in parallel.""" From 4d91272c24de9e3ab03fdfc813f8bd7cfa82e0b5 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 19 Aug 2024 15:50:58 +0200 Subject: [PATCH 0756/1006] feat: Expose config parent class --- src/qibolab/components/configs.py | 29 +++++++++++++---------------- src/qibolab/parameters.py | 9 ++++++--- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/qibolab/components/configs.py b/src/qibolab/components/configs.py index 12e719b259..58b80b02b9 100644 --- a/src/qibolab/components/configs.py +++ b/src/qibolab/components/configs.py @@ -20,10 +20,15 @@ "IqMixerConfig", "OscillatorConfig", "Config", + "ChannelConfig", ] -class DcConfig(Model): +class Config(Model): + """Configuration values depot.""" + + +class DcConfig(Config): """Configuration for a channel that can be used to send DC pulses (i.e. just envelopes without modulation).""" @@ -33,7 +38,7 @@ class DcConfig(Model): """DC offset/bias of the channel.""" -class OscillatorConfig(Model): +class OscillatorConfig(Config): """Configuration for an oscillator.""" kind: Literal["oscillator"] = "oscillator" @@ -42,7 +47,7 @@ class OscillatorConfig(Model): power: float -class IqMixerConfig(Model): +class IqMixerConfig(Config): """Configuration for IQ mixer. Mixers usually have various imperfections, and one needs to @@ -64,7 +69,7 @@ class IqMixerConfig(Model): imbalance.""" -class IqConfig(Model): +class IqConfig(Config): """Configuration for an IQ channel.""" kind: Literal["iq"] = "iq" @@ -73,7 +78,7 @@ class IqConfig(Model): """The carrier frequency of the channel.""" -class AcquisitionConfig(Model): +class AcquisitionConfig(Config): """Configuration for acquisition channel. Currently, in qibolab, acquisition channels are FIXME: @@ -115,7 +120,7 @@ def __eq__(self, other) -> bool: ) -class BoundsConfig(Model): +class BoundsConfig(Config): """Instument memory limitations proxies.""" kind: Literal["bounds"] = "bounds" @@ -128,14 +133,6 @@ class BoundsConfig(Model): """Instructions estimated size.""" -Config = Annotated[ - Union[ - DcConfig, - IqMixerConfig, - OscillatorConfig, - IqConfig, - AcquisitionConfig, - BoundsConfig, - ], - Field(discriminator="kind"), +ChannelConfig = Union[ + DcConfig, IqMixerConfig, OscillatorConfig, IqConfig, AcquisitionConfig, BoundsConfig ] diff --git a/src/qibolab/parameters.py b/src/qibolab/parameters.py index e6713a1614..fb29c2f46d 100644 --- a/src/qibolab/parameters.py +++ b/src/qibolab/parameters.py @@ -5,12 +5,12 @@ """ from collections.abc import Callable -from typing import Any +from typing import Annotated, Any from pydantic import Field, TypeAdapter from pydantic_core import core_schema -from qibolab.components import Config +from qibolab.components import Config, ChannelConfig from qibolab.execution_parameters import ConfigUpdate, ExecutionParameters from qibolab.native import SingleQubitNatives, TwoQubitNatives from qibolab.qubits import QubitId, QubitPairId @@ -108,5 +108,8 @@ class Parameters(Model): """Serializable parameters.""" settings: Settings = Field(default_factory=Settings) - configs: dict[ComponentId, Config] = Field(default_factory=dict) + configs: dict[ + ComponentId, + Annotated[ChannelConfig, Field(discriminator="kind")], + ] = Field(default_factory=dict) native_gates: NativeGates = Field(default_factory=NativeGates) From 4510dd8a6baea2829f7e5c6793af541517659f52 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 19 Aug 2024 15:52:48 +0200 Subject: [PATCH 0757/1006] fix: Move two qubit pair identifier together with the others --- src/qibolab/identifier.py | 16 +++++++++++++++- src/qibolab/platform/platform.py | 4 ++-- src/qibolab/qubits.py | 12 ++---------- 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/qibolab/identifier.py b/src/qibolab/identifier.py index 0fc5a4399a..4dca56b6d1 100644 --- a/src/qibolab/identifier.py +++ b/src/qibolab/identifier.py @@ -1,13 +1,27 @@ from enum import Enum from typing import Annotated, Optional, Union -from pydantic import Field, TypeAdapter, model_serializer, model_validator +from pydantic import ( + BeforeValidator, + Field, + PlainSerializer, + TypeAdapter, + model_serializer, + model_validator, +) from .serialize import Model QubitId = Annotated[Union[int, str], Field(union_mode="left_to_right")] """Type for qubit names.""" +QubitPairId = Annotated[ + tuple[QubitId, QubitId], + BeforeValidator(lambda p: tuple(p.split("-")) if isinstance(p, str) else p), + PlainSerializer(lambda p: f"{p[0]}-{p[1]}"), +] +"""Type for holding ``QubitPair``s in the ``platform.pairs`` dictionary.""" + # TODO: replace with StrEnum, once py3.10 will be abandoned # at which point, it will also be possible to replace values with auto() diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 38bdfc3fc0..cde3975f74 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -12,10 +12,10 @@ from qibolab.components import Config from qibolab.execution_parameters import ExecutionParameters -from qibolab.identifier import ChannelId +from qibolab.identifier import ChannelId, QubitId, QubitPairId from qibolab.instruments.abstract import Controller, Instrument, InstrumentId from qibolab.parameters import NativeGates, Parameters, Settings, update_configs -from qibolab.qubits import Qubit, QubitId, QubitPairId +from qibolab.qubits import Qubit from qibolab.sequence import PulseSequence from qibolab.sweeper import ParallelSweepers from qibolab.unrolling import Bounds, batch diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index abbd71a3f8..17a419eca1 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -1,7 +1,7 @@ from collections.abc import Iterable -from typing import Annotated, Optional +from typing import Optional -from pydantic import BeforeValidator, ConfigDict, PlainSerializer +from pydantic import ConfigDict from .components import AcquireChannel, DcChannel, IqChannel from .components.channels import Channel @@ -58,11 +58,3 @@ def mixer_frequencies(self): _if = native.frequency - _lo freqs[name] = _lo, _if return freqs - - -QubitPairId = Annotated[ - tuple[QubitId, QubitId], - BeforeValidator(lambda p: tuple(p.split("-")) if isinstance(p, str) else p), - PlainSerializer(lambda p: f"{p[0]}-{p[1]}"), -] -"""Type for holding ``QubitPair``s in the ``platform.pairs`` dictionary.""" From af2764e894d5e8f8550dff6c37610e89a38737cf Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 19 Aug 2024 15:55:06 +0200 Subject: [PATCH 0758/1006] feat!: Replace bounds configs with bounds class --- src/qibolab/components/configs.py | 15 +-------------- src/qibolab/parameters.py | 9 +++++---- src/qibolab/platform/platform.py | 3 ++- src/qibolab/unrolling.py | 17 +++++++---------- 4 files changed, 15 insertions(+), 29 deletions(-) diff --git a/src/qibolab/components/configs.py b/src/qibolab/components/configs.py index 58b80b02b9..7055d87153 100644 --- a/src/qibolab/components/configs.py +++ b/src/qibolab/components/configs.py @@ -120,19 +120,6 @@ def __eq__(self, other) -> bool: ) -class BoundsConfig(Config): - """Instument memory limitations proxies.""" - - kind: Literal["bounds"] = "bounds" - - waveforms: int - """Waveforms estimated size.""" - readout: int - """Number of readouts.""" - instructions: int - """Instructions estimated size.""" - - ChannelConfig = Union[ - DcConfig, IqMixerConfig, OscillatorConfig, IqConfig, AcquisitionConfig, BoundsConfig + DcConfig, IqMixerConfig, OscillatorConfig, IqConfig, AcquisitionConfig ] diff --git a/src/qibolab/parameters.py b/src/qibolab/parameters.py index fb29c2f46d..3ecd555eec 100644 --- a/src/qibolab/parameters.py +++ b/src/qibolab/parameters.py @@ -5,16 +5,17 @@ """ from collections.abc import Callable -from typing import Annotated, Any +from typing import Annotated, Any, Union from pydantic import Field, TypeAdapter from pydantic_core import core_schema -from qibolab.components import Config, ChannelConfig +from qibolab.components import ChannelConfig, Config from qibolab.execution_parameters import ConfigUpdate, ExecutionParameters +from qibolab.identifier import QubitId, QubitPairId from qibolab.native import SingleQubitNatives, TwoQubitNatives -from qibolab.qubits import QubitId, QubitPairId from qibolab.serialize import Model, replace +from qibolab.unrolling import Bounds def update_configs(configs: dict[str, Config], updates: list[ConfigUpdate]): @@ -110,6 +111,6 @@ class Parameters(Model): settings: Settings = Field(default_factory=Settings) configs: dict[ ComponentId, - Annotated[ChannelConfig, Field(discriminator="kind")], + Annotated[Union[ChannelConfig, Bounds], Field(discriminator="kind")], ] = Field(default_factory=dict) native_gates: NativeGates = Field(default_factory=NativeGates) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index cde3975f74..3c1b9b3fb7 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -260,7 +260,8 @@ def execute( results = defaultdict(list) # pylint: disable=unsubscriptable-object - bounds = Bounds.from_config(self.parameters.configs[self._controller.bounds]) + bounds = self.parameters.configs[self._controller.bounds] + assert isinstance(bounds, Bounds) for b in batch(sequences, bounds): result = self._execute(b, options, configs, sweepers) for serial, data in result.items(): diff --git a/src/qibolab/unrolling.py b/src/qibolab/unrolling.py index 1a07ad1790..0b1cc5f818 100644 --- a/src/qibolab/unrolling.py +++ b/src/qibolab/unrolling.py @@ -5,10 +5,11 @@ from collections import defaultdict from functools import total_ordering -from typing import Annotated +from typing import Annotated, Iterable, Literal -from qibolab.components.configs import BoundsConfig -from qibolab.serialize import Model +from pydantic.fields import FieldInfo + +from qibolab.components.configs import Config from .pulses import Delay, Pulse from .pulses.envelope import Rectangular @@ -40,9 +41,11 @@ def _instructions(sequence: PulseSequence): @total_ordering -class Bounds(Model): +class Bounds(Config): """Instument memory limitations proxies.""" + kind: Literal["bounds"] = "bounds" + waveforms: Annotated[int, {"count": _waveform}] """Waveforms estimated size.""" readout: Annotated[int, {"count": _readout}] @@ -50,12 +53,6 @@ class Bounds(Model): instructions: Annotated[int, {"count": _instructions}] """Instructions estimated size.""" - @classmethod - def from_config(cls, config: BoundsConfig): - d = config.model_dump() - del d["kind"] - return cls(**d) - @classmethod def update(cls, sequence: PulseSequence): up = {} From c66cd8ad7361dc62230a1acbfac98ebdeaab01a8 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 19 Aug 2024 15:57:33 +0200 Subject: [PATCH 0759/1006] fix: Avoid iterating on kind during bounds ops --- src/qibolab/unrolling.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/qibolab/unrolling.py b/src/qibolab/unrolling.py index 0b1cc5f818..af1bdf40bb 100644 --- a/src/qibolab/unrolling.py +++ b/src/qibolab/unrolling.py @@ -5,7 +5,7 @@ from collections import defaultdict from functools import total_ordering -from typing import Annotated, Iterable, Literal +from typing import Annotated, Literal from pydantic.fields import FieldInfo @@ -56,7 +56,7 @@ class Bounds(Config): @classmethod def update(cls, sequence: PulseSequence): up = {} - for name, info in cls.model_fields.items(): + for name, info in cls._entries().items(): up[name] = info.metadata[0]["count"](sequence) return cls(**up) @@ -67,13 +67,22 @@ def __add__(self, other: "Bounds") -> "Bounds": for (k, x), (_, y) in zip( self.model_dump().items(), other.model_dump().items() ): - new[k] = x + y + if k in type(self)._entries(): + new[k] = x + y return type(self)(**new) def __gt__(self, other: "Bounds") -> bool: """Define ordering as exceeding any bound.""" - return any(getattr(self, f) > getattr(other, f) for f in self.model_fields) + return any(getattr(self, f) > getattr(other, f) for f in type(self)._entries()) + + @classmethod + def _entries(cls) -> dict[str, FieldInfo]: + return { + n: f + for n, f in cls.model_fields.items() + if "count" in next(iter(f.metadata), {}) + } def batch(sequences: list[PulseSequence], bounds: Bounds): From 2c9f4d5411de70bde63d08e41b378719a8d42f7a Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 19 Aug 2024 19:07:57 +0200 Subject: [PATCH 0760/1006] fix: Adapt types as early as possible To avoid redefining adapters --- src/qibolab/identifier.py | 5 ++++- src/qibolab/sequence.py | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/qibolab/identifier.py b/src/qibolab/identifier.py index 4dca56b6d1..4047c8a9ee 100644 --- a/src/qibolab/identifier.py +++ b/src/qibolab/identifier.py @@ -42,6 +42,9 @@ def __str__(self) -> str: return str(self.value) +_adapted_qubit = TypeAdapter(QubitId) + + class ChannelId(Model): """Unique identifier for a channel.""" @@ -56,7 +59,7 @@ def _load(cls, ch: str) -> dict: # TODO: replace with pattern matching, once py3.9 will be abandoned if len(elements) > 3: raise ValueError() - q = TypeAdapter(QubitId).validate_python(elements[0]) + q = _adapted_qubit.validate_python(elements[0]) ct = ChannelType(elements[1]) assert len(elements) == 2 or ct is ChannelType.DRIVE_CROSS dc = elements[2] if len(elements) == 3 else None diff --git a/src/qibolab/sequence.py b/src/qibolab/sequence.py index fd9f89e2c1..d22ff8fb46 100644 --- a/src/qibolab/sequence.py +++ b/src/qibolab/sequence.py @@ -17,6 +17,8 @@ _Element = tuple[ChannelId, PulseLike] +_adapted_sequence = TypeAdapter(list[_Element]) + def _synchronize(sequence: "PulseSequence", channels: Iterable[ChannelId]) -> None: """Helper for ``concatenate`` and ``align_to_delays``. @@ -60,7 +62,7 @@ def _validate(cls, value): @staticmethod def _serialize(value): - return TypeAdapter(list[_Element]).dump_python(list(value)) + return _adapted_sequence.dump_python(list(value)) @classmethod def load(cls, value: list[tuple[str, PulseLike]]): From bdcf7f561de122c2a13431c63998db0633334d90 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 19 Aug 2024 19:08:44 +0200 Subject: [PATCH 0761/1006] fix: Parse and dump json directly through pydantic Instead of using the standard library module --- src/qibolab/platform/platform.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 3c1b9b3fb7..8e9f82d084 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -1,6 +1,5 @@ """A platform for executing quantum algorithms.""" -import json from collections import defaultdict from collections.abc import Iterable from dataclasses import dataclass, field @@ -288,9 +287,7 @@ def load( return cls( name=name, - parameters=Parameters.model_validate( - json.loads((path / PARAMETERS).read_text()) - ), + parameters=Parameters.model_validate_json((path / PARAMETERS).read_text()), instruments=instruments, qubits=qubits, couplers=couplers, @@ -298,9 +295,7 @@ def load( def dump(self, path: Path): """Dump platform.""" - (path / PARAMETERS).write_text( - json.dumps(self.parameters.model_dump(), sort_keys=False, indent=4) - ) + (path / PARAMETERS).write_text(self.parameters.model_dump_json(indent=4)) def get_qubit(self, qubit: QubitId) -> Qubit: """Return the name of the physical qubit corresponding to a logical From 8bcad7cc784c7394883d7fa70a6fa19b749965fc Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 19 Aug 2024 19:11:20 +0200 Subject: [PATCH 0762/1006] fix: Determine configs variants at validation time --- src/qibolab/parameters.py | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/qibolab/parameters.py b/src/qibolab/parameters.py index 3ecd555eec..1eec18088d 100644 --- a/src/qibolab/parameters.py +++ b/src/qibolab/parameters.py @@ -7,7 +7,7 @@ from collections.abc import Callable from typing import Annotated, Any, Union -from pydantic import Field, TypeAdapter +from pydantic import BeforeValidator, Field, PlainSerializer, TypeAdapter from pydantic_core import core_schema from qibolab.components import ChannelConfig, Config @@ -105,12 +105,27 @@ class NativeGates(Model): """ +def _load_configs(raw: dict[str, dict]) -> dict[ComponentId, Config]: + config_types = TypeAdapter( + Annotated[Union[ChannelConfig, Bounds], Field(discriminator="kind")] + ) + return {k: config_types.validate_python(v) for k, v in raw.items()} + + +def _dump_configs(obj: dict[ComponentId, Config]) -> dict[str, dict]: + config_types = TypeAdapter( + Annotated[Union[ChannelConfig, Bounds], Field(discriminator="kind")] + ) + return {k: config_types.dump_python(v) for k, v in obj.items()} + + class Parameters(Model): """Serializable parameters.""" settings: Settings = Field(default_factory=Settings) - configs: dict[ - ComponentId, - Annotated[Union[ChannelConfig, Bounds], Field(discriminator="kind")], + configs: Annotated[ + dict[ComponentId, Config], + BeforeValidator(_load_configs), + PlainSerializer(_dump_configs), ] = Field(default_factory=dict) native_gates: NativeGates = Field(default_factory=NativeGates) From 3e5e84a89e525f3fde4d1bfecd1eee661393c177 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 19 Aug 2024 19:28:41 +0200 Subject: [PATCH 0763/1006] feat: Establish class to handle configuration kinds --- src/qibolab/parameters.py | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/qibolab/parameters.py b/src/qibolab/parameters.py index 1eec18088d..f60c183952 100644 --- a/src/qibolab/parameters.py +++ b/src/qibolab/parameters.py @@ -4,8 +4,8 @@ example. """ -from collections.abc import Callable -from typing import Annotated, Any, Union +from collections.abc import Callable, Iterable +from typing import Annotated, Any, Type, Union from pydantic import BeforeValidator, Field, PlainSerializer, TypeAdapter from pydantic_core import core_schema @@ -104,17 +104,35 @@ class NativeGates(Model): This is assumed to always be in its serialized form. """ +_BUILTIN_CONFIGS = [ChannelConfig, Bounds] + + +class ConfigKinds: + _registered: list[Type[Config]] = _BUILTIN_CONFIGS + + @classmethod + def extend(cls, kinds: Iterable[Type[Config]]): + cls._registered.extend(kinds) + + @classmethod + def reset(cls): + cls._registered = _BUILTIN_CONFIGS + + @classmethod + def registered(cls) -> list[Type[Config]]: + return cls._registered.copy() + def _load_configs(raw: dict[str, dict]) -> dict[ComponentId, Config]: config_types = TypeAdapter( - Annotated[Union[ChannelConfig, Bounds], Field(discriminator="kind")] + Annotated[Union[*ConfigKinds.registered()], Field(discriminator="kind")] ) return {k: config_types.validate_python(v) for k, v in raw.items()} def _dump_configs(obj: dict[ComponentId, Config]) -> dict[str, dict]: config_types = TypeAdapter( - Annotated[Union[ChannelConfig, Bounds], Field(discriminator="kind")] + Annotated[Union[*ConfigKinds.registered()], Field(discriminator="kind")] ) return {k: config_types.dump_python(v) for k, v in obj.items()} From 1f8e8223aefbb6ae27c955a09986cde131e6bab2 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 19 Aug 2024 19:32:07 +0200 Subject: [PATCH 0764/1006] feat: Expose pydantic adapted general config type --- src/qibolab/parameters.py | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/src/qibolab/parameters.py b/src/qibolab/parameters.py index f60c183952..11528d4f92 100644 --- a/src/qibolab/parameters.py +++ b/src/qibolab/parameters.py @@ -108,6 +108,18 @@ class NativeGates(Model): class ConfigKinds: + """Registered configuration kinds. + + This class is handling the known configuration kinds for deserialization. + + .. attention:: + + Beware that is managing a global state. This should not be a major issue, as the + known configurations should be fixed per run. But prefer avoiding changing them + during a single session, unless you are clearly controlling the sequence of all + loading operations. + """ + _registered: list[Type[Config]] = _BUILTIN_CONFIGS @classmethod @@ -122,19 +134,21 @@ def reset(cls): def registered(cls) -> list[Type[Config]]: return cls._registered.copy() + @classmethod + def adapted(cls): + return TypeAdapter( + Annotated[Union[*ConfigKinds.registered()], Field(discriminator="kind")] + ) + def _load_configs(raw: dict[str, dict]) -> dict[ComponentId, Config]: - config_types = TypeAdapter( - Annotated[Union[*ConfigKinds.registered()], Field(discriminator="kind")] - ) - return {k: config_types.validate_python(v) for k, v in raw.items()} + a = ConfigKinds.adapted() + return {k: a.validate_python(v) for k, v in raw.items()} def _dump_configs(obj: dict[ComponentId, Config]) -> dict[str, dict]: - config_types = TypeAdapter( - Annotated[Union[*ConfigKinds.registered()], Field(discriminator="kind")] - ) - return {k: config_types.dump_python(v) for k, v in obj.items()} + a = ConfigKinds.adapted() + return {k: a.dump_python(v) for k, v in obj.items()} class Parameters(Model): From e6ba52969ce97e28d81c8326dc6050fd2bde3a86 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 19 Aug 2024 19:37:07 +0200 Subject: [PATCH 0765/1006] docs: Document config kinds api --- src/qibolab/parameters.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/qibolab/parameters.py b/src/qibolab/parameters.py index 11528d4f92..e5766b1d40 100644 --- a/src/qibolab/parameters.py +++ b/src/qibolab/parameters.py @@ -124,20 +124,31 @@ class ConfigKinds: @classmethod def extend(cls, kinds: Iterable[Type[Config]]): + """Extend the known configuration kinds. + + Nested unions are supported (i.e. :class:`Union` as elements of ``kinds``). + """ cls._registered.extend(kinds) @classmethod def reset(cls): + """Reset known configuration kinds to built-ins.""" cls._registered = _BUILTIN_CONFIGS @classmethod def registered(cls) -> list[Type[Config]]: + """Retrieve registered configuration kinds.""" return cls._registered.copy() @classmethod - def adapted(cls): + def adapted(cls) -> TypeAdapter: + """Construct tailored pydantic type adapter. + + The adapter will be able to directly load all the registered + configuration kinds as the appropriate Python objects. + """ return TypeAdapter( - Annotated[Union[*ConfigKinds.registered()], Field(discriminator="kind")] + Annotated[Union[*ConfigKinds._registered], Field(discriminator="kind")] ) From 0e88dacc9397edfefbfee456150e4abdb4a23b07 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 19 Aug 2024 20:01:26 +0200 Subject: [PATCH 0766/1006] fix: Trade unpack for tuple, as unsupport in py<3.11 Thanks https://github.com/pydantic/pydantic/issues/1439#issuecomment-625614766 --- src/qibolab/parameters.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/qibolab/parameters.py b/src/qibolab/parameters.py index e5766b1d40..4cc2ac05cf 100644 --- a/src/qibolab/parameters.py +++ b/src/qibolab/parameters.py @@ -148,7 +148,9 @@ def adapted(cls) -> TypeAdapter: configuration kinds as the appropriate Python objects. """ return TypeAdapter( - Annotated[Union[*ConfigKinds._registered], Field(discriminator="kind")] + Annotated[ + Union[tuple(ConfigKinds._registered)], Field(discriminator="kind") + ] ) From de95268359b24cfa491940f447e3f098eeedd33a Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 20 Aug 2024 12:21:09 +0200 Subject: [PATCH 0767/1006] test: Add test for two-qubit gates container --- tests/test_parameters.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 tests/test_parameters.py diff --git a/tests/test_parameters.py b/tests/test_parameters.py new file mode 100644 index 0000000000..a53d034a35 --- /dev/null +++ b/tests/test_parameters.py @@ -0,0 +1,23 @@ +import pytest + +from qibolab.native import FixedSequenceFactory, TwoQubitNatives +from qibolab.parameters import TwoQubitContainer + + +def test_two_qubit_container(): + """The container guarantees access to symmetric interactions. + + Swapped indexing is working (only with getitem, not other dict + methods) if all the registered natives are symmetric. + """ + symmetric = TwoQubitContainer({(0, 1): TwoQubitNatives(CZ=FixedSequenceFactory())}) + assert symmetric[1, 0].CZ is not None + + asymmetric = TwoQubitContainer( + {(0, 1): TwoQubitNatives(CNOT=FixedSequenceFactory())} + ) + with pytest.raises(KeyError): + asymmetric[(1, 0)] + + empty = TwoQubitContainer({(0, 1): TwoQubitNatives()}) + assert empty[(1, 0)] is not None From 605edb47a5531602cdfaa6f33686dca3e50d5a9b Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 20 Aug 2024 12:33:44 +0200 Subject: [PATCH 0768/1006] test: Start testing config kind interface --- tests/test_parameters.py | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/tests/test_parameters.py b/tests/test_parameters.py index a53d034a35..067aa1f692 100644 --- a/tests/test_parameters.py +++ b/tests/test_parameters.py @@ -1,7 +1,8 @@ import pytest +from qibolab.components.configs import Config from qibolab.native import FixedSequenceFactory, TwoQubitNatives -from qibolab.parameters import TwoQubitContainer +from qibolab.parameters import ConfigKinds, TwoQubitContainer def test_two_qubit_container(): @@ -21,3 +22,29 @@ def test_two_qubit_container(): empty = TwoQubitContainer({(0, 1): TwoQubitNatives()}) assert empty[(1, 0)] is not None + + +class DummyConfig(Config): + ciao: str + + +class DummyConfig1(Config): + come: str + + +class TestConfigKinds: + @pytest.fixture(autouse=True) + @staticmethod + def clean_kinds(): + ConfigKinds.reset() + + def test_manipulation(self): + ConfigKinds.extend([DummyConfig]) + assert DummyConfig in ConfigKinds.registered() + + ConfigKinds.reset() + assert DummyConfig not in ConfigKinds.registered() + + ConfigKinds.extend([DummyConfig, DummyConfig1]) + assert DummyConfig in ConfigKinds.registered() + assert DummyConfig1 in ConfigKinds.registered() From 11006247ceedf9217c56f7b242d4856ed3f464e7 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 20 Aug 2024 12:34:05 +0200 Subject: [PATCH 0769/1006] fix: Avoid config kinds modifying the builtin list --- src/qibolab/parameters.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/qibolab/parameters.py b/src/qibolab/parameters.py index 4cc2ac05cf..854d98e834 100644 --- a/src/qibolab/parameters.py +++ b/src/qibolab/parameters.py @@ -5,6 +5,7 @@ """ from collections.abc import Callable, Iterable +from types import UnionType from typing import Annotated, Any, Type, Union from pydantic import BeforeValidator, Field, PlainSerializer, TypeAdapter @@ -104,7 +105,8 @@ class NativeGates(Model): This is assumed to always be in its serialized form. """ -_BUILTIN_CONFIGS = [ChannelConfig, Bounds] +_ChannelConfigT = Union[UnionType, type[Config]] +_BUILTIN_CONFIGS: tuple[_ChannelConfigT, ...] = (ChannelConfig, Bounds) class ConfigKinds: @@ -120,7 +122,7 @@ class ConfigKinds: loading operations. """ - _registered: list[Type[Config]] = _BUILTIN_CONFIGS + _registered: list[_ChannelConfigT] = list(_BUILTIN_CONFIGS) @classmethod def extend(cls, kinds: Iterable[Type[Config]]): @@ -133,10 +135,10 @@ def extend(cls, kinds: Iterable[Type[Config]]): @classmethod def reset(cls): """Reset known configuration kinds to built-ins.""" - cls._registered = _BUILTIN_CONFIGS + cls._registered = list(_BUILTIN_CONFIGS) @classmethod - def registered(cls) -> list[Type[Config]]: + def registered(cls) -> list[_ChannelConfigT]: """Retrieve registered configuration kinds.""" return cls._registered.copy() From 51ac8c48a83c18741f85127dce109969593de38a Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 20 Aug 2024 12:41:37 +0200 Subject: [PATCH 0770/1006] test: Test dynamic configs serialization --- src/qibolab/parameters.py | 4 ++-- tests/test_parameters.py | 22 +++++++++++++++++++++- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/qibolab/parameters.py b/src/qibolab/parameters.py index 854d98e834..275fc7068d 100644 --- a/src/qibolab/parameters.py +++ b/src/qibolab/parameters.py @@ -6,7 +6,7 @@ from collections.abc import Callable, Iterable from types import UnionType -from typing import Annotated, Any, Type, Union +from typing import Annotated, Any, Union from pydantic import BeforeValidator, Field, PlainSerializer, TypeAdapter from pydantic_core import core_schema @@ -125,7 +125,7 @@ class ConfigKinds: _registered: list[_ChannelConfigT] = list(_BUILTIN_CONFIGS) @classmethod - def extend(cls, kinds: Iterable[Type[Config]]): + def extend(cls, kinds: Iterable[type[Config]]): """Extend the known configuration kinds. Nested unions are supported (i.e. :class:`Union` as elements of ``kinds``). diff --git a/tests/test_parameters.py b/tests/test_parameters.py index 067aa1f692..04a605f3f7 100644 --- a/tests/test_parameters.py +++ b/tests/test_parameters.py @@ -1,3 +1,5 @@ +from typing import Literal + import pytest from qibolab.components.configs import Config @@ -25,11 +27,13 @@ def test_two_qubit_container(): class DummyConfig(Config): + kind: Literal["dummy"] = "dummy" ciao: str class DummyConfig1(Config): - come: str + kind: Literal["dummy1"] = "dummy1" + come: int class TestConfigKinds: @@ -48,3 +52,19 @@ def test_manipulation(self): ConfigKinds.extend([DummyConfig, DummyConfig1]) assert DummyConfig in ConfigKinds.registered() assert DummyConfig1 in ConfigKinds.registered() + + def test_adapted(self): + ConfigKinds.extend([DummyConfig, DummyConfig1]) + adapted = ConfigKinds.adapted() + + dummy = DummyConfig(ciao="come") + dump = adapted.dump_python(dummy) + assert dump["ciao"] == "come" + reloaded = adapted.validate_python(dump) + assert reloaded == dummy + + dummy1 = DummyConfig1(come=42) + dump1 = adapted.dump_python(dummy1) + assert dump1["come"] == 42 + reloaded1 = adapted.validate_python(dump1) + assert reloaded1 == dummy1 From a714f97ac6b649be019b3da00faf5d45e995d8f1 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 20 Aug 2024 12:52:55 +0200 Subject: [PATCH 0771/1006] test: Test dynamic configs serialization within parameters --- tests/test_parameters.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/tests/test_parameters.py b/tests/test_parameters.py index 04a605f3f7..af459862f2 100644 --- a/tests/test_parameters.py +++ b/tests/test_parameters.py @@ -4,7 +4,7 @@ from qibolab.components.configs import Config from qibolab.native import FixedSequenceFactory, TwoQubitNatives -from qibolab.parameters import ConfigKinds, TwoQubitContainer +from qibolab.parameters import ConfigKinds, Parameters, TwoQubitContainer def test_two_qubit_container(): @@ -68,3 +68,14 @@ def test_adapted(self): assert dump1["come"] == 42 reloaded1 = adapted.validate_python(dump1) assert reloaded1 == dummy1 + + def test_within_parameters(self): + ConfigKinds.extend([DummyConfig, DummyConfig1]) + pars = Parameters(configs={"come": DummyConfig1(come=42)}) + + dump = pars.model_dump() + assert dump["configs"]["come"]["come"] == 42 + assert "dummy1" in pars.model_dump_json() + + reloaded = Parameters.model_validate(dump) + assert reloaded == pars From 3eefeab1630c9ca3fa15e9b0a89600c039329145 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 20 Aug 2024 12:58:25 +0200 Subject: [PATCH 0772/1006] fix: Fix type hint for missing type in py3.9 https://docs.python.org/3/library/types.html#types.UnionType --- src/qibolab/parameters.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/qibolab/parameters.py b/src/qibolab/parameters.py index 275fc7068d..d9ed9c8166 100644 --- a/src/qibolab/parameters.py +++ b/src/qibolab/parameters.py @@ -5,7 +5,6 @@ """ from collections.abc import Callable, Iterable -from types import UnionType from typing import Annotated, Any, Union from pydantic import BeforeValidator, Field, PlainSerializer, TypeAdapter @@ -105,7 +104,9 @@ class NativeGates(Model): This is assumed to always be in its serialized form. """ -_ChannelConfigT = Union[UnionType, type[Config]] +# TODO: replace _UnionType with UnionType, once py3.9 will be abandoned +_UnionType = Any +_ChannelConfigT = Union[_UnionType, type[Config]] _BUILTIN_CONFIGS: tuple[_ChannelConfigT, ...] = (ChannelConfig, Bounds) From 7a66bb94db58d8d50885d5f44afe2646a856540b Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 20 Aug 2024 13:05:31 +0200 Subject: [PATCH 0773/1006] test: Remove unsupported decorator (in py3.9) --- tests/test_parameters.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_parameters.py b/tests/test_parameters.py index af459862f2..1e52e35366 100644 --- a/tests/test_parameters.py +++ b/tests/test_parameters.py @@ -37,9 +37,9 @@ class DummyConfig1(Config): class TestConfigKinds: + # TODO: add @staticmethod and drop unused `self`, once py3.9 will be abandoned @pytest.fixture(autouse=True) - @staticmethod - def clean_kinds(): + def clean_kinds(self): ConfigKinds.reset() def test_manipulation(self): From a1dd90ee870238b6c8c9e752ebf861f8f33dbe49 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 26 Aug 2024 17:31:23 +0200 Subject: [PATCH 0774/1006] fix: Re-enforce forbidding extra attributes in parameters --- src/qibolab/serialize.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibolab/serialize.py b/src/qibolab/serialize.py index ed68c9bab4..bab6707e17 100644 --- a/src/qibolab/serialize.py +++ b/src/qibolab/serialize.py @@ -58,7 +58,7 @@ def eq(obj1: BaseModel, obj2: BaseModel) -> bool: class Model(BaseModel): """Global qibolab model, holding common configurations.""" - model_config = ConfigDict(arbitrary_types_allowed=True, extra="allow", frozen=True) + model_config = ConfigDict(arbitrary_types_allowed=True, extra="forbid", frozen=True) M = TypeVar("M", bound=BaseModel) From 39744340a0a030fd833e3a891da4fdeb40ac8529 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 29 Aug 2024 01:04:56 +0400 Subject: [PATCH 0775/1006] fix: add missing QmConfig --- src/qibolab/instruments/qm/components/configs.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/qibolab/instruments/qm/components/configs.py b/src/qibolab/instruments/qm/components/configs.py index 5585dd2491..2bea4e2f66 100644 --- a/src/qibolab/instruments/qm/components/configs.py +++ b/src/qibolab/instruments/qm/components/configs.py @@ -1,13 +1,10 @@ -from typing import Literal +from typing import Literal, Union from pydantic import Field from qibolab.components import AcquisitionConfig, DcConfig -__all__ = [ - "OpxOutputConfig", - "QmAcquisitionConfig", -] +__all__ = ["OpxOutputConfig", "QmAcquisitionConfig", "QmConfig"] class OpxOutputConfig(DcConfig): @@ -20,7 +17,7 @@ class OpxOutputConfig(DcConfig): Possible values are -0.5V to 0.5V. """ - filter: dict[str, float] = Field(default_factory=dict) + filter: dict[str, list[float]] = Field(default_factory=dict) """FIR and IIR filters to be applied for correcting signal distortions. See @@ -42,3 +39,6 @@ class QmAcquisitionConfig(AcquisitionConfig): """ offset: float = 0.0 """Constant voltage to be applied on the input.""" + + +QmConfig = Union[OpxOutputConfig, QmAcquisitionConfig] From ddfc3cb2b14fb56722b1455015cb670d5d99eaee Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 29 Aug 2024 01:07:34 +0400 Subject: [PATCH 0776/1006] chore: rename to QmConfigs --- src/qibolab/instruments/qm/components/configs.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qibolab/instruments/qm/components/configs.py b/src/qibolab/instruments/qm/components/configs.py index 2bea4e2f66..717dbf7ec8 100644 --- a/src/qibolab/instruments/qm/components/configs.py +++ b/src/qibolab/instruments/qm/components/configs.py @@ -4,7 +4,7 @@ from qibolab.components import AcquisitionConfig, DcConfig -__all__ = ["OpxOutputConfig", "QmAcquisitionConfig", "QmConfig"] +__all__ = ["OpxOutputConfig", "QmAcquisitionConfig", "QmConfigs"] class OpxOutputConfig(DcConfig): @@ -41,4 +41,4 @@ class QmAcquisitionConfig(AcquisitionConfig): """Constant voltage to be applied on the input.""" -QmConfig = Union[OpxOutputConfig, QmAcquisitionConfig] +QmConfigs = Union[OpxOutputConfig, QmAcquisitionConfig] From a140f51c29e93309ee920a08e3d33687c47a51c1 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 20 Aug 2024 13:21:30 +0200 Subject: [PATCH 0777/1006] build: Remove now unused more-itertools dependency --- poetry.lock | 19 ++++--------------- pyproject.toml | 1 - 2 files changed, 4 insertions(+), 16 deletions(-) diff --git a/poetry.lock b/poetry.lock index 42d09f107e..b8772b43c2 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1584,13 +1584,13 @@ files = [ [[package]] name = "importlib-metadata" -version = "8.2.0" +version = "8.3.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-8.2.0-py3-none-any.whl", hash = "sha256:11901fa0c2f97919b288679932bb64febaeacf289d18ac84dd68cb2e74213369"}, - {file = "importlib_metadata-8.2.0.tar.gz", hash = "sha256:72e8d4399996132204f9a16dcc751af254a48f8d1b20b9ff0f98d4a8f901e73d"}, + {file = "importlib_metadata-8.3.0-py3-none-any.whl", hash = "sha256:42817a4a0be5845d22c6e212db66a94ad261e2318d80b3e0d363894a79df2b67"}, + {file = "importlib_metadata-8.3.0.tar.gz", hash = "sha256:9c8fa6e8ea0f9516ad5c8db9246a731c948193c7754d3babb0114a05b27dd364"}, ] [package.dependencies] @@ -2369,17 +2369,6 @@ files = [ {file = "mistune-3.0.2.tar.gz", hash = "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8"}, ] -[[package]] -name = "more-itertools" -version = "9.1.0" -description = "More routines for operating on iterables, beyond itertools" -optional = false -python-versions = ">=3.7" -files = [ - {file = "more-itertools-9.1.0.tar.gz", hash = "sha256:cabaa341ad0389ea83c17a94566a53ae4c9d07349861ecb14dc6d0345cf9ac5d"}, - {file = "more_itertools-9.1.0-py3-none-any.whl", hash = "sha256:d2bc7f02446e86a68911e58ded76d6561eea00cddfb2a91e7019bbb586c799f3"}, -] - [[package]] name = "mpmath" version = "1.3.0" @@ -5919,4 +5908,4 @@ zh = ["laboneq"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.13" -content-hash = "ef38aec46ecd9f84cad3b7eca72b289b15d6495fc3388d5ba26c64f29ddc3390" +content-hash = "57df4d457e539b1f67ad4a4bab04ca32aa40dba477e5d8e623004a57f59a409d" diff --git a/pyproject.toml b/pyproject.toml index d82939bf94..5dc56b8173 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,7 +25,6 @@ python = ">=3.9,<3.13" qibo = "^0.2.8" numpy = "^1.26.4" scipy = "^1.13.0" -more-itertools = "^9.1.0" pydantic = "^2.6.4" qblox-instruments = { version = "0.12.0", optional = true } qcodes = { version = "^0.37.0", optional = true } From c5dcd5bbbf3b6ffadf66ffb78dc5385b2afff223 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 20 Aug 2024 15:28:43 +0200 Subject: [PATCH 0778/1006] test: Test raw acquisition shape, remove corresponding dummy-specific test --- tests/conftest.py | 1 + tests/test_dummy.py | 19 ------------------- tests/test_result_shapes.py | 13 +++++++++++++ 3 files changed, 14 insertions(+), 19 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 0ace831064..c1e160539c 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -149,6 +149,7 @@ def wrapped( probe_seq = natives.MZ.create_sequence() probe_pulse = probe_seq[0][1] acq = probe_seq[1][1] + wrapped.acquisition_duration = acq.duration sequence = PulseSequence() sequence.concatenate(qd_seq) sequence.concatenate(probe_seq) diff --git a/tests/test_dummy.py b/tests/test_dummy.py index 42ee19a6c4..fbe3842745 100644 --- a/tests/test_dummy.py +++ b/tests/test_dummy.py @@ -20,25 +20,6 @@ def test_dummy_initialization(platform: Platform): platform.disconnect() -@pytest.mark.parametrize( - "acquisition", [AcquisitionType.INTEGRATION, AcquisitionType.RAW] -) -def test_dummy_execute_pulse_sequence(platform: Platform, acquisition): - nshots = 100 - natives = platform.natives.single_qubit[0] - probe_seq = natives.MZ.create_sequence() - acq = probe_seq[1][1] - sequence = PulseSequence() - sequence.concatenate(probe_seq) - sequence.concatenate(natives.RX12.create_sequence()) - options = ExecutionParameters(nshots=100, acquisition_type=acquisition) - result = platform.execute([sequence], options) - if acquisition is AcquisitionType.INTEGRATION: - assert result[acq.id][0].shape == (nshots, 2) - elif acquisition is AcquisitionType.RAW: - assert result[acq.id][0].shape == (nshots, int(acq.duration), 2) - - def test_dummy_execute_coupler_pulse(platform: Platform): sequence = PulseSequence() diff --git a/tests/test_result_shapes.py b/tests/test_result_shapes.py index 96d54a119e..f6bc0704be 100644 --- a/tests/test_result_shapes.py +++ b/tests/test_result_shapes.py @@ -43,3 +43,16 @@ def test_integration_cyclic(execute, sweep): assert result.shape == (2,) else: assert result.shape == (NSWEEP1, NSWEEP2, 2) + + +def test_raw_singleshot(execute): + result = execute(Acq.RAW, Av.SINGLESHOT, NSHOTS, []) + assert result.shape == (NSHOTS, int(execute.acquisition_duration), 2) + + +def test_raw_cyclic(execute, sweep): + result = execute(Acq.RAW, Av.CYCLIC, NSHOTS, sweep) + if sweep == []: + assert result.shape == (int(execute.acquisition_duration), 2) + else: + assert result.shape == (NSWEEP1, NSWEEP2, int(execute.acquisition_duration), 2) From ee1f1856cd2913b10b1647ade9aa203aa3693bb1 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 20 Aug 2024 15:32:28 +0200 Subject: [PATCH 0779/1006] test: Remove dummy sweeper tests, as redundant They are just checking the result shape, which is already covered in dedicated tests --- tests/test_dummy.py | 161 +------------------------------------------- 1 file changed, 1 insertion(+), 160 deletions(-) diff --git a/tests/test_dummy.py b/tests/test_dummy.py index fbe3842745..fbc4fae5ce 100644 --- a/tests/test_dummy.py +++ b/tests/test_dummy.py @@ -3,7 +3,7 @@ from qibolab import AcquisitionType, AveragingMode, ExecutionParameters, create_platform from qibolab.platform.platform import Platform -from qibolab.pulses import Delay, Gaussian, GaussianSquare, Pulse +from qibolab.pulses import Delay, GaussianSquare, Pulse from qibolab.sequence import PulseSequence from qibolab.sweeper import ChannelParameter, Parameter, Sweeper @@ -85,30 +85,6 @@ def test_dummy_execute_pulse_sequence_unrolling( assert r.samples.shape == (nshots,) -def test_dummy_single_sweep_raw(platform: Platform): - sequence = PulseSequence() - natives = platform.natives - probe_seq = natives.single_qubit[0].MZ.create_sequence() - acq = probe_seq[1][1] - - parameter_range = np.random.randint(SWEPT_POINTS, size=SWEPT_POINTS) - sequence.concatenate(probe_seq) - sweeper = Sweeper( - Parameter.frequency, - parameter_range, - channels=[platform.get_qubit(0).probe.name], - ) - options = ExecutionParameters( - nshots=10, - averaging_mode=AveragingMode.CYCLIC, - acquisition_type=AcquisitionType.RAW, - ) - results = platform.execute([sequence], options, [[sweeper]]) - assert acq.id in results - shape = results[acq.id][0].shape - assert shape == (SWEPT_POINTS, int(acq.duration), 2) - - @pytest.mark.parametrize("fast_reset", [True, False]) @pytest.mark.parametrize( "parameter", [Parameter.amplitude, Parameter.duration, Parameter.bias] @@ -173,141 +149,6 @@ def test_dummy_single_sweep_coupler( assert results_shape == expected_shape -@pytest.mark.parametrize("fast_reset", [True, False]) -@pytest.mark.parametrize("parameter", Parameter) -@pytest.mark.parametrize("average", [AveragingMode.SINGLESHOT, AveragingMode.CYCLIC]) -@pytest.mark.parametrize( - "acquisition", [AcquisitionType.INTEGRATION, AcquisitionType.DISCRIMINATION] -) -@pytest.mark.parametrize("nshots", [10, 20]) -def test_dummy_single_sweep( - platform: Platform, fast_reset, parameter, average, acquisition, nshots -): - sequence = PulseSequence() - natives = platform.natives - probe_seq = natives.single_qubit[0].MZ.create_sequence() - pulse = probe_seq[0][1] - acq = probe_seq[1][1] - if parameter is Parameter.amplitude: - parameter_range = np.random.rand(SWEPT_POINTS) - else: - parameter_range = np.random.randint(SWEPT_POINTS, size=SWEPT_POINTS) - sequence.concatenate(probe_seq) - if parameter in ChannelParameter: - channel = ( - platform.qubits[0].drive.name - if parameter is Parameter.frequency - else platform.qubits[0].flux.name - ) - sweeper = Sweeper(parameter, parameter_range, channels=[channel]) - else: - sweeper = Sweeper(parameter, parameter_range, pulses=[pulse]) - options = ExecutionParameters( - nshots=nshots, - averaging_mode=average, - acquisition_type=acquisition, - fast_reset=fast_reset, - ) - results = platform.execute([sequence], options, [[sweeper]]) - - assert acq.id in results - if options.averaging_mode.average: - results_shape = ( - results[acq.id][0].shape - if acquisition is AcquisitionType.INTEGRATION - else results[acq.id][0].shape - ) - else: - results_shape = ( - results[acq.id][0].shape - if acquisition is AcquisitionType.INTEGRATION - else results[acq.id][0].shape - ) - - expected_shape = (SWEPT_POINTS,) - if not options.averaging_mode.average: - expected_shape = (nshots,) + expected_shape - if acquisition is not AcquisitionType.DISCRIMINATION: - expected_shape += (2,) - assert results_shape == expected_shape - - -@pytest.mark.parametrize("parameter1", Parameter) -@pytest.mark.parametrize("parameter2", Parameter) -@pytest.mark.parametrize("average", [AveragingMode.SINGLESHOT, AveragingMode.CYCLIC]) -@pytest.mark.parametrize( - "acquisition", [AcquisitionType.INTEGRATION, AcquisitionType.DISCRIMINATION] -) -@pytest.mark.parametrize("nshots", [10, 20]) -def test_dummy_double_sweep( - platform: Platform, parameter1, parameter2, average, acquisition, nshots -): - sequence = PulseSequence() - pulse = Pulse(duration=40, amplitude=0.1, envelope=Gaussian(rel_sigma=5)) - natives = platform.natives - probe_seq = natives.single_qubit[0].MZ.create_sequence() - probe_pulse = probe_seq[0][1] - acq = probe_seq[1][1] - sequence.append((platform.get_qubit(0).drive.name, pulse)) - sequence.append((platform.qubits[0].probe.name, Delay(duration=pulse.duration))) - sequence.concatenate(probe_seq) - parameter_range_1 = ( - np.random.rand(SWEPT_POINTS) - if parameter1 is Parameter.amplitude - else np.random.randint(SWEPT_POINTS, size=SWEPT_POINTS) - ) - parameter_range_2 = ( - np.random.rand(SWEPT_POINTS) - if parameter2 is Parameter.amplitude - else np.random.randint(SWEPT_POINTS, size=SWEPT_POINTS) - ) - - if parameter1 in ChannelParameter: - channel = ( - platform.qubits[0].probe.name - if parameter1 is Parameter.frequency - else platform.qubits[0].flux.name - ) - sweeper1 = Sweeper(parameter1, parameter_range_1, channels=[channel]) - else: - sweeper1 = Sweeper(parameter1, parameter_range_1, pulses=[probe_pulse]) - if parameter2 in ChannelParameter: - sweeper2 = Sweeper( - parameter2, parameter_range_2, channels=[platform.qubits[0].flux.name] - ) - else: - sweeper2 = Sweeper(parameter2, parameter_range_2, pulses=[pulse]) - - options = ExecutionParameters( - nshots=nshots, - averaging_mode=average, - acquisition_type=acquisition, - ) - results = platform.execute([sequence], options, [[sweeper1], [sweeper2]]) - - assert acq.id in results - - if options.averaging_mode.average: - results_shape = ( - results[acq.id][0].shape - if acquisition is AcquisitionType.INTEGRATION - else results[acq.id][0].shape - ) - else: - results_shape = ( - results[acq.id][0].shape - if acquisition is AcquisitionType.INTEGRATION - else results[acq.id][0].shape - ) - - expected_shape = (SWEPT_POINTS, SWEPT_POINTS) - if not options.averaging_mode.average: - expected_shape = (nshots,) + expected_shape - if acquisition is not AcquisitionType.DISCRIMINATION: - expected_shape += (2,) - assert results_shape == expected_shape - - @pytest.mark.parametrize("parameter", Parameter) @pytest.mark.parametrize("average", [AveragingMode.SINGLESHOT, AveragingMode.CYCLIC]) @pytest.mark.parametrize( From bcef78d84ceeb2ba8f91305adca0ace447bb4356 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 20 Aug 2024 15:35:15 +0200 Subject: [PATCH 0780/1006] test: Remove multiplexed dummy test Mostly redundant, it should be replaced with a test on the exact type returned by Platform.execute, in #964 --- tests/test_dummy.py | 67 --------------------------------------------- 1 file changed, 67 deletions(-) diff --git a/tests/test_dummy.py b/tests/test_dummy.py index fbc4fae5ce..61ddeaa953 100644 --- a/tests/test_dummy.py +++ b/tests/test_dummy.py @@ -147,70 +147,3 @@ def test_dummy_single_sweep_coupler( if acquisition is not AcquisitionType.DISCRIMINATION: expected_shape += (2,) assert results_shape == expected_shape - - -@pytest.mark.parametrize("parameter", Parameter) -@pytest.mark.parametrize("average", [AveragingMode.SINGLESHOT, AveragingMode.CYCLIC]) -@pytest.mark.parametrize( - "acquisition", [AcquisitionType.INTEGRATION, AcquisitionType.DISCRIMINATION] -) -@pytest.mark.parametrize("nshots", [10, 20]) -def test_dummy_single_sweep_multiplex( - platform: Platform, parameter, average, acquisition, nshots -): - sequence = PulseSequence() - probe_pulses = {} - acqs = {} - natives = platform.natives - for qubit in platform.qubits: - probe_seq = natives.single_qubit[qubit].MZ.create_sequence() - probe_pulses[qubit] = probe_seq[0][1] - acqs[qubit] = probe_seq[1][1] - sequence.concatenate(probe_seq) - parameter_range = ( - np.random.rand(SWEPT_POINTS) - if parameter is Parameter.amplitude - else np.random.randint(SWEPT_POINTS, size=SWEPT_POINTS) - ) - - if parameter in ChannelParameter: - sweeper1 = Sweeper( - parameter, - parameter_range, - channels=[qubit.probe.name for qubit in platform.qubits.values()], - ) - else: - sweeper1 = Sweeper( - parameter, - parameter_range, - pulses=[probe_pulses[qubit] for qubit in platform.qubits], - ) - - options = ExecutionParameters( - nshots=nshots, - averaging_mode=average, - acquisition_type=acquisition, - ) - results = platform.execute([sequence], options, [[sweeper1]]) - - for acq in acqs.values(): - assert acq.id in results - if not options.averaging_mode.average: - results_shape = ( - results[acq.id][0].shape - if acquisition is AcquisitionType.INTEGRATION - else results[acq.id][0].shape - ) - else: - results_shape = ( - results[acq.id][0].shape - if acquisition is AcquisitionType.INTEGRATION - else results[acq.id][0].shape - ) - - expected_shape = (SWEPT_POINTS,) - if not options.averaging_mode.average: - expected_shape = (nshots,) + expected_shape - if acquisition is not AcquisitionType.DISCRIMINATION: - expected_shape += (2,) - assert results_shape == expected_shape From 64247be3cd1b88271bbaef31d74b4ca865370048 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 20 Aug 2024 15:36:38 +0200 Subject: [PATCH 0781/1006] test: Remove dummy sweeper coupler test For dummy it is a trivial combination of a sweeper, and addressing a coupler, which are both separately tested --- tests/test_dummy.py | 68 +-------------------------------------------- 1 file changed, 1 insertion(+), 67 deletions(-) diff --git a/tests/test_dummy.py b/tests/test_dummy.py index 61ddeaa953..a2cb882493 100644 --- a/tests/test_dummy.py +++ b/tests/test_dummy.py @@ -1,11 +1,9 @@ -import numpy as np import pytest -from qibolab import AcquisitionType, AveragingMode, ExecutionParameters, create_platform +from qibolab import AcquisitionType, ExecutionParameters, create_platform from qibolab.platform.platform import Platform from qibolab.pulses import Delay, GaussianSquare, Pulse from qibolab.sequence import PulseSequence -from qibolab.sweeper import ChannelParameter, Parameter, Sweeper SWEPT_POINTS = 5 @@ -83,67 +81,3 @@ def test_dummy_execute_pulse_sequence_unrolling( assert r.magnitude.shape == (nshots,) if acquisition is AcquisitionType.DISCRIMINATION: assert r.samples.shape == (nshots,) - - -@pytest.mark.parametrize("fast_reset", [True, False]) -@pytest.mark.parametrize( - "parameter", [Parameter.amplitude, Parameter.duration, Parameter.bias] -) -@pytest.mark.parametrize("average", [AveragingMode.SINGLESHOT, AveragingMode.CYCLIC]) -@pytest.mark.parametrize( - "acquisition", [AcquisitionType.INTEGRATION, AcquisitionType.DISCRIMINATION] -) -@pytest.mark.parametrize("nshots", [10, 20]) -def test_dummy_single_sweep_coupler( - fast_reset, parameter, average, acquisition, nshots -): - platform = create_platform("dummy") - sequence = PulseSequence() - natives = platform.natives - probe_seq = natives.single_qubit[0].MZ.create_sequence() - acq = probe_seq[1][1] - coupler_pulse = Pulse.flux( - duration=40, - amplitude=0.5, - envelope=GaussianSquare(rel_sigma=0.2, width=0.75), - ) - sequence.concatenate(probe_seq) - sequence.append((platform.get_coupler(0).flux.name, coupler_pulse)) - if parameter is Parameter.amplitude: - parameter_range = np.random.rand(SWEPT_POINTS) - else: - parameter_range = np.random.randint(SWEPT_POINTS, size=SWEPT_POINTS) - if parameter in ChannelParameter: - sweeper = Sweeper( - parameter, parameter_range, channels=[platform.couplers[0].flux.name] - ) - else: - sweeper = Sweeper(parameter, parameter_range, pulses=[coupler_pulse]) - options = ExecutionParameters( - nshots=nshots, - averaging_mode=average, - acquisition_type=acquisition, - fast_reset=fast_reset, - ) - results = platform.execute([sequence], options, [[sweeper]]) - - assert acq.id in results - if not options.averaging_mode.average: - results_shape = ( - results[acq.id][0].shape - if acquisition is AcquisitionType.INTEGRATION - else results[acq.id][0].shape - ) - else: - results_shape = ( - results[acq.id][0].shape - if acquisition is AcquisitionType.INTEGRATION - else results[acq.id][0].shape - ) - - expected_shape = (SWEPT_POINTS,) - if not options.averaging_mode.average: - expected_shape = (nshots,) + expected_shape - if acquisition is not AcquisitionType.DISCRIMINATION: - expected_shape += (2,) - assert results_shape == expected_shape From 6491dcc880eff46ba538beac601df862c4dda875 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 21 Aug 2024 16:54:56 +0200 Subject: [PATCH 0782/1006] test: Remove dummy fast reset The fast reset option is ineffective on dummy, and it's not yet implemented in any driver either --- tests/test_dummy.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/tests/test_dummy.py b/tests/test_dummy.py index a2cb882493..c8db6f26e2 100644 --- a/tests/test_dummy.py +++ b/tests/test_dummy.py @@ -49,14 +49,6 @@ def test_dummy_execute_pulse_sequence_couplers(): _ = platform.execute([sequence], options) -def test_dummy_execute_pulse_sequence_fast_reset(platform: Platform): - natives = platform.natives - sequence = PulseSequence() - sequence.concatenate(natives.single_qubit[0].MZ.create_sequence()) - options = ExecutionParameters(nshots=None, fast_reset=True) - _ = platform.execute([sequence], options) - - @pytest.mark.parametrize( "acquisition", [AcquisitionType.INTEGRATION, AcquisitionType.DISCRIMINATION] ) From 16878231ecdb6a30d603a3785899235c72ff1aa6 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Wed, 28 Aug 2024 18:49:30 +0300 Subject: [PATCH 0783/1006] refactor: make Sweeper pydantic Model --- src/qibolab/sweeper.py | 30 +++++++++++++++++++++++------- tests/conftest.py | 8 ++++++-- tests/test_sweeper.py | 30 ++++++++++++++++++++++-------- 3 files changed, 51 insertions(+), 17 deletions(-) diff --git a/src/qibolab/sweeper.py b/src/qibolab/sweeper.py index b02ca2c3e7..9736f30caa 100644 --- a/src/qibolab/sweeper.py +++ b/src/qibolab/sweeper.py @@ -1,8 +1,13 @@ -from dataclasses import dataclass from enum import Enum, auto from typing import Optional +import numpy as np import numpy.typing as npt +from pydantic import model_validator + +from .identifier import ChannelId +from .pulses import Pulse +from .serialize import Model class Parameter(Enum): @@ -38,8 +43,7 @@ class Parameter(Enum): } -@dataclass -class Sweeper: +class Sweeper(Model): """Data structure for Sweeper object. This object is passed as an argument to the method :func:`qibolab.platforms.platform.Platform.execute` @@ -77,11 +81,13 @@ class Sweeper: """ parameter: Parameter - values: npt.NDArray - pulses: Optional[list] = None - channels: Optional[list] = None + values: Optional[npt.NDArray] = None + linspace: Optional[tuple[float, float, float]] = None + pulses: Optional[list[Pulse]] = None + channels: Optional[list[ChannelId]] = None - def __post_init__(self): + @model_validator(mode="after") + def check_values(self): if self.pulses is not None and self.channels is not None: raise ValueError( "Cannot create a sweeper by using both pulses and channels." @@ -98,6 +104,16 @@ def __post_init__(self): raise ValueError( "Cannot create a sweeper without specifying pulses or channels." ) + if self.linspace is not None and self.values is not None: + raise ValueError("'linspace' and 'values' are mutually exclusive") + + return self + + @property + def values_array(self) -> npt.NDArray: + if self.linspace is not None: + return np.linspace(*self.linspace) + return self.values ParallelSweepers = list[Sweeper] diff --git a/tests/conftest.py b/tests/conftest.py index c1e160539c..551bd83f05 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -157,10 +157,14 @@ def wrapped( amp_values = np.arange(0.01, 0.06, 0.01) freq_values = np.arange(-4e6, 4e6, 1e6) sweeper1 = Sweeper( - Parameter.bias, amp_values, channels=[qubit.flux.name] + parameter=Parameter.bias, + values=amp_values, + channels=[qubit.flux.name], ) sweeper2 = Sweeper( - Parameter.amplitude, freq_values, pulses=[probe_pulse] + parameter=Parameter.amplitude, + values=freq_values, + pulses=[probe_pulse], ) sweepers = [[sweeper1], [sweeper2]] if target is None: diff --git a/tests/test_sweeper.py b/tests/test_sweeper.py index 848f114112..a3e1229064 100644 --- a/tests/test_sweeper.py +++ b/tests/test_sweeper.py @@ -1,6 +1,7 @@ import numpy as np import pytest +from qibolab.identifier import ChannelId from qibolab.pulses import Pulse, Rectangular from qibolab.sweeper import ChannelParameter, Parameter, Sweeper @@ -20,26 +21,30 @@ def test_sweeper_pulses(parameter): with pytest.raises( ValueError, match="Cannot create a sweeper .* without specifying channels" ): - _ = Sweeper(parameter, parameter_range, pulses=[pulse]) + _ = Sweeper(parameter=parameter, values=parameter_range, pulses=[pulse]) else: - sweeper = Sweeper(parameter, parameter_range, pulses=[pulse]) + sweeper = Sweeper(parameter=parameter, values=parameter_range, pulses=[pulse]) assert sweeper.parameter is parameter @pytest.mark.parametrize("parameter", Parameter) def test_sweeper_channels(parameter): + channel = ChannelId.load("0/probe") parameter_range = np.random.randint(10, size=10) if parameter in ChannelParameter: - sweeper = Sweeper(parameter, parameter_range, channels=["some channel"]) + sweeper = Sweeper( + parameter=parameter, values=parameter_range, channels=[channel] + ) assert sweeper.parameter is parameter else: with pytest.raises( ValueError, match="Cannot create a sweeper .* without specifying pulses" ): - _ = Sweeper(parameter, parameter_range, channels=["canal"]) + _ = Sweeper(parameter=parameter, values=parameter_range, channels=[channel]) def test_sweeper_errors(): + channel = ChannelId.load("0/probe") pulse = Pulse( duration=40, amplitude=0.1, @@ -50,13 +55,22 @@ def test_sweeper_errors(): ValueError, match="Cannot create a sweeper without specifying pulses or channels", ): - Sweeper(Parameter.frequency, parameter_range) + Sweeper(parameter=Parameter.frequency, values=parameter_range) with pytest.raises( ValueError, match="Cannot create a sweeper by using both pulses and channels" ): Sweeper( - Parameter.frequency, - parameter_range, + parameter=Parameter.frequency, + values=parameter_range, pulses=[pulse], - channels=["some channel"], + channels=[channel], + ) + with pytest.raises( + ValueError, match="'linspace' and 'values' are mutually exclusive" + ): + Sweeper( + parameter=Parameter.frequency, + values=parameter_range, + linspace=(0, 10, 1), + channels=[channel], ) From 86908510c6aee4abc3ab09940092558973de5c75 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 29 Aug 2024 00:44:12 +0300 Subject: [PATCH 0784/1006] fix: drop positional arguments --- src/qibolab/platform/platform.py | 9 +++++++-- src/qibolab/sweeper.py | 5 +++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 8e9f82d084..de6942b3be 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -235,9 +235,14 @@ def execute( qubit = platform.qubits[0] natives = platform.natives.single_qubit[0] sequence = natives.MZ.create_sequence() - parameter = Parameter.frequency parameter_range = np.random.randint(10, size=10) - sweeper = [Sweeper(parameter, parameter_range, channels=[qubit.probe.name])] + sweeper = [ + Sweeper( + parameter=Parameter.frequency, + values=parameter_range, + channels=[qubit.probe.name], + ) + ] platform.execute([sequence], ExecutionParameters(), [sweeper]) """ if sweepers is None: diff --git a/src/qibolab/sweeper.py b/src/qibolab/sweeper.py index 9736f30caa..5e9989374a 100644 --- a/src/qibolab/sweeper.py +++ b/src/qibolab/sweeper.py @@ -64,9 +64,10 @@ class Sweeper(Model): qubit = platform.qubits[0] natives = platform.natives.single_qubit[0] sequence = natives.MZ.create_sequence() - parameter = Parameter.frequency parameter_range = np.random.randint(10, size=10) - sweeper = Sweeper(parameter, parameter_range, channels=[qubit.probe.name]) + sweeper = Sweeper( + parameter=Parameter.frequency, parameter_range, channels=[qubit.probe.name] + ) platform.execute([sequence], ExecutionParameters(), [[sweeper]]) Args: From 291878515e6e4197b0f8a14137ee68ae2858b331 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 29 Aug 2024 00:46:09 +0300 Subject: [PATCH 0785/1006] chore: drop some sweeper parameters --- src/qibolab/sweeper.py | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/qibolab/sweeper.py b/src/qibolab/sweeper.py index 5e9989374a..14c8a292b6 100644 --- a/src/qibolab/sweeper.py +++ b/src/qibolab/sweeper.py @@ -18,28 +18,12 @@ class Parameter(Enum): duration = auto() duration_interpolated = auto() relative_phase = auto() - - attenuation = auto() - gain = auto() bias = auto() - lo_frequency = auto() - - -FREQUENCY = Parameter.frequency -AMPLITUDE = Parameter.amplitude -DURATION = Parameter.duration -DURATION_INTERPOLATED = Parameter.duration_interpolated -RELATIVE_PHASE = Parameter.relative_phase -ATTENUATION = Parameter.attenuation -GAIN = Parameter.gain -BIAS = Parameter.bias ChannelParameter = { Parameter.frequency, Parameter.bias, - Parameter.attenuation, - Parameter.gain, } From 05f9ca2dbaee10116cde46925a67000e6500f454 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 29 Aug 2024 00:50:09 +0300 Subject: [PATCH 0786/1006] BREAKING CHANGE: rename sweeper parameter bias to offset --- doc/source/main-documentation/qibolab.rst | 5 +---- doc/source/tutorials/lab.rst | 4 ++-- src/qibolab/instruments/qm/program/sweepers.py | 4 ++-- src/qibolab/instruments/zhinst/executor.py | 2 +- src/qibolab/instruments/zhinst/sweep.py | 4 ++-- src/qibolab/sweeper.py | 10 +++------- tests/conftest.py | 2 +- 7 files changed, 12 insertions(+), 19 deletions(-) diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index d4c6f09d31..7db73c3a65 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -16,7 +16,6 @@ In the platform, the main methods can be divided in different sections: - functions save and change qubit parameters (``dump``, ``update``) - functions to coordinate the instruments (``connect``, ``setup``, ``disconnect``) - a unique interface to execute experiments (``execute``) -- setters and getters of channel/qubit parameters (local oscillator parameters, attenuations, gain and biases) The idea of the ``Platform`` is to serve as the only object exposed to the user, so that we can deploy experiments, without any need of going into the low-level instrument-specific code. @@ -360,9 +359,7 @@ Sweeper objects in Qibolab are characterized by a :class:`qibolab.sweeper.Parame -- - Frequency -- Attenuation -- Gain -- Bias +- Offset The first group includes parameters of the pulses, while the second group includes parameters of channels. diff --git a/doc/source/tutorials/lab.rst b/doc/source/tutorials/lab.rst index 8d254c65f1..0c35d5d54c 100644 --- a/doc/source/tutorials/lab.rst +++ b/doc/source/tutorials/lab.rst @@ -314,7 +314,7 @@ a two-qubit system: "frequency": 5800563000 }, "0/flux": { - "bias": 0.0 + "offset": 0.0 }, "0/probe": { "frequency": 7453265000 @@ -431,7 +431,7 @@ we need the following changes to the previous runcard: { "components": { "flux_coupler_01": { - "bias": 0.12 + "offset": 0.12 } }, "native_gates": { diff --git a/src/qibolab/instruments/qm/program/sweepers.py b/src/qibolab/instruments/qm/program/sweepers.py index efaac0401e..91ac3cdc7c 100644 --- a/src/qibolab/instruments/qm/program/sweepers.py +++ b/src/qibolab/instruments/qm/program/sweepers.py @@ -98,7 +98,7 @@ def _relative_phase( args.parameters[operation(pulse)].phase = variable -def _bias( +def _offset( channels: list[Channel], values: npt.NDArray, variable: _Variable, @@ -178,6 +178,6 @@ def normalize_duration(values): Parameter.duration: _duration, Parameter.duration_interpolated: _duration_interpolated, Parameter.relative_phase: _relative_phase, - Parameter.bias: _bias, + Parameter.offset: _offset, } """Methods that return part of QUA program to be used inside the loop.""" diff --git a/src/qibolab/instruments/zhinst/executor.py b/src/qibolab/instruments/zhinst/executor.py index c6e000b3de..ede3c5dcdc 100644 --- a/src/qibolab/instruments/zhinst/executor.py +++ b/src/qibolab/instruments/zhinst/executor.py @@ -353,7 +353,7 @@ def set_instrument_nodes_for_nt_sweep( sweeper ): channel_node_path = self.get_channel_node_path(ch) - if param is Parameter.bias: + if param is Parameter.offset: offset_node_path = f"{channel_node_path}/offset" exp.set_node(path=offset_node_path, value=sweep_param) diff --git a/src/qibolab/instruments/zhinst/sweep.py b/src/qibolab/instruments/zhinst/sweep.py index 892368eee6..ed19ba7969 100644 --- a/src/qibolab/instruments/zhinst/sweep.py +++ b/src/qibolab/instruments/zhinst/sweep.py @@ -20,7 +20,7 @@ def classify_sweepers( can be done in real-time (i.e. on hardware)""" nt_sweepers, rt_sweepers = [], [] for sweeper in sweepers: - if sweeper.parameter is Parameter.bias or ( + if sweeper.parameter is Parameter.offset or ( sweeper.parameter is Parameter.amplitude # FIXME: # and sweeper.pulses[0].type is PulseType.READOUT @@ -80,7 +80,7 @@ def __init__( for ch in sweeper.channels or []: logical_channel = channels[ch].logical_channel - if sweeper.parameter is Parameter.bias: + if sweeper.parameter is Parameter.offset: sweep_param = laboneq.SweepParameter( values=sweeper.values + configs[logical_channel.name].offset ) diff --git a/src/qibolab/sweeper.py b/src/qibolab/sweeper.py index 14c8a292b6..683ca54a5d 100644 --- a/src/qibolab/sweeper.py +++ b/src/qibolab/sweeper.py @@ -18,12 +18,12 @@ class Parameter(Enum): duration = auto() duration_interpolated = auto() relative_phase = auto() - bias = auto() + offset = auto() ChannelParameter = { Parameter.frequency, - Parameter.bias, + Parameter.offset, } @@ -56,13 +56,9 @@ class Sweeper(Model): Args: parameter: parameter to be swept, possible choices are frequency, attenuation, amplitude, current and gain. - values: sweep range. If the parameter of the sweep is a pulse parameter, if the sweeper type is not ABSOLUTE, the base value - will be taken from the runcard pulse parameters. If the sweep parameter is Bias, the base value will be the sweetspot of the qubits. + values: sweep range. pulses : list of `qibolab.pulses.Pulse` to be swept. channels: list of channel names for which the parameter should be swept. - type: can be ABSOLUTE (the sweeper range is swept directly), - FACTOR (sweeper values are multiplied by base value), OFFSET (sweeper values are added - to base value) """ parameter: Parameter diff --git a/tests/conftest.py b/tests/conftest.py index 551bd83f05..1c90202114 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -157,7 +157,7 @@ def wrapped( amp_values = np.arange(0.01, 0.06, 0.01) freq_values = np.arange(-4e6, 4e6, 1e6) sweeper1 = Sweeper( - parameter=Parameter.bias, + parameter=Parameter.offset, values=amp_values, channels=[qubit.flux.name], ) From 9ed5cb47f4857e783a418a9be929dfb3e1bd7474 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 29 Aug 2024 00:54:05 +0300 Subject: [PATCH 0787/1006] fix: rename linspace to range --- src/qibolab/sweeper.py | 16 ++++++++++------ tests/test_sweeper.py | 11 +++++++++-- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/qibolab/sweeper.py b/src/qibolab/sweeper.py index 683ca54a5d..fdbdc5b747 100644 --- a/src/qibolab/sweeper.py +++ b/src/qibolab/sweeper.py @@ -56,14 +56,16 @@ class Sweeper(Model): Args: parameter: parameter to be swept, possible choices are frequency, attenuation, amplitude, current and gain. - values: sweep range. + values: array of parameter values to sweep over. + range: tuple of ``(start, stop, step)`` to sweep over the array ``np.arange(start, stop, step)``. + Can be provided instead of ``values`` for more efficient sweeps on some instruments. pulses : list of `qibolab.pulses.Pulse` to be swept. channels: list of channel names for which the parameter should be swept. """ parameter: Parameter values: Optional[npt.NDArray] = None - linspace: Optional[tuple[float, float, float]] = None + range: Optional[tuple[float, float, float]] = None pulses: Optional[list[Pulse]] = None channels: Optional[list[ChannelId]] = None @@ -85,15 +87,17 @@ def check_values(self): raise ValueError( "Cannot create a sweeper without specifying pulses or channels." ) - if self.linspace is not None and self.values is not None: - raise ValueError("'linspace' and 'values' are mutually exclusive") + if self.range is not None and self.values is not None: + raise ValueError("'range' and 'values' are mutually exclusive.") + if self.range is None and self.values is None: + raise ValueError("Either 'range' or 'values' needs to be provided.") return self @property def values_array(self) -> npt.NDArray: - if self.linspace is not None: - return np.linspace(*self.linspace) + if self.range is not None: + return np.arange(*self.range) return self.values diff --git a/tests/test_sweeper.py b/tests/test_sweeper.py index a3e1229064..f74ca26bb2 100644 --- a/tests/test_sweeper.py +++ b/tests/test_sweeper.py @@ -66,11 +66,18 @@ def test_sweeper_errors(): channels=[channel], ) with pytest.raises( - ValueError, match="'linspace' and 'values' are mutually exclusive" + ValueError, match="'range' and 'values' are mutually exclusive." ): Sweeper( parameter=Parameter.frequency, values=parameter_range, - linspace=(0, 10, 1), + range=(0, 10, 1), + channels=[channel], + ) + with pytest.raises( + ValueError, match="Either 'range' or 'values' needs to be provided." + ): + Sweeper( + parameter=Parameter.frequency, channels=[channel], ) From 6445ad520983597dab1b62a942607d2d84c12770 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 29 Aug 2024 01:00:04 +0300 Subject: [PATCH 0788/1006] docs: change some sweepers to use range instead of values --- doc/source/getting-started/experiment.rst | 4 ++-- doc/source/main-documentation/qibolab.rst | 13 ++++++------- doc/source/tutorials/calibration.rst | 8 ++++---- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/doc/source/getting-started/experiment.rst b/doc/source/getting-started/experiment.rst index 86d4a00b38..fc7c8b5653 100644 --- a/doc/source/getting-started/experiment.rst +++ b/doc/source/getting-started/experiment.rst @@ -224,7 +224,7 @@ We leave to the dedicated tutorial a full explanation of the experiment, but her f0 = platform.config(str(qubit.probe.name)).frequency # center frequency sweeper = Sweeper( parameter=Parameter.frequency, - values=f0 + np.arange(-2e8, +2e8, 1e6), + range=(f0 - 2e8, f0 + 2e8, 1e6), channels=[qubit.probe.name], ) @@ -241,7 +241,7 @@ We leave to the dedicated tutorial a full explanation of the experiment, but her # plot the results amplitudes = magnitude(results[acq.id][0]) - frequencies = sweeper.values + frequencies = sweeper.values_array plt.title("Resonator Spectroscopy") plt.xlabel("Frequencies [Hz]") diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index 7db73c3a65..b72361b553 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -432,15 +432,15 @@ For example: sequence.append((qubit.probe.name, Delay(duration=sequence.duration))) sequence.concatenate(natives.MZ.create_sequence()) + f0 = platform.config(str(qubit.drive.name)).frequency sweeper_freq = Sweeper( parameter=Parameter.frequency, - values=platform.config(str(qubit.drive.name)).frequency - + np.arange(-100_000, +100_000, 10_000), + range=(f0 - 100_000, f0 + 100_000, 10_000), channels=[qubit.drive.name], ) sweeper_amp = Sweeper( parameter=Parameter.amplitude, - values=np.arange(0, 0.43, 0.3), + range=(0, 0.43, 0.3), pulses=[next(iter(sequence.channel(qubit.drive.name)))], ) @@ -550,16 +550,15 @@ The shape of the values of an integreted acquisition with 2 sweepers will be: .. testcode:: python + f0 = platform.config(str(qubit.drive.name)).frequency sweeper1 = Sweeper( parameter=Parameter.frequency, - values=platform.config(str(qubit.drive.name)).frequency - + np.arange(-100_000, +100_000, 1), + range=(f0 - 100_000, f0 + 100_000, 1), channels=[qubit.drive.name], ) sweeper2 = Sweeper( parameter=Parameter.frequency, - values=platform.config(str(qubit.drive.name)).frequency - + np.arange(-200_000, +200_000, 1), + range=(f0 - 200_000, f0 + 200_000, 1), channels=[qubit.probe.name], ) shape = (options.nshots, len(sweeper1.values), len(sweeper2.values)) diff --git a/doc/source/tutorials/calibration.rst b/doc/source/tutorials/calibration.rst index e63452294e..615b86c6cf 100644 --- a/doc/source/tutorials/calibration.rst +++ b/doc/source/tutorials/calibration.rst @@ -50,7 +50,7 @@ around the pre-defined frequency. f0 = platform.config(str(qubit.probe.name)).frequency sweeper = Sweeper( parameter=Parameter.frequency, - values=f0 + np.arange(-2e8, +2e8, 1e6), + range=(f0 - 2e8, f0 + 2e8, 1e6), channels=[qubit.probe.name], ) @@ -75,7 +75,7 @@ In few seconds, the experiment will be finished and we can proceed to plot it. acq = sequence.acquisitions[0][1] amplitudes = magnitude(results[acq.id][0]) - frequencies = sweeper.values + frequencies = sweeper.values_array plt.title("Resonator Spectroscopy") plt.xlabel("Frequencies [Hz]") @@ -144,7 +144,7 @@ complex pulse sequence. Therefore with start with that: f0 = platform.config(str(qubit.probe.name)).frequency sweeper = Sweeper( parameter=Parameter.frequency, - values=f0 + np.arange(-2e8, +2e8, 1e6), + range=(f0 - 2e8, f0 + 2e8, 1e6), channels=[qubit.drive.name], ) @@ -166,7 +166,7 @@ We can now proceed to launch on hardware: _, acq = next(iter(sequence.acquisitions)) amplitudes = magnitude(results[acq.id][0]) - frequencies = sweeper.values + frequencies = sweeper.values_array plt.title("Resonator Spectroscopy") plt.xlabel("Frequencies [Hz]") From 3a6c79c3e643c981f05defc8a9d7c3e49cc98625 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 29 Aug 2024 01:06:06 +0300 Subject: [PATCH 0789/1006] fix: replace values with values_array --- src/qibolab/execution_parameters.py | 3 ++- src/qibolab/instruments/qm/controller.py | 2 +- src/qibolab/instruments/qm/program/instructions.py | 4 ++-- src/qibolab/instruments/zhinst/sweep.py | 11 +++++++---- src/qibolab/platform/platform.py | 2 +- 5 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/qibolab/execution_parameters.py b/src/qibolab/execution_parameters.py index 646c806aa9..7c6432d8e1 100644 --- a/src/qibolab/execution_parameters.py +++ b/src/qibolab/execution_parameters.py @@ -80,7 +80,8 @@ def results_shape( (self.nshots,) if self.averaging_mode is AveragingMode.SINGLESHOT else () ) sweeps = tuple( - min(len(sweep.values) for sweep in parsweeps) for parsweeps in sweepers + min(len(sweep.values_array) for sweep in parsweeps) + for parsweeps in sweepers ) inner = { AcquisitionType.DISCRIMINATION: (), diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 112ace50a9..3f024ae707 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -318,7 +318,7 @@ def register_duration_sweeper_pulses( op = operation(pulse) channel_name = str(args.sequence.pulse_channels(pulse.id)[0]) channel = self.channels[channel_name].logical_channel - for value in sweeper.values: + for value in sweeper.values_array: sweep_pulse = pulse.model_copy(update={"duration": value}) sweep_op = self.register_pulse(channel, sweep_pulse) args.parameters[op].pulses.append((value, sweep_op)) diff --git a/src/qibolab/instruments/qm/program/instructions.py b/src/qibolab/instruments/qm/program/instructions.py index dfab9e2f2a..a44f4425ba 100644 --- a/src/qibolab/instruments/qm/program/instructions.py +++ b/src/qibolab/instruments/qm/program/instructions.py @@ -115,9 +115,9 @@ def _process_sweeper(sweeper: Sweeper): raise NotImplementedError(f"Sweeper for {parameter} is not implemented.") variable = declare(int) if parameter in INT_TYPE else declare(fixed) - values = sweeper.values + values = sweeper.values_array if parameter in NORMALIZERS: - values = NORMALIZERS[parameter](sweeper.values) + values = NORMALIZERS[parameter](values) return variable, values diff --git a/src/qibolab/instruments/zhinst/sweep.py b/src/qibolab/instruments/zhinst/sweep.py index ed19ba7969..b7439e2df6 100644 --- a/src/qibolab/instruments/zhinst/sweep.py +++ b/src/qibolab/instruments/zhinst/sweep.py @@ -71,10 +71,12 @@ def __init__( for pulse in sweeper.pulses or []: if sweeper.parameter is Parameter.duration: sweep_param = laboneq.SweepParameter( - values=sweeper.values * NANO_TO_SECONDS + values=sweeper.values_array * NANO_TO_SECONDS ) else: - sweep_param = laboneq.SweepParameter(values=copy(sweeper.values)) + sweep_param = laboneq.SweepParameter( + values=copy(sweeper.values_array) + ) pulse_sweeps.append((pulse, sweeper.parameter, sweep_param)) parallel_sweeps.append((sweeper, sweep_param)) @@ -82,7 +84,8 @@ def __init__( logical_channel = channels[ch].logical_channel if sweeper.parameter is Parameter.offset: sweep_param = laboneq.SweepParameter( - values=sweeper.values + configs[logical_channel.name].offset + values=sweeper.values_array + + configs[logical_channel.name].offset ) elif sweeper.parameter is Parameter.frequency: intermediate_frequency = ( @@ -90,7 +93,7 @@ def __init__( - configs[logical_channel.lo].frequency ) sweep_param = laboneq.SweepParameter( - values=sweeper.values + intermediate_frequency + values=sweeper.values_array + intermediate_frequency ) else: raise ValueError( diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index de6942b3be..71f61cb169 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -49,7 +49,7 @@ def estimate_duration( (duration + len(sequences) * relaxation) * nshots * NS_TO_SEC - * prod(len(s[0].values) for s in sweepers) + * prod(len(s[0].values_array) for s in sweepers) ) From feeae9ecd111a3a713214111a6d06630375429b5 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 29 Aug 2024 01:09:29 +0300 Subject: [PATCH 0790/1006] fix: doctest --- doc/source/main-documentation/qibolab.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index b72361b553..a68f3f766c 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -561,7 +561,7 @@ The shape of the values of an integreted acquisition with 2 sweepers will be: range=(f0 - 200_000, f0 + 200_000, 1), channels=[qubit.probe.name], ) - shape = (options.nshots, len(sweeper1.values), len(sweeper2.values)) + shape = (options.nshots, len(sweeper1.values_array), len(sweeper2.values_array)) .. _main_doc_compiler: From 1311d892224aaaa0afd9f3ac4946cf243993e49c Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 29 Aug 2024 02:03:30 +0300 Subject: [PATCH 0791/1006] refactor: drop values_array property and assign values instead --- doc/source/getting-started/experiment.rst | 2 +- doc/source/main-documentation/qibolab.rst | 2 +- doc/source/tutorials/calibration.rst | 4 ++-- src/qibolab/execution_parameters.py | 3 +-- src/qibolab/instruments/qm/controller.py | 2 +- src/qibolab/instruments/qm/program/instructions.py | 2 +- src/qibolab/instruments/zhinst/sweep.py | 11 ++++------- src/qibolab/platform/platform.py | 2 +- src/qibolab/sweeper.py | 9 +++------ 9 files changed, 15 insertions(+), 22 deletions(-) diff --git a/doc/source/getting-started/experiment.rst b/doc/source/getting-started/experiment.rst index fc7c8b5653..9370ef710b 100644 --- a/doc/source/getting-started/experiment.rst +++ b/doc/source/getting-started/experiment.rst @@ -241,7 +241,7 @@ We leave to the dedicated tutorial a full explanation of the experiment, but her # plot the results amplitudes = magnitude(results[acq.id][0]) - frequencies = sweeper.values_array + frequencies = sweeper.values plt.title("Resonator Spectroscopy") plt.xlabel("Frequencies [Hz]") diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index a68f3f766c..b72361b553 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -561,7 +561,7 @@ The shape of the values of an integreted acquisition with 2 sweepers will be: range=(f0 - 200_000, f0 + 200_000, 1), channels=[qubit.probe.name], ) - shape = (options.nshots, len(sweeper1.values_array), len(sweeper2.values_array)) + shape = (options.nshots, len(sweeper1.values), len(sweeper2.values)) .. _main_doc_compiler: diff --git a/doc/source/tutorials/calibration.rst b/doc/source/tutorials/calibration.rst index 615b86c6cf..575fff15b0 100644 --- a/doc/source/tutorials/calibration.rst +++ b/doc/source/tutorials/calibration.rst @@ -75,7 +75,7 @@ In few seconds, the experiment will be finished and we can proceed to plot it. acq = sequence.acquisitions[0][1] amplitudes = magnitude(results[acq.id][0]) - frequencies = sweeper.values_array + frequencies = sweeper.values plt.title("Resonator Spectroscopy") plt.xlabel("Frequencies [Hz]") @@ -166,7 +166,7 @@ We can now proceed to launch on hardware: _, acq = next(iter(sequence.acquisitions)) amplitudes = magnitude(results[acq.id][0]) - frequencies = sweeper.values_array + frequencies = sweeper.values plt.title("Resonator Spectroscopy") plt.xlabel("Frequencies [Hz]") diff --git a/src/qibolab/execution_parameters.py b/src/qibolab/execution_parameters.py index 7c6432d8e1..646c806aa9 100644 --- a/src/qibolab/execution_parameters.py +++ b/src/qibolab/execution_parameters.py @@ -80,8 +80,7 @@ def results_shape( (self.nshots,) if self.averaging_mode is AveragingMode.SINGLESHOT else () ) sweeps = tuple( - min(len(sweep.values_array) for sweep in parsweeps) - for parsweeps in sweepers + min(len(sweep.values) for sweep in parsweeps) for parsweeps in sweepers ) inner = { AcquisitionType.DISCRIMINATION: (), diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 3f024ae707..112ace50a9 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -318,7 +318,7 @@ def register_duration_sweeper_pulses( op = operation(pulse) channel_name = str(args.sequence.pulse_channels(pulse.id)[0]) channel = self.channels[channel_name].logical_channel - for value in sweeper.values_array: + for value in sweeper.values: sweep_pulse = pulse.model_copy(update={"duration": value}) sweep_op = self.register_pulse(channel, sweep_pulse) args.parameters[op].pulses.append((value, sweep_op)) diff --git a/src/qibolab/instruments/qm/program/instructions.py b/src/qibolab/instruments/qm/program/instructions.py index a44f4425ba..115294dfeb 100644 --- a/src/qibolab/instruments/qm/program/instructions.py +++ b/src/qibolab/instruments/qm/program/instructions.py @@ -115,7 +115,7 @@ def _process_sweeper(sweeper: Sweeper): raise NotImplementedError(f"Sweeper for {parameter} is not implemented.") variable = declare(int) if parameter in INT_TYPE else declare(fixed) - values = sweeper.values_array + values = sweeper.values if parameter in NORMALIZERS: values = NORMALIZERS[parameter](values) diff --git a/src/qibolab/instruments/zhinst/sweep.py b/src/qibolab/instruments/zhinst/sweep.py index b7439e2df6..ed19ba7969 100644 --- a/src/qibolab/instruments/zhinst/sweep.py +++ b/src/qibolab/instruments/zhinst/sweep.py @@ -71,12 +71,10 @@ def __init__( for pulse in sweeper.pulses or []: if sweeper.parameter is Parameter.duration: sweep_param = laboneq.SweepParameter( - values=sweeper.values_array * NANO_TO_SECONDS + values=sweeper.values * NANO_TO_SECONDS ) else: - sweep_param = laboneq.SweepParameter( - values=copy(sweeper.values_array) - ) + sweep_param = laboneq.SweepParameter(values=copy(sweeper.values)) pulse_sweeps.append((pulse, sweeper.parameter, sweep_param)) parallel_sweeps.append((sweeper, sweep_param)) @@ -84,8 +82,7 @@ def __init__( logical_channel = channels[ch].logical_channel if sweeper.parameter is Parameter.offset: sweep_param = laboneq.SweepParameter( - values=sweeper.values_array - + configs[logical_channel.name].offset + values=sweeper.values + configs[logical_channel.name].offset ) elif sweeper.parameter is Parameter.frequency: intermediate_frequency = ( @@ -93,7 +90,7 @@ def __init__( - configs[logical_channel.lo].frequency ) sweep_param = laboneq.SweepParameter( - values=sweeper.values_array + intermediate_frequency + values=sweeper.values + intermediate_frequency ) else: raise ValueError( diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 71f61cb169..de6942b3be 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -49,7 +49,7 @@ def estimate_duration( (duration + len(sequences) * relaxation) * nshots * NS_TO_SEC - * prod(len(s[0].values_array) for s in sweepers) + * prod(len(s[0].values) for s in sweepers) ) diff --git a/src/qibolab/sweeper.py b/src/qibolab/sweeper.py index fdbdc5b747..66bde6b45c 100644 --- a/src/qibolab/sweeper.py +++ b/src/qibolab/sweeper.py @@ -92,13 +92,10 @@ def check_values(self): if self.range is None and self.values is None: raise ValueError("Either 'range' or 'values' needs to be provided.") - return self - - @property - def values_array(self) -> npt.NDArray: if self.range is not None: - return np.arange(*self.range) - return self.values + self.values = np.arange(*range) + + return self ParallelSweepers = list[Sweeper] From b39d43e7c46f00b925e1004d263a68494ebfb7c8 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 29 Aug 2024 02:11:02 +0300 Subject: [PATCH 0792/1006] fix: use self.range (typo) --- src/qibolab/sweeper.py | 7 ++++--- tests/conftest.py | 3 +-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/qibolab/sweeper.py b/src/qibolab/sweeper.py index 66bde6b45c..b22c4116e7 100644 --- a/src/qibolab/sweeper.py +++ b/src/qibolab/sweeper.py @@ -92,11 +92,12 @@ def check_values(self): if self.range is None and self.values is None: raise ValueError("Either 'range' or 'values' needs to be provided.") - if self.range is not None: - self.values = np.arange(*range) - return self + def model_post_init(self, __context): + if self.range is not None: + self.values = np.arange(*self.range) + ParallelSweepers = list[Sweeper] """Sweepers that should be iterated in parallel.""" diff --git a/tests/conftest.py b/tests/conftest.py index 1c90202114..71a85d8b99 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -154,11 +154,10 @@ def wrapped( sequence.concatenate(qd_seq) sequence.concatenate(probe_seq) if sweepers is None: - amp_values = np.arange(0.01, 0.06, 0.01) freq_values = np.arange(-4e6, 4e6, 1e6) sweeper1 = Sweeper( parameter=Parameter.offset, - values=amp_values, + range=(0.01, 0.06, 0.01), channels=[qubit.flux.name], ) sweeper2 = Sweeper( From f314487a4709af2698e955c188eb9f88b39601e0 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 29 Aug 2024 10:15:44 +0200 Subject: [PATCH 0793/1006] fix: Load values from range in sweepers --- src/qibolab/sweeper.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/qibolab/sweeper.py b/src/qibolab/sweeper.py index b22c4116e7..a72e208a17 100644 --- a/src/qibolab/sweeper.py +++ b/src/qibolab/sweeper.py @@ -92,11 +92,10 @@ def check_values(self): if self.range is None and self.values is None: raise ValueError("Either 'range' or 'values' needs to be provided.") - return self - - def model_post_init(self, __context): if self.range is not None: - self.values = np.arange(*self.range) + object.__setattr__(self, "values", np.arange(*self.range)) + + return self ParallelSweepers = list[Sweeper] From 916ba02f41d579aab791a619bd5a5383ab835ed0 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 29 Aug 2024 10:47:49 +0200 Subject: [PATCH 0794/1006] docs: Enforce keyword arguments in the sweeper constructor --- src/qibolab/sweeper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibolab/sweeper.py b/src/qibolab/sweeper.py index a72e208a17..993b130311 100644 --- a/src/qibolab/sweeper.py +++ b/src/qibolab/sweeper.py @@ -50,7 +50,7 @@ class Sweeper(Model): sequence = natives.MZ.create_sequence() parameter_range = np.random.randint(10, size=10) sweeper = Sweeper( - parameter=Parameter.frequency, parameter_range, channels=[qubit.probe.name] + parameter=Parameter.frequency, values=parameter_range, channels=[qubit.probe.name] ) platform.execute([sequence], ExecutionParameters(), [[sweeper]]) From 759e065d58c65f6ef3d542565f5f4d7ea0e8e76a Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 30 Aug 2024 13:05:46 +0200 Subject: [PATCH 0795/1006] fix: Simplify sweeper validation --- src/qibolab/sweeper.py | 26 +++++++++++++------------- tests/test_sweeper.py | 25 ++++++------------------- 2 files changed, 19 insertions(+), 32 deletions(-) diff --git a/src/qibolab/sweeper.py b/src/qibolab/sweeper.py index 993b130311..504d730c59 100644 --- a/src/qibolab/sweeper.py +++ b/src/qibolab/sweeper.py @@ -1,5 +1,5 @@ from enum import Enum, auto -from typing import Optional +from typing import Any, Optional import numpy as np import numpy.typing as npt @@ -26,6 +26,15 @@ class Parameter(Enum): Parameter.offset, } +_Field = tuple[Any, str] + + +def _alternative_fields(a: _Field, b: _Field): + if (a[0] is None) == (b[0] is None): + raise ValueError( + f"Either '{a[1]}' or '{b[1]}' needs to be provided, and only one of them." + ) + class Sweeper(Model): """Data structure for Sweeper object. @@ -71,10 +80,9 @@ class Sweeper(Model): @model_validator(mode="after") def check_values(self): - if self.pulses is not None and self.channels is not None: - raise ValueError( - "Cannot create a sweeper by using both pulses and channels." - ) + _alternative_fields((self.pulses, "pulses"), (self.channels, "channels")) + _alternative_fields((self.range, "range"), (self.values, "values")) + if self.pulses is not None and self.parameter in ChannelParameter: raise ValueError( f"Cannot create a sweeper for {self.parameter} without specifying channels." @@ -83,14 +91,6 @@ def check_values(self): raise ValueError( f"Cannot create a sweeper for {self.parameter} without specifying pulses." ) - if self.pulses is None and self.channels is None: - raise ValueError( - "Cannot create a sweeper without specifying pulses or channels." - ) - if self.range is not None and self.values is not None: - raise ValueError("'range' and 'values' are mutually exclusive.") - if self.range is None and self.values is None: - raise ValueError("Either 'range' or 'values' needs to be provided.") if self.range is not None: object.__setattr__(self, "values", np.arange(*self.range)) diff --git a/tests/test_sweeper.py b/tests/test_sweeper.py index f74ca26bb2..8ddde478c0 100644 --- a/tests/test_sweeper.py +++ b/tests/test_sweeper.py @@ -18,9 +18,7 @@ def test_sweeper_pulses(parameter): else: parameter_range = np.random.randint(10, size=10) if parameter in ChannelParameter: - with pytest.raises( - ValueError, match="Cannot create a sweeper .* without specifying channels" - ): + with pytest.raises(ValueError, match="channels"): _ = Sweeper(parameter=parameter, values=parameter_range, pulses=[pulse]) else: sweeper = Sweeper(parameter=parameter, values=parameter_range, pulses=[pulse]) @@ -37,9 +35,7 @@ def test_sweeper_channels(parameter): ) assert sweeper.parameter is parameter else: - with pytest.raises( - ValueError, match="Cannot create a sweeper .* without specifying pulses" - ): + with pytest.raises(ValueError, match="pulses"): _ = Sweeper(parameter=parameter, values=parameter_range, channels=[channel]) @@ -51,32 +47,23 @@ def test_sweeper_errors(): envelope=Rectangular(), ) parameter_range = np.random.randint(10, size=10) - with pytest.raises( - ValueError, - match="Cannot create a sweeper without specifying pulses or channels", - ): + with pytest.raises(ValueError, match="(?=.*pulses)(?=.*channels)"): Sweeper(parameter=Parameter.frequency, values=parameter_range) - with pytest.raises( - ValueError, match="Cannot create a sweeper by using both pulses and channels" - ): + with pytest.raises(ValueError, match="(?=.*pulses)(?=.*channels)"): Sweeper( parameter=Parameter.frequency, values=parameter_range, pulses=[pulse], channels=[channel], ) - with pytest.raises( - ValueError, match="'range' and 'values' are mutually exclusive." - ): + with pytest.raises(ValueError, match="(?=.*range)(?=.*values)"): Sweeper( parameter=Parameter.frequency, values=parameter_range, range=(0, 10, 1), channels=[channel], ) - with pytest.raises( - ValueError, match="Either 'range' or 'values' needs to be provided." - ): + with pytest.raises(ValueError, match="(?=.*range)(?=.*values)"): Sweeper( parameter=Parameter.frequency, channels=[channel], From b265583dbc5952cca5519524f836e29c964b2fb4 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 30 Aug 2024 13:27:30 +0200 Subject: [PATCH 0796/1006] fix: Replace channel parameters identification --- src/qibolab/sweeper.py | 28 ++++++++++++++++------------ tests/test_sweeper.py | 6 +++--- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/qibolab/sweeper.py b/src/qibolab/sweeper.py index 504d730c59..0a85d1efe6 100644 --- a/src/qibolab/sweeper.py +++ b/src/qibolab/sweeper.py @@ -10,21 +10,25 @@ from .serialize import Model +_PULSE = "pulse" +_CHANNEL = "channel" + + class Parameter(Enum): """Sweeping parameters.""" - frequency = auto() - amplitude = auto() - duration = auto() - duration_interpolated = auto() - relative_phase = auto() - offset = auto() + frequency = (auto(), _CHANNEL) + amplitude = (auto(), _PULSE) + duration = (auto(), _PULSE) + duration_interpolated = (auto(), _PULSE) + relative_phase = (auto(), _PULSE) + offset = (auto(), _CHANNEL) + @classmethod + def channels(cls) -> set["Parameter"]: + """Set of parameters to be swept on the channel.""" + return set(p for p in cls if p.value[1] == _CHANNEL) -ChannelParameter = { - Parameter.frequency, - Parameter.offset, -} _Field = tuple[Any, str] @@ -83,11 +87,11 @@ def check_values(self): _alternative_fields((self.pulses, "pulses"), (self.channels, "channels")) _alternative_fields((self.range, "range"), (self.values, "values")) - if self.pulses is not None and self.parameter in ChannelParameter: + if self.pulses is not None and self.parameter in Parameter.channels(): raise ValueError( f"Cannot create a sweeper for {self.parameter} without specifying channels." ) - if self.parameter not in ChannelParameter and (self.channels is not None): + if self.parameter not in Parameter.channels() and (self.channels is not None): raise ValueError( f"Cannot create a sweeper for {self.parameter} without specifying pulses." ) diff --git a/tests/test_sweeper.py b/tests/test_sweeper.py index 8ddde478c0..db22ab32fa 100644 --- a/tests/test_sweeper.py +++ b/tests/test_sweeper.py @@ -3,7 +3,7 @@ from qibolab.identifier import ChannelId from qibolab.pulses import Pulse, Rectangular -from qibolab.sweeper import ChannelParameter, Parameter, Sweeper +from qibolab.sweeper import Parameter, Sweeper @pytest.mark.parametrize("parameter", Parameter) @@ -17,7 +17,7 @@ def test_sweeper_pulses(parameter): parameter_range = np.random.rand(10) else: parameter_range = np.random.randint(10, size=10) - if parameter in ChannelParameter: + if parameter in Parameter.channels(): with pytest.raises(ValueError, match="channels"): _ = Sweeper(parameter=parameter, values=parameter_range, pulses=[pulse]) else: @@ -29,7 +29,7 @@ def test_sweeper_pulses(parameter): def test_sweeper_channels(parameter): channel = ChannelId.load("0/probe") parameter_range = np.random.randint(10, size=10) - if parameter in ChannelParameter: + if parameter in Parameter.channels(): sweeper = Sweeper( parameter=parameter, values=parameter_range, channels=[channel] ) From adbcb38b5ed6ceb8a72d42c2eb0291d8e7c48be7 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 30 Aug 2024 13:29:56 +0200 Subject: [PATCH 0797/1006] fix: Introduce memoizing, to make new channels identification fully equivalent to the previous --- src/qibolab/sweeper.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/qibolab/sweeper.py b/src/qibolab/sweeper.py index 0a85d1efe6..affb5a4e76 100644 --- a/src/qibolab/sweeper.py +++ b/src/qibolab/sweeper.py @@ -1,4 +1,5 @@ from enum import Enum, auto +from functools import cache from typing import Any, Optional import numpy as np @@ -9,7 +10,6 @@ from .pulses import Pulse from .serialize import Model - _PULSE = "pulse" _CHANNEL = "channel" @@ -25,9 +25,10 @@ class Parameter(Enum): offset = (auto(), _CHANNEL) @classmethod + @cache def channels(cls) -> set["Parameter"]: """Set of parameters to be swept on the channel.""" - return set(p for p in cls if p.value[1] == _CHANNEL) + return {p for p in cls if p.value[1] == _CHANNEL} _Field = tuple[Any, str] From a9b70bc5405b6868693f09b0ee66fdb4fe42792c Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 29 Aug 2024 17:11:46 +0300 Subject: [PATCH 0798/1006] fix: make frequency and offset sweepers absolute --- .../instruments/qm/program/sweepers.py | 22 +++++++------------ 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/qibolab/instruments/qm/program/sweepers.py b/src/qibolab/instruments/qm/program/sweepers.py index 91ac3cdc7c..9b0f345c1a 100644 --- a/src/qibolab/instruments/qm/program/sweepers.py +++ b/src/qibolab/instruments/qm/program/sweepers.py @@ -1,11 +1,9 @@ -import math from typing import Optional import numpy as np import numpy.typing as npt from qibo.config import raise_error from qm import qua -from qm.qua import declare, fixed from qm.qua._dsl import _Variable # for type declaration only from qibolab.components import Channel, Config @@ -56,16 +54,14 @@ def _frequency( for channel in channels: name = str(channel.name) lo_frequency = configs[channel.lo].frequency - # convert to IF frequency for readout and drive pulses - f0 = math.floor(configs[name].frequency - lo_frequency) # check if sweep is within the supported bandwidth [-400, 400] MHz - max_freq = maximum_sweep_value(values, f0) + max_freq = maximum_sweep_value(values, -lo_frequency) if max_freq > 4e8: raise_error( ValueError, f"Frequency {max_freq} for channel {name} is beyond instrument bandwidth.", ) - qua.update_frequency(name, variable + f0) + qua.update_frequency(name, variable - lo_frequency) def _amplitude( @@ -107,16 +103,14 @@ def _offset( ): for channel in channels: name = str(channel.name) - offset = configs[name].offset - max_value = maximum_sweep_value(values, offset) + max_value = maximum_sweep_value(values, 0) check_max_offset(max_value, MAX_OFFSET) - b0 = declare(fixed, value=offset) - with qua.if_((variable + b0) >= 0.49): - qua.set_dc_offset(f"flux{name}", "single", 0.49) - with qua.elif_((variable + b0) <= -0.49): - qua.set_dc_offset(f"flux{name}", "single", -0.49) + with qua.if_(variable >= MAX_OFFSET): + qua.set_dc_offset(name, "single", MAX_OFFSET) + with qua.elif_(variable <= -MAX_OFFSET): + qua.set_dc_offset(name, "single", -MAX_OFFSET) with qua.else_(): - qua.set_dc_offset(f"flux{name}", "single", (variable + b0)) + qua.set_dc_offset(name, "single", variable) def _duration( From b79e0f0a8f75600ca89d9e6c3f60d68eb31d964d Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 29 Aug 2024 17:12:59 +0300 Subject: [PATCH 0799/1006] chore: drop check_max_offset --- src/qibolab/instruments/qm/program/sweepers.py | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/qibolab/instruments/qm/program/sweepers.py b/src/qibolab/instruments/qm/program/sweepers.py index 9b0f345c1a..3961281664 100644 --- a/src/qibolab/instruments/qm/program/sweepers.py +++ b/src/qibolab/instruments/qm/program/sweepers.py @@ -1,5 +1,3 @@ -from typing import Optional - import numpy as np import numpy.typing as npt from qibo.config import raise_error @@ -32,18 +30,6 @@ def maximum_sweep_value(values: npt.NDArray, value0: npt.NDArray) -> float: return max(abs(min(values) + value0), abs(max(values) + value0)) -def check_max_offset(offset: Optional[float], max_offset: float = MAX_OFFSET): - """Checks if a given offset value exceeds the maximum supported offset. - - This is to avoid sending high currents that could damage lab - equipment such as amplifiers. - """ - if max_offset is not None and abs(offset) > max_offset: - raise_error( - ValueError, f"{offset} exceeds the maximum allowed offset {max_offset}." - ) - - def _frequency( channels: list[Channel], values: npt.NDArray, @@ -104,7 +90,6 @@ def _offset( for channel in channels: name = str(channel.name) max_value = maximum_sweep_value(values, 0) - check_max_offset(max_value, MAX_OFFSET) with qua.if_(variable >= MAX_OFFSET): qua.set_dc_offset(name, "single", MAX_OFFSET) with qua.elif_(variable <= -MAX_OFFSET): From 284072a52f3474b0ed058b01d503aeef30cdeb92 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 29 Aug 2024 17:14:58 +0300 Subject: [PATCH 0800/1006] fix: drop max value calculation method --- src/qibolab/instruments/qm/program/sweepers.py | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/src/qibolab/instruments/qm/program/sweepers.py b/src/qibolab/instruments/qm/program/sweepers.py index 3961281664..f7d21afdd5 100644 --- a/src/qibolab/instruments/qm/program/sweepers.py +++ b/src/qibolab/instruments/qm/program/sweepers.py @@ -15,21 +15,6 @@ """Maximum voltage supported by Quantum Machines OPX+ instrument in volts.""" -def maximum_sweep_value(values: npt.NDArray, value0: npt.NDArray) -> float: - """Calculates maximum value that is reached during a sweep. - - Useful to check whether a sweep exceeds the range of allowed values. - Note that both the array of values we sweep and the center value can - be negative, so we need to make sure that the maximum absolute value - is within range. - - Args: - values (np.ndarray): Array of values we will sweep over. - value0 (float, int): Center value of the sweep. - """ - return max(abs(min(values) + value0), abs(max(values) + value0)) - - def _frequency( channels: list[Channel], values: npt.NDArray, @@ -41,7 +26,7 @@ def _frequency( name = str(channel.name) lo_frequency = configs[channel.lo].frequency # check if sweep is within the supported bandwidth [-400, 400] MHz - max_freq = maximum_sweep_value(values, -lo_frequency) + max_freq = np.max(np.abs(values - lo_frequency)) if max_freq > 4e8: raise_error( ValueError, @@ -89,7 +74,6 @@ def _offset( ): for channel in channels: name = str(channel.name) - max_value = maximum_sweep_value(values, 0) with qua.if_(variable >= MAX_OFFSET): qua.set_dc_offset(name, "single", MAX_OFFSET) with qua.elif_(variable <= -MAX_OFFSET): From e4a8c10ea661a5b09fcfc221c7042f0eca2b5b84 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 29 Aug 2024 19:26:48 +0300 Subject: [PATCH 0801/1006] fix: make amplitude sweeper absolute --- src/qibolab/instruments/qm/controller.py | 41 ++++++++++++++++--- .../instruments/qm/program/arguments.py | 5 ++- .../instruments/qm/program/instructions.py | 2 +- .../instruments/qm/program/sweepers.py | 35 +++++++++++----- src/qibolab/sweeper.py | 7 +++- tests/conftest.py | 4 +- tests/test_sweeper.py | 8 ++++ 7 files changed, 80 insertions(+), 22 deletions(-) diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 112ace50a9..1d0345963c 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -23,6 +23,7 @@ from .components import QmChannel from .config import SAMPLING_RATE, QmConfig, operation from .program import ExecutionArguments, create_acquisition, program +from .program.sweepers import sweeper_amplitude OCTAVE_ADDRESS_OFFSET = 11000 """Offset to be added to Octave addresses, because they must be 11xxx, where @@ -95,9 +96,15 @@ def fetch_results(result, acquisitions): } -def find_duration_sweepers(sweepers: list[ParallelSweepers]) -> list[Sweeper]: - """Find duration sweepers in order to register multiple pulses.""" - return [s for ps in sweepers for s in ps if s.parameter is Parameter.duration] +def find_sweepers( + sweepers: list[ParallelSweepers], parameter: Parameter +) -> list[Sweeper]: + """Find sweepers of given parameter in order to register specific pulses. + + Duration and amplitude sweepers may require registering additional pulses + in the QM ``config``. + """ + return [s for ps in sweepers for s in ps if s.parameter is parameter] @dataclass @@ -309,8 +316,10 @@ def register_pulses(self, configs: dict[str, Config], sequence: PulseSequence): def register_duration_sweeper_pulses( self, args: ExecutionArguments, sweeper: Sweeper ): - """Register pulse with many different durations, in order to sweep - duration.""" + """Register pulse with many different durations. + + Needed when sweeping duration. + """ for pulse in sweeper.pulses: if isinstance(pulse, (Align, Delay)): continue @@ -323,6 +332,24 @@ def register_duration_sweeper_pulses( sweep_op = self.register_pulse(channel, sweep_pulse) args.parameters[op].pulses.append((value, sweep_op)) + def register_amplitude_sweeper_pulses( + self, args: ExecutionArguments, sweeper: Sweeper + ): + """Register pulse with different amplitude. + + Needed when sweeping amplitude and the original amplitude is not + sufficient to reach all the sweeper values. + """ + new_op = None + amplitude = sweeper_amplitude(sweeper.values) + for pulse in sweeper.pulses: + new_pulse = pulse.model_copy(update={"amplitude": amplitude}) + channel_ids = args.sequence.pulse_channels(pulse.id) + channel = self.channels[str(channel_ids[0])].logical_channel + args.parameters[operation(pulse)].amplitude_pulse = self.register_pulse( + channel, new_pulse + ) + def register_acquisitions( self, configs: dict[str, Config], @@ -410,8 +437,10 @@ def play( args = ExecutionArguments(sequence, acquisitions, options.relaxation_time) - for sweeper in find_duration_sweepers(sweepers): + for sweeper in find_sweepers(sweepers, Parameter.duration): self.register_duration_sweeper_pulses(args, sweeper) + for sweeper in find_sweepers(sweepers, Parameter.amplitude): + self.register_amplitude_sweeper_pulses(args, sweeper) experiment = program(configs, args, options, sweepers) diff --git a/src/qibolab/instruments/qm/program/arguments.py b/src/qibolab/instruments/qm/program/arguments.py index 571e1a3cca..b02de5a461 100644 --- a/src/qibolab/instruments/qm/program/arguments.py +++ b/src/qibolab/instruments/qm/program/arguments.py @@ -13,9 +13,12 @@ class Parameters: """Container of swept QUA variables.""" - duration: Optional[_Variable] = None amplitude: Optional[_Variable] = None + amplitude_pulse: Optional[str] = None + phase: Optional[_Variable] = None + + duration: Optional[_Variable] = None pulses: list[tuple[float, str]] = field(default_factory=list) interpolated: bool = False diff --git a/src/qibolab/instruments/qm/program/instructions.py b/src/qibolab/instruments/qm/program/instructions.py index 115294dfeb..e09f9de807 100644 --- a/src/qibolab/instruments/qm/program/instructions.py +++ b/src/qibolab/instruments/qm/program/instructions.py @@ -49,7 +49,7 @@ def _play_single_waveform( acquisition: Optional[Acquisition] = None, ): if parameters.amplitude is not None: - op = op * parameters.amplitude + op = parameters.amplitude_pulse * parameters.amplitude if acquisition is not None: acquisition.measure(op) else: diff --git a/src/qibolab/instruments/qm/program/sweepers.py b/src/qibolab/instruments/qm/program/sweepers.py index f7d21afdd5..b897e63af9 100644 --- a/src/qibolab/instruments/qm/program/sweepers.py +++ b/src/qibolab/instruments/qm/program/sweepers.py @@ -13,6 +13,11 @@ MAX_OFFSET = 0.5 """Maximum voltage supported by Quantum Machines OPX+ instrument in volts.""" +MAX_AMPLITUDE_FACTOR = 1.99 +"""Maximum multiplication factor for ``qua.amp`` used when sweeping amplitude. + +https://docs.quantum-machines.co/1.2.0/docs/API_references/qua/dsl_main/#qm.qua._dsl.amp +""" def _frequency( @@ -42,14 +47,6 @@ def _amplitude( configs: dict[str, Config], args: ExecutionArguments, ): - # TODO: Consider sweeping amplitude without multiplication - if min(values) < -2: - raise_error( - ValueError, "Amplitude sweep values are <-2 which is not supported." - ) - if max(values) > 2: - raise_error(ValueError, "Amplitude sweep values are >2 which is not supported.") - for pulse in pulses: args.parameters[operation(pulse)].amplitude = qua.amp(variable) @@ -106,12 +103,29 @@ def _duration_interpolated( params.interpolated = True -def normalize_phase(values): +def sweeper_amplitude(values: npt.NDArray) -> float: + """Pulse amplitude to be registered in the QM ``config`` when sweeping + amplitude. + + The multiplicative factor used in the ``qua.amp`` command is limited, so we + may need to register a pulse with different amplitude than the original pulse + in the sequence, in order to reach all sweeper values when sweeping amplitude. + """ + return max(abs(values)) / MAX_AMPLITUDE_FACTOR + + +def normalize_amplitude(values: npt.NDArray) -> npt.NDArray: + """Normalize amplitude factor to [-MAX_AMPLITUDE_FACTOR, + MAX_AMPLITUDE_FACTOR].""" + return values / sweeper_amplitude(values) + + +def normalize_phase(values: npt.NDArray) -> npt.NDArray: """Normalize phase from [0, 2pi] to [0, 1].""" return values / (2 * np.pi) -def normalize_duration(values): +def normalize_duration(values: npt.NDArray) -> npt.NDArray: """Convert duration from ns to clock cycles (clock cycle = 4ns).""" if any(values < 16) and not all(values % 4 == 0): raise ValueError( @@ -127,6 +141,7 @@ def normalize_duration(values): """ NORMALIZERS = { + Parameter.amplitude: normalize_amplitude, Parameter.relative_phase: normalize_phase, Parameter.duration_interpolated: normalize_duration, } diff --git a/src/qibolab/sweeper.py b/src/qibolab/sweeper.py index affb5a4e76..37c1a48de3 100644 --- a/src/qibolab/sweeper.py +++ b/src/qibolab/sweeper.py @@ -7,7 +7,7 @@ from pydantic import model_validator from .identifier import ChannelId -from .pulses import Pulse +from .pulses import PulseLike from .serialize import Model _PULSE = "pulse" @@ -80,7 +80,7 @@ class Sweeper(Model): parameter: Parameter values: Optional[npt.NDArray] = None range: Optional[tuple[float, float, float]] = None - pulses: Optional[list[Pulse]] = None + pulses: Optional[list[PulseLike]] = None channels: Optional[list[ChannelId]] = None @model_validator(mode="after") @@ -100,6 +100,9 @@ def check_values(self): if self.range is not None: object.__setattr__(self, "values", np.arange(*self.range)) + if self.parameter is Parameter.amplitude and max(abs(self.values)) > 1: + raise ValueError("Amplitude sweeper cannot have values larger than 1.") + return self diff --git a/tests/conftest.py b/tests/conftest.py index 71a85d8b99..d79f287944 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -154,7 +154,7 @@ def wrapped( sequence.concatenate(qd_seq) sequence.concatenate(probe_seq) if sweepers is None: - freq_values = np.arange(-4e6, 4e6, 1e6) + amp_values = np.arange(0, 0.8, 0.1) sweeper1 = Sweeper( parameter=Parameter.offset, range=(0.01, 0.06, 0.01), @@ -162,7 +162,7 @@ def wrapped( ) sweeper2 = Sweeper( parameter=Parameter.amplitude, - values=freq_values, + values=amp_values, pulses=[probe_pulse], ) sweepers = [[sweeper1], [sweeper2]] diff --git a/tests/test_sweeper.py b/tests/test_sweeper.py index db22ab32fa..275a29ffda 100644 --- a/tests/test_sweeper.py +++ b/tests/test_sweeper.py @@ -68,3 +68,11 @@ def test_sweeper_errors(): parameter=Parameter.frequency, channels=[channel], ) + with pytest.raises( + ValueError, match="Amplitude sweeper cannot have values larger than 1." + ): + Sweeper( + parameter=Parameter.amplitude, + range=(0, 2, 0.2), + pulses=[pulse], + ) From 7c74f9a6f356093ae53784fe0fbb668473ffef4b Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 30 Aug 2024 11:27:44 +0300 Subject: [PATCH 0802/1006] fix: amplitude sweeper nested in multi-waveform duration sweeper --- src/qibolab/instruments/qm/controller.py | 26 +++++++++++-------- .../instruments/qm/program/arguments.py | 6 +++-- .../instruments/qm/program/instructions.py | 6 ++--- 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 1d0345963c..a4640304fb 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -324,13 +324,16 @@ def register_duration_sweeper_pulses( if isinstance(pulse, (Align, Delay)): continue - op = operation(pulse) - channel_name = str(args.sequence.pulse_channels(pulse.id)[0]) - channel = self.channels[channel_name].logical_channel + params = args.parameters[operation(pulse)] + channel_ids = args.sequence.pulse_channels(pulse.id) + channel = self.channels[str(channel_ids[0])].logical_channel + original_pulse = ( + pulse if params.amplitude_pulse is None else params.amplitude_pulse + ) for value in sweeper.values: - sweep_pulse = pulse.model_copy(update={"duration": value}) + sweep_pulse = original_pulse.model_copy(update={"duration": value}) sweep_op = self.register_pulse(channel, sweep_pulse) - args.parameters[op].pulses.append((value, sweep_op)) + params.duration_ops.append((value, sweep_op)) def register_amplitude_sweeper_pulses( self, args: ExecutionArguments, sweeper: Sweeper @@ -343,12 +346,13 @@ def register_amplitude_sweeper_pulses( new_op = None amplitude = sweeper_amplitude(sweeper.values) for pulse in sweeper.pulses: - new_pulse = pulse.model_copy(update={"amplitude": amplitude}) channel_ids = args.sequence.pulse_channels(pulse.id) channel = self.channels[str(channel_ids[0])].logical_channel - args.parameters[operation(pulse)].amplitude_pulse = self.register_pulse( - channel, new_pulse - ) + sweep_pulse = pulse.model_copy(update={"amplitude": amplitude}) + + params = args.parameters[operation(pulse)] + params.amplitude_pulse = sweep_pulse + params.amplitude_op = self.register_pulse(channel, sweep_pulse) def register_acquisitions( self, @@ -437,10 +441,10 @@ def play( args = ExecutionArguments(sequence, acquisitions, options.relaxation_time) - for sweeper in find_sweepers(sweepers, Parameter.duration): - self.register_duration_sweeper_pulses(args, sweeper) for sweeper in find_sweepers(sweepers, Parameter.amplitude): self.register_amplitude_sweeper_pulses(args, sweeper) + for sweeper in find_sweepers(sweepers, Parameter.duration): + self.register_duration_sweeper_pulses(args, sweeper) experiment = program(configs, args, options, sweepers) diff --git a/src/qibolab/instruments/qm/program/arguments.py b/src/qibolab/instruments/qm/program/arguments.py index b02de5a461..eaf7cd270e 100644 --- a/src/qibolab/instruments/qm/program/arguments.py +++ b/src/qibolab/instruments/qm/program/arguments.py @@ -4,6 +4,7 @@ from qm.qua._dsl import _Variable # for type declaration only +from qibolab.pulses import Pulse from qibolab.sequence import PulseSequence from .acquisition import Acquisitions @@ -14,12 +15,13 @@ class Parameters: """Container of swept QUA variables.""" amplitude: Optional[_Variable] = None - amplitude_pulse: Optional[str] = None + amplitude_pulse: Optional[Pulse] = None + amplitude_op: Optional[str] = None phase: Optional[_Variable] = None duration: Optional[_Variable] = None - pulses: list[tuple[float, str]] = field(default_factory=list) + duration_ops: list[tuple[float, str]] = field(default_factory=list) interpolated: bool = False diff --git a/src/qibolab/instruments/qm/program/instructions.py b/src/qibolab/instruments/qm/program/instructions.py index e09f9de807..64a31cf7e0 100644 --- a/src/qibolab/instruments/qm/program/instructions.py +++ b/src/qibolab/instruments/qm/program/instructions.py @@ -35,7 +35,7 @@ def _delay(pulse: Delay, element: str, parameters: Parameters): def _play_multiple_waveforms(element: str, parameters: Parameters): """Sweeping pulse duration using distinctly uploaded waveforms.""" with qua.switch_(parameters.duration, unsafe=True): - for value, sweep_op in parameters.pulses: + for value, sweep_op in parameters.duration_ops: if parameters.amplitude is not None: sweep_op = sweep_op * parameters.amplitude with qua.case_(value): @@ -49,7 +49,7 @@ def _play_single_waveform( acquisition: Optional[Acquisition] = None, ): if parameters.amplitude is not None: - op = parameters.amplitude_pulse * parameters.amplitude + op = parameters.amplitude_op * parameters.amplitude if acquisition is not None: acquisition.measure(op) else: @@ -65,7 +65,7 @@ def _play( if parameters.phase is not None: qua.frame_rotation_2pi(parameters.phase, element) - if len(parameters.pulses) > 0: + if len(parameters.duration_ops) > 0: _play_multiple_waveforms(element, parameters) else: _play_single_waveform(op, element, parameters, acquisition) From 10227d2ba0514ea23a793eb2cca2ddca9f435242 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 30 Aug 2024 12:05:21 +0300 Subject: [PATCH 0803/1006] refactor: simplify QM sweepers --- src/qibolab/instruments/qm/controller.py | 26 ++-- .../instruments/qm/program/instructions.py | 7 +- .../instruments/qm/program/sweepers.py | 118 +++++++----------- 3 files changed, 66 insertions(+), 85 deletions(-) diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index a4640304fb..3608d0655d 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -23,7 +23,7 @@ from .components import QmChannel from .config import SAMPLING_RATE, QmConfig, operation from .program import ExecutionArguments, create_acquisition, program -from .program.sweepers import sweeper_amplitude +from .program.sweepers import check_frequency_bandwidth, sweeper_amplitude OCTAVE_ADDRESS_OFFSET = 11000 """Offset to be added to Octave addresses, because they must be 11xxx, where @@ -397,6 +397,23 @@ def register_acquisitions( return acquisitions + def preprocess_sweeps( + self, + sweepers: list[ParallelSweepers], + configs: dict[str, Config], + args: ExecutionArguments, + ): + """Preprocessing and checks needed before executing some sweeps. + + Amplitude and duration sweeps require registering additional pulses in the QM ``config. + """ + for sweeper in find_sweepers(sweepers, Parameter.frequency): + check_frequency_bandwidth(sweeper.channels, configs, sweeper.values) + for sweeper in find_sweepers(sweepers, Parameter.amplitude): + self.register_amplitude_sweeper_pulses(args, sweeper) + for sweeper in find_sweepers(sweepers, Parameter.duration): + self.register_duration_sweeper_pulses(args, sweeper) + def execute_program(self, program): """Executes an arbitrary program written in QUA language.""" machine = self.manager.open_qm(asdict(self.config)) @@ -440,12 +457,7 @@ def play( acquisitions = self.register_acquisitions(configs, sequence, options) args = ExecutionArguments(sequence, acquisitions, options.relaxation_time) - - for sweeper in find_sweepers(sweepers, Parameter.amplitude): - self.register_amplitude_sweeper_pulses(args, sweeper) - for sweeper in find_sweepers(sweepers, Parameter.duration): - self.register_duration_sweeper_pulses(args, sweeper) - + self.preprocess_sweeps(sweepers, configs, args) experiment = program(configs, args, options, sweepers) if self.script_file_name is not None: diff --git a/src/qibolab/instruments/qm/program/instructions.py b/src/qibolab/instruments/qm/program/instructions.py index 64a31cf7e0..3fc11289f4 100644 --- a/src/qibolab/instruments/qm/program/instructions.py +++ b/src/qibolab/instruments/qm/program/instructions.py @@ -148,9 +148,12 @@ def sweep( ): method = SWEEPER_METHODS[sweeper.parameter] if sweeper.pulses is not None: - method(sweeper.pulses, values, variable, configs, args) + for pulse in sweeper.pulses: + params = args.parameters[operation(pulse)] + method(variable, params) else: - method(sweeper.channels, values, variable, configs, args) + for channel in sweeper.channels: + method(variable, channel, configs) sweep(sweepers[1:], configs, args) diff --git a/src/qibolab/instruments/qm/program/sweepers.py b/src/qibolab/instruments/qm/program/sweepers.py index b897e63af9..7be03a4af4 100644 --- a/src/qibolab/instruments/qm/program/sweepers.py +++ b/src/qibolab/instruments/qm/program/sweepers.py @@ -5,11 +5,9 @@ from qm.qua._dsl import _Variable # for type declaration only from qibolab.components import Channel, Config -from qibolab.pulses import Pulse from qibolab.sweeper import Parameter -from ..config import operation -from .arguments import ExecutionArguments +from .arguments import Parameters MAX_OFFSET = 0.5 """Maximum voltage supported by Quantum Machines OPX+ instrument in volts.""" @@ -18,89 +16,24 @@ https://docs.quantum-machines.co/1.2.0/docs/API_references/qua/dsl_main/#qm.qua._dsl.amp """ +FREQUENCY_BANDWIDTH = 4e8 +"""Quantum Machines OPX+ frequency bandwidth in Hz.""" -def _frequency( - channels: list[Channel], - values: npt.NDArray, - variable: _Variable, - configs: dict[str, Config], - args: ExecutionArguments, +def check_frequency_bandwidth( + channels: list[Channel], configs: dict[str, Channel], values: npt.NDArray ): + """Check if frequency sweep is within the supported instrument bandwidth + [-400, 400] MHz.""" for channel in channels: name = str(channel.name) lo_frequency = configs[channel.lo].frequency - # check if sweep is within the supported bandwidth [-400, 400] MHz - max_freq = np.max(np.abs(values - lo_frequency)) - if max_freq > 4e8: + max_freq = max(abs(values - lo_frequency)) + if max_freq > FREQUENCY_BANDWIDTH: raise_error( ValueError, f"Frequency {max_freq} for channel {name} is beyond instrument bandwidth.", ) - qua.update_frequency(name, variable - lo_frequency) - - -def _amplitude( - pulses: list[Pulse], - values: npt.NDArray, - variable: _Variable, - configs: dict[str, Config], - args: ExecutionArguments, -): - for pulse in pulses: - args.parameters[operation(pulse)].amplitude = qua.amp(variable) - - -def _relative_phase( - pulses: list[Pulse], - values: npt.NDArray, - variable: _Variable, - configs: dict[str, Config], - args: ExecutionArguments, -): - for pulse in pulses: - args.parameters[operation(pulse)].phase = variable - - -def _offset( - channels: list[Channel], - values: npt.NDArray, - variable: _Variable, - configs: dict[str, Config], - args: ExecutionArguments, -): - for channel in channels: - name = str(channel.name) - with qua.if_(variable >= MAX_OFFSET): - qua.set_dc_offset(name, "single", MAX_OFFSET) - with qua.elif_(variable <= -MAX_OFFSET): - qua.set_dc_offset(name, "single", -MAX_OFFSET) - with qua.else_(): - qua.set_dc_offset(name, "single", variable) - - -def _duration( - pulses: list[Pulse], - values: npt.NDArray, - variable: _Variable, - configs: dict[str, Config], - args: ExecutionArguments, -): - for pulse in pulses: - args.parameters[operation(pulse)].duration = variable - - -def _duration_interpolated( - pulses: list[Pulse], - values: npt.NDArray, - variable: _Variable, - configs: dict[str, Config], - args: ExecutionArguments, -): - for pulse in pulses: - params = args.parameters[operation(pulse)] - params.duration = variable - params.interpolated = True def sweeper_amplitude(values: npt.NDArray) -> float: @@ -134,6 +67,39 @@ def normalize_duration(values: npt.NDArray) -> npt.NDArray: return (values // 4).astype(int) +def _amplitude(variable: _Variable, parameters: Parameters): + parameters.amplitude = qua.amp(variable) + + +def _relative_phase(variable: _Variable, parameters: Parameters): + parameters.phase = variable + + +def _duration(variable: _Variable, parameters: Parameters): + parameters.duration = variable + + +def _duration_interpolated(variable: _Variable, parameters: Parameters): + parameters.duration = variable + parameters.interpolated = True + + +def _offset(variable: _Variable, channel: Channel, configs: dict[str, Config]): + name = str(channel.name) + with qua.if_(variable >= MAX_OFFSET): + qua.set_dc_offset(name, "single", MAX_OFFSET) + with qua.elif_(variable <= -MAX_OFFSET): + qua.set_dc_offset(name, "single", -MAX_OFFSET) + with qua.else_(): + qua.set_dc_offset(name, "single", variable) + + +def _frequency(variable: _Variable, channel: Channel, configs: dict[str, Config]): + name = str(channel.name) + lo_frequency = configs[channel.lo].frequency + qua.update_frequency(name, variable - lo_frequency) + + INT_TYPE = {Parameter.frequency, Parameter.duration, Parameter.duration_interpolated} """Sweeper parameters for which we need ``int`` variable type. From f6a86b71396c477b448779bcb6d942d8766fa1ae Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 30 Aug 2024 12:14:18 +0300 Subject: [PATCH 0804/1006] fix: docstring --- src/qibolab/instruments/qm/controller.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 3608d0655d..8d536ee3c6 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -340,8 +340,8 @@ def register_amplitude_sweeper_pulses( ): """Register pulse with different amplitude. - Needed when sweeping amplitude and the original amplitude is not - sufficient to reach all the sweeper values. + Needed when sweeping amplitude because the original amplitude + may not sufficient to reach all the sweeper values. """ new_op = None amplitude = sweeper_amplitude(sweeper.values) From 6b01a434f3c436a947fbaf8d1c1d5749b75bb673 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 30 Aug 2024 16:05:16 +0300 Subject: [PATCH 0805/1006] Update src/qibolab/sweeper.py Co-authored-by: Alessandro Candido --- src/qibolab/sweeper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibolab/sweeper.py b/src/qibolab/sweeper.py index 37c1a48de3..3b4a849b8b 100644 --- a/src/qibolab/sweeper.py +++ b/src/qibolab/sweeper.py @@ -101,7 +101,7 @@ def check_values(self): object.__setattr__(self, "values", np.arange(*self.range)) if self.parameter is Parameter.amplitude and max(abs(self.values)) > 1: - raise ValueError("Amplitude sweeper cannot have values larger than 1.") + raise ValueError("Amplitude sweeper cannot have absolute values larger than 1.") return self From 1fb01905db3777e41c9ce98e414756126ad23c72 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 30 Aug 2024 13:05:27 +0000 Subject: [PATCH 0806/1006] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/qibolab/sweeper.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/qibolab/sweeper.py b/src/qibolab/sweeper.py index 3b4a849b8b..20587e806d 100644 --- a/src/qibolab/sweeper.py +++ b/src/qibolab/sweeper.py @@ -101,7 +101,9 @@ def check_values(self): object.__setattr__(self, "values", np.arange(*self.range)) if self.parameter is Parameter.amplitude and max(abs(self.values)) > 1: - raise ValueError("Amplitude sweeper cannot have absolute values larger than 1.") + raise ValueError( + "Amplitude sweeper cannot have absolute values larger than 1." + ) return self From cef71e441627e643b3d237d843087a1c2fa47082 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 30 Aug 2024 16:11:22 +0300 Subject: [PATCH 0807/1006] fix: error match --- tests/test_sweeper.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/test_sweeper.py b/tests/test_sweeper.py index 275a29ffda..ff02cd245f 100644 --- a/tests/test_sweeper.py +++ b/tests/test_sweeper.py @@ -68,9 +68,7 @@ def test_sweeper_errors(): parameter=Parameter.frequency, channels=[channel], ) - with pytest.raises( - ValueError, match="Amplitude sweeper cannot have values larger than 1." - ): + with pytest.raises(ValueError, match="Amplitude"): Sweeper( parameter=Parameter.amplitude, range=(0, 2, 0.2), From bbfea830b184bb55393f60d48ba7f2e8169deb6d Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 22 Aug 2024 13:23:39 +0200 Subject: [PATCH 0808/1006] feat!: Make qubit holding references, not actual channels --- src/qibolab/qubits.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index 17a419eca1..960e86b9fa 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -3,9 +3,8 @@ from pydantic import ConfigDict -from .components import AcquireChannel, DcChannel, IqChannel from .components.channels import Channel -from .identifier import ChannelType, QubitId +from .identifier import ChannelId, ChannelType, QubitId from .serialize import Model @@ -29,12 +28,11 @@ class Qubit(Model): name: QubitId - probe: Optional[IqChannel] = None - acquisition: Optional[AcquireChannel] = None - drive: Optional[IqChannel] = None - drive12: Optional[IqChannel] = None - drive_cross: Optional[dict[QubitId, IqChannel]] = None - flux: Optional[DcChannel] = None + probe: Optional[ChannelId] = None + acquisition: Optional[ChannelId] = None + drive: Optional[ChannelId] = None + drive_qudits: Optional[dict[str, ChannelId]] = None + flux: Optional[ChannelId] = None @property def channels(self) -> Iterable[Channel]: From bf3d8973415abac70428dc0b027a87cf844bd198 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 22 Aug 2024 13:34:44 +0200 Subject: [PATCH 0809/1006] feat!: Remove internal references to objects' own names Names are the way an object is known in a certain context, so it is not an intrinsic property of the object itself. It should be up to the retriever to preserve the name even after obtaining the object, if still needed. --- src/qibolab/components/channels.py | 4 +--- src/qibolab/qubits.py | 2 -- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/qibolab/components/channels.py b/src/qibolab/components/channels.py index d42469ed51..e385ad57fa 100644 --- a/src/qibolab/components/channels.py +++ b/src/qibolab/components/channels.py @@ -20,15 +20,13 @@ from typing import Optional -from qibolab.identifier import ChannelId from qibolab.serialize import Model __all__ = ["Channel", "DcChannel", "IqChannel", "AcquireChannel"] class Channel(Model): - name: ChannelId - """Name of the channel.""" + """Channel to communicate with the qubit.""" class DcChannel(Channel): diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index 960e86b9fa..5742fc8c22 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -26,8 +26,6 @@ class Qubit(Model): model_config = ConfigDict(frozen=False) - name: QubitId - probe: Optional[ChannelId] = None acquisition: Optional[ChannelId] = None drive: Optional[ChannelId] = None From 7bc066fa3ef4c1c3deaa913c219d0b51934874fc Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 22 Aug 2024 13:36:58 +0200 Subject: [PATCH 0810/1006] feat!: Remove obsolete mixer frequencies accessor --- src/qibolab/qubits.py | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index 5742fc8c22..232fac002e 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -38,19 +38,3 @@ def channels(self) -> Iterable[Channel]: channel = getattr(self, ct.value) if channel is not None: yield channel - - @property - def mixer_frequencies(self): - """Get local oscillator and intermediate frequencies of native gates. - - Assumes RF = LO + IF. - """ - freqs = {} - for name in self.native_gates.model_fields: - native = getattr(self.native_gates, name) - if native is not None: - channel_type = native.pulse_type.name.lower() - _lo = getattr(self, channel_type).lo_frequency - _if = native.frequency - _lo - freqs[name] = _lo, _if - return freqs From e05f6645799c689d942d78edf77d6466b4fb7fa4 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 22 Aug 2024 13:37:38 +0200 Subject: [PATCH 0811/1006] feat!: Remove obsolete flux constructor for pulses --- src/qibolab/pulses/pulse.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index ce9bc2f334..c5b58ebcef 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -42,16 +42,6 @@ class Pulse(_PulseLike): relative_phase: float = 0.0 """Relative phase of the pulse, in radians.""" - @classmethod - def flux(cls, **kwargs): - """Construct a flux pulse. - - It provides a simplified syntax for the :class:`Pulse` constructor, by applying - suitable defaults. - """ - kwargs["relative_phase"] = 0 - return cls(**kwargs) - def i(self, sampling_rate: float) -> Waveform: """The envelope waveform of the i component of the pulse.""" samples = int(self.duration * sampling_rate) From 91bc35d602264627485ad2c43eaed6b6d37afb1c Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 22 Aug 2024 13:38:40 +0200 Subject: [PATCH 0812/1006] test: Remove flux constructor tests --- tests/pulses/test_pulse.py | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/tests/pulses/test_pulse.py b/tests/pulses/test_pulse.py index 0c6408b5ee..c0b35e7d73 100644 --- a/tests/pulses/test_pulse.py +++ b/tests/pulses/test_pulse.py @@ -1,20 +1,12 @@ """Tests ``pulses.py``.""" import numpy as np -import pytest +from pytest import approx, raises from qibolab.pulses import Acquisition, Custom, Pulse, Rectangular, VirtualZ from qibolab.pulses.pulse import _Readout -def test_flux(): - p = Pulse.flux(duration=5, amplitude=0.9, envelope=Rectangular()) - assert p.relative_phase == 0 - - p1 = Pulse.flux(duration=5, amplitude=0.9, relative_phase=1, envelope=Rectangular()) - assert p1.relative_phase == 0 - - def test_virtual_z(): vz = VirtualZ(phase=-0.3) assert vz.duration == 0 @@ -31,10 +23,10 @@ def test_readout(): def test_envelope_waveform_i_q(): d = 1000 p = Pulse(duration=d, amplitude=1, envelope=Rectangular()) - assert pytest.approx(p.i(1)) == np.ones(d) - assert pytest.approx(p.i(2)) == np.ones(2 * d) - assert pytest.approx(p.q(1)) == np.zeros(d) - assert pytest.approx(p.envelopes(1)) == np.stack([np.ones(d), np.zeros(d)]) + assert approx(p.i(1)) == np.ones(d) + assert approx(p.i(2)) == np.ones(2 * d) + assert approx(p.q(1)) == np.zeros(d) + assert approx(p.envelopes(1)) == np.stack([np.ones(d), np.zeros(d)]) envelope_i = np.cos(np.arange(0, 10, 0.01)) envelope_q = np.sin(np.arange(0, 10, 0.01)) @@ -42,7 +34,7 @@ def test_envelope_waveform_i_q(): pulse = Pulse(duration=1000, amplitude=1, relative_phase=0, envelope=Rectangular()) custom_shape_pulse = custom_shape_pulse.model_copy(update={"i_": pulse.i(1)}) - with pytest.raises(ValueError): + with raises(ValueError): custom_shape_pulse.i(samples=10) - with pytest.raises(ValueError): + with raises(ValueError): custom_shape_pulse.q(samples=10) From 758c9e39a8b86c85008c496bac389c982b3e6db1 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 22 Aug 2024 15:25:30 +0200 Subject: [PATCH 0813/1006] test: Fix pulses plots tests --- tests/pulses/test_plot.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/pulses/test_plot.py b/tests/pulses/test_plot.py index baf542b910..2f904d2a59 100644 --- a/tests/pulses/test_plot.py +++ b/tests/pulses/test_plot.py @@ -40,12 +40,12 @@ def test_plot_functions(): envelope=Drag(rel_sigma=0.2, beta=2), relative_phase=0, ) - p3 = Pulse.flux( + p3 = Pulse( duration=40, amplitude=0.9, envelope=Iir(a=np.array([-0.5, 2]), b=np.array([1]), target=Rectangular()), ) - p4 = Pulse.flux(duration=40, amplitude=0.9, envelope=Snz(t_idling=10)) + p4 = Pulse(duration=40, amplitude=0.9, envelope=Snz(t_idling=10)) p5 = Pulse( duration=40, amplitude=0.9, From 2e20f7d305e14ebe001d5d13644b5103adf88378 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 22 Aug 2024 15:31:43 +0200 Subject: [PATCH 0814/1006] feat!: Drop structured channel IDs --- src/qibolab/identifier.py | 53 +++------------------------------------ 1 file changed, 4 insertions(+), 49 deletions(-) diff --git a/src/qibolab/identifier.py b/src/qibolab/identifier.py index 4047c8a9ee..6a077aa4d2 100644 --- a/src/qibolab/identifier.py +++ b/src/qibolab/identifier.py @@ -1,16 +1,7 @@ from enum import Enum -from typing import Annotated, Optional, Union +from typing import Annotated, Union -from pydantic import ( - BeforeValidator, - Field, - PlainSerializer, - TypeAdapter, - model_serializer, - model_validator, -) - -from .serialize import Model +from pydantic import BeforeValidator, Field, PlainSerializer QubitId = Annotated[Union[int, str], Field(union_mode="left_to_right")] """Type for qubit names.""" @@ -34,47 +25,11 @@ class ChannelType(str, Enum): PROBE = "probe" ACQUISITION = "acquisition" DRIVE = "drive" - DRIVE12 = "drive12" - DRIVE_CROSS = "drive_cross" FLUX = "flux" def __str__(self) -> str: return str(self.value) -_adapted_qubit = TypeAdapter(QubitId) - - -class ChannelId(Model): - """Unique identifier for a channel.""" - - qubit: QubitId - channel_type: ChannelType - cross: Optional[str] - - @model_validator(mode="before") - @classmethod - def _load(cls, ch: str) -> dict: - elements = ch.split("/") - # TODO: replace with pattern matching, once py3.9 will be abandoned - if len(elements) > 3: - raise ValueError() - q = _adapted_qubit.validate_python(elements[0]) - ct = ChannelType(elements[1]) - assert len(elements) == 2 or ct is ChannelType.DRIVE_CROSS - dc = elements[2] if len(elements) == 3 else None - return dict(qubit=q, channel_type=ct, cross=dc) - - @classmethod - def load(cls, value: str): - """Unpack from string.""" - return cls.model_validate(value) - - def __str__(self): - """Represent as its joint components.""" - return "/".join(str(el[1]) for el in self if el[1] is not None) - - @model_serializer - def _dump(self) -> str: - """Prepare for serialization.""" - return str(self) +ChannelId = str +"""Unique identifier for a channel.""" From 2adb673f29531a2f37ba5e68b2d8b66ce0a4124a Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 22 Aug 2024 15:58:48 +0200 Subject: [PATCH 0815/1006] feat!: Drop readout automated grouping --- src/qibolab/pulses/__init__.py | 2 +- src/qibolab/pulses/pulse.py | 4 +-- src/qibolab/sequence.py | 42 ++++------------------- tests/test_sequence.py | 61 +++++++++++----------------------- 4 files changed, 28 insertions(+), 81 deletions(-) diff --git a/src/qibolab/pulses/__init__.py b/src/qibolab/pulses/__init__.py index ff630e9950..d8e1abcbdd 100644 --- a/src/qibolab/pulses/__init__.py +++ b/src/qibolab/pulses/__init__.py @@ -1,2 +1,2 @@ from .envelope import * -from .pulse import Acquisition, Align, Delay, Pulse, PulseLike, VirtualZ +from .pulse import Acquisition, Align, Delay, Pulse, PulseLike, Readout, VirtualZ diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index c5b58ebcef..f95ee52d5f 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -103,7 +103,7 @@ class Acquisition(_PulseLike): """Duration in ns.""" -class _Readout(_PulseLike): +class Readout(_PulseLike): """Readout instruction. This event instructs the device to acquire samples for the event @@ -135,6 +135,6 @@ class Align(_PulseLike): PulseLike = Annotated[ - Union[Align, Pulse, Delay, VirtualZ, Acquisition, _Readout], + Union[Align, Pulse, Delay, VirtualZ, Acquisition, Readout], Field(discriminator="kind"), ] diff --git a/src/qibolab/sequence.py b/src/qibolab/sequence.py index d22ff8fb46..201b1bb706 100644 --- a/src/qibolab/sequence.py +++ b/src/qibolab/sequence.py @@ -2,20 +2,18 @@ from collections import UserList from collections.abc import Callable, Iterable -from itertools import zip_longest -from typing import Any +from typing import Any, Union from pydantic import TypeAdapter from pydantic_core import core_schema -from qibolab.pulses.pulse import Pulse, _Readout - -from .identifier import ChannelId, ChannelType -from .pulses import Acquisition, Align, Delay, PulseLike +from .identifier import ChannelId +from .pulses import Acquisition, Align, Delay, PulseLike, Readout __all__ = ["PulseSequence"] _Element = tuple[ChannelId, PulseLike] +InputOps = Union[Readout, Acquisition] _adapted_sequence = TypeAdapter(list[_Element]) @@ -149,7 +147,7 @@ def trim(self) -> "PulseSequence": return type(self)(reversed(new)) @property - def acquisitions(self) -> list[tuple[ChannelId, Acquisition]]: + def acquisitions(self) -> list[tuple[ChannelId, InputOps]]: """Return list of the readout pulses in this sequence. .. note:: @@ -159,32 +157,4 @@ def acquisitions(self) -> list[tuple[ChannelId, Acquisition]]: :attr:`ChannelType.ACQUISITION`) """ # pulse filter needed to exclude delays - return [el for el in self if isinstance(el[1], Acquisition)] - - @property - def as_readouts(self) -> list[_Element]: - new = [] - skip = False - for (ch, p), (nch, np) in zip_longest(self, self[1:], fillvalue=(None, None)): - if skip: - skip = False - continue - - # TODO: replace with pattern matching, once py3.9 will be abandoned - assert ch is not None - if ch.channel_type is ChannelType.ACQUISITION and not isinstance(p, Delay): - raise ValueError("Acquisition not preceded by probe.") - if ch.channel_type is ChannelType.PROBE and isinstance(p, Pulse): - if ( - nch is not None - and nch.channel_type is ChannelType.ACQUISITION - and isinstance(np, Acquisition) - ): - new.append((ch, _Readout(acquisition=np, probe=p))) - skip = True - else: - raise ValueError("Probe not followed by acquisition.") - else: - new.append((ch, p)) - - return new + return [(ch, p) for ch, p in self if isinstance(p, (Acquisition, Readout))] diff --git a/tests/test_sequence.py b/tests/test_sequence.py index 6fc25df0eb..e1ce15fac1 100644 --- a/tests/test_sequence.py +++ b/tests/test_sequence.py @@ -1,17 +1,15 @@ -import pytest from pydantic import TypeAdapter -from qibolab.identifier import ChannelId from qibolab.pulses import ( Acquisition, Delay, Drag, Gaussian, Pulse, + Readout, Rectangular, VirtualZ, ) -from qibolab.pulses.pulse import _Readout from qibolab.sequence import PulseSequence @@ -21,9 +19,9 @@ def test_init(): def test_init_with_iterable(): - sc = ChannelId.load("some/probe") - oc = ChannelId.load("other/drive") - c5 = ChannelId.load("5/drive") + sc = "some/probe" + oc = "other/drive" + c5 = "5/drive" seq = PulseSequence( [ (sc, p) @@ -51,10 +49,10 @@ def test_init_with_iterable(): def test_serialization(): - sp = ChannelId.load("some/probe") - sa = ChannelId.load("some/acquisition") - od = ChannelId.load("other/drive") - of = ChannelId.load("other/flux") + sp = "some/probe" + sa = "some/acquisition" + od = "other/drive" + of = "other/flux" seq = PulseSequence( [ @@ -281,45 +279,24 @@ def test_acquisitions(): def test_readouts(): probe = Pulse(duration=10, amplitude=1, envelope=Rectangular()) acq = Acquisition(duration=10) - sequence = PulseSequence.load([("1/probe", probe), ("1/acquisition", acq)]) - ros = sequence.as_readouts - assert len(ros) == 1 - ro = ros[0][1] - assert isinstance(ro, _Readout) + sequence = PulseSequence([("1/acquisition", Readout(probe=probe, acquisition=acq))]) + assert len(sequence) == 1 + ro = sequence[0][1] + assert isinstance(ro, Readout) assert ro.duration == acq.duration assert ro.id == acq.id - sequence = PulseSequence.load( + sequence = PulseSequence( [ ("1/drive", VirtualZ(phase=0.7)), - ("1/probe", Delay(duration=15)), ("1/acquisition", Delay(duration=20)), - ("1/probe", probe), - ("1/acquisition", acq), + ("1/acquisition", Readout(probe=probe, acquisition=acq)), ("1/flux", probe), ] ) - ros = sequence.as_readouts - assert len(ros) == 5 - - sequence = PulseSequence.load([("1/probe", probe)]) - with pytest.raises(ValueError, match="(?i)probe"): - sequence.as_readouts - - sequence = PulseSequence.load([("1/acquisition", acq)]) - with pytest.raises(ValueError, match="(?i)acquisition"): - sequence.as_readouts - - sequence = PulseSequence.load([("1/acquisition", acq), ("1/probe", probe)]) - with pytest.raises(ValueError): - sequence.as_readouts + assert len(sequence) == 4 + assert len(sequence.acquisitions) == 1 + assert isinstance(sequence.acquisitions[0][1], Readout) - sequence = PulseSequence.load( - [ - ("1/probe", probe), - ("1/acquisition", Delay(duration=20)), - ("1/acquisition", acq), - ] - ) - with pytest.raises(ValueError): - sequence.as_readouts + aslist = TypeAdapter(PulseSequence).dump_python(sequence) + assert PulseSequence.load(aslist) == sequence From 890e5bdf1175788c432af937abad8cbf3b9d2df2 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 22 Aug 2024 16:02:02 +0200 Subject: [PATCH 0816/1006] test: Drop channel id test --- tests/pulses/test_pulse.py | 4 ++-- tests/test_identifier.py | 25 +------------------------ 2 files changed, 3 insertions(+), 26 deletions(-) diff --git a/tests/pulses/test_pulse.py b/tests/pulses/test_pulse.py index c0b35e7d73..d88c85549c 100644 --- a/tests/pulses/test_pulse.py +++ b/tests/pulses/test_pulse.py @@ -4,7 +4,7 @@ from pytest import approx, raises from qibolab.pulses import Acquisition, Custom, Pulse, Rectangular, VirtualZ -from qibolab.pulses.pulse import _Readout +from qibolab.pulses.pulse import Readout def test_virtual_z(): @@ -15,7 +15,7 @@ def test_virtual_z(): def test_readout(): p = Pulse(duration=5, amplitude=0.9, envelope=Rectangular()) a = Acquisition(duration=60) - r = _Readout(acquisition=a, probe=p) + r = Readout(acquisition=a, probe=p) assert r.duration == a.duration assert r.id == a.id diff --git a/tests/test_identifier.py b/tests/test_identifier.py index e6d6273927..86dab33406 100644 --- a/tests/test_identifier.py +++ b/tests/test_identifier.py @@ -1,28 +1,5 @@ -import pytest -from pydantic import ValidationError - -from qibolab.identifier import ChannelId, ChannelType +from qibolab.identifier import ChannelType def test_channel_type(): assert str(ChannelType.ACQUISITION) == "acquisition" - - -def test_channel_id(): - name = "1/probe" - ch = ChannelId.load(name) - assert ch.qubit == 1 - assert ch.channel_type is ChannelType.PROBE - assert ch.cross is None - assert str(ch) == name == ch.model_dump() - - chd = ChannelId.load("10/drive_cross/3") - assert chd.qubit == 10 - assert chd.channel_type is ChannelType.DRIVE_CROSS - assert chd.cross == "3" - - with pytest.raises(ValidationError): - ChannelId.load("1/probe/3") - - with pytest.raises(ValueError): - ChannelId.load("ciao/come/va/bene") From 3cb1fbb32d9ce3f2ff0751d4ed69cd9d0d5e6b32 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 22 Aug 2024 16:14:10 +0200 Subject: [PATCH 0817/1006] feat: Move actual channels to instrument (just dummy) --- src/qibolab/dummy/platform.py | 32 ++++++++++++++++++++++---------- src/qibolab/instruments/dummy.py | 5 ++++- tests/conftest.py | 5 ++--- 3 files changed, 28 insertions(+), 14 deletions(-) diff --git a/src/qibolab/dummy/platform.py b/src/qibolab/dummy/platform.py index d3d12bc235..0a40837a12 100644 --- a/src/qibolab/dummy/platform.py +++ b/src/qibolab/dummy/platform.py @@ -17,21 +17,33 @@ def create_dummy() -> Platform: qubits = {} # attach the channels for q in range(5): - probe, acquisition = f"qubit_{q}/probe", f"qubit_{q}/acquisition" + drive, drive12, flux, probe, acquisition = ( + f"qubit_{q}/drive", + f"qubit_{q}/drive12", + f"qubit_{q}/flux", + f"qubit_{q}/probe", + f"qubit_{q}/acquisition", + ) + instrument.channels |= { + probe: IqChannel(mixer=None, lo=None, acquisition=acquisition), + acquisition: AcquireChannel(twpa_pump=pump.name, probe=probe), + drive: IqChannel(mixer=None, lo=None), + drive12: IqChannel(mixer=None, lo=None), + flux: DcChannel(), + } qubits[q] = Qubit( - name=q, - probe=IqChannel(name=probe, mixer=None, lo=None, acquisition=acquisition), - acquisition=AcquireChannel( - name=acquisition, twpa_pump=pump.name, probe=probe - ), - drive=IqChannel(name=f"qubit_{q}/drive", mixer=None, lo=None), - drive12=IqChannel(name=f"qubit_{q}/drive12", mixer=None, lo=None), - flux=DcChannel(name=f"qubit_{q}/flux"), + probe=probe, + acquisition=acquisition, + drive=drive, + drive_qudits={"1-2": f"qubit_{q}/flux"}, + flux=flux, ) couplers = {} for c in (0, 1, 3, 4): - couplers[c] = Qubit(name=c, flux=DcChannel(name=f"coupler_{c}/flux")) + flux = f"coupler_{c}/flux" + instrument.channels |= {flux: DcChannel()} + couplers[c] = Qubit(flux=flux) return Platform.load( path=FOLDER, instruments=[instrument, pump], qubits=qubits, couplers=couplers diff --git a/src/qibolab/instruments/dummy.py b/src/qibolab/instruments/dummy.py index 36c678f238..5c5a215b80 100644 --- a/src/qibolab/instruments/dummy.py +++ b/src/qibolab/instruments/dummy.py @@ -1,9 +1,11 @@ -from dataclasses import dataclass +from dataclasses import dataclass, field import numpy as np from qibo.config import log from qibolab import AcquisitionType, AveragingMode, ExecutionParameters +from qibolab.components.channels import Channel +from qibolab.identifier import ChannelId from qibolab.pulses.pulse import Acquisition from qibolab.sequence import PulseSequence from qibolab.sweeper import ParallelSweepers @@ -67,6 +69,7 @@ class DummyInstrument(Controller): name: str address: str bounds: str = "dummy/bounds" + channels: dict[ChannelId, Channel] = field(default_factory=dict) @property def sampling_rate(self) -> int: diff --git a/tests/conftest.py b/tests/conftest.py index d79f287944..0d443be630 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -154,15 +154,14 @@ def wrapped( sequence.concatenate(qd_seq) sequence.concatenate(probe_seq) if sweepers is None: - amp_values = np.arange(0, 0.8, 0.1) sweeper1 = Sweeper( parameter=Parameter.offset, range=(0.01, 0.06, 0.01), - channels=[qubit.flux.name], + channels=[qubit.flux], ) sweeper2 = Sweeper( parameter=Parameter.amplitude, - values=amp_values, + range=(0, 0.8, 0.1), pulses=[probe_pulse], ) sweepers = [[sweeper1], [sweeper2]] From 68d60b173f2a2c89529b2bf2f323bd22cac28fb0 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 22 Aug 2024 16:39:43 +0200 Subject: [PATCH 0818/1006] fix: Migrate even instruments to Pydantic --- src/qibolab/instruments/abstract.py | 35 +++++++++++++---------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/src/qibolab/instruments/abstract.py b/src/qibolab/instruments/abstract.py index 10c7f0db24..46ed02ffd4 100644 --- a/src/qibolab/instruments/abstract.py +++ b/src/qibolab/instruments/abstract.py @@ -1,30 +1,27 @@ from abc import ABC, abstractmethod -from dataclasses import asdict, dataclass from typing import Optional import numpy.typing as npt +from pydantic import ConfigDict, Field from qibolab.components import Config +from qibolab.components.channels import Channel from qibolab.execution_parameters import ExecutionParameters +from qibolab.identifier import ChannelId from qibolab.sequence import PulseSequence +from qibolab.serialize import Model from qibolab.sweeper import ParallelSweepers InstrumentId = str -@dataclass -class InstrumentSettings: +class InstrumentSettings(Model): """Container of settings that are dumped in the platform runcard json.""" - def dump(self): - """Dictionary containing the settings. - - Useful when dumping the instruments to the runcard JSON. - """ - return asdict(self) + model_config = ConfigDict(frozen=False) -class Instrument(ABC): +class Instrument(Model, ABC): """Parent class for all the instruments connected via TCPIP. Args: @@ -32,11 +29,12 @@ class Instrument(ABC): address (str): Instrument network address. """ - def __init__(self, name, address): - self.name: InstrumentId = name - self.address: str = address - self.is_connected: bool = False - self.settings: Optional[InstrumentSettings] = None + model_config = ConfigDict(frozen=False) + + name: InstrumentId + address: str + is_connected: bool = False + settings: Optional[InstrumentSettings] = None @property def signature(self): @@ -58,10 +56,9 @@ def setup(self, *args, **kwargs): class Controller(Instrument): """Instrument that can play pulses (using waveform generator).""" - def __init__(self, name, address): - super().__init__(name, address) - self.bounds: str - """Estimated limitations of the device memory.""" + bounds: str + """Estimated limitations of the device memory.""" + channels: dict[ChannelId, Channel] = Field(default_factory=dict) @property @abstractmethod From 8edc9772e3d58d2323834b5b5b14a9f8bb322a80 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 22 Aug 2024 16:40:44 +0200 Subject: [PATCH 0819/1006] fix: Migrate the oscillator base classes --- src/qibolab/instruments/oscillator.py | 56 +++++++++++---------------- 1 file changed, 23 insertions(+), 33 deletions(-) diff --git a/src/qibolab/instruments/oscillator.py b/src/qibolab/instruments/oscillator.py index 3fb7b4123a..75c732af33 100644 --- a/src/qibolab/instruments/oscillator.py +++ b/src/qibolab/instruments/oscillator.py @@ -1,14 +1,15 @@ from abc import abstractmethod -from dataclasses import dataclass, fields from typing import Optional +from pydantic import Field +from qcodes.instrument import Instrument as QcodesInstrument + from qibolab.instruments.abstract import Instrument, InstrumentSettings RECONNECTION_ATTEMPTS = 3 """Number of times to attempt connecting to instrument in case of failure.""" -@dataclass class LocalOscillatorSettings(InstrumentSettings): """Local oscillator parameters that are saved in the platform runcard.""" @@ -16,17 +17,6 @@ class LocalOscillatorSettings(InstrumentSettings): frequency: Optional[float] = None ref_osc_source: Optional[str] = None - def dump(self): - """Dictionary containing local oscillator settings. - - The reference clock is excluded as it is not a calibrated - parameter. None values are also excluded. - """ - data = super().dump() - return { - k: v for k, v in data.items() if k != "ref_osc_source" and v is not None - } - def _setter(instrument, parameter, value): """Set value of a setting. @@ -44,10 +34,11 @@ def _setter(instrument, parameter, value): def _property(parameter): - """Creates an instrument property.""" - getter = lambda self: getattr(self.settings, parameter) - setter = lambda self, value: _setter(self, parameter, value) - return property(getter, setter) + """Create an instrument property.""" + return property( + lambda self: getattr(self.settings, parameter), + lambda self, value: _setter(self, parameter, value), + ) class LocalOscillator(Instrument): @@ -58,22 +49,21 @@ class LocalOscillator(Instrument): qubits and resonators. They cannot be used to play or sweep pulses. """ + device: Optional[QcodesInstrument] = None + settings: Optional[InstrumentSettings] = Field( + default_factory=lambda: LocalOscillatorSettings() + ) + frequency = _property("frequency") power = _property("power") ref_osc_source = _property("ref_osc_source") - def __init__(self, name, address, ref_osc_source=None): - super().__init__(name, address) - self.device = None - self.settings = LocalOscillatorSettings(ref_osc_source=ref_osc_source) - @abstractmethod - def create(self): + def create(self) -> QcodesInstrument: """Create instance of physical device.""" def connect(self): - """Connects to the instrument using the IP address set in the - runcard.""" + """Connect to the instrument.""" if not self.is_connected: self.device = self.create() self.is_connected = True @@ -84,13 +74,15 @@ def connect(self): f"There is an open connection to the instrument {self.name}." ) - for fld in fields(self.settings): - self.sync(fld.name) + assert self.settings is not None + for fld in self.settings.model_fields: + self.sync(fld) self.device.on() def disconnect(self): if self.is_connected: + assert self.device is not None self.device.off() self.device.close() self.is_connected = False @@ -105,6 +97,7 @@ def sync(self, parameter): parameter (str): Parameter name to be synced. """ value = getattr(self, parameter) + assert self.device is not None if value is None: setattr(self.settings, parameter, self.device.get(parameter)) else: @@ -119,11 +112,8 @@ def setup(self, **kwargs): Args: **kwargs: Instrument settings loaded from the runcard. """ - type_ = self.__class__ - _fields = {fld.name for fld in fields(self.settings)} + assert self.settings is not None for name, value in kwargs.items(): - if name not in _fields: - raise KeyError( - f"Cannot set {name} to instrument {self.name} of type {type_.__name__}" - ) + if name not in self.settings.model_fields: + raise KeyError(f"Cannot set {name} to instrument {self.name}") setattr(self, name, value) From c8619addef39ccab18f7148095a26988cb6c1fca Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 22 Aug 2024 16:41:09 +0200 Subject: [PATCH 0820/1006] fix: Migrate dummy as well --- src/qibolab/dummy/platform.py | 4 ++-- src/qibolab/instruments/dummy.py | 6 ------ 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/src/qibolab/dummy/platform.py b/src/qibolab/dummy/platform.py index 0a40837a12..b4286a840d 100644 --- a/src/qibolab/dummy/platform.py +++ b/src/qibolab/dummy/platform.py @@ -11,8 +11,8 @@ def create_dummy() -> Platform: """Create a dummy platform using the dummy instrument.""" # register the instruments - instrument = DummyInstrument("dummy", "0.0.0.0") - pump = DummyLocalOscillator("twpa_pump", "0.0.0.0") + instrument = DummyInstrument(name="dummy", address="0.0.0.0") + pump = DummyLocalOscillator(name="twpa_pump", address="0.0.0.0") qubits = {} # attach the channels diff --git a/src/qibolab/instruments/dummy.py b/src/qibolab/instruments/dummy.py index 5c5a215b80..2b16b65e8d 100644 --- a/src/qibolab/instruments/dummy.py +++ b/src/qibolab/instruments/dummy.py @@ -1,11 +1,7 @@ -from dataclasses import dataclass, field - import numpy as np from qibo.config import log from qibolab import AcquisitionType, AveragingMode, ExecutionParameters -from qibolab.components.channels import Channel -from qibolab.identifier import ChannelId from qibolab.pulses.pulse import Acquisition from qibolab.sequence import PulseSequence from qibolab.sweeper import ParallelSweepers @@ -52,7 +48,6 @@ def create(self): return DummyDevice() -@dataclass class DummyInstrument(Controller): """Dummy instrument that returns random voltage values. @@ -69,7 +64,6 @@ class DummyInstrument(Controller): name: str address: str bounds: str = "dummy/bounds" - channels: dict[ChannelId, Channel] = field(default_factory=dict) @property def sampling_rate(self) -> int: From f9d54d3146a5bf51293b369384f2488af00f07cb Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 22 Aug 2024 16:45:43 +0200 Subject: [PATCH 0821/1006] test: Readapt platform tests to unstructured channel ids --- tests/test_platform.py | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/tests/test_platform.py b/tests/test_platform.py index 4367d2ce59..c300796e6f 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -30,6 +30,22 @@ nshots = 1024 +def test_unroll_sequences(platform: Platform): + qubit = next(iter(platform.qubits.values())) + assert qubit.probe is not None + natives = platform.natives.single_qubit[0] + assert natives.RX is not None + assert natives.MZ is not None + sequence = PulseSequence() + sequence.concatenate(natives.RX.create_sequence()) + sequence.append((qubit.probe, Delay(duration=sequence.duration))) + sequence.concatenate(natives.MZ.create_sequence()) + total_sequence, readouts = unroll_sequences(10 * [sequence], relaxation_time=10000) + assert len(total_sequence.acquisitions) == 10 + assert len(readouts) == 1 + assert all(len(readouts[acq.id]) == 10 for _, acq in sequence.acquisitions) + + def test_create_platform(platform): assert isinstance(platform, Platform) @@ -151,17 +167,17 @@ def test_dump_parameters(platform: Platform, tmp_path: Path): def test_dump_parameters_with_updates(platform: Platform, tmp_path: Path): qubit = next(iter(platform.qubits.values())) - frequency = platform.config(str(qubit.drive.name)).frequency + 1.5e9 - smearing = platform.config(str(qubit.acquisition.name)).smearing + 10 + frequency = platform.config(qubit.drive).frequency + 1.5e9 + smearing = platform.config(qubit.acquisition).smearing + 10 update = { - str(qubit.drive.name): {"frequency": frequency}, - str(qubit.acquisition.name): {"smearing": smearing}, + str(qubit.drive): {"frequency": frequency}, + str(qubit.acquisition): {"smearing": smearing}, } update_configs(platform.parameters.configs, [update]) (tmp_path / PARAMETERS).write_text(platform.parameters.model_dump_json()) final = Parameters.model_validate_json((tmp_path / PARAMETERS).read_text()) - assert final.configs[str(qubit.drive.name)].frequency == frequency - assert final.configs[str(qubit.acquisition.name)].smearing == smearing + assert final.configs[qubit.drive].frequency == frequency + assert final.configs[qubit.acquisition].smearing == smearing def test_kernels(tmp_path: Path): @@ -183,8 +199,8 @@ def test_kernels(tmp_path: Path): ) for qubit in platform.qubits.values(): - orig = platform.parameters.configs[str(qubit.acquisition.name)].kernel - load = reloaded.parameters.configs[str(qubit.acquisition.name)].kernel + orig = platform.parameters.configs[qubit.acquisition].kernel + load = reloaded.parameters.configs[qubit.acquisition].kernel np.testing.assert_array_equal(orig, load) From d133ed97f2b7bb68a86042527aea02a4bad5ad58 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 22 Aug 2024 16:49:16 +0200 Subject: [PATCH 0822/1006] test: Redapt native tests to unstructured channel ids --- tests/test_native.py | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/tests/test_native.py b/tests/test_native.py index 37cae537c7..460dad149f 100644 --- a/tests/test_native.py +++ b/tests/test_native.py @@ -4,7 +4,6 @@ import pytest from pydantic import TypeAdapter -from qibolab.identifier import ChannelId from qibolab.native import FixedSequenceFactory, RxyFactory, TwoQubitNatives from qibolab.pulses import ( Drag, @@ -18,7 +17,7 @@ def test_fixed_sequence_factory(): - seq = PulseSequence.load( + seq = PulseSequence( [ ( "channel_1/probe", @@ -37,7 +36,7 @@ def test_fixed_sequence_factory(): assert fseq1 == seq assert fseq2 == seq - np = ChannelId.load("new/probe") + np = "new/probe" fseq1.append( ( np, @@ -62,7 +61,7 @@ def test_fixed_sequence_factory(): ], ) def test_rxy_rotation_factory(args, amplitude, phase): - seq = PulseSequence.load( + seq = PulseSequence( [ ( "1/drive", @@ -75,17 +74,17 @@ def test_rxy_rotation_factory(args, amplitude, phase): fseq1 = factory.create_sequence(**args) fseq2 = factory.create_sequence(**args) assert fseq1 == fseq2 - np = ChannelId.load("new/probe") + np = "new/probe" fseq2.append((np, Pulse(duration=56, amplitude=0.43, envelope=Rectangular()))) assert np not in fseq1.channels - pulse = next(iter(fseq1.channel(ChannelId.load("1/drive")))) + pulse = next(iter(fseq1.channel("1/drive"))) assert pulse.amplitude == pytest.approx(amplitude) assert pulse.relative_phase == pytest.approx(phase) def test_rxy_factory_multiple_channels(): - seq = PulseSequence.load( + seq = PulseSequence( [ ( "1/drive", @@ -103,7 +102,7 @@ def test_rxy_factory_multiple_channels(): def test_rxy_factory_multiple_pulses(): - seq = PulseSequence.load( + seq = PulseSequence( [ ( "1/drive", @@ -131,13 +130,8 @@ def test_rxy_factory_multiple_pulses(): ], ) def test_rxy_rotation_factory_envelopes(envelope): - seq = PulseSequence.load( - [ - ( - "1/drive", - Pulse(duration=100, amplitude=1.0, envelope=envelope), - ) - ] + seq = PulseSequence( + [("1/drive", Pulse(duration=100, amplitude=1.0, envelope=envelope))] ) if isinstance(envelope, (Gaussian, Drag)): From 7bf242b91642685b438ab911c07d2ce298aace18 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 22 Aug 2024 17:44:40 +0200 Subject: [PATCH 0823/1006] feat: Extend identifiers to states --- src/qibolab/identifier.py | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/qibolab/identifier.py b/src/qibolab/identifier.py index 6a077aa4d2..4db4a35225 100644 --- a/src/qibolab/identifier.py +++ b/src/qibolab/identifier.py @@ -4,7 +4,7 @@ from pydantic import BeforeValidator, Field, PlainSerializer QubitId = Annotated[Union[int, str], Field(union_mode="left_to_right")] -"""Type for qubit names.""" +"""Qubit name.""" QubitPairId = Annotated[ tuple[QubitId, QubitId], @@ -33,3 +33,21 @@ def __str__(self) -> str: ChannelId = str """Unique identifier for a channel.""" + + +StateId = int +"""State identifier.""" + +TransitionId = Annotated[ + tuple[StateId, StateId], + BeforeValidator(lambda p: tuple(p.split("-")) if isinstance(p, str) else p), + PlainSerializer(lambda p: f"{p[0]}-{p[1]}"), +] +"""Identifier for a state transition.""" + +QubitPairId = Annotated[ + tuple[QubitId, QubitId], + BeforeValidator(lambda p: tuple(p.split("-")) if isinstance(p, str) else p), + PlainSerializer(lambda p: f"{p[0]}-{p[1]}"), +] +"""Two-qubit active interaction identifier.""" From 0a002c7961039e2f7f3af0c3c335ab22360cc4b5 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 22 Aug 2024 17:45:07 +0200 Subject: [PATCH 0824/1006] feat: Expose channels from qubits and platform --- src/qibolab/platform/platform.py | 12 ++++++-- src/qibolab/qubits.py | 47 ++++++++++++++++++-------------- 2 files changed, 35 insertions(+), 24 deletions(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index de6942b3be..67e04181a6 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -10,6 +10,7 @@ from qibo.config import log, raise_error from qibolab.components import Config +from qibolab.components.channels import Channel from qibolab.execution_parameters import ExecutionParameters from qibolab.identifier import ChannelId, QubitId, QubitPairId from qibolab.instruments.abstract import Controller, Instrument, InstrumentId @@ -55,7 +56,7 @@ def estimate_duration( def _channels_map(elements: QubitMap) -> dict[ChannelId, QubitId]: """Map channel names to element (qubit or coupler).""" - return {ch.name: id for id, el in elements.items() for ch in el.channels} + return {ch: id for id, el in elements.items() for ch in el.channels} @dataclass @@ -133,9 +134,14 @@ def components(self) -> set[str]: return set(self.parameters.configs.keys()) @property - def channels(self) -> list[ChannelId]: + def channels(self) -> dict[ChannelId, Channel]: """Channels in the platform.""" - return list(self.qubit_channels) + list(self.coupler_channels) + return { + id: ch + for instr in self.instruments.values() + if isinstance(instr, Controller) + for id, ch in instr.channels.items() + } @property def qubit_channels(self) -> dict[ChannelId, QubitId]: diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index 232fac002e..fc12367e73 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -1,10 +1,8 @@ -from collections.abc import Iterable from typing import Optional -from pydantic import ConfigDict +from pydantic import ConfigDict, Field -from .components.channels import Channel -from .identifier import ChannelId, ChannelType, QubitId +from .identifier import ChannelId, TransitionId from .serialize import Model @@ -13,28 +11,35 @@ class Qubit(Model): Qubit objects are instantiated by :class:`qibolab.platforms.platform.Platform` but they are passed to instrument designs in order to play pulses. - - Args: - name (int, str): Qubit number or name. - readout (:class:`qibolab.platforms.utils.Channel`): Channel used to - readout pulses to the qubit. - drive (:class:`qibolab.platforms.utils.Channel`): Channel used to - send drive pulses to the qubit. - flux (:class:`qibolab.platforms.utils.Channel`): Channel used to - send flux pulses to the qubit. """ model_config = ConfigDict(frozen=False) - probe: Optional[ChannelId] = None - acquisition: Optional[ChannelId] = None drive: Optional[ChannelId] = None - drive_qudits: Optional[dict[str, ChannelId]] = None + """Ouput channel, to drive the qubit state.""" + drive_qudits: dict[TransitionId, ChannelId] = Field(default_factory=dict) + """Output channels collection, to drive non-qubit transitions.""" flux: Optional[ChannelId] = None + """Output channel, to control the qubit flux.""" + probe: Optional[ChannelId] = None + """Output channel, to probe the resonator.""" + acquisition: Optional[ChannelId] = None + """Input channel, to acquire the readout results.""" @property - def channels(self) -> Iterable[Channel]: - for ct in ChannelType: - channel = getattr(self, ct.value) - if channel is not None: - yield channel + def channels(self) -> list[ChannelId]: + return [ + x + for x in ( + [getattr(self, ch) for ch in ["probe", "acquisition", "drive", "flux"]] + + list(self.drive_qudits.values()) + ) + if x is not None + ] + + +class QubitPair(Model): + """Represent a two-qubit interaction.""" + + drive: Optional[ChannelId] = None + """Output channel, for cross-resonance driving.""" From 0fe93b657a258846ca9e4c45fdf5903f61e9ec3c Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 22 Aug 2024 17:45:34 +0200 Subject: [PATCH 0825/1006] fix: Fix identifiers imports --- src/qibolab/compilers/compiler.py | 3 +-- src/qibolab/dummy/platform.py | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/qibolab/compilers/compiler.py b/src/qibolab/compilers/compiler.py index a5ae62085b..fc5b797412 100644 --- a/src/qibolab/compilers/compiler.py +++ b/src/qibolab/compilers/compiler.py @@ -15,10 +15,9 @@ rz_rule, z_rule, ) -from qibolab.identifier import ChannelId +from qibolab.identifier import ChannelId, QubitId from qibolab.platform import Platform from qibolab.pulses import Delay -from qibolab.qubits import QubitId from qibolab.sequence import PulseSequence Rule = Callable[..., PulseSequence] diff --git a/src/qibolab/dummy/platform.py b/src/qibolab/dummy/platform.py index b4286a840d..d453338399 100644 --- a/src/qibolab/dummy/platform.py +++ b/src/qibolab/dummy/platform.py @@ -35,7 +35,7 @@ def create_dummy() -> Platform: probe=probe, acquisition=acquisition, drive=drive, - drive_qudits={"1-2": f"qubit_{q}/flux"}, + drive_qudits={(1, 2): f"qubit_{q}/flux"}, flux=flux, ) From c3737fdfa9eb68d6b6f5e35aa9e82aa307310442 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 22 Aug 2024 18:04:53 +0200 Subject: [PATCH 0826/1006] feat: Change qubit retrieval from platform To also expose translated names, not present any longer in the qubit object --- src/qibolab/compilers/compiler.py | 26 ++++++++++++-------------- src/qibolab/compilers/default.py | 6 +++--- src/qibolab/platform/platform.py | 28 ++++++++++++++-------------- tests/test_backends.py | 16 ++++++++-------- 4 files changed, 37 insertions(+), 39 deletions(-) diff --git a/src/qibolab/compilers/compiler.py b/src/qibolab/compilers/compiler.py index fc5b797412..20b3ddd152 100644 --- a/src/qibolab/compilers/compiler.py +++ b/src/qibolab/compilers/compiler.py @@ -96,25 +96,23 @@ def get_sequence(self, gate: gates.Gate, platform: Platform) -> PulseSequence: natives = platform.natives if isinstance(gate, (gates.M)): - qubits = [ - natives.single_qubit[platform.get_qubit(q).name] for q in gate.qubits - ] + qubits = [natives.single_qubit[platform.qubit(q)[0]] for q in gate.qubits] return rule(gate, qubits) if isinstance(gate, (gates.Align)): - qubits = [platform.get_qubit(q) for q in gate.qubits] + qubits = [platform.qubit(q)[1] for q in gate.qubits] return rule(gate, qubits) if isinstance(gate, (gates.Z, gates.RZ)): - qubit = platform.get_qubit(gate.target_qubits[0]) + qubit = platform.qubit(gate.target_qubits[0])[1] return rule(gate, qubit) if len(gate.qubits) == 1: - qubit = platform.get_qubit(gate.target_qubits[0]) - return rule(gate, natives.single_qubit[qubit.name]) + qubit = platform.qubit(gate.target_qubits[0])[0] + return rule(gate, natives.single_qubit[qubit]) if len(gate.qubits) == 2: - pair = tuple(platform.get_qubit(q).name for q in gate.qubits) + pair = tuple(platform.qubit(q)[0] for q in gate.qubits) assert len(pair) == 2 return rule(gate, natives.two_qubit[pair]) @@ -127,10 +125,10 @@ def _compile_gate( channel_clock: defaultdict[ChannelId, float], ) -> PulseSequence: def qubit_clock(el: QubitId): - return max(channel_clock[ch.name] for ch in platform.qubits[el].channels) + return max(channel_clock[ch] for ch in platform.qubits[el].channels) def coupler_clock(el: QubitId): - return max(channel_clock[ch.name] for ch in platform.couplers[el].channels) + return max(channel_clock[ch] for ch in platform.couplers[el].channels) gate_seq = self.get_sequence(gate, platform) # qubits receiving pulses @@ -163,14 +161,14 @@ def coupler_clock(el: QubitId): end = start + gate_seq.duration final = PulseSequence() for q in gate.qubits: - qubit = platform.get_qubit(q) + qubit = platform.qubit(q)[1] # all actual qubits have a non-null drive channel, and couplers are not # explicitedly listed in gates assert qubit.drive is not None - delay = end - channel_clock[qubit.drive.name] + delay = end - channel_clock[qubit.drive] if delay > 0: - final.append((qubit.drive.name, Delay(duration=delay))) - channel_clock[qubit.drive.name] += delay + final.append((qubit.drive, Delay(duration=delay))) + channel_clock[qubit.drive] += delay # couplers do not require individual padding, because they do are only # involved in gates where both of the other qubits are involved diff --git a/src/qibolab/compilers/default.py b/src/qibolab/compilers/default.py index 89824cfa4f..d9e5aaa5ea 100644 --- a/src/qibolab/compilers/default.py +++ b/src/qibolab/compilers/default.py @@ -16,12 +16,12 @@ def z_rule(gate: Gate, qubit: Qubit) -> PulseSequence: """Z gate applied virtually.""" - return PulseSequence([(qubit.drive.name, VirtualZ(phase=math.pi))]) + return PulseSequence([(qubit.drive, VirtualZ(phase=math.pi))]) def rz_rule(gate: Gate, qubit: Qubit) -> PulseSequence: """RZ gate applied virtually.""" - return PulseSequence([(qubit.drive.name, VirtualZ(phase=gate.parameters[0]))]) + return PulseSequence([(qubit.drive, VirtualZ(phase=gate.parameters[0]))]) def identity_rule(gate: Gate, natives: SingleQubitNatives) -> PulseSequence: @@ -71,5 +71,5 @@ def align_rule(gate: Align, qubits: list[Qubit]) -> PulseSequence: if delay == 0.0: return PulseSequence() return PulseSequence( - [(ch.name, Delay(duration=delay)) for qubit in qubits for ch in qubit.channels] + [(ch, Delay(duration=delay)) for qubit in qubits for ch in qubit.channels] ) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 67e04181a6..173ce708aa 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -308,26 +308,26 @@ def dump(self, path: Path): """Dump platform.""" (path / PARAMETERS).write_text(self.parameters.model_dump_json(indent=4)) - def get_qubit(self, qubit: QubitId) -> Qubit: - """Return the name of the physical qubit corresponding to a logical - qubit. + def _element(self, qubit: QubitId, coupler=False) -> tuple[QubitId, Qubit]: + elements = self.qubits if not coupler else self.couplers + try: + return qubit, elements[qubit] + except KeyError: + assert isinstance(qubit, int) + return list(self.qubits.items())[qubit] + + def qubit(self, qubit: QubitId) -> tuple[QubitId, Qubit]: + """Retrieve physical qubit name and object. Temporary fix for the compiler to work for platforms where the qubits are not named as 0, 1, 2, ... """ - try: - return self.qubits[qubit] - except KeyError: - return list(self.qubits.values())[qubit] + return self._element(qubit) - def get_coupler(self, coupler: QubitId) -> Qubit: - """Return the name of the physical coupler corresponding to a logical - coupler. + def coupler(self, coupler: QubitId) -> tuple[QubitId, Qubit]: + """Retrieve physical coupler name and object. Temporary fix for the compiler to work for platforms where the couplers are not named as 0, 1, 2, ... """ - try: - return self.couplers[coupler] - except KeyError: - return list(self.couplers.values())[coupler] + return self._element(coupler, coupler=True) diff --git a/tests/test_backends.py b/tests/test_backends.py index 48e82905d5..fde4ff4181 100644 --- a/tests/test_backends.py +++ b/tests/test_backends.py @@ -9,6 +9,7 @@ from qibolab import MetaBackend, create_platform from qibolab.backends import QibolabBackend +from qibolab.platform.platform import Platform def generate_circuit_with_gate(nqubits, gate, **kwargs): @@ -108,7 +109,6 @@ def dummy_string_qubit_names(): platform = create_platform("dummy") for q, qubit in platform.qubits.copy().items(): name = f"A{q}" - qubit.name = name platform.qubits[name] = qubit del platform.qubits[q] platform.natives.single_qubit[name] = platform.natives.single_qubit[q] @@ -141,7 +141,7 @@ def test_execute_circuit_str_qubit_names(): @pytest.mark.xfail( raises=AssertionError, reason="Probabilities are not well calibrated" ) -def test_ground_state_probabilities_circuit(connected_backend): +def test_ground_state_probabilities_circuit(connected_backend: QibolabBackend): nshots = 5000 nqubits = connected_backend.platform.nqubits circuit = Circuit(nqubits) @@ -159,7 +159,7 @@ def test_ground_state_probabilities_circuit(connected_backend): @pytest.mark.xfail( raises=AssertionError, reason="Probabilities are not well calibrated" ) -def test_excited_state_probabilities_circuit(connected_backend): +def test_excited_state_probabilities_circuit(connected_backend: QibolabBackend): nshots = 5000 nqubits = connected_backend.platform.nqubits circuit = Circuit(nqubits) @@ -178,7 +178,7 @@ def test_excited_state_probabilities_circuit(connected_backend): @pytest.mark.xfail( raises=AssertionError, reason="Probabilities are not well calibrated" ) -def test_superposition_for_all_qubits(connected_backend): +def test_superposition_for_all_qubits(connected_backend: QibolabBackend): """Applies an H gate to each qubit of the circuit and measures the probabilities.""" nshots = 5000 @@ -205,20 +205,20 @@ def test_superposition_for_all_qubits(connected_backend): # TODO: test_circuit_result_representation -def test_metabackend_load(platform): +def test_metabackend_load(platform: Platform): backend = MetaBackend.load(platform.name) assert isinstance(backend, QibolabBackend) assert backend.platform.name == platform.name -def test_metabackend_list_available(tmpdir): +def test_metabackend_list_available(tmp_path: Path): for platform in ( "valid_platform/platform.py", "invalid_platform/invalid_platform.py", ): - path = Path(tmpdir / platform) + path = tmp_path / platform path.parent.mkdir(parents=True, exist_ok=True) path.touch() - os.environ["QIBOLAB_PLATFORMS"] = str(tmpdir) + os.environ["QIBOLAB_PLATFORMS"] = str(tmp_path) available_platforms = {"valid_platform": True} assert MetaBackend().list_available() == available_platforms From 4b6d38822015d2a6f314ae0fc75e5902fc5d108d Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 22 Aug 2024 18:23:09 +0200 Subject: [PATCH 0827/1006] fix: Fix leftover in dummy platform definition --- src/qibolab/dummy/platform.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibolab/dummy/platform.py b/src/qibolab/dummy/platform.py index d453338399..068ff4dc6a 100644 --- a/src/qibolab/dummy/platform.py +++ b/src/qibolab/dummy/platform.py @@ -35,7 +35,7 @@ def create_dummy() -> Platform: probe=probe, acquisition=acquisition, drive=drive, - drive_qudits={(1, 2): f"qubit_{q}/flux"}, + drive_qudits={(1, 2): drive12}, flux=flux, ) From aa3279d2fe6e8f8c584f1a2fcfb9c6642d06419d Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 22 Aug 2024 18:24:30 +0200 Subject: [PATCH 0828/1006] test: Readapt compilation tests to new qubits and channel ids --- tests/test_compilers_default.py | 57 +++++++++++++++------------------ 1 file changed, 26 insertions(+), 31 deletions(-) diff --git a/tests/test_compilers_default.py b/tests/test_compilers_default.py index 4ba4e2b821..f65e951295 100644 --- a/tests/test_compilers_default.py +++ b/tests/test_compilers_default.py @@ -6,16 +6,15 @@ from qibolab import create_platform from qibolab.compilers import Compiler -from qibolab.identifier import ChannelId, ChannelType +from qibolab.identifier import ChannelId from qibolab.native import FixedSequenceFactory, TwoQubitNatives from qibolab.platform import Platform -from qibolab.pulses import Delay +from qibolab.pulses import Delay, Pulse from qibolab.pulses.envelope import Rectangular -from qibolab.pulses.pulse import Pulse from qibolab.sequence import PulseSequence -def generate_circuit_with_gate(nqubits, gate, *params, **kwargs): +def generate_circuit_with_gate(nqubits: int, gate, *params, **kwargs): circuit = Circuit(nqubits) circuit.add(gate(q, *params, **kwargs) for q in range(nqubits)) circuit.add(gates.M(*range(nqubits))) @@ -35,7 +34,7 @@ def test_u3_sim_agreement(): np.testing.assert_allclose(u3_matrix, target_matrix) -def compile_circuit(circuit, platform) -> PulseSequence: +def compile_circuit(circuit: Circuit, platform: Platform) -> PulseSequence: """Compile a circuit to a pulse sequence.""" compiler = Compiler.default() return compiler.compile(circuit, platform)[0] @@ -51,14 +50,14 @@ def compile_circuit(circuit, platform) -> PulseSequence: (gates.RZ, np.pi / 4), ], ) -def test_compile(platform, gateargs): +def test_compile(platform: Platform, gateargs): nqubits = platform.nqubits circuit = generate_circuit_with_gate(nqubits, *gateargs) sequence = compile_circuit(circuit, platform) assert len(sequence.channels) == nqubits * int(gateargs[0] != gates.I) + nqubits * 2 -def test_compile_two_gates(platform): +def test_compile_two_gates(platform: Platform): circuit = Circuit(1) circuit.add(gates.GPI2(0, phi=0.1)) circuit.add(gates.GPI(0, 0.2)) @@ -68,11 +67,11 @@ def test_compile_two_gates(platform): qubit = platform.qubits[0] assert len(sequence.channels) == 3 - assert len(list(sequence.channel(qubit.drive.name))) == 2 - assert len(list(sequence.channel(qubit.probe.name))) == 2 # includes delay + assert len(list(sequence.channel(qubit.drive))) == 2 + assert len(list(sequence.channel(qubit.probe))) == 2 # includes delay -def test_measurement(platform): +def test_measurement(platform: Platform): nqubits = platform.nqubits circuit = Circuit(nqubits) qubits = [qubit for qubit in range(nqubits)] @@ -83,7 +82,7 @@ def test_measurement(platform): assert len(sequence.acquisitions) == 1 * nqubits -def test_rz_to_sequence(platform): +def test_rz_to_sequence(platform: Platform): circuit = Circuit(1) circuit.add(gates.RZ(0, theta=0.2)) circuit.add(gates.Z(0)) @@ -105,7 +104,7 @@ def test_gpi_to_sequence(platform: Platform): np.testing.assert_allclose(sequence.duration, rx_seq.duration) -def test_gpi2_to_sequence(platform): +def test_gpi2_to_sequence(platform: Platform): natives = platform.natives circuit = Circuit(1) @@ -154,14 +153,14 @@ def test_add_measurement_to_sequence(platform: Platform): sequence = compile_circuit(circuit, platform) qubit = platform.qubits[0] assert len(sequence.channels) == 3 - assert len(list(sequence.channel(qubit.drive.name))) == 2 - assert len(list(sequence.channel(qubit.probe.name))) == 2 # include delay + assert len(list(sequence.channel(qubit.drive))) == 2 + assert len(list(sequence.channel(qubit.probe))) == 2 # include delay s = PulseSequence() s.concatenate(natives.single_qubit[0].RX.create_sequence(theta=np.pi / 2, phi=0.1)) s.concatenate(natives.single_qubit[0].RX.create_sequence(theta=np.pi / 2, phi=0.2)) - s.append((qubit.probe.name, Delay(duration=s.duration))) - s.append((qubit.acquisition.name, Delay(duration=s.duration))) + s.append((qubit.probe, Delay(duration=s.duration))) + s.append((qubit.acquisition, Delay(duration=s.duration))) s.concatenate(natives.single_qubit[0].MZ.create_sequence()) # the delay sorting depends on PulseSequence.channels, which is a set, and it's @@ -187,7 +186,7 @@ def test_align_delay_measurement(platform: Platform, delay): target_sequence = PulseSequence() if delay > 0: - target_sequence.append((platform.qubits[0].probe.name, Delay(duration=delay))) + target_sequence.append((platform.qubits[0].probe, Delay(duration=delay))) target_sequence.concatenate(natives.single_qubit[0].MZ.create_sequence()) assert sequence == target_sequence assert len(sequence.acquisitions) == 1 @@ -201,9 +200,9 @@ def test_align_multiqubit(platform: Platform): circuit.add(gates.M(main, coupled)) sequence = compile_circuit(circuit, platform) - flux_duration = sequence.channel_duration(ChannelId.load(f"qubit_{coupled}/flux")) + flux_duration = sequence.channel_duration(f"qubit_{coupled}/flux") for q in (main, coupled): - probe_delay = next(iter(sequence.channel(ChannelId.load(f"qubit_{q}/probe")))) + probe_delay = next(iter(sequence.channel(f"qubit_{q}/probe"))) assert isinstance(probe_delay, Delay) assert flux_duration == probe_delay.duration @@ -228,12 +227,12 @@ def test_inactive_qubits(platform: Platform, joint: bool): natives.CZ.clear() sequence = compile_circuit(circuit, platform) + qm = platform.qubit(main)[1] + qc = platform.qubit(coupled)[1] + readouts = {qm.probe, qm.acquisition, qc.probe, qc.acquisition} + def no_measurement(seq: PulseSequence): - return [ - el - for el in seq - if el[0].channel_type not in (ChannelType.PROBE, ChannelType.ACQUISITION) - ] + return [el for el in seq if el[0] not in readouts] assert len(no_measurement(sequence)) == 1 @@ -252,12 +251,9 @@ def no_measurement(seq: PulseSequence): ) padded_seq = compile_circuit(circuit, platform) assert len(no_measurement(padded_seq)) == 3 - cdrive_delay = next(iter(padded_seq.channel(ChannelId.load(cdrive)))) + cdrive_delay = next(iter(padded_seq.channel(cdrive))) assert isinstance(cdrive_delay, Delay) - assert ( - cdrive_delay.duration - == next(iter(padded_seq.channel(ChannelId.load(mflux)))).duration - ) + assert cdrive_delay.duration == next(iter(padded_seq.channel(mflux))).duration def test_joint_split_equivalence(platform: Platform): @@ -297,5 +293,4 @@ def test_joint_split_equivalence(platform: Platform): "qubit_0/probe", "qubit_2/probe", ): - chid = ChannelId.load(ch) - assert list(joint_seq.channel(chid)) == list(split_seq.channel(chid)) + assert list(joint_seq.channel(ch)) == list(split_seq.channel(ch)) From 89db8bbbaded446d6977c657861f74e992d157e5 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 22 Aug 2024 18:37:02 +0200 Subject: [PATCH 0829/1006] fix: Approximate fix of few pylint errors Due to the instruments transition to pydantic --- src/qibolab/instruments/bluefors.py | 19 ++++++++----------- src/qibolab/instruments/erasynth.py | 8 ++++++-- src/qibolab/instruments/qm/controller.py | 15 ++++++--------- src/qibolab/instruments/zhinst/executor.py | 2 +- 4 files changed, 21 insertions(+), 23 deletions(-) diff --git a/src/qibolab/instruments/bluefors.py b/src/qibolab/instruments/bluefors.py index b38442ca46..b92ddc6fd6 100644 --- a/src/qibolab/instruments/bluefors.py +++ b/src/qibolab/instruments/bluefors.py @@ -1,6 +1,7 @@ import socket import yaml +from pydantic import Field from qibo.config import log from qibolab.instruments.abstract import Instrument @@ -19,17 +20,13 @@ class TemperatureController(Instrument): print(temperature_value) """ - def __init__(self, name: str, address: str, port: int = 8888): - """Creation of the controller object. - - Args: - name (str): name of the instrument. - address (str): IP address of the board sending cryo temperature data. - port (int): port of the board sending cryo temperature data. - """ - super().__init__(name, address) - self.port = port - self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + address: str + """IP address of the board sending cryo temperature data.""" + port: int = 8888 + """Port of the board sending cryo temperature data.""" + client_socket: socket.socket = Field( + default_factory=lambda: socket.socket(socket.AF_INET, socket.SOCK_STREAM) + ) def connect(self): """Connect to the socket.""" diff --git a/src/qibolab/instruments/erasynth.py b/src/qibolab/instruments/erasynth.py index 9f4b136527..7bf88dc9f0 100644 --- a/src/qibolab/instruments/erasynth.py +++ b/src/qibolab/instruments/erasynth.py @@ -4,7 +4,7 @@ from qcodes_contrib_drivers.drivers.ERAInstruments import ERASynthPlusPlus from qibo.config import log -from qibolab.instruments.oscillator import LocalOscillator +from qibolab.instruments.oscillator import LocalOscillator, LocalOscillatorSettings RECONNECTION_ATTEMPTS = 10 """Number of times to attempt sending requests to the web server in case of @@ -128,7 +128,11 @@ class ERA(LocalOscillator): """ def __init__(self, name, address, ethernet=True, ref_osc_source=None): - super().__init__(name, address, ref_osc_source) + super().__init__( + name=name, + address=address, + settings=LocalOscillatorSettings(ref_osc_source=ref_osc_source), + ) self.ethernet = ethernet def create(self): diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 8d536ee3c6..4168cde59c 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -2,10 +2,11 @@ import tempfile import warnings from collections import defaultdict -from dataclasses import asdict, dataclass, field +from dataclasses import asdict, dataclass from pathlib import Path from typing import Optional +from pydantic import Field from qm import QuantumMachinesManager, SimulationConfig, generate_qua_script from qm.octave import QmOctaveConfig from qm.simulate.credentials import create_credentials @@ -107,7 +108,6 @@ def find_sweepers( return [s for ps in sweepers for s in ps if s.parameter is parameter] -@dataclass class QmController(Controller): """:class:`qibolab.instruments.abstract.Controller` object for controlling a Quantum Machines cluster. @@ -133,7 +133,7 @@ class QmController(Controller): """Dictionary containing the :class:`qibolab.instruments.qm.controller.Octave` instruments being used.""" - channels: dict[str, QmChannel] + channels: dict[ChannelId, QmChannel] bounds: str = "qm/bounds" """Maximum bounds used for batching in sequence unrolling.""" @@ -160,7 +160,7 @@ class QmController(Controller): is_connected: bool = False """Boolean that shows whether we are connected to the QM manager.""" - config: QmConfig = field(default_factory=QmConfig) + config: QmConfig = Field(default_factory=QmConfig) """Configuration dictionary required for pulse execution on the OPXs.""" simulation_duration: Optional[int] = None @@ -179,12 +179,9 @@ class QmController(Controller): Default is ``False``. """ - def __post_init__(self): - super().__init__(self.name, self.address) + def model_post_init(self, __context): # convert ``channels`` from list to dict - self.channels = { - str(channel.logical_channel.name): channel for channel in self.channels - } + self.channels = {channel.logical_channel: channel for channel in self.channels} if self.simulation_duration is not None: # convert simulation duration from ns to clock cycles diff --git a/src/qibolab/instruments/zhinst/executor.py b/src/qibolab/instruments/zhinst/executor.py index ede3c5dcdc..afb14bf227 100644 --- a/src/qibolab/instruments/zhinst/executor.py +++ b/src/qibolab/instruments/zhinst/executor.py @@ -56,7 +56,7 @@ def __init__( time_of_flight=0.0, smearing=0.0, ): - super().__init__(name, None) + super().__init__(name=name, address=None) self.signal_map = {} "Signals to lines mapping" From 2620f92e6a02033ea5a369a953dac5e842ebe7f1 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 22 Aug 2024 18:54:14 +0200 Subject: [PATCH 0830/1006] fix: Rename readout import in qm --- src/qibolab/instruments/qm/controller.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 4168cde59c..1feeaf1b0a 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -16,7 +16,7 @@ from qibolab.execution_parameters import ExecutionParameters from qibolab.identifier import ChannelId from qibolab.instruments.abstract import Controller -from qibolab.pulses.pulse import Acquisition, Align, Delay, Pulse, _Readout +from qibolab.pulses import Acquisition, Align, Delay, Pulse, Readout from qibolab.sequence import PulseSequence from qibolab.sweeper import ParallelSweepers, Parameter, Sweeper from qibolab.unrolling import Bounds, unroll_sequences @@ -364,7 +364,7 @@ def register_acquisitions( """ acquisitions = {} for channel_id, readout in sequence.as_readouts: - if not isinstance(readout, _Readout): + if not isinstance(readout, Readout): continue if readout.probe.duration != readout.acquisition.duration: From 18dba163d1255399f893ce60f9a112fa79ccf120 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 22 Aug 2024 18:54:37 +0200 Subject: [PATCH 0831/1006] feat!: Drop acquisition attribute in probe channels --- src/qibolab/components/channels.py | 7 ------- src/qibolab/dummy/platform.py | 2 +- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/src/qibolab/components/channels.py b/src/qibolab/components/channels.py index e385ad57fa..e791c43e48 100644 --- a/src/qibolab/components/channels.py +++ b/src/qibolab/components/channels.py @@ -47,13 +47,6 @@ class IqChannel(Channel): None, if the channel does not have an LO, or it is not configurable. """ - acquisition: Optional[str] = None - """In case self is a readout channel this shall contain the name of the - corresponding acquire channel. - - FIXME: This is temporary solution to be able to generate acquisition commands on correct channel in drivers, - until we make acquire channels completely independent, and users start putting explicit acquisition commands in pulse sequence. - """ class AcquireChannel(Channel): diff --git a/src/qibolab/dummy/platform.py b/src/qibolab/dummy/platform.py index 068ff4dc6a..f226cbadde 100644 --- a/src/qibolab/dummy/platform.py +++ b/src/qibolab/dummy/platform.py @@ -25,7 +25,7 @@ def create_dummy() -> Platform: f"qubit_{q}/acquisition", ) instrument.channels |= { - probe: IqChannel(mixer=None, lo=None, acquisition=acquisition), + probe: IqChannel(mixer=None, lo=None), acquisition: AcquireChannel(twpa_pump=pump.name, probe=probe), drive: IqChannel(mixer=None, lo=None), drive12: IqChannel(mixer=None, lo=None), From 805e492e0b5a7e68f27952935ed199e18a5a2aa1 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 23 Aug 2024 14:54:57 +0200 Subject: [PATCH 0832/1006] docs: Add usual imports in Sphinx configurations, to solve Pydantic conflicts --- doc/source/conf.py | 2 ++ doc/source/tutorials/calibration.rst | 14 +++++++------- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/doc/source/conf.py b/doc/source/conf.py index 3e292c9150..d013ba3b06 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -21,6 +21,8 @@ # TODO: the following is a workaround for Sphinx doctest, cf. # - https://github.com/qiboteam/qibolab/commit/e04a6ab # - https://github.com/pydantic/pydantic/discussions/7763 +import qibolab.instruments.dummy +import qibolab.instruments.oscillator import qibolab.instruments.zhinst # -- Project information ----------------------------------------------------- diff --git a/doc/source/tutorials/calibration.rst b/doc/source/tutorials/calibration.rst index 575fff15b0..d55defa4dd 100644 --- a/doc/source/tutorials/calibration.rst +++ b/doc/source/tutorials/calibration.rst @@ -51,7 +51,7 @@ around the pre-defined frequency. sweeper = Sweeper( parameter=Parameter.frequency, range=(f0 - 2e8, f0 + 2e8, 1e6), - channels=[qubit.probe.name], + channels=[qubit.probe], ) We then define the execution parameters and launch the experiment. @@ -75,7 +75,7 @@ In few seconds, the experiment will be finished and we can proceed to plot it. acq = sequence.acquisitions[0][1] amplitudes = magnitude(results[acq.id][0]) - frequencies = sweeper.values + frequencies = np.arange(-2e8, +2e8, 1e6) + platform.config(qubit.probe).frequency plt.title("Resonator Spectroscopy") plt.xlabel("Frequencies [Hz]") @@ -132,10 +132,10 @@ complex pulse sequence. Therefore with start with that: sequence = PulseSequence( [ ( - qubit.drive.name, + qubit.drive, Pulse(duration=2000, amplitude=0.01, envelope=Gaussian(rel_sigma=5)), ), - (qubit.probe.name, Delay(duration=sequence.duration)), + (qubit.probe, Delay(duration=sequence.duration)), ] ) sequence.concatenate(natives.MZ.create_sequence()) @@ -145,7 +145,7 @@ complex pulse sequence. Therefore with start with that: sweeper = Sweeper( parameter=Parameter.frequency, range=(f0 - 2e8, f0 + 2e8, 1e6), - channels=[qubit.drive.name], + channels=[qubit.drive], ) Note that the drive pulse has been changed to match the characteristics required @@ -166,7 +166,7 @@ We can now proceed to launch on hardware: _, acq = next(iter(sequence.acquisitions)) amplitudes = magnitude(results[acq.id][0]) - frequencies = sweeper.values + frequencies = np.arange(-2e8, +2e8, 1e6) + platform.config(qubit.drive).frequency plt.title("Resonator Spectroscopy") plt.xlabel("Frequencies [Hz]") @@ -235,7 +235,7 @@ and its impact on qubit states in the IQ plane. # create pulse sequence 1 and add pulses one_sequence = PulseSequence() one_sequence.concatenate(natives.RX.create_sequence()) - one_sequence.append((qubit.probe.name, Delay(duration=one_sequence.duration))) + one_sequence.append((qubit.probe, Delay(duration=one_sequence.duration))) one_sequence.concatenate(natives.MZ.create_sequence()) # create pulse sequence 2 and add pulses From 48f19dd3b956eb6edc2f7cd50e57935f5890e0c1 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 23 Aug 2024 15:02:46 +0200 Subject: [PATCH 0833/1006] docs: Propagate channel id update to documentation --- doc/source/getting-started/experiment.rst | 6 ++--- doc/source/main-documentation/qibolab.rst | 31 ++++++++++++----------- src/qibolab/platform/platform.py | 2 +- src/qibolab/sweeper.py | 2 +- 4 files changed, 21 insertions(+), 20 deletions(-) diff --git a/doc/source/getting-started/experiment.rst b/doc/source/getting-started/experiment.rst index 9370ef710b..b9621107d1 100644 --- a/doc/source/getting-started/experiment.rst +++ b/doc/source/getting-started/experiment.rst @@ -82,7 +82,7 @@ In this example, the qubit is controlled by a Zurich Instruments' SHFQC instrume return Platform( name=NAME, runcard=runcard, - instruments={controller.name: controller}, + instruments={controller: controller}, resonator_type="3D", ) @@ -225,7 +225,7 @@ We leave to the dedicated tutorial a full explanation of the experiment, but her sweeper = Sweeper( parameter=Parameter.frequency, range=(f0 - 2e8, f0 + 2e8, 1e6), - channels=[qubit.probe.name], + channels=[qubit.probe], ) # perform the experiment using specific options @@ -241,7 +241,7 @@ We leave to the dedicated tutorial a full explanation of the experiment, but her # plot the results amplitudes = magnitude(results[acq.id][0]) - frequencies = sweeper.values + frequencies = np.arange(-2e8, +2e8, 1e6) + platform.config(qubit.probe).frequency plt.title("Resonator Spectroscopy") plt.xlabel("Frequencies [Hz]") diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index b72361b553..6ccc4bee95 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -40,15 +40,16 @@ We can easily access the names of channels and other components, and based on th .. testcode:: python - drive_channel = platform.qubits[0].drive - print(f"Drive channel name: {drive_channel.name}") - print(f"Drive frequency: {platform.config(str(drive_channel.name)).frequency}") + drive_channel_id = platform.qubits[0].drive + drive_channel = platform.channels[drive_channel_id] + print(f"Drive channel name: {drive_channel_id}") + print(f"Drive frequency: {platform.config(drive_channel_id).frequency}") drive_lo = drive_channel.lo if drive_lo is None: - print(f"Drive channel {drive_channel.name} does not use an LO.") + print(f"Drive channel {drive_channel_id} does not use an LO.") else: - print(f"Name of LO for channel {drive_channel.name} is {drive_lo}") + print(f"Name of LO for channel {drive_channel_id} is {drive_lo}") print(f"LO frequency: {platform.config(str(drive_lo)).frequency}") .. testoutput:: python @@ -71,7 +72,7 @@ Now we can create a simple sequence (again, without explicitly giving any qubit natives = platform.natives.single_qubit[0] ps.concatenate(natives.RX.create_sequence()) ps.concatenate(natives.RX.create_sequence(phi=np.pi / 2)) - ps.append((qubit.probe.name, Delay(duration=200))) + ps.append((qubit.probe, Delay(duration=200))) ps.concatenate(natives.MZ.create_sequence()) Now we can execute the sequence on hardware: @@ -316,7 +317,7 @@ Typical experiments may include both pre-defined pulses and new ones: sequence.concatenate(natives.RX.create_sequence()) sequence.append( ( - ChannelId.load("some/drive"), + "some/drive", Pulse(duration=10, amplitude=0.5, relative_phase=0, envelope=Rectangular()), ) ) @@ -399,9 +400,9 @@ A tipical resonator spectroscopy experiment could be defined with: sweepers = [ Sweeper( parameter=Parameter.frequency, - values=platform.config(str(qubit.probe.name)).frequency + values=platform.config(qubit.probe).frequency + np.arange(-200_000, +200_000, 1), # define an interval of swept values - channels=[qubit.probe.name], + channels=[qubit.probe], ) for qubit in platform.qubits.values() ] @@ -429,19 +430,19 @@ For example: natives = platform.natives.single_qubit[0] sequence = PulseSequence() sequence.concatenate(natives.RX.create_sequence()) - sequence.append((qubit.probe.name, Delay(duration=sequence.duration))) + sequence.append((qubit.probe, Delay(duration=sequence.duration))) sequence.concatenate(natives.MZ.create_sequence()) f0 = platform.config(str(qubit.drive.name)).frequency sweeper_freq = Sweeper( parameter=Parameter.frequency, range=(f0 - 100_000, f0 + 100_000, 10_000), - channels=[qubit.drive.name], + channels=[qubit.drive], ) sweeper_amp = Sweeper( parameter=Parameter.amplitude, range=(0, 0.43, 0.3), - pulses=[next(iter(sequence.channel(qubit.drive.name)))], + pulses=[next(iter(sequence.channel(qubit.drive)))], ) results = platform.execute([sequence], options, [[sweeper_freq], [sweeper_amp]]) @@ -526,7 +527,7 @@ Let's now delve into a typical use case for result objects within the qibolab fr sequence = PulseSequence() sequence.concatenate(natives.RX.create_sequence()) - sequence.append((qubit.probe.name, Delay(duration=sequence.duration))) + sequence.append((qubit.probe, Delay(duration=sequence.duration))) sequence.concatenate(natives.MZ.create_sequence()) options = ExecutionParameters( @@ -554,12 +555,12 @@ The shape of the values of an integreted acquisition with 2 sweepers will be: sweeper1 = Sweeper( parameter=Parameter.frequency, range=(f0 - 100_000, f0 + 100_000, 1), - channels=[qubit.drive.name], + channels=[qubit.drive], ) sweeper2 = Sweeper( parameter=Parameter.frequency, range=(f0 - 200_000, f0 + 200_000, 1), - channels=[qubit.probe.name], + channels=[qubit.probe], ) shape = (options.nshots, len(sweeper1.values), len(sweeper2.values)) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 173ce708aa..f35ac34bf4 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -246,7 +246,7 @@ def execute( Sweeper( parameter=Parameter.frequency, values=parameter_range, - channels=[qubit.probe.name], + channels=[qubit.probe], ) ] platform.execute([sequence], ExecutionParameters(), [sweeper]) diff --git a/src/qibolab/sweeper.py b/src/qibolab/sweeper.py index 20587e806d..96cd0696d0 100644 --- a/src/qibolab/sweeper.py +++ b/src/qibolab/sweeper.py @@ -64,7 +64,7 @@ class Sweeper(Model): sequence = natives.MZ.create_sequence() parameter_range = np.random.randint(10, size=10) sweeper = Sweeper( - parameter=Parameter.frequency, values=parameter_range, channels=[qubit.probe.name] + parameter=Parameter.frequency, values=parameter_range, channels=[qubit.probe] ) platform.execute([sequence], ExecutionParameters(), [[sweeper]]) From ceb859ecb2b37ae1c5c3f351f81033a2846a0165 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 23 Aug 2024 15:04:26 +0200 Subject: [PATCH 0834/1006] docs: Propagate channel id update to documentation --- doc/source/tutorials/lab.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/source/tutorials/lab.rst b/doc/source/tutorials/lab.rst index 0c35d5d54c..d1bb66cc3a 100644 --- a/doc/source/tutorials/lab.rst +++ b/doc/source/tutorials/lab.rst @@ -48,8 +48,8 @@ using different Qibolab primitives. # define configuration for channels configs = {} - configs[str(qubit.drive.name)] = IqConfig(frequency=3e9) - configs[str(qubit.probe.name)] = IqConfig(frequency=7e9) + configs[qubit.drive.name] = IqConfig(frequency=3e9) + configs[qubit.probe.name] = IqConfig(frequency=7e9) # create sequence that drives qubit from state 0 to 1 drive_seq = PulseSequence( From ed36bdc3c73af5204bb73bae1a59a9a2985b52bf Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 23 Aug 2024 16:42:01 +0200 Subject: [PATCH 0835/1006] feat: Add readout constructor from probe pulse --- src/qibolab/pulses/pulse.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index f95ee52d5f..2b03b3e585 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -117,6 +117,14 @@ class Readout(_PulseLike): acquisition: Acquisition probe: Pulse + @classmethod + def from_probe(cls, probe: Pulse): + """Create a whole readout operation from its probe pulse. + + The acquisition is made to match the same probe duration. + """ + return cls(acquisition=Acquisition(duration=probe.duration), probe=probe) + @property def duration(self) -> float: """Duration in ns.""" From 6f1a608a69e21500b94b63e1253dedb18e264b36 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 23 Aug 2024 19:18:41 +0200 Subject: [PATCH 0836/1006] fix: Convert dummy MZ natives to readout operations --- src/qibolab/dummy/parameters.json | 160 +++++++++++++++--------------- 1 file changed, 80 insertions(+), 80 deletions(-) diff --git a/src/qibolab/dummy/parameters.json b/src/qibolab/dummy/parameters.json index e427c9ca1e..e9e6a96f5d 100644 --- a/src/qibolab/dummy/parameters.json +++ b/src/qibolab/dummy/parameters.json @@ -186,25 +186,25 @@ ] ], "MZ": [ - [ - "qubit_0/probe", - { - "duration": 2000.0, - "amplitude": 0.1, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - }, - "relative_phase": 0.0, - "kind": "pulse" - } - ], [ "qubit_0/acquisition", { - "kind": "acquisition", - "duration": 2000.0 + "kind": "readout", + "acquisition": { + "kind": "acquisition", + "duration": 2000.0 + }, + "probe": { + "duration": 2000.0, + "amplitude": 0.1, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0, + "kind": "pulse" + } } ] ], @@ -244,25 +244,25 @@ ] ], "MZ": [ - [ - "qubit_1/probe", - { - "duration": 2000.0, - "amplitude": 0.1, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - }, - "relative_phase": 0.0, - "kind": "pulse" - } - ], [ "qubit_1/acquisition", { - "kind": "acquisition", - "duration": 2000.0 + "kind": "readout", + "acquisition": { + "kind": "acquisition", + "duration": 2000.0 + }, + "probe": { + "duration": 2000.0, + "amplitude": 0.1, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0, + "kind": "pulse" + } } ] ], @@ -301,25 +301,25 @@ ] ], "MZ": [ - [ - "qubit_2/probe", - { - "duration": 2000.0, - "amplitude": 0.1, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - }, - "relative_phase": 0.0, - "kind": "pulse" - } - ], [ "qubit_2/acquisition", { - "kind": "acquisition", - "duration": 2000.0 + "kind": "readout", + "acquisition": { + "kind": "acquisition", + "duration": 2000.0 + }, + "probe": { + "duration": 2000.0, + "amplitude": 0.1, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0, + "kind": "pulse" + } } ] ], @@ -359,25 +359,25 @@ ] ], "MZ": [ - [ - "qubit_3/probe", - { - "duration": 2000.0, - "amplitude": 0.1, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - }, - "relative_phase": 0.0, - "kind": "pulse" - } - ], [ "qubit_3/acquisition", { - "kind": "acquisition", - "duration": 2000.0 + "kind": "readout", + "acquisition": { + "kind": "acquisition", + "duration": 2000.0 + }, + "probe": { + "duration": 2000.0, + "amplitude": 0.1, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0, + "kind": "pulse" + } } ] ], @@ -417,25 +417,25 @@ ] ], "MZ": [ - [ - "qubit_4/probe", - { - "duration": 2000.0, - "amplitude": 0.1, - "envelope": { - "kind": "gaussian_square", - "rel_sigma": 5.0, - "width": 0.75 - }, - "relative_phase": 0.0, - "kind": "pulse" - } - ], [ "qubit_4/acquisition", { - "kind": "acquisition", - "duration": 2000.0 + "kind": "readout", + "acquisition": { + "kind": "acquisition", + "duration": 2000.0 + }, + "probe": { + "duration": 2000.0, + "amplitude": 0.1, + "envelope": { + "kind": "gaussian_square", + "rel_sigma": 5.0, + "width": 0.75 + }, + "relative_phase": 0.0, + "kind": "pulse" + } } ] ], From 3f88603fc3dd019a7b81ae96d08c5fe997085f9b Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 23 Aug 2024 19:38:31 +0200 Subject: [PATCH 0837/1006] test: Fix (some) tests due to readout upgrade --- tests/conftest.py | 4 ++-- tests/test_compilers_default.py | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 0d443be630..de5ba56cd4 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -147,8 +147,8 @@ def wrapped( if sequence is None: qd_seq = natives.RX.create_sequence() probe_seq = natives.MZ.create_sequence() - probe_pulse = probe_seq[0][1] - acq = probe_seq[1][1] + probe_pulse = probe_seq[0][1].probe + acq = probe_seq[0][1].acquisition wrapped.acquisition_duration = acq.duration sequence = PulseSequence() sequence.concatenate(qd_seq) diff --git a/tests/test_compilers_default.py b/tests/test_compilers_default.py index f65e951295..9737a06289 100644 --- a/tests/test_compilers_default.py +++ b/tests/test_compilers_default.py @@ -54,7 +54,7 @@ def test_compile(platform: Platform, gateargs): nqubits = platform.nqubits circuit = generate_circuit_with_gate(nqubits, *gateargs) sequence = compile_circuit(circuit, platform) - assert len(sequence.channels) == nqubits * int(gateargs[0] != gates.I) + nqubits * 2 + assert len(sequence.channels) == nqubits * int(gateargs[0] != gates.I) + nqubits * 1 def test_compile_two_gates(platform: Platform): @@ -78,7 +78,7 @@ def test_measurement(platform: Platform): circuit.add(gates.M(*qubits)) sequence = compile_circuit(circuit, platform) - assert len(sequence.channels) == 2 * nqubits + assert len(sequence.channels) == 1 * nqubits assert len(sequence.acquisitions) == 1 * nqubits @@ -152,7 +152,7 @@ def test_add_measurement_to_sequence(platform: Platform): sequence = compile_circuit(circuit, platform) qubit = platform.qubits[0] - assert len(sequence.channels) == 3 + assert len(sequence.channels) == 2 assert len(list(sequence.channel(qubit.drive))) == 2 assert len(list(sequence.channel(qubit.probe))) == 2 # include delay @@ -202,7 +202,7 @@ def test_align_multiqubit(platform: Platform): sequence = compile_circuit(circuit, platform) flux_duration = sequence.channel_duration(f"qubit_{coupled}/flux") for q in (main, coupled): - probe_delay = next(iter(sequence.channel(f"qubit_{q}/probe"))) + probe_delay = next(iter(sequence.channel(f"qubit_{q}/acquisition"))) assert isinstance(probe_delay, Delay) assert flux_duration == probe_delay.duration From b43763fafd2edad053313de927018ef910eb2a28 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Sat, 24 Aug 2024 02:00:36 +0200 Subject: [PATCH 0838/1006] test: Fix final tests for readout migration --- tests/test_compilers_default.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/tests/test_compilers_default.py b/tests/test_compilers_default.py index 9737a06289..745c22000e 100644 --- a/tests/test_compilers_default.py +++ b/tests/test_compilers_default.py @@ -66,9 +66,9 @@ def test_compile_two_gates(platform: Platform): sequence = compile_circuit(circuit, platform) qubit = platform.qubits[0] - assert len(sequence.channels) == 3 + assert len(sequence.channels) == 2 assert len(list(sequence.channel(qubit.drive))) == 2 - assert len(list(sequence.channel(qubit.probe))) == 2 # includes delay + assert len(list(sequence.channel(qubit.acquisition))) == 2 # includes delay def test_measurement(platform: Platform): @@ -154,12 +154,11 @@ def test_add_measurement_to_sequence(platform: Platform): qubit = platform.qubits[0] assert len(sequence.channels) == 2 assert len(list(sequence.channel(qubit.drive))) == 2 - assert len(list(sequence.channel(qubit.probe))) == 2 # include delay + assert len(list(sequence.channel(qubit.acquisition))) == 2 # include delay s = PulseSequence() s.concatenate(natives.single_qubit[0].RX.create_sequence(theta=np.pi / 2, phi=0.1)) s.concatenate(natives.single_qubit[0].RX.create_sequence(theta=np.pi / 2, phi=0.2)) - s.append((qubit.probe, Delay(duration=s.duration))) s.append((qubit.acquisition, Delay(duration=s.duration))) s.concatenate(natives.single_qubit[0].MZ.create_sequence()) @@ -186,7 +185,7 @@ def test_align_delay_measurement(platform: Platform, delay): target_sequence = PulseSequence() if delay > 0: - target_sequence.append((platform.qubits[0].probe, Delay(duration=delay))) + target_sequence.append((platform.qubits[0].acquisition, Delay(duration=delay))) target_sequence.concatenate(natives.single_qubit[0].MZ.create_sequence()) assert sequence == target_sequence assert len(sequence.acquisitions) == 1 From 9e5a069447a4e5658d3fb87d2c53d502b2e42c12 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 26 Aug 2024 00:39:32 +0200 Subject: [PATCH 0839/1006] refactor: Export variables to postpone compatibility breaking --- src/qibolab/qubits.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index fc12367e73..6f658ff7c1 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -2,7 +2,10 @@ from pydantic import ConfigDict, Field -from .identifier import ChannelId, TransitionId +# TODO: the unused import are there because Qibocal is still importing them from here +# since the export scheme will be reviewed, it should be changed at that time, removing +# the unused ones from here +from .identifier import ChannelId, TransitionId, QubitId, QubitPairId from .serialize import Model From 00addf31a1203c1b417a7cb9cedcee21fc25172b Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 26 Aug 2024 00:40:18 +0200 Subject: [PATCH 0840/1006] feat: Support device and port path in general channels --- src/qibolab/components/channels.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/qibolab/components/channels.py b/src/qibolab/components/channels.py index e791c43e48..f59f31f338 100644 --- a/src/qibolab/components/channels.py +++ b/src/qibolab/components/channels.py @@ -20,6 +20,7 @@ from typing import Optional +from qibolab.identifier import ChannelId from qibolab.serialize import Model __all__ = ["Channel", "DcChannel", "IqChannel", "AcquireChannel"] @@ -28,6 +29,15 @@ class Channel(Model): """Channel to communicate with the qubit.""" + device: str = "" + """Name of the device.""" + path: str = "" + """Physical port addresss within the device.""" + + @property + def port(self) -> int: + return int(self.path) + class DcChannel(Channel): """Channel that can be used to send DC pulses.""" @@ -55,7 +65,7 @@ class AcquireChannel(Channel): None, if there is no TWPA, or it is not configurable. """ - probe: Optional[str] = None + probe: Optional[ChannelId] = None """Name of the corresponding measure/probe channel. FIXME: This is temporary solution to be able to relate acquisition channel to corresponding probe channel wherever needed in drivers, From 59773d81f526950c2382015f079670c929ee3c99 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 26 Aug 2024 00:41:32 +0200 Subject: [PATCH 0841/1006] feat!: Remove qm-specific channels, and improve re-export --- .../instruments/qm/components/__init__.py | 5 ++++- .../instruments/qm/components/channel.py | 19 ------------------- 2 files changed, 4 insertions(+), 20 deletions(-) delete mode 100644 src/qibolab/instruments/qm/components/channel.py diff --git a/src/qibolab/instruments/qm/components/__init__.py b/src/qibolab/instruments/qm/components/__init__.py index f1fd439eb3..0138aa43cc 100644 --- a/src/qibolab/instruments/qm/components/__init__.py +++ b/src/qibolab/instruments/qm/components/__init__.py @@ -1,2 +1,5 @@ -from .channel import * from .configs import * +from . import configs + +__all__ = [] +__all__ += configs.__all__ diff --git a/src/qibolab/instruments/qm/components/channel.py b/src/qibolab/instruments/qm/components/channel.py deleted file mode 100644 index 6aabc3c2a9..0000000000 --- a/src/qibolab/instruments/qm/components/channel.py +++ /dev/null @@ -1,19 +0,0 @@ -from dataclasses import dataclass - -from qibolab.components import Channel - -__all__ = [ - "QmChannel", -] - - -@dataclass(frozen=True) -class QmChannel: - """Channel for Quantum Machines devices.""" - - logical_channel: Channel - """Corresponding logical channel.""" - device: str - """Name of the device.""" - port: int - """Number of port.""" From f0d620589e3a03da9af4eef3216997e0f1c42385 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 26 Aug 2024 00:43:57 +0200 Subject: [PATCH 0842/1006] refactor: Improve some qm type hints --- src/qibolab/instruments/qm/config/elements.py | 24 ++++++++----------- src/qibolab/instruments/qm/config/pulses.py | 6 ++--- .../instruments/qm/program/acquisition.py | 2 +- 3 files changed, 14 insertions(+), 18 deletions(-) diff --git a/src/qibolab/instruments/qm/config/elements.py b/src/qibolab/instruments/qm/config/elements.py index a08b7be89f..526dd831f2 100644 --- a/src/qibolab/instruments/qm/config/elements.py +++ b/src/qibolab/instruments/qm/config/elements.py @@ -3,19 +3,15 @@ import numpy as np -from ..components import QmChannel +from qibolab.components.channels import Channel -__all__ = [ - "DcElement", - "RfOctaveElement", - "AcquireOctaveElement", - "Element", -] +__all__ = ["DcElement", "RfOctaveElement", "AcquireOctaveElement", "Element"] def iq_imbalance(g, phi): - """Creates the correction matrix for the mixer imbalance caused by the gain - and phase imbalances. + """Create the correction matrix for the mixer imbalance. + + Mixer imbalance is caused by the gain and phase imbalances. More information here: https://docs.qualang.io/libs/examples/mixer-calibration/#non-ideal-mixer @@ -45,7 +41,7 @@ class OutputSwitch: """ -def _to_port(channel: QmChannel) -> dict[str, tuple[str, int]]: +def _to_port(channel: Channel) -> dict[str, tuple[str, int]]: """Convert a channel to the port dictionary required for the QUA config.""" return {"port": (channel.device, channel.port)} @@ -62,7 +58,7 @@ class DcElement: operations: dict[str, str] = field(default_factory=dict) @classmethod - def from_channel(cls, channel: QmChannel): + def from_channel(cls, channel: Channel): return cls(_to_port(channel)) @@ -75,7 +71,7 @@ class RfOctaveElement: @classmethod def from_channel( - cls, channel: QmChannel, connectivity: str, intermediate_frequency: int + cls, channel: Channel, connectivity: str, intermediate_frequency: int ): return cls( _to_port(channel), @@ -97,8 +93,8 @@ class AcquireOctaveElement: @classmethod def from_channel( cls, - probe_channel: QmChannel, - acquire_channel: QmChannel, + probe_channel: Channel, + acquire_channel: Channel, connectivity: str, intermediate_frequency: int, time_of_flight: int, diff --git a/src/qibolab/instruments/qm/config/pulses.py b/src/qibolab/instruments/qm/config/pulses.py index 0635865a1f..34340e9df3 100644 --- a/src/qibolab/instruments/qm/config/pulses.py +++ b/src/qibolab/instruments/qm/config/pulses.py @@ -42,7 +42,7 @@ class ConstantWaveform: type: str = "constant" @classmethod - def from_pulse(cls, pulse: Pulse): + def from_pulse(cls, pulse: Pulse) -> dict[str, "Waveform"]: phase = wrap_phase(pulse.relative_phase) voltage_amp = pulse.amplitude * MAX_VOLTAGE_OUTPUT return { @@ -57,7 +57,7 @@ class ArbitraryWaveform: type: str = "arbitrary" @classmethod - def from_pulse(cls, pulse: Pulse): + def from_pulse(cls, pulse: Pulse) -> dict[str, "Waveform"]: original_waveforms = pulse.envelopes(SAMPLING_RATE) * MAX_VOLTAGE_OUTPUT rotated_waveforms = rotate(original_waveforms, pulse.relative_phase) new_duration = baked_duration(pulse.duration) @@ -72,7 +72,7 @@ def from_pulse(cls, pulse: Pulse): Waveform = Union[ConstantWaveform, ArbitraryWaveform] -def waveforms_from_pulse(pulse: Pulse) -> Waveform: +def waveforms_from_pulse(pulse: Pulse) -> dict[str, Waveform]: """Register QM waveforms for a given pulse.""" needs_baking = pulse.duration < 16 or pulse.duration % 4 != 0 wvtype = ( diff --git a/src/qibolab/instruments/qm/program/acquisition.py b/src/qibolab/instruments/qm/program/acquisition.py index 624c67595e..b38e6038a1 100644 --- a/src/qibolab/instruments/qm/program/acquisition.py +++ b/src/qibolab/instruments/qm/program/acquisition.py @@ -43,7 +43,7 @@ class Acquisition(ABC): element: str """Element from QM ``config`` that the pulse will be applied on.""" average: bool - keys: list[str] = field(default_factory=list) + keys: list[int] = field(default_factory=list) @property def name(self): From 1d9c7302bcc570fda52333ae2df5b4998a84b690 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 26 Aug 2024 00:44:31 +0200 Subject: [PATCH 0843/1006] refactor: Improve dict subclass, and its typing --- src/qibolab/instruments/qm/config/devices.py | 43 +++++++------------- 1 file changed, 15 insertions(+), 28 deletions(-) diff --git a/src/qibolab/instruments/qm/config/devices.py b/src/qibolab/instruments/qm/config/devices.py index 598b3d1b02..aa017e083e 100644 --- a/src/qibolab/instruments/qm/config/devices.py +++ b/src/qibolab/instruments/qm/config/devices.py @@ -1,16 +1,12 @@ +from collections import UserDict from dataclasses import dataclass, field +from typing import Any, Generic, TypeVar from qibolab.components.configs import OscillatorConfig from ..components import OpxOutputConfig, QmAcquisitionConfig -__all__ = [ - "AnalogOutput", - "OctaveOutput", - "OctaveInput", - "Controller", - "Octave", -] +__all__ = ["AnalogOutput", "OctaveOutput", "OctaveInput", "Controller", "Octave"] DEFAULT_INPUTS = {"1": {}, "2": {}} @@ -20,15 +16,17 @@ calibration when using Octaves. """ +V = TypeVar("V") -class PortDict(dict): + +class PortDict(Generic[V], UserDict[str, V]): """Dictionary that automatically converts keys to strings. Used to register input and output ports to controllers and Octaves in the QUA config. """ - def __setitem__(self, key, value): + def __setitem__(self, key: Any, value: V): super().__setitem__(str(key), value) @@ -39,10 +37,7 @@ class AnalogOutput: @classmethod def from_config(cls, config: OpxOutputConfig): - return cls( - offset=config.offset, - filter=config.filter, - ) + return cls(offset=config.offset, filter=config.filter) @dataclass(frozen=True) @@ -52,10 +47,7 @@ class AnalogInput: @classmethod def from_config(cls, config: QmAcquisitionConfig): - return cls( - offset=config.offset, - gain_db=config.gain, - ) + return cls(offset=config.offset, gain_db=config.gain) @dataclass(frozen=True) @@ -67,10 +59,7 @@ class OctaveOutput: @classmethod def from_config(cls, config: OscillatorConfig): - return cls( - LO_frequency=config.frequency, - gain=config.power, - ) + return cls(LO_frequency=config.frequency, gain=config.power) @dataclass(frozen=True) @@ -83,11 +72,9 @@ class OctaveInput: @dataclass class Controller: - analog_outputs: PortDict[str, dict[str, AnalogOutput]] = field( - default_factory=PortDict - ) - digital_outputs: PortDict[str, dict[str, dict]] = field(default_factory=PortDict) - analog_inputs: PortDict[str, dict[str, AnalogInput]] = field( + analog_outputs: PortDict[dict[str, AnalogOutput]] = field(default_factory=PortDict) + digital_outputs: PortDict[dict[str, dict]] = field(default_factory=PortDict) + analog_inputs: PortDict[dict[str, AnalogInput]] = field( default_factory=lambda: PortDict(DEFAULT_INPUTS) ) @@ -107,5 +94,5 @@ def add_octave_input(self, port: int, config: QmAcquisitionConfig): @dataclass class Octave: connectivity: str - RF_outputs: PortDict[str, dict[str, OctaveOutput]] = field(default_factory=PortDict) - RF_inputs: PortDict[str, dict[str, OctaveInput]] = field(default_factory=PortDict) + RF_outputs: PortDict[dict[str, OctaveOutput]] = field(default_factory=PortDict) + RF_inputs: PortDict[dict[str, OctaveInput]] = field(default_factory=PortDict) From 69097919509eeec3d56415fc0b5feb42d70807ff Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 26 Aug 2024 00:45:05 +0200 Subject: [PATCH 0844/1006] fix: Propagate qmchannel deprecation to its configs --- src/qibolab/instruments/qm/config/config.py | 47 ++++++++++++--------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/src/qibolab/instruments/qm/config/config.py b/src/qibolab/instruments/qm/config/config.py index e850332522..7ed1e6127c 100644 --- a/src/qibolab/instruments/qm/config/config.py +++ b/src/qibolab/instruments/qm/config/config.py @@ -1,13 +1,15 @@ from dataclasses import dataclass, field from typing import Optional, Union +from qibolab.components.channels import AcquireChannel, DcChannel, IqChannel from qibolab.components.configs import IqConfig, OscillatorConfig +from qibolab.identifier import ChannelId from qibolab.pulses import Pulse -from ..components import OpxOutputConfig, QmAcquisitionConfig, QmChannel -from .devices import * -from .elements import * -from .pulses import * +from ..components import OpxOutputConfig, QmAcquisitionConfig +from .devices import AnalogOutput, Controller, Octave, OctaveInput, OctaveOutput +from .elements import AcquireOctaveElement, DcElement, Element, RfOctaveElement +from .pulses import QmAcquisition, QmPulse, Waveform, operation, waveforms_from_pulse __all__ = ["QmConfig"] @@ -48,15 +50,19 @@ def add_octave(self, device: str, connectivity: str): self.add_controller(connectivity) self.octaves[device] = Octave(connectivity) - def configure_dc_line(self, channel: QmChannel, config: OpxOutputConfig): + def configure_dc_line( + self, id: ChannelId, channel: DcChannel, config: OpxOutputConfig + ): controller = self.controllers[channel.device] controller.analog_outputs[channel.port] = AnalogOutput.from_config(config) - self.elements[str(channel.logical_channel.name)] = DcElement.from_channel( - channel - ) + self.elements[id] = DcElement.from_channel(channel) def configure_iq_line( - self, channel: QmChannel, config: IqConfig, lo_config: OscillatorConfig + self, + id: ChannelId, + channel: IqChannel, + config: IqConfig, + lo_config: OscillatorConfig, ): port = channel.port octave = self.octaves[channel.device] @@ -64,14 +70,15 @@ def configure_iq_line( self.controllers[octave.connectivity].add_octave_output(port) intermediate_frequency = config.frequency - lo_config.frequency - self.elements[str(channel.logical_channel.name)] = RfOctaveElement.from_channel( + self.elements[id] = RfOctaveElement.from_channel( channel, octave.connectivity, intermediate_frequency ) def configure_acquire_line( self, - acquire_channel: QmChannel, - probe_channel: QmChannel, + id: ChannelId, + acquire_channel: AcquireChannel, + probe_channel: IqChannel, acquire_config: QmAcquisitionConfig, probe_config: IqConfig, lo_config: OscillatorConfig, @@ -87,15 +94,13 @@ def configure_acquire_line( self.controllers[octave.connectivity].add_octave_output(port) intermediate_frequency = probe_config.frequency - lo_config.frequency - self.elements[str(probe_channel.logical_channel.name)] = ( - AcquireOctaveElement.from_channel( - probe_channel, - acquire_channel, - octave.connectivity, - intermediate_frequency, - time_of_flight=acquire_config.delay, - smearing=acquire_config.smearing, - ) + self.elements[id] = AcquireOctaveElement.from_channel( + probe_channel, + acquire_channel, + octave.connectivity, + intermediate_frequency, + time_of_flight=acquire_config.delay, + smearing=acquire_config.smearing, ) def register_waveforms( From 39b324be96eaa37142b819795ccb53d2729068a6 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 26 Aug 2024 10:17:27 +0200 Subject: [PATCH 0845/1006] fix: Replace qm-specific channels with general ones in the controller --- src/qibolab/instruments/qm/controller.py | 147 +++++++++++------------ 1 file changed, 72 insertions(+), 75 deletions(-) diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 1feeaf1b0a..cdc7165088 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -1,3 +1,4 @@ +from os import PathLike import shutil import tempfile import warnings @@ -7,6 +8,11 @@ from typing import Optional from pydantic import Field +from qibolab.components.configs import AcquisitionConfig, IqConfig, OscillatorConfig +from qibolab.instruments.qm.components.configs import ( + OpxOutputConfig, + QmAcquisitionConfig, +) from qm import QuantumMachinesManager, SimulationConfig, generate_qua_script from qm.octave import QmOctaveConfig from qm.simulate.credentials import create_credentials @@ -21,7 +27,6 @@ from qibolab.sweeper import ParallelSweepers, Parameter, Sweeper from qibolab.unrolling import Bounds, unroll_sequences -from .components import QmChannel from .config import SAMPLING_RATE, QmConfig, operation from .program import ExecutionArguments, create_acquisition, program from .program.sweepers import check_frequency_bandwidth, sweeper_amplitude @@ -133,15 +138,14 @@ class QmController(Controller): """Dictionary containing the :class:`qibolab.instruments.qm.controller.Octave` instruments being used.""" - channels: dict[ChannelId, QmChannel] bounds: str = "qm/bounds" """Maximum bounds used for batching in sequence unrolling.""" - calibration_path: Optional[str] = None + calibration_path: Optional[PathLike] = None """Path to the JSON file that contains the mixer calibration.""" write_calibration: bool = False """Require writing permissions on calibration DB.""" - _calibration_path: Optional[str] = None + _calibration_path: Optional[PathLike] = None """The calibration path for internal use. Cf. :attr:`calibration_path` for its role. This might be set to a different one @@ -180,9 +184,6 @@ class QmController(Controller): """ def model_post_init(self, __context): - # convert ``channels`` from list to dict - self.channels = {channel.logical_channel: channel for channel in self.channels} - if self.simulation_duration is not None: # convert simulation duration from ns to clock cycles self.simulation_duration //= 4 @@ -243,55 +244,57 @@ def configure_device(self, device: str): else: self.config.add_controller(device) - def configure_channel(self, channel: QmChannel, configs: dict[str, Config]): + def configure_channel(self, channel: ChannelId, configs: dict[str, Config]): """Add element (QM version of channel) in the config.""" - logical_channel = channel.logical_channel - channel_config = configs[str(logical_channel.name)] - self.configure_device(channel.device) - - if isinstance(logical_channel, DcChannel): - self.config.configure_dc_line(channel, channel_config) + config = configs[channel] + ch = self.channels[channel] + self.configure_device(ch.device) + + if isinstance(ch, DcChannel): + assert isinstance(config, OpxOutputConfig) + self.config.configure_dc_line(channel, ch, config) + + elif isinstance(ch, IqChannel): + assert ch.lo is not None + assert isinstance(config, IqConfig) + lo_config = configs[ch.lo] + assert isinstance(lo_config, OscillatorConfig) + self.config.configure_iq_line(channel, ch, config, lo_config) + + elif isinstance(ch, AcquireChannel): + assert ch.probe is not None + assert isinstance(config, QmAcquisitionConfig) + probe = self.channels[ch.probe] + probe_config = configs[ch.probe] + assert isinstance(probe, IqChannel) + assert isinstance(probe_config, IqConfig) + assert probe.lo is not None + lo_config = configs[probe.lo] + assert isinstance(lo_config, OscillatorConfig) + self.configure_device(ch.device) + self.config.configure_acquire_line( + channel, ch, probe, config, probe_config, lo_config + ) - elif isinstance(logical_channel, IqChannel): - lo_config = configs[logical_channel.lo] - if logical_channel.acquisition is None: - self.config.configure_iq_line(channel, channel_config, lo_config) + else: + raise TypeError(f"Unknown channel type: {type(ch)}.") - else: - acquisition = logical_channel.acquisition - acquire_channel = self.channels[acquisition] - self.configure_device(acquire_channel.device) - self.config.configure_acquire_line( - acquire_channel, - channel, - configs[acquisition], - channel_config, - lo_config, - ) + def configure_channels(self, configs: dict[str, Config], channels: set[ChannelId]): + """Register channels in the sequence in the QM ``config``.""" + for id in channels: + self.configure_channel(id, configs) - elif not isinstance(logical_channel, AcquireChannel): - raise TypeError(f"Unknown channel type: {type(logical_channel)}.") + def register_pulse(self, channel: ChannelId, pulse: Pulse) -> str: + """Add pulse in the QM ``config``. - def configure_channels( - self, - configs: dict[str, Config], - channels: set[ChannelId], - ): - """Register channels participating in the sequence in the QM - ``config``.""" - for channel_id in channels: - channel = self.channels[str(channel_id)] - self.configure_channel(channel, configs) - - def register_pulse(self, channel: Channel, pulse: Pulse) -> str: - """Add pulse in the QM ``config`` and return corresponding - operation.""" - name = str(channel.name) - if isinstance(channel, DcChannel): - return self.config.register_dc_pulse(name, pulse) - if channel.acquisition is None: - return self.config.register_iq_pulse(name, pulse) - return self.config.register_acquisition_pulse(name, pulse) + And return corresponding operation. + """ + ch = self.channels[channel] + if isinstance(ch, DcChannel): + return self.config.register_dc_pulse(channel, pulse) + if isinstance(ch, IqChannel): + return self.config.register_iq_pulse(channel, pulse) + return self.config.register_acquisition_pulse(channel, pulse) def register_pulses(self, configs: dict[str, Config], sequence: PulseSequence): """Adds all pulses except measurements of a given sequence in the QM @@ -300,15 +303,15 @@ def register_pulses(self, configs: dict[str, Config], sequence: PulseSequence): Returns: acquisitions (dict): Map from measurement instructions to acquisition objects. """ - for channel_id, pulse in sequence: + for id, pulse in sequence: if hasattr(pulse, "duration") and not pulse.duration.is_integer(): raise ValueError( f"Quantum Machines cannot play pulse with duration {pulse.duration}. " "Only integer duration in ns is supported." ) + if isinstance(pulse, Pulse): - channel = self.channels[str(channel_id)].logical_channel - self.register_pulse(channel, pulse) + self.register_pulse(id, pulse) def register_duration_sweeper_pulses( self, args: ExecutionArguments, sweeper: Sweeper @@ -323,7 +326,7 @@ def register_duration_sweeper_pulses( params = args.parameters[operation(pulse)] channel_ids = args.sequence.pulse_channels(pulse.id) - channel = self.channels[str(channel_ids[0])].logical_channel + channel = self.channels[channel_ids[0]].logical_channel original_pulse = ( pulse if params.amplitude_pulse is None else params.amplitude_pulse ) @@ -340,11 +343,10 @@ def register_amplitude_sweeper_pulses( Needed when sweeping amplitude because the original amplitude may not sufficient to reach all the sweeper values. """ - new_op = None amplitude = sweeper_amplitude(sweeper.values) for pulse in sweeper.pulses: channel_ids = args.sequence.pulse_channels(pulse.id) - channel = self.channels[str(channel_ids[0])].logical_channel + channel = self.channels[channel_ids[0]].logical_channel sweep_pulse = pulse.model_copy(update={"amplitude": amplitude}) params = args.parameters[operation(pulse)] @@ -357,13 +359,13 @@ def register_acquisitions( sequence: PulseSequence, options: ExecutionParameters, ): - """Adds all measurements of a given sequence in the QM ``config``. + """Add all measurements of a given sequence in the QM ``config``. Returns: acquisitions (dict): Map from measurement instructions to acquisition objects. """ acquisitions = {} - for channel_id, readout in sequence.as_readouts: + for channel_id, readout in sequence: if not isinstance(readout, Readout): continue @@ -372,23 +374,18 @@ def register_acquisitions( "Quantum Machines does not support acquisition with different duration than probe." ) - channel_name = str(channel_id) - channel = self.channels[channel_name].logical_channel - op = self.config.register_acquisition_pulse(channel_name, readout.probe) + op = self.config.register_acquisition_pulse(channel_id, readout.probe) - acq_config = configs[channel.acquisition] + acq_config = configs[channel_id] + assert isinstance(acq_config, QmAcquisitionConfig) self.config.register_integration_weights( - channel_name, readout.duration, acq_config.kernel + channel_id, readout.duration, acq_config.kernel ) - if (op, channel_name) in acquisitions: - acquisition = acquisitions[(op, channel_name)] + if (op, channel_id) in acquisitions: + acquisition = acquisitions[(op, channel_id)] else: - acquisition = acquisitions[(op, channel_name)] = create_acquisition( - op, - channel_name, - options, - acq_config.threshold, - acq_config.iq_angle, + acquisition = acquisitions[(op, channel_id)] = create_acquisition( + op, channel_id, options, acq_config.threshold, acq_config.iq_angle ) acquisition.keys.append(readout.acquisition.id) @@ -445,9 +442,9 @@ def play( # register DC elements so that all qubits are # sweetspot even when they are not used - for channel in self.channels.values(): - if isinstance(channel.logical_channel, DcChannel): - self.configure_channel(channel, configs) + for id, channel in self.channels.items(): + if isinstance(channel, DcChannel): + self.configure_channel(id, configs) self.configure_channels(configs, sequence.channels) self.register_pulses(configs, sequence) From 74e81ee7b712dce5e6e44b969142f65a035d3b53 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 26 Aug 2024 12:30:42 +0200 Subject: [PATCH 0846/1006] fix: Prevent pre-commit removing star-import --- src/qibolab/instruments/qm/components/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibolab/instruments/qm/components/__init__.py b/src/qibolab/instruments/qm/components/__init__.py index 0138aa43cc..cd2dbfd891 100644 --- a/src/qibolab/instruments/qm/components/__init__.py +++ b/src/qibolab/instruments/qm/components/__init__.py @@ -1,5 +1,5 @@ -from .configs import * from . import configs +from .configs import * # noqa __all__ = [] __all__ += configs.__all__ From 0476677b476aac97be7aa0c5a009fe0d015c3e38 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 26 Aug 2024 12:31:55 +0200 Subject: [PATCH 0847/1006] fix: Fix missing import --- src/qibolab/instruments/qm/config/config.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/qibolab/instruments/qm/config/config.py b/src/qibolab/instruments/qm/config/config.py index 7ed1e6127c..b2df24838d 100644 --- a/src/qibolab/instruments/qm/config/config.py +++ b/src/qibolab/instruments/qm/config/config.py @@ -9,7 +9,14 @@ from ..components import OpxOutputConfig, QmAcquisitionConfig from .devices import AnalogOutput, Controller, Octave, OctaveInput, OctaveOutput from .elements import AcquireOctaveElement, DcElement, Element, RfOctaveElement -from .pulses import QmAcquisition, QmPulse, Waveform, operation, waveforms_from_pulse +from .pulses import ( + QmAcquisition, + QmPulse, + Waveform, + integration_weights, + operation, + waveforms_from_pulse, +) __all__ = ["QmConfig"] From 5994a3d5affa9e625b5165b92db0022081ebf75a Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 26 Aug 2024 12:36:05 +0200 Subject: [PATCH 0848/1006] fix: Prevent even more import removal --- src/qibolab/instruments/qm/components/__init__.py | 2 ++ src/qibolab/instruments/qm/controller.py | 14 +++++++------- src/qibolab/qubits.py | 2 +- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/qibolab/instruments/qm/components/__init__.py b/src/qibolab/instruments/qm/components/__init__.py index cd2dbfd891..a3e90c16e9 100644 --- a/src/qibolab/instruments/qm/components/__init__.py +++ b/src/qibolab/instruments/qm/components/__init__.py @@ -1,4 +1,6 @@ from . import configs + +# TODO: Fix pycln configurations in pre-commit to preserve the following with no comment from .configs import * # noqa __all__ = [] diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index cdc7165088..0b40bf03f1 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -1,27 +1,27 @@ -from os import PathLike import shutil import tempfile import warnings from collections import defaultdict from dataclasses import asdict, dataclass +from os import PathLike from pathlib import Path from typing import Optional from pydantic import Field -from qibolab.components.configs import AcquisitionConfig, IqConfig, OscillatorConfig -from qibolab.instruments.qm.components.configs import ( - OpxOutputConfig, - QmAcquisitionConfig, -) from qm import QuantumMachinesManager, SimulationConfig, generate_qua_script from qm.octave import QmOctaveConfig from qm.simulate.credentials import create_credentials from qualang_tools.simulator_tools import create_simulator_controller_connections -from qibolab.components import AcquireChannel, Channel, Config, DcChannel, IqChannel +from qibolab.components import AcquireChannel, Config, DcChannel, IqChannel +from qibolab.components.configs import IqConfig, OscillatorConfig from qibolab.execution_parameters import ExecutionParameters from qibolab.identifier import ChannelId from qibolab.instruments.abstract import Controller +from qibolab.instruments.qm.components.configs import ( + OpxOutputConfig, + QmAcquisitionConfig, +) from qibolab.pulses import Acquisition, Align, Delay, Pulse, Readout from qibolab.sequence import PulseSequence from qibolab.sweeper import ParallelSweepers, Parameter, Sweeper diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index 6f658ff7c1..433ad3430e 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -5,7 +5,7 @@ # TODO: the unused import are there because Qibocal is still importing them from here # since the export scheme will be reviewed, it should be changed at that time, removing # the unused ones from here -from .identifier import ChannelId, TransitionId, QubitId, QubitPairId +from .identifier import ChannelId, QubitId, QubitPairId, TransitionId # noqa from .serialize import Model From eeef41f5a15ee871dd1a19303bb2dbf0c7c9856e Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 26 Aug 2024 14:19:08 +0200 Subject: [PATCH 0849/1006] build: Set py3.11 in flake to allow testing qua --- flake.lock | 38 ++++++++++++++++++++++++++++++++++++++ flake.nix | 5 +++++ 2 files changed, 43 insertions(+) diff --git a/flake.lock b/flake.lock index d0eb4e76ff..86505603c4 100644 --- a/flake.lock +++ b/flake.lock @@ -138,6 +138,22 @@ "type": "github" } }, + "flake-compat_3": { + "flake": false, + "locked": { + "lastModified": 1696426674, + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, "flake-utils": { "inputs": { "systems": "systems" @@ -289,6 +305,27 @@ "type": "github" } }, + "nixpkgs-python": { + "inputs": { + "flake-compat": "flake-compat_3", + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1722978926, + "narHash": "sha256-sqOOEaKJJSUFBzag/cGeeXV491TrrVFY3DFBs1w20V8=", + "owner": "cachix", + "repo": "nixpkgs-python", + "rev": "7c550bca7e6cf95898e32eb2173efe7ebb447460", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "nixpkgs-python", + "type": "github" + } + }, "nixpkgs-regression": { "locked": { "lastModified": 1643052045, @@ -411,6 +448,7 @@ "devenv": "devenv", "fenix": "fenix", "nixpkgs": "nixpkgs_2", + "nixpkgs-python": "nixpkgs-python", "systems": "systems_3" } }, diff --git a/flake.nix b/flake.nix index 3b65860c4b..e7ba41854c 100644 --- a/flake.nix +++ b/flake.nix @@ -10,6 +10,10 @@ url = "github:nix-community/fenix"; inputs.nixpkgs.follows = "nixpkgs"; }; + nixpkgs-python = { + url = "github:cachix/nixpkgs-python"; + inputs = {nixpkgs.follows = "nixpkgs";}; + }; }; outputs = { @@ -62,6 +66,7 @@ languages.python = { enable = true; libraries = with pkgs; [zlib]; + version = "3.11"; poetry = { enable = true; install = { From 22f56261f58984154d49708f9ff5d4d45ce5fdf6 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 26 Aug 2024 14:40:58 +0200 Subject: [PATCH 0850/1006] fix: Give up on userdict not to spoil serialization --- src/qibolab/instruments/qm/config/devices.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/qibolab/instruments/qm/config/devices.py b/src/qibolab/instruments/qm/config/devices.py index aa017e083e..6210e34cf3 100644 --- a/src/qibolab/instruments/qm/config/devices.py +++ b/src/qibolab/instruments/qm/config/devices.py @@ -1,4 +1,3 @@ -from collections import UserDict from dataclasses import dataclass, field from typing import Any, Generic, TypeVar @@ -19,7 +18,7 @@ V = TypeVar("V") -class PortDict(Generic[V], UserDict[str, V]): +class PortDict(Generic[V], dict[str, V]): """Dictionary that automatically converts keys to strings. Used to register input and output ports to controllers and Octaves From 8a9195967151f33fe1f47357810e67999f88f632 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 26 Aug 2024 16:09:02 +0200 Subject: [PATCH 0851/1006] fix: Split repeated validator/serializer --- src/qibolab/identifier.py | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/qibolab/identifier.py b/src/qibolab/identifier.py index 4db4a35225..7d713696a5 100644 --- a/src/qibolab/identifier.py +++ b/src/qibolab/identifier.py @@ -38,16 +38,24 @@ def __str__(self) -> str: StateId = int """State identifier.""" + +def _split(pair: Union[str, tuple]) -> tuple[str, str]: + if isinstance(pair, str): + a, b = pair.split("-") + return a, b + return pair + + +def _join(pair: tuple[str, str]) -> str: + return f"{pair[0]}-{pair[1]}" + + TransitionId = Annotated[ - tuple[StateId, StateId], - BeforeValidator(lambda p: tuple(p.split("-")) if isinstance(p, str) else p), - PlainSerializer(lambda p: f"{p[0]}-{p[1]}"), + tuple[StateId, StateId], BeforeValidator(_split), PlainSerializer(_join) ] """Identifier for a state transition.""" QubitPairId = Annotated[ - tuple[QubitId, QubitId], - BeforeValidator(lambda p: tuple(p.split("-")) if isinstance(p, str) else p), - PlainSerializer(lambda p: f"{p[0]}-{p[1]}"), + tuple[QubitId, QubitId], BeforeValidator(_split), PlainSerializer(_join) ] """Two-qubit active interaction identifier.""" From 202f0dd41a975ed5def413b5becd98e700bf77fb Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 26 Aug 2024 16:16:13 +0200 Subject: [PATCH 0852/1006] fix: Define channels independently from the instrument in dummy --- src/qibolab/dummy/platform.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/qibolab/dummy/platform.py b/src/qibolab/dummy/platform.py index f226cbadde..99abb757e8 100644 --- a/src/qibolab/dummy/platform.py +++ b/src/qibolab/dummy/platform.py @@ -10,11 +10,10 @@ def create_dummy() -> Platform: """Create a dummy platform using the dummy instrument.""" - # register the instruments - instrument = DummyInstrument(name="dummy", address="0.0.0.0") - pump = DummyLocalOscillator(name="twpa_pump", address="0.0.0.0") + pump_name = "twpa_pump" qubits = {} + channels = {} # attach the channels for q in range(5): drive, drive12, flux, probe, acquisition = ( @@ -24,9 +23,9 @@ def create_dummy() -> Platform: f"qubit_{q}/probe", f"qubit_{q}/acquisition", ) - instrument.channels |= { + channels |= { probe: IqChannel(mixer=None, lo=None), - acquisition: AcquireChannel(twpa_pump=pump.name, probe=probe), + acquisition: AcquireChannel(twpa_pump=pump_name, probe=probe), drive: IqChannel(mixer=None, lo=None), drive12: IqChannel(mixer=None, lo=None), flux: DcChannel(), @@ -42,9 +41,13 @@ def create_dummy() -> Platform: couplers = {} for c in (0, 1, 3, 4): flux = f"coupler_{c}/flux" - instrument.channels |= {flux: DcChannel()} + channels |= {flux: DcChannel()} couplers[c] = Qubit(flux=flux) + # register the instruments + instrument = DummyInstrument(name="dummy", address="0.0.0.0", channels=channels) + pump = DummyLocalOscillator(name=pump_name, address="0.0.0.0") + return Platform.load( path=FOLDER, instruments=[instrument, pump], qubits=qubits, couplers=couplers ) From 78b07cb4c381170453030d23b0e4f9e23f1a2162 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 26 Aug 2024 16:40:42 +0200 Subject: [PATCH 0853/1006] fix: Replace qcodes dependency with more accurate protocol --- src/qibolab/instruments/oscillator.py | 29 +++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/src/qibolab/instruments/oscillator.py b/src/qibolab/instruments/oscillator.py index 75c732af33..0e708f4b9b 100644 --- a/src/qibolab/instruments/oscillator.py +++ b/src/qibolab/instruments/oscillator.py @@ -1,8 +1,7 @@ from abc import abstractmethod -from typing import Optional +from typing import Any, Optional, Protocol from pydantic import Field -from qcodes.instrument import Instrument as QcodesInstrument from qibolab.instruments.abstract import Instrument, InstrumentSettings @@ -10,6 +9,28 @@ """Number of times to attempt connecting to instrument in case of failure.""" +class Device(Protocol): + """Dummy device that does nothing but follows the QCoDeS interface. + + Used by :class:`qibolab.instruments.dummy.DummyLocalOscillator`. + """ + + def set(self, name: str, value: Any): + """Set device property.""" + + def get(self, name: str) -> Any: + """Get device property.""" + + def on(self): + """Turn device on.""" + + def off(self): + """Turn device on.""" + + def close(self): + """Close connection with device.""" + + class LocalOscillatorSettings(InstrumentSettings): """Local oscillator parameters that are saved in the platform runcard.""" @@ -49,7 +70,7 @@ class LocalOscillator(Instrument): qubits and resonators. They cannot be used to play or sweep pulses. """ - device: Optional[QcodesInstrument] = None + device: Optional[Device] = None settings: Optional[InstrumentSettings] = Field( default_factory=lambda: LocalOscillatorSettings() ) @@ -59,7 +80,7 @@ class LocalOscillator(Instrument): ref_osc_source = _property("ref_osc_source") @abstractmethod - def create(self) -> QcodesInstrument: + def create(self) -> Device: """Create instance of physical device.""" def connect(self): From 8159e01b53713bc00934e866cfc151d3ba6afa8b Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 26 Aug 2024 16:53:31 +0200 Subject: [PATCH 0854/1006] fix: Make device protocol runtime checkable To make it compatible with Pydantic checks --- src/qibolab/instruments/oscillator.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/qibolab/instruments/oscillator.py b/src/qibolab/instruments/oscillator.py index 0e708f4b9b..e62557797d 100644 --- a/src/qibolab/instruments/oscillator.py +++ b/src/qibolab/instruments/oscillator.py @@ -1,5 +1,5 @@ from abc import abstractmethod -from typing import Any, Optional, Protocol +from typing import Any, Optional, Protocol, runtime_checkable from pydantic import Field @@ -9,6 +9,7 @@ """Number of times to attempt connecting to instrument in case of failure.""" +@runtime_checkable class Device(Protocol): """Dummy device that does nothing but follows the QCoDeS interface. From ad03128ccc6f035c19cd604e199408e61f505732 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 26 Aug 2024 17:26:01 +0200 Subject: [PATCH 0855/1006] fix: Separately lift model constraints on instruments They are not really going to be serialized, so it's fine to keep them more lenient, at least for a while, to ease the transition. --- src/qibolab/instruments/abstract.py | 2 +- tests/test_dummy.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/qibolab/instruments/abstract.py b/src/qibolab/instruments/abstract.py index 46ed02ffd4..558bd82a53 100644 --- a/src/qibolab/instruments/abstract.py +++ b/src/qibolab/instruments/abstract.py @@ -29,7 +29,7 @@ class Instrument(Model, ABC): address (str): Instrument network address. """ - model_config = ConfigDict(frozen=False) + model_config = ConfigDict(arbitrary_types_allowed=True, frozen=False, extra="allow") name: InstrumentId address: str diff --git a/tests/test_dummy.py b/tests/test_dummy.py index c8db6f26e2..d37e68636a 100644 --- a/tests/test_dummy.py +++ b/tests/test_dummy.py @@ -58,7 +58,6 @@ def test_dummy_execute_pulse_sequence_unrolling( ): nshots = 100 nsequences = 10 - platform.instruments["dummy"].UNROLLING_BATCH_SIZE = batch_size natives = platform.natives sequences = [] sequence = PulseSequence() From be7e60392027f31f8d72dc33647bd7e3478bede2 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 26 Aug 2024 18:21:27 +0200 Subject: [PATCH 0856/1006] docs: Fix doctests for channels outside qubits --- doc/source/tutorials/lab.rst | 55 ++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 31 deletions(-) diff --git a/doc/source/tutorials/lab.rst b/doc/source/tutorials/lab.rst index d1bb66cc3a..c9d140c26d 100644 --- a/doc/source/tutorials/lab.rst +++ b/doc/source/tutorials/lab.rst @@ -120,34 +120,28 @@ the native gates, but separately from the single-qubit ones. ) # create the qubit objects - qubit0 = Qubit(name=0) - qubit1 = Qubit(name=1) + qubit0 = Qubit(drive="0/drive", flux="0/flux", probe="0/probe", acquisition="0/acquisition") + qubit1 = Qubit(drive="1/drive", flux="1/flux", probe="1/probe", acquisition="1/acquisition") + + channels = {} # assign channels to the qubits - qubit0.probe = IqChannel( - name="0/probe", mixer=None, lo=None, acquisition="0/acquisition" - ) - qubit0.acquisition = AcquireChannel( - name="0/acquisition", twpa_pump=None, probe="probe_0" - ) - qubit0.drive = IqChannel(name="0/drive", mixer=None, lo=None) - qubit0.flux = DcChannel(name="0/flux") - qubit1.probe = IqChannel( - name="1/probe", mixer=None, lo=None, acquisition="1/acquisition" - ) - qubit1.acquisition = AcquireChannel( - name="1/acquisition", twpa_pump=None, probe="probe_1" - ) - qubit1.drive = IqChannel(name="1/drive", mixer=None, lo=None) + channels[qubit0.probe] = IqChannel(mixer=None, lo=None) + channels[qubit0.acquisition] = AcquireChannel( twpa_pump=None, probe=qubit0.probe) + channels[qubit0.drive] = IqChannel(mixer=None, lo=None) + channels[qubit0.flux] = DcChannel() + channels[qubit1.probe] = IqChannel( mixer=None, lo=None) + channels[qubit1.acquisition] = AcquireChannel( twpa_pump=None, probe=qubit1.probe) + channels[qubit1.drive] = IqChannel(mixer=None, lo=None) # assign single-qubit native gates to each qubit single_qubit = {} - single_qubit[qubit0.name] = SingleQubitNatives( + single_qubit["0"] = SingleQubitNatives( RX=RxyFactory( PulseSequence( [ ( - qubit0.drive.name, + qubit0.drive, Pulse( duration=40, amplitude=0.05, @@ -161,19 +155,19 @@ the native gates, but separately from the single-qubit ones. PulseSequence( [ ( - qubit0.probe.name, + qubit0.probe, Pulse(duration=1000, amplitude=0.005, envelope=Rectangular()), ) ] ) ), ) - single_qubit[qubit1.name] = SingleQubitNatives( + single_qubit["1"] = SingleQubitNatives( RX=RxyFactory( PulseSequence( [ ( - qubit1.drive.name, + qubit1.drive, Pulse( duration=40, amplitude=0.05, envelope=Gaussian(rel_sigma=0.2) ), @@ -185,7 +179,7 @@ the native gates, but separately from the single-qubit ones. PulseSequence( [ ( - qubit1.probe.name, + qubit1.probe, Pulse(duration=1000, amplitude=0.005, envelope=Rectangular()), ) ] @@ -196,12 +190,12 @@ the native gates, but separately from the single-qubit ones. # define the pair of qubits two_qubit = TwoQubitContainer( { - f"{qubit0.name}-{qubit1.name}": TwoQubitNatives( + f"0-1": TwoQubitNatives( CZ=FixedSequenceFactory( PulseSequence( [ ( - qubit0.flux.name, + qubit0.flux, Pulse(duration=30, amplitude=0.005, envelope=Rectangular()), ), ] @@ -229,12 +223,11 @@ will take them into account when calling :class:`qibolab.native.TwoQubitNatives` ) # create the qubit and coupler objects - qubit0 = Qubit(name=0) - qubit1 = Qubit(name=1) - coupler_01 = Qubit(name="c01") + coupler_01 = Qubit(flux="c01/flux") + channels = {} # assign channel(s) to the coupler - coupler_01.flux = DcChannel(name="c01/flux") + channels[coupler_01.flux] = DcChannel() # assign single-qubit native gates to each qubit # Look above example @@ -242,12 +235,12 @@ will take them into account when calling :class:`qibolab.native.TwoQubitNatives` # define the pair of qubits two_qubit = TwoQubitContainer( { - f"{qubit0.name}-{qubit1.name}": TwoQubitNatives( + f"0-1": TwoQubitNatives( CZ=FixedSequenceFactory( PulseSequence( [ ( - coupler_01.flux.name, + coupler_01.flux, Pulse(duration=30, amplitude=0.005, envelope=Rectangular()), ) ], From 64311a602daee705934068e5c9c127bc0a72e5d0 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 16:21:42 +0000 Subject: [PATCH 0857/1006] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- doc/source/tutorials/lab.rst | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/doc/source/tutorials/lab.rst b/doc/source/tutorials/lab.rst index c9d140c26d..c3d23c292c 100644 --- a/doc/source/tutorials/lab.rst +++ b/doc/source/tutorials/lab.rst @@ -120,18 +120,22 @@ the native gates, but separately from the single-qubit ones. ) # create the qubit objects - qubit0 = Qubit(drive="0/drive", flux="0/flux", probe="0/probe", acquisition="0/acquisition") - qubit1 = Qubit(drive="1/drive", flux="1/flux", probe="1/probe", acquisition="1/acquisition") + qubit0 = Qubit( + drive="0/drive", flux="0/flux", probe="0/probe", acquisition="0/acquisition" + ) + qubit1 = Qubit( + drive="1/drive", flux="1/flux", probe="1/probe", acquisition="1/acquisition" + ) channels = {} # assign channels to the qubits channels[qubit0.probe] = IqChannel(mixer=None, lo=None) - channels[qubit0.acquisition] = AcquireChannel( twpa_pump=None, probe=qubit0.probe) + channels[qubit0.acquisition] = AcquireChannel(twpa_pump=None, probe=qubit0.probe) channels[qubit0.drive] = IqChannel(mixer=None, lo=None) channels[qubit0.flux] = DcChannel() - channels[qubit1.probe] = IqChannel( mixer=None, lo=None) - channels[qubit1.acquisition] = AcquireChannel( twpa_pump=None, probe=qubit1.probe) + channels[qubit1.probe] = IqChannel(mixer=None, lo=None) + channels[qubit1.acquisition] = AcquireChannel(twpa_pump=None, probe=qubit1.probe) channels[qubit1.drive] = IqChannel(mixer=None, lo=None) # assign single-qubit native gates to each qubit From 4b1f25adb49f8a965212eeb17d790be87c6527a2 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 27 Aug 2024 13:57:35 +0200 Subject: [PATCH 0858/1006] fix: Update config kidns extension type --- src/qibolab/parameters.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibolab/parameters.py b/src/qibolab/parameters.py index d9ed9c8166..4a0af08489 100644 --- a/src/qibolab/parameters.py +++ b/src/qibolab/parameters.py @@ -126,7 +126,7 @@ class ConfigKinds: _registered: list[_ChannelConfigT] = list(_BUILTIN_CONFIGS) @classmethod - def extend(cls, kinds: Iterable[type[Config]]): + def extend(cls, kinds: Iterable[_ChannelConfigT]): """Extend the known configuration kinds. Nested unions are supported (i.e. :class:`Union` as elements of ``kinds``). From a795eab42aa2653a663a015cf176d1f69060836d Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 27 Aug 2024 15:37:56 +0200 Subject: [PATCH 0859/1006] fix: Process readout events during qua script creation --- src/qibolab/instruments/qm/program/instructions.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/qibolab/instruments/qm/program/instructions.py b/src/qibolab/instruments/qm/program/instructions.py index 3fc11289f4..934b86dd7d 100644 --- a/src/qibolab/instruments/qm/program/instructions.py +++ b/src/qibolab/instruments/qm/program/instructions.py @@ -7,7 +7,7 @@ from qibolab.components import Config from qibolab.execution_parameters import AcquisitionType, ExecutionParameters from qibolab.identifier import ChannelType -from qibolab.pulses import Align, Delay, Pulse, VirtualZ +from qibolab.pulses import Align, Delay, Pulse, Readout, VirtualZ from qibolab.sweeper import ParallelSweepers, Sweeper from ..config import operation @@ -96,6 +96,8 @@ def play(args: ExecutionArguments): if isinstance(pulse, Delay): _delay(pulse, element, params) elif isinstance(pulse, Pulse): + _play(op, element, params) + elif isinstance(pulse, Readout): acquisition = args.acquisitions.get((op, element)) _play(op, element, params, acquisition) elif isinstance(pulse, VirtualZ): From 1949faaa3c438874137e98e5a603283ccee7b085 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 27 Aug 2024 16:00:09 +0200 Subject: [PATCH 0860/1006] fix: Register readout event with its own hash Instead of the associated probe pulse --- src/qibolab/instruments/qm/config/config.py | 7 ++++--- src/qibolab/instruments/qm/controller.py | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/qibolab/instruments/qm/config/config.py b/src/qibolab/instruments/qm/config/config.py index b2df24838d..c5ebb4768a 100644 --- a/src/qibolab/instruments/qm/config/config.py +++ b/src/qibolab/instruments/qm/config/config.py @@ -5,6 +5,7 @@ from qibolab.components.configs import IqConfig, OscillatorConfig from qibolab.identifier import ChannelId from qibolab.pulses import Pulse +from qibolab.pulses.pulse import Readout from ..components import OpxOutputConfig, QmAcquisitionConfig from .devices import AnalogOutput, Controller, Octave, OctaveInput, OctaveOutput @@ -142,12 +143,12 @@ def register_dc_pulse(self, element: str, pulse: Pulse): self.elements[element].operations[op] = op return op - def register_acquisition_pulse(self, element: str, pulse: Pulse): + def register_acquisition_pulse(self, element: str, readout: Readout): """Registers pulse, waveforms and integration weights in QM config.""" - op = operation(pulse) + op = operation(readout) acquisition = f"{op}_{element}" if acquisition not in self.pulses: - self.pulses[acquisition] = self.register_waveforms(pulse, element) + self.pulses[acquisition] = self.register_waveforms(readout.probe, element) self.elements[element].operations[op] = acquisition return op diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 0b40bf03f1..798d17cfa1 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -374,7 +374,7 @@ def register_acquisitions( "Quantum Machines does not support acquisition with different duration than probe." ) - op = self.config.register_acquisition_pulse(channel_id, readout.probe) + op = self.config.register_acquisition_pulse(channel_id, readout) acq_config = configs[channel_id] assert isinstance(acq_config, QmAcquisitionConfig) From fc4b66e81fc6dcad8053a7c6e9f81225b24f5012 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 28 Aug 2024 16:53:25 +0200 Subject: [PATCH 0861/1006] test: Properly move unrolling test Slightly messed up during rebase --- tests/test_platform.py | 16 ---------------- tests/test_unrolling.py | 5 ++++- 2 files changed, 4 insertions(+), 17 deletions(-) diff --git a/tests/test_platform.py b/tests/test_platform.py index c300796e6f..9c9f0969b3 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -30,22 +30,6 @@ nshots = 1024 -def test_unroll_sequences(platform: Platform): - qubit = next(iter(platform.qubits.values())) - assert qubit.probe is not None - natives = platform.natives.single_qubit[0] - assert natives.RX is not None - assert natives.MZ is not None - sequence = PulseSequence() - sequence.concatenate(natives.RX.create_sequence()) - sequence.append((qubit.probe, Delay(duration=sequence.duration))) - sequence.concatenate(natives.MZ.create_sequence()) - total_sequence, readouts = unroll_sequences(10 * [sequence], relaxation_time=10000) - assert len(total_sequence.acquisitions) == 10 - assert len(readouts) == 1 - assert all(len(readouts[acq.id]) == 10 for _, acq in sequence.acquisitions) - - def test_create_platform(platform): assert isinstance(platform, Platform) diff --git a/tests/test_unrolling.py b/tests/test_unrolling.py index a87e3d7d8b..2d612a949b 100644 --- a/tests/test_unrolling.py +++ b/tests/test_unrolling.py @@ -109,10 +109,13 @@ def test_batch(bounds): def test_unroll_sequences(platform: Platform): qubit = next(iter(platform.qubits.values())) + assert qubit.probe is not None natives = platform.natives.single_qubit[0] + assert natives.RX is not None + assert natives.MZ is not None sequence = PulseSequence() sequence.concatenate(natives.RX.create_sequence()) - sequence.append((qubit.probe.name, Delay(duration=sequence.duration))) + sequence.append((qubit.probe, Delay(duration=sequence.duration))) sequence.concatenate(natives.MZ.create_sequence()) total_sequence, readouts = unroll_sequences(10 * [sequence], relaxation_time=10000) assert len(total_sequence.acquisitions) == 10 From 6fad60dce3a329a5dc4cdbd78561baca081b04c6 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 28 Aug 2024 17:51:33 +0200 Subject: [PATCH 0862/1006] test: Update test to Pydantic instruments --- tests/test_instruments_bluefors.py | 6 +++--- tests/test_instruments_oscillator.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test_instruments_bluefors.py b/tests/test_instruments_bluefors.py index 84975b0cdf..af1541bba3 100644 --- a/tests/test_instruments_bluefors.py +++ b/tests/test_instruments_bluefors.py @@ -14,7 +14,7 @@ def test_connect(): with mock.patch("socket.socket"): - tc = TemperatureController("Test_Temperature_Controller", "") + tc = TemperatureController(name="Test_Temperature_Controller", address="") assert tc.is_connected is False # if already connected, it should stay connected for _ in range(2): @@ -25,7 +25,7 @@ def test_connect(): @pytest.mark.parametrize("already_connected", [True, False]) def test_disconnect(already_connected): with mock.patch("socket.socket"): - tc = TemperatureController("Test_Temperature_Controller", "") + tc = TemperatureController(name="Test_Temperature_Controller", address="") if not already_connected: tc.connect() # if already disconnected, it should stay disconnected @@ -39,7 +39,7 @@ def test_continuously_read_data(): "qibolab.instruments.bluefors.TemperatureController.get_data", new=lambda _: yaml.safe_load(messages[0]), ): - tc = TemperatureController("Test_Temperature_Controller", "") + tc = TemperatureController(name="Test_Temperature_Controller", address="") read_temperatures = tc.read_data() for read_temperature in read_temperatures: assert read_temperature == yaml.safe_load(messages[0]) diff --git a/tests/test_instruments_oscillator.py b/tests/test_instruments_oscillator.py index 56a92deacf..166892b0d1 100644 --- a/tests/test_instruments_oscillator.py +++ b/tests/test_instruments_oscillator.py @@ -5,7 +5,7 @@ @pytest.fixture def lo(): - return DummyLocalOscillator("lo", "0") + return DummyLocalOscillator(name="lo", address="0") def test_oscillator_init(lo): From a47877743fab186daeccf27b371e509a82f9060b Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 28 Aug 2024 17:56:19 +0200 Subject: [PATCH 0863/1006] test: Move instruments' tests in a single scope --- tests/conftest.py | 20 ------------------ tests/instruments/__init__.py | 0 tests/instruments/conftest.py | 21 +++++++++++++++++++ .../test_bluefors.py} | 0 .../test_erasynth.py} | 0 .../test_oscillator.py} | 0 .../test_rohde_schwarz.py} | 0 7 files changed, 21 insertions(+), 20 deletions(-) create mode 100644 tests/instruments/__init__.py create mode 100644 tests/instruments/conftest.py rename tests/{test_instruments_bluefors.py => instruments/test_bluefors.py} (100%) rename tests/{test_instruments_erasynth.py => instruments/test_erasynth.py} (100%) rename tests/{test_instruments_oscillator.py => instruments/test_oscillator.py} (100%) rename tests/{test_instruments_rohde_schwarz.py => instruments/test_rohde_schwarz.py} (100%) diff --git a/tests/conftest.py b/tests/conftest.py index de5ba56cd4..ddcdf77261 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -69,26 +69,6 @@ def emulators(): os.environ[PLATFORMS] = str(pathlib.Path(__file__).parent / "emulators") -def find_instrument(platform, instrument_type): - for instrument in platform.instruments.values(): - if isinstance(instrument, instrument_type): - return instrument - return None - - -def get_instrument(platform, instrument_type): - """Finds if an instrument of a given type exists in the given platform. - - If the platform does not have such an instrument, the corresponding - test that asked for this instrument is skipped. This ensures that - QPU tests are executed only on the available instruments. - """ - instrument = find_instrument(platform, instrument_type) - if instrument is None: - pytest.skip(f"Skipping {instrument_type.__name__} test for {platform.name}.") - return instrument - - @pytest.fixture(scope="module", params=TESTING_PLATFORM_NAMES) def platform(request): """Dummy platform to be used when there is no access to QPU. diff --git a/tests/instruments/__init__.py b/tests/instruments/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/instruments/conftest.py b/tests/instruments/conftest.py new file mode 100644 index 0000000000..a997390287 --- /dev/null +++ b/tests/instruments/conftest.py @@ -0,0 +1,21 @@ +import pytest + + +def find_instrument(platform, instrument_type): + for instrument in platform.instruments.values(): + if isinstance(instrument, instrument_type): + return instrument + return None + + +def get_instrument(platform, instrument_type): + """Finds if an instrument of a given type exists in the given platform. + + If the platform does not have such an instrument, the corresponding + test that asked for this instrument is skipped. This ensures that + QPU tests are executed only on the available instruments. + """ + instrument = find_instrument(platform, instrument_type) + if instrument is None: + pytest.skip(f"Skipping {instrument_type.__name__} test for {platform.name}.") + return instrument diff --git a/tests/test_instruments_bluefors.py b/tests/instruments/test_bluefors.py similarity index 100% rename from tests/test_instruments_bluefors.py rename to tests/instruments/test_bluefors.py diff --git a/tests/test_instruments_erasynth.py b/tests/instruments/test_erasynth.py similarity index 100% rename from tests/test_instruments_erasynth.py rename to tests/instruments/test_erasynth.py diff --git a/tests/test_instruments_oscillator.py b/tests/instruments/test_oscillator.py similarity index 100% rename from tests/test_instruments_oscillator.py rename to tests/instruments/test_oscillator.py diff --git a/tests/test_instruments_rohde_schwarz.py b/tests/instruments/test_rohde_schwarz.py similarity index 100% rename from tests/test_instruments_rohde_schwarz.py rename to tests/instruments/test_rohde_schwarz.py From 25f8b8a56f86d4f0853960345a5667e76f19904b Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 28 Aug 2024 18:25:10 +0200 Subject: [PATCH 0864/1006] docs: Fix channel id usage after rebase --- doc/source/getting-started/experiment.rst | 2 +- doc/source/tutorials/calibration.rst | 4 ++-- doc/source/tutorials/lab.rst | 8 +++---- tests/test_platform.py | 26 +++++++++++------------ 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/doc/source/getting-started/experiment.rst b/doc/source/getting-started/experiment.rst index b9621107d1..c6a895b553 100644 --- a/doc/source/getting-started/experiment.rst +++ b/doc/source/getting-started/experiment.rst @@ -221,7 +221,7 @@ We leave to the dedicated tutorial a full explanation of the experiment, but her sequence = natives.MZ.create_sequence() # define a sweeper for a frequency scan - f0 = platform.config(str(qubit.probe.name)).frequency # center frequency + f0 = platform.config(qubit.probe).frequency # center frequency sweeper = Sweeper( parameter=Parameter.frequency, range=(f0 - 2e8, f0 + 2e8, 1e6), diff --git a/doc/source/tutorials/calibration.rst b/doc/source/tutorials/calibration.rst index d55defa4dd..c3d5a2a19f 100644 --- a/doc/source/tutorials/calibration.rst +++ b/doc/source/tutorials/calibration.rst @@ -47,7 +47,7 @@ around the pre-defined frequency. sequence = natives.MZ.create_sequence() # allocate frequency sweeper - f0 = platform.config(str(qubit.probe.name)).frequency + f0 = platform.config(qubit.probe).frequency sweeper = Sweeper( parameter=Parameter.frequency, range=(f0 - 2e8, f0 + 2e8, 1e6), @@ -141,7 +141,7 @@ complex pulse sequence. Therefore with start with that: sequence.concatenate(natives.MZ.create_sequence()) # allocate frequency sweeper - f0 = platform.config(str(qubit.probe.name)).frequency + f0 = platform.config(qubit.probe).frequency sweeper = Sweeper( parameter=Parameter.frequency, range=(f0 - 2e8, f0 + 2e8, 1e6), diff --git a/doc/source/tutorials/lab.rst b/doc/source/tutorials/lab.rst index c3d23c292c..5a16bfb48c 100644 --- a/doc/source/tutorials/lab.rst +++ b/doc/source/tutorials/lab.rst @@ -48,14 +48,14 @@ using different Qibolab primitives. # define configuration for channels configs = {} - configs[qubit.drive.name] = IqConfig(frequency=3e9) - configs[qubit.probe.name] = IqConfig(frequency=7e9) + configs[qubit.drive] = IqConfig(frequency=3e9) + configs[qubit.probe] = IqConfig(frequency=7e9) # create sequence that drives qubit from state 0 to 1 drive_seq = PulseSequence( [ ( - qubit.drive.name, + qubit.drive, Pulse(duration=40, amplitude=0.05, envelope=Gaussian(rel_sigma=0.2)), ) ] @@ -65,7 +65,7 @@ using different Qibolab primitives. probe_seq = PulseSequence( [ ( - qubit.probe.name, + qubit.probe, Pulse(duration=1000, amplitude=0.005, envelope=Rectangular()), ) ] diff --git a/tests/test_platform.py b/tests/test_platform.py index 9c9f0969b3..d89bd0994d 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -227,7 +227,7 @@ def test_platform_execute_one_drive_pulse(qpu_platform): sequence = PulseSequence( [ ( - qubit.drive.name, + qubit.drive, Pulse(duration=200, amplitude=0.07, envelope=Gaussian(0.2)), ) ] @@ -248,7 +248,7 @@ def test_platform_execute_one_coupler_pulse(qpu_platform): sequence = PulseSequence( [ ( - coupler.flux.name, + coupler.flux, Pulse(duration=200, amplitude=0.31, envelope=Rectangular()), ) ] @@ -267,7 +267,7 @@ def test_platform_execute_one_flux_pulse(qpu_platform): sequence = PulseSequence( [ ( - qubit.flux.name, + qubit.flux, Pulse(duration=200, amplitude=0.28, envelope=Rectangular()), ) ] @@ -307,7 +307,7 @@ def test_platform_execute_one_drive_one_readout(qpu_platform): qubit_id, qubit = next(iter(platform.qubits.items())) sequence = PulseSequence() sequence.concatenate(platform.create_RX_pulse(qubit_id)) - sequence.append((qubit.probe.name, Delay(duration=200))) + sequence.append((qubit.probe, Delay(duration=200))) sequence.concatenate(platform.create_MZ_pulse(qubit_id)) platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=nshots)) @@ -323,7 +323,7 @@ def test_platform_execute_multiple_drive_pulses_one_readout(qpu_platform): sequence.concatenate(platform.create_RX_pulse(qubit_id)) sequence.append((qubit.drive.name, Delay(duration=4))) sequence.concatenate(platform.create_RX_pulse(qubit_id)) - sequence.append((qubit.probe.name, Delay(duration=808))) + sequence.append((qubit.probe, Delay(duration=808))) sequence.concatenate(platform.create_MZ_pulse(qubit_id)) platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=nshots)) @@ -340,7 +340,7 @@ def test_platform_execute_multiple_drive_pulses_one_readout_no_spacing( sequence.concatenate(platform.create_RX_pulse(qubit_id)) sequence.concatenate(platform.create_RX_pulse(qubit_id)) sequence.concatenate(platform.create_RX_pulse(qubit_id)) - sequence.append((qubit.probe.name, Delay(duration=800))) + sequence.append((qubit.probe, Delay(duration=800))) sequence.concatenate(platform.create_MZ_pulse(qubit_id)) platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=nshots)) @@ -355,9 +355,9 @@ def test_platform_execute_multiple_overlaping_drive_pulses_one_readout( pulse = Pulse(duration=200, amplitude=0.08, envelope=Gaussian(rel_sigma=1 / 7)) sequence = PulseSequence( [ - (qubit.drive.name, pulse), - (qubit.drive12.name, pulse.model_copy()), - (qubit.probe.name, Delay(duration=800)), + (qubit.drive, pulse), + (qubit.drive12, pulse.model_copy()), + (qubit.probe, Delay(duration=800)), ] ) sequence.concatenate(platform.create_MZ_pulse(qubit_id)) @@ -375,11 +375,11 @@ def test_platform_execute_multiple_readout_pulses(qpu_platform): qd_seq2 = platform.create_RX_pulse(qubit_id) ro_seq2 = platform.create_MZ_pulse(qubit_id) sequence.concatenate(qd_seq1) - sequence.append((qubit.probe.name, Delay(duration=qd_seq1.duration))) + sequence.append((qubit.probe, Delay(duration=qd_seq1.duration))) sequence.concatenate(ro_seq1) sequence.append((qubit.drive.name, Delay(duration=ro_seq1.duration))) sequence.concatenate(qd_seq2) - sequence.append((qubit.probe.name, Delay(duration=qd_seq2.duration))) + sequence.append((qubit.probe, Delay(duration=qd_seq2.duration))) sequence.concatenate(ro_seq2) platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=nshots)) @@ -395,7 +395,7 @@ def test_excited_state_probabilities_pulses(qpu_platform): sequence = PulseSequence() for qubit_id, qubit in platform.qubits.items(): sequence.concatenate(platform.create_RX_pulse(qubit_id)) - sequence.append((qubit.probe.name, Delay(duration=sequence.duration))) + sequence.append((qubit.probe, Delay(duration=sequence.duration))) sequence.concatenate(platform.create_MZ_pulse(qubit_id)) result = platform.execute([sequence], ExecutionParameters(nshots=5000)) @@ -425,7 +425,7 @@ def test_ground_state_probabilities_pulses(qpu_platform, start_zero): if not start_zero: sequence.append( ( - qubit.probe.name, + qubit.probe, Delay( duration=platform.create_RX_pulse(qubit_id).duration, ), From 5ebd2ce5feca071cc790eba14028e47bb266c9d4 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 30 Aug 2024 12:52:06 +0000 Subject: [PATCH 0865/1006] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- tests/conftest.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/conftest.py b/tests/conftest.py index ddcdf77261..ec0d541aec 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -3,7 +3,6 @@ from collections.abc import Callable from typing import Optional -import numpy as np import numpy.typing as npt import pytest From f43f4baabda9c1657378f5bba53d7107d5580ff0 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 30 Aug 2024 17:43:21 +0200 Subject: [PATCH 0866/1006] test: Update tests for channel ids removal --- tests/test_dummy.py | 8 ++++---- tests/test_sweeper.py | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/test_dummy.py b/tests/test_dummy.py index d37e68636a..5ebf96c852 100644 --- a/tests/test_dummy.py +++ b/tests/test_dummy.py @@ -21,13 +21,13 @@ def test_dummy_initialization(platform: Platform): def test_dummy_execute_coupler_pulse(platform: Platform): sequence = PulseSequence() - channel = platform.get_coupler(0).flux + channel = platform.coupler(0)[1].flux pulse = Pulse( duration=30, amplitude=0.05, envelope=GaussianSquare(rel_sigma=5, width=0.75), ) - sequence.append((channel.name, pulse)) + sequence.append((channel, pulse)) options = ExecutionParameters(nshots=None) _ = platform.execute([sequence], options) @@ -41,8 +41,8 @@ def test_dummy_execute_pulse_sequence_couplers(): cz = natives.two_qubit[(1, 2)].CZ.create_sequence() sequence.concatenate(cz) - sequence.append((platform.qubits[0].probe.name, Delay(duration=40))) - sequence.append((platform.qubits[2].probe.name, Delay(duration=40))) + sequence.append((platform.qubits[0].probe, Delay(duration=40))) + sequence.append((platform.qubits[2].probe, Delay(duration=40))) sequence.concatenate(natives.single_qubit[0].MZ.create_sequence()) sequence.concatenate(natives.single_qubit[2].MZ.create_sequence()) options = ExecutionParameters(nshots=None) diff --git a/tests/test_sweeper.py b/tests/test_sweeper.py index ff02cd245f..e673960f8d 100644 --- a/tests/test_sweeper.py +++ b/tests/test_sweeper.py @@ -27,7 +27,7 @@ def test_sweeper_pulses(parameter): @pytest.mark.parametrize("parameter", Parameter) def test_sweeper_channels(parameter): - channel = ChannelId.load("0/probe") + channel = "0/probe" parameter_range = np.random.randint(10, size=10) if parameter in Parameter.channels(): sweeper = Sweeper( @@ -40,7 +40,7 @@ def test_sweeper_channels(parameter): def test_sweeper_errors(): - channel = ChannelId.load("0/probe") + channel = "0/probe" pulse = Pulse( duration=40, amplitude=0.1, From e953ace7fa4232116948fb6ae7c72e580e181b36 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 30 Aug 2024 17:43:55 +0200 Subject: [PATCH 0867/1006] docs: Update docs for channel ids removal --- doc/source/main-documentation/qibolab.rst | 4 ++-- tests/test_sweeper.py | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index 6ccc4bee95..9f3cb84c5f 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -433,7 +433,7 @@ For example: sequence.append((qubit.probe, Delay(duration=sequence.duration))) sequence.concatenate(natives.MZ.create_sequence()) - f0 = platform.config(str(qubit.drive.name)).frequency + f0 = platform.config(str(qubit.drive)).frequency sweeper_freq = Sweeper( parameter=Parameter.frequency, range=(f0 - 100_000, f0 + 100_000, 10_000), @@ -551,7 +551,7 @@ The shape of the values of an integreted acquisition with 2 sweepers will be: .. testcode:: python - f0 = platform.config(str(qubit.drive.name)).frequency + f0 = platform.config(str(qubit.drive)).frequency sweeper1 = Sweeper( parameter=Parameter.frequency, range=(f0 - 100_000, f0 + 100_000, 1), diff --git a/tests/test_sweeper.py b/tests/test_sweeper.py index e673960f8d..7b830604ce 100644 --- a/tests/test_sweeper.py +++ b/tests/test_sweeper.py @@ -1,7 +1,6 @@ import numpy as np import pytest -from qibolab.identifier import ChannelId from qibolab.pulses import Pulse, Rectangular from qibolab.sweeper import Parameter, Sweeper From ab6ad2e6865a33ea49df0f0640a1a687288da527 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 30 Aug 2024 18:38:25 +0200 Subject: [PATCH 0868/1006] fix: Process acquisition channels together with the others --- src/qibolab/instruments/qm/program/instructions.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/qibolab/instruments/qm/program/instructions.py b/src/qibolab/instruments/qm/program/instructions.py index 934b86dd7d..fc4eafbcae 100644 --- a/src/qibolab/instruments/qm/program/instructions.py +++ b/src/qibolab/instruments/qm/program/instructions.py @@ -6,7 +6,6 @@ from qibolab.components import Config from qibolab.execution_parameters import AcquisitionType, ExecutionParameters -from qibolab.identifier import ChannelType from qibolab.pulses import Align, Delay, Pulse, Readout, VirtualZ from qibolab.sweeper import ParallelSweepers, Sweeper @@ -87,9 +86,6 @@ def play(args: ExecutionArguments): processed_aligns = set() for channel_id, pulse in args.sequence: - if channel_id.channel_type is ChannelType.ACQUISITION: - continue - element = str(channel_id) op = operation(pulse) params = args.parameters[op] From 92b8638c9140082f9a223564927bda2206af3387 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 30 Aug 2024 19:04:26 +0200 Subject: [PATCH 0869/1006] fix: Register probe pulses within readouts in qm --- src/qibolab/instruments/qm/controller.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 798d17cfa1..a2691f1907 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -312,6 +312,8 @@ def register_pulses(self, configs: dict[str, Config], sequence: PulseSequence): if isinstance(pulse, Pulse): self.register_pulse(id, pulse) + elif isinstance(pulse, Readout): + self.register_pulse(id, pulse.probe) def register_duration_sweeper_pulses( self, args: ExecutionArguments, sweeper: Sweeper From bce178afeda876f5490aa5360d0909aaca5d0cc4 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 30 Aug 2024 19:14:08 +0200 Subject: [PATCH 0870/1006] fix: Fix event registered Make type check useful, to catch this error later on --- src/qibolab/instruments/qm/controller.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index a2691f1907..894370f6e3 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -5,7 +5,7 @@ from dataclasses import asdict, dataclass from os import PathLike from pathlib import Path -from typing import Optional +from typing import Optional, Union from pydantic import Field from qm import QuantumMachinesManager, SimulationConfig, generate_qua_script @@ -284,16 +284,19 @@ def configure_channels(self, configs: dict[str, Config], channels: set[ChannelId for id in channels: self.configure_channel(id, configs) - def register_pulse(self, channel: ChannelId, pulse: Pulse) -> str: + def register_pulse(self, channel: ChannelId, pulse: Union[Pulse, Readout]) -> str: """Add pulse in the QM ``config``. And return corresponding operation. """ ch = self.channels[channel] if isinstance(ch, DcChannel): + assert isinstance(pulse, Pulse) return self.config.register_dc_pulse(channel, pulse) if isinstance(ch, IqChannel): + assert isinstance(pulse, Pulse) return self.config.register_iq_pulse(channel, pulse) + assert isinstance(pulse, Readout) return self.config.register_acquisition_pulse(channel, pulse) def register_pulses(self, configs: dict[str, Config], sequence: PulseSequence): @@ -313,7 +316,7 @@ def register_pulses(self, configs: dict[str, Config], sequence: PulseSequence): if isinstance(pulse, Pulse): self.register_pulse(id, pulse) elif isinstance(pulse, Readout): - self.register_pulse(id, pulse.probe) + self.register_pulse(id, pulse) def register_duration_sweeper_pulses( self, args: ExecutionArguments, sweeper: Sweeper From d5b7c6f339ee2259923c23ad618ad5c260bf6ba5 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Sun, 1 Sep 2024 02:54:07 +0400 Subject: [PATCH 0871/1006] fix: duration and amplitude sweeper register methods --- src/qibolab/instruments/qm/controller.py | 11 ++++------- src/qibolab/instruments/qm/program/sweepers.py | 2 +- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 894370f6e3..88b4e3cd45 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -330,14 +330,13 @@ def register_duration_sweeper_pulses( continue params = args.parameters[operation(pulse)] - channel_ids = args.sequence.pulse_channels(pulse.id) - channel = self.channels[channel_ids[0]].logical_channel + ids = args.sequence.pulse_channels(pulse.id) original_pulse = ( pulse if params.amplitude_pulse is None else params.amplitude_pulse ) for value in sweeper.values: sweep_pulse = original_pulse.model_copy(update={"duration": value}) - sweep_op = self.register_pulse(channel, sweep_pulse) + sweep_op = self.register_pulse(ids[0], sweep_pulse) params.duration_ops.append((value, sweep_op)) def register_amplitude_sweeper_pulses( @@ -350,13 +349,11 @@ def register_amplitude_sweeper_pulses( """ amplitude = sweeper_amplitude(sweeper.values) for pulse in sweeper.pulses: - channel_ids = args.sequence.pulse_channels(pulse.id) - channel = self.channels[channel_ids[0]].logical_channel sweep_pulse = pulse.model_copy(update={"amplitude": amplitude}) - + ids = args.sequence.pulse_channels(pulse.id) params = args.parameters[operation(pulse)] params.amplitude_pulse = sweep_pulse - params.amplitude_op = self.register_pulse(channel, sweep_pulse) + params.amplitude_op = self.register_pulse(ids[0], sweep_pulse) def register_acquisitions( self, diff --git a/src/qibolab/instruments/qm/program/sweepers.py b/src/qibolab/instruments/qm/program/sweepers.py index 7be03a4af4..07a66f1875 100644 --- a/src/qibolab/instruments/qm/program/sweepers.py +++ b/src/qibolab/instruments/qm/program/sweepers.py @@ -60,7 +60,7 @@ def normalize_phase(values: npt.NDArray) -> npt.NDArray: def normalize_duration(values: npt.NDArray) -> npt.NDArray: """Convert duration from ns to clock cycles (clock cycle = 4ns).""" - if any(values < 16) and not all(values % 4 == 0): + if any(values < 16) or not all(values % 4 == 0): raise ValueError( "Cannot use interpolated duration sweeper for durations that are not multiple of 4ns or are less than 16ns. Please use normal duration sweeper." ) From 035f875b4734c444699c6686ebf328df7b96efaf Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 2 Sep 2024 18:50:07 +0200 Subject: [PATCH 0872/1006] docs: Remove unrequired f-strings Co-authored-by: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> --- doc/source/tutorials/lab.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/source/tutorials/lab.rst b/doc/source/tutorials/lab.rst index 5a16bfb48c..458299a8ea 100644 --- a/doc/source/tutorials/lab.rst +++ b/doc/source/tutorials/lab.rst @@ -194,7 +194,7 @@ the native gates, but separately from the single-qubit ones. # define the pair of qubits two_qubit = TwoQubitContainer( { - f"0-1": TwoQubitNatives( + "0-1": TwoQubitNatives( CZ=FixedSequenceFactory( PulseSequence( [ @@ -239,7 +239,7 @@ will take them into account when calling :class:`qibolab.native.TwoQubitNatives` # define the pair of qubits two_qubit = TwoQubitContainer( { - f"0-1": TwoQubitNatives( + "0-1": TwoQubitNatives( CZ=FixedSequenceFactory( PulseSequence( [ From 3fba10e1ad980ef5a9ded100552bb600b0ff9b92 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 2 Sep 2024 18:51:59 +0200 Subject: [PATCH 0873/1006] docs: Remove one mention to kernels.npz As they are now embedded in the parameters.json --- doc/source/getting-started/experiment.rst | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/doc/source/getting-started/experiment.rst b/doc/source/getting-started/experiment.rst index c6a895b553..e0322d8b51 100644 --- a/doc/source/getting-started/experiment.rst +++ b/doc/source/getting-started/experiment.rst @@ -12,11 +12,9 @@ To define a platform the user needs to provide a folder with the following struc my_platform/ platform.py parameters.json - kernels.npz # (optional) where ``platform.py`` contains instruments information, ``parameters.json`` -includes calibration parameters and ``kernels.npz`` is an optional -file with additional calibration parameters. +includes calibration parameters. More information about defining platforms is provided in :doc:`../tutorials/lab` and several examples can be found at `TII dedicated repository `_. From 431f3a18f4e7450e66a046f71c5d55ee2f75ba4e Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 2 Sep 2024 18:54:39 +0200 Subject: [PATCH 0874/1006] docs: Simplify frequencies settings As they are already in the sweepers --- doc/source/getting-started/experiment.rst | 2 +- doc/source/tutorials/calibration.rst | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/source/getting-started/experiment.rst b/doc/source/getting-started/experiment.rst index e0322d8b51..16d7685a71 100644 --- a/doc/source/getting-started/experiment.rst +++ b/doc/source/getting-started/experiment.rst @@ -239,7 +239,7 @@ We leave to the dedicated tutorial a full explanation of the experiment, but her # plot the results amplitudes = magnitude(results[acq.id][0]) - frequencies = np.arange(-2e8, +2e8, 1e6) + platform.config(qubit.probe).frequency + frequencies = sweeper.values plt.title("Resonator Spectroscopy") plt.xlabel("Frequencies [Hz]") diff --git a/doc/source/tutorials/calibration.rst b/doc/source/tutorials/calibration.rst index c3d5a2a19f..ff5620d7a0 100644 --- a/doc/source/tutorials/calibration.rst +++ b/doc/source/tutorials/calibration.rst @@ -75,7 +75,7 @@ In few seconds, the experiment will be finished and we can proceed to plot it. acq = sequence.acquisitions[0][1] amplitudes = magnitude(results[acq.id][0]) - frequencies = np.arange(-2e8, +2e8, 1e6) + platform.config(qubit.probe).frequency + frequencies = sweeper.values plt.title("Resonator Spectroscopy") plt.xlabel("Frequencies [Hz]") @@ -166,7 +166,7 @@ We can now proceed to launch on hardware: _, acq = next(iter(sequence.acquisitions)) amplitudes = magnitude(results[acq.id][0]) - frequencies = np.arange(-2e8, +2e8, 1e6) + platform.config(qubit.drive).frequency + frequencies = sweeper.values plt.title("Resonator Spectroscopy") plt.xlabel("Frequencies [Hz]") From 0e9e7228a8dc279187300aea84a7ba576b047850 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 2 Sep 2024 18:57:08 +0200 Subject: [PATCH 0875/1006] feat!: Drop channel type --- src/qibolab/identifier.py | 18 ------------------ src/qibolab/sequence.py | 3 +-- tests/test_identifier.py | 5 ----- 3 files changed, 1 insertion(+), 25 deletions(-) delete mode 100644 tests/test_identifier.py diff --git a/src/qibolab/identifier.py b/src/qibolab/identifier.py index 7d713696a5..ae5204f246 100644 --- a/src/qibolab/identifier.py +++ b/src/qibolab/identifier.py @@ -1,4 +1,3 @@ -from enum import Enum from typing import Annotated, Union from pydantic import BeforeValidator, Field, PlainSerializer @@ -14,23 +13,6 @@ """Type for holding ``QubitPair``s in the ``platform.pairs`` dictionary.""" -# TODO: replace with StrEnum, once py3.10 will be abandoned -# at which point, it will also be possible to replace values with auto() -class ChannelType(str, Enum): - """Names of channels that belong to a qubit. - - Not all channels are required to operate a qubit. - """ - - PROBE = "probe" - ACQUISITION = "acquisition" - DRIVE = "drive" - FLUX = "flux" - - def __str__(self) -> str: - return str(self.value) - - ChannelId = str """Unique identifier for a channel.""" diff --git a/src/qibolab/sequence.py b/src/qibolab/sequence.py index 201b1bb706..48e058bfcd 100644 --- a/src/qibolab/sequence.py +++ b/src/qibolab/sequence.py @@ -153,8 +153,7 @@ def acquisitions(self) -> list[tuple[ChannelId, InputOps]]: .. note:: This selects only the :class:`Acquisition` events, and not all the - instructions directed to an acquistion channel (i.e. - :attr:`ChannelType.ACQUISITION`) + instructions directed to an acquistion channel """ # pulse filter needed to exclude delays return [(ch, p) for ch, p in self if isinstance(p, (Acquisition, Readout))] diff --git a/tests/test_identifier.py b/tests/test_identifier.py deleted file mode 100644 index 86dab33406..0000000000 --- a/tests/test_identifier.py +++ /dev/null @@ -1,5 +0,0 @@ -from qibolab.identifier import ChannelType - - -def test_channel_type(): - assert str(ChannelType.ACQUISITION) == "acquisition" From 585eb0b92b7e57f61f97c19443fe0b2c326582a3 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Mon, 2 Sep 2024 20:41:51 +0300 Subject: [PATCH 0876/1006] fix: QM frequency and offset sweeper after dropping channel.name --- src/qibolab/instruments/qm/controller.py | 5 ++- .../instruments/qm/program/arguments.py | 7 ++- .../instruments/qm/program/instructions.py | 3 +- .../instruments/qm/program/sweepers.py | 43 ++++++++++--------- 4 files changed, 33 insertions(+), 25 deletions(-) diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 88b4e3cd45..0c1e2ef5e9 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -29,7 +29,7 @@ from .config import SAMPLING_RATE, QmConfig, operation from .program import ExecutionArguments, create_acquisition, program -from .program.sweepers import check_frequency_bandwidth, sweeper_amplitude +from .program.sweepers import find_lo_frequencies, sweeper_amplitude OCTAVE_ADDRESS_OFFSET = 11000 """Offset to be added to Octave addresses, because they must be 11xxx, where @@ -404,7 +404,8 @@ def preprocess_sweeps( Amplitude and duration sweeps require registering additional pulses in the QM ``config. """ for sweeper in find_sweepers(sweepers, Parameter.frequency): - check_frequency_bandwidth(sweeper.channels, configs, sweeper.values) + channels = [(id, self.channels[id]) for id in sweeper.channels] + find_lo_frequencies(args, channels, configs, sweeper.values) for sweeper in find_sweepers(sweepers, Parameter.amplitude): self.register_amplitude_sweeper_pulses(args, sweeper) for sweeper in find_sweepers(sweepers, Parameter.duration): diff --git a/src/qibolab/instruments/qm/program/arguments.py b/src/qibolab/instruments/qm/program/arguments.py index eaf7cd270e..dd9b428c8c 100644 --- a/src/qibolab/instruments/qm/program/arguments.py +++ b/src/qibolab/instruments/qm/program/arguments.py @@ -1,9 +1,10 @@ from collections import defaultdict from dataclasses import dataclass, field -from typing import Optional +from typing import Optional, Union from qm.qua._dsl import _Variable # for type declaration only +from qibolab.identifier import ChannelId from qibolab.pulses import Pulse from qibolab.sequence import PulseSequence @@ -24,6 +25,8 @@ class Parameters: duration_ops: list[tuple[float, str]] = field(default_factory=list) interpolated: bool = False + lo_frequency: Optional[int] = None + @dataclass class ExecutionArguments: @@ -36,6 +39,6 @@ class ExecutionArguments: sequence: PulseSequence acquisitions: Acquisitions relaxation_time: int = 0 - parameters: dict[str, Parameters] = field( + parameters: dict[Union[str, ChannelId], Parameters] = field( default_factory=lambda: defaultdict(Parameters) ) diff --git a/src/qibolab/instruments/qm/program/instructions.py b/src/qibolab/instruments/qm/program/instructions.py index fc4eafbcae..953ace4f51 100644 --- a/src/qibolab/instruments/qm/program/instructions.py +++ b/src/qibolab/instruments/qm/program/instructions.py @@ -151,7 +151,8 @@ def sweep( method(variable, params) else: for channel in sweeper.channels: - method(variable, channel, configs) + params = args.parameters[channel] + method(variable, params, channel) sweep(sweepers[1:], configs, args) diff --git a/src/qibolab/instruments/qm/program/sweepers.py b/src/qibolab/instruments/qm/program/sweepers.py index 07a66f1875..2b9aa29f39 100644 --- a/src/qibolab/instruments/qm/program/sweepers.py +++ b/src/qibolab/instruments/qm/program/sweepers.py @@ -1,13 +1,13 @@ import numpy as np import numpy.typing as npt -from qibo.config import raise_error from qm import qua from qm.qua._dsl import _Variable # for type declaration only from qibolab.components import Channel, Config +from qibolab.identifier import ChannelId from qibolab.sweeper import Parameter -from .arguments import Parameters +from .arguments import ExecutionArguments, Parameters MAX_OFFSET = 0.5 """Maximum voltage supported by Quantum Machines OPX+ instrument in volts.""" @@ -20,20 +20,26 @@ """Quantum Machines OPX+ frequency bandwidth in Hz.""" -def check_frequency_bandwidth( - channels: list[Channel], configs: dict[str, Channel], values: npt.NDArray +def find_lo_frequencies( + args: ExecutionArguments, + channels: list[tuple[ChannelId, Channel]], + configs: dict[str, Config], + values: npt.NDArray, ): - """Check if frequency sweep is within the supported instrument bandwidth - [-400, 400] MHz.""" - for channel in channels: - name = str(channel.name) + """Register LO frequencies of swept channels in execution arguments. + + These are needed to calculate the proper IF when sweeping frequency. + It also checks if frequency sweep is within the supported instrument + bandwidth [-400, 400] MHz. + """ + for id, channel in channels: lo_frequency = configs[channel.lo].frequency max_freq = max(abs(values - lo_frequency)) if max_freq > FREQUENCY_BANDWIDTH: - raise_error( - ValueError, - f"Frequency {max_freq} for channel {name} is beyond instrument bandwidth.", + raise ValueError( + f"Frequency {max_freq} for channel {id} is beyond instrument bandwidth." ) + args.parameters[id].lo_frequency = int(lo_frequency) def sweeper_amplitude(values: npt.NDArray) -> float: @@ -84,20 +90,17 @@ def _duration_interpolated(variable: _Variable, parameters: Parameters): parameters.interpolated = True -def _offset(variable: _Variable, channel: Channel, configs: dict[str, Config]): - name = str(channel.name) +def _offset(variable: _Variable, parameters: Parameters, element: ChannelId): with qua.if_(variable >= MAX_OFFSET): - qua.set_dc_offset(name, "single", MAX_OFFSET) + qua.set_dc_offset(element, "single", MAX_OFFSET) with qua.elif_(variable <= -MAX_OFFSET): - qua.set_dc_offset(name, "single", -MAX_OFFSET) + qua.set_dc_offset(element, "single", -MAX_OFFSET) with qua.else_(): - qua.set_dc_offset(name, "single", variable) + qua.set_dc_offset(element, "single", variable) -def _frequency(variable: _Variable, channel: Channel, configs: dict[str, Config]): - name = str(channel.name) - lo_frequency = configs[channel.lo].frequency - qua.update_frequency(name, variable - lo_frequency) +def _frequency(variable: _Variable, parameters: Parameters, element: ChannelId): + qua.update_frequency(element, variable - parameters.lo_frequency) INT_TYPE = {Parameter.frequency, Parameter.duration, Parameter.duration_interpolated} From f397fc3473099529e943f10016d342b0fda86ef5 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 3 Sep 2024 14:02:06 +0400 Subject: [PATCH 0877/1006] fix: refactor QM frequency sweeper for resonator spectroscopy to work --- src/qibolab/instruments/qm/controller.py | 13 ++++++++++ .../instruments/qm/program/arguments.py | 3 ++- .../instruments/qm/program/instructions.py | 13 ++++++---- .../instruments/qm/program/sweepers.py | 26 ++++++++++++++----- 4 files changed, 43 insertions(+), 12 deletions(-) diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 0c1e2ef5e9..49b8501d19 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -393,6 +393,14 @@ def register_acquisitions( return acquisitions + def _acquisition_id(self, probe_id: ChannelId) -> Optional[ChannelId]: + """Find id of acquisition channel corresponding to a given probe + channel.""" + for id, channel in self.channels.items(): + if isinstance(channel, AcquireChannel) and channel.probe == probe_id: + return id + return None + def preprocess_sweeps( self, sweepers: list[ParallelSweepers], @@ -406,6 +414,11 @@ def preprocess_sweeps( for sweeper in find_sweepers(sweepers, Parameter.frequency): channels = [(id, self.channels[id]) for id in sweeper.channels] find_lo_frequencies(args, channels, configs, sweeper.values) + for id, channel in channels: + acquisition_id = self._acquisition_id(id) + args.parameters[id].element = ( + id if acquisition_id is None else acquisition_id + ) for sweeper in find_sweepers(sweepers, Parameter.amplitude): self.register_amplitude_sweeper_pulses(args, sweeper) for sweeper in find_sweepers(sweepers, Parameter.duration): diff --git a/src/qibolab/instruments/qm/program/arguments.py b/src/qibolab/instruments/qm/program/arguments.py index dd9b428c8c..bea07652f2 100644 --- a/src/qibolab/instruments/qm/program/arguments.py +++ b/src/qibolab/instruments/qm/program/arguments.py @@ -13,7 +13,7 @@ @dataclass class Parameters: - """Container of swept QUA variables.""" + """Container of QUA variables and other parameters needed for sweeping.""" amplitude: Optional[_Variable] = None amplitude_pulse: Optional[Pulse] = None @@ -25,6 +25,7 @@ class Parameters: duration_ops: list[tuple[float, str]] = field(default_factory=list) interpolated: bool = False + element: Optional[str] = None lo_frequency: Optional[int] = None diff --git a/src/qibolab/instruments/qm/program/instructions.py b/src/qibolab/instruments/qm/program/instructions.py index 953ace4f51..17b717ad75 100644 --- a/src/qibolab/instruments/qm/program/instructions.py +++ b/src/qibolab/instruments/qm/program/instructions.py @@ -7,7 +7,7 @@ from qibolab.components import Config from qibolab.execution_parameters import AcquisitionType, ExecutionParameters from qibolab.pulses import Align, Delay, Pulse, Readout, VirtualZ -from qibolab.sweeper import ParallelSweepers, Sweeper +from qibolab.sweeper import ParallelSweepers, Parameter, Sweeper from ..config import operation from .acquisition import Acquisition @@ -107,14 +107,17 @@ def play(args: ExecutionArguments): qua.wait(args.relaxation_time // 4) -def _process_sweeper(sweeper: Sweeper): +def _process_sweeper(sweeper: Sweeper, args: ExecutionArguments): parameter = sweeper.parameter if parameter not in SWEEPER_METHODS: raise NotImplementedError(f"Sweeper for {parameter} is not implemented.") variable = declare(int) if parameter in INT_TYPE else declare(fixed) values = sweeper.values - if parameter in NORMALIZERS: + if parameter is Parameter.frequency: + lo_frequency = args.parameters[sweeper.channels[0]].lo_frequency + values = NORMALIZERS[parameter](values, lo_frequency) + elif parameter in NORMALIZERS: values = NORMALIZERS[parameter](values) return variable, values @@ -133,7 +136,7 @@ def sweep( parallel_sweepers = sweepers[0] variables, all_values = zip( - *(_process_sweeper(sweeper) for sweeper in parallel_sweepers) + *(_process_sweeper(sweeper, args) for sweeper in parallel_sweepers) ) if len(parallel_sweepers) > 1: loop = qua.for_each_(variables, all_values) @@ -152,7 +155,7 @@ def sweep( else: for channel in sweeper.channels: params = args.parameters[channel] - method(variable, params, channel) + method(variable, params) sweep(sweepers[1:], configs, args) diff --git a/src/qibolab/instruments/qm/program/sweepers.py b/src/qibolab/instruments/qm/program/sweepers.py index 2b9aa29f39..620dd4df89 100644 --- a/src/qibolab/instruments/qm/program/sweepers.py +++ b/src/qibolab/instruments/qm/program/sweepers.py @@ -32,6 +32,11 @@ def find_lo_frequencies( It also checks if frequency sweep is within the supported instrument bandwidth [-400, 400] MHz. """ + los = {channel.lo for _, channel in channels} + if len(los) > 1: + raise ValueError( + "Cannot sweep frequency of channels using different LO using the same `Sweeper` object. Please use parallel sweepers instead." + ) for id, channel in channels: lo_frequency = configs[channel.lo].frequency max_freq = max(abs(values - lo_frequency)) @@ -73,6 +78,14 @@ def normalize_duration(values: npt.NDArray) -> npt.NDArray: return (values // 4).astype(int) +def normalize_frequency(values: npt.NDArray, lo_frequency: int) -> npt.NDArray: + """Convert frequencies to integer and substract LO frequency. + + Because QUA does not support large numbers of ``fixed`` type. + """ + return (values - lo_frequency).astype(int) + + def _amplitude(variable: _Variable, parameters: Parameters): parameters.amplitude = qua.amp(variable) @@ -90,17 +103,17 @@ def _duration_interpolated(variable: _Variable, parameters: Parameters): parameters.interpolated = True -def _offset(variable: _Variable, parameters: Parameters, element: ChannelId): +def _offset(variable: _Variable, parameters: Parameters): with qua.if_(variable >= MAX_OFFSET): - qua.set_dc_offset(element, "single", MAX_OFFSET) + qua.set_dc_offset(parameters.element, "single", MAX_OFFSET) with qua.elif_(variable <= -MAX_OFFSET): - qua.set_dc_offset(element, "single", -MAX_OFFSET) + qua.set_dc_offset(parameters.element, "single", -MAX_OFFSET) with qua.else_(): - qua.set_dc_offset(element, "single", variable) + qua.set_dc_offset(parameters.element, "single", variable) -def _frequency(variable: _Variable, parameters: Parameters, element: ChannelId): - qua.update_frequency(element, variable - parameters.lo_frequency) +def _frequency(variable: _Variable, parameters: Parameters): + qua.update_frequency(parameters.element, variable) INT_TYPE = {Parameter.frequency, Parameter.duration, Parameter.duration_interpolated} @@ -110,6 +123,7 @@ def _frequency(variable: _Variable, parameters: Parameters, element: ChannelId): """ NORMALIZERS = { + Parameter.frequency: normalize_frequency, Parameter.amplitude: normalize_amplitude, Parameter.relative_phase: normalize_phase, Parameter.duration_interpolated: normalize_duration, From e177618144920d27bc814a12940ee9f229cc18d4 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 3 Sep 2024 14:11:23 +0400 Subject: [PATCH 0878/1006] fix: docstring --- src/qibolab/instruments/qm/program/sweepers.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/qibolab/instruments/qm/program/sweepers.py b/src/qibolab/instruments/qm/program/sweepers.py index 620dd4df89..7b63ba3a6a 100644 --- a/src/qibolab/instruments/qm/program/sweepers.py +++ b/src/qibolab/instruments/qm/program/sweepers.py @@ -79,9 +79,10 @@ def normalize_duration(values: npt.NDArray) -> npt.NDArray: def normalize_frequency(values: npt.NDArray, lo_frequency: int) -> npt.NDArray: - """Convert frequencies to integer and substract LO frequency. + """Convert frequencies to integer and subtract LO frequency. - Because QUA does not support large numbers of ``fixed`` type. + QUA gives an error if the raw frequency values are uploaded to sweep + over. """ return (values - lo_frequency).astype(int) From 316ecdc1dd055e7336ed07f3e7be61f49f09648e Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 3 Sep 2024 14:16:54 +0400 Subject: [PATCH 0879/1006] chore: relax requirement of LO to frequencies --- src/qibolab/instruments/qm/program/sweepers.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/qibolab/instruments/qm/program/sweepers.py b/src/qibolab/instruments/qm/program/sweepers.py index 7b63ba3a6a..92d55e92fe 100644 --- a/src/qibolab/instruments/qm/program/sweepers.py +++ b/src/qibolab/instruments/qm/program/sweepers.py @@ -32,13 +32,13 @@ def find_lo_frequencies( It also checks if frequency sweep is within the supported instrument bandwidth [-400, 400] MHz. """ - los = {channel.lo for _, channel in channels} - if len(los) > 1: + lo_freqs = {configs[channel.lo].frequency for _, channel in channels} + if len(lo_freqs) > 1: raise ValueError( "Cannot sweep frequency of channels using different LO using the same `Sweeper` object. Please use parallel sweepers instead." ) + lo_frequency = lo_freqs.pop() for id, channel in channels: - lo_frequency = configs[channel.lo].frequency max_freq = max(abs(values - lo_frequency)) if max_freq > FREQUENCY_BANDWIDTH: raise ValueError( From 65fd5ba67e4cabe5b264f40dcd1340ebc87c3296 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 7 Aug 2024 20:51:41 +0200 Subject: [PATCH 0880/1006] feat: Define pulse id, establish module export --- src/qibolab/pulses/pulse.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index 2b03b3e585..1cdc30eee9 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -9,10 +9,21 @@ from .envelope import Envelope, IqWaveform, Waveform +__all__ = [ + "Delay", + "Pulse", + "PulseId", + "PulseLike", + "VirtualZ", +] + +PulseId = int +"""Unique identifier for a pulse.""" + class _PulseLike(Model): @property - def id(self) -> int: + def id(self) -> PulseId: """Instruction identifier.""" return id(self) From 9f8ace2330968e724c44146be75e330cf9a0d2b8 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 7 Aug 2024 20:51:55 +0200 Subject: [PATCH 0881/1006] docs: Improve some docstrings style --- src/qibolab/pulses/pulse.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index 1cdc30eee9..1d0b41165d 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -54,17 +54,17 @@ class Pulse(_PulseLike): """Relative phase of the pulse, in radians.""" def i(self, sampling_rate: float) -> Waveform: - """The envelope waveform of the i component of the pulse.""" + """Compute the envelope of the waveform i component.""" samples = int(self.duration * sampling_rate) return self.amplitude * self.envelope.i(samples) def q(self, sampling_rate: float) -> Waveform: - """The envelope waveform of the q component of the pulse.""" + """Compute the envelope of the waveform q component.""" samples = int(self.duration * sampling_rate) return self.amplitude * self.envelope.q(samples) def envelopes(self, sampling_rate: float) -> IqWaveform: - """A tuple with the i and q envelope waveforms of the pulse.""" + """Compute a tuple with the i and q envelopes.""" return np.array([self.i(sampling_rate), self.q(sampling_rate)]) From 8d28dce6898cb676c11b20edf04c9e43dc8f3c89 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 7 Aug 2024 20:58:08 +0200 Subject: [PATCH 0882/1006] fix: Spell out execution return type --- src/qibolab/platform/platform.py | 8 +++++--- src/qibolab/pulses/__init__.py | 11 ++++++++++- src/qibolab/result.py | 3 +++ 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index f35ac34bf4..196299bf0d 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -5,7 +5,7 @@ from dataclasses import dataclass, field from math import prod from pathlib import Path -from typing import Any, Literal, Optional, TypeVar, Union +from typing import Literal, Optional, TypeVar, Union from qibo.config import log, raise_error @@ -15,7 +15,9 @@ from qibolab.identifier import ChannelId, QubitId, QubitPairId from qibolab.instruments.abstract import Controller, Instrument, InstrumentId from qibolab.parameters import NativeGates, Parameters, Settings, update_configs +from qibolab.pulses import PulseId from qibolab.qubits import Qubit +from qibolab.result import Result from qibolab.sequence import PulseSequence from qibolab.sweeper import ParallelSweepers from qibolab.unrolling import Bounds, batch @@ -202,7 +204,7 @@ def _execute( options: ExecutionParameters, configs: dict[str, Config], sweepers: list[ParallelSweepers], - ): + ) -> dict[PulseId, Result]: """Execute sequences on the controllers.""" result = {} @@ -219,7 +221,7 @@ def execute( sequences: list[PulseSequence], options: ExecutionParameters, sweepers: Optional[list[ParallelSweepers]] = None, - ) -> dict[Any, list]: + ) -> dict[PulseId, list[Result]]: """Execute pulse sequences. If any sweeper is passed, the execution is performed for the different values diff --git a/src/qibolab/pulses/__init__.py b/src/qibolab/pulses/__init__.py index d8e1abcbdd..a26fa99880 100644 --- a/src/qibolab/pulses/__init__.py +++ b/src/qibolab/pulses/__init__.py @@ -1,2 +1,11 @@ from .envelope import * -from .pulse import Acquisition, Align, Delay, Pulse, PulseLike, Readout, VirtualZ +from .pulse import ( + Acquisition, + Align, + Delay, + Pulse, + PulseId, + PulseLike, + Readout, + VirtualZ, +) diff --git a/src/qibolab/result.py b/src/qibolab/result.py index 675b8091ec..4681ba9f0f 100644 --- a/src/qibolab/result.py +++ b/src/qibolab/result.py @@ -10,6 +10,9 @@ innermost dimension of the array. """ +Result = npt.NDArray[np.float64] +"""An array of results.""" + def _lift(values: IQ) -> npt.NDArray: """Transpose the innermost dimension to the outermost.""" From e206f52dc05f0f1a4de8e554d9b052634fee8cd7 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 3 Sep 2024 13:26:02 +0200 Subject: [PATCH 0883/1006] feat!: Enforce unique acqusitions in executed sequences --- src/qibolab/platform/platform.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 196299bf0d..8d13d35541 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -39,6 +39,11 @@ def default(value: Optional[T], default: T) -> T: return value if value is not None else default +def _channels_map(elements: QubitMap) -> dict[ChannelId, QubitId]: + """Map channel names to element (qubit or coupler).""" + return {ch: id for id, el in elements.items() for ch in el.channels} + + def estimate_duration( sequences: list[PulseSequence], options: ExecutionParameters, @@ -56,9 +61,13 @@ def estimate_duration( ) -def _channels_map(elements: QubitMap) -> dict[ChannelId, QubitId]: - """Map channel names to element (qubit or coupler).""" - return {ch: id for id, el in elements.items() for ch in el.channels} +def _unique_acquisitions(sequences: list[PulseSequence]) -> bool: + """Check unique acquisition identifiers.""" + ids = [] + for seq in sequences: + ids += (id for id, _ in seq.acquisitions) + + return len(ids) == len(set(ids)) @dataclass @@ -255,6 +264,10 @@ def execute( """ if sweepers is None: sweepers = [] + if not _unique_acquisitions(sequences): + raise ValueError( + "The acquisitions identifiers have to be unique across all sequences." + ) options = self.settings.fill(options) From 17105ef6fcad4eb7144059526d8af2d174a45ac8 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 3 Sep 2024 13:26:36 +0200 Subject: [PATCH 0884/1006] feat!: Flatten execution results --- src/qibolab/platform/platform.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 8d13d35541..156866bc35 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -1,6 +1,5 @@ """A platform for executing quantum algorithms.""" -from collections import defaultdict from collections.abc import Iterable from dataclasses import dataclass, field from math import prod @@ -230,7 +229,7 @@ def execute( sequences: list[PulseSequence], options: ExecutionParameters, sweepers: Optional[list[ParallelSweepers]] = None, - ) -> dict[PulseId, list[Result]]: + ) -> dict[PulseId, Result]: """Execute pulse sequences. If any sweeper is passed, the execution is performed for the different values @@ -277,20 +276,18 @@ def execute( configs = self.parameters.configs.copy() update_configs(configs, options.updates) - # for components that represent aux external instruments (e.g. lo) to the main control instrument - # set the config directly + # for components that represent aux external instruments (e.g. lo) to the main + # control instrument set the config directly for name, cfg in configs.items(): if name in self.instruments: self.instruments[name].setup(**cfg.model_dump(exclude={"kind"})) - results = defaultdict(list) + results = {} # pylint: disable=unsubscriptable-object bounds = self.parameters.configs[self._controller.bounds] assert isinstance(bounds, Bounds) for b in batch(sequences, bounds): - result = self._execute(b, options, configs, sweepers) - for serial, data in result.items(): - results[serial].append(data) + results |= self._execute(b, options, configs, sweepers) return results From 35ff807bc0a0bf1bfa7aa12209080a84bbb6b2c5 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 3 Sep 2024 14:58:00 +0200 Subject: [PATCH 0885/1006] fix: Update backend to flattened results --- src/qibolab/backends.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/qibolab/backends.py b/src/qibolab/backends.py index 4b460849b9..22ceeeaa28 100644 --- a/src/qibolab/backends.py +++ b/src/qibolab/backends.py @@ -1,5 +1,3 @@ -from collections import deque - import numpy as np from qibo import __version__ as qibo_version from qibo.backends import NumpyBackend @@ -106,7 +104,7 @@ def execute_circuit(self, circuit, initial_state=None, nshots=1000): [sequence], ExecutionParameters(nshots=nshots), ) - readout = {k: v[0] for k, v in readout_.items()} + readout = {k: v for k, v in readout_.items()} self.platform.disconnect() @@ -153,15 +151,12 @@ def execute_circuits(self, circuits, initial_states=None, nshots=1000): self.platform.disconnect() results = [] - readout = {k: deque(v) for k, v in readout.items()} for circuit, measurement_map in zip(circuits, measurement_maps): results.append( MeasurementOutcomes(circuit.measurements, self, nshots=nshots) ) for gate, sequence in measurement_map.items(): - samples = [ - readout[acq.id].popleft() for _, acq in sequence.acquisitions - ] + samples = [readout[acq.id] for _, acq in sequence.acquisitions] gate.result.backend = self gate.result.register_samples(np.array(samples).T) return results From 9363607849739f66b23ac61c4e5f6b9cde601bf1 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 3 Sep 2024 14:58:37 +0200 Subject: [PATCH 0886/1006] fix: Use pulse id to check unique acquisitions Not channels' ones --- src/qibolab/platform/platform.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 156866bc35..1012d29afb 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -64,7 +64,7 @@ def _unique_acquisitions(sequences: list[PulseSequence]) -> bool: """Check unique acquisition identifiers.""" ids = [] for seq in sequences: - ids += (id for id, _ in seq.acquisitions) + ids += (p.id for _, p in seq.acquisitions) return len(ids) == len(set(ids)) @@ -265,7 +265,7 @@ def execute( sweepers = [] if not _unique_acquisitions(sequences): raise ValueError( - "The acquisitions identifiers have to be unique across all sequences." + "The acquisitions' identifiers have to be unique across all sequences." ) options = self.settings.fill(options) From c956fddd8ad3af4d4ba71b4ce5377aadd7cd67d1 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 3 Sep 2024 15:19:14 +0200 Subject: [PATCH 0887/1006] fix: Always return new sequences with native creator --- src/qibolab/native.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/qibolab/native.py b/src/qibolab/native.py index a2bed8eee1..2c4ad3246a 100644 --- a/src/qibolab/native.py +++ b/src/qibolab/native.py @@ -1,4 +1,5 @@ from abc import ABC, abstractmethod +from copy import deepcopy from typing import Annotated, Optional import numpy as np @@ -78,7 +79,7 @@ class FixedSequenceFactory(Native): """Simple factory for a fixed arbitrary sequence.""" def create_sequence(self) -> PulseSequence: - return self.copy() + return deepcopy(self) class MissingNative(RuntimeError): From 6f101538083f81eb3b8222946c8b77fed1068a14 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 3 Sep 2024 15:19:47 +0200 Subject: [PATCH 0888/1006] fix: Avoid creating twice measurement sequences --- src/qibolab/backends.py | 7 +++++-- src/qibolab/compilers/compiler.py | 6 ++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/qibolab/backends.py b/src/qibolab/backends.py index 22ceeeaa28..73552a2021 100644 --- a/src/qibolab/backends.py +++ b/src/qibolab/backends.py @@ -67,8 +67,11 @@ def assign_measurements(self, measurement_map, readout): containing the readout measurement shots. This is created in ``execute_circuit``. """ for gate, sequence in measurement_map.items(): - _samples = (readout[acq.id] for _, acq in sequence.acquisitions) - samples = list(filter(lambda x: x is not None, _samples)) + samples = [ + s + for s in (readout[acq.id] for _, acq in sequence.acquisitions) + if s is not None + ] gate.result.backend = self gate.result.register_samples(np.array(samples).T) diff --git a/src/qibolab/compilers/compiler.py b/src/qibolab/compilers/compiler.py index 20b3ddd152..9031901be3 100644 --- a/src/qibolab/compilers/compiler.py +++ b/src/qibolab/compilers/compiler.py @@ -197,11 +197,13 @@ def compile( # process circuit gates for moment in circuit.queue.moments: for gate in {x for x in moment if x is not None}: - sequence += self._compile_gate(gate, platform, channel_clock) + gate_seq = self._compile_gate(gate, platform, channel_clock) # register readout sequences to ``measurement_map`` so that we can # properly map acquisition results to measurement gates if isinstance(gate, gates.M): - measurement_map[gate] = self.get_sequence(gate, platform) + measurement_map[gate] = gate_seq + + sequence += gate_seq return sequence.trim(), measurement_map From 6c649138202aa794d51d8f781809b6b18b924ddb Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 3 Sep 2024 15:33:17 +0200 Subject: [PATCH 0889/1006] test: Upgrade dummy tests to new result's type --- tests/test_dummy.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/tests/test_dummy.py b/tests/test_dummy.py index 5ebf96c852..421c34d50a 100644 --- a/tests/test_dummy.py +++ b/tests/test_dummy.py @@ -1,3 +1,5 @@ +from copy import deepcopy + import pytest from qibolab import AcquisitionType, ExecutionParameters, create_platform @@ -63,12 +65,12 @@ def test_dummy_execute_pulse_sequence_unrolling( sequence = PulseSequence() sequence.concatenate(natives.single_qubit[0].MZ.create_sequence()) for _ in range(nsequences): - sequences.append(sequence) + sequences.append(deepcopy(sequence)) options = ExecutionParameters(nshots=nshots, acquisition_type=acquisition) result = platform.execute(sequences, options) - assert len(next(iter(result.values()))) == nsequences - for r in result[0]: + assert len(next(iter(result.values()))) == nshots + for r in result.values(): if acquisition is AcquisitionType.INTEGRATION: - assert r.magnitude.shape == (nshots,) + assert r.shape == (nshots, 2) if acquisition is AcquisitionType.DISCRIMINATION: - assert r.samples.shape == (nshots,) + assert r.shape == (nshots,) From 8acf45bf0fa01c486c7cb35c5f97bed09d8c90c3 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 3 Sep 2024 15:35:13 +0200 Subject: [PATCH 0890/1006] test: Upgrade executo fixture to new result's type --- tests/conftest.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index ec0d541aec..ad89ecba22 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -112,7 +112,7 @@ def wrapped( nshots: int = 1000, sweepers: Optional[list[ParallelSweepers]] = None, sequence: Optional[PulseSequence] = None, - target: Optional[tuple[int, int]] = None, + target: Optional[int] = None, ) -> npt.NDArray: options = ExecutionParameters( nshots=nshots, @@ -145,13 +145,13 @@ def wrapped( ) sweepers = [[sweeper1], [sweeper2]] if target is None: - target = (acq.id, 0) + target = acq.id # default target and sweepers only supported for default sequence assert target is not None assert sweepers is not None results = connected_platform.execute([sequence], options, sweepers) - return results[target[0]][target[1]] + return results[target] return wrapped From 609cc3cbaeeb5185f47d702656356b325c566459 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 3 Sep 2024 15:39:20 +0200 Subject: [PATCH 0891/1006] docs: Upgrade docs examples to new results' type --- doc/source/getting-started/experiment.rst | 2 +- doc/source/tutorials/calibration.rst | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/doc/source/getting-started/experiment.rst b/doc/source/getting-started/experiment.rst index 16d7685a71..221d94bfae 100644 --- a/doc/source/getting-started/experiment.rst +++ b/doc/source/getting-started/experiment.rst @@ -238,7 +238,7 @@ We leave to the dedicated tutorial a full explanation of the experiment, but her _, acq = next(iter(sequence.acquisitions)) # plot the results - amplitudes = magnitude(results[acq.id][0]) + amplitudes = magnitude(results[acq.id]) frequencies = sweeper.values plt.title("Resonator Spectroscopy") diff --git a/doc/source/tutorials/calibration.rst b/doc/source/tutorials/calibration.rst index ff5620d7a0..090c383324 100644 --- a/doc/source/tutorials/calibration.rst +++ b/doc/source/tutorials/calibration.rst @@ -74,7 +74,7 @@ In few seconds, the experiment will be finished and we can proceed to plot it. import matplotlib.pyplot as plt acq = sequence.acquisitions[0][1] - amplitudes = magnitude(results[acq.id][0]) + amplitudes = magnitude(results[acq.id]) frequencies = sweeper.values plt.title("Resonator Spectroscopy") @@ -165,7 +165,7 @@ We can now proceed to launch on hardware: results = platform.execute([sequence], options, [[sweeper]]) _, acq = next(iter(sequence.acquisitions)) - amplitudes = magnitude(results[acq.id][0]) + amplitudes = magnitude(results[acq.id]) frequencies = sweeper.values plt.title("Resonator Spectroscopy") @@ -258,12 +258,12 @@ and its impact on qubit states in the IQ plane. plt.xlabel("I [a.u.]") plt.ylabel("Q [a.u.]") plt.scatter( - results_one[acq1.id][0], - results_one[acq1.id][0], + results_one[acq1.id], + results_one[acq1.id], label="One state", ) plt.scatter( - *unpack(results_zero[acq0.id][0]), + *unpack(results_zero[acq0.id]), label="Zero state", ) plt.show() From 30bd7c511a7b7922a7b555a030d7f8565a1233d6 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 3 Sep 2024 15:54:50 +0200 Subject: [PATCH 0892/1006] test: Add test to detect sequences' shallow copies --- tests/test_native.py | 2 ++ tests/test_platform.py | 15 +++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/tests/test_native.py b/tests/test_native.py index 460dad149f..dd215bc8cf 100644 --- a/tests/test_native.py +++ b/tests/test_native.py @@ -35,6 +35,8 @@ def test_fixed_sequence_factory(): fseq2 = factory.create_sequence() assert fseq1 == seq assert fseq2 == seq + # while representing the same sequence, the objects are actually different + assert fseq1[0][1].id != fseq2[0][1].id np = "new/probe" fseq1.append( diff --git a/tests/test_platform.py b/tests/test_platform.py index d89bd0994d..5c978d5c9a 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -107,6 +107,21 @@ def test_platform_sampling_rate(platform): assert platform.sampling_rate >= 1 +def test_duplicated_acquisition(): + """A shallow copy will duplicate the object. + + This leads to non-unique identifiers across all sequences, and it's + then flagged as an error (since unique identifiers are assumed in + the return type, to avoid overwriting dict entries). + """ + platform = create_platform("dummy") + sequence = platform.natives.single_qubit[0].MZ.create_sequence() + + options = ExecutionParameters(nshots=None) + with pytest.raises(ValueError, match="unique"): + _ = platform.execute([sequence, sequence.copy()], options) + + def test_update_configs(platform): drive_name = "q0/drive" pump_name = "twpa_pump" From a7ef4ec5a11ed2e143b7ecb4a6a5c9883caecdc0 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 3 Sep 2024 17:16:05 +0200 Subject: [PATCH 0893/1006] test: Simplify sequence creation Thanks @stavros11 --- tests/test_dummy.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/tests/test_dummy.py b/tests/test_dummy.py index 421c34d50a..b5a332771e 100644 --- a/tests/test_dummy.py +++ b/tests/test_dummy.py @@ -1,5 +1,3 @@ -from copy import deepcopy - import pytest from qibolab import AcquisitionType, ExecutionParameters, create_platform @@ -62,10 +60,8 @@ def test_dummy_execute_pulse_sequence_unrolling( nsequences = 10 natives = platform.natives sequences = [] - sequence = PulseSequence() - sequence.concatenate(natives.single_qubit[0].MZ.create_sequence()) for _ in range(nsequences): - sequences.append(deepcopy(sequence)) + sequences.append(natives.single_qubit[0].MZ.create_sequence()) options = ExecutionParameters(nshots=nshots, acquisition_type=acquisition) result = platform.execute(sequences, options) assert len(next(iter(result.values()))) == nshots From bcf9c9df7d732bf9e3cbde73c68d5159c0ea257a Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 3 Sep 2024 19:16:42 +0400 Subject: [PATCH 0894/1006] refactor: implement hash-map from probe to acquire channels --- src/qibolab/instruments/qm/controller.py | 50 ++++++++++++++---------- 1 file changed, 30 insertions(+), 20 deletions(-) diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 49b8501d19..3a11df8d61 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -244,8 +244,14 @@ def configure_device(self, device: str): else: self.config.add_controller(device) - def configure_channel(self, channel: ChannelId, configs: dict[str, Config]): - """Add element (QM version of channel) in the config.""" + def configure_channel( + self, channel: ChannelId, configs: dict[str, Config] + ) -> Optional[ChannelId]: + """Add element (QM version of channel) in the config. + + When an ``AcquireChannel`` is registered it returns the corresponding probe + channel in order to build an (acquisition, probe) map. + """ config = configs[channel] ch = self.channels[channel] self.configure_device(ch.device) @@ -275,14 +281,28 @@ def configure_channel(self, channel: ChannelId, configs: dict[str, Config]): self.config.configure_acquire_line( channel, ch, probe, config, probe_config, lo_config ) + return ch.probe else: raise TypeError(f"Unknown channel type: {type(ch)}.") - def configure_channels(self, configs: dict[str, Config], channels: set[ChannelId]): - """Register channels in the sequence in the QM ``config``.""" + return None + + def configure_channels( + self, configs: dict[str, Config], channels: set[ChannelId] + ) -> dict[ChannelId, ChannelId]: + """Register channels in the sequence in the QM ``config``. + + Builds a map from probe channels to the corresponding ``AcquireChannel``. + This is useful when sweeping frequency of probe channels, as these are + registered as acquire elements in the QM config. + """ + probe_map = {} for id in channels: - self.configure_channel(id, configs) + probe = self.configure_channel(id, configs) + if probe is not None: + probe_map[probe] = id + return probe_map def register_pulse(self, channel: ChannelId, pulse: Union[Pulse, Readout]) -> str: """Add pulse in the QM ``config``. @@ -393,19 +413,12 @@ def register_acquisitions( return acquisitions - def _acquisition_id(self, probe_id: ChannelId) -> Optional[ChannelId]: - """Find id of acquisition channel corresponding to a given probe - channel.""" - for id, channel in self.channels.items(): - if isinstance(channel, AcquireChannel) and channel.probe == probe_id: - return id - return None - def preprocess_sweeps( self, sweepers: list[ParallelSweepers], configs: dict[str, Config], args: ExecutionArguments, + probe_map: dict[ChannelId, ChannelId], ): """Preprocessing and checks needed before executing some sweeps. @@ -414,11 +427,8 @@ def preprocess_sweeps( for sweeper in find_sweepers(sweepers, Parameter.frequency): channels = [(id, self.channels[id]) for id in sweeper.channels] find_lo_frequencies(args, channels, configs, sweeper.values) - for id, channel in channels: - acquisition_id = self._acquisition_id(id) - args.parameters[id].element = ( - id if acquisition_id is None else acquisition_id - ) + for id in sweeper.channels: + args.parameters[id].element = probe_map.get(id, id) for sweeper in find_sweepers(sweepers, Parameter.amplitude): self.register_amplitude_sweeper_pulses(args, sweeper) for sweeper in find_sweepers(sweepers, Parameter.duration): @@ -462,12 +472,12 @@ def play( if isinstance(channel, DcChannel): self.configure_channel(id, configs) - self.configure_channels(configs, sequence.channels) + probe_map = self.configure_channels(configs, sequence.channels) self.register_pulses(configs, sequence) acquisitions = self.register_acquisitions(configs, sequence, options) args = ExecutionArguments(sequence, acquisitions, options.relaxation_time) - self.preprocess_sweeps(sweepers, configs, args) + self.preprocess_sweeps(sweepers, configs, args, probe_map) experiment = program(configs, args, options, sweepers) if self.script_file_name is not None: From b12602e070ebc81469c08731bc091e068ff3a971 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 3 Sep 2024 18:43:17 +0300 Subject: [PATCH 0895/1006] chore: remove result.py --- doc/source/getting-started/experiment.rst | 4 +- doc/source/tutorials/calibration.rst | 11 +-- src/qibolab/identifier.py | 6 ++ src/qibolab/instruments/abstract.py | 5 +- .../instruments/qm/program/acquisition.py | 9 +- src/qibolab/platform/platform.py | 3 +- src/qibolab/result.py | 91 ------------------- tests/test_result.py | 34 ------- 8 files changed, 22 insertions(+), 141 deletions(-) delete mode 100644 src/qibolab/result.py delete mode 100644 tests/test_result.py diff --git a/doc/source/getting-started/experiment.rst b/doc/source/getting-started/experiment.rst index 221d94bfae..28f6386e0a 100644 --- a/doc/source/getting-started/experiment.rst +++ b/doc/source/getting-started/experiment.rst @@ -202,7 +202,6 @@ We leave to the dedicated tutorial a full explanation of the experiment, but her from qibolab import create_platform from qibolab.sequence import PulseSequence - from qibolab.result import magnitude from qibolab.sweeper import Sweeper, Parameter from qibolab.execution_parameters import ( ExecutionParameters, @@ -238,7 +237,8 @@ We leave to the dedicated tutorial a full explanation of the experiment, but her _, acq = next(iter(sequence.acquisitions)) # plot the results - amplitudes = magnitude(results[acq.id]) + signal_i, signal_q = np.moveaxis(results[acq.id], -1, 0) + amplitudes = np.abs(signal_i + 1j * signal_q) frequencies = sweeper.values plt.title("Resonator Spectroscopy") diff --git a/doc/source/tutorials/calibration.rst b/doc/source/tutorials/calibration.rst index 090c383324..db32b9d4ed 100644 --- a/doc/source/tutorials/calibration.rst +++ b/doc/source/tutorials/calibration.rst @@ -31,7 +31,6 @@ around the pre-defined frequency. import numpy as np from qibolab import create_platform from qibolab.sequence import PulseSequence - from qibolab.result import magnitude from qibolab.sweeper import Sweeper, Parameter from qibolab.execution_parameters import ( ExecutionParameters, @@ -74,7 +73,8 @@ In few seconds, the experiment will be finished and we can proceed to plot it. import matplotlib.pyplot as plt acq = sequence.acquisitions[0][1] - amplitudes = magnitude(results[acq.id]) + signal_i, signal_q = np.moveaxis(results[acq.id], -1, 0) + amplitudes = np.abs(signal_i + 1j * signal_q) frequencies = sweeper.values plt.title("Resonator Spectroscopy") @@ -113,7 +113,6 @@ complex pulse sequence. Therefore with start with that: from qibolab import create_platform from qibolab.pulses import Pulse, Delay, Gaussian from qibolab.sequence import PulseSequence - from qibolab.result import magnitude from qibolab.sweeper import Sweeper, Parameter from qibolab.execution_parameters import ( ExecutionParameters, @@ -165,7 +164,8 @@ We can now proceed to launch on hardware: results = platform.execute([sequence], options, [[sweeper]]) _, acq = next(iter(sequence.acquisitions)) - amplitudes = magnitude(results[acq.id]) + signal_i, signal_q = np.moveaxis(results[acq.id], -1, 0) + amplitudes = np.abs(signal_i + 1j * signal_q) frequencies = sweeper.values plt.title("Resonator Spectroscopy") @@ -218,7 +218,6 @@ and its impact on qubit states in the IQ plane. from qibolab import create_platform from qibolab.pulses import Delay from qibolab.sequence import PulseSequence - from qibolab.result import unpack from qibolab.sweeper import Sweeper, Parameter from qibolab.execution_parameters import ( ExecutionParameters, @@ -263,7 +262,7 @@ and its impact on qubit states in the IQ plane. label="One state", ) plt.scatter( - *unpack(results_zero[acq0.id]), + *tuple(np.moveaxis(results_zero[acq0.id], -1, 0)), label="Zero state", ) plt.show() diff --git a/src/qibolab/identifier.py b/src/qibolab/identifier.py index ae5204f246..98abec142f 100644 --- a/src/qibolab/identifier.py +++ b/src/qibolab/identifier.py @@ -1,5 +1,7 @@ from typing import Annotated, Union +import numpy as np +import numpy.typing as npt from pydantic import BeforeValidator, Field, PlainSerializer QubitId = Annotated[Union[int, str], Field(union_mode="left_to_right")] @@ -41,3 +43,7 @@ def _join(pair: tuple[str, str]) -> str: tuple[QubitId, QubitId], BeforeValidator(_split), PlainSerializer(_join) ] """Two-qubit active interaction identifier.""" + + +Result = npt.NDArray[np.float64] +"""An array of results returned by instruments.""" diff --git a/src/qibolab/instruments/abstract.py b/src/qibolab/instruments/abstract.py index 558bd82a53..1fdf2aafb2 100644 --- a/src/qibolab/instruments/abstract.py +++ b/src/qibolab/instruments/abstract.py @@ -1,13 +1,12 @@ from abc import ABC, abstractmethod from typing import Optional -import numpy.typing as npt from pydantic import ConfigDict, Field from qibolab.components import Config from qibolab.components.channels import Channel from qibolab.execution_parameters import ExecutionParameters -from qibolab.identifier import ChannelId +from qibolab.identifier import ChannelId, Result from qibolab.sequence import PulseSequence from qibolab.serialize import Model from qibolab.sweeper import ParallelSweepers @@ -73,7 +72,7 @@ def play( sequences: list[PulseSequence], options: ExecutionParameters, sweepers: list[ParallelSweepers], - ) -> dict[int, npt.NDArray]: + ) -> dict[int, Result]: """Play a pulse sequence and retrieve feedback. If :class:`qibolab.sweeper.Sweeper` objects are passed as arguments, they are diff --git a/src/qibolab/instruments/qm/program/acquisition.py b/src/qibolab/instruments/qm/program/acquisition.py index b38e6038a1..72bfd40415 100644 --- a/src/qibolab/instruments/qm/program/acquisition.py +++ b/src/qibolab/instruments/qm/program/acquisition.py @@ -14,7 +14,10 @@ AveragingMode, ExecutionParameters, ) -from qibolab.result import collect + + +def _collect(i, q): + return np.moveaxis(np.stack([i, q]), 0, -1) def _split(data, npulses, iq=False): @@ -111,7 +114,7 @@ def fetch(self, handles): qres = handles.get(f"{self.name}_Q").fetch_all() # convert raw ADC signal to volts u = unit() - signal = collect(u.raw2volts(ires), u.raw2volts(qres)) + signal = _collect(u.raw2volts(ires), u.raw2volts(qres)) return _split(signal, self.npulses, iq=True) @@ -162,7 +165,7 @@ def download(self, *dimensions): def fetch(self, handles): ires = handles.get(f"{self.name}_I").fetch_all() qres = handles.get(f"{self.name}_Q").fetch_all() - signal = collect(ires, qres) + signal = _collect(ires, qres) return _split(signal, self.npulses, iq=True) diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 1012d29afb..0ab2a40242 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -11,12 +11,11 @@ from qibolab.components import Config from qibolab.components.channels import Channel from qibolab.execution_parameters import ExecutionParameters -from qibolab.identifier import ChannelId, QubitId, QubitPairId +from qibolab.identifier import ChannelId, QubitId, QubitPairId, Result from qibolab.instruments.abstract import Controller, Instrument, InstrumentId from qibolab.parameters import NativeGates, Parameters, Settings, update_configs from qibolab.pulses import PulseId from qibolab.qubits import Qubit -from qibolab.result import Result from qibolab.sequence import PulseSequence from qibolab.sweeper import ParallelSweepers from qibolab.unrolling import Bounds, batch diff --git a/src/qibolab/result.py b/src/qibolab/result.py deleted file mode 100644 index 4681ba9f0f..0000000000 --- a/src/qibolab/result.py +++ /dev/null @@ -1,91 +0,0 @@ -"""Common result operations.""" - -import numpy as np -import numpy.typing as npt - -IQ = npt.NDArray[np.float64] -"""An array of I and Q values. - -It is assumed that the I and Q component are discriminated by the -innermost dimension of the array. -""" - -Result = npt.NDArray[np.float64] -"""An array of results.""" - - -def _lift(values: IQ) -> npt.NDArray: - """Transpose the innermost dimension to the outermost.""" - return np.moveaxis(values, -1, 0) - - -def _sink(values: npt.NDArray) -> IQ: - """Transpose the outermost dimension to the innermost. - - Inverse of :func:`_lift`. - """ - return np.moveaxis(values, 0, -1) - - -def collect(i: npt.NDArray, q: npt.NDArray) -> IQ: - """Collect I and Q components in a single array.""" - return _sink(np.stack([i, q])) - - -def unpack(iq: IQ) -> tuple[npt.NDArray, npt.NDArray]: - """Unpack I and Q components from single array. - - Inverse of :func:`collect`. - """ - i, q = tuple(_lift(iq)) - return i, q - - -def magnitude(iq: IQ): - """Signal magnitude. - - It is supposed to be a tension, possibly in arbitrary units. - """ - iq_ = _lift(iq) - return np.sqrt(iq_[0] ** 2 + iq_[1] ** 2) - - -def average(values: npt.NDArray) -> tuple[npt.NDArray, npt.NDArray]: - """Perform the values average. - - It returns both the average estimator itself, and its standard - deviation estimator. - - Use this also for I and Q values in the *standard layout*, cf. :class:`IQ`. - """ - mean = np.mean(values, axis=0) - std = np.std(values, axis=0, ddof=1) / np.sqrt(values.shape[0]) - return mean, std - - -def average_iq(i: npt.NDArray, q: npt.NDArray) -> tuple[npt.NDArray, npt.NDArray]: - """Perform the average over I and Q. - - Convenience wrapper over :func:`average` for separate i and q samples arrays. - """ - return average(collect(i, q)) - - -def phase(iq: npt.NDArray): - """Signal phase in radians. - - It is assumed that the I and Q component are discriminated by the - innermost dimension of the array. - """ - iq_ = _lift(iq) - return np.unwrap(np.arctan2(iq_[0], iq_[1])) - - -def probability(values: npt.NDArray, state: int = 0): - """Return the statistical frequency of the specified state. - - The only accepted values `state` are `0` and `1`. - """ - # The absolute value is only needed to make sure the result is always positive, even - # when extremely close to zero - return abs(1 - state - np.mean(values, axis=0)) diff --git a/tests/test_result.py b/tests/test_result.py deleted file mode 100644 index 0aec37676e..0000000000 --- a/tests/test_result.py +++ /dev/null @@ -1,34 +0,0 @@ -"""Testing result.py.""" - -import numpy as np -import pytest -from pytest import approx - -from qibolab import AcquisitionType as Acq -from qibolab import AveragingMode as Av -from qibolab.result import magnitude, phase, probability, unpack - - -@pytest.mark.parametrize("result", ["iq", "raw"]) -def test_polar(result, execute): - """Testing I and Q polar representation.""" - if result == "iq": - res = execute(Acq.INTEGRATION, Av.SINGLESHOT, 5) - else: - res = execute(Acq.RAW, Av.CYCLIC, 5) - - i, q = unpack(res) - np.testing.assert_equal(np.sqrt(i**2 + q**2), magnitude(res)) - np.testing.assert_equal(np.unwrap(np.arctan2(i, q)), phase(res)) - - -def test_probability(execute): - """Testing raw_probability method.""" - res = execute(Acq.DISCRIMINATION, Av.SINGLESHOT, 1000) - prob = probability(res) - - # unless the result is exactly 0, there is no need for the absolute value - # and when its close to 0, the absolute tolerance is preventing the possible error - # due to floating point operations - assert prob == approx(1 - np.mean(res, axis=0)) - assert probability(res, 1) == approx(1 - prob) From 6bc3080567df8a3155f93b536d937468f00b213f Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 3 Sep 2024 20:02:40 +0400 Subject: [PATCH 0896/1006] chore: simplify QM acquisition --- .../instruments/qm/program/acquisition.py | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/qibolab/instruments/qm/program/acquisition.py b/src/qibolab/instruments/qm/program/acquisition.py index 72bfd40415..651434c830 100644 --- a/src/qibolab/instruments/qm/program/acquisition.py +++ b/src/qibolab/instruments/qm/program/acquisition.py @@ -16,11 +16,13 @@ ) -def _collect(i, q): - return np.moveaxis(np.stack([i, q]), 0, -1) +def _collect(i, q, npulses): + """Collect I and Q components of signal.""" + signal = np.stack([i, q]) + return np.moveaxis(signal, 0, -1 - int(self.npulses > 1)) -def _split(data, npulses, iq=False): +def _split(data, npulses): """Split results of different readout pulses to list. These results were acquired in the same acquisition stream in the @@ -28,8 +30,6 @@ def _split(data, npulses, iq=False): """ if npulses == 1: return [data] - if iq: - return list(np.moveaxis(data, -2, 0)) return list(np.moveaxis(data, -1, 0)) @@ -114,8 +114,8 @@ def fetch(self, handles): qres = handles.get(f"{self.name}_Q").fetch_all() # convert raw ADC signal to volts u = unit() - signal = _collect(u.raw2volts(ires), u.raw2volts(qres)) - return _split(signal, self.npulses, iq=True) + signal = _collect(u.raw2volts(ires), u.raw2volts(qres), npulses) + return _split(signal, self.npulses) @dataclass @@ -165,8 +165,8 @@ def download(self, *dimensions): def fetch(self, handles): ires = handles.get(f"{self.name}_I").fetch_all() qres = handles.get(f"{self.name}_Q").fetch_all() - signal = _collect(ires, qres) - return _split(signal, self.npulses, iq=True) + signal = _collect(i, q, self.npulses) + return _split(signal, self.npulses) @dataclass @@ -226,7 +226,7 @@ def download(self, *dimensions): def fetch(self, handles): shots = handles.get(f"{self.name}_shots").fetch_all() - return _split(shots, self.npulses, iq=False) + return _split(shots, self.npulses) ACQUISITION_TYPES = { From 7b9d16c03f86813a18d0a39c7ffe34912e4f8b45 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 3 Sep 2024 20:03:05 +0400 Subject: [PATCH 0897/1006] chore: simplify QM acquisition --- src/qibolab/instruments/qm/program/acquisition.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/qibolab/instruments/qm/program/acquisition.py b/src/qibolab/instruments/qm/program/acquisition.py index 651434c830..9824892aaa 100644 --- a/src/qibolab/instruments/qm/program/acquisition.py +++ b/src/qibolab/instruments/qm/program/acquisition.py @@ -19,7 +19,7 @@ def _collect(i, q, npulses): """Collect I and Q components of signal.""" signal = np.stack([i, q]) - return np.moveaxis(signal, 0, -1 - int(self.npulses > 1)) + return np.moveaxis(signal, 0, -1 - int(npulses > 1)) def _split(data, npulses): @@ -114,7 +114,7 @@ def fetch(self, handles): qres = handles.get(f"{self.name}_Q").fetch_all() # convert raw ADC signal to volts u = unit() - signal = _collect(u.raw2volts(ires), u.raw2volts(qres), npulses) + signal = _collect(u.raw2volts(ires), u.raw2volts(qres), self.npulses) return _split(signal, self.npulses) @@ -165,7 +165,7 @@ def download(self, *dimensions): def fetch(self, handles): ires = handles.get(f"{self.name}_I").fetch_all() qres = handles.get(f"{self.name}_Q").fetch_all() - signal = _collect(i, q, self.npulses) + signal = _collect(ires, qres, self.npulses) return _split(signal, self.npulses) From 11028db21587ce218ce72fb14d638bcfce66cd0c Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 6 Sep 2024 16:03:22 +0400 Subject: [PATCH 0898/1006] doc: expand _collect docstring --- src/qibolab/instruments/qm/program/acquisition.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/qibolab/instruments/qm/program/acquisition.py b/src/qibolab/instruments/qm/program/acquisition.py index 9824892aaa..c146ac780b 100644 --- a/src/qibolab/instruments/qm/program/acquisition.py +++ b/src/qibolab/instruments/qm/program/acquisition.py @@ -17,7 +17,12 @@ def _collect(i, q, npulses): - """Collect I and Q components of signal.""" + """Collect I and Q components of signal. + + I and Q should be the the last dimension of the returned array, + except when multiple results are acquired to the same stream in the + instrument, when they should be second to last. + """ signal = np.stack([i, q]) return np.moveaxis(signal, 0, -1 - int(npulses > 1)) From 68421dccf2f0bdc6c43fe00ac2b3c6722810c6bb Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 6 Sep 2024 20:41:12 +0300 Subject: [PATCH 0899/1006] refactor: drop Instrument.is_connected --- src/qibolab/backends.py | 6 ++---- src/qibolab/instruments/abstract.py | 1 - src/qibolab/instruments/bluefors.py | 9 +++++---- src/qibolab/instruments/oscillator.py | 16 ++++------------ src/qibolab/instruments/qm/controller.py | 5 +---- src/qibolab/instruments/zhinst/executor.py | 7 +++---- tests/instruments/test_bluefors.py | 3 --- tests/instruments/test_erasynth.py | 2 +- tests/instruments/test_oscillator.py | 3 +-- tests/instruments/test_rohde_schwarz.py | 3 +-- 10 files changed, 18 insertions(+), 37 deletions(-) diff --git a/src/qibolab/backends.py b/src/qibolab/backends.py index 73552a2021..2eb739325a 100644 --- a/src/qibolab/backends.py +++ b/src/qibolab/backends.py @@ -100,8 +100,7 @@ def execute_circuit(self, circuit, initial_state=None, nshots=1000): sequence, measurement_map = self.compiler.compile(circuit, self.platform) - if not self.platform.is_connected: - self.platform.connect() + self.platform.connect() readout_ = self.platform.execute( [sequence], @@ -146,8 +145,7 @@ def execute_circuits(self, circuits, initial_states=None, nshots=1000): *(self.compiler.compile(circuit, self.platform) for circuit in circuits) ) - if not self.platform.is_connected: - self.platform.connect() + self.platform.connect() readout = self.platform.execute(sequences, ExecutionParameters(nshots=nshots)) diff --git a/src/qibolab/instruments/abstract.py b/src/qibolab/instruments/abstract.py index 1fdf2aafb2..2650dc4db1 100644 --- a/src/qibolab/instruments/abstract.py +++ b/src/qibolab/instruments/abstract.py @@ -32,7 +32,6 @@ class Instrument(Model, ABC): name: InstrumentId address: str - is_connected: bool = False settings: Optional[InstrumentSettings] = None @property diff --git a/src/qibolab/instruments/bluefors.py b/src/qibolab/instruments/bluefors.py index b92ddc6fd6..f3f1be1f25 100644 --- a/src/qibolab/instruments/bluefors.py +++ b/src/qibolab/instruments/bluefors.py @@ -27,21 +27,22 @@ class TemperatureController(Instrument): client_socket: socket.socket = Field( default_factory=lambda: socket.socket(socket.AF_INET, socket.SOCK_STREAM) ) + _is_connected: bool = False def connect(self): """Connect to the socket.""" - if self.is_connected: + if self._is_connected: return log.info(f"Bluefors connection. IP: {self.address} Port: {self.port}") self.client_socket.connect((self.address, self.port)) - self.is_connected = True + self._is_connected = True log.info("Bluefors Temperature Controller Connected") def disconnect(self): """Disconnect from the socket.""" - if self.is_connected: + if self._is_connected: self.client_socket.close() - self.is_connected = False + self._is_connected = False def setup(self): """Required by parent class, but not used here.""" diff --git a/src/qibolab/instruments/oscillator.py b/src/qibolab/instruments/oscillator.py index e62557797d..55c6632621 100644 --- a/src/qibolab/instruments/oscillator.py +++ b/src/qibolab/instruments/oscillator.py @@ -51,7 +51,7 @@ def _setter(instrument, parameter, value): """ if getattr(instrument, parameter) != value: setattr(instrument.settings, parameter, value) - if instrument.is_connected: + if instrument.device is not None: instrument.device.set(parameter, value) @@ -86,15 +86,8 @@ def create(self) -> Device: def connect(self): """Connect to the instrument.""" - if not self.is_connected: + if self.device is None: self.device = self.create() - self.is_connected = True - if not self.is_connected: - raise RuntimeError(f"Unable to connect to {self.name}.") - else: - raise RuntimeError( - f"There is an open connection to the instrument {self.name}." - ) assert self.settings is not None for fld in self.settings.model_fields: @@ -103,11 +96,10 @@ def connect(self): self.device.on() def disconnect(self): - if self.is_connected: - assert self.device is not None + if self.device is not None: self.device.off() self.device.close() - self.is_connected = False + self.device = None def sync(self, parameter): """Sync parameter value between our cache and the instrument. diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 3a11df8d61..8167c59a5b 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -161,8 +161,6 @@ class QmController(Controller): manager: Optional[QuantumMachinesManager] = None """Manager object used for controlling the Quantum Machines cluster.""" - is_connected: bool = False - """Boolean that shows whether we are connected to the QM manager.""" config: QmConfig = Field(default_factory=QmConfig) """Configuration dictionary required for pulse execution on the OPXs.""" @@ -227,7 +225,6 @@ def connect(self): self.manager = QuantumMachinesManager( host=host, port=int(port), octave=octave, credentials=credentials ) - self.is_connected = True def disconnect(self): """Disconnect from QM manager.""" @@ -235,7 +232,7 @@ def disconnect(self): if self.manager is not None: self.manager.close_all_quantum_machines() self.manager.close() - self.is_connected = False + self.manager = None def configure_device(self, device: str): """Add device in the ``config``.""" diff --git a/src/qibolab/instruments/zhinst/executor.py b/src/qibolab/instruments/zhinst/executor.py index afb14bf227..a79c91b193 100644 --- a/src/qibolab/instruments/zhinst/executor.py +++ b/src/qibolab/instruments/zhinst/executor.py @@ -111,17 +111,16 @@ def _probe_channels(self) -> set[str]: } def connect(self): - if self.is_connected is False: + if self.session is None: # To fully remove logging #configure_logging=False # I strongly advise to set it to 20 to have time estimates of the experiment duration! self.session = laboneq.Session(self.device_setup, log_level=20) _ = self.session.connect() - self.is_connected = True def disconnect(self): - if self.is_connected: + if self.session is None: _ = self.session.disconnect() - self.is_connected = False + self.session = None def calibration_step(self, configs: dict[str, Config], options): """Zurich general pre experiment calibration definitions. diff --git a/tests/instruments/test_bluefors.py b/tests/instruments/test_bluefors.py index af1541bba3..d76e8b865d 100644 --- a/tests/instruments/test_bluefors.py +++ b/tests/instruments/test_bluefors.py @@ -15,11 +15,9 @@ def test_connect(): with mock.patch("socket.socket"): tc = TemperatureController(name="Test_Temperature_Controller", address="") - assert tc.is_connected is False # if already connected, it should stay connected for _ in range(2): tc.connect() - assert tc.is_connected is True @pytest.mark.parametrize("already_connected", [True, False]) @@ -31,7 +29,6 @@ def test_disconnect(already_connected): # if already disconnected, it should stay disconnected for _ in range(2): tc.disconnect() - assert tc.is_connected is False def test_continuously_read_data(): diff --git a/tests/instruments/test_erasynth.py b/tests/instruments/test_erasynth.py index 1aacd04ddf..05f8899af4 100644 --- a/tests/instruments/test_erasynth.py +++ b/tests/instruments/test_erasynth.py @@ -12,7 +12,7 @@ def era(connected_platform): @pytest.mark.qpu def test_instruments_erasynth_connect(era): - assert era.is_connected == True + assert instrument.device is not None @pytest.mark.qpu diff --git a/tests/instruments/test_oscillator.py b/tests/instruments/test_oscillator.py index 166892b0d1..f40717b420 100644 --- a/tests/instruments/test_oscillator.py +++ b/tests/instruments/test_oscillator.py @@ -18,10 +18,9 @@ def test_oscillator_init(lo): def test_oscillator_connect(lo): assert lo.device is None lo.connect() - assert lo.is_connected assert isinstance(lo.device, DummyDevice) lo.disconnect() - assert not lo.is_connected + assert lo.device is None def test_oscillator_setup(lo): diff --git a/tests/instruments/test_rohde_schwarz.py b/tests/instruments/test_rohde_schwarz.py index 5c156d28eb..e51d963da8 100644 --- a/tests/instruments/test_rohde_schwarz.py +++ b/tests/instruments/test_rohde_schwarz.py @@ -13,8 +13,7 @@ def instrument(connected_platform): @pytest.mark.qpu def test_instruments_rohde_schwarz_init(instrument): - assert instrument.is_connected - assert instrument.device + assert instrument.device is not None @pytest.mark.qpu From 8199e046a41896f80afc28fac6ee192dc52f9493 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Mon, 9 Sep 2024 14:56:32 +0400 Subject: [PATCH 0900/1006] chore: rename AcquireChannel to AcquisitionChannel --- doc/source/getting-started/experiment.rst | 4 ++-- doc/source/tutorials/lab.rst | 26 +++++++++++++-------- src/qibolab/components/channels.py | 4 ++-- src/qibolab/dummy/platform.py | 4 ++-- src/qibolab/instruments/qm/config/config.py | 4 ++-- src/qibolab/instruments/qm/controller.py | 8 +++---- src/qibolab/instruments/zhinst/executor.py | 6 ++--- tests/dummy_qrc/zurich/platform.py | 9 +++++-- 8 files changed, 38 insertions(+), 27 deletions(-) diff --git a/doc/source/getting-started/experiment.rst b/doc/source/getting-started/experiment.rst index 28f6386e0a..0dab6625d3 100644 --- a/doc/source/getting-started/experiment.rst +++ b/doc/source/getting-started/experiment.rst @@ -29,7 +29,7 @@ In this example, the qubit is controlled by a Zurich Instruments' SHFQC instrume from laboneq.simple import DeviceSetup, SHFQC from qibolab.components import ( - AcquireChannel, + AcquisitionChannel, IqChannel, IqConfig, AcquisitionConfig, @@ -67,7 +67,7 @@ In this example, the qubit is controlled by a Zurich Instruments' SHFQC instrume # assign channels to qubits qubit.drive = IqChannel(name=drive, lo=drive_lo, mixer=None) qubit.probe = IqChannel(name=probe, lo=readout_lo, mixer=None, acquisition=acquire) - qubit.acquisition = AcquireChannel(name=acquire, probe=probe, twpa_pump=None) + qubit.acquisition = AcquisitionChannel(name=acquire, probe=probe, twpa_pump=None) zi_channels = [ ZiChannel(qubit.drive, device="device_shfqc", path="SGCHANNELS/0/OUTPUT"), diff --git a/doc/source/tutorials/lab.rst b/doc/source/tutorials/lab.rst index 458299a8ea..958ec77b17 100644 --- a/doc/source/tutorials/lab.rst +++ b/doc/source/tutorials/lab.rst @@ -22,7 +22,7 @@ using different Qibolab primitives. .. testcode:: python from qibolab import Platform - from qibolab.components import IqChannel, AcquireChannel, IqConfig + from qibolab.components import IqChannel, AcquisitionChannel, IqConfig from qibolab.qubits import Qubit from qibolab.pulses import Gaussian, Pulse, Rectangular from qibolab.native import RxyFactory, FixedSequenceFactory, SingleQubitNatives @@ -41,7 +41,7 @@ using different Qibolab primitives. qubit.probe = IqChannel( name="0/probe", mixer=None, lo=None, acquisition="0/acquisition" ) - qubit.acquisition = AcquireChannel( + qubit.acquisition = AcquisitionChannel( name="0/acquisition", twpa_pump=None, probe="probe" ) qubit.drive = Iqchannel(name="0/drive", mixer=None, lo=None) @@ -107,7 +107,7 @@ the native gates, but separately from the single-qubit ones. .. testcode:: python - from qibolab.components import IqChannel, AcquireChannel, DcChannel, IqConfig + from qibolab.components import IqChannel, AcquisitionChannel, DcChannel, IqConfig from qibolab.qubits import Qubit from qibolab.parameters import Parameters, TwoQubitContainer from qibolab.pulses import Gaussian, Pulse, Rectangular @@ -131,11 +131,11 @@ the native gates, but separately from the single-qubit ones. # assign channels to the qubits channels[qubit0.probe] = IqChannel(mixer=None, lo=None) - channels[qubit0.acquisition] = AcquireChannel(twpa_pump=None, probe=qubit0.probe) + channels[qubit0.acquisition] = AcquisitionChannel(twpa_pump=None, probe=qubit0.probe) channels[qubit0.drive] = IqChannel(mixer=None, lo=None) channels[qubit0.flux] = DcChannel() channels[qubit1.probe] = IqChannel(mixer=None, lo=None) - channels[qubit1.acquisition] = AcquireChannel(twpa_pump=None, probe=qubit1.probe) + channels[qubit1.acquisition] = AcquisitionChannel(twpa_pump=None, probe=qubit1.probe) channels[qubit1.drive] = IqChannel(mixer=None, lo=None) # assign single-qubit native gates to each qubit @@ -499,7 +499,7 @@ the above runcard: from pathlib import Path from qibolab import Platform from qibolab.components import ( - AcquireChannel, + AcquisitionChannel, DcChannel, IqChannel, AcquisitionConfig, @@ -525,7 +525,9 @@ the above runcard: drive=IqChannel(f"qubit_{q}/drive", mixer=None, lo=None), flux=DcChannel(f"qubit_{q}/flux"), probe=IqChannel(probe_name, mixer=None, lo=None, acquistion=acquire_name), - acquisition=AcquireChannel(acquire_name, twpa_pump=None, probe=probe_name), + acquisition=AcquisitionChannel( + acquire_name, twpa_pump=None, probe=probe_name + ), ) # create dictionary of instruments @@ -555,7 +557,9 @@ With the following additions for coupler architectures: drive=IqChannel(f"qubit_{q}/drive", mixer=None, lo=None), flux=DcChannel(f"qubit_{q}/flux"), probe=IqChannel(probe_name, mixer=None, lo=None, acquistion=acquire_name), - acquisition=AcquireChannel(acquire_name, twpa_pump=None, probe=probe_name), + acquisition=AcquisitionChannel( + acquire_name, twpa_pump=None, probe=probe_name + ), ) couplers = {0: Qubit(name=0, flux=DcChannel("coupler_0/flux"))} @@ -610,7 +614,7 @@ in this case ``"twpa_pump"``. from pathlib import Path from qibolab import Platform from qibolab.components import ( - AcquireChannel, + AcquisitionChannel, DcChannel, IqChannel, AcquisitionConfig, @@ -637,7 +641,9 @@ in this case ``"twpa_pump"``. drive=IqChannel(f"qubit_{q}/drive", mixer=None, lo=None), flux=DcChannel(f"qubit_{q}/flux"), probe=IqChannel(probe_name, mixer=None, lo=None, acquistion=acquire_name), - acquisition=AcquireChannel(acquire_name, twpa_pump=None, probe=probe_name), + acquisition=AcquisitionChannel( + acquire_name, twpa_pump=None, probe=probe_name + ), ) # create dictionary of instruments diff --git a/src/qibolab/components/channels.py b/src/qibolab/components/channels.py index f59f31f338..1740019c03 100644 --- a/src/qibolab/components/channels.py +++ b/src/qibolab/components/channels.py @@ -23,7 +23,7 @@ from qibolab.identifier import ChannelId from qibolab.serialize import Model -__all__ = ["Channel", "DcChannel", "IqChannel", "AcquireChannel"] +__all__ = ["Channel", "DcChannel", "IqChannel", "AcquisitionChannel"] class Channel(Model): @@ -59,7 +59,7 @@ class IqChannel(Channel): """ -class AcquireChannel(Channel): +class AcquisitionChannel(Channel): twpa_pump: Optional[str] """Name of the TWPA pump component. diff --git a/src/qibolab/dummy/platform.py b/src/qibolab/dummy/platform.py index 99abb757e8..09178ba8af 100644 --- a/src/qibolab/dummy/platform.py +++ b/src/qibolab/dummy/platform.py @@ -1,6 +1,6 @@ import pathlib -from qibolab.components import AcquireChannel, DcChannel, IqChannel +from qibolab.components import AcquisitionChannel, DcChannel, IqChannel from qibolab.instruments.dummy import DummyInstrument, DummyLocalOscillator from qibolab.platform import Platform from qibolab.qubits import Qubit @@ -25,7 +25,7 @@ def create_dummy() -> Platform: ) channels |= { probe: IqChannel(mixer=None, lo=None), - acquisition: AcquireChannel(twpa_pump=pump_name, probe=probe), + acquisition: AcquisitionChannel(twpa_pump=pump_name, probe=probe), drive: IqChannel(mixer=None, lo=None), drive12: IqChannel(mixer=None, lo=None), flux: DcChannel(), diff --git a/src/qibolab/instruments/qm/config/config.py b/src/qibolab/instruments/qm/config/config.py index c5ebb4768a..9bc352ae1b 100644 --- a/src/qibolab/instruments/qm/config/config.py +++ b/src/qibolab/instruments/qm/config/config.py @@ -1,7 +1,7 @@ from dataclasses import dataclass, field from typing import Optional, Union -from qibolab.components.channels import AcquireChannel, DcChannel, IqChannel +from qibolab.components.channels import AcquisitionChannel, DcChannel, IqChannel from qibolab.components.configs import IqConfig, OscillatorConfig from qibolab.identifier import ChannelId from qibolab.pulses import Pulse @@ -85,7 +85,7 @@ def configure_iq_line( def configure_acquire_line( self, id: ChannelId, - acquire_channel: AcquireChannel, + acquire_channel: AcquisitionChannel, probe_channel: IqChannel, acquire_config: QmAcquisitionConfig, probe_config: IqConfig, diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 8167c59a5b..78eda68e03 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -13,7 +13,7 @@ from qm.simulate.credentials import create_credentials from qualang_tools.simulator_tools import create_simulator_controller_connections -from qibolab.components import AcquireChannel, Config, DcChannel, IqChannel +from qibolab.components import AcquisitionChannel, Config, DcChannel, IqChannel from qibolab.components.configs import IqConfig, OscillatorConfig from qibolab.execution_parameters import ExecutionParameters from qibolab.identifier import ChannelId @@ -246,7 +246,7 @@ def configure_channel( ) -> Optional[ChannelId]: """Add element (QM version of channel) in the config. - When an ``AcquireChannel`` is registered it returns the corresponding probe + When an ``AcquisitionChannel`` is registered it returns the corresponding probe channel in order to build an (acquisition, probe) map. """ config = configs[channel] @@ -264,7 +264,7 @@ def configure_channel( assert isinstance(lo_config, OscillatorConfig) self.config.configure_iq_line(channel, ch, config, lo_config) - elif isinstance(ch, AcquireChannel): + elif isinstance(ch, AcquisitionChannel): assert ch.probe is not None assert isinstance(config, QmAcquisitionConfig) probe = self.channels[ch.probe] @@ -290,7 +290,7 @@ def configure_channels( ) -> dict[ChannelId, ChannelId]: """Register channels in the sequence in the QM ``config``. - Builds a map from probe channels to the corresponding ``AcquireChannel``. + Builds a map from probe channels to the corresponding ``AcquisitionChannel``. This is useful when sweeping frequency of probe channels, as these are registered as acquire elements in the QM config. """ diff --git a/src/qibolab/instruments/zhinst/executor.py b/src/qibolab/instruments/zhinst/executor.py index a79c91b193..0be1223ede 100644 --- a/src/qibolab/instruments/zhinst/executor.py +++ b/src/qibolab/instruments/zhinst/executor.py @@ -15,7 +15,7 @@ from qibolab.sweeper import Parameter, Sweeper from qibolab.unrolling import Bounds -from ...components import AcquireChannel, Config, DcChannel, IqChannel +from ...components import AcquisitionChannel, Config, DcChannel, IqChannel from .components import ZiChannel from .constants import NANO_TO_SECONDS, SAMPLING_RATE from .pulse import select_pulse @@ -133,7 +133,7 @@ def calibration_step(self, configs: dict[str, Config], options): self.configure_dc_line(ch.logical_channel, configs) if isinstance(ch.logical_channel, IqChannel): self.configure_iq_line(ch.logical_channel, configs) - if isinstance(ch.logical_channel, AcquireChannel): + if isinstance(ch.logical_channel, AcquisitionChannel): self.configure_acquire_line(ch.logical_channel, configs) self.device_setup.set_calibration(self.calibration) @@ -171,7 +171,7 @@ def configure_iq_line(self, channel: IqChannel, configs: dict[str, Config]): ) def configure_acquire_line( - self, channel: AcquireChannel, configs: dict[str, Config] + self, channel: AcquisitionChannel, configs: dict[str, Config] ): intermediate_frequency = ( configs[channel.probe].frequency diff --git a/tests/dummy_qrc/zurich/platform.py b/tests/dummy_qrc/zurich/platform.py index f391e66634..f09bc82356 100644 --- a/tests/dummy_qrc/zurich/platform.py +++ b/tests/dummy_qrc/zurich/platform.py @@ -5,7 +5,12 @@ from laboneq.simple import DeviceSetup from qibolab import Platform -from qibolab.components import AcquireChannel, DcChannel, IqChannel, OscillatorConfig +from qibolab.components import ( + AcquisitionChannel, + DcChannel, + IqChannel, + OscillatorConfig, +) from qibolab.instruments.zhinst import ( ZiAcquisitionConfig, ZiChannel, @@ -73,7 +78,7 @@ def create(): configs[acquisition_name] = ZiAcquisitionConfig( **component_params[acquisition_name], kernel=kernels.get(q) ) - qubits[q].acquisition = AcquireChannel( + qubits[q].acquisition = AcquisitionChannel( name=acquisition_name, twpa_pump=None, probe=probe_name, From c86ddea2adf3164a61680077aa004ffc4a2156a5 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Mon, 9 Sep 2024 15:02:52 +0400 Subject: [PATCH 0901/1006] chore: rename QmConfig to Configuration --- src/qibolab/instruments/qm/config/__init__.py | 2 +- src/qibolab/instruments/qm/config/config.py | 4 ++-- src/qibolab/instruments/qm/controller.py | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/qibolab/instruments/qm/config/__init__.py b/src/qibolab/instruments/qm/config/__init__.py index eb0793a8cc..c8d5873880 100644 --- a/src/qibolab/instruments/qm/config/__init__.py +++ b/src/qibolab/instruments/qm/config/__init__.py @@ -1,2 +1,2 @@ -from .config import QmConfig +from .config import Configuration from .pulses import SAMPLING_RATE, operation diff --git a/src/qibolab/instruments/qm/config/config.py b/src/qibolab/instruments/qm/config/config.py index c5ebb4768a..05558cdcef 100644 --- a/src/qibolab/instruments/qm/config/config.py +++ b/src/qibolab/instruments/qm/config/config.py @@ -19,7 +19,7 @@ waveforms_from_pulse, ) -__all__ = ["QmConfig"] +__all__ = ["Configuration"] DEFAULT_DIGITAL_WAVEFORMS = {"ON": {"samples": [(1, 0)]}} """Required to be registered in the config for QM to work. @@ -30,7 +30,7 @@ @dataclass -class QmConfig: +class Configuration: """Configuration for communicating with the ``QuantumMachinesManager``. Contains nested ``dataclass`` objects and is serialized using ``asdict`` diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 8167c59a5b..a4cad598f0 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -27,7 +27,7 @@ from qibolab.sweeper import ParallelSweepers, Parameter, Sweeper from qibolab.unrolling import Bounds, unroll_sequences -from .config import SAMPLING_RATE, QmConfig, operation +from .config import SAMPLING_RATE, Configuration, operation from .program import ExecutionArguments, create_acquisition, program from .program.sweepers import find_lo_frequencies, sweeper_amplitude @@ -162,7 +162,7 @@ class QmController(Controller): manager: Optional[QuantumMachinesManager] = None """Manager object used for controlling the Quantum Machines cluster.""" - config: QmConfig = Field(default_factory=QmConfig) + config: Configuration = Field(default_factory=Configuration) """Configuration dictionary required for pulse execution on the OPXs.""" simulation_duration: Optional[int] = None From 363a587116cf9882d7ba2c85d5d081038c59a4c9 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Mon, 9 Sep 2024 15:37:17 +0400 Subject: [PATCH 0902/1006] chore: drop Instrument.name --- src/qibolab/dummy/platform.py | 11 +- src/qibolab/instruments/abstract.py | 2 - src/qibolab/instruments/dummy.py | 7 +- src/qibolab/instruments/erasynth.py | 8 +- src/qibolab/instruments/oscillator.py | 2 +- src/qibolab/instruments/qm/controller.py | 2 - src/qibolab/instruments/rohde_schwarz.py | 3 +- src/qibolab/instruments/zhinst/executor.py | 3 +- src/qibolab/platform/platform.py | 7 +- tests/dummy_qrc/qm/parameters.json | 226 --------------------- tests/dummy_qrc/qm/platform.py | 88 -------- tests/dummy_qrc/qm_octave/platform.py | 5 +- tests/dummy_qrc/zurich/platform.py | 3 +- tests/test_platform.py | 10 +- 14 files changed, 27 insertions(+), 350 deletions(-) delete mode 100644 tests/dummy_qrc/qm/parameters.json delete mode 100644 tests/dummy_qrc/qm/platform.py diff --git a/src/qibolab/dummy/platform.py b/src/qibolab/dummy/platform.py index 09178ba8af..60db6a8c80 100644 --- a/src/qibolab/dummy/platform.py +++ b/src/qibolab/dummy/platform.py @@ -10,11 +10,10 @@ def create_dummy() -> Platform: """Create a dummy platform using the dummy instrument.""" - pump_name = "twpa_pump" - qubits = {} channels = {} # attach the channels + pump_name = "twpa_pump" for q in range(5): drive, drive12, flux, probe, acquisition = ( f"qubit_{q}/drive", @@ -45,9 +44,11 @@ def create_dummy() -> Platform: couplers[c] = Qubit(flux=flux) # register the instruments - instrument = DummyInstrument(name="dummy", address="0.0.0.0", channels=channels) - pump = DummyLocalOscillator(name=pump_name, address="0.0.0.0") + instruments = { + "dummy": DummyInstrument(address="0.0.0.0", channels=channels), + pump_name: DummyLocalOscillator(address="0.0.0.0"), + } return Platform.load( - path=FOLDER, instruments=[instrument, pump], qubits=qubits, couplers=couplers + path=FOLDER, instruments=instruments, qubits=qubits, couplers=couplers ) diff --git a/src/qibolab/instruments/abstract.py b/src/qibolab/instruments/abstract.py index 2650dc4db1..58921378d9 100644 --- a/src/qibolab/instruments/abstract.py +++ b/src/qibolab/instruments/abstract.py @@ -24,13 +24,11 @@ class Instrument(Model, ABC): """Parent class for all the instruments connected via TCPIP. Args: - name (str): Instrument name. address (str): Instrument network address. """ model_config = ConfigDict(arbitrary_types_allowed=True, frozen=False, extra="allow") - name: InstrumentId address: str settings: Optional[InstrumentSettings] = None diff --git a/src/qibolab/instruments/dummy.py b/src/qibolab/instruments/dummy.py index 2b16b65e8d..2052d84159 100644 --- a/src/qibolab/instruments/dummy.py +++ b/src/qibolab/instruments/dummy.py @@ -61,7 +61,6 @@ class DummyInstrument(Controller): instruments. """ - name: str address: str bounds: str = "dummy/bounds" @@ -70,13 +69,13 @@ def sampling_rate(self) -> int: return SAMPLING_RATE def connect(self): - log.info(f"Connecting to {self.name} instrument.") + log.info(f"Connecting to dummy instrument.") def disconnect(self): - log.info(f"Disconnecting {self.name} instrument.") + log.info(f"Disconnecting dummy instrument.") def setup(self, *args, **kwargs): - log.info(f"Setting up {self.name} instrument.") + log.info(f"Setting up dummy instrument.") def values(self, options: ExecutionParameters, shape: tuple[int, ...]): if options.acquisition_type is AcquisitionType.DISCRIMINATION: diff --git a/src/qibolab/instruments/erasynth.py b/src/qibolab/instruments/erasynth.py index 7bf88dc9f0..6b91016ec7 100644 --- a/src/qibolab/instruments/erasynth.py +++ b/src/qibolab/instruments/erasynth.py @@ -127,16 +127,16 @@ class ERA(LocalOscillator): if we are connected via ethernet. """ - def __init__(self, name, address, ethernet=True, ref_osc_source=None): + def __init__(self, address, ethernet=True, ref_osc_source=None): super().__init__( - name=name, address=address, settings=LocalOscillatorSettings(ref_osc_source=ref_osc_source), ) self.ethernet = ethernet def create(self): + name = f"ERA:{self.address}" if self.ethernet: - return ERASynthEthernet(self.name, self.address) + return ERASynthEthernet(name, self.address) else: - return ERASynthPlusPlus(f"{self.name}", f"TCPIP::{self.address}::INSTR") + return ERASynthPlusPlus(name, f"TCPIP::{self.address}::INSTR") diff --git a/src/qibolab/instruments/oscillator.py b/src/qibolab/instruments/oscillator.py index 55c6632621..39fdc5b382 100644 --- a/src/qibolab/instruments/oscillator.py +++ b/src/qibolab/instruments/oscillator.py @@ -129,5 +129,5 @@ def setup(self, **kwargs): assert self.settings is not None for name, value in kwargs.items(): if name not in self.settings.model_fields: - raise KeyError(f"Cannot set {name} to instrument {self.name}") + raise KeyError(f"Cannot set {name} to instrument {type(self)}") setattr(self, name, value) diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 5d7f6b0128..b00f062541 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -126,8 +126,6 @@ class QmController(Controller): so that only elements related to the participating channels are registered. """ - name: str - """Name of the instrument instance.""" address: str """IP address and port for connecting to the OPX instruments. diff --git a/src/qibolab/instruments/rohde_schwarz.py b/src/qibolab/instruments/rohde_schwarz.py index 3658949fd0..02c4e59989 100644 --- a/src/qibolab/instruments/rohde_schwarz.py +++ b/src/qibolab/instruments/rohde_schwarz.py @@ -11,6 +11,7 @@ class SGS100A(LocalOscillator): """ def create(self): + name = f"SGS100A:{self.address}" return LO_SGS100A.RohdeSchwarz_SGS100A( - self.name, f"TCPIP0::{self.address}::5025::SOCKET" + name, f"TCPIP0::{self.address}::5025::SOCKET" ) diff --git a/src/qibolab/instruments/zhinst/executor.py b/src/qibolab/instruments/zhinst/executor.py index 0be1223ede..0c3a01e7b8 100644 --- a/src/qibolab/instruments/zhinst/executor.py +++ b/src/qibolab/instruments/zhinst/executor.py @@ -50,13 +50,12 @@ class Zurich(Controller): def __init__( self, - name, device_setup, channels: list[ZiChannel], time_of_flight=0.0, smearing=0.0, ): - super().__init__(name=name, address=None) + super().__init__(address=None) self.signal_map = {} "Signals to lines mapping" diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 0ab2a40242..9e470696c4 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -1,10 +1,9 @@ """A platform for executing quantum algorithms.""" -from collections.abc import Iterable from dataclasses import dataclass, field from math import prod from pathlib import Path -from typing import Literal, Optional, TypeVar, Union +from typing import Literal, Optional, TypeVar from qibo.config import log, raise_error @@ -294,7 +293,7 @@ def execute( def load( cls, path: Path, - instruments: Union[InstrumentMap, Iterable[Instrument]], + instruments: InstrumentMap, qubits: QubitMap, couplers: Optional[QubitMap] = None, name: Optional[str] = None, @@ -302,8 +301,6 @@ def load( """Dump platform.""" if name is None: name = path.name - if not isinstance(instruments, dict): - instruments = {i.name: i for i in instruments} if couplers is None: couplers = {} diff --git a/tests/dummy_qrc/qm/parameters.json b/tests/dummy_qrc/qm/parameters.json deleted file mode 100644 index 6b22d264cb..0000000000 --- a/tests/dummy_qrc/qm/parameters.json +++ /dev/null @@ -1,226 +0,0 @@ -{ - "nqubits": 5, - "qubits": [0, 1, 2, 3, 4], - "settings": { - "nshots": 1024, - "relaxation_time": 50000 - }, - "topology": [ - [0, 2], - [1, 2], - [2, 3], - [2, 4] - ], - "instruments": { - "qm": { - "bounds": { - "waveforms": 10000, - "readout": 30, - "instructions": 1000000 - } - }, - "con1": { - "i1": { "gain": 0 }, - "i2": { "gain": 0 } - }, - "con2": { - "o2": { - "filter": { - "feedforward": [1.0684635881381783, -1.0163217174522334], - "feedback": [0.947858129314055] - } - }, - "i1": { "gain": 0 }, - "i2": { "gain": 0 } - }, - "lo_readout_a": { - "frequency": 7300000000, - "power": 18 - }, - "lo_readout_b": { - "frequency": 7900000000, - "power": 15 - }, - "lo_drive_low": { - "frequency": 4700000000, - "power": 16 - }, - "lo_drive_mid": { - "frequency": 5600000000, - "power": 16 - }, - "lo_drive_high": { - "frequency": 6500000000, - "power": 16 - }, - "twpa_a": { - "frequency": 6511000000, - "power": 4.5 - } - }, - "native_gates": { - "single_qubit": { - "0": { - "RX": { - "duration": 40, - "amplitude": 0.005, - "frequency": 4700000000, - "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, - "type": "qd" - }, - "RX12": { - "duration": 40, - "amplitude": 0.005, - "frequency": 4700000000, - "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, - "type": "qd" - }, - "MZ": { - "duration": 1000, - "amplitude": 0.0025, - "frequency": 7226500000, - "envelope": { "kind": "rectangular" }, - "type": "ro" - } - }, - "1": { - "RX": { - "duration": 40, - "amplitude": 0.0484, - "frequency": 4855663000, - "envelope": { "kind": "drag", "rel_sigma": 0.2, "beta": 0.02 }, - "type": "qd" - }, - "RX12": { - "duration": 40, - "amplitude": 0.0484, - "frequency": 4855663000, - "envelope": { "kind": "drag", "rel_sigma": 0.2, "beta": 0.02 }, - "type": "qd" - }, - "MZ": { - "duration": 620, - "amplitude": 0.003575, - "frequency": 7453265000, - "envelope": { "kind": "rectangular" }, - "type": "ro" - } - }, - "2": { - "RX": { - "duration": 40, - "amplitude": 0.05682, - "frequency": 5800563000, - "envelope": { "kind": "drag", "rel_sigma": 0.2, "beta": 0.04 }, - "type": "qd" - }, - "RX12": { - "duration": 40, - "amplitude": 0.05682, - "frequency": 5800563000, - "envelope": { "kind": "drag", "rel_sigma": 0.2, "beta": 0.04 }, - "type": "qd" - }, - "MZ": { - "duration": 960, - "amplitude": 0.00325, - "frequency": 7655107000, - "envelope": { "kind": "rectangular" }, - "type": "ro" - } - }, - "3": { - "RX": { - "duration": 40, - "amplitude": 0.138, - "frequency": 6760922000, - "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, - "type": "qd" - }, - "RX12": { - "duration": 40, - "amplitude": 0.138, - "frequency": 6760922000, - "envelope": { "kind": "gaussian", "rel_sigma": 0.2 }, - "type": "qd" - }, - "MZ": { - "duration": 960, - "amplitude": 0.004225, - "frequency": 7802191000, - "envelope": { "kind": "rectangular" }, - "type": "ro" - } - }, - "4": { - "RX": { - "duration": 40, - "amplitude": 0.0617, - "frequency": 6585053000, - "envelope": { "kind": "drag", "rel_sigma": 0.2, "beta": 0 }, - "type": "qd" - }, - "RX12": { - "duration": 40, - "amplitude": 0.0617, - "frequency": 6585053000, - "envelope": { "kind": "drag", "rel_sigma": 0.2, "beta": 0 }, - "type": "qd" - }, - "MZ": { - "duration": 640, - "amplitude": 0.0039, - "frequency": 8057668000, - "envelope": { "kind": "rectangular" }, - "type": "ro" - } - } - }, - "two_qubit": { - "1-2": { - "CZ": [ - { - "duration": 30, - "amplitude": 0.055, - "envelope": { "kind": "rectangular" }, - "qubit": 2, - "frequency": 0, - "type": "qf" - }, - { - "type": "vz", - "phase": -1.5707963267948966, - "qubit": 1 - }, - { - "type": "vz", - "phase": -1.5707963267948966, - "qubit": 2 - } - ] - }, - "2-3": { - "CZ": [ - { - "duration": 32, - "amplitude": -0.0513, - "envelope": { "kind": "rectangular" }, - "qubit": 3, - "frequency": 0, - "type": "qf" - }, - { - "type": "vz", - "phase": -1.5707963267948966, - "qubit": 2 - }, - { - "type": "vz", - "phase": -1.5707963267948966, - "qubit": 3 - } - ] - } - } - } -} diff --git a/tests/dummy_qrc/qm/platform.py b/tests/dummy_qrc/qm/platform.py deleted file mode 100644 index 2e715e7660..0000000000 --- a/tests/dummy_qrc/qm/platform.py +++ /dev/null @@ -1,88 +0,0 @@ -import pathlib - -from qibolab.channel import Channel, ChannelMap -from qibolab.instruments.dummy import DummyLocalOscillator as LocalOscillator -from qibolab.instruments.qm import OPXplus, QMController -from qibolab.platform import Platform - -FOLDER = pathlib.Path(__file__).parent - - -def create(): - """Dummy platform using Quantum Machines (QM) OPXs and Rohde Schwarz local - oscillators. - - Based on QuantWare 5-qubit device. - - Used in ``test_instruments_qm.py`` and ``test_instruments_qmsim.py`` - """ - opxs = [OPXplus(f"con{i}") for i in range(1, 4)] - controller = QMController("qm", "192.168.0.101:80", opxs=opxs, time_of_flight=280) - - # Create channel objects and map controllers to channels - channels = ChannelMap() - # readout - channels |= Channel("L3-25_a", port=controller.ports((("con1", 10), ("con1", 9)))) - channels |= Channel("L3-25_b", port=controller.ports((("con2", 10), ("con2", 9)))) - # feedback - channels |= Channel( - "L2-5_a", port=controller.ports((("con1", 2), ("con1", 1)), output=False) - ) - channels |= Channel( - "L2-5_b", port=controller.ports((("con2", 2), ("con2", 1)), output=False) - ) - # drive - channels |= ( - Channel( - f"L3-1{i}", port=controller.ports((("con1", 2 * i), ("con1", 2 * i - 1))) - ) - for i in range(1, 5) - ) - channels |= Channel("L3-15", port=controller.ports((("con3", 2), ("con3", 1)))) - # flux - channels |= (Channel(f"L4-{i}", port=opxs[1].ports(i)) for i in range(1, 6)) - # TWPA - channels |= "L4-26" - - # Instantiate local oscillators - local_oscillators = [ - LocalOscillator("lo_readout_a", "192.168.0.39"), - LocalOscillator("lo_readout_b", "192.168.0.31"), - LocalOscillator("lo_drive_low", "192.168.0.32"), - LocalOscillator("lo_drive_mid", "192.168.0.33"), - LocalOscillator("lo_drive_high", "192.168.0.34"), - LocalOscillator("twpa_a", "192.168.0.35"), - ] - # Map LOs to channels - channels["L3-25_a"].local_oscillator = local_oscillators[0] - channels["L3-25_b"].local_oscillator = local_oscillators[1] - channels["L3-15"].local_oscillator = local_oscillators[2] - channels["L3-11"].local_oscillator = local_oscillators[2] - channels["L3-12"].local_oscillator = local_oscillators[3] - channels["L3-13"].local_oscillator = local_oscillators[4] - channels["L3-14"].local_oscillator = local_oscillators[4] - channels["L4-26"].local_oscillator = local_oscillators[5] - - # create qubit objects - runcard = load_runcard(FOLDER) - qubits, couplers, pairs = load_qubits(runcard) - - # assign channels to qubits - for q in [0, 1]: - qubits[q].readout = channels["L3-25_a"] - qubits[q].feedback = channels["L2-5_a"] - for q in [2, 3, 4]: - qubits[q].readout = channels["L3-25_b"] - qubits[q].feedback = channels["L2-5_b"] - - qubits[0].drive = channels["L3-15"] - qubits[0].flux = channels["L4-5"] - for q in range(1, 5): - qubits[q].drive = channels[f"L3-{10 + q}"] - qubits[q].flux = channels[f"L4-{q}"] - - instruments = {controller.name: controller} - instruments.update(controller.opxs) - instruments.update({lo.name: lo for lo in local_oscillators}) - settings = load_settings(runcard) - return Platform("qm", qubits, pairs, instruments, settings, resonator_type="2D") diff --git a/tests/dummy_qrc/qm_octave/platform.py b/tests/dummy_qrc/qm_octave/platform.py index 296381c807..68dcc7d160 100644 --- a/tests/dummy_qrc/qm_octave/platform.py +++ b/tests/dummy_qrc/qm_octave/platform.py @@ -20,7 +20,6 @@ def create(runcard_path=RUNCARD): octave2 = Octave("octave2", port=101, connectivity=opxs[1]) octave3 = Octave("octave3", port=102, connectivity=opxs[2]) controller = QMController( - "qm", "192.168.0.101:80", opxs=opxs, octaves=[octave1, octave2, octave3], @@ -44,7 +43,7 @@ def create(runcard_path=RUNCARD): channels |= "L4-26" # Instantiate local oscillators - twpa = LocalOscillator("twpa_a", "192.168.0.35") + twpa = LocalOscillator("192.168.0.35") # Map LOs to channels channels["L4-26"].local_oscillator = twpa @@ -66,7 +65,7 @@ def create(runcard_path=RUNCARD): qubits[q].drive = channels[f"L3-{10 + q}"] qubits[q].flux = channels[f"L4-{q}"] - instruments = {controller.name: controller, twpa.name: twpa} + instruments = {"qm": controller, "twpa_a": twpa} instruments.update(controller.opxs) instruments.update(controller.octaves) settings = load_settings(runcard) diff --git a/tests/dummy_qrc/zurich/platform.py b/tests/dummy_qrc/zurich/platform.py index f09bc82356..06d6251f01 100644 --- a/tests/dummy_qrc/zurich/platform.py +++ b/tests/dummy_qrc/zurich/platform.py @@ -121,7 +121,6 @@ def create(): ) controller = Zurich( - "EL_ZURO", device_setup=device_setup, channels=zi_channels, time_of_flight=75, @@ -132,6 +131,6 @@ def create(): name=str(FOLDER), configs=configs, parameters=parameters, - instruments={controller.name: controller}, + instruments={"EL_ZURO": controller}, resonator_type="3D", ) diff --git a/tests/test_platform.py b/tests/test_platform.py index 5c978d5c9a..4d5842a93f 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -299,7 +299,7 @@ def test_platform_execute_one_long_drive_pulse(qpu_platform): platform = qpu_platform qubit = next(iter(platform.qubits.values())) pulse = Pulse(duration=8192 + 200, amplitude=0.12, envelope=Gaussian(5)) - sequence = PulseSequence([(qubit.drive.name, pulse)]) + sequence = PulseSequence([(qubit.drive, pulse)]) options = ExecutionParameters(nshots=nshots) platform.execute_pulse_sequence(sequence, options) @@ -310,7 +310,7 @@ def test_platform_execute_one_extralong_drive_pulse(qpu_platform): platform = qpu_platform qubit = next(iter(platform.qubits.values())) pulse = Pulse(duration=2 * 8192 + 200, amplitude=0.12, envelope=Gaussian(0.2)) - sequence = PulseSequence([(qubit.drive.name, pulse)]) + sequence = PulseSequence([(qubit.drive, pulse)]) options = ExecutionParameters(nshots=nshots) platform.execute_pulse_sequence(sequence, options) @@ -334,9 +334,9 @@ def test_platform_execute_multiple_drive_pulses_one_readout(qpu_platform): qubit_id, qubit = next(iter(platform.qubits.items())) sequence = PulseSequence() sequence.concatenate(platform.create_RX_pulse(qubit_id)) - sequence.append((qubit.drive.name, Delay(duration=4))) + sequence.append((qubit.drive, Delay(duration=4))) sequence.concatenate(platform.create_RX_pulse(qubit_id)) - sequence.append((qubit.drive.name, Delay(duration=4))) + sequence.append((qubit.drive, Delay(duration=4))) sequence.concatenate(platform.create_RX_pulse(qubit_id)) sequence.append((qubit.probe, Delay(duration=808))) sequence.concatenate(platform.create_MZ_pulse(qubit_id)) @@ -392,7 +392,7 @@ def test_platform_execute_multiple_readout_pulses(qpu_platform): sequence.concatenate(qd_seq1) sequence.append((qubit.probe, Delay(duration=qd_seq1.duration))) sequence.concatenate(ro_seq1) - sequence.append((qubit.drive.name, Delay(duration=ro_seq1.duration))) + sequence.append((qubit.drive, Delay(duration=ro_seq1.duration))) sequence.concatenate(qd_seq2) sequence.append((qubit.probe, Delay(duration=qd_seq2.duration))) sequence.concatenate(ro_seq2) From 7ce9a4683a7b2ebb4b49b0f9b10d7e41707fc62e Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Mon, 9 Sep 2024 15:38:07 +0400 Subject: [PATCH 0903/1006] chore: drop OCTAVE_ADDRESS_OFFSET --- src/qibolab/instruments/qm/controller.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index b00f062541..6bd863c98c 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -31,9 +31,6 @@ from .program import ExecutionArguments, create_acquisition, program from .program.sweepers import find_lo_frequencies, sweeper_amplitude -OCTAVE_ADDRESS_OFFSET = 11000 -"""Offset to be added to Octave addresses, because they must be 11xxx, where -xxx are the last three digits of the Octave IP address.""" CALIBRATION_DB = "calibration_db.json" """Name of the file where the mixer calibration is stored.""" @@ -74,7 +71,7 @@ def declare_octaves(octaves, host, calibration_path=None): if calibration_path is not None: config.set_calibration_db(calibration_path) for octave in octaves.values(): - config.add_device_info(octave.name, host, OCTAVE_ADDRESS_OFFSET + octave.port) + config.add_device_info(octave.name, host, octave.port) return config From 349b17d3fc15ed9e2b020751db6a670cb00f945b Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Wed, 11 Sep 2024 16:59:34 +0400 Subject: [PATCH 0904/1006] chore: drop configs from program as it is not used --- src/qibolab/instruments/qm/controller.py | 2 +- src/qibolab/instruments/qm/program/instructions.py | 7 ++----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index 6bd863c98c..b991b8b668 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -470,7 +470,7 @@ def play( args = ExecutionArguments(sequence, acquisitions, options.relaxation_time) self.preprocess_sweeps(sweepers, configs, args, probe_map) - experiment = program(configs, args, options, sweepers) + experiment = program(args, options, sweepers) if self.script_file_name is not None: script_config = ( diff --git a/src/qibolab/instruments/qm/program/instructions.py b/src/qibolab/instruments/qm/program/instructions.py index 17b717ad75..75030fc578 100644 --- a/src/qibolab/instruments/qm/program/instructions.py +++ b/src/qibolab/instruments/qm/program/instructions.py @@ -4,7 +4,6 @@ from qm.qua import declare, fixed, for_ from qualang_tools.loops import from_array -from qibolab.components import Config from qibolab.execution_parameters import AcquisitionType, ExecutionParameters from qibolab.pulses import Align, Delay, Pulse, Readout, VirtualZ from qibolab.sweeper import ParallelSweepers, Parameter, Sweeper @@ -125,7 +124,6 @@ def _process_sweeper(sweeper: Sweeper, args: ExecutionArguments): def sweep( sweepers: list[ParallelSweepers], - configs: dict[str, Config], args: ExecutionArguments, ): """Unrolls a list of qibolab sweepers to the corresponding QUA for loops. @@ -157,14 +155,13 @@ def sweep( params = args.parameters[channel] method(variable, params) - sweep(sweepers[1:], configs, args) + sweep(sweepers[1:], args) else: play(args) def program( - configs: dict[str, Config], args: ExecutionArguments, options: ExecutionParameters, sweepers: list[ParallelSweepers], @@ -177,7 +174,7 @@ def program( acquisition.declare() # execute pulses with for_(n, 0, n < options.nshots, n + 1): - sweep(list(sweepers), configs, args) + sweep(list(sweepers), args) # download acquisitions has_iq = options.acquisition_type is AcquisitionType.INTEGRATION buffer_dims = options.results_shape(sweepers)[::-1][int(has_iq) :] From 864a52bc45cc50f5ada101d68886e1b46fc7b80f Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 13 Sep 2024 13:23:01 +0400 Subject: [PATCH 0905/1006] chore: make octaves optional in QmController --- src/qibolab/instruments/qm/controller.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index b991b8b668..b46302dffe 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -129,7 +129,7 @@ class QmController(Controller): Has the form XXX.XXX.XXX.XXX:XXX. """ - octaves: dict[str, Octave] + octaves: dict[str, Octave] = Field(default_factory=dict) """Dictionary containing the :class:`qibolab.instruments.qm.controller.Octave` instruments being used.""" From 1227e9e1a890ed3a78b50279a8f1efd0755e4e8f Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 13 Sep 2024 16:22:23 +0400 Subject: [PATCH 0906/1006] fix: LO name --- src/qibolab/instruments/erasynth.py | 2 +- src/qibolab/instruments/rohde_schwarz.py | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/qibolab/instruments/erasynth.py b/src/qibolab/instruments/erasynth.py index 6b91016ec7..9a2cf65a4a 100644 --- a/src/qibolab/instruments/erasynth.py +++ b/src/qibolab/instruments/erasynth.py @@ -135,7 +135,7 @@ def __init__(self, address, ethernet=True, ref_osc_source=None): self.ethernet = ethernet def create(self): - name = f"ERA:{self.address}" + name = type(self).__name__ if self.ethernet: return ERASynthEthernet(name, self.address) else: diff --git a/src/qibolab/instruments/rohde_schwarz.py b/src/qibolab/instruments/rohde_schwarz.py index 02c4e59989..0a1ee44e70 100644 --- a/src/qibolab/instruments/rohde_schwarz.py +++ b/src/qibolab/instruments/rohde_schwarz.py @@ -11,7 +11,6 @@ class SGS100A(LocalOscillator): """ def create(self): - name = f"SGS100A:{self.address}" return LO_SGS100A.RohdeSchwarz_SGS100A( - name, f"TCPIP0::{self.address}::5025::SOCKET" + type(self).__name__, f"TCPIP0::{self.address}::5025::SOCKET" ) From a78c27b49f82c4393c5fa0107bf1a13f19b711f9 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 13 Sep 2024 18:13:28 +0400 Subject: [PATCH 0907/1006] fix: change LO names again to be able to instantiate two of them in the same script --- src/qibolab/instruments/erasynth.py | 2 +- src/qibolab/instruments/rohde_schwarz.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/qibolab/instruments/erasynth.py b/src/qibolab/instruments/erasynth.py index 9a2cf65a4a..9558b3d7f5 100644 --- a/src/qibolab/instruments/erasynth.py +++ b/src/qibolab/instruments/erasynth.py @@ -135,7 +135,7 @@ def __init__(self, address, ethernet=True, ref_osc_source=None): self.ethernet = ethernet def create(self): - name = type(self).__name__ + name = f"{type(self).__name__}{id(self)}" if self.ethernet: return ERASynthEthernet(name, self.address) else: diff --git a/src/qibolab/instruments/rohde_schwarz.py b/src/qibolab/instruments/rohde_schwarz.py index 0a1ee44e70..3a4e61020e 100644 --- a/src/qibolab/instruments/rohde_schwarz.py +++ b/src/qibolab/instruments/rohde_schwarz.py @@ -11,6 +11,7 @@ class SGS100A(LocalOscillator): """ def create(self): + name = f"{type(self).__name__}{id(self)}" return LO_SGS100A.RohdeSchwarz_SGS100A( - type(self).__name__, f"TCPIP0::{self.address}::5025::SOCKET" + name, f"TCPIP0::{self.address}::5025::SOCKET" ) From 0483c94d0c7797a8798b2bf2a2d27276b7adef79 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 10 Sep 2024 13:57:16 +0400 Subject: [PATCH 0908/1006] feat: implement helper methods for qubit creation (#1022) --- src/qibolab/dummy/parameters.json | 128 +++++++++++++++--------------- src/qibolab/dummy/platform.py | 31 +++----- src/qibolab/qubits.py | 26 +++++- tests/test_compilers_default.py | 19 +++-- 4 files changed, 109 insertions(+), 95 deletions(-) diff --git a/src/qibolab/dummy/parameters.json b/src/qibolab/dummy/parameters.json index e9e6a96f5d..f45eca98a1 100644 --- a/src/qibolab/dummy/parameters.json +++ b/src/qibolab/dummy/parameters.json @@ -10,87 +10,87 @@ "readout": 0, "instructions": 0 }, - "qubit_0/drive": { + "0/drive": { "kind": "iq", "frequency": 4000000000.0 }, - "qubit_1/drive": { + "1/drive": { "kind": "iq", "frequency": 4200000000.0 }, - "qubit_2/drive": { + "2/drive": { "kind": "iq", "frequency": 4500000000.0 }, - "qubit_3/drive": { + "3/drive": { "kind": "iq", "frequency": 4150000000.0 }, - "qubit_4/drive": { + "4/drive": { "kind": "iq", "frequency": 4155663000.0 }, - "qubit_0/drive12": { + "0/drive12": { "kind": "iq", "frequency": 4700000000.0 }, - "qubit_1/drive12": { + "1/drive12": { "kind": "iq", "frequency": 4855663000.0 }, - "qubit_2/drive12": { + "2/drive12": { "kind": "iq", "frequency": 2700000000.0 }, - "qubit_3/drive12": { + "3/drive12": { "kind": "iq", "frequency": 5855663000.0 }, - "qubit_4/drive12": { + "4/drive12": { "kind": "iq", "frequency": 5855663000.0 }, - "qubit_0/flux": { + "0/flux": { "kind": "dc", "offset": -0.1 }, - "qubit_1/flux": { + "1/flux": { "kind": "dc", "offset": 0.0 }, - "qubit_2/flux": { + "2/flux": { "kind": "dc", "offset": 0.1 }, - "qubit_3/flux": { + "3/flux": { "kind": "dc", "offset": 0.2 }, - "qubit_4/flux": { + "4/flux": { "kind": "dc", "offset": 0.15 }, - "qubit_0/probe": { + "0/probe": { "kind": "iq", "frequency": 5200000000.0 }, - "qubit_1/probe": { + "1/probe": { "kind": "iq", "frequency": 4900000000.0 }, - "qubit_2/probe": { + "2/probe": { "kind": "iq", "frequency": 6100000000.0 }, - "qubit_3/probe": { + "3/probe": { "kind": "iq", "frequency": 5800000000.0 }, - "qubit_4/probe": { + "4/probe": { "kind": "iq", "frequency": 5500000000.0 }, - "qubit_0/acquisition": { + "0/acquisition": { "kind": "acquisition", "delay": 0.0, "smearing": 0.0, @@ -98,7 +98,7 @@ "iq_angle": 0.0, "kernel": "k05VTVBZAQB2AHsnZGVzY3InOiAnPGY4JywgJ2ZvcnRyYW5fb3JkZXInOiBGYWxzZSwgJ3NoYXBlJzogKDEwLCksIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAp5sDfS7uHlP2DIMKNvnKc/gCqN8KV/pT94FQCYYJC3PzSbwfi/894/APwg6C61rj8MSN3blizAP2ha9unQYsM/+BFjHTxcwT+gXaJazvbpPw==" }, - "qubit_1/acquisition": { + "1/acquisition": { "kind": "acquisition", "delay": 0.0, "smearing": 0.0, @@ -106,7 +106,7 @@ "iq_angle": 0.0, "kernel": "k05VTVBZAQB2AHsnZGVzY3InOiAnPGY4JywgJ2ZvcnRyYW5fb3JkZXInOiBGYWxzZSwgJ3NoYXBlJzogKDEwLCksIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAr4dT6V5tHrP1w+JhHImN8/sPePZeSUuj/4yTKrD5fRP/ysonZip98/6GJMAPV9xD/LTiJo4k7oP96aWXpxduU/6fUxETe/7z9GXEBNGebWPw==" }, - "qubit_2/acquisition": { + "2/acquisition": { "kind": "acquisition", "delay": 0.0, "smearing": 0.0, @@ -114,7 +114,7 @@ "iq_angle": 0.0, "kernel": "k05VTVBZAQB2AHsnZGVzY3InOiAnPGY4JywgJ2ZvcnRyYW5fb3JkZXInOiBGYWxzZSwgJ3NoYXBlJzogKDEwLCksIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApUtcFdBpTsPzzwG8Xkbts/OAvkS0qo4z+OUcJpZ8HlP/jsO9cUwso/s6DVM7e/4T/NL4JYzUXvP9CibqEg98M/AENJ8QPkcD8wAOtI4pHNPw==" }, - "qubit_3/acquisition": { + "3/acquisition": { "kind": "acquisition", "delay": 0.0, "smearing": 0.0, @@ -122,7 +122,7 @@ "iq_angle": 0.0, "kernel": "k05VTVBZAQB2AHsnZGVzY3InOiAnPGY4JywgJ2ZvcnRyYW5fb3JkZXInOiBGYWxzZSwgJ3NoYXBlJzogKDEwLCksIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogk3D0+DqsP1ry/LSlMuM/ydJYpPk/6D8BJMdYs+zsP1CqhVqYz+o/1A3srA5z7j8CUqCE6lvqPwjNySZ1DuA/YHGvVmuFsz+XwaQKz/bqPw==" }, - "qubit_4/acquisition": { + "4/acquisition": { "kind": "acquisition", "delay": 0.0, "smearing": 0.0, @@ -157,7 +157,7 @@ "0": { "RX": [ [ - "qubit_0/drive", + "0/drive", { "duration": 40.0, "amplitude": 0.1, @@ -172,7 +172,7 @@ ], "RX12": [ [ - "qubit_0/drive12", + "0/drive12", { "duration": 40.0, "amplitude": 0.005, @@ -187,7 +187,7 @@ ], "MZ": [ [ - "qubit_0/acquisition", + "0/acquisition", { "kind": "readout", "acquisition": { @@ -213,7 +213,7 @@ "1": { "RX": [ [ - "qubit_1/drive", + "1/drive", { "duration": 40.0, "amplitude": 0.3, @@ -229,7 +229,7 @@ ], "RX12": [ [ - "qubit_1/drive12", + "1/drive12", { "duration": 40.0, "amplitude": 0.0484, @@ -245,7 +245,7 @@ ], "MZ": [ [ - "qubit_1/acquisition", + "1/acquisition", { "kind": "readout", "acquisition": { @@ -271,7 +271,7 @@ "2": { "RX": [ [ - "qubit_2/drive", + "2/drive", { "duration": 40.0, "amplitude": 0.3, @@ -287,7 +287,7 @@ ], "RX12": [ [ - "qubit_2/drive12", + "2/drive12", { "duration": 40.0, "amplitude": 0.005, @@ -302,7 +302,7 @@ ], "MZ": [ [ - "qubit_2/acquisition", + "2/acquisition", { "kind": "readout", "acquisition": { @@ -328,7 +328,7 @@ "3": { "RX": [ [ - "qubit_3/drive", + "3/drive", { "duration": 40.0, "amplitude": 0.3, @@ -344,7 +344,7 @@ ], "RX12": [ [ - "qubit_3/drive12", + "3/drive12", { "duration": 40.0, "amplitude": 0.0484, @@ -360,7 +360,7 @@ ], "MZ": [ [ - "qubit_3/acquisition", + "3/acquisition", { "kind": "readout", "acquisition": { @@ -386,7 +386,7 @@ "4": { "RX": [ [ - "qubit_4/drive", + "4/drive", { "duration": 40.0, "amplitude": 0.3, @@ -402,7 +402,7 @@ ], "RX12": [ [ - "qubit_4/drive12", + "4/drive12", { "duration": 40.0, "amplitude": 0.0484, @@ -418,7 +418,7 @@ ], "MZ": [ [ - "qubit_4/acquisition", + "4/acquisition", { "kind": "readout", "acquisition": { @@ -532,7 +532,7 @@ "0-2": { "CZ": [ [ - "qubit_2/flux", + "2/flux", { "duration": 30.0, "amplitude": 0.05, @@ -546,14 +546,14 @@ } ], [ - "qubit_0/drive", + "0/drive", { "phase": 0.0, "kind": "virtualz" } ], [ - "qubit_2/drive", + "2/drive", { "phase": 0.0, "kind": "virtualz" @@ -577,7 +577,7 @@ "CNOT": null, "iSWAP": [ [ - "qubit_2/flux", + "2/flux", { "duration": 30.0, "amplitude": 0.05, @@ -591,14 +591,14 @@ } ], [ - "qubit_0/drive", + "0/drive", { "phase": 0.0, "kind": "virtualz" } ], [ - "qubit_2/drive", + "2/drive", { "phase": 0.0, "kind": "virtualz" @@ -623,7 +623,7 @@ "1-2": { "CZ": [ [ - "qubit_2/flux", + "2/flux", { "duration": 30.0, "amplitude": 0.05, @@ -637,14 +637,14 @@ } ], [ - "qubit_1/drive", + "1/drive", { "phase": 0.0, "kind": "virtualz" } ], [ - "qubit_2/drive", + "2/drive", { "phase": 0.0, "kind": "virtualz" @@ -668,7 +668,7 @@ "CNOT": null, "iSWAP": [ [ - "qubit_2/flux", + "2/flux", { "duration": 30.0, "amplitude": 0.05, @@ -682,14 +682,14 @@ } ], [ - "qubit_1/drive", + "1/drive", { "phase": 0.0, "kind": "virtualz" } ], [ - "qubit_2/drive", + "2/drive", { "phase": 0.0, "kind": "virtualz" @@ -714,7 +714,7 @@ "2-3": { "CZ": [ [ - "qubit_2/flux", + "2/flux", { "duration": 30.0, "amplitude": 0.05, @@ -728,14 +728,14 @@ } ], [ - "qubit_2/drive", + "2/drive", { "phase": 0.0, "kind": "virtualz" } ], [ - "qubit_3/drive", + "3/drive", { "phase": 0.0, "kind": "virtualz" @@ -744,7 +744,7 @@ ], "CNOT": [ [ - "qubit_2/drive", + "2/drive", { "duration": 40.0, "amplitude": 0.3, @@ -760,7 +760,7 @@ ], "iSWAP": [ [ - "qubit_2/flux", + "2/flux", { "duration": 30.0, "amplitude": 0.05, @@ -774,14 +774,14 @@ } ], [ - "qubit_2/drive", + "2/drive", { "phase": 0.0, "kind": "virtualz" } ], [ - "qubit_3/drive", + "3/drive", { "phase": 0.0, "kind": "virtualz" @@ -792,7 +792,7 @@ "2-4": { "CZ": [ [ - "qubit_2/flux", + "2/flux", { "duration": 30.0, "amplitude": 0.05, @@ -806,7 +806,7 @@ } ], [ - "qubit_4/drive", + "4/drive", { "phase": 0.0, "kind": "virtualz" @@ -830,7 +830,7 @@ "CNOT": null, "iSWAP": [ [ - "qubit_2/flux", + "2/flux", { "duration": 30.0, "amplitude": 0.05, @@ -844,14 +844,14 @@ } ], [ - "qubit_2/drive", + "2/drive", { "phase": 0.0, "kind": "virtualz" } ], [ - "qubit_4/drive", + "4/drive", { "phase": 0.0, "kind": "virtualz" diff --git a/src/qibolab/dummy/platform.py b/src/qibolab/dummy/platform.py index 60db6a8c80..c6b3fa17b3 100644 --- a/src/qibolab/dummy/platform.py +++ b/src/qibolab/dummy/platform.py @@ -15,33 +15,22 @@ def create_dummy() -> Platform: # attach the channels pump_name = "twpa_pump" for q in range(5): - drive, drive12, flux, probe, acquisition = ( - f"qubit_{q}/drive", - f"qubit_{q}/drive12", - f"qubit_{q}/flux", - f"qubit_{q}/probe", - f"qubit_{q}/acquisition", - ) + drive12 = f"{q}/drive12" + qubits[q] = qubit = Qubit.default(q, drive_qudits={(1, 2): drive12}) channels |= { - probe: IqChannel(mixer=None, lo=None), - acquisition: AcquisitionChannel(twpa_pump=pump_name, probe=probe), - drive: IqChannel(mixer=None, lo=None), + qubit.probe: IqChannel(mixer=None, lo=None), + qubit.acquisition: AcquisitionChannel( + twpa_pump=pump_name, probe=qubit.probe + ), + qubit.drive: IqChannel(mixer=None, lo=None), drive12: IqChannel(mixer=None, lo=None), - flux: DcChannel(), + qubit.flux: DcChannel(), } - qubits[q] = Qubit( - probe=probe, - acquisition=acquisition, - drive=drive, - drive_qudits={(1, 2): drive12}, - flux=flux, - ) couplers = {} for c in (0, 1, 3, 4): - flux = f"coupler_{c}/flux" - channels |= {flux: DcChannel()} - couplers[c] = Qubit(flux=flux) + couplers[c] = coupler = Qubit(flux=f"coupler_{c}/flux") + channels |= {coupler.flux: DcChannel()} # register the instruments instruments = { diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index 433ad3430e..513a4b4ddd 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -12,8 +12,9 @@ class Qubit(Model): """Representation of a physical qubit. - Qubit objects are instantiated by :class:`qibolab.platforms.platform.Platform` - but they are passed to instrument designs in order to play pulses. + Contains the channel ids used to control the qubit and is instantiated + in the function that creates the corresponding + :class:`qibolab.platforms.platform.Platform` """ model_config = ConfigDict(frozen=False) @@ -40,6 +41,27 @@ def channels(self) -> list[ChannelId]: if x is not None ] + @classmethod + def with_channels(cls, name: QubitId, channels: list[str], **kwargs): + """Create a qubit with default channel names. + + Default channel names follow the convention: + '{qubit_name}/{channel_type}' + """ + return cls(**{ch: f"{name}/{ch}" for ch in channels}, **kwargs) + + @classmethod + def default(cls, name: QubitId, flux: bool = True, **kwargs): + """Create a flux tunable qubit with the default channel names. + + Flux tunable qubits have drive, flux, probe and acquisition + channels. + """ + channels = ["probe", "acquisition", "drive"] + if flux: + channels.append("flux") + return cls.with_channels(name, channels, **kwargs) + class QubitPair(Model): """Represent a two-qubit interaction.""" diff --git a/tests/test_compilers_default.py b/tests/test_compilers_default.py index 745c22000e..2bc3c10530 100644 --- a/tests/test_compilers_default.py +++ b/tests/test_compilers_default.py @@ -199,9 +199,10 @@ def test_align_multiqubit(platform: Platform): circuit.add(gates.M(main, coupled)) sequence = compile_circuit(circuit, platform) - flux_duration = sequence.channel_duration(f"qubit_{coupled}/flux") + qubits = platform.qubits + flux_duration = sequence.channel_duration(qubits[coupled].flux) for q in (main, coupled): - probe_delay = next(iter(sequence.channel(f"qubit_{q}/acquisition"))) + probe_delay = next(iter(sequence.channel(qubits[q].acquisition))) assert isinstance(probe_delay, Delay) assert flux_duration == probe_delay.duration @@ -235,8 +236,9 @@ def no_measurement(seq: PulseSequence): assert len(no_measurement(sequence)) == 1 - mflux = f"qubit_{main}/flux" - cdrive = f"qubit_{coupled}/drive" + qubits = platform.qubits + mflux = qubits[main].flux + cdrive = qubits[coupled].drive duration = 200 natives.CZ.extend( PulseSequence.load( @@ -286,10 +288,11 @@ def test_joint_split_equivalence(platform: Platform): assert not any( isinstance(p, gates.Align) for seq in (joint_seq, split_seq) for _, p in seq ) # TODO: gates.Align is just a placeholder, replace with the pulse-like when available + qubits = platform.qubits for ch in ( - "qubit_0/acquisition", - "qubit_2/acquisition", - "qubit_0/probe", - "qubit_2/probe", + qubits[0].acquisition, + qubits[2].acquisition, + qubits[0].probe, + qubits[2].probe, ): assert list(joint_seq.channel(ch)) == list(split_seq.channel(ch)) From 58b3d8971d6a1bbfb43ddc70cd77a6216c8d8e00 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 10 Sep 2024 14:00:53 +0400 Subject: [PATCH 0909/1006] fix: docstring --- src/qibolab/qubits.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index 513a4b4ddd..0016fe77b8 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -52,10 +52,11 @@ def with_channels(cls, name: QubitId, channels: list[str], **kwargs): @classmethod def default(cls, name: QubitId, flux: bool = True, **kwargs): - """Create a flux tunable qubit with the default channel names. + """Create a qubit with the usual channels. - Flux tunable qubits have drive, flux, probe and acquisition - channels. + These are probe, acquisition, drive and flux. + For non flux-tunable qubits the flux channel can + be disabled using the ``flux: bool`` argument """ channels = ["probe", "acquisition", "drive"] if flux: From 8a192ae6c340a5832699e15566efd1cf0809ddee Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 10 Sep 2024 14:04:56 +0400 Subject: [PATCH 0910/1006] fix: doctest --- doc/source/main-documentation/qibolab.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index 9f3cb84c5f..7aa6056bed 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -55,9 +55,9 @@ We can easily access the names of channels and other components, and based on th .. testoutput:: python :hide: - Drive channel name: qubit_0/drive + Drive channel name: 0/drive Drive frequency: 4000000000.0 - Drive channel qubit_0/drive does not use an LO. + Drive channel 0/drive does not use an LO. Now we can create a simple sequence (again, without explicitly giving any qubit specific parameter, as these are loaded automatically from the platform, as defined in the runcard): From eccb28e30f29178e6a51cf4a90b842e3a3449dcc Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 10 Sep 2024 14:10:16 +0400 Subject: [PATCH 0911/1006] refactor: only one creation helper --- src/qibolab/qubits.py | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index 0016fe77b8..ceb1f6d2f7 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -42,26 +42,21 @@ def channels(self) -> list[ChannelId]: ] @classmethod - def with_channels(cls, name: QubitId, channels: list[str], **kwargs): + def default(cls, name: QubitId, channels: Optional[list[str]] = None, **kwargs): """Create a qubit with default channel names. Default channel names follow the convention: '{qubit_name}/{channel_type}' - """ - return cls(**{ch: f"{name}/{ch}" for ch in channels}, **kwargs) - @classmethod - def default(cls, name: QubitId, flux: bool = True, **kwargs): - """Create a qubit with the usual channels. - - These are probe, acquisition, drive and flux. - For non flux-tunable qubits the flux channel can - be disabled using the ``flux: bool`` argument + Args: + name: Name for the qubit to be used for channel ids. + channels: List of channels to add to the qubit. + If ``None`` the following channels will be added: + probe, acquisition, drive and flux. """ - channels = ["probe", "acquisition", "drive"] - if flux: - channels.append("flux") - return cls.with_channels(name, channels, **kwargs) + if channels is None: + channels = ["probe", "acquisition", "drive", "flux"] + return cls(**{ch: f"{name}/{ch}" for ch in channels}, **kwargs) class QubitPair(Model): From b4e58161df2974b87e2fab73c1250411e3017af3 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 13 Sep 2024 19:10:23 +0400 Subject: [PATCH 0912/1006] refactor: use field metadata to distinguish default channels --- src/qibolab/qubits.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/qibolab/qubits.py b/src/qibolab/qubits.py index ceb1f6d2f7..701862b03f 100644 --- a/src/qibolab/qubits.py +++ b/src/qibolab/qubits.py @@ -1,4 +1,4 @@ -from typing import Optional +from typing import Annotated, Optional from pydantic import ConfigDict, Field @@ -8,6 +8,9 @@ from .identifier import ChannelId, QubitId, QubitPairId, TransitionId # noqa from .serialize import Model +DefaultChannelType = Annotated[Optional[ChannelId], True] +"""If ``True`` the channel is included in the default qubit constructor.""" + class Qubit(Model): """Representation of a physical qubit. @@ -19,15 +22,17 @@ class Qubit(Model): model_config = ConfigDict(frozen=False) - drive: Optional[ChannelId] = None + drive: DefaultChannelType = None """Ouput channel, to drive the qubit state.""" - drive_qudits: dict[TransitionId, ChannelId] = Field(default_factory=dict) + drive_qudits: Annotated[dict[TransitionId, ChannelId], False] = Field( + default_factory=dict + ) """Output channels collection, to drive non-qubit transitions.""" - flux: Optional[ChannelId] = None + flux: DefaultChannelType = None """Output channel, to control the qubit flux.""" - probe: Optional[ChannelId] = None + probe: DefaultChannelType = None """Output channel, to probe the resonator.""" - acquisition: Optional[ChannelId] = None + acquisition: DefaultChannelType = None """Input channel, to acquire the readout results.""" @property @@ -55,7 +60,7 @@ def default(cls, name: QubitId, channels: Optional[list[str]] = None, **kwargs): probe, acquisition, drive and flux. """ if channels is None: - channels = ["probe", "acquisition", "drive", "flux"] + channels = [name for name, f in cls.model_fields.items() if f.metadata[0]] return cls(**{ch: f"{name}/{ch}" for ch in channels}, **kwargs) From 4a3f739d0a4d37b0a93cd9154ed178346dbd9386 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 3 Sep 2024 16:11:01 +0200 Subject: [PATCH 0913/1006] feat: Add native creator alias Pure syntactic sugar --- src/qibolab/native.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/qibolab/native.py b/src/qibolab/native.py index 2c4ad3246a..b2b60d9096 100644 --- a/src/qibolab/native.py +++ b/src/qibolab/native.py @@ -22,6 +22,13 @@ class Native(ABC, PulseSequence): def create_sequence(self, *args, **kwargs) -> PulseSequence: """Create a sequence for single-qubit rotation.""" + def __call__(self, *args, **kwargs) -> PulseSequence: + """Create a sequence for single-qubit rotation. + + Alias to :meth:`create_sequence`. + """ + return self.create_sequence(*args, **kwargs) + class RxyFactory(Native): """Factory for pulse sequences that generate single-qubit rotations around From 2f8da08602fb15e19fff7e28acff1c6ae6d22d86 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 3 Sep 2024 16:20:59 +0200 Subject: [PATCH 0914/1006] feat: Add sequences concatenation alias Pure syntactic sugar --- src/qibolab/sequence.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/qibolab/sequence.py b/src/qibolab/sequence.py index 48e058bfcd..7f3706c76f 100644 --- a/src/qibolab/sequence.py +++ b/src/qibolab/sequence.py @@ -2,6 +2,7 @@ from collections import UserList from collections.abc import Callable, Iterable +from copy import deepcopy from typing import Any, Union from pydantic import TypeAdapter @@ -104,6 +105,25 @@ def concatenate(self, other: "PulseSequence") -> None: _synchronize(self, other.channels) self.extend(other) + def __ior__(self, other: "PulseSequence") -> "PulseSequence": + """Juxtapose two sequences. + + Alias to :meth:`concatenate`. + """ + self.concatenate(other) + return self + + def __or__(self, other: "PulseSequence") -> "PulseSequence": + """Juxtapose two sequences. + + A copy is made, and no input is altered. + + Other than that, it is based on :meth:`concatenate`. + """ + copy = deepcopy(self) + copy |= other + return copy + def align(self, channels: list[ChannelId]) -> Align: """Introduce align commands to the sequence.""" align = Align() From ba9584c61e1a320c3e9e12b97ea9431b39c34bc6 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 5 Sep 2024 19:30:42 +0200 Subject: [PATCH 0915/1006] test: Test concatenation aliases --- tests/test_sequence.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/test_sequence.py b/tests/test_sequence.py index e1ce15fac1..7ed9d07408 100644 --- a/tests/test_sequence.py +++ b/tests/test_sequence.py @@ -1,3 +1,5 @@ +from copy import deepcopy + from pydantic import TypeAdapter from qibolab.pulses import ( @@ -144,6 +146,14 @@ def test_concatenate(): assert isinstance(s1[3][1], Pulse) assert s1[3][0] == "a" + # Check aliases + sa1 = deepcopy(s1) + sc1 = deepcopy(s1) + sa1 |= s2 + sc1.concatenate(s2) + assert sa1 == sc1 + assert sc1 == s1 | s2 + def test_copy(): sequence = PulseSequence( From 9c31c8c59a7c10b2f6cd7c54cf7ec4d7a33d49bd Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 5 Sep 2024 19:32:16 +0200 Subject: [PATCH 0916/1006] test: Test native creation alias --- tests/test_native.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/test_native.py b/tests/test_native.py index dd215bc8cf..2527284a2b 100644 --- a/tests/test_native.py +++ b/tests/test_native.py @@ -48,6 +48,9 @@ def test_fixed_sequence_factory(): assert np not in seq.channels assert np not in fseq2.channels + # test alias + assert factory() == seq + @pytest.mark.parametrize( "args,amplitude,phase", From 6126c344fb764bb5500ba383347dca879420c790 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 5 Sep 2024 19:57:50 +0200 Subject: [PATCH 0917/1006] test: Test full sequence construction proposal --- tests/integration/__init__.py | 0 tests/integration/test_sequence.py | 30 ++++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 tests/integration/__init__.py create mode 100644 tests/integration/test_sequence.py diff --git a/tests/integration/__init__.py b/tests/integration/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/integration/test_sequence.py b/tests/integration/test_sequence.py new file mode 100644 index 0000000000..6ce5c9a09c --- /dev/null +++ b/tests/integration/test_sequence.py @@ -0,0 +1,30 @@ +from qibolab import create_platform +from qibolab.execution_parameters import ExecutionParameters +from qibolab.pulses import Delay + + +def test_dummy_execute_pulse_sequence_couplers(): + platform = create_platform("dummy") + + single = platform.natives.single_qubit + two = platform.natives.two_qubit + + # How a complex sequence is supposed to be constructed + # ---------------------------------------------------- + + p02 = two[(0, 2)] + p12 = two[(1, 2)] + q1 = single[1] + q2 = single[2] + + seq = q1.RX() | p12.CZ() | [("", Delay())] | q2.RX() | p02.CZ() + for q in range(3): + seq |= single[q].MZ() + + # ---------------------------------------------------- + + nshots = 17 + res = platform.execute([seq], ExecutionParameters(nshots=nshots)) + + for r in res.values(): + assert r.shape == (nshots,) From 9cd207617cb8b2af12e151e58c33fbe92a04d417 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 5 Sep 2024 19:58:58 +0200 Subject: [PATCH 0918/1006] fix: Accept sequence concatenation with more general iterables --- src/qibolab/sequence.py | 4 ++-- tests/integration/test_sequence.py | 15 ++++++++++++--- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/qibolab/sequence.py b/src/qibolab/sequence.py index 7f3706c76f..28b97c9034 100644 --- a/src/qibolab/sequence.py +++ b/src/qibolab/sequence.py @@ -94,7 +94,7 @@ def pulse_channels(self, pulse_id: int) -> list[ChannelId]: """Find channels on which a pulse with a given id plays.""" return [channel for channel, pulse in self if pulse.id == pulse_id] - def concatenate(self, other: "PulseSequence") -> None: + def concatenate(self, other: Iterable[_Element]) -> None: """Juxtapose two sequences. Appends ``other`` in-place such that the result is: @@ -102,7 +102,7 @@ def concatenate(self, other: "PulseSequence") -> None: - necessary delays to synchronize channels - ``other`` """ - _synchronize(self, other.channels) + _synchronize(self, PulseSequence(other).channels) self.extend(other) def __ior__(self, other: "PulseSequence") -> "PulseSequence": diff --git a/tests/integration/test_sequence.py b/tests/integration/test_sequence.py index 6ce5c9a09c..2003ac273c 100644 --- a/tests/integration/test_sequence.py +++ b/tests/integration/test_sequence.py @@ -3,7 +3,7 @@ from qibolab.pulses import Delay -def test_dummy_execute_pulse_sequence_couplers(): +def test_sequence_creation(): platform = create_platform("dummy") single = platform.natives.single_qubit @@ -14,10 +14,19 @@ def test_dummy_execute_pulse_sequence_couplers(): p02 = two[(0, 2)] p12 = two[(1, 2)] + q0 = single[0] q1 = single[1] q2 = single[2] - - seq = q1.RX() | p12.CZ() | [("", Delay())] | q2.RX() | p02.CZ() + ch1 = platform.qubits[1] + + seq = ( + q1.RX() + | p12.CZ() + | [(ch1.drive, Delay(duration=6.5))] + | q2.RX() + | q0.RX12() + | p02.CZ() + ) for q in range(3): seq |= single[q].MZ() From 0861bae2b3e76fc1ab0f10dafb29ecff806e1aab Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 5 Sep 2024 20:00:15 +0200 Subject: [PATCH 0919/1006] fix: Extend type hints even for concatenation aliases --- src/qibolab/sequence.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qibolab/sequence.py b/src/qibolab/sequence.py index 28b97c9034..65bac1b6da 100644 --- a/src/qibolab/sequence.py +++ b/src/qibolab/sequence.py @@ -105,7 +105,7 @@ def concatenate(self, other: Iterable[_Element]) -> None: _synchronize(self, PulseSequence(other).channels) self.extend(other) - def __ior__(self, other: "PulseSequence") -> "PulseSequence": + def __ior__(self, other: Iterable[_Element]) -> "PulseSequence": """Juxtapose two sequences. Alias to :meth:`concatenate`. @@ -113,7 +113,7 @@ def __ior__(self, other: "PulseSequence") -> "PulseSequence": self.concatenate(other) return self - def __or__(self, other: "PulseSequence") -> "PulseSequence": + def __or__(self, other: Iterable[_Element]) -> "PulseSequence": """Juxtapose two sequences. A copy is made, and no input is altered. From 744050232d2be4f09cfa715f081adf0ca6e5bf67 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 6 Sep 2024 17:50:58 +0200 Subject: [PATCH 0920/1006] fix: Pass all involved channels during synchronization When concatenating two sequences Co-authored-by: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> --- src/qibolab/sequence.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibolab/sequence.py b/src/qibolab/sequence.py index 65bac1b6da..1247f107e2 100644 --- a/src/qibolab/sequence.py +++ b/src/qibolab/sequence.py @@ -102,7 +102,7 @@ def concatenate(self, other: Iterable[_Element]) -> None: - necessary delays to synchronize channels - ``other`` """ - _synchronize(self, PulseSequence(other).channels) + _synchronize(self, PulseSequence(other).channels | self.channels) self.extend(other) def __ior__(self, other: Iterable[_Element]) -> "PulseSequence": From 47da122334a901f3b1564794e3f36571937eb48c Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 10 Sep 2024 15:39:54 +0400 Subject: [PATCH 0921/1006] feat: implement sequence.juxtapose --- src/qibolab/sequence.py | 35 ++++++++++++++++++++- tests/test_sequence.py | 67 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 100 insertions(+), 2 deletions(-) diff --git a/src/qibolab/sequence.py b/src/qibolab/sequence.py index 1247f107e2..4b91c05b17 100644 --- a/src/qibolab/sequence.py +++ b/src/qibolab/sequence.py @@ -95,12 +95,45 @@ def pulse_channels(self, pulse_id: int) -> list[ChannelId]: return [channel for channel, pulse in self if pulse.id == pulse_id] def concatenate(self, other: Iterable[_Element]) -> None: + """Concatenate two sequences. + + Appends ``other`` in-place such that the result is: + - ``self`` + - necessary delays to synchronize channels + - ``other`` + Guarantees that the all the channels in the concatenated + sequence will start simultaneously + """ + _synchronize(self, PulseSequence(other).channels) + self.extend(other) + + def __ilshift__(self, other: Iterable[_Element]) -> "PulseSequence": + """Juxtapose two sequences. + + Alias to :meth:`concatenate`. + """ + self.concatenate(other) + return self + + def __lshift__(self, other: Iterable[_Element]) -> "PulseSequence": + """Juxtapose two sequences. + + A copy is made, and no input is altered. + + Other than that, it is based on :meth:`concatenate`. + """ + copy = deepcopy(self) + copy <<= other + return copy + + def juxtapose(self, other: Iterable[_Element]) -> None: """Juxtapose two sequences. Appends ``other`` in-place such that the result is: - ``self`` - necessary delays to synchronize channels - ``other`` + Guarantee simultaneous start and no overlap. """ _synchronize(self, PulseSequence(other).channels | self.channels) self.extend(other) @@ -110,7 +143,7 @@ def __ior__(self, other: Iterable[_Element]) -> "PulseSequence": Alias to :meth:`concatenate`. """ - self.concatenate(other) + self.juxtapose(other) return self def __or__(self, other: Iterable[_Element]) -> "PulseSequence": diff --git a/tests/test_sequence.py b/tests/test_sequence.py index 7ed9d07408..159a7c8b3c 100644 --- a/tests/test_sequence.py +++ b/tests/test_sequence.py @@ -149,9 +149,74 @@ def test_concatenate(): # Check aliases sa1 = deepcopy(s1) sc1 = deepcopy(s1) - sa1 |= s2 + sa1 <<= s2 sc1.concatenate(s2) assert sa1 == sc1 + assert sc1 == s1 << s2 + + +def test_juxtapose(): + p1 = Pulse(duration=40, amplitude=0.9, envelope=Drag(rel_sigma=0.2, beta=1)) + sequence1 = PulseSequence([("ch1", p1)]) + p2 = Pulse(duration=60, amplitude=0.9, envelope=Drag(rel_sigma=0.2, beta=1)) + sequence2 = PulseSequence([("ch2", p2)]) + + sequence1.juxtapose(sequence2) + assert set(sequence1.channels) == {"ch1", "ch2"} + assert len(list(sequence1.channel("ch1"))) == 1 + assert len(list(sequence1.channel("ch2"))) == 2 + assert sequence1.duration == 40 + 60 + channel, delay = sequence1[1] + assert channel == "ch2" + assert isinstance(delay, Delay) + assert delay.duration == 40 + + sequence3 = PulseSequence( + [ + ( + "ch2", + Pulse(duration=80, amplitude=0.9, envelope=Drag(rel_sigma=0.2, beta=1)), + ), + ( + "ch3", + Pulse( + duration=100, amplitude=0.9, envelope=Drag(rel_sigma=0.2, beta=1) + ), + ), + ] + ) + + sequence1.juxtapose(sequence3) + assert sequence1.channels == {"ch1", "ch2", "ch3"} + assert len(list(sequence1.channel("ch1"))) == 2 + assert len(list(sequence1.channel("ch2"))) == 3 + assert len(list(sequence1.channel("ch3"))) == 2 + assert isinstance(next(iter(sequence1.channel("ch3"))), Delay) + assert sequence1.duration == 40 + 60 + 100 + assert sequence1.channel_duration("ch1") == 40 + 60 + assert sequence1.channel_duration("ch2") == 40 + 60 + 80 + assert sequence1.channel_duration("ch3") == 40 + 60 + 100 + delay = list(sequence1.channel("ch3"))[0] + assert isinstance(delay, Delay) + assert delay.duration == 100 + + # Check order preservation, even with various channels + vz = VirtualZ(phase=0.1) + s1 = PulseSequence([("a", p1), ("b", vz)]) + s2 = PulseSequence([("a", vz), ("a", p2)]) + s1.juxtapose(s2) + target_channels = ["a", "b", "b", "a", "a"] + target_pulse_types = [Pulse, VirtualZ, Delay, VirtualZ, Pulse] + for i, (channel, pulse) in enumerate(s1): + assert channel == target_channels[i] + assert isinstance(pulse, target_pulse_types[i]) + + # Check aliases + sa1 = deepcopy(s1) + sc1 = deepcopy(s1) + sa1 |= s2 + sc1.juxtapose(s2) + assert sa1 == sc1 assert sc1 == s1 | s2 From 18ec55da5cbcd187d1f8362e567d289cb8b9b508 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 13 Sep 2024 16:52:56 +0200 Subject: [PATCH 0922/1006] fix: Remove deepcopies in sequence building --- src/qibolab/sequence.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/qibolab/sequence.py b/src/qibolab/sequence.py index 4b91c05b17..fcfb05cf3f 100644 --- a/src/qibolab/sequence.py +++ b/src/qibolab/sequence.py @@ -2,7 +2,6 @@ from collections import UserList from collections.abc import Callable, Iterable -from copy import deepcopy from typing import Any, Union from pydantic import TypeAdapter @@ -122,7 +121,7 @@ def __lshift__(self, other: Iterable[_Element]) -> "PulseSequence": Other than that, it is based on :meth:`concatenate`. """ - copy = deepcopy(self) + copy = self.copy() copy <<= other return copy @@ -153,7 +152,7 @@ def __or__(self, other: Iterable[_Element]) -> "PulseSequence": Other than that, it is based on :meth:`concatenate`. """ - copy = deepcopy(self) + copy = self.copy() copy |= other return copy From f5d8a4eea557894cf92432d29c7e6e9d0e2dfd53 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Wed, 4 Sep 2024 00:11:39 +0300 Subject: [PATCH 0923/1006] fix: update getting-started platform in docs --- doc/source/getting-started/experiment.rst | 232 ++++++++++++---------- doc/source/index.rst | 4 +- 2 files changed, 126 insertions(+), 110 deletions(-) diff --git a/doc/source/getting-started/experiment.rst b/doc/source/getting-started/experiment.rst index 0dab6625d3..d5b6960782 100644 --- a/doc/source/getting-started/experiment.rst +++ b/doc/source/getting-started/experiment.rst @@ -13,13 +13,14 @@ To define a platform the user needs to provide a folder with the following struc platform.py parameters.json -where ``platform.py`` contains instruments information, ``parameters.json`` -includes calibration parameters. +where ``platform.py`` contains instruments information and ``parameters.json`` includes calibration parameters. -More information about defining platforms is provided in :doc:`../tutorials/lab` and several examples can be found at `TII dedicated repository `_. +More information about defining platforms is provided in :doc:`../tutorials/lab` and several examples can be found +at the `TII QRC lab dedicated repository `_. For a first experiment, let's define a single qubit platform at the path previously specified. -In this example, the qubit is controlled by a Zurich Instruments' SHFQC instrument, although minimal changes are needed to use other devices. +In this example, the qubit is controlled by a Quantum Machines cluster that contains Octaves, +although minimal changes are needed to use other devices. .. testcode:: python @@ -27,61 +28,66 @@ In this example, the qubit is controlled by a Zurich Instruments' SHFQC instrume import pathlib - from laboneq.simple import DeviceSetup, SHFQC - from qibolab.components import ( - AcquisitionChannel, - IqChannel, - IqConfig, - AcquisitionConfig, - OscillatorConfig, - ) - - from qibolab.instruments.zhinst import ZiChannel, Zurich - from qibolab.parameters import Parameters + from qibolab.components import AcquisitionChannel, Channel, DcChannel, IqChannel + from qibolab.identifier import ChannelId + from qibolab.instruments.qm import Octave, QmConfigs, QmController + from qibolab.instruments.rohde_schwarz import SGS100A + from qibolab.parameters import ConfigKinds from qibolab.platform import Platform - - NAME = "my_platform" # name of the platform - ADDRESS = "localhost" # ip address of the ZI data server - PORT = 8004 # port of the ZI data server + from qibolab.platform.platform import QubitMap + from qibolab.qubits import Qubit # folder containing runcard with calibration parameters FOLDER = pathlib.Path.cwd() + # Register QM-specific configurations for parameters loading + ConfigKinds.extend([QmConfigs]) - def create(): - # Define available instruments - device_setup = DeviceSetup() - device_setup.add_dataserver(host=ADDRESS, port=PORT) - device_setup.add_instruments(SHFQC("device_shfqc", address="DEV12146")) - - # Load and parse the runcard (i.e. parameters.json) - runcard = Parameters.load(FOLDER) - qubits = runcard.native_gates.single_qubit - pairs = runcard.native_gates.pairs - qubit = qubits[0] - - # define component names, and load their configurations - drive, probe, acquire = "q0/drive", "q0/probe", "q0/acquire" - drive_lo, readout_lo = "q0/drive/lo", "q0/readout/lo" - # assign channels to qubits - qubit.drive = IqChannel(name=drive, lo=drive_lo, mixer=None) - qubit.probe = IqChannel(name=probe, lo=readout_lo, mixer=None, acquisition=acquire) - qubit.acquisition = AcquisitionChannel(name=acquire, probe=probe, twpa_pump=None) + def create(): + # Define twpa pump instrument + twpa = SGS100A(name="twpa", address="192.168.0.33") + + # Define qubit + qubits: QubitMap = { + 0: Qubit( + drive="0/drive", + probe="0/probe", + acquisition="0/acquisition", + ) + } - zi_channels = [ - ZiChannel(qubit.drive, device="device_shfqc", path="SGCHANNELS/0/OUTPUT"), - ZiChannel(qubit.probe, device="device_shfqc", path="QACHANNELS/0/OUTPUT"), - ZiChannel(qubit.acquisition, device="device_shfqc", path="QACHANNELS/0/INPUT"), - ] + # Create channels and connect to instrument ports + channels: dict[ChannelId, Channel] = {} + qubit = qubits[0] + # Readout + channels[qubit.probe] = IqChannel( + device="octave1", path="1", mixer=None, lo="0/probe/lo" + ) + # Acquire + channels[qubit.acquisition] = AcquisitionChannel( + device="octave1", path="1", twpa_pump=twpa.name, probe=qubit.probe + ) + # Drive + channels[qubit.drive] = IqChannel( + device="octave1", path="2", mixer=None, lo="0/drive/lo" + ) - controller = Zurich(NAME, device_setup=device_setup, channels=zi_channels) + # Define Quantum Machines instruments + octaves = { + "octave1": Octave("octave5", port=101, connectivity="con1"), + } + controller = QmController( + name="qm", + address="192.168.0.101:80", + octaves=octaves, + channels=channels, + calibration_path=FOLDER, + ) - return Platform( - name=NAME, - runcard=runcard, - instruments={controller: controller}, - resonator_type="3D", + # Define and return platform + return Platform.load( + path=FOLDER, instruments=[controller, twpa], qubits=qubits, resonator_type="3D" ) @@ -103,66 +109,76 @@ And the we can define the runcard ``my_platform/parameters.json``: .. code-block:: json { - "nqubits": 1, - "qubits": [ - 0 - ], - "topology": [], - "settings": { - "nshots": 1024, - "relaxation_time": 70000, - "sampling_rate": 9830400000 - }, - "components": { - "qubit_0/drive": { - "frequency": 4833726197, - "power_range": 5 - }, - "qubit_0/drive/lo": { - "frequency": 5200000000, - "power": null + "settings": { + "nshots": 1024, + "relaxation_time": 70000 }, - "qubit_0/probe": { - "frequency": 7320000000, - "power_range": 1 - }, - "qubit_0/readout/lo": { - "frequency": 7300000000, - "power": null + "configs": { + "0/drive": { + "kind": "iq", + "frequency": 4833726197 + }, + "0/drive/lo": { + "kind": "oscillator", + "frequency": 5200000000, + "power": 0 + }, + "0/probe": { + "kind": "iq", + "frequency": 7320000000 + }, + "0/probe/lo": { + "kind": "oscillator", + "frequency": 7300000000, + "power": 0 + }, + "0/acquisition": { + "kind": "qm-acquisition", + "delay": 224, + "smearing": 0, + "threshold": 0.002100861788865835, + "iq_angle": -0.7669877581038627, + "gain": 10, + "offset": 0.0 + } }, - "qubit_0/acquire": { - "delay": 0, - "smearing": 0, - "power_range": 10 - } - } - "native_gates": { - "single_qubit": { - "0": { - "RX": { - "qubit_0/drive": [ - { - "duration": 40, - "amplitude": 0.5, - "envelope": { "kind": "gaussian", "rel_sigma": 3.0 }, - "type": "qd" - } - ] - }, - "MZ": { - "qubit_0/probe": [ - { - "duration": 2000, - "amplitude": 0.02, - "envelope": { "kind": "rectangular" }, - "type": "ro" - } + "native_gates": { + "single_qubit": { + "0": { + "RX": { + "0/drive": [ + { + "duration": 40, + "amplitude": 0.5, + "envelope": { "kind": "gaussian", "rel_sigma": 3.0 }, + "type": "qd" + } + ] + }, + "MZ": [ + [ + "0/acquisition", + { + "kind": "readout", + "acquisition": { + "kind": "acquisition", + "duration": 2000.0 + }, + "probe": { + "kind": "pulse", + "duration": 2000.0, + "amplitude": 0.003, + "envelope": { + "kind": "rectangular" + } + } + } + ] ] } - } - }, - "two_qubits": {} - } + }, + "two_qubits": {} + } } @@ -184,7 +200,7 @@ for Windows: $env:QIBOLAB_PLATFORMS="" -To avoid having to repeat this export command for every session, this line can be added to the ``.bashrc`` file (or alternatives as ``.zshrc``). +To avoid having to repeat this export command for every session, this line can be added to the ``.bashrc`` file (or alternatives such as ``.zshrc``). Run the experiment @@ -237,8 +253,8 @@ We leave to the dedicated tutorial a full explanation of the experiment, but her _, acq = next(iter(sequence.acquisitions)) # plot the results - signal_i, signal_q = np.moveaxis(results[acq.id], -1, 0) - amplitudes = np.abs(signal_i + 1j * signal_q) + signal = results[acq.id] + amplitudes = signal[..., 0] + 1j * signal[..., 1] frequencies = sweeper.values plt.title("Resonator Spectroscopy") diff --git a/doc/source/index.rst b/doc/source/index.rst index 3c066e34ff..87dee9b293 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -12,9 +12,9 @@ Qibolab is the dedicated `Qibo `_ backend for quantum hardware control. This module automates the implementation of quantum circuits on quantum hardware. Qibolab includes: -#. :ref:`Platform API `: support custom allocation of quantum hardware platforms / lab setup. +#. :ref:`Platform API `: support custom allocation of quantum hardware platforms and lab setup. +#. :ref:`Pulse API `: provide a library of custom pulses for execution through instruments. #. :ref:`Drivers `: supports commercial and open-source firmware for hardware control. -#. :ref:`Arbitrary pulse API `: provide a library of custom pulses for execution through instruments. #. :ref:`Compiler `: compiles quantum circuits into pulse sequences. #. :ref:`Quantum Circuit Deployment `: seamlessly deploys quantum circuit models on quantum hardware. From e96cd738eb28c8c0632cc8f684a306899dd3259b Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Wed, 4 Sep 2024 00:15:50 +0300 Subject: [PATCH 0924/1006] chore: remove outdated figures from docs --- .../getting-started/qibolab_workflow.png | Bin 116690 -> 0 bytes doc/source/index.rst | 6 ------ doc/source/main-documentation/index.rst | 1 - doc/source/main-documentation/platform.svg | 18 ------------------ 4 files changed, 25 deletions(-) delete mode 100644 doc/source/getting-started/qibolab_workflow.png delete mode 100644 doc/source/main-documentation/platform.svg diff --git a/doc/source/getting-started/qibolab_workflow.png b/doc/source/getting-started/qibolab_workflow.png deleted file mode 100644 index 59d30405ae9248fedd05fe54e7b053ea9b9cdea4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 116690 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

ThEOWNzwyMu8UG*E;eKH)H-gdU_x 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 diff --git a/doc/source/index.rst b/doc/source/index.rst index 87dee9b293..f5ed2051b0 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -18,12 +18,6 @@ circuits on quantum hardware. Qibolab includes: #. :ref:`Compiler `: compiles quantum circuits into pulse sequences. #. :ref:`Quantum Circuit Deployment `: seamlessly deploys quantum circuit models on quantum hardware. -Components ----------- - -The main components of Qibolab are presented in :doc:`main-documentation/index` - -.. image:: /main-documentation/platform.svg Key features ------------ diff --git a/doc/source/main-documentation/index.rst b/doc/source/main-documentation/index.rst index 8bab6ae22d..579d2778e9 100644 --- a/doc/source/main-documentation/index.rst +++ b/doc/source/main-documentation/index.rst @@ -7,7 +7,6 @@ complete overview of the code, for that we suggest to refer to the api-reference section, but rather to help a new user to gain a basic understanding of all the elements. -.. image:: platform.svg .. toctree:: :caption: Main elements diff --git a/doc/source/main-documentation/platform.svg b/doc/source/main-documentation/platform.svg deleted file mode 100644 index a63f845ecb..0000000000 --- a/doc/source/main-documentation/platform.svg +++ /dev/null @@ -1,18 +0,0 @@ -
Platform
Qubit
NativeGate
Characterization
QubitPair
NativeGate
Characterization
Instrument
Port
Channel
From 6a3e576a39d47fc3d1ec87f7443c55a1a593cfd4 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Wed, 4 Sep 2024 00:36:49 +0300 Subject: [PATCH 0925/1006] chore: update main-documentation/Platform --- doc/source/main-documentation/qibolab.rst | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index 7aa6056bed..bfd19baf96 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -5,7 +5,8 @@ Platforms Qibolab provides support to different quantum laboratories. -Each lab configuration is implemented using a :class:`qibolab.platform.Platform` object which orchestrates instruments, qubits and channels and provides the basic features for executing pulses. +Each lab configuration is implemented using a :class:`qibolab.platform.Platform` object which orchestrates instruments, +qubits and channels and provides the basic features for executing pulses. Therefore, the ``Platform`` enables the user to interface with all the required lab instruments at the same time with minimum effort. @@ -13,11 +14,12 @@ The API reference section provides a description of all the attributes and metho In the platform, the main methods can be divided in different sections: -- functions save and change qubit parameters (``dump``, ``update``) -- functions to coordinate the instruments (``connect``, ``setup``, ``disconnect``) +- functions to coordinate the instruments (``connect``, ``disconnect``) - a unique interface to execute experiments (``execute``) +- functions save parameters (``dump``) -The idea of the ``Platform`` is to serve as the only object exposed to the user, so that we can deploy experiments, without any need of going into the low-level instrument-specific code. +The idea of the ``Platform`` is to serve as the only object exposed to the user, so that we can deploy experiments, +without any need of going into the low-level instrument-specific code. For example, let's first define a platform (that we consider to be a single qubit platform) using the ``create`` method presented in :doc:`/tutorials/lab`: @@ -50,7 +52,7 @@ We can easily access the names of channels and other components, and based on th print(f"Drive channel {drive_channel_id} does not use an LO.") else: print(f"Name of LO for channel {drive_channel_id} is {drive_lo}") - print(f"LO frequency: {platform.config(str(drive_lo)).frequency}") + print(f"LO frequency: {platform.config(drive_lo).frequency}") .. testoutput:: python :hide: @@ -59,7 +61,8 @@ We can easily access the names of channels and other components, and based on th Drive frequency: 4000000000.0 Drive channel 0/drive does not use an LO. -Now we can create a simple sequence (again, without explicitly giving any qubit specific parameter, as these are loaded automatically from the platform, as defined in the runcard): +Now we can create a simple sequence without explicitly giving any qubit specific parameter, +as these are loaded automatically from the platform, as defined in the corresponding ``parameters.json``: .. testcode:: python @@ -119,14 +122,6 @@ This instrument is also part of the dummy platform which is defined in :py:mod:` This platform is equivalent to real platforms in terms of attributes and functions, but returns just random numbers. It is useful for testing parts of the code that do not necessarily require access to an actual quantum hardware platform. -.. testcode:: python - - from qibolab import create_platform - - platform = create_platform("dummy") - -will create a dummy platform that also has coupler qubits. - .. _main_doc_qubits: From 54dd49fb8b8f8262eff593bd1c252654861c9189 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Wed, 4 Sep 2024 11:54:34 +0300 Subject: [PATCH 0926/1006] fix: drop LO for doctest to pass --- doc/source/getting-started/experiment.rst | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/doc/source/getting-started/experiment.rst b/doc/source/getting-started/experiment.rst index d5b6960782..1d202aac51 100644 --- a/doc/source/getting-started/experiment.rst +++ b/doc/source/getting-started/experiment.rst @@ -31,7 +31,6 @@ although minimal changes are needed to use other devices. from qibolab.components import AcquisitionChannel, Channel, DcChannel, IqChannel from qibolab.identifier import ChannelId from qibolab.instruments.qm import Octave, QmConfigs, QmController - from qibolab.instruments.rohde_schwarz import SGS100A from qibolab.parameters import ConfigKinds from qibolab.platform import Platform from qibolab.platform.platform import QubitMap @@ -45,9 +44,6 @@ although minimal changes are needed to use other devices. def create(): - # Define twpa pump instrument - twpa = SGS100A(name="twpa", address="192.168.0.33") - # Define qubit qubits: QubitMap = { 0: Qubit( @@ -66,7 +62,7 @@ although minimal changes are needed to use other devices. ) # Acquire channels[qubit.acquisition] = AcquisitionChannel( - device="octave1", path="1", twpa_pump=twpa.name, probe=qubit.probe + device="octave1", path="1", probe=qubit.probe ) # Drive channels[qubit.drive] = IqChannel( @@ -87,7 +83,7 @@ although minimal changes are needed to use other devices. # Define and return platform return Platform.load( - path=FOLDER, instruments=[controller, twpa], qubits=qubits, resonator_type="3D" + path=FOLDER, instruments=[controller], qubits=qubits, resonator_type="3D" ) From 57d69191bddd8824bb4237832910be5abd8b18e1 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Wed, 4 Sep 2024 13:50:02 +0300 Subject: [PATCH 0927/1006] chore: update main-documentation qubits and channels --- doc/source/main-documentation/qibolab.rst | 86 ++++++++++------------- 1 file changed, 36 insertions(+), 50 deletions(-) diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index bfd19baf96..6fef69276c 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -123,75 +123,61 @@ This platform is equivalent to real platforms in terms of attributes and functio It is useful for testing parts of the code that do not necessarily require access to an actual quantum hardware platform. -.. _main_doc_qubits: - -Qubits ------- - -The :class:`qibolab.qubits.Qubit` class serves as a comprehensive representation of a physical qubit within the Qibolab framework. -It encapsulates three fundamental elements crucial to qubit control and operation: - -- :ref:`Channels `: Physical Connections -- :class:`Parameters `: Configurable Properties -- :ref:`Native Gates `: Quantum Operations - -Channels play a pivotal role in connecting the quantum system to the control infrastructure. -They are optional and encompass distinct types, each serving a specific purpose: - -- measure (from controller device to the qubits) -- acquisition (from qubits to controller) -- drive -- flux - -The Qubit class allows you to set and manage several key parameters that influence qubit behavior. -These parameters are typically extracted from the runcard during platform initialization. - -.. _main_doc_couplers: - -Couplers --------- - -Instead of using a dedicated class, a :class:`qibolab.qubits.Qubit` object can also -serve as a comprehensive representation of a physical coupler qubit within the Qibolab -framework. -Used like this, it would control couplers during 2q gate operation: - -- :ref:`Channels `: Physical Connection -- :class:`Parameters `: Configurable Properties -- :ref:`Qubits `: Qubits the coupler acts on - -We have a single required Channel for flux coupler control: - -- flux - -These instances allow us to handle 2q interactions in coupler based architectures -in a simple way. They are usually associated with :class:`qibolab.qubits.QubitPair` -and usually extracted from the runcard during platform initialization. - .. _main_doc_channels: Channels -------- +Channels play a pivotal role in connecting the quantum system to the control infrastructure. Various types of channels are typically present in a quantum laboratory setup, including: +- the probe line (from device to qubit) +- the acquire line (from qubit to device) - the drive line -- the readout line (from device to qubit) -- the feedback line (from qubit to device) - the flux line - the TWPA pump line +Qibolab provides a general :class:`qibolab.components.channels.Channel` object, as well as specializations depending on the channel role. A channel is typically associated with a specific port on a control instrument, with port-specific properties like "attenuation" and "gain" that can be managed using provided getter and setter methods. +Channels are uniquely identified within the platform through their id. The idea of channels is to streamline the pulse execution process. -When initiating a pulse, the platform identifies the corresponding channel for the pulse type and directs it to the appropriate port on the control instrument. -For instance, to deliver a drive pulse to a qubit, the platform references the qubit's associated channel and delivers the pulse to the designated port. +The :class:`qibolab.sequence.PulseSequence` is a list of ``(channel_id, pulse)`` tuples, so that the platform identifies the channel that every pulse plays +and directs it to the appropriate port on the control instrument. In setups involving frequency-specific pulses, a local oscillator (LO) might be required for up-conversion. Although logically distinct from the qubit, the LO's frequency must align with the pulse requirements. -Qibolab accommodates this by enabling the assignment of a :class:`qibolab.instruments.oscillator.LocalOscillator` object to the relevant channel. +Qibolab accommodates this by enabling the assignment of a :class:`qibolab.instruments.oscillator.LocalOscillator` object +to the relevant channel :class:`qibolab.components.channels.IqChannel`. The controller's driver ensures the correct pulse frequency is set based on the LO's configuration. +Each channel has a :class:`qibolab.components.configs.Config` associated to it, which is a container of parameters related to the channel. +Configs also have different specializations that correspond to different channel types. +The platform holds default config parameters for all its channels, however the user is able to alter them by passing a config updates dictionary +when calling :meth:`qibolab.platform.Platform.execute`. +The final configs are then sent to the controller instrument, which matches them to channels via their ids and ensures they are uploaded to the proper electronics. + + +.. _main_doc_qubits: + +Qubits +------ + +The :class:`qibolab.qubits.Qubit` class serves as a container for the channels that are used to control the corresponding physical qubit. +These channels encompass distinct types, each serving a specific purpose: + +- probe (measurement probe from controller device to the qubits) +- acquisition (measurement acquisition from qubits to controller) +- drive +- flux +- drive_qudits (additional drive channels at different frequencies used to probe higher-level transition) + +Some channel types are optional because not all hardware platforms require them. +For example, flux channels are typically relevant only for flux tunable qubits. + +The :class:`qibolab.qubits.Qubit` class can also be used to represent coupler qubits, when these are available. + + .. _main_doc_pulses: Pulses From e1608878a40acec73a347f70cb0e22110031195b Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Wed, 4 Sep 2024 14:05:17 +0300 Subject: [PATCH 0928/1006] chore: update main-documentation pulses --- doc/source/main-documentation/qibolab.rst | 56 ++++++++--------------- 1 file changed, 19 insertions(+), 37 deletions(-) diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index 6fef69276c..ddc5066625 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -184,54 +184,42 @@ Pulses ------ In Qibolab, an extensive API is available for working with pulses and pulse sequences, a fundamental aspect of quantum experiments. -At the heart of this API is the :class:`qibolab.pulses.Pulse` object, which empowers users to define and customize pulses with specific parameters. +At the heart of this API is the :class:`qibolab.pulses.pulse.Pulse` object, which empowers users to define and customize pulses with specific parameters. -Each pulse is associated with a channel and a qubit. -Additionally, pulses are defined by a shape, represented by a subclass of :class:`qibolab.pulses.PulseShape`. -Qibolab offers a range of pre-defined pulse shapes: +Additionally, pulses are defined by an envelope shape, represented by a subclass of :class:`qibolab.pulses.envelope.BaseEnvelope`. +Qibolab offers a range of pre-defined pulse shapes which can be found in :py:mod:`qibolab.pulses.envelope`. -- Rectangular (:class:`qibolab.pulses.Rectangular`) -- Exponential (:class:`qibolab.pulses.Exponential`) -- Gaussian (:class:`qibolab.pulses.Gaussian`) -- Drag (:class:`qibolab.pulses.Drag`) -- IIR (:class:`qibolab.pulses.IIR`) -- SNZ (:class:`qibolab.pulses.SNZ`) -- eCap (:class:`qibolab.pulses.eCap`) -- Custom (:class:`qibolab.pulses.Custom`) +- Rectangular (:class:`qibolab.pulses.envelope.Rectangular`) +- Exponential (:class:`qibolab.pulses.envelope.Exponential`) +- Gaussian (:class:`qibolab.pulses.envelope.Gaussian`) +- Drag (:class:`qibolab.pulses.envelope.Drag`) +- IIR (:class:`qibolab.pulses.envelope.Iir`) +- SNZ (:class:`qibolab.pulses.envelope.Snz`) +- eCap (:class:`qibolab.pulses.envelope.ECap`) +- Custom (:class:`qibolab.pulses.envelope.Custom`) -To illustrate, here are some examples of single pulses using the Qibolab API: +To illustrate, here is an examples of how to instantiate a pulse using the Qibolab API: .. testcode:: python from qibolab.pulses import Pulse, Rectangular pulse = Pulse( - duration=40, # Pulse duration in ns - amplitude=0.5, # Amplitude relative to instrument range - relative_phase=0, # Phase in radians + duration=40.0, # Pulse duration in ns + amplitude=0.5, # Amplitude normalized to [-1, 1] + relative_phase=0.0, # Phase in radians envelope=Rectangular(), ) -In this way, we defined a rectangular drive pulse using the generic Pulse object. -Alternatively, you can achieve the same result using the dedicated :class:`qibolab.pulses.Pulse` object: - -.. testcode:: python - - from qibolab.pulses import Pulse, Rectangular - - pulse = Pulse( - duration=40, # timing, in all qibolab, is expressed in ns - amplitude=0.5, # this amplitude is relative to the range of the instrument - relative_phase=0, # phases are in radians - envelope=Rectangular(), - ) +Here, we defined a rectangular drive pulse using the generic Pulse object. Both the Pulses objects and the PulseShape object have useful plot functions and several different various helper methods. -To organize pulses into sequences, Qibolab provides the :class:`qibolab.pulses.PulseSequence` object. Here's an example of how you can create and manipulate a pulse sequence: +To organize pulses into sequences, Qibolab provides the :class:`qibolab.sequence.PulseSequence` object. Here's an example of how you can create and manipulate a pulse sequence: .. testcode:: python + from qibolab.pulses import Pulse, Rectangular from qibolab.sequence import PulseSequence @@ -259,7 +247,7 @@ To organize pulses into sequences, Qibolab provides the :class:`qibolab.pulses.P relative_phase=0, # phases are in radians envelope=Rectangular(), ) - sequence = PulseSequence.load( + sequence = PulseSequence( [ ("qubit/drive", pulse1), ("qubit/drive", pulse2), @@ -296,12 +284,6 @@ Typical experiments may include both pre-defined pulses and new ones: natives = platform.natives.single_qubit[0] sequence = PulseSequence() sequence.concatenate(natives.RX.create_sequence()) - sequence.append( - ( - "some/drive", - Pulse(duration=10, amplitude=0.5, relative_phase=0, envelope=Rectangular()), - ) - ) sequence.concatenate(natives.MZ.create_sequence()) results = platform.execute([sequence], options=options) From f8be31210f54e22b99bbf0a09659532695cc0fab Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Wed, 4 Sep 2024 14:08:36 +0300 Subject: [PATCH 0929/1006] refactor: make options optional in Platform.execute --- doc/source/main-documentation/qibolab.rst | 4 ++-- src/qibolab/platform/platform.py | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index ddc5066625..9a46cb2446 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -269,7 +269,7 @@ When conducting experiments on quantum hardware, pulse sequences are vital. Assu .. testcode:: python - result = platform.execute([sequence], options=options) + result = platform.execute([sequence]) Lastly, when conducting an experiment, it is not always required to define a pulse from scratch. Usual pulses, such as pi-pulses or measurements, are already defined in the platform runcard and can be easily initialized with platform methods. @@ -286,7 +286,7 @@ Typical experiments may include both pre-defined pulses and new ones: sequence.concatenate(natives.RX.create_sequence()) sequence.concatenate(natives.MZ.create_sequence()) - results = platform.execute([sequence], options=options) + results = platform.execute([sequence]) .. note:: diff --git a/src/qibolab/platform/platform.py b/src/qibolab/platform/platform.py index 9e470696c4..9e2e90fcc7 100644 --- a/src/qibolab/platform/platform.py +++ b/src/qibolab/platform/platform.py @@ -225,7 +225,7 @@ def _execute( def execute( self, sequences: list[PulseSequence], - options: ExecutionParameters, + options: Optional[ExecutionParameters] = None, sweepers: Optional[list[ParallelSweepers]] = None, ) -> dict[PulseId, Result]: """Execute pulse sequences. @@ -266,6 +266,8 @@ def execute( "The acquisitions' identifiers have to be unique across all sequences." ) + if options is None: + options = ExecutionParameters() options = self.settings.fill(options) time = estimate_duration(sequences, options, sweepers) From 21e118667c2222260fbbbc7f189daf2e93fe9558 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Wed, 4 Sep 2024 21:56:23 +0300 Subject: [PATCH 0930/1006] chore: update main-documentation sweepers --- doc/source/main-documentation/qibolab.rst | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index 9a46cb2446..f08e89d1cc 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -288,10 +288,6 @@ Typical experiments may include both pre-defined pulses and new ones: results = platform.execute([sequence]) -.. note:: - - options is an :class:`qibolab.execution_parameters.ExecutionParameters` object, detailed in a separate section. - Sweepers -------- @@ -301,7 +297,7 @@ Sweeper objects, represented by the :class:`qibolab.sweeper.Sweeper` class, stan Consider a scenario where a resonator spectroscopy experiment is performed. This process involves a sequence of steps: 1. Define a pulse sequence. -2. Define a readout pulse with frequency A. +2. Define a readout pulse with frequency :math:`A`. 3. Execute the sequence. 4. Define a new readout pulse with frequency :math:`A + \epsilon`. 5. Execute the sequence again. @@ -339,7 +335,7 @@ The ``values`` attribute comprises an array of numerical values that define the Let's see some examples. Consider now a system with three qubits (qubit 0, qubit 1, qubit 2) with resonator frequency at 4 GHz, 5 GHz and 6 GHz. -A tipical resonator spectroscopy experiment could be defined with: +A typical resonator spectroscopy experiment could be defined with: .. testcode:: python @@ -381,7 +377,7 @@ In this way, we first define three parallel sweepers with an interval of 400 MHz - for qubit 1: [4.8 GHz, 5.2 GHz] - for qubit 2: [5.8 GHz, 6.2 GHz] -It is possible to define and executes multiple sweepers at the same time. +It is possible to define and executes multiple sweepers at the same time, in a nested loop style. For example: .. testcode:: python @@ -392,20 +388,21 @@ For example: qubit = platform.qubits[0] natives = platform.natives.single_qubit[0] sequence = PulseSequence() - sequence.concatenate(natives.RX.create_sequence()) - sequence.append((qubit.probe, Delay(duration=sequence.duration))) + rx_sequence = natives.RX.create_sequence() + sequence.concatenate(rx_sequence) sequence.concatenate(natives.MZ.create_sequence()) - f0 = platform.config(str(qubit.drive)).frequency + f0 = platform.config(qubit.drive).frequency sweeper_freq = Sweeper( parameter=Parameter.frequency, range=(f0 - 100_000, f0 + 100_000, 10_000), channels=[qubit.drive], ) + rx_pulse = rx_sequence[0][1] sweeper_amp = Sweeper( parameter=Parameter.amplitude, range=(0, 0.43, 0.3), - pulses=[next(iter(sequence.channel(qubit.drive)))], + pulses=[rx_pulse], ) results = platform.execute([sequence], options, [[sweeper_freq], [sweeper_amp]]) @@ -415,6 +412,9 @@ Let's say that the RX pulse has, from the runcard, a frequency of 4.5 GHz and an - amplitudes: [0, 0.03, 0.06, 0.09, 0.12, ..., 0.39, 0.42] - frequencies: [4.4999, 4.49991, 4.49992, ...., 4.50008, 4.50009] (GHz) +Sweepers given in the same list will be applied in parallel, in a Python ``zip`` style, +while different lists define nested loops, with the first list corresponding to the outer loop. + .. warning:: Different control devices may have different limitations on the sweepers. From 1df27b13fae29ade3da564a568d5ac42b70a7693 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Wed, 4 Sep 2024 22:17:57 +0300 Subject: [PATCH 0931/1006] chore: update main-documentation results --- doc/source/main-documentation/qibolab.rst | 45 ++++++++--------------- 1 file changed, 15 insertions(+), 30 deletions(-) diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index f08e89d1cc..d63b51c742 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -462,26 +462,11 @@ Supported averaging modes, available through the :class:`qibolab.execution_param Results ------- -Within the Qibolab API, a variety of result types are available, contingent upon the chosen acquisition options. These results can be broadly classified into three main categories, based on the AcquisitionType: +``platform.execute`` returns a dictionary, mapping the acquisition pulse id to the results of the corresponding measurements. +The results of each measurement are a numpy array with dimension that depends on the number of shots, acquisition type, +averaging mode and the number of swept points, if sweepers were used. -- Integrated Results (:class:`qibolab.result.IntegratedResults`) -- Raw Waveform Results (:class:`qibolab.result.RawWaveformResults`) -- Sampled Results (:class:`qibolab.result.SampleResults`) - -Furthermore, depending on whether results are averaged or not, they can be presented in an averaged version (as seen in :class:`qibolab.results.AveragedIntegratedResults`). - -The result categories align as follows: - -- AveragingMode: cyclic or sequential -> - - AcquisitionType: integration -> :class:`qibolab.results.AveragedIntegratedResults` - - AcquisitionType: raw -> :class:`qibolab.results.AveragedRawWaveformResults` - - AcquisitionType: discrimination -> :class:`qibolab.results.AveragedSampleResults` -- AveragingMode: singleshot -> - - AcquisitionType: integration -> :class:`qibolab.results.IntegratedResults` - - AcquisitionType: raw -> :class:`qibolab.results.RawWaveformResults` - - AcquisitionType: discrimination -> :class:`qibolab.results.SampleResults` - -Let's now delve into a typical use case for result objects within the qibolab framework: +For example in .. testcode:: python @@ -490,8 +475,8 @@ Let's now delve into a typical use case for result objects within the qibolab fr sequence = PulseSequence() sequence.concatenate(natives.RX.create_sequence()) - sequence.append((qubit.probe, Delay(duration=sequence.duration))) - sequence.concatenate(natives.MZ.create_sequence()) + ro_sequence = natives.MZ.create_sequence() + sequence.concatenate(ro_sequence) options = ExecutionParameters( nshots=1000, @@ -501,20 +486,20 @@ Let's now delve into a typical use case for result objects within the qibolab fr averaging_mode=AveragingMode.CYCLIC, ) - res = platform.execute([sequence], options=options) - -The ``res`` object will manifest as a dictionary, mapping the measurement pulse serial to its corresponding results. + ro_pulse = ro_sequence[0][1] + result = platform.execute([sequence], options=options) -The values related to the results will be find in the ``voltages`` attribute for IntegratedResults and RawWaveformResults, while for SampleResults the values are in ``samples``. -While for execution of sequences the results represent single measurements, but what happens for sweepers? -the results will be upgraded: from values to arrays and from arrays to matrices. +``result`` will be a dictionary with a single key ``ro_pulse.id`` and an array of +two elements, the averaged I and Q components of the integrated signal. +If instead, ``(AcquisitionType.INTEGRATION, AveragingMode.SINGLESHOT)`` was used, the array would have shape ``(options.nshots, 2)``, +while for ``(AcquisitionType.DISCRIMINATION, AveragingMode.SINGLESHOT)`` the shape would be ``(options.nshots,)`` with values 0 or 1. -The shape of the values of an integreted acquisition with 2 sweepers will be: +The shape of the values of an integrated acquisition with two sweepers will be: .. testcode:: python - f0 = platform.config(str(qubit.drive)).frequency + f0 = platform.config(qubit.drive).frequency sweeper1 = Sweeper( parameter=Parameter.frequency, range=(f0 - 100_000, f0 + 100_000, 1), @@ -525,7 +510,7 @@ The shape of the values of an integreted acquisition with 2 sweepers will be: range=(f0 - 200_000, f0 + 200_000, 1), channels=[qubit.probe], ) - shape = (options.nshots, len(sweeper1.values), len(sweeper2.values)) + shape = (options.nshots, len(sweeper1.values), len(sweeper2.values), 2) .. _main_doc_compiler: From 1cda53dcaf491870483093503c5405506047b3b6 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 5 Sep 2024 18:32:15 +0300 Subject: [PATCH 0932/1006] chore: upupdate main-documentation instruments --- doc/source/main-documentation/qibolab.rst | 36 ++++++++++------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index d63b51c742..7ca2ba57bf 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -528,13 +528,13 @@ The transpiler is responsible for steps 1 and 2, while the compiler for step 3 o To be executed in Qibolab, a circuit should be already transpiled. It possible to use the transpilers provided by Qibo to do it. For more information, please refer the `examples in the Qibo documentation `_. On the other hand, the compilation process is taken care of automatically by the :class:`qibolab.backends.QibolabBackend`. -Once a circuit has been compiled, it is converted to a :class:`qibolab.pulses.PulseSequence` by the :class:`qibolab.compilers.compiler.Compiler`. +Once a circuit has been compiled, it is converted to a :class:`qibolab.sequence.PulseSequence` by the :class:`qibolab.compilers.compiler.Compiler`. This is a container of rules which define how each native gate can be translated to pulses. A rule is a Python function that accepts a Qibo gate and a platform object and returns the :class:`qibolab.pulses.PulseSequence` implementing this gate and a dictionary with potential virtual-Z phases that need to be applied in later pulses. Examples of rules can be found on :py:mod:`qibolab.compilers.default`, which defines the default rules used by Qibolab. .. note:: - Rules return a :class:`qibolab.pulses.PulseSequence` for each gate, instead of a single pulse, because some gates such as the U3 or two-qubit gates, require more than one pulses to be implemented. + Rules return a :class:`qibolab.sequence.PulseSequence` for each gate, instead of a single pulse, because some gates such as the U3 or two-qubit gates, require more than one pulses to be implemented. .. _main_doc_native: @@ -542,16 +542,17 @@ Native ------ Each quantum platform supports a specific set of native gates, which are the quantum operations that have been calibrated. -If this set is universal any circuit can be transpiled and compiled to a pulse sequence which is then deployed in the given platform. +If this set is universal any circuit can be transpiled and compiled to a pulse sequence which can then be deployed in the given platform. :py:mod:`qibolab.native` provides data containers for holding the pulse parameters required for implementing every native gate. -Every :class:`qibolab.qubits.Qubit` object contains a :class:`qibolab.native.SingleQubitNatives` object which holds the parameters of its native single-qubit gates, -while each :class:`qibolab.qubits.QubitPair` objects contains a :class:`qibolab.native.TwoQubitNatives` object which holds the parameters of the native two-qubit gates acting on the pair. +The :class:`qibolab.platform.Platform` provides a natives property that returns the :class:`qibolab.native.SingleQubitNatives` +which holds the single qubit native gates for every qubit and :class:`qibolab.native.TwoQubitNatives` for the two-qubit native gates of every qubit pair. +Each native gate is represented by a :class:`qibolab.sequence.PulseSequence` which contains all the calibrated parameters. -Each native gate is represented by a :class:`qibolab.pulses.Pulse` or :class:`qibolab.pulses.PulseSequence` which contain all the calibrated parameters. -Typical single-qubit native gates are the Pauli-X gate, implemented via a pi-pulse which is calibrated using Rabi oscillations and the measurement gate, implemented via a pulse sent in the readout line followed by an acquisition. -For a universal set of single-qubit gates, the RX90 (pi/2-pulse) gate is required, which is implemented by halving the amplitude of the calibrated pi-pulse. -U3, the most general single-qubit gate can be implemented using two RX90 pi-pulses and some virtual Z-phases which are included in the phase of later pulses. +Typical single-qubit native gates are the Pauli-X gate, implemented via a pi-pulse which is calibrated using Rabi oscillations and the measurement gate, +implemented via a pulse sent in the readout line followed by an acquisition. +For a universal set of single-qubit gates, the RX90 (pi/2-pulse) gate is required, +which is implemented by halving the amplitude of the calibrated pi-pulse. Typical two-qubit native gates are the CZ and iSWAP, with their availability being platform dependent. These are implemented with a sequence of flux pulses, potentially to multiple qubits, and virtual Z-phases. @@ -562,8 +563,8 @@ Depending on the platform and the quantum chip architecture, two-qubit gates may Instruments ----------- -One the key features of qibolab is its support for multiple different instruments. -A list of all the supported instruments follows: +One the key features of Qibolab is its support for multiple different electronics. +A list of all the supported electronics follows: Controllers (subclasses of :class:`qibolab.instruments.abstract.Controller`): - Dummy Instrument: :class:`qibolab.instruments.dummy.DummyInstrument` @@ -574,18 +575,13 @@ Other Instruments (subclasses of :class:`qibolab.instruments.abstract.Instrument - Erasynth++: :class:`qibolab.instruments.erasynth.ERA` - RohseSchwarz SGS100A: :class:`qibolab.instruments.rohde_schwarz.SGS100A` -Instruments all implement a set of methods: - -- connect -- setup -- disconnect - -While the controllers, the main instruments in a typical setup, add another, i.e. -execute. +All instruments inherit the :class:`qibolab.instruments.abstract.Instrument` and implement methods for connecting and disconnecting. +:class:`qibolab.instruments.abstract.Controller` is a special case of instruments that provides the :class:`qibolab.instruments.abstract.execute` +method that deploys sequences on hardware. Some more detail on the interal functionalities of instruments is given in :doc:`/tutorials/instrument` -The most important instruments are the controller, the following is a table of the current supported (or not supported) features, dev stands for `under development`: +The following is a table of the currently supported or not supported features (dev stands for `under development`): .. csv-table:: Supported features :header: "Feature", "RFSoC", "Qblox", "QM", "ZH" From 3023f052fbdc1dbfa20fc3dace0f1e949634acd3 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 6 Sep 2024 20:27:52 +0300 Subject: [PATCH 0933/1006] chore: update tutorials for calibration, circuits and instruments --- doc/source/tutorials/calibration.rst | 68 ++++++------ doc/source/tutorials/circuits.rst | 10 +- doc/source/tutorials/instrument.rst | 150 ++++++++++----------------- 3 files changed, 93 insertions(+), 135 deletions(-) diff --git a/doc/source/tutorials/calibration.rst b/doc/source/tutorials/calibration.rst index db32b9d4ed..50c68b2aa0 100644 --- a/doc/source/tutorials/calibration.rst +++ b/doc/source/tutorials/calibration.rst @@ -7,8 +7,7 @@ characterize a qubit. .. note:: This is just for demonstration purposes! In the `Qibo `_ framework these experiments are already coded and available in the `Qibocal API `_. -Let's consider a platform called `single_qubit` with, as expected, a single -qubit. +Let's consider a platform called `single_qubit` with, as expected, a single qubit. Resonator spectroscopy ---------------------- @@ -43,7 +42,7 @@ around the pre-defined frequency. qubit = platform.qubits[0] natives = platform.natives.single_qubit[0] - sequence = natives.MZ.create_sequence() + sequence = natives.MZ() # allocate frequency sweeper f0 = platform.config(qubit.probe).frequency @@ -73,8 +72,8 @@ In few seconds, the experiment will be finished and we can proceed to plot it. import matplotlib.pyplot as plt acq = sequence.acquisitions[0][1] - signal_i, signal_q = np.moveaxis(results[acq.id], -1, 0) - amplitudes = np.abs(signal_i + 1j * signal_q) + signal = results[acq.id] + amplitudes = np.abs(signal[..., 0] + 1j * signal[..., 1]) frequencies = sweeper.values plt.title("Resonator Spectroscopy") @@ -99,11 +98,11 @@ typical qubit spectroscopy experiment is as follows: the qubit parameters are not known, this is typically a very long pulse (2 microseconds) at low amplitude. 2. A measurement, tuned with resonator spectroscopy, is performed. -3. We repeat point 1 for different frequencies. +3. We repeat point 1 for different frequencies of the drive pulse. 4. We plot the acquired amplitudes, identifying the deep/peak value as the qubit frequency. -So, mainly, the difference that this experiment introduces is a slightly more +The main difference introduced by this experiment is a slightly more complex pulse sequence. Therefore with start with that: .. testcode:: python @@ -119,7 +118,6 @@ complex pulse sequence. Therefore with start with that: AveragingMode, AcquisitionType, ) - from qibolab.serialize import replace # allocate platform platform = create_platform("dummy") @@ -128,19 +126,12 @@ complex pulse sequence. Therefore with start with that: natives = platform.natives.single_qubit[0] # create pulse sequence and add pulses - sequence = PulseSequence( - [ - ( - qubit.drive, - Pulse(duration=2000, amplitude=0.01, envelope=Gaussian(rel_sigma=5)), - ), - (qubit.probe, Delay(duration=sequence.duration)), - ] - ) - sequence.concatenate(natives.MZ.create_sequence()) + sequence = PulseSequence() + sequence |= natives.RX() + sequence |= natives.MZ() # allocate frequency sweeper - f0 = platform.config(qubit.probe).frequency + f0 = platform.config(qubit.drive).frequency sweeper = Sweeper( parameter=Parameter.frequency, range=(f0 - 2e8, f0 + 2e8, 1e6), @@ -163,12 +154,12 @@ We can now proceed to launch on hardware: results = platform.execute([sequence], options, [[sweeper]]) - _, acq = next(iter(sequence.acquisitions)) - signal_i, signal_q = np.moveaxis(results[acq.id], -1, 0) - amplitudes = np.abs(signal_i + 1j * signal_q) + acq = sequence.acquisitions[0][1] + signal = results[acq.id] + amplitudes = np.abs(signal[..., 0] + 1j * signal[..., 1]) frequencies = sweeper.values - plt.title("Resonator Spectroscopy") + plt.title("Qubit Spectroscopy") plt.xlabel("Frequencies [Hz]") plt.ylabel("Amplitudes [a.u.]") @@ -231,14 +222,13 @@ and its impact on qubit states in the IQ plane. qubit = platform.qubits[0] natives = platform.natives.single_qubit[0] - # create pulse sequence 1 and add pulses - one_sequence = PulseSequence() - one_sequence.concatenate(natives.RX.create_sequence()) - one_sequence.append((qubit.probe, Delay(duration=one_sequence.duration))) - one_sequence.concatenate(natives.MZ.create_sequence()) + # create pulse sequence 1 + zero_sequence = natives.MZ() - # create pulse sequence 2 and add pulses - zero_sequence = natives.MZ.create_sequence() + # create pulse sequence 2 + one_sequence = PulseSequence() + one_sequence |= natives.RX() + one_sequence |= natives.MZ() options = ExecutionParameters( nshots=1000, @@ -247,22 +237,22 @@ and its impact on qubit states in the IQ plane. acquisition_type=AcquisitionType.INTEGRATION, ) - results_one = platform.execute([one_sequence], options) - results_zero = platform.execute([zero_sequence], options) + results = platform.execute([zero_sequence, one_sequence], options) - _, acq1 = next(iter(one_sequence.acquisitions)) - _, acq0 = next(iter(zero_sequence.acquisitions)) + acq0 = zero_sequence.acquisitions[0][1] + acq1 = one_sequence.acquisitions[0][1] plt.title("Single shot classification") plt.xlabel("I [a.u.]") plt.ylabel("Q [a.u.]") plt.scatter( - results_one[acq1.id], - results_one[acq1.id], + results[acq1.id][..., 0], + results[acq1.id][..., 1], label="One state", ) plt.scatter( - *tuple(np.moveaxis(results_zero[acq0.id], -1, 0)), + results[acq0.id][..., 0], + results[acq0.id][..., 1], label="Zero state", ) plt.show() @@ -271,3 +261,7 @@ and its impact on qubit states in the IQ plane. :class: only-light .. image:: classification_dark.svg :class: only-dark + +Note that in this experiment we passed both sequences in the same ``platform.execute`` command. +In this case the sequences will be unrolled to a single sequence automatically, which is +then deployed with a single communication with the instruments, to reduce communication bottleneck. diff --git a/doc/source/tutorials/circuits.rst b/doc/source/tutorials/circuits.rst index 7982e86965..b30e9186f9 100644 --- a/doc/source/tutorials/circuits.rst +++ b/doc/source/tutorials/circuits.rst @@ -40,8 +40,8 @@ circuits definition that we leave to the `Qibo simulation = simulation_result.probabilities(qubits=(0,)) -In this snippet, we first define a single-qubit circuit containing a single Hadamard gate and a measurement. -We then proceed to define the qibo backend as ``qibolab`` using the ``tii1q_b1`` platform. +In this snippet, we first define a single-qubit circuit containing a single GPI2 gate and a measurement. +We then proceed to define the qibo backend as ``qibolab`` using the ``dummy`` platform. Finally, we change the backend to ``numpy``, a simulation one, to compare the results with ideality. After executing the script we can print our results that will appear more or less as: @@ -92,7 +92,7 @@ results: circuit.set_parameters([angle]) # execute circuit - result = circuit.execute(nshots=4000) + result = circuit(nshots=4000) freq = result.frequencies() p0 = freq['0'] / 4000 if '0' in freq else 0 p1 = freq['1'] / 4000 if '1' in freq else 0 @@ -129,8 +129,8 @@ Returns the following plot: :class: only-dark .. note:: - Executing circuits using the Qibolab backend results to automatic application of the compilation pipeline (:ref:`main_doc_compiler`) which convert the circuit to a pulse sequence that is executed by the given platform. - It is possible to modify these pipelines following the instructions in the :ref:`tutorials_compiler` example. + Executing circuits using the Qibolab backend results to automatic application of the compilation pipeline (:ref:`main_doc_compiler`) + which converts the circuit to a pulse sequence that is executed by the given platform. QASM Execution -------------- diff --git a/doc/source/tutorials/instrument.rst b/doc/source/tutorials/instrument.rst index 8a1c36a67f..1b5698285d 100644 --- a/doc/source/tutorials/instrument.rst +++ b/doc/source/tutorials/instrument.rst @@ -1,13 +1,12 @@ How to add a new instrument in Qibolab? ======================================= -Currently, Qibolab support various instruments: -as **controller**: +Currently, Qibolab supports various **controller** instruments: * Quantum Machines * Zurich instruments -and as **local oscillators**: +and the following **local oscillators**: * Rhode&Schwartz * Erasynth++ @@ -15,21 +14,21 @@ and as **local oscillators**: If you need to add a new driver, to support a new instruments in your setup, we encourage you to have a look at ``qibolab.instruments`` for complete examples. In this section, anyway, a basic example will be given. -For clarity, we divide the instruments in two different groups: the **controllers** and the standard **instruments**, where the controller is an instrument that can execute pulse sequences. +For clarity, we divide the instruments in two different groups: the **controllers** and the standard **instruments**, +where the controller is an instrument that can execute pulse sequences. For example, a local oscillator is just an instrument, while Quantum Machines is a controller. Add an instrument ----------------- -The base of an instrument is :class:`qibolab.instruments.abstract.Instrument`. +The base of an instrument is :class:`qibolab.instruments.abstract.Instrument`, +which is a pydantic ``Model``. To accomodate different kind of instruments, a flexible interface is implemented -with four abstract methods that are required to be implemented in the child +with three abstract methods that are required to be implemented in the child instrument: * ``connect()`` * ``setup()`` -* ``start()`` -* ``stop()`` * ``disconnect()`` In the execution of an experiment these functions are called sequentially, so @@ -38,137 +37,102 @@ parameters, the instrument starts operating, then stops and gets disconnected. Note that it's perfectly fine to leave the majority of these functions empty if not needed. -Moreover, it's important call the ``super.__init__(self, name, address)`` since -it initialize the folders eventually required to store temporary files. - -A good example of a instrument driver is the -:class:`qibolab.instruments.rohde_schwarz.SGS100A` driver. - Here, let's write a basic example of instrument whose job is to deliver a fixed bias for the duration of the experiment: .. code-block:: python - from qibolab.instruments.abstract import Instrument + from typing import Optional - # let's suppose that there is already avaiable a base driver for connection - # and control of the device - from proprietary_instruments import biaser_driver + # let's suppose that there is already available a base driver for connection + # and control of the device, provided by the following library + from proprietary_instruments import BiaserType, biaser_driver + + from qibolab.instruments.abstract import Instrument class Biaser(Instrument): """An instrument that delivers constand biases.""" + name: str + address: str + min_value: float = -1.0 + max_value: float = 1.0 + bias: float = 0.0 + device: Optional[BiaserType] = None - def __init__(self, name, address, min_value=-1, max_value=1): - super().__init__(name, address) - self.max_value: float = ( - max_value # attribute example, maximum value of voltage allowed - ) - self.min_value: float = ( - min_value # attribute example, minimum value of voltage allowed - ) - self.bias: float = 0 - - self.device = biaser_driver(address) def connect(self): """Check if a connection is avaiable.""" - if not self.device.is_connected: - raise ConnectionError("Biaser not connected") + if self.device is None: + self.device = biaser_driver(self.address) + self.device.on(self.bias) def disconnect(self): - """Method not used.""" + self.device.off(self.bias) + self.device.disconnect() def setup(self): """Set biaser parameters.""" self.device.set_range(self.min_value, self.max_value) - def start(self): - """Start biasing.""" - self.device.on(bias) - - def stop(self): - """Stop biasing.""" - self.device.off(bias) - Add a controller ---------------- -The controller is an instrument that has some additional methods, its abstract -implementation can be found in :class:`qibolab.instruments.abstract.Controller`. - -The additional methods required are: - -* ``play()`` -* ``play_sequences()`` -* ``sweep()`` +The controller is an instrument that has the additional method ``play``, +which allows it to execute arbitrary pulse sequences and perform sweeps. +Its abstract implementation can be found in :class:`qibolab.instruments.abstract.Controller`. Let's see a minimal example: .. code-block:: python + from typing import Optional + + from proprietary_instruments import ControllerType, controller_driver + + from qibolab.components import Config + from qibolab.execution_parameters import ExecutionParameters + from qibolab.identifier import Result + from qibolab.sequence import PulseSequence + from qibolab.sweeper import ParallelSweepers from qibolab.instruments.abstract import Controller - from proprietary_instruments import controller_driver class MyController(Controller): - def __init__(self, name, address): - self.device = controller_driver(address) - super().__init__(name, address) def connect(self): - """Empty method to comply with Instrument interface.""" - - def start(self): - """Empty method to comply with Instrument interface.""" - - def stop(self): - """Empty method to comply with Instrument interface.""" + if self.device is None: + self.device = controller_driver(address) def disconnect(self): - """Empty method to comply with Instrument interface.""" + self.device.disconnect() def setup(self): """Empty method to comply with Instrument interface.""" def play( - self, - qubits: dict[int, Qubit], - sequence: PulseSequence, - execution_parameters: ExecutionParameters, - ) -> dict[str, Union[IntegratedResults, SampleResults]]: + self, + configs: dict[str, Config], + sequences: list[PulseSequence], + options: ExecutionParameters, + sweepers: list[ParallelSweepers], + ) -> dict[int, Result]: """Executes a PulseSequence.""" + if len(sweepers) > 0: + raise NotImplementedError("MyController does not support sweeps.") - # usually, some modification on the qubit objects, sequences or - # parameters is needed so that the qibolab interface comply with the one - # of the device here these are equal - results = self.device.run_experiment(qubits, sequence, execution_parameters) + if len(sequences) == 0: + return {} + elif len(sequences) == 1: + sequence = sequences[0] + else: + sequence, _ = unroll_sequences(sequences, options.relaxation_time) - # also the results are, in qibolab, specific objects that need some kind - # of conversion. Refer to the results section in the documentation. - return results - - def sweep( - self, - qubits: dict[int, Qubit], - sequence: PulseSequence, - execution_parameters: ExecutionParameters, - *sweepers: Sweeper, - ) -> dict[str, Union[IntegratedResults, SampleResults]]: - # usually, some modification on the qubit objects, sequences or - # parameters is needed so that the qibolab interface comply with the one - # of the device here these are equal - results = self.device.run_scan(qubits, sequence, sweepers, execution_parameters) + # usually, some modification on the sequence, channel configs, or + # parameters is needed so that the qibolab interface comply with the + # interface of the device. Here these are assumed to be equal for simplicity. + results = self.device.run_experiment(qubits, sequence, options) # also the results are, in qibolab, specific objects that need some kind # of conversion. Refer to the results section in the documentation. return results - - def play_sequences( - self, - qubits: dict[int, Qubit], - sequences: List[PulseSequence], - execution_parameters: ExecutionParameters, - ) -> dict[str, Union[IntegratedResults, SampleResults]]: - """This method is used for sequence unrolling sweeps. Here not implemented.""" - raise NotImplementedError From ed7e661e98914e5ab5aca487b6b1a5f70bdf178d Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Sat, 7 Sep 2024 20:56:03 +0300 Subject: [PATCH 0934/1006] chore: update tutorials/pulses --- doc/source/tutorials/pulses.rst | 36 ++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/doc/source/tutorials/pulses.rst b/doc/source/tutorials/pulses.rst index 0c330d2a83..d0140ede3e 100644 --- a/doc/source/tutorials/pulses.rst +++ b/doc/source/tutorials/pulses.rst @@ -1,10 +1,9 @@ Pulses execution ================ -First, we create the pulse sequence that will be executed. We can do this by -defining a :class:`qibolab.pulses.PulseSequence` object and adding different -pulses (:class:`qibolab.pulses.Pulse`) through the -:func:`qibolab.pulses.PulseSequence.append()` method: +We can create pulse sequence using the Qibolab pulse API directly, +defining a :class:`qibolab.sequence.PulseSequence` object and adding different +pulses (:class:`qibolab.pulses.Pulse`) using the :func:`qibolab.pulses.PulseSequence.append()` method: .. testcode:: python @@ -41,10 +40,8 @@ the platform that will be used. The ``Platform`` constructor also takes care of loading the runcard containing all the calibration settings for that specific platform. -After connecting and setting up the platform's instruments using the -``connect()`` and ``setup()`` methods, the ``start`` method will turn on the -local oscillators and the ``execute`` method will execute the previous defined -pulse sequence according to the number of shots ``nshots`` specified. +After connecting to the platform's instruments using the ``connect()``, +we can execute the previously defined sequence using the ``execute`` method: .. testcode:: python @@ -64,5 +61,24 @@ pulse sequence according to the number of shots ``nshots`` specified. # Disconnect from the instruments platform.disconnect() -Remember to turn off the instruments and disconnect from the lab using the -``stop()`` and ``disconnect()`` methods of the platform. +Remember to turn off and disconnect from the instruments using the +``disconnect()`` methods of the platform. + +.. note:: + Calling ``platform.connect()`` automatically turns on auxilliary instruments such as local oscillators. + +Alternatively, instead of using the pulse API directly, one can use the native gate data structures to write a pulse sequence: + +.. testcode:: python + + import numpy as np + + from qibolab.pulses import Pulse, Rectangular, Gaussian, Delay + from qibolab.sequence import PulseSequence + from qibolab import create_platform + + platform = create_platform("dummy") + q0 = platform.natives.single_qubit[0] + sequence = PulseSequence() + sequence |= q0.RX(theta=np.pi / 2) + sequence |= q0.MZ() From 70ee85df36978fc44c042a41b461598ca04a4f03 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Sat, 7 Sep 2024 22:19:50 +0300 Subject: [PATCH 0935/1006] chore: update tutorials/lab --- doc/source/getting-started/experiment.rst | 2 +- doc/source/tutorials/lab.rst | 517 ++++++++++++++-------- doc/source/tutorials/pulses.rst | 2 +- src/qibolab/instruments/dummy.py | 4 + src/qibolab/parameters.py | 4 +- 5 files changed, 332 insertions(+), 197 deletions(-) diff --git a/doc/source/getting-started/experiment.rst b/doc/source/getting-started/experiment.rst index 1d202aac51..b5c027619e 100644 --- a/doc/source/getting-started/experiment.rst +++ b/doc/source/getting-started/experiment.rst @@ -173,7 +173,7 @@ And the we can define the runcard ``my_platform/parameters.json``: ] } }, - "two_qubits": {} + "two_qubit": {} } } diff --git a/doc/source/tutorials/lab.rst b/doc/source/tutorials/lab.rst index 958ec77b17..e7d840ec97 100644 --- a/doc/source/tutorials/lab.rst +++ b/doc/source/tutorials/lab.rst @@ -4,9 +4,9 @@ How to connect Qibolab to your lab? In this section we will show how to let Qibolab communicate with your lab's instruments and run an experiment. -The main required object, in this case, is the `Platform`. A Platform is defined -as a QPU (quantum processing unit with one or more qubits) controlled by one ore -more instruments. +The main required object, in this case, is the :class:`qibolab.platform.Platform`. +A Platform is defined as a QPU (quantum processing unit with one or more qubits) +controlled by one ore more instruments. How to define a platform for a self-hosted QPU? ----------------------------------------------- @@ -22,34 +22,55 @@ using different Qibolab primitives. .. testcode:: python from qibolab import Platform +<<<<<<< HEAD from qibolab.components import IqChannel, AcquisitionChannel, IqConfig +======= + from qibolab.sequence import PulseSequence + from qibolab.components import IqChannel, AcquireChannel, IqConfig, AcquisitionConfig +>>>>>>> 7f9bc26e (chore: update tutorials/lab) from qibolab.qubits import Qubit - from qibolab.pulses import Gaussian, Pulse, Rectangular + from qibolab.pulses import Gaussian, Pulse, Rectangular, Readout, Acquisition from qibolab.native import RxyFactory, FixedSequenceFactory, SingleQubitNatives from qibolab.parameters import NativeGates, Parameters from qibolab.instruments.dummy import DummyInstrument def create(): - # Create a controller instrument - instrument = DummyInstrument("my_instrument", "0.0.0.0:0") - - # create the qubit object - qubit = Qubit(name=0) + # Create the qubit objects + qubits = { + 0: Qubit( + drive="0/drive", + probe="0/probe", + acquisition="0/acquisition", + ) + } - # assign channels to the qubit - qubit.probe = IqChannel( - name="0/probe", mixer=None, lo=None, acquisition="0/acquisition" + # Create channels and connect to instrument ports + channels = {} + qubit = qubits[0] + channels[qubit.probe] = IqChannel( + device="controller", + path="0", + mixer=None, + lo=None, ) +<<<<<<< HEAD qubit.acquisition = AcquisitionChannel( name="0/acquisition", twpa_pump=None, probe="probe" +======= + channels[qubit.acquisition] = AcquireChannel( + device="controller", path="0", twpa_pump=None, probe="probe" + ) + channels[qubit.drive] = IqChannel( + device="controller", path="0", mixer=None, lo=None +>>>>>>> 7f9bc26e (chore: update tutorials/lab) ) - qubit.drive = Iqchannel(name="0/drive", mixer=None, lo=None) # define configuration for channels configs = {} configs[qubit.drive] = IqConfig(frequency=3e9) configs[qubit.probe] = IqConfig(frequency=7e9) + configs[qubit.acquisition] = AcquisitionConfig(delay=200.0, smearing=0.0) # create sequence that drives qubit from state 0 to 1 drive_seq = PulseSequence( @@ -62,11 +83,14 @@ using different Qibolab primitives. ) # create sequence that can be used for measuring the qubit - probe_seq = PulseSequence( + measurement_seq = PulseSequence( [ ( - qubit.probe, - Pulse(duration=1000, amplitude=0.005, envelope=Rectangular()), + qubit.acquisition, + Readout( + acquisition=Acquisition(duration=1000), + probe=Pulse(duration=1000, amplitude=0.005, envelope=Rectangular()), + ), ) ] ) @@ -74,17 +98,23 @@ using different Qibolab primitives. # assign native gates to the qubit native_gates = SingleQubitNatives( RX=RxyFactory(drive_seq), - MZ=FixedSequenceFactory(probe_seq), + MZ=FixedSequenceFactory(measurement_seq), ) # create a parameters instance parameters = Parameters( - native_gates=NativeGates(single_qubit=native_gates), configs=configs + configs=configs, + native_gates=NativeGates(single_qubit={0: native_gates}), ) - # create dictionaries of the different objects - qubits = {qubit.name: qubit} - instruments = {instrument.name: instrument} + # Create a controller instrument + instruments = { + "my_instrument": DummyInstrument( + name="my_instrument", + address="0.0.0.0:0", + channels=channels, + ) + } # allocate and return Platform object return Platform("my_platform", parameters, instruments, qubits) @@ -99,7 +129,6 @@ interface. Furthermore, above we defined three channels that connect the qubit to the control instrument and we assigned two native gates to the qubit. -These can be passed when defining the :class:`qibolab.qubits.Qubit` objects. When the QPU contains more than one qubit, some of the qubits are connected so that two-qubit gates can be applied. These are called in a single dictionary, within @@ -109,8 +138,8 @@ the native gates, but separately from the single-qubit ones. from qibolab.components import IqChannel, AcquisitionChannel, DcChannel, IqConfig from qibolab.qubits import Qubit - from qibolab.parameters import Parameters, TwoQubitContainer - from qibolab.pulses import Gaussian, Pulse, Rectangular + from qibolab.parameters import NativeGates, Parameters, TwoQubitContainer + from qibolab.pulses import Acquisition, Gaussian, Pulse, Readout, Rectangular from qibolab.sequence import PulseSequence from qibolab.native import ( RxyFactory, @@ -119,15 +148,25 @@ the native gates, but separately from the single-qubit ones. TwoQubitNatives, ) - # create the qubit objects - qubit0 = Qubit( - drive="0/drive", flux="0/flux", probe="0/probe", acquisition="0/acquisition" - ) - qubit1 = Qubit( - drive="1/drive", flux="1/flux", probe="1/probe", acquisition="1/acquisition" - ) + # Create the qubit objects + qubits = { + 0: Qubit( + drive="0/drive", + flux="0/flux", + probe="0/probe", + acquisition="0/acquisition", + ), + 1: Qubit( + drive="1/drive", + flux="1/flux", + probe="1/probe", + acquisition="1/acquisition", + ), + } + # Create channels and connect to instrument ports channels = {} +<<<<<<< HEAD # assign channels to the qubits channels[qubit0.probe] = IqChannel(mixer=None, lo=None) @@ -165,48 +204,109 @@ the native gates, but separately from the single-qubit ones. ] ) ), +======= + channels[qubits[0].probe] = IqChannel( + device="controller", + path="0", + mixer=None, + lo=None, +>>>>>>> 7f9bc26e (chore: update tutorials/lab) ) - single_qubit["1"] = SingleQubitNatives( - RX=RxyFactory( - PulseSequence( - [ - ( - qubit1.drive, - Pulse( - duration=40, amplitude=0.05, envelope=Gaussian(rel_sigma=0.2) - ), - ) - ] + channels[qubits[0].acquisition] = AcquireChannel( + device="controller", path="0", twpa_pump=None, probe="probe" + ) + channels[qubits[0].drive] = IqChannel( + device="controller", path="1", mixer=None, lo=None + ) + channels[qubits[0].flux] = DcChannel(device="controller", path="2") + + channels[qubits[1].probe] = IqChannel( + device="controller", + path="3", + mixer=None, + lo=None, + ) + channels[qubits[1].acquisition] = AcquireChannel( + device="controller", path="3", twpa_pump=None, probe="probe" + ) + channels[qubits[1].drive] = IqChannel( + device="controller", path="4", mixer=None, lo=None + ) + channels[qubits[1].flux] = DcChannel(device="controller", path="5") + + # define configuration for channels + configs = {} + configs[qubits[0].drive] = IqConfig(frequency=3e9) + configs[qubits[0].probe] = IqConfig(frequency=7e9) + configs[qubits[0].acquisition] = AcquisitionConfig(delay=200.0, smearing=0.0) + + # create native gates + rx0 = PulseSequence( + [ + ( + qubits[0].drive, + Pulse(duration=40, amplitude=0.05, envelope=Gaussian(rel_sigma=0.2)), ) - ), - MZ=FixedSequenceFactory( - PulseSequence( - [ - ( - qubit1.probe, - Pulse(duration=1000, amplitude=0.005, envelope=Rectangular()), - ) - ] + ] + ) + mz0 = PulseSequence( + [ + ( + qubits[0].acquisition, + Readout( + acquisition=Acquisition(duration=1000), + probe=Pulse(duration=1000, amplitude=0.005, envelope=Rectangular()), + ), ) + ] + ) + rx1 = PulseSequence( + [ + ( + qubits[1].drive, + Pulse(duration=40, amplitude=0.05, envelope=Gaussian(rel_sigma=0.2)), + ) + ] + ) + mz1 = PulseSequence( + [ + ( + qubits[1].acquisition, + Readout( + acquisition=Acquisition(duration=1000), + probe=Pulse(duration=1000, amplitude=0.005, envelope=Rectangular()), + ), + ) + ] + ) + cz01 = PulseSequence( + [ + ( + qubits[0].flux, + Pulse(duration=30, amplitude=0.005, envelope=Rectangular()), + ), + ] + ) + native_gates = NativeGates( + single_qubit={ + 0: SingleQubitNatives( + RX=RxyFactory(rx0), + MZ=FixedSequenceFactory(mz0), + ), + 1: SingleQubitNatives( + RX=RxyFactory(rx1), + MZ=FixedSequenceFactory(mz1), + ), + }, + two_qubit=TwoQubitContainer( + {"0-1": TwoQubitNatives(CZ=FixedSequenceFactory(cz01))} ), ) - # define the pair of qubits - two_qubit = TwoQubitContainer( - { - "0-1": TwoQubitNatives( - CZ=FixedSequenceFactory( - PulseSequence( - [ - ( - qubit0.flux, - Pulse(duration=30, amplitude=0.005, envelope=Rectangular()), - ), - ] - ) - ) - ) - } + # create a parameters instance + parameters = Parameters( + configs=configs, + native_gates=native_gates, ) Some architectures may also have coupler qubits that mediate the interactions. @@ -231,7 +331,7 @@ will take them into account when calling :class:`qibolab.native.TwoQubitNatives` channels = {} # assign channel(s) to the coupler - channels[coupler_01.flux] = DcChannel() + channels[coupler_01.flux] = DcChannel(device="controller", path="5") # assign single-qubit native gates to each qubit # Look above example @@ -254,8 +354,13 @@ will take them into account when calling :class:`qibolab.native.TwoQubitNatives` } ) -The platform automatically creates the connectivity graph of the given chip, -using the keys of :class:`qibolab.parameters.TwoQubitContainer` map. +Couplers also need to be passed in a different dictionary than the qubits, +when instantiating the :class:`qibolab.platform.platform.Platform` + +.. note:: + + The platform automatically creates the connectivity graph of the given chip, using the keys of :class:`qibolab.parameters.TwoQubitContainer` map. + Registering platforms ^^^^^^^^^^^^^^^^^^^^^ @@ -268,7 +373,6 @@ platform available as from qibolab import create_platform - # Define platform and load specific runcard platform = create_platform("my_platform") @@ -279,10 +383,10 @@ that contains this folder. Examples of advanced platforms are available at `this repository `_. -.. _using_runcards: +.. _parameters_json: -Using runcards -^^^^^^^^^^^^^^ +Loading platform parameters from JSON +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Operating a QPU requires calibrating a set of parameters, the number of which increases with the number of qubits. Hardcoding such parameters in the @@ -292,40 +396,53 @@ from an external file or database. Qibolab provides some utility functions, accessible through :py:mod:`qibolab.parameters`, for loading calibration parameters stored in a JSON -file with a specific format. We call such file a runcard. Here is a runcard for -a two-qubit system: +file with a specific format. Here is an example .. code-block:: json { "settings": { "nshots": 1024, - "sampling_rate": 1000000000, "relaxation_time": 50000 }, - "components": { + "configs": { "0/drive": { + "kind": "iq", "frequency": 4855663000 }, "1/drive": { + "kind": "iq", "frequency": 5800563000 }, "0/flux": { + "kind": "dc", + "offset": 0.0 + }, + "1/flux": { + "kind": "dc", "offset": 0.0 }, "0/probe": { + "kind": "iq", "frequency": 7453265000 }, "1/probe": { + "kind": "iq", "frequency": 7655107000 }, "0/acquisition": { + "kind": "acquisition", "delay": 0, "smearing": 0 }, "1/acquisition": { + "kind": "acquisition", "delay": 0, "smearing": 0 + }, + "01/coupler": { + "kind": "dc", + "offset": 0.12 } }, "native_gates": { @@ -333,8 +450,9 @@ a two-qubit system: "0": { "RX": [ [ - "drive_0", + "0/drive", { + "kind": "pulse", "duration": 40, "amplitude": 0.0484, "envelope": { @@ -346,23 +464,32 @@ a two-qubit system: ] ], "MZ": [ - [ - "probe_0", - { - "duration": 620, - "amplitude": 0.003575, - "envelope": { - "kind": "rectangular" + [ + "0/acquisition", + { + "kind": "readout", + "acquisition": { + "kind": "acquisition", + "duration": 620.0 + }, + "probe": { + "kind": "pulse", + "duration": 620.0, + "amplitude": 0.003575, + "envelope": { + "kind": "rectangular" + } + } } - } ] ] }, "1": { "RX": [ [ - "drive_1", + "1/drive", { + "kind": "pulse", "duration": 40, "amplitude": 0.05682, "envelope": { @@ -375,13 +502,21 @@ a two-qubit system: ], "MZ": [ [ - "probe_1", + "1/acquisition", { - "duration": 960, - "amplitude": 0.00325, - "envelope": { - "kind": "rectangular" - } + "kind": "readout", + "acquisition": { + "kind": "acquisition", + "duration": 960.0 + }, + "probe": { + "kind": "pulse", + "duration": 960.0, + "amplitude": 0.00325, + "envelope": { + "kind": "rectangular" + } + } } ] ] @@ -391,113 +526,65 @@ a two-qubit system: "0-1": { "CZ": [ [ - "flux_1", - { - "duration": 30, - "amplitude": 0.055, - "envelope": { - "kind": "rectangular" - } - } - ], - [ - "drive_0", - { - "type": "virtual_z", - "phase": -1.5707963267948966 - } - ], - [ - "drive_1", - { - "type": "virtual_z", - "phase": -1.5707963267948966 - } - ] - ] - } - } - } - } - -And in the case of having a chip with coupler qubits -we need the following changes to the previous runcard: - -.. code-block:: json - - { - "components": { - "flux_coupler_01": { - "offset": 0.12 - } - }, - "native_gates": { - "two_qubit": { - "0-1": { - "CZZ": [ - [ - "flux_coupler_01", + "01/coupler", { + "kind": "pulse", "duration": 40, "amplitude": 0.1, "envelope": { "kind": "rectangular" - }, - "coupler": 0 + } } ], [ - "flux_0", + "0/flux", { + "kind": "pulse", "duration": 30, "amplitude": 0.6025, "envelope": { "kind": "rectangular" - }, + } } ], [ - "drive_0", + "0/drive", { - "phase": -1, - "qubit": 0 + "kind": "virtualz", + "phase": -1 } ], [ - "drive_1", + "1/drive", { - "phase": -3, - "qubit": 1 + "kind": "virtualz", + "phase": -3 } ] - ], - "CZ": [] + ] } } } } -This file contains different sections: ``components`` defines the configuration of channel +This file contains different sections: ``configs`` defines the default configuration of channel parameters, while ``native_gates`` specifies the calibrated pulse parameters for implementing single and two-qubit gates. -Note that such parameters may slightly differ depending on the QPU architecture, -however the pulses under ``native_gates`` should comply with the -:class:`qibolab.pulses.Pulse` API. +Note that such parameters may slightly differ depending on the QPU architecture. -Providing the above runcard is not sufficient to instantiate a +Providing the above JSON is not sufficient to instantiate a :class:`qibolab.platform.Platform`. This should still be done using a -``create()`` method, however this is significantly simplified by -``qibolab.parameters``. The ``create()`` method should be put in a +``create()`` method. The ``create()`` method should be put in a file named ``platform.py`` inside the ``my_platform`` directory. -Here is the ``create()`` method that loads the parameters of -the above runcard: +Here is the ``create()`` method that loads the parameters from the JSON: .. testcode:: python # my_platform / platform.py from pathlib import Path - from qibolab import Platform + from qibolab.platform import Platform + from qibolab.qubits import Qubit from qibolab.components import ( AcquisitionChannel, DcChannel, @@ -508,6 +595,7 @@ the above runcard: ) from qibolab.instruments.dummy import DummyInstrument +<<<<<<< HEAD FOLDER = Path.cwd() # assumes runcard is storred in the same folder as platform.py @@ -540,19 +628,17 @@ With the following additions for coupler architectures: .. testcode:: python # my_platform / platform.py +======= +>>>>>>> 7f9bc26e (chore: update tutorials/lab) FOLDER = Path.cwd() def create(): - # Create a controller instrument - instrument = DummyInstrument("my_instrument", "0.0.0.0:0") - qubits = {} - # define channels and load component configs for q in range(2): - probe_name, acquire_name = f"qubit_{q}/probe", f"qubit_{q}/acquisition" qubits[q] = Qubit( +<<<<<<< HEAD name=q, drive=IqChannel(f"qubit_{q}/drive", mixer=None, lo=None), flux=DcChannel(f"qubit_{q}/flux"), @@ -560,51 +646,72 @@ With the following additions for coupler architectures: acquisition=AcquisitionChannel( acquire_name, twpa_pump=None, probe=probe_name ), +======= + drive=f"{q}/drive", + flux=f"{q}/flux", + probe=f"{q}/probe", + acquisition=f"{q}/acquisition", +>>>>>>> 7f9bc26e (chore: update tutorials/lab) ) - couplers = {0: Qubit(name=0, flux=DcChannel("coupler_0/flux"))} + couplers = {0: Qubit(flux="01/coupler")} + + channels = {} + for q in range(2): + channels[qubits[q].drive] = IqChannel( + device="my_instrument", path="1", mixer=None, lo=None + ) + channels[qubits[q].flux] = DcChannel(device="my_instrument", path="2") + channels[qubits[q].probe] = IqChannel( + device="my_instrument", path="0", mixer=None, lo=None + ) + channels[qubits[q].acquisition] = AcquireChannel( + device="my_instrument", path="0", twpa_pump=None, probe=qubits[q].probe + ) + + channels[couplers[0].flux] = DcChannel(device="my_instrument", path="5") + + instruments = { + "my_instrument": DummyInstrument( + name="my_instrument", address="0.0.0.0:0", channels=channels + ) + } - # create dictionary of instruments - instruments = {instrument.name: instrument} return Platform.load(FOLDER, instruments, qubits, couplers=couplers) -Note that this assumes that the runcard is saved as ``/parameters.json`` where ```` +Note that this assumes that the JSON with parameters is saved as ``/parameters.json`` where ```` is the directory containing ``platform.py``. Instrument settings ^^^^^^^^^^^^^^^^^^^ -The runcard of the previous example contains only parameters associated to the qubits -and their respective native gates. In some cases parameters associated to instruments -need to also be calibrated. An example is the frequency and the power of local oscillators, +The parameters of the previous example contains only parameters associated to the channel configuration +and the native gates. In some cases parameters associated to instruments also need to be calibrated. +An example is the frequency and the power of local oscillators, such as the one used to pump a traveling wave parametric amplifier (TWPA). -The runcard can contain an ``instruments`` section that provides these parameters +The parameters JSON can contain such parameters in the ``configs`` section: .. code-block:: json { "settings": { "nshots": 1024, - "sampling_rate": 1000000000, "relaxation_time": 50000 }, "configs": { "twpa_pump": { + "kind": "oscillator", "frequency": 4600000000, "power": 5 } }, - "native_gates": { - "single_qubit": {}, - "two_qubit": {} - } } -These settings are loaded when creating the platform using :meth:`qibolab.parameters.load_instrument_settings`. -Note that the key used in the runcard should be the same with the name used when instantiating the instrument, +Note that the key used in the JSON should be the same with the instrument name used +in the instrument dictionary when instantiating the :class:`qibolab.platform.platform.Platform`, in this case ``"twpa_pump"``. .. testcode:: python @@ -612,7 +719,8 @@ in this case ``"twpa_pump"``. # my_platform / platform.py from pathlib import Path - from qibolab import Platform + from qibolab.platform import Platform + from qibolab.qubits import Qubit from qibolab.components import ( AcquisitionChannel, DcChannel, @@ -621,22 +729,17 @@ in this case ``"twpa_pump"``. DcConfig, IqConfig, ) - from qibolab.parameters import Parameters from qibolab.instruments.dummy import DummyInstrument + FOLDER = Path.cwd() - # assumes runcard is storred in the same folder as platform.py def create(): - # Create a controller instrument - instrument = DummyInstrument("my_instrument", "0.0.0.0:0") - - # define channels and load component configs qubits = {} for q in range(2): - probe_name, acquire_name = f"qubit_{q}/probe", f"qubit_{q}/acquisition" qubits[q] = Qubit( +<<<<<<< HEAD name=q, drive=IqChannel(f"qubit_{q}/drive", mixer=None, lo=None), flux=DcChannel(f"qubit_{q}/flux"), @@ -644,8 +747,36 @@ in this case ``"twpa_pump"``. acquisition=AcquisitionChannel( acquire_name, twpa_pump=None, probe=probe_name ), +======= + drive=f"{q}/drive", + flux=f"{q}/flux", + probe=f"{q}/probe", + acquisition=f"{q}/acquisition", +>>>>>>> 7f9bc26e (chore: update tutorials/lab) ) - # create dictionary of instruments - instruments = {instrument.name: instrument} - return Platform.load(FOLDER, instruments, qubits) + couplers = {0: Qubit(flux="01/coupler")} + + channels = {} + for q in range(2): + channels[qubits[q].drive] = IqChannel( + device="my_instrument", path="1", mixer=None, lo=None + ) + channels[qubits[q].flux] = DcChannel(device="my_instrument", path="2") + channels[qubits[q].probe] = IqChannel( + device="my_instrument", path="0", mixer=None, lo=None + ) + channels[qubits[q].acquisition] = AcquireChannel( + device="my_instrument", path="0", twpa_pump=None, probe=qubits[q].probe + ) + + channels[couplers[0].flux] = DcChannel(device="my_instrument", path="5") + + instruments = { + "my_instrument": DummyInstrument( + name="my_instrument", address="0.0.0.0:0", channels=channels + ), + "twpa_pump": DummyLocalOscillator(name="twpa_pump", address="0.0.0.1:0"), + } + + return Platform.load(FOLDER, instruments, qubits, couplers=couplers) diff --git a/doc/source/tutorials/pulses.rst b/doc/source/tutorials/pulses.rst index d0140ede3e..2971b34bdd 100644 --- a/doc/source/tutorials/pulses.rst +++ b/doc/source/tutorials/pulses.rst @@ -65,7 +65,7 @@ Remember to turn off and disconnect from the instruments using the ``disconnect()`` methods of the platform. .. note:: - Calling ``platform.connect()`` automatically turns on auxilliary instruments such as local oscillators. + Calling ``platform.connect()`` automatically turns on auxilliary instruments such as local oscillators. Alternatively, instead of using the pulse API directly, one can use the native gate data structures to write a pulse sequence: diff --git a/src/qibolab/instruments/dummy.py b/src/qibolab/instruments/dummy.py index 2052d84159..105777d742 100644 --- a/src/qibolab/instruments/dummy.py +++ b/src/qibolab/instruments/dummy.py @@ -1,7 +1,10 @@ import numpy as np +from pydantic import Field from qibo.config import log from qibolab import AcquisitionType, AveragingMode, ExecutionParameters +from qibolab.components.channels import Channel +from qibolab.identifier import ChannelId from qibolab.pulses.pulse import Acquisition from qibolab.sequence import PulseSequence from qibolab.sweeper import ParallelSweepers @@ -63,6 +66,7 @@ class DummyInstrument(Controller): address: str bounds: str = "dummy/bounds" + channels: dict[ChannelId, Channel] = Field(default_factory=dict) @property def sampling_rate(self) -> int: diff --git a/src/qibolab/parameters.py b/src/qibolab/parameters.py index 4a0af08489..c268f9e5ff 100644 --- a/src/qibolab/parameters.py +++ b/src/qibolab/parameters.py @@ -1,7 +1,7 @@ """Helper methods for (de)serializing parameters. -The format is explained in the :ref:`Using parameters ` -example. +The format is explained in the :ref:`Loading platform parameters from +JSON ` example. """ from collections.abc import Callable, Iterable From 033caf4ee4ac6d34bafb281d3d824bf85b989221 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Sun, 8 Sep 2024 12:17:56 +0400 Subject: [PATCH 0936/1006] chore: update tutorials/compiler --- doc/source/tutorials/compiler.rst | 64 +++++++++---------------------- 1 file changed, 19 insertions(+), 45 deletions(-) diff --git a/doc/source/tutorials/compiler.rst b/doc/source/tutorials/compiler.rst index 1396188c06..1ebb3fd87f 100644 --- a/doc/source/tutorials/compiler.rst +++ b/doc/source/tutorials/compiler.rst @@ -9,7 +9,14 @@ When a Qibo circuit is executed, the backend will automatically compile it to a The default compiler outlined in the :ref:`main_doc_compiler` section will be used in this process. In this tutorial we will demonstrate how the user can modify this process for custom applications. -The ``compiler`` object used when executing a circuit are attributes of :class:`qibolab.backends.QibolabBackend`. +.. note:: + The compiler is only responsible for converting circuits to pulse sequences. + These circuits should already contain only native gates and respect the chip connectiviy. + If the circuit does not respect these constraints, it should be converted to an equivalent + circuit that respects them using a Qibo transpiler. + + +The ``compiler`` object used when executing a circuit is an attribute of :class:`qibolab.backends.QibolabBackend`. Creating an instance of the backend provides access to these objects: .. testcode:: python @@ -25,46 +32,16 @@ Creating an instance of the backend provides access to these objects: -The transpiler is responsible for transforming any circuit to one that respects -the chip connectivity and native gates. The compiler then transforms this circuit -to the equivalent pulse sequence. Note that there is no transpiler in Qibolab, therefore -the backend can only execute circuits that contain native gates by default. -The user can modify the compilation process by changing the ``compiler`` attributes of -the ``QibolabBackend``. -In this example, we executed circuits using the backend ``backend.execute_circuit`` method, -unlike the previous example (:ref:`tutorials_circuits`) where circuits were executed directly using ``circuit(nshots=1000)``. -It is possible to perform compiler manipulation in both approaches. -When using ``circuit(nshots=1000)``, Qibo is automatically initializing a ``GlobalBackend()`` singleton that is used to execute the circuit. -Therefore the previous manipulations can be done as follows: +The default compiler provides rules for the following single-qubit gates: +``Z``, ``RZ``, ``I``, ``GPI``, ``GPI2``, ``M`` +and the following two-qubit gates: ``CZ``, ``CNOT`` subject to platform availability. +The user can modify the compilation process by defining custom compilation rules and registering +them to the ``compiler`` attribute of the ``QibolabBackend``. +The default rules defined in :py:mod:`qibolab.compilers.default` can serve as an example. -.. testcode:: python - - import qibo - from qibo import gates - from qibo.models import Circuit - from qibo.backends import GlobalBackend - - # define circuit - circuit = Circuit(1) - circuit.add(gates.GPI2(0, 0.1)) - circuit.add(gates.M(0)) - - # set backend to qibolab - qibo.set_backend("qibolab", platform="dummy") - - # execute circuit - result = circuit(nshots=1000) - - -Defining custom compiler rules -============================== - -The compiler can be modified by adding new compilation rules or changing existing ones. -As explained in :ref:`main_doc_compiler` section, a rule is a function that accepts a Qibo gate and a Qibolab platform -and returns the pulse sequence implementing this gate. - -The following example shows how to modify the compiler in order to execute a circuit containing a Pauli X gate using a single pi-pulse: +The following example shows how to modify the compiler in order to execute a circuit containing an ``X`` gate +directly using a single pi-pulse, instead of converting it to ``GPI2``: .. testcode:: python @@ -80,12 +57,10 @@ The following example shows how to modify the compiler in order to execute a cir # define a compiler rule that translates X to the pi-pulse - def x_rule(gate, qubit): + def x_rule(gate, natives): """X gate applied with a single pi-pulse.""" - return qubit.RX.create_sequence() - + return natives.ensure("RX").create_sequence() - # the empty dictionary is needed because the X gate does not require any virtual Z-phases backend = QibolabBackend(platform="dummy") # register the new X rule in the compiler @@ -94,8 +69,7 @@ The following example shows how to modify the compiler in order to execute a cir # execute the circuit result = backend.execute_circuit(circuit, nshots=1000) -The default set of compiler rules is defined in :py:mod:`qibolab.compilers.default`. .. note:: If the compiler receives a circuit that contains a gate for which it has no rule, an error will be raised. - This means that the native gate set that the transpiler uses, should be compatible with the available compiler rules. + This means that the native gate set that the Qibo transpiler uses, should be compatible with the available compiler rules. From 71ecfeeca3ee398d28cec046b94da8a3f545c2eb Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Sun, 8 Sep 2024 12:38:09 +0400 Subject: [PATCH 0937/1006] fix: doctest --- doc/source/tutorials/calibration.rst | 44 ++++++++++++---------------- doc/source/tutorials/pulses.rst | 5 ++-- 2 files changed, 21 insertions(+), 28 deletions(-) diff --git a/doc/source/tutorials/calibration.rst b/doc/source/tutorials/calibration.rst index 50c68b2aa0..586d5c4404 100644 --- a/doc/source/tutorials/calibration.rst +++ b/doc/source/tutorials/calibration.rst @@ -21,13 +21,16 @@ as follows: 3. We plot the acquired amplitudes, identifying the peak/deep value as the resonator frequency. -We start by initializing the platform, that reads the information written in the -respective runcard, a sequence composed of only a measurement and a sweeper -around the pre-defined frequency. +We start by initializing the platform, creating a sequence composed of only a measurement +and a sweeper around the pre-defined frequency. +We then define the execution parameters and launch the experiment. +In few seconds, the experiment will be finished and we can proceed to plot it. +This is done in the following script: .. testcode:: python import numpy as np + import matplotlib.pyplot as plt from qibolab import create_platform from qibolab.sequence import PulseSequence from qibolab.sweeper import Sweeper, Parameter @@ -42,7 +45,7 @@ around the pre-defined frequency. qubit = platform.qubits[0] natives = platform.natives.single_qubit[0] - sequence = natives.MZ() + sequence = natives.MZ.create_sequence() # allocate frequency sweeper f0 = platform.config(qubit.probe).frequency @@ -52,10 +55,6 @@ around the pre-defined frequency. channels=[qubit.probe], ) -We then define the execution parameters and launch the experiment. - -.. testcode:: python - options = ExecutionParameters( nshots=1000, relaxation_time=50, @@ -65,12 +64,6 @@ We then define the execution parameters and launch the experiment. results = platform.execute([sequence], options, [[sweeper]]) -In few seconds, the experiment will be finished and we can proceed to plot it. - -.. testcode:: python - - import matplotlib.pyplot as plt - acq = sequence.acquisitions[0][1] signal = results[acq.id] amplitudes = np.abs(signal[..., 0] + 1j * signal[..., 1]) @@ -127,8 +120,9 @@ complex pulse sequence. Therefore with start with that: # create pulse sequence and add pulses sequence = PulseSequence() - sequence |= natives.RX() - sequence |= natives.MZ() + sequence.concatenate(natives.RX.create_sequence()) + sequence.append((qubit.acquisition, Delay(duration=sequence.duration))) + sequence.concatenate(natives.MZ.create_sequence()) # allocate frequency sweeper f0 = platform.config(qubit.drive).frequency @@ -138,13 +132,6 @@ complex pulse sequence. Therefore with start with that: channels=[qubit.drive], ) -Note that the drive pulse has been changed to match the characteristics required -for the experiment. - -We can now proceed to launch on hardware: - -.. testcode:: python - options = ExecutionParameters( nshots=1000, relaxation_time=50, @@ -166,6 +153,10 @@ We can now proceed to launch on hardware: plt.plot(frequencies, amplitudes) plt.show() + +Note that the drive pulse has been changed to match the characteristics required +for the experiment. + .. image:: qubit_spectroscopy_light.svg :class: only-light .. image:: qubit_spectroscopy_dark.svg @@ -223,12 +214,13 @@ and its impact on qubit states in the IQ plane. natives = platform.natives.single_qubit[0] # create pulse sequence 1 - zero_sequence = natives.MZ() + zero_sequence = natives.MZ.create_sequence() # create pulse sequence 2 one_sequence = PulseSequence() - one_sequence |= natives.RX() - one_sequence |= natives.MZ() + one_sequence.concatenate(natives.RX.create_sequence()) + one_sequence.append((qubit.acquisition, Delay(duration=sequence.duration))) + one_sequence.concatenate(natives.MZ.create_sequence()) options = ExecutionParameters( nshots=1000, diff --git a/doc/source/tutorials/pulses.rst b/doc/source/tutorials/pulses.rst index 2971b34bdd..6667024039 100644 --- a/doc/source/tutorials/pulses.rst +++ b/doc/source/tutorials/pulses.rst @@ -80,5 +80,6 @@ Alternatively, instead of using the pulse API directly, one can use the native g platform = create_platform("dummy") q0 = platform.natives.single_qubit[0] sequence = PulseSequence() - sequence |= q0.RX(theta=np.pi / 2) - sequence |= q0.MZ() + sequence.concatenate(q0.RX.create_sequence(theta=np.pi / 2)) + sequence.append((platform.qubits[0].acquisition, Delay(duration=sequence.duration))) + sequence.concatenate(q0.MZ.create_sequence()) From e5d10e33ea1ae68cd8ced41af203656e3c2e9a64 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Sun, 8 Sep 2024 12:40:21 +0400 Subject: [PATCH 0938/1006] chore: disable doctest for py3.12 --- .github/workflows/rules.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/rules.yml b/.github/workflows/rules.yml index c16024774e..cac9eaf99d 100644 --- a/.github/workflows/rules.yml +++ b/.github/workflows/rules.yml @@ -17,6 +17,6 @@ jobs: with: os: ${{ matrix.os }} python-version: ${{ matrix.python-version }} - doctests: ${{ matrix.os == 'ubuntu-latest'}} + doctests: ${{ matrix.os == 'ubuntu-latest' && matrix.python-version != '3.12'}} poetry-extras: "--with docs,tests,analysis --all-extras" secrets: inherit From 16bf64a596bf1d3830dc411acef5afe794505bdb Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Mon, 9 Sep 2024 19:50:30 +0400 Subject: [PATCH 0939/1006] fix: rebase leftover --- doc/source/tutorials/lab.rst | 121 ++++------------------------------- 1 file changed, 11 insertions(+), 110 deletions(-) diff --git a/doc/source/tutorials/lab.rst b/doc/source/tutorials/lab.rst index e7d840ec97..ad2ab7633e 100644 --- a/doc/source/tutorials/lab.rst +++ b/doc/source/tutorials/lab.rst @@ -22,12 +22,13 @@ using different Qibolab primitives. .. testcode:: python from qibolab import Platform -<<<<<<< HEAD - from qibolab.components import IqChannel, AcquisitionChannel, IqConfig -======= from qibolab.sequence import PulseSequence - from qibolab.components import IqChannel, AcquireChannel, IqConfig, AcquisitionConfig ->>>>>>> 7f9bc26e (chore: update tutorials/lab) + from qibolab.components import ( + IqChannel, + AcquisitionChannel, + IqConfig, + AcquisitionConfig, + ) from qibolab.qubits import Qubit from qibolab.pulses import Gaussian, Pulse, Rectangular, Readout, Acquisition from qibolab.native import RxyFactory, FixedSequenceFactory, SingleQubitNatives @@ -54,16 +55,11 @@ using different Qibolab primitives. mixer=None, lo=None, ) -<<<<<<< HEAD - qubit.acquisition = AcquisitionChannel( - name="0/acquisition", twpa_pump=None, probe="probe" -======= - channels[qubit.acquisition] = AcquireChannel( + channels[qubit.acquisition] = AcquisitionChannel( device="controller", path="0", twpa_pump=None, probe="probe" ) channels[qubit.drive] = IqChannel( device="controller", path="0", mixer=None, lo=None ->>>>>>> 7f9bc26e (chore: update tutorials/lab) ) # define configuration for channels @@ -166,53 +162,13 @@ the native gates, but separately from the single-qubit ones. # Create channels and connect to instrument ports channels = {} -<<<<<<< HEAD - - # assign channels to the qubits - channels[qubit0.probe] = IqChannel(mixer=None, lo=None) - channels[qubit0.acquisition] = AcquisitionChannel(twpa_pump=None, probe=qubit0.probe) - channels[qubit0.drive] = IqChannel(mixer=None, lo=None) - channels[qubit0.flux] = DcChannel() - channels[qubit1.probe] = IqChannel(mixer=None, lo=None) - channels[qubit1.acquisition] = AcquisitionChannel(twpa_pump=None, probe=qubit1.probe) - channels[qubit1.drive] = IqChannel(mixer=None, lo=None) - - # assign single-qubit native gates to each qubit - single_qubit = {} - single_qubit["0"] = SingleQubitNatives( - RX=RxyFactory( - PulseSequence( - [ - ( - qubit0.drive, - Pulse( - duration=40, - amplitude=0.05, - envelope=Gaussian(rel_sigma=0.2), - ), - ) - ] - ) - ), - MZ=FixedSequenceFactory( - PulseSequence( - [ - ( - qubit0.probe, - Pulse(duration=1000, amplitude=0.005, envelope=Rectangular()), - ) - ] - ) - ), -======= channels[qubits[0].probe] = IqChannel( device="controller", path="0", mixer=None, lo=None, ->>>>>>> 7f9bc26e (chore: update tutorials/lab) ) - channels[qubits[0].acquisition] = AcquireChannel( + channels[qubits[0].acquisition] = AcquisitionChannel( device="controller", path="0", twpa_pump=None, probe="probe" ) channels[qubits[0].drive] = IqChannel( @@ -226,7 +182,7 @@ the native gates, but separately from the single-qubit ones. mixer=None, lo=None, ) - channels[qubits[1].acquisition] = AcquireChannel( + channels[qubits[1].acquisition] = AcquisitionChannel( device="controller", path="3", twpa_pump=None, probe="probe" ) channels[qubits[1].drive] = IqChannel( @@ -595,41 +551,6 @@ Here is the ``create()`` method that loads the parameters from the JSON: ) from qibolab.instruments.dummy import DummyInstrument -<<<<<<< HEAD - FOLDER = Path.cwd() - # assumes runcard is storred in the same folder as platform.py - - - def create(): - # create a controller instrument - instrument = DummyInstrument("my_instrument", "0.0.0.0:0") - - # define channels and load component configs - qubits = {} - for q in range(2): - probe_name, acquire_name = f"qubit_{q}/probe", f"qubit_{q}/acquisition" - qubits[q] = Qubit( - name=q, - drive=IqChannel(f"qubit_{q}/drive", mixer=None, lo=None), - flux=DcChannel(f"qubit_{q}/flux"), - probe=IqChannel(probe_name, mixer=None, lo=None, acquistion=acquire_name), - acquisition=AcquisitionChannel( - acquire_name, twpa_pump=None, probe=probe_name - ), - ) - - # create dictionary of instruments - instruments = {instrument.name: instrument} - # load ``settings`` from the runcard - return Platform.load(FOLDER, instruments, qubits) - -With the following additions for coupler architectures: - -.. testcode:: python - - # my_platform / platform.py -======= ->>>>>>> 7f9bc26e (chore: update tutorials/lab) FOLDER = Path.cwd() @@ -638,20 +559,10 @@ With the following additions for coupler architectures: qubits = {} for q in range(2): qubits[q] = Qubit( -<<<<<<< HEAD - name=q, - drive=IqChannel(f"qubit_{q}/drive", mixer=None, lo=None), - flux=DcChannel(f"qubit_{q}/flux"), - probe=IqChannel(probe_name, mixer=None, lo=None, acquistion=acquire_name), - acquisition=AcquisitionChannel( - acquire_name, twpa_pump=None, probe=probe_name - ), -======= drive=f"{q}/drive", flux=f"{q}/flux", probe=f"{q}/probe", acquisition=f"{q}/acquisition", ->>>>>>> 7f9bc26e (chore: update tutorials/lab) ) couplers = {0: Qubit(flux="01/coupler")} @@ -665,7 +576,7 @@ With the following additions for coupler architectures: channels[qubits[q].probe] = IqChannel( device="my_instrument", path="0", mixer=None, lo=None ) - channels[qubits[q].acquisition] = AcquireChannel( + channels[qubits[q].acquisition] = AcquisitionChannel( device="my_instrument", path="0", twpa_pump=None, probe=qubits[q].probe ) @@ -739,20 +650,10 @@ in this case ``"twpa_pump"``. qubits = {} for q in range(2): qubits[q] = Qubit( -<<<<<<< HEAD - name=q, - drive=IqChannel(f"qubit_{q}/drive", mixer=None, lo=None), - flux=DcChannel(f"qubit_{q}/flux"), - probe=IqChannel(probe_name, mixer=None, lo=None, acquistion=acquire_name), - acquisition=AcquisitionChannel( - acquire_name, twpa_pump=None, probe=probe_name - ), -======= drive=f"{q}/drive", flux=f"{q}/flux", probe=f"{q}/probe", acquisition=f"{q}/acquisition", ->>>>>>> 7f9bc26e (chore: update tutorials/lab) ) couplers = {0: Qubit(flux="01/coupler")} @@ -766,7 +667,7 @@ in this case ``"twpa_pump"``. channels[qubits[q].probe] = IqChannel( device="my_instrument", path="0", mixer=None, lo=None ) - channels[qubits[q].acquisition] = AcquireChannel( + channels[qubits[q].acquisition] = AcquisitionChannel( device="my_instrument", path="0", twpa_pump=None, probe=qubits[q].probe ) From 75f12e8416c579396fd677bc2f3a453c85996c35 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 13 Sep 2024 23:53:22 +0400 Subject: [PATCH 0940/1006] docs: use sequence creation shortcuts in various examples --- doc/source/main-documentation/qibolab.rst | 40 ++++++++--------------- doc/source/tutorials/calibration.rst | 15 ++------- doc/source/tutorials/pulses.rst | 5 +-- 3 files changed, 17 insertions(+), 43 deletions(-) diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index 7ca2ba57bf..4e08d7589a 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -73,10 +73,10 @@ as these are loaded automatically from the platform, as defined in the correspon ps = PulseSequence() qubit = platform.qubits[0] natives = platform.natives.single_qubit[0] - ps.concatenate(natives.RX.create_sequence()) - ps.concatenate(natives.RX.create_sequence(phi=np.pi / 2)) + ps.concatenate(natives.RX()) + ps.concatenate(natives.RX(phi=np.pi / 2)) ps.append((qubit.probe, Delay(duration=200))) - ps.concatenate(natives.MZ.create_sequence()) + ps.concatenate(natives.MZ()) Now we can execute the sequence on hardware: @@ -282,9 +282,7 @@ Typical experiments may include both pre-defined pulses and new ones: from qibolab.identifier import ChannelId natives = platform.natives.single_qubit[0] - sequence = PulseSequence() - sequence.concatenate(natives.RX.create_sequence()) - sequence.concatenate(natives.MZ.create_sequence()) + sequence = natives.RX() | natives.MZ() results = platform.execute([sequence]) @@ -345,16 +343,11 @@ A typical resonator spectroscopy experiment could be defined with: natives = platform.natives.single_qubit - sequence = PulseSequence() - sequence.concatenate( - natives[0].MZ.create_sequence() - ) # readout pulse for qubit 0 at 4 GHz - sequence.concatenate( - natives[1].MZ.create_sequence() - ) # readout pulse for qubit 1 at 5 GHz - sequence.concatenate( - natives[2].MZ.create_sequence() - ) # readout pulse for qubit 2 at 6 GHz + sequence = ( + natives[0].MZ() # readout pulse for qubit 0 at 4 GHz + | natives[1].MZ() # readout pulse for qubit 1 at 5 GHz + | natives[2].MZ() # readout pulse for qubit 2 at 6 GHz + ) sweepers = [ Sweeper( @@ -382,15 +375,10 @@ For example: .. testcode:: python - from qibolab.pulses import Delay - from qibolab.sequence import PulseSequence - qubit = platform.qubits[0] natives = platform.natives.single_qubit[0] - sequence = PulseSequence() - rx_sequence = natives.RX.create_sequence() - sequence.concatenate(rx_sequence) - sequence.concatenate(natives.MZ.create_sequence()) + rx_sequence = natives.RX() + sequence = rx_sequence | natives.MZ() f0 = platform.config(qubit.drive).frequency sweeper_freq = Sweeper( @@ -473,10 +461,8 @@ For example in qubit = platform.qubits[0] natives = platform.natives.single_qubit[0] - sequence = PulseSequence() - sequence.concatenate(natives.RX.create_sequence()) - ro_sequence = natives.MZ.create_sequence() - sequence.concatenate(ro_sequence) + ro_sequence = natives.MZ() + sequence = natives.RX() | ro_sequence options = ExecutionParameters( nshots=1000, diff --git a/doc/source/tutorials/calibration.rst b/doc/source/tutorials/calibration.rst index 586d5c4404..17a73ad8e0 100644 --- a/doc/source/tutorials/calibration.rst +++ b/doc/source/tutorials/calibration.rst @@ -103,7 +103,6 @@ complex pulse sequence. Therefore with start with that: import numpy as np import matplotlib.pyplot as plt from qibolab import create_platform - from qibolab.pulses import Pulse, Delay, Gaussian from qibolab.sequence import PulseSequence from qibolab.sweeper import Sweeper, Parameter from qibolab.execution_parameters import ( @@ -119,10 +118,7 @@ complex pulse sequence. Therefore with start with that: natives = platform.natives.single_qubit[0] # create pulse sequence and add pulses - sequence = PulseSequence() - sequence.concatenate(natives.RX.create_sequence()) - sequence.append((qubit.acquisition, Delay(duration=sequence.duration))) - sequence.concatenate(natives.MZ.create_sequence()) + sequence = natives.RX() | natives.MZ() # allocate frequency sweeper f0 = platform.config(qubit.drive).frequency @@ -198,8 +194,6 @@ and its impact on qubit states in the IQ plane. import numpy as np import matplotlib.pyplot as plt from qibolab import create_platform - from qibolab.pulses import Delay - from qibolab.sequence import PulseSequence from qibolab.sweeper import Sweeper, Parameter from qibolab.execution_parameters import ( ExecutionParameters, @@ -214,13 +208,10 @@ and its impact on qubit states in the IQ plane. natives = platform.natives.single_qubit[0] # create pulse sequence 1 - zero_sequence = natives.MZ.create_sequence() + zero_sequence = natives.MZ() # create pulse sequence 2 - one_sequence = PulseSequence() - one_sequence.concatenate(natives.RX.create_sequence()) - one_sequence.append((qubit.acquisition, Delay(duration=sequence.duration))) - one_sequence.concatenate(natives.MZ.create_sequence()) + one_sequence = natives.RX() | natives.MZ() options = ExecutionParameters( nshots=1000, diff --git a/doc/source/tutorials/pulses.rst b/doc/source/tutorials/pulses.rst index 6667024039..e85912f6f1 100644 --- a/doc/source/tutorials/pulses.rst +++ b/doc/source/tutorials/pulses.rst @@ -79,7 +79,4 @@ Alternatively, instead of using the pulse API directly, one can use the native g platform = create_platform("dummy") q0 = platform.natives.single_qubit[0] - sequence = PulseSequence() - sequence.concatenate(q0.RX.create_sequence(theta=np.pi / 2)) - sequence.append((platform.qubits[0].acquisition, Delay(duration=sequence.duration))) - sequence.concatenate(q0.MZ.create_sequence()) + sequence = q0.RX(theta=np.pi / 2) | q0.MZ() From 8e23cb994ebb11a4cf0d60002548393cc7e4ea7a Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Sat, 14 Sep 2024 21:22:58 +0400 Subject: [PATCH 0941/1006] docs: drop compiler tutorial --- doc/source/tutorials/compiler.rst | 75 ------------------------------- doc/source/tutorials/index.rst | 1 - 2 files changed, 76 deletions(-) delete mode 100644 doc/source/tutorials/compiler.rst diff --git a/doc/source/tutorials/compiler.rst b/doc/source/tutorials/compiler.rst deleted file mode 100644 index 1ebb3fd87f..0000000000 --- a/doc/source/tutorials/compiler.rst +++ /dev/null @@ -1,75 +0,0 @@ -.. _tutorials_compiler: - -How to modify the default circuit compilation -============================================= - -A Qibolab platform can execute pulse sequences. -As shown in :ref:`tutorials_circuits`, Qibo circuits can be executed by invoking the :class:`qibolab.backends.QibolabBackend`, which is the object integrating Qibolab to Qibo. -When a Qibo circuit is executed, the backend will automatically compile it to a pulse sequence, which will be sent to the platform for execution. -The default compiler outlined in the :ref:`main_doc_compiler` section will be used in this process. -In this tutorial we will demonstrate how the user can modify this process for custom applications. - -.. note:: - The compiler is only responsible for converting circuits to pulse sequences. - These circuits should already contain only native gates and respect the chip connectiviy. - If the circuit does not respect these constraints, it should be converted to an equivalent - circuit that respects them using a Qibo transpiler. - - -The ``compiler`` object used when executing a circuit is an attribute of :class:`qibolab.backends.QibolabBackend`. -Creating an instance of the backend provides access to these objects: - -.. testcode:: python - - from qibolab.backends import QibolabBackend - - backend = QibolabBackend(platform="dummy") - - print(type(backend.compiler)) - -.. testoutput:: python - :hide: - - - - -The default compiler provides rules for the following single-qubit gates: -``Z``, ``RZ``, ``I``, ``GPI``, ``GPI2``, ``M`` -and the following two-qubit gates: ``CZ``, ``CNOT`` subject to platform availability. -The user can modify the compilation process by defining custom compilation rules and registering -them to the ``compiler`` attribute of the ``QibolabBackend``. -The default rules defined in :py:mod:`qibolab.compilers.default` can serve as an example. - -The following example shows how to modify the compiler in order to execute a circuit containing an ``X`` gate -directly using a single pi-pulse, instead of converting it to ``GPI2``: - -.. testcode:: python - - from qibo import gates - from qibo.models import Circuit - from qibolab.backends import QibolabBackend - from qibolab.sequence import PulseSequence - - # define the circuit - circuit = Circuit(1) - circuit.add(gates.X(0)) - circuit.add(gates.M(0)) - - - # define a compiler rule that translates X to the pi-pulse - def x_rule(gate, natives): - """X gate applied with a single pi-pulse.""" - return natives.ensure("RX").create_sequence() - - - backend = QibolabBackend(platform="dummy") - # register the new X rule in the compiler - backend.compiler.rules[gates.X] = x_rule - - # execute the circuit - result = backend.execute_circuit(circuit, nshots=1000) - - -.. note:: - If the compiler receives a circuit that contains a gate for which it has no rule, an error will be raised. - This means that the native gate set that the Qibo transpiler uses, should be compatible with the available compiler rules. diff --git a/doc/source/tutorials/index.rst b/doc/source/tutorials/index.rst index c904d19324..c3e11046d8 100644 --- a/doc/source/tutorials/index.rst +++ b/doc/source/tutorials/index.rst @@ -12,5 +12,4 @@ In this section we present code examples from basic to advanced features impleme pulses circuits calibration - compiler instrument From 7209fef4548eab1fdcbea6a85738a860765ae465 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Sat, 14 Sep 2024 21:28:43 +0400 Subject: [PATCH 0942/1006] refactor: empty default Instrument.setup instead of abstractmethod --- doc/source/tutorials/instrument.rst | 14 +++++--------- src/qibolab/instruments/abstract.py | 8 ++++++-- src/qibolab/instruments/bluefors.py | 3 --- src/qibolab/instruments/dummy.py | 3 --- src/qibolab/instruments/qm/controller.py | 6 ------ 5 files changed, 11 insertions(+), 23 deletions(-) diff --git a/doc/source/tutorials/instrument.rst b/doc/source/tutorials/instrument.rst index 1b5698285d..d9c2a1988e 100644 --- a/doc/source/tutorials/instrument.rst +++ b/doc/source/tutorials/instrument.rst @@ -24,12 +24,11 @@ Add an instrument The base of an instrument is :class:`qibolab.instruments.abstract.Instrument`, which is a pydantic ``Model``. To accomodate different kind of instruments, a flexible interface is implemented -with three abstract methods that are required to be implemented in the child -instrument: - -* ``connect()`` -* ``setup()`` -* ``disconnect()`` +with two abstract methods (``connect()`` and ``disconnect()``) that are required +to be implemented in the child instrument. +Optionally, a ``setup()`` method can also be implemented to upload settings, such +as local oscillator frequency or power, to the instrument after connection. +If ``setup()`` is not implemented it will be an empty function. In the execution of an experiment these functions are called sequentially, so first a connection is established, the instrument is set up with the required @@ -107,9 +106,6 @@ Let's see a minimal example: def disconnect(self): self.device.disconnect() - def setup(self): - """Empty method to comply with Instrument interface.""" - def play( self, configs: dict[str, Config], diff --git a/src/qibolab/instruments/abstract.py b/src/qibolab/instruments/abstract.py index 58921378d9..8bd18861a4 100644 --- a/src/qibolab/instruments/abstract.py +++ b/src/qibolab/instruments/abstract.py @@ -44,9 +44,13 @@ def connect(self): def disconnect(self): """Close connection to the physical instrument.""" - @abstractmethod def setup(self, *args, **kwargs): - """Set instrument settings.""" + """Set instrument settings. + + Used primarily by non-controller instruments, to upload settings + (like LO frequency and power) to the instrument after + connecting. + """ class Controller(Instrument): diff --git a/src/qibolab/instruments/bluefors.py b/src/qibolab/instruments/bluefors.py index f3f1be1f25..885996feca 100644 --- a/src/qibolab/instruments/bluefors.py +++ b/src/qibolab/instruments/bluefors.py @@ -44,9 +44,6 @@ def disconnect(self): self.client_socket.close() self._is_connected = False - def setup(self): - """Required by parent class, but not used here.""" - def get_data(self) -> dict[str, dict[str, float]]: """Connect to the socket and get temperature data. diff --git a/src/qibolab/instruments/dummy.py b/src/qibolab/instruments/dummy.py index 105777d742..a289e8485b 100644 --- a/src/qibolab/instruments/dummy.py +++ b/src/qibolab/instruments/dummy.py @@ -78,9 +78,6 @@ def connect(self): def disconnect(self): log.info(f"Disconnecting dummy instrument.") - def setup(self, *args, **kwargs): - log.info(f"Setting up dummy instrument.") - def values(self, options: ExecutionParameters, shape: tuple[int, ...]): if options.acquisition_type is AcquisitionType.DISCRIMINATION: if options.averaging_mode is AveragingMode.SINGLESHOT: diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/instruments/qm/controller.py index b46302dffe..9ec6eafe0c 100644 --- a/src/qibolab/instruments/qm/controller.py +++ b/src/qibolab/instruments/qm/controller.py @@ -203,12 +203,6 @@ def _reset_temporary_calibration(self): shutil.rmtree(self._calibration_path) self._calibration_path = None - def setup(self, *args, **kwargs): - """Complying with abstract instrument interface. - - Not needed for this instrument. - """ - def connect(self): """Connect to the Quantum Machines manager.""" host, port = self.address.split(":") From 98bd880bec41736031f188791af9a9fa6aec6dc9 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 6 Sep 2024 16:01:09 +0200 Subject: [PATCH 0943/1006] refactor: Start defining the public api through all module attribute --- .pre-commit-config.yaml | 1 - src/qibolab/__init__.py | 25 ++++++++++--------------- src/qibolab/backends.py | 2 ++ src/qibolab/execution_parameters.py | 2 ++ src/qibolab/version.py | 2 ++ 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 8896d83bfa..3264c6b1c1 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -34,7 +34,6 @@ repos: - id: pycln args: - --config=pyproject.toml - - --all - repo: https://github.com/adamchainz/blacken-docs rev: 1.18.0 hooks: diff --git a/src/qibolab/__init__.py b/src/qibolab/__init__.py index 9ab36e0338..932c97f4b6 100644 --- a/src/qibolab/__init__.py +++ b/src/qibolab/__init__.py @@ -1,16 +1,11 @@ -from .backends import MetaBackend, QibolabBackend, execute_qasm -from .execution_parameters import AcquisitionType, AveragingMode, ExecutionParameters -from .platform import Platform, create_platform -from .version import __version__ +from . import backends, execution_parameters, platform, version +from .backends import * +from .execution_parameters import * +from .platform import * +from .version import * -__all__ = [ - "AcquisitionType", - "AveragingMode", - "ExecutionParameters", - "MetaBackend", - "Platform", - "QibolabBackend", - "create_platform", - "execute_qasm", - "__version__", -] +__all__ = [] +__all__ += backends.__all__ +__all__ += execution_parameters.__all__ +__all__ += platform.__all__ +__all__ += version.__all__ diff --git a/src/qibolab/backends.py b/src/qibolab/backends.py index 2eb739325a..0a9928e450 100644 --- a/src/qibolab/backends.py +++ b/src/qibolab/backends.py @@ -11,6 +11,8 @@ from qibolab.platform.load import available_platforms from qibolab.version import __version__ as qibolab_version +__all__ = ["MetaBackend", "QibolabBackend"] + def execute_qasm(circuit: str, platform, initial_state=None, nshots=1000): """Executes a QASM circuit. diff --git a/src/qibolab/execution_parameters.py b/src/qibolab/execution_parameters.py index 646c806aa9..35689f522d 100644 --- a/src/qibolab/execution_parameters.py +++ b/src/qibolab/execution_parameters.py @@ -4,6 +4,8 @@ from qibolab.serialize import Model from qibolab.sweeper import ParallelSweepers +__all__ = ["AcquisitionType", "AveragingMode", "ExecutionParameters"] + class AcquisitionType(Enum): """Data acquisition from hardware.""" diff --git a/src/qibolab/version.py b/src/qibolab/version.py index dc57e90bf0..d5b2658b1b 100644 --- a/src/qibolab/version.py +++ b/src/qibolab/version.py @@ -1,3 +1,5 @@ import importlib.metadata as im +__all__ = ["__version__"] + __version__ = im.version(__package__) From 934e1618ea15ab9d8e95446cab5fac5eb573138b Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 6 Sep 2024 16:01:57 +0200 Subject: [PATCH 0944/1006] build: Add ruff and pycln configs, to treat init files consistently --- pyproject.toml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 5dc56b8173..ba05be9c40 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -116,3 +116,10 @@ addopts = [ '-m not qpu', '-k not emulator', ] + +[tool.ruff.per-file-ignores] +"__init__.py" = ["F403"] + +[tool.pycln] +all = true +exclude = "__init__.py" From 9be170812a58622bac1aa312fc85d5917684149b Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 6 Sep 2024 16:03:23 +0200 Subject: [PATCH 0945/1006] refactor: Drop pycln directive As no longer necessary --- src/qibolab/instruments/qm/components/__init__.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/qibolab/instruments/qm/components/__init__.py b/src/qibolab/instruments/qm/components/__init__.py index a3e90c16e9..23a39cbdad 100644 --- a/src/qibolab/instruments/qm/components/__init__.py +++ b/src/qibolab/instruments/qm/components/__init__.py @@ -1,7 +1,5 @@ from . import configs - -# TODO: Fix pycln configurations in pre-commit to preserve the following with no comment -from .configs import * # noqa +from .configs import * __all__ = [] __all__ += configs.__all__ From 54bdc741f9120d7b15ca4ed6b9b293b9490db029 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 6 Sep 2024 16:07:52 +0200 Subject: [PATCH 0946/1006] test: Import qasm executor from defining module --- tests/test_execute_qasm.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/test_execute_qasm.py b/tests/test_execute_qasm.py index 4271758ec5..60d396824d 100644 --- a/tests/test_execute_qasm.py +++ b/tests/test_execute_qasm.py @@ -1,7 +1,6 @@ from qibo import Circuit, __version__ -from qibolab import execute_qasm -from qibolab.backends import QibolabBackend +from qibolab.backends import QibolabBackend, execute_qasm def test_execute_qasm(): From 20348136c59aeb521d4ccbb88b5c0f96f1e73ff6 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 6 Sep 2024 16:12:50 +0200 Subject: [PATCH 0947/1006] docs: Import qasm executor from defining module --- doc/source/tutorials/circuits.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/tutorials/circuits.rst b/doc/source/tutorials/circuits.rst index b30e9186f9..7fef5c531a 100644 --- a/doc/source/tutorials/circuits.rst +++ b/doc/source/tutorials/circuits.rst @@ -154,7 +154,7 @@ can be executed by passing it together with the platform name to the :func:`qibo .. testcode:: - from qibolab import execute_qasm + from qibolab.backends import execute_qasm result = execute_qasm(circuit, platform="dummy") From ad965039843d71902027eeed7fc30439012c35b4 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 6 Sep 2024 16:16:51 +0200 Subject: [PATCH 0948/1006] fix: Import qasm executor from defining module In C API --- capi/src/wrapper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/capi/src/wrapper.py b/capi/src/wrapper.py index f002e299a8..e08071d66c 100644 --- a/capi/src/wrapper.py +++ b/capi/src/wrapper.py @@ -1,7 +1,7 @@ # This file is part of from cqibolab import ffi -from qibolab import execute_qasm as py_execute_qasm +from qibolab.backends import execute_qasm as py_execute_qasm @ffi.def_extern() From 6896f75104d3e8aa300ccb64608ab66eb75e7e23 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Fri, 6 Sep 2024 16:26:43 +0200 Subject: [PATCH 0949/1006] refactor: Add pulses and sequence exports --- src/qibolab/__init__.py | 6 +++++- src/qibolab/pulses/__init__.py | 16 ++++++---------- src/qibolab/pulses/pulse.py | 3 +++ 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/qibolab/__init__.py b/src/qibolab/__init__.py index 932c97f4b6..c2b1a65096 100644 --- a/src/qibolab/__init__.py +++ b/src/qibolab/__init__.py @@ -1,11 +1,15 @@ -from . import backends, execution_parameters, platform, version +from . import backends, execution_parameters, platform, pulses, sequence, version from .backends import * from .execution_parameters import * from .platform import * +from .pulses import * +from .sequence import * from .version import * __all__ = [] __all__ += backends.__all__ __all__ += execution_parameters.__all__ __all__ += platform.__all__ +__all__ += pulses.__all__ +__all__ += sequence.__all__ __all__ += version.__all__ diff --git a/src/qibolab/pulses/__init__.py b/src/qibolab/pulses/__init__.py index a26fa99880..7c402aefd1 100644 --- a/src/qibolab/pulses/__init__.py +++ b/src/qibolab/pulses/__init__.py @@ -1,11 +1,7 @@ +from . import envelope, pulse from .envelope import * -from .pulse import ( - Acquisition, - Align, - Delay, - Pulse, - PulseId, - PulseLike, - Readout, - VirtualZ, -) +from .pulse import * + +__all__ = [] +__all__ += envelope.__all__ +__all__ += pulse.__all__ diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/pulses/pulse.py index 1d0b41165d..849be371aa 100644 --- a/src/qibolab/pulses/pulse.py +++ b/src/qibolab/pulses/pulse.py @@ -10,10 +10,13 @@ from .envelope import Envelope, IqWaveform, Waveform __all__ = [ + "Acquisition", + "Align", "Delay", "Pulse", "PulseId", "PulseLike", + "Readout", "VirtualZ", ] From ae2442cb584262d39f26b808d0fdb0ad662f140c Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 16 Sep 2024 14:18:07 +0200 Subject: [PATCH 0950/1006] feat!: Expose sweeeper API --- src/qibolab/__init__.py | 12 +++++++++++- src/qibolab/sweeper.py | 2 ++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/qibolab/__init__.py b/src/qibolab/__init__.py index c2b1a65096..2d4bd202d1 100644 --- a/src/qibolab/__init__.py +++ b/src/qibolab/__init__.py @@ -1,9 +1,18 @@ -from . import backends, execution_parameters, platform, pulses, sequence, version +from . import ( + backends, + execution_parameters, + platform, + pulses, + sequence, + sweeper, + version, +) from .backends import * from .execution_parameters import * from .platform import * from .pulses import * from .sequence import * +from .sweeper import * from .version import * __all__ = [] @@ -12,4 +21,5 @@ __all__ += platform.__all__ __all__ += pulses.__all__ __all__ += sequence.__all__ +__all__ += sweeper.__all__ __all__ += version.__all__ diff --git a/src/qibolab/sweeper.py b/src/qibolab/sweeper.py index 96cd0696d0..585e07fb8d 100644 --- a/src/qibolab/sweeper.py +++ b/src/qibolab/sweeper.py @@ -10,6 +10,8 @@ from .pulses import PulseLike from .serialize import Model +__all__ = ["Parameter", "ParallelSweepers", "Sweeper"] + _PULSE = "pulse" _CHANNEL = "channel" From 2381c0e853e27fbeb37f2a290282f1fda0a383df Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 16 Sep 2024 14:20:12 +0200 Subject: [PATCH 0951/1006] feat!: Expose components API --- src/qibolab/__init__.py | 2 ++ src/qibolab/components/__init__.py | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/src/qibolab/__init__.py b/src/qibolab/__init__.py index 2d4bd202d1..d1f6ab9011 100644 --- a/src/qibolab/__init__.py +++ b/src/qibolab/__init__.py @@ -1,5 +1,6 @@ from . import ( backends, + components, execution_parameters, platform, pulses, @@ -17,6 +18,7 @@ __all__ = [] __all__ += backends.__all__ +__all__ += components.__all__ __all__ += execution_parameters.__all__ __all__ += platform.__all__ __all__ += pulses.__all__ diff --git a/src/qibolab/components/__init__.py b/src/qibolab/components/__init__.py index ee977ce991..bab8c08076 100644 --- a/src/qibolab/components/__init__.py +++ b/src/qibolab/components/__init__.py @@ -15,5 +15,10 @@ their name. """ +from . import channels, configs from .channels import * from .configs import * + +__all__ = [] +__all__ += channels.__all__ +__all__ += configs.__all__ From a18449f6b6e71a89adadc09703b3d41388192af5 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 16 Sep 2024 14:20:55 +0200 Subject: [PATCH 0952/1006] fix: Avoid exposing configs --- src/qibolab/components/__init__.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/qibolab/components/__init__.py b/src/qibolab/components/__init__.py index bab8c08076..1b9fab6884 100644 --- a/src/qibolab/components/__init__.py +++ b/src/qibolab/components/__init__.py @@ -15,10 +15,9 @@ their name. """ -from . import channels, configs +from . import channels from .channels import * from .configs import * __all__ = [] __all__ += channels.__all__ -__all__ += configs.__all__ From 3c26826d62fdf388166adf3f5a352150628166ae Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 16 Sep 2024 14:33:25 +0200 Subject: [PATCH 0953/1006] fix: Move qibolab content to private core subpackage To enforce the public API usage --- src/qibolab/__init__.py | 28 ++----------------- src/qibolab/_core/__init__.py | 27 ++++++++++++++++++ src/qibolab/{ => _core}/backends.py | 0 src/qibolab/{ => _core}/compilers/__init__.py | 0 src/qibolab/{ => _core}/compilers/compiler.py | 0 src/qibolab/{ => _core}/compilers/default.py | 0 .../{ => _core}/components/__init__.py | 0 .../{ => _core}/components/channels.py | 0 src/qibolab/{ => _core}/components/configs.py | 0 src/qibolab/{ => _core}/dummy/__init__.py | 0 src/qibolab/{ => _core}/dummy/parameters.json | 0 src/qibolab/{ => _core}/dummy/platform.py | 0 .../{ => _core}/execution_parameters.py | 0 src/qibolab/{ => _core}/identifier.py | 0 .../{ => _core}/instruments/__init__.py | 0 .../{ => _core}/instruments/abstract.py | 0 .../{ => _core}/instruments/bluefors.py | 0 src/qibolab/{ => _core}/instruments/dummy.py | 0 .../{ => _core}/instruments/erasynth.py | 0 .../{ => _core}/instruments/oscillator.py | 0 .../{ => _core}/instruments/qm/__init__.py | 0 .../instruments/qm/components/__init__.py | 0 .../instruments/qm/components/configs.py | 0 .../instruments/qm/config/__init__.py | 0 .../instruments/qm/config/config.py | 0 .../instruments/qm/config/devices.py | 0 .../instruments/qm/config/elements.py | 0 .../instruments/qm/config/pulses.py | 0 .../{ => _core}/instruments/qm/controller.py | 0 .../instruments/qm/program/__init__.py | 0 .../instruments/qm/program/acquisition.py | 0 .../instruments/qm/program/arguments.py | 0 .../instruments/qm/program/instructions.py | 0 .../instruments/qm/program/sweepers.py | 0 .../{ => _core}/instruments/rohde_schwarz.py | 0 .../instruments/zhinst/__init__.py | 0 .../instruments/zhinst/components/__init__.py | 0 .../instruments/zhinst/components/channel.py | 0 .../instruments/zhinst/components/configs.py | 0 .../instruments/zhinst/constants.py | 0 .../instruments/zhinst/executor.py | 0 .../{ => _core}/instruments/zhinst/pulse.py | 0 .../{ => _core}/instruments/zhinst/sweep.py | 0 src/qibolab/{ => _core}/native.py | 0 src/qibolab/{ => _core}/parameters.py | 0 src/qibolab/{ => _core}/platform/__init__.py | 0 src/qibolab/{ => _core}/platform/load.py | 0 src/qibolab/{ => _core}/platform/platform.py | 0 src/qibolab/{ => _core}/pulses/__init__.py | 0 src/qibolab/{ => _core}/pulses/envelope.py | 0 src/qibolab/{ => _core}/pulses/modulation.py | 0 src/qibolab/{ => _core}/pulses/plot.py | 0 src/qibolab/{ => _core}/pulses/pulse.py | 0 src/qibolab/{ => _core}/qubits.py | 0 src/qibolab/{ => _core}/sequence.py | 0 src/qibolab/{ => _core}/serialize.py | 0 src/qibolab/{ => _core}/sweeper.py | 0 src/qibolab/{ => _core}/unrolling.py | 0 src/qibolab/{ => _core}/version.py | 0 59 files changed, 30 insertions(+), 25 deletions(-) create mode 100644 src/qibolab/_core/__init__.py rename src/qibolab/{ => _core}/backends.py (100%) rename src/qibolab/{ => _core}/compilers/__init__.py (100%) rename src/qibolab/{ => _core}/compilers/compiler.py (100%) rename src/qibolab/{ => _core}/compilers/default.py (100%) rename src/qibolab/{ => _core}/components/__init__.py (100%) rename src/qibolab/{ => _core}/components/channels.py (100%) rename src/qibolab/{ => _core}/components/configs.py (100%) rename src/qibolab/{ => _core}/dummy/__init__.py (100%) rename src/qibolab/{ => _core}/dummy/parameters.json (100%) rename src/qibolab/{ => _core}/dummy/platform.py (100%) rename src/qibolab/{ => _core}/execution_parameters.py (100%) rename src/qibolab/{ => _core}/identifier.py (100%) rename src/qibolab/{ => _core}/instruments/__init__.py (100%) rename src/qibolab/{ => _core}/instruments/abstract.py (100%) rename src/qibolab/{ => _core}/instruments/bluefors.py (100%) rename src/qibolab/{ => _core}/instruments/dummy.py (100%) rename src/qibolab/{ => _core}/instruments/erasynth.py (100%) rename src/qibolab/{ => _core}/instruments/oscillator.py (100%) rename src/qibolab/{ => _core}/instruments/qm/__init__.py (100%) rename src/qibolab/{ => _core}/instruments/qm/components/__init__.py (100%) rename src/qibolab/{ => _core}/instruments/qm/components/configs.py (100%) rename src/qibolab/{ => _core}/instruments/qm/config/__init__.py (100%) rename src/qibolab/{ => _core}/instruments/qm/config/config.py (100%) rename src/qibolab/{ => _core}/instruments/qm/config/devices.py (100%) rename src/qibolab/{ => _core}/instruments/qm/config/elements.py (100%) rename src/qibolab/{ => _core}/instruments/qm/config/pulses.py (100%) rename src/qibolab/{ => _core}/instruments/qm/controller.py (100%) rename src/qibolab/{ => _core}/instruments/qm/program/__init__.py (100%) rename src/qibolab/{ => _core}/instruments/qm/program/acquisition.py (100%) rename src/qibolab/{ => _core}/instruments/qm/program/arguments.py (100%) rename src/qibolab/{ => _core}/instruments/qm/program/instructions.py (100%) rename src/qibolab/{ => _core}/instruments/qm/program/sweepers.py (100%) rename src/qibolab/{ => _core}/instruments/rohde_schwarz.py (100%) rename src/qibolab/{ => _core}/instruments/zhinst/__init__.py (100%) rename src/qibolab/{ => _core}/instruments/zhinst/components/__init__.py (100%) rename src/qibolab/{ => _core}/instruments/zhinst/components/channel.py (100%) rename src/qibolab/{ => _core}/instruments/zhinst/components/configs.py (100%) rename src/qibolab/{ => _core}/instruments/zhinst/constants.py (100%) rename src/qibolab/{ => _core}/instruments/zhinst/executor.py (100%) rename src/qibolab/{ => _core}/instruments/zhinst/pulse.py (100%) rename src/qibolab/{ => _core}/instruments/zhinst/sweep.py (100%) rename src/qibolab/{ => _core}/native.py (100%) rename src/qibolab/{ => _core}/parameters.py (100%) rename src/qibolab/{ => _core}/platform/__init__.py (100%) rename src/qibolab/{ => _core}/platform/load.py (100%) rename src/qibolab/{ => _core}/platform/platform.py (100%) rename src/qibolab/{ => _core}/pulses/__init__.py (100%) rename src/qibolab/{ => _core}/pulses/envelope.py (100%) rename src/qibolab/{ => _core}/pulses/modulation.py (100%) rename src/qibolab/{ => _core}/pulses/plot.py (100%) rename src/qibolab/{ => _core}/pulses/pulse.py (100%) rename src/qibolab/{ => _core}/qubits.py (100%) rename src/qibolab/{ => _core}/sequence.py (100%) rename src/qibolab/{ => _core}/serialize.py (100%) rename src/qibolab/{ => _core}/sweeper.py (100%) rename src/qibolab/{ => _core}/unrolling.py (100%) rename src/qibolab/{ => _core}/version.py (100%) diff --git a/src/qibolab/__init__.py b/src/qibolab/__init__.py index d1f6ab9011..2a5f53830f 100644 --- a/src/qibolab/__init__.py +++ b/src/qibolab/__init__.py @@ -1,27 +1,5 @@ -from . import ( - backends, - components, - execution_parameters, - platform, - pulses, - sequence, - sweeper, - version, -) -from .backends import * -from .execution_parameters import * -from .platform import * -from .pulses import * -from .sequence import * -from .sweeper import * -from .version import * +from . import _core +from ._core import * __all__ = [] -__all__ += backends.__all__ -__all__ += components.__all__ -__all__ += execution_parameters.__all__ -__all__ += platform.__all__ -__all__ += pulses.__all__ -__all__ += sequence.__all__ -__all__ += sweeper.__all__ -__all__ += version.__all__ +__all__ += _core.__all__ diff --git a/src/qibolab/_core/__init__.py b/src/qibolab/_core/__init__.py new file mode 100644 index 0000000000..d1f6ab9011 --- /dev/null +++ b/src/qibolab/_core/__init__.py @@ -0,0 +1,27 @@ +from . import ( + backends, + components, + execution_parameters, + platform, + pulses, + sequence, + sweeper, + version, +) +from .backends import * +from .execution_parameters import * +from .platform import * +from .pulses import * +from .sequence import * +from .sweeper import * +from .version import * + +__all__ = [] +__all__ += backends.__all__ +__all__ += components.__all__ +__all__ += execution_parameters.__all__ +__all__ += platform.__all__ +__all__ += pulses.__all__ +__all__ += sequence.__all__ +__all__ += sweeper.__all__ +__all__ += version.__all__ diff --git a/src/qibolab/backends.py b/src/qibolab/_core/backends.py similarity index 100% rename from src/qibolab/backends.py rename to src/qibolab/_core/backends.py diff --git a/src/qibolab/compilers/__init__.py b/src/qibolab/_core/compilers/__init__.py similarity index 100% rename from src/qibolab/compilers/__init__.py rename to src/qibolab/_core/compilers/__init__.py diff --git a/src/qibolab/compilers/compiler.py b/src/qibolab/_core/compilers/compiler.py similarity index 100% rename from src/qibolab/compilers/compiler.py rename to src/qibolab/_core/compilers/compiler.py diff --git a/src/qibolab/compilers/default.py b/src/qibolab/_core/compilers/default.py similarity index 100% rename from src/qibolab/compilers/default.py rename to src/qibolab/_core/compilers/default.py diff --git a/src/qibolab/components/__init__.py b/src/qibolab/_core/components/__init__.py similarity index 100% rename from src/qibolab/components/__init__.py rename to src/qibolab/_core/components/__init__.py diff --git a/src/qibolab/components/channels.py b/src/qibolab/_core/components/channels.py similarity index 100% rename from src/qibolab/components/channels.py rename to src/qibolab/_core/components/channels.py diff --git a/src/qibolab/components/configs.py b/src/qibolab/_core/components/configs.py similarity index 100% rename from src/qibolab/components/configs.py rename to src/qibolab/_core/components/configs.py diff --git a/src/qibolab/dummy/__init__.py b/src/qibolab/_core/dummy/__init__.py similarity index 100% rename from src/qibolab/dummy/__init__.py rename to src/qibolab/_core/dummy/__init__.py diff --git a/src/qibolab/dummy/parameters.json b/src/qibolab/_core/dummy/parameters.json similarity index 100% rename from src/qibolab/dummy/parameters.json rename to src/qibolab/_core/dummy/parameters.json diff --git a/src/qibolab/dummy/platform.py b/src/qibolab/_core/dummy/platform.py similarity index 100% rename from src/qibolab/dummy/platform.py rename to src/qibolab/_core/dummy/platform.py diff --git a/src/qibolab/execution_parameters.py b/src/qibolab/_core/execution_parameters.py similarity index 100% rename from src/qibolab/execution_parameters.py rename to src/qibolab/_core/execution_parameters.py diff --git a/src/qibolab/identifier.py b/src/qibolab/_core/identifier.py similarity index 100% rename from src/qibolab/identifier.py rename to src/qibolab/_core/identifier.py diff --git a/src/qibolab/instruments/__init__.py b/src/qibolab/_core/instruments/__init__.py similarity index 100% rename from src/qibolab/instruments/__init__.py rename to src/qibolab/_core/instruments/__init__.py diff --git a/src/qibolab/instruments/abstract.py b/src/qibolab/_core/instruments/abstract.py similarity index 100% rename from src/qibolab/instruments/abstract.py rename to src/qibolab/_core/instruments/abstract.py diff --git a/src/qibolab/instruments/bluefors.py b/src/qibolab/_core/instruments/bluefors.py similarity index 100% rename from src/qibolab/instruments/bluefors.py rename to src/qibolab/_core/instruments/bluefors.py diff --git a/src/qibolab/instruments/dummy.py b/src/qibolab/_core/instruments/dummy.py similarity index 100% rename from src/qibolab/instruments/dummy.py rename to src/qibolab/_core/instruments/dummy.py diff --git a/src/qibolab/instruments/erasynth.py b/src/qibolab/_core/instruments/erasynth.py similarity index 100% rename from src/qibolab/instruments/erasynth.py rename to src/qibolab/_core/instruments/erasynth.py diff --git a/src/qibolab/instruments/oscillator.py b/src/qibolab/_core/instruments/oscillator.py similarity index 100% rename from src/qibolab/instruments/oscillator.py rename to src/qibolab/_core/instruments/oscillator.py diff --git a/src/qibolab/instruments/qm/__init__.py b/src/qibolab/_core/instruments/qm/__init__.py similarity index 100% rename from src/qibolab/instruments/qm/__init__.py rename to src/qibolab/_core/instruments/qm/__init__.py diff --git a/src/qibolab/instruments/qm/components/__init__.py b/src/qibolab/_core/instruments/qm/components/__init__.py similarity index 100% rename from src/qibolab/instruments/qm/components/__init__.py rename to src/qibolab/_core/instruments/qm/components/__init__.py diff --git a/src/qibolab/instruments/qm/components/configs.py b/src/qibolab/_core/instruments/qm/components/configs.py similarity index 100% rename from src/qibolab/instruments/qm/components/configs.py rename to src/qibolab/_core/instruments/qm/components/configs.py diff --git a/src/qibolab/instruments/qm/config/__init__.py b/src/qibolab/_core/instruments/qm/config/__init__.py similarity index 100% rename from src/qibolab/instruments/qm/config/__init__.py rename to src/qibolab/_core/instruments/qm/config/__init__.py diff --git a/src/qibolab/instruments/qm/config/config.py b/src/qibolab/_core/instruments/qm/config/config.py similarity index 100% rename from src/qibolab/instruments/qm/config/config.py rename to src/qibolab/_core/instruments/qm/config/config.py diff --git a/src/qibolab/instruments/qm/config/devices.py b/src/qibolab/_core/instruments/qm/config/devices.py similarity index 100% rename from src/qibolab/instruments/qm/config/devices.py rename to src/qibolab/_core/instruments/qm/config/devices.py diff --git a/src/qibolab/instruments/qm/config/elements.py b/src/qibolab/_core/instruments/qm/config/elements.py similarity index 100% rename from src/qibolab/instruments/qm/config/elements.py rename to src/qibolab/_core/instruments/qm/config/elements.py diff --git a/src/qibolab/instruments/qm/config/pulses.py b/src/qibolab/_core/instruments/qm/config/pulses.py similarity index 100% rename from src/qibolab/instruments/qm/config/pulses.py rename to src/qibolab/_core/instruments/qm/config/pulses.py diff --git a/src/qibolab/instruments/qm/controller.py b/src/qibolab/_core/instruments/qm/controller.py similarity index 100% rename from src/qibolab/instruments/qm/controller.py rename to src/qibolab/_core/instruments/qm/controller.py diff --git a/src/qibolab/instruments/qm/program/__init__.py b/src/qibolab/_core/instruments/qm/program/__init__.py similarity index 100% rename from src/qibolab/instruments/qm/program/__init__.py rename to src/qibolab/_core/instruments/qm/program/__init__.py diff --git a/src/qibolab/instruments/qm/program/acquisition.py b/src/qibolab/_core/instruments/qm/program/acquisition.py similarity index 100% rename from src/qibolab/instruments/qm/program/acquisition.py rename to src/qibolab/_core/instruments/qm/program/acquisition.py diff --git a/src/qibolab/instruments/qm/program/arguments.py b/src/qibolab/_core/instruments/qm/program/arguments.py similarity index 100% rename from src/qibolab/instruments/qm/program/arguments.py rename to src/qibolab/_core/instruments/qm/program/arguments.py diff --git a/src/qibolab/instruments/qm/program/instructions.py b/src/qibolab/_core/instruments/qm/program/instructions.py similarity index 100% rename from src/qibolab/instruments/qm/program/instructions.py rename to src/qibolab/_core/instruments/qm/program/instructions.py diff --git a/src/qibolab/instruments/qm/program/sweepers.py b/src/qibolab/_core/instruments/qm/program/sweepers.py similarity index 100% rename from src/qibolab/instruments/qm/program/sweepers.py rename to src/qibolab/_core/instruments/qm/program/sweepers.py diff --git a/src/qibolab/instruments/rohde_schwarz.py b/src/qibolab/_core/instruments/rohde_schwarz.py similarity index 100% rename from src/qibolab/instruments/rohde_schwarz.py rename to src/qibolab/_core/instruments/rohde_schwarz.py diff --git a/src/qibolab/instruments/zhinst/__init__.py b/src/qibolab/_core/instruments/zhinst/__init__.py similarity index 100% rename from src/qibolab/instruments/zhinst/__init__.py rename to src/qibolab/_core/instruments/zhinst/__init__.py diff --git a/src/qibolab/instruments/zhinst/components/__init__.py b/src/qibolab/_core/instruments/zhinst/components/__init__.py similarity index 100% rename from src/qibolab/instruments/zhinst/components/__init__.py rename to src/qibolab/_core/instruments/zhinst/components/__init__.py diff --git a/src/qibolab/instruments/zhinst/components/channel.py b/src/qibolab/_core/instruments/zhinst/components/channel.py similarity index 100% rename from src/qibolab/instruments/zhinst/components/channel.py rename to src/qibolab/_core/instruments/zhinst/components/channel.py diff --git a/src/qibolab/instruments/zhinst/components/configs.py b/src/qibolab/_core/instruments/zhinst/components/configs.py similarity index 100% rename from src/qibolab/instruments/zhinst/components/configs.py rename to src/qibolab/_core/instruments/zhinst/components/configs.py diff --git a/src/qibolab/instruments/zhinst/constants.py b/src/qibolab/_core/instruments/zhinst/constants.py similarity index 100% rename from src/qibolab/instruments/zhinst/constants.py rename to src/qibolab/_core/instruments/zhinst/constants.py diff --git a/src/qibolab/instruments/zhinst/executor.py b/src/qibolab/_core/instruments/zhinst/executor.py similarity index 100% rename from src/qibolab/instruments/zhinst/executor.py rename to src/qibolab/_core/instruments/zhinst/executor.py diff --git a/src/qibolab/instruments/zhinst/pulse.py b/src/qibolab/_core/instruments/zhinst/pulse.py similarity index 100% rename from src/qibolab/instruments/zhinst/pulse.py rename to src/qibolab/_core/instruments/zhinst/pulse.py diff --git a/src/qibolab/instruments/zhinst/sweep.py b/src/qibolab/_core/instruments/zhinst/sweep.py similarity index 100% rename from src/qibolab/instruments/zhinst/sweep.py rename to src/qibolab/_core/instruments/zhinst/sweep.py diff --git a/src/qibolab/native.py b/src/qibolab/_core/native.py similarity index 100% rename from src/qibolab/native.py rename to src/qibolab/_core/native.py diff --git a/src/qibolab/parameters.py b/src/qibolab/_core/parameters.py similarity index 100% rename from src/qibolab/parameters.py rename to src/qibolab/_core/parameters.py diff --git a/src/qibolab/platform/__init__.py b/src/qibolab/_core/platform/__init__.py similarity index 100% rename from src/qibolab/platform/__init__.py rename to src/qibolab/_core/platform/__init__.py diff --git a/src/qibolab/platform/load.py b/src/qibolab/_core/platform/load.py similarity index 100% rename from src/qibolab/platform/load.py rename to src/qibolab/_core/platform/load.py diff --git a/src/qibolab/platform/platform.py b/src/qibolab/_core/platform/platform.py similarity index 100% rename from src/qibolab/platform/platform.py rename to src/qibolab/_core/platform/platform.py diff --git a/src/qibolab/pulses/__init__.py b/src/qibolab/_core/pulses/__init__.py similarity index 100% rename from src/qibolab/pulses/__init__.py rename to src/qibolab/_core/pulses/__init__.py diff --git a/src/qibolab/pulses/envelope.py b/src/qibolab/_core/pulses/envelope.py similarity index 100% rename from src/qibolab/pulses/envelope.py rename to src/qibolab/_core/pulses/envelope.py diff --git a/src/qibolab/pulses/modulation.py b/src/qibolab/_core/pulses/modulation.py similarity index 100% rename from src/qibolab/pulses/modulation.py rename to src/qibolab/_core/pulses/modulation.py diff --git a/src/qibolab/pulses/plot.py b/src/qibolab/_core/pulses/plot.py similarity index 100% rename from src/qibolab/pulses/plot.py rename to src/qibolab/_core/pulses/plot.py diff --git a/src/qibolab/pulses/pulse.py b/src/qibolab/_core/pulses/pulse.py similarity index 100% rename from src/qibolab/pulses/pulse.py rename to src/qibolab/_core/pulses/pulse.py diff --git a/src/qibolab/qubits.py b/src/qibolab/_core/qubits.py similarity index 100% rename from src/qibolab/qubits.py rename to src/qibolab/_core/qubits.py diff --git a/src/qibolab/sequence.py b/src/qibolab/_core/sequence.py similarity index 100% rename from src/qibolab/sequence.py rename to src/qibolab/_core/sequence.py diff --git a/src/qibolab/serialize.py b/src/qibolab/_core/serialize.py similarity index 100% rename from src/qibolab/serialize.py rename to src/qibolab/_core/serialize.py diff --git a/src/qibolab/sweeper.py b/src/qibolab/_core/sweeper.py similarity index 100% rename from src/qibolab/sweeper.py rename to src/qibolab/_core/sweeper.py diff --git a/src/qibolab/unrolling.py b/src/qibolab/_core/unrolling.py similarity index 100% rename from src/qibolab/unrolling.py rename to src/qibolab/_core/unrolling.py diff --git a/src/qibolab/version.py b/src/qibolab/_core/version.py similarity index 100% rename from src/qibolab/version.py rename to src/qibolab/_core/version.py From 434088f45e35aa1d31fbe2412f002452d266e8b6 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 16 Sep 2024 14:54:44 +0200 Subject: [PATCH 0954/1006] fix: Correct imports to adapt to core subpackage --- src/qibolab/__init__.py | 4 +++- src/qibolab/_core/__init__.py | 7 +++--- src/qibolab/_core/backends.py | 11 +++++----- src/qibolab/_core/compilers/__init__.py | 4 +++- src/qibolab/_core/compilers/compiler.py | 10 ++++----- src/qibolab/_core/compilers/default.py | 8 +++---- src/qibolab/_core/components/channels.py | 4 ++-- src/qibolab/_core/components/configs.py | 2 +- src/qibolab/_core/execution_parameters.py | 4 ++-- src/qibolab/_core/instruments/abstract.py | 14 ++++++------ src/qibolab/_core/parameters.py | 12 +++++----- src/qibolab/_core/platform/platform.py | 22 +++++++++---------- src/qibolab/_core/pulses/envelope.py | 2 +- src/qibolab/_core/pulses/pulse.py | 3 +-- src/qibolab/_core/unrolling.py | 3 +-- src/qibolab/{_core/version.py => _version.py} | 0 16 files changed, 57 insertions(+), 53 deletions(-) rename src/qibolab/{_core/version.py => _version.py} (100%) diff --git a/src/qibolab/__init__.py b/src/qibolab/__init__.py index 2a5f53830f..77bae04c3f 100644 --- a/src/qibolab/__init__.py +++ b/src/qibolab/__init__.py @@ -1,5 +1,7 @@ -from . import _core +from . import _core, _version from ._core import * +from ._version import * __all__ = [] __all__ += _core.__all__ +__all__ += _version.__all__ diff --git a/src/qibolab/_core/__init__.py b/src/qibolab/_core/__init__.py index d1f6ab9011..f555015379 100644 --- a/src/qibolab/_core/__init__.py +++ b/src/qibolab/_core/__init__.py @@ -6,15 +6,16 @@ pulses, sequence, sweeper, - version, ) from .backends import * +from .components import * from .execution_parameters import * from .platform import * from .pulses import * from .sequence import * from .sweeper import * -from .version import * + +# from .version import * __all__ = [] __all__ += backends.__all__ @@ -24,4 +25,4 @@ __all__ += pulses.__all__ __all__ += sequence.__all__ __all__ += sweeper.__all__ -__all__ += version.__all__ +# __all__ += version.__all__ diff --git a/src/qibolab/_core/backends.py b/src/qibolab/_core/backends.py index 0a9928e450..2992748804 100644 --- a/src/qibolab/_core/backends.py +++ b/src/qibolab/_core/backends.py @@ -5,11 +5,12 @@ from qibo.models import Circuit from qibo.result import MeasurementOutcomes -from qibolab.compilers import Compiler -from qibolab.execution_parameters import ExecutionParameters -from qibolab.platform import Platform, create_platform -from qibolab.platform.load import available_platforms -from qibolab.version import __version__ as qibolab_version +from qibolab._version import __version__ as qibolab_version + +from .compilers import Compiler +from .execution_parameters import ExecutionParameters +from .platform import Platform, create_platform +from .platform.load import available_platforms __all__ = ["MetaBackend", "QibolabBackend"] diff --git a/src/qibolab/_core/compilers/__init__.py b/src/qibolab/_core/compilers/__init__.py index 20bd73cd94..80aa9aee9b 100644 --- a/src/qibolab/_core/compilers/__init__.py +++ b/src/qibolab/_core/compilers/__init__.py @@ -1 +1,3 @@ -from qibolab.compilers.compiler import Compiler +from .compiler import Compiler + +__all__ = ["Compiler"] diff --git a/src/qibolab/_core/compilers/compiler.py b/src/qibolab/_core/compilers/compiler.py index 9031901be3..c9c59462ae 100644 --- a/src/qibolab/_core/compilers/compiler.py +++ b/src/qibolab/_core/compilers/compiler.py @@ -4,7 +4,11 @@ from qibo import Circuit, gates -from qibolab.compilers.default import ( +from ..identifier import ChannelId, QubitId +from ..platform import Platform +from ..pulses import Delay +from ..sequence import PulseSequence +from .default import ( align_rule, cnot_rule, cz_rule, @@ -15,10 +19,6 @@ rz_rule, z_rule, ) -from qibolab.identifier import ChannelId, QubitId -from qibolab.platform import Platform -from qibolab.pulses import Delay -from qibolab.sequence import PulseSequence Rule = Callable[..., PulseSequence] """Compiler rule.""" diff --git a/src/qibolab/_core/compilers/default.py b/src/qibolab/_core/compilers/default.py index d9e5aaa5ea..a6893d8589 100644 --- a/src/qibolab/_core/compilers/default.py +++ b/src/qibolab/_core/compilers/default.py @@ -8,10 +8,10 @@ import numpy as np from qibo.gates import Align, Gate -from qibolab.native import SingleQubitNatives, TwoQubitNatives -from qibolab.pulses import Delay, VirtualZ -from qibolab.qubits import Qubit -from qibolab.sequence import PulseSequence +from ..native import SingleQubitNatives, TwoQubitNatives +from ..pulses import Delay, VirtualZ +from ..qubits import Qubit +from ..sequence import PulseSequence def z_rule(gate: Gate, qubit: Qubit) -> PulseSequence: diff --git a/src/qibolab/_core/components/channels.py b/src/qibolab/_core/components/channels.py index 1740019c03..b2c8be26a9 100644 --- a/src/qibolab/_core/components/channels.py +++ b/src/qibolab/_core/components/channels.py @@ -20,8 +20,8 @@ from typing import Optional -from qibolab.identifier import ChannelId -from qibolab.serialize import Model +from ..identifier import ChannelId +from ..serialize import Model __all__ = ["Channel", "DcChannel", "IqChannel", "AcquisitionChannel"] diff --git a/src/qibolab/_core/components/configs.py b/src/qibolab/_core/components/configs.py index 7055d87153..31caab3374 100644 --- a/src/qibolab/_core/components/configs.py +++ b/src/qibolab/_core/components/configs.py @@ -11,7 +11,7 @@ from pydantic import Field -from qibolab.serialize import Model, NdArray +from ..serialize import Model, NdArray __all__ = [ "DcConfig", diff --git a/src/qibolab/_core/execution_parameters.py b/src/qibolab/_core/execution_parameters.py index 35689f522d..54c7518525 100644 --- a/src/qibolab/_core/execution_parameters.py +++ b/src/qibolab/_core/execution_parameters.py @@ -1,8 +1,8 @@ from enum import Enum, auto from typing import Any, Optional -from qibolab.serialize import Model -from qibolab.sweeper import ParallelSweepers +from .serialize import Model +from .sweeper import ParallelSweepers __all__ = ["AcquisitionType", "AveragingMode", "ExecutionParameters"] diff --git a/src/qibolab/_core/instruments/abstract.py b/src/qibolab/_core/instruments/abstract.py index 8bd18861a4..01c447aa4d 100644 --- a/src/qibolab/_core/instruments/abstract.py +++ b/src/qibolab/_core/instruments/abstract.py @@ -3,13 +3,13 @@ from pydantic import ConfigDict, Field -from qibolab.components import Config -from qibolab.components.channels import Channel -from qibolab.execution_parameters import ExecutionParameters -from qibolab.identifier import ChannelId, Result -from qibolab.sequence import PulseSequence -from qibolab.serialize import Model -from qibolab.sweeper import ParallelSweepers +from ..components import Config +from ..components.channels import Channel +from ..execution_parameters import ExecutionParameters +from ..identifier import ChannelId, Result +from ..sequence import PulseSequence +from ..serialize import Model +from ..sweeper import ParallelSweepers InstrumentId = str diff --git a/src/qibolab/_core/parameters.py b/src/qibolab/_core/parameters.py index c268f9e5ff..7b7b3ef325 100644 --- a/src/qibolab/_core/parameters.py +++ b/src/qibolab/_core/parameters.py @@ -10,12 +10,12 @@ from pydantic import BeforeValidator, Field, PlainSerializer, TypeAdapter from pydantic_core import core_schema -from qibolab.components import ChannelConfig, Config -from qibolab.execution_parameters import ConfigUpdate, ExecutionParameters -from qibolab.identifier import QubitId, QubitPairId -from qibolab.native import SingleQubitNatives, TwoQubitNatives -from qibolab.serialize import Model, replace -from qibolab.unrolling import Bounds +from .components import ChannelConfig, Config +from .execution_parameters import ConfigUpdate, ExecutionParameters +from .identifier import QubitId, QubitPairId +from .native import SingleQubitNatives, TwoQubitNatives +from .serialize import Model, replace +from .unrolling import Bounds def update_configs(configs: dict[str, Config], updates: list[ConfigUpdate]): diff --git a/src/qibolab/_core/platform/platform.py b/src/qibolab/_core/platform/platform.py index 9e2e90fcc7..caf36126a0 100644 --- a/src/qibolab/_core/platform/platform.py +++ b/src/qibolab/_core/platform/platform.py @@ -7,17 +7,17 @@ from qibo.config import log, raise_error -from qibolab.components import Config -from qibolab.components.channels import Channel -from qibolab.execution_parameters import ExecutionParameters -from qibolab.identifier import ChannelId, QubitId, QubitPairId, Result -from qibolab.instruments.abstract import Controller, Instrument, InstrumentId -from qibolab.parameters import NativeGates, Parameters, Settings, update_configs -from qibolab.pulses import PulseId -from qibolab.qubits import Qubit -from qibolab.sequence import PulseSequence -from qibolab.sweeper import ParallelSweepers -from qibolab.unrolling import Bounds, batch +from ..components import Config +from ..components.channels import Channel +from ..execution_parameters import ExecutionParameters +from ..identifier import ChannelId, QubitId, QubitPairId, Result +from ..instruments.abstract import Controller, Instrument, InstrumentId +from ..parameters import NativeGates, Parameters, Settings, update_configs +from ..pulses import PulseId +from ..qubits import Qubit +from ..sequence import PulseSequence +from ..sweeper import ParallelSweepers +from ..unrolling import Bounds, batch QubitMap = dict[QubitId, Qubit] QubitPairMap = list[QubitPairId] diff --git a/src/qibolab/_core/pulses/envelope.py b/src/qibolab/_core/pulses/envelope.py index 0eb06cae3b..24f1083c08 100644 --- a/src/qibolab/_core/pulses/envelope.py +++ b/src/qibolab/_core/pulses/envelope.py @@ -9,7 +9,7 @@ from scipy.signal import lfilter from scipy.signal.windows import gaussian -from qibolab.serialize import Model, NdArray, eq +from ..serialize import Model, NdArray, eq __all__ = [ "Waveform", diff --git a/src/qibolab/_core/pulses/pulse.py b/src/qibolab/_core/pulses/pulse.py index 849be371aa..fcec375388 100644 --- a/src/qibolab/_core/pulses/pulse.py +++ b/src/qibolab/_core/pulses/pulse.py @@ -5,8 +5,7 @@ import numpy as np from pydantic import Field -from qibolab.serialize import Model - +from ..serialize import Model from .envelope import Envelope, IqWaveform, Waveform __all__ = [ diff --git a/src/qibolab/_core/unrolling.py b/src/qibolab/_core/unrolling.py index af1bdf40bb..f7ccf4eba1 100644 --- a/src/qibolab/_core/unrolling.py +++ b/src/qibolab/_core/unrolling.py @@ -9,8 +9,7 @@ from pydantic.fields import FieldInfo -from qibolab.components.configs import Config - +from .components.configs import Config from .pulses import Delay, Pulse from .pulses.envelope import Rectangular from .sequence import PulseSequence diff --git a/src/qibolab/_core/version.py b/src/qibolab/_version.py similarity index 100% rename from src/qibolab/_core/version.py rename to src/qibolab/_version.py From 9af9fd364a99db442a13634795e86f4a7762ae63 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 16 Sep 2024 15:59:51 +0200 Subject: [PATCH 0955/1006] fix: Fix qm imports of other qibolab modules --- src/qibolab/_core/instruments/oscillator.py | 2 +- .../instruments/qm/components/configs.py | 2 +- .../_core/instruments/qm/config/config.py | 10 +++++----- .../_core/instruments/qm/config/devices.py | 2 +- .../_core/instruments/qm/config/elements.py | 2 +- .../_core/instruments/qm/config/pulses.py | 4 ++-- .../_core/instruments/qm/controller.py | 20 +++++++++---------- .../instruments/qm/program/acquisition.py | 2 +- .../_core/instruments/qm/program/arguments.py | 6 +++--- .../instruments/qm/program/instructions.py | 6 +++--- .../_core/instruments/qm/program/sweepers.py | 6 +++--- 11 files changed, 31 insertions(+), 31 deletions(-) diff --git a/src/qibolab/_core/instruments/oscillator.py b/src/qibolab/_core/instruments/oscillator.py index 39fdc5b382..917e1025ce 100644 --- a/src/qibolab/_core/instruments/oscillator.py +++ b/src/qibolab/_core/instruments/oscillator.py @@ -3,7 +3,7 @@ from pydantic import Field -from qibolab.instruments.abstract import Instrument, InstrumentSettings +from .abstract import Instrument, InstrumentSettings RECONNECTION_ATTEMPTS = 3 """Number of times to attempt connecting to instrument in case of failure.""" diff --git a/src/qibolab/_core/instruments/qm/components/configs.py b/src/qibolab/_core/instruments/qm/components/configs.py index 717dbf7ec8..0ffbccf7e9 100644 --- a/src/qibolab/_core/instruments/qm/components/configs.py +++ b/src/qibolab/_core/instruments/qm/components/configs.py @@ -2,7 +2,7 @@ from pydantic import Field -from qibolab.components import AcquisitionConfig, DcConfig +from qibolab._core.components import AcquisitionConfig, DcConfig __all__ = ["OpxOutputConfig", "QmAcquisitionConfig", "QmConfigs"] diff --git a/src/qibolab/_core/instruments/qm/config/config.py b/src/qibolab/_core/instruments/qm/config/config.py index 3e05f284ee..c63bf99097 100644 --- a/src/qibolab/_core/instruments/qm/config/config.py +++ b/src/qibolab/_core/instruments/qm/config/config.py @@ -1,11 +1,11 @@ from dataclasses import dataclass, field from typing import Optional, Union -from qibolab.components.channels import AcquisitionChannel, DcChannel, IqChannel -from qibolab.components.configs import IqConfig, OscillatorConfig -from qibolab.identifier import ChannelId -from qibolab.pulses import Pulse -from qibolab.pulses.pulse import Readout +from qibolab._core.components.channels import AcquisitionChannel, DcChannel, IqChannel +from qibolab._core.components.configs import IqConfig, OscillatorConfig +from qibolab._core.identifier import ChannelId +from qibolab._core.pulses import Pulse +from qibolab._core.pulses.pulse import Readout from ..components import OpxOutputConfig, QmAcquisitionConfig from .devices import AnalogOutput, Controller, Octave, OctaveInput, OctaveOutput diff --git a/src/qibolab/_core/instruments/qm/config/devices.py b/src/qibolab/_core/instruments/qm/config/devices.py index 6210e34cf3..8b1128b2b0 100644 --- a/src/qibolab/_core/instruments/qm/config/devices.py +++ b/src/qibolab/_core/instruments/qm/config/devices.py @@ -1,7 +1,7 @@ from dataclasses import dataclass, field from typing import Any, Generic, TypeVar -from qibolab.components.configs import OscillatorConfig +from qibolab._core.components.configs import OscillatorConfig from ..components import OpxOutputConfig, QmAcquisitionConfig diff --git a/src/qibolab/_core/instruments/qm/config/elements.py b/src/qibolab/_core/instruments/qm/config/elements.py index 526dd831f2..abca3e12c3 100644 --- a/src/qibolab/_core/instruments/qm/config/elements.py +++ b/src/qibolab/_core/instruments/qm/config/elements.py @@ -3,7 +3,7 @@ import numpy as np -from qibolab.components.channels import Channel +from qibolab._core.components.channels import Channel __all__ = ["DcElement", "RfOctaveElement", "AcquireOctaveElement", "Element"] diff --git a/src/qibolab/_core/instruments/qm/config/pulses.py b/src/qibolab/_core/instruments/qm/config/pulses.py index 34340e9df3..983dc4d2b0 100644 --- a/src/qibolab/_core/instruments/qm/config/pulses.py +++ b/src/qibolab/_core/instruments/qm/config/pulses.py @@ -3,8 +3,8 @@ import numpy as np -from qibolab.pulses import Pulse, Rectangular -from qibolab.pulses.modulation import rotate, wrap_phase +from qibolab._core.pulses import Pulse, Rectangular +from qibolab._core.pulses.modulation import rotate, wrap_phase SAMPLING_RATE = 1 """Sampling rate of Quantum Machines OPX+ in GSps.""" diff --git a/src/qibolab/_core/instruments/qm/controller.py b/src/qibolab/_core/instruments/qm/controller.py index 9ec6eafe0c..93d984f1f0 100644 --- a/src/qibolab/_core/instruments/qm/controller.py +++ b/src/qibolab/_core/instruments/qm/controller.py @@ -13,19 +13,19 @@ from qm.simulate.credentials import create_credentials from qualang_tools.simulator_tools import create_simulator_controller_connections -from qibolab.components import AcquisitionChannel, Config, DcChannel, IqChannel -from qibolab.components.configs import IqConfig, OscillatorConfig -from qibolab.execution_parameters import ExecutionParameters -from qibolab.identifier import ChannelId -from qibolab.instruments.abstract import Controller -from qibolab.instruments.qm.components.configs import ( +from qibolab._core.components import AcquisitionChannel, Config, DcChannel, IqChannel +from qibolab._core.components.configs import IqConfig, OscillatorConfig +from qibolab._core.execution_parameters import ExecutionParameters +from qibolab._core.identifier import ChannelId +from qibolab._core.instruments.abstract import Controller +from qibolab._core.instruments.qm.components.configs import ( OpxOutputConfig, QmAcquisitionConfig, ) -from qibolab.pulses import Acquisition, Align, Delay, Pulse, Readout -from qibolab.sequence import PulseSequence -from qibolab.sweeper import ParallelSweepers, Parameter, Sweeper -from qibolab.unrolling import Bounds, unroll_sequences +from qibolab._core.pulses import Acquisition, Align, Delay, Pulse, Readout +from qibolab._core.sequence import PulseSequence +from qibolab._core.sweeper import ParallelSweepers, Parameter, Sweeper +from qibolab._core.unrolling import Bounds, unroll_sequences from .config import SAMPLING_RATE, Configuration, operation from .program import ExecutionArguments, create_acquisition, program diff --git a/src/qibolab/_core/instruments/qm/program/acquisition.py b/src/qibolab/_core/instruments/qm/program/acquisition.py index c146ac780b..b6c8c5520f 100644 --- a/src/qibolab/_core/instruments/qm/program/acquisition.py +++ b/src/qibolab/_core/instruments/qm/program/acquisition.py @@ -9,7 +9,7 @@ from qualang_tools.addons.variables import assign_variables_to_element from qualang_tools.units import unit -from qibolab.execution_parameters import ( +from qibolab._core.execution_parameters import ( AcquisitionType, AveragingMode, ExecutionParameters, diff --git a/src/qibolab/_core/instruments/qm/program/arguments.py b/src/qibolab/_core/instruments/qm/program/arguments.py index bea07652f2..4f93f70dfe 100644 --- a/src/qibolab/_core/instruments/qm/program/arguments.py +++ b/src/qibolab/_core/instruments/qm/program/arguments.py @@ -4,9 +4,9 @@ from qm.qua._dsl import _Variable # for type declaration only -from qibolab.identifier import ChannelId -from qibolab.pulses import Pulse -from qibolab.sequence import PulseSequence +from qibolab._core.identifier import ChannelId +from qibolab._core.pulses import Pulse +from qibolab._core.sequence import PulseSequence from .acquisition import Acquisitions diff --git a/src/qibolab/_core/instruments/qm/program/instructions.py b/src/qibolab/_core/instruments/qm/program/instructions.py index 75030fc578..b19333b0fe 100644 --- a/src/qibolab/_core/instruments/qm/program/instructions.py +++ b/src/qibolab/_core/instruments/qm/program/instructions.py @@ -4,9 +4,9 @@ from qm.qua import declare, fixed, for_ from qualang_tools.loops import from_array -from qibolab.execution_parameters import AcquisitionType, ExecutionParameters -from qibolab.pulses import Align, Delay, Pulse, Readout, VirtualZ -from qibolab.sweeper import ParallelSweepers, Parameter, Sweeper +from qibolab._core.execution_parameters import AcquisitionType, ExecutionParameters +from qibolab._core.pulses import Align, Delay, Pulse, Readout, VirtualZ +from qibolab._core.sweeper import ParallelSweepers, Parameter, Sweeper from ..config import operation from .acquisition import Acquisition diff --git a/src/qibolab/_core/instruments/qm/program/sweepers.py b/src/qibolab/_core/instruments/qm/program/sweepers.py index 92d55e92fe..64fb0680f7 100644 --- a/src/qibolab/_core/instruments/qm/program/sweepers.py +++ b/src/qibolab/_core/instruments/qm/program/sweepers.py @@ -3,9 +3,9 @@ from qm import qua from qm.qua._dsl import _Variable # for type declaration only -from qibolab.components import Channel, Config -from qibolab.identifier import ChannelId -from qibolab.sweeper import Parameter +from qibolab._core.components import Channel, Config +from qibolab._core.identifier import ChannelId +from qibolab._core.sweeper import Parameter from .arguments import ExecutionArguments, Parameters From aa872548e444e7bb139921fa4d8a854acbf5bd89 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 16 Sep 2024 16:00:46 +0200 Subject: [PATCH 0956/1006] fix: Add instruments public subpackage --- src/qibolab/__init__.py | 3 ++- src/qibolab/instruments/__init__.py | 0 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 src/qibolab/instruments/__init__.py diff --git a/src/qibolab/__init__.py b/src/qibolab/__init__.py index 77bae04c3f..3fe38ab632 100644 --- a/src/qibolab/__init__.py +++ b/src/qibolab/__init__.py @@ -1,7 +1,8 @@ -from . import _core, _version +from . import _core, _version, instruments from ._core import * from ._version import * __all__ = [] __all__ += _core.__all__ __all__ += _version.__all__ +__all__ += ["instruments"] diff --git a/src/qibolab/instruments/__init__.py b/src/qibolab/instruments/__init__.py new file mode 100644 index 0000000000..e69de29bb2 From db71cc5548a56576a09fdb4683fbfab49cbebb93 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 16 Sep 2024 16:01:38 +0200 Subject: [PATCH 0957/1006] feat: Expose qm drivers --- src/qibolab/_core/instruments/qm/__init__.py | 5 +++++ src/qibolab/instruments/qm.py | 10 ++++++++++ 2 files changed, 15 insertions(+) create mode 100644 src/qibolab/instruments/qm.py diff --git a/src/qibolab/_core/instruments/qm/__init__.py b/src/qibolab/_core/instruments/qm/__init__.py index bb7e1fa795..c479f96259 100644 --- a/src/qibolab/_core/instruments/qm/__init__.py +++ b/src/qibolab/_core/instruments/qm/__init__.py @@ -1,2 +1,7 @@ +from . import components, controller from .components import * from .controller import * + +__all__ = [] +__all__ += components.__all__ +__all__ += controller.__all__ diff --git a/src/qibolab/instruments/qm.py b/src/qibolab/instruments/qm.py new file mode 100644 index 0000000000..31d08d46df --- /dev/null +++ b/src/qibolab/instruments/qm.py @@ -0,0 +1,10 @@ +"""Quantum machines drivers. + +https://quantum-machines.co/ +""" + +from qibolab._core.instruments import qm +from qibolab._core.instruments.qm import * # noqa: F403 + +__all__ = [] +__all__ += qm.__all__ From 8d511affb76923115a53494715797affd45b97e3 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 16 Sep 2024 16:01:53 +0200 Subject: [PATCH 0958/1006] feat: Expose era drivers --- src/qibolab/_core/instruments/erasynth.py | 9 +++++++-- src/qibolab/instruments/era.py | 10 ++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 src/qibolab/instruments/era.py diff --git a/src/qibolab/_core/instruments/erasynth.py b/src/qibolab/_core/instruments/erasynth.py index 9558b3d7f5..cde25be864 100644 --- a/src/qibolab/_core/instruments/erasynth.py +++ b/src/qibolab/_core/instruments/erasynth.py @@ -4,7 +4,12 @@ from qcodes_contrib_drivers.drivers.ERAInstruments import ERASynthPlusPlus from qibo.config import log -from qibolab.instruments.oscillator import LocalOscillator, LocalOscillatorSettings +from qibolab._core.instruments.oscillator import ( + LocalOscillator, + LocalOscillatorSettings, +) + +__all__ = ["ERASynth"] RECONNECTION_ATTEMPTS = 10 """Number of times to attempt sending requests to the web server in case of @@ -117,7 +122,7 @@ def close(self): self.off() -class ERA(LocalOscillator): +class ERASynth(LocalOscillator): """Driver to control the ERAsynth++ local oscillator. This driver is using: diff --git a/src/qibolab/instruments/era.py b/src/qibolab/instruments/era.py new file mode 100644 index 0000000000..0b8f543ba4 --- /dev/null +++ b/src/qibolab/instruments/era.py @@ -0,0 +1,10 @@ +"""ERA drivers. + +http://erainstruments.com/ +""" + +from qibolab._core.instruments import erasynth +from qibolab._core.instruments.erasynth import * # noqa: F403 + +__all__ = [] +__all__ += erasynth.__all__ From 2885b6bc851bd9b4226980703d84db4aae0b066b Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 16 Sep 2024 16:04:08 +0200 Subject: [PATCH 0959/1006] feat: Expose bluefors drivers --- src/qibolab/_core/instruments/bluefors.py | 4 +++- src/qibolab/instruments/bluefors.py | 10 ++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 src/qibolab/instruments/bluefors.py diff --git a/src/qibolab/_core/instruments/bluefors.py b/src/qibolab/_core/instruments/bluefors.py index 885996feca..98829983c1 100644 --- a/src/qibolab/_core/instruments/bluefors.py +++ b/src/qibolab/_core/instruments/bluefors.py @@ -4,7 +4,9 @@ from pydantic import Field from qibo.config import log -from qibolab.instruments.abstract import Instrument +from qibolab._core.instruments.abstract import Instrument + +__all__ = ["TemperatureController"] class TemperatureController(Instrument): diff --git a/src/qibolab/instruments/bluefors.py b/src/qibolab/instruments/bluefors.py new file mode 100644 index 0000000000..e0b502c2ed --- /dev/null +++ b/src/qibolab/instruments/bluefors.py @@ -0,0 +1,10 @@ +"""Bluefors drivers. + +https://bluefors.com/ +""" + +from qibolab._core.instruments import bluefors +from qibolab._core.instruments.bluefors import * # noqa: F403 + +__all__ = [] +__all__ += bluefors.__all__ From a087997cf1fdeff91b16685b420004080917ca1e Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 16 Sep 2024 16:14:31 +0200 Subject: [PATCH 0960/1006] feat: Expose rohde & schwarz drivers --- src/qibolab/_core/instruments/rohde_schwarz.py | 4 +++- src/qibolab/instruments/rohde_schwarz.py | 10 ++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 src/qibolab/instruments/rohde_schwarz.py diff --git a/src/qibolab/_core/instruments/rohde_schwarz.py b/src/qibolab/_core/instruments/rohde_schwarz.py index 3a4e61020e..2abf802a43 100644 --- a/src/qibolab/_core/instruments/rohde_schwarz.py +++ b/src/qibolab/_core/instruments/rohde_schwarz.py @@ -1,6 +1,8 @@ import qcodes.instrument_drivers.rohde_schwarz.SGS100A as LO_SGS100A -from qibolab.instruments.oscillator import LocalOscillator +from qibolab._core.instruments.oscillator import LocalOscillator + +__all__ = ["SGS100A"] class SGS100A(LocalOscillator): diff --git a/src/qibolab/instruments/rohde_schwarz.py b/src/qibolab/instruments/rohde_schwarz.py new file mode 100644 index 0000000000..b0ebca85f5 --- /dev/null +++ b/src/qibolab/instruments/rohde_schwarz.py @@ -0,0 +1,10 @@ +"""Rohde & Schwarz drivers. + +https://www.rohde-schwarz.com/ +""" + +from qibolab._core.instruments import rohde_schwarz +from qibolab._core.instruments.rohde_schwarz import * # noqa: F403 + +__all__ = [] +__all__ += rohde_schwarz.__all__ From 40186d6e2c53a69d2019b9e1a9e7c12134d37ba8 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 16 Sep 2024 16:14:52 +0200 Subject: [PATCH 0961/1006] feat: Expose drivers for the dummy instruments --- src/qibolab/_core/instruments/dummy.py | 17 ++++++++++------- src/qibolab/instruments/dummy.py | 10 ++++++++++ 2 files changed, 20 insertions(+), 7 deletions(-) create mode 100644 src/qibolab/instruments/dummy.py diff --git a/src/qibolab/_core/instruments/dummy.py b/src/qibolab/_core/instruments/dummy.py index a289e8485b..94a9fb29f0 100644 --- a/src/qibolab/_core/instruments/dummy.py +++ b/src/qibolab/_core/instruments/dummy.py @@ -2,13 +2,13 @@ from pydantic import Field from qibo.config import log -from qibolab import AcquisitionType, AveragingMode, ExecutionParameters -from qibolab.components.channels import Channel -from qibolab.identifier import ChannelId -from qibolab.pulses.pulse import Acquisition -from qibolab.sequence import PulseSequence -from qibolab.sweeper import ParallelSweepers -from qibolab.unrolling import Bounds +from qibolab._core import AcquisitionType, AveragingMode, ExecutionParameters +from qibolab._core.components.channels import Channel +from qibolab._core.identifier import ChannelId +from qibolab._core.pulses.pulse import Acquisition +from qibolab._core.sequence import PulseSequence +from qibolab._core.sweeper import ParallelSweepers +from qibolab._core.unrolling import Bounds from ..components import Config from .abstract import Controller @@ -18,6 +18,9 @@ BOUNDS = Bounds(waveforms=1, readout=1, instructions=1) +__all__ = ["DummyLocalOscillator", "DummyInstrument"] + + class DummyDevice: """Dummy device that does nothing but follows the QCoDeS interface. diff --git a/src/qibolab/instruments/dummy.py b/src/qibolab/instruments/dummy.py new file mode 100644 index 0000000000..9a6f812e06 --- /dev/null +++ b/src/qibolab/instruments/dummy.py @@ -0,0 +1,10 @@ +"""Dummy drivers. + +Define instruments mainly used for testing purposes. +""" + +from qibolab._core.instruments import dummy +from qibolab._core.instruments.dummy import * # noqa: F403 + +__all__ = [] +__all__ += dummy.__all__ From 8b594ca660e9de1f94a9d5c6b02053b007f294e4 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 16 Sep 2024 16:27:03 +0200 Subject: [PATCH 0962/1006] fix: Fix import in C API --- capi/src/wrapper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/capi/src/wrapper.py b/capi/src/wrapper.py index e08071d66c..9fc894554a 100644 --- a/capi/src/wrapper.py +++ b/capi/src/wrapper.py @@ -1,7 +1,7 @@ # This file is part of from cqibolab import ffi -from qibolab.backends import execute_qasm as py_execute_qasm +from qibolab._core.backends import execute_qasm as py_execute_qasm @ffi.def_extern() From f22c164f2c370b8199f9a16900c9bd5fd1fd44ec Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 16 Sep 2024 16:29:40 +0200 Subject: [PATCH 0963/1006] fix: Remove unneeded scoped import --- src/qibolab/_core/backends.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/qibolab/_core/backends.py b/src/qibolab/_core/backends.py index 2992748804..b455f24fff 100644 --- a/src/qibolab/_core/backends.py +++ b/src/qibolab/_core/backends.py @@ -28,8 +28,6 @@ def execute_qasm(circuit: str, platform, initial_state=None, nshots=1000): Returns: ``MeasurementOutcomes`` object containing the results acquired from the execution. """ - from qibolab.backends import QibolabBackend - circuit = Circuit.from_qasm(circuit) return QibolabBackend(platform).execute_circuit( circuit, initial_state=initial_state, nshots=nshots From 1b25fc7d49f33b8d3133a102a805b7aa2cc9dad2 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 16 Sep 2024 16:34:59 +0200 Subject: [PATCH 0964/1006] fix: Remove further unneeded scoped import --- src/qibolab/_core/backends.py | 2 -- src/qibolab/_core/platform/load.py | 4 ++-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/qibolab/_core/backends.py b/src/qibolab/_core/backends.py index b455f24fff..577b5cc5bd 100644 --- a/src/qibolab/_core/backends.py +++ b/src/qibolab/_core/backends.py @@ -176,8 +176,6 @@ def load(platform: str): Returns: qibo.backends.abstract.Backend: The loaded backend. """ - from qibolab.backends import QibolabBackend - return QibolabBackend(platform=platform) def list_available(self) -> dict: diff --git a/src/qibolab/_core/platform/load.py b/src/qibolab/_core/platform/load.py index 0827569d8c..6dd46193c4 100644 --- a/src/qibolab/_core/platform/load.py +++ b/src/qibolab/_core/platform/load.py @@ -4,6 +4,8 @@ from qibo.config import raise_error +from qibolab._core.dummy import create_dummy + from .platform import Platform PLATFORM = "platform.py" @@ -56,8 +58,6 @@ def create_platform(name: str) -> Platform: The plaform class. """ if name == "dummy": - from qibolab.dummy import create_dummy - return create_dummy() return _load(_search(name, _platforms_paths())) From af3a9e403badc4e6613d60791baa118c187be9ec Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 16 Sep 2024 16:43:09 +0200 Subject: [PATCH 0965/1006] fix: Redirect leftover imports --- src/qibolab/_core/dummy/platform.py | 8 ++++---- src/qibolab/_core/platform/platform.py | 5 +---- src/qibolab/_core/pulses/plot.py | 2 +- src/qibolab/_core/sweeper.py | 5 +---- 4 files changed, 7 insertions(+), 13 deletions(-) diff --git a/src/qibolab/_core/dummy/platform.py b/src/qibolab/_core/dummy/platform.py index c6b3fa17b3..e4c40330a8 100644 --- a/src/qibolab/_core/dummy/platform.py +++ b/src/qibolab/_core/dummy/platform.py @@ -1,9 +1,9 @@ import pathlib -from qibolab.components import AcquisitionChannel, DcChannel, IqChannel -from qibolab.instruments.dummy import DummyInstrument, DummyLocalOscillator -from qibolab.platform import Platform -from qibolab.qubits import Qubit +from qibolab._core.components import AcquisitionChannel, DcChannel, IqChannel +from qibolab._core.instruments.dummy import DummyInstrument, DummyLocalOscillator +from qibolab._core.platform import Platform +from qibolab._core.qubits import Qubit FOLDER = pathlib.Path(__file__).parent diff --git a/src/qibolab/_core/platform/platform.py b/src/qibolab/_core/platform/platform.py index caf36126a0..48278dab4a 100644 --- a/src/qibolab/_core/platform/platform.py +++ b/src/qibolab/_core/platform/platform.py @@ -239,10 +239,7 @@ def execute( .. testcode:: import numpy as np - from qibolab.dummy import create_dummy - from qibolab.sweeper import Sweeper, Parameter - from qibolab.sequence import PulseSequence - from qibolab.execution_parameters import ExecutionParameters + from qibolab import ExecutionParameters, Parameter, PulseSequence, Sweeper, create_dummy platform = create_dummy() diff --git a/src/qibolab/_core/pulses/plot.py b/src/qibolab/_core/pulses/plot.py index e3c802c315..d169a21107 100644 --- a/src/qibolab/_core/pulses/plot.py +++ b/src/qibolab/_core/pulses/plot.py @@ -6,7 +6,7 @@ import matplotlib.pyplot as plt import numpy as np -from qibolab.sequence import PulseSequence +from qibolab._core.sequence import PulseSequence from .envelope import Waveform from .modulation import modulate diff --git a/src/qibolab/_core/sweeper.py b/src/qibolab/_core/sweeper.py index 585e07fb8d..a60b6e2577 100644 --- a/src/qibolab/_core/sweeper.py +++ b/src/qibolab/_core/sweeper.py @@ -54,10 +54,7 @@ class Sweeper(Model): .. testcode:: import numpy as np - from qibolab.dummy import create_dummy - from qibolab.sweeper import Sweeper, Parameter - from qibolab.sequence import PulseSequence - from qibolab import ExecutionParameters + from qibolab import ExecutionParameters, Parameter, PulseSequence, Sweeper, create_dummy platform = create_dummy() From a26812d6653d96ffa85fff487dc7b963eee7e832 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 16 Sep 2024 16:48:26 +0200 Subject: [PATCH 0966/1006] fix: Prevent circular imports --- src/qibolab/_core/instruments/dummy.py | 6 +++++- src/qibolab/_core/platform/load.py | 4 ++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/qibolab/_core/instruments/dummy.py b/src/qibolab/_core/instruments/dummy.py index 94a9fb29f0..0a77cc5b33 100644 --- a/src/qibolab/_core/instruments/dummy.py +++ b/src/qibolab/_core/instruments/dummy.py @@ -2,8 +2,12 @@ from pydantic import Field from qibo.config import log -from qibolab._core import AcquisitionType, AveragingMode, ExecutionParameters from qibolab._core.components.channels import Channel +from qibolab._core.execution_parameters import ( + AcquisitionType, + AveragingMode, + ExecutionParameters, +) from qibolab._core.identifier import ChannelId from qibolab._core.pulses.pulse import Acquisition from qibolab._core.sequence import PulseSequence diff --git a/src/qibolab/_core/platform/load.py b/src/qibolab/_core/platform/load.py index 6dd46193c4..2c941e3c6b 100644 --- a/src/qibolab/_core/platform/load.py +++ b/src/qibolab/_core/platform/load.py @@ -4,8 +4,6 @@ from qibo.config import raise_error -from qibolab._core.dummy import create_dummy - from .platform import Platform PLATFORM = "platform.py" @@ -58,6 +56,8 @@ def create_platform(name: str) -> Platform: The plaform class. """ if name == "dummy": + from qibolab._core.dummy import create_dummy + return create_dummy() return _load(_search(name, _platforms_paths())) From 4bc5c507116912b6ce29758d97718a7ed371fca4 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 16 Sep 2024 17:33:16 +0200 Subject: [PATCH 0967/1006] test: Propagate imports redirect in tests --- tests/conftest.py | 6 +++--- tests/dummy_qrc/qm_octave/platform.py | 8 +++---- tests/dummy_qrc/zurich/platform.py | 8 +++---- tests/instruments/test_bluefors.py | 2 +- tests/instruments/test_erasynth.py | 4 ++-- tests/instruments/test_oscillator.py | 2 +- tests/instruments/test_rohde_schwarz.py | 2 +- tests/integration/test_sequence.py | 4 ++-- tests/pulses/test_envelope.py | 2 +- tests/pulses/test_modulation.py | 4 ++-- tests/pulses/test_plot.py | 6 +++--- tests/pulses/test_pulse.py | 4 ++-- tests/test_backends.py | 4 ++-- tests/test_compilers_default.py | 14 ++++++------- tests/test_dummy.py | 6 +++--- tests/test_execute_qasm.py | 2 +- tests/test_native.py | 6 +++--- tests/test_parameters.py | 6 +++--- tests/test_platform.py | 28 ++++++++++++------------- tests/test_sequence.py | 4 ++-- tests/test_serialize.py | 2 +- tests/test_sweeper.py | 4 ++-- tests/test_unrolling.py | 10 ++++----- 23 files changed, 69 insertions(+), 69 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index ad89ecba22..c4e8551629 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -13,9 +13,9 @@ Platform, create_platform, ) -from qibolab.platform.load import PLATFORMS -from qibolab.sequence import PulseSequence -from qibolab.sweeper import ParallelSweepers, Parameter, Sweeper +from qibolab._core.platform.load import PLATFORMS +from qibolab._core.sequence import PulseSequence +from qibolab._core.sweeper import ParallelSweepers, Parameter, Sweeper ORIGINAL_PLATFORMS = os.environ.get(PLATFORMS, "") TESTING_PLATFORM_NAMES = ["dummy"] diff --git a/tests/dummy_qrc/qm_octave/platform.py b/tests/dummy_qrc/qm_octave/platform.py index 68dcc7d160..2b8aeb1e91 100644 --- a/tests/dummy_qrc/qm_octave/platform.py +++ b/tests/dummy_qrc/qm_octave/platform.py @@ -1,9 +1,9 @@ import pathlib -from qibolab.channel import Channel, ChannelMap -from qibolab.instruments.dummy import DummyLocalOscillator as LocalOscillator -from qibolab.instruments.qm import Octave, OPXplus, QMController -from qibolab.platform import Platform +from qibolab._core.channel import Channel, ChannelMap +from qibolab._core.instruments.dummy import DummyLocalOscillator as LocalOscillator +from qibolab._core.instruments.qm import Octave, OPXplus, QMController +from qibolab._core.platform import Platform RUNCARD = pathlib.Path(__file__).parent diff --git a/tests/dummy_qrc/zurich/platform.py b/tests/dummy_qrc/zurich/platform.py index 06d6251f01..bacd30b466 100644 --- a/tests/dummy_qrc/zurich/platform.py +++ b/tests/dummy_qrc/zurich/platform.py @@ -5,21 +5,21 @@ from laboneq.simple import DeviceSetup from qibolab import Platform -from qibolab.components import ( +from qibolab._core.components import ( AcquisitionChannel, DcChannel, IqChannel, OscillatorConfig, ) -from qibolab.instruments.zhinst import ( +from qibolab._core.instruments.zhinst import ( ZiAcquisitionConfig, ZiChannel, ZiDcConfig, ZiIqConfig, Zurich, ) -from qibolab.kernels import Kernels -from qibolab.parameters import Parameters +from qibolab._core.kernels import Kernels +from qibolab._core.parameters import Parameters FOLDER = pathlib.Path(__file__).parent diff --git a/tests/instruments/test_bluefors.py b/tests/instruments/test_bluefors.py index d76e8b865d..75154568bd 100644 --- a/tests/instruments/test_bluefors.py +++ b/tests/instruments/test_bluefors.py @@ -3,7 +3,7 @@ import pytest import yaml -from qibolab.instruments.bluefors import TemperatureController +from qibolab._core.instruments.bluefors import TemperatureController messages = [ "4K-flange: {'temperature':3.065067, 'timestamp':1710912431.128234}", diff --git a/tests/instruments/test_erasynth.py b/tests/instruments/test_erasynth.py index 05f8899af4..78e097e8ab 100644 --- a/tests/instruments/test_erasynth.py +++ b/tests/instruments/test_erasynth.py @@ -1,13 +1,13 @@ import pytest -from qibolab.instruments.erasynth import ERA +from qibolab._core.instruments.erasynth import ERASynth from .conftest import get_instrument @pytest.fixture(scope="module") def era(connected_platform): - return get_instrument(connected_platform, ERA) + return get_instrument(connected_platform, ERASynth) @pytest.mark.qpu diff --git a/tests/instruments/test_oscillator.py b/tests/instruments/test_oscillator.py index f40717b420..6f4d36cdd6 100644 --- a/tests/instruments/test_oscillator.py +++ b/tests/instruments/test_oscillator.py @@ -1,6 +1,6 @@ import pytest -from qibolab.instruments.dummy import DummyDevice, DummyLocalOscillator +from qibolab._core.instruments.dummy import DummyDevice, DummyLocalOscillator @pytest.fixture diff --git a/tests/instruments/test_rohde_schwarz.py b/tests/instruments/test_rohde_schwarz.py index e51d963da8..f6d73d1d13 100644 --- a/tests/instruments/test_rohde_schwarz.py +++ b/tests/instruments/test_rohde_schwarz.py @@ -1,7 +1,7 @@ import numpy as np import pytest -from qibolab.instruments.rohde_schwarz import SGS100A +from qibolab._core.instruments.rohde_schwarz import SGS100A from .conftest import get_instrument diff --git a/tests/integration/test_sequence.py b/tests/integration/test_sequence.py index 2003ac273c..4bb709a001 100644 --- a/tests/integration/test_sequence.py +++ b/tests/integration/test_sequence.py @@ -1,6 +1,6 @@ from qibolab import create_platform -from qibolab.execution_parameters import ExecutionParameters -from qibolab.pulses import Delay +from qibolab._core.execution_parameters import ExecutionParameters +from qibolab._core.pulses import Delay def test_sequence_creation(): diff --git a/tests/pulses/test_envelope.py b/tests/pulses/test_envelope.py index c29299e98d..c4b777de92 100644 --- a/tests/pulses/test_envelope.py +++ b/tests/pulses/test_envelope.py @@ -1,7 +1,7 @@ import numpy as np import pytest -from qibolab.pulses import ( +from qibolab._core.pulses import ( Drag, ECap, Gaussian, diff --git a/tests/pulses/test_modulation.py b/tests/pulses/test_modulation.py index fe72e6fcf9..fcefc72cfb 100644 --- a/tests/pulses/test_modulation.py +++ b/tests/pulses/test_modulation.py @@ -1,7 +1,7 @@ import numpy as np -from qibolab.pulses import Gaussian, IqWaveform, Rectangular -from qibolab.pulses.modulation import demodulate, modulate +from qibolab._core.pulses import Gaussian, IqWaveform, Rectangular +from qibolab._core.pulses.modulation import demodulate, modulate def test_modulation(): diff --git a/tests/pulses/test_plot.py b/tests/pulses/test_plot.py index 2f904d2a59..83309a704c 100644 --- a/tests/pulses/test_plot.py +++ b/tests/pulses/test_plot.py @@ -3,7 +3,7 @@ import numpy as np -from qibolab.pulses import ( +from qibolab._core.pulses import ( Drag, ECap, Gaussian, @@ -14,8 +14,8 @@ Snz, plot, ) -from qibolab.pulses.modulation import modulate -from qibolab.sequence import PulseSequence +from qibolab._core.pulses.modulation import modulate +from qibolab._core.sequence import PulseSequence HERE = pathlib.Path(__file__).parent SAMPLING_RATE = 1 diff --git a/tests/pulses/test_pulse.py b/tests/pulses/test_pulse.py index d88c85549c..b4957ebc85 100644 --- a/tests/pulses/test_pulse.py +++ b/tests/pulses/test_pulse.py @@ -3,8 +3,8 @@ import numpy as np from pytest import approx, raises -from qibolab.pulses import Acquisition, Custom, Pulse, Rectangular, VirtualZ -from qibolab.pulses.pulse import Readout +from qibolab._core.pulses import Acquisition, Custom, Pulse, Rectangular, VirtualZ +from qibolab._core.pulses.pulse import Readout def test_virtual_z(): diff --git a/tests/test_backends.py b/tests/test_backends.py index fde4ff4181..0165efba90 100644 --- a/tests/test_backends.py +++ b/tests/test_backends.py @@ -8,8 +8,8 @@ from qibo.models import Circuit from qibolab import MetaBackend, create_platform -from qibolab.backends import QibolabBackend -from qibolab.platform.platform import Platform +from qibolab._core.backends import QibolabBackend +from qibolab._core.platform.platform import Platform def generate_circuit_with_gate(nqubits, gate, **kwargs): diff --git a/tests/test_compilers_default.py b/tests/test_compilers_default.py index 2bc3c10530..b215d0388b 100644 --- a/tests/test_compilers_default.py +++ b/tests/test_compilers_default.py @@ -5,13 +5,13 @@ from qibo.models import Circuit from qibolab import create_platform -from qibolab.compilers import Compiler -from qibolab.identifier import ChannelId -from qibolab.native import FixedSequenceFactory, TwoQubitNatives -from qibolab.platform import Platform -from qibolab.pulses import Delay, Pulse -from qibolab.pulses.envelope import Rectangular -from qibolab.sequence import PulseSequence +from qibolab._core.compilers import Compiler +from qibolab._core.identifier import ChannelId +from qibolab._core.native import FixedSequenceFactory, TwoQubitNatives +from qibolab._core.platform import Platform +from qibolab._core.pulses import Delay, Pulse +from qibolab._core.pulses.envelope import Rectangular +from qibolab._core.sequence import PulseSequence def generate_circuit_with_gate(nqubits: int, gate, *params, **kwargs): diff --git a/tests/test_dummy.py b/tests/test_dummy.py index b5a332771e..02ac4fcb5c 100644 --- a/tests/test_dummy.py +++ b/tests/test_dummy.py @@ -1,9 +1,9 @@ import pytest from qibolab import AcquisitionType, ExecutionParameters, create_platform -from qibolab.platform.platform import Platform -from qibolab.pulses import Delay, GaussianSquare, Pulse -from qibolab.sequence import PulseSequence +from qibolab._core.platform.platform import Platform +from qibolab._core.pulses import Delay, GaussianSquare, Pulse +from qibolab._core.sequence import PulseSequence SWEPT_POINTS = 5 diff --git a/tests/test_execute_qasm.py b/tests/test_execute_qasm.py index 60d396824d..9716a8f9c3 100644 --- a/tests/test_execute_qasm.py +++ b/tests/test_execute_qasm.py @@ -1,6 +1,6 @@ from qibo import Circuit, __version__ -from qibolab.backends import QibolabBackend, execute_qasm +from qibolab._core.backends import QibolabBackend, execute_qasm def test_execute_qasm(): diff --git a/tests/test_native.py b/tests/test_native.py index 2527284a2b..441bc5f7f4 100644 --- a/tests/test_native.py +++ b/tests/test_native.py @@ -4,8 +4,8 @@ import pytest from pydantic import TypeAdapter -from qibolab.native import FixedSequenceFactory, RxyFactory, TwoQubitNatives -from qibolab.pulses import ( +from qibolab._core.native import FixedSequenceFactory, RxyFactory, TwoQubitNatives +from qibolab._core.pulses import ( Drag, Exponential, Gaussian, @@ -13,7 +13,7 @@ Pulse, Rectangular, ) -from qibolab.sequence import PulseSequence +from qibolab._core.sequence import PulseSequence def test_fixed_sequence_factory(): diff --git a/tests/test_parameters.py b/tests/test_parameters.py index 1e52e35366..3c507030ca 100644 --- a/tests/test_parameters.py +++ b/tests/test_parameters.py @@ -2,9 +2,9 @@ import pytest -from qibolab.components.configs import Config -from qibolab.native import FixedSequenceFactory, TwoQubitNatives -from qibolab.parameters import ConfigKinds, Parameters, TwoQubitContainer +from qibolab._core.components.configs import Config +from qibolab._core.native import FixedSequenceFactory, TwoQubitNatives +from qibolab._core.parameters import ConfigKinds, Parameters, TwoQubitContainer def test_two_qubit_container(): diff --git a/tests/test_platform.py b/tests/test_platform.py index 4d5842a93f..589812692d 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -13,19 +13,19 @@ from qibo.result import CircuitResult from qibolab import create_platform -from qibolab.backends import QibolabBackend -from qibolab.components import AcquisitionConfig, IqConfig, OscillatorConfig -from qibolab.dummy import create_dummy -from qibolab.dummy.platform import FOLDER -from qibolab.execution_parameters import ExecutionParameters -from qibolab.native import SingleQubitNatives, TwoQubitNatives -from qibolab.parameters import NativeGates, Parameters, update_configs -from qibolab.platform import Platform -from qibolab.platform.load import PLATFORM, PLATFORMS -from qibolab.platform.platform import PARAMETERS -from qibolab.pulses import Delay, Gaussian, Pulse, Rectangular -from qibolab.sequence import PulseSequence -from qibolab.serialize import replace +from qibolab._core.backends import QibolabBackend +from qibolab._core.components import AcquisitionConfig, IqConfig, OscillatorConfig +from qibolab._core.dummy import create_dummy +from qibolab._core.dummy.platform import FOLDER +from qibolab._core.execution_parameters import ExecutionParameters +from qibolab._core.native import SingleQubitNatives, TwoQubitNatives +from qibolab._core.parameters import NativeGates, Parameters, update_configs +from qibolab._core.platform import Platform +from qibolab._core.platform.load import PLATFORM, PLATFORMS +from qibolab._core.platform.platform import PARAMETERS +from qibolab._core.pulses import Delay, Gaussian, Pulse, Rectangular +from qibolab._core.sequence import PulseSequence +from qibolab._core.serialize import replace nshots = 1024 @@ -83,7 +83,7 @@ def test_create_platform_multipath(tmp_path: Path): (p / PLATFORM).write_text( inspect.cleandoc( f""" - from qibolab.platform import Platform + from qibolab._core.platform import Platform def create(): return Platform("{p.parent.name}-{p.name}", {{}}, {{}}, {{}}, {{}}) diff --git a/tests/test_sequence.py b/tests/test_sequence.py index 159a7c8b3c..84eb3de596 100644 --- a/tests/test_sequence.py +++ b/tests/test_sequence.py @@ -2,7 +2,7 @@ from pydantic import TypeAdapter -from qibolab.pulses import ( +from qibolab._core.pulses import ( Acquisition, Delay, Drag, @@ -12,7 +12,7 @@ Rectangular, VirtualZ, ) -from qibolab.sequence import PulseSequence +from qibolab._core.sequence import PulseSequence def test_init(): diff --git a/tests/test_serialize.py b/tests/test_serialize.py index 8a6d4bd7ee..914c6bcfb7 100644 --- a/tests/test_serialize.py +++ b/tests/test_serialize.py @@ -1,7 +1,7 @@ import numpy as np from pydantic import BaseModel, ConfigDict -from qibolab.serialize import NdArray, eq +from qibolab._core.serialize import NdArray, eq class ArrayModel(BaseModel): diff --git a/tests/test_sweeper.py b/tests/test_sweeper.py index 7b830604ce..7f337acf7a 100644 --- a/tests/test_sweeper.py +++ b/tests/test_sweeper.py @@ -1,8 +1,8 @@ import numpy as np import pytest -from qibolab.pulses import Pulse, Rectangular -from qibolab.sweeper import Parameter, Sweeper +from qibolab._core.pulses import Pulse, Rectangular +from qibolab._core.sweeper import Parameter, Sweeper @pytest.mark.parametrize("parameter", Parameter) diff --git a/tests/test_unrolling.py b/tests/test_unrolling.py index 2d612a949b..e81fe0ce74 100644 --- a/tests/test_unrolling.py +++ b/tests/test_unrolling.py @@ -2,11 +2,11 @@ import pytest -from qibolab.platform import Platform -from qibolab.pulses import Delay, Drag, Pulse, Rectangular -from qibolab.pulses.pulse import Acquisition -from qibolab.sequence import PulseSequence -from qibolab.unrolling import Bounds, batch, unroll_sequences +from qibolab._core.platform import Platform +from qibolab._core.pulses import Delay, Drag, Pulse, Rectangular +from qibolab._core.pulses.pulse import Acquisition +from qibolab._core.sequence import PulseSequence +from qibolab._core.unrolling import Bounds, batch, unroll_sequences def test_bounds_update(): From 589413502ac1de6de10633b755f920383241b8c3 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 16 Sep 2024 17:36:32 +0200 Subject: [PATCH 0968/1006] test: Fix imports in conf.py And its downstream, i.e. zhinst --- doc/source/conf.py | 6 +++--- .../instruments/zhinst/components/channel.py | 2 +- .../instruments/zhinst/components/configs.py | 2 +- src/qibolab/_core/instruments/zhinst/executor.py | 16 ++++++++++------ src/qibolab/_core/instruments/zhinst/pulse.py | 2 +- src/qibolab/_core/instruments/zhinst/sweep.py | 6 +++--- 6 files changed, 19 insertions(+), 15 deletions(-) diff --git a/doc/source/conf.py b/doc/source/conf.py index d013ba3b06..50591064b4 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -21,9 +21,9 @@ # TODO: the following is a workaround for Sphinx doctest, cf. # - https://github.com/qiboteam/qibolab/commit/e04a6ab # - https://github.com/pydantic/pydantic/discussions/7763 -import qibolab.instruments.dummy -import qibolab.instruments.oscillator -import qibolab.instruments.zhinst +import qibolab._core.instruments.dummy +import qibolab._core.instruments.oscillator +import qibolab._core.instruments.zhinst # -- Project information ----------------------------------------------------- diff --git a/src/qibolab/_core/instruments/zhinst/components/channel.py b/src/qibolab/_core/instruments/zhinst/components/channel.py index a7fbf7cad8..898625de0c 100644 --- a/src/qibolab/_core/instruments/zhinst/components/channel.py +++ b/src/qibolab/_core/instruments/zhinst/components/channel.py @@ -1,6 +1,6 @@ from dataclasses import dataclass -from qibolab.components import Channel +from qibolab._core.components import Channel __all__ = [ "ZiChannel", diff --git a/src/qibolab/_core/instruments/zhinst/components/configs.py b/src/qibolab/_core/instruments/zhinst/components/configs.py index e85524bb8e..c48bc465ce 100644 --- a/src/qibolab/_core/instruments/zhinst/components/configs.py +++ b/src/qibolab/_core/instruments/zhinst/components/configs.py @@ -1,4 +1,4 @@ -from qibolab.components import AcquisitionConfig, DcConfig, IqConfig +from qibolab._core.components import AcquisitionConfig, DcConfig, IqConfig __all__ = [ "ZiDcConfig", diff --git a/src/qibolab/_core/instruments/zhinst/executor.py b/src/qibolab/_core/instruments/zhinst/executor.py index 0c3a01e7b8..e8dd48352e 100644 --- a/src/qibolab/_core/instruments/zhinst/executor.py +++ b/src/qibolab/_core/instruments/zhinst/executor.py @@ -8,12 +8,16 @@ import numpy as np from laboneq.dsl.device import create_connection -from qibolab import AcquisitionType, AveragingMode, ExecutionParameters -from qibolab.instruments.abstract import Controller -from qibolab.pulses import Delay, Pulse -from qibolab.sequence import PulseSequence -from qibolab.sweeper import Parameter, Sweeper -from qibolab.unrolling import Bounds +from qibolab._core.execution_parameters import ( + AcquisitionType, + AveragingMode, + ExecutionParameters, +) +from qibolab._core.instruments.abstract import Controller +from qibolab._core.pulses import Delay, Pulse +from qibolab._core.sequence import PulseSequence +from qibolab._core.sweeper import Parameter, Sweeper +from qibolab._core.unrolling import Bounds from ...components import AcquisitionChannel, Config, DcChannel, IqChannel from .components import ZiChannel diff --git a/src/qibolab/_core/instruments/zhinst/pulse.py b/src/qibolab/_core/instruments/zhinst/pulse.py index 6878d0ea98..dab9c48aae 100644 --- a/src/qibolab/_core/instruments/zhinst/pulse.py +++ b/src/qibolab/_core/instruments/zhinst/pulse.py @@ -7,7 +7,7 @@ sampled_pulse_real, ) -from qibolab.pulses import Drag, Gaussian, GaussianSquare, Pulse, Rectangular +from qibolab._core.pulses import Drag, Gaussian, GaussianSquare, Pulse, Rectangular from .constants import NANO_TO_SECONDS, SAMPLING_RATE diff --git a/src/qibolab/_core/instruments/zhinst/sweep.py b/src/qibolab/_core/instruments/zhinst/sweep.py index ed19ba7969..6123c5d708 100644 --- a/src/qibolab/_core/instruments/zhinst/sweep.py +++ b/src/qibolab/_core/instruments/zhinst/sweep.py @@ -5,9 +5,9 @@ import laboneq.simple as laboneq -from qibolab.components import Config -from qibolab.pulses import Pulse -from qibolab.sweeper import Parameter, Sweeper +from qibolab._core.components import Config +from qibolab._core.pulses import Pulse +from qibolab._core.sweeper import Parameter, Sweeper from . import ZiChannel from .constants import NANO_TO_SECONDS From 3c036f938673652515f820e4b06d8b713827a3c0 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 16 Sep 2024 17:44:42 +0200 Subject: [PATCH 0969/1006] build: Update pylint whitelist with new qualified path --- pyproject.toml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index ba05be9c40..6a637dd189 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -101,7 +101,10 @@ test-docs = "make -C doc doctest" [tool.pylint.master] output-format = "colorized" disable = ["E1123", "E1120", "C0301"] -generated-members = ["qibolab.native.RxyFactory", "pydantic.fields.FieldInfo"] +generated-members = [ + "qibolab._core.native.RxyFactory", + "pydantic.fields.FieldInfo", +] # TODO: restore analysis when the support will cover the entier Python range, i.e. it # will include py3.12 as well ignored-modules = ["qm", "qualang_tools", "qibosoq"] From d488702ea203a09fbbab81fb3a758e8629427d7d Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 16 Sep 2024 17:56:01 +0200 Subject: [PATCH 0970/1006] feat: Expose dummy platform creation --- src/qibolab/_core/__init__.py | 6 +++--- src/qibolab/_core/dummy/__init__.py | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/qibolab/_core/__init__.py b/src/qibolab/_core/__init__.py index f555015379..e09566092d 100644 --- a/src/qibolab/_core/__init__.py +++ b/src/qibolab/_core/__init__.py @@ -1,6 +1,7 @@ from . import ( backends, components, + dummy, execution_parameters, platform, pulses, @@ -9,20 +10,19 @@ ) from .backends import * from .components import * +from .dummy import * from .execution_parameters import * from .platform import * from .pulses import * from .sequence import * from .sweeper import * -# from .version import * - __all__ = [] __all__ += backends.__all__ __all__ += components.__all__ +__all__ += dummy.__all__ __all__ += execution_parameters.__all__ __all__ += platform.__all__ __all__ += pulses.__all__ __all__ += sequence.__all__ __all__ += sweeper.__all__ -# __all__ += version.__all__ diff --git a/src/qibolab/_core/dummy/__init__.py b/src/qibolab/_core/dummy/__init__.py index 137e075db3..1800fd3e28 100644 --- a/src/qibolab/_core/dummy/__init__.py +++ b/src/qibolab/_core/dummy/__init__.py @@ -1 +1,3 @@ from .platform import create_dummy + +__all__ = ["create_dummy"] From 9482e4a912fffd3156a04ff6fcb3ccb3eeabcef8 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 16 Sep 2024 18:45:54 +0200 Subject: [PATCH 0971/1006] docs: Redirect imports to use public api Whenever possible... --- doc/source/getting-started/experiment.rst | 34 +++++---- doc/source/main-documentation/qibolab.rst | 15 ++-- doc/source/tutorials/calibration.rst | 37 +++++----- doc/source/tutorials/circuits.rst | 4 +- doc/source/tutorials/lab.rst | 89 ++++++++++++----------- doc/source/tutorials/pulses.rst | 10 +-- 6 files changed, 98 insertions(+), 91 deletions(-) diff --git a/doc/source/getting-started/experiment.rst b/doc/source/getting-started/experiment.rst index b5c027619e..32378f2364 100644 --- a/doc/source/getting-started/experiment.rst +++ b/doc/source/getting-started/experiment.rst @@ -28,13 +28,16 @@ although minimal changes are needed to use other devices. import pathlib - from qibolab.components import AcquisitionChannel, Channel, DcChannel, IqChannel - from qibolab.identifier import ChannelId + from qibolab import ( + AcquisitionChannel, + Channel, + ConfigKinds, + DcChannel, + IqChannel, + Platform, + Qubit, + ) from qibolab.instruments.qm import Octave, QmConfigs, QmController - from qibolab.parameters import ConfigKinds - from qibolab.platform import Platform - from qibolab.platform.platform import QubitMap - from qibolab.qubits import Qubit # folder containing runcard with calibration parameters FOLDER = pathlib.Path.cwd() @@ -45,7 +48,7 @@ although minimal changes are needed to use other devices. def create(): # Define qubit - qubits: QubitMap = { + qubits = { 0: Qubit( drive="0/drive", probe="0/probe", @@ -54,7 +57,7 @@ although minimal changes are needed to use other devices. } # Create channels and connect to instrument ports - channels: dict[ChannelId, Channel] = {} + channels = {} qubit = qubits[0] # Readout channels[qubit.probe] = IqChannel( @@ -94,7 +97,7 @@ although minimal changes are needed to use other devices. .. code-block:: python import pathlib - from qibolab.platform import Platform + from qibolab import Platform def create() -> Platform: @@ -212,13 +215,14 @@ We leave to the dedicated tutorial a full explanation of the experiment, but her import numpy as np import matplotlib.pyplot as plt - from qibolab import create_platform - from qibolab.sequence import PulseSequence - from qibolab.sweeper import Sweeper, Parameter - from qibolab.execution_parameters import ( - ExecutionParameters, - AveragingMode, + from qibolab import ( AcquisitionType, + AveragingMode, + ExecutionParameters, + Parameter, + PulseSequence, + Sweeper, + create_platform, ) # load the platform from ``dummy.py`` and ``dummy.json`` diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index 4e08d7589a..590711ee79 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -66,8 +66,7 @@ as these are loaded automatically from the platform, as defined in the correspon .. testcode:: python - from qibolab.pulses import Delay - from qibolab.sequence import PulseSequence + from qibolab import Delay, PulseSequence import numpy as np ps = PulseSequence() @@ -82,7 +81,7 @@ Now we can execute the sequence on hardware: .. testcode:: python - from qibolab.execution_parameters import ( + from qibolab import ( AcquisitionType, AveragingMode, ExecutionParameters, @@ -202,7 +201,7 @@ To illustrate, here is an examples of how to instantiate a pulse using the Qibol .. testcode:: python - from qibolab.pulses import Pulse, Rectangular + from qibolab import Pulse, Rectangular pulse = Pulse( duration=40.0, # Pulse duration in ns @@ -219,8 +218,7 @@ To organize pulses into sequences, Qibolab provides the :class:`qibolab.sequence .. testcode:: python - from qibolab.pulses import Pulse, Rectangular - from qibolab.sequence import PulseSequence + from qibolab import Pulse, PulseSequence, Rectangular pulse1 = Pulse( @@ -278,8 +276,7 @@ Typical experiments may include both pre-defined pulses and new ones: .. testcode:: python - from qibolab.pulses import Rectangular - from qibolab.identifier import ChannelId + from qibolab import Rectangular natives = platform.natives.single_qubit[0] sequence = natives.RX() | natives.MZ() @@ -339,7 +336,7 @@ A typical resonator spectroscopy experiment could be defined with: import numpy as np - from qibolab.sweeper import Parameter, Sweeper + from qibolab import Parameter, Sweeper natives = platform.natives.single_qubit diff --git a/doc/source/tutorials/calibration.rst b/doc/source/tutorials/calibration.rst index 17a73ad8e0..8980ce6943 100644 --- a/doc/source/tutorials/calibration.rst +++ b/doc/source/tutorials/calibration.rst @@ -31,13 +31,14 @@ This is done in the following script: import numpy as np import matplotlib.pyplot as plt - from qibolab import create_platform - from qibolab.sequence import PulseSequence - from qibolab.sweeper import Sweeper, Parameter - from qibolab.execution_parameters import ( - ExecutionParameters, - AveragingMode, + from qibolab import ( AcquisitionType, + AveragingMode, + ExecutionParameters, + Parameter, + PulseSequence, + Sweeper, + create_platform, ) # allocate platform @@ -102,13 +103,14 @@ complex pulse sequence. Therefore with start with that: import numpy as np import matplotlib.pyplot as plt - from qibolab import create_platform - from qibolab.sequence import PulseSequence - from qibolab.sweeper import Sweeper, Parameter - from qibolab.execution_parameters import ( - ExecutionParameters, - AveragingMode, + from qibolab import ( AcquisitionType, + AveragingMode, + ExecutionParameters, + Parameter, + PulseSequence, + Sweeper, + create_platform, ) # allocate platform @@ -193,12 +195,13 @@ and its impact on qubit states in the IQ plane. import numpy as np import matplotlib.pyplot as plt - from qibolab import create_platform - from qibolab.sweeper import Sweeper, Parameter - from qibolab.execution_parameters import ( - ExecutionParameters, - AveragingMode, + from qibolab import ( AcquisitionType, + AveragingMode, + ExecutionParameters, + Parameter, + Sweeper, + create_platform, ) # allocate platform diff --git a/doc/source/tutorials/circuits.rst b/doc/source/tutorials/circuits.rst index 7fef5c531a..7e758aeac3 100644 --- a/doc/source/tutorials/circuits.rst +++ b/doc/source/tutorials/circuits.rst @@ -150,11 +150,11 @@ Qibolab also supports the execution of circuits starting from a QASM string. The measure q[0] -> a[0]; measure q[2] -> a[1];""" -can be executed by passing it together with the platform name to the :func:`qibolab.execute_qasm` function: +can be executed by passing it together with the platform name to the :func:`qibolab._core.backends.execute_qasm` function: .. testcode:: - from qibolab.backends import execute_qasm + from qibolab._core.backends import execute_qasm result = execute_qasm(circuit, platform="dummy") diff --git a/doc/source/tutorials/lab.rst b/doc/source/tutorials/lab.rst index ad2ab7633e..afbb076dc2 100644 --- a/doc/source/tutorials/lab.rst +++ b/doc/source/tutorials/lab.rst @@ -21,19 +21,22 @@ using different Qibolab primitives. .. testcode:: python - from qibolab import Platform - from qibolab.sequence import PulseSequence - from qibolab.components import ( - IqChannel, + from qibolab import ( + Acquisition, AcquisitionChannel, - IqConfig, - AcquisitionConfig, + Gaussian, + IqChannel, + Platform, + PulseSequence, + Pulse, + Qubit, + Readout, + Rectangular, ) - from qibolab.qubits import Qubit - from qibolab.pulses import Gaussian, Pulse, Rectangular, Readout, Acquisition - from qibolab.native import RxyFactory, FixedSequenceFactory, SingleQubitNatives - from qibolab.parameters import NativeGates, Parameters - from qibolab.instruments.dummy import DummyInstrument + from qibolab._core.components.configs import AcquisitionConfig, IqConfig + from qibolab._core.native import FixedSequenceFactory, RxyFactory + from qibolab._core.parameters import NativeGates, Parameters, SingleQubitNatives + from qibolab.instruments import DummyInstrument def create(): @@ -132,15 +135,25 @@ the native gates, but separately from the single-qubit ones. .. testcode:: python - from qibolab.components import IqChannel, AcquisitionChannel, DcChannel, IqConfig - from qibolab.qubits import Qubit - from qibolab.parameters import NativeGates, Parameters, TwoQubitContainer - from qibolab.pulses import Acquisition, Gaussian, Pulse, Readout, Rectangular - from qibolab.sequence import PulseSequence - from qibolab.native import ( - RxyFactory, - FixedSequenceFactory, + from qibolab import ( + Acquisition, + AcquisitionChannel, + DcChannel, + Gaussian, + IqChannel, + Pulse, + PulseSequence, + Qubit, + Readout, + Rectangular, + ) + from qibolab._core.components.configs import AcquisitionConfig, IqConfig + from qibolab._core.native import FixedSequenceFactory, RxyFactory + from qibolab._core.parameters import ( + NativeGates, + Parameters, SingleQubitNatives, + TwoQubitContainer, TwoQubitNatives, ) @@ -272,15 +285,15 @@ will take them into account when calling :class:`qibolab.native.TwoQubitNatives` .. testcode:: python - from qibolab.components import DcChannel - from qibolab.qubits import Qubit - from qibolab.pulses import Pulse - from qibolab.sequence import PulseSequence - from qibolab.native import ( - FixedSequenceFactory, - SingleQubitNatives, - TwoQubitNatives, + from qibolab import ( + DcChannel, + Pulse, + PulseSequence, + Qubit, + Rectangular, ) + from qibolab._core.parameters import TwoQubitContainer, TwoQubitNatives + from qibolab._core.native import FixedSequenceFactory # create the qubit and coupler objects coupler_01 = Qubit(flux="c01/flux") @@ -539,17 +552,14 @@ Here is the ``create()`` method that loads the parameters from the JSON: # my_platform / platform.py from pathlib import Path - from qibolab.platform import Platform - from qibolab.qubits import Qubit - from qibolab.components import ( + from qibolab import ( AcquisitionChannel, DcChannel, IqChannel, - AcquisitionConfig, - DcConfig, - IqConfig, + Platform, + Qubit, ) - from qibolab.instruments.dummy import DummyInstrument + from qibolab.instruments import DummyInstrument FOLDER = Path.cwd() @@ -630,17 +640,14 @@ in this case ``"twpa_pump"``. # my_platform / platform.py from pathlib import Path - from qibolab.platform import Platform - from qibolab.qubits import Qubit - from qibolab.components import ( + from qibolab import ( AcquisitionChannel, DcChannel, IqChannel, - AcquisitionConfig, - DcConfig, - IqConfig, + Platform, + Qubit, ) - from qibolab.instruments.dummy import DummyInstrument + from qibolab.instruments import DummyInstrument FOLDER = Path.cwd() diff --git a/doc/source/tutorials/pulses.rst b/doc/source/tutorials/pulses.rst index e85912f6f1..504969ab05 100644 --- a/doc/source/tutorials/pulses.rst +++ b/doc/source/tutorials/pulses.rst @@ -7,8 +7,7 @@ pulses (:class:`qibolab.pulses.Pulse`) using the :func:`qibolab.pulses.PulseSequ .. testcode:: python - from qibolab.pulses import Pulse, Rectangular, Gaussian, Delay - from qibolab.sequence import PulseSequence + from qibolab import Delay, Gaussian, Pulse, PulseSequence, Rectangular # Define PulseSequence sequence = PulseSequence.load( @@ -45,8 +44,7 @@ we can execute the previously defined sequence using the ``execute`` method: .. testcode:: python - from qibolab import create_platform - from qibolab.execution_parameters import ExecutionParameters + from qibolab import ExecutionParameters, create_platform # Define platform and load specific runcard platform = create_platform("dummy") @@ -73,9 +71,7 @@ Alternatively, instead of using the pulse API directly, one can use the native g import numpy as np - from qibolab.pulses import Pulse, Rectangular, Gaussian, Delay - from qibolab.sequence import PulseSequence - from qibolab import create_platform + from qibolab import Delay, Gaussian, Pulse, PulseSequence, Rectangular, create_platform platform = create_platform("dummy") q0 = platform.natives.single_qubit[0] From f401521f35a93767f78e9325060fc4e97c569d1c Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 16 Sep 2024 18:46:36 +0200 Subject: [PATCH 0972/1006] feat: Expose config kinds and qubits --- src/qibolab/_core/__init__.py | 6 ++++++ src/qibolab/_core/parameters.py | 2 ++ src/qibolab/_core/qubits.py | 2 ++ 3 files changed, 10 insertions(+) diff --git a/src/qibolab/_core/__init__.py b/src/qibolab/_core/__init__.py index e09566092d..da4d93fd7b 100644 --- a/src/qibolab/_core/__init__.py +++ b/src/qibolab/_core/__init__.py @@ -3,8 +3,10 @@ components, dummy, execution_parameters, + parameters, platform, pulses, + qubits, sequence, sweeper, ) @@ -12,8 +14,10 @@ from .components import * from .dummy import * from .execution_parameters import * +from .parameters import * from .platform import * from .pulses import * +from .qubits import * from .sequence import * from .sweeper import * @@ -22,7 +26,9 @@ __all__ += components.__all__ __all__ += dummy.__all__ __all__ += execution_parameters.__all__ +__all__ += parameters.__all__ __all__ += platform.__all__ __all__ += pulses.__all__ +__all__ += qubits.__all__ __all__ += sequence.__all__ __all__ += sweeper.__all__ diff --git a/src/qibolab/_core/parameters.py b/src/qibolab/_core/parameters.py index 7b7b3ef325..1ad0957cd0 100644 --- a/src/qibolab/_core/parameters.py +++ b/src/qibolab/_core/parameters.py @@ -17,6 +17,8 @@ from .serialize import Model, replace from .unrolling import Bounds +__all__ = ["ConfigKinds"] + def update_configs(configs: dict[str, Config], updates: list[ConfigUpdate]): """Apply updates to configs in place. diff --git a/src/qibolab/_core/qubits.py b/src/qibolab/_core/qubits.py index 701862b03f..1727a44021 100644 --- a/src/qibolab/_core/qubits.py +++ b/src/qibolab/_core/qubits.py @@ -8,6 +8,8 @@ from .identifier import ChannelId, QubitId, QubitPairId, TransitionId # noqa from .serialize import Model +__all__ = ["Qubit"] + DefaultChannelType = Annotated[Optional[ChannelId], True] """If ``True`` the channel is included in the default qubit constructor.""" From cbe8c7771bd919ac3856f651be9ea9cae8166a55 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 16 Sep 2024 18:47:25 +0200 Subject: [PATCH 0973/1006] feat: Expose dummy and bluefors directly in instruments Since they do not require extra deps --- src/qibolab/instruments/__init__.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/qibolab/instruments/__init__.py b/src/qibolab/instruments/__init__.py index e69de29bb2..8d4127bca6 100644 --- a/src/qibolab/instruments/__init__.py +++ b/src/qibolab/instruments/__init__.py @@ -0,0 +1,7 @@ +from . import bluefors, dummy +from .bluefors import * +from .dummy import * + +__all__ = [] +__all__ += dummy.__all__ +__all__ += bluefors.__all__ From 87277cc7b6909b4fa4c43f1b15ad972d2c6a8945 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 16 Sep 2024 18:52:37 +0200 Subject: [PATCH 0974/1006] feat: Expose dummy and bluefors directly in instruments Since they do not require extra deps --- poetry.lock | 1848 ++++++++++++++------------- pyproject.toml | 2 + src/qibolab/instruments/__init__.py | 4 +- 3 files changed, 966 insertions(+), 888 deletions(-) diff --git a/poetry.lock b/poetry.lock index b8772b43c2..35fa6466ab 100644 --- a/poetry.lock +++ b/poetry.lock @@ -122,13 +122,13 @@ tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] [[package]] name = "azure-core" -version = "1.30.2" +version = "1.31.0" description = "Microsoft Azure Core Library for Python" optional = false python-versions = ">=3.8" files = [ - {file = "azure-core-1.30.2.tar.gz", hash = "sha256:a14dc210efcd608821aa472d9fb8e8d035d29b68993819147bc290a8ac224472"}, - {file = "azure_core-1.30.2-py3-none-any.whl", hash = "sha256:cf019c1ca832e96274ae85abd3d9f752397194d9fea3b41487290562ac8abe4a"}, + {file = "azure_core-1.31.0-py3-none-any.whl", hash = "sha256:22954de3777e0250029360ef31d80448ef1be13b80a459bff80ba7073379e2cd"}, + {file = "azure_core-1.31.0.tar.gz", hash = "sha256:656a0dd61e1869b1506b7c6a3b31d62f15984b1a573d6326f6aa2f3e4123284b"}, ] [package.dependencies] @@ -291,89 +291,89 @@ files = [ [[package]] name = "certifi" -version = "2024.7.4" +version = "2024.8.30" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, - {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, + {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, + {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, ] [[package]] name = "cffi" -version = "1.17.0" +version = "1.17.1" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" files = [ - {file = "cffi-1.17.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f9338cc05451f1942d0d8203ec2c346c830f8e86469903d5126c1f0a13a2bcbb"}, - {file = "cffi-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0ce71725cacc9ebf839630772b07eeec220cbb5f03be1399e0457a1464f8e1a"}, - {file = "cffi-1.17.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c815270206f983309915a6844fe994b2fa47e5d05c4c4cef267c3b30e34dbe42"}, - {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6bdcd415ba87846fd317bee0774e412e8792832e7805938987e4ede1d13046d"}, - {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a98748ed1a1df4ee1d6f927e151ed6c1a09d5ec21684de879c7ea6aa96f58f2"}, - {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0a048d4f6630113e54bb4b77e315e1ba32a5a31512c31a273807d0027a7e69ab"}, - {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24aa705a5f5bd3a8bcfa4d123f03413de5d86e497435693b638cbffb7d5d8a1b"}, - {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:856bf0924d24e7f93b8aee12a3a1095c34085600aa805693fb7f5d1962393206"}, - {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:4304d4416ff032ed50ad6bb87416d802e67139e31c0bde4628f36a47a3164bfa"}, - {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:331ad15c39c9fe9186ceaf87203a9ecf5ae0ba2538c9e898e3a6967e8ad3db6f"}, - {file = "cffi-1.17.0-cp310-cp310-win32.whl", hash = "sha256:669b29a9eca6146465cc574659058ed949748f0809a2582d1f1a324eb91054dc"}, - {file = "cffi-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:48b389b1fd5144603d61d752afd7167dfd205973a43151ae5045b35793232aa2"}, - {file = "cffi-1.17.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c5d97162c196ce54af6700949ddf9409e9833ef1003b4741c2b39ef46f1d9720"}, - {file = "cffi-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5ba5c243f4004c750836f81606a9fcb7841f8874ad8f3bf204ff5e56332b72b9"}, - {file = "cffi-1.17.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bb9333f58fc3a2296fb1d54576138d4cf5d496a2cc118422bd77835e6ae0b9cb"}, - {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:435a22d00ec7d7ea533db494da8581b05977f9c37338c80bc86314bec2619424"}, - {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1df34588123fcc88c872f5acb6f74ae59e9d182a2707097f9e28275ec26a12d"}, - {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df8bb0010fdd0a743b7542589223a2816bdde4d94bb5ad67884348fa2c1c67e8"}, - {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8b5b9712783415695663bd463990e2f00c6750562e6ad1d28e072a611c5f2a6"}, - {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ffef8fd58a36fb5f1196919638f73dd3ae0db1a878982b27a9a5a176ede4ba91"}, - {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e67d26532bfd8b7f7c05d5a766d6f437b362c1bf203a3a5ce3593a645e870b8"}, - {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:45f7cd36186db767d803b1473b3c659d57a23b5fa491ad83c6d40f2af58e4dbb"}, - {file = "cffi-1.17.0-cp311-cp311-win32.whl", hash = "sha256:a9015f5b8af1bb6837a3fcb0cdf3b874fe3385ff6274e8b7925d81ccaec3c5c9"}, - {file = "cffi-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:b50aaac7d05c2c26dfd50c3321199f019ba76bb650e346a6ef3616306eed67b0"}, - {file = "cffi-1.17.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aec510255ce690d240f7cb23d7114f6b351c733a74c279a84def763660a2c3bc"}, - {file = "cffi-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2770bb0d5e3cc0e31e7318db06efcbcdb7b31bcb1a70086d3177692a02256f59"}, - {file = "cffi-1.17.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db9a30ec064129d605d0f1aedc93e00894b9334ec74ba9c6bdd08147434b33eb"}, - {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a47eef975d2b8b721775a0fa286f50eab535b9d56c70a6e62842134cf7841195"}, - {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f3e0992f23bbb0be00a921eae5363329253c3b86287db27092461c887b791e5e"}, - {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6107e445faf057c118d5050560695e46d272e5301feffda3c41849641222a828"}, - {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb862356ee9391dc5a0b3cbc00f416b48c1b9a52d252d898e5b7696a5f9fe150"}, - {file = "cffi-1.17.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c1c13185b90bbd3f8b5963cd8ce7ad4ff441924c31e23c975cb150e27c2bf67a"}, - {file = "cffi-1.17.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:17c6d6d3260c7f2d94f657e6872591fe8733872a86ed1345bda872cfc8c74885"}, - {file = "cffi-1.17.0-cp312-cp312-win32.whl", hash = "sha256:c3b8bd3133cd50f6b637bb4322822c94c5ce4bf0d724ed5ae70afce62187c492"}, - {file = "cffi-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:dca802c8db0720ce1c49cce1149ff7b06e91ba15fa84b1d59144fef1a1bc7ac2"}, - {file = "cffi-1.17.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6ce01337d23884b21c03869d2f68c5523d43174d4fc405490eb0091057943118"}, - {file = "cffi-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cab2eba3830bf4f6d91e2d6718e0e1c14a2f5ad1af68a89d24ace0c6b17cced7"}, - {file = "cffi-1.17.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14b9cbc8f7ac98a739558eb86fabc283d4d564dafed50216e7f7ee62d0d25377"}, - {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b00e7bcd71caa0282cbe3c90966f738e2db91e64092a877c3ff7f19a1628fdcb"}, - {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:41f4915e09218744d8bae14759f983e466ab69b178de38066f7579892ff2a555"}, - {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4760a68cab57bfaa628938e9c2971137e05ce48e762a9cb53b76c9b569f1204"}, - {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:011aff3524d578a9412c8b3cfaa50f2c0bd78e03eb7af7aa5e0df59b158efb2f"}, - {file = "cffi-1.17.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:a003ac9edc22d99ae1286b0875c460351f4e101f8c9d9d2576e78d7e048f64e0"}, - {file = "cffi-1.17.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ef9528915df81b8f4c7612b19b8628214c65c9b7f74db2e34a646a0a2a0da2d4"}, - {file = "cffi-1.17.0-cp313-cp313-win32.whl", hash = "sha256:70d2aa9fb00cf52034feac4b913181a6e10356019b18ef89bc7c12a283bf5f5a"}, - {file = "cffi-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:b7b6ea9e36d32582cda3465f54c4b454f62f23cb083ebc7a94e2ca6ef011c3a7"}, - {file = "cffi-1.17.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:964823b2fc77b55355999ade496c54dde161c621cb1f6eac61dc30ed1b63cd4c"}, - {file = "cffi-1.17.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:516a405f174fd3b88829eabfe4bb296ac602d6a0f68e0d64d5ac9456194a5b7e"}, - {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dec6b307ce928e8e112a6bb9921a1cb00a0e14979bf28b98e084a4b8a742bd9b"}, - {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4094c7b464cf0a858e75cd14b03509e84789abf7b79f8537e6a72152109c76e"}, - {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2404f3de742f47cb62d023f0ba7c5a916c9c653d5b368cc966382ae4e57da401"}, - {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3aa9d43b02a0c681f0bfbc12d476d47b2b2b6a3f9287f11ee42989a268a1833c"}, - {file = "cffi-1.17.0-cp38-cp38-win32.whl", hash = "sha256:0bb15e7acf8ab35ca8b24b90af52c8b391690ef5c4aec3d31f38f0d37d2cc499"}, - {file = "cffi-1.17.0-cp38-cp38-win_amd64.whl", hash = "sha256:93a7350f6706b31f457c1457d3a3259ff9071a66f312ae64dc024f049055f72c"}, - {file = "cffi-1.17.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1a2ddbac59dc3716bc79f27906c010406155031a1c801410f1bafff17ea304d2"}, - {file = "cffi-1.17.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6327b572f5770293fc062a7ec04160e89741e8552bf1c358d1a23eba68166759"}, - {file = "cffi-1.17.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbc183e7bef690c9abe5ea67b7b60fdbca81aa8da43468287dae7b5c046107d4"}, - {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bdc0f1f610d067c70aa3737ed06e2726fd9d6f7bfee4a351f4c40b6831f4e82"}, - {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6d872186c1617d143969defeadac5a904e6e374183e07977eedef9c07c8953bf"}, - {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d46ee4764b88b91f16661a8befc6bfb24806d885e27436fdc292ed7e6f6d058"}, - {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f76a90c345796c01d85e6332e81cab6d70de83b829cf1d9762d0a3da59c7932"}, - {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0e60821d312f99d3e1569202518dddf10ae547e799d75aef3bca3a2d9e8ee693"}, - {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:eb09b82377233b902d4c3fbeeb7ad731cdab579c6c6fda1f763cd779139e47c3"}, - {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:24658baf6224d8f280e827f0a50c46ad819ec8ba380a42448e24459daf809cf4"}, - {file = "cffi-1.17.0-cp39-cp39-win32.whl", hash = "sha256:0fdacad9e0d9fc23e519efd5ea24a70348305e8d7d85ecbb1a5fa66dc834e7fb"}, - {file = "cffi-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:7cbc78dc018596315d4e7841c8c3a7ae31cc4d638c9b627f87d52e8abaaf2d29"}, - {file = "cffi-1.17.0.tar.gz", hash = "sha256:f3157624b7558b914cb039fd1af735e5e8049a87c817cc215109ad1c8779df76"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, + {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, + {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, + {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, + {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, + {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, + {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, + {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, + {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, + {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, + {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, + {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, + {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, + {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, + {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, ] [package.dependencies] @@ -565,66 +565,87 @@ test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] [[package]] name = "contourpy" -version = "1.2.1" +version = "1.3.0" description = "Python library for calculating contours of 2D quadrilateral grids" optional = false python-versions = ">=3.9" files = [ - {file = "contourpy-1.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bd7c23df857d488f418439686d3b10ae2fbf9bc256cd045b37a8c16575ea1040"}, - {file = "contourpy-1.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5b9eb0ca724a241683c9685a484da9d35c872fd42756574a7cfbf58af26677fd"}, - {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c75507d0a55378240f781599c30e7776674dbaf883a46d1c90f37e563453480"}, - {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11959f0ce4a6f7b76ec578576a0b61a28bdc0696194b6347ba3f1c53827178b9"}, - {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb3315a8a236ee19b6df481fc5f997436e8ade24a9f03dfdc6bd490fea20c6da"}, - {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39f3ecaf76cd98e802f094e0d4fbc6dc9c45a8d0c4d185f0f6c2234e14e5f75b"}, - {file = "contourpy-1.2.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:94b34f32646ca0414237168d68a9157cb3889f06b096612afdd296003fdd32fd"}, - {file = "contourpy-1.2.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:457499c79fa84593f22454bbd27670227874cd2ff5d6c84e60575c8b50a69619"}, - {file = "contourpy-1.2.1-cp310-cp310-win32.whl", hash = "sha256:ac58bdee53cbeba2ecad824fa8159493f0bf3b8ea4e93feb06c9a465d6c87da8"}, - {file = "contourpy-1.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:9cffe0f850e89d7c0012a1fb8730f75edd4320a0a731ed0c183904fe6ecfc3a9"}, - {file = "contourpy-1.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6022cecf8f44e36af10bd9118ca71f371078b4c168b6e0fab43d4a889985dbb5"}, - {file = "contourpy-1.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ef5adb9a3b1d0c645ff694f9bca7702ec2c70f4d734f9922ea34de02294fdf72"}, - {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6150ffa5c767bc6332df27157d95442c379b7dce3a38dff89c0f39b63275696f"}, - {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c863140fafc615c14a4bf4efd0f4425c02230eb8ef02784c9a156461e62c965"}, - {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:00e5388f71c1a0610e6fe56b5c44ab7ba14165cdd6d695429c5cd94021e390b2"}, - {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4492d82b3bc7fbb7e3610747b159869468079fe149ec5c4d771fa1f614a14df"}, - {file = "contourpy-1.2.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:49e70d111fee47284d9dd867c9bb9a7058a3c617274900780c43e38d90fe1205"}, - {file = "contourpy-1.2.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b59c0ffceff8d4d3996a45f2bb6f4c207f94684a96bf3d9728dbb77428dd8cb8"}, - {file = "contourpy-1.2.1-cp311-cp311-win32.whl", hash = "sha256:7b4182299f251060996af5249c286bae9361fa8c6a9cda5efc29fe8bfd6062ec"}, - {file = "contourpy-1.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2855c8b0b55958265e8b5888d6a615ba02883b225f2227461aa9127c578a4922"}, - {file = "contourpy-1.2.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:62828cada4a2b850dbef89c81f5a33741898b305db244904de418cc957ff05dc"}, - {file = "contourpy-1.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:309be79c0a354afff9ff7da4aaed7c3257e77edf6c1b448a779329431ee79d7e"}, - {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e785e0f2ef0d567099b9ff92cbfb958d71c2d5b9259981cd9bee81bd194c9a4"}, - {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cac0a8f71a041aa587410424ad46dfa6a11f6149ceb219ce7dd48f6b02b87a7"}, - {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af3f4485884750dddd9c25cb7e3915d83c2db92488b38ccb77dd594eac84c4a0"}, - {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ce6889abac9a42afd07a562c2d6d4b2b7134f83f18571d859b25624a331c90b"}, - {file = "contourpy-1.2.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a1eea9aecf761c661d096d39ed9026574de8adb2ae1c5bd7b33558af884fb2ce"}, - {file = "contourpy-1.2.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:187fa1d4c6acc06adb0fae5544c59898ad781409e61a926ac7e84b8f276dcef4"}, - {file = "contourpy-1.2.1-cp312-cp312-win32.whl", hash = "sha256:c2528d60e398c7c4c799d56f907664673a807635b857df18f7ae64d3e6ce2d9f"}, - {file = "contourpy-1.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:1a07fc092a4088ee952ddae19a2b2a85757b923217b7eed584fdf25f53a6e7ce"}, - {file = "contourpy-1.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bb6834cbd983b19f06908b45bfc2dad6ac9479ae04abe923a275b5f48f1a186b"}, - {file = "contourpy-1.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1d59e739ab0e3520e62a26c60707cc3ab0365d2f8fecea74bfe4de72dc56388f"}, - {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd3db01f59fdcbce5b22afad19e390260d6d0222f35a1023d9adc5690a889364"}, - {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a12a813949e5066148712a0626895c26b2578874e4cc63160bb007e6df3436fe"}, - {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe0ccca550bb8e5abc22f530ec0466136379c01321fd94f30a22231e8a48d985"}, - {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1d59258c3c67c865435d8fbeb35f8c59b8bef3d6f46c1f29f6123556af28445"}, - {file = "contourpy-1.2.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f32c38afb74bd98ce26de7cc74a67b40afb7b05aae7b42924ea990d51e4dac02"}, - {file = "contourpy-1.2.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d31a63bc6e6d87f77d71e1abbd7387ab817a66733734883d1fc0021ed9bfa083"}, - {file = "contourpy-1.2.1-cp39-cp39-win32.whl", hash = "sha256:ddcb8581510311e13421b1f544403c16e901c4e8f09083c881fab2be80ee31ba"}, - {file = "contourpy-1.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:10a37ae557aabf2509c79715cd20b62e4c7c28b8cd62dd7d99e5ed3ce28c3fd9"}, - {file = "contourpy-1.2.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a31f94983fecbac95e58388210427d68cd30fe8a36927980fab9c20062645609"}, - {file = "contourpy-1.2.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef2b055471c0eb466033760a521efb9d8a32b99ab907fc8358481a1dd29e3bd3"}, - {file = "contourpy-1.2.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b33d2bc4f69caedcd0a275329eb2198f560b325605810895627be5d4b876bf7f"}, - {file = "contourpy-1.2.1.tar.gz", hash = "sha256:4d8908b3bee1c889e547867ca4cdc54e5ab6be6d3e078556814a22457f49423c"}, + {file = "contourpy-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:880ea32e5c774634f9fcd46504bf9f080a41ad855f4fef54f5380f5133d343c7"}, + {file = "contourpy-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:76c905ef940a4474a6289c71d53122a4f77766eef23c03cd57016ce19d0f7b42"}, + {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92f8557cbb07415a4d6fa191f20fd9d2d9eb9c0b61d1b2f52a8926e43c6e9af7"}, + {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36f965570cff02b874773c49bfe85562b47030805d7d8360748f3eca570f4cab"}, + {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cacd81e2d4b6f89c9f8a5b69b86490152ff39afc58a95af002a398273e5ce589"}, + {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69375194457ad0fad3a839b9e29aa0b0ed53bb54db1bfb6c3ae43d111c31ce41"}, + {file = "contourpy-1.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a52040312b1a858b5e31ef28c2e865376a386c60c0e248370bbea2d3f3b760d"}, + {file = "contourpy-1.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3faeb2998e4fcb256542e8a926d08da08977f7f5e62cf733f3c211c2a5586223"}, + {file = "contourpy-1.3.0-cp310-cp310-win32.whl", hash = "sha256:36e0cff201bcb17a0a8ecc7f454fe078437fa6bda730e695a92f2d9932bd507f"}, + {file = "contourpy-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:87ddffef1dbe5e669b5c2440b643d3fdd8622a348fe1983fad7a0f0ccb1cd67b"}, + {file = "contourpy-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0fa4c02abe6c446ba70d96ece336e621efa4aecae43eaa9b030ae5fb92b309ad"}, + {file = "contourpy-1.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:834e0cfe17ba12f79963861e0f908556b2cedd52e1f75e6578801febcc6a9f49"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbc4c3217eee163fa3984fd1567632b48d6dfd29216da3ded3d7b844a8014a66"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4865cd1d419e0c7a7bf6de1777b185eebdc51470800a9f42b9e9decf17762081"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:303c252947ab4b14c08afeb52375b26781ccd6a5ccd81abcdfc1fafd14cf93c1"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:637f674226be46f6ba372fd29d9523dd977a291f66ab2a74fbeb5530bb3f445d"}, + {file = "contourpy-1.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:76a896b2f195b57db25d6b44e7e03f221d32fe318d03ede41f8b4d9ba1bff53c"}, + {file = "contourpy-1.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e1fd23e9d01591bab45546c089ae89d926917a66dceb3abcf01f6105d927e2cb"}, + {file = "contourpy-1.3.0-cp311-cp311-win32.whl", hash = "sha256:d402880b84df3bec6eab53cd0cf802cae6a2ef9537e70cf75e91618a3801c20c"}, + {file = "contourpy-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:6cb6cc968059db9c62cb35fbf70248f40994dfcd7aa10444bbf8b3faeb7c2d67"}, + {file = "contourpy-1.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:570ef7cf892f0afbe5b2ee410c507ce12e15a5fa91017a0009f79f7d93a1268f"}, + {file = "contourpy-1.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:da84c537cb8b97d153e9fb208c221c45605f73147bd4cadd23bdae915042aad6"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0be4d8425bfa755e0fd76ee1e019636ccc7c29f77a7c86b4328a9eb6a26d0639"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c0da700bf58f6e0b65312d0a5e695179a71d0163957fa381bb3c1f72972537c"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb8b141bb00fa977d9122636b16aa67d37fd40a3d8b52dd837e536d64b9a4d06"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3634b5385c6716c258d0419c46d05c8aa7dc8cb70326c9a4fb66b69ad2b52e09"}, + {file = "contourpy-1.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0dce35502151b6bd35027ac39ba6e5a44be13a68f55735c3612c568cac3805fd"}, + {file = "contourpy-1.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aea348f053c645100612b333adc5983d87be69acdc6d77d3169c090d3b01dc35"}, + {file = "contourpy-1.3.0-cp312-cp312-win32.whl", hash = "sha256:90f73a5116ad1ba7174341ef3ea5c3150ddf20b024b98fb0c3b29034752c8aeb"}, + {file = "contourpy-1.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:b11b39aea6be6764f84360fce6c82211a9db32a7c7de8fa6dd5397cf1d079c3b"}, + {file = "contourpy-1.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3e1c7fa44aaae40a2247e2e8e0627f4bea3dd257014764aa644f319a5f8600e3"}, + {file = "contourpy-1.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:364174c2a76057feef647c802652f00953b575723062560498dc7930fc9b1cb7"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32b238b3b3b649e09ce9aaf51f0c261d38644bdfa35cbaf7b263457850957a84"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d51fca85f9f7ad0b65b4b9fe800406d0d77017d7270d31ec3fb1cc07358fdea0"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:732896af21716b29ab3e988d4ce14bc5133733b85956316fb0c56355f398099b"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d73f659398a0904e125280836ae6f88ba9b178b2fed6884f3b1f95b989d2c8da"}, + {file = "contourpy-1.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c6c7c2408b7048082932cf4e641fa3b8ca848259212f51c8c59c45aa7ac18f14"}, + {file = "contourpy-1.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f317576606de89da6b7e0861cf6061f6146ead3528acabff9236458a6ba467f8"}, + {file = "contourpy-1.3.0-cp313-cp313-win32.whl", hash = "sha256:31cd3a85dbdf1fc002280c65caa7e2b5f65e4a973fcdf70dd2fdcb9868069294"}, + {file = "contourpy-1.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:4553c421929ec95fb07b3aaca0fae668b2eb5a5203d1217ca7c34c063c53d087"}, + {file = "contourpy-1.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:345af746d7766821d05d72cb8f3845dfd08dd137101a2cb9b24de277d716def8"}, + {file = "contourpy-1.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3bb3808858a9dc68f6f03d319acd5f1b8a337e6cdda197f02f4b8ff67ad2057b"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:420d39daa61aab1221567b42eecb01112908b2cab7f1b4106a52caaec8d36973"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4d63ee447261e963af02642ffcb864e5a2ee4cbfd78080657a9880b8b1868e18"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:167d6c890815e1dac9536dca00828b445d5d0df4d6a8c6adb4a7ec3166812fa8"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:710a26b3dc80c0e4febf04555de66f5fd17e9cf7170a7b08000601a10570bda6"}, + {file = "contourpy-1.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:75ee7cb1a14c617f34a51d11fa7524173e56551646828353c4af859c56b766e2"}, + {file = "contourpy-1.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:33c92cdae89ec5135d036e7218e69b0bb2851206077251f04a6c4e0e21f03927"}, + {file = "contourpy-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a11077e395f67ffc2c44ec2418cfebed032cd6da3022a94fc227b6faf8e2acb8"}, + {file = "contourpy-1.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e8134301d7e204c88ed7ab50028ba06c683000040ede1d617298611f9dc6240c"}, + {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e12968fdfd5bb45ffdf6192a590bd8ddd3ba9e58360b29683c6bb71a7b41edca"}, + {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fd2a0fc506eccaaa7595b7e1418951f213cf8255be2600f1ea1b61e46a60c55f"}, + {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4cfb5c62ce023dfc410d6059c936dcf96442ba40814aefbfa575425a3a7f19dc"}, + {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68a32389b06b82c2fdd68276148d7b9275b5f5cf13e5417e4252f6d1a34f72a2"}, + {file = "contourpy-1.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:94e848a6b83da10898cbf1311a815f770acc9b6a3f2d646f330d57eb4e87592e"}, + {file = "contourpy-1.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d78ab28a03c854a873787a0a42254a0ccb3cb133c672f645c9f9c8f3ae9d0800"}, + {file = "contourpy-1.3.0-cp39-cp39-win32.whl", hash = "sha256:81cb5ed4952aae6014bc9d0421dec7c5835c9c8c31cdf51910b708f548cf58e5"}, + {file = "contourpy-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:14e262f67bd7e6eb6880bc564dcda30b15e351a594657e55b7eec94b6ef72843"}, + {file = "contourpy-1.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fe41b41505a5a33aeaed2a613dccaeaa74e0e3ead6dd6fd3a118fb471644fd6c"}, + {file = "contourpy-1.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eca7e17a65f72a5133bdbec9ecf22401c62bcf4821361ef7811faee695799779"}, + {file = "contourpy-1.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1ec4dc6bf570f5b22ed0d7efba0dfa9c5b9e0431aeea7581aa217542d9e809a4"}, + {file = "contourpy-1.3.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:00ccd0dbaad6d804ab259820fa7cb0b8036bda0686ef844d24125d8287178ce0"}, + {file = "contourpy-1.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ca947601224119117f7c19c9cdf6b3ab54c5726ef1d906aa4a69dfb6dd58102"}, + {file = "contourpy-1.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c6ec93afeb848a0845a18989da3beca3eec2c0f852322efe21af1931147d12cb"}, + {file = "contourpy-1.3.0.tar.gz", hash = "sha256:7ffa0db17717a8ffb127efd0c95a4362d996b892c2904db72428d5b52e1938a4"}, ] [package.dependencies] -numpy = ">=1.20" +numpy = ">=1.23" [package.extras] bokeh = ["bokeh", "selenium"] docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] -mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.8.0)", "types-Pillow"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.11.1)", "types-Pillow"] test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] -test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] +test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist", "wurlitzer"] [[package]] name = "coverage" @@ -715,38 +736,38 @@ toml = ["tomli"] [[package]] name = "cryptography" -version = "43.0.0" +version = "43.0.1" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-43.0.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:64c3f16e2a4fc51c0d06af28441881f98c5d91009b8caaff40cf3548089e9c74"}, - {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3dcdedae5c7710b9f97ac6bba7e1052b95c7083c9d0e9df96e02a1932e777895"}, - {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d9a1eca329405219b605fac09ecfc09ac09e595d6def650a437523fcd08dd22"}, - {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ea9e57f8ea880eeea38ab5abf9fbe39f923544d7884228ec67d666abd60f5a47"}, - {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9a8d6802e0825767476f62aafed40532bd435e8a5f7d23bd8b4f5fd04cc80ecf"}, - {file = "cryptography-43.0.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:cc70b4b581f28d0a254d006f26949245e3657d40d8857066c2ae22a61222ef55"}, - {file = "cryptography-43.0.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4a997df8c1c2aae1e1e5ac49c2e4f610ad037fc5a3aadc7b64e39dea42249431"}, - {file = "cryptography-43.0.0-cp37-abi3-win32.whl", hash = "sha256:6e2b11c55d260d03a8cf29ac9b5e0608d35f08077d8c087be96287f43af3ccdc"}, - {file = "cryptography-43.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:31e44a986ceccec3d0498e16f3d27b2ee5fdf69ce2ab89b52eaad1d2f33d8778"}, - {file = "cryptography-43.0.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:7b3f5fe74a5ca32d4d0f302ffe6680fcc5c28f8ef0dc0ae8f40c0f3a1b4fca66"}, - {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac1955ce000cb29ab40def14fd1bbfa7af2017cca696ee696925615cafd0dce5"}, - {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:299d3da8e00b7e2b54bb02ef58d73cd5f55fb31f33ebbf33bd00d9aa6807df7e"}, - {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ee0c405832ade84d4de74b9029bedb7b31200600fa524d218fc29bfa371e97f5"}, - {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cb013933d4c127349b3948aa8aaf2f12c0353ad0eccd715ca789c8a0f671646f"}, - {file = "cryptography-43.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fdcb265de28585de5b859ae13e3846a8e805268a823a12a4da2597f1f5afc9f0"}, - {file = "cryptography-43.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2905ccf93a8a2a416f3ec01b1a7911c3fe4073ef35640e7ee5296754e30b762b"}, - {file = "cryptography-43.0.0-cp39-abi3-win32.whl", hash = "sha256:47ca71115e545954e6c1d207dd13461ab81f4eccfcb1345eac874828b5e3eaaf"}, - {file = "cryptography-43.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:0663585d02f76929792470451a5ba64424acc3cd5227b03921dab0e2f27b1709"}, - {file = "cryptography-43.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2c6d112bf61c5ef44042c253e4859b3cbbb50df2f78fa8fae6747a7814484a70"}, - {file = "cryptography-43.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:844b6d608374e7d08f4f6e6f9f7b951f9256db41421917dfb2d003dde4cd6b66"}, - {file = "cryptography-43.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:51956cf8730665e2bdf8ddb8da0056f699c1a5715648c1b0144670c1ba00b48f"}, - {file = "cryptography-43.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:aae4d918f6b180a8ab8bf6511a419473d107df4dbb4225c7b48c5c9602c38c7f"}, - {file = "cryptography-43.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:232ce02943a579095a339ac4b390fbbe97f5b5d5d107f8a08260ea2768be8cc2"}, - {file = "cryptography-43.0.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5bcb8a5620008a8034d39bce21dc3e23735dfdb6a33a06974739bfa04f853947"}, - {file = "cryptography-43.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:08a24a7070b2b6804c1940ff0f910ff728932a9d0e80e7814234269f9d46d069"}, - {file = "cryptography-43.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e9c5266c432a1e23738d178e51c2c7a5e2ddf790f248be939448c0ba2021f9d1"}, - {file = "cryptography-43.0.0.tar.gz", hash = "sha256:b88075ada2d51aa9f18283532c9f60e72170041bba88d7f37e49cbb10275299e"}, + {file = "cryptography-43.0.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:8385d98f6a3bf8bb2d65a73e17ed87a3ba84f6991c155691c51112075f9ffc5d"}, + {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27e613d7077ac613e399270253259d9d53872aaf657471473ebfc9a52935c062"}, + {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68aaecc4178e90719e95298515979814bda0cbada1256a4485414860bd7ab962"}, + {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:de41fd81a41e53267cb020bb3a7212861da53a7d39f863585d13ea11049cf277"}, + {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f98bf604c82c416bc829e490c700ca1553eafdf2912a91e23a79d97d9801372a"}, + {file = "cryptography-43.0.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:61ec41068b7b74268fa86e3e9e12b9f0c21fcf65434571dbb13d954bceb08042"}, + {file = "cryptography-43.0.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:014f58110f53237ace6a408b5beb6c427b64e084eb451ef25a28308270086494"}, + {file = "cryptography-43.0.1-cp37-abi3-win32.whl", hash = "sha256:2bd51274dcd59f09dd952afb696bf9c61a7a49dfc764c04dd33ef7a6b502a1e2"}, + {file = "cryptography-43.0.1-cp37-abi3-win_amd64.whl", hash = "sha256:666ae11966643886c2987b3b721899d250855718d6d9ce41b521252a17985f4d"}, + {file = "cryptography-43.0.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac119bb76b9faa00f48128b7f5679e1d8d437365c5d26f1c2c3f0da4ce1b553d"}, + {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bbcce1a551e262dfbafb6e6252f1ae36a248e615ca44ba302df077a846a8806"}, + {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58d4e9129985185a06d849aa6df265bdd5a74ca6e1b736a77959b498e0505b85"}, + {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d03a475165f3134f773d1388aeb19c2d25ba88b6a9733c5c590b9ff7bbfa2e0c"}, + {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:511f4273808ab590912a93ddb4e3914dfd8a388fed883361b02dea3791f292e1"}, + {file = "cryptography-43.0.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:80eda8b3e173f0f247f711eef62be51b599b5d425c429b5d4ca6a05e9e856baa"}, + {file = "cryptography-43.0.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:38926c50cff6f533f8a2dae3d7f19541432610d114a70808f0926d5aaa7121e4"}, + {file = "cryptography-43.0.1-cp39-abi3-win32.whl", hash = "sha256:a575913fb06e05e6b4b814d7f7468c2c660e8bb16d8d5a1faf9b33ccc569dd47"}, + {file = "cryptography-43.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:d75601ad10b059ec832e78823b348bfa1a59f6b8d545db3a24fd44362a1564cb"}, + {file = "cryptography-43.0.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ea25acb556320250756e53f9e20a4177515f012c9eaea17eb7587a8c4d8ae034"}, + {file = "cryptography-43.0.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c1332724be35d23a854994ff0b66530119500b6053d0bd3363265f7e5e77288d"}, + {file = "cryptography-43.0.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fba1007b3ef89946dbbb515aeeb41e30203b004f0b4b00e5e16078b518563289"}, + {file = "cryptography-43.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5b43d1ea6b378b54a1dc99dd8a2b5be47658fe9a7ce0a58ff0b55f4b43ef2b84"}, + {file = "cryptography-43.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:88cce104c36870d70c49c7c8fd22885875d950d9ee6ab54df2745f83ba0dc365"}, + {file = "cryptography-43.0.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:9d3cdb25fa98afdd3d0892d132b8d7139e2c087da1712041f6b762e4f807cc96"}, + {file = "cryptography-43.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e710bf40870f4db63c3d7d929aa9e09e4e7ee219e703f949ec4073b4294f6172"}, + {file = "cryptography-43.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7c05650fe8023c5ed0d46793d4b7d7e6cd9c04e68eabe5b0aeea836e37bdcec2"}, + {file = "cryptography-43.0.1.tar.gz", hash = "sha256:203e92a75716d8cfb491dc47c79e17d0d9207ccffcbcb35f598fbe463ae3444d"}, ] [package.dependencies] @@ -759,7 +780,7 @@ nox = ["nox"] pep8test = ["check-sdist", "click", "mypy", "ruff"] sdist = ["build"] ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi", "cryptography-vectors (==43.0.0)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test = ["certifi", "cryptography-vectors (==43.0.1)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] [[package]] @@ -779,13 +800,13 @@ tests = ["pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "dash" -version = "2.17.1" +version = "2.18.1" description = "A Python framework for building reactive web-apps. Developed by Plotly." optional = false python-versions = ">=3.8" files = [ - {file = "dash-2.17.1-py3-none-any.whl", hash = "sha256:3eefc9ac67003f93a06bc3e500cae0a6787c48e6c81f6f61514239ae2da414e4"}, - {file = "dash-2.17.1.tar.gz", hash = "sha256:ee2d9c319de5dcc1314085710b72cd5fa63ff994d913bf72979b7130daeea28e"}, + {file = "dash-2.18.1-py3-none-any.whl", hash = "sha256:07c4513bb5f79a4b936847a0b49afc21dbd4b001ff77ea78d4d836043e211a07"}, + {file = "dash-2.18.1.tar.gz", hash = "sha256:ffdf89690d734f6851ef1cb344222826ffb11ad2214ab9172668bf8aadd75d12"}, ] [package.dependencies] @@ -886,13 +907,13 @@ files = [ [[package]] name = "datadog-api-client" -version = "2.27.0" +version = "2.28.0" description = "Collection of all Datadog Public endpoints" optional = false python-versions = ">=3.7" files = [ - {file = "datadog_api_client-2.27.0-py3-none-any.whl", hash = "sha256:8d0d96fa6930e7556644a1d6f6f8cde4102055851c5f55d4e5c0e7ea54e2206b"}, - {file = "datadog_api_client-2.27.0.tar.gz", hash = "sha256:902dd264feaf74fd8749897497f01d7f47e2190dc4362765fec805c197e498cc"}, + {file = "datadog_api_client-2.28.0-py3-none-any.whl", hash = "sha256:104b97574cd4704274aba54dcf4d9628561602d83f2bea29d7591bb6b3acc2a9"}, + {file = "datadog_api_client-2.28.0.tar.gz", hash = "sha256:5748dc0beeff9f8d408bd87d62deb0f4c3019e46202dbbcd1b57e47495ded53f"}, ] [package.dependencies] @@ -931,81 +952,92 @@ files = [ [[package]] name = "dependency-injector" -version = "4.41.0" +version = "4.42.0" description = "Dependency injection framework for Python" optional = false python-versions = "*" files = [ - {file = "dependency-injector-4.41.0.tar.gz", hash = "sha256:939dfc657104bc3e66b67afd3fb2ebb0850c9a1e73d0d26066f2bbdd8735ff9c"}, - {file = "dependency_injector-4.41.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a2381a251b04244125148298212550750e6e1403e9b2850cc62e0e829d050ad3"}, - {file = "dependency_injector-4.41.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75280dfa23f7c88e1bf56c3920d58a43516816de6f6ab2a6650bb8a0f27d5c2c"}, - {file = "dependency_injector-4.41.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63bfba21f8bff654a80e9b9d06dd6c43a442990b73bf89cd471314c11c541ec2"}, - {file = "dependency_injector-4.41.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3535d06416251715b45f8412482b58ec1c6196a4a3baa207f947f0b03a7c4b44"}, - {file = "dependency_injector-4.41.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d09c08c944a25dabfb454238c1a889acd85102b93ae497de523bf9ab7947b28a"}, - {file = "dependency_injector-4.41.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:586a0821720b15932addbefb00f7370fbcd5831d6ebbd6494d774b44ff96d23a"}, - {file = "dependency_injector-4.41.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7fa4970f12a3fc95d8796938b11c41276ad1ff4c447b0e589212eab3fc527a90"}, - {file = "dependency_injector-4.41.0-cp310-cp310-win32.whl", hash = "sha256:d557e40673de984f78dab13ebd68d27fbb2f16d7c4e3b663ea2fa2f9fae6765b"}, - {file = "dependency_injector-4.41.0-cp310-cp310-win_amd64.whl", hash = "sha256:3744c327d18408e74781bd6d8b7738745ee80ef89f2c8daecf9ebd098cb84972"}, - {file = "dependency_injector-4.41.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:89c67edffe7007cf33cee79ecbca38f48efcc2add5c280717af434db6c789377"}, - {file = "dependency_injector-4.41.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:786f7aac592e191c9caafc47732161d807bad65c62f260cd84cd73c7e2d67d6d"}, - {file = "dependency_injector-4.41.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b61a15bc46a3aa7b29bd8a7384b650aa3a7ef943491e93c49a0540a0b3dda4"}, - {file = "dependency_injector-4.41.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4f113e5d4c3070973ad76e5bda7317e500abae6083d78689f0b6e37cf403abf"}, - {file = "dependency_injector-4.41.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5fa3ed8f0700e47a0e7363f949b4525ffa8277aa1c5b10ca5b41fce4dea61bb9"}, - {file = "dependency_injector-4.41.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:05e15ea0f2b14c1127e8b0d1597fef13f98845679f63bf670ba12dbfc12a16ef"}, - {file = "dependency_injector-4.41.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3055b3fc47a0d6e5f27defb4166c0d37543a4967c279549b154afaf506ce6efc"}, - {file = "dependency_injector-4.41.0-cp311-cp311-win32.whl", hash = "sha256:37d5954026e3831663518d78bdf4be9c2dbfea691edcb73c813aa3093aa4363a"}, - {file = "dependency_injector-4.41.0-cp311-cp311-win_amd64.whl", hash = "sha256:f89a507e389b7e4d4892dd9a6f5f4da25849e24f73275478634ac594d621ab3f"}, - {file = "dependency_injector-4.41.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ac79f3c05747f9724bd56c06985e78331fc6c85eb50f3e3f1a35e0c60f9977e9"}, - {file = "dependency_injector-4.41.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75e7a733b372db3144a34020c4233f6b94db2c6342d6d16bc5245b1b941ee2bd"}, - {file = "dependency_injector-4.41.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40936d9384363331910abd59dd244158ec3572abf9d37322f15095315ac99893"}, - {file = "dependency_injector-4.41.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a31d9d60be4b585585081109480cfb2ef564d3b851cb32a139bf8408411a93a"}, - {file = "dependency_injector-4.41.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:953bfac819d32dc72b963767589e0ed372e5e9e78b03fb6b89419d0500d34bbe"}, - {file = "dependency_injector-4.41.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:8f0090ff14038f17a026ca408a3a0b0e7affb6aa7498b2b59d670f40ac970fbe"}, - {file = "dependency_injector-4.41.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:6b29abac56ce347d2eb58a560723e1663ee2125cf5cc38866ed92b84319927ec"}, - {file = "dependency_injector-4.41.0-cp36-cp36m-win32.whl", hash = "sha256:059fbb48333148143e8667a5323d162628dfe27c386bd0ed3deeecfc390338bf"}, - {file = "dependency_injector-4.41.0-cp36-cp36m-win_amd64.whl", hash = "sha256:16de2797dcfcc2263b8672bf0751166f7c7b369ca2ff9246ceb67b65f8e1d802"}, - {file = "dependency_injector-4.41.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c71d30b6708438050675f338edb9a25bea6c258478dbe5ec8405286756a2d347"}, - {file = "dependency_injector-4.41.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d283aee588a72072439e6721cb64aa6cba5bc18c576ef0ab28285a6ec7a9d655"}, - {file = "dependency_injector-4.41.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc852da612c7e347f2fcf921df2eca2718697a49f648a28a63db3ab504fd9510"}, - {file = "dependency_injector-4.41.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02620454ee8101f77a317f3229935ce687480883d72a40858ff4b0c87c935cce"}, - {file = "dependency_injector-4.41.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7a92680bea1c260e5c0d2d6cd60b0c913cba76a456a147db5ac047ecfcfcc758"}, - {file = "dependency_injector-4.41.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:168334cba3f1cbf55299ef38f0f2e31879115cc767b780c859f7814a52d80abb"}, - {file = "dependency_injector-4.41.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:48b6886a87b4ceb9b9f78550f77b2a5c7d2ce33bc83efd886556ad468cc9c85a"}, - {file = "dependency_injector-4.41.0-cp37-cp37m-win32.whl", hash = "sha256:87be84084a1b922c4ba15e2e5aa900ee24b78a5467997cb7aec0a1d6cdb4a00b"}, - {file = "dependency_injector-4.41.0-cp37-cp37m-win_amd64.whl", hash = "sha256:8b8cf1c6c56f5c18bdbd9f5e93b52ca29cb4d99606d4056e91f0c761eef496dc"}, - {file = "dependency_injector-4.41.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a8686fa330c83251c75c8238697686f7a0e0f6d40658538089165dc72df9bcff"}, - {file = "dependency_injector-4.41.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d670a844268dcd758195e58e9a5b39fc74bb8648aba99a13135a4a10ec9cfac"}, - {file = "dependency_injector-4.41.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e3b9d41e0eff4c8e16fea1e33de66ff0030fe51137ca530f3c52ce110447914"}, - {file = "dependency_injector-4.41.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33a724e0a737baadb4378f5dc1b079867cc3a88552fcca719b3dba84716828b2"}, - {file = "dependency_injector-4.41.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3588bd887b051d16b8bcabaae1127eb14059a0719a8fe34c8a75ba59321b352c"}, - {file = "dependency_injector-4.41.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:409441122f40e1b4b8582845fdd76deb9dc5c9d6eb74a057b85736ef9e9c671f"}, - {file = "dependency_injector-4.41.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7dcba8665cafec825b7095d5dd80afb5cf14404450eca3fe8b66e1edbf4dbc10"}, - {file = "dependency_injector-4.41.0-cp38-cp38-win32.whl", hash = "sha256:8b51efeaebacaf79ef68edfc65e9687699ccffb3538c4a3ab30d0d77e2db7189"}, - {file = "dependency_injector-4.41.0-cp38-cp38-win_amd64.whl", hash = "sha256:1662e2ef60ac6e681b9e11b5d8b7c17a0f733688916cf695f9540f8f50a61b1e"}, - {file = "dependency_injector-4.41.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:51217cb384b468d7cc355544cec20774859f00812f9a1a71ed7fa701c957b2a7"}, - {file = "dependency_injector-4.41.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3890a12423ae3a9eade035093beba487f8d092ee6c6cb8706f4e7080a56e819"}, - {file = "dependency_injector-4.41.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99ed73b1521bf249e2823a08a730c9f9413a58f4b4290da022e0ad4fb333ba3d"}, - {file = "dependency_injector-4.41.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:300838e9d4f3fbf539892a5a4072851728e23b37a1f467afcf393edd994d88f0"}, - {file = "dependency_injector-4.41.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:56d37b9d2f50a18f059d9abdbea7669a7518bd42b81603c21a27910a2b3f1657"}, - {file = "dependency_injector-4.41.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:4a44ca3ce5867513a70b31855b218be3d251f5068ce1c480cc3a4ad24ffd3280"}, - {file = "dependency_injector-4.41.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:67b369592c57549ccdcad0d5fef1ddb9d39af7fed8083d76e789ab0111fc6389"}, - {file = "dependency_injector-4.41.0-cp39-cp39-win32.whl", hash = "sha256:740a8e8106a04d3f44b52b25b80570fdac96a8a3934423de7c9202c5623e7936"}, - {file = "dependency_injector-4.41.0-cp39-cp39-win_amd64.whl", hash = "sha256:22b11dbf696e184f0b3d5ac4e5418aeac3c379ba4ea758c04a83869b7e5d1cbf"}, - {file = "dependency_injector-4.41.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b365a8548e9a49049fa6acb24d3cd939f619eeb8e300ca3e156e44402dcc07ec"}, - {file = "dependency_injector-4.41.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5168dc59808317dc4cdd235aa5d7d556d33e5600156acaf224cead236b48a3e8"}, - {file = "dependency_injector-4.41.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3229d83e99e255451605d5276604386e06ad948e3d60f31ddd796781c77f76f"}, - {file = "dependency_injector-4.41.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1baee908f21190bdc46a65ce4c417a5175e9397ca62354928694fce218f84487"}, - {file = "dependency_injector-4.41.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:b37f36ecb0c1227f697e1d4a029644e3eda8dd0f0716aa63ad04d96dbb15bbbb"}, - {file = "dependency_injector-4.41.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b0c9c966ff66c77364a2d43d08de9968aff7e3903938fe912ba49796b2133344"}, - {file = "dependency_injector-4.41.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12e91ac0333e7e589421943ff6c6bf9cf0d9ac9703301cec37ccff3723406332"}, - {file = "dependency_injector-4.41.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2440b32474d4e747209528ca3ae48f42563b2fbe3d74dbfe949c11dfbfef7c4"}, - {file = "dependency_injector-4.41.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54032d62610cf2f4421c9d92cef52957215aaa0bca403cda580c58eb3f726eda"}, - {file = "dependency_injector-4.41.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:76b94c8310929e54136f3cb3de3adc86d1a657b3984299f40bf1cd2ba0bae548"}, - {file = "dependency_injector-4.41.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6ee9810841c6e0599356cb884d16453bfca6ab739d0e4f0248724ed8f9ee0d79"}, - {file = "dependency_injector-4.41.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b98945edae88e777091bf0848f869fb94bd76dfa4066d7c870a5caa933391d0"}, - {file = "dependency_injector-4.41.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a2dee5d4abdd21f1a30a51d46645c095be9dcc404c7c6e9f81d0a01415a49e64"}, - {file = "dependency_injector-4.41.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d03f5fa0fa98a18bd0dfce846db80e2798607f0b861f1f99c97f441f7669d7a2"}, - {file = "dependency_injector-4.41.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f2842e15bae664a9f69932e922b02afa055c91efec959cb1896f6c499bf68180"}, + {file = "dependency_injector-4.42.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0bb90f064970366acddc6e946626dd9b59505dc0f798459fe31fce458a8d0fc5"}, + {file = "dependency_injector-4.42.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf96588c58790768c9ebb2f61532dc847236bdf7317b07cfdf75a14d63c3114e"}, + {file = "dependency_injector-4.42.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54b3ef487584bf2f9945b3f2f97e0ada8933e773960e0a3c4b40d369e37003fb"}, + {file = "dependency_injector-4.42.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0625b993dc3c58c35b613d9ccdf0eb8420f978f62d19d71820ea7630326972d"}, + {file = "dependency_injector-4.42.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4a4eb3356e26273f8065266fab4fd51c863afafe10e586d3bfc67340677e2674"}, + {file = "dependency_injector-4.42.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dffba9e2864b5d002f5b3bd89df4cde4f20dec4c2cd073ce0bd460229ed0afdb"}, + {file = "dependency_injector-4.42.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:19b50b48030dfa7cd3488253cbe7ee69c9b737275ac1aa184d9e995f44bb8317"}, + {file = "dependency_injector-4.42.0-cp310-cp310-win32.whl", hash = "sha256:68af4878040573a710202e171ecc1cec2c47910783f59d14c299f68439f8fe0b"}, + {file = "dependency_injector-4.42.0-cp310-cp310-win_amd64.whl", hash = "sha256:8eb65b102b36d171dfdf6c9b06766797d97d535b83a61859d1d91092b960c05a"}, + {file = "dependency_injector-4.42.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:952565b29186ce59f6972eb4cd37a927b3f3b61a2715345f0d6f4a7c01305ebb"}, + {file = "dependency_injector-4.42.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae4593738906f8b2ec3e61fda30e6b7dc24f34b83dad5d4ac0d8a07c4be6c3e8"}, + {file = "dependency_injector-4.42.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffddebe6d22394b0e8b3a41ef8d140d2bd829cbcc39fc48e5f560fe3db8ac3f5"}, + {file = "dependency_injector-4.42.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8271ffd0c95c598c9340b8f4c21478a7029c4dcba85d377fcbedf708f3f1564a"}, + {file = "dependency_injector-4.42.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8796683cce845204ebe6594b617ce2407742534fce4635db5c30e8dcf4a0e2f0"}, + {file = "dependency_injector-4.42.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8fc9aedb66a26b6fc0cd6065e52c45e9197cec6ab0b32b9e565421ad2be66a88"}, + {file = "dependency_injector-4.42.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:36f78f7e3fe5c95f11757928d7b93c0d4a5fd38be45172fa1a9eb1653d3261de"}, + {file = "dependency_injector-4.42.0-cp311-cp311-win32.whl", hash = "sha256:9eb1dcb897c00b853e3843ba15947cc2b25b6af947077ea65d7d5bef84d0d0d8"}, + {file = "dependency_injector-4.42.0-cp311-cp311-win_amd64.whl", hash = "sha256:cd794587a8b71cda35231b3351977765ffd3f09dd8b8be1f981726c76b44742f"}, + {file = "dependency_injector-4.42.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f283c0c67cd71723744b6016f6f55b6e2ee790059816b0cc1d6792ec236e62e9"}, + {file = "dependency_injector-4.42.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1e9016f864fb8f58a53a7ce13ddccb3b44d5333b205101301d42168dfbada5e"}, + {file = "dependency_injector-4.42.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c5a39274cd130f9adc6beb7b9488c7a2faf55f9d894124908f1209d9c84c3b7"}, + {file = "dependency_injector-4.42.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b478f65b20844ed3f9fda5edb1f09e34575e006c439c387283fd833053e3bd1"}, + {file = "dependency_injector-4.42.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:524654f11c839b2e8ea0b217f49f762182daf244a5ecdf7339b664d9d77be7f1"}, + {file = "dependency_injector-4.42.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:386bc36d337c17e149a11f89d33e6383b9d05cff18c68d8e95a50f3483b03ff1"}, + {file = "dependency_injector-4.42.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c2d632b9ff85cc9158c4f815109faedbd4c384bab839aefc288c3249024a2a66"}, + {file = "dependency_injector-4.42.0-cp312-cp312-win32.whl", hash = "sha256:ecfca509e0108fbb85c2af3ebaa8eaa4a6dcacafc93d0ad8e0ca46b74c8d0df7"}, + {file = "dependency_injector-4.42.0-cp312-cp312-win_amd64.whl", hash = "sha256:34d506b31b150ed2f8191ec0b7f9f7e67f8d8ba90414d23c14c4e3515ac9d0c2"}, + {file = "dependency_injector-4.42.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bda68a7f6eef700c493de94daf532bd021aa65458209c11f8db6b0012aa1b32f"}, + {file = "dependency_injector-4.42.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578707e06c45b46a8db7eb5ebcd7a566bd0602197322184cf4a4e8c23a513ce4"}, + {file = "dependency_injector-4.42.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:89fd5f7937977b2deb8454bf4c7f3ffa9c630d4e893d99b1ceac9ebb075a5527"}, + {file = "dependency_injector-4.42.0-cp36-cp36m-musllinux_1_2_aarch64.whl", hash = "sha256:5997868c51898951abd1e606dfd993ed87df49beafa04652dfc6482e64f79771"}, + {file = "dependency_injector-4.42.0-cp36-cp36m-musllinux_1_2_i686.whl", hash = "sha256:07d262d8438d79bc4d4fe500d6bbffaf24c7b3b5f2c87973de6dba7b33851f20"}, + {file = "dependency_injector-4.42.0-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:ac755e5aaf268edc00590bd4c8b6618f6e5dfdedbc417dd532ea8d61f6d372b3"}, + {file = "dependency_injector-4.42.0-cp36-cp36m-win32.whl", hash = "sha256:d2ff45f5ddcab3c833e685c8851f03b7bb7360911db39f1960bd8a8f7ef7e515"}, + {file = "dependency_injector-4.42.0-cp36-cp36m-win_amd64.whl", hash = "sha256:656d89135118b31ac8e49c4fae09ae31119f50a61ba6af0da121aea774210d70"}, + {file = "dependency_injector-4.42.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8797cfe97bd8cb3672286a9c759244032b46c25e4360d91f710b348c2d0605bc"}, + {file = "dependency_injector-4.42.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e071f40a9d911b16555171a5030e27c6c3b379d984fff2b4a78a10183108557"}, + {file = "dependency_injector-4.42.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6204e5da66e92e51df6df363dce98ad994c969631535909014df3e4e5c8a3b23"}, + {file = "dependency_injector-4.42.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:86814cba9a39658b3632b40ae93e5dc44a7de7214b9f23bf3311a216bdf59526"}, + {file = "dependency_injector-4.42.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:d7c26d3de4fb98594c23bc8813933ede4f624544ab7f5b4f13d75a672ed3f276"}, + {file = "dependency_injector-4.42.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:82cfa80b6c57463314e18aa3d01fba62131aa98f15bad55f185eef7e101a6f34"}, + {file = "dependency_injector-4.42.0-cp37-cp37m-win32.whl", hash = "sha256:690d3c0cafc2e7ada536255f093fe05aff8bac6d5b46c9ebe144ff004c509498"}, + {file = "dependency_injector-4.42.0-cp37-cp37m-win_amd64.whl", hash = "sha256:14b6e91997691b26b62b39dfd50b6246765274ce2768a9bb491bcd77b994700b"}, + {file = "dependency_injector-4.42.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5437faac11595c0d50275d520554dc85d9e9909d9d1c7eb8c56cf28b91869f1a"}, + {file = "dependency_injector-4.42.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:611cb623399aac15e356a68ad5d8ee9e01c02b47f19b81c061f510c6e624bed7"}, + {file = "dependency_injector-4.42.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8507e2c7c769ff6b74d5cbca58cc6d08c34d09c5972c890b2514fb653c930e8"}, + {file = "dependency_injector-4.42.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:51cccaf884d62953a688da483494b113e670598c4591e99701638db0baa8a5fe"}, + {file = "dependency_injector-4.42.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:96e10090424415d6762da4945ec06b3391ce03a7da43e01a64b09e44cd25563e"}, + {file = "dependency_injector-4.42.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:39c21064fc042a809dfc5f93cd149ecb893be9eaf8f839d147ea2d1d19507b19"}, + {file = "dependency_injector-4.42.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:9eebc5775de27eb33b994aa864f81061b39007b4370fbde3525749acf5fc2d68"}, + {file = "dependency_injector-4.42.0-cp38-cp38-win32.whl", hash = "sha256:1e65c16fe88ec4bdb80dff01874bc3447809f78942c7c77293d0ffdf15e2cddf"}, + {file = "dependency_injector-4.42.0-cp38-cp38-win_amd64.whl", hash = "sha256:8d198e25ecbfbef4c1c5f331d0630bfcb1252534dcf32600e0e72d0aab292213"}, + {file = "dependency_injector-4.42.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1b285f2399594bdb7770fe1e7d9dd3180cabfefcac93e64ed61cda0cf73be943"}, + {file = "dependency_injector-4.42.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6e52a74f4d06dcde0033e92f6a29fa5f91b4a81be5f99795315e5f945bdff8b"}, + {file = "dependency_injector-4.42.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28bb5b94adc35d997d1e34b829c03104ff3756024ded6da767198f7291c4e959"}, + {file = "dependency_injector-4.42.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f38c9ddfb9160aee62cbe424d7bf67099b7f21c7777cdbbad7c1106dc35f667f"}, + {file = "dependency_injector-4.42.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a158bf48ebbd04ae97a69ffbf00e3a45c6f6879886b23583eeee655a544838a3"}, + {file = "dependency_injector-4.42.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:435bed281c68146e789970938ca6576ac999cd4e09f7f64ddc7674158bc62d42"}, + {file = "dependency_injector-4.42.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:43a70b098626eb2e72c77a819c31641de5e96b87573c37f459ec580035390868"}, + {file = "dependency_injector-4.42.0-cp39-cp39-win32.whl", hash = "sha256:6524d1403a589f3eebdf925aef95f350cf7b86f72e09c798ec0a1e6464435e1a"}, + {file = "dependency_injector-4.42.0-cp39-cp39-win_amd64.whl", hash = "sha256:932b0c6cccfb336cf7d0b8d8fce36f58983d543a3a4e81309d6190732160c3ad"}, + {file = "dependency_injector-4.42.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:e040496d6d22ed0bab2ab96a13734a22bd4f60b74b73a4a682688fc0e615841c"}, + {file = "dependency_injector-4.42.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2507d1de74314340479b57e31c103e0fcfa5135de03b07a774794cfb244f6098"}, + {file = "dependency_injector-4.42.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:67f52a45a00fd93e33b3d5c45181298ae2f09c56640e41524eec517ceccaf2fc"}, + {file = "dependency_injector-4.42.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b20c4d1be03eac0ab8e7ec91604f58a9fae705f6a4e228802c6302464cc1701"}, + {file = "dependency_injector-4.42.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0d11dcd7461747ae968e5e459eb5389652e6f49ab00eecfe05b19249f6d5aebd"}, + {file = "dependency_injector-4.42.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51f6fce317725cdc738ef45e5a56c28c51d15b060a346324ed8c547d9965035f"}, + {file = "dependency_injector-4.42.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f677d62b6de82a7e6c14db1f40831a80cd54324d20bb1c053f200860202b5ec1"}, + {file = "dependency_injector-4.42.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45498d2bc1b801686f3123d753b47310876dab34642bcda283df774dcfd1a2de"}, + {file = "dependency_injector-4.42.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:f1b99e832919d784a7979bef3afa7ba10653c24e4ea55177578e87fb645bbf43"}, + {file = "dependency_injector-4.42.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:5a3fcdb443222b03770c6dbee0feb425e2d633099bde9ece758136cca4d73fc6"}, + {file = "dependency_injector-4.42.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c1a121d37f9511604afbcbc8fc30c322fb3161e71178c240afaad521fa1916a"}, + {file = "dependency_injector-4.42.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1464bc2c707a4657c31188bf8fda45b107cb67c324dde829b69db7f1d4a458f"}, + {file = "dependency_injector-4.42.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d83f3a38be04d54c9abda8d95bf26ef6f4f913c54bcc0511e17c65d4a605954"}, + {file = "dependency_injector-4.42.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:c57016c155071b88d8f14c79e7c06557b5518ce4df2c57c7e7f214118b6cdeda"}, + {file = "dependency_injector-4.42.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1b6ce807fec00c9ef93c318ce28f641f40a01e76df2d4505f2ba16b2dd3f8943"}, + {file = "dependency_injector-4.42.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ee595345d77a2375eaf3fb5c75d099c7593b6efd3088d7a44f5553241f66194"}, + {file = "dependency_injector-4.42.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:502c9dedda77f35154d0ff934d2368e90749aa03198a9356081b82b63c387fcd"}, + {file = "dependency_injector-4.42.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2048628b98c61ec96fe2c2022b175cd1f629516bae635f2e4a9bca33aa9fa85"}, + {file = "dependency_injector-4.42.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b29610964250ee1f532c079112e1a58e41f27670b02a5890433ed8ca1313a9ed"}, + {file = "dependency_injector-4.42.0.tar.gz", hash = "sha256:7057fc07b89aa09bc1c75e4190a8a6b86a3038d91a6d8302aea4f8094b184cd0"}, ] [package.dependencies] @@ -1083,13 +1115,13 @@ test = ["pytest (>=6)"] [[package]] name = "executing" -version = "2.0.1" +version = "2.1.0" description = "Get the currently executing AST node of a frame, and other information" optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" files = [ - {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, - {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, + {file = "executing-2.1.0-py2.py3-none-any.whl", hash = "sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf"}, + {file = "executing-2.1.0.tar.gz", hash = "sha256:8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab"}, ] [package.extras] @@ -1242,13 +1274,13 @@ files = [ [[package]] name = "google-api-core" -version = "2.19.1" +version = "2.19.2" description = "Google API client core library" optional = false python-versions = ">=3.7" files = [ - {file = "google-api-core-2.19.1.tar.gz", hash = "sha256:f4695f1e3650b316a795108a76a1c416e6afb036199d1c1f1f110916df479ffd"}, - {file = "google_api_core-2.19.1-py3-none-any.whl", hash = "sha256:f12a9b8309b5e21d92483bbd47ce2c445861ec7d269ef6784ecc0ea8c1fa6125"}, + {file = "google_api_core-2.19.2-py3-none-any.whl", hash = "sha256:53ec0258f2837dd53bbd3d3df50f5359281b3cc13f800c941dd15a9b5a415af4"}, + {file = "google_api_core-2.19.2.tar.gz", hash = "sha256:ca07de7e8aa1c98a8bfca9321890ad2340ef7f2eb136e558cee68f24b94b0a8f"}, ] [package.dependencies] @@ -1288,13 +1320,13 @@ requests = ["requests (>=2.20.0,<3.0.0.dev0)"] [[package]] name = "googleapis-common-protos" -version = "1.63.2" +version = "1.65.0" description = "Common protobufs used in Google APIs" optional = false python-versions = ">=3.7" files = [ - {file = "googleapis-common-protos-1.63.2.tar.gz", hash = "sha256:27c5abdffc4911f28101e635de1533fb4cfd2c37fbaa9174587c799fac90aa87"}, - {file = "googleapis_common_protos-1.63.2-py2.py3-none-any.whl", hash = "sha256:27a2499c7e8aff199665b22741997e485eccc8645aa9176c7c988e6fae507945"}, + {file = "googleapis_common_protos-1.65.0-py2.py3-none-any.whl", hash = "sha256:2972e6c496f435b92590fd54045060867f3fe9be2c82ab148fc8885035479a63"}, + {file = "googleapis_common_protos-1.65.0.tar.gz", hash = "sha256:334a29d07cddc3aa01dee4988f9afd9b2916ee2ff49d6b757155dc0d197852c0"}, ] [package.dependencies] @@ -1305,61 +1337,61 @@ grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] [[package]] name = "grpcio" -version = "1.65.5" +version = "1.66.1" description = "HTTP/2-based RPC framework" optional = false python-versions = ">=3.8" files = [ - {file = "grpcio-1.65.5-cp310-cp310-linux_armv7l.whl", hash = "sha256:b67d450f1e008fedcd81e097a3a400a711d8be1a8b20f852a7b8a73fead50fe3"}, - {file = "grpcio-1.65.5-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:a70a20eed87bba647a38bedd93b3ce7db64b3f0e8e0952315237f7f5ca97b02d"}, - {file = "grpcio-1.65.5-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:f79c87c114bf37adf408026b9e2e333fe9ff31dfc9648f6f80776c513145c813"}, - {file = "grpcio-1.65.5-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f17f9fa2d947dbfaca01b3ab2c62eefa8240131fdc67b924eb42ce6032e3e5c1"}, - {file = "grpcio-1.65.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32d60e18ff7c34fe3f6db3d35ad5c6dc99f5b43ff3982cb26fad4174462d10b1"}, - {file = "grpcio-1.65.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fe6505376f5b00bb008e4e1418152e3ad3d954b629da286c7913ff3cfc0ff740"}, - {file = "grpcio-1.65.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:33158e56c6378063923c417e9fbdb28660b6e0e2835af42e67f5a7793f587af7"}, - {file = "grpcio-1.65.5-cp310-cp310-win32.whl", hash = "sha256:1cbc208edb9acf1cc339396a1a36b83796939be52f34e591c90292045b579fbf"}, - {file = "grpcio-1.65.5-cp310-cp310-win_amd64.whl", hash = "sha256:bc74f3f745c37e2c5685c9d2a2d5a94de00f286963f5213f763ae137bf4f2358"}, - {file = "grpcio-1.65.5-cp311-cp311-linux_armv7l.whl", hash = "sha256:3207ae60d07e5282c134b6e02f9271a2cb523c6d7a346c6315211fe2bf8d61ed"}, - {file = "grpcio-1.65.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a2f80510f99f82d4eb825849c486df703f50652cea21c189eacc2b84f2bde764"}, - {file = "grpcio-1.65.5-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:a80e9a5e3f93c54f5eb82a3825ea1fc4965b2fa0026db2abfecb139a5c4ecdf1"}, - {file = "grpcio-1.65.5-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b2944390a496567de9e70418f3742b477d85d8ca065afa90432edc91b4bb8ad"}, - {file = "grpcio-1.65.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3655139d7be213c32c79ef6fb2367cae28e56ef68e39b1961c43214b457f257"}, - {file = "grpcio-1.65.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:05f02d68fc720e085f061b704ee653b181e6d5abfe315daef085719728d3d1fd"}, - {file = "grpcio-1.65.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1c4caafe71aef4dabf53274bbf4affd6df651e9f80beedd6b8e08ff438ed3260"}, - {file = "grpcio-1.65.5-cp311-cp311-win32.whl", hash = "sha256:84c901cdec16a092099f251ef3360d15e29ef59772150fa261d94573612539b5"}, - {file = "grpcio-1.65.5-cp311-cp311-win_amd64.whl", hash = "sha256:11f8b16121768c1cb99d7dcb84e01510e60e6a206bf9123e134118802486f035"}, - {file = "grpcio-1.65.5-cp312-cp312-linux_armv7l.whl", hash = "sha256:ee6ed64a27588a2c94e8fa84fe8f3b5c89427d4d69c37690903d428ec61ca7e4"}, - {file = "grpcio-1.65.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:76991b7a6fb98630a3328839755181ce7c1aa2b1842aa085fd4198f0e5198960"}, - {file = "grpcio-1.65.5-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:89c00a18801b1ed9cc441e29b521c354725d4af38c127981f2c950c796a09b6e"}, - {file = "grpcio-1.65.5-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:078038e150a897e5e402ed3d57f1d31ebf604cbed80f595bd281b5da40762a92"}, - {file = "grpcio-1.65.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c97962720489ef31b5ad8a916e22bc31bba3664e063fb9f6702dce056d4aa61b"}, - {file = "grpcio-1.65.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:b8270b15b99781461b244f5c81d5c2bc9696ab9189fb5ff86c841417fb3b39fe"}, - {file = "grpcio-1.65.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8e5c4c15ac3fe1eb68e46bc51e66ad29be887479f231f8237cf8416058bf0cc1"}, - {file = "grpcio-1.65.5-cp312-cp312-win32.whl", hash = "sha256:f5b5970341359341d0e4c789da7568264b2a89cd976c05ea476036852b5950cd"}, - {file = "grpcio-1.65.5-cp312-cp312-win_amd64.whl", hash = "sha256:238a625f391a1b9f5f069bdc5930f4fd71b74426bea52196fc7b83f51fa97d34"}, - {file = "grpcio-1.65.5-cp38-cp38-linux_armv7l.whl", hash = "sha256:6c4e62bcf297a1568f627f39576dbfc27f1e5338a691c6dd5dd6b3979da51d1c"}, - {file = "grpcio-1.65.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:d7df567b67d16d4177835a68d3f767bbcbad04da9dfb52cbd19171f430c898bd"}, - {file = "grpcio-1.65.5-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:b7ca419f1462390851eec395b2089aad1e49546b52d4e2c972ceb76da69b10f8"}, - {file = "grpcio-1.65.5-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fa36dd8496d3af0d40165252a669fa4f6fd2db4b4026b9a9411cbf060b9d6a15"}, - {file = "grpcio-1.65.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a101696f9ece90a0829988ff72f1b1ea2358f3df035bdf6d675dd8b60c2c0894"}, - {file = "grpcio-1.65.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2a6d8169812932feac514b420daffae8ab8e36f90f3122b94ae767e633296b17"}, - {file = "grpcio-1.65.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:47d0aaaab82823f0aa6adea5184350b46e2252e13a42a942db84da5b733f2e05"}, - {file = "grpcio-1.65.5-cp38-cp38-win32.whl", hash = "sha256:85ae8f8517d5bcc21fb07dbf791e94ed84cc28f84c903cdc2bd7eaeb437c8f45"}, - {file = "grpcio-1.65.5-cp38-cp38-win_amd64.whl", hash = "sha256:770bd4bd721961f6dd8049bc27338564ba8739913f77c0f381a9815e465ff965"}, - {file = "grpcio-1.65.5-cp39-cp39-linux_armv7l.whl", hash = "sha256:ab5ec837d8cee8dbce9ef6386125f119b231e4333cc6b6d57b6c5c7c82a72331"}, - {file = "grpcio-1.65.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cabd706183ee08d8026a015af5819a0b3a8959bdc9d1f6fdacd1810f09200f2a"}, - {file = "grpcio-1.65.5-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:ec71fc5b39821ad7d80db7473c8f8c2910f3382f0ddadfbcfc2c6c437107eb67"}, - {file = "grpcio-1.65.5-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3a9e35bcb045e39d7cac30464c285389b9a816ac2067e4884ad2c02e709ef8e"}, - {file = "grpcio-1.65.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d750e9330eb14236ca11b78d0c494eed13d6a95eb55472298f0e547c165ee324"}, - {file = "grpcio-1.65.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2b91ce647b6307f25650872454a4d02a2801f26a475f90d0b91ed8110baae589"}, - {file = "grpcio-1.65.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8da58ff80bc4556cf29bc03f5fff1f03b8387d6aaa7b852af9eb65b2cf833be4"}, - {file = "grpcio-1.65.5-cp39-cp39-win32.whl", hash = "sha256:7a412959aa5f08c5ac04aa7b7c3c041f5e4298cadd4fcc2acff195b56d185ebc"}, - {file = "grpcio-1.65.5-cp39-cp39-win_amd64.whl", hash = "sha256:55714ea852396ec9568f45f487639945ab674de83c12bea19d5ddbc3ae41ada3"}, - {file = "grpcio-1.65.5.tar.gz", hash = "sha256:ec6f219fb5d677a522b0deaf43cea6697b16f338cb68d009e30930c4aa0d2209"}, + {file = "grpcio-1.66.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:4877ba180591acdf127afe21ec1c7ff8a5ecf0fe2600f0d3c50e8c4a1cbc6492"}, + {file = "grpcio-1.66.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:3750c5a00bd644c75f4507f77a804d0189d97a107eb1481945a0cf3af3e7a5ac"}, + {file = "grpcio-1.66.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:a013c5fbb12bfb5f927444b477a26f1080755a931d5d362e6a9a720ca7dbae60"}, + {file = "grpcio-1.66.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b1b24c23d51a1e8790b25514157d43f0a4dce1ac12b3f0b8e9f66a5e2c4c132f"}, + {file = "grpcio-1.66.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7ffb8ea674d68de4cac6f57d2498fef477cef582f1fa849e9f844863af50083"}, + {file = "grpcio-1.66.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:307b1d538140f19ccbd3aed7a93d8f71103c5d525f3c96f8616111614b14bf2a"}, + {file = "grpcio-1.66.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1c17ebcec157cfb8dd445890a03e20caf6209a5bd4ac5b040ae9dbc59eef091d"}, + {file = "grpcio-1.66.1-cp310-cp310-win32.whl", hash = "sha256:ef82d361ed5849d34cf09105d00b94b6728d289d6b9235513cb2fcc79f7c432c"}, + {file = "grpcio-1.66.1-cp310-cp310-win_amd64.whl", hash = "sha256:292a846b92cdcd40ecca46e694997dd6b9be6c4c01a94a0dfb3fcb75d20da858"}, + {file = "grpcio-1.66.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:c30aeceeaff11cd5ddbc348f37c58bcb96da8d5aa93fed78ab329de5f37a0d7a"}, + {file = "grpcio-1.66.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8a1e224ce6f740dbb6b24c58f885422deebd7eb724aff0671a847f8951857c26"}, + {file = "grpcio-1.66.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:a66fe4dc35d2330c185cfbb42959f57ad36f257e0cc4557d11d9f0a3f14311df"}, + {file = "grpcio-1.66.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3ba04659e4fce609de2658fe4dbf7d6ed21987a94460f5f92df7579fd5d0e22"}, + {file = "grpcio-1.66.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4573608e23f7e091acfbe3e84ac2045680b69751d8d67685ffa193a4429fedb1"}, + {file = "grpcio-1.66.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7e06aa1f764ec8265b19d8f00140b8c4b6ca179a6dc67aa9413867c47e1fb04e"}, + {file = "grpcio-1.66.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3885f037eb11f1cacc41f207b705f38a44b69478086f40608959bf5ad85826dd"}, + {file = "grpcio-1.66.1-cp311-cp311-win32.whl", hash = "sha256:97ae7edd3f3f91480e48ede5d3e7d431ad6005bfdbd65c1b56913799ec79e791"}, + {file = "grpcio-1.66.1-cp311-cp311-win_amd64.whl", hash = "sha256:cfd349de4158d797db2bd82d2020554a121674e98fbe6b15328456b3bf2495bb"}, + {file = "grpcio-1.66.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:a92c4f58c01c77205df6ff999faa008540475c39b835277fb8883b11cada127a"}, + {file = "grpcio-1.66.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:fdb14bad0835914f325349ed34a51940bc2ad965142eb3090081593c6e347be9"}, + {file = "grpcio-1.66.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:f03a5884c56256e08fd9e262e11b5cfacf1af96e2ce78dc095d2c41ccae2c80d"}, + {file = "grpcio-1.66.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ca2559692d8e7e245d456877a85ee41525f3ed425aa97eb7a70fc9a79df91a0"}, + {file = "grpcio-1.66.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84ca1be089fb4446490dd1135828bd42a7c7f8421e74fa581611f7afdf7ab761"}, + {file = "grpcio-1.66.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:d639c939ad7c440c7b2819a28d559179a4508783f7e5b991166f8d7a34b52815"}, + {file = "grpcio-1.66.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b9feb4e5ec8dc2d15709f4d5fc367794d69277f5d680baf1910fc9915c633524"}, + {file = "grpcio-1.66.1-cp312-cp312-win32.whl", hash = "sha256:7101db1bd4cd9b880294dec41a93fcdce465bdbb602cd8dc5bd2d6362b618759"}, + {file = "grpcio-1.66.1-cp312-cp312-win_amd64.whl", hash = "sha256:b0aa03d240b5539648d996cc60438f128c7f46050989e35b25f5c18286c86734"}, + {file = "grpcio-1.66.1-cp38-cp38-linux_armv7l.whl", hash = "sha256:ecfe735e7a59e5a98208447293ff8580e9db1e890e232b8b292dc8bd15afc0d2"}, + {file = "grpcio-1.66.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4825a3aa5648010842e1c9d35a082187746aa0cdbf1b7a2a930595a94fb10fce"}, + {file = "grpcio-1.66.1-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:f517fd7259fe823ef3bd21e508b653d5492e706e9f0ef82c16ce3347a8a5620c"}, + {file = "grpcio-1.66.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f1fe60d0772831d96d263b53d83fb9a3d050a94b0e94b6d004a5ad111faa5b5b"}, + {file = "grpcio-1.66.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31a049daa428f928f21090403e5d18ea02670e3d5d172581670be006100db9ef"}, + {file = "grpcio-1.66.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6f914386e52cbdeb5d2a7ce3bf1fdfacbe9d818dd81b6099a05b741aaf3848bb"}, + {file = "grpcio-1.66.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bff2096bdba686019fb32d2dde45b95981f0d1490e054400f70fc9a8af34b49d"}, + {file = "grpcio-1.66.1-cp38-cp38-win32.whl", hash = "sha256:aa8ba945c96e73de29d25331b26f3e416e0c0f621e984a3ebdb2d0d0b596a3b3"}, + {file = "grpcio-1.66.1-cp38-cp38-win_amd64.whl", hash = "sha256:161d5c535c2bdf61b95080e7f0f017a1dfcb812bf54093e71e5562b16225b4ce"}, + {file = "grpcio-1.66.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:d0cd7050397b3609ea51727b1811e663ffda8bda39c6a5bb69525ef12414b503"}, + {file = "grpcio-1.66.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0e6c9b42ded5d02b6b1fea3a25f036a2236eeb75d0579bfd43c0018c88bf0a3e"}, + {file = "grpcio-1.66.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:c9f80f9fad93a8cf71c7f161778ba47fd730d13a343a46258065c4deb4b550c0"}, + {file = "grpcio-1.66.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5dd67ed9da78e5121efc5c510f0122a972216808d6de70953a740560c572eb44"}, + {file = "grpcio-1.66.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48b0d92d45ce3be2084b92fb5bae2f64c208fea8ceed7fccf6a7b524d3c4942e"}, + {file = "grpcio-1.66.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:4d813316d1a752be6f5c4360c49f55b06d4fe212d7df03253dfdae90c8a402bb"}, + {file = "grpcio-1.66.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9c9bebc6627873ec27a70fc800f6083a13c70b23a5564788754b9ee52c5aef6c"}, + {file = "grpcio-1.66.1-cp39-cp39-win32.whl", hash = "sha256:30a1c2cf9390c894c90bbc70147f2372130ad189cffef161f0432d0157973f45"}, + {file = "grpcio-1.66.1-cp39-cp39-win_amd64.whl", hash = "sha256:17663598aadbedc3cacd7bbde432f541c8e07d2496564e22b214b22c7523dac8"}, + {file = "grpcio-1.66.1.tar.gz", hash = "sha256:35334f9c9745add3e357e3372756fd32d925bd52c41da97f4dfdafbde0bf0ee2"}, ] [package.extras] -protobuf = ["grpcio-tools (>=1.65.5)"] +protobuf = ["grpcio-tools (>=1.66.1)"] [[package]] name = "grpclib" @@ -1551,15 +1583,18 @@ sparktrials = ["pyspark"] [[package]] name = "idna" -version = "3.7" +version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" files = [ - {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, - {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, ] +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + [[package]] name = "ifaddr" version = "0.2.0" @@ -1584,40 +1619,48 @@ files = [ [[package]] name = "importlib-metadata" -version = "8.3.0" +version = "8.5.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-8.3.0-py3-none-any.whl", hash = "sha256:42817a4a0be5845d22c6e212db66a94ad261e2318d80b3e0d363894a79df2b67"}, - {file = "importlib_metadata-8.3.0.tar.gz", hash = "sha256:9c8fa6e8ea0f9516ad5c8db9246a731c948193c7754d3babb0114a05b27dd364"}, + {file = "importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b"}, + {file = "importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7"}, ] [package.dependencies] -zipp = ">=0.5" +zipp = ">=3.20" [package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] perf = ["ipython"] -test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] +test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] +type = ["pytest-mypy"] [[package]] name = "importlib-resources" -version = "6.4.3" +version = "6.4.5" description = "Read resources from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_resources-6.4.3-py3-none-any.whl", hash = "sha256:2d6dfe3b9e055f72495c2085890837fc8c758984e209115c8792bddcb762cd93"}, - {file = "importlib_resources-6.4.3.tar.gz", hash = "sha256:4a202b9b9d38563b46da59221d77bb73862ab5d79d461307bcb826d725448b98"}, + {file = "importlib_resources-6.4.5-py3-none-any.whl", hash = "sha256:ac29d5f956f01d5e4bb63102a5a19957f1b9175e45649977264a1416783bb717"}, + {file = "importlib_resources-6.4.5.tar.gz", hash = "sha256:980862a1d16c9e147a59603677fa2aa5fd82b87f223b6cb870695bcfce830065"}, ] [package.dependencies] zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} [package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -test = ["jaraco.test (>=5.4)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)", "zipp (>=3.17)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["jaraco.test (>=5.4)", "pytest (>=6,!=8.1.*)", "zipp (>=3.17)"] +type = ["pytest-mypy"] [[package]] name = "iniconfig" @@ -1682,21 +1725,21 @@ test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.22)", "pa [[package]] name = "ipywidgets" -version = "8.1.3" +version = "8.1.5" description = "Jupyter interactive widgets" optional = false python-versions = ">=3.7" files = [ - {file = "ipywidgets-8.1.3-py3-none-any.whl", hash = "sha256:efafd18f7a142248f7cb0ba890a68b96abd4d6e88ddbda483c9130d12667eaf2"}, - {file = "ipywidgets-8.1.3.tar.gz", hash = "sha256:f5f9eeaae082b1823ce9eac2575272952f40d748893972956dc09700a6392d9c"}, + {file = "ipywidgets-8.1.5-py3-none-any.whl", hash = "sha256:3290f526f87ae6e77655555baba4f36681c555b8bdbbff430b70e52c34c86245"}, + {file = "ipywidgets-8.1.5.tar.gz", hash = "sha256:870e43b1a35656a80c18c9503bbf2d16802db1cb487eec6fab27d683381dde17"}, ] [package.dependencies] comm = ">=0.1.3" ipython = ">=6.1.0" -jupyterlab-widgets = ">=3.0.11,<3.1.0" +jupyterlab-widgets = ">=3.0.12,<3.1.0" traitlets = ">=4.3.1" -widgetsnbextension = ">=4.0.11,<4.1.0" +widgetsnbextension = ">=4.0.12,<4.1.0" [package.extras] test = ["ipykernel", "jsonschema", "pytest (>=3.6.0)", "pytest-cov", "pytz"] @@ -1875,126 +1918,136 @@ files = [ [[package]] name = "jupyterlab-widgets" -version = "3.0.11" +version = "3.0.13" description = "Jupyter interactive widgets for JupyterLab" optional = false python-versions = ">=3.7" files = [ - {file = "jupyterlab_widgets-3.0.11-py3-none-any.whl", hash = "sha256:78287fd86d20744ace330a61625024cf5521e1c012a352ddc0a3cdc2348becd0"}, - {file = "jupyterlab_widgets-3.0.11.tar.gz", hash = "sha256:dd5ac679593c969af29c9bed054c24f26842baa51352114736756bc035deee27"}, + {file = "jupyterlab_widgets-3.0.13-py3-none-any.whl", hash = "sha256:e3cda2c233ce144192f1e29914ad522b2f4c40e77214b0cc97377ca3d323db54"}, + {file = "jupyterlab_widgets-3.0.13.tar.gz", hash = "sha256:a2966d385328c1942b683a8cd96b89b8dd82c8b8f81dda902bb2bc06d46f5bed"}, ] [[package]] name = "kiwisolver" -version = "1.4.5" +version = "1.4.7" description = "A fast implementation of the Cassowary constraint solver" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af"}, - {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3"}, - {file = "kiwisolver-1.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b"}, - {file = "kiwisolver-1.4.5-cp310-cp310-win32.whl", hash = "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238"}, - {file = "kiwisolver-1.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276"}, - {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5"}, - {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90"}, - {file = "kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f"}, - {file = "kiwisolver-1.4.5-cp311-cp311-win32.whl", hash = "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac"}, - {file = "kiwisolver-1.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355"}, - {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a"}, - {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192"}, - {file = "kiwisolver-1.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a"}, - {file = "kiwisolver-1.4.5-cp312-cp312-win32.whl", hash = "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20"}, - {file = "kiwisolver-1.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-win32.whl", hash = "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-win_amd64.whl", hash = "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a"}, - {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71"}, - {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93"}, - {file = "kiwisolver-1.4.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250"}, - {file = "kiwisolver-1.4.5-cp38-cp38-win32.whl", hash = "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e"}, - {file = "kiwisolver-1.4.5-cp38-cp38-win_amd64.whl", hash = "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced"}, - {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d"}, - {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9"}, - {file = "kiwisolver-1.4.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77"}, - {file = "kiwisolver-1.4.5-cp39-cp39-win32.whl", hash = "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f"}, - {file = "kiwisolver-1.4.5-cp39-cp39-win_amd64.whl", hash = "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee"}, - {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"}, + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8a9c83f75223d5e48b0bc9cb1bf2776cf01563e00ade8775ffe13b0b6e1af3a6"}, + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:58370b1ffbd35407444d57057b57da5d6549d2d854fa30249771775c63b5fe17"}, + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aa0abdf853e09aff551db11fce173e2177d00786c688203f52c87ad7fcd91ef9"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8d53103597a252fb3ab8b5845af04c7a26d5e7ea8122303dd7a021176a87e8b9"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:88f17c5ffa8e9462fb79f62746428dd57b46eb931698e42e990ad63103f35e6c"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a9ca9c710d598fd75ee5de59d5bda2684d9db36a9f50b6125eaea3969c2599"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f4d742cb7af1c28303a51b7a27aaee540e71bb8e24f68c736f6f2ffc82f2bf05"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28c7fea2196bf4c2f8d46a0415c77a1c480cc0724722f23d7410ffe9842c407"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e968b84db54f9d42046cf154e02911e39c0435c9801681e3fc9ce8a3c4130278"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0c18ec74c0472de033e1bebb2911c3c310eef5649133dd0bedf2a169a1b269e5"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8f0ea6da6d393d8b2e187e6a5e3fb81f5862010a40c3945e2c6d12ae45cfb2ad"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:f106407dda69ae456dd1227966bf445b157ccc80ba0dff3802bb63f30b74e895"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:84ec80df401cfee1457063732d90022f93951944b5b58975d34ab56bb150dfb3"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win32.whl", hash = "sha256:71bb308552200fb2c195e35ef05de12f0c878c07fc91c270eb3d6e41698c3bcc"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win_amd64.whl", hash = "sha256:44756f9fd339de0fb6ee4f8c1696cfd19b2422e0d70b4cefc1cc7f1f64045a8c"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win_arm64.whl", hash = "sha256:78a42513018c41c2ffd262eb676442315cbfe3c44eed82385c2ed043bc63210a"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d2b0e12a42fb4e72d509fc994713d099cbb15ebf1103545e8a45f14da2dfca54"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2a8781ac3edc42ea4b90bc23e7d37b665d89423818e26eb6df90698aa2287c95"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:46707a10836894b559e04b0fd143e343945c97fd170d69a2d26d640b4e297935"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef97b8df011141c9b0f6caf23b29379f87dd13183c978a30a3c546d2c47314cb"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab58c12a2cd0fc769089e6d38466c46d7f76aced0a1f54c77652446733d2d02"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:803b8e1459341c1bb56d1c5c010406d5edec8a0713a0945851290a7930679b51"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9a9e8a507420fe35992ee9ecb302dab68550dedc0da9e2880dd88071c5fb052"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18077b53dc3bb490e330669a99920c5e6a496889ae8c63b58fbc57c3d7f33a18"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6af936f79086a89b3680a280c47ea90b4df7047b5bdf3aa5c524bbedddb9e545"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3abc5b19d24af4b77d1598a585b8a719beb8569a71568b66f4ebe1fb0449460b"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:933d4de052939d90afbe6e9d5273ae05fb836cc86c15b686edd4b3560cc0ee36"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:65e720d2ab2b53f1f72fb5da5fb477455905ce2c88aaa671ff0a447c2c80e8e3"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3bf1ed55088f214ba6427484c59553123fdd9b218a42bbc8c6496d6754b1e523"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win32.whl", hash = "sha256:4c00336b9dd5ad96d0a558fd18a8b6f711b7449acce4c157e7343ba92dd0cf3d"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win_amd64.whl", hash = "sha256:929e294c1ac1e9f615c62a4e4313ca1823ba37326c164ec720a803287c4c499b"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win_arm64.whl", hash = "sha256:e33e8fbd440c917106b237ef1a2f1449dfbb9b6f6e1ce17c94cd6a1e0d438376"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:5360cc32706dab3931f738d3079652d20982511f7c0ac5711483e6eab08efff2"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:942216596dc64ddb25adb215c3c783215b23626f8d84e8eff8d6d45c3f29f75a"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:48b571ecd8bae15702e4f22d3ff6a0f13e54d3d00cd25216d5e7f658242065ee"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad42ba922c67c5f219097b28fae965e10045ddf145d2928bfac2eb2e17673640"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:612a10bdae23404a72941a0fc8fa2660c6ea1217c4ce0dbcab8a8f6543ea9e7f"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e838bba3a3bac0fe06d849d29772eb1afb9745a59710762e4ba3f4cb8424483"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:22f499f6157236c19f4bbbd472fa55b063db77a16cd74d49afe28992dff8c258"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693902d433cf585133699972b6d7c42a8b9f8f826ebcaf0132ff55200afc599e"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4e77f2126c3e0b0d055f44513ed349038ac180371ed9b52fe96a32aa071a5107"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:657a05857bda581c3656bfc3b20e353c232e9193eb167766ad2dc58b56504948"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4bfa75a048c056a411f9705856abfc872558e33c055d80af6a380e3658766038"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:34ea1de54beef1c104422d210c47c7d2a4999bdecf42c7b5718fbe59a4cac383"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:90da3b5f694b85231cf93586dad5e90e2d71b9428f9aad96952c99055582f520"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win32.whl", hash = "sha256:18e0cca3e008e17fe9b164b55735a325140a5a35faad8de92dd80265cd5eb80b"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:58cb20602b18f86f83a5c87d3ee1c766a79c0d452f8def86d925e6c60fbf7bfb"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:f5a8b53bdc0b3961f8b6125e198617c40aeed638b387913bf1ce78afb1b0be2a"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2e6039dcbe79a8e0f044f1c39db1986a1b8071051efba3ee4d74f5b365f5226e"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a1ecf0ac1c518487d9d23b1cd7139a6a65bc460cd101ab01f1be82ecf09794b6"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7ab9ccab2b5bd5702ab0803676a580fffa2aa178c2badc5557a84cc943fcf750"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f816dd2277f8d63d79f9c8473a79fe54047bc0467754962840782c575522224d"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf8bcc23ceb5a1b624572a1623b9f79d2c3b337c8c455405ef231933a10da379"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dea0bf229319828467d7fca8c7c189780aa9ff679c94539eed7532ebe33ed37c"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c06a4c7cf15ec739ce0e5971b26c93638730090add60e183530d70848ebdd34"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:913983ad2deb14e66d83c28b632fd35ba2b825031f2fa4ca29675e665dfecbe1"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5337ec7809bcd0f424c6b705ecf97941c46279cf5ed92311782c7c9c2026f07f"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4c26ed10c4f6fa6ddb329a5120ba3b6db349ca192ae211e882970bfc9d91420b"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c619b101e6de2222c1fcb0531e1b17bbffbe54294bfba43ea0d411d428618c27"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:073a36c8273647592ea332e816e75ef8da5c303236ec0167196793eb1e34657a"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3ce6b2b0231bda412463e152fc18335ba32faf4e8c23a754ad50ffa70e4091ee"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win32.whl", hash = "sha256:f4c9aee212bc89d4e13f58be11a56cc8036cabad119259d12ace14b34476fd07"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:8a3ec5aa8e38fc4c8af308917ce12c536f1c88452ce554027e55b22cbbfbff76"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:76c8094ac20ec259471ac53e774623eb62e6e1f56cd8690c67ce6ce4fcb05650"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5d5abf8f8ec1f4e22882273c423e16cae834c36856cac348cfbfa68e01c40f3a"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:aeb3531b196ef6f11776c21674dba836aeea9d5bd1cf630f869e3d90b16cfade"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7d755065e4e866a8086c9bdada157133ff466476a2ad7861828e17b6026e22c"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08471d4d86cbaec61f86b217dd938a83d85e03785f51121e791a6e6689a3be95"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7bbfcb7165ce3d54a3dfbe731e470f65739c4c1f85bb1018ee912bae139e263b"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d34eb8494bea691a1a450141ebb5385e4b69d38bb8403b5146ad279f4b30fa3"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9242795d174daa40105c1d86aba618e8eab7bf96ba8c3ee614da8302a9f95503"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a0f64a48bb81af7450e641e3fe0b0394d7381e342805479178b3d335d60ca7cf"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8e045731a5416357638d1700927529e2b8ab304811671f665b225f8bf8d8f933"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:4322872d5772cae7369f8351da1edf255a604ea7087fe295411397d0cfd9655e"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:e1631290ee9271dffe3062d2634c3ecac02c83890ada077d225e081aca8aab89"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:edcfc407e4eb17e037bca59be0e85a2031a2ac87e4fed26d3e9df88b4165f92d"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:4d05d81ecb47d11e7f8932bd8b61b720bf0b41199358f3f5e36d38e28f0532c5"}, + {file = "kiwisolver-1.4.7-cp38-cp38-win32.whl", hash = "sha256:b38ac83d5f04b15e515fd86f312479d950d05ce2368d5413d46c088dda7de90a"}, + {file = "kiwisolver-1.4.7-cp38-cp38-win_amd64.whl", hash = "sha256:d83db7cde68459fc803052a55ace60bea2bae361fc3b7a6d5da07e11954e4b09"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3f9362ecfca44c863569d3d3c033dbe8ba452ff8eed6f6b5806382741a1334bd"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e8df2eb9b2bac43ef8b082e06f750350fbbaf2887534a5be97f6cf07b19d9583"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f32d6edbc638cde7652bd690c3e728b25332acbadd7cad670cc4a02558d9c417"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e2e6c39bd7b9372b0be21456caab138e8e69cc0fc1190a9dfa92bd45a1e6e904"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dda56c24d869b1193fcc763f1284b9126550eaf84b88bbc7256e15028f19188a"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79849239c39b5e1fd906556c474d9b0439ea6792b637511f3fe3a41158d89ca8"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e3bc157fed2a4c02ec468de4ecd12a6e22818d4f09cde2c31ee3226ffbefab2"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3da53da805b71e41053dc670f9a820d1157aae77b6b944e08024d17bcd51ef88"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8705f17dfeb43139a692298cb6637ee2e59c0194538153e83e9ee0c75c2eddde"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:82a5c2f4b87c26bb1a0ef3d16b5c4753434633b83d365cc0ddf2770c93829e3c"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce8be0466f4c0d585cdb6c1e2ed07232221df101a4c6f28821d2aa754ca2d9e2"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:409afdfe1e2e90e6ee7fc896f3df9a7fec8e793e58bfa0d052c8a82f99c37abb"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5b9c3f4ee0b9a439d2415012bd1b1cc2df59e4d6a9939f4d669241d30b414327"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win32.whl", hash = "sha256:a79ae34384df2b615eefca647a2873842ac3b596418032bef9a7283675962644"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win_amd64.whl", hash = "sha256:cf0438b42121a66a3a667de17e779330fc0f20b0d97d59d2f2121e182b0505e4"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win_arm64.whl", hash = "sha256:764202cc7e70f767dab49e8df52c7455e8de0df5d858fa801a11aa0d882ccf3f"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:94252291e3fe68001b1dd747b4c0b3be12582839b95ad4d1b641924d68fd4643"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5b7dfa3b546da08a9f622bb6becdb14b3e24aaa30adba66749d38f3cc7ea9706"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd3de6481f4ed8b734da5df134cd5a6a64fe32124fe83dde1e5b5f29fe30b1e6"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a91b5f9f1205845d488c928e8570dcb62b893372f63b8b6e98b863ebd2368ff2"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40fa14dbd66b8b8f470d5fc79c089a66185619d31645f9b0773b88b19f7223c4"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:eb542fe7933aa09d8d8f9d9097ef37532a7df6497819d16efe4359890a2f417a"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bfa1acfa0c54932d5607e19a2c24646fb4c1ae2694437789129cf099789a3b00"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:eee3ea935c3d227d49b4eb85660ff631556841f6e567f0f7bda972df6c2c9935"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f3160309af4396e0ed04db259c3ccbfdc3621b5559b5453075e5de555e1f3a1b"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a17f6a29cf8935e587cc8a4dbfc8368c55edc645283db0ce9801016f83526c2d"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10849fb2c1ecbfae45a693c070e0320a91b35dd4bcf58172c023b994283a124d"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:ac542bf38a8a4be2dc6b15248d36315ccc65f0743f7b1a76688ffb6b5129a5c2"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8b01aac285f91ca889c800042c35ad3b239e704b150cfd3382adfc9dcc780e39"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:48be928f59a1f5c8207154f935334d374e79f2b5d212826307d072595ad76a2e"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f37cfe618a117e50d8c240555331160d73d0411422b59b5ee217843d7b693608"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:599b5c873c63a1f6ed7eead644a8a380cfbdf5db91dcb6f85707aaab213b1674"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:801fa7802e5cfabe3ab0c81a34c323a319b097dfb5004be950482d882f3d7225"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0c6c43471bc764fad4bc99c5c2d6d16a676b1abf844ca7c8702bdae92df01ee0"}, + {file = "kiwisolver-1.4.7.tar.gz", hash = "sha256:9893ff81bd7107f7b685d3017cc6583daadb4fc26e4a888350df530e41980a60"}, ] [[package]] @@ -2388,22 +2441,22 @@ tests = ["pytest (>=4.6)"] [[package]] name = "msal" -version = "1.30.0" +version = "1.31.0" description = "The Microsoft Authentication Library (MSAL) for Python library enables your app to access the Microsoft Cloud by supporting authentication of users with Microsoft Azure Active Directory accounts (AAD) and Microsoft Accounts (MSA) using industry standard OAuth2 and OpenID Connect." optional = false python-versions = ">=3.7" files = [ - {file = "msal-1.30.0-py3-none-any.whl", hash = "sha256:423872177410cb61683566dc3932db7a76f661a5d2f6f52f02a047f101e1c1de"}, - {file = "msal-1.30.0.tar.gz", hash = "sha256:b4bf00850092e465157d814efa24a18f788284c9a479491024d62903085ea2fb"}, + {file = "msal-1.31.0-py3-none-any.whl", hash = "sha256:96bc37cff82ebe4b160d5fc0f1196f6ca8b50e274ecd0ec5bf69c438514086e7"}, + {file = "msal-1.31.0.tar.gz", hash = "sha256:2c4f189cf9cc8f00c80045f66d39b7c0f3ed45873fd3d1f2af9f22db2e12ff4b"}, ] [package.dependencies] -cryptography = ">=2.5,<45" +cryptography = ">=2.5,<46" PyJWT = {version = ">=1.0.0,<3", extras = ["crypto"]} requests = ">=2.0.0,<3" [package.extras] -broker = ["pymsalruntime (>=0.13.2,<0.17)"] +broker = ["pymsalruntime (>=0.14,<0.18)", "pymsalruntime (>=0.17,<0.18)"] [[package]] name = "msal-extensions" @@ -2422,102 +2475,107 @@ portalocker = ">=1.4,<3" [[package]] name = "multidict" -version = "6.0.5" +version = "6.1.0" description = "multidict implementation" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9"}, - {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604"}, - {file = "multidict-6.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc"}, - {file = "multidict-6.0.5-cp310-cp310-win32.whl", hash = "sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319"}, - {file = "multidict-6.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8"}, - {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba"}, - {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e"}, - {file = "multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e"}, - {file = "multidict-6.0.5-cp311-cp311-win32.whl", hash = "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c"}, - {file = "multidict-6.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea"}, - {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e"}, - {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b"}, - {file = "multidict-6.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda"}, - {file = "multidict-6.0.5-cp312-cp312-win32.whl", hash = "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5"}, - {file = "multidict-6.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556"}, - {file = "multidict-6.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc"}, - {file = "multidict-6.0.5-cp37-cp37m-win32.whl", hash = "sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee"}, - {file = "multidict-6.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423"}, - {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54"}, - {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d"}, - {file = "multidict-6.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44"}, - {file = "multidict-6.0.5-cp38-cp38-win32.whl", hash = "sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241"}, - {file = "multidict-6.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c"}, - {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929"}, - {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9"}, - {file = "multidict-6.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c"}, - {file = "multidict-6.0.5-cp39-cp39-win32.whl", hash = "sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b"}, - {file = "multidict-6.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755"}, - {file = "multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7"}, - {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, -] + {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60"}, + {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1"}, + {file = "multidict-6.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a114d03b938376557927ab23f1e950827c3b893ccb94b62fd95d430fd0e5cf53"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1c416351ee6271b2f49b56ad7f308072f6f44b37118d69c2cad94f3fa8a40d5"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b5d83030255983181005e6cfbac1617ce9746b219bc2aad52201ad121226581"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3e97b5e938051226dc025ec80980c285b053ffb1e25a3db2a3aa3bc046bf7f56"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d618649d4e70ac6efcbba75be98b26ef5078faad23592f9b51ca492953012429"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10524ebd769727ac77ef2278390fb0068d83f3acb7773792a5080f2b0abf7748"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ff3827aef427c89a25cc96ded1759271a93603aba9fb977a6d264648ebf989db"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:06809f4f0f7ab7ea2cabf9caca7d79c22c0758b58a71f9d32943ae13c7ace056"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f179dee3b863ab1c59580ff60f9d99f632f34ccb38bf67a33ec6b3ecadd0fd76"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:aaed8b0562be4a0876ee3b6946f6869b7bcdb571a5d1496683505944e268b160"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3c8b88a2ccf5493b6c8da9076fb151ba106960a2df90c2633f342f120751a9e7"}, + {file = "multidict-6.1.0-cp310-cp310-win32.whl", hash = "sha256:4a9cb68166a34117d6646c0023c7b759bf197bee5ad4272f420a0141d7eb03a0"}, + {file = "multidict-6.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:20b9b5fbe0b88d0bdef2012ef7dee867f874b72528cf1d08f1d59b0e3850129d"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3efe2c2cb5763f2f1b275ad2bf7a287d3f7ebbef35648a9726e3b69284a4f3d6"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2b90b43e696f25c62656389d32236e049568b39320e2735d51f08fd362761b"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d83a047959d38a7ff552ff94be767b7fd79b831ad1cd9920662db05fec24fe72"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1a9dd711d0877a1ece3d2e4fea11a8e75741ca21954c919406b44e7cf971304"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4867cafcbc6585e4b678876c489b9273b13e9fff9f6d6d66add5e15d11d926cb"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5b48204e8d955c47c55b72779802b219a39acc3ee3d0116d5080c388970b76e3"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8fff389528cad1618fb4b26b95550327495462cd745d879a8c7c2115248e399"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a7a9541cd308eed5e30318430a9c74d2132e9a8cb46b901326272d780bf2d423"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:da1758c76f50c39a2efd5e9859ce7d776317eb1dd34317c8152ac9251fc574a3"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c943a53e9186688b45b323602298ab727d8865d8c9ee0b17f8d62d14b56f0753"}, + {file = "multidict-6.1.0-cp311-cp311-win32.whl", hash = "sha256:90f8717cb649eea3504091e640a1b8568faad18bd4b9fcd692853a04475a4b80"}, + {file = "multidict-6.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3"}, + {file = "multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133"}, + {file = "multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6"}, + {file = "multidict-6.1.0-cp313-cp313-win32.whl", hash = "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81"}, + {file = "multidict-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:db7457bac39421addd0c8449933ac32d8042aae84a14911a757ae6ca3eef1392"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d094ddec350a2fb899fec68d8353c78233debde9b7d8b4beeafa70825f1c281a"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5845c1fd4866bb5dd3125d89b90e57ed3138241540897de748cdf19de8a2fca2"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9079dfc6a70abe341f521f78405b8949f96db48da98aeb43f9907f342f627cdc"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3914f5aaa0f36d5d60e8ece6a308ee1c9784cd75ec8151062614657a114c4478"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c08be4f460903e5a9d0f76818db3250f12e9c344e79314d1d570fc69d7f4eae4"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d093be959277cb7dee84b801eb1af388b6ad3ca6a6b6bf1ed7585895789d027d"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3702ea6872c5a2a4eeefa6ffd36b042e9773f05b1f37ae3ef7264b1163c2dcf6"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2090f6a85cafc5b2db085124d752757c9d251548cedabe9bd31afe6363e0aff2"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:f67f217af4b1ff66c68a87318012de788dd95fcfeb24cc889011f4e1c7454dfd"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:189f652a87e876098bbc67b4da1049afb5f5dfbaa310dd67c594b01c10388db6"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:6bb5992037f7a9eff7991ebe4273ea7f51f1c1c511e6a2ce511d0e7bdb754492"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f4c2b9e770c4e393876e35a7046879d195cd123b4f116d299d442b335bcd"}, + {file = "multidict-6.1.0-cp38-cp38-win32.whl", hash = "sha256:e27bbb6d14416713a8bd7aaa1313c0fc8d44ee48d74497a0ff4c3a1b6ccb5167"}, + {file = "multidict-6.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:22f3105d4fb15c8f57ff3959a58fcab6ce36814486500cd7485651230ad4d4ef"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4e18b656c5e844539d506a0a06432274d7bd52a7487e6828c63a63d69185626c"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a185f876e69897a6f3325c3f19f26a297fa058c5e456bfcff8015e9a27e83ae1"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab7c4ceb38d91570a650dba194e1ca87c2b543488fe9309b4212694174fd539c"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e617fb6b0b6953fffd762669610c1c4ffd05632c138d61ac7e14ad187870669c"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16e5f4bf4e603eb1fdd5d8180f1a25f30056f22e55ce51fb3d6ad4ab29f7d96f"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c035da3f544b1882bac24115f3e2e8760f10a0107614fc9839fd232200b875"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:957cf8e4b6e123a9eea554fa7ebc85674674b713551de587eb318a2df3e00255"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:483a6aea59cb89904e1ceabd2b47368b5600fb7de78a6e4a2c2987b2d256cf30"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:87701f25a2352e5bf7454caa64757642734da9f6b11384c1f9d1a8e699758057"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:682b987361e5fd7a139ed565e30d81fd81e9629acc7d925a205366877d8c8657"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce2186a7df133a9c895dea3331ddc5ddad42cdd0d1ea2f0a51e5d161e4762f28"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9f636b730f7e8cb19feb87094949ba54ee5357440b9658b2a32a5ce4bce53972"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:73eae06aa53af2ea5270cc066dcaf02cc60d2994bbb2c4ef5764949257d10f43"}, + {file = "multidict-6.1.0-cp39-cp39-win32.whl", hash = "sha256:1ca0083e80e791cffc6efce7660ad24af66c8d4079d2a750b29001b53ff59ada"}, + {file = "multidict-6.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:aa466da5b15ccea564bdab9c89175c762bc12825f4659c11227f515cee76fa4a"}, + {file = "multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506"}, + {file = "multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.11\""} [[package]] name = "nbclient" @@ -3084,29 +3142,29 @@ xmp = ["defusedxml"] [[package]] name = "platformdirs" -version = "4.2.2" +version = "4.3.3" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, - {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, + {file = "platformdirs-4.3.3-py3-none-any.whl", hash = "sha256:50a5450e2e84f44539718293cbb1da0a0885c9d14adf21b77bae4e66fc99d9b5"}, + {file = "platformdirs-4.3.3.tar.gz", hash = "sha256:d4e0b7d8ec176b341fb03cb11ca12d0276faa8c485f9cd218f613840463fc2c0"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] -type = ["mypy (>=1.8)"] +docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] +type = ["mypy (>=1.11.2)"] [[package]] name = "plotly" -version = "5.23.0" +version = "5.24.1" description = "An open-source, interactive data visualization library for Python" optional = false python-versions = ">=3.8" files = [ - {file = "plotly-5.23.0-py3-none-any.whl", hash = "sha256:76cbe78f75eddc10c56f5a4ee3e7ccaade7c0a57465546f02098c0caed6c2d1a"}, - {file = "plotly-5.23.0.tar.gz", hash = "sha256:89e57d003a116303a34de6700862391367dd564222ab71f8531df70279fc0193"}, + {file = "plotly-5.24.1-py3-none-any.whl", hash = "sha256:f67073a1e637eb0dc3e46324d9d51e2fe76e9727c892dde64ddf1e1b51f29089"}, + {file = "plotly-5.24.1.tar.gz", hash = "sha256:dbc8ac8339d248a4bcc36e08a5659bacfe1b079390b8953533f4eb22169b4bae"}, ] [package.dependencies] @@ -3231,22 +3289,22 @@ files = [ [[package]] name = "protobuf" -version = "5.27.3" +version = "5.28.1" description = "" optional = false python-versions = ">=3.8" files = [ - {file = "protobuf-5.27.3-cp310-abi3-win32.whl", hash = "sha256:dcb307cd4ef8fec0cf52cb9105a03d06fbb5275ce6d84a6ae33bc6cf84e0a07b"}, - {file = "protobuf-5.27.3-cp310-abi3-win_amd64.whl", hash = "sha256:16ddf3f8c6c41e1e803da7abea17b1793a97ef079a912e42351eabb19b2cffe7"}, - {file = "protobuf-5.27.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:68248c60d53f6168f565a8c76dc58ba4fa2ade31c2d1ebdae6d80f969cdc2d4f"}, - {file = "protobuf-5.27.3-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:b8a994fb3d1c11156e7d1e427186662b64694a62b55936b2b9348f0a7c6625ce"}, - {file = "protobuf-5.27.3-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:a55c48f2a2092d8e213bd143474df33a6ae751b781dd1d1f4d953c128a415b25"}, - {file = "protobuf-5.27.3-cp38-cp38-win32.whl", hash = "sha256:043853dcb55cc262bf2e116215ad43fa0859caab79bb0b2d31b708f128ece035"}, - {file = "protobuf-5.27.3-cp38-cp38-win_amd64.whl", hash = "sha256:c2a105c24f08b1e53d6c7ffe69cb09d0031512f0b72f812dd4005b8112dbe91e"}, - {file = "protobuf-5.27.3-cp39-cp39-win32.whl", hash = "sha256:c84eee2c71ed83704f1afbf1a85c3171eab0fd1ade3b399b3fad0884cbcca8bf"}, - {file = "protobuf-5.27.3-cp39-cp39-win_amd64.whl", hash = "sha256:af7c0b7cfbbb649ad26132e53faa348580f844d9ca46fd3ec7ca48a1ea5db8a1"}, - {file = "protobuf-5.27.3-py3-none-any.whl", hash = "sha256:8572c6533e544ebf6899c360e91d6bcbbee2549251643d32c52cf8a5de295ba5"}, - {file = "protobuf-5.27.3.tar.gz", hash = "sha256:82460903e640f2b7e34ee81a947fdaad89de796d324bcbc38ff5430bcdead82c"}, + {file = "protobuf-5.28.1-cp310-abi3-win32.whl", hash = "sha256:fc063acaf7a3d9ca13146fefb5b42ac94ab943ec6e978f543cd5637da2d57957"}, + {file = "protobuf-5.28.1-cp310-abi3-win_amd64.whl", hash = "sha256:4c7f5cb38c640919791c9f74ea80c5b82314c69a8409ea36f2599617d03989af"}, + {file = "protobuf-5.28.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:4304e4fceb823d91699e924a1fdf95cde0e066f3b1c28edb665bda762ecde10f"}, + {file = "protobuf-5.28.1-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:0dfd86d2b5edf03d91ec2a7c15b4e950258150f14f9af5f51c17fa224ee1931f"}, + {file = "protobuf-5.28.1-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:51f09caab818707ab91cf09cc5c156026599cf05a4520779ccbf53c1b352fb25"}, + {file = "protobuf-5.28.1-cp38-cp38-win32.whl", hash = "sha256:1b04bde117a10ff9d906841a89ec326686c48ececeb65690f15b8cabe7149495"}, + {file = "protobuf-5.28.1-cp38-cp38-win_amd64.whl", hash = "sha256:cabfe43044ee319ad6832b2fda332646f9ef1636b0130186a3ae0a52fc264bb4"}, + {file = "protobuf-5.28.1-cp39-cp39-win32.whl", hash = "sha256:4b4b9a0562a35773ff47a3df823177ab71a1f5eb1ff56d8f842b7432ecfd7fd2"}, + {file = "protobuf-5.28.1-cp39-cp39-win_amd64.whl", hash = "sha256:f24e5d70e6af8ee9672ff605d5503491635f63d5db2fffb6472be78ba62efd8f"}, + {file = "protobuf-5.28.1-py3-none-any.whl", hash = "sha256:c529535e5c0effcf417682563719e5d8ac8d2b93de07a56108b4c2d436d7a29a"}, + {file = "protobuf-5.28.1.tar.gz", hash = "sha256:42597e938f83bb7f3e4b35f03aa45208d49ae8d5bcb4bc10b9fc825e0ab5e423"}, ] [[package]] @@ -3316,24 +3374,24 @@ files = [ [[package]] name = "pyasn1" -version = "0.6.0" +version = "0.6.1" description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" optional = false python-versions = ">=3.8" files = [ - {file = "pyasn1-0.6.0-py2.py3-none-any.whl", hash = "sha256:cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473"}, - {file = "pyasn1-0.6.0.tar.gz", hash = "sha256:3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c"}, + {file = "pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629"}, + {file = "pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034"}, ] [[package]] name = "pyasn1-modules" -version = "0.4.0" +version = "0.4.1" description = "A collection of ASN.1-based protocols modules" optional = false python-versions = ">=3.8" files = [ - {file = "pyasn1_modules-0.4.0-py3-none-any.whl", hash = "sha256:be04f15b66c206eed667e0bb5ab27e2b1855ea54a842e5037738099e8ca4ae0b"}, - {file = "pyasn1_modules-0.4.0.tar.gz", hash = "sha256:831dbcea1b177b28c9baddf4c6d1013c24c3accd14a1873fffaa6a2e905f17b6"}, + {file = "pyasn1_modules-0.4.1-py3-none-any.whl", hash = "sha256:49bfa96b45a292b711e986f222502c1c9a5e1f4e568fc30e2574a6c7d07838fd"}, + {file = "pyasn1_modules-0.4.1.tar.gz", hash = "sha256:c28e2dbf9c06ad61c71a075c7e0f9fd0f1b0bb2d2ad4377f240d33ac2ab60a7c"}, ] [package.dependencies] @@ -3598,119 +3656,120 @@ files = [ [[package]] name = "pydantic" -version = "2.8.2" +version = "2.9.1" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.8.2-py3-none-any.whl", hash = "sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8"}, - {file = "pydantic-2.8.2.tar.gz", hash = "sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a"}, + {file = "pydantic-2.9.1-py3-none-any.whl", hash = "sha256:7aff4db5fdf3cf573d4b3c30926a510a10e19a0774d38fc4967f78beb6deb612"}, + {file = "pydantic-2.9.1.tar.gz", hash = "sha256:1363c7d975c7036df0db2b4a61f2e062fbc0aa5ab5f2772e0ffc7191a4f4bce2"}, ] [package.dependencies] -annotated-types = ">=0.4.0" -pydantic-core = "2.20.1" +annotated-types = ">=0.6.0" +pydantic-core = "2.23.3" typing-extensions = {version = ">=4.6.1", markers = "python_version < \"3.13\""} [package.extras] email = ["email-validator (>=2.0.0)"] +timezone = ["tzdata"] [[package]] name = "pydantic-core" -version = "2.20.1" +version = "2.23.3" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.20.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3acae97ffd19bf091c72df4d726d552c473f3576409b2a7ca36b2f535ffff4a3"}, - {file = "pydantic_core-2.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41f4c96227a67a013e7de5ff8f20fb496ce573893b7f4f2707d065907bffdbd6"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f239eb799a2081495ea659d8d4a43a8f42cd1fe9ff2e7e436295c38a10c286a"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53e431da3fc53360db73eedf6f7124d1076e1b4ee4276b36fb25514544ceb4a3"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1f62b2413c3a0e846c3b838b2ecd6c7a19ec6793b2a522745b0869e37ab5bc1"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d41e6daee2813ecceea8eda38062d69e280b39df793f5a942fa515b8ed67953"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d482efec8b7dc6bfaedc0f166b2ce349df0011f5d2f1f25537ced4cfc34fd98"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e93e1a4b4b33daed65d781a57a522ff153dcf748dee70b40c7258c5861e1768a"}, - {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7c4ea22b6739b162c9ecaaa41d718dfad48a244909fe7ef4b54c0b530effc5a"}, - {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4f2790949cf385d985a31984907fecb3896999329103df4e4983a4a41e13e840"}, - {file = "pydantic_core-2.20.1-cp310-none-win32.whl", hash = "sha256:5e999ba8dd90e93d57410c5e67ebb67ffcaadcea0ad973240fdfd3a135506250"}, - {file = "pydantic_core-2.20.1-cp310-none-win_amd64.whl", hash = "sha256:512ecfbefef6dac7bc5eaaf46177b2de58cdf7acac8793fe033b24ece0b9566c"}, - {file = "pydantic_core-2.20.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d2a8fa9d6d6f891f3deec72f5cc668e6f66b188ab14bb1ab52422fe8e644f312"}, - {file = "pydantic_core-2.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:175873691124f3d0da55aeea1d90660a6ea7a3cfea137c38afa0a5ffabe37b88"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37eee5b638f0e0dcd18d21f59b679686bbd18917b87db0193ae36f9c23c355fc"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25e9185e2d06c16ee438ed39bf62935ec436474a6ac4f9358524220f1b236e43"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:150906b40ff188a3260cbee25380e7494ee85048584998c1e66df0c7a11c17a6"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ad4aeb3e9a97286573c03df758fc7627aecdd02f1da04516a86dc159bf70121"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3f3ed29cd9f978c604708511a1f9c2fdcb6c38b9aae36a51905b8811ee5cbf1"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b0dae11d8f5ded51699c74d9548dcc5938e0804cc8298ec0aa0da95c21fff57b"}, - {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:faa6b09ee09433b87992fb5a2859efd1c264ddc37280d2dd5db502126d0e7f27"}, - {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9dc1b507c12eb0481d071f3c1808f0529ad41dc415d0ca11f7ebfc666e66a18b"}, - {file = "pydantic_core-2.20.1-cp311-none-win32.whl", hash = "sha256:fa2fddcb7107e0d1808086ca306dcade7df60a13a6c347a7acf1ec139aa6789a"}, - {file = "pydantic_core-2.20.1-cp311-none-win_amd64.whl", hash = "sha256:40a783fb7ee353c50bd3853e626f15677ea527ae556429453685ae32280c19c2"}, - {file = "pydantic_core-2.20.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231"}, - {file = "pydantic_core-2.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24"}, - {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1"}, - {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd"}, - {file = "pydantic_core-2.20.1-cp312-none-win32.whl", hash = "sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688"}, - {file = "pydantic_core-2.20.1-cp312-none-win_amd64.whl", hash = "sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d"}, - {file = "pydantic_core-2.20.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0827505a5c87e8aa285dc31e9ec7f4a17c81a813d45f70b1d9164e03a813a686"}, - {file = "pydantic_core-2.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19c0fa39fa154e7e0b7f82f88ef85faa2a4c23cc65aae2f5aea625e3c13c735a"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa223cd1e36b642092c326d694d8bf59b71ddddc94cdb752bbbb1c5c91d833b"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c336a6d235522a62fef872c6295a42ecb0c4e1d0f1a3e500fe949415761b8a19"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7eb6a0587eded33aeefea9f916899d42b1799b7b14b8f8ff2753c0ac1741edac"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70c8daf4faca8da5a6d655f9af86faf6ec2e1768f4b8b9d0226c02f3d6209703"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9fa4c9bf273ca41f940bceb86922a7667cd5bf90e95dbb157cbb8441008482c"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:11b71d67b4725e7e2a9f6e9c0ac1239bbc0c48cce3dc59f98635efc57d6dac83"}, - {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:270755f15174fb983890c49881e93f8f1b80f0b5e3a3cc1394a255706cabd203"}, - {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c81131869240e3e568916ef4c307f8b99583efaa60a8112ef27a366eefba8ef0"}, - {file = "pydantic_core-2.20.1-cp313-none-win32.whl", hash = "sha256:b91ced227c41aa29c672814f50dbb05ec93536abf8f43cd14ec9521ea09afe4e"}, - {file = "pydantic_core-2.20.1-cp313-none-win_amd64.whl", hash = "sha256:65db0f2eefcaad1a3950f498aabb4875c8890438bc80b19362cf633b87a8ab20"}, - {file = "pydantic_core-2.20.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:4745f4ac52cc6686390c40eaa01d48b18997cb130833154801a442323cc78f91"}, - {file = "pydantic_core-2.20.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a8ad4c766d3f33ba8fd692f9aa297c9058970530a32c728a2c4bfd2616d3358b"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41e81317dd6a0127cabce83c0c9c3fbecceae981c8391e6f1dec88a77c8a569a"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04024d270cf63f586ad41fff13fde4311c4fc13ea74676962c876d9577bcc78f"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eaad4ff2de1c3823fddf82f41121bdf453d922e9a238642b1dedb33c4e4f98ad"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26ab812fa0c845df815e506be30337e2df27e88399b985d0bb4e3ecfe72df31c"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c5ebac750d9d5f2706654c638c041635c385596caf68f81342011ddfa1e5598"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2aafc5a503855ea5885559eae883978c9b6d8c8993d67766ee73d82e841300dd"}, - {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4868f6bd7c9d98904b748a2653031fc9c2f85b6237009d475b1008bfaeb0a5aa"}, - {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa2f457b4af386254372dfa78a2eda2563680d982422641a85f271c859df1987"}, - {file = "pydantic_core-2.20.1-cp38-none-win32.whl", hash = "sha256:225b67a1f6d602de0ce7f6c1c3ae89a4aa25d3de9be857999e9124f15dab486a"}, - {file = "pydantic_core-2.20.1-cp38-none-win_amd64.whl", hash = "sha256:6b507132dcfc0dea440cce23ee2182c0ce7aba7054576efc65634f080dbe9434"}, - {file = "pydantic_core-2.20.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b03f7941783b4c4a26051846dea594628b38f6940a2fdc0df00b221aed39314c"}, - {file = "pydantic_core-2.20.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1eedfeb6089ed3fad42e81a67755846ad4dcc14d73698c120a82e4ccf0f1f9f6"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:635fee4e041ab9c479e31edda27fcf966ea9614fff1317e280d99eb3e5ab6fe2"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:77bf3ac639c1ff567ae3b47f8d4cc3dc20f9966a2a6dd2311dcc055d3d04fb8a"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ed1b0132f24beeec5a78b67d9388656d03e6a7c837394f99257e2d55b461611"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6514f963b023aeee506678a1cf821fe31159b925c4b76fe2afa94cc70b3222b"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10d4204d8ca33146e761c79f83cc861df20e7ae9f6487ca290a97702daf56006"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2d036c7187b9422ae5b262badb87a20a49eb6c5238b2004e96d4da1231badef1"}, - {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9ebfef07dbe1d93efb94b4700f2d278494e9162565a54f124c404a5656d7ff09"}, - {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6b9d9bb600328a1ce523ab4f454859e9d439150abb0906c5a1983c146580ebab"}, - {file = "pydantic_core-2.20.1-cp39-none-win32.whl", hash = "sha256:784c1214cb6dd1e3b15dd8b91b9a53852aed16671cc3fbe4786f4f1db07089e2"}, - {file = "pydantic_core-2.20.1-cp39-none-win_amd64.whl", hash = "sha256:d2fe69c5434391727efa54b47a1e7986bb0186e72a41b203df8f5b0a19a4f669"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:407653af5617f0757261ae249d3fba09504d7a71ab36ac057c938572d1bc9331"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:c693e916709c2465b02ca0ad7b387c4f8423d1db7b4649c551f27a529181c5ad"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b5ff4911aea936a47d9376fd3ab17e970cc543d1b68921886e7f64bd28308d1"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:177f55a886d74f1808763976ac4efd29b7ed15c69f4d838bbd74d9d09cf6fa86"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:964faa8a861d2664f0c7ab0c181af0bea66098b1919439815ca8803ef136fc4e"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4dd484681c15e6b9a977c785a345d3e378d72678fd5f1f3c0509608da24f2ac0"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f6d6cff3538391e8486a431569b77921adfcdef14eb18fbf19b7c0a5294d4e6a"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a6d511cc297ff0883bc3708b465ff82d7560193169a8b93260f74ecb0a5e08a7"}, - {file = "pydantic_core-2.20.1.tar.gz", hash = "sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4"}, + {file = "pydantic_core-2.23.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:7f10a5d1b9281392f1bf507d16ac720e78285dfd635b05737c3911637601bae6"}, + {file = "pydantic_core-2.23.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3c09a7885dd33ee8c65266e5aa7fb7e2f23d49d8043f089989726391dd7350c5"}, + {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6470b5a1ec4d1c2e9afe928c6cb37eb33381cab99292a708b8cb9aa89e62429b"}, + {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9172d2088e27d9a185ea0a6c8cebe227a9139fd90295221d7d495944d2367700"}, + {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86fc6c762ca7ac8fbbdff80d61b2c59fb6b7d144aa46e2d54d9e1b7b0e780e01"}, + {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0cb80fd5c2df4898693aa841425ea1727b1b6d2167448253077d2a49003e0ed"}, + {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03667cec5daf43ac4995cefa8aaf58f99de036204a37b889c24a80927b629cec"}, + {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:047531242f8e9c2db733599f1c612925de095e93c9cc0e599e96cf536aaf56ba"}, + {file = "pydantic_core-2.23.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5499798317fff7f25dbef9347f4451b91ac2a4330c6669821c8202fd354c7bee"}, + {file = "pydantic_core-2.23.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bbb5e45eab7624440516ee3722a3044b83fff4c0372efe183fd6ba678ff681fe"}, + {file = "pydantic_core-2.23.3-cp310-none-win32.whl", hash = "sha256:8b5b3ed73abb147704a6e9f556d8c5cb078f8c095be4588e669d315e0d11893b"}, + {file = "pydantic_core-2.23.3-cp310-none-win_amd64.whl", hash = "sha256:2b603cde285322758a0279995b5796d64b63060bfbe214b50a3ca23b5cee3e83"}, + {file = "pydantic_core-2.23.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:c889fd87e1f1bbeb877c2ee56b63bb297de4636661cc9bbfcf4b34e5e925bc27"}, + {file = "pydantic_core-2.23.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea85bda3189fb27503af4c45273735bcde3dd31c1ab17d11f37b04877859ef45"}, + {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7f7f72f721223f33d3dc98a791666ebc6a91fa023ce63733709f4894a7dc611"}, + {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b2b55b0448e9da68f56b696f313949cda1039e8ec7b5d294285335b53104b61"}, + {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c24574c7e92e2c56379706b9a3f07c1e0c7f2f87a41b6ee86653100c4ce343e5"}, + {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2b05e6ccbee333a8f4b8f4d7c244fdb7a979e90977ad9c51ea31261e2085ce0"}, + {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2c409ce1c219c091e47cb03feb3c4ed8c2b8e004efc940da0166aaee8f9d6c8"}, + {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d965e8b325f443ed3196db890d85dfebbb09f7384486a77461347f4adb1fa7f8"}, + {file = "pydantic_core-2.23.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f56af3a420fb1ffaf43ece3ea09c2d27c444e7c40dcb7c6e7cf57aae764f2b48"}, + {file = "pydantic_core-2.23.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5b01a078dd4f9a52494370af21aa52964e0a96d4862ac64ff7cea06e0f12d2c5"}, + {file = "pydantic_core-2.23.3-cp311-none-win32.whl", hash = "sha256:560e32f0df04ac69b3dd818f71339983f6d1f70eb99d4d1f8e9705fb6c34a5c1"}, + {file = "pydantic_core-2.23.3-cp311-none-win_amd64.whl", hash = "sha256:c744fa100fdea0d000d8bcddee95213d2de2e95b9c12be083370b2072333a0fa"}, + {file = "pydantic_core-2.23.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:e0ec50663feedf64d21bad0809f5857bac1ce91deded203efc4a84b31b2e4305"}, + {file = "pydantic_core-2.23.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:db6e6afcb95edbe6b357786684b71008499836e91f2a4a1e55b840955b341dbb"}, + {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98ccd69edcf49f0875d86942f4418a4e83eb3047f20eb897bffa62a5d419c8fa"}, + {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a678c1ac5c5ec5685af0133262103defb427114e62eafeda12f1357a12140162"}, + {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01491d8b4d8db9f3391d93b0df60701e644ff0894352947f31fff3e52bd5c801"}, + {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fcf31facf2796a2d3b7fe338fe8640aa0166e4e55b4cb108dbfd1058049bf4cb"}, + {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7200fd561fb3be06827340da066df4311d0b6b8eb0c2116a110be5245dceb326"}, + {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dc1636770a809dee2bd44dd74b89cc80eb41172bcad8af75dd0bc182c2666d4c"}, + {file = "pydantic_core-2.23.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:67a5def279309f2e23014b608c4150b0c2d323bd7bccd27ff07b001c12c2415c"}, + {file = "pydantic_core-2.23.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:748bdf985014c6dd3e1e4cc3db90f1c3ecc7246ff5a3cd4ddab20c768b2f1dab"}, + {file = "pydantic_core-2.23.3-cp312-none-win32.whl", hash = "sha256:255ec6dcb899c115f1e2a64bc9ebc24cc0e3ab097775755244f77360d1f3c06c"}, + {file = "pydantic_core-2.23.3-cp312-none-win_amd64.whl", hash = "sha256:40b8441be16c1e940abebed83cd006ddb9e3737a279e339dbd6d31578b802f7b"}, + {file = "pydantic_core-2.23.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:6daaf5b1ba1369a22c8b050b643250e3e5efc6a78366d323294aee54953a4d5f"}, + {file = "pydantic_core-2.23.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d015e63b985a78a3d4ccffd3bdf22b7c20b3bbd4b8227809b3e8e75bc37f9cb2"}, + {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3fc572d9b5b5cfe13f8e8a6e26271d5d13f80173724b738557a8c7f3a8a3791"}, + {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f6bd91345b5163ee7448bee201ed7dd601ca24f43f439109b0212e296eb5b423"}, + {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc379c73fd66606628b866f661e8785088afe2adaba78e6bbe80796baf708a63"}, + {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbdce4b47592f9e296e19ac31667daed8753c8367ebb34b9a9bd89dacaa299c9"}, + {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc3cf31edf405a161a0adad83246568647c54404739b614b1ff43dad2b02e6d5"}, + {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8e22b477bf90db71c156f89a55bfe4d25177b81fce4aa09294d9e805eec13855"}, + {file = "pydantic_core-2.23.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:0a0137ddf462575d9bce863c4c95bac3493ba8e22f8c28ca94634b4a1d3e2bb4"}, + {file = "pydantic_core-2.23.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:203171e48946c3164fe7691fc349c79241ff8f28306abd4cad5f4f75ed80bc8d"}, + {file = "pydantic_core-2.23.3-cp313-none-win32.whl", hash = "sha256:76bdab0de4acb3f119c2a4bff740e0c7dc2e6de7692774620f7452ce11ca76c8"}, + {file = "pydantic_core-2.23.3-cp313-none-win_amd64.whl", hash = "sha256:37ba321ac2a46100c578a92e9a6aa33afe9ec99ffa084424291d84e456f490c1"}, + {file = "pydantic_core-2.23.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d063c6b9fed7d992bcbebfc9133f4c24b7a7f215d6b102f3e082b1117cddb72c"}, + {file = "pydantic_core-2.23.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6cb968da9a0746a0cf521b2b5ef25fc5a0bee9b9a1a8214e0a1cfaea5be7e8a4"}, + {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edbefe079a520c5984e30e1f1f29325054b59534729c25b874a16a5048028d16"}, + {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cbaaf2ef20d282659093913da9d402108203f7cb5955020bd8d1ae5a2325d1c4"}, + {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fb539d7e5dc4aac345846f290cf504d2fd3c1be26ac4e8b5e4c2b688069ff4cf"}, + {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7e6f33503c5495059148cc486867e1d24ca35df5fc064686e631e314d959ad5b"}, + {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04b07490bc2f6f2717b10c3969e1b830f5720b632f8ae2f3b8b1542394c47a8e"}, + {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:03795b9e8a5d7fda05f3873efc3f59105e2dcff14231680296b87b80bb327295"}, + {file = "pydantic_core-2.23.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c483dab0f14b8d3f0df0c6c18d70b21b086f74c87ab03c59250dbf6d3c89baba"}, + {file = "pydantic_core-2.23.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8b2682038e255e94baf2c473dca914a7460069171ff5cdd4080be18ab8a7fd6e"}, + {file = "pydantic_core-2.23.3-cp38-none-win32.whl", hash = "sha256:f4a57db8966b3a1d1a350012839c6a0099f0898c56512dfade8a1fe5fb278710"}, + {file = "pydantic_core-2.23.3-cp38-none-win_amd64.whl", hash = "sha256:13dd45ba2561603681a2676ca56006d6dee94493f03d5cadc055d2055615c3ea"}, + {file = "pydantic_core-2.23.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:82da2f4703894134a9f000e24965df73cc103e31e8c31906cc1ee89fde72cbd8"}, + {file = "pydantic_core-2.23.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dd9be0a42de08f4b58a3cc73a123f124f65c24698b95a54c1543065baca8cf0e"}, + {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89b731f25c80830c76fdb13705c68fef6a2b6dc494402987c7ea9584fe189f5d"}, + {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c6de1ec30c4bb94f3a69c9f5f2182baeda5b809f806676675e9ef6b8dc936f28"}, + {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb68b41c3fa64587412b104294b9cbb027509dc2f6958446c502638d481525ef"}, + {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c3980f2843de5184656aab58698011b42763ccba11c4a8c35936c8dd6c7068c"}, + {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94f85614f2cba13f62c3c6481716e4adeae48e1eaa7e8bac379b9d177d93947a"}, + {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:510b7fb0a86dc8f10a8bb43bd2f97beb63cffad1203071dc434dac26453955cd"}, + {file = "pydantic_core-2.23.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1eba2f7ce3e30ee2170410e2171867ea73dbd692433b81a93758ab2de6c64835"}, + {file = "pydantic_core-2.23.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4b259fd8409ab84b4041b7b3f24dcc41e4696f180b775961ca8142b5b21d0e70"}, + {file = "pydantic_core-2.23.3-cp39-none-win32.whl", hash = "sha256:40d9bd259538dba2f40963286009bf7caf18b5112b19d2b55b09c14dde6db6a7"}, + {file = "pydantic_core-2.23.3-cp39-none-win_amd64.whl", hash = "sha256:5a8cd3074a98ee70173a8633ad3c10e00dcb991ecec57263aacb4095c5efb958"}, + {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f399e8657c67313476a121a6944311fab377085ca7f490648c9af97fc732732d"}, + {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:6b5547d098c76e1694ba85f05b595720d7c60d342f24d5aad32c3049131fa5c4"}, + {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0dda0290a6f608504882d9f7650975b4651ff91c85673341789a476b1159f211"}, + {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65b6e5da855e9c55a0c67f4db8a492bf13d8d3316a59999cfbaf98cc6e401961"}, + {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:09e926397f392059ce0afdcac920df29d9c833256354d0c55f1584b0b70cf07e"}, + {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:87cfa0ed6b8c5bd6ae8b66de941cece179281239d482f363814d2b986b79cedc"}, + {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e61328920154b6a44d98cabcb709f10e8b74276bc709c9a513a8c37a18786cc4"}, + {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ce3317d155628301d649fe5e16a99528d5680af4ec7aa70b90b8dacd2d725c9b"}, + {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e89513f014c6be0d17b00a9a7c81b1c426f4eb9224b15433f3d98c1a071f8433"}, + {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:4f62c1c953d7ee375df5eb2e44ad50ce2f5aff931723b398b8bc6f0ac159791a"}, + {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2718443bc671c7ac331de4eef9b673063b10af32a0bb385019ad61dcf2cc8f6c"}, + {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0d90e08b2727c5d01af1b5ef4121d2f0c99fbee692c762f4d9d0409c9da6541"}, + {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2b676583fc459c64146debea14ba3af54e540b61762dfc0613dc4e98c3f66eeb"}, + {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:50e4661f3337977740fdbfbae084ae5693e505ca2b3130a6d4eb0f2281dc43b8"}, + {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:68f4cf373f0de6abfe599a38307f4417c1c867ca381c03df27c873a9069cda25"}, + {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:59d52cf01854cb26c46958552a21acb10dd78a52aa34c86f284e66b209db8cab"}, + {file = "pydantic_core-2.23.3.tar.gz", hash = "sha256:3cb0f65d8b4121c1b015c60104a685feb929a29d7cf204387c7f2688c7974690"}, ] [package.dependencies] @@ -3843,13 +3902,13 @@ tqdm = "*" [[package]] name = "pyparsing" -version = "3.1.2" +version = "3.1.4" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.6.8" files = [ - {file = "pyparsing-3.1.2-py3-none-any.whl", hash = "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742"}, - {file = "pyparsing-3.1.2.tar.gz", hash = "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad"}, + {file = "pyparsing-3.1.4-py3-none-any.whl", hash = "sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c"}, + {file = "pyparsing-3.1.4.tar.gz", hash = "sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032"}, ] [package.extras] @@ -3891,13 +3950,13 @@ cp2110 = ["hidapi"] [[package]] name = "pytest" -version = "8.3.2" +version = "8.3.3" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-8.3.2-py3-none-any.whl", hash = "sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5"}, - {file = "pytest-8.3.2.tar.gz", hash = "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce"}, + {file = "pytest-8.3.3-py3-none-any.whl", hash = "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2"}, + {file = "pytest-8.3.3.tar.gz", hash = "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181"}, ] [package.dependencies] @@ -3931,21 +3990,21 @@ testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtuale [[package]] name = "pytest-env" -version = "1.1.3" +version = "1.1.4" description = "pytest plugin that allows you to add environment variables." optional = false python-versions = ">=3.8" files = [ - {file = "pytest_env-1.1.3-py3-none-any.whl", hash = "sha256:aada77e6d09fcfb04540a6e462c58533c37df35fa853da78707b17ec04d17dfc"}, - {file = "pytest_env-1.1.3.tar.gz", hash = "sha256:fcd7dc23bb71efd3d35632bde1bbe5ee8c8dc4489d6617fb010674880d96216b"}, + {file = "pytest_env-1.1.4-py3-none-any.whl", hash = "sha256:a4212056d4d440febef311a98fdca56c31256d58fb453d103cba4e8a532b721d"}, + {file = "pytest_env-1.1.4.tar.gz", hash = "sha256:86653658da8f11c6844975db955746c458a9c09f1e64957603161e2ff93f5133"}, ] [package.dependencies] -pytest = ">=7.4.3" +pytest = ">=8.3.2" tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} [package.extras] -test = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "pytest-mock (>=3.12)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "pytest-mock (>=3.14)"] [[package]] name = "pytest-mock" @@ -4026,13 +4085,13 @@ files = [ [[package]] name = "pytz" -version = "2024.1" +version = "2024.2" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" files = [ - {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, - {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, + {file = "pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725"}, + {file = "pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a"}, ] [[package]] @@ -4156,120 +4215,120 @@ files = [ [[package]] name = "pyzmq" -version = "26.1.1" +version = "26.2.0" description = "Python bindings for 0MQ" optional = false python-versions = ">=3.7" files = [ - {file = "pyzmq-26.1.1-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:b1bb952d1e407463c9333ea7e0c0600001e54e08ce836d4f0aff1fb3f902cf63"}, - {file = "pyzmq-26.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:65e2a18e845c6ea7ab849c70db932eaeadee5edede9e379eb21c0a44cf523b2e"}, - {file = "pyzmq-26.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:def7ae3006924b8a0c146a89ab4008310913fa903beedb95e25dea749642528e"}, - {file = "pyzmq-26.1.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a8234571df7816f99dde89c3403cb396d70c6554120b795853a8ea56fcc26cd3"}, - {file = "pyzmq-26.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18da8e84dbc30688fd2baefd41df7190607511f916be34f9a24b0e007551822e"}, - {file = "pyzmq-26.1.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:c70dab93d98b2bf3f0ac1265edbf6e7f83acbf71dabcc4611889bb0dea45bed7"}, - {file = "pyzmq-26.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:fcb90592c5d5c562e1b1a1ceccf6f00036d73c51db0271bf4d352b8d6b31d468"}, - {file = "pyzmq-26.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cf4be7460a0c1bc71e9b0e64ecdd75a86386ca6afaa36641686f5542d0314e9d"}, - {file = "pyzmq-26.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4cbecda4ddbfc1e309c3be04d333f9be3fc6178b8b6592b309676f929767a15"}, - {file = "pyzmq-26.1.1-cp310-cp310-win32.whl", hash = "sha256:583f73b113b8165713b6ce028d221402b1b69483055b5aa3f991937e34dd1ead"}, - {file = "pyzmq-26.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:5e6f39ecb8eb7bfcb976c49262e8cf83ff76e082b77ca23ba90c9b6691a345be"}, - {file = "pyzmq-26.1.1-cp310-cp310-win_arm64.whl", hash = "sha256:8d042d6446cab3a1388b38596f5acabb9926b0b95c3894c519356b577a549458"}, - {file = "pyzmq-26.1.1-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:362cac2423e36966d336d79d3ec3eafeabc153ee3e7a5cf580d7e74a34b3d912"}, - {file = "pyzmq-26.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0841633446cb1539a832a19bb24c03a20c00887d0cedd1d891b495b07e5c5cb5"}, - {file = "pyzmq-26.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e1fcdc333afbf9918d0a614a6e10858aede7da49a60f6705a77e343fe86a317"}, - {file = "pyzmq-26.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc8d655627d775475eafdcf0e49e74bcc1e5e90afd9ab813b4da98f092ed7b93"}, - {file = "pyzmq-26.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32de51744820857a6f7c3077e620ab3f607d0e4388dfead885d5124ab9bcdc5e"}, - {file = "pyzmq-26.1.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a880240597010914ffb1d6edd04d3deb7ce6a2abf79a0012751438d13630a671"}, - {file = "pyzmq-26.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:26131b1cec02f941ed2d2b4b8cc051662b1c248b044eff5069df1f500bbced56"}, - {file = "pyzmq-26.1.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ce05841322b58510607f9508a573138d995a46c7928887bc433de9cb760fd2ad"}, - {file = "pyzmq-26.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:32123ff0a6db521aadf2b95201e967a4e0d11fb89f73663a99d2f54881c07214"}, - {file = "pyzmq-26.1.1-cp311-cp311-win32.whl", hash = "sha256:e790602d7ea1d6c7d8713d571226d67de7ffe47b1e22ae2c043ebd537de1bccb"}, - {file = "pyzmq-26.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:717960855f2d6fdc2dba9df49dff31c414187bb11c76af36343a57d1f7083d9a"}, - {file = "pyzmq-26.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:08956c26dbcd4fd8835cb777a16e21958ed2412317630e19f0018d49dbeeb470"}, - {file = "pyzmq-26.1.1-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:e80345900ae241c2c51bead7c9fa247bba6d4b2a83423e9791bae8b0a7f12c52"}, - {file = "pyzmq-26.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ec8fe214fcc45dfb0c32e4a7ad1db20244ba2d2fecbf0cbf9d5242d81ca0a375"}, - {file = "pyzmq-26.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf4e283f97688d993cb7a8acbc22889effbbb7cbaa19ee9709751f44be928f5d"}, - {file = "pyzmq-26.1.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2508bdc8ab246e5ed7c92023d4352aaad63020ca3b098a4e3f1822db202f703d"}, - {file = "pyzmq-26.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:741bdb4d96efe8192616abdc3671931d51a8bcd38c71da2d53fb3127149265d1"}, - {file = "pyzmq-26.1.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:76154943e4c4054b2591792eb3484ef1dd23d59805759f9cebd2f010aa30ee8c"}, - {file = "pyzmq-26.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9498ac427d20d0e0ef0e4bbd6200841e91640dfdf619f544ceec7f464cfb6070"}, - {file = "pyzmq-26.1.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f34453ef3496ca3462f30435bf85f535f9550392987341f9ccc92c102825a79"}, - {file = "pyzmq-26.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:50f0669324e27cc2091ef6ab76ca7112f364b6249691790b4cffce31e73fda28"}, - {file = "pyzmq-26.1.1-cp312-cp312-win32.whl", hash = "sha256:3ee5cbf2625b94de21c68d0cefd35327c8dfdbd6a98fcc41682b4e8bb00d841f"}, - {file = "pyzmq-26.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:75bd448a28b1001b6928679015bc95dd5f172703ed30135bb9e34fc9cda0a3e7"}, - {file = "pyzmq-26.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:4350233569b4bbef88595c5e77ee38995a6f1f1790fae148b578941bfffd1c24"}, - {file = "pyzmq-26.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6c8087a3281c20b1d11042d372ed5a47734af05975d78e4d1d6e7bd1018535f3"}, - {file = "pyzmq-26.1.1-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:ebef7d3fe11fe4c688f08bc0211a976c3318c097057f258428200737b9fff4da"}, - {file = "pyzmq-26.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a5342110510045a47de1e87f5f1dcc1d9d90109522316dc9830cfc6157c800f"}, - {file = "pyzmq-26.1.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:af690ea4be6ca92a67c2b44a779a023bf0838e92d48497a2268175dc4a505691"}, - {file = "pyzmq-26.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc994e220c1403ae087d7f0fa45129d583e46668a019e389060da811a5a9320e"}, - {file = "pyzmq-26.1.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:b8e153f5dffb0310af71fc6fc9cd8174f4c8ea312c415adcb815d786fee78179"}, - {file = "pyzmq-26.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:0065026e624052a51033857e5cd45a94b52946b44533f965f0bdf182460e965d"}, - {file = "pyzmq-26.1.1-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:63351392f948b5d50b9f55161994bc4feedbfb3f3cfe393d2f503dea2c3ec445"}, - {file = "pyzmq-26.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ffecc43b3c18e36b62fcec995761829b6ac325d8dd74a4f2c5c1653afbb4495a"}, - {file = "pyzmq-26.1.1-cp313-cp313-win32.whl", hash = "sha256:6ff14c2fae6c0c2c1c02590c5c5d75aa1db35b859971b3ca2fcd28f983d9f2b6"}, - {file = "pyzmq-26.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:85f2d2ee5ea9a8f1de86a300e1062fbab044f45b5ce34d20580c0198a8196db0"}, - {file = "pyzmq-26.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:cc09b1de8b985ca5a0ca343dd7fb007267c6b329347a74e200f4654268084239"}, - {file = "pyzmq-26.1.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:bc904e86de98f8fc5bd41597da5d61232d2d6d60c4397f26efffabb961b2b245"}, - {file = "pyzmq-26.1.1-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:00f39c367bbd6aa8e4bc36af6510561944c619b58eb36199fa334b594a18f615"}, - {file = "pyzmq-26.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de6f384864a959866b782e6a3896538d1424d183f2d3c7ef079f71dcecde7284"}, - {file = "pyzmq-26.1.1-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3abb15df0c763339edb27a644c19381b2425ddd1aea3dbd77c1601a3b31867b8"}, - {file = "pyzmq-26.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40908ec2dd3b29bbadc0916a0d3c87f8dbeebbd8fead8e618539f09e0506dec4"}, - {file = "pyzmq-26.1.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:c11a95d3f6fc7e714ccd1066f68f9c1abd764a8b3596158be92f46dd49f41e03"}, - {file = "pyzmq-26.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:4437af9fee7a58302dbd511cc49f0cc2b35c112a33a1111fb123cf0be45205ca"}, - {file = "pyzmq-26.1.1-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:76390d3d66406cb01b9681c382874400e9dfd77f30ecdea4bd1bf5226dd4aff0"}, - {file = "pyzmq-26.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:4d4c7fe5e50e269f9c63a260638488fec194a73993008618a59b54c47ef6ae72"}, - {file = "pyzmq-26.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:25d128524207f53f7aae7c5abdc2b63f8957a060b00521af5ffcd20986b5d8f4"}, - {file = "pyzmq-26.1.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d74b925d997e4f92b042bdd7085cd0a309ee0fd7cb4dc376059bbff6b32ff34f"}, - {file = "pyzmq-26.1.1-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:732f957441e5b1c65a7509395e6b6cafee9e12df9aa5f4bf92ed266fe0ba70ee"}, - {file = "pyzmq-26.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0a45102ad7ed9f9ddf2bd699cc5df37742cf7301111cba06001b927efecb120"}, - {file = "pyzmq-26.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9f380d5333fc7cd17423f486125dcc073918676e33db70a6a8172b19fc78d23d"}, - {file = "pyzmq-26.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:8eaffcd6bf6a9d00b66a2052a33fa7e6a6575427e9644395f13c3d070f2918dc"}, - {file = "pyzmq-26.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:f1483d4975ae1b387b39bb8e23d1ff32fe5621aa9e4ed3055d05e9c5613fea53"}, - {file = "pyzmq-26.1.1-cp37-cp37m-win32.whl", hash = "sha256:a83653c6bbe5887caea55e49fbd2909c14b73acf43bcc051eb60b2d514bbd46e"}, - {file = "pyzmq-26.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9763a8d3f5f74ef679989b373c37cc22e8d07e56d26439205cb83edb7722357f"}, - {file = "pyzmq-26.1.1-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:2b045647caf620ce0ed6c8fd9fb6a73116f99aceed966b152a5ba1b416d25311"}, - {file = "pyzmq-26.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f66dcb6625c002f209cdc12cae1a1fec926493cd2262efe37dc6b25a30cea863"}, - {file = "pyzmq-26.1.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0cf1d980c969fb9e538f52abd2227f09e015096bc5c3ef7aa26e0d64051c1db8"}, - {file = "pyzmq-26.1.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:443ebf5e261a95ee9725693f2a5a71401f89b89df0e0ea58844b074067aac2f1"}, - {file = "pyzmq-26.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29de77ba1b1877fe7defc1b9140e65cbd35f72a63bc501e56c2eae55bde5fff4"}, - {file = "pyzmq-26.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f6071ec95af145d7b659dae6786871cd85f0acc599286b6f8ba0c74592d83dd"}, - {file = "pyzmq-26.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6f0512fc87629ad968889176bf2165d721cd817401a281504329e2a2ed0ca6a3"}, - {file = "pyzmq-26.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5ccfcf13e80719f6a2d9c0a021d9e47d4550907a29253554be2c09582f6d7963"}, - {file = "pyzmq-26.1.1-cp38-cp38-win32.whl", hash = "sha256:809673947e95752e407aaaaf03f205ee86ebfff9ca51db6d4003dfd87b8428d1"}, - {file = "pyzmq-26.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:62b5180e23e6f581600459cd983473cd723fdc64350f606d21407c99832aaf5f"}, - {file = "pyzmq-26.1.1-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:fe73d7c89d6f803bed122135ff5783364e8cdb479cf6fe2d764a44b6349e7e0f"}, - {file = "pyzmq-26.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db1b7e2b50ef21f398036786da4c153db63203a402396d9f21e08ea61f3f8dba"}, - {file = "pyzmq-26.1.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7c506a51cb01bb997a3f6440db0d121e5e7a32396e9948b1fdb6a7bfa67243f4"}, - {file = "pyzmq-26.1.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:92eca4f80e8a748d880e55d3cf57ef487692e439f12d5c5a2e1cce84aaa7f6cb"}, - {file = "pyzmq-26.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14bdbae02f72f4716b0ffe7500e9da303d719ddde1f3dcfb4c4f6cc1cf73bb02"}, - {file = "pyzmq-26.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e03be7ed17836c9434cce0668ac1e2cc9143d7169f90f46a0167f6155e176e32"}, - {file = "pyzmq-26.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc5df31e36e4fddd4c8b5c42daee8d54d7b529e898ac984be97bf5517de166a7"}, - {file = "pyzmq-26.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f218179c90a12d660906e04b25a340dd63e9743000ba16232ddaf46888f269da"}, - {file = "pyzmq-26.1.1-cp39-cp39-win32.whl", hash = "sha256:7dfabc180a4da422a4b349c63077347392463a75fa07aa3be96712ed6d42c547"}, - {file = "pyzmq-26.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:c5248e6e0fcbbbc912982e99cdd51c342601f495b0fa5bd667f3bdbdbf3e170f"}, - {file = "pyzmq-26.1.1-cp39-cp39-win_arm64.whl", hash = "sha256:2ae7aa1408778dc74582a1226052b930f9083b54b64d7e6ef6ec0466cfdcdec2"}, - {file = "pyzmq-26.1.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:be3fc2b11c0c384949cf1f01f9a48555039408b0f3e877863b1754225635953e"}, - {file = "pyzmq-26.1.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48dee75c2a9fa4f4a583d4028d564a0453447ee1277a29b07acc3743c092e259"}, - {file = "pyzmq-26.1.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:23f2fe4fb567e8098ebaa7204819658195b10ddd86958a97a6058eed2901eed3"}, - {file = "pyzmq-26.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:472cacd16f627c06d3c8b2d374345ab74446bae913584a6245e2aa935336d929"}, - {file = "pyzmq-26.1.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:8285b25aa20fcc46f1ca4afbc39fd3d5f2fe4c4bbf7f2c7f907a214e87a70024"}, - {file = "pyzmq-26.1.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2067e63fd9d5c13cfe12624dab0366053e523b37a7a01678ce4321f839398939"}, - {file = "pyzmq-26.1.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cc109be2ee3638035d276e18eaf66a1e1f44201c0c4bea4ee0c692766bbd3570"}, - {file = "pyzmq-26.1.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d0da97e65ee73261dba70469cc8f63d8da3a8a825337a2e3d246b9e95141cdd0"}, - {file = "pyzmq-26.1.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa79c528706561306938b275f89bb2c6985ce08469c27e5de05bc680df5e826f"}, - {file = "pyzmq-26.1.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:3ddbd851a3a2651fdc5065a2804d50cf2f4b13b1bcd66de8e9e855d0217d4fcd"}, - {file = "pyzmq-26.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d3df226ab7464684ae6706e20a5cbab717c3735a7e409b3fa598b754d49f1946"}, - {file = "pyzmq-26.1.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:abad7b897e960d577eb4a0f3f789c1780bc3ffe2e7c27cf317e7c90ad26acf12"}, - {file = "pyzmq-26.1.1-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c513d829a548c2d5c88983167be2b3aa537f6d1191edcdc6fcd8999e18bdd994"}, - {file = "pyzmq-26.1.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70af4c9c991714ef1c65957605a8de42ef0d0620dd5f125953c8e682281bdb80"}, - {file = "pyzmq-26.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:8d4234f335b0d0842f7d661d8cd50cbad0729be58f1c4deb85cd96b38fe95025"}, - {file = "pyzmq-26.1.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:2c0fdb7b758e0e1605157e480b00b3a599073068a37091a1c75ec65bf7498645"}, - {file = "pyzmq-26.1.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc657577f057d60dd3642c9f95f28b432889b73143140061f7c1331d02f03df6"}, - {file = "pyzmq-26.1.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3e3b66fe6131b4f33d239f7d4c3bfb2f8532d8644bae3b3da4f3987073edac55"}, - {file = "pyzmq-26.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59b57e912feef6951aec8bb03fe0faa5ad5f36962883c72a30a9c965e6d988fd"}, - {file = "pyzmq-26.1.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:146956aec7d947c5afc5e7da0841423d7a53f84fd160fff25e682361dcfb32cb"}, - {file = "pyzmq-26.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:9521b874fd489495865172f344e46e0159095d1f161858e3fc6e28e43ca15160"}, - {file = "pyzmq-26.1.1.tar.gz", hash = "sha256:a7db05d8b7cd1a8c6610e9e9aa55d525baae7a44a43e18bc3260eb3f92de96c6"}, + {file = "pyzmq-26.2.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:ddf33d97d2f52d89f6e6e7ae66ee35a4d9ca6f36eda89c24591b0c40205a3629"}, + {file = "pyzmq-26.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dacd995031a01d16eec825bf30802fceb2c3791ef24bcce48fa98ce40918c27b"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89289a5ee32ef6c439086184529ae060c741334b8970a6855ec0b6ad3ff28764"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5506f06d7dc6ecf1efacb4a013b1f05071bb24b76350832c96449f4a2d95091c"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ea039387c10202ce304af74def5021e9adc6297067f3441d348d2b633e8166a"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a2224fa4a4c2ee872886ed00a571f5e967c85e078e8e8c2530a2fb01b3309b88"}, + {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:28ad5233e9c3b52d76196c696e362508959741e1a005fb8fa03b51aea156088f"}, + {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:1c17211bc037c7d88e85ed8b7d8f7e52db6dc8eca5590d162717c654550f7282"}, + {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b8f86dd868d41bea9a5f873ee13bf5551c94cf6bc51baebc6f85075971fe6eea"}, + {file = "pyzmq-26.2.0-cp310-cp310-win32.whl", hash = "sha256:46a446c212e58456b23af260f3d9fb785054f3e3653dbf7279d8f2b5546b21c2"}, + {file = "pyzmq-26.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:49d34ab71db5a9c292a7644ce74190b1dd5a3475612eefb1f8be1d6961441971"}, + {file = "pyzmq-26.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:bfa832bfa540e5b5c27dcf5de5d82ebc431b82c453a43d141afb1e5d2de025fa"}, + {file = "pyzmq-26.2.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:8f7e66c7113c684c2b3f1c83cdd3376103ee0ce4c49ff80a648643e57fb22218"}, + {file = "pyzmq-26.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3a495b30fc91db2db25120df5847d9833af237546fd59170701acd816ccc01c4"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77eb0968da535cba0470a5165468b2cac7772cfb569977cff92e240f57e31bef"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ace4f71f1900a548f48407fc9be59c6ba9d9aaf658c2eea6cf2779e72f9f317"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92a78853d7280bffb93df0a4a6a2498cba10ee793cc8076ef797ef2f74d107cf"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:689c5d781014956a4a6de61d74ba97b23547e431e9e7d64f27d4922ba96e9d6e"}, + {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0aca98bc423eb7d153214b2df397c6421ba6373d3397b26c057af3c904452e37"}, + {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f3496d76b89d9429a656293744ceca4d2ac2a10ae59b84c1da9b5165f429ad3"}, + {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5c2b3bfd4b9689919db068ac6c9911f3fcb231c39f7dd30e3138be94896d18e6"}, + {file = "pyzmq-26.2.0-cp311-cp311-win32.whl", hash = "sha256:eac5174677da084abf378739dbf4ad245661635f1600edd1221f150b165343f4"}, + {file = "pyzmq-26.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:5a509df7d0a83a4b178d0f937ef14286659225ef4e8812e05580776c70e155d5"}, + {file = "pyzmq-26.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:c0e6091b157d48cbe37bd67233318dbb53e1e6327d6fc3bb284afd585d141003"}, + {file = "pyzmq-26.2.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:ded0fc7d90fe93ae0b18059930086c51e640cdd3baebdc783a695c77f123dcd9"}, + {file = "pyzmq-26.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:17bf5a931c7f6618023cdacc7081f3f266aecb68ca692adac015c383a134ca52"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55cf66647e49d4621a7e20c8d13511ef1fe1efbbccf670811864452487007e08"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4661c88db4a9e0f958c8abc2b97472e23061f0bc737f6f6179d7a27024e1faa5"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea7f69de383cb47522c9c208aec6dd17697db7875a4674c4af3f8cfdac0bdeae"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:7f98f6dfa8b8ccaf39163ce872bddacca38f6a67289116c8937a02e30bbe9711"}, + {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e3e0210287329272539eea617830a6a28161fbbd8a3271bf4150ae3e58c5d0e6"}, + {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6b274e0762c33c7471f1a7471d1a2085b1a35eba5cdc48d2ae319f28b6fc4de3"}, + {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:29c6a4635eef69d68a00321e12a7d2559fe2dfccfa8efae3ffb8e91cd0b36a8b"}, + {file = "pyzmq-26.2.0-cp312-cp312-win32.whl", hash = "sha256:989d842dc06dc59feea09e58c74ca3e1678c812a4a8a2a419046d711031f69c7"}, + {file = "pyzmq-26.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:2a50625acdc7801bc6f74698c5c583a491c61d73c6b7ea4dee3901bb99adb27a"}, + {file = "pyzmq-26.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:4d29ab8592b6ad12ebbf92ac2ed2bedcfd1cec192d8e559e2e099f648570e19b"}, + {file = "pyzmq-26.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9dd8cd1aeb00775f527ec60022004d030ddc51d783d056e3e23e74e623e33726"}, + {file = "pyzmq-26.2.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:28c812d9757fe8acecc910c9ac9dafd2ce968c00f9e619db09e9f8f54c3a68a3"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d80b1dd99c1942f74ed608ddb38b181b87476c6a966a88a950c7dee118fdf50"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c997098cc65e3208eca09303630e84d42718620e83b733d0fd69543a9cab9cb"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ad1bc8d1b7a18497dda9600b12dc193c577beb391beae5cd2349184db40f187"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:bea2acdd8ea4275e1278350ced63da0b166421928276c7c8e3f9729d7402a57b"}, + {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:23f4aad749d13698f3f7b64aad34f5fc02d6f20f05999eebc96b89b01262fb18"}, + {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:a4f96f0d88accc3dbe4a9025f785ba830f968e21e3e2c6321ccdfc9aef755115"}, + {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ced65e5a985398827cc9276b93ef6dfabe0273c23de8c7931339d7e141c2818e"}, + {file = "pyzmq-26.2.0-cp313-cp313-win32.whl", hash = "sha256:31507f7b47cc1ead1f6e86927f8ebb196a0bab043f6345ce070f412a59bf87b5"}, + {file = "pyzmq-26.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:70fc7fcf0410d16ebdda9b26cbd8bf8d803d220a7f3522e060a69a9c87bf7bad"}, + {file = "pyzmq-26.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:c3789bd5768ab5618ebf09cef6ec2b35fed88709b104351748a63045f0ff9797"}, + {file = "pyzmq-26.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:034da5fc55d9f8da09015d368f519478a52675e558c989bfcb5cf6d4e16a7d2a"}, + {file = "pyzmq-26.2.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:c92d73464b886931308ccc45b2744e5968cbaade0b1d6aeb40d8ab537765f5bc"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:794a4562dcb374f7dbbfb3f51d28fb40123b5a2abadee7b4091f93054909add5"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aee22939bb6075e7afededabad1a56a905da0b3c4e3e0c45e75810ebe3a52672"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ae90ff9dad33a1cfe947d2c40cb9cb5e600d759ac4f0fd22616ce6540f72797"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:43a47408ac52647dfabbc66a25b05b6a61700b5165807e3fbd40063fcaf46386"}, + {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:25bf2374a2a8433633c65ccb9553350d5e17e60c8eb4de4d92cc6bd60f01d306"}, + {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:007137c9ac9ad5ea21e6ad97d3489af654381324d5d3ba614c323f60dab8fae6"}, + {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:470d4a4f6d48fb34e92d768b4e8a5cc3780db0d69107abf1cd7ff734b9766eb0"}, + {file = "pyzmq-26.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3b55a4229ce5da9497dd0452b914556ae58e96a4381bb6f59f1305dfd7e53fc8"}, + {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9cb3a6460cdea8fe8194a76de8895707e61ded10ad0be97188cc8463ffa7e3a8"}, + {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8ab5cad923cc95c87bffee098a27856c859bd5d0af31bd346035aa816b081fe1"}, + {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ed69074a610fad1c2fda66180e7b2edd4d31c53f2d1872bc2d1211563904cd9"}, + {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:cccba051221b916a4f5e538997c45d7d136a5646442b1231b916d0164067ea27"}, + {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:0eaa83fc4c1e271c24eaf8fb083cbccef8fde77ec8cd45f3c35a9a123e6da097"}, + {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9edda2df81daa129b25a39b86cb57dfdfe16f7ec15b42b19bfac503360d27a93"}, + {file = "pyzmq-26.2.0-cp37-cp37m-win32.whl", hash = "sha256:ea0eb6af8a17fa272f7b98d7bebfab7836a0d62738e16ba380f440fceca2d951"}, + {file = "pyzmq-26.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4ff9dc6bc1664bb9eec25cd17506ef6672d506115095411e237d571e92a58231"}, + {file = "pyzmq-26.2.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:2eb7735ee73ca1b0d71e0e67c3739c689067f055c764f73aac4cc8ecf958ee3f"}, + {file = "pyzmq-26.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a534f43bc738181aa7cbbaf48e3eca62c76453a40a746ab95d4b27b1111a7d2"}, + {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:aedd5dd8692635813368e558a05266b995d3d020b23e49581ddd5bbe197a8ab6"}, + {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8be4700cd8bb02cc454f630dcdf7cfa99de96788b80c51b60fe2fe1dac480289"}, + {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fcc03fa4997c447dce58264e93b5aa2d57714fbe0f06c07b7785ae131512732"}, + {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:402b190912935d3db15b03e8f7485812db350d271b284ded2b80d2e5704be780"}, + {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8685fa9c25ff00f550c1fec650430c4b71e4e48e8d852f7ddcf2e48308038640"}, + {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:76589c020680778f06b7e0b193f4b6dd66d470234a16e1df90329f5e14a171cd"}, + {file = "pyzmq-26.2.0-cp38-cp38-win32.whl", hash = "sha256:8423c1877d72c041f2c263b1ec6e34360448decfb323fa8b94e85883043ef988"}, + {file = "pyzmq-26.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:76589f2cd6b77b5bdea4fca5992dc1c23389d68b18ccc26a53680ba2dc80ff2f"}, + {file = "pyzmq-26.2.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:b1d464cb8d72bfc1a3adc53305a63a8e0cac6bc8c5a07e8ca190ab8d3faa43c2"}, + {file = "pyzmq-26.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4da04c48873a6abdd71811c5e163bd656ee1b957971db7f35140a2d573f6949c"}, + {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d049df610ac811dcffdc147153b414147428567fbbc8be43bb8885f04db39d98"}, + {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05590cdbc6b902101d0e65d6a4780af14dc22914cc6ab995d99b85af45362cc9"}, + {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c811cfcd6a9bf680236c40c6f617187515269ab2912f3d7e8c0174898e2519db"}, + {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6835dd60355593de10350394242b5757fbbd88b25287314316f266e24c61d073"}, + {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc6bee759a6bddea5db78d7dcd609397449cb2d2d6587f48f3ca613b19410cfc"}, + {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c530e1eecd036ecc83c3407f77bb86feb79916d4a33d11394b8234f3bd35b940"}, + {file = "pyzmq-26.2.0-cp39-cp39-win32.whl", hash = "sha256:367b4f689786fca726ef7a6c5ba606958b145b9340a5e4808132cc65759abd44"}, + {file = "pyzmq-26.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:e6fa2e3e683f34aea77de8112f6483803c96a44fd726d7358b9888ae5bb394ec"}, + {file = "pyzmq-26.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:7445be39143a8aa4faec43b076e06944b8f9d0701b669df4af200531b21e40bb"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:706e794564bec25819d21a41c31d4df2d48e1cc4b061e8d345d7fb4dd3e94072"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b435f2753621cd36e7c1762156815e21c985c72b19135dac43a7f4f31d28dd1"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:160c7e0a5eb178011e72892f99f918c04a131f36056d10d9c1afb223fc952c2d"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c4a71d5d6e7b28a47a394c0471b7e77a0661e2d651e7ae91e0cab0a587859ca"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:90412f2db8c02a3864cbfc67db0e3dcdbda336acf1c469526d3e869394fe001c"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2ea4ad4e6a12e454de05f2949d4beddb52460f3de7c8b9d5c46fbb7d7222e02c"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fc4f7a173a5609631bb0c42c23d12c49df3966f89f496a51d3eb0ec81f4519d6"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:878206a45202247781472a2d99df12a176fef806ca175799e1c6ad263510d57c"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17c412bad2eb9468e876f556eb4ee910e62d721d2c7a53c7fa31e643d35352e6"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:0d987a3ae5a71c6226b203cfd298720e0086c7fe7c74f35fa8edddfbd6597eed"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:39887ac397ff35b7b775db7201095fc6310a35fdbae85bac4523f7eb3b840e20"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fdb5b3e311d4d4b0eb8b3e8b4d1b0a512713ad7e6a68791d0923d1aec433d919"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:226af7dcb51fdb0109f0016449b357e182ea0ceb6b47dfb5999d569e5db161d5"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bed0e799e6120b9c32756203fb9dfe8ca2fb8467fed830c34c877e25638c3fc"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:29c7947c594e105cb9e6c466bace8532dc1ca02d498684128b339799f5248277"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cdeabcff45d1c219636ee2e54d852262e5c2e085d6cb476d938aee8d921356b3"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35cffef589bcdc587d06f9149f8d5e9e8859920a071df5a2671de2213bef592a"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18c8dc3b7468d8b4bdf60ce9d7141897da103c7a4690157b32b60acb45e333e6"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7133d0a1677aec369d67dd78520d3fa96dd7f3dcec99d66c1762870e5ea1a50a"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6a96179a24b14fa6428cbfc08641c779a53f8fcec43644030328f44034c7f1f4"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4f78c88905461a9203eac9faac157a2a0dbba84a0fd09fd29315db27be40af9f"}, + {file = "pyzmq-26.2.0.tar.gz", hash = "sha256:070672c258581c8e4f640b5159297580a9974b026043bd4ab0470be9ed324f1f"}, ] [package.dependencies] @@ -4521,24 +4580,24 @@ interplot = ["dill (>=0.3.4,<0.4.0)", "ipython (>=7.31.1,<8.0.0)", "pypiwin32 (> [[package]] name = "qutip" -version = "5.0.3.post1" +version = "5.0.4" description = "QuTiP: The Quantum Toolbox in Python" optional = false python-versions = ">=3.9" files = [ - {file = "qutip-5.0.3.post1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:345a79f07256ad6b543b7cb207e45f402018e180d476f70b612eaf705387c4ce"}, - {file = "qutip-5.0.3.post1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79d866cdf87819900df9169b1a73bee9c15643f2e80b9f0494d3d94ab94b267e"}, - {file = "qutip-5.0.3.post1-cp310-cp310-win_amd64.whl", hash = "sha256:095c43b1d9c13763cdfa0947e459bb24b30a0582039383944f503ab6f5157637"}, - {file = "qutip-5.0.3.post1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9acd0484f770d3c66f0e285357afa5ee0a047de11ef25b025c4359a8f8e98411"}, - {file = "qutip-5.0.3.post1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2ad3aab764da51a1dcf804bdaec151ddbaa88812986c0b53147be69a3dd9aec"}, - {file = "qutip-5.0.3.post1-cp311-cp311-win_amd64.whl", hash = "sha256:ed1b75ae0aa65bbe5dd5efd8652223df674df9182770e41bb2eee96c45a4f5e1"}, - {file = "qutip-5.0.3.post1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d0c5d1a6a5e57ba3b182bface793c0ce82cc6f531404e0471159c1183404b01d"}, - {file = "qutip-5.0.3.post1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b30f4f9738c18cf8904ae1fdc94a92e94e8aff7ea305f14791e7359d7ece946e"}, - {file = "qutip-5.0.3.post1-cp312-cp312-win_amd64.whl", hash = "sha256:b6a7a3511ce886dbf27ed4b28be51c0b4f76edd3e35e1e22a82000e10b101403"}, - {file = "qutip-5.0.3.post1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:073e798828fffc941a98e850d0332d78995466ffbbb95edcd58cf4af0d8b2f9e"}, - {file = "qutip-5.0.3.post1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0365fedd161b6fd8461207456258a5859fb0d8bb771d52bfae845c78a4275859"}, - {file = "qutip-5.0.3.post1-cp39-cp39-win_amd64.whl", hash = "sha256:4a44e11e70093390eeee00f81b34e46718cccf2aa612b4d5728031f062af379b"}, - {file = "qutip-5.0.3.post1.tar.gz", hash = "sha256:a00a27380f7c799444d2553888f5050de3ea6ff44247e468cb7dced71d789f0e"}, + {file = "qutip-5.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e855d70e5b97e15e30372dec89ec0c6bb12842a1262472894e4bb444e1e31541"}, + {file = "qutip-5.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10a50997d68df3702781ebd6e79def2c54431daecf550e742dba95679ce3d578"}, + {file = "qutip-5.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:85adc3c8ab91db1c22068599db9d39ea5d849f0ac646a176da221229560d25be"}, + {file = "qutip-5.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:288d2dcadc79b5a6918bef41adffb75d4a62039c095b02fc9901b2a7cd51787e"}, + {file = "qutip-5.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39da3510f0b508e698a1526b93826be6154f03add1cc090840d3d7b6a23f6298"}, + {file = "qutip-5.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:6096c018a909177d0220db2e89608c1929fe2d6cb14b04cce68aadcc53b142a1"}, + {file = "qutip-5.0.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ca0a7b5bd16404c16156600afe24f656b5230a7236f2e3fde933fed6e4823df9"}, + {file = "qutip-5.0.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:683fa10b9273ff0357323c9f0993e5620bf6bd020e80f2ec34f1c4c8bc3cbc0e"}, + {file = "qutip-5.0.4-cp312-cp312-win_amd64.whl", hash = "sha256:6a5c85b0df421ab5ed1dde345491256ceb9bdc77e0f6853541e1fa0a45536730"}, + {file = "qutip-5.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d5f617912ad9262a4bd4ea04096c24868507ede4e20cffe80b704f4a77101f82"}, + {file = "qutip-5.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d322e8637747f8f618ee2239e0ffed37f687cca1e282294ab6e46b5a3f54f5ca"}, + {file = "qutip-5.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:7f556165bf1cc73fe2b1ae062ef09ee11d80718426e197d359908c073b882fc6"}, + {file = "qutip-5.0.4.tar.gz", hash = "sha256:e5ee097cf0ef72e12baf21b32b293f2a7838bd439098286762ef786343549f1c"}, ] [package.dependencies] @@ -4641,13 +4700,13 @@ idna2008 = ["idna"] [[package]] name = "rich" -version = "13.7.1" +version = "13.8.1" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false python-versions = ">=3.7.0" files = [ - {file = "rich-13.7.1-py3-none-any.whl", hash = "sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222"}, - {file = "rich-13.7.1.tar.gz", hash = "sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432"}, + {file = "rich-13.8.1-py3-none-any.whl", hash = "sha256:1760a3c0848469b97b558fc61c85233e3dafb69c7a071b4d60c38099d3cd4c06"}, + {file = "rich-13.8.1.tar.gz", hash = "sha256:8260cda28e3db6bf04d2d1ef4dbc03ba80a824c88b0e7668a0f23126a424844a"}, ] [package.dependencies] @@ -4873,32 +4932,32 @@ files = [ [[package]] name = "scikit-learn" -version = "1.5.1" +version = "1.5.2" description = "A set of python modules for machine learning and data mining" optional = false python-versions = ">=3.9" files = [ - {file = "scikit_learn-1.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:781586c414f8cc58e71da4f3d7af311e0505a683e112f2f62919e3019abd3745"}, - {file = "scikit_learn-1.5.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:f5b213bc29cc30a89a3130393b0e39c847a15d769d6e59539cd86b75d276b1a7"}, - {file = "scikit_learn-1.5.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ff4ba34c2abff5ec59c803ed1d97d61b036f659a17f55be102679e88f926fac"}, - {file = "scikit_learn-1.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:161808750c267b77b4a9603cf9c93579c7a74ba8486b1336034c2f1579546d21"}, - {file = "scikit_learn-1.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:10e49170691514a94bb2e03787aa921b82dbc507a4ea1f20fd95557862c98dc1"}, - {file = "scikit_learn-1.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:154297ee43c0b83af12464adeab378dee2d0a700ccd03979e2b821e7dd7cc1c2"}, - {file = "scikit_learn-1.5.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:b5e865e9bd59396220de49cb4a57b17016256637c61b4c5cc81aaf16bc123bbe"}, - {file = "scikit_learn-1.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:909144d50f367a513cee6090873ae582dba019cb3fca063b38054fa42704c3a4"}, - {file = "scikit_learn-1.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:689b6f74b2c880276e365fe84fe4f1befd6a774f016339c65655eaff12e10cbf"}, - {file = "scikit_learn-1.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:9a07f90846313a7639af6a019d849ff72baadfa4c74c778821ae0fad07b7275b"}, - {file = "scikit_learn-1.5.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5944ce1faada31c55fb2ba20a5346b88e36811aab504ccafb9f0339e9f780395"}, - {file = "scikit_learn-1.5.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:0828673c5b520e879f2af6a9e99eee0eefea69a2188be1ca68a6121b809055c1"}, - {file = "scikit_learn-1.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:508907e5f81390e16d754e8815f7497e52139162fd69c4fdbd2dfa5d6cc88915"}, - {file = "scikit_learn-1.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97625f217c5c0c5d0505fa2af28ae424bd37949bb2f16ace3ff5f2f81fb4498b"}, - {file = "scikit_learn-1.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:da3f404e9e284d2b0a157e1b56b6566a34eb2798205cba35a211df3296ab7a74"}, - {file = "scikit_learn-1.5.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:88e0672c7ac21eb149d409c74cc29f1d611d5158175846e7a9c2427bd12b3956"}, - {file = "scikit_learn-1.5.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:7b073a27797a283187a4ef4ee149959defc350b46cbf63a84d8514fe16b69855"}, - {file = "scikit_learn-1.5.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b59e3e62d2be870e5c74af4e793293753565c7383ae82943b83383fdcf5cc5c1"}, - {file = "scikit_learn-1.5.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bd8d3a19d4bd6dc5a7d4f358c8c3a60934dc058f363c34c0ac1e9e12a31421d"}, - {file = "scikit_learn-1.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:5f57428de0c900a98389c4a433d4a3cf89de979b3aa24d1c1d251802aa15e44d"}, - {file = "scikit_learn-1.5.1.tar.gz", hash = "sha256:0ea5d40c0e3951df445721927448755d3fe1d80833b0b7308ebff5d2a45e6414"}, + {file = "scikit_learn-1.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:299406827fb9a4f862626d0fe6c122f5f87f8910b86fe5daa4c32dcd742139b6"}, + {file = "scikit_learn-1.5.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:2d4cad1119c77930b235579ad0dc25e65c917e756fe80cab96aa3b9428bd3fb0"}, + {file = "scikit_learn-1.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c412ccc2ad9bf3755915e3908e677b367ebc8d010acbb3f182814524f2e5540"}, + {file = "scikit_learn-1.5.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a686885a4b3818d9e62904d91b57fa757fc2bed3e465c8b177be652f4dd37c8"}, + {file = "scikit_learn-1.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:c15b1ca23d7c5f33cc2cb0a0d6aaacf893792271cddff0edbd6a40e8319bc113"}, + {file = "scikit_learn-1.5.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:03b6158efa3faaf1feea3faa884c840ebd61b6484167c711548fce208ea09445"}, + {file = "scikit_learn-1.5.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:1ff45e26928d3b4eb767a8f14a9a6efbf1cbff7c05d1fb0f95f211a89fd4f5de"}, + {file = "scikit_learn-1.5.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f763897fe92d0e903aa4847b0aec0e68cadfff77e8a0687cabd946c89d17e675"}, + {file = "scikit_learn-1.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8b0ccd4a902836493e026c03256e8b206656f91fbcc4fde28c57a5b752561f1"}, + {file = "scikit_learn-1.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:6c16d84a0d45e4894832b3c4d0bf73050939e21b99b01b6fd59cbb0cf39163b6"}, + {file = "scikit_learn-1.5.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f932a02c3f4956dfb981391ab24bda1dbd90fe3d628e4b42caef3e041c67707a"}, + {file = "scikit_learn-1.5.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:3b923d119d65b7bd555c73be5423bf06c0105678ce7e1f558cb4b40b0a5502b1"}, + {file = "scikit_learn-1.5.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f60021ec1574e56632be2a36b946f8143bf4e5e6af4a06d85281adc22938e0dd"}, + {file = "scikit_learn-1.5.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:394397841449853c2290a32050382edaec3da89e35b3e03d6cc966aebc6a8ae6"}, + {file = "scikit_learn-1.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:57cc1786cfd6bd118220a92ede80270132aa353647684efa385a74244a41e3b1"}, + {file = "scikit_learn-1.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:757c7d514ddb00ae249832fe87100d9c73c6ea91423802872d9e74970a0e40b9"}, + {file = "scikit_learn-1.5.2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:52788f48b5d8bca5c0736c175fa6bdaab2ef00a8f536cda698db61bd89c551c1"}, + {file = "scikit_learn-1.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:643964678f4b5fbdc95cbf8aec638acc7aa70f5f79ee2cdad1eec3df4ba6ead8"}, + {file = "scikit_learn-1.5.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca64b3089a6d9b9363cd3546f8978229dcbb737aceb2c12144ee3f70f95684b7"}, + {file = "scikit_learn-1.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:3bed4909ba187aca80580fe2ef370d9180dcf18e621a27c4cf2ef10d279a7efe"}, + {file = "scikit_learn-1.5.2.tar.gz", hash = "sha256:b4237ed7b3fdd0a4882792e68ef2545d5baa50aca3bb45aa7df468138ad8f94d"}, ] [package.dependencies] @@ -4910,11 +4969,11 @@ threadpoolctl = ">=3.1.0" [package.extras] benchmark = ["matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "pandas (>=1.1.5)"] build = ["cython (>=3.0.10)", "meson-python (>=0.16.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)"] -docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "polars (>=0.20.23)", "pooch (>=1.6.0)", "pydata-sphinx-theme (>=0.15.3)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)", "sphinx (>=7.3.7)", "sphinx-copybutton (>=0.5.2)", "sphinx-design (>=0.5.0)", "sphinx-gallery (>=0.16.0)", "sphinx-prompt (>=1.4.0)", "sphinx-remove-toctrees (>=1.0.0.post1)", "sphinxcontrib-sass (>=0.3.4)", "sphinxext-opengraph (>=0.9.1)"] +docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "polars (>=0.20.30)", "pooch (>=1.6.0)", "pydata-sphinx-theme (>=0.15.3)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)", "sphinx (>=7.3.7)", "sphinx-copybutton (>=0.5.2)", "sphinx-design (>=0.5.0)", "sphinx-design (>=0.6.0)", "sphinx-gallery (>=0.16.0)", "sphinx-prompt (>=1.4.0)", "sphinx-remove-toctrees (>=1.0.0.post1)", "sphinxcontrib-sass (>=0.3.4)", "sphinxext-opengraph (>=0.9.1)"] examples = ["matplotlib (>=3.3.4)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)"] install = ["joblib (>=1.2.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)", "threadpoolctl (>=3.1.0)"] maintenance = ["conda-lock (==2.5.6)"] -tests = ["black (>=24.3.0)", "matplotlib (>=3.3.4)", "mypy (>=1.9)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "polars (>=0.20.23)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pyarrow (>=12.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.2.1)", "scikit-image (>=0.17.2)"] +tests = ["black (>=24.3.0)", "matplotlib (>=3.3.4)", "mypy (>=1.9)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "polars (>=0.20.30)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pyarrow (>=12.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.2.1)", "scikit-image (>=0.17.2)"] [[package]] name = "scipy" @@ -5496,13 +5555,13 @@ files = [ [[package]] name = "urllib3" -version = "2.2.2" +version = "2.2.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, - {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, + {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, + {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, ] [package.extras] @@ -5566,94 +5625,108 @@ files = [ [[package]] name = "websockets" -version = "12.0" +version = "13.0.1" description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" optional = false python-versions = ">=3.8" files = [ - {file = "websockets-12.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d554236b2a2006e0ce16315c16eaa0d628dab009c33b63ea03f41c6107958374"}, - {file = "websockets-12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2d225bb6886591b1746b17c0573e29804619c8f755b5598d875bb4235ea639be"}, - {file = "websockets-12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eb809e816916a3b210bed3c82fb88eaf16e8afcf9c115ebb2bacede1797d2547"}, - {file = "websockets-12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c588f6abc13f78a67044c6b1273a99e1cf31038ad51815b3b016ce699f0d75c2"}, - {file = "websockets-12.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5aa9348186d79a5f232115ed3fa9020eab66d6c3437d72f9d2c8ac0c6858c558"}, - {file = "websockets-12.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6350b14a40c95ddd53e775dbdbbbc59b124a5c8ecd6fbb09c2e52029f7a9f480"}, - {file = "websockets-12.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:70ec754cc2a769bcd218ed8d7209055667b30860ffecb8633a834dde27d6307c"}, - {file = "websockets-12.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6e96f5ed1b83a8ddb07909b45bd94833b0710f738115751cdaa9da1fb0cb66e8"}, - {file = "websockets-12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4d87be612cbef86f994178d5186add3d94e9f31cc3cb499a0482b866ec477603"}, - {file = "websockets-12.0-cp310-cp310-win32.whl", hash = "sha256:befe90632d66caaf72e8b2ed4d7f02b348913813c8b0a32fae1cc5fe3730902f"}, - {file = "websockets-12.0-cp310-cp310-win_amd64.whl", hash = "sha256:363f57ca8bc8576195d0540c648aa58ac18cf85b76ad5202b9f976918f4219cf"}, - {file = "websockets-12.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5d873c7de42dea355d73f170be0f23788cf3fa9f7bed718fd2830eefedce01b4"}, - {file = "websockets-12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3f61726cae9f65b872502ff3c1496abc93ffbe31b278455c418492016e2afc8f"}, - {file = "websockets-12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed2fcf7a07334c77fc8a230755c2209223a7cc44fc27597729b8ef5425aa61a3"}, - {file = "websockets-12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e332c210b14b57904869ca9f9bf4ca32f5427a03eeb625da9b616c85a3a506c"}, - {file = "websockets-12.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5693ef74233122f8ebab026817b1b37fe25c411ecfca084b29bc7d6efc548f45"}, - {file = "websockets-12.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e9e7db18b4539a29cc5ad8c8b252738a30e2b13f033c2d6e9d0549b45841c04"}, - {file = "websockets-12.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6e2df67b8014767d0f785baa98393725739287684b9f8d8a1001eb2839031447"}, - {file = "websockets-12.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bea88d71630c5900690fcb03161ab18f8f244805c59e2e0dc4ffadae0a7ee0ca"}, - {file = "websockets-12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dff6cdf35e31d1315790149fee351f9e52978130cef6c87c4b6c9b3baf78bc53"}, - {file = "websockets-12.0-cp311-cp311-win32.whl", hash = "sha256:3e3aa8c468af01d70332a382350ee95f6986db479ce7af14d5e81ec52aa2b402"}, - {file = "websockets-12.0-cp311-cp311-win_amd64.whl", hash = "sha256:25eb766c8ad27da0f79420b2af4b85d29914ba0edf69f547cc4f06ca6f1d403b"}, - {file = "websockets-12.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0e6e2711d5a8e6e482cacb927a49a3d432345dfe7dea8ace7b5790df5932e4df"}, - {file = "websockets-12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:dbcf72a37f0b3316e993e13ecf32f10c0e1259c28ffd0a85cee26e8549595fbc"}, - {file = "websockets-12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12743ab88ab2af1d17dd4acb4645677cb7063ef4db93abffbf164218a5d54c6b"}, - {file = "websockets-12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b645f491f3c48d3f8a00d1fce07445fab7347fec54a3e65f0725d730d5b99cb"}, - {file = "websockets-12.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9893d1aa45a7f8b3bc4510f6ccf8db8c3b62120917af15e3de247f0780294b92"}, - {file = "websockets-12.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f38a7b376117ef7aff996e737583172bdf535932c9ca021746573bce40165ed"}, - {file = "websockets-12.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f764ba54e33daf20e167915edc443b6f88956f37fb606449b4a5b10ba42235a5"}, - {file = "websockets-12.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1e4b3f8ea6a9cfa8be8484c9221ec0257508e3a1ec43c36acdefb2a9c3b00aa2"}, - {file = "websockets-12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9fdf06fd06c32205a07e47328ab49c40fc1407cdec801d698a7c41167ea45113"}, - {file = "websockets-12.0-cp312-cp312-win32.whl", hash = "sha256:baa386875b70cbd81798fa9f71be689c1bf484f65fd6fb08d051a0ee4e79924d"}, - {file = "websockets-12.0-cp312-cp312-win_amd64.whl", hash = "sha256:ae0a5da8f35a5be197f328d4727dbcfafa53d1824fac3d96cdd3a642fe09394f"}, - {file = "websockets-12.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5f6ffe2c6598f7f7207eef9a1228b6f5c818f9f4d53ee920aacd35cec8110438"}, - {file = "websockets-12.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9edf3fc590cc2ec20dc9d7a45108b5bbaf21c0d89f9fd3fd1685e223771dc0b2"}, - {file = "websockets-12.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8572132c7be52632201a35f5e08348137f658e5ffd21f51f94572ca6c05ea81d"}, - {file = "websockets-12.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:604428d1b87edbf02b233e2c207d7d528460fa978f9e391bd8aaf9c8311de137"}, - {file = "websockets-12.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a9d160fd080c6285e202327aba140fc9a0d910b09e423afff4ae5cbbf1c7205"}, - {file = "websockets-12.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87b4aafed34653e465eb77b7c93ef058516cb5acf3eb21e42f33928616172def"}, - {file = "websockets-12.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b2ee7288b85959797970114deae81ab41b731f19ebcd3bd499ae9ca0e3f1d2c8"}, - {file = "websockets-12.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7fa3d25e81bfe6a89718e9791128398a50dec6d57faf23770787ff441d851967"}, - {file = "websockets-12.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a571f035a47212288e3b3519944f6bf4ac7bc7553243e41eac50dd48552b6df7"}, - {file = "websockets-12.0-cp38-cp38-win32.whl", hash = "sha256:3c6cc1360c10c17463aadd29dd3af332d4a1adaa8796f6b0e9f9df1fdb0bad62"}, - {file = "websockets-12.0-cp38-cp38-win_amd64.whl", hash = "sha256:1bf386089178ea69d720f8db6199a0504a406209a0fc23e603b27b300fdd6892"}, - {file = "websockets-12.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ab3d732ad50a4fbd04a4490ef08acd0517b6ae6b77eb967251f4c263011a990d"}, - {file = "websockets-12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a1d9697f3337a89691e3bd8dc56dea45a6f6d975f92e7d5f773bc715c15dde28"}, - {file = "websockets-12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1df2fbd2c8a98d38a66f5238484405b8d1d16f929bb7a33ed73e4801222a6f53"}, - {file = "websockets-12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23509452b3bc38e3a057382c2e941d5ac2e01e251acce7adc74011d7d8de434c"}, - {file = "websockets-12.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e5fc14ec6ea568200ea4ef46545073da81900a2b67b3e666f04adf53ad452ec"}, - {file = "websockets-12.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46e71dbbd12850224243f5d2aeec90f0aaa0f2dde5aeeb8fc8df21e04d99eff9"}, - {file = "websockets-12.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b81f90dcc6c85a9b7f29873beb56c94c85d6f0dac2ea8b60d995bd18bf3e2aae"}, - {file = "websockets-12.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a02413bc474feda2849c59ed2dfb2cddb4cd3d2f03a2fedec51d6e959d9b608b"}, - {file = "websockets-12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bbe6013f9f791944ed31ca08b077e26249309639313fff132bfbf3ba105673b9"}, - {file = "websockets-12.0-cp39-cp39-win32.whl", hash = "sha256:cbe83a6bbdf207ff0541de01e11904827540aa069293696dd528a6640bd6a5f6"}, - {file = "websockets-12.0-cp39-cp39-win_amd64.whl", hash = "sha256:fc4e7fa5414512b481a2483775a8e8be7803a35b30ca805afa4998a84f9fd9e8"}, - {file = "websockets-12.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:248d8e2446e13c1d4326e0a6a4e9629cb13a11195051a73acf414812700badbd"}, - {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44069528d45a933997a6fef143030d8ca8042f0dfaad753e2906398290e2870"}, - {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c4e37d36f0d19f0a4413d3e18c0d03d0c268ada2061868c1e6f5ab1a6d575077"}, - {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d829f975fc2e527a3ef2f9c8f25e553eb7bc779c6665e8e1d52aa22800bb38b"}, - {file = "websockets-12.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2c71bd45a777433dd9113847af751aae36e448bc6b8c361a566cb043eda6ec30"}, - {file = "websockets-12.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0bee75f400895aef54157b36ed6d3b308fcab62e5260703add87f44cee9c82a6"}, - {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:423fc1ed29f7512fceb727e2d2aecb952c46aa34895e9ed96071821309951123"}, - {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27a5e9964ef509016759f2ef3f2c1e13f403725a5e6a1775555994966a66e931"}, - {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3181df4583c4d3994d31fb235dc681d2aaad744fbdbf94c4802485ececdecf2"}, - {file = "websockets-12.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b067cb952ce8bf40115f6c19f478dc71c5e719b7fbaa511359795dfd9d1a6468"}, - {file = "websockets-12.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:00700340c6c7ab788f176d118775202aadea7602c5cc6be6ae127761c16d6b0b"}, - {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e469d01137942849cff40517c97a30a93ae79917752b34029f0ec72df6b46399"}, - {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffefa1374cd508d633646d51a8e9277763a9b78ae71324183693959cf94635a7"}, - {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba0cab91b3956dfa9f512147860783a1829a8d905ee218a9837c18f683239611"}, - {file = "websockets-12.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2cb388a5bfb56df4d9a406783b7f9dbefb888c09b71629351cc6b036e9259370"}, - {file = "websockets-12.0-py3-none-any.whl", hash = "sha256:dc284bbc8d7c78a6c69e0c7325ab46ee5e40bb4d50e494d8131a07ef47500e9e"}, - {file = "websockets-12.0.tar.gz", hash = "sha256:81df9cbcbb6c260de1e007e58c011bfebe2dafc8435107b0537f393dd38c8b1b"}, + {file = "websockets-13.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1841c9082a3ba4a05ea824cf6d99570a6a2d8849ef0db16e9c826acb28089e8f"}, + {file = "websockets-13.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c5870b4a11b77e4caa3937142b650fbbc0914a3e07a0cf3131f35c0587489c1c"}, + {file = "websockets-13.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f1d3d1f2eb79fe7b0fb02e599b2bf76a7619c79300fc55f0b5e2d382881d4f7f"}, + {file = "websockets-13.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15c7d62ee071fa94a2fc52c2b472fed4af258d43f9030479d9c4a2de885fd543"}, + {file = "websockets-13.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6724b554b70d6195ba19650fef5759ef11346f946c07dbbe390e039bcaa7cc3d"}, + {file = "websockets-13.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56a952fa2ae57a42ba7951e6b2605e08a24801a4931b5644dfc68939e041bc7f"}, + {file = "websockets-13.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:17118647c0ea14796364299e942c330d72acc4b248e07e639d34b75067b3cdd8"}, + {file = "websockets-13.0.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:64a11aae1de4c178fa653b07d90f2fb1a2ed31919a5ea2361a38760192e1858b"}, + {file = "websockets-13.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0617fd0b1d14309c7eab6ba5deae8a7179959861846cbc5cb528a7531c249448"}, + {file = "websockets-13.0.1-cp310-cp310-win32.whl", hash = "sha256:11f9976ecbc530248cf162e359a92f37b7b282de88d1d194f2167b5e7ad80ce3"}, + {file = "websockets-13.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:c3c493d0e5141ec055a7d6809a28ac2b88d5b878bb22df8c621ebe79a61123d0"}, + {file = "websockets-13.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:699ba9dd6a926f82a277063603fc8d586b89f4cb128efc353b749b641fcddda7"}, + {file = "websockets-13.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cf2fae6d85e5dc384bf846f8243ddaa9197f3a1a70044f59399af001fd1f51d4"}, + {file = "websockets-13.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:52aed6ef21a0f1a2a5e310fb5c42d7555e9c5855476bbd7173c3aa3d8a0302f2"}, + {file = "websockets-13.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8eb2b9a318542153674c6e377eb8cb9ca0fc011c04475110d3477862f15d29f0"}, + {file = "websockets-13.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5df891c86fe68b2c38da55b7aea7095beca105933c697d719f3f45f4220a5e0e"}, + {file = "websockets-13.0.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fac2d146ff30d9dd2fcf917e5d147db037a5c573f0446c564f16f1f94cf87462"}, + {file = "websockets-13.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b8ac5b46fd798bbbf2ac6620e0437c36a202b08e1f827832c4bf050da081b501"}, + {file = "websockets-13.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:46af561eba6f9b0848b2c9d2427086cabadf14e0abdd9fde9d72d447df268418"}, + {file = "websockets-13.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b5a06d7f60bc2fc378a333978470dfc4e1415ee52f5f0fce4f7853eb10c1e9df"}, + {file = "websockets-13.0.1-cp311-cp311-win32.whl", hash = "sha256:556e70e4f69be1082e6ef26dcb70efcd08d1850f5d6c5f4f2bcb4e397e68f01f"}, + {file = "websockets-13.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:67494e95d6565bf395476e9d040037ff69c8b3fa356a886b21d8422ad86ae075"}, + {file = "websockets-13.0.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f9c9e258e3d5efe199ec23903f5da0eeaad58cf6fccb3547b74fd4750e5ac47a"}, + {file = "websockets-13.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6b41a1b3b561f1cba8321fb32987552a024a8f67f0d05f06fcf29f0090a1b956"}, + {file = "websockets-13.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f73e676a46b0fe9426612ce8caeca54c9073191a77c3e9d5c94697aef99296af"}, + {file = "websockets-13.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f613289f4a94142f914aafad6c6c87903de78eae1e140fa769a7385fb232fdf"}, + {file = "websockets-13.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f52504023b1480d458adf496dc1c9e9811df4ba4752f0bc1f89ae92f4f07d0c"}, + {file = "websockets-13.0.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:139add0f98206cb74109faf3611b7783ceafc928529c62b389917a037d4cfdf4"}, + {file = "websockets-13.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:47236c13be337ef36546004ce8c5580f4b1150d9538b27bf8a5ad8edf23ccfab"}, + {file = "websockets-13.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c44ca9ade59b2e376612df34e837013e2b273e6c92d7ed6636d0556b6f4db93d"}, + {file = "websockets-13.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9bbc525f4be3e51b89b2a700f5746c2a6907d2e2ef4513a8daafc98198b92237"}, + {file = "websockets-13.0.1-cp312-cp312-win32.whl", hash = "sha256:3624fd8664f2577cf8de996db3250662e259bfbc870dd8ebdcf5d7c6ac0b5185"}, + {file = "websockets-13.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0513c727fb8adffa6d9bf4a4463b2bade0186cbd8c3604ae5540fae18a90cb99"}, + {file = "websockets-13.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1ee4cc030a4bdab482a37462dbf3ffb7e09334d01dd37d1063be1136a0d825fa"}, + {file = "websockets-13.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dbb0b697cc0655719522406c059eae233abaa3243821cfdfab1215d02ac10231"}, + {file = "websockets-13.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:acbebec8cb3d4df6e2488fbf34702cbc37fc39ac7abf9449392cefb3305562e9"}, + {file = "websockets-13.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63848cdb6fcc0bf09d4a155464c46c64ffdb5807ede4fb251da2c2692559ce75"}, + {file = "websockets-13.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:872afa52a9f4c414d6955c365b6588bc4401272c629ff8321a55f44e3f62b553"}, + {file = "websockets-13.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05e70fec7c54aad4d71eae8e8cab50525e899791fc389ec6f77b95312e4e9920"}, + {file = "websockets-13.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e82db3756ccb66266504f5a3de05ac6b32f287faacff72462612120074103329"}, + {file = "websockets-13.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4e85f46ce287f5c52438bb3703d86162263afccf034a5ef13dbe4318e98d86e7"}, + {file = "websockets-13.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f3fea72e4e6edb983908f0db373ae0732b275628901d909c382aae3b592589f2"}, + {file = "websockets-13.0.1-cp313-cp313-win32.whl", hash = "sha256:254ecf35572fca01a9f789a1d0f543898e222f7b69ecd7d5381d8d8047627bdb"}, + {file = "websockets-13.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:ca48914cdd9f2ccd94deab5bcb5ac98025a5ddce98881e5cce762854a5de330b"}, + {file = "websockets-13.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b74593e9acf18ea5469c3edaa6b27fa7ecf97b30e9dabd5a94c4c940637ab96e"}, + {file = "websockets-13.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:132511bfd42e77d152c919147078460c88a795af16b50e42a0bd14f0ad71ddd2"}, + {file = "websockets-13.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:165bedf13556f985a2aa064309baa01462aa79bf6112fbd068ae38993a0e1f1b"}, + {file = "websockets-13.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e801ca2f448850685417d723ec70298feff3ce4ff687c6f20922c7474b4746ae"}, + {file = "websockets-13.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30d3a1f041360f029765d8704eae606781e673e8918e6b2c792e0775de51352f"}, + {file = "websockets-13.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67648f5e50231b5a7f6d83b32f9c525e319f0ddc841be0de64f24928cd75a603"}, + {file = "websockets-13.0.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:4f0426d51c8f0926a4879390f53c7f5a855e42d68df95fff6032c82c888b5f36"}, + {file = "websockets-13.0.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ef48e4137e8799998a343706531e656fdec6797b80efd029117edacb74b0a10a"}, + {file = "websockets-13.0.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:249aab278810bee585cd0d4de2f08cfd67eed4fc75bde623be163798ed4db2eb"}, + {file = "websockets-13.0.1-cp38-cp38-win32.whl", hash = "sha256:06c0a667e466fcb56a0886d924b5f29a7f0886199102f0a0e1c60a02a3751cb4"}, + {file = "websockets-13.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1f3cf6d6ec1142412d4535adabc6bd72a63f5f148c43fe559f06298bc21953c9"}, + {file = "websockets-13.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1fa082ea38d5de51dd409434edc27c0dcbd5fed2b09b9be982deb6f0508d25bc"}, + {file = "websockets-13.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4a365bcb7be554e6e1f9f3ed64016e67e2fa03d7b027a33e436aecf194febb63"}, + {file = "websockets-13.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:10a0dc7242215d794fb1918f69c6bb235f1f627aaf19e77f05336d147fce7c37"}, + {file = "websockets-13.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59197afd478545b1f73367620407b0083303569c5f2d043afe5363676f2697c9"}, + {file = "websockets-13.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d20516990d8ad557b5abeb48127b8b779b0b7e6771a265fa3e91767596d7d97"}, + {file = "websockets-13.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1a2e272d067030048e1fe41aa1ec8cfbbaabce733b3d634304fa2b19e5c897f"}, + {file = "websockets-13.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ad327ac80ba7ee61da85383ca8822ff808ab5ada0e4a030d66703cc025b021c4"}, + {file = "websockets-13.0.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:518f90e6dd089d34eaade01101fd8a990921c3ba18ebbe9b0165b46ebff947f0"}, + {file = "websockets-13.0.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:68264802399aed6fe9652e89761031acc734fc4c653137a5911c2bfa995d6d6d"}, + {file = "websockets-13.0.1-cp39-cp39-win32.whl", hash = "sha256:a5dc0c42ded1557cc7c3f0240b24129aefbad88af4f09346164349391dea8e58"}, + {file = "websockets-13.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:b448a0690ef43db5ef31b3a0d9aea79043882b4632cfc3eaab20105edecf6097"}, + {file = "websockets-13.0.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:faef9ec6354fe4f9a2c0bbb52fb1ff852effc897e2a4501e25eb3a47cb0a4f89"}, + {file = "websockets-13.0.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:03d3f9ba172e0a53e37fa4e636b86cc60c3ab2cfee4935e66ed1d7acaa4625ad"}, + {file = "websockets-13.0.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d450f5a7a35662a9b91a64aefa852f0c0308ee256122f5218a42f1d13577d71e"}, + {file = "websockets-13.0.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f55b36d17ac50aa8a171b771e15fbe1561217510c8768af3d546f56c7576cdc"}, + {file = "websockets-13.0.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14b9c006cac63772b31abbcd3e3abb6228233eec966bf062e89e7fa7ae0b7333"}, + {file = "websockets-13.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b79915a1179a91f6c5f04ece1e592e2e8a6bd245a0e45d12fd56b2b59e559a32"}, + {file = "websockets-13.0.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f40de079779acbcdbb6ed4c65af9f018f8b77c5ec4e17a4b737c05c2db554491"}, + {file = "websockets-13.0.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:80e4ba642fc87fa532bac07e5ed7e19d56940b6af6a8c61d4429be48718a380f"}, + {file = "websockets-13.0.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a02b0161c43cc9e0232711eff846569fad6ec836a7acab16b3cf97b2344c060"}, + {file = "websockets-13.0.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6aa74a45d4cdc028561a7d6ab3272c8b3018e23723100b12e58be9dfa5a24491"}, + {file = "websockets-13.0.1-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00fd961943b6c10ee6f0b1130753e50ac5dcd906130dcd77b0003c3ab797d026"}, + {file = "websockets-13.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d93572720d781331fb10d3da9ca1067817d84ad1e7c31466e9f5e59965618096"}, + {file = "websockets-13.0.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:71e6e5a3a3728886caee9ab8752e8113670936a193284be9d6ad2176a137f376"}, + {file = "websockets-13.0.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:c4a6343e3b0714e80da0b0893543bf9a5b5fa71b846ae640e56e9abc6fbc4c83"}, + {file = "websockets-13.0.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a678532018e435396e37422a95e3ab87f75028ac79570ad11f5bf23cd2a7d8c"}, + {file = "websockets-13.0.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6716c087e4aa0b9260c4e579bb82e068f84faddb9bfba9906cb87726fa2e870"}, + {file = "websockets-13.0.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e33505534f3f673270dd67f81e73550b11de5b538c56fe04435d63c02c3f26b5"}, + {file = "websockets-13.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:acab3539a027a85d568c2573291e864333ec9d912675107d6efceb7e2be5d980"}, + {file = "websockets-13.0.1-py3-none-any.whl", hash = "sha256:b80f0c51681c517604152eb6a572f5a9378f877763231fddb883ba2f968e8817"}, + {file = "websockets-13.0.1.tar.gz", hash = "sha256:4d6ece65099411cfd9a48d13701d7438d9c34f479046b34c50ff60bb8834e43e"}, ] [[package]] name = "werkzeug" -version = "3.0.3" +version = "3.0.4" description = "The comprehensive WSGI web application library." optional = false python-versions = ">=3.8" files = [ - {file = "werkzeug-3.0.3-py3-none-any.whl", hash = "sha256:fc9645dc43e03e4d630d23143a04a7f947a9a3b5727cd535fdfe155a17cc48c8"}, - {file = "werkzeug-3.0.3.tar.gz", hash = "sha256:097e5bfda9f0aba8da6b8545146def481d06aa7d3266e7448e2cccf67dd8bd18"}, + {file = "werkzeug-3.0.4-py3-none-any.whl", hash = "sha256:02c9eb92b7d6c06f31a782811505d2157837cea66aaede3e217c7c27c039476c"}, + {file = "werkzeug-3.0.4.tar.gz", hash = "sha256:34f2371506b250df4d4f84bfe7b0921e4762525762bbd936614909fe25cd7306"}, ] [package.dependencies] @@ -5664,13 +5737,13 @@ watchdog = ["watchdog (>=2.3)"] [[package]] name = "widgetsnbextension" -version = "4.0.11" +version = "4.0.13" description = "Jupyter interactive widgets for Jupyter Notebook" optional = false python-versions = ">=3.7" files = [ - {file = "widgetsnbextension-4.0.11-py3-none-any.whl", hash = "sha256:55d4d6949d100e0d08b94948a42efc3ed6dfdc0e9468b2c4b128c9a2ce3a7a36"}, - {file = "widgetsnbextension-4.0.11.tar.gz", hash = "sha256:8b22a8f1910bfd188e596fe7fc05dcbd87e810c8a4ba010bdb3da86637398474"}, + {file = "widgetsnbextension-4.0.13-py3-none-any.whl", hash = "sha256:74b2692e8500525cc38c2b877236ba51d34541e6385eeed5aec15a70f88a6c71"}, + {file = "widgetsnbextension-4.0.13.tar.gz", hash = "sha256:ffcb67bc9febd10234a362795f643927f4e0c05d9342c727b65d2384f8feacb6"}, ] [[package]] @@ -5883,20 +5956,25 @@ zhinst-timing-models = "*" [[package]] name = "zipp" -version = "3.20.0" +version = "3.20.2" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.20.0-py3-none-any.whl", hash = "sha256:58da6168be89f0be59beb194da1250516fdaa062ccebd30127ac65d30045e10d"}, - {file = "zipp-3.20.0.tar.gz", hash = "sha256:0145e43d89664cfe1a2e533adc75adafed82fe2da404b4bbb6b026c0157bdb31"}, + {file = "zipp-3.20.2-py3-none-any.whl", hash = "sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350"}, + {file = "zipp-3.20.2.tar.gz", hash = "sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29"}, ] [package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] +type = ["pytest-mypy"] [extras] +bluefors = ["pyyaml"] emulator = ["qutip"] los = ["pyvisa-py", "qcodes", "qcodes_contrib_drivers"] qblox = ["pyvisa-py", "qblox-instruments", "qcodes", "qcodes_contrib_drivers"] @@ -5908,4 +5986,4 @@ zh = ["laboneq"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.13" -content-hash = "57df4d457e539b1f67ad4a4bab04ca32aa40dba477e5d8e623004a57f59a409d" +content-hash = "485f57fe31738fb08e3eea772d14cea50505cd18b59720dacf6f6fc4a52af400" diff --git a/pyproject.toml b/pyproject.toml index 6a637dd189..fb1cdcc942 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,6 +36,7 @@ setuptools = { version = ">67.0.0", optional = true } laboneq = { version = "==2.25.0", optional = true } qibosoq = { version = ">=0.1.2,<0.2", python = "<3.12", optional = true } qutip = { version = "^5.0.2", optional = true } +pyyaml = { version = "^6.0.2", optional = true } [tool.poetry.group.dev] optional = true @@ -88,6 +89,7 @@ rfsoc = ["qibosoq"] los = ["qcodes", "qcodes_contrib_drivers", "pyvisa-py"] twpa = ["qcodes", "qcodes_contrib_drivers", "pyvisa-py"] emulator = ["qutip"] +bluefors = ["pyyaml"] [tool.poe.tasks] diff --git a/src/qibolab/instruments/__init__.py b/src/qibolab/instruments/__init__.py index 8d4127bca6..0daca1f553 100644 --- a/src/qibolab/instruments/__init__.py +++ b/src/qibolab/instruments/__init__.py @@ -1,7 +1,5 @@ -from . import bluefors, dummy -from .bluefors import * +from . import dummy from .dummy import * __all__ = [] __all__ += dummy.__all__ -__all__ += bluefors.__all__ From 76c37e2dfd345b0d15e24ea9c99e9ac7362ef59d Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 17 Sep 2024 17:43:51 +0200 Subject: [PATCH 0975/1006] docs: Fix some references Keeping the `._core` path, for the time being --- doc/source/main-documentation/qibolab.rst | 90 +++++++++++------------ doc/source/tutorials/instrument.rst | 4 +- doc/source/tutorials/lab.rst | 21 +++--- doc/source/tutorials/pulses.rst | 4 +- 4 files changed, 60 insertions(+), 59 deletions(-) diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index 590711ee79..47e1b89a84 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -5,7 +5,7 @@ Platforms Qibolab provides support to different quantum laboratories. -Each lab configuration is implemented using a :class:`qibolab.platform.Platform` object which orchestrates instruments, +Each lab configuration is implemented using a :class:`qibolab.Platform` object which orchestrates instruments, qubits and channels and provides the basic features for executing pulses. Therefore, the ``Platform`` enables the user to interface with all the required lab instruments at the same time with minimum effort. @@ -108,9 +108,9 @@ Finally, we can stop instruments and close connections. Dummy platform ^^^^^^^^^^^^^^ -In addition to the real instruments presented in the :ref:`main_doc_instruments` section, Qibolab provides the :class:`qibolab.instruments.dummy.DummyInstrument`. +In addition to the real instruments presented in the :ref:`main_doc_instruments` section, Qibolab provides the :class:`qibolab.instruments.DummyInstrument`. This instrument represents a controller that returns random numbers of the proper shape when executing any pulse sequence. -This instrument is also part of the dummy platform which is defined in :py:mod:`qibolab.dummy` and can be initialized as +This instrument is also part of the dummy platform which is defined in :py:mod:`qibolab._core.dummy` and can be initialized as .. testcode:: python @@ -136,24 +136,24 @@ Various types of channels are typically present in a quantum laboratory setup, i - the flux line - the TWPA pump line -Qibolab provides a general :class:`qibolab.components.channels.Channel` object, as well as specializations depending on the channel role. +Qibolab provides a general :class:`qibolab.Channel` object, as well as specializations depending on the channel role. A channel is typically associated with a specific port on a control instrument, with port-specific properties like "attenuation" and "gain" that can be managed using provided getter and setter methods. Channels are uniquely identified within the platform through their id. The idea of channels is to streamline the pulse execution process. -The :class:`qibolab.sequence.PulseSequence` is a list of ``(channel_id, pulse)`` tuples, so that the platform identifies the channel that every pulse plays +The :class:`qibolab.PulseSequence` is a list of ``(channel_id, pulse)`` tuples, so that the platform identifies the channel that every pulse plays and directs it to the appropriate port on the control instrument. In setups involving frequency-specific pulses, a local oscillator (LO) might be required for up-conversion. Although logically distinct from the qubit, the LO's frequency must align with the pulse requirements. -Qibolab accommodates this by enabling the assignment of a :class:`qibolab.instruments.oscillator.LocalOscillator` object -to the relevant channel :class:`qibolab.components.channels.IqChannel`. +Qibolab accommodates this by enabling the assignment of a :class:`qibolab._core.instruments.oscillator.LocalOscillator` object +to the relevant channel :class:`qibolab.IqChannel`. The controller's driver ensures the correct pulse frequency is set based on the LO's configuration. -Each channel has a :class:`qibolab.components.configs.Config` associated to it, which is a container of parameters related to the channel. +Each channel has a :class:`qibolab._core.components.configs.Config` associated to it, which is a container of parameters related to the channel. Configs also have different specializations that correspond to different channel types. The platform holds default config parameters for all its channels, however the user is able to alter them by passing a config updates dictionary -when calling :meth:`qibolab.platform.Platform.execute`. +when calling :meth:`qibolab.Platform.execute`. The final configs are then sent to the controller instrument, which matches them to channels via their ids and ensures they are uploaded to the proper electronics. @@ -162,7 +162,7 @@ The final configs are then sent to the controller instrument, which matches them Qubits ------ -The :class:`qibolab.qubits.Qubit` class serves as a container for the channels that are used to control the corresponding physical qubit. +The :class:`qibolab.Qubit` class serves as a container for the channels that are used to control the corresponding physical qubit. These channels encompass distinct types, each serving a specific purpose: - probe (measurement probe from controller device to the qubits) @@ -174,7 +174,7 @@ These channels encompass distinct types, each serving a specific purpose: Some channel types are optional because not all hardware platforms require them. For example, flux channels are typically relevant only for flux tunable qubits. -The :class:`qibolab.qubits.Qubit` class can also be used to represent coupler qubits, when these are available. +The :class:`qibolab.Qubit` class can also be used to represent coupler qubits, when these are available. .. _main_doc_pulses: @@ -183,19 +183,19 @@ Pulses ------ In Qibolab, an extensive API is available for working with pulses and pulse sequences, a fundamental aspect of quantum experiments. -At the heart of this API is the :class:`qibolab.pulses.pulse.Pulse` object, which empowers users to define and customize pulses with specific parameters. +At the heart of this API is the :class:`qibolab.Pulse` object, which empowers users to define and customize pulses with specific parameters. -Additionally, pulses are defined by an envelope shape, represented by a subclass of :class:`qibolab.pulses.envelope.BaseEnvelope`. -Qibolab offers a range of pre-defined pulse shapes which can be found in :py:mod:`qibolab.pulses.envelope`. +Additionally, pulses are defined by an envelope shape, represented by a subclass of :class:`qibolab._core.pulses.envelope.BaseEnvelope`. +Qibolab offers a range of pre-defined pulse shapes which can be found in :py:mod:`qibolab._core.pulses.envelope`. -- Rectangular (:class:`qibolab.pulses.envelope.Rectangular`) -- Exponential (:class:`qibolab.pulses.envelope.Exponential`) -- Gaussian (:class:`qibolab.pulses.envelope.Gaussian`) -- Drag (:class:`qibolab.pulses.envelope.Drag`) -- IIR (:class:`qibolab.pulses.envelope.Iir`) -- SNZ (:class:`qibolab.pulses.envelope.Snz`) -- eCap (:class:`qibolab.pulses.envelope.ECap`) -- Custom (:class:`qibolab.pulses.envelope.Custom`) +- Rectangular (:class:`qibolab.Rectangular`) +- Exponential (:class:`qibolab.Exponential`) +- Gaussian (:class:`qibolab.Gaussian`) +- Drag (:class:`qibolab.Drag`) +- IIR (:class:`qibolab.Iir`) +- SNZ (:class:`qibolab.Snz`) +- eCap (:class:`qibolab.ECap`) +- Custom (:class:`qibolab.Custom`) To illustrate, here is an examples of how to instantiate a pulse using the Qibolab API: @@ -214,7 +214,7 @@ Here, we defined a rectangular drive pulse using the generic Pulse object. Both the Pulses objects and the PulseShape object have useful plot functions and several different various helper methods. -To organize pulses into sequences, Qibolab provides the :class:`qibolab.sequence.PulseSequence` object. Here's an example of how you can create and manipulate a pulse sequence: +To organize pulses into sequences, Qibolab provides the :class:`qibolab.PulseSequence` object. Here's an example of how you can create and manipulate a pulse sequence: .. testcode:: python @@ -287,7 +287,7 @@ Typical experiments may include both pre-defined pulses and new ones: Sweepers -------- -Sweeper objects, represented by the :class:`qibolab.sweeper.Sweeper` class, stand as a crucial component in experiments and calibration tasks within the Qibolab framework. +Sweeper objects, represented by the :class:`qibolab.Sweeper` class, stand as a crucial component in experiments and calibration tasks within the Qibolab framework. Consider a scenario where a resonator spectroscopy experiment is performed. This process involves a sequence of steps: @@ -304,7 +304,7 @@ In supported control devices, an efficient technique involves defining a "sweepe To address the inefficiency, Qibolab introduces the concept of Sweeper objects. -Sweeper objects in Qibolab are characterized by a :class:`qibolab.sweeper.Parameter`. This parameter, crucial to the sweeping process, can be one of several types: +Sweeper objects in Qibolab are characterized by a :class:`qibolab.Parameter`. This parameter, crucial to the sweeping process, can be one of several types: - Amplitude - Duration @@ -360,7 +360,7 @@ A typical resonator spectroscopy experiment could be defined with: .. note:: - options is an :class:`qibolab.execution_parameters.ExecutionParameters` object, detailed in a separate section. + options is an :class:`qibolab.ExecutionParameters` object, detailed in a separate section. In this way, we first define three parallel sweepers with an interval of 400 MHz (-200 MHz --- 200 MHz). The resulting probed frequency will then be: - for qubit 0: [3.8 GHz, 4.2 GHz] @@ -416,7 +416,7 @@ In the course of several examples, you've encountered the ``options`` argument i Let's now delve into the details of the ``options`` parameter and understand its components. -The ``options`` parameter, represented by the :class:`qibolab.execution_parameters.ExecutionParameters` class, is a vital element for every hardware execution. It encompasses essential information that tailors the execution to specific requirements: +The ``options`` parameter, represented by the :class:`qibolab.ExecutionParameters` class, is a vital element for every hardware execution. It encompasses essential information that tailors the execution to specific requirements: - ``nshots``: Specifies the number of experiment repetitions. - ``relaxation_time``: Introduces a wait time between repetitions, measured in nanoseconds (ns). @@ -426,13 +426,13 @@ The ``options`` parameter, represented by the :class:`qibolab.execution_paramete The first three parameters are straightforward in their purpose. However, let's take a closer look at the last two parameters. -Supported acquisition types, accessible via the :class:`qibolab.execution_parameters.AcquisitionType` enumeration, include: +Supported acquisition types, accessible via the :class:`qibolab.AcquisitionType` enumeration, include: - Discrimination: Distinguishes states based on acquired voltages. - Integration: Returns demodulated and integrated waveforms. - Raw: Offers demodulated, yet unintegrated waveforms. -Supported averaging modes, available through the :class:`qibolab.execution_parameters.AveragingMode` enumeration, consist of: +Supported averaging modes, available through the :class:`qibolab.AveragingMode` enumeration, consist of: - Cyclic: Provides averaged results, yielding a single IQ point per measurement. - Singleshot: Supplies non-averaged results. @@ -509,15 +509,15 @@ This procedure typically involves the following steps: The transpiler is responsible for steps 1 and 2, while the compiler for step 3 of the list above. To be executed in Qibolab, a circuit should be already transpiled. It possible to use the transpilers provided by Qibo to do it. For more information, please refer the `examples in the Qibo documentation `_. -On the other hand, the compilation process is taken care of automatically by the :class:`qibolab.backends.QibolabBackend`. +On the other hand, the compilation process is taken care of automatically by the :class:`qibolab.QibolabBackend`. -Once a circuit has been compiled, it is converted to a :class:`qibolab.sequence.PulseSequence` by the :class:`qibolab.compilers.compiler.Compiler`. +Once a circuit has been compiled, it is converted to a :class:`qibolab.PulseSequence` by the :class:`qibolab._core.compilers.compiler.Compiler`. This is a container of rules which define how each native gate can be translated to pulses. -A rule is a Python function that accepts a Qibo gate and a platform object and returns the :class:`qibolab.pulses.PulseSequence` implementing this gate and a dictionary with potential virtual-Z phases that need to be applied in later pulses. -Examples of rules can be found on :py:mod:`qibolab.compilers.default`, which defines the default rules used by Qibolab. +A rule is a Python function that accepts a Qibo gate and a platform object and returns the :class:`qibolab.PulseSequence` implementing this gate and a dictionary with potential virtual-Z phases that need to be applied in later pulses. +Examples of rules can be found on :py:mod:`qibolab._core.compilers.default`, which defines the default rules used by Qibolab. .. note:: - Rules return a :class:`qibolab.sequence.PulseSequence` for each gate, instead of a single pulse, because some gates such as the U3 or two-qubit gates, require more than one pulses to be implemented. + Rules return a :class:`qibolab.PulseSequence` for each gate, instead of a single pulse, because some gates such as the U3 or two-qubit gates, require more than one pulses to be implemented. .. _main_doc_native: @@ -527,10 +527,10 @@ Native Each quantum platform supports a specific set of native gates, which are the quantum operations that have been calibrated. If this set is universal any circuit can be transpiled and compiled to a pulse sequence which can then be deployed in the given platform. -:py:mod:`qibolab.native` provides data containers for holding the pulse parameters required for implementing every native gate. -The :class:`qibolab.platform.Platform` provides a natives property that returns the :class:`qibolab.native.SingleQubitNatives` -which holds the single qubit native gates for every qubit and :class:`qibolab.native.TwoQubitNatives` for the two-qubit native gates of every qubit pair. -Each native gate is represented by a :class:`qibolab.sequence.PulseSequence` which contains all the calibrated parameters. +:py:mod:`qibolab._core.native` provides data containers for holding the pulse parameters required for implementing every native gate. +The :class:`qibolab.Platform` provides a natives property that returns the :class:`qibolab._core.native.SingleQubitNatives` +which holds the single qubit native gates for every qubit and :class:`qibolab._core.native.TwoQubitNatives` for the two-qubit native gates of every qubit pair. +Each native gate is represented by a :class:`qibolab.PulseSequence` which contains all the calibrated parameters. Typical single-qubit native gates are the Pauli-X gate, implemented via a pi-pulse which is calibrated using Rabi oscillations and the measurement gate, implemented via a pulse sent in the readout line followed by an acquisition. @@ -549,17 +549,17 @@ Instruments One the key features of Qibolab is its support for multiple different electronics. A list of all the supported electronics follows: -Controllers (subclasses of :class:`qibolab.instruments.abstract.Controller`): - - Dummy Instrument: :class:`qibolab.instruments.dummy.DummyInstrument` +Controllers (subclasses of :class:`qibolab._core.instruments.abstract.Controller`): + - Dummy Instrument: :class:`qibolab.instruments.DummyInstrument` - Zurich Instruments: :class:`qibolab.instruments.zhinst.Zurich` - - Quantum Machines: :class:`qibolab.instruments.qm.controller.QMController` + - Quantum Machines: :class:`qibolab.instruments.qm.QMController` -Other Instruments (subclasses of :class:`qibolab.instruments.abstract.Instrument`): - - Erasynth++: :class:`qibolab.instruments.erasynth.ERA` +Other Instruments (subclasses of :class:`qibolab._core.instruments.abstract.Instrument`): + - Erasynth++: :class:`qibolab.instruments.era.ERASynth` - RohseSchwarz SGS100A: :class:`qibolab.instruments.rohde_schwarz.SGS100A` -All instruments inherit the :class:`qibolab.instruments.abstract.Instrument` and implement methods for connecting and disconnecting. -:class:`qibolab.instruments.abstract.Controller` is a special case of instruments that provides the :class:`qibolab.instruments.abstract.execute` +All instruments inherit the :class:`qibolab._core.instruments.abstract.Instrument` and implement methods for connecting and disconnecting. +:class:`qibolab._core.instruments.abstract.Controller` is a special case of instruments that provides the :class:`qibolab._core.instruments.abstract.execute` method that deploys sequences on hardware. Some more detail on the interal functionalities of instruments is given in :doc:`/tutorials/instrument` diff --git a/doc/source/tutorials/instrument.rst b/doc/source/tutorials/instrument.rst index d9c2a1988e..8be702fbaa 100644 --- a/doc/source/tutorials/instrument.rst +++ b/doc/source/tutorials/instrument.rst @@ -21,7 +21,7 @@ For example, a local oscillator is just an instrument, while Quantum Machines is Add an instrument ----------------- -The base of an instrument is :class:`qibolab.instruments.abstract.Instrument`, +The base of an instrument is :class:`qibolab._core.instruments.abstract.Instrument`, which is a pydantic ``Model``. To accomodate different kind of instruments, a flexible interface is implemented with two abstract methods (``connect()`` and ``disconnect()``) that are required @@ -79,7 +79,7 @@ Add a controller The controller is an instrument that has the additional method ``play``, which allows it to execute arbitrary pulse sequences and perform sweeps. -Its abstract implementation can be found in :class:`qibolab.instruments.abstract.Controller`. +Its abstract implementation can be found in :class:`qibolab._core.instruments.abstract.Controller`. Let's see a minimal example: diff --git a/doc/source/tutorials/lab.rst b/doc/source/tutorials/lab.rst index afbb076dc2..c0b5250405 100644 --- a/doc/source/tutorials/lab.rst +++ b/doc/source/tutorials/lab.rst @@ -4,15 +4,15 @@ How to connect Qibolab to your lab? In this section we will show how to let Qibolab communicate with your lab's instruments and run an experiment. -The main required object, in this case, is the :class:`qibolab.platform.Platform`. +The main required object, in this case, is the :class:`qibolab.Platform`. A Platform is defined as a QPU (quantum processing unit with one or more qubits) controlled by one ore more instruments. How to define a platform for a self-hosted QPU? ----------------------------------------------- -The :class:`qibolab.platform.Platform` object holds all the information required -to execute programs, and in particular :class:`qibolab.pulses.PulseSequence` in +The :class:`qibolab.Platform` object holds all the information required +to execute programs, and in particular :class:`qibolab.PulseSequence` in a real QPU. It is comprised by different objects that contain information about the native gates and the lab's instrumentation. @@ -120,10 +120,10 @@ using different Qibolab primitives. This code creates a platform with a single qubit that is controlled by the -:class:`qibolab.instruments.dummy.DummyInstrument`. In real applications, if +:class:`qibolab.instruments.DummyInstrument`. In real applications, if Qibolab provides drivers for the instruments in the lab, these can be directly used in place of the ``DummyInstrument`` above, otherwise new drivers need to be -coded following the abstract :class:`qibolab.instruments.abstract.Instrument` +coded following the abstract :class:`qibolab._core.instruments.abstract.Instrument` interface. Furthermore, above we defined three channels that connect the qubit to the @@ -324,11 +324,12 @@ will take them into account when calling :class:`qibolab.native.TwoQubitNatives` ) Couplers also need to be passed in a different dictionary than the qubits, -when instantiating the :class:`qibolab.platform.platform.Platform` +when instantiating the :class:`qibolab.Platform` .. note:: - The platform automatically creates the connectivity graph of the given chip, using the keys of :class:`qibolab.parameters.TwoQubitContainer` map. + The platform automatically creates the connectivity graph of the given chip, + using the keys of :class:`qibolab._core.parameters.TwoQubitContainer` map. Registering platforms @@ -364,7 +365,7 @@ since ``create()`` is part of a Python module, is is possible to load parameters from an external file or database. Qibolab provides some utility functions, accessible through -:py:mod:`qibolab.parameters`, for loading calibration parameters stored in a JSON +:py:mod:`qibolab._core.parameters`, for loading calibration parameters stored in a JSON file with a specific format. Here is an example .. code-block:: json @@ -542,7 +543,7 @@ single and two-qubit gates. Note that such parameters may slightly differ depending on the QPU architecture. Providing the above JSON is not sufficient to instantiate a -:class:`qibolab.platform.Platform`. This should still be done using a +:class:`qibolab.Platform`. This should still be done using a ``create()`` method. The ``create()`` method should be put in a file named ``platform.py`` inside the ``my_platform`` directory. Here is the ``create()`` method that loads the parameters from the JSON: @@ -632,7 +633,7 @@ The parameters JSON can contain such parameters in the ``configs`` section: Note that the key used in the JSON should be the same with the instrument name used -in the instrument dictionary when instantiating the :class:`qibolab.platform.platform.Platform`, +in the instrument dictionary when instantiating the :class:`qibolab.Platform`, in this case ``"twpa_pump"``. .. testcode:: python diff --git a/doc/source/tutorials/pulses.rst b/doc/source/tutorials/pulses.rst index 504969ab05..7e91adc51d 100644 --- a/doc/source/tutorials/pulses.rst +++ b/doc/source/tutorials/pulses.rst @@ -2,8 +2,8 @@ Pulses execution ================ We can create pulse sequence using the Qibolab pulse API directly, -defining a :class:`qibolab.sequence.PulseSequence` object and adding different -pulses (:class:`qibolab.pulses.Pulse`) using the :func:`qibolab.pulses.PulseSequence.append()` method: +defining a :class:`qibolab.PulseSequence` object and adding different +pulses (:class:`qibolab.Pulse`) using the :func:`qibolab.PulseSequence.append()` method: .. testcode:: python From a16d3cb8b7074bbeb700ffd7ad32f59f5a0b12b8 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 17 Sep 2024 18:24:49 +0200 Subject: [PATCH 0976/1006] fix: Remove unused import This is a breaking change for Qibocal, postponed until 0.2 for this reason --- src/qibolab/_core/qubits.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/qibolab/_core/qubits.py b/src/qibolab/_core/qubits.py index 1727a44021..1e6128a1fa 100644 --- a/src/qibolab/_core/qubits.py +++ b/src/qibolab/_core/qubits.py @@ -2,10 +2,7 @@ from pydantic import ConfigDict, Field -# TODO: the unused import are there because Qibocal is still importing them from here -# since the export scheme will be reviewed, it should be changed at that time, removing -# the unused ones from here -from .identifier import ChannelId, QubitId, QubitPairId, TransitionId # noqa +from .identifier import ChannelId, QubitId, TransitionId from .serialize import Model __all__ = ["Qubit"] @@ -19,7 +16,7 @@ class Qubit(Model): Contains the channel ids used to control the qubit and is instantiated in the function that creates the corresponding - :class:`qibolab.platforms.platform.Platform` + :class:`qibolab.Platform` """ model_config = ConfigDict(frozen=False) From a08aaa4ae1362f483a701417e2f9628a3d89cee0 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 17 Sep 2024 18:28:24 +0200 Subject: [PATCH 0977/1006] refactor: Standardize import, imposing mild conventions https://github.com/qiboteam/qibolab/issues/949#issue-2448262112 --- src/qibolab/_core/instruments/abstract.py | 3 +-- src/qibolab/_core/instruments/dummy.py | 5 ++--- src/qibolab/_core/instruments/erasynth.py | 5 +---- src/qibolab/_core/instruments/qm/config/config.py | 12 ++++++++---- .../_core/instruments/qm/config/devices.py | 2 +- .../_core/instruments/qm/config/elements.py | 2 +- src/qibolab/_core/instruments/qm/controller.py | 15 +++++++++------ 7 files changed, 23 insertions(+), 21 deletions(-) diff --git a/src/qibolab/_core/instruments/abstract.py b/src/qibolab/_core/instruments/abstract.py index 01c447aa4d..dc433cce31 100644 --- a/src/qibolab/_core/instruments/abstract.py +++ b/src/qibolab/_core/instruments/abstract.py @@ -3,8 +3,7 @@ from pydantic import ConfigDict, Field -from ..components import Config -from ..components.channels import Channel +from ..components import Channel, Config from ..execution_parameters import ExecutionParameters from ..identifier import ChannelId, Result from ..sequence import PulseSequence diff --git a/src/qibolab/_core/instruments/dummy.py b/src/qibolab/_core/instruments/dummy.py index 0a77cc5b33..e3d9a6a084 100644 --- a/src/qibolab/_core/instruments/dummy.py +++ b/src/qibolab/_core/instruments/dummy.py @@ -2,19 +2,18 @@ from pydantic import Field from qibo.config import log -from qibolab._core.components.channels import Channel +from qibolab._core.components import Channel, Config from qibolab._core.execution_parameters import ( AcquisitionType, AveragingMode, ExecutionParameters, ) from qibolab._core.identifier import ChannelId -from qibolab._core.pulses.pulse import Acquisition +from qibolab._core.pulses import Acquisition from qibolab._core.sequence import PulseSequence from qibolab._core.sweeper import ParallelSweepers from qibolab._core.unrolling import Bounds -from ..components import Config from .abstract import Controller from .oscillator import LocalOscillator diff --git a/src/qibolab/_core/instruments/erasynth.py b/src/qibolab/_core/instruments/erasynth.py index cde25be864..b9d73270ed 100644 --- a/src/qibolab/_core/instruments/erasynth.py +++ b/src/qibolab/_core/instruments/erasynth.py @@ -4,10 +4,7 @@ from qcodes_contrib_drivers.drivers.ERAInstruments import ERASynthPlusPlus from qibo.config import log -from qibolab._core.instruments.oscillator import ( - LocalOscillator, - LocalOscillatorSettings, -) +from .oscillator import LocalOscillator, LocalOscillatorSettings __all__ = ["ERASynth"] diff --git a/src/qibolab/_core/instruments/qm/config/config.py b/src/qibolab/_core/instruments/qm/config/config.py index c63bf99097..25bb7e49c4 100644 --- a/src/qibolab/_core/instruments/qm/config/config.py +++ b/src/qibolab/_core/instruments/qm/config/config.py @@ -1,11 +1,15 @@ from dataclasses import dataclass, field from typing import Optional, Union -from qibolab._core.components.channels import AcquisitionChannel, DcChannel, IqChannel -from qibolab._core.components.configs import IqConfig, OscillatorConfig +from qibolab._core.components import ( + AcquisitionChannel, + DcChannel, + IqChannel, + IqConfig, + OscillatorConfig, +) from qibolab._core.identifier import ChannelId -from qibolab._core.pulses import Pulse -from qibolab._core.pulses.pulse import Readout +from qibolab._core.pulses import Pulse, Readout from ..components import OpxOutputConfig, QmAcquisitionConfig from .devices import AnalogOutput, Controller, Octave, OctaveInput, OctaveOutput diff --git a/src/qibolab/_core/instruments/qm/config/devices.py b/src/qibolab/_core/instruments/qm/config/devices.py index 8b1128b2b0..9cc8665d0b 100644 --- a/src/qibolab/_core/instruments/qm/config/devices.py +++ b/src/qibolab/_core/instruments/qm/config/devices.py @@ -1,7 +1,7 @@ from dataclasses import dataclass, field from typing import Any, Generic, TypeVar -from qibolab._core.components.configs import OscillatorConfig +from qibolab._core.components import OscillatorConfig from ..components import OpxOutputConfig, QmAcquisitionConfig diff --git a/src/qibolab/_core/instruments/qm/config/elements.py b/src/qibolab/_core/instruments/qm/config/elements.py index abca3e12c3..1be37b2765 100644 --- a/src/qibolab/_core/instruments/qm/config/elements.py +++ b/src/qibolab/_core/instruments/qm/config/elements.py @@ -3,7 +3,7 @@ import numpy as np -from qibolab._core.components.channels import Channel +from qibolab._core.components import Channel __all__ = ["DcElement", "RfOctaveElement", "AcquireOctaveElement", "Element"] diff --git a/src/qibolab/_core/instruments/qm/controller.py b/src/qibolab/_core/instruments/qm/controller.py index 93d984f1f0..32673058a0 100644 --- a/src/qibolab/_core/instruments/qm/controller.py +++ b/src/qibolab/_core/instruments/qm/controller.py @@ -13,20 +13,23 @@ from qm.simulate.credentials import create_credentials from qualang_tools.simulator_tools import create_simulator_controller_connections -from qibolab._core.components import AcquisitionChannel, Config, DcChannel, IqChannel -from qibolab._core.components.configs import IqConfig, OscillatorConfig +from qibolab._core.components import ( + AcquisitionChannel, + Config, + DcChannel, + IqChannel, + IqConfig, + OscillatorConfig, +) from qibolab._core.execution_parameters import ExecutionParameters from qibolab._core.identifier import ChannelId from qibolab._core.instruments.abstract import Controller -from qibolab._core.instruments.qm.components.configs import ( - OpxOutputConfig, - QmAcquisitionConfig, -) from qibolab._core.pulses import Acquisition, Align, Delay, Pulse, Readout from qibolab._core.sequence import PulseSequence from qibolab._core.sweeper import ParallelSweepers, Parameter, Sweeper from qibolab._core.unrolling import Bounds, unroll_sequences +from .components import OpxOutputConfig, QmAcquisitionConfig from .config import SAMPLING_RATE, Configuration, operation from .program import ExecutionArguments, create_acquisition, program from .program.sweepers import find_lo_frequencies, sweeper_amplitude From 8daa66307634b9b5420c7ff677ee8b79ca28c724 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 18 Sep 2024 18:57:21 +0200 Subject: [PATCH 0978/1006] docs: Remove mentions to the internal API in the lab tutorial --- doc/source/tutorials/lab.rst | 358 +++-------------------------------- 1 file changed, 31 insertions(+), 327 deletions(-) diff --git a/doc/source/tutorials/lab.rst b/doc/source/tutorials/lab.rst index c0b5250405..f79a2358da 100644 --- a/doc/source/tutorials/lab.rst +++ b/doc/source/tutorials/lab.rst @@ -16,328 +16,30 @@ to execute programs, and in particular :class:`qibolab.PulseSequence` in a real QPU. It is comprised by different objects that contain information about the native gates and the lab's instrumentation. -The following cell shows how to define a single qubit platform from scratch, -using different Qibolab primitives. - -.. testcode:: python - - from qibolab import ( - Acquisition, - AcquisitionChannel, - Gaussian, - IqChannel, - Platform, - PulseSequence, - Pulse, - Qubit, - Readout, - Rectangular, - ) - from qibolab._core.components.configs import AcquisitionConfig, IqConfig - from qibolab._core.native import FixedSequenceFactory, RxyFactory - from qibolab._core.parameters import NativeGates, Parameters, SingleQubitNatives - from qibolab.instruments import DummyInstrument - - - def create(): - # Create the qubit objects - qubits = { - 0: Qubit( - drive="0/drive", - probe="0/probe", - acquisition="0/acquisition", - ) - } - - # Create channels and connect to instrument ports - channels = {} - qubit = qubits[0] - channels[qubit.probe] = IqChannel( - device="controller", - path="0", - mixer=None, - lo=None, - ) - channels[qubit.acquisition] = AcquisitionChannel( - device="controller", path="0", twpa_pump=None, probe="probe" - ) - channels[qubit.drive] = IqChannel( - device="controller", path="0", mixer=None, lo=None - ) - - # define configuration for channels - configs = {} - configs[qubit.drive] = IqConfig(frequency=3e9) - configs[qubit.probe] = IqConfig(frequency=7e9) - configs[qubit.acquisition] = AcquisitionConfig(delay=200.0, smearing=0.0) - - # create sequence that drives qubit from state 0 to 1 - drive_seq = PulseSequence( - [ - ( - qubit.drive, - Pulse(duration=40, amplitude=0.05, envelope=Gaussian(rel_sigma=0.2)), - ) - ] - ) - - # create sequence that can be used for measuring the qubit - measurement_seq = PulseSequence( - [ - ( - qubit.acquisition, - Readout( - acquisition=Acquisition(duration=1000), - probe=Pulse(duration=1000, amplitude=0.005, envelope=Rectangular()), - ), - ) - ] - ) - - # assign native gates to the qubit - native_gates = SingleQubitNatives( - RX=RxyFactory(drive_seq), - MZ=FixedSequenceFactory(measurement_seq), - ) - - # create a parameters instance - parameters = Parameters( - configs=configs, - native_gates=NativeGates(single_qubit={0: native_gates}), - ) - - # Create a controller instrument - instruments = { - "my_instrument": DummyInstrument( - name="my_instrument", - address="0.0.0.0:0", - channels=channels, - ) - } - - # allocate and return Platform object - return Platform("my_platform", parameters, instruments, qubits) - - -This code creates a platform with a single qubit that is controlled by the -:class:`qibolab.instruments.DummyInstrument`. In real applications, if -Qibolab provides drivers for the instruments in the lab, these can be directly -used in place of the ``DummyInstrument`` above, otherwise new drivers need to be -coded following the abstract :class:`qibolab._core.instruments.abstract.Instrument` -interface. - -Furthermore, above we defined three channels that connect the qubit to the -control instrument and we assigned two native gates to the qubit. - -When the QPU contains more than one qubit, some of the qubits are connected so -that two-qubit gates can be applied. These are called in a single dictionary, within -the native gates, but separately from the single-qubit ones. - -.. testcode:: python - - from qibolab import ( - Acquisition, - AcquisitionChannel, - DcChannel, - Gaussian, - IqChannel, - Pulse, - PulseSequence, - Qubit, - Readout, - Rectangular, - ) - from qibolab._core.components.configs import AcquisitionConfig, IqConfig - from qibolab._core.native import FixedSequenceFactory, RxyFactory - from qibolab._core.parameters import ( - NativeGates, - Parameters, - SingleQubitNatives, - TwoQubitContainer, - TwoQubitNatives, - ) - - # Create the qubit objects - qubits = { - 0: Qubit( - drive="0/drive", - flux="0/flux", - probe="0/probe", - acquisition="0/acquisition", - ), - 1: Qubit( - drive="1/drive", - flux="1/flux", - probe="1/probe", - acquisition="1/acquisition", - ), - } - - # Create channels and connect to instrument ports - channels = {} - channels[qubits[0].probe] = IqChannel( - device="controller", - path="0", - mixer=None, - lo=None, - ) - channels[qubits[0].acquisition] = AcquisitionChannel( - device="controller", path="0", twpa_pump=None, probe="probe" - ) - channels[qubits[0].drive] = IqChannel( - device="controller", path="1", mixer=None, lo=None - ) - channels[qubits[0].flux] = DcChannel(device="controller", path="2") - - channels[qubits[1].probe] = IqChannel( - device="controller", - path="3", - mixer=None, - lo=None, - ) - channels[qubits[1].acquisition] = AcquisitionChannel( - device="controller", path="3", twpa_pump=None, probe="probe" - ) - channels[qubits[1].drive] = IqChannel( - device="controller", path="4", mixer=None, lo=None - ) - channels[qubits[1].flux] = DcChannel(device="controller", path="5") - - # define configuration for channels - configs = {} - configs[qubits[0].drive] = IqConfig(frequency=3e9) - configs[qubits[0].probe] = IqConfig(frequency=7e9) - configs[qubits[0].acquisition] = AcquisitionConfig(delay=200.0, smearing=0.0) - - # create native gates - rx0 = PulseSequence( - [ - ( - qubits[0].drive, - Pulse(duration=40, amplitude=0.05, envelope=Gaussian(rel_sigma=0.2)), - ) - ] - ) - mz0 = PulseSequence( - [ - ( - qubits[0].acquisition, - Readout( - acquisition=Acquisition(duration=1000), - probe=Pulse(duration=1000, amplitude=0.005, envelope=Rectangular()), - ), - ) - ] - ) - rx1 = PulseSequence( - [ - ( - qubits[1].drive, - Pulse(duration=40, amplitude=0.05, envelope=Gaussian(rel_sigma=0.2)), - ) - ] - ) - mz1 = PulseSequence( - [ - ( - qubits[1].acquisition, - Readout( - acquisition=Acquisition(duration=1000), - probe=Pulse(duration=1000, amplitude=0.005, envelope=Rectangular()), - ), - ) - ] - ) - cz01 = PulseSequence( - [ - ( - qubits[0].flux, - Pulse(duration=30, amplitude=0.005, envelope=Rectangular()), - ), - ] - ) - native_gates = NativeGates( - single_qubit={ - 0: SingleQubitNatives( - RX=RxyFactory(rx0), - MZ=FixedSequenceFactory(mz0), - ), - 1: SingleQubitNatives( - RX=RxyFactory(rx1), - MZ=FixedSequenceFactory(mz1), - ), - }, - two_qubit=TwoQubitContainer( - {"0-1": TwoQubitNatives(CZ=FixedSequenceFactory(cz01))} - ), - ) - - # create a parameters instance - parameters = Parameters( - configs=configs, - native_gates=native_gates, - ) - -Some architectures may also have coupler qubits that mediate the interactions. -We neglected characterization parameters associated to the coupler but qibolab -will take them into account when calling :class:`qibolab.native.TwoQubitNatives`. - - -.. testcode:: python - - from qibolab import ( - DcChannel, - Pulse, - PulseSequence, - Qubit, - Rectangular, - ) - from qibolab._core.parameters import TwoQubitContainer, TwoQubitNatives - from qibolab._core.native import FixedSequenceFactory - - # create the qubit and coupler objects - coupler_01 = Qubit(flux="c01/flux") - - channels = {} - # assign channel(s) to the coupler - channels[coupler_01.flux] = DcChannel(device="controller", path="5") - - # assign single-qubit native gates to each qubit - # Look above example - - # define the pair of qubits - two_qubit = TwoQubitContainer( - { - "0-1": TwoQubitNatives( - CZ=FixedSequenceFactory( - PulseSequence( - [ - ( - coupler_01.flux, - Pulse(duration=30, amplitude=0.005, envelope=Rectangular()), - ) - ], - ) - ) - ), - } - ) - -Couplers also need to be passed in a different dictionary than the qubits, -when instantiating the :class:`qibolab.Platform` +This is permanently stored as its constructing function, ``create()``, defined in a +source file, but whose data could be stored in a package-defined format, for which +loading (and even dumping) methods are provided. +The details of this process are explained in the following sections. .. note:: - The platform automatically creates the connectivity graph of the given chip, - using the keys of :class:`qibolab._core.parameters.TwoQubitContainer` map. + The main distinction between the content of the Python source file and the parameters + stored as data is based on the possibility to automatically read and consume these + parameters, and possibly even update them in a calibration process. + + More parameters may be introduced, and occasionally some platforms are defining them + in the source, in a first stage. + The general idea is to retain as much flexibility as possible, while avoiding the + custom handling of commonly structured data by each platform, that would also + complicate its handling by downstream projects. Registering platforms ^^^^^^^^^^^^^^^^^^^^^ -The ``create()`` function defined in the above example can be called or imported -directly in any Python script. Alternatively, it is also possible to make the -platform available as +The ``create()`` function described in the above example can be called or imported +directly in any Python script. Alternatively, it is also possible to make the platform +available as .. code-block:: python @@ -358,15 +60,16 @@ repository `_. Loading platform parameters from JSON ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Operating a QPU requires calibrating a set of parameters, the number of which -increases with the number of qubits. Hardcoding such parameters in the -``create()`` function, as shown in the above examples, is not scalable. However, -since ``create()`` is part of a Python module, is is possible to load parameters -from an external file or database. +Operating a QPU requires calibrating a set of parameters, the number of which increases +with the number of qubits. Hardcoding such parameters in the ``create()`` function is +not scalable. +However, since ``create()`` is part of a Python module, is is possible to load +parameters from an external file or database. Qibolab provides some utility functions, accessible through :py:mod:`qibolab._core.parameters`, for loading calibration parameters stored in a JSON -file with a specific format. Here is an example +file with a specific format. +Here is an example .. code-block:: json @@ -608,10 +311,11 @@ is the directory containing ``platform.py``. Instrument settings ^^^^^^^^^^^^^^^^^^^ -The parameters of the previous example contains only parameters associated to the channel configuration -and the native gates. In some cases parameters associated to instruments also need to be calibrated. -An example is the frequency and the power of local oscillators, -such as the one used to pump a traveling wave parametric amplifier (TWPA). +The parameters of the previous example contains only parameters associated to the +channel configuration and the native gates. In some cases parameters associated to +instruments also need to be calibrated. +An example is the frequency and the power of local oscillators, such as the one used to +pump a traveling wave parametric amplifier (TWPA). The parameters JSON can contain such parameters in the ``configs`` section: @@ -632,9 +336,9 @@ The parameters JSON can contain such parameters in the ``configs`` section: } -Note that the key used in the JSON should be the same with the instrument name used -in the instrument dictionary when instantiating the :class:`qibolab.Platform`, -in this case ``"twpa_pump"``. +Note that the key used in the JSON have to be the same with the instrument name used in +the instrument dictionary when instantiating the :class:`qibolab.Platform`, in this case +``"twpa_pump"``. .. testcode:: python From 9a889b473fe3dd76b0fa01633c6b1e52538f0610 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Wed, 18 Sep 2024 19:11:20 +0200 Subject: [PATCH 0979/1006] feat: Expose the platform locating function --- src/qibolab/_core/platform/__init__.py | 9 ++++++--- src/qibolab/_core/platform/load.py | 19 ++++++++++++++++++- src/qibolab/_core/platform/platform.py | 2 ++ 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/qibolab/_core/platform/__init__.py b/src/qibolab/_core/platform/__init__.py index 2302ab60e8..15b665f43c 100644 --- a/src/qibolab/_core/platform/__init__.py +++ b/src/qibolab/_core/platform/__init__.py @@ -1,4 +1,7 @@ -from .load import create_platform -from .platform import Platform +from . import load, platform +from .load import * +from .platform import * -__all__ = ["Platform", "create_platform"] +__all__ = [] +__all__ += load.__all__ +__all__ += platform.__all__ diff --git a/src/qibolab/_core/platform/load.py b/src/qibolab/_core/platform/load.py index 2c941e3c6b..effe85e5d8 100644 --- a/src/qibolab/_core/platform/load.py +++ b/src/qibolab/_core/platform/load.py @@ -1,11 +1,14 @@ import importlib.util import os from pathlib import Path +from typing import Optional from qibo.config import raise_error from .platform import Platform +__all__ = ["create_platform", "locate_platform"] + PLATFORM = "platform.py" PLATFORMS = "QIBOLAB_PLATFORMS" @@ -24,7 +27,7 @@ def _platforms_paths() -> list[Path]: def _search(name: str, paths: list[Path]) -> Path: """Search paths for given platform name.""" - for path in _platforms_paths(): + for path in paths: platform = path / name if platform.exists(): return platform @@ -44,6 +47,20 @@ def _load(platform: Path) -> Platform: return module.create() +def locate_platform(name: str, paths: Optional[list[Path]] = None) -> Path: + """Locate platform's path. + + The ``name`` corresponds to the name of the folder in which the platform is defined, + i.e. the one containing the ``platform.py`` file. + + If ``paths`` are specified, the environment is ignored, and the folder search + happens only in the specified paths. + """ + if paths is None: + paths = _platforms_paths() + return _search(name, paths) + + def create_platform(name: str) -> Platform: """A platform for executing quantum algorithms. diff --git a/src/qibolab/_core/platform/platform.py b/src/qibolab/_core/platform/platform.py index 48278dab4a..d39031c7e5 100644 --- a/src/qibolab/_core/platform/platform.py +++ b/src/qibolab/_core/platform/platform.py @@ -19,6 +19,8 @@ from ..sweeper import ParallelSweepers from ..unrolling import Bounds, batch +__all__ = ["Platform"] + QubitMap = dict[QubitId, Qubit] QubitPairMap = list[QubitPairId] InstrumentMap = dict[InstrumentId, Instrument] From 26df7f246f1afc0eedde9219b0615faeeadecd50 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 19 Sep 2024 13:46:07 +0200 Subject: [PATCH 0980/1006] test: Add test for platform localization --- tests/test_platform.py | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/tests/test_platform.py b/tests/test_platform.py index 589812692d..dbcd149bbf 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -21,7 +21,7 @@ from qibolab._core.native import SingleQubitNatives, TwoQubitNatives from qibolab._core.parameters import NativeGates, Parameters, update_configs from qibolab._core.platform import Platform -from qibolab._core.platform.load import PLATFORM, PLATFORMS +from qibolab._core.platform.load import PLATFORM, PLATFORMS, locate_platform from qibolab._core.platform.platform import PARAMETERS from qibolab._core.pulses import Delay, Gaussian, Pulse, Rectangular from qibolab._core.sequence import PulseSequence @@ -67,6 +67,24 @@ def test_platform_basics(): assert (1, 6) in platform2.pairs +def test_locate_platform(tmp_path: Path): + some = tmp_path / "some" + some.mkdir() + + for p in [some / "platform0", some / "platform1"]: + p.mkdir() + (p / PLATFORM).write_text("'Ciao'") + + assert locate_platform("platform0", [some]) == some / "platform0" + + with pytest.raises(ValueError): + locate_platform("platform3") + + os.environ[PLATFORMS] = str(some) + + assert locate_platform("platform1") == some / "platform1" + + def test_create_platform_multipath(tmp_path: Path): some = tmp_path / "some" others = tmp_path / "others" From b9831ca98e1d9fa46437f89a7f9cbad7dec6cb5b Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 19 Sep 2024 14:04:14 +0200 Subject: [PATCH 0981/1006] feat!: Drop rxy factory in favor of method --- src/qibolab/_core/native.py | 70 +++++++++++-------------------------- 1 file changed, 20 insertions(+), 50 deletions(-) diff --git a/src/qibolab/_core/native.py b/src/qibolab/_core/native.py index b2b60d9096..3fd7e1930f 100644 --- a/src/qibolab/_core/native.py +++ b/src/qibolab/_core/native.py @@ -4,7 +4,7 @@ import numpy as np -from .pulses import Drag, Gaussian, Pulse +from .pulses import Pulse from .sequence import PulseSequence from .serialize import Model, replace @@ -30,56 +30,18 @@ def __call__(self, *args, **kwargs) -> PulseSequence: return self.create_sequence(*args, **kwargs) -class RxyFactory(Native): - """Factory for pulse sequences that generate single-qubit rotations around - an axis in xy plane. +def rxy(seq: PulseSequence, theta: float = np.pi, phi: float = 0.0) -> PulseSequence: + """Create a sequence for single-qubit rotation. - It is assumed that the underlying sequence contains only a single pulse. - It is assumed that the base sequence corresponds to a calibrated pi rotation around X axis. - Other rotation angles are achieved by scaling the amplitude, assuming a linear transfer function. - - Args: - sequence: The base sequence for the factory. + ``theta`` will be the angle of the rotation, while ``phi`` the angle that the rotation axis forms with x axis. """ - - def __init__(self, iterable): - super().__init__(iterable) - cls = type(self) - if len(self.channels) != 1: - raise ValueError( - f"Incompatible number of channels: {len(self.channels)}. " - f"{cls} expects a sequence on exactly one channel." - ) - - if len(self) != 1: - raise ValueError( - f"Incompatible number of pulses: {len(self)}. " - f"{cls} expects a sequence with exactly one pulse." - ) - - pulse = self[0][1] - assert isinstance(pulse, Pulse) - expected_envelopes = (Gaussian, Drag) - if not isinstance(pulse.envelope, expected_envelopes): - raise ValueError( - f"Incompatible pulse envelope: {pulse.envelope.__class__}. " - f"{cls} expects {expected_envelopes} envelope." - ) - - def create_sequence(self, theta: float = np.pi, phi: float = 0.0) -> PulseSequence: - """Create a sequence for single-qubit rotation. - - Args: - theta: the angle of rotation. - phi: the angle that rotation axis forms with x axis. - """ - theta, phi = _normalize_angles(theta, phi) - ch, pulse = self[0] - assert isinstance(pulse, Pulse) - new_amplitude = pulse.amplitude * theta / np.pi - return PulseSequence( - [(ch, replace(pulse, amplitude=new_amplitude, relative_phase=phi))] - ) + theta, phi = _normalize_angles(theta, phi) + ch, pulse = seq[0] + assert isinstance(pulse, Pulse) + new_amplitude = pulse.amplitude * theta / np.pi + return PulseSequence( + [(ch, replace(pulse, amplitude=new_amplitude, relative_phase=phi))] + ) class FixedSequenceFactory(Native): @@ -108,7 +70,7 @@ class SingleQubitNatives(NativeContainer): """Container with the native single-qubit gates acting on a specific qubit.""" - RX: Optional[RxyFactory] = None + RX: Optional[FixedSequenceFactory] = None """Pulse to drive the qubit from state 0 to state 1.""" RX12: Optional[FixedSequenceFactory] = None """Pulse to drive to qubit from state 1 to state 2.""" @@ -117,6 +79,14 @@ class SingleQubitNatives(NativeContainer): CP: Optional[FixedSequenceFactory] = None """Pulse to activate coupler.""" + def RXY(self, theta: float = np.pi, phi: float = 0.0) -> PulseSequence: + """Create a sequence for single-qubit rotation. + + ``theta`` will be the angle of the rotation, while ``phi`` the angle that the rotation axis forms with x axis. + """ + assert self.RX is not None + return rxy(self.RX, theta, phi) + class TwoQubitNatives(NativeContainer): """Container with the native two-qubit gates acting on a specific pair of From 46e88ec56baabcbb8c38012ca65fcc50a12de6d1 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 19 Sep 2024 14:13:07 +0200 Subject: [PATCH 0982/1006] feat!: Remove now ineffective fixed-sequence subclass --- src/qibolab/_core/native.py | 48 ++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 28 deletions(-) diff --git a/src/qibolab/_core/native.py b/src/qibolab/_core/native.py index 3fd7e1930f..f1c18f9c88 100644 --- a/src/qibolab/_core/native.py +++ b/src/qibolab/_core/native.py @@ -1,4 +1,3 @@ -from abc import ABC, abstractmethod from copy import deepcopy from typing import Annotated, Optional @@ -9,27 +8,27 @@ from .serialize import Model, replace -def _normalize_angles(theta, phi): - """Normalize theta to (-pi, pi], and phi to [0, 2*pi).""" - theta = theta % (2 * np.pi) - theta = theta - 2 * np.pi * (theta > np.pi) - phi = phi % (2 * np.pi) - return theta, phi - - -class Native(ABC, PulseSequence): - @abstractmethod - def create_sequence(self, *args, **kwargs) -> PulseSequence: - """Create a sequence for single-qubit rotation.""" +class Native(PulseSequence): + def create_sequence(self) -> PulseSequence: + """Create the sequence associated to the gate.""" + return deepcopy(self) def __call__(self, *args, **kwargs) -> PulseSequence: - """Create a sequence for single-qubit rotation. + """Create the sequence associated to the gate. Alias to :meth:`create_sequence`. """ return self.create_sequence(*args, **kwargs) +def _normalize_angles(theta, phi): + """Normalize theta to (-pi, pi], and phi to [0, 2*pi).""" + theta = theta % (2 * np.pi) + theta = theta - 2 * np.pi * (theta > np.pi) + phi = phi % (2 * np.pi) + return theta, phi + + def rxy(seq: PulseSequence, theta: float = np.pi, phi: float = 0.0) -> PulseSequence: """Create a sequence for single-qubit rotation. @@ -44,13 +43,6 @@ def rxy(seq: PulseSequence, theta: float = np.pi, phi: float = 0.0) -> PulseSequ ) -class FixedSequenceFactory(Native): - """Simple factory for a fixed arbitrary sequence.""" - - def create_sequence(self) -> PulseSequence: - return deepcopy(self) - - class MissingNative(RuntimeError): """Missing native gate.""" @@ -70,13 +62,13 @@ class SingleQubitNatives(NativeContainer): """Container with the native single-qubit gates acting on a specific qubit.""" - RX: Optional[FixedSequenceFactory] = None + RX: Optional[Native] = None """Pulse to drive the qubit from state 0 to state 1.""" - RX12: Optional[FixedSequenceFactory] = None + RX12: Optional[Native] = None """Pulse to drive to qubit from state 1 to state 2.""" - MZ: Optional[FixedSequenceFactory] = None + MZ: Optional[Native] = None """Measurement pulse.""" - CP: Optional[FixedSequenceFactory] = None + CP: Optional[Native] = None """Pulse to activate coupler.""" def RXY(self, theta: float = np.pi, phi: float = 0.0) -> PulseSequence: @@ -92,9 +84,9 @@ class TwoQubitNatives(NativeContainer): """Container with the native two-qubit gates acting on a specific pair of qubits.""" - CZ: Annotated[Optional[FixedSequenceFactory], {"symmetric": True}] = None - CNOT: Annotated[Optional[FixedSequenceFactory], {"symmetric": False}] = None - iSWAP: Annotated[Optional[FixedSequenceFactory], {"symmetric": True}] = None + CZ: Annotated[Optional[Native], {"symmetric": True}] = None + CNOT: Annotated[Optional[Native], {"symmetric": False}] = None + iSWAP: Annotated[Optional[Native], {"symmetric": True}] = None @property def symmetric(self): From 960dffcca40e2a3895135bfeb6cda20a0830692a Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 19 Sep 2024 14:14:45 +0200 Subject: [PATCH 0983/1006] test: Replace fixed-sequence directly with native --- tests/test_compilers_default.py | 4 ++-- tests/test_native.py | 28 ++++++++++++++-------------- tests/test_parameters.py | 8 +++----- 3 files changed, 19 insertions(+), 21 deletions(-) diff --git a/tests/test_compilers_default.py b/tests/test_compilers_default.py index b215d0388b..c1068d4977 100644 --- a/tests/test_compilers_default.py +++ b/tests/test_compilers_default.py @@ -7,7 +7,7 @@ from qibolab import create_platform from qibolab._core.compilers import Compiler from qibolab._core.identifier import ChannelId -from qibolab._core.native import FixedSequenceFactory, TwoQubitNatives +from qibolab._core.native import Native, TwoQubitNatives from qibolab._core.platform import Platform from qibolab._core.pulses import Delay, Pulse from qibolab._core.pulses.envelope import Rectangular @@ -221,7 +221,7 @@ def test_inactive_qubits(platform: Platform, joint: bool): circuit.add(gates.M(coupled)) natives = platform.natives.two_qubit[(main, coupled)] = TwoQubitNatives( - CZ=FixedSequenceFactory([]) + CZ=Native([]) ) assert natives.CZ is not None natives.CZ.clear() diff --git a/tests/test_native.py b/tests/test_native.py index 441bc5f7f4..a246ece0ad 100644 --- a/tests/test_native.py +++ b/tests/test_native.py @@ -4,7 +4,7 @@ import pytest from pydantic import TypeAdapter -from qibolab._core.native import FixedSequenceFactory, RxyFactory, TwoQubitNatives +from qibolab._core.native import Native, RxyFactory, TwoQubitNatives from qibolab._core.pulses import ( Drag, Exponential, @@ -29,7 +29,7 @@ def test_fixed_sequence_factory(): ), ] ) - factory = FixedSequenceFactory(seq) + factory = Native(seq) fseq1 = factory.create_sequence() fseq2 = factory.create_sequence() @@ -150,41 +150,41 @@ def test_rxy_rotation_factory_envelopes(envelope): def test_two_qubit_natives_symmetric(): natives = TwoQubitNatives( - CZ=FixedSequenceFactory(PulseSequence()), - CNOT=FixedSequenceFactory(PulseSequence()), - iSWAP=FixedSequenceFactory(PulseSequence()), + CZ=Native(PulseSequence()), + CNOT=Native(PulseSequence()), + iSWAP=Native(PulseSequence()), ) assert natives.symmetric is False natives = TwoQubitNatives( - CZ=FixedSequenceFactory(PulseSequence()), - iSWAP=FixedSequenceFactory(PulseSequence()), + CZ=Native(PulseSequence()), + iSWAP=Native(PulseSequence()), ) assert natives.symmetric is True natives = TwoQubitNatives( - CZ=FixedSequenceFactory(PulseSequence()), + CZ=Native(PulseSequence()), ) assert natives.symmetric is True natives = TwoQubitNatives( - iSWAP=FixedSequenceFactory(PulseSequence()), + iSWAP=Native(PulseSequence()), ) assert natives.symmetric is True natives = TwoQubitNatives( - CNOT=FixedSequenceFactory(PulseSequence()), + CNOT=Native(PulseSequence()), ) assert natives.symmetric is False natives = TwoQubitNatives( - CZ=FixedSequenceFactory(PulseSequence()), - CNOT=FixedSequenceFactory(PulseSequence()), + CZ=Native(PulseSequence()), + CNOT=Native(PulseSequence()), ) assert natives.symmetric is False natives = TwoQubitNatives( - CNOT=FixedSequenceFactory(PulseSequence()), - iSWAP=FixedSequenceFactory(PulseSequence()), + CNOT=Native(PulseSequence()), + iSWAP=Native(PulseSequence()), ) assert natives.symmetric is False diff --git a/tests/test_parameters.py b/tests/test_parameters.py index 3c507030ca..5cc956a9df 100644 --- a/tests/test_parameters.py +++ b/tests/test_parameters.py @@ -3,7 +3,7 @@ import pytest from qibolab._core.components.configs import Config -from qibolab._core.native import FixedSequenceFactory, TwoQubitNatives +from qibolab._core.native import Native, TwoQubitNatives from qibolab._core.parameters import ConfigKinds, Parameters, TwoQubitContainer @@ -13,12 +13,10 @@ def test_two_qubit_container(): Swapped indexing is working (only with getitem, not other dict methods) if all the registered natives are symmetric. """ - symmetric = TwoQubitContainer({(0, 1): TwoQubitNatives(CZ=FixedSequenceFactory())}) + symmetric = TwoQubitContainer({(0, 1): TwoQubitNatives(CZ=Native())}) assert symmetric[1, 0].CZ is not None - asymmetric = TwoQubitContainer( - {(0, 1): TwoQubitNatives(CNOT=FixedSequenceFactory())} - ) + asymmetric = TwoQubitContainer({(0, 1): TwoQubitNatives(CNOT=Native())}) with pytest.raises(KeyError): asymmetric[(1, 0)] From 94d8596f35d9414e1af9597315b8375de3ad1d20 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 19 Sep 2024 14:31:56 +0200 Subject: [PATCH 0984/1006] test: Temporarily remove pi-pulse validation --- tests/test_native.py | 83 ++++---------------------------------------- 1 file changed, 6 insertions(+), 77 deletions(-) diff --git a/tests/test_native.py b/tests/test_native.py index a246ece0ad..92d39a8b05 100644 --- a/tests/test_native.py +++ b/tests/test_native.py @@ -1,18 +1,8 @@ -import contextlib - import numpy as np import pytest -from pydantic import TypeAdapter - -from qibolab._core.native import Native, RxyFactory, TwoQubitNatives -from qibolab._core.pulses import ( - Drag, - Exponential, - Gaussian, - GaussianSquare, - Pulse, - Rectangular, -) + +from qibolab._core.native import Native, TwoQubitNatives, rxy +from qibolab._core.pulses import Drag, Gaussian, Pulse, Rectangular from qibolab._core.sequence import PulseSequence @@ -65,7 +55,7 @@ def test_fixed_sequence_factory(): ({"phi": 7.5 * np.pi}, 1.0, 1.5 * np.pi), ], ) -def test_rxy_rotation_factory(args, amplitude, phase): +def test_rxy(args, amplitude, phase): seq = PulseSequence( [ ( @@ -74,10 +64,9 @@ def test_rxy_rotation_factory(args, amplitude, phase): ) ] ) - factory = RxyFactory(seq) - fseq1 = factory.create_sequence(**args) - fseq2 = factory.create_sequence(**args) + fseq1 = rxy(seq, **args) + fseq2 = rxy(seq, **args) assert fseq1 == fseq2 np = "new/probe" fseq2.append((np, Pulse(duration=56, amplitude=0.43, envelope=Rectangular()))) @@ -88,66 +77,6 @@ def test_rxy_rotation_factory(args, amplitude, phase): assert pulse.relative_phase == pytest.approx(phase) -def test_rxy_factory_multiple_channels(): - seq = PulseSequence( - [ - ( - "1/drive", - Pulse(duration=40, amplitude=0.7, envelope=Gaussian(rel_sigma=5.0)), - ), - ( - "2/drive", - Pulse(duration=30, amplitude=1.0, envelope=Gaussian(rel_sigma=3.0)), - ), - ] - ) - - with pytest.raises(ValueError, match="Incompatible number of channels"): - _ = RxyFactory(seq) - - -def test_rxy_factory_multiple_pulses(): - seq = PulseSequence( - [ - ( - "1/drive", - Pulse(duration=40, amplitude=0.08, envelope=Gaussian(rel_sigma=4.0)), - ), - ( - "1/drive", - Pulse(duration=80, amplitude=0.76, envelope=Gaussian(rel_sigma=4.0)), - ), - ] - ) - - with pytest.raises(ValueError, match="Incompatible number of pulses"): - _ = RxyFactory(seq) - - -@pytest.mark.parametrize( - "envelope", - [ - Gaussian(rel_sigma=3.0), - GaussianSquare(rel_sigma=3.0, width=80), - Drag(rel_sigma=5.0, beta=-0.037), - Rectangular(), - Exponential(tau=0.7, upsilon=0.8), - ], -) -def test_rxy_rotation_factory_envelopes(envelope): - seq = PulseSequence( - [("1/drive", Pulse(duration=100, amplitude=1.0, envelope=envelope))] - ) - - if isinstance(envelope, (Gaussian, Drag)): - context = contextlib.nullcontext() - else: - context = pytest.raises(ValueError, match="Incompatible pulse envelope") - - with context: - _ = TypeAdapter(RxyFactory).validate_python(seq) - - def test_two_qubit_natives_symmetric(): natives = TwoQubitNatives( CZ=Native(PulseSequence()), From b0fcc9064246a74c3fff2ab87d0c724c3ececcd6 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 19 Sep 2024 14:39:47 +0200 Subject: [PATCH 0985/1006] fix: Use rxy to compile gpi2 --- src/qibolab/_core/compilers/default.py | 4 ++-- tests/test_compilers_default.py | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/qibolab/_core/compilers/default.py b/src/qibolab/_core/compilers/default.py index a6893d8589..fa6cc6c35d 100644 --- a/src/qibolab/_core/compilers/default.py +++ b/src/qibolab/_core/compilers/default.py @@ -31,7 +31,7 @@ def identity_rule(gate: Gate, natives: SingleQubitNatives) -> PulseSequence: def gpi2_rule(gate: Gate, natives: SingleQubitNatives) -> PulseSequence: """Rule for GPI2.""" - return natives.ensure("RX").create_sequence(theta=np.pi / 2, phi=gate.parameters[0]) + return natives.RXY(theta=np.pi / 2, phi=gate.parameters[0]) def gpi_rule(gate: Gate, natives: SingleQubitNatives) -> PulseSequence: @@ -40,7 +40,7 @@ def gpi_rule(gate: Gate, natives: SingleQubitNatives) -> PulseSequence: # to the matrix representation. See # https://github.com/qiboteam/qibolab/pull/804#pullrequestreview-1890205509 # for more detail. - return natives.ensure("RX").create_sequence(theta=np.pi, phi=gate.parameters[0]) + return natives.RXY(theta=np.pi, phi=gate.parameters[0]) def cz_rule(gate: Gate, natives: TwoQubitNatives) -> PulseSequence: diff --git a/tests/test_compilers_default.py b/tests/test_compilers_default.py index c1068d4977..5b1fbb4c0b 100644 --- a/tests/test_compilers_default.py +++ b/tests/test_compilers_default.py @@ -99,7 +99,7 @@ def test_gpi_to_sequence(platform: Platform): sequence = compile_circuit(circuit, platform) assert len(sequence.channels) == 1 - rx_seq = natives.single_qubit[0].RX.create_sequence(phi=0.2) + rx_seq = natives.single_qubit[0].RXY(phi=0.2) np.testing.assert_allclose(sequence.duration, rx_seq.duration) @@ -112,7 +112,7 @@ def test_gpi2_to_sequence(platform: Platform): sequence = compile_circuit(circuit, platform) assert len(sequence.channels) == 1 - rx90_seq = natives.single_qubit[0].RX.create_sequence(theta=np.pi / 2, phi=0.2) + rx90_seq = natives.single_qubit[0].RXY(theta=np.pi / 2, phi=0.2) np.testing.assert_allclose(sequence.duration, rx90_seq.duration) assert sequence == rx90_seq @@ -157,8 +157,8 @@ def test_add_measurement_to_sequence(platform: Platform): assert len(list(sequence.channel(qubit.acquisition))) == 2 # include delay s = PulseSequence() - s.concatenate(natives.single_qubit[0].RX.create_sequence(theta=np.pi / 2, phi=0.1)) - s.concatenate(natives.single_qubit[0].RX.create_sequence(theta=np.pi / 2, phi=0.2)) + s.concatenate(natives.single_qubit[0].RXY(theta=np.pi / 2, phi=0.1)) + s.concatenate(natives.single_qubit[0].RXY(theta=np.pi / 2, phi=0.2)) s.append((qubit.acquisition, Delay(duration=s.duration))) s.concatenate(natives.single_qubit[0].MZ.create_sequence()) From 6139abb43a72b03066a667096d0283e908d30bf7 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 19 Sep 2024 16:47:43 +0400 Subject: [PATCH 0986/1006] chore: drop logging from platform.connect --- src/qibolab/_core/platform/platform.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/qibolab/_core/platform/platform.py b/src/qibolab/_core/platform/platform.py index d39031c7e5..5fd215c260 100644 --- a/src/qibolab/_core/platform/platform.py +++ b/src/qibolab/_core/platform/platform.py @@ -171,14 +171,13 @@ def config(self, name: str) -> Config: def connect(self): """Connect to all instruments.""" if not self.is_connected: - for instrument in self.instruments.values(): + for name, instrument in self.instruments.items(): try: - log.info(f"Connecting to instrument {instrument}.") instrument.connect() except Exception as exception: raise_error( RuntimeError, - f"Cannot establish connection to {instrument} instruments. Error captured: '{exception}'", + f"Cannot establish connection to instrument {name}. Error captured: '{exception}'", ) self.is_connected = True From 9bc6e58fb5aadc65a246aaddeed6df149fc979fb Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 19 Sep 2024 16:48:01 +0400 Subject: [PATCH 0987/1006] docs: update README --- README.md | 109 +++++++++++++++++++++++++++++------------------------- 1 file changed, 58 insertions(+), 51 deletions(-) diff --git a/README.md b/README.md index 38ddce8130..6334c10108 100644 --- a/README.md +++ b/README.md @@ -10,9 +10,9 @@ the automatic deployment of quantum circuits on quantum hardware. Some of the key features of Qibolab are: - Deploy Qibo models on quantum hardware easily. -- Create custom experimental drivers for custom lab setup. +- Create experimental drivers for custom lab setup. - Support multiple heterogeneous platforms. -- Use existing calibration procedures for experimentalists. +- Use calibration procedures from [Qibocal](https://github.com/qiboteam/qibocal). ## Documentation @@ -26,43 +26,14 @@ A simple example on how to connect to a platform and use it execute a pulse sequ ```python from qibolab import create_platform, ExecutionParameters -from qibolab.pulses import Pulse, Delay, PulseType - -# Define PulseSequence -sequence = PulseSequence() -# Add some pulses to the pulse sequence -sequence.append( - Pulse( - amplitude=0.3, - duration=4000, - frequency=200_000_000, - relative_phase=0, - shape="Gaussian(5)", # Gaussian shape with std = duration / 5 - type=PulseType.DRIVE, - channel=1, - ) -) -sequence.append( - Delay( - duration=4000, - channel=2, - ) -) -sequence.append( - ReadoutPulse( - amplitude=0.9, - duration=2000, - frequency=20_000_000, - relative_phase=0, - shape="Rectangular", - type=PulseType.READOUT, - channel=2, - ) -) # Define platform and load specific runcard platform = create_platform("my_platform") +# Create a pulse sequence based on native gates of qubit 0 +natives = platform.natives.single_qubit[0] +sequence = natives.RX() | natives.MZ() + # Connects to lab instruments using the details specified in the calibration settings. platform.connect() @@ -71,38 +42,74 @@ options = ExecutionParameters(nshots=1000) results = platform.execute([sequence], options) # Print the acquired shots -print(results.samples) +readout_id = sequence.acquisitions[0][1].id +print(results[readout_id]) # Disconnect from the instruments platform.disconnect() ``` -Here is another example on how to execute circuits: +Arbitrary pulse sequences can also be created using the pulse API: ```python -import qibo -from qibo import gates, models +from qibolab import ( + Acquisition, + Delay, + Gaussian, + Pulse, + PulseSequence, + Readout, + Rectangular, +) + +# Crete some pulses +pulse = Pulse( + amplitude=0.3, + duration=40, + relative_phase=0, + envelope=Gaussian(rel_sigma=0.2), # Gaussian shape with std = 0.2 * duration +) +delay = Delay(duration=40) +readout = Readout( + acquisition=Acquisition(duration=2000), + probe=Pulse( + amplitude=0.9, + duration=2000, + envelope=Rectangular(), + relative_phase=0, + ), +) +# Add them to a PulseSequence +sequence = PulseSequence( + [ + (1, pulse), # pulse plays on channel 1 + (2, delay), # delay and readout plays on channel 2 + (2, readout), + ] +) +``` + +Here is another example on how to execute circuits: + +```python +from qibo import gates, models, set_backend -# Create circuit and add gates +# Create circuit and add native gates c = models.Circuit(1) -c.add(gates.H(0)) -c.add(gates.RX(0, theta=0.2)) -c.add(gates.X(0)) +c.add(gates.GPI2(0, phi=0.2)) c.add(gates.M(0)) # Simulate the circuit using numpy -qibo.set_backend("numpy") -for _ in range(5): - result = c(nshots=1024) - print(result.probabilities()) +set_backend("numpy") +result = c(nshots=1024) +print(result.probabilities()) # Execute the circuit on hardware -qibo.set_backend("qibolab", platform="my_platform") -for _ in range(5): - result = c(nshots=1024) - print(result.probabilities()) +set_backend("qibolab", platform="my_platform") +result = c(nshots=1024) +print(result.probabilities()) ``` ## Citation policy From aef6af42401e7e564a16d19d7bf4222ceeacd2cd Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 19 Sep 2024 14:52:39 +0200 Subject: [PATCH 0988/1006] docs: Fix usage of parametrized rxy in doctests --- doc/source/main-documentation/qibolab.rst | 2 +- doc/source/tutorials/pulses.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index 47e1b89a84..bef56ffdd0 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -73,7 +73,7 @@ as these are loaded automatically from the platform, as defined in the correspon qubit = platform.qubits[0] natives = platform.natives.single_qubit[0] ps.concatenate(natives.RX()) - ps.concatenate(natives.RX(phi=np.pi / 2)) + ps.concatenate(natives.RXY(phi=np.pi / 2)) ps.append((qubit.probe, Delay(duration=200))) ps.concatenate(natives.MZ()) diff --git a/doc/source/tutorials/pulses.rst b/doc/source/tutorials/pulses.rst index 7e91adc51d..40810316b8 100644 --- a/doc/source/tutorials/pulses.rst +++ b/doc/source/tutorials/pulses.rst @@ -75,4 +75,4 @@ Alternatively, instead of using the pulse API directly, one can use the native g platform = create_platform("dummy") q0 = platform.natives.single_qubit[0] - sequence = q0.RX(theta=np.pi / 2) | q0.MZ() + sequence = q0.RXY(theta=np.pi / 2) | q0.MZ() From 34be45517424376488044689c30dd523fc8c9358 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 19 Sep 2024 15:56:41 +0200 Subject: [PATCH 0989/1006] feat!: Rename RXY native to just R --- doc/source/main-documentation/qibolab.rst | 2 +- doc/source/tutorials/pulses.rst | 2 +- src/qibolab/_core/compilers/default.py | 4 ++-- src/qibolab/_core/native.py | 2 +- tests/test_compilers_default.py | 8 ++++---- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index bef56ffdd0..a913814541 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -73,7 +73,7 @@ as these are loaded automatically from the platform, as defined in the correspon qubit = platform.qubits[0] natives = platform.natives.single_qubit[0] ps.concatenate(natives.RX()) - ps.concatenate(natives.RXY(phi=np.pi / 2)) + ps.concatenate(natives.R(phi=np.pi / 2)) ps.append((qubit.probe, Delay(duration=200))) ps.concatenate(natives.MZ()) diff --git a/doc/source/tutorials/pulses.rst b/doc/source/tutorials/pulses.rst index 40810316b8..0a3e498680 100644 --- a/doc/source/tutorials/pulses.rst +++ b/doc/source/tutorials/pulses.rst @@ -75,4 +75,4 @@ Alternatively, instead of using the pulse API directly, one can use the native g platform = create_platform("dummy") q0 = platform.natives.single_qubit[0] - sequence = q0.RXY(theta=np.pi / 2) | q0.MZ() + sequence = q0.R(theta=np.pi / 2) | q0.MZ() diff --git a/src/qibolab/_core/compilers/default.py b/src/qibolab/_core/compilers/default.py index fa6cc6c35d..308e723e90 100644 --- a/src/qibolab/_core/compilers/default.py +++ b/src/qibolab/_core/compilers/default.py @@ -31,7 +31,7 @@ def identity_rule(gate: Gate, natives: SingleQubitNatives) -> PulseSequence: def gpi2_rule(gate: Gate, natives: SingleQubitNatives) -> PulseSequence: """Rule for GPI2.""" - return natives.RXY(theta=np.pi / 2, phi=gate.parameters[0]) + return natives.R(theta=np.pi / 2, phi=gate.parameters[0]) def gpi_rule(gate: Gate, natives: SingleQubitNatives) -> PulseSequence: @@ -40,7 +40,7 @@ def gpi_rule(gate: Gate, natives: SingleQubitNatives) -> PulseSequence: # to the matrix representation. See # https://github.com/qiboteam/qibolab/pull/804#pullrequestreview-1890205509 # for more detail. - return natives.RXY(theta=np.pi, phi=gate.parameters[0]) + return natives.R(theta=np.pi, phi=gate.parameters[0]) def cz_rule(gate: Gate, natives: TwoQubitNatives) -> PulseSequence: diff --git a/src/qibolab/_core/native.py b/src/qibolab/_core/native.py index f1c18f9c88..73ee9f1400 100644 --- a/src/qibolab/_core/native.py +++ b/src/qibolab/_core/native.py @@ -71,7 +71,7 @@ class SingleQubitNatives(NativeContainer): CP: Optional[Native] = None """Pulse to activate coupler.""" - def RXY(self, theta: float = np.pi, phi: float = 0.0) -> PulseSequence: + def R(self, theta: float = np.pi, phi: float = 0.0) -> PulseSequence: """Create a sequence for single-qubit rotation. ``theta`` will be the angle of the rotation, while ``phi`` the angle that the rotation axis forms with x axis. diff --git a/tests/test_compilers_default.py b/tests/test_compilers_default.py index 5b1fbb4c0b..9332f57998 100644 --- a/tests/test_compilers_default.py +++ b/tests/test_compilers_default.py @@ -99,7 +99,7 @@ def test_gpi_to_sequence(platform: Platform): sequence = compile_circuit(circuit, platform) assert len(sequence.channels) == 1 - rx_seq = natives.single_qubit[0].RXY(phi=0.2) + rx_seq = natives.single_qubit[0].R(phi=0.2) np.testing.assert_allclose(sequence.duration, rx_seq.duration) @@ -112,7 +112,7 @@ def test_gpi2_to_sequence(platform: Platform): sequence = compile_circuit(circuit, platform) assert len(sequence.channels) == 1 - rx90_seq = natives.single_qubit[0].RXY(theta=np.pi / 2, phi=0.2) + rx90_seq = natives.single_qubit[0].R(theta=np.pi / 2, phi=0.2) np.testing.assert_allclose(sequence.duration, rx90_seq.duration) assert sequence == rx90_seq @@ -157,8 +157,8 @@ def test_add_measurement_to_sequence(platform: Platform): assert len(list(sequence.channel(qubit.acquisition))) == 2 # include delay s = PulseSequence() - s.concatenate(natives.single_qubit[0].RXY(theta=np.pi / 2, phi=0.1)) - s.concatenate(natives.single_qubit[0].RXY(theta=np.pi / 2, phi=0.2)) + s.concatenate(natives.single_qubit[0].R(theta=np.pi / 2, phi=0.1)) + s.concatenate(natives.single_qubit[0].R(theta=np.pi / 2, phi=0.2)) s.append((qubit.acquisition, Delay(duration=s.duration))) s.concatenate(natives.single_qubit[0].MZ.create_sequence()) From 7c214ef62488cfc9e2b4cc13f8fbe6748309f710 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Mon, 16 Sep 2024 00:49:44 +0400 Subject: [PATCH 0990/1006] fix: offset sweeper for QM --- src/qibolab/_core/instruments/qm/controller.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/qibolab/_core/instruments/qm/controller.py b/src/qibolab/_core/instruments/qm/controller.py index 32673058a0..09a680bdf8 100644 --- a/src/qibolab/_core/instruments/qm/controller.py +++ b/src/qibolab/_core/instruments/qm/controller.py @@ -418,6 +418,9 @@ def preprocess_sweeps( find_lo_frequencies(args, channels, configs, sweeper.values) for id in sweeper.channels: args.parameters[id].element = probe_map.get(id, id) + for sweeper in find_sweepers(sweepers, Parameter.offset): + for id in sweeper.channels: + args.parameters[id].element = id for sweeper in find_sweepers(sweepers, Parameter.amplitude): self.register_amplitude_sweeper_pulses(args, sweeper) for sweeper in find_sweepers(sweepers, Parameter.duration): From 74f1152bf30baed1daefb05e8529aafa8f1d4e80 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 17 Sep 2024 11:56:16 +0400 Subject: [PATCH 0991/1006] fix: convert duration sweep to int --- src/qibolab/_core/instruments/qm/controller.py | 2 +- src/qibolab/_core/instruments/qm/program/instructions.py | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/qibolab/_core/instruments/qm/controller.py b/src/qibolab/_core/instruments/qm/controller.py index 09a680bdf8..34a8f5f535 100644 --- a/src/qibolab/_core/instruments/qm/controller.py +++ b/src/qibolab/_core/instruments/qm/controller.py @@ -343,7 +343,7 @@ def register_duration_sweeper_pulses( original_pulse = ( pulse if params.amplitude_pulse is None else params.amplitude_pulse ) - for value in sweeper.values: + for value in sweeper.values.astype(int): sweep_pulse = original_pulse.model_copy(update={"duration": value}) sweep_op = self.register_pulse(ids[0], sweep_pulse) params.duration_ops.append((value, sweep_op)) diff --git a/src/qibolab/_core/instruments/qm/program/instructions.py b/src/qibolab/_core/instruments/qm/program/instructions.py index b19333b0fe..e66642eb63 100644 --- a/src/qibolab/_core/instruments/qm/program/instructions.py +++ b/src/qibolab/_core/instruments/qm/program/instructions.py @@ -111,8 +111,13 @@ def _process_sweeper(sweeper: Sweeper, args: ExecutionArguments): if parameter not in SWEEPER_METHODS: raise NotImplementedError(f"Sweeper for {parameter} is not implemented.") - variable = declare(int) if parameter in INT_TYPE else declare(fixed) - values = sweeper.values + if parameter in INT_TYPE: + variable = declare(int) + values = sweeper.values.astype(int) + else: + variable = declare(fixed) + values = sweeper.values + if parameter is Parameter.frequency: lo_frequency = args.parameters[sweeper.channels[0]].lo_frequency values = NORMALIZERS[parameter](values, lo_frequency) From 7ff8cedd7370cbee2bceeb9be46a6930b167a61a Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 17 Sep 2024 12:18:08 +0400 Subject: [PATCH 0992/1006] fix: use pulse.id instead of hash in pulse parameters to avoid unwanted duplications --- src/qibolab/_core/instruments/qm/controller.py | 6 +++--- src/qibolab/_core/instruments/qm/program/instructions.py | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/qibolab/_core/instruments/qm/controller.py b/src/qibolab/_core/instruments/qm/controller.py index 34a8f5f535..f8efb7a21e 100644 --- a/src/qibolab/_core/instruments/qm/controller.py +++ b/src/qibolab/_core/instruments/qm/controller.py @@ -30,7 +30,7 @@ from qibolab._core.unrolling import Bounds, unroll_sequences from .components import OpxOutputConfig, QmAcquisitionConfig -from .config import SAMPLING_RATE, Configuration, operation +from .config import SAMPLING_RATE, Configuration from .program import ExecutionArguments, create_acquisition, program from .program.sweepers import find_lo_frequencies, sweeper_amplitude @@ -338,7 +338,7 @@ def register_duration_sweeper_pulses( if isinstance(pulse, (Align, Delay)): continue - params = args.parameters[operation(pulse)] + params = args.parameters[pulse.id] ids = args.sequence.pulse_channels(pulse.id) original_pulse = ( pulse if params.amplitude_pulse is None else params.amplitude_pulse @@ -360,7 +360,7 @@ def register_amplitude_sweeper_pulses( for pulse in sweeper.pulses: sweep_pulse = pulse.model_copy(update={"amplitude": amplitude}) ids = args.sequence.pulse_channels(pulse.id) - params = args.parameters[operation(pulse)] + params = args.parameters[pulse.id] params.amplitude_pulse = sweep_pulse params.amplitude_op = self.register_pulse(ids[0], sweep_pulse) diff --git a/src/qibolab/_core/instruments/qm/program/instructions.py b/src/qibolab/_core/instruments/qm/program/instructions.py index e66642eb63..f1dc1de501 100644 --- a/src/qibolab/_core/instruments/qm/program/instructions.py +++ b/src/qibolab/_core/instruments/qm/program/instructions.py @@ -87,7 +87,7 @@ def play(args: ExecutionArguments): for channel_id, pulse in args.sequence: element = str(channel_id) op = operation(pulse) - params = args.parameters[op] + params = args.parameters[pulse.id] if isinstance(pulse, Delay): _delay(pulse, element, params) elif isinstance(pulse, Pulse): @@ -153,7 +153,7 @@ def sweep( method = SWEEPER_METHODS[sweeper.parameter] if sweeper.pulses is not None: for pulse in sweeper.pulses: - params = args.parameters[operation(pulse)] + params = args.parameters[pulse.id] method(variable, params) else: for channel in sweeper.channels: From 195f9ceb929dfc92e843354bffe5ad894c0239de Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 19 Sep 2024 18:22:47 +0200 Subject: [PATCH 0993/1006] fix: Update name of rotation generating function --- src/qibolab/_core/native.py | 6 ++++-- tests/test_native.py | 8 ++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/qibolab/_core/native.py b/src/qibolab/_core/native.py index 73ee9f1400..fd1131f0bc 100644 --- a/src/qibolab/_core/native.py +++ b/src/qibolab/_core/native.py @@ -29,7 +29,9 @@ def _normalize_angles(theta, phi): return theta, phi -def rxy(seq: PulseSequence, theta: float = np.pi, phi: float = 0.0) -> PulseSequence: +def rotation( + seq: PulseSequence, theta: float = np.pi, phi: float = 0.0 +) -> PulseSequence: """Create a sequence for single-qubit rotation. ``theta`` will be the angle of the rotation, while ``phi`` the angle that the rotation axis forms with x axis. @@ -77,7 +79,7 @@ def R(self, theta: float = np.pi, phi: float = 0.0) -> PulseSequence: ``theta`` will be the angle of the rotation, while ``phi`` the angle that the rotation axis forms with x axis. """ assert self.RX is not None - return rxy(self.RX, theta, phi) + return rotation(self.RX, theta, phi) class TwoQubitNatives(NativeContainer): diff --git a/tests/test_native.py b/tests/test_native.py index 92d39a8b05..28c33a05ae 100644 --- a/tests/test_native.py +++ b/tests/test_native.py @@ -1,7 +1,7 @@ import numpy as np import pytest -from qibolab._core.native import Native, TwoQubitNatives, rxy +from qibolab._core.native import Native, TwoQubitNatives, rotation from qibolab._core.pulses import Drag, Gaussian, Pulse, Rectangular from qibolab._core.sequence import PulseSequence @@ -55,7 +55,7 @@ def test_fixed_sequence_factory(): ({"phi": 7.5 * np.pi}, 1.0, 1.5 * np.pi), ], ) -def test_rxy(args, amplitude, phase): +def test_rotation(args, amplitude, phase): seq = PulseSequence( [ ( @@ -65,8 +65,8 @@ def test_rxy(args, amplitude, phase): ] ) - fseq1 = rxy(seq, **args) - fseq2 = rxy(seq, **args) + fseq1 = rotation(seq, **args) + fseq2 = rotation(seq, **args) assert fseq1 == fseq2 np = "new/probe" fseq2.append((np, Pulse(duration=56, amplitude=0.43, envelope=Rectangular()))) From 231af1e0dab80db5f084c92b21b0ce076ce75e13 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 19 Sep 2024 15:48:19 +0200 Subject: [PATCH 0994/1006] feat!: Make execution parameters private --- src/qibolab/_core/execution_parameters.py | 2 +- src/qibolab/_core/platform/platform.py | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/qibolab/_core/execution_parameters.py b/src/qibolab/_core/execution_parameters.py index 54c7518525..3cfcf1931d 100644 --- a/src/qibolab/_core/execution_parameters.py +++ b/src/qibolab/_core/execution_parameters.py @@ -4,7 +4,7 @@ from .serialize import Model from .sweeper import ParallelSweepers -__all__ = ["AcquisitionType", "AveragingMode", "ExecutionParameters"] +__all__ = ["AcquisitionType", "AveragingMode"] class AcquisitionType(Enum): diff --git a/src/qibolab/_core/platform/platform.py b/src/qibolab/_core/platform/platform.py index d39031c7e5..754ac16474 100644 --- a/src/qibolab/_core/platform/platform.py +++ b/src/qibolab/_core/platform/platform.py @@ -227,8 +227,8 @@ def _execute( def execute( self, sequences: list[PulseSequence], - options: Optional[ExecutionParameters] = None, sweepers: Optional[list[ParallelSweepers]] = None, + **options, ) -> dict[PulseId, Result]: """Execute pulse sequences. @@ -265,9 +265,7 @@ def execute( "The acquisitions' identifiers have to be unique across all sequences." ) - if options is None: - options = ExecutionParameters() - options = self.settings.fill(options) + options = self.settings.fill(ExecutionParameters(**options)) time = estimate_duration(sequences, options, sweepers) log.info(f"Minimal execution time: {time}") From 40836738adbe48fe8d878318002679b113f88238 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 19 Sep 2024 15:49:14 +0200 Subject: [PATCH 0995/1006] fix: Pass explicitly parameters during circuit execution --- src/qibolab/_core/backends.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/qibolab/_core/backends.py b/src/qibolab/_core/backends.py index 577b5cc5bd..f500228ce6 100644 --- a/src/qibolab/_core/backends.py +++ b/src/qibolab/_core/backends.py @@ -8,7 +8,6 @@ from qibolab._version import __version__ as qibolab_version from .compilers import Compiler -from .execution_parameters import ExecutionParameters from .platform import Platform, create_platform from .platform.load import available_platforms @@ -103,10 +102,7 @@ def execute_circuit(self, circuit, initial_state=None, nshots=1000): self.platform.connect() - readout_ = self.platform.execute( - [sequence], - ExecutionParameters(nshots=nshots), - ) + readout_ = self.platform.execute([sequence], nshots=nshots) readout = {k: v for k, v in readout_.items()} self.platform.disconnect() @@ -148,7 +144,7 @@ def execute_circuits(self, circuits, initial_states=None, nshots=1000): self.platform.connect() - readout = self.platform.execute(sequences, ExecutionParameters(nshots=nshots)) + readout = self.platform.execute(sequences, nshots=nshots) self.platform.disconnect() From e8ec4fe411eb3e2049da8884e753b4f9e00ff1d1 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 19 Sep 2024 15:49:40 +0200 Subject: [PATCH 0996/1006] docs: Fix usage of execution parameters in docstrings --- src/qibolab/_core/platform/platform.py | 4 ++-- src/qibolab/_core/sweeper.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/qibolab/_core/platform/platform.py b/src/qibolab/_core/platform/platform.py index 754ac16474..b20b0595d8 100644 --- a/src/qibolab/_core/platform/platform.py +++ b/src/qibolab/_core/platform/platform.py @@ -241,7 +241,7 @@ def execute( .. testcode:: import numpy as np - from qibolab import ExecutionParameters, Parameter, PulseSequence, Sweeper, create_dummy + from qibolab import Parameter, PulseSequence, Sweeper, create_dummy platform = create_dummy() @@ -256,7 +256,7 @@ def execute( channels=[qubit.probe], ) ] - platform.execute([sequence], ExecutionParameters(), [sweeper]) + platform.execute([sequence], [sweeper]) """ if sweepers is None: sweepers = [] diff --git a/src/qibolab/_core/sweeper.py b/src/qibolab/_core/sweeper.py index a60b6e2577..82780a1964 100644 --- a/src/qibolab/_core/sweeper.py +++ b/src/qibolab/_core/sweeper.py @@ -54,7 +54,7 @@ class Sweeper(Model): .. testcode:: import numpy as np - from qibolab import ExecutionParameters, Parameter, PulseSequence, Sweeper, create_dummy + from qibolab import Parameter, PulseSequence, Sweeper, create_dummy platform = create_dummy() @@ -65,7 +65,7 @@ class Sweeper(Model): sweeper = Sweeper( parameter=Parameter.frequency, values=parameter_range, channels=[qubit.probe] ) - platform.execute([sequence], ExecutionParameters(), [[sweeper]]) + platform.execute([sequence], [[sweeper]]) Args: parameter: parameter to be swept, possible choices are frequency, attenuation, amplitude, current and gain. From 15abc19a7f66938d8e2c6c03a0175b0534f6748d Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 19 Sep 2024 15:50:28 +0200 Subject: [PATCH 0997/1006] test: Fix usage of execution parameters --- tests/conftest.py | 16 +++++----------- tests/integration/test_sequence.py | 3 +-- tests/test_dummy.py | 19 ++++++++----------- 3 files changed, 14 insertions(+), 24 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index c4e8551629..6996d50fa5 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -6,13 +6,7 @@ import numpy.typing as npt import pytest -from qibolab import ( - AcquisitionType, - AveragingMode, - ExecutionParameters, - Platform, - create_platform, -) +from qibolab import AcquisitionType, AveragingMode, Platform, create_platform from qibolab._core.platform.load import PLATFORMS from qibolab._core.sequence import PulseSequence from qibolab._core.sweeper import ParallelSweepers, Parameter, Sweeper @@ -114,7 +108,7 @@ def wrapped( sequence: Optional[PulseSequence] = None, target: Optional[int] = None, ) -> npt.NDArray: - options = ExecutionParameters( + options = dict( nshots=nshots, acquisition_type=acquisition_type, averaging_mode=averaging_mode, @@ -124,8 +118,8 @@ def wrapped( natives = connected_platform.natives.single_qubit[0] if sequence is None: - qd_seq = natives.RX.create_sequence() - probe_seq = natives.MZ.create_sequence() + qd_seq = natives.RX() + probe_seq = natives.MZ() probe_pulse = probe_seq[0][1].probe acq = probe_seq[0][1].acquisition wrapped.acquisition_duration = acq.duration @@ -151,7 +145,7 @@ def wrapped( assert target is not None assert sweepers is not None - results = connected_platform.execute([sequence], options, sweepers) + results = connected_platform.execute([sequence], sweepers, **options) return results[target] return wrapped diff --git a/tests/integration/test_sequence.py b/tests/integration/test_sequence.py index 4bb709a001..6f216f1259 100644 --- a/tests/integration/test_sequence.py +++ b/tests/integration/test_sequence.py @@ -1,5 +1,4 @@ from qibolab import create_platform -from qibolab._core.execution_parameters import ExecutionParameters from qibolab._core.pulses import Delay @@ -33,7 +32,7 @@ def test_sequence_creation(): # ---------------------------------------------------- nshots = 17 - res = platform.execute([seq], ExecutionParameters(nshots=nshots)) + res = platform.execute([seq], nshots=nshots) for r in res.values(): assert r.shape == (nshots,) diff --git a/tests/test_dummy.py b/tests/test_dummy.py index 02ac4fcb5c..75e533bbab 100644 --- a/tests/test_dummy.py +++ b/tests/test_dummy.py @@ -1,6 +1,6 @@ import pytest -from qibolab import AcquisitionType, ExecutionParameters, create_platform +from qibolab import AcquisitionType, create_platform from qibolab._core.platform.platform import Platform from qibolab._core.pulses import Delay, GaussianSquare, Pulse from qibolab._core.sequence import PulseSequence @@ -29,8 +29,7 @@ def test_dummy_execute_coupler_pulse(platform: Platform): ) sequence.append((channel, pulse)) - options = ExecutionParameters(nshots=None) - _ = platform.execute([sequence], options) + _ = platform.execute([sequence], nshots=None) def test_dummy_execute_pulse_sequence_couplers(): @@ -38,15 +37,14 @@ def test_dummy_execute_pulse_sequence_couplers(): sequence = PulseSequence() natives = platform.natives - cz = natives.two_qubit[(1, 2)].CZ.create_sequence() + cz = natives.two_qubit[(1, 2)].CZ() sequence.concatenate(cz) sequence.append((platform.qubits[0].probe, Delay(duration=40))) sequence.append((platform.qubits[2].probe, Delay(duration=40))) - sequence.concatenate(natives.single_qubit[0].MZ.create_sequence()) - sequence.concatenate(natives.single_qubit[2].MZ.create_sequence()) - options = ExecutionParameters(nshots=None) - _ = platform.execute([sequence], options) + sequence.concatenate(natives.single_qubit[0].MZ()) + sequence.concatenate(natives.single_qubit[2].MZ()) + _ = platform.execute([sequence], nshots=None) @pytest.mark.parametrize( @@ -61,9 +59,8 @@ def test_dummy_execute_pulse_sequence_unrolling( natives = platform.natives sequences = [] for _ in range(nsequences): - sequences.append(natives.single_qubit[0].MZ.create_sequence()) - options = ExecutionParameters(nshots=nshots, acquisition_type=acquisition) - result = platform.execute(sequences, options) + sequences.append(natives.single_qubit[0].MZ()) + result = platform.execute(sequences, nshots=nshots, acquisition_type=acquisition) assert len(next(iter(result.values()))) == nshots for r in result.values(): if acquisition is AcquisitionType.INTEGRATION: From ec3c2df5d4a94556a81ea672fe888019838ca61e Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 19 Sep 2024 15:51:22 +0200 Subject: [PATCH 0998/1006] docs: Update execution parameters description --- doc/source/main-documentation/qibolab.rst | 36 ++++++++++------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/doc/source/main-documentation/qibolab.rst b/doc/source/main-documentation/qibolab.rst index a913814541..74fdec314e 100644 --- a/doc/source/main-documentation/qibolab.rst +++ b/doc/source/main-documentation/qibolab.rst @@ -84,17 +84,16 @@ Now we can execute the sequence on hardware: from qibolab import ( AcquisitionType, AveragingMode, - ExecutionParameters, ) - options = ExecutionParameters( + options = dict( nshots=1000, relaxation_time=10, fast_reset=False, acquisition_type=AcquisitionType.INTEGRATION, averaging_mode=AveragingMode.CYCLIC, ) - results = platform.execute([ps], options=options) + results = platform.execute([ps], **options) Finally, we can stop instruments and close connections. @@ -356,11 +355,7 @@ A typical resonator spectroscopy experiment could be defined with: for qubit in platform.qubits.values() ] - results = platform.execute([sequence], options, [sweepers]) - -.. note:: - - options is an :class:`qibolab.ExecutionParameters` object, detailed in a separate section. + results = platform.execute([sequence], [sweepers], **options) In this way, we first define three parallel sweepers with an interval of 400 MHz (-200 MHz --- 200 MHz). The resulting probed frequency will then be: - for qubit 0: [3.8 GHz, 4.2 GHz] @@ -390,7 +385,7 @@ For example: pulses=[rx_pulse], ) - results = platform.execute([sequence], options, [[sweeper_freq], [sweeper_amp]]) + results = platform.execute([sequence], [[sweeper_freq], [sweeper_amp]], **options) Let's say that the RX pulse has, from the runcard, a frequency of 4.5 GHz and an amplitude of 0.3, the parameter space probed will be: @@ -408,15 +403,16 @@ while different lists define nested loops, with the first list corresponding to Execution Parameters -------------------- -In the course of several examples, you've encountered the ``options`` argument in function calls like: +In the course of several examples, you've encountered the ``**options`` argument in function calls like: .. testcode:: python - res = platform.execute([sequence], options=options) + res = platform.execute([sequence], **options) -Let's now delve into the details of the ``options`` parameter and understand its components. +Let's now delve into the details of the ``options`` and understand its parts. -The ``options`` parameter, represented by the :class:`qibolab.ExecutionParameters` class, is a vital element for every hardware execution. It encompasses essential information that tailors the execution to specific requirements: +The ``options`` extra arguments, is a vital element for every hardware execution. +It encompasses essential information that tailors the execution to specific requirements: - ``nshots``: Specifies the number of experiment repetitions. - ``relaxation_time``: Introduces a wait time between repetitions, measured in nanoseconds (ns). @@ -461,7 +457,10 @@ For example in ro_sequence = natives.MZ() sequence = natives.RX() | ro_sequence - options = ExecutionParameters( + + ro_pulse = ro_sequence[0][1] + result = platform.execute( + [sequence], nshots=1000, relaxation_time=10, fast_reset=False, @@ -469,14 +468,11 @@ For example in averaging_mode=AveragingMode.CYCLIC, ) - ro_pulse = ro_sequence[0][1] - result = platform.execute([sequence], options=options) - ``result`` will be a dictionary with a single key ``ro_pulse.id`` and an array of two elements, the averaged I and Q components of the integrated signal. -If instead, ``(AcquisitionType.INTEGRATION, AveragingMode.SINGLESHOT)`` was used, the array would have shape ``(options.nshots, 2)``, -while for ``(AcquisitionType.DISCRIMINATION, AveragingMode.SINGLESHOT)`` the shape would be ``(options.nshots,)`` with values 0 or 1. +If instead, ``(AcquisitionType.INTEGRATION, AveragingMode.SINGLESHOT)`` was used, the array would have shape ``(options["nshots"], 2)``, +while for ``(AcquisitionType.DISCRIMINATION, AveragingMode.SINGLESHOT)`` the shape would be ``(options["nshots"],)`` with values 0 or 1. The shape of the values of an integrated acquisition with two sweepers will be: @@ -493,7 +489,7 @@ The shape of the values of an integrated acquisition with two sweepers will be: range=(f0 - 200_000, f0 + 200_000, 1), channels=[qubit.probe], ) - shape = (options.nshots, len(sweeper1.values), len(sweeper2.values), 2) + shape = (options["nshots"], len(sweeper1.values), len(sweeper2.values), 2) .. _main_doc_compiler: From 962bbe50cc14efe904144d5e9a191f240500d188 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Thu, 19 Sep 2024 15:51:50 +0200 Subject: [PATCH 0999/1006] docs: Fix usage of execution parameters --- doc/source/getting-started/experiment.rst | 7 +++---- doc/source/tutorials/calibration.rst | 20 ++++++++------------ doc/source/tutorials/pulses.rst | 5 ++--- 3 files changed, 13 insertions(+), 19 deletions(-) diff --git a/doc/source/getting-started/experiment.rst b/doc/source/getting-started/experiment.rst index 32378f2364..4066e5ab7c 100644 --- a/doc/source/getting-started/experiment.rst +++ b/doc/source/getting-started/experiment.rst @@ -218,7 +218,6 @@ We leave to the dedicated tutorial a full explanation of the experiment, but her from qibolab import ( AcquisitionType, AveragingMode, - ExecutionParameters, Parameter, PulseSequence, Sweeper, @@ -242,14 +241,14 @@ We leave to the dedicated tutorial a full explanation of the experiment, but her ) # perform the experiment using specific options - options = ExecutionParameters( + results = platform.execute( + [sequence], + [[sweeper]], nshots=1000, relaxation_time=50, averaging_mode=AveragingMode.CYCLIC, acquisition_type=AcquisitionType.INTEGRATION, ) - - results = platform.execute([sequence], options, [[sweeper]]) _, acq = next(iter(sequence.acquisitions)) # plot the results diff --git a/doc/source/tutorials/calibration.rst b/doc/source/tutorials/calibration.rst index 8980ce6943..e180b5ae15 100644 --- a/doc/source/tutorials/calibration.rst +++ b/doc/source/tutorials/calibration.rst @@ -34,7 +34,6 @@ This is done in the following script: from qibolab import ( AcquisitionType, AveragingMode, - ExecutionParameters, Parameter, PulseSequence, Sweeper, @@ -56,15 +55,15 @@ This is done in the following script: channels=[qubit.probe], ) - options = ExecutionParameters( + results = platform.execute( + [sequence], + [[sweeper]], nshots=1000, relaxation_time=50, averaging_mode=AveragingMode.CYCLIC, acquisition_type=AcquisitionType.INTEGRATION, ) - results = platform.execute([sequence], options, [[sweeper]]) - acq = sequence.acquisitions[0][1] signal = results[acq.id] amplitudes = np.abs(signal[..., 0] + 1j * signal[..., 1]) @@ -106,7 +105,6 @@ complex pulse sequence. Therefore with start with that: from qibolab import ( AcquisitionType, AveragingMode, - ExecutionParameters, Parameter, PulseSequence, Sweeper, @@ -130,15 +128,15 @@ complex pulse sequence. Therefore with start with that: channels=[qubit.drive], ) - options = ExecutionParameters( + results = platform.execute( + [sequence], + [[sweeper]], nshots=1000, relaxation_time=50, averaging_mode=AveragingMode.CYCLIC, acquisition_type=AcquisitionType.INTEGRATION, ) - results = platform.execute([sequence], options, [[sweeper]]) - acq = sequence.acquisitions[0][1] signal = results[acq.id] amplitudes = np.abs(signal[..., 0] + 1j * signal[..., 1]) @@ -198,7 +196,6 @@ and its impact on qubit states in the IQ plane. from qibolab import ( AcquisitionType, AveragingMode, - ExecutionParameters, Parameter, Sweeper, create_platform, @@ -216,15 +213,14 @@ and its impact on qubit states in the IQ plane. # create pulse sequence 2 one_sequence = natives.RX() | natives.MZ() - options = ExecutionParameters( + results = platform.execute( + [zero_sequence, one_sequence], nshots=1000, relaxation_time=50_000, averaging_mode=AveragingMode.SINGLESHOT, acquisition_type=AcquisitionType.INTEGRATION, ) - results = platform.execute([zero_sequence, one_sequence], options) - acq0 = zero_sequence.acquisitions[0][1] acq1 = one_sequence.acquisitions[0][1] diff --git a/doc/source/tutorials/pulses.rst b/doc/source/tutorials/pulses.rst index 0a3e498680..94a17e92dd 100644 --- a/doc/source/tutorials/pulses.rst +++ b/doc/source/tutorials/pulses.rst @@ -44,7 +44,7 @@ we can execute the previously defined sequence using the ``execute`` method: .. testcode:: python - from qibolab import ExecutionParameters, create_platform + from qibolab import create_platform # Define platform and load specific runcard platform = create_platform("dummy") @@ -53,8 +53,7 @@ we can execute the previously defined sequence using the ``execute`` method: platform.connect() # Executes a pulse sequence. - options = ExecutionParameters(nshots=1000, relaxation_time=100) - results = platform.execute([sequence], options=options) + results = platform.execute([sequence], nshots=1000, relaxation_time=100) # Disconnect from the instruments platform.disconnect() From c0a2e4281b0aab983816072421955843287d9800 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 20 Sep 2024 01:34:40 +0400 Subject: [PATCH 1000/1006] fix: drop ExecutionParameters from some tests --- tests/test_platform.py | 40 ++++++++++++++-------------------------- 1 file changed, 14 insertions(+), 26 deletions(-) diff --git a/tests/test_platform.py b/tests/test_platform.py index dbcd149bbf..b6bb417e9b 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -17,7 +17,6 @@ from qibolab._core.components import AcquisitionConfig, IqConfig, OscillatorConfig from qibolab._core.dummy import create_dummy from qibolab._core.dummy.platform import FOLDER -from qibolab._core.execution_parameters import ExecutionParameters from qibolab._core.native import SingleQubitNatives, TwoQubitNatives from qibolab._core.parameters import NativeGates, Parameters, update_configs from qibolab._core.platform import Platform @@ -135,9 +134,8 @@ def test_duplicated_acquisition(): platform = create_platform("dummy") sequence = platform.natives.single_qubit[0].MZ.create_sequence() - options = ExecutionParameters(nshots=None) with pytest.raises(ValueError, match="unique"): - _ = platform.execute([sequence, sequence.copy()], options) + _ = platform.execute([sequence, sequence.copy()]) def test_update_configs(platform): @@ -246,9 +244,7 @@ def test_platform_execute_empty(qpu_platform): # an empty pulse sequence platform = qpu_platform sequence = PulseSequence() - result = platform.execute_pulse_sequence( - sequence, ExecutionParameters(nshots=nshots) - ) + result = platform.execute([sequence], nshots=nshots) assert result is not None @@ -265,9 +261,7 @@ def test_platform_execute_one_drive_pulse(qpu_platform): ) ] ) - result = platform.execute_pulse_sequence( - sequence, ExecutionParameters(nshots=nshots) - ) + result = platform.execute([sequence], nshots=nshots) assert result is not None @@ -286,9 +280,7 @@ def test_platform_execute_one_coupler_pulse(qpu_platform): ) ] ) - result = platform.execute_pulse_sequence( - sequence, ExecutionParameters(nshots=nshots) - ) + result = platform.execute([sequence], nshots=nshots) assert result is not None @@ -305,9 +297,7 @@ def test_platform_execute_one_flux_pulse(qpu_platform): ) ] ) - result = platform.execute_pulse_sequence( - sequence, ExecutionParameters(nshots=nshots) - ) + result = platform.execute([sequence], nshots=nshots) assert result is not None @@ -318,8 +308,7 @@ def test_platform_execute_one_long_drive_pulse(qpu_platform): qubit = next(iter(platform.qubits.values())) pulse = Pulse(duration=8192 + 200, amplitude=0.12, envelope=Gaussian(5)) sequence = PulseSequence([(qubit.drive, pulse)]) - options = ExecutionParameters(nshots=nshots) - platform.execute_pulse_sequence(sequence, options) + platform.execute([sequence], nshots=nshots) @pytest.mark.qpu @@ -329,8 +318,7 @@ def test_platform_execute_one_extralong_drive_pulse(qpu_platform): qubit = next(iter(platform.qubits.values())) pulse = Pulse(duration=2 * 8192 + 200, amplitude=0.12, envelope=Gaussian(0.2)) sequence = PulseSequence([(qubit.drive, pulse)]) - options = ExecutionParameters(nshots=nshots) - platform.execute_pulse_sequence(sequence, options) + platform.execute([sequence], nshots=nshots) @pytest.mark.qpu @@ -342,7 +330,7 @@ def test_platform_execute_one_drive_one_readout(qpu_platform): sequence.concatenate(platform.create_RX_pulse(qubit_id)) sequence.append((qubit.probe, Delay(duration=200))) sequence.concatenate(platform.create_MZ_pulse(qubit_id)) - platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=nshots)) + platform.execute([sequence], nshots=nshots) @pytest.mark.qpu @@ -358,7 +346,7 @@ def test_platform_execute_multiple_drive_pulses_one_readout(qpu_platform): sequence.concatenate(platform.create_RX_pulse(qubit_id)) sequence.append((qubit.probe, Delay(duration=808))) sequence.concatenate(platform.create_MZ_pulse(qubit_id)) - platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=nshots)) + platform.execute([sequence], nshots=nshots) @pytest.mark.qpu @@ -375,7 +363,7 @@ def test_platform_execute_multiple_drive_pulses_one_readout_no_spacing( sequence.concatenate(platform.create_RX_pulse(qubit_id)) sequence.append((qubit.probe, Delay(duration=800))) sequence.concatenate(platform.create_MZ_pulse(qubit_id)) - platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=nshots)) + platform.execute([sequence], nshots=nshots) @pytest.mark.qpu @@ -394,7 +382,7 @@ def test_platform_execute_multiple_overlaping_drive_pulses_one_readout( ] ) sequence.concatenate(platform.create_MZ_pulse(qubit_id)) - platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=nshots)) + platform.execute([sequence], nshots=nshots) @pytest.mark.qpu @@ -414,7 +402,7 @@ def test_platform_execute_multiple_readout_pulses(qpu_platform): sequence.concatenate(qd_seq2) sequence.append((qubit.probe, Delay(duration=qd_seq2.duration))) sequence.concatenate(ro_seq2) - platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=nshots)) + platform.execute([sequence], nshots=nshots) @pytest.mark.skip(reason="no way of currently testing this") @@ -430,7 +418,7 @@ def test_excited_state_probabilities_pulses(qpu_platform): sequence.concatenate(platform.create_RX_pulse(qubit_id)) sequence.append((qubit.probe, Delay(duration=sequence.duration))) sequence.concatenate(platform.create_MZ_pulse(qubit_id)) - result = platform.execute([sequence], ExecutionParameters(nshots=5000)) + result = platform.execute([sequence], nshots=5000) nqubits = len(platform.qubits) cr = CircuitResult(backend, Circuit(nqubits), result, nshots=5000) @@ -465,7 +453,7 @@ def test_ground_state_probabilities_pulses(qpu_platform, start_zero): ) ) sequence.concatenate(platform.create_MZ_pulse(qubit_id)) - result = platform.execute_pulse_sequence(sequence, ExecutionParameters(nshots=5000)) + result = platform.execute([sequence], nshots=5000) nqubits = len(platform.qubits) cr = CircuitResult(backend, Circuit(nqubits), result, nshots=5000) From b14c7310846c5e10a9d353621d0b53f7339461e1 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 20 Sep 2024 01:49:50 +0400 Subject: [PATCH 1001/1006] fix: update docstrings to comply with new public API --- doc/source/tutorials/instrument.rst | 12 ++++----- src/qibolab/_core/backends.py | 4 +-- src/qibolab/_core/compilers/compiler.py | 26 +++++-------------- src/qibolab/_core/instruments/abstract.py | 2 +- .../instruments/qm/program/acquisition.py | 8 +----- src/qibolab/_core/pulses/pulse.py | 6 +---- src/qibolab/_core/sweeper.py | 6 ++--- tests/test_platform.py | 3 --- 8 files changed, 20 insertions(+), 47 deletions(-) diff --git a/doc/source/tutorials/instrument.rst b/doc/source/tutorials/instrument.rst index 8be702fbaa..9c5a43374f 100644 --- a/doc/source/tutorials/instrument.rst +++ b/doc/source/tutorials/instrument.rst @@ -89,12 +89,12 @@ Let's see a minimal example: from proprietary_instruments import ControllerType, controller_driver - from qibolab.components import Config - from qibolab.execution_parameters import ExecutionParameters - from qibolab.identifier import Result - from qibolab.sequence import PulseSequence - from qibolab.sweeper import ParallelSweepers - from qibolab.instruments.abstract import Controller + from qibolab._core.components import Config + from qibolab._core.execution_parameters import ExecutionParameters + from qibolab._core.identifier import Result + from qibolab._core.sequence import PulseSequence + from qibolab._core.sweeper import ParallelSweepers + from qibolab._core.instruments.abstract import Controller class MyController(Controller): diff --git a/src/qibolab/_core/backends.py b/src/qibolab/_core/backends.py index f500228ce6..79fc32990e 100644 --- a/src/qibolab/_core/backends.py +++ b/src/qibolab/_core/backends.py @@ -58,12 +58,12 @@ def assign_measurements(self, measurement_map, readout): """Assigning measurement outcomes to :class:`qibo.states.MeasurementResult` for each gate. - This allows properly obtaining the measured shots from the :class:`qibolab.pulses.ReadoutPulse` object obtaned after pulse sequence execution. + This allows properly obtaining the measured shots from the :class:`qibolab.Readout` object obtaned after pulse sequence execution. Args: measurement_map (dict): Map from each measurement gate to the sequence of readout pulses implementing it. - readout (:class:`qibolab.pulses.ReadoutPulse`): Readout result object + readout (:class:`qibolab.Readout`): Readout result object containing the readout measurement shots. This is created in ``execute_circuit``. """ for gate, sequence in measurement_map.items(): diff --git a/src/qibolab/_core/compilers/compiler.py b/src/qibolab/_core/compilers/compiler.py index c9c59462ae..14cf7de6af 100644 --- a/src/qibolab/_core/compilers/compiler.py +++ b/src/qibolab/_core/compilers/compiler.py @@ -28,22 +28,10 @@ class Compiler: """Compile native circuits into pulse sequences. - It transforms a :class:`qibo.models.Circuit` to a :class:`qibolab.pulses.PulseSequence`. + It transforms a :class:`qibo.models.Circuit` to a :class:`qibolab.PulseSequence`. The transformation is done using a dictionary of rules which map each Qibo gate to a pulse sequence and some virtual Z-phases. - - A rule is a function that takes two argumens: - - gate (:class:`qibo.gates.abstract.Gate`): Gate object to be compiled. - - platform (:class:`qibolab.platforms.abstract.AbstractPlatform`): Platform object to read - native gate pulses from. - - and returns: - - sequence (:class:`qibolab.pulses.PulseSequence`): Sequence of pulses that implement - the given gate. - - virtual_z_phases (dict): Dictionary mapping qubits to virtual Z-phases induced by the gate. - - See :class:`qibolab.compilers.default` for an example of a compiler implementation. """ rules: dict[type[gates.Gate], Rule] = field(default_factory=dict) @@ -88,7 +76,7 @@ def get_sequence(self, gate: gates.Gate, platform: Platform) -> PulseSequence: Args: gate (:class:`qibo.gates.Gate`): Qibo gate to convert to pulses. - platform (:class:`qibolab.platform.Platform`): Qibolab platform to read the native gates from. + platform (:class:`qibolab.Platform`): Qibolab platform to read the native gates from. """ # get local sequence for the current gate rule = self.rules[type(gate)] @@ -180,14 +168,12 @@ def compile( """Transform a circuit to pulse sequence. Args: - circuit (qibo.models.Circuit): Qibo circuit that respects the platform's - connectivity and native gates. - platform (qibolab.platforms.abstract.AbstractPlatform): Platform used - to load the native pulse representations. + circuit: Qibo circuit that respects the platform's connectivity and native gates. + platform: Platform used to load the native pulse representations. Returns: - sequence (qibolab.pulses.PulseSequence): Pulse sequence that implements the circuit. - measurement_map (dict): Map from each measurement gate to the sequence of readout pulse implementing it. + sequence: Pulse sequence that implements the circuit. + measurement_map: Map from each measurement gate to the sequence of readout pulse implementing it. """ sequence = PulseSequence() diff --git a/src/qibolab/_core/instruments/abstract.py b/src/qibolab/_core/instruments/abstract.py index dc433cce31..283836a02f 100644 --- a/src/qibolab/_core/instruments/abstract.py +++ b/src/qibolab/_core/instruments/abstract.py @@ -75,7 +75,7 @@ def play( ) -> dict[int, Result]: """Play a pulse sequence and retrieve feedback. - If :class:`qibolab.sweeper.Sweeper` objects are passed as arguments, they are + If :class:`qibolab.Sweeper` objects are passed as arguments, they are executed in real-time. If not possible, an error is raised. Returns a mapping with the id of the probe pulses used to acquired data. diff --git a/src/qibolab/_core/instruments/qm/program/acquisition.py b/src/qibolab/_core/instruments/qm/program/acquisition.py index b6c8c5520f..9aea9d0795 100644 --- a/src/qibolab/_core/instruments/qm/program/acquisition.py +++ b/src/qibolab/_core/instruments/qm/program/acquisition.py @@ -251,14 +251,8 @@ def create_acquisition( """Create container for the variables used for saving acquisition in the QUA program. - Args: - operation (str): - element (str): - options (:class:`qibolab.execution_parameters.ExecutionParameters`): Execution - options containing acquisition type and averaging mode. - Returns: - :class:`qibolab.instruments.qm.acquisition.Acquisition` object containing acquisition variables. + ``Acquisition`` object containing acquisition variables. """ average = options.averaging_mode is AveragingMode.CYCLIC kwargs = {} diff --git a/src/qibolab/_core/pulses/pulse.py b/src/qibolab/_core/pulses/pulse.py index fcec375388..f0fb8c16f7 100644 --- a/src/qibolab/_core/pulses/pulse.py +++ b/src/qibolab/_core/pulses/pulse.py @@ -47,11 +47,7 @@ class Pulse(_PulseLike): Pulse amplitudes are normalised between -1 and 1. """ envelope: Envelope - """The pulse envelope shape. - - See - :class:`qibolab.pulses.envelope.Envelopes` for list of available shapes. - """ + """The pulse envelope shape.""" relative_phase: float = 0.0 """Relative phase of the pulse, in radians.""" diff --git a/src/qibolab/_core/sweeper.py b/src/qibolab/_core/sweeper.py index 82780a1964..58472fd951 100644 --- a/src/qibolab/_core/sweeper.py +++ b/src/qibolab/_core/sweeper.py @@ -46,9 +46,9 @@ def _alternative_fields(a: _Field, b: _Field): class Sweeper(Model): """Data structure for Sweeper object. - This object is passed as an argument to the method :func:`qibolab.platforms.platform.Platform.execute` + This object is passed as an argument to the method :func:`qibolab.Platform.execute` which enables the user to sweep a specific parameter for one or more pulses. For information on how to - perform sweeps see :func:`qibolab.platforms.platform.Platform.execute`. + perform sweeps see :func:`qibolab.Platform.execute`. Example: .. testcode:: @@ -72,7 +72,7 @@ class Sweeper(Model): values: array of parameter values to sweep over. range: tuple of ``(start, stop, step)`` to sweep over the array ``np.arange(start, stop, step)``. Can be provided instead of ``values`` for more efficient sweeps on some instruments. - pulses : list of `qibolab.pulses.Pulse` to be swept. + pulses : list of `qibolab.Pulse` to be swept. channels: list of channel names for which the parameter should be swept. """ diff --git a/tests/test_platform.py b/tests/test_platform.py index b6bb417e9b..9ad52f4f8c 100644 --- a/tests/test_platform.py +++ b/tests/test_platform.py @@ -1,6 +1,3 @@ -"""Tests :class:`qibolab.platforms.multiqubit.MultiqubitPlatform` and -:class:`qibolab.platforms.platform.DesignPlatform`.""" - import inspect import os import pathlib From ee0b9d07478a45dd9a1ab159bb8d1f82f4d431ec Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 20 Sep 2024 11:36:52 +0400 Subject: [PATCH 1002/1006] fix: drop usage of ExecutionParameters --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 6334c10108..8aa2dea953 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ The qibolab backend documentation is available at [https://qibo.science/qibolab/ A simple example on how to connect to a platform and use it execute a pulse sequence: ```python -from qibolab import create_platform, ExecutionParameters +from qibolab import create_platform # Define platform and load specific runcard platform = create_platform("my_platform") @@ -38,8 +38,7 @@ sequence = natives.RX() | natives.MZ() platform.connect() # Execute a pulse sequence -options = ExecutionParameters(nshots=1000) -results = platform.execute([sequence], options) +results = platform.execute([sequence], nshots=1000) # Print the acquired shots readout_id = sequence.acquisitions[0][1].id From aa113bffe399ed3bb581bcda2e9cbd5b45db59bc Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 20 Sep 2024 11:40:28 +0400 Subject: [PATCH 1003/1006] docs: explain use of id --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8aa2dea953..b3a7e2f17e 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,11 @@ platform.connect() # Execute a pulse sequence results = platform.execute([sequence], nshots=1000) -# Print the acquired shots +# Grab the acquired shots corresponding to +# the measurement using its pulse id. +# The ``PulseSequence`` structure is list[tuple[ChannelId, Pulse]] +# thererefore we need to index it appropriately +# to get the acquisition pulse readout_id = sequence.acquisitions[0][1].id print(results[readout_id]) From b5f8db4a169c81e35dcfb4437135efec81e767da Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 20 Sep 2024 11:44:01 +0400 Subject: [PATCH 1004/1006] docs: propagate features to sphinx --- doc/source/index.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/source/index.rst b/doc/source/index.rst index f5ed2051b0..c1649fb8ad 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -23,9 +23,9 @@ Key features ------------ * Deploy Qibo models on quantum hardware easily. -* Create custom experimental drivers for custom lab setup. +* Create experimental drivers for custom lab setup. * Support multiple heterogeneous platforms. -* Use existing calibration procedures for experimentalists. +* Use calibration procedures from `Qibocal `_. How to Use the Documentation ============================ From 49133dcf2eb3a0be78e4ae0f8fa70436216b724a Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 20 Sep 2024 12:05:03 +0400 Subject: [PATCH 1005/1006] docs: recover reference to Envelope type --- src/qibolab/_core/pulses/pulse.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/qibolab/_core/pulses/pulse.py b/src/qibolab/_core/pulses/pulse.py index f0fb8c16f7..ff9885b9c8 100644 --- a/src/qibolab/_core/pulses/pulse.py +++ b/src/qibolab/_core/pulses/pulse.py @@ -47,7 +47,10 @@ class Pulse(_PulseLike): Pulse amplitudes are normalised between -1 and 1. """ envelope: Envelope - """The pulse envelope shape.""" + """The pulse envelope shape. + + See :class:`qibolab.Envelope` for list of available shapes. + """ relative_phase: float = 0.0 """Relative phase of the pulse, in radians.""" From baeed90a34fd19bf268756629741494bcac6e2c9 Mon Sep 17 00:00:00 2001 From: Stefano Carrazza Date: Fri, 20 Sep 2024 19:49:50 +0800 Subject: [PATCH 1006/1006] updating lock --- poetry.lock | 644 ++++++++++++++++++++++++++++++++++------------------ 1 file changed, 420 insertions(+), 224 deletions(-) diff --git a/poetry.lock b/poetry.lock index 35fa6466ab..afb5b3a695 100644 --- a/poetry.lock +++ b/poetry.lock @@ -11,6 +11,25 @@ files = [ {file = "alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65"}, ] +[[package]] +name = "alembic" +version = "1.13.2" +description = "A database migration tool for SQLAlchemy." +optional = false +python-versions = ">=3.8" +files = [ + {file = "alembic-1.13.2-py3-none-any.whl", hash = "sha256:6b8733129a6224a9a711e17c99b08462dbf7cc9670ba8f2e2ae9af860ceb1953"}, + {file = "alembic-1.13.2.tar.gz", hash = "sha256:1ff0ae32975f4fd96028c39ed9bb3c867fe3af956bd7bb37343b54c9fe7445ef"}, +] + +[package.dependencies] +Mako = "*" +SQLAlchemy = ">=1.3.0" +typing-extensions = ">=4" + +[package.extras] +tz = ["backports.zoneinfo"] + [[package]] name = "annotated-types" version = "0.7.0" @@ -35,13 +54,13 @@ files = [ [[package]] name = "anyio" -version = "4.4.0" +version = "4.5.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.8" files = [ - {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, - {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, + {file = "anyio-4.5.0-py3-none-any.whl", hash = "sha256:fdeb095b7cc5a5563175eedd926ec4ae55413bb4be5770c424af0ba46ccb4a78"}, + {file = "anyio-4.5.0.tar.gz", hash = "sha256:c5a275fe5ca0afd788001f58fca1e69e29ce706d746e317d660e21f70c530ef9"}, ] [package.dependencies] @@ -51,9 +70,9 @@ sniffio = ">=1.1" typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} [package.extras] -doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (>=0.23)"] +doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.21.0b1)"] +trio = ["trio (>=0.26.1)"] [[package]] name = "astroid" @@ -141,20 +160,20 @@ aio = ["aiohttp (>=3.0)"] [[package]] name = "azure-identity" -version = "1.17.1" +version = "1.18.0" description = "Microsoft Azure Identity Library for Python" optional = false python-versions = ">=3.8" files = [ - {file = "azure-identity-1.17.1.tar.gz", hash = "sha256:32ecc67cc73f4bd0595e4f64b1ca65cd05186f4fe6f98ed2ae9f1aa32646efea"}, - {file = "azure_identity-1.17.1-py3-none-any.whl", hash = "sha256:db8d59c183b680e763722bfe8ebc45930e6c57df510620985939f7f3191e0382"}, + {file = "azure_identity-1.18.0-py3-none-any.whl", hash = "sha256:bccf6106245b49ff41d0c4cd7b72851c5a2ba3a32cef7589da246f5727f26f02"}, + {file = "azure_identity-1.18.0.tar.gz", hash = "sha256:f567579a65d8932fa913c76eddf3305101a15e5727a5e4aa5df649a0f553d4c3"}, ] [package.dependencies] -azure-core = ">=1.23.0" +azure-core = ">=1.31.0" cryptography = ">=2.5" -msal = ">=1.24.0" -msal-extensions = ">=0.3.0" +msal = ">=1.30.0" +msal-extensions = ">=1.2.0" typing-extensions = ">=4.0.0" [[package]] @@ -492,17 +511,6 @@ files = [ [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} -[[package]] -name = "cloudpickle" -version = "3.0.0" -description = "Pickler class to extend the standard pickle.Pickler functionality" -optional = false -python-versions = ">=3.8" -files = [ - {file = "cloudpickle-3.0.0-py3-none-any.whl", hash = "sha256:246ee7d0c295602a036e86369c77fecda4ab17b506496730f2f576d9016fd9c7"}, - {file = "cloudpickle-3.0.0.tar.gz", hash = "sha256:996d9a482c6fb4f33c1a35335cf8afd065d2a56e973270364840712d9131a882"}, -] - [[package]] name = "cma" version = "3.4.0" @@ -532,6 +540,23 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +[[package]] +name = "colorlog" +version = "6.8.2" +description = "Add colours to the output of Python's logging module." +optional = false +python-versions = ">=3.6" +files = [ + {file = "colorlog-6.8.2-py3-none-any.whl", hash = "sha256:4dcbb62368e2800cb3c5abd348da7e53f6c362dda502ec27c560b2e58a66bd33"}, + {file = "colorlog-6.8.2.tar.gz", hash = "sha256:3e3e079a41feb5a1b64f978b5ea4f46040a94f11f0e8bbb8261e3dbbeca64d44"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} + +[package.extras] +development = ["black", "flake8", "mypy", "pytest", "types-colorama"] + [[package]] name = "comm" version = "0.2.2" @@ -1261,26 +1286,15 @@ pygments = ">=2.7" sphinx = ">=6.0,<8.0" sphinx-basic-ng = "*" -[[package]] -name = "future" -version = "1.0.0" -description = "Clean single-source support for Python 3 and 2" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "future-1.0.0-py3-none-any.whl", hash = "sha256:929292d34f5872e70396626ef385ec22355a1fae8ad29e1a734c3e43f9fbc216"}, - {file = "future-1.0.0.tar.gz", hash = "sha256:bd2968309307861edae1458a4f8a4f3598c03be43b97521076aebf5d94c07b05"}, -] - [[package]] name = "google-api-core" -version = "2.19.2" +version = "2.20.0" description = "Google API client core library" optional = false python-versions = ">=3.7" files = [ - {file = "google_api_core-2.19.2-py3-none-any.whl", hash = "sha256:53ec0258f2837dd53bbd3d3df50f5359281b3cc13f800c941dd15a9b5a415af4"}, - {file = "google_api_core-2.19.2.tar.gz", hash = "sha256:ca07de7e8aa1c98a8bfca9321890ad2340ef7f2eb136e558cee68f24b94b0a8f"}, + {file = "google_api_core-2.20.0-py3-none-any.whl", hash = "sha256:ef0591ef03c30bb83f79b3d0575c3f31219001fc9c5cf37024d08310aeffed8a"}, + {file = "google_api_core-2.20.0.tar.gz", hash = "sha256:f74dff1889ba291a4b76c5079df0711810e2d9da81abfdc99957bc961c1eb28f"}, ] [package.dependencies] @@ -1297,13 +1311,13 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-auth" -version = "2.34.0" +version = "2.35.0" description = "Google Authentication Library" optional = false python-versions = ">=3.7" files = [ - {file = "google_auth-2.34.0-py2.py3-none-any.whl", hash = "sha256:72fd4733b80b6d777dcde515628a9eb4a577339437012874ea286bca7261ee65"}, - {file = "google_auth-2.34.0.tar.gz", hash = "sha256:8eb87396435c19b20d32abd2f984e31c191a15284af72eb922f10e5bde9c04cc"}, + {file = "google_auth-2.35.0-py2.py3-none-any.whl", hash = "sha256:25df55f327ef021de8be50bad0dfd4a916ad0de96da86cd05661c9297723ad3f"}, + {file = "google_auth-2.35.0.tar.gz", hash = "sha256:f4c64ed4e01e8e8b646ef34c018f8bf3338df0c8e37d8b3bba40e7f574a3278a"}, ] [package.dependencies] @@ -1335,6 +1349,85 @@ protobuf = ">=3.20.2,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4 [package.extras] grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] +[[package]] +name = "greenlet" +version = "3.1.0" +description = "Lightweight in-process concurrent programming" +optional = false +python-versions = ">=3.7" +files = [ + {file = "greenlet-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a814dc3100e8a046ff48faeaa909e80cdb358411a3d6dd5293158425c684eda8"}, + {file = "greenlet-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a771dc64fa44ebe58d65768d869fcfb9060169d203446c1d446e844b62bdfdca"}, + {file = "greenlet-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0e49a65d25d7350cca2da15aac31b6f67a43d867448babf997fe83c7505f57bc"}, + {file = "greenlet-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2cd8518eade968bc52262d8c46727cfc0826ff4d552cf0430b8d65aaf50bb91d"}, + {file = "greenlet-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76dc19e660baea5c38e949455c1181bc018893f25372d10ffe24b3ed7341fb25"}, + {file = "greenlet-3.1.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c0a5b1c22c82831f56f2f7ad9bbe4948879762fe0d59833a4a71f16e5fa0f682"}, + {file = "greenlet-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:2651dfb006f391bcb240635079a68a261b227a10a08af6349cba834a2141efa1"}, + {file = "greenlet-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3e7e6ef1737a819819b1163116ad4b48d06cfdd40352d813bb14436024fcda99"}, + {file = "greenlet-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:ffb08f2a1e59d38c7b8b9ac8083c9c8b9875f0955b1e9b9b9a965607a51f8e54"}, + {file = "greenlet-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9730929375021ec90f6447bff4f7f5508faef1c02f399a1953870cdb78e0c345"}, + {file = "greenlet-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:713d450cf8e61854de9420fb7eea8ad228df4e27e7d4ed465de98c955d2b3fa6"}, + {file = "greenlet-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c3446937be153718250fe421da548f973124189f18fe4575a0510b5c928f0cc"}, + {file = "greenlet-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ddc7bcedeb47187be74208bc652d63d6b20cb24f4e596bd356092d8000da6d6"}, + {file = "greenlet-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44151d7b81b9391ed759a2f2865bbe623ef00d648fed59363be2bbbd5154656f"}, + {file = "greenlet-3.1.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6cea1cca3be76c9483282dc7760ea1cc08a6ecec1f0b6ca0a94ea0d17432da19"}, + {file = "greenlet-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:619935a44f414274a2c08c9e74611965650b730eb4efe4b2270f91df5e4adf9a"}, + {file = "greenlet-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:221169d31cada333a0c7fd087b957c8f431c1dba202c3a58cf5a3583ed973e9b"}, + {file = "greenlet-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:01059afb9b178606b4b6e92c3e710ea1635597c3537e44da69f4531e111dd5e9"}, + {file = "greenlet-3.1.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:24fc216ec7c8be9becba8b64a98a78f9cd057fd2dc75ae952ca94ed8a893bf27"}, + {file = "greenlet-3.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d07c28b85b350564bdff9f51c1c5007dfb2f389385d1bc23288de51134ca303"}, + {file = "greenlet-3.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:243a223c96a4246f8a30ea470c440fe9db1f5e444941ee3c3cd79df119b8eebf"}, + {file = "greenlet-3.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26811df4dc81271033a7836bc20d12cd30938e6bd2e9437f56fa03da81b0f8fc"}, + {file = "greenlet-3.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9d86401550b09a55410f32ceb5fe7efcd998bd2dad9e82521713cb148a4a15f"}, + {file = "greenlet-3.1.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:26d9c1c4f1748ccac0bae1dbb465fb1a795a75aba8af8ca871503019f4285e2a"}, + {file = "greenlet-3.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:cd468ec62257bb4544989402b19d795d2305eccb06cde5da0eb739b63dc04665"}, + {file = "greenlet-3.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a53dfe8f82b715319e9953330fa5c8708b610d48b5c59f1316337302af5c0811"}, + {file = "greenlet-3.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:28fe80a3eb673b2d5cc3b12eea468a5e5f4603c26aa34d88bf61bba82ceb2f9b"}, + {file = "greenlet-3.1.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:76b3e3976d2a452cba7aa9e453498ac72240d43030fdc6d538a72b87eaff52fd"}, + {file = "greenlet-3.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:655b21ffd37a96b1e78cc48bf254f5ea4b5b85efaf9e9e2a526b3c9309d660ca"}, + {file = "greenlet-3.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c6f4c2027689093775fd58ca2388d58789009116844432d920e9147f91acbe64"}, + {file = "greenlet-3.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:76e5064fd8e94c3f74d9fd69b02d99e3cdb8fc286ed49a1f10b256e59d0d3a0b"}, + {file = "greenlet-3.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a4bf607f690f7987ab3291406e012cd8591a4f77aa54f29b890f9c331e84989"}, + {file = "greenlet-3.1.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:037d9ac99540ace9424cb9ea89f0accfaff4316f149520b4ae293eebc5bded17"}, + {file = "greenlet-3.1.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:90b5bbf05fe3d3ef697103850c2ce3374558f6fe40fd57c9fac1bf14903f50a5"}, + {file = "greenlet-3.1.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:726377bd60081172685c0ff46afbc600d064f01053190e4450857483c4d44484"}, + {file = "greenlet-3.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:d46d5069e2eeda111d6f71970e341f4bd9aeeee92074e649ae263b834286ecc0"}, + {file = "greenlet-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81eeec4403a7d7684b5812a8aaa626fa23b7d0848edb3a28d2eb3220daddcbd0"}, + {file = "greenlet-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a3dae7492d16e85ea6045fd11cb8e782b63eac8c8d520c3a92c02ac4573b0a6"}, + {file = "greenlet-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b5ea3664eed571779403858d7cd0a9b0ebf50d57d2cdeafc7748e09ef8cd81a"}, + {file = "greenlet-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a22f4e26400f7f48faef2d69c20dc055a1f3043d330923f9abe08ea0aecc44df"}, + {file = "greenlet-3.1.0-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13ff8c8e54a10472ce3b2a2da007f915175192f18e6495bad50486e87c7f6637"}, + {file = "greenlet-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f9671e7282d8c6fcabc32c0fb8d7c0ea8894ae85cee89c9aadc2d7129e1a9954"}, + {file = "greenlet-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:184258372ae9e1e9bddce6f187967f2e08ecd16906557c4320e3ba88a93438c3"}, + {file = "greenlet-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:a0409bc18a9f85321399c29baf93545152d74a49d92f2f55302f122007cfda00"}, + {file = "greenlet-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:9eb4a1d7399b9f3c7ac68ae6baa6be5f9195d1d08c9ddc45ad559aa6b556bce6"}, + {file = "greenlet-3.1.0-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:a8870983af660798dc1b529e1fd6f1cefd94e45135a32e58bd70edd694540f33"}, + {file = "greenlet-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cfcfb73aed40f550a57ea904629bdaf2e562c68fa1164fa4588e752af6efdc3f"}, + {file = "greenlet-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f9482c2ed414781c0af0b35d9d575226da6b728bd1a720668fa05837184965b7"}, + {file = "greenlet-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d58ec349e0c2c0bc6669bf2cd4982d2f93bf067860d23a0ea1fe677b0f0b1e09"}, + {file = "greenlet-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd65695a8df1233309b701dec2539cc4b11e97d4fcc0f4185b4a12ce54db0491"}, + {file = "greenlet-3.1.0-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:665b21e95bc0fce5cab03b2e1d90ba9c66c510f1bb5fdc864f3a377d0f553f6b"}, + {file = "greenlet-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d3c59a06c2c28a81a026ff11fbf012081ea34fb9b7052f2ed0366e14896f0a1d"}, + {file = "greenlet-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415b9494ff6240b09af06b91a375731febe0090218e2898d2b85f9b92abcda0"}, + {file = "greenlet-3.1.0-cp38-cp38-win32.whl", hash = "sha256:1544b8dd090b494c55e60c4ff46e238be44fdc472d2589e943c241e0169bcea2"}, + {file = "greenlet-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:7f346d24d74c00b6730440f5eb8ec3fe5774ca8d1c9574e8e57c8671bb51b910"}, + {file = "greenlet-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:db1b3ccb93488328c74e97ff888604a8b95ae4f35f4f56677ca57a4fc3a4220b"}, + {file = "greenlet-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44cd313629ded43bb3b98737bba2f3e2c2c8679b55ea29ed73daea6b755fe8e7"}, + {file = "greenlet-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fad7a051e07f64e297e6e8399b4d6a3bdcad3d7297409e9a06ef8cbccff4f501"}, + {file = "greenlet-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3967dcc1cd2ea61b08b0b276659242cbce5caca39e7cbc02408222fb9e6ff39"}, + {file = "greenlet-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d45b75b0f3fd8d99f62eb7908cfa6d727b7ed190737dec7fe46d993da550b81a"}, + {file = "greenlet-3.1.0-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2d004db911ed7b6218ec5c5bfe4cf70ae8aa2223dffbb5b3c69e342bb253cb28"}, + {file = "greenlet-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b9505a0c8579899057cbefd4ec34d865ab99852baf1ff33a9481eb3924e2da0b"}, + {file = "greenlet-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fd6e94593f6f9714dbad1aaba734b5ec04593374fa6638df61592055868f8b8"}, + {file = "greenlet-3.1.0-cp39-cp39-win32.whl", hash = "sha256:d0dd943282231480aad5f50f89bdf26690c995e8ff555f26d8a5b9887b559bcc"}, + {file = "greenlet-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:ac0adfdb3a21dc2a24ed728b61e72440d297d0fd3a577389df566651fcd08f97"}, + {file = "greenlet-3.1.0.tar.gz", hash = "sha256:b395121e9bbe8d02a750886f108d540abe66075e61e22f7353d9acb0b81be0f0"}, +] + +[package.extras] +docs = ["Sphinx", "furo"] +test = ["objgraph", "psutil"] + [[package]] name = "grpcio" version = "1.66.1" @@ -1554,33 +1647,6 @@ files = [ {file = "hyperframe-6.0.1.tar.gz", hash = "sha256:ae510046231dc8e9ecb1a6586f63d2347bf4c8905914aa84ba585ae85f28a914"}, ] -[[package]] -name = "hyperopt" -version = "0.2.7" -description = "Distributed Asynchronous Hyperparameter Optimization" -optional = false -python-versions = "*" -files = [ - {file = "hyperopt-0.2.7-py2.py3-none-any.whl", hash = "sha256:f3046d91fe4167dbf104365016596856b2524a609d22f047a066fc1ac796427c"}, - {file = "hyperopt-0.2.7.tar.gz", hash = "sha256:1bf89ae58050bbd32c7307199046117feee245c2fd9ab6255c7308522b7ca149"}, -] - -[package.dependencies] -cloudpickle = "*" -future = "*" -networkx = ">=2.2" -numpy = "*" -py4j = "*" -scipy = "*" -six = "*" -tqdm = "*" - -[package.extras] -atpe = ["lightgbm", "scikit-learn"] -dev = ["black", "nose", "pre-commit", "pytest"] -mongotrials = ["pymongo"] -sparktrials = ["pyspark"] - [[package]] name = "idna" version = "3.10" @@ -1864,13 +1930,13 @@ referencing = ">=0.31.0" [[package]] name = "jupyter-client" -version = "8.6.2" +version = "8.6.3" description = "Jupyter protocol implementation and client libraries" optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_client-8.6.2-py3-none-any.whl", hash = "sha256:50cbc5c66fd1b8f65ecb66bc490ab73217993632809b6e505687de18e9dea39f"}, - {file = "jupyter_client-8.6.2.tar.gz", hash = "sha256:2bda14d55ee5ba58552a8c53ae43d215ad9868853489213f37da060ced54d8df"}, + {file = "jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f"}, + {file = "jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419"}, ] [package.dependencies] @@ -2170,6 +2236,25 @@ dev = ["changelist (==0.5)"] lint = ["pre-commit (==3.7.0)"] test = ["pytest (>=7.4)", "pytest-cov (>=4.1)"] +[[package]] +name = "mako" +version = "1.3.5" +description = "A super-fast templating language that borrows the best ideas from the existing templating languages." +optional = false +python-versions = ">=3.8" +files = [ + {file = "Mako-1.3.5-py3-none-any.whl", hash = "sha256:260f1dbc3a519453a9c856dedfe4beb4e50bd5a26d96386cb6c80856556bb91a"}, + {file = "Mako-1.3.5.tar.gz", hash = "sha256:48dbc20568c1d276a2698b36d968fa76161bf127194907ea6fc594fa81f943bc"}, +] + +[package.dependencies] +MarkupSafe = ">=0.9.2" + +[package.extras] +babel = ["Babel"] +lingua = ["lingua"] +testing = ["pytest"] + [[package]] name = "markdown" version = "3.7" @@ -2836,6 +2921,33 @@ all = ["antlr4-python3-runtime (>=4.7,<4.14)", "importlib-metadata", "pytest (>= parser = ["antlr4-python3-runtime (>=4.7,<4.14)", "importlib-metadata"] tests = ["pytest (>=6.0)", "pyyaml"] +[[package]] +name = "optuna" +version = "4.0.0" +description = "A hyperparameter optimization framework" +optional = false +python-versions = ">=3.7" +files = [ + {file = "optuna-4.0.0-py3-none-any.whl", hash = "sha256:a825c32d13f6085bcb2229b2724a5078f2e0f61a7533e800e580ce41a8c6c10d"}, + {file = "optuna-4.0.0.tar.gz", hash = "sha256:844949f09e2a7353ab414e9cfd783cf0a647a65fc32a7236212ed6a37fe08973"}, +] + +[package.dependencies] +alembic = ">=1.5.0" +colorlog = "*" +numpy = "*" +packaging = ">=20.0" +PyYAML = "*" +sqlalchemy = ">=1.3.0" +tqdm = "*" + +[package.extras] +benchmark = ["asv (>=0.5.0)", "botorch", "cma", "virtualenv"] +checking = ["black", "blackdoc", "flake8", "isort", "mypy", "mypy-boto3-s3", "types-PyYAML", "types-redis", "types-setuptools", "types-tqdm", "typing-extensions (>=3.10.0.0)"] +document = ["ase", "cmaes (>=0.10.0)", "fvcore", "kaleido", "lightgbm", "matplotlib (!=3.6.0)", "pandas", "pillow", "plotly (>=4.9.0)", "scikit-learn", "sphinx", "sphinx-copybutton", "sphinx-gallery", "sphinx-rtd-theme (>=1.2.0)", "torch", "torchvision"] +optional = ["boto3", "cmaes (>=0.10.0)", "google-cloud-storage", "matplotlib (!=3.6.0)", "pandas", "plotly (>=4.9.0)", "redis", "scikit-learn (>=0.24.2)", "scipy", "torch"] +test = ["coverage", "fakeredis[lua]", "kaleido", "moto", "pytest", "scipy (>=1.9.2)", "torch"] + [[package]] name = "orjson" version = "3.10.7" @@ -2921,6 +3033,7 @@ optional = false python-versions = ">=3.9" files = [ {file = "pandas-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce"}, + {file = "pandas-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238"}, {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08"}, {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0"}, {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51"}, @@ -2934,12 +3047,14 @@ files = [ {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1"}, {file = "pandas-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24"}, {file = "pandas-2.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef"}, + {file = "pandas-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b79011ff7a0f4b1d6da6a61aa1aa604fb312d6647de5bad20013682d1429ce"}, {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad"}, {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad"}, {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76"}, {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32"}, {file = "pandas-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23"}, {file = "pandas-2.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2"}, + {file = "pandas-2.2.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd"}, {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863"}, {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921"}, {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a"}, @@ -3142,13 +3257,13 @@ xmp = ["defusedxml"] [[package]] name = "platformdirs" -version = "4.3.3" +version = "4.3.6" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.3.3-py3-none-any.whl", hash = "sha256:50a5450e2e84f44539718293cbb1da0a0885c9d14adf21b77bae4e66fc99d9b5"}, - {file = "platformdirs-4.3.3.tar.gz", hash = "sha256:d4e0b7d8ec176b341fb03cb11ca12d0276faa8c485f9cd218f613840463fc2c0"}, + {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, + {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, ] [package.extras] @@ -3269,42 +3384,42 @@ files = [ [[package]] name = "protobuf" -version = "4.25.4" +version = "4.25.5" description = "" optional = false python-versions = ">=3.8" files = [ - {file = "protobuf-4.25.4-cp310-abi3-win32.whl", hash = "sha256:db9fd45183e1a67722cafa5c1da3e85c6492a5383f127c86c4c4aa4845867dc4"}, - {file = "protobuf-4.25.4-cp310-abi3-win_amd64.whl", hash = "sha256:ba3d8504116a921af46499471c63a85260c1a5fc23333154a427a310e015d26d"}, - {file = "protobuf-4.25.4-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:eecd41bfc0e4b1bd3fa7909ed93dd14dd5567b98c941d6c1ad08fdcab3d6884b"}, - {file = "protobuf-4.25.4-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:4c8a70fdcb995dcf6c8966cfa3a29101916f7225e9afe3ced4395359955d3835"}, - {file = "protobuf-4.25.4-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:3319e073562e2515c6ddc643eb92ce20809f5d8f10fead3332f71c63be6a7040"}, - {file = "protobuf-4.25.4-cp38-cp38-win32.whl", hash = "sha256:7e372cbbda66a63ebca18f8ffaa6948455dfecc4e9c1029312f6c2edcd86c4e1"}, - {file = "protobuf-4.25.4-cp38-cp38-win_amd64.whl", hash = "sha256:051e97ce9fa6067a4546e75cb14f90cf0232dcb3e3d508c448b8d0e4265b61c1"}, - {file = "protobuf-4.25.4-cp39-cp39-win32.whl", hash = "sha256:90bf6fd378494eb698805bbbe7afe6c5d12c8e17fca817a646cd6a1818c696ca"}, - {file = "protobuf-4.25.4-cp39-cp39-win_amd64.whl", hash = "sha256:ac79a48d6b99dfed2729ccccee547b34a1d3d63289c71cef056653a846a2240f"}, - {file = "protobuf-4.25.4-py3-none-any.whl", hash = "sha256:bfbebc1c8e4793cfd58589acfb8a1026be0003e852b9da7db5a4285bde996978"}, - {file = "protobuf-4.25.4.tar.gz", hash = "sha256:0dc4a62cc4052a036ee2204d26fe4d835c62827c855c8a03f29fe6da146b380d"}, + {file = "protobuf-4.25.5-cp310-abi3-win32.whl", hash = "sha256:5e61fd921603f58d2f5acb2806a929b4675f8874ff5f330b7d6f7e2e784bbcd8"}, + {file = "protobuf-4.25.5-cp310-abi3-win_amd64.whl", hash = "sha256:4be0571adcbe712b282a330c6e89eae24281344429ae95c6d85e79e84780f5ea"}, + {file = "protobuf-4.25.5-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:b2fde3d805354df675ea4c7c6338c1aecd254dfc9925e88c6d31a2bcb97eb173"}, + {file = "protobuf-4.25.5-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:919ad92d9b0310070f8356c24b855c98df2b8bd207ebc1c0c6fcc9ab1e007f3d"}, + {file = "protobuf-4.25.5-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:fe14e16c22be926d3abfcb500e60cab068baf10b542b8c858fa27e098123e331"}, + {file = "protobuf-4.25.5-cp38-cp38-win32.whl", hash = "sha256:98d8d8aa50de6a2747efd9cceba361c9034050ecce3e09136f90de37ddba66e1"}, + {file = "protobuf-4.25.5-cp38-cp38-win_amd64.whl", hash = "sha256:b0234dd5a03049e4ddd94b93400b67803c823cfc405689688f59b34e0742381a"}, + {file = "protobuf-4.25.5-cp39-cp39-win32.whl", hash = "sha256:abe32aad8561aa7cc94fc7ba4fdef646e576983edb94a73381b03c53728a626f"}, + {file = "protobuf-4.25.5-cp39-cp39-win_amd64.whl", hash = "sha256:7a183f592dc80aa7c8da7ad9e55091c4ffc9497b3054452d629bb85fa27c2a45"}, + {file = "protobuf-4.25.5-py3-none-any.whl", hash = "sha256:0aebecb809cae990f8129ada5ca273d9d670b76d9bfc9b1809f0a9c02b7dbf41"}, + {file = "protobuf-4.25.5.tar.gz", hash = "sha256:7f8249476b4a9473645db7f8ab42b02fe1488cbe5fb72fddd445e0665afd8584"}, ] [[package]] name = "protobuf" -version = "5.28.1" +version = "5.28.2" description = "" optional = false python-versions = ">=3.8" files = [ - {file = "protobuf-5.28.1-cp310-abi3-win32.whl", hash = "sha256:fc063acaf7a3d9ca13146fefb5b42ac94ab943ec6e978f543cd5637da2d57957"}, - {file = "protobuf-5.28.1-cp310-abi3-win_amd64.whl", hash = "sha256:4c7f5cb38c640919791c9f74ea80c5b82314c69a8409ea36f2599617d03989af"}, - {file = "protobuf-5.28.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:4304e4fceb823d91699e924a1fdf95cde0e066f3b1c28edb665bda762ecde10f"}, - {file = "protobuf-5.28.1-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:0dfd86d2b5edf03d91ec2a7c15b4e950258150f14f9af5f51c17fa224ee1931f"}, - {file = "protobuf-5.28.1-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:51f09caab818707ab91cf09cc5c156026599cf05a4520779ccbf53c1b352fb25"}, - {file = "protobuf-5.28.1-cp38-cp38-win32.whl", hash = "sha256:1b04bde117a10ff9d906841a89ec326686c48ececeb65690f15b8cabe7149495"}, - {file = "protobuf-5.28.1-cp38-cp38-win_amd64.whl", hash = "sha256:cabfe43044ee319ad6832b2fda332646f9ef1636b0130186a3ae0a52fc264bb4"}, - {file = "protobuf-5.28.1-cp39-cp39-win32.whl", hash = "sha256:4b4b9a0562a35773ff47a3df823177ab71a1f5eb1ff56d8f842b7432ecfd7fd2"}, - {file = "protobuf-5.28.1-cp39-cp39-win_amd64.whl", hash = "sha256:f24e5d70e6af8ee9672ff605d5503491635f63d5db2fffb6472be78ba62efd8f"}, - {file = "protobuf-5.28.1-py3-none-any.whl", hash = "sha256:c529535e5c0effcf417682563719e5d8ac8d2b93de07a56108b4c2d436d7a29a"}, - {file = "protobuf-5.28.1.tar.gz", hash = "sha256:42597e938f83bb7f3e4b35f03aa45208d49ae8d5bcb4bc10b9fc825e0ab5e423"}, + {file = "protobuf-5.28.2-cp310-abi3-win32.whl", hash = "sha256:eeea10f3dc0ac7e6b4933d32db20662902b4ab81bf28df12218aa389e9c2102d"}, + {file = "protobuf-5.28.2-cp310-abi3-win_amd64.whl", hash = "sha256:2c69461a7fcc8e24be697624c09a839976d82ae75062b11a0972e41fd2cd9132"}, + {file = "protobuf-5.28.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a8b9403fc70764b08d2f593ce44f1d2920c5077bf7d311fefec999f8c40f78b7"}, + {file = "protobuf-5.28.2-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:35cfcb15f213449af7ff6198d6eb5f739c37d7e4f1c09b5d0641babf2cc0c68f"}, + {file = "protobuf-5.28.2-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:5e8a95246d581eef20471b5d5ba010d55f66740942b95ba9b872d918c459452f"}, + {file = "protobuf-5.28.2-cp38-cp38-win32.whl", hash = "sha256:87317e9bcda04a32f2ee82089a204d3a2f0d3c8aeed16568c7daf4756e4f1fe0"}, + {file = "protobuf-5.28.2-cp38-cp38-win_amd64.whl", hash = "sha256:c0ea0123dac3399a2eeb1a1443d82b7afc9ff40241433296769f7da42d142ec3"}, + {file = "protobuf-5.28.2-cp39-cp39-win32.whl", hash = "sha256:ca53faf29896c526863366a52a8f4d88e69cd04ec9571ed6082fa117fac3ab36"}, + {file = "protobuf-5.28.2-cp39-cp39-win_amd64.whl", hash = "sha256:8ddc60bf374785fb7cb12510b267f59067fa10087325b8e1855b898a0d81d276"}, + {file = "protobuf-5.28.2-py3-none-any.whl", hash = "sha256:52235802093bd8a2811abbe8bf0ab9c5f54cca0a751fdd3f6ac2a21438bffece"}, + {file = "protobuf-5.28.2.tar.gz", hash = "sha256:59379674ff119717404f7454647913787034f03fe7049cbef1d74a97bb4593f0"}, ] [[package]] @@ -3361,17 +3476,6 @@ files = [ [package.extras] tests = ["pytest"] -[[package]] -name = "py4j" -version = "0.10.9.7" -description = "Enables Python programs to dynamically access arbitrary Java objects" -optional = false -python-versions = "*" -files = [ - {file = "py4j-0.10.9.7-py2.py3-none-any.whl", hash = "sha256:85defdfd2b2376eb3abf5ca6474b51ab7e0de341c75a02f46dc9b5976f5a5c1b"}, - {file = "py4j-0.10.9.7.tar.gz", hash = "sha256:0b6e5315bb3ada5cf62ac651d107bb2ebc02def3dee9d9548e3baac644ea8dbb"}, -] - [[package]] name = "pyasn1" version = "0.6.1" @@ -3656,18 +3760,18 @@ files = [ [[package]] name = "pydantic" -version = "2.9.1" +version = "2.9.2" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.9.1-py3-none-any.whl", hash = "sha256:7aff4db5fdf3cf573d4b3c30926a510a10e19a0774d38fc4967f78beb6deb612"}, - {file = "pydantic-2.9.1.tar.gz", hash = "sha256:1363c7d975c7036df0db2b4a61f2e062fbc0aa5ab5f2772e0ffc7191a4f4bce2"}, + {file = "pydantic-2.9.2-py3-none-any.whl", hash = "sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12"}, + {file = "pydantic-2.9.2.tar.gz", hash = "sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f"}, ] [package.dependencies] annotated-types = ">=0.6.0" -pydantic-core = "2.23.3" +pydantic-core = "2.23.4" typing-extensions = {version = ">=4.6.1", markers = "python_version < \"3.13\""} [package.extras] @@ -3676,100 +3780,100 @@ timezone = ["tzdata"] [[package]] name = "pydantic-core" -version = "2.23.3" +version = "2.23.4" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.23.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:7f10a5d1b9281392f1bf507d16ac720e78285dfd635b05737c3911637601bae6"}, - {file = "pydantic_core-2.23.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3c09a7885dd33ee8c65266e5aa7fb7e2f23d49d8043f089989726391dd7350c5"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6470b5a1ec4d1c2e9afe928c6cb37eb33381cab99292a708b8cb9aa89e62429b"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9172d2088e27d9a185ea0a6c8cebe227a9139fd90295221d7d495944d2367700"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86fc6c762ca7ac8fbbdff80d61b2c59fb6b7d144aa46e2d54d9e1b7b0e780e01"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0cb80fd5c2df4898693aa841425ea1727b1b6d2167448253077d2a49003e0ed"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03667cec5daf43ac4995cefa8aaf58f99de036204a37b889c24a80927b629cec"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:047531242f8e9c2db733599f1c612925de095e93c9cc0e599e96cf536aaf56ba"}, - {file = "pydantic_core-2.23.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5499798317fff7f25dbef9347f4451b91ac2a4330c6669821c8202fd354c7bee"}, - {file = "pydantic_core-2.23.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bbb5e45eab7624440516ee3722a3044b83fff4c0372efe183fd6ba678ff681fe"}, - {file = "pydantic_core-2.23.3-cp310-none-win32.whl", hash = "sha256:8b5b3ed73abb147704a6e9f556d8c5cb078f8c095be4588e669d315e0d11893b"}, - {file = "pydantic_core-2.23.3-cp310-none-win_amd64.whl", hash = "sha256:2b603cde285322758a0279995b5796d64b63060bfbe214b50a3ca23b5cee3e83"}, - {file = "pydantic_core-2.23.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:c889fd87e1f1bbeb877c2ee56b63bb297de4636661cc9bbfcf4b34e5e925bc27"}, - {file = "pydantic_core-2.23.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea85bda3189fb27503af4c45273735bcde3dd31c1ab17d11f37b04877859ef45"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7f7f72f721223f33d3dc98a791666ebc6a91fa023ce63733709f4894a7dc611"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b2b55b0448e9da68f56b696f313949cda1039e8ec7b5d294285335b53104b61"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c24574c7e92e2c56379706b9a3f07c1e0c7f2f87a41b6ee86653100c4ce343e5"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2b05e6ccbee333a8f4b8f4d7c244fdb7a979e90977ad9c51ea31261e2085ce0"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2c409ce1c219c091e47cb03feb3c4ed8c2b8e004efc940da0166aaee8f9d6c8"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d965e8b325f443ed3196db890d85dfebbb09f7384486a77461347f4adb1fa7f8"}, - {file = "pydantic_core-2.23.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f56af3a420fb1ffaf43ece3ea09c2d27c444e7c40dcb7c6e7cf57aae764f2b48"}, - {file = "pydantic_core-2.23.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5b01a078dd4f9a52494370af21aa52964e0a96d4862ac64ff7cea06e0f12d2c5"}, - {file = "pydantic_core-2.23.3-cp311-none-win32.whl", hash = "sha256:560e32f0df04ac69b3dd818f71339983f6d1f70eb99d4d1f8e9705fb6c34a5c1"}, - {file = "pydantic_core-2.23.3-cp311-none-win_amd64.whl", hash = "sha256:c744fa100fdea0d000d8bcddee95213d2de2e95b9c12be083370b2072333a0fa"}, - {file = "pydantic_core-2.23.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:e0ec50663feedf64d21bad0809f5857bac1ce91deded203efc4a84b31b2e4305"}, - {file = "pydantic_core-2.23.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:db6e6afcb95edbe6b357786684b71008499836e91f2a4a1e55b840955b341dbb"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98ccd69edcf49f0875d86942f4418a4e83eb3047f20eb897bffa62a5d419c8fa"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a678c1ac5c5ec5685af0133262103defb427114e62eafeda12f1357a12140162"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01491d8b4d8db9f3391d93b0df60701e644ff0894352947f31fff3e52bd5c801"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fcf31facf2796a2d3b7fe338fe8640aa0166e4e55b4cb108dbfd1058049bf4cb"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7200fd561fb3be06827340da066df4311d0b6b8eb0c2116a110be5245dceb326"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dc1636770a809dee2bd44dd74b89cc80eb41172bcad8af75dd0bc182c2666d4c"}, - {file = "pydantic_core-2.23.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:67a5def279309f2e23014b608c4150b0c2d323bd7bccd27ff07b001c12c2415c"}, - {file = "pydantic_core-2.23.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:748bdf985014c6dd3e1e4cc3db90f1c3ecc7246ff5a3cd4ddab20c768b2f1dab"}, - {file = "pydantic_core-2.23.3-cp312-none-win32.whl", hash = "sha256:255ec6dcb899c115f1e2a64bc9ebc24cc0e3ab097775755244f77360d1f3c06c"}, - {file = "pydantic_core-2.23.3-cp312-none-win_amd64.whl", hash = "sha256:40b8441be16c1e940abebed83cd006ddb9e3737a279e339dbd6d31578b802f7b"}, - {file = "pydantic_core-2.23.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:6daaf5b1ba1369a22c8b050b643250e3e5efc6a78366d323294aee54953a4d5f"}, - {file = "pydantic_core-2.23.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d015e63b985a78a3d4ccffd3bdf22b7c20b3bbd4b8227809b3e8e75bc37f9cb2"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3fc572d9b5b5cfe13f8e8a6e26271d5d13f80173724b738557a8c7f3a8a3791"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f6bd91345b5163ee7448bee201ed7dd601ca24f43f439109b0212e296eb5b423"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc379c73fd66606628b866f661e8785088afe2adaba78e6bbe80796baf708a63"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbdce4b47592f9e296e19ac31667daed8753c8367ebb34b9a9bd89dacaa299c9"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc3cf31edf405a161a0adad83246568647c54404739b614b1ff43dad2b02e6d5"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8e22b477bf90db71c156f89a55bfe4d25177b81fce4aa09294d9e805eec13855"}, - {file = "pydantic_core-2.23.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:0a0137ddf462575d9bce863c4c95bac3493ba8e22f8c28ca94634b4a1d3e2bb4"}, - {file = "pydantic_core-2.23.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:203171e48946c3164fe7691fc349c79241ff8f28306abd4cad5f4f75ed80bc8d"}, - {file = "pydantic_core-2.23.3-cp313-none-win32.whl", hash = "sha256:76bdab0de4acb3f119c2a4bff740e0c7dc2e6de7692774620f7452ce11ca76c8"}, - {file = "pydantic_core-2.23.3-cp313-none-win_amd64.whl", hash = "sha256:37ba321ac2a46100c578a92e9a6aa33afe9ec99ffa084424291d84e456f490c1"}, - {file = "pydantic_core-2.23.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d063c6b9fed7d992bcbebfc9133f4c24b7a7f215d6b102f3e082b1117cddb72c"}, - {file = "pydantic_core-2.23.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6cb968da9a0746a0cf521b2b5ef25fc5a0bee9b9a1a8214e0a1cfaea5be7e8a4"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edbefe079a520c5984e30e1f1f29325054b59534729c25b874a16a5048028d16"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cbaaf2ef20d282659093913da9d402108203f7cb5955020bd8d1ae5a2325d1c4"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fb539d7e5dc4aac345846f290cf504d2fd3c1be26ac4e8b5e4c2b688069ff4cf"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7e6f33503c5495059148cc486867e1d24ca35df5fc064686e631e314d959ad5b"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04b07490bc2f6f2717b10c3969e1b830f5720b632f8ae2f3b8b1542394c47a8e"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:03795b9e8a5d7fda05f3873efc3f59105e2dcff14231680296b87b80bb327295"}, - {file = "pydantic_core-2.23.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c483dab0f14b8d3f0df0c6c18d70b21b086f74c87ab03c59250dbf6d3c89baba"}, - {file = "pydantic_core-2.23.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8b2682038e255e94baf2c473dca914a7460069171ff5cdd4080be18ab8a7fd6e"}, - {file = "pydantic_core-2.23.3-cp38-none-win32.whl", hash = "sha256:f4a57db8966b3a1d1a350012839c6a0099f0898c56512dfade8a1fe5fb278710"}, - {file = "pydantic_core-2.23.3-cp38-none-win_amd64.whl", hash = "sha256:13dd45ba2561603681a2676ca56006d6dee94493f03d5cadc055d2055615c3ea"}, - {file = "pydantic_core-2.23.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:82da2f4703894134a9f000e24965df73cc103e31e8c31906cc1ee89fde72cbd8"}, - {file = "pydantic_core-2.23.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dd9be0a42de08f4b58a3cc73a123f124f65c24698b95a54c1543065baca8cf0e"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89b731f25c80830c76fdb13705c68fef6a2b6dc494402987c7ea9584fe189f5d"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c6de1ec30c4bb94f3a69c9f5f2182baeda5b809f806676675e9ef6b8dc936f28"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb68b41c3fa64587412b104294b9cbb027509dc2f6958446c502638d481525ef"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c3980f2843de5184656aab58698011b42763ccba11c4a8c35936c8dd6c7068c"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94f85614f2cba13f62c3c6481716e4adeae48e1eaa7e8bac379b9d177d93947a"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:510b7fb0a86dc8f10a8bb43bd2f97beb63cffad1203071dc434dac26453955cd"}, - {file = "pydantic_core-2.23.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1eba2f7ce3e30ee2170410e2171867ea73dbd692433b81a93758ab2de6c64835"}, - {file = "pydantic_core-2.23.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4b259fd8409ab84b4041b7b3f24dcc41e4696f180b775961ca8142b5b21d0e70"}, - {file = "pydantic_core-2.23.3-cp39-none-win32.whl", hash = "sha256:40d9bd259538dba2f40963286009bf7caf18b5112b19d2b55b09c14dde6db6a7"}, - {file = "pydantic_core-2.23.3-cp39-none-win_amd64.whl", hash = "sha256:5a8cd3074a98ee70173a8633ad3c10e00dcb991ecec57263aacb4095c5efb958"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f399e8657c67313476a121a6944311fab377085ca7f490648c9af97fc732732d"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:6b5547d098c76e1694ba85f05b595720d7c60d342f24d5aad32c3049131fa5c4"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0dda0290a6f608504882d9f7650975b4651ff91c85673341789a476b1159f211"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65b6e5da855e9c55a0c67f4db8a492bf13d8d3316a59999cfbaf98cc6e401961"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:09e926397f392059ce0afdcac920df29d9c833256354d0c55f1584b0b70cf07e"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:87cfa0ed6b8c5bd6ae8b66de941cece179281239d482f363814d2b986b79cedc"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e61328920154b6a44d98cabcb709f10e8b74276bc709c9a513a8c37a18786cc4"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ce3317d155628301d649fe5e16a99528d5680af4ec7aa70b90b8dacd2d725c9b"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e89513f014c6be0d17b00a9a7c81b1c426f4eb9224b15433f3d98c1a071f8433"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:4f62c1c953d7ee375df5eb2e44ad50ce2f5aff931723b398b8bc6f0ac159791a"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2718443bc671c7ac331de4eef9b673063b10af32a0bb385019ad61dcf2cc8f6c"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0d90e08b2727c5d01af1b5ef4121d2f0c99fbee692c762f4d9d0409c9da6541"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2b676583fc459c64146debea14ba3af54e540b61762dfc0613dc4e98c3f66eeb"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:50e4661f3337977740fdbfbae084ae5693e505ca2b3130a6d4eb0f2281dc43b8"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:68f4cf373f0de6abfe599a38307f4417c1c867ca381c03df27c873a9069cda25"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:59d52cf01854cb26c46958552a21acb10dd78a52aa34c86f284e66b209db8cab"}, - {file = "pydantic_core-2.23.3.tar.gz", hash = "sha256:3cb0f65d8b4121c1b015c60104a685feb929a29d7cf204387c7f2688c7974690"}, + {file = "pydantic_core-2.23.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b10bd51f823d891193d4717448fab065733958bdb6a6b351967bd349d48d5c9b"}, + {file = "pydantic_core-2.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4fc714bdbfb534f94034efaa6eadd74e5b93c8fa6315565a222f7b6f42ca1166"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63e46b3169866bd62849936de036f901a9356e36376079b05efa83caeaa02ceb"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed1a53de42fbe34853ba90513cea21673481cd81ed1be739f7f2efb931b24916"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cfdd16ab5e59fc31b5e906d1a3f666571abc367598e3e02c83403acabc092e07"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255a8ef062cbf6674450e668482456abac99a5583bbafb73f9ad469540a3a232"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a7cd62e831afe623fbb7aabbb4fe583212115b3ef38a9f6b71869ba644624a2"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f09e2ff1f17c2b51f2bc76d1cc33da96298f0a036a137f5440ab3ec5360b624f"}, + {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e38e63e6f3d1cec5a27e0afe90a085af8b6806ee208b33030e65b6516353f1a3"}, + {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0dbd8dbed2085ed23b5c04afa29d8fd2771674223135dc9bc937f3c09284d071"}, + {file = "pydantic_core-2.23.4-cp310-none-win32.whl", hash = "sha256:6531b7ca5f951d663c339002e91aaebda765ec7d61b7d1e3991051906ddde119"}, + {file = "pydantic_core-2.23.4-cp310-none-win_amd64.whl", hash = "sha256:7c9129eb40958b3d4500fa2467e6a83356b3b61bfff1b414c7361d9220f9ae8f"}, + {file = "pydantic_core-2.23.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:77733e3892bb0a7fa797826361ce8a9184d25c8dffaec60b7ffe928153680ba8"}, + {file = "pydantic_core-2.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b84d168f6c48fabd1f2027a3d1bdfe62f92cade1fb273a5d68e621da0e44e6d"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df49e7a0861a8c36d089c1ed57d308623d60416dab2647a4a17fe050ba85de0e"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff02b6d461a6de369f07ec15e465a88895f3223eb75073ffea56b84d9331f607"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:996a38a83508c54c78a5f41456b0103c30508fed9abcad0a59b876d7398f25fd"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d97683ddee4723ae8c95d1eddac7c192e8c552da0c73a925a89fa8649bf13eea"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:216f9b2d7713eb98cb83c80b9c794de1f6b7e3145eef40400c62e86cee5f4e1e"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6f783e0ec4803c787bcea93e13e9932edab72068f68ecffdf86a99fd5918878b"}, + {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d0776dea117cf5272382634bd2a5c1b6eb16767c223c6a5317cd3e2a757c61a0"}, + {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5f7a395a8cf1621939692dba2a6b6a830efa6b3cee787d82c7de1ad2930de64"}, + {file = "pydantic_core-2.23.4-cp311-none-win32.whl", hash = "sha256:74b9127ffea03643e998e0c5ad9bd3811d3dac8c676e47db17b0ee7c3c3bf35f"}, + {file = "pydantic_core-2.23.4-cp311-none-win_amd64.whl", hash = "sha256:98d134c954828488b153d88ba1f34e14259284f256180ce659e8d83e9c05eaa3"}, + {file = "pydantic_core-2.23.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f3e0da4ebaef65158d4dfd7d3678aad692f7666877df0002b8a522cdf088f231"}, + {file = "pydantic_core-2.23.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f69a8e0b033b747bb3e36a44e7732f0c99f7edd5cea723d45bc0d6e95377ffee"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723314c1d51722ab28bfcd5240d858512ffd3116449c557a1336cbe3919beb87"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb2802e667b7051a1bebbfe93684841cc9351004e2badbd6411bf357ab8d5ac8"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18ca8148bebe1b0a382a27a8ee60350091a6ddaf475fa05ef50dc35b5df6327"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33e3d65a85a2a4a0dc3b092b938a4062b1a05f3a9abde65ea93b233bca0e03f2"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:128585782e5bfa515c590ccee4b727fb76925dd04a98864182b22e89a4e6ed36"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:68665f4c17edcceecc112dfed5dbe6f92261fb9d6054b47d01bf6371a6196126"}, + {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20152074317d9bed6b7a95ade3b7d6054845d70584216160860425f4fbd5ee9e"}, + {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9261d3ce84fa1d38ed649c3638feefeae23d32ba9182963e465d58d62203bd24"}, + {file = "pydantic_core-2.23.4-cp312-none-win32.whl", hash = "sha256:4ba762ed58e8d68657fc1281e9bb72e1c3e79cc5d464be146e260c541ec12d84"}, + {file = "pydantic_core-2.23.4-cp312-none-win_amd64.whl", hash = "sha256:97df63000f4fea395b2824da80e169731088656d1818a11b95f3b173747b6cd9"}, + {file = "pydantic_core-2.23.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7530e201d10d7d14abce4fb54cfe5b94a0aefc87da539d0346a484ead376c3cc"}, + {file = "pydantic_core-2.23.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:df933278128ea1cd77772673c73954e53a1c95a4fdf41eef97c2b779271bd0bd"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cb3da3fd1b6a5d0279a01877713dbda118a2a4fc6f0d821a57da2e464793f05"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c6dcb030aefb668a2b7009c85b27f90e51e6a3b4d5c9bc4c57631292015b0d"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:696dd8d674d6ce621ab9d45b205df149399e4bb9aa34102c970b721554828510"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2971bb5ffe72cc0f555c13e19b23c85b654dd2a8f7ab493c262071377bfce9f6"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8394d940e5d400d04cad4f75c0598665cbb81aecefaca82ca85bd28264af7f9b"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dff76e0602ca7d4cdaacc1ac4c005e0ce0dcfe095d5b5259163a80d3a10d327"}, + {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7d32706badfe136888bdea71c0def994644e09fff0bfe47441deaed8e96fdbc6"}, + {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed541d70698978a20eb63d8c5d72f2cc6d7079d9d90f6b50bad07826f1320f5f"}, + {file = "pydantic_core-2.23.4-cp313-none-win32.whl", hash = "sha256:3d5639516376dce1940ea36edf408c554475369f5da2abd45d44621cb616f769"}, + {file = "pydantic_core-2.23.4-cp313-none-win_amd64.whl", hash = "sha256:5a1504ad17ba4210df3a045132a7baeeba5a200e930f57512ee02909fc5c4cb5"}, + {file = "pydantic_core-2.23.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d4488a93b071c04dc20f5cecc3631fc78b9789dd72483ba15d423b5b3689b555"}, + {file = "pydantic_core-2.23.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:81965a16b675b35e1d09dd14df53f190f9129c0202356ed44ab2728b1c905658"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ffa2ebd4c8530079140dd2d7f794a9d9a73cbb8e9d59ffe24c63436efa8f271"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:61817945f2fe7d166e75fbfb28004034b48e44878177fc54d81688e7b85a3665"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29d2c342c4bc01b88402d60189f3df065fb0dda3654744d5a165a5288a657368"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e11661ce0fd30a6790e8bcdf263b9ec5988e95e63cf901972107efc49218b13"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d18368b137c6295db49ce7218b1a9ba15c5bc254c96d7c9f9e924a9bc7825ad"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ec4e55f79b1c4ffb2eecd8a0cfba9955a2588497d96851f4c8f99aa4a1d39b12"}, + {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:374a5e5049eda9e0a44c696c7ade3ff355f06b1fe0bb945ea3cac2bc336478a2"}, + {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5c364564d17da23db1106787675fc7af45f2f7b58b4173bfdd105564e132e6fb"}, + {file = "pydantic_core-2.23.4-cp38-none-win32.whl", hash = "sha256:d7a80d21d613eec45e3d41eb22f8f94ddc758a6c4720842dc74c0581f54993d6"}, + {file = "pydantic_core-2.23.4-cp38-none-win_amd64.whl", hash = "sha256:5f5ff8d839f4566a474a969508fe1c5e59c31c80d9e140566f9a37bba7b8d556"}, + {file = "pydantic_core-2.23.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a4fa4fc04dff799089689f4fd502ce7d59de529fc2f40a2c8836886c03e0175a"}, + {file = "pydantic_core-2.23.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a7df63886be5e270da67e0966cf4afbae86069501d35c8c1b3b6c168f42cb36"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcedcd19a557e182628afa1d553c3895a9f825b936415d0dbd3cd0bbcfd29b4b"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f54b118ce5de9ac21c363d9b3caa6c800341e8c47a508787e5868c6b79c9323"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86d2f57d3e1379a9525c5ab067b27dbb8a0642fb5d454e17a9ac434f9ce523e3"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de6d1d1b9e5101508cb37ab0d972357cac5235f5c6533d1071964c47139257df"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1278e0d324f6908e872730c9102b0112477a7f7cf88b308e4fc36ce1bdb6d58c"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a6b5099eeec78827553827f4c6b8615978bb4b6a88e5d9b93eddf8bb6790f55"}, + {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e55541f756f9b3ee346b840103f32779c695a19826a4c442b7954550a0972040"}, + {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a5c7ba8ffb6d6f8f2ab08743be203654bb1aaa8c9dcb09f82ddd34eadb695605"}, + {file = "pydantic_core-2.23.4-cp39-none-win32.whl", hash = "sha256:37b0fe330e4a58d3c58b24d91d1eb102aeec675a3db4c292ec3928ecd892a9a6"}, + {file = "pydantic_core-2.23.4-cp39-none-win_amd64.whl", hash = "sha256:1498bec4c05c9c787bde9125cfdcc63a41004ff167f495063191b863399b1a29"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f455ee30a9d61d3e1a15abd5068827773d6e4dc513e795f380cdd59932c782d5"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1e90d2e3bd2c3863d48525d297cd143fe541be8bbf6f579504b9712cb6b643ec"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e203fdf807ac7e12ab59ca2bfcabb38c7cf0b33c41efeb00f8e5da1d86af480"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e08277a400de01bc72436a0ccd02bdf596631411f592ad985dcee21445bd0068"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f220b0eea5965dec25480b6333c788fb72ce5f9129e8759ef876a1d805d00801"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d06b0c8da4f16d1d1e352134427cb194a0a6e19ad5db9161bf32b2113409e728"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ba1a0996f6c2773bd83e63f18914c1de3c9dd26d55f4ac302a7efe93fb8e7433"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9a5bce9d23aac8f0cf0836ecfc033896aa8443b501c58d0602dbfd5bd5b37753"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:78ddaaa81421a29574a682b3179d4cf9e6d405a09b99d93ddcf7e5239c742e21"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:883a91b5dd7d26492ff2f04f40fbb652de40fcc0afe07e8129e8ae779c2110eb"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88ad334a15b32a791ea935af224b9de1bf99bcd62fabf745d5f3442199d86d59"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:233710f069d251feb12a56da21e14cca67994eab08362207785cf8c598e74577"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:19442362866a753485ba5e4be408964644dd6a09123d9416c54cd49171f50744"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:624e278a7d29b6445e4e813af92af37820fafb6dcc55c012c834f9e26f9aaaef"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f5ef8f42bec47f21d07668a043f077d507e5bf4e668d5c6dfe6aaba89de1a5b8"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:aea443fffa9fbe3af1a9ba721a87f926fe548d32cab71d188a6ede77d0ff244e"}, + {file = "pydantic_core-2.23.4.tar.gz", hash = "sha256:2584f7cf844ac4d970fba483a717dbe10c1c1c96a969bf65d61ffe94df1b2863"}, ] [package.dependencies] @@ -3990,21 +4094,21 @@ testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtuale [[package]] name = "pytest-env" -version = "1.1.4" +version = "1.1.5" description = "pytest plugin that allows you to add environment variables." optional = false python-versions = ">=3.8" files = [ - {file = "pytest_env-1.1.4-py3-none-any.whl", hash = "sha256:a4212056d4d440febef311a98fdca56c31256d58fb453d103cba4e8a532b721d"}, - {file = "pytest_env-1.1.4.tar.gz", hash = "sha256:86653658da8f11c6844975db955746c458a9c09f1e64957603161e2ff93f5133"}, + {file = "pytest_env-1.1.5-py3-none-any.whl", hash = "sha256:ce90cf8772878515c24b31cd97c7fa1f4481cd68d588419fd45f10ecaee6bc30"}, + {file = "pytest_env-1.1.5.tar.gz", hash = "sha256:91209840aa0e43385073ac464a554ad2947cc2fd663a9debf88d03b01e0cc1cf"}, ] [package.dependencies] -pytest = ">=8.3.2" +pytest = ">=8.3.3" tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} [package.extras] -test = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "pytest-mock (>=3.14)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "pytest-mock (>=3.14)"] [[package]] name = "pytest-mock" @@ -4422,24 +4526,23 @@ test = ["coverage[toml] (>=6.2)", "mypy (>=0.940)", "pytest (>=6.2.2)", "pytest- [[package]] name = "qibo" -version = "0.2.11" +version = "0.2.12" description = "A framework for quantum computing with hardware acceleration." optional = false python-versions = "<3.13,>=3.9" files = [ - {file = "qibo-0.2.11-py3-none-any.whl", hash = "sha256:67e900364e62642c0c8c3c69fbfaea3e81bef5da53b4547b67516a11dcbe099d"}, - {file = "qibo-0.2.11.tar.gz", hash = "sha256:312037020ddfc82bcb92d698e960e5c3749fbbd61d16944b91d0ba15d6cc7931"}, + {file = "qibo-0.2.12-py3-none-any.whl", hash = "sha256:2e301747b31946d0737bfa621bf5b30b00c861926468ce36973cf61b2803f58a"}, + {file = "qibo-0.2.12.tar.gz", hash = "sha256:6849801eee77f928077a3e11b52cf549c34a9e9678a6d366d495686a6b21e788"}, ] [package.dependencies] cma = ">=3.3.0,<4.0.0" -hyperopt = ">=0.2.7,<0.3.0" joblib = ">=1.2.0,<2.0.0" networkx = ">=3.2.1,<4.0.0" numpy = ">=1.26.4,<2.0.0" openqasm3 = {version = ">=0.5.0", extras = ["parser"]} +optuna = ">=4.0.0,<5.0.0" scipy = ">=1.10.1,<2.0.0" -setuptools = ">=69.1.1,<71.0.0" sympy = ">=1.11.1,<2.0.0" tabulate = ">=0.9.0,<0.10.0" @@ -4450,16 +4553,17 @@ torch = ["torch (>=2.1.1,<2.4)"] [[package]] name = "qibosoq" -version = "0.1.2" +version = "0.1.3" description = "QIBO Server On Qick (qibosoq) is the server component of qibolab to be run on RFSoC boards" optional = false -python-versions = "<3.12,>=3.8" +python-versions = "<3.13,>=3.9" files = [ - {file = "qibosoq-0.1.2-py3-none-any.whl", hash = "sha256:c6eaebba2bdcc1c05359d9cbcdf35bf2a4f15fe8c67730ea5911ff4c04f3e2f3"}, - {file = "qibosoq-0.1.2.tar.gz", hash = "sha256:ccb4eb7d8f7557ea8ea72ffc88f00669e64dc02c871c856b5fb33c97c3c18863"}, + {file = "qibosoq-0.1.3-py3-none-any.whl", hash = "sha256:8b909a3a6ed9807b679b11e7c97a70f88dae74b8d72ebfd9225f51c89bd1817f"}, + {file = "qibosoq-0.1.3.tar.gz", hash = "sha256:8f5c2a2327156519d0fd9d26fc75b563506b1cb860a207fb8eea1749bb30ef3f"}, ] [package.dependencies] +numpy = ">=1.26,<2.0" qick = ">=0.2.211,<=0.2.249" [[package]] @@ -5019,18 +5123,23 @@ test = ["array-api-strict", "asv", "gmpy2", "hypothesis (>=6.30)", "mpmath", "po [[package]] name = "setuptools" -version = "70.3.0" +version = "75.1.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-70.3.0-py3-none-any.whl", hash = "sha256:fe384da74336c398e0d956d1cae0669bc02eed936cdb1d49b57de1990dc11ffc"}, - {file = "setuptools-70.3.0.tar.gz", hash = "sha256:f171bab1dfbc86b132997f26a119f6056a57950d058587841a0082e8830f9dc5"}, + {file = "setuptools-75.1.0-py3-none-any.whl", hash = "sha256:35ab7fd3bcd95e6b7fd704e4a1539513edad446c097797f2985e0e4b960772f2"}, + {file = "setuptools-75.1.0.tar.gz", hash = "sha256:d59a21b17a275fb872a9c3dae73963160ae079f1049ed956880cd7c09b120538"}, ] [package.extras] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.10.0)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.5.2)"] +core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.collections", "jaraco.functools", "jaraco.text (>=3.7)", "more-itertools", "more-itertools (>=8.8)", "packaging", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib-metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.11.*)", "pytest-mypy"] [[package]] name = "six" @@ -5312,6 +5421,93 @@ files = [ numpy = "*" pyserial = "*" +[[package]] +name = "sqlalchemy" +version = "2.0.35" +description = "Database Abstraction Library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "SQLAlchemy-2.0.35-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:67219632be22f14750f0d1c70e62f204ba69d28f62fd6432ba05ab295853de9b"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4668bd8faf7e5b71c0319407b608f278f279668f358857dbfd10ef1954ac9f90"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb8bea573863762bbf45d1e13f87c2d2fd32cee2dbd50d050f83f87429c9e1ea"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f552023710d4b93d8fb29a91fadf97de89c5926c6bd758897875435f2a939f33"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:016b2e665f778f13d3c438651dd4de244214b527a275e0acf1d44c05bc6026a9"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7befc148de64b6060937231cbff8d01ccf0bfd75aa26383ffdf8d82b12ec04ff"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-win32.whl", hash = "sha256:22b83aed390e3099584b839b93f80a0f4a95ee7f48270c97c90acd40ee646f0b"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-win_amd64.whl", hash = "sha256:a29762cd3d116585278ffb2e5b8cc311fb095ea278b96feef28d0b423154858e"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e21f66748ab725ade40fa7af8ec8b5019c68ab00b929f6643e1b1af461eddb60"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8a6219108a15fc6d24de499d0d515c7235c617b2540d97116b663dade1a54d62"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:042622a5306c23b972192283f4e22372da3b8ddf5f7aac1cc5d9c9b222ab3ff6"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:627dee0c280eea91aed87b20a1f849e9ae2fe719d52cbf847c0e0ea34464b3f7"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4fdcd72a789c1c31ed242fd8c1bcd9ea186a98ee8e5408a50e610edfef980d71"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:89b64cd8898a3a6f642db4eb7b26d1b28a497d4022eccd7717ca066823e9fb01"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-win32.whl", hash = "sha256:6a93c5a0dfe8d34951e8a6f499a9479ffb9258123551fa007fc708ae2ac2bc5e"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-win_amd64.whl", hash = "sha256:c68fe3fcde03920c46697585620135b4ecfdfc1ed23e75cc2c2ae9f8502c10b8"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:eb60b026d8ad0c97917cb81d3662d0b39b8ff1335e3fabb24984c6acd0c900a2"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6921ee01caf375363be5e9ae70d08ce7ca9d7e0e8983183080211a062d299468"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8cdf1a0dbe5ced887a9b127da4ffd7354e9c1a3b9bb330dce84df6b70ccb3a8d"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93a71c8601e823236ac0e5d087e4f397874a421017b3318fd92c0b14acf2b6db"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e04b622bb8a88f10e439084486f2f6349bf4d50605ac3e445869c7ea5cf0fa8c"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1b56961e2d31389aaadf4906d453859f35302b4eb818d34a26fab72596076bb8"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-win32.whl", hash = "sha256:0f9f3f9a3763b9c4deb8c5d09c4cc52ffe49f9876af41cc1b2ad0138878453cf"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-win_amd64.whl", hash = "sha256:25b0f63e7fcc2a6290cb5f7f5b4fc4047843504983a28856ce9b35d8f7de03cc"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f021d334f2ca692523aaf7bbf7592ceff70c8594fad853416a81d66b35e3abf9"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05c3f58cf91683102f2f0265c0db3bd3892e9eedabe059720492dbaa4f922da1"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:032d979ce77a6c2432653322ba4cbeabf5a6837f704d16fa38b5a05d8e21fa00"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:2e795c2f7d7249b75bb5f479b432a51b59041580d20599d4e112b5f2046437a3"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:cc32b2990fc34380ec2f6195f33a76b6cdaa9eecf09f0c9404b74fc120aef36f"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-win32.whl", hash = "sha256:9509c4123491d0e63fb5e16199e09f8e262066e58903e84615c301dde8fa2e87"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-win_amd64.whl", hash = "sha256:3655af10ebcc0f1e4e06c5900bb33e080d6a1fa4228f502121f28a3b1753cde5"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4c31943b61ed8fdd63dfd12ccc919f2bf95eefca133767db6fbbd15da62078ec"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a62dd5d7cc8626a3634208df458c5fe4f21200d96a74d122c83bc2015b333bc1"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0630774b0977804fba4b6bbea6852ab56c14965a2b0c7fc7282c5f7d90a1ae72"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d625eddf7efeba2abfd9c014a22c0f6b3796e0ffb48f5d5ab106568ef01ff5a"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ada603db10bb865bbe591939de854faf2c60f43c9b763e90f653224138f910d9"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c41411e192f8d3ea39ea70e0fae48762cd11a2244e03751a98bd3c0ca9a4e936"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-win32.whl", hash = "sha256:d299797d75cd747e7797b1b41817111406b8b10a4f88b6e8fe5b5e59598b43b0"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-win_amd64.whl", hash = "sha256:0375a141e1c0878103eb3d719eb6d5aa444b490c96f3fedab8471c7f6ffe70ee"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ccae5de2a0140d8be6838c331604f91d6fafd0735dbdcee1ac78fc8fbaba76b4"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2a275a806f73e849e1c309ac11108ea1a14cd7058577aba962cd7190e27c9e3c"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:732e026240cdd1c1b2e3ac515c7a23820430ed94292ce33806a95869c46bd139"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:890da8cd1941fa3dab28c5bac3b9da8502e7e366f895b3b8e500896f12f94d11"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c0d8326269dbf944b9201911b0d9f3dc524d64779a07518199a58384c3d37a44"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b76d63495b0508ab9fc23f8152bac63205d2a704cd009a2b0722f4c8e0cba8e0"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-win32.whl", hash = "sha256:69683e02e8a9de37f17985905a5eca18ad651bf592314b4d3d799029797d0eb3"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-win_amd64.whl", hash = "sha256:aee110e4ef3c528f3abbc3c2018c121e708938adeeff9006428dd7c8555e9b3f"}, + {file = "SQLAlchemy-2.0.35-py3-none-any.whl", hash = "sha256:2ab3f0336c0387662ce6221ad30ab3a5e6499aab01b9790879b6578fd9b8faa1"}, + {file = "sqlalchemy-2.0.35.tar.gz", hash = "sha256:e11d7ea4d24f0a262bccf9a7cd6284c976c5369dac21db237cff59586045ab9f"}, +] + +[package.dependencies] +greenlet = {version = "!=0.4.17", markers = "python_version < \"3.13\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} +typing-extensions = ">=4.6.0" + +[package.extras] +aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] +aioodbc = ["aioodbc", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"] +asyncio = ["greenlet (!=0.4.17)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5)"] +mssql = ["pyodbc"] +mssql-pymssql = ["pymssql"] +mssql-pyodbc = ["pyodbc"] +mypy = ["mypy (>=0.910)"] +mysql = ["mysqlclient (>=1.4.0)"] +mysql-connector = ["mysql-connector-python"] +oracle = ["cx_oracle (>=8)"] +oracle-oracledb = ["oracledb (>=1.0.1)"] +postgresql = ["psycopg2 (>=2.7)"] +postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] +postgresql-pg8000 = ["pg8000 (>=1.29.1)"] +postgresql-psycopg = ["psycopg (>=3.0.7)"] +postgresql-psycopg2binary = ["psycopg2-binary"] +postgresql-psycopg2cffi = ["psycopg2cffi"] +postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] +pymysql = ["pymysql"] +sqlcipher = ["sqlcipher3_binary"] + [[package]] name = "sqlitedict" version = "2.1.0" @@ -5343,13 +5539,13 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] [[package]] name = "sympy" -version = "1.13.2" +version = "1.13.3" description = "Computer algebra system (CAS) in Python" optional = false python-versions = ">=3.8" files = [ - {file = "sympy-1.13.2-py3-none-any.whl", hash = "sha256:c51d75517712f1aed280d4ce58506a4a88d635d6b5dd48b39102a7ae1f3fcfe9"}, - {file = "sympy-1.13.2.tar.gz", hash = "sha256:401449d84d07be9d0c7a46a64bd54fe097667d5e7181bfe67ec777be9e01cb13"}, + {file = "sympy-1.13.3-py3-none-any.whl", hash = "sha256:54612cf55a62755ee71824ce692986f23c88ffa77207b30c1368eda4a7060f73"}, + {file = "sympy-1.13.3.tar.gz", hash = "sha256:b27fd2c6530e0ab39e275fc9b683895367e51d5da91baa8d3d64db2565fec4d9"}, ] [package.dependencies]