{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Randomized Benchmarking Data Analysis\n", "This tutorial demonstrates how to analyze RB data using pyGSTi. This data analysis is for any RB method whereby *average success/survival probabilities* (ASPs) as a function of *RB sequence length* ($m$) are fit to the function\n", "$$ P_m = A + B p^m,$$\n", "where $A$, $B$ and $p$ are fit parameters (and $A$ may be fixed to a constant). So this includes [Direct RB](https://arxiv.org/abs/1807.07975) and [Clifford RB](http://journals.aps.org/prl/abstract/10.1103/PhysRevLett.106.180504), as well as [Unitarity RB](http://iopscience.iop.org/article/10.1088/1367-2630/17/11/113020/meta) (although note that in that case the desired quantity is $p$ rather than $r \\approx 1-p$). This analysis is not suitable for any types of RB that require more complicated analysis, e.g., [Dihedral RB](https://journals.aps.org/pra/abstract/10.1103/PhysRevA.92.060302), although note that with minor post-processing these tools can be used to analyzes [interleaved RB](https://journals.aps.org/prl/abstract/10.1103/PhysRevLett.109.080505) data (full support for analyzing interleaved RB data may be added at a later date)." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from __future__ import print_function #python 2 & 3 compatibility\n", "import pygsti\n", "from pygsti.extras import rb" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Generating some fake data to analyze\n", "To show how to do use the RB analysis, we'll generate some fake [\"Direct randomized benchmarking\"](https://arxiv.org/abs/1807.07975) (DRB) data. But note that the analysis is the same for DRB and Clifford RB: fitting observed average success probability (ASP) data to the exponential decay $P_m = A + Bp^m$, so it is not of much importance for this tutorial that the data is from DRB.\n", "\n", "We'll create 5-qubit DRB data, for an (imaginary) device containing 5 qubits with ring connectivity. We'll assume that the errors consist of local depolarizing after every gate with a gate- and qubit-independent depolarizing error rate of 0.1%. I.e., each circuit layer is followed by the channel $\\mathcal{D}^{\\otimes 5}_{\\lambda}$ where\n", "$$ \\mathcal{D}_{\\lambda}[\\rho] = \\lambda \\rho + (1-\\lambda) \\mathbb{I} ,$$\n", "is a 1-qubit uniformly depolarizing channel. To obtain a per-qubit error rate of 0.1% we would set\n", "$\\lambda = 3 (1-0.001) / 4$.\n", "\n", "Because these simulations are on 5 qubits, they take a while to run. So we have already saved data from these simulations. To re-run the simulations set `runsims = True`, which will overwrite the old data. Otherwise, the data previously generated by this code will be imported." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "runsims = False" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First, we create a `ProcessorSpec` object encoding the device to simulate: see the [ProcessorSpec tutorial](../objects/advanced/ProcessorSpec.ipynb) for more information." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "if runsims:\n", " \n", " nQubits = 5 \n", " qubit_labels = ['Q0','Q1','Q2','Q3','Q4'] \n", " gate_names = ['Gxpi2', 'Gxmpi2', 'Gypi2', 'Gympi2', 'Gcphase'] \n", " availability = {'Gcphase':[('Q0','Q1'), ('Q1','Q2'), ('Q2','Q3'), \n", " ('Q3','Q4'), ('Q4','Q0')]}\n", " pspec = pygsti.obj.ProcessorSpec(nQubits, gate_names, availability=availability, \n", " qubit_labels=qubit_labels)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, we create the error model, and specify the RB parameters (RB lengths etc)." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "if runsims: \n", " \n", " # The local error rate of every qubit\n", " errorrate = 0.001\n", " \n", " # Put these into a dictionary, mapping the qubit label to the error rate (which is qubit-indep here)\n", " gate_errorrate_dict = {q : errorrate for q in qubit_labels}\n", " \n", " # The error type : 'uniform' means locally uniform depolarization.\n", " ptype = 'uniform'\n", " \n", " # This creates this error model in the format needed for the simulator\n", " errormodel = rb.simulate.create_locally_gate_independent_pauli_error_model(pspec, gate_errorrate_dict,\n", " ptype='uniform')\n", " \n", " # The DRB lengths\n", " lengths = [0,10,20,30,50,100,200,400]\n", "\n", " # The number of circuits per length\n", " k = 30\n", " \n", " # The counts for each circuit. Below we use a basic stochastic-unravelling simulator,\n", " # so the time taken is linear in the number of counts.\n", " counts = 50" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, we run the simulations using `rb.simulate.rb_with_pauli_errors()`. This samples DRB circuits as specified (here using the default sampler as we leave it unspecified) and writes the data to file. This simulator is of only tangential relevance to this tutorial, so is not explained any further here. See the docstrings for more information." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "if runsims:\n", " \n", " filename = '../tutorial_files/MySimulatedDRBData.txt'\n", " rbdata = rb.simulate.rb_with_pauli_errors(pspec, errormodel, lengths, k, counts, \n", " rbtype='DRB', filename=filename, verbosity=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Import RB summary data\n", "Currently, pyGSTi only has functions for analyzing RB data that has been summarized into an \"RB length\" vs. \"success counts\" format. This format is demonstrated in the file `../tutorial_files/MySimulatedDRBData.txt` (note that the final two columns are optional and contain auxillary information about the RB circuits). So, if the data is stored in a `DataSet` object, this has to be pre-processed manually into the above format. Functions to implement this conversion and/or analysis functions that can handle `DataSet` objects will be added in a future pyGSTi release." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Importing ../tutorial_files/MySimulatedDRBData.txt...Complete.\n" ] } ], "source": [ "rbdata = rb.io.import_rb_summary_data('../tutorial_files/MySimulatedDRBData.txt')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Implementing the analysis\n", "Once we have an `RBSummaryDataset` object, implement the analysis is simple. To run a \"standard practice\" analysis, this data just needs to be passed to `rb.analysis.std_practice_analysis()`, as we do below. This function implements an ordinary unweighted least-squares analysis, and estimates \"error bars\" on the extracted parameters using a standard non-parameteric boostrap. Note that this is *not* necessarily the best way to analyze RB data: there has recently been some developments in RB statistics (in particular, see https://arxiv.org/abs/1802.00401), some of which may be significant improvements on this method. But, we expect that this analysis method performs reasonably well in most circumstances.\n", "\n", "This function also has some useful optional arguments, which it is sometimes important to adjust:\n", "\n", "- `seed` is a list [$B$,$p$] that provides an initial guess, or *seed*, for the fit of $B$ and $p$ in $P_m = A + Bp^m$. It is important to adjust these when the default values of [0.8,0.95] are far from the optimum.\n", "- `bootstrap_samples` is the number of samples used for the bootstrapped standard deviation of $r$. Increase this value, from the default value of 200, for a slower analysis that reports a more accurate standard deviation.\n", "- The analysis performs two fits: the first one to $P_m = A + Bp^m$ with $A$ fixed and $B$ and $p$ seeded as above; the second one with all of $A$, $B$ and $p$ as variables and $B$ and $p$ seeded from the fixed-$A$ fit. The optional parameter `asymptote` sets the value of $A$ for the fixed-asymptote fit, and it is also the seed for $A$ in the full fit. If not specified, it defaults to $1/2^n$ for $n$ qubits, which is the correct value for $A$ whenever the measurement errors are not biased and the gate errors are not strongly non-unital (if their is a small non-unital error in the gates, e.g., weak amplitude damping, the true $A$ is a small perturbation on $1/2^n$ so this value is probably fine).\n", "- `rtype` is the \"type\" of RB number. The default is `rtype = 'EI'`, giving an $n$-qubit RB $r$ defined by:\n", "$$ r = \\frac{(4^n - 1)(1 - p)}{4^n}. $$\n", "This corresponds to an $r$ that is, for Clifford or direct RB with stochastic errors, approximately the probability of error in a gate. More generally, for Clifford and direct RB this $r$ is directly related to the entanglement infidelity averaged over all gates [(modulo some \"gauge\" problems)](https://journals.aps.org/prl/abstract/10.1103/PhysRevLett.119.130502).\n", "This is our preferred definition of the RB error rate, as a function of $p$, for both Clifford and direct RB (and other similar forms of RB). But note that it is not the conventional definition in the Clifford RB literature. The convention in Clifford RB corresponds to setting `rtype = 'AGI'`, giving an $n$-qubit RB $r$ defined by:\n", "$$ r = \\frac{(2^n - 1)(1 - p)}{2^n}. $$\n", "In this case, the Clifford and direct RB $r$ is directly related to the average gate infidelity (AGI) averaged over all gates [(again, modulo to the same \"gauge\" problems)](https://journals.aps.org/prl/abstract/10.1103/PhysRevLett.119.130502)." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "rbresults = rb.analysis.std_practice_analysis(rbdata)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And that's it.\n", "\n", "## Looking at the results\n", "\n", "The analysis returns an `RBResults` object, that encapsulates the analysis results and the original RB summary data.\n", "\n", "### Plotting the data and the fit\n", "\n", "Once we've done the analysis, we can plot the data and our fit to the data, using the `.plot()` method. By default, this plots the \"full\" fit to $P_m = A + B p^m$ with all of $A$, $B$ and $p$ as variables. (If you would like to plot a different fit then set the optional argument `fitkey` to the key in `rbresults.fits` dictionary that this fit corresponds to: see below for more info on `rbresults.fits`)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAfUAAAFECAYAAAA+3qfBAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4wLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvqOYd8AAAIABJREFUeJzs3Xd8VfX9x/HX52awISwRCEooQ3bYKg5EFAQFREVwr2qtVFtbWml/FWuHWqyzuC1YB+BApIriABTcIAiCMgIoCaKIskPm9/fHuQkhZNyEe3PX++njPHLvueee+zk5kc/9bnPOISIiItHPF+4AREREJDiU1EVERGKEkrqIiEiMUFIXERGJEUrqIiIiMUJJXUREJEYoqYuIiMQIJXUREZEYoaQuIiISIxLDHUBVNWvWzLVt2zbcYYiIiNSIZcuW/eCcax7IsVGX1Nu2bcvSpUvDHYaIiEiNMLOvAz1W1e8iIiIxQkldREQkRiipi4iIxIioa1MXkfiWl5dHZmYmBw4cCHcoIkFVu3ZtUlNTSUpKqvY5lNRFJKpkZmbSoEED2rZti5mFOxyRoHDOsWPHDjIzM0lLS6v2eVT9LiJR5cCBAzRt2lQJXWKKmdG0adMjroFSUheRqKOELrEoGH/XSuoiIiIxQkldRKQa5syZg5nx1VdfhTsUKeGKK67gxRdfDPj4RYsWcfbZZ5f52vDhw9m5cycA9evXB2Dr1q2cf/75AKxYsYJ58+YVHz937lzuvPPO6oYeFErqIhLT5izPYuCdC0i75TUG3rmAOcuzgnLeGTNmcNJJJzFjxoygnC8/Pz8o54kHNfW7mjdvHikpKYfsa9WqVfGXhtJJfeTIkdxyyy01Elt5lNTDKLcgN9whiMS0OcuzmDR7FVk7s3FA1s5sJs1edcSJfe/evSxZsoQnn3ySmTNnFu8fN24cr732WvHzolJjQUEBEydOpF+/fvTo0YNHH30U8EqJJ598MiNHjqRLly4AjB49mj59+tC1a1cee+yx4nM9+eSTdOzYkf79+/Pzn/+cCRMmALB9+3bOO+88+vXrR79+/Xj//fcPi3f16tX079+f9PR0evTowfr169m8eTPdunUrPubuu+/mtttuA2DDhg0MGTKEnj170rt3bzIyMgC466676N69Oz179ixOXhkZGQwbNow+ffpw8sknF9dcvPDCC3Tr1o2ePXtyyimnlBtHafXr1+c3v/kNXbt25fTTT2f79u0ADBo0iF//+tf07duX+++/n82bNzN48GB69OjB6aefzjfffFN8jrfffpu+ffvSsWNHXn31VQA2b97MySefTO/evenduzcffPBB8fG7d+9mxIgRdOrUiV/84hcUFhYC3rTkP/zwwyHxFf3ecnNzufXWW5k1axbp6enMmjWL6dOnV3pf3n33XdLT00lPT6dXr17s2bPnsN/BEXHORdXWp08fFyv25e4LdwgiUWfNmjUBH3viHe+4Y//w6mHbiXe8c0QxPPPMM+6qq65yzjl3wgknuKVLlzrnnJs9e7a77LLLnHPO5eTkuNTUVLd//3736KOPur/+9a/OOecOHDjg+vTp4zZu3OgWLlzo6tat6zZu3Fh87h07djjnnNu/f7/r2rWr++GHH1xWVpY79thj3Y4dO1xubq476aST3A033OCcc278+PFu8eLFzjnnvv76a3fccccdFu+ECRPcM888UxzX/v373aZNm1zXrl2Lj5kyZYqbPHmyc865/v37u9mzZzvnnMvOznb79u1z8+bNcyeccILbt2/fIXEOHjzYrVu3zjnn3EcffeROO+0055xz3bp1c5mZmc4553766ady4ygNKD7mL3/5S/F1nnrqqe76668vPu7ss89206dPd8459+STT7pRo0Y555y7/PLL3dChQ11BQYFbt26da926dfE1ZGdnO+ecW7dunSvKJQsXLnS1atVyGRkZLj8/3w0ZMsS98MILzjnnjj32WLd9+3bnnHP16tVzzrlDfm/Tpk0rjq/08/Luy9lnn+2WLFninHNuz549Li8v75DrL+vvG1jqAsyRGqcuIjFr687sKu0P1IwZM7jpppsAr3Q+Y8YM+vTpw1lnncVNN91ETk4Ob7zxBqeccgp16tThzTffZOXKlcXVtrt27WL9+vUkJyfTv3//Q8YlP/DAA7z88ssAbNmyhfXr17Nt2zZOPfVUmjRpAsAFF1zAunXrAK9UumbNmuL37969m7179xa3AQOccMIJ/P3vfyczM5MxY8bQoUOHcq9tz549ZGVlce655wLehChFn3PllVdSt25dAJo0acLevXv54IMPuOCCC4rfn5OTA8DAgQO54oorGDt2LGPGjAk4Dp/Px4UXXgjAJZdcUvxeoHg/wIcffsjs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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# This requires matplotlib, which is not a core dependency of pygsti\n", "%matplotlib inline\n", "rbresults.plot()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Getting at the estimates\n", "The various estimated paramaters (e.g., $r$) are stored in the `rbresults.fits` dictionary. Here, because we have implemented a standard practice analysis, there are two keys: `'full'` corresponding to the full fit, and `'A-fixed'` corresponding to the fit with the asymptote $A$ fixed to the value specified in the analysis." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "dict_keys(['full', 'A-fixed'])" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rbresults.fits.keys()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Each element of `rbresults.fits` is a `FitResults` object, which is just a container for the results of a fit (and a few simple methods. The most important information is the estimates of $A$, $B$, $p$ and $r$, accessed as follows:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'A': 0.018810826450209733,\n", " 'B': 0.7755174029927501,\n", " 'p': 0.9952624191327983,\n", " 'r': 0.004732954323386036}" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rbresults.fits['full'].estimates" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that even when a parameter was fixed to a constant, it will appear in the estimates list. To check which parameters were actually variables look at:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'A': True, 'B': True, 'p': True}" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rbresults.fits['full'].variable" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can look at the bootstrapped standard deviations:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'A': 0.0236833129777544,\n", " 'B': 0.02329804863732318,\n", " 'p': 0.0003872557792437516,\n", " 'r': 0.00038687759977183386}" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rbresults.fits['full'].stds" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And we can access the distribution of the bootstrapped values for any of these parameters, most importantly $r$. Below we histogram this distribution:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "plt.hist(rbresults.fits['full'].bootstraps['r'], 10)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Because we are doing this analysis on simulated data, we know what the DRB error rate should be according to the theory of DRB from [\"Direct randomized benchmarking for multi-qubit devices\"](https://arxiv.org/abs/1807.07975)." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The theory-predicted r is: 0.004990009995000988\n", "The (simulated) observed r is: 0.004732954323386036 +/- 0.00038687759977183386\n" ] } ], "source": [ "theory_predicted_r = 1 - (1-0.001)**5\n", "observed_r = rbresults.fits['full'].estimates['r']\n", "observed_r_std = rbresults.fits['full'].stds['r']\n", "print(\"The theory-predicted r is: {}\".format(theory_predicted_r))\n", "print(\"The (simulated) observed r is: {} +/- {}\".format(observed_r,observed_r_std))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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.7.0" } }, "nbformat": 4, "nbformat_minor": 1 }