{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Simulating Clifford randomized benchmarking using implicit models\n", "\n", "This tutorial demonstrates shows how to simulate Clifford RB sequences using $n$-qubit \"implicit\" models which build $n$-qubit process matrices from smaller building blocks. This restricts the noise allowed in the $n$-qubit model; in this tutorial we take $n=3$ and use a `LocalNoiseModel`." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pygsti\n", "import numpy as np\n", "\n", "from pygsti.processors import QubitProcessorSpec\n", "from pygsti.processors import CliffordCompilationRules as CCR" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Get some CRB circuits\n", "\n", "First, we follow the [Clifford RB](../CliffordRB.ipynb) tutorial to generate a set of sequences. If you want to perform Direct RB instead, just replace this cell with the contents of the [Direct RB](../DirectRB.ipynb) tutorial up until the point where it creates `circuitlist`:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "- Sampling 10 circuits at CRB length 0 (1 of 6 depths) with seed 784558\n", "- Sampling 10 circuits at CRB length 1 (2 of 6 depths) with seed 784568\n", "- Sampling 10 circuits at CRB length 2 (3 of 6 depths) with seed 784578\n", "- Sampling 10 circuits at CRB length 4 (4 of 6 depths) with seed 784588\n", "- Sampling 10 circuits at CRB length 8 (5 of 6 depths) with seed 784598\n", "- Sampling 10 circuits at CRB length 16 (6 of 6 depths) with seed 784608\n" ] } ], "source": [ "#Specify the device to be benchmarked - in this case 2 qubits\n", "n_qubits = 3\n", "qubit_labels = list(range(n_qubits)) \n", "gate_names = ['Gxpi2', 'Gypi2','Gcphase'] \n", "availability = {'Gcphase':[(i,i+1) for i in range(n_qubits-1)]}\n", "pspec = QubitProcessorSpec(n_qubits, gate_names, availability=availability, \n", " qubit_labels=qubit_labels)\n", "\n", "compilations = {'absolute': CCR.create_standard(pspec, 'absolute', ('paulis', '1Qcliffords'), verbosity=0), \n", " 'paulieq': CCR.create_standard(pspec, 'paulieq', ('1Qcliffords', 'allcnots'), verbosity=0)}\n", "\n", "#Specify RB parameters (k = number of repetitions at each length)\n", "lengths = [0,1,2,4,8,16]\n", "k = 10\n", "subsetQs = qubit_labels\n", "randomizeout = False # ==> all circuits have the *same* ideal outcome (the all-zeros bitstring)\n", "\n", "#Generate clifford RB circuits\n", "exp_design = pygsti.protocols.CliffordRBDesign(pspec, compilations, lengths, k,\n", " qubit_labels=subsetQs, randomizeout=randomizeout)\n", "\n", "#Collect all the circuits into one list:\n", "circuitlist = exp_design.all_circuits_needing_data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Create a model to simulate these circuits\n", "Now we need to create a model that can simulate circuits like this. The RB circuits use pyGSTi's \"multi-qubit\" conventions, which mean:\n", "1. RB circuits use our \"multi-qubit\" gate naming, so you have gates like `Gxpi2:0` and `Gcphase:0:1`.\n", "2. RB circuits do gates in parallel (this only matters for >1 qubits), so you have layers like `[Gypi2:0Gypi2:1]`\n", "\n", "\"Implicit\" models in pyGSTi (see the [implicit model tutorial](../../objects/ImplicitModel.ipynb)) are designed to efficiently describe multi-qubit processors. There are numerous ways of constructing implicit models, all of which can simulate the type of circuits described above. Here we'll demonstrate the simplest type: a \"local noise model\" (class `LocalNoiseModel`) where the noise on a gate can only act on that gate's target qubits - so, for instance, 1-qubit gates are still given by 1-qubit operators, not $n$-qubit ones.\n", "\n", "One of the easiest ways to construct a `LocalNoiseModel` is to use the `create_crosstalk_free_model` function, which takes our `QubitProcessorSpec` and other optional kwargs." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "myModel = pygsti.models.create_crosstalk_free_model(pspec, ideal_gate_type='full')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Setting `ideal_gate_type=\"full\"` is important, as it lets us assign arbitrary numpy arrays to gates as we'll show below. If you need to use other gates that aren't built into pyGSTi, you can use the `nonstd_gate_unitaries`\n", "argument of `from_parameterization` (see the docstring).\n", "\n", "The `from_parameterization` function creates a model with ideal (perfect) gates. We'll now create a 1-qubit depolarization superoperator, and a corresponding 2-qubit one (just the tensor product of two 1-qubit ones) to add some simple noise. " ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "depol1Q = np.array([[1, 0, 0, 0],\n", " [0, 0.99, 0, 0],\n", " [0, 0, 0.99, 0],\n", " [0, 0, 0, 0.99]], 'd') # 1-qubit depolarizing operator\n", "depol2Q = np.kron(depol1Q,depol1Q)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As detailed in the [implicit model tutorial](../../objects/ImplicitModel.ipynb), the gate operations of a `LocalNoiseModel` are held in its `.operation_blks['gates']` dictionary. We'll alter these by assigning new process matrices to each gate. In this case, it will be just a depolarized version of the original gate." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "myModel.operation_blks['gates'][\"Gxpi2\"] = np.dot(depol1Q, myModel.operation_blks['gates'][\"Gxpi2\"])\n", "myModel.operation_blks['gates'][\"Gypi2\"] = np.dot(depol1Q, myModel.operation_blks['gates'][\"Gypi2\"]) \n", "myModel.operation_blks['gates'][\"Gcphase\"] = np.dot(depol2Q, myModel.operation_blks['gates'][\"Gcphase\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here's what the gates look like now:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "FullArbitraryOp with shape (4, 4)\n", " 1.00 0 0 0\n", " 0 0.99 0 0\n", " 0 0 0-0.99\n", " 0 0 0.99 0\n", "\n", "FullArbitraryOp with shape (4, 4)\n", " 1.00 0 0 0\n", " 0 0 0 0.99\n", " 0 0 0.99 0\n", " 0-0.99 0 0\n", "\n", "FullArbitraryOp with shape (16, 16)\n", " 1.00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0.99 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.99 0\n", " 0 0 0 0.99 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0.99 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0.98 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0-0.98 0 0 0 0 0 0\n", " 0 0 0 0 0.98 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0.99 0 0 0 0\n", " 0 0 0 0 0 0-0.98 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0.98 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0.98 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0.99 0 0 0\n", " 0 0.98 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0.98 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.98\n", "\n" ] } ], "source": [ "print(myModel.operation_blks['gates'][\"Gxpi2\"])\n", "print(myModel.operation_blks['gates'][\"Gypi2\"])\n", "print(myModel.operation_blks['gates'][\"Gcphase\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now that our `Model` object is set to go, generating simulated data is easy:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "ds = pygsti.data.simulate_data(myModel, circuitlist, 100, seed=1234)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Running RB on the simulated `DataSet`\n", "To run an RB analysis, we just package up the experiment design and data set into a `ProtocolData` object and give this to a `RB` protocol's `run` method. This returns a `RandomizedBenchmarkingResults` object that can be used to plot the RB decay curve. (See the [RB analysis tutorial](../RBAnalysis.ipynb) for more details.)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "data = pygsti.protocols.ProtocolData(exp_design, ds)\n", "results = pygsti.protocols.RB().run(data)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAe4AAAFACAYAAAB6AZ/IAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAABNPUlEQVR4nO3dd5xU1d348c+9U7bD0otUKUdQQSyhhFhjREyiwYa9hmD0yaOkiP6MJYkae4wdy2Mi0TyiaHxiNEYwGkGNKCoWDkIERPrCLmyZdu/9/XFn19ndKXd3Z3Z3dr9vXvOamdvmzM6y3zntewzHcRBCCCFEfjA7ugBCCCGE8E4CtxBCCJFHJHALIYQQeUQCtxBCCJFHJHALIYQQeUQCtxBCCJFH/B1dAC8mT57s7LPPPh1dDCGEEKJdfPLJJzu11v2S7cuLwL3PPvuwePHiji6GEEII0S6UUhtS7ZOmciGEECKPSOAWQggh8ogEbiGEECKP5EUftxBCtEU0GmXTpk2EQqGOLooQjRQWFjJkyBACgYDncyRwCyG6vE2bNlFWVsaIESMwDKOjiyMEAI7jUFFRwaZNmxg5cqTn86SpXAjR5YVCIfr06SNBW3QqhmHQp0+fFrcESeAWQnQLErRFZ9Sa30sJ3EII0Y4efvhhpk+fTjgc7uiidHnnnHMO69at83Ts/PnzeeONNxpt27FjB9dffz0ARx99NOFwmAULFvDRRx8RDodZtGgRAIsXL2bJkiVZLXs6EriFEKKJ51d+xTd/u5SR81/km79dyvMrv8ratV944QVmzpzJiy++mLVritzo169fQ+CuN2fOHCZMmMCOHTsaAvesWbM45phj2q1cMjhNCCESPL/yK65avIq6qAXAV5V1XLV4FQAnTWpb6uV33nmHYcOGMXv2bH7+858zfvx4brzxRp544gkAfvSjH/Hf//3fVFdXc9ddd+Hz+Rg6dCi/+tWv+L//+z+effZZbNvmJz/5CevWreOVV16hrq6OXr16ce+992LbNr/4xS/Yvn07gwYN4t133+XNN99Ea81vfvMbAMrLy7npppsoKytrKNd7773HLbfcgt/vp6ioiLvvvptXXnmF//znP/zsZz8jHA5z/PHHs3TpUj788ENuuukmbNtmwIAB3H777Witm23bsGFDs9eMRqNcfvnlOI5DOBzmhhtuYN999214z3V1dVxxxRVMnz690c/swQcfxDRNduzYwemnn85ZZ53FOeecQ+/evamqqmLBggVcffXVbNq0CcuyuOCCC5g5cyYAv//979m9ezfBYJBbb72Vnj17cu2117J161a2b9/O0UcfzRVXXAHAk08+yaOPPoplWdx44434fD7mzZvH008/3VCe+fPnM3PmTF555RXWrl3Lvffei+M49O3blzPOOIM77riDFStWYNs2559/Pscffzx/+tOfeP755zFNkwMPPJBrrrmmTb9HErhTiFpRYnYs6b4CfwGmIY0VQnRFt/1dNwTtenVRi9v+rtscuBctWsSpp57KvvvuSzAYJBwOE4lE+OqrrwgEAuzevZtx48YxY8YMnnzySfr06cPvfvc7nnvuOfx+Pz169OCBBx7Atm3ee+89Hn/8cUzT5KKLLmLVqlV8/PHHDBkyhN///vesW7eO7373uwD88pe/5KabbmL06NEsWrSIRx55pCFYAbz66qscf/zxnHfeeSxdupQ9e/akfA/XXnstd955J6NGjWLRokWsW7cu6bYbbrih2WtOmjSJ8vJybr31VtauXUttbS0bN26ksrKSRx55hIqKCtavX9/sNbdt28bzzz+Pbdt873vfY8aMGQB897vf5dhjj2XhwoX07t2b22+/nerqambNmsWUKVMA+M53vsMJJ5zAn/70Jx566CHOOeccDjroIE499VTC4TCHH354w8/i4IMPZs6cObz++uvcdtttzJ8/P+XPYe7cuaxZs4bLLruMe+65B4DXX3+dTZs28dRTTxEOhznttNP45je/yeLFi7nuuuuYMGECTz75JLFYDL+/9eFXAncK22q3sXHvxmbb/YafA/oeQHGguANKJYTItc2VdS3a7lVVVRVvvPEGu3bt4oknnqC6upqFCxdyyimn8PzzzxMMBpk1axa7du1i+/btXH755YA7In7atGkMHz68YcqQaZoEAgHmzZtHcXExW7duJRaLsW7dOg4//HAARo0aRe/evQEaAim4c9pHjBjRqGxz587lwQcf5LzzzmPAgAFMmDCh0X7HcRoe79y5k1GjRgFw6qmnptyW7DUPP/xw1q9fz49//GP8fj+XXHIJY8aM4fTTT2fevHnEYjHOOeecZj+7SZMmEQwGARgzZgwbN7p/m+t/HuvWrWPatGkAlJaWMmrUKL788ksADj30UMANyq+//jrl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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "results.plot()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.8.11" } }, "nbformat": 4, "nbformat_minor": 1 }