Skip to content

Commit

Permalink
Merge pull request #634 from qiboteam/tune_landscape
Browse files Browse the repository at this point in the history
Add tune landscape protocol
  • Loading branch information
andrea-pasquale committed Apr 4, 2024
2 parents e761bda + 0e69f41 commit 8dd2e15
Show file tree
Hide file tree
Showing 12 changed files with 297 additions and 65 deletions.
9 changes: 8 additions & 1 deletion src/qibocal/protocols/characterization/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,13 @@
calibrate_state_discrimination,
)
from .signal_experiments.time_of_flight_readout import time_of_flight_readout
from .two_qubit_interaction import chevron, chsh_circuits, chsh_pulses, cz_virtualz
from .two_qubit_interaction import (
chevron,
chsh_circuits,
chsh_pulses,
cz_virtualz,
cz_virtualz_signal,
)


class Operation(Enum):
Expand Down Expand Up @@ -115,6 +121,7 @@ class Operation(Enum):
dispersive_shift_qutrit = dispersive_shift_qutrit
coupler_resonator_spectroscopy = coupler_resonator_spectroscopy
coupler_qubit_spectroscopy = coupler_qubit_spectroscopy
cz_virtualz_signal = cz_virtualz_signal
coupler_chevron = coupler_chevron
flipping_signal = flipping_signal
calibrate_state_discrimination = calibrate_state_discrimination
17 changes: 10 additions & 7 deletions src/qibocal/protocols/characterization/couplers/coupler_chevron.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from qibolab.platform import Platform
from qibolab.pulses import PulseSequence
from qibolab.qubits import QubitPairId
from qibolab.sweeper import Parameter, Sweeper
from qibolab.sweeper import Parameter, Sweeper, SweeperType

from qibocal.auto.operation import Results, Routine

Expand Down Expand Up @@ -50,9 +50,9 @@ def _aquisition(
"""
# define the parameter to sweep and its range:
delta_amplitude_range = np.arange(
params.amplitude_min,
params.amplitude_max,
params.amplitude_step,
params.amplitude_min_factor,
params.amplitude_max_factor,
params.amplitude_step_factor,
)
delta_duration_range = np.arange(
params.duration_min, params.duration_max, params.duration_step
Expand All @@ -64,7 +64,7 @@ def _aquisition(
for pair in targets:
sequence = PulseSequence()

ordered_pair = order_pair(pair, platform.qubits)
ordered_pair = order_pair(pair, platform)

# initialize in system in 11(CZ) or 10(iSWAP) state
if params.native_gate == "CZ":
Expand All @@ -85,7 +85,9 @@ def _aquisition(
(ordered_pair[1], ordered_pair[0]),
start=sequence.finish + params.dt,
)

data.native_amplitude[ordered_pair] = getattr(
native_gate.coupler_pulses(*pair)[:1][0], "amplitude"
)
sequence.add(native_gate)

ro_pulse1 = platform.create_MZ_pulse(
Expand All @@ -101,6 +103,7 @@ def _aquisition(
Parameter.amplitude,
delta_amplitude_range,
pulses=[p for p in native_gate.coupler_pulses(*pair)][:1],
type=SweeperType.FACTOR,
)
sweeper_duration = Sweeper(
Parameter.duration,
Expand All @@ -125,7 +128,7 @@ def _aquisition(
ordered_pair[0],
ordered_pair[1],
delta_duration_range,
delta_amplitude_range,
delta_amplitude_range * data.native_amplitude[ordered_pair],
results[ordered_pair[0]].magnitude,
results[ordered_pair[1]].magnitude,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,16 +43,14 @@ def _acquisition(
# Coupler pulse while Drive pulse - MZ

if params.measured_qubits is None:
params.measured_qubits = [
order_pair(pair, platform.qubits)[0] for pair in targets
]
params.measured_qubits = [order_pair(pair, platform)[0] for pair in targets]

sequence = PulseSequence()
ro_pulses = {}
qd_pulses = {}
couplers = []
for i, pair in enumerate(targets):
ordered_pair = order_pair(pair, platform.qubits)
ordered_pair = order_pair(pair, platform)
measured_qubit = params.measured_qubits[i]

qubit = platform.qubits[measured_qubit].name
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,15 +39,13 @@ def _acquisition(
# Coupler pulse while MZ

if params.measured_qubits is None:
params.measured_qubits = [
order_pair(pair, platform.qubits)[0] for pair in targets
]
params.measured_qubits = [order_pair(pair, platform)[0] for pair in targets]

sequence = PulseSequence()
ro_pulses = {}
couplers = []
for i, pair in enumerate(targets):
ordered_pair = order_pair(pair, platform.qubits)
ordered_pair = order_pair(pair, platform)
measured_qubit = params.measured_qubits[i]

qubit = platform.qubits[measured_qubit].name
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ def _acquisition(
platform (Platform): Qibolab platform object.
qubits (dict): list of targets qubit pairs to perform the action.
"""
order_pairs = np.array([order_pair(pair, platform.qubits) for pair in targets])
order_pairs = np.array([order_pair(pair, platform) for pair in targets])
data = AvoidedCrossingData(qubit_pairs=order_pairs.tolist())
# Extract the qubits in the qubits pairs and evaluate their flux dep
unique_qubits = np.unique(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from .chevron import chevron
from .chsh import chsh_circuits, chsh_pulses
from .cz_virtualz import cz_virtualz
from .cz_virtualz_signal import cz_virtualz_signal
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,11 @@
class ChevronParameters(Parameters):
"""CzFluxTime runcard inputs."""

amplitude_min: float
amplitude_min_factor: float
"""Amplitude minimum."""
amplitude_max: float
amplitude_max_factor: float
"""Amplitude maximum."""
amplitude_step: float
amplitude_step_factor: float
"""Amplitude step."""
duration_min: float
"""Duration minimum."""
Expand All @@ -54,6 +54,9 @@ class ChevronResults(Results):
duration: dict[QubitPairId, int]
"""Virtual Z phase correction."""

def __contains__(self, key: QubitPairId):
return super().__contains__(key) | super().__contains__((key[1], key[0]))


ChevronType = np.dtype(
[
Expand All @@ -70,6 +73,10 @@ class ChevronResults(Results):
class ChevronData(Data):
"""Chevron acquisition outputs."""

native_amplitude: dict[QubitPairId, float] = field(default_factory=dict)
"""CZ platform amplitude for qubit pair."""
sweetspot: dict[QubitPairId, float] = field(default_factory=dict)
"""Sweetspot value for high frequency qubit."""
data: dict[QubitPairId, npt.NDArray[ChevronType]] = field(default_factory=dict)

def register_qubit(self, low_qubit, high_qubit, length, amp, prob_low, prob_high):
Expand Down Expand Up @@ -106,8 +113,9 @@ def _aquisition(
for pair in targets:
# order the qubits so that the low frequency one is the first
sequence = PulseSequence()
ordered_pair = order_pair(pair, platform.qubits)

ordered_pair = order_pair(pair, platform)
# initialize in system in 11 state
initialize_lowfreq = platform.create_RX_pulse(
ordered_pair[0], start=0, relative_phase=0
)
Expand Down Expand Up @@ -157,9 +165,9 @@ def _aquisition(

# define the parameter to sweep and its range:
delta_amplitude_range = np.arange(
params.amplitude_min,
params.amplitude_max,
params.amplitude_step,
params.amplitude_min_factor,
params.amplitude_max_factor,
params.amplitude_step_factor,
)
delta_duration_range = np.arange(
params.duration_min, params.duration_max, params.duration_step
Expand All @@ -169,8 +177,13 @@ def _aquisition(
Parameter.amplitude,
delta_amplitude_range,
pulses=[cz.get_qubit_pulses(ordered_pair[1]).qf_pulses[0]],
type=SweeperType.ABSOLUTE,
type=SweeperType.FACTOR,
)

data.native_amplitude[ordered_pair] = (
cz.get_qubit_pulses(ordered_pair[1]).qf_pulses[0].amplitude
)
data.sweetspot[ordered_pair] = platform.qubits[ordered_pair[1]].sweetspot
sweeper_duration = Sweeper(
Parameter.duration,
delta_duration_range,
Expand All @@ -191,7 +204,7 @@ def _aquisition(
ordered_pair[0],
ordered_pair[1],
delta_duration_range,
delta_amplitude_range,
delta_amplitude_range * data.native_amplitude[ordered_pair],
results[ordered_pair[0]].magnitude,
results[ordered_pair[1]].magnitude,
)
Expand Down Expand Up @@ -314,8 +327,12 @@ def _plot(data: ChevronData, fit: ChevronResults, target: QubitPairId):
fitting_report = table_html(
table_dict(
target[1],
["CZ amplitude", "CZ duration"], # Change name from the params
[fit.amplitude[target], fit.duration[target]],
["CZ amplitude", "CZ duration", "Bias point"],
[
fit.amplitude[target],
fit.duration[target],
fit.amplitude[target] + data.sweetspot[target],
],
)
)

Expand Down
Loading

0 comments on commit 8dd2e15

Please sign in to comment.