Skip to content

Commit

Permalink
fix: Update pulse integration tests for Ankaa-2 device (#1035)
Browse files Browse the repository at this point in the history
  • Loading branch information
rmshaffer authored Sep 27, 2024
1 parent b076fda commit 71dc33b
Showing 1 changed file with 28 additions and 35 deletions.
63 changes: 28 additions & 35 deletions test/integ_tests/test_pulse.py
Original file line number Diff line number Diff line change
Expand Up @@ -174,38 +174,30 @@ def h_gate(q0):
return Circuit().rz(q0, np.pi).rx(q0, np.pi / 2).rz(q0, np.pi / 2).rx(q0, -np.pi / 2)


def cz_pulse(
def make_pulse(
q0: str,
q1: str,
shift_phases_q0: float,
shift_phases_q1: float,
waveform: ArbitraryWaveform,
device: AwsDevice,
):
q0_rf_frame = device.frames[f"q{q0}_rf_frame"]
q1_rf_frame = device.frames[f"q{q1}_rf_frame"]
q0_q1_cz_frame = device.frames[f"q{q0}_q{q1}_cz_frame"]
frames = [q0_rf_frame, q1_rf_frame, q0_q1_cz_frame]
q0_drive_frame = device.frames[f"Transmon_{q0}_charge_tx"]
q1_drive_frame = device.frames[f"Transmon_{q1}_charge_tx"]
frames = [q0_drive_frame, q1_drive_frame]

dt = device.properties.pulse.ports[q0_q1_cz_frame.port.id].dt
dt = device.properties.pulse.ports[q0_drive_frame.port.id].dt
wfm_duration = len(waveform.amplitudes) * dt

pulse_sequence = (
PulseSequence()
.barrier(frames)
.play(q0_q1_cz_frame, waveform)
.delay(q0_rf_frame, wfm_duration)
.shift_phase(q0_rf_frame, shift_phases_q0)
.delay(q1_rf_frame, wfm_duration)
.shift_phase(q1_rf_frame, shift_phases_q1)
.delay(q0_drive_frame, wfm_duration)
.shift_phase(q0_drive_frame, shift_phases_q0)
.delay(q1_drive_frame, wfm_duration)
.shift_phase(q1_drive_frame, shift_phases_q1)
.barrier(frames)
)
for phase, q in [(shift_phases_q0 * 0.5, q0), (-shift_phases_q1 * 0.5, q1)]:
for neighbor in device.properties.paradigm.connectivity.connectivityGraph[str(q)]:
xy_frame_name = f"q{min(q, int(neighbor))}_q{max(q, int(neighbor))}_xy_frame"
if xy_frame_name in device.frames:
xy_frame = device.frames[xy_frame_name]
pulse_sequence.shift_phase(xy_frame, phase)
return pulse_sequence


Expand All @@ -216,17 +208,17 @@ def test_pulse_bell(arbitrary_waveform, device):
a,
b,
) = (
10,
113,
26,
33,
) # qubits used
p0, p1 = 1.1733407221086924, 6.269846678712192
theta_0, theta_1 = FreeParameter("theta_0"), FreeParameter("theta_1")
a_b_cz_waveform = arbitrary_waveform
cz = cz_pulse(a, b, theta_0, theta_1, a_b_cz_waveform, device)
a_b_waveform = arbitrary_waveform
pulse = make_pulse(a, b, theta_0, theta_1, a_b_waveform, device)

bell_pair_with_gates = Circuit().h(a).h(b).cz(a, b).h(b)
bell_pair_with_gates = Circuit().h(a).h(b).iswap(a, b).h(b)
bell_pair_with_pulses_unbound = (
h_gate(a) + h_gate(b) + Circuit().pulse_gate([a, b], cz) + h_gate(b)
h_gate(a) + h_gate(b) + Circuit().pulse_gate([a, b], pulse) + h_gate(b)
)
bell_pair_with_pulses = bell_pair_with_pulses_unbound(theta_0=p0, theta_1=p1)

Expand Down Expand Up @@ -266,27 +258,27 @@ def test_pulse_sequence(arbitrary_waveform, device):
a,
b,
) = (
10,
113,
26,
33,
) # qubits used
p0, p1 = 1.1733407221086924, 6.269846678712192
theta_0, theta_1 = FreeParameter("theta_0"), FreeParameter("theta_1")
a_b_cz_waveform = arbitrary_waveform
a_b_waveform = arbitrary_waveform

cz_with_pulses_unbound = cz_pulse(a, b, theta_0, theta_1, a_b_cz_waveform, device)
pulse_unbound = make_pulse(a, b, theta_0, theta_1, a_b_waveform, device)

q0_readout_frame = device.frames[f"q{a}_ro_rx_frame"]
q1_readout_frame = device.frames[f"q{b}_ro_rx_frame"]
cz_with_pulses = (
cz_with_pulses_unbound(theta_0=p0, theta_1=p1)
q0_readout_frame = device.frames[f"Transmon_{a}_readout_rx"]
q1_readout_frame = device.frames[f"Transmon_{b}_readout_rx"]
pulses = (
pulse_unbound(theta_0=p0, theta_1=p1)
.capture_v0(q0_readout_frame)
.capture_v0(q1_readout_frame)
)
cz_with_gates = Circuit().cz(a, b)
circuit_with_gates = Circuit().iswap(a, b)

num_shots = 1000
gate_task = device.run(cz_with_gates, shots=num_shots, disable_qubit_rewiring=True)
pulse_task = device.run(cz_with_pulses, shots=num_shots)
gate_task = device.run(circuit_with_gates, shots=num_shots, disable_qubit_rewiring=True)
pulse_task = device.run(pulses, shots=num_shots)

if not device.is_available:
try:
Expand All @@ -313,12 +305,13 @@ def test_pulse_sequence(arbitrary_waveform, device):
assert chi_squared < 10 # adjust this threshold if test is flaky


@pytest.mark.skip(reason="needs to be updated to work correctly on Ankaa-2")
def test_gate_calibration_run(device, pulse_sequence):
if device.status == "OFFLINE":
pytest.skip("Device offline")
user_gate_calibrations = GateCalibrations({(Gate.Rx(math.pi / 2), QubitSet(0)): pulse_sequence})
num_shots = 50
bell_circuit = Circuit().rx(0, math.pi / 2).rx(1, math.pi / 2).cz(0, 1).rx(1, -math.pi / 2)
bell_circuit = Circuit().rx(0, math.pi / 2).rx(1, math.pi / 2).iswap(0, 1).rx(1, -math.pi / 2)
user_calibration_task = device.run(
bell_circuit,
gate_definitions=user_gate_calibrations.pulse_sequences,
Expand Down

0 comments on commit 71dc33b

Please sign in to comment.