From 69d4fd89038b48714fd5ae7d032d88720663a423 Mon Sep 17 00:00:00 2001 From: Jacfomg Date: Mon, 11 Dec 2023 15:31:00 +0400 Subject: [PATCH 1/5] Add singleshot unrolling --- .../characterization/classification.py | 95 ++++++++++--------- tests/runcards/protocols.yml | 8 ++ 2 files changed, 56 insertions(+), 47 deletions(-) diff --git a/src/qibocal/protocols/characterization/classification.py b/src/qibocal/protocols/characterization/classification.py index 04ef34aba..76c1edee6 100644 --- a/src/qibocal/protocols/characterization/classification.py +++ b/src/qibocal/protocols/characterization/classification.py @@ -46,6 +46,9 @@ class SingleShotClassificationParameters(Parameters): """SingleShotClassification runcard inputs.""" + unrolling: bool = False + """If ``True`` it uses sequence unrolling to deploy multiple sequences in a single instrument call. + Defaults to ``False``.""" classifiers_list: Optional[list[str]] = field( default_factory=lambda: [DEFAULT_CLASSIFIER] ) @@ -172,20 +175,24 @@ def _acquisition( # state1_sequence: RX - MZ # taking advantage of multiplexing, apply the same set of gates to all qubits in parallel - state0_sequence = PulseSequence() - state1_sequence = PulseSequence() - - RX_pulses = {} - ro_pulses = {} - for qubit in qubits: - RX_pulses[qubit] = platform.create_RX_pulse(qubit, start=0) - ro_pulses[qubit] = platform.create_qubit_readout_pulse( - qubit, start=RX_pulses[qubit].finish - ) - - state0_sequence.add(ro_pulses[qubit]) - state1_sequence.add(RX_pulses[qubit]) - state1_sequence.add(ro_pulses[qubit]) + sequences, all_ro_pulses = [], [] + for state in [0, 1]: + sequences.append(PulseSequence()) + all_ro_pulses.append({}) + RX_pulses = {} + ro_pulses = {} + for qubit in qubits: + RX_pulses[qubit] = platform.create_RX_pulse(qubit, start=0) + ro_pulses[qubit] = platform.create_qubit_readout_pulse( + qubit, start=RX_pulses[qubit].finish + ) + if state == 0: + sequences[-1].add(ro_pulses[qubit]) + all_ro_pulses[-1][qubit] = ro_pulses[qubit] + elif state == 1: + sequences[-1].add(RX_pulses[qubit]) + sequences[-1].add(ro_pulses[qubit]) + all_ro_pulses[-1][qubit] = ro_pulses[qubit] data = SingleShotClassificationData( nshots=params.nshots, @@ -196,41 +203,35 @@ def _acquisition( savedir=params.savedir, ) - # execute the first pulse sequence - state0_results = platform.execute_pulse_sequence( - state0_sequence, - ExecutionParameters( - nshots=params.nshots, - relaxation_time=params.relaxation_time, - acquisition_type=AcquisitionType.INTEGRATION, - ), + options = ExecutionParameters( + nshots=params.nshots, + relaxation_time=params.relaxation_time, + acquisition_type=AcquisitionType.INTEGRATION, ) - # retrieve and store the results for every qubit - for qubit in qubits: - result = state0_results[ro_pulses[qubit].serial] - data.register_qubit( - ClassificationType, - (qubit), - dict(i=result.voltage_i, q=result.voltage_q, state=[0] * params.nshots), - ) - # execute the second pulse sequence - state1_results = platform.execute_pulse_sequence( - state1_sequence, - ExecutionParameters( - nshots=params.nshots, - relaxation_time=params.relaxation_time, - acquisition_type=AcquisitionType.INTEGRATION, - ), - ) - # retrieve and store the results for every qubit - for qubit in qubits: - result = state1_results[ro_pulses[qubit].serial] - data.register_qubit( - ClassificationType, - (qubit), - dict(i=result.voltage_i, q=result.voltage_q, state=[1] * params.nshots), - ) + if params.unrolling: + results = platform.execute_pulse_sequences(sequences, options) + else: + results = [ + platform.execute_pulse_sequence(sequence, options) for sequence in sequences + ] + + for ig, (state, ro_pulses) in enumerate(zip([0, 1], all_ro_pulses)): + for qubit in qubits: + serial = ro_pulses[qubit].serial + if params.unrolling: + result = results[serial][ig] + else: + result = results[ig][serial] + data.register_qubit( + ClassificationType, + (qubit), + dict( + i=result.voltage_i, + q=result.voltage_q, + state=[state] * params.nshots, + ), + ) return data diff --git a/tests/runcards/protocols.yml b/tests/runcards/protocols.yml index 9cde41d4b..f1c515f5a 100644 --- a/tests/runcards/protocols.yml +++ b/tests/runcards/protocols.yml @@ -409,6 +409,14 @@ actions: priority: 0 operation: single_shot_classification parameters: + unrolling: False + nshots: 10 + + - id: single shot classification + priority: 0 + operation: single_shot_classification + parameters: + unrolling: False nshots: 10 - id: single shot classification with classifiers From 47ef64979339a151334763d79efe85e69efcf9c8 Mon Sep 17 00:00:00 2001 From: Jacfomg Date: Mon, 11 Dec 2023 16:03:19 +0400 Subject: [PATCH 2/5] comments --- .../protocols/characterization/classification.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/qibocal/protocols/characterization/classification.py b/src/qibocal/protocols/characterization/classification.py index 76c1edee6..3941094f2 100644 --- a/src/qibocal/protocols/characterization/classification.py +++ b/src/qibocal/protocols/characterization/classification.py @@ -177,8 +177,7 @@ def _acquisition( # taking advantage of multiplexing, apply the same set of gates to all qubits in parallel sequences, all_ro_pulses = [], [] for state in [0, 1]: - sequences.append(PulseSequence()) - all_ro_pulses.append({}) + sequence = PulseSequence() RX_pulses = {} ro_pulses = {} for qubit in qubits: @@ -187,12 +186,13 @@ def _acquisition( qubit, start=RX_pulses[qubit].finish ) if state == 0: - sequences[-1].add(ro_pulses[qubit]) - all_ro_pulses[-1][qubit] = ro_pulses[qubit] + sequence.add(ro_pulses[qubit]) elif state == 1: - sequences[-1].add(RX_pulses[qubit]) - sequences[-1].add(ro_pulses[qubit]) - all_ro_pulses[-1][qubit] = ro_pulses[qubit] + sequence.add(RX_pulses[qubit]) + sequence.add(ro_pulses[qubit]) + + sequences.append(sequence) + all_ro_pulses.append(ro_pulses) data = SingleShotClassificationData( nshots=params.nshots, From 1fbaed1030fe542a01cab21c5fe5d8bb397d46d2 Mon Sep 17 00:00:00 2001 From: Jacfomg Date: Mon, 11 Dec 2023 16:32:05 +0400 Subject: [PATCH 3/5] fix ro_pulses --- src/qibocal/protocols/characterization/classification.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qibocal/protocols/characterization/classification.py b/src/qibocal/protocols/characterization/classification.py index 3941094f2..2189fd02e 100644 --- a/src/qibocal/protocols/characterization/classification.py +++ b/src/qibocal/protocols/characterization/classification.py @@ -191,8 +191,8 @@ def _acquisition( sequence.add(RX_pulses[qubit]) sequence.add(ro_pulses[qubit]) - sequences.append(sequence) - all_ro_pulses.append(ro_pulses) + sequences.append(sequence) + all_ro_pulses.append(ro_pulses) data = SingleShotClassificationData( nshots=params.nshots, From 506353b28928141c031a796cb9f7a25c84d3960d Mon Sep 17 00:00:00 2001 From: Juan Cereijo Date: Fri, 15 Dec 2023 23:08:39 +0400 Subject: [PATCH 4/5] Update src/qibocal/protocols/characterization/classification.py Co-authored-by: Hayk Sargsyan <52532457+hay-k@users.noreply.github.com> --- src/qibocal/protocols/characterization/classification.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/qibocal/protocols/characterization/classification.py b/src/qibocal/protocols/characterization/classification.py index 2189fd02e..7c97c36f5 100644 --- a/src/qibocal/protocols/characterization/classification.py +++ b/src/qibocal/protocols/characterization/classification.py @@ -185,11 +185,9 @@ def _acquisition( ro_pulses[qubit] = platform.create_qubit_readout_pulse( qubit, start=RX_pulses[qubit].finish ) - if state == 0: - sequence.add(ro_pulses[qubit]) - elif state == 1: + if state == 1: sequence.add(RX_pulses[qubit]) - sequence.add(ro_pulses[qubit]) + sequence.add(ro_pulses[qubit]) sequences.append(sequence) all_ro_pulses.append(ro_pulses) From bb224e6f22783ccc5ecc97ac268b9102808d96e1 Mon Sep 17 00:00:00 2001 From: Juan Cereijo Date: Fri, 15 Dec 2023 23:08:59 +0400 Subject: [PATCH 5/5] Update tests/runcards/protocols.yml Co-authored-by: Andrea Pasquale --- tests/runcards/protocols.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/runcards/protocols.yml b/tests/runcards/protocols.yml index f1c515f5a..b91eb289c 100644 --- a/tests/runcards/protocols.yml +++ b/tests/runcards/protocols.yml @@ -412,11 +412,11 @@ actions: unrolling: False nshots: 10 - - id: single shot classification + - id: single shot classification with unrolling priority: 0 operation: single_shot_classification parameters: - unrolling: False + unrolling: True nshots: 10 - id: single shot classification with classifiers