Skip to content

Instantly share code, notes, and snippets.

@karalekas
Last active May 6, 2020 19:41
Show Gist options
  • Save karalekas/c63b0bb24f15109f1921cea5966ca518 to your computer and use it in GitHub Desktop.
Save karalekas/c63b0bb24f15109f1921cea5966ca518 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Max-Cut QAOA on QCS\n",
"\n",
"In this notebook, we will walk through how to run the **Max-Cut QAOA** algorithm on the QPU and QVM. With **Parametric Compilation** and **Active Reset** enabled in QCS, we are able to achieve a **speedup of more than an order of magnitude** over web API offerings. The example below runs in less than a minute, as compared to more than 15 minutes using a web API. \n",
"\n",
"**NOTE**: This notebook depends on `pyquil >= 2.3.0`, `matplotlib`, and `tqdm`, which come preinstalled on all new QMIs."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"from typing import List, Tuple\n",
"\n",
"import networkx as nx\n",
"import numpy as np\n",
"from pyquil import get_qc, Program"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Generate Random Weighted Graph\n",
"\n",
"Given a list of edges, we generate a graph with random edge weights in the range \\[-1,1)."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"def generate_ising_graph(edges: List[Tuple[int, int]], seed: int) -> nx.Graph:\n",
" np.random.seed(seed)\n",
" graph = nx.from_edgelist(edges)\n",
" weights: np.ndarray = 2.0 * np.random.rand(graph.number_of_edges()) - 1.0\n",
" weights /= np.linalg.norm(weights)\n",
" nx.set_edge_attributes(graph, {e: {'w': w} for e, w in zip(graph.edges, weights)})\n",
" return graph"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Compute Bitstring Cut Weight\n",
"\n",
"Given a graph and a bitstring, compute the [cut weight](https://en.wikipedia.org/wiki/Maximum_cut), which determines the cost of the particular bitstring."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"def bitstring_cut_weight(b: List[List[int]], graph: nx.Graph) -> dict:\n",
" cost = 0\n",
" inverse_map = {qubit: idx for idx, qubit in enumerate(list(graph.nodes))}\n",
" for q0, q1 in graph.edges():\n",
" cost += graph.get_edge_data(q0, q1)['w'] * (-1) ** int(b[inverse_map[q0]] != b[inverse_map[q1]])\n",
" return cost"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Create QAOA Max-Cut Program\n",
"\n",
"For our problem graph, we generate the [QAOA](https://arxiv.org/abs/1411.4028) cost and driver unitaries:\n",
"\n",
"$$H_c = \\sum_{i,j} w_{i,j} \\sigma_i^z \\sigma_j^z \\qquad H_d = \\sum_i \\sigma_i^x$$\n",
"\n",
"From these, we create our Quil program, using the [`exponential_map`](http://docs.rigetti.com/en/stable/advanced_usage.html#pauli-operator-algebra) function in pyQuil. As in the previous notebooks, we use the `RESET` instruction to enable **Active Reset** in our program, and declare our \"beta\" (β) and \"gamma\" (𝛾) values as parameters to leverage the **Parametric Compilation** feature. At the end of the program, we measure all qubits into the readout registers."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"from pyquil.gates import H, MEASURE, RESET\n",
"from pyquil.paulis import exponential_map, PauliSum, sX, sZ\n",
"\n",
"def maxcut_qaoa_program(graph: nx.Graph) -> Program:\n",
" cost_ham = PauliSum([sZ(i) * sZ(j) * graph.get_edge_data(i, j)['w'] for i, j in graph.edges])\n",
" driver_ham = PauliSum([sX(i) for i in graph.nodes])\n",
"\n",
" p = Program(RESET())\n",
" beta = p.declare('beta', 'REAL')\n",
" gamma = p.declare('gamma', 'REAL')\n",
" ro = p.declare('ro', 'BIT', len(graph.nodes))\n",
"\n",
" p.inst(H(qubit) for qubit in list(graph.nodes))\n",
" p.inst(exponential_map(term)(gamma) for term in cost_ham)\n",
" p.inst(exponential_map(term)(beta) for term in driver_ham)\n",
"\n",
" p.inst(MEASURE(qubit, ro[idx]) for idx, qubit in enumerate(list(graph.nodes)))\n",
" return p"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Run the Landscape\n",
"\n",
"Given a list of edges and a QPU- or QVM-backed `QuantumComputer` object, generate the Max-Cut QAOA program, compile it to a parametric binary, and rapidly iterate through the landscape of (β, 𝛾). For each job, we compute the average cost, which will become the $z$-axis of the landscape."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"import itertools\n",
"from tqdm import tqdm\n",
"from pyquil.api import QPU, QuantumComputer\n",
"\n",
"def run_maxcut_qaoa_landscape(qc: QuantumComputer, edges: List[Tuple[int, int]], width: int,\n",
" shots: int = 1000, seed: int = 19120623) -> np.ndarray:\n",
" qc.reset()\n",
" graph = generate_ising_graph(edges, seed)\n",
" p = maxcut_qaoa_program(graph)\n",
" p.wrap_in_numshots_loop(shots)\n",
" binary = qc.compile(p) if isinstance(qc.qam, QPU) else p\n",
"\n",
" costs = []\n",
" angle_range = np.linspace(0, np.pi, width)\n",
" landscape = list(itertools.product(angle_range, angle_range))\n",
" for beta, gamma in tqdm(landscape):\n",
" bitstrings = qc.run(binary, memory_map={'beta': [beta], 'gamma': [gamma]})\n",
" costs.append(np.mean([bitstring_cut_weight(list(b), graph) for b in bitstrings]))\n",
"\n",
" return np.array(costs).reshape(width, width)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Plot the Landscape\n",
"\n",
"Given results from running QAOA, plot the landscape and the max cost value (shown as a red dot)."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"def plot_landscape(landscape: np.ndarray, *, device: str, edges: List[Tuple[int, int]],\n",
" width: int, shots: int):\n",
" max_x, max_y = (np.argmax(landscape) % width, np.argmax(landscape) // width)\n",
" plt.imshow(landscape, extent=[0, np.pi, np.pi, 0])\n",
" plt.plot((max_x + 0.5) * np.pi / width, (max_y + 0.5) * np.pi / width, 'ro')\n",
" plt.colorbar()\n",
" plt.xlabel('gamma (radians)')\n",
" plt.ylabel('beta (radians)')\n",
" plt.title(f'Max-Cut QAOA Landscape\\n{device}\\n{edges}\\nwidth = {width} shots = {shots}')\n",
" plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Device Information\n",
"\n",
"As in the **Parametric Compilation** and **Active Qubit Reset** notebooks, we must start by setting up the device or devices that we want to run on. In this notebook, we want to execute our algorithm on both the QPU and the QVM, and compare our results. We will use the `Aspen-3-3Q-B` lattice for the [QPU](https://www.rigetti.com/qpu) and a generic `3q-qvm` for our simulator. The `qvm` is our Quantum Virtual Machine, and is also available as part of the downloadable [Forest SDK](https://www.rigetti.com/forest). \n",
"\n",
"**NOTE**: When running this notebook, you may need to edit the entries to `get_qc` in the following cell and the `edges` entry in the cell after, depending on what QPU lattice you have booked. And remember that this code will only work from within the QMI!"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"qpu = get_qc('Aspen-3-3Q-B') # edit as necessary\n",
"qvm = get_qc('3q-qvm') # edit as necessary"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Landscape Information\n",
"\n",
"In addition to providing the device that we want to run on, we need to provide some more information to build our QAOA landscape. The `width` parameter sets the resolution of the landscape—the width squared is the number of jobs we will run. The `shots` parameter specifies how many repetitions to perform for each (β, 𝛾) angle pair. The `seed` parameter is used when randomly generating the edge weights of our graph, and we can reproduce the same graph by keeping the seed constant. Finally, the `edges` specify the qubits and the topology of the graph that we will run QAOA on. For this example, we use a line graph, but you can create more interesting topologies by changing the edge list."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"width = 25\n",
"shots = 1000\n",
"seed = 19120623\n",
"edges = [(1, 2), (2, 3)] # edit as necessary"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Run and Plot on QPU and QVM\n",
"\n",
"We run the QAOA algorithm on the QPU and the QVM, comparing the max value of each landscape, which should be nearly the same. Small differences can be attributed to gate infidelity and decoherence, and larger ones can come from the presence of more than one \"peak\" in the landscape (as seen by the presence of multiple yellow blobs). We can also see that for this 3Q instance that the QVM outperforms the QPU in terms of total execution time. However, for larger numbers of qubits, the QPU quickly becomes much more efficient at completing the grid search."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 625/625 [00:50<00:00, 12.47it/s]\n",
"100%|██████████| 625/625 [00:26<00:00, 23.72it/s]\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"landscape_qpu = run_maxcut_qaoa_landscape(qpu, edges, width, shots, seed)\n",
"landscape_qvm = run_maxcut_qaoa_landscape(qvm, edges, width, shots, seed)\n",
"plot_landscape(landscape_qpu, device=qpu.name, edges=edges, width=width, shots=shots)\n",
"plot_landscape(landscape_qvm, device=qvm.name, edges=edges, width=width, shots=shots)"
]
}
],
"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
}
@mrosenkranz
Copy link

Hi, I believe the labels on the plots are the wrong way around (gamma <-> beta).

I noticed when I sampled approximate solutions with the (supposedly) optimal beta, gamma indicated on the plots, which didn't correspond to optimal cuts.

@karalekas
Copy link
Author

Hi @mrosenkranz, thanks for the feedback! That's certainly possible, I sometimes get turned around a bit using imshow. I'll take a look soon, and update the notebook as necessary.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment