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)
../_images/examples_qubit_spectroscopy_rabi_9_0.png
../_images/examples_qubit_spectroscopy_rabi_9_1.png
[ ]: