Skip to content

Instantly share code, notes, and snippets.

@karalekas
Last active January 31, 2019 00:25
Show Gist options
  • Save karalekas/e6546ea3bcbb36dc7a2efd53497ee1a2 to your computer and use it in GitHub Desktop.
Save karalekas/e6546ea3bcbb36dc7a2efd53497ee1a2 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Parametric Compilation on QCS"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In this notebook, we will walk through how to use **Parametric Compilation** to efficiently execute a collection of Quil programs on the QPU. Although we use a toy example in this notebook, the principles here can be extended to rapidly iterate through real-world applications such as optimizing a variational quantum algorithm (as we will do in the **Max-Cut QAOA** notebook).\n",
"\n",
"**NOTE**: This notebook depends on `pyquil >= 2.3.0` and `matplotlib`, which come preinstalled on all new QMIs."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"from pyquil import get_qc, Program\n",
"from pyquil.gates import MEASURE, RX"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Get Started\n",
"\n",
"Before running on the QPU, users must book a block of time on a lattice using the QCS command-line interface. To determine the lattices that are available for booking, you can run `qcs lattices` from within the QMI. For our [Aspen QPUs](https://www.rigetti.com/qpu), one of the currently available 8-qubit lattices is `Aspen-1-8Q-B`. Once your QPU time has started (which we call being \"QPU-engaged\"), you must then set up the `QuantumComputer` object associated with the booked lattice, which we do in the following cell.\n",
"\n",
"**NOTE**: When running this notebook, you will need to edit the `lattice` and `qubits` entries in the following cell to match whatever QPU lattice you end up booking. And remember that this code will only work from within the QMI!"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"All qubits on Aspen-1-8Q-B: [1, 10, 11, 13, 14, 15, 16, 17]\n",
"\n",
"Selected qubit: 17\n"
]
}
],
"source": [
"lattice = 'Aspen-1-8Q-B' # edit as necessary\n",
"qpu = get_qc(lattice)\n",
"qubit = qpu.device.qubits()[-1] # edit as necessary\n",
"print(f'All qubits on {lattice}: {qpu.device.qubits()}')\n",
"print(f'\\nSelected qubit: {qubit}')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Declare Parameters\n",
"\n",
"Users can now define regions of the classical shared memory (using the `DECLARE` syntax) that can then be used in quantum gates. Declared parameters take a name, type, and length. For float-valued parameters, such as the argument for gates like `RX`/`RY`/`RZ`, we use the `REAL` type. When declaring the block of memory for reading out the measurement results of the program, we use the `BIT` type, as these results are either 0 or 1. In the next cell we initialize a `Program` that has two declared parameters."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"program = Program()\n",
"theta = program.declare('theta', 'REAL', 1)\n",
"ro = program.declare('ro', 'BIT', 1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Define Gates\n",
"\n",
"Next we will add an `RX` gate that uses the declared \"theta\" parameter. The argument provided to the `RX` gate says how much we want to rotate the qubit state around the _x_-axis of the Bloch sphere. The argument is interpreted as an angle in radians—0 means no rotation and 2π means a full rotation around the axis. After the `RX` gate, we then add a `MEASURE` that uses the declared \"ro\" parameter. This gate measures the state of a single qubit, putting a bit value in the readout register (provided to the gate as the \"ro\" parameter). Finally, we specify the number of shots we want to run per program. The program may not produce deterministic outcomes, so we accumulate statistics with many repetitions (which we call shots)."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<pyquil.quil.Program at 0x7f51995e4080>"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"program.inst(RX(theta, qubit))\n",
"program.inst(MEASURE(qubit, ro))\n",
"program.wrap_in_numshots_loop(1000)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Compile to Parametric Binary\n",
"\n",
"After building our Quil program, we then perform parametric compilation to produce binaries that will be loaded onto the instruments that control the QPU. The `compile` method has two stages: `quil_to_native_quil` and `native_quil_to_binary`.\n",
"\n",
"In general, programs written in Quil are not directly implementable on our devices. Fortunately, due to the underlying mathematical nature of quantum programs, arbitrary Quil can be compiled into a much smaller set of quantum instructions, referred to as **native Quil**. This stage of compilation is performed using `quilc`, which is also part of the downloadable [Forest SDK](https://www.rigetti.com/forest).\n",
"\n",
"The second stage of compilation takes native Quil (which for our architecture, is composed of only the `CZ`, `RX`, and `RZ` gates plus `MEASURE`) and converts it into a collection of instrument binaries. For programs that have declared parameters, we refer to these binaries as parametric binaries, as the values (arguments) for their parameters are set at **run-time** rather than **compile-time**."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"binary = qpu.compile(program)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Execute on the QPU\n",
"\n",
"Once we have our parametric binary, we are ready to run on the QPU. As you will see, we only have to compile once, and can rapidly iterate through many values of \"theta\". We begin by defining the range of angles that we want to sweep over. Then, we execute the parametric binary on the QPU, providing the \"theta\" argument at run-time using the `memory_map` keyword argument to the `run` method. The memory map is a dictionary with strings as keys and lists as values (remember the parameters have a size, so for our \"theta\" parameter we use a list of length 1). Finally, we average over the number of shots to produce a single excited state visibility value for each value of \"theta\"."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"sweep = np.linspace(start=0, stop=4 * np.pi, num=50)\n",
"\n",
"visibilities = []\n",
"for angle in sweep:\n",
" job_results = qpu.run(binary, memory_map={'theta': [angle]})\n",
" visibilities.append(np.mean(job_results))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Plot the Results\n",
"\n",
"Lastly, we take the results from the various jobs and plot them as a function of \"theta\". We expect to see a sinusoidal curve that shows us moving around the Bloch sphere from the |0⟩ state to the |1⟩ state and back."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.plot(sweep, visibilities)\n",
"plt.ylim(0, 1)\n",
"plt.title('Circling the Bloch Sphere')\n",
"plt.ylabel('Excited State Visibility')\n",
"plt.xlabel('Theta (radians)')\n",
"plt.show()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment