Qubit spectroscopy: Rabi measurement example¶
This notebook demonstrates how to perform a Rabi experiment on a simulated or real quantum device. This experiment tests the calibration of the RX
pulse by rotating through a full \(2\pi\) radians and evaluating the excited state visibility as a function of the angle of rotation, \(\theta\). The QUIL program for one data point for qubit 0 at, for example \(\theta=\pi/2\), is
DECLARE ro BIT[1]
X 0
RX(pi/2) 0
MEASURE 0 ro[0]
The X 0 is simply to initialize the state to \(|1\rangle\). We expect to see a characteristic “Rabi flop” by sweeping \(\theta\) over \([0, 2\pi)\), thereby completing a full rotation around the Bloch sphere. It should look like \(\dfrac{1-\cos(\theta)}{2}\)
setup
[1]:
from matplotlib import pyplot as plt
from pyquil.api import get_qc, QuantumComputer
from forest.benchmarking.qubit_spectroscopy import *
[2]:
#qc = get_qc('Aspen-1-15Q-A')
qc = get_qc('2q-noisy-qvm') # will run on a QVM, but not meaningfully
qubits = qc.qubits()
qubits
[2]:
[0, 1]
Generate simultaneous Rabi experiments on all qubits¶
[3]:
import numpy as np
from numpy import pi
angles = np.linspace(0, 2*pi, 15)
rabi_expts = generate_rabi_experiments(qubits, angles)
Acquire data¶
Collect our Rabi raw data using acquire_qubit_spectroscopy_data
.
[4]:
results = acquire_qubit_spectroscopy_data(qc, rabi_expts, num_shots=500)
Analyze and plot¶
Use the results to fit a Rabi curve and estimate parameters
In the cell below we first extract lists of expectations and std_errs from the results and store them separately by qubit. For each qubit we then fit to a sinusoid and evaluate the period (which should be \(2\pi\)). Finally we plot the Rabi flop.
[5]:
from forest.benchmarking.plotting import plot_figure_for_fit
stats_by_qubit = get_stats_by_qubit(results)
for q, stats in stats_by_qubit.items():
fit = fit_rabi_results(angles, stats['expectation'], stats['std_err'])
fig, axs = plot_figure_for_fit(fit, title=f'Q{q} Data and Fit', xlabel="RX angle [rad]",
ylabel=r"Pr($|1\rangle$)")
frequency = fit.params['frequency'].value # ratio of actual angle over intended control angle
amplitude = fit.params['amplitude'].value # (P(1 given 1) - P(1 given 0)) / 2
baseline = fit.params['baseline'].value # amplitude + p(1 given 0)
[ ]: