Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Script to measure RB fidelity with flux induced noise and recalibration #975

Closed
wants to merge 13 commits into from
94 changes: 94 additions & 0 deletions runcards/rb_neldermead.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
import argparse

import numpy as np
from qibolab.qubits import QubitId
from scipy.optimize import minimize

from qibocal.auto.execute import Executor


def rb_infidelity(x, e, target):

# print(f'trying amplitude: {float(amplitude)}...\n')

amplitude = float(x[0])
drag_param = float(x[1])

e.platform.qubits[target].native_gates.RX.amplitude = float(amplitude)
e.platform.qubits[target].native_gates.RX.shape = f"Drag(5, {drag_param})"

rb_output = e.rb_ondevice(
apply_inverse=True,
delta_clifford=10,
max_circuit_depth=200,
n_avg=1,
num_of_sequences=10000,
save_sequences=False,
state_discrimination=True,
)

one_minus_p = 1 - rb_output.results.pars.get(target)[2]
r_c = one_minus_p * (1 - 1 / 2**1)
r_g = r_c / 1.875

if r_g < 1e-5:
r_g = 1e-2

print()
print()
print(f"trying amplitude: {float(amplitude)}...\n")
print(f"trying drag param: {float(drag_param)}...\n")
print(f" reached infidelity: {r_g}\n")
print()

return r_g


def main(targets: list[QubitId], platform_name: str, output: str):

with Executor.open(
"myexec",
path=output,
platform=platform_name,
targets=targets,
update=False,
force=True,
) as e:
platform = e.platform

amplitude0 = 0.040
drag_param0 = 0.05

bnds = [(0.03, 0.05), (-0.1, 0.1)]

x0 = np.array([amplitude0, drag_param0])

target = targets[0]

res = minimize(
rb_infidelity,
x0,
args=(e, target),
method="Nelder-Mead",
tol=1e-7,
bounds=bnds,
options={"maxfev": 50, "disp": True},
)

print(res)
print()
print(res.x)

# report(e.path, e.history)


if __name__ == "__main__":
parser = argparse.ArgumentParser("Qubit recalibration")
parser.add_argument("--platform", type=str, help="Qibo platform")
parser.add_argument("--output", type=str, help="Output folder")
parser.add_argument(
"--targets", nargs="+", help="Target qubit to recalibrate", required=True
)

args = parser.parse_args()
main(targets=args.targets, platform_name=args.platform, output=args.output)
139 changes: 139 additions & 0 deletions runcards/rb_noise.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
import argparse

from qibolab.qubits import QubitId

from qibocal.auto.execute import Executor
from qibocal.cli.report import report

# Change bias points here
# in this case I am addressing D1 and I am modifying the bias
# point of the D2 and D3
NEW_BIAS = {
"D2": -0.219,
"D3": -0.0074,
}


def main(targets: list[QubitId], platform_name: str, output: str):

with Executor.open(
"myexec",
path=output,
platform=platform_name,
targets=targets,
update=False,
force=True,
) as e:
platform = e.platform

# changing bias of neighbor qubit
for qubit, new_bias in NEW_BIAS.items():
e.platform.qubits[qubit].flux.offset = new_bias

rb_output = e.rb_ondevice(
apply_inverse=True,
delta_clifford=10,
max_circuit_depth=500,
n_avg=1,
num_of_sequences=10000,
save_sequences=True,
state_discrimination=True,
)

# qubit_spectroscopy_output = e.qubit_spectroscopy(
# freq_width=40_000_000,
# freq_step=500_000,
# drive_duration=2000,
# drive_amplitude=0.01,
# relaxation_time=5000,
# nshots=1024,
# )

# qubit_spectroscopy_output.update_platform(platform)

# rabi_output = e.rabi_amplitude_signal(
# min_amp_factor=0.1,
# max_amp_factor=2,
# step_amp_factor=0.03,
# pulse_length=40,
# )

# rabi_output.update_platform(platform)

# classification_output = e.single_shot_classification(
# nshots=5000,
# )

# classification_output.update_platform(platform)

# rabi_output = e.rabi_amplitude(
# min_amp_factor=0.1,
# max_amp_factor=2,
# step_amp_factor=0.03,
# pulse_length=40,
# )

# rabi_output.update_platform(platform)

ramsey = e.ramsey(
delay_between_pulses_start=10,
delay_between_pulses_end=1_000,
delay_between_pulses_step=10,
detuning=5_000_000,
)

ramsey.update_platform(platform)

ramsey = e.ramsey(
delay_between_pulses_start=10,
delay_between_pulses_end=1_000,
delay_between_pulses_step=10,
detuning=5_000_000,
)

ramsey.update_platform(platform)

classification_output = e.single_shot_classification(
nshots=5000,
)

classification_output.update_platform(platform)

rabi_output = e.rabi_amplitude(
min_amp_factor=0.1,
max_amp_factor=2,
step_amp_factor=0.03,
pulse_length=40,
)

rabi_output.update_platform(platform)

classification_output = e.single_shot_classification(
nshots=5000,
)

classification_output.update_platform(platform)

rb_output = e.rb_ondevice(
apply_inverse=True,
delta_clifford=10,
max_circuit_depth=500,
n_avg=1,
num_of_sequences=10000,
save_sequences=True,
state_discrimination=True,
)

report(e.path, e.history)


if __name__ == "__main__":
parser = argparse.ArgumentParser("Qubit recalibration")
parser.add_argument("--platform", type=str, help="Qibo platform")
parser.add_argument("--output", type=str, help="Output folder")
parser.add_argument(
"--targets", nargs="+", help="Target qubit to recalibrate", required=True
)

args = parser.parse_args()
main(targets=args.targets, platform_name=args.platform, output=args.output)
2 changes: 1 addition & 1 deletion src/qibocal/auto/operation.py
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ def load_data(path: Path, filename: str):
"""Load data stored in a npz file."""
file = path / f"{filename}.npz"
if file.is_file():
raw_data_dict = dict(np.load(file))
raw_data_dict = dict(np.load(file, allow_pickle=True))
data_dict = {}

for data_key, array in raw_data_dict.items():
Expand Down
19 changes: 11 additions & 8 deletions src/qibocal/cli/report.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,14 +44,17 @@ def plotter(
completed node on specific target.
"""
figures, fitting_report = generate_figures_and_report(node, target)
buffer = io.StringIO()
html_list = []
for figure in figures:
figure.write_html(buffer, include_plotlyjs=False, full_html=False)
buffer.seek(0)
html_list.append(buffer.read())
buffer.close()
all_html = "".join(html_list)
if isinstance(figures[0], str):
all_html = "".join(figures)
else:
buffer = io.StringIO()
html_list = []
for figure in figures:
figure.write_html(buffer, include_plotlyjs=False, full_html=False)
buffer.seek(0)
html_list.append(buffer.read())
buffer.close()
all_html = "".join(html_list)
return all_html, fitting_report


Expand Down
2 changes: 2 additions & 0 deletions src/qibocal/protocols/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
from .flux_dependence.qubit_flux_tracking import qubit_flux_tracking
from .flux_dependence.resonator_crosstalk import resonator_crosstalk
from .flux_dependence.resonator_flux_dependence import resonator_flux
from .qua import rb_ondevice
from .qubit_power_spectroscopy import qubit_power_spectroscopy
from .qubit_spectroscopy import qubit_spectroscopy
from .qubit_spectroscopy_ef import qubit_spectroscopy_ef
Expand Down Expand Up @@ -146,6 +147,7 @@
"rabi_length_frequency",
"rabi_length_frequency_signal",
"standard_rb_2q",
"rb_ondevice",
"standard_rb_2q_inter",
"optimize_two_qubit_gate",
]
1 change: 1 addition & 0 deletions src/qibocal/protocols/qua/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from .rb_ondevice import rb_ondevice
Loading
Loading